logo和配置修改

This commit is contained in:
谢宇宁
2026-09-23 16:50:34 +07:00
parent bef9f8b4ed
commit 0db8087765
163 changed files with 393 additions and 20366 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
-137
View File
@@ -1,137 +0,0 @@
.coin-dialog-mask {
position: fixed;
inset: 0;
z-index: 1100;
display: none;
align-items: center;
justify-content: center;
padding: 24px;
box-sizing: border-box;
background: rgba(0, 0, 0, 0.7);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
.coin-dialog-mask.is-open { display: flex; }
.coin-dialog-stack {
width: 440px;
max-width: 100%;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.coin-dialog-card {
width: 440px;
max-width: 100%;
padding: 36px;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
color: #fff;
background: #0d0d0d;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 40px;
font-family: "PingFang SC", "Noto Sans SC", sans-serif;
}
.coin-dialog-icon { width: 60px; height: 60px; flex: 0 0 auto; object-fit: contain; }
.coin-dialog-title { color: #fff; font-size: 24px; font-weight: 600; line-height: 32px; text-align: center; }
.coin-dialog-desc { color: rgba(255,255,255,.55); font-size: 16px; font-weight: 400; line-height: 22px; text-align: center; }
.coin-dialog-balance {
width: 100%;
padding: 18px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(255,255,255,.05);
border: 1px solid rgba(255,255,255,.1);
border-radius: 12px;
}
.coin-dialog-balance-col { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.coin-dialog-balance-col--end { align-items: flex-end; gap: 2px; }
.coin-dialog-balance-label { color: rgba(255,255,255,.55); font-size: 12px; font-weight: 400; line-height: 18px; }
.coin-dialog-balance-value,
.coin-dialog-balance-cost { color: #fff; font-size: 16px; font-weight: 600; line-height: 22px; }
.coin-dialog-balance-cost { color: #ec237f; }
.coin-dialog-hint { color: rgba(255,255,255,.55); font-size: 14px; font-weight: 400; line-height: 20px; text-align: center; }
.coin-dialog-actions { width: 100%; display: flex; gap: 18px; }
.coin-dialog-download,
.coin-dialog-cta {
min-width: 0;
min-height: 58px;
padding: 18px 24px;
box-sizing: border-box;
display: flex;
flex: 1 1 0;
align-items: center;
justify-content: center;
color: #fff;
font-family: inherit;
font-size: 16px;
font-weight: 600;
line-height: 22px;
text-decoration: none;
white-space: nowrap;
border: 0;
border-radius: 18px;
cursor: pointer;
}
.coin-dialog-download { background: linear-gradient(135deg, #ff5f6e 0%, #fe2a7f 50%, #8c206e 100%); }
.coin-dialog-cta {
padding-right: 30px;
padding-left: 30px;
color: #8b1a15;
background: linear-gradient(180deg, #fbc297 0%, #fae1c0 100%);
}
.coin-dialog-cta-label-h5 { display: none; }
.coin-dialog-cta-loading { display: none; }
.coin-dialog-cta.is-loading,
.coin-dialog-cta:disabled { opacity: .75; cursor: not-allowed; }
.coin-dialog-cta.is-loading .coin-dialog-cta-label { display: none; }
.coin-dialog-cta.is-loading .coin-dialog-cta-loading { display: inline; }
.coin-dialog-recharge {
width: 100%;
color: #ec237f;
font-size: 16px;
font-weight: 600;
line-height: 22px;
text-align: center;
text-decoration: none;
}
.coin-dialog-close {
width: 36px;
height: 36px;
padding: 0;
flex: 0 0 36px;
border: 0;
background: transparent;
cursor: pointer;
}
.coin-dialog-close img { display: block; width: 36px; height: 36px; }
@media (max-width: 767px) {
.coin-dialog-mask {
padding: 16px;
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
}
.coin-dialog-stack { width: 300px; }
.coin-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; }
.coin-dialog-title { font-size: 18px; line-height: 24px; }
.coin-dialog-desc { font-size: 14px; line-height: 20px; }
.coin-dialog-hint { font-size: 12px; line-height: 18px; }
.coin-dialog-actions { flex-direction: column; gap: 18px; }
.coin-dialog-download,
.coin-dialog-cta {
width: 100%;
min-height: 46px;
padding: 12px 24px;
flex: none;
border-radius: 9px;
}
.coin-dialog-cta { padding-right: 48px; padding-left: 48px; }
.coin-dialog-cta-label-pc { display: none; }
.coin-dialog-cta-label-h5 { display: inline; }
.coin-dialog-recharge { font-size: 14px; font-weight: 400; line-height: 20px; }
}
-489
View File
@@ -1,489 +0,0 @@
.collect-layout {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.collect-layout .site-header,
.collect-layout .footer-box {
flex-shrink: 0;
}
.collect-page {
width: 100%;
flex: 1 1 auto;
min-height: 0;
padding: 36px 0;
background: #0A0A0A;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
box-sizing: border-box;
}
.collect-pc {
width: min(1800px, calc(100% - 120px));
max-width: none;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 24px;
}
.collect-nav {
display: none;
}
.collect-main {
width: min(1800px, calc(100% - 120px));
max-width: none;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 24px;
}
.collect-breadcrumb {
align-self: stretch;
overflow: hidden;
display: inline-flex;
justify-content: flex-start;
align-items: center;
gap: 10px;
}
.collect-breadcrumb-link {
color: #EC237F;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
text-decoration: none;
}
.collect-breadcrumb-sep {
color: #666666;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.collect-breadcrumb-current {
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.collect-head {
align-self: stretch;
overflow: hidden;
display: flex;
justify-content: flex-start;
align-items: center;
gap: 12px;
}
.collect-title {
margin: 0;
color: white;
font-size: 30px;
font-family: PingFang SC;
font-weight: 400;
line-height: 36px;
flex-shrink: 0;
}
.collect-desc {
margin: 0;
color: #A3A3A3;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.collect-tabs {
overflow: hidden;
justify-content: flex-start;
align-items: center;
gap: 9px;
display: inline-flex;
}
.collect-tab {
padding: 7px 16px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
display: inline-flex;
justify-content: center;
align-items: center;
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
text-decoration: none;
box-sizing: border-box;
}
.collect-tab--active {
background: #EC237F;
border: none;
color: #181818;
font-weight: 700;
}
.collect-grid {
align-self: stretch;
width: 100%;
display: grid;
grid-template-columns: repeat(8, minmax(0, 1fr));
justify-content: stretch;
align-items: stretch;
gap: 14px 16px;
}
.collect-card {
width: 100%;
min-width: 0;
background: transparent;
overflow: hidden;
border-radius: 14px;
display: flex;
flex-direction: column;
align-items: stretch;
text-decoration: none;
color: inherit;
box-sizing: border-box;
}
.collect-card-cover {
width: 100%;
height: auto;
aspect-ratio: 3 / 4;
position: relative;
overflow: hidden;
background: rgba(255, 255, 255, 0.05);
}
.collect-card-cover-img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.collect-card-eps {
position: absolute;
right: 8px;
bottom: 8px;
height: 28px;
padding: 4px 8px;
background: rgba(0, 0, 0, 0.60);
border-radius: 8px;
display: inline-flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
box-sizing: border-box;
z-index: 2;
}
.collect-card-body {
width: 100%;
flex: 1 1 auto;
padding: 8px 10px;
background: rgba(255, 255, 255, 0.05);
display: flex;
flex-direction: column;
align-items: stretch;
gap: 4px;
box-sizing: border-box;
}
.collect-card-title {
width: 100%;
min-height: 20px;
color: #F5F5F5;
font-size: 14px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
word-break: break-all;
}
.collect-card-desc {
width: 100%;
min-height: 18px;
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.collect-card-meta {
width: 100%;
margin-top: auto;
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
overflow: hidden;
}
.collect-card-tag {
min-width: 0;
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.collect-card-spacer {
flex: 1 1 0;
min-width: 4px;
height: 9px;
}
.collect-card-progress {
flex-shrink: 0;
color: #808080;
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
white-space: nowrap;
}
.collect-empty {
width: 100%;
grid-column: 1 / -1;
padding: 48px 16px;
text-align: center;
color: #A3A3A3;
}
.collect-pagination {
align-self: stretch;
width: 100%;
margin-top: 0;
}
.collect-pagination .pagination {
width: 100%;
}
@media (max-width: 767px) {
body.is-collect-page {
background: #0A0A0A;
}
body.is-collect-page .site-header,
body.is-collect-page .footer-box,
body.is-collect-page .floating-action,
body.is-collect-page .download-fab {
display: none !important;
height: 0 !important;
min-height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
body.is-collect-page .collect-layout {
min-height: 100vh;
background: #0A0A0A;
}
body.is-collect-page .collect-page {
padding: 0;
background: #0A0A0A;
align-items: stretch;
justify-content: flex-start;
gap: 0;
min-height: 100vh;
}
body.is-collect-page .collect-pc {
display: none;
}
body.is-collect-page .collect-nav {
position: sticky;
top: 0;
z-index: 40;
width: 100%;
height: 48px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
flex-shrink: 0;
background: #181818;
}
body.is-collect-page .collect-nav-back {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
body.is-collect-page .collect-nav-back img {
width: 24px;
height: 24px;
display: block;
opacity: 0.65;
filter: brightness(0) invert(1);
}
body.is-collect-page .collect-nav-title {
margin: 0;
flex: 1 1 0;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
}
body.is-collect-page .collect-nav-spacer {
width: 24px;
height: 24px;
flex-shrink: 0;
}
body.is-collect-page .collect-main {
width: calc(100% - 32px);
max-width: 343px;
margin: 0 auto;
padding: 12px 0;
align-items: stretch;
gap: 12px;
box-sizing: border-box;
}
body.is-collect-page .collect-tabs {
width: auto;
height: 42px;
padding: 4px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.08);
display: inline-flex;
justify-content: flex-start;
align-items: flex-start;
gap: 4px;
box-sizing: border-box;
align-self: flex-start;
margin: 0 auto;
}
body.is-collect-page .collect-tab {
width: 109px;
flex: 0 0 109px;
min-width: 109px;
height: 34px;
padding: 0;
background: transparent;
border: none;
overflow: hidden;
border-radius: 9px;
display: flex;
justify-content: center;
align-items: center;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
box-sizing: border-box;
}
body.is-collect-page .collect-tab--active {
background: #EC237F;
color: #171717;
font-weight: 700;
}
body.is-collect-page .collect-grid {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
justify-content: stretch;
gap: 12px 7px;
}
body.is-collect-page .collect-card {
width: 100%;
border-radius: 10px;
}
body.is-collect-page .collect-card-body {
background: rgba(255, 255, 255, 0.05);
}
body.is-collect-page .collect-card-title {
color: rgba(255, 255, 255, 0.95);
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
}
body.is-collect-page .collect-card-desc {
color: rgba(255, 255, 255, 0.60);
}
body.is-collect-page .collect-card-tag {
color: rgba(255, 255, 255, 0.45);
}
body.is-collect-page .collect-card-progress {
color: rgba(255, 255, 255, 0.45);
}
body.is-collect-page .collect-card-cover {
height: 0;
padding-bottom: calc(224 / 168 * 100%);
}
body.is-collect-page .collect-card-cover-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
body.is-collect-page .collect-pagination {
margin-top: 0;
}
}
File diff suppressed because it is too large Load Diff
+15 -436
View File
@@ -309,6 +309,21 @@
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);
@@ -331,29 +346,6 @@
box-sizing: border-box;
}
.detail-episode-coin {
width: 16px;
height: 16px;
right: 6px;
left: auto;
top: 6px;
position: absolute;
display: block;
padding: 0;
background: none;
overflow: visible;
border-radius: 0;
box-sizing: border-box;
pointer-events: none;
}
.detail-episode-coin img {
width: 16px;
height: 16px;
object-fit: contain;
display: block;
}
.detail-comments {
align-self: stretch;
width: 100%;
@@ -416,189 +408,6 @@
color: #F5F5F5;
}
.detail-comment-composer {
align-self: stretch;
padding: 12px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 10px;
justify-content: flex-start;
align-items: flex-start;
gap: 12px;
display: flex;
box-sizing: border-box;
}
.detail-comment-composer-avatar {
width: 36px;
height: 36px;
border-radius: 18px;
object-fit: cover;
flex-shrink: 0;
}
.detail-comment-composer-main {
flex: 1;
min-width: 0;
overflow: hidden;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 12px;
display: flex;
}
.detail-comment-composer-input {
width: 100%;
min-height: 56px;
padding: 10px 12px;
background: #000;
overflow: hidden;
border-radius: 8px;
border: none;
resize: none;
box-sizing: border-box;
box-shadow: none;
outline: none;
outline-color: transparent;
-webkit-appearance: none;
appearance: none;
color: #F5F5F5;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-composer-input:focus,
.detail-comment-composer-input:focus-visible {
border: none;
outline: none;
outline-color: transparent;
box-shadow: none;
}
.detail-comment-composer-input::placeholder {
color: #A3A3A3;
}
.detail-comment-composer-footer {
width: 100%;
height: 28px;
overflow: hidden;
justify-content: space-between;
align-items: center;
display: flex;
}
.detail-comment-composer-status {
height: 20px;
overflow: hidden;
justify-content: flex-start;
align-items: center;
gap: 8px;
display: flex;
}
.detail-comment-composer-logged {
color: #ec237f;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-composer-user {
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-composer-count {
color: #D4D4D4;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-composer-submit {
width: 84px;
height: 28px;
background: #ec237f;
overflow: hidden;
border-radius: 14px;
justify-content: center;
align-items: center;
display: flex;
border: none;
cursor: pointer;
color: #fff;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
padding: 0;
position: relative;
gap: 6px;
box-sizing: border-box;
}
.detail-comment-composer-submit:disabled,
.detail-comment-composer-submit.is-loading {
opacity: 0.75;
cursor: not-allowed;
}
.detail-comment-composer-submit.is-loading::before {
content: "";
width: 12px;
height: 12px;
border: 2px solid rgba(24, 24, 24, 0.35);
border-top-color: #181818;
border-radius: 50%;
animation: detail-comment-spin 0.7s linear infinite;
flex-shrink: 0;
}
@keyframes detail-comment-spin {
to {
transform: rotate(360deg);
}
}
.detail-comments-login {
align-self: stretch;
height: 44px;
padding: 0 12px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 7px;
justify-content: flex-start;
align-items: center;
display: flex;
box-sizing: border-box;
}
.detail-comments-login-link {
color: #ec237f;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
text-decoration: none;
}
.detail-comments-login-hint {
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-list {
align-self: stretch;
width: 100%;
@@ -675,50 +484,6 @@
line-height: 18px;
}
.detail-comment-like {
display: inline-flex;
align-items: center;
gap: 4px;
background: none;
border: none;
cursor: pointer;
padding: 0;
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.detail-comment-like img {
width: 14px;
height: 14px;
}
.detail-comment-like--active {
color: #A3A3A3;
}
.detail-comment-like--active img {
filter: none;
}
.detail-comment-reply-label {
color: #A3A3A3;
font-size: 12px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 400;
line-height: 18px;
background: none;
border: none;
padding: 0;
cursor: pointer;
}
.detail-comment-reply-label:hover {
color: #ec237f;
}
.detail-comment-reply-to {
color: #A3A3A3;
}
@@ -778,89 +543,6 @@
opacity: 0.92;
}
.detail-comment-reply-hint {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 6px;
color: #A3A3A3;
font-size: 12px;
line-height: 18px;
}
.detail-comment-reply-hint button {
background: none;
border: none;
padding: 0;
color: #ec237f;
cursor: pointer;
font-size: 12px;
}
.detail-comment-inline-composer {
width: 100%;
margin-top: 8px;
padding: 10px 12px;
background: rgba(255, 255, 255, 0.05);
border-radius: 6px;
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: 8px;
}
.detail-comment-inline-input {
width: 100%;
min-height: 56px;
padding: 8px 10px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 6px;
background: #0A0A0A;
color: #F5F5F5;
font-size: 13px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
line-height: 20px;
resize: none;
box-sizing: border-box;
}
.detail-comment-inline-input::placeholder {
color: #737373;
}
.detail-comment-inline-input:focus,
.detail-comment-inline-input:focus-visible {
border-color: rgba(236, 35, 127, 0.55);
outline: none;
outline-color: transparent;
box-shadow: none;
}
.detail-comment-inline-footer {
display: flex;
justify-content: flex-end;
}
.detail-comment-inline-send {
height: 32px;
padding: 0 14px;
border: none;
border-radius: 6px;
background: #ec237f;
color: #fff;
font-size: 13px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 500;
cursor: pointer;
}
.detail-comment-inline-send:disabled,
.detail-comment-inline-send.is-loading {
opacity: 0.6;
cursor: not-allowed;
}
.detail-comments-more {
align-self: stretch;
height: 43px;
@@ -1048,23 +730,6 @@
box-sizing: border-box;
}
.detail-h5-top-btn--like {
width: auto;
min-width: 20px;
height: auto;
gap: 4px;
}
.detail-h5-top-like-count {
color: rgba(255, 255, 255, 0.92);
font-size: 11px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 400;
line-height: 12px;
white-space: nowrap;
text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.55);
}
.detail-h5-top-btn img {
width: 18px;
height: 18px;
@@ -1074,12 +739,6 @@
opacity: 0.92;
}
.detail-h5-top-btn--active img,
.detail-h5-top-btn img[src*="h5_liked"] {
filter: none;
opacity: 1;
}
.detail-page.page-shell {
position: relative;
z-index: 1;
@@ -1305,19 +964,6 @@
text-align: center;
}
.detail-episode-coin {
width: 16px;
height: 16px;
left: auto;
right: 6px;
top: 6px;
}
.detail-episode-coin img {
width: 16px;
height: 16px;
}
.detail-related {
width: 100%;
gap: 12px;
@@ -1467,50 +1113,6 @@
gap: 12px;
}
.detail-h5-collect,
.detail-h5-like {
width: 132px;
padding: 11px 24px;
background: rgba(255, 255, 255, 0.10);
border: none;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 12px;
cursor: pointer;
color: white;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
line-height: 22px;
flex-shrink: 0;
}
.detail-h5-collect--active,
.detail-h5-like--active {
color: #ec237f;
}
.detail-h5-collect--active img,
.detail-h5-like--active img {
filter: none;
}
.detail-h5-collect img,
.detail-h5-like img {
width: 22px;
height: 22px;
display: block;
object-fit: contain;
filter: none;
}
.detail-h5-collect--active img,
.detail-h5-like--active img {
filter: none;
}
.detail-h5-play {
flex: 1;
padding: 11px 24px;
@@ -1823,18 +1425,6 @@
text-align: center;
}
.detail-episode-coin {
width: calc(16px * var(--detail-s));
height: calc(16px * var(--detail-s));
top: calc(6px * var(--detail-s));
right: calc(6px * var(--detail-s));
}
.detail-episode-coin img {
width: 100%;
height: 100%;
}
.content-official-info {
padding: calc(24px * var(--detail-s)) calc(30px * var(--detail-s));
border-radius: calc(18px * var(--detail-s));
@@ -1876,15 +1466,6 @@
line-height: calc(18px * var(--detail-s));
}
.detail-comment-composer,
.detail-comment-login {
min-height: calc(44px * var(--detail-s));
padding: 12px calc(12px * var(--detail-s));
border-radius: calc(7px * var(--detail-s));
font-size: calc(12px * var(--detail-s));
line-height: calc(18px * var(--detail-s));
}
.detail-related {
display: flex;
width: calc(296px * var(--detail-s));
@@ -2034,7 +1615,5 @@
line-height: 14px;
}
.detail-h5-collect--active,
.detail-h5-like--active { color: #ec237f; }
.detail-h5-play { background: #ec237f; color: #fff; }
}
-382
View File
@@ -1,382 +0,0 @@
.edit-password-layout {
min-height: 100vh;
display: flex;
flex-direction: column;
background: #0A0A0A;
}
.edit-password-layout .site-header,
.edit-password-layout .footer-box {
flex-shrink: 0;
}
.edit-password-page {
width: 100%;
flex: 1 1 auto;
padding: 36px 0 48px;
background: #0A0A0A;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
box-sizing: border-box;
}
.edit-password-pc {
width: 100%;
max-width: calc(100% - 32px);
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 14px;
}
.edit-password-breadcrumb {
display: inline-flex;
align-items: center;
gap: 10px;
}
.edit-password-breadcrumb-link {
color: #EC237F;
font-size: 14px;
font-family: PingFang SC, "Noto Sans SC", sans-serif;
font-weight: 400;
line-height: 20px;
text-decoration: none;
}
.edit-password-breadcrumb-sep {
color: #666666;
font-size: 14px;
font-family: PingFang SC, "Noto Sans SC", sans-serif;
font-weight: 400;
line-height: 20px;
}
.edit-password-breadcrumb-current {
color: #8A8A8A;
font-size: 14px;
font-family: PingFang SC, "Noto Sans SC", sans-serif;
font-weight: 400;
line-height: 20px;
}
.edit-password-pc-head {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
.edit-password-pc-title {
margin: 0;
color: #F5F5F5;
font-size: 30px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 36px;
}
.edit-password-pc-desc {
color: rgba(255, 255, 255, 0.60);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 20px;
}
.edit-password-shell {
width: 100%;
max-width: calc(100% - 32px);
display: flex;
flex-direction: column;
align-items: stretch;
}
.edit-password-nav {
display: none;
}
.edit-password-form {
width: 100%;
max-width: 480px;
display: flex;
flex-direction: column;
align-items: stretch;
gap: 14px;
overflow: hidden;
}
.edit-password-intro {
width: 100%;
height: 86px;
min-height: 86px;
padding: 14px 16px;
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 6px;
box-sizing: border-box;
}
.edit-password-intro-title {
color: rgba(255, 255, 255, 0.95);
font-size: 18px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 24px;
}
.edit-password-intro-desc {
width: 100%;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
.edit-password-field {
width: 100%;
height: 78px;
min-height: 78px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
box-sizing: border-box;
}
.edit-password-field.is-error {
height: auto;
min-height: 78px;
border-color: rgba(255, 107, 107, 0.65);
}
.edit-password-error {
margin: 0;
color: #FF6B6B;
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
.edit-password-error[hidden] {
display: none;
}
.edit-password-label {
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 18px;
}
.edit-password-input-row {
width: 100%;
height: 30px;
min-height: 30px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
overflow: hidden;
}
.edit-password-input {
flex: 1 1 0;
min-width: 0;
height: 30px;
padding: 0;
border: none;
background: transparent;
box-shadow: none;
outline: none;
outline-color: transparent;
-webkit-appearance: none;
appearance: none;
color: rgba(255, 255, 255, 0.95);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 20px;
}
.edit-password-input:focus,
.edit-password-input:focus-visible {
border: none;
outline: none;
outline-color: transparent;
box-shadow: none;
}
.edit-password-input::placeholder {
color: rgba(255, 255, 255, 0.40);
}
.edit-password-toggle {
flex-shrink: 0;
padding: 0;
border: none;
background: transparent;
color: #EC237F;
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
.edit-password-submit {
width: 100%;
height: 50px;
background: #EC237F;
border: none;
border-radius: 14px;
color: #171717;
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
display: inline-flex;
justify-content: center;
align-items: center;
cursor: pointer;
box-sizing: border-box;
overflow: hidden;
}
.edit-password-submit:disabled {
opacity: 0.7;
cursor: not-allowed;
}
.edit-password-reset {
width: 100%;
min-height: 18px;
padding: 0;
display: inline-flex;
justify-content: center;
align-items: center;
border-radius: 14px;
color: #EC237F;
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 18px;
text-decoration: none;
overflow: hidden;
box-sizing: border-box;
}
@media (max-width: 767px) {
body.is-edit-password-page {
background: #0A0A0A;
padding-bottom: 0;
}
body.is-edit-password-page .site-header,
body.is-edit-password-page .footer-box,
body.is-edit-password-page .floating-action,
body.is-edit-password-page .download-fab {
display: none !important;
height: 0 !important;
min-height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
.edit-password-page {
padding: 0;
gap: 0;
align-items: stretch;
min-height: 100vh;
}
.edit-password-pc {
display: none;
}
.edit-password-shell {
width: 100%;
max-width: 100%;
min-height: 100vh;
align-items: center;
}
.edit-password-nav {
position: sticky;
top: 0;
z-index: 40;
width: 100%;
height: 48px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
flex-shrink: 0;
background: #181818;
overflow: hidden;
}
.edit-password-back {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.edit-password-back img {
width: 24px;
height: 24px;
display: block;
opacity: 0.65;
filter: brightness(0) invert(1);
}
.edit-password-nav-title {
flex: 1 1 0;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #F5F5F5;
font-size: 18px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 24px;
overflow: hidden;
}
.edit-password-nav-spacer {
width: 24px;
height: 24px;
flex-shrink: 0;
}
.edit-password-form {
width: calc(100% - 32px);
max-width: 343px;
margin: 0 auto;
padding: 16px 0;
box-sizing: border-box;
}
}
-347
View File
@@ -1,347 +0,0 @@
.edit-profile-layout {
min-height: 100vh;
display: flex;
flex-direction: column;
background: #0A0A0A;
}
.edit-profile-layout .site-header,
.edit-profile-layout .footer-box {
flex-shrink: 0;
}
.edit-profile-page {
width: 100%;
flex: 1 1 auto;
background: #0A0A0A;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
box-sizing: border-box;
}
.edit-profile-pc {
display: none;
}
.setting-breadcrumb {
display: inline-flex;
align-items: center;
gap: 10px;
}
.setting-breadcrumb-link {
color: #EC237F;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
text-decoration: none;
}
.setting-breadcrumb-sep {
color: #666666;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.setting-breadcrumb-current {
color: #8A8A8A;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.edit-profile-h5 {
width: 100%;
max-width: 480px;
min-height: 100%;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
}
.edit-profile-h5-nav {
position: sticky;
top: 0;
z-index: 40;
width: 100%;
height: 48px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
flex-shrink: 0;
background: #181818;
overflow: hidden;
}
.edit-profile-h5-back {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.edit-profile-h5-back img {
width: 24px;
height: 24px;
display: block;
opacity: 0.65;
filter: brightness(0) invert(1);
}
.edit-profile-h5-nav-title {
flex: 1 1 0;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #F5F5F5;
font-size: 18px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 24px;
overflow: hidden;
}
.edit-profile-h5-nav-spacer {
width: 24px;
height: 24px;
flex-shrink: 0;
}
.edit-profile-h5-body {
width: calc(100% - 32px);
max-width: 343px;
margin: 0 auto;
padding: 16px 0;
display: flex;
flex-direction: column;
align-items: stretch;
gap: 14px;
box-sizing: border-box;
overflow: hidden;
}
.edit-profile-avatar-card {
width: 100%;
height: 112px;
padding: 0 16px;
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
box-sizing: border-box;
}
.edit-profile-avatar-text {
width: 190px;
max-width: 100%;
min-width: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 6px;
overflow: hidden;
}
.edit-profile-avatar-title {
color: rgba(255, 255, 255, 0.95);
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
}
.edit-profile-avatar-desc {
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
.edit-profile-avatar-wrap {
position: relative;
width: 64px;
height: 64px;
flex-shrink: 0;
}
.edit-profile-avatar {
width: 64px;
height: 64px;
border-radius: 999px;
object-fit: cover;
display: block;
border: 1px solid rgba(250, 220, 68, 0.35);
}
.edit-profile-field {
width: 100%;
height: 76px;
min-height: 76px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
box-sizing: border-box;
}
.edit-profile-field--bio {
height: 96px;
min-height: 96px;
}
.edit-profile-field-label {
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 18px;
}
.edit-profile-field-input {
width: 100%;
padding: 0;
border: none;
background: transparent;
box-shadow: none;
outline: none;
outline-color: transparent;
-webkit-appearance: none;
appearance: none;
color: rgba(255, 255, 255, 0.95);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 20px;
box-sizing: border-box;
}
.edit-profile-field-input:focus,
.edit-profile-field-input:focus-visible {
border: none;
outline: none;
outline-color: transparent;
box-shadow: none;
}
.edit-profile-field-input::placeholder {
color: rgba(255, 255, 255, 0.40);
}
.edit-profile-field-input--bio {
resize: none;
min-height: 40px;
}
.edit-profile-submit {
width: 100%;
height: 50px;
background: #EC237F;
border: none;
border-radius: 14px;
color: #171717;
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
display: inline-flex;
justify-content: center;
align-items: center;
cursor: pointer;
box-sizing: border-box;
overflow: hidden;
}
.edit-profile-submit:disabled {
opacity: 0.7;
cursor: not-allowed;
}
.edit-profile-tip {
margin: 0;
color: rgba(255, 255, 255, 0.40);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
@media (min-width: 768px) {
.edit-profile-page {
padding: 36px 0 60px;
gap: 18px;
}
.edit-profile-pc {
width: 100%;
max-width: calc(100% - 32px);
display: flex;
flex-direction: column;
align-items: flex-start;
}
.edit-profile-h5 {
width: 100%;
max-width: calc(100% - 32px);
}
.edit-profile-h5-nav {
display: none;
}
.edit-profile-h5-body {
width: 100%;
max-width: 480px;
margin: 0;
padding-top: 0;
}
}
@media (max-width: 767px) {
body.is-edit-profile-page {
background: #0A0A0A;
padding-bottom: 0;
}
body.is-edit-profile-page .site-header,
body.is-edit-profile-page .footer-box,
body.is-edit-profile-page .floating-action {
display: none !important;
height: 0 !important;
min-height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
.edit-profile-pc {
display: none;
}
.edit-profile-h5 {
max-width: 100%;
min-height: 100vh;
}
}
+1 -1
View File
@@ -615,7 +615,7 @@
}
.site-shell .brand-logo {
content: url("/static/images/logo-h5.png");
content: url("/static/images/logo-h5.png?v=3");
width: 92px;
height: 24px;
object-fit: contain;
-552
View File
@@ -1,552 +0,0 @@
.history-layout {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.history-layout .site-header,
.history-layout .footer-box {
flex-shrink: 0;
}
.history-page {
width: 100%;
flex: 1 1 auto;
min-height: 0;
padding: 36px 0;
background: #0A0A0A;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
box-sizing: border-box;
}
.history-pc {
width: min(1800px, calc(100% - 120px));
max-width: none;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 24px;
}
.history-nav {
display: none;
}
.history-main {
width: min(1800px, calc(100% - 120px));
max-width: none;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 24px;
}
.history-breadcrumb {
align-self: stretch;
overflow: hidden;
display: inline-flex;
justify-content: flex-start;
align-items: center;
gap: 10px;
}
.history-breadcrumb-link {
color: #EC237F;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
text-decoration: none;
}
.history-breadcrumb-sep {
color: #666666;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.history-breadcrumb-current {
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.history-head {
align-self: stretch;
overflow: hidden;
display: flex;
justify-content: flex-start;
align-items: center;
gap: 6px;
}
.history-head-text {
flex: 1 1 0;
min-width: 0;
overflow: hidden;
display: flex;
justify-content: flex-start;
align-items: center;
gap: 12px;
}
.history-title {
margin: 0;
color: white;
font-size: 30px;
font-family: PingFang SC;
font-weight: 400;
line-height: 36px;
flex-shrink: 0;
}
.history-desc {
margin: 0;
color: #A3A3A3;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.history-clear-btn {
width: 96px;
height: 36px;
background: rgba(255, 255, 255, 0.10);
overflow: hidden;
border: none;
border-radius: 18px;
color: #F5F5F5;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
cursor: pointer;
flex-shrink: 0;
display: flex;
justify-content: center;
align-items: center;
}
.history-clear-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
.history-confirm-mask {
position: fixed;
inset: 0;
z-index: 1000;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.55);
padding: 24px;
box-sizing: border-box;
}
.history-confirm-mask.is-open {
display: flex;
}
.history-confirm-mask[hidden] {
display: none !important;
}
.history-confirm-card {
width: 420px;
max-width: 100%;
padding: 32px 28px 28px;
position: relative;
background: linear-gradient(90deg, #21142E 0%, #0A0A17 100%);
box-shadow: 0 20px 48px rgba(0, 0, 0, 0.46);
border-radius: 20px;
border: 1px solid rgba(241, 43, 158, 0.44);
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
box-sizing: border-box;
}
.history-confirm-close {
width: 28px;
height: 28px;
right: 14px;
top: 14px;
position: absolute;
overflow: hidden;
border: none;
padding: 0;
background: transparent;
cursor: pointer;
}
.history-confirm-close-ring {
width: 26px;
height: 26px;
left: 1px;
top: 1px;
position: absolute;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 50%;
box-sizing: border-box;
}
.history-confirm-close-x {
width: 8px;
height: 8px;
left: 10px;
top: 10px;
position: absolute;
box-sizing: border-box;
}
.history-confirm-close-x::before,
.history-confirm-close-x::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
width: 10px;
height: 1.5px;
background: #C5C0D0;
border-radius: 1px;
}
.history-confirm-close-x::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.history-confirm-close-x::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
.history-confirm-title {
margin-top: 4px;
text-align: center;
color: #fff;
font-size: 20px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 700;
line-height: 28px;
}
.history-confirm-desc {
text-align: center;
color: #B2ABC4;
font-size: 14px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 400;
line-height: 20px;
}
.history-confirm-actions {
width: 100%;
margin-top: 8px;
display: flex;
align-items: center;
gap: 12px;
}
.history-confirm-btn {
flex: 1 1 0;
height: 44px;
border: none;
border-radius: 12px;
font-size: 14px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 500;
line-height: 20px;
cursor: pointer;
}
.history-confirm-btn--cancel {
background: rgba(255, 255, 255, 0.08);
color: #C5C0D0;
}
.history-confirm-btn--cancel:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.history-confirm-btn--ok {
background: #EC237F;
color: #181818;
}
.history-confirm-btn--ok:hover {
background: #ffe56a;
}
.history-grid {
align-self: stretch;
width: 100%;
display: grid;
grid-template-columns: repeat(8, minmax(0, 1fr));
justify-content: stretch;
align-items: stretch;
gap: 14px 16px;
}
.history-card.poster-card {
width: 100%;
min-width: 0;
overflow: hidden;
border-radius: 14px;
text-decoration: none;
color: inherit;
}
.history-empty {
width: 100%;
}
.history-card .poster-card-spacer {
flex: 1 1 0;
min-width: 8px;
height: 9px;
}
.history-progress {
color: #808080 !important;
}
.history-info {
display: none;
}
.history-pagination {
align-self: stretch;
width: 100%;
overflow: hidden;
margin-top: 0;
}
@media (max-width: 767px) {
body.is-history-page {
background: #0A0A0A;
}
body.is-history-page .site-header,
body.is-history-page .footer-box,
body.is-history-page .floating-action,
body.is-history-page .download-fab {
display: none !important;
height: 0 !important;
min-height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
body.is-history-page .history-layout {
min-height: 100vh;
background: #0A0A0A;
}
body.is-history-page .history-page {
padding: 0;
background: #0A0A0A;
align-items: stretch;
justify-content: flex-start;
gap: 0;
min-height: 100vh;
}
body.is-history-page .history-pc {
display: none;
}
body.is-history-page .history-nav {
position: sticky;
top: 0;
z-index: 40;
width: 100%;
height: 48px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
flex-shrink: 0;
background: #181818;
}
body.is-history-page .history-nav-back {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
body.is-history-page .history-nav-back img {
width: 24px;
height: 24px;
display: block;
opacity: 0.65;
filter: brightness(0) invert(1);
}
body.is-history-page .history-nav-title {
margin: 0;
flex: 1 1 0;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
}
body.is-history-page .history-nav-clear {
min-width: 24px;
height: 24px;
padding: 0;
border: none;
background: transparent;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 18px;
cursor: pointer;
flex-shrink: 0;
-webkit-tap-highlight-color: transparent;
}
body.is-history-page .history-main {
width: calc(100% - 32px);
max-width: 343px;
margin: 0 auto;
padding: 12px 0;
align-items: stretch;
gap: 12px;
box-sizing: border-box;
}
body.is-history-page .history-grid {
width: 100%;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
gap: 12px;
}
body.is-history-page .history-card.poster-card {
width: 100%;
max-width: none;
padding: 10px 12px;
background: rgba(255, 255, 255, 0.05);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
gap: 12px;
box-sizing: border-box;
}
body.is-history-page .history-card .poster-cover {
width: 90px;
height: 120px;
padding-bottom: 0;
border-radius: 10px;
overflow: hidden;
position: relative;
flex-shrink: 0;
}
body.is-history-page .history-card .poster-cover-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
body.is-history-page .history-card .free-badge-large,
body.is-history-page .history-card .hot-badge-large,
body.is-history-page .history-card .community-badge,
body.is-history-page .history-card .poster-corner-badges,
body.is-history-page .history-card .episode-badge,
body.is-history-page .history-card .poster-card-body,
body.is-history-page .history-pagination {
display: none !important;
}
body.is-history-page .history-info {
flex: 1 1 0;
min-width: 0;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 4px;
}
body.is-history-page .history-name {
width: 100%;
color: rgba(255, 255, 255, 0.95);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
body.is-history-page .history-intro {
width: 100%;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
body.is-history-page .history-watch {
width: 100%;
color: #EC237F;
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
body.is-history-page .history-watch--done {
color: rgba(255, 255, 255, 0.45);
}
body.is-history-page .history-time {
color: rgba(255, 255, 255, 0.45);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
}
}
-205
View File
@@ -1,205 +0,0 @@
.login-dialog-mask {
position: fixed;
inset: 0;
z-index: 1100;
display: none;
align-items: center;
justify-content: center;
overflow-y: auto;
padding: 24px;
box-sizing: border-box;
background: rgba(0, 0, 0, 0.7);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
.login-dialog-mask.is-open { display: flex; }
.login-dialog-stack {
width: 440px;
max-width: 100%;
margin: auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.login-dialog-card {
width: 440px;
max-width: 100%;
padding: 36px;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
color: #fff;
background: #0d0d0d;
border: 1px solid rgba(255,255,255,.2);
border-radius: 40px;
font-family: "PingFang SC", "Noto Sans SC", sans-serif;
}
.login-dialog-head {
width: 100%;
display: flex;
flex-direction: column;
gap: 12px;
}
.login-dialog-title {
color: #fff;
font-size: 24px;
font-weight: 600;
line-height: 32px;
text-align: left;
}
.login-dialog-title-h5 { display: none; }
.login-dialog-desc {
color: rgba(255,255,255,.55);
font-size: 14px;
font-weight: 400;
line-height: 20px;
text-align: left;
}
.login-dialog-form {
width: 100%;
display: flex;
flex-direction: column;
gap: 24px;
}
.login-dialog-field-group {
width: 100%;
display: flex;
flex-direction: column;
gap: 12px;
}
.login-dialog-label {
display: block;
color: rgba(255,255,255,.55);
font-size: 16px;
font-weight: 400;
line-height: 22px;
}
.login-dialog-field {
width: 100%;
min-height: 60px;
padding: 18px;
box-sizing: border-box;
display: flex;
align-items: center;
overflow: hidden;
background: rgba(255,255,255,.05);
border: 1px solid rgba(255,255,255,.05);
border-radius: 6px;
}
.login-dialog-field--password { justify-content: space-between; gap: 10px; }
.login-dialog-sr {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
}
.login-dialog-input {
width: 100%;
min-width: 0;
padding: 0;
color: #fff;
font: 400 16px/22px "PingFang SC", "Noto Sans SC", sans-serif;
background: transparent;
border: 0;
outline: 0;
}
.login-dialog-input::placeholder { color: rgba(255,255,255,.35); opacity: 1; }
.login-dialog-eye {
width: 20px;
height: 20px;
padding: 0;
flex: 0 0 20px;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border: 0;
cursor: pointer;
}
.login-dialog-eye img { display: block; width: 20px; height: 20px; }
.login-dialog-error {
margin: 0;
color: #ef4444;
font-size: 12px;
font-weight: 400;
line-height: 18px;
}
.login-dialog-error[hidden] { display: none; }
.login-dialog-submit {
width: 100%;
min-height: 50px;
padding: 13px 0;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font: 600 18px/24px "PingFang SC", "Noto Sans SC", sans-serif;
background: #ec237f;
border: 0;
border-radius: 12px;
cursor: pointer;
}
.login-dialog-submit.is-loading,
.login-dialog-submit:disabled { opacity: .75; cursor: not-allowed; }
.login-dialog-register {
width: 100%;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.login-dialog-register-prefix,
.login-dialog-register-link {
font-size: 14px;
font-weight: 400;
line-height: 20px;
}
.login-dialog-register-prefix { color: rgba(255,255,255,.55); }
.login-dialog-register-link { color: #ec237f; text-decoration: none; }
.login-dialog-register-link:hover { color: #ff5b9f; }
.login-dialog-register-link--h5 { display: none; }
.login-dialog-close {
width: 36px;
height: 36px;
padding: 0;
flex: 0 0 36px;
border: 0;
background: transparent;
cursor: pointer;
}
.login-dialog-close img { display: block; width: 36px; height: 36px; }
@media (max-width: 767px) {
.login-dialog-mask {
padding: 16px;
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
}
.login-dialog-stack { width: 300px; }
.login-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; }
.login-dialog-title-pc { display: none; }
.login-dialog-title-h5 { display: inline; }
.login-dialog-title { font-size: 16px; line-height: 22px; }
.login-dialog-desc { font-size: 12px; line-height: 18px; }
.login-dialog-head { gap: 6px; }
.login-dialog-form { gap: 12px; }
.login-dialog-field-group { gap: 6px; }
.login-dialog-label { font-size: 14px; line-height: 20px; }
.login-dialog-field { min-height: 54px; padding: 16px 18px; }
.login-dialog-input { font-size: 14px; line-height: 20px; }
.login-dialog-submit { font-weight: 400; }
.login-dialog-register { height: 24px; }
.login-dialog-register-prefix,
.login-dialog-register-link { font-size: 12px; line-height: 18px; }
.login-dialog-register-link--pc { display: none; }
.login-dialog-register-link--h5 { display: inline; }
}
+66 -248
View File
@@ -739,37 +739,70 @@ a.play-info-tag:focus-visible {
display: none;
}
.play-ep-lock,
.play-ep-coin {
.play-ep-lock {
position: absolute;
right: 6px;
right: 4px;
left: auto;
top: 6px;
width: 16px;
top: 4px;
height: 16px;
padding: 0;
background: none;
border-radius: 0;
padding: 0 4px;
background: linear-gradient(135deg, #FF5F62 0%, #EC237F 100%);
border-radius: 4px;
display: block;
overflow: visible;
box-sizing: border-box;
pointer-events: none;
z-index: 1;
object-fit: contain;
color: #fff;
font-size: 10px;
font-weight: 500;
line-height: 16px;
white-space: nowrap;
}
.play-ep-coin img {
width: 16px;
height: 16px;
object-fit: contain;
display: block;
}
.play-ep--active .play-ep-coin,
.play-ep--active .play-ep-lock {
display: none;
}
/* 付费剧集:播放器内引导下载 APP。 */
.play-player-locked {
position: absolute;
left: 50%;
top: 50%;
z-index: 4;
transform: translate(-50%, -50%);
width: calc(100% - 32px);
max-width: 320px;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
text-align: center;
}
.play-player-locked-text {
margin: 0;
color: rgba(255, 255, 255, 0.85);
font-size: 14px;
line-height: 20px;
}
.play-player-locked-btn {
padding: 10px 24px;
border: none;
border-radius: 999px;
background: #ec237f;
color: #fff;
font-size: 15px;
font-weight: 500;
line-height: 22px;
cursor: pointer;
white-space: nowrap;
}
.play-player-locked-btn:hover {
opacity: 0.9;
}
@media (max-width: 1200px) {
.play-layout,
.play-main,
@@ -1202,11 +1235,6 @@ a.play-info-tag:focus-visible {
transform-origin: center;
}
.play-h5-side-item [data-h5-like-icon],
.play-h5-side-item [data-h5-collect-icon] {
transform: scale(0.8);
}
.play-h5-side-item[data-play-comment-open] img {
transform: scale(1.09);
}
@@ -1215,12 +1243,6 @@ a.play-info-tag:focus-visible {
transform: scale(1);
}
.play-h5-side-item--active img,
.play-h5-side-item img[src*="h5_liked"],
.play-h5-side-item img[src*="h5_collected"] {
filter: none;
}
.play-h5-meta {
display: inline-flex;
position: absolute;
@@ -1609,26 +1631,6 @@ a.play-info-tag:focus-visible {
line-height: 18px;
}
.play-ep-sheet-collect {
flex-shrink: 0;
padding: 4px 12px;
border: none;
border-radius: 999px;
background: #ec237f;
color: #fff;
font-size: 10px;
font-family: PingFang SC;
font-weight: 400;
line-height: 16px;
cursor: pointer;
text-align: center;
}
.play-ep-sheet-collect.is-collected {
background: rgba(255, 255, 255, 0.10);
color: #ec237f;
}
.play-ep-sheet-tabs {
width: 100%;
display: flex;
@@ -1724,33 +1726,26 @@ a.play-info-tag:focus-visible {
font-weight: 400;
}
.play-ep-sheet-coin,
.play-ep-sheet-lock {
position: absolute;
right: 6px;
right: 4px;
left: auto;
top: 6px;
width: 16px;
top: 4px;
height: 16px;
padding: 0;
background: none;
border-radius: 0;
padding: 0 4px;
background: linear-gradient(135deg, #FF5F62 0%, #EC237F 100%);
border-radius: 4px;
display: block;
overflow: visible;
z-index: 2;
box-sizing: border-box;
pointer-events: none;
object-fit: contain;
color: #fff;
font-size: 10px;
font-weight: 500;
line-height: 16px;
white-space: nowrap;
}
.play-ep-sheet-coin img {
width: 16px;
height: 16px;
object-fit: contain;
display: block;
}
.play-ep-sheet-item--active .play-ep-sheet-coin,
.play-ep-sheet-item--active .play-ep-sheet-lock {
display: none;
}
@@ -1861,7 +1856,7 @@ a.play-info-tag:focus-visible {
display: flex;
flex-direction: column;
gap: 12px;
padding: 18px 16px 0;
padding: 18px 16px calc(12px + env(safe-area-inset-bottom, 0px));
min-height: 0;
flex: 1;
overflow: hidden;
@@ -2190,70 +2185,6 @@ a.play-info-tag:focus-visible {
font-size: 12px;
}
.play-comment-inline-composer {
width: 100%;
margin-top: 8px;
padding: 8px 10px;
background: rgba(255, 255, 255, 0.06);
border-radius: 8px;
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: 6px;
}
.play-comment-inline-row {
display: flex;
align-items: center;
gap: 8px;
}
.play-comment-inline-input {
flex: 1;
min-width: 0;
height: 34px;
padding: 0 10px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 17px;
background: #0A0A0A;
color: #fff;
font-size: 13px;
font-family: PingFang SC;
box-sizing: border-box;
}
.play-comment-inline-input::placeholder {
color: rgba(255, 255, 255, 0.35);
}
.play-comment-inline-input:focus,
.play-comment-inline-input:focus-visible {
border-color: rgba(236, 35, 127, 0.55);
outline: none;
outline-color: transparent;
box-shadow: none;
}
.play-comment-inline-send {
flex-shrink: 0;
height: 34px;
padding: 0 12px;
border: none;
border-radius: 17px;
background: #ec237f;
color: #fff;
font-size: 13px;
font-family: PingFang SC;
font-weight: 500;
cursor: pointer;
}
.play-comment-inline-send:disabled,
.play-comment-inline-send.is-loading {
opacity: 0.6;
cursor: not-allowed;
}
.play-comment-replies-all {
background: none;
border: none;
@@ -2267,119 +2198,6 @@ a.play-info-tag:focus-visible {
text-align: left;
}
.play-comment-composer {
width: 100%;
height: calc(58px + env(safe-area-inset-bottom, 0px));
padding: 6px 16px calc(6px + env(safe-area-inset-bottom, 0px));
background: #1A1A1A;
box-sizing: border-box;
flex-shrink: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 10px;
}
.play-comment-composer-box {
align-self: stretch;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
min-height: 36px;
padding: 6px 12px;
background: rgba(255, 255, 255, 0.05);
border-radius: 3px;
box-sizing: border-box;
text-decoration: none;
color: inherit;
}
.play-comment-composer-placeholder,
.play-comment-composer-login {
flex: 1;
min-width: 0;
color: rgba(255, 255, 255, 0.35);
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
text-decoration: none;
word-wrap: break-word;
}
.play-comment-composer-input {
flex: 1 1 0;
width: auto;
min-width: 0;
min-height: 0;
height: 18px;
max-height: 18px;
margin: 0;
padding: 0;
border: none;
border-radius: 0;
background: transparent;
box-shadow: none;
outline: none;
outline-color: transparent;
resize: none;
overflow: hidden;
-webkit-appearance: none;
appearance: none;
-webkit-tap-highlight-color: transparent;
color: #fff;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
caret-color: #fff;
}
.play-comment-composer-input:focus,
.play-comment-composer-input:focus-visible,
.play-comment-composer-input:active {
border: none;
outline: none;
outline-color: transparent;
box-shadow: none;
}
.play-comment-composer-input::placeholder {
color: rgba(255, 255, 255, 0.35);
opacity: 1;
}
.play-comment-composer-emoji {
width: 24px;
height: 24px;
padding: 0;
margin: 0;
border: none;
background: none;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
position: relative;
overflow: hidden;
}
.play-comment-composer-emoji.is-loading {
opacity: 0.5;
pointer-events: none;
}
.play-comment-composer-emoji img {
width: 24px;
height: 24px;
object-fit: contain;
display: block;
pointer-events: none;
}
body.play-comment-sheet-open {
overflow: hidden;
}
@@ -2859,11 +2677,12 @@ a.play-info-tag:focus-visible {
color: #ec237f;
}
.play-ep-coin {
width: calc(16px * var(--play-s));
.play-ep-lock {
height: calc(16px * var(--play-s));
top: calc(6px * var(--play-s));
right: calc(6px * var(--play-s));
font-size: calc(10px * var(--play-s));
line-height: calc(16px * var(--play-s));
}
.play-comments { width: 100%; }
@@ -3000,6 +2819,5 @@ a.play-info-tag:focus-visible {
.play-h5-bottom { background: #181818; }
.play-speed-sheet-option.is-active,
.play-ep-sheet-tab--active,
.play-ep-sheet-collect.is-collected { color: #ec237f; }
.play-ep-sheet-tab--active { color: #ec237f; }
}
-191
View File
@@ -1,191 +0,0 @@
.register-dialog-mask {
position: fixed;
inset: 0;
z-index: 1100;
display: none;
align-items: center;
justify-content: center;
overflow-y: auto;
padding: 24px;
box-sizing: border-box;
background: rgba(0,0,0,.7);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
.register-dialog-mask.is-open { display: flex; }
.register-dialog-stack {
width: 440px;
max-width: 100%;
margin: auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.register-dialog-card {
width: 440px;
max-width: 100%;
padding: 36px;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
color: #fff;
background: #0d0d0d;
border: 1px solid rgba(255,255,255,.2);
border-radius: 40px;
font-family: "PingFang SC", "Noto Sans SC", sans-serif;
}
.register-dialog-head {
width: 100%;
display: flex;
flex-direction: column;
gap: 12px;
}
.register-dialog-title {
color: #fff;
font-size: 24px;
font-weight: 600;
line-height: 32px;
text-align: left;
}
.register-dialog-desc {
color: rgba(255,255,255,.55);
font-size: 14px;
font-weight: 400;
line-height: 20px;
text-align: left;
}
.register-dialog-desc-h5 { display: none; }
.register-dialog-form {
width: 100%;
display: flex;
flex-direction: column;
gap: 24px;
}
.register-dialog-field-group {
width: 100%;
display: flex;
flex-direction: column;
gap: 12px;
}
.register-dialog-label {
display: block;
color: rgba(255,255,255,.55);
font-size: 16px;
font-weight: 400;
line-height: 22px;
}
.register-dialog-field {
width: 100%;
min-height: 60px;
padding: 18px;
box-sizing: border-box;
display: flex;
align-items: center;
overflow: hidden;
background: rgba(255,255,255,.05);
border: 1px solid rgba(255,255,255,.05);
border-radius: 6px;
}
.register-dialog-sr {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
white-space: nowrap;
border: 0;
}
.register-dialog-input {
width: 100%;
min-width: 0;
padding: 0;
color: #fff;
font: 400 16px/22px "PingFang SC", "Noto Sans SC", sans-serif;
background: transparent;
border: 0;
outline: 0;
}
.register-dialog-input::placeholder { color: rgba(255,255,255,.35); opacity: 1; }
.register-dialog-error {
margin: 0;
color: #ef4444;
font-size: 12px;
font-weight: 400;
line-height: 18px;
}
.register-dialog-error[hidden] { display: none; }
.register-dialog-submit {
width: 100%;
min-height: 50px;
padding: 13px 0;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font: 600 18px/24px "PingFang SC", "Noto Sans SC", sans-serif;
background: #ec237f;
border: 0;
border-radius: 12px;
cursor: pointer;
}
.register-dialog-submit.is-loading,
.register-dialog-submit:disabled { opacity: .75; cursor: not-allowed; }
.register-dialog-login {
width: 100%;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.register-dialog-login-prefix,
.register-dialog-login-link {
font-size: 14px;
font-weight: 400;
line-height: 20px;
}
.register-dialog-login-prefix { display: inline; color: rgba(255,255,255,.55); }
.register-dialog-login-link { color: #ec237f; text-decoration: none; }
.register-dialog-login-link:hover { color: #ff5b9f; }
.register-dialog-login-link--h5 { display: none; }
.register-dialog-close {
width: 36px;
height: 36px;
padding: 0;
flex: 0 0 36px;
border: 0;
background: transparent;
cursor: pointer;
}
.register-dialog-close img { display: block; width: 36px; height: 36px; }
@media (max-width: 767px) {
.register-dialog-mask {
padding: 16px;
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
}
.register-dialog-stack { width: 300px; }
.register-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; }
.register-dialog-title { font-size: 16px; line-height: 22px; }
.register-dialog-desc { font-size: 12px; line-height: 18px; }
.register-dialog-desc-pc { display: none; }
.register-dialog-desc-h5 { display: inline; }
.register-dialog-head { gap: 6px; }
.register-dialog-form { gap: 12px; }
.register-dialog-field-group { gap: 6px; }
.register-dialog-label { font-size: 14px; line-height: 20px; }
.register-dialog-field { min-height: 54px; padding: 16px 18px; }
.register-dialog-input { font-size: 14px; line-height: 20px; }
.register-dialog-submit { font-weight: 400; }
.register-dialog-login { height: 24px; }
.register-dialog-login-prefix,
.register-dialog-login-link { font-size: 12px; line-height: 18px; }
.register-dialog-login-link--pc { display: none; }
.register-dialog-login-link--h5 { display: inline; }
}
-721
View File
@@ -1,721 +0,0 @@
.setting-layout {
min-height: 100vh;
display: flex;
flex-direction: column;
background: #0A0A0A;
}
.setting-layout .site-header,
.setting-layout .footer-box {
flex-shrink: 0;
}
.setting-page {
width: 100%;
flex: 1 1 auto;
min-height: 0;
padding: 36px 0;
background: #0A0A0A;
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
box-sizing: border-box;
}
.setting-pc {
width: 100%;
max-width: calc(100% - 32px);
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 18px;
}
.setting-nav {
display: none;
}
.setting-main {
width: 100%;
max-width: calc(100% - 32px);
height: 370px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
gap: 18px;
box-sizing: border-box;
}
.setting-breadcrumb {
display: inline-flex;
align-items: center;
gap: 10px;
overflow: hidden;
}
.setting-breadcrumb-link {
color: #EC237F;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
text-decoration: none;
}
.setting-breadcrumb-sep {
color: #666666;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.setting-breadcrumb-current {
color: #8A8A8A;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.setting-head {
align-self: stretch;
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
overflow: hidden;
}
.setting-title {
margin: 0;
color: white;
font-size: 30px;
font-family: PingFang SC;
font-weight: 400;
line-height: 36px;
}
.setting-desc {
margin: 0;
color: #A3A3A3;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.setting-panel,
.setting-aside {
height: 100%;
min-height: 0;
padding: 24px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.10);
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 14px;
box-sizing: border-box;
}
.setting-profile-pc {
width: 560px;
flex-shrink: 0;
}
.setting-profile-mobile {
display: none;
}
.setting-aside {
flex: 1 1 0;
align-self: stretch;
min-width: 0;
}
.setting-panel-title,
.setting-aside-title {
margin: 0;
color: white;
font-size: 20px;
font-family: PingFang SC;
font-weight: 400;
line-height: 26px;
}
.setting-section-label {
display: none;
}
.setting-avatar-row {
display: flex;
align-items: center;
gap: 14px;
overflow: hidden;
}
.setting-avatar {
width: 64px;
height: 64px;
border-radius: 999px;
object-fit: cover;
flex-shrink: 0;
}
.setting-avatar-text {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 3px;
overflow: hidden;
}
.setting-avatar-name {
color: white;
font-size: 18px;
font-family: PingFang SC;
font-weight: 400;
line-height: 24px;
}
.setting-avatar-change {
padding: 0;
border: none;
background: none;
color: #EC237F;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
cursor: pointer;
text-decoration: none;
}
.setting-field {
align-self: stretch;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 6px;
overflow: visible;
}
.setting-label {
color: #A3A3A3;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.setting-input {
align-self: stretch;
width: 100%;
min-height: 44px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.05);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.10);
color: #F5F5F5;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
box-sizing: border-box;
-webkit-appearance: none;
appearance: none;
box-shadow: none;
outline: none;
outline-color: transparent;
opacity: 1;
-webkit-text-fill-color: #F5F5F5;
}
.setting-input--static {
display: flex;
align-items: center;
min-height: 44px;
}
.setting-input:focus,
.setting-input:focus-visible {
border-color: rgba(250, 220, 68, 0.55);
outline: none;
outline-color: transparent;
box-shadow: none;
}
.setting-input:read-only,
.setting-input[readonly] {
opacity: 1;
color: #F5F5F5;
-webkit-text-fill-color: #F5F5F5;
cursor: default;
}
.setting-input::placeholder {
color: #A3A3A3;
-webkit-text-fill-color: #A3A3A3;
opacity: 1;
}
.setting-save-btn {
width: 128px;
height: 40px;
background: #EC237F;
border: none;
border-radius: 20px;
color: #181818;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
text-decoration: none;
box-sizing: border-box;
}
.setting-group {
align-self: stretch;
display: flex;
flex-direction: column;
align-items: stretch;
}
.setting-group--security {
margin: 0;
}
.setting-item {
align-self: stretch;
padding: 12px 0;
border: none;
background: transparent;
display: grid;
grid-template-columns: 1fr auto;
grid-template-areas:
"label action"
"hint action";
align-items: center;
column-gap: 12px;
row-gap: 2px;
box-sizing: border-box;
text-align: left;
text-decoration: none;
color: inherit;
cursor: pointer;
font: inherit;
-webkit-tap-highlight-color: transparent;
overflow: hidden;
}
.setting-group--notify .setting-item {
display: flex;
padding: 8px 0;
cursor: default;
}
.setting-item-label {
grid-area: label;
color: white;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.setting-group--notify .setting-item-label {
color: #DBD7E4;
}
.setting-item-hint {
grid-area: hint;
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
}
.setting-item-action {
grid-area: action;
padding: 0;
border: none;
background: none;
color: #EC237F;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
flex-shrink: 0;
}
.setting-item-right,
.setting-item-value,
.setting-item-arrow,
.setting-item-avatar {
display: none;
}
.setting-switch {
width: 42px;
height: 24px;
margin-left: auto;
position: relative;
background: rgba(255, 255, 255, 0.12);
border: none;
border-radius: 12px;
cursor: pointer;
flex-shrink: 0;
padding: 0;
}
.setting-switch::after {
content: "";
width: 18px;
height: 18px;
position: absolute;
left: 3px;
top: 3px;
background: white;
border-radius: 9999px;
transition: left 0.15s ease;
}
.setting-switch--on {
background: #EC237F;
}
.setting-switch--on::after {
left: 21px;
}
.setting-logout {
width: 130px;
height: 40px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 20px;
border: 1px solid #EC237F;
display: inline-flex;
justify-content: center;
align-items: center;
color: #EC237F;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
text-decoration: none;
box-sizing: border-box;
cursor: pointer;
}
@media (max-width: 1100px) {
.setting-main {
height: auto;
flex-wrap: wrap;
}
.setting-profile-pc,
.setting-aside {
width: 100%;
height: auto;
}
}
@media (max-width: 767px) {
body.is-setting-page {
background: #0A0A0A;
padding-bottom: 0;
}
body.is-setting-page .site-header,
body.is-setting-page .footer-box,
body.is-setting-page .floating-action,
body.is-setting-page .download-fab {
display: none !important;
height: 0 !important;
min-height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
}
.setting-layout {
min-height: 100vh;
background: #0A0A0A;
}
.setting-page {
padding: 0;
background: #0A0A0A;
align-items: stretch;
justify-content: flex-start;
gap: 0;
min-height: 100vh;
height: auto;
overflow: visible;
flex: 1 1 auto;
}
.setting-pc {
display: none;
}
.setting-nav {
position: sticky;
top: 0;
z-index: 40;
width: 100%;
height: 48px;
padding: 0 16px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
flex-shrink: 0;
background: #181818;
overflow: hidden;
}
.setting-nav-back {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.setting-nav-back img {
width: 24px;
height: 24px;
display: block;
opacity: 0.55;
filter: brightness(0) invert(1);
}
.setting-nav-title {
margin: 0;
flex: 1 1 0;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 16px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 22px;
overflow: hidden;
}
.setting-nav-spacer {
width: 24px;
height: 24px;
flex-shrink: 0;
}
.setting-main {
width: calc(100% - 32px);
max-width: 343px;
height: auto;
margin: 0 auto;
padding: 14px 0;
flex: 1 1 auto;
flex-direction: column;
align-items: stretch;
gap: 10px;
box-sizing: border-box;
min-height: 0;
overflow: hidden;
}
.setting-profile-pc {
display: none;
}
.setting-profile-mobile {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 10px;
flex: none;
width: 100%;
overflow: hidden;
}
.setting-aside {
flex: none;
width: 100%;
min-height: 0;
height: auto;
padding: 0;
background: transparent;
border: none;
border-radius: 0;
overflow: visible;
gap: 10px;
align-self: stretch;
}
.setting-aside-title {
display: none;
}
.setting-section-label {
display: block;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 18px;
}
.setting-group {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
}
.setting-item {
width: 100%;
height: 52px;
padding: 0 14px;
border-bottom: 1px rgba(255, 255, 255, 0.10) solid;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
box-sizing: border-box;
overflow: hidden;
}
.setting-group .setting-item:last-child {
border-bottom: none;
}
.setting-item--avatar {
height: 76px;
}
.setting-item-hint,
.setting-item-action {
display: none;
}
.setting-item-label {
color: rgba(255, 255, 255, 0.90);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 20px;
flex-shrink: 0;
}
.setting-item-right {
min-width: 0;
display: flex;
justify-content: flex-start;
align-items: center;
gap: 6px;
overflow: hidden;
}
.setting-item-value {
display: block;
color: rgba(255, 255, 255, 0.60);
font-size: 12px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 400;
line-height: 18px;
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.setting-item-avatar {
width: 48px;
height: 48px;
border-radius: 999px;
object-fit: cover;
display: block;
flex-shrink: 0;
border: 1px solid rgba(250, 220, 68, 0.35);
}
.setting-item-arrow {
width: 18px;
height: 18px;
display: block;
flex-shrink: 0;
opacity: 0.55;
filter: brightness(0) invert(1);
}
.setting-group--security .setting-item {
height: 52px;
}
.setting-group--notify .setting-item {
height: 52px;
padding: 0 14px;
cursor: default;
}
.setting-group--notify .setting-item-label {
color: rgba(255, 255, 255, 0.90);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 20px;
}
.setting-switch {
width: 44px;
height: 24px;
margin-left: 0;
background: rgba(255, 255, 255, 0.12);
}
.setting-switch::after {
width: 20px;
height: 20px;
left: 2px;
top: 2px;
background: #fff;
}
.setting-switch--on {
background: #EC237F;
}
.setting-switch--on::after {
left: 22px;
}
.setting-logout {
width: 100%;
height: 48px;
margin-top: 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.90);
font-size: 14px;
font-family: "Noto Sans SC", PingFang SC, sans-serif;
font-weight: 700;
line-height: 20px;
}
}
File diff suppressed because it is too large Load Diff
-241
View File
@@ -1,241 +0,0 @@
.vip-dialog-mask {
position: fixed;
inset: 0;
z-index: 1000;
display: none;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.55);
padding: 24px;
}
.vip-dialog-mask.is-open {
display: flex;
}
.vip-dialog-card {
width: 456px;
max-width: 100%;
padding: 36px;
position: relative;
background: #0A0A0A;
box-shadow: 0px 20px 48px rgba(0, 0, 0, 0.46);
overflow: hidden;
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.10);
flex-direction: column;
justify-content: center;
align-items: center;
gap: 18px;
display: inline-flex;
box-sizing: border-box;
}
.vip-dialog-close {
width: 28px;
height: 28px;
right: 20px;
top: 20px;
position: absolute;
overflow: hidden;
border: none;
padding: 0;
background: transparent;
cursor: pointer;
}
.vip-dialog-close-ring {
width: 26px;
height: 26px;
left: 1px;
top: 1px;
position: absolute;
background: #fff;
border: 1px solid #fff;
border-radius: 50%;
box-sizing: border-box;
}
.vip-dialog-close-x {
width: 8px;
height: 8px;
left: 10px;
top: 10px;
position: absolute;
box-sizing: border-box;
}
.vip-dialog-close-x::before,
.vip-dialog-close-x::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
width: 10px;
height: 1.5px;
background: #808080;
border-radius: 1px;
}
.vip-dialog-close-x::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.vip-dialog-close-x::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
.vip-dialog-icon {
width: 52px;
height: 52px;
position: relative;
overflow: hidden;
border-radius: 12px;
flex-shrink: 0;
color: #EC237F;
}
.vip-dialog-icon-bg {
width: 52px;
height: 52px;
left: 0;
top: 0;
position: absolute;
opacity: 0.10;
background: #EC237F;
}
.vip-dialog-icon-crown {
width: 24px;
height: 21px;
left: 14px;
top: 16px;
position: absolute;
display: block;
}
.vip-dialog-title {
text-align: center;
color: white;
font-size: 24px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 700;
line-height: 30px;
word-wrap: break-word;
}
.vip-dialog-desc {
text-align: center;
color: #8A8A8A;
font-size: 14px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 400;
line-height: 20px;
word-wrap: break-word;
}
.vip-dialog-benefits {
text-align: center;
color: #F59E0B;
font-size: 12px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 700;
line-height: 18px;
word-wrap: break-word;
}
.vip-dialog-cta {
align-self: stretch;
width: 100%;
height: 48px;
background: #EC237F;
overflow: hidden;
border-radius: 24px;
justify-content: center;
align-items: center;
display: inline-flex;
color: #181818;
font-size: 16px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 700;
line-height: 22px;
word-wrap: break-word;
text-decoration: none;
box-sizing: border-box;
}
.vip-dialog-skip {
text-align: center;
color: #8A8A8A;
font-size: 12px;
font-family: "Noto Sans SC", "PingFang SC", sans-serif;
font-weight: 400;
line-height: 18px;
word-wrap: break-word;
border: none;
background: transparent;
padding: 0;
cursor: pointer;
}
@media (max-width: 767px) {
.vip-dialog-mask {
background: rgba(0, 0, 0, 0.70);
padding: 16px;
}
.vip-dialog-card {
width: 300px;
max-width: calc(100vw - 32px);
padding: 32px 24px;
background: rgba(23, 23, 23, 0.98);
box-shadow: 0px 16px 32px rgba(0, 0, 0, 0.45);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.10);
}
.vip-dialog-close {
right: 12px;
top: 12px;
background: rgba(255, 255, 255, 0.08);
border-radius: 14px;
}
.vip-dialog-close-ring {
display: none;
}
.vip-dialog-close-x::before,
.vip-dialog-close-x::after {
background: rgba(255, 255, 255, 0.60);
}
.vip-dialog-icon {
color: #fff;
border-radius: 0;
}
.vip-dialog-icon-bg {
opacity: 1;
background: linear-gradient(135deg, #F12B9E 0%, #6D4BFF 100%);
}
.vip-dialog-desc {
align-self: stretch;
color: rgba(255, 255, 255, 0.60);
}
.vip-dialog-benefits {
width: 100%;
max-width: 287px;
color: #EC237F;
}
.vip-dialog-cta {
color: #171717;
}
.vip-dialog-skip {
color: rgba(255, 255, 255, 0.60);
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

After

Width:  |  Height:  |  Size: 29 KiB

+1 -74
View File
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

@@ -1,13 +0,0 @@
<svg width="20" height="23" viewBox="0 0 20 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.2676 0.87793C14.7429 -0.424404 17.0448 0.409539 17.3868 2.35254L19.3145 13.2998L19.3399 13.4785C19.5386 15.3219 17.7536 16.7952 15.9844 16.1416L15.6866 16.0322C14.9051 15.7438 14.0307 15.8824 13.3809 16.4072C13.0329 16.688 12.6759 17.0789 12.3321 17.6191C10.6263 20.2994 7.54206 21.5733 4.93073 22.1826C3.61958 22.4885 2.41365 22.6303 1.53619 22.6953C1.09742 22.7278 0.739667 22.7417 0.491272 22.7471C0.367292 22.7497 0.270439 22.75 0.204163 22.75C0.171046 22.75 0.145398 22.7502 0.127991 22.75C0.119286 22.7499 0.112085 22.7491 0.107483 22.749H0.100647L0.0547485 22.2627L0.0527954 22.2549H0.0547485C0.0561389 22.2546 0.0583894 22.2537 0.0615845 22.2529C0.0682333 22.2514 0.0786545 22.2486 0.0928345 22.2451C0.121207 22.2381 0.16429 22.2269 0.220764 22.2109C0.333963 22.1788 0.501483 22.1279 0.710999 22.0508C1.13007 21.8966 1.71918 21.6401 2.39264 21.2354C3.73903 20.4261 5.42329 19.0214 6.7569 16.6387C7.05382 16.1082 7.24255 15.6269 7.34967 15.1924C7.63805 14.0223 6.99486 12.8221 5.8819 12.4111C4.08173 11.746 3.65211 9.36597 5.09283 8.09375L13.2676 0.87793Z" fill="url(#paint0_linear_40217_177083)" stroke="url(#paint1_linear_40217_177083)" stroke-width="0.5"/>
<defs>
<linearGradient id="paint0_linear_40217_177083" x1="9.60553" y1="0.5" x2="9.60553" y2="22.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#0C0C0C"/>
<stop offset="1" stop-color="#767676"/>
</linearGradient>
<linearGradient id="paint1_linear_40217_177083" x1="9.60553" y1="0.5" x2="9.60553" y2="22.5" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,29 +0,0 @@
<svg width="343" height="81" viewBox="0 0 343 81" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_40108_172028)">
<rect width="343" height="81" fill="url(#paint0_linear_40108_172028)"/>
<g clip-path="url(#clip1_40108_172028)">
<path d="M212.547 15L176.179 45.9539H164L200.451 15H212.547Z" fill="#2D2D2D"/>
<path d="M176.179 45.9539H164V81.94H176.179V45.9539Z" fill="#202020"/>
<path d="M212.545 15V81.94H176.178V45.9539L212.545 15Z" fill="#1B1B1B"/>
<path d="M224.722 26.614L188.357 57.5699H176.178L212.629 26.614H224.722Z" fill="#2D2D2D"/>
<path d="M188.357 57.5699H176.178V93.556H188.357V57.5699Z" fill="#202020"/>
<path d="M224.723 26.614V93.556H188.357V57.5699L224.723 26.614Z" fill="#1B1B1B"/>
<path d="M236.902 39.7516L200.535 70.7055H188.357L224.809 39.7516H236.902Z" fill="#2D2D2D"/>
<path d="M200.537 70.7055H188.357V106.692H200.537V70.7055Z" fill="#202020"/>
<path d="M236.903 39.7516V106.694H200.535V70.7055L236.903 39.7516Z" fill="#1B1B1B"/>
</g>
</g>
<path d="M18 0.5H325C334.665 0.5 342.5 8.33502 342.5 18V63C342.5 72.665 334.665 80.5 325 80.5H18C8.33502 80.5 0.5 72.665 0.5 63V18C0.5 8.33502 8.33502 0.5 18 0.5Z" stroke="white" stroke-opacity="0.1"/>
<defs>
<linearGradient id="paint0_linear_40108_172028" x1="8.41068e-08" y1="40.5" x2="342.002" y2="-7.16334" gradientUnits="userSpaceOnUse">
<stop stop-color="#020202"/>
<stop offset="1" stop-color="#2F2F2F"/>
</linearGradient>
<clipPath id="clip0_40108_172028">
<path d="M0 18C0 8.05887 8.05888 0 18 0H325C334.941 0 343 8.05888 343 18V63C343 72.9411 334.941 81 325 81H18C8.05888 81 0 72.9411 0 63V18Z" fill="white"/>
</clipPath>
<clipPath id="clip1_40108_172028">
<rect width="72.9028" height="91.6936" fill="white" transform="translate(164 15)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

@@ -1,5 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.3685 18.931L20.8386 17.6856C20.3372 17.5087 20 17.019 20 16.4681V12.5319C20 11.981 20.3372 11.4913 20.8386 11.3144L24.3685 10.069C25.1692 9.78652 26 10.4062 26 11.2865V17.7135C26 18.5938 25.1692 19.2135 24.3685 18.931Z" fill="white" fill-opacity="0.3"/>
<path d="M6.67446 7H20.3255C22.1085 7 23 7.87641 23 9.62922V19.3708C23 21.1236 22.1085 22 20.3255 22H6.67446C4.89149 22 4 21.1236 4 19.3708V9.62922C4 7.87641 4.89149 7 6.67446 7Z" fill="#EC237F"/>
<path d="M16.5216 13.2508L12.4352 11.1172C11.7974 10.7842 11 11.2004 11 11.8665V16.1334C11 16.7995 11.7974 17.216 12.4352 16.8827L16.5216 14.749C17.1595 14.416 17.1595 13.5833 16.5216 13.2503V13.2508Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 784 B

@@ -1,8 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M25 23.5C25 24.5 24.422 25 23.2659 25H14.7341C13.578 25 13 24.5 13 23.5C13 22.5 13.578 22 14.7341 22H23.2659C24.422 22 25 22.5 25 23.5Z" fill="white" fill-opacity="0.3"/>
<path d="M5 15.5C5 18.2848 6.10625 20.9555 8.07538 22.9246C10.0445 24.8938 12.7152 26 15.5 26C18.2848 26 20.9555 24.8938 22.9246 22.9246C24.8938 20.9555 26 18.2848 26 15.5C26 12.7152 24.8938 10.0445 22.9246 8.07538C20.9555 6.10625 18.2848 5 15.5 5C12.7152 5 10.0445 6.10625 8.07538 8.07538C6.10625 10.0445 5 12.7152 5 15.5Z" fill="#EC237F"/>
<path d="M13 11C13 11.5304 13.2107 12.0391 13.5858 12.4142C13.9609 12.7893 14.4696 13 15 13C15.5304 13 16.0391 12.7893 16.4142 12.4142C16.7893 12.0391 17 11.5304 17 11C17 10.4696 16.7893 9.96086 16.4142 9.58579C16.0391 9.21071 15.5304 9 15 9C14.4696 9 13.9609 9.21071 13.5858 9.58579C13.2107 9.96086 13 10.4696 13 11Z" fill="black"/>
<path d="M13 19C13 19.5304 13.2107 20.0391 13.5858 20.4142C13.9609 20.7893 14.4696 21 15 21C15.5304 21 16.0391 20.7893 16.4142 20.4142C16.7893 20.0391 17 19.5304 17 19C17 18.4696 16.7893 17.9609 16.4142 17.5858C16.0391 17.2107 15.5304 17 15 17C14.4696 17 13.9609 17.2107 13.5858 17.5858C13.2107 17.9609 13 18.4696 13 19Z" fill="black"/>
<path d="M17 15C17 15.5304 17.2107 16.0391 17.5858 16.4142C17.9609 16.7893 18.4696 17 19 17C19.5304 17 20.0391 16.7893 20.4142 16.4142C20.7893 16.0391 21 15.5304 21 15C21 14.4696 20.7893 13.9609 20.4142 13.5858C20.0391 13.2107 19.5304 13 19 13C18.4696 13 17.9609 13.2107 17.5858 13.5858C17.2107 13.9609 17 14.4696 17 15Z" fill="black"/>
<path d="M9 15C9 15.5304 9.21071 16.0391 9.58579 16.4142C9.96086 16.7893 10.4696 17 11 17C11.5304 17 12.0391 16.7893 12.4142 16.4142C12.7893 16.0391 13 15.5304 13 15C13 14.4696 12.7893 13.9609 12.4142 13.5858C12.0391 13.2107 11.5304 13 11 13C10.4696 13 9.96086 13.2107 9.58579 13.5858C9.21071 13.9609 9 14.4696 9 15Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@@ -1,5 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="9" y="2" width="12" height="4" rx="2" fill="white" fill-opacity="0.3"/>
<path d="M13 4.1547C14.2376 3.44017 15.7624 3.44017 17 4.1547L23.3923 7.8453C24.6299 8.55983 25.3923 9.88034 25.3923 11.3094V18.6906C25.3923 20.1197 24.6299 21.4402 23.3923 22.1547L17 25.8453C15.7624 26.5598 14.2376 26.5598 13 25.8453L6.6077 22.1547C5.37009 21.4402 4.6077 20.1197 4.6077 18.6906V11.3094C4.6077 9.88034 5.37009 8.55983 6.6077 7.8453L13 4.1547Z" fill="#EC237F"/>
<circle cx="15" cy="15" r="4" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 607 B

@@ -1,6 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.10521 8.22075L20.7665 5.10946C22.4904 4.71685 23.5491 5.38041 23.9426 7.10014L25.8903 15.6107C26.2838 17.3305 25.6187 18.3866 23.8948 18.7792L10.2335 21.8905C8.50963 22.2831 7.45091 21.6196 7.05735 19.8999L5.10972 11.3893C4.71617 9.66953 5.38133 8.61336 7.10521 8.22075Z" fill="white" fill-opacity="0.3"/>
<path d="M7.67822 9H23.3218C25.1073 9 26 9.87641 26 11.6292V21.3708C26 23.1236 25.1073 24 23.3218 24H7.67822C5.89274 24 5 23.1236 5 21.3708V11.6292C5 9.87641 5.89274 9 7.67822 9Z" fill="#EC237F"/>
<path d="M19.292 14H23.2731C23.6742 14 24 14.2843 24 14.6343V17.3657C24 17.7157 23.6742 18 23.2731 18H19.292C18.0271 18 17 17.1038 17 16C17 14.8962 18.0271 14 19.292 14Z" fill="black"/>
<path d="M18 16C18 16.2652 18.1054 16.5196 18.2929 16.7071C18.4804 16.8946 18.7348 17 19 17C19.2652 17 19.5196 16.8946 19.7071 16.7071C19.8946 16.5196 20 16.2652 20 16C20 15.7348 19.8946 15.4804 19.7071 15.2929C19.5196 15.1054 19.2652 15 19 15C18.7348 15 18.4804 15.1054 18.2929 15.2929C18.1054 15.4804 18 15.7348 18 16Z" fill="#EC237F"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,35 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="12" fill="url(#paint0_linear_40108_173685)"/>
<circle cx="12" cy="12" r="8.75" fill="url(#paint1_linear_40108_173685)" stroke="url(#paint2_linear_40108_173685)" stroke-width="0.5"/>
<g filter="url(#filter0_d_40108_173685)">
<path d="M12.5123 17.1767C12.1999 17.3857 11.7992 17.3857 11.4871 17.1761C10.631 16.6012 10.0239 16.2525 8.89332 15.3057C3.98568 11.525 8.17438 5.73567 11.9992 8.92344C15.8142 5.738 20.0182 11.516 15.105 15.3057C13.9814 16.2476 13.3648 16.6059 12.5123 17.1767Z" fill="url(#paint3_linear_40108_173685)"/>
</g>
<defs>
<filter id="filter0_d_40108_173685" x="4.66602" y="6" width="14.666" height="13.3333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="1"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_40108_173685"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_40108_173685" result="shape"/>
</filter>
<linearGradient id="paint0_linear_40108_173685" x1="12" y1="0" x2="12" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#FDE0B9"/>
<stop offset="1" stop-color="#FEC691"/>
</linearGradient>
<linearGradient id="paint1_linear_40108_173685" x1="3" y1="3" x2="21" y2="21" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEC997"/>
<stop offset="1" stop-color="#FFAB75"/>
</linearGradient>
<linearGradient id="paint2_linear_40108_173685" x1="3" y1="3" x2="21" y2="21" gradientUnits="userSpaceOnUse">
<stop stop-color="#D4A06D" stop-opacity="0.3"/>
<stop offset="1" stop-color="#D4A06D" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint3_linear_40108_173685" x1="6.99927" y1="8" x2="16.9993" y2="17" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEE9CF"/>
<stop offset="1" stop-color="#FECD9C"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,8 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.0215 18.7807C20.0215 19.7019 19.5609 20.1626 18.6396 20.1626H11.8409C10.9196 20.1626 10.459 19.7019 10.459 18.7807C10.459 17.8594 10.9196 17.3988 11.8409 17.3988H18.6396C19.5609 17.3988 20.0215 17.8594 20.0215 18.7807Z" fill="#FFD495" fill-opacity="0.5"/>
<path d="M3.80273 12.0101C3.80273 14.1857 4.66699 16.2722 6.20537 17.8106C7.74376 19.3489 9.83026 20.2132 12.0059 20.2132C14.1815 20.2132 16.268 19.3489 17.8063 17.8106C19.3447 16.2722 20.209 14.1857 20.209 12.0101C20.209 9.83447 19.3447 7.74797 17.8063 6.20959C16.268 4.6712 14.1815 3.80695 12.0059 3.80695C9.83026 3.80695 7.74376 4.6712 6.20537 6.20959C4.66699 7.74797 3.80273 9.83447 3.80273 12.0101Z" fill="#FFD495"/>
<path d="M10.4121 8.92804C10.4121 9.35384 10.5813 9.76219 10.8823 10.0633C11.1834 10.3644 11.5918 10.5335 12.0176 10.5335C12.4434 10.5335 12.8517 10.3644 13.1528 10.0633C13.4539 9.76219 13.623 9.35384 13.623 8.92804C13.623 8.50224 13.4539 8.09389 13.1528 7.7928C12.8517 7.49172 12.4434 7.32257 12.0176 7.32257C11.5918 7.32257 11.1834 7.49172 10.8823 7.7928C10.5813 8.09389 10.4121 8.50224 10.4121 8.92804Z" fill="#BD8B42"/>
<path d="M10.4121 15.0687C10.4121 15.4945 10.5813 15.9028 10.8823 16.2039C11.1834 16.505 11.5918 16.6741 12.0176 16.6741C12.4434 16.6741 12.8517 16.505 13.1528 16.2039C13.4539 15.9028 13.623 15.4945 13.623 15.0687C13.623 14.6429 13.4539 14.2345 13.1528 13.9334C12.8517 13.6323 12.4434 13.4632 12.0176 13.4632C11.5918 13.4632 11.1834 13.6323 10.8823 13.9334C10.5813 14.2345 10.4121 14.6429 10.4121 15.0687Z" fill="#BD8B42"/>
<path d="M13.4824 11.9984C13.4824 12.4241 13.6516 12.8325 13.9527 13.1336C14.2537 13.4347 14.6621 13.6038 15.0879 13.6038C15.5137 13.6038 15.922 13.4347 16.2231 13.1336C16.5242 12.8325 16.6934 12.4241 16.6934 11.9984C16.6934 11.5726 16.5242 11.1642 16.2231 10.8631C15.922 10.562 15.5137 10.3929 15.0879 10.3929C14.6621 10.3929 14.2537 10.562 13.9527 10.8631C13.6516 11.1642 13.4824 11.5726 13.4824 11.9984Z" fill="#BD8B42"/>
<path d="M7.3418 11.9984C7.3418 12.4241 7.51094 12.8325 7.81203 13.1336C8.11311 13.4347 8.52147 13.6038 8.94727 13.6038C9.37306 13.6038 9.78142 13.4347 10.0825 13.1336C10.3836 12.8325 10.5527 12.4241 10.5527 11.9984C10.5527 11.5726 10.3836 11.1642 10.0825 10.8631C9.78142 10.562 9.37306 10.3929 8.94727 10.3929C8.52147 10.3929 8.11311 10.562 7.81203 10.8631C7.51094 11.1642 7.3418 11.5726 7.3418 11.9984Z" fill="#BD8B42"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,6 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.6018 9.06354H7.57816L7.21676 5.6119C7.13777 4.85674 7.87652 4.27924 8.5902 4.53846L11.3089 5.52565C11.8135 5.70893 12.3665 5.70893 12.8711 5.52565L15.5898 4.53846C16.3035 4.27924 17.0425 4.85674 16.9632 5.6119L16.6018 9.06354Z" fill="#FFD495" fill-opacity="0.5"/>
<path d="M5.60539 7.17468H18.5743C19.5873 7.17468 20.0938 7.68117 20.0938 8.69414C20.0938 9.7071 19.5873 10.2136 18.5743 10.2136H5.60539C4.59242 10.2136 4.08594 9.7071 4.08594 8.69414C4.08594 7.68117 4.59242 7.17468 5.60539 7.17468Z" fill="#FFD495"/>
<path d="M5.97313 9.1369H18.2066C18.6141 9.1369 18.9453 9.46784 18.9453 9.87565V17.6142C18.9453 18.4608 18.2581 19.148 17.4116 19.148H6.76812C5.92156 19.148 5.23438 18.4608 5.23438 17.6142V9.87565C5.23438 9.46807 5.56531 9.1369 5.97313 9.1369Z" fill="#FFD495"/>
<path d="M11.5074 11.2266H12.6723C13.159 11.2266 13.4023 11.4699 13.4023 11.9566V16.9648C13.4023 17.4515 13.159 17.6948 12.6723 17.6948H11.5074C11.0207 17.6948 10.7773 17.4515 10.7773 16.9648V11.9566C10.7773 11.4699 11.0207 11.2266 11.5074 11.2266Z" fill="#BD8B42"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,5 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.7061 20.6182L12.7516 19.2178C12.5524 19.1235 12.3348 19.0746 12.1144 19.0746C11.8941 19.0746 11.6764 19.1235 11.4773 19.2178L8.52275 20.6182C7.96424 20.883 7.3265 20.4511 7.36494 19.8342L7.65978 15.1003C7.70361 14.3984 8.28556 13.8516 8.98869 13.8516H15.2402C15.9435 13.8516 16.5255 14.3984 16.5691 15.1003L16.8639 19.8342C16.9024 20.4511 16.2646 20.883 15.7061 20.6182Z" fill="#FFD495" fill-opacity="0.5"/>
<path d="M5.01953 10.3685C5.01953 11.3001 5.20302 12.2226 5.55953 13.0833C5.91604 13.944 6.43859 14.7261 7.09733 15.3848C7.75608 16.0435 8.53812 16.5661 9.39881 16.9226C10.2595 17.2791 11.182 17.4626 12.1136 17.4626C13.0452 17.4626 13.9677 17.2791 14.8284 16.9226C15.6891 16.5661 16.4711 16.0435 17.1299 15.3848C17.7886 14.7261 18.3111 13.944 18.6677 13.0833C19.0242 12.2226 19.2077 11.3001 19.2077 10.3685C19.2077 8.48707 18.4602 6.68267 17.1299 5.35228C15.7995 4.02188 13.9951 3.27448 12.1136 3.27448C10.2321 3.27448 8.42773 4.02188 7.09733 5.35228C5.76694 6.68267 5.01953 8.48707 5.01953 10.3685Z" fill="#FFD495"/>
<path d="M12.5124 7.63316L13.0995 8.82261C13.1644 8.95386 13.2896 9.04503 13.4344 9.06613L14.7471 9.25691C15.1121 9.30988 15.2579 9.75847 14.9937 10.0158L14.0438 10.9418C13.9921 10.9922 13.9535 11.0543 13.9312 11.1229C13.9089 11.1915 13.9036 11.2645 13.9158 11.3356L14.1401 12.6429C14.2025 13.0064 13.8209 13.2835 13.4944 13.1119L12.3202 12.4946C12.2563 12.461 12.1853 12.4434 12.1131 12.4434C12.041 12.4434 11.9699 12.461 11.9061 12.4946L10.7318 13.1119C10.4054 13.2835 10.0238 13.0064 10.0861 12.6429L10.3104 11.3356C10.3353 11.1912 10.2872 11.044 10.1825 10.9418L9.23254 10.0158C8.9684 9.75847 9.11418 9.30988 9.4791 9.25691L10.7918 9.06613C10.9367 9.04503 11.0621 8.9541 11.1268 8.82261L11.7139 7.63316C11.877 7.30246 12.3486 7.30246 12.5119 7.63316H12.5124Z" fill="#BD8B42"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

@@ -1,3 +0,0 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.6004 16.5992C19.3828 13.45 20.0303 10.4566 20.0303 10.4566H14.0355V8.25163H21.1652V7.30738H14.0355V4H10.7957V7.30738H4.31341V8.25163H10.7957V10.4566H5.28587V11.4008H16.4679C16.4679 11.559 16.4679 11.559 16.3054 11.7147C16.3054 12.8172 15.4955 14.3918 14.848 15.6524C6.58334 12.5033 4.15345 14.3918 3.50345 14.7082C-2.00634 18.4877 3.17845 23.2115 3.98841 23.0557C9.82319 24.3164 13.548 21.9533 16.1429 18.9598C16.3054 19.118 16.4679 19.118 16.6279 19.118C18.4103 20.0623 27 24 27 24V19.2762C25.7025 19.2762 21.0053 17.7017 17.6004 16.5992ZM13.388 18.0156C9.33569 23.0557 4.47591 21.4812 3.66595 21.1647C1.72102 20.6926 1.07356 17.2295 3.50345 16.1271C7.5558 14.8664 11.1207 16.2853 13.713 17.5434C13.5505 17.8574 13.388 18.0156 13.388 18.0156Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 876 B

@@ -1,35 +0,0 @@
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="30" cy="30" r="30" fill="url(#paint0_linear_40217_177127)"/>
<circle cx="30" cy="30" r="21.875" fill="url(#paint1_linear_40217_177127)" stroke="url(#paint2_linear_40217_177127)" stroke-width="1.25"/>
<g filter="url(#filter0_d_40217_177127)">
<path d="M31.2819 42.9456C30.5011 43.468 29.4992 43.468 28.7191 42.9441C26.5787 41.507 25.0609 40.6352 22.2345 38.2681C9.96542 28.8164 20.4372 14.3431 29.9991 22.3125C39.5366 14.3489 50.0467 28.7939 37.7637 38.2681C34.9547 40.6229 33.4132 41.5186 31.2819 42.9456Z" fill="url(#paint3_linear_40217_177127)"/>
</g>
<defs>
<filter id="filter0_d_40217_177127" x="11.6663" y="15.0039" width="36.6667" height="33.334" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="2.5"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_40217_177127"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_40217_177127" result="shape"/>
</filter>
<linearGradient id="paint0_linear_40217_177127" x1="30" y1="0" x2="30" y2="60" gradientUnits="userSpaceOnUse">
<stop stop-color="#FDE0B9"/>
<stop offset="1" stop-color="#FEC691"/>
</linearGradient>
<linearGradient id="paint1_linear_40217_177127" x1="7.5" y1="7.5" x2="52.5" y2="52.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEC997"/>
<stop offset="1" stop-color="#FFAB75"/>
</linearGradient>
<linearGradient id="paint2_linear_40217_177127" x1="7.5" y1="7.5" x2="52.5" y2="52.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#D4A06D" stop-opacity="0.3"/>
<stop offset="1" stop-color="#D4A06D" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint3_linear_40217_177127" x1="17.4994" y1="20.0039" x2="42.4994" y2="42.5039" gradientUnits="userSpaceOnUse">
<stop stop-color="#FEE9CF"/>
<stop offset="1" stop-color="#FECD9C"/>
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 32 KiB

@@ -1,3 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 3.33203C15.8158 3.33203 18.75 7.4987 18.75 9.9987C18.75 12.4987 15.8158 16.6654 10 16.6654C4.18417 16.6654 1.25 12.4987 1.25 9.9987C1.25 7.4987 4.18417 3.33203 10 3.33203ZM10 4.9987C4.99583 4.9987 2.91667 8.1237 2.91667 9.9987C2.91667 11.8737 4.99583 14.9987 10 14.9987C15.0042 14.9987 17.0833 11.8737 17.0833 9.9987C17.0833 8.1237 15.0042 4.9987 10 4.9987ZM9.93583 7.08453C9.97107 7.08601 10.0052 7.0973 10.0344 7.11715C10.0635 7.13699 10.0865 7.16459 10.1008 7.19683C10.1151 7.22908 10.1201 7.26467 10.1153 7.29961C10.1104 7.33454 10.0959 7.36742 10.0733 7.39453L10.005 7.4812C9.89 7.63536 9.77167 7.83953 9.69167 8.09786C9.47667 8.78453 9.71333 9.4787 10.0792 9.84786C10.4267 10.1979 10.8933 10.5229 11.6667 10.4895C12.0408 10.4579 12.3567 10.292 12.5775 10.137L12.6167 10.1162C12.648 10.1033 12.6822 10.0984 12.7159 10.1022C12.7496 10.106 12.7818 10.1182 12.8096 10.1377C12.8374 10.1572 12.8597 10.1834 12.8747 10.2139C12.8896 10.2444 12.8966 10.2781 12.895 10.312L12.8933 10.3529C12.8926 10.3673 12.8915 10.3818 12.89 10.3962C12.8143 10.9465 12.583 11.4637 12.2233 11.887C11.8637 12.3103 11.3906 12.6221 10.8598 12.7857C10.329 12.9494 9.76247 12.958 9.2269 12.8107C8.69133 12.6634 8.20898 12.3661 7.83656 11.954C7.46414 11.5419 7.21715 11.032 7.12464 10.4843C7.03213 9.93657 7.09794 9.37384 7.31434 8.86226C7.53073 8.35068 7.88871 7.91152 8.34617 7.59645C8.80363 7.28138 9.34155 7.10349 9.89667 7.0837L9.93583 7.08453Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

-3
View File
@@ -1,3 +0,0 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.8726 8.38766V4.55078H6.16309V8.38766H11.9547V10.8944C7.24678 11.1061 3.70166 12.0342 3.70166 13.1476C3.70166 14.2611 7.24675 15.1891 11.9547 15.4009V23.4457H16.081V15.399C20.7708 15.1841 24.2979 14.2577 24.2979 13.1476C24.2979 12.0374 20.7708 11.1107 16.081 10.8961V8.38763H21.8726V8.38766ZM22.5242 12.9209C22.5242 13.6533 19.783 14.2675 16.081 14.4381L15.8418 14.4482H15.8154L15.591 14.4565H15.5667C15.3999 14.4622 15.231 14.4671 15.06 14.471H15.0494L14.82 14.4757H14.7552L14.5742 14.4781H13.4278L13.2487 14.4757H13.1864L12.9724 14.4712H12.9489C12.6952 14.4656 12.4454 14.4577 12.1993 14.4482H12.196L11.951 14.4376C8.23055 14.2697 5.47165 13.6533 5.47165 12.9174C5.47165 12.1815 8.23102 11.5669 11.951 11.3971V13.7242C12.5967 13.7579 13.2837 13.7763 13.9962 13.7763C14.72 13.7763 15.4208 13.7576 16.0775 13.7224V11.404C19.7827 11.5741 22.5242 12.1887 22.5242 12.9209Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1001 B

@@ -1,10 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_40086_453711)">
<path d="M10.3758 16.4796C10.2358 16.4811 10.0979 16.4391 9.97552 16.3577C9.85312 16.2763 9.75038 16.1583 9.6773 16.0152L9.62427 15.8844L5.43854 9.252C5.41334 9.19285 5.39965 9.12761 5.39851 9.0612C5.40166 8.93749 5.44553 8.8203 5.52055 8.73529C5.59556 8.65028 5.6956 8.60437 5.79878 8.6076C5.88883 8.6076 5.97189 8.6412 6.03893 8.6976L10.6199 11.9772C10.7781 12.093 10.9556 12.1656 11.1398 12.1896C11.324 12.2137 11.5104 12.1887 11.6856 12.1164L21.8162 4.8C19.6408 1.896 16.0605 0 12.0078 0C5.3755 0 0 5.076 0 11.3352C0 14.7504 1.61705 17.8248 4.1487 19.902C4.25086 19.9826 4.33495 20.092 4.39357 20.2207C4.4522 20.3494 4.48357 20.4934 4.48492 20.64C4.48245 20.7387 4.4683 20.8365 4.44289 20.9304L3.90154 23.2152C3.87552 23.3232 3.8365 23.4348 3.8365 23.5464C3.8365 23.7984 4.01661 24 4.23676 24C4.32281 24 4.39386 23.964 4.46691 23.916L7.09662 22.1976C7.29475 22.068 7.50288 21.9876 7.73404 21.9876C7.85712 21.9876 7.97419 22.0092 8.08727 22.0464C9.31306 22.446 10.6369 22.6692 12.0068 22.6692C18.6391 22.668 24.0156 17.592 24.0156 11.3352C24.0156 9.438 23.5183 7.6524 22.6467 6.0828L10.823 16.3248L10.736 16.3812C10.6237 16.4463 10.5005 16.4799 10.3758 16.4796Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_40086_453711">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="6" y="2.75" width="12" height="18.5" rx="2.5" stroke="#818181" stroke-width="1.5"/>
<path d="M12 7.5V14M12 14L9.25 11.25M12 14L14.75 11.25" stroke="#818181" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.5 18H13.5" stroke="#818181" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 422 B

+5
View File
@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="6" y="2.75" width="12" height="18.5" rx="2.5" stroke="#EC237F" stroke-width="1.5"/>
<path d="M12 7.5V14M12 14L9.25 11.25M12 14L14.75 11.25" stroke="#EC237F" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.5 18H13.5" stroke="#EC237F" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 422 B

-4
View File
@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.9725 11.9062C4.9725 12.8358 5.15558 13.7562 5.51129 14.6149C5.867 15.4737 6.38837 16.254 7.04564 16.9112C7.7029 17.5685 8.48319 18.0899 9.34195 18.4456C10.2007 18.8013 11.1211 18.9844 12.0506 18.9844C12.9801 18.9844 13.9006 18.8013 14.7593 18.4456C15.6181 18.0899 16.3984 17.5685 17.0556 16.9112C17.7129 16.254 18.2343 15.4737 18.59 14.6149C18.9457 13.7562 19.1288 12.8358 19.1288 11.9062C19.1288 10.9767 18.9457 10.0563 18.59 9.19757C18.2343 8.33881 17.7129 7.55852 17.0556 6.90126C16.3984 6.24399 15.6181 5.72262 14.7593 5.36691C13.9006 5.01121 12.9801 4.82813 12.0506 4.82812C11.1211 4.82813 10.2007 5.01121 9.34195 5.36691C8.48319 5.72262 7.7029 6.24399 7.04564 6.90126C6.38837 7.55852 5.867 8.33881 5.51129 9.19757C5.15558 10.0563 4.9725 10.9767 4.9725 11.9062Z" fill="#818181"/>
<path d="M12.0506 16.2457C10.6078 16.2457 9.33234 15.326 8.87695 13.957C8.77476 13.65 8.94093 13.3184 9.24796 13.2162C9.55499 13.114 9.88663 13.2801 9.98882 13.5872C10.2846 14.4764 11.1131 15.0738 12.0504 15.0738C12.9877 15.0738 13.8162 14.4764 14.1119 13.5872C14.2141 13.2801 14.5458 13.114 14.8528 13.2162C15.1598 13.3184 15.326 13.65 15.2238 13.957C15.0027 14.6238 14.577 15.2039 14.0072 15.6148C13.4374 16.0256 12.7526 16.2464 12.0501 16.2457H12.0506Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

-4
View File
@@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.9725 11.9062C4.9725 12.8358 5.15558 13.7562 5.51129 14.6149C5.867 15.4737 6.38837 16.254 7.04564 16.9112C7.7029 17.5685 8.48319 18.0899 9.34195 18.4456C10.2007 18.8013 11.1211 18.9844 12.0506 18.9844C12.9801 18.9844 13.9006 18.8013 14.7593 18.4456C15.6181 18.0899 16.3984 17.5685 17.0556 16.9112C17.7129 16.254 18.2343 15.4737 18.59 14.6149C18.9457 13.7562 19.1288 12.8358 19.1288 11.9062C19.1288 10.9767 18.9457 10.0563 18.59 9.19757C18.2343 8.33881 17.7129 7.55852 17.0556 6.90126C16.3984 6.24399 15.6181 5.72262 14.7593 5.36691C13.9006 5.01121 12.9801 4.82813 12.0506 4.82812C11.1211 4.82813 10.2007 5.01121 9.34195 5.36691C8.48319 5.72262 7.7029 6.24399 7.04564 6.90126C6.38837 7.55852 5.867 8.33881 5.51129 9.19757C5.15558 10.0563 4.9725 10.9767 4.9725 11.9062Z" fill="#EC237F"/>
<path d="M12.0506 16.2457C10.6078 16.2457 9.33234 15.326 8.87695 13.957C8.77476 13.65 8.94093 13.3184 9.24796 13.2162C9.55499 13.114 9.88663 13.2801 9.98882 13.5872C10.2846 14.4764 11.1131 15.0738 12.0504 15.0738C12.9877 15.0738 13.8162 14.4764 14.1119 13.5872C14.2141 13.2801 14.5458 13.114 14.8528 13.2162C15.1598 13.3184 15.326 13.65 15.2238 13.957C15.0027 14.6238 14.577 15.2039 14.0072 15.6148C13.4374 16.0256 12.7526 16.2464 12.0501 16.2457H12.0506Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

-454
View File
@@ -1,454 +0,0 @@
/**
* 认证相关前端封装:注册 / 登录 / 游客登录走本站 BFF,token 等写入 cookie。
* 未注册用户自动游客登录(POST /api/auth/guest → 上游 /api/app/auth/guest)。
*/
(function (global) {
var UUID_KEY = "uuid";
var DEV_ID_KEY = "guest_dev_id";
var CHANNEL_KEY = "channel";
var GUEST_LOGOUT_FLAG_KEY = "guest_logout_manual";
var guestLoginPromise = null;
var volatileDevID = "";
/** 上游约定:token 失效需重新登录 */
var TOKEN_EXPIRED_CODE = 1000;
var tokenRecoveryPromise = null;
function toast(message, type) {
if (typeof global.showToast === "function") {
global.showToast(message, type || "info");
return;
}
}
function getInviteCode() {
try {
var params = new URLSearchParams(global.location.search || "");
return (
params.get("inviteCode") ||
params.get("invite") ||
params.get("code") ||
""
).trim();
} catch (e) {
return "";
}
}
function hasSessionToken() {
return !!(global.CookieUtil && global.CookieUtil.getToken && global.CookieUtil.getToken());
}
// 与 91porn-h5-client generateUid 保持一致:16 位十六进制随机串 + 毫秒时间戳。
function generateUUID() {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var uuid = [];
for (var i = 0; i < 16; i++) {
uuid[i] = chars.charAt(Math.floor(Math.random() * 16));
}
return uuid.join("") + Date.now();
}
function syncDevID(devID) {
if (!devID) return;
try {
localStorage.setItem(UUID_KEY, devID);
// 保留旧 key,兼容已上线页面和服务端游客 cookie。
localStorage.setItem(DEV_ID_KEY, devID);
} catch (e) {}
try {
if (global.CookieUtil && typeof global.CookieUtil.set === "function") {
global.CookieUtil.set(DEV_ID_KEY, devID, { days: 365 });
}
} catch (e2) {}
}
function getOrCreateDevID() {
var devID = "";
try {
devID = (localStorage.getItem(UUID_KEY) || "").trim();
} catch (e) {}
if (devID) {
syncDevID(devID);
return devID;
}
// 首屏 SSR 可能已生成同规则 UUID 并写入 cookie,优先复用以保持游客身份一致。
var fromCookie =
global.CookieUtil && typeof global.CookieUtil.get === "function"
? global.CookieUtil.get(DEV_ID_KEY)
: "";
if (fromCookie) {
syncDevID(fromCookie);
return fromCookie;
}
if (!volatileDevID) {
volatileDevID = generateUUID();
}
syncDevID(volatileDevID);
return volatileDevID;
}
function getChannel() {
var channel = "";
try {
channel = (localStorage.getItem(CHANNEL_KEY) || "").trim();
if (channel) {
if (global.CookieUtil && typeof global.CookieUtil.set === "function") {
global.CookieUtil.set(CHANNEL_KEY, channel, { days: 365 });
}
return channel;
}
} catch (e) {}
try {
var params = new URLSearchParams(global.location.search || "");
channel = (params.get("dc") || params.get("ch") || params.get("pc") || "").trim();
if (channel) {
localStorage.setItem(CHANNEL_KEY, channel);
if (global.CookieUtil && typeof global.CookieUtil.set === "function") {
global.CookieUtil.set(CHANNEL_KEY, channel, { days: 365 });
}
}
} catch (e2) {}
return channel;
}
function clearGuestLogoutFlag() {
try {
sessionStorage.removeItem(GUEST_LOGOUT_FLAG_KEY);
} catch (e) {}
try {
if (global.CookieUtil && typeof global.CookieUtil.remove === "function") {
global.CookieUtil.remove("guest_skip_auto");
}
} catch (e2) {}
}
function markGuestLogout() {
try {
sessionStorage.setItem(GUEST_LOGOUT_FLAG_KEY, "1");
} catch (e) {}
try {
if (global.CookieUtil && typeof global.CookieUtil.set === "function") {
// 不设 days → session cookie,配合 SSR 跳过本次自动游客
global.CookieUtil.set("guest_skip_auto", "1");
}
} catch (e2) {}
}
function isGuestLogoutMarked() {
try {
if (sessionStorage.getItem(GUEST_LOGOUT_FLAG_KEY) === "1") return true;
} catch (e) {}
try {
if (
global.CookieUtil &&
typeof global.CookieUtil.get === "function" &&
global.CookieUtil.get("guest_skip_auto") === "1"
) {
return true;
}
} catch (e2) {}
return false;
}
function syncTrackerUid(user) {
if (!user || !global.tracker || typeof global.tracker.setUid !== "function") return;
var uid = user.userId != null ? user.userId : user.uid != null ? user.uid : user.id;
if (uid == null || String(uid) === "") return;
global.tracker.setUid(String(uid));
}
function applyAuthSession(res, failTip) {
if (!res || res.code !== 200 || !res.data) {
var err = new Error((res && (res.tip || res.msg)) || failTip || "请求失败");
err.code = res && res.code;
err.data = res;
throw err;
}
if (global.CookieUtil && typeof global.CookieUtil.setAuthSession === "function") {
global.CookieUtil.setAuthSession(res.data);
}
clearGuestLogoutFlag();
syncTrackerUid(res.data);
try {
document.dispatchEvent(
new CustomEvent("auth:login", { detail: { user: res.data } })
);
} catch (e) {}
return res;
}
function register(payload) {
var channel = getChannel();
var body = {
accountNo: (payload.accountNo || "").trim(),
password: payload.password || "",
devID: getOrCreateDevID(),
channel: channel,
};
var invite = (payload.agentInviteCode || getInviteCode() || "").trim();
if (invite) body.agentInviteCode = invite;
// 游客升级注册:携带当前游客 token,上游按 Authorization 绑定原游客账号。
var options = {};
var token =
global.CookieUtil && typeof global.CookieUtil.getToken === "function"
? global.CookieUtil.getToken()
: "";
var registered =
global.CookieUtil && typeof global.CookieUtil.isRegistered === "function"
? global.CookieUtil.isRegistered()
: false;
if (token && !registered) {
options.headers = { Authorization: token };
}
return global.HttpRequest.post("/api/auth/register", body, options).then(function (res) {
return applyAuthSession(res, "注册失败");
});
}
function login(payload) {
var body = {
account: (payload.account || "").trim(),
password: payload.password || "",
devID: getOrCreateDevID(),
channel: getChannel(),
};
return global.HttpRequest.post("/api/auth/login", body).then(function (res) {
return applyAuthSession(res, "登录失败");
});
}
function resetPassword(payload) {
return global.HttpRequest.post("/api/auth/resetPassword", {
accountNo: (payload.accountNo || "").trim(),
email: (payload.email || "").trim(),
newPassword: payload.newPassword || "",
});
}
function guestLogin() {
var devId = getOrCreateDevID();
return global.HttpRequest.post("/api/auth/guest", {
devID: devId,
deviceId: devId,
channel: getChannel(),
mac: "",
}).then(function (res) {
return applyAuthSession(res, "游客登录失败");
});
}
function isAuthEndpoint(url) {
return /\/api\/auth\/(guest|login|register|resetPassword)(\?|$)/.test(String(url || ""));
}
function isSafeRedirect(path) {
return typeof path === "string" && path.charAt(0) === "/" && path.charAt(1) !== "/";
}
/** 注册账号:打开登录弹窗;无弹窗时跳首页登录入口 */
function promptRegisteredRelogin() {
toast("登录已过期,请重新登录", "warning");
var redirect = "";
try {
redirect = (global.location.pathname || "/") + (global.location.search || "");
} catch (e2) {
redirect = "/";
}
var url = "/login/";
if (isSafeRedirect(redirect) && redirect !== "/" && redirect.indexOf("/?auth=") !== 0) {
url = "/login/return" + (global.location.pathname || "/");
}
if (typeof global.openLoginDialog === "function") {
try {
var opened = global.openLoginDialog();
// dialogLoader 桩函数返回 Promise:加载失败时再走跳转兜底
if (opened && typeof opened.then === "function") {
opened.catch(function () {
global.location.href = url;
});
return;
}
return;
} catch (e) {}
}
global.location.href = url;
}
/**
* 接口返回 code=1000(token 失效)时的统一处理。
* - 游客:清会话后走游客登录,成功后可重试原请求
* - 注册账号:清会话并打开登录弹窗 / 跳转登录页
* @returns {Promise<{ok:boolean, guest?:boolean, needLogin?:boolean, res?:any}>}
*/
function handleTokenExpired() {
if (tokenRecoveryPromise) {
return tokenRecoveryPromise;
}
var wasRegistered =
global.CookieUtil && typeof global.CookieUtil.isRegistered === "function"
? global.CookieUtil.isRegistered()
: false;
if (global.CookieUtil && typeof global.CookieUtil.clearAuth === "function") {
global.CookieUtil.clearAuth();
}
try {
document.dispatchEvent(
new CustomEvent("auth:logout", { detail: { reason: "token-expired" } })
);
} catch (e) {}
if (wasRegistered) {
var registeredJob = Promise.resolve().then(function () {
promptRegisteredRelogin();
return { ok: false, needLogin: true };
});
tokenRecoveryPromise = registeredJob;
registeredJob.finally(function () {
setTimeout(function () {
if (tokenRecoveryPromise === registeredJob) {
tokenRecoveryPromise = null;
}
}, 1200);
});
return registeredJob;
}
clearGuestLogoutFlag();
var guestJob = guestLogin()
.then(function (res) {
return { ok: true, guest: true, res: res };
})
.catch(function (err) {
toast("会话已失效,请刷新页面重试", "error");
throw err;
})
.finally(function () {
if (tokenRecoveryPromise === guestJob) {
tokenRecoveryPromise = null;
}
});
tokenRecoveryPromise = guestJob;
return guestJob;
}
/**
* 无 token(未自己登录)时自动游客登录。
* SSR 也会在首屏补游客;此处作客户端兜底。
* 手动退出后跳过本次;清掉标记后,下次进页再自动游客。
* BFF: POST /api/auth/guest → 上游 POST /api/app/auth/guest
*/
function ensureGuestSession() {
if (hasSessionToken()) {
return Promise.resolve({ ok: true, skipped: true });
}
if (isGuestLogoutMarked()) {
// 本次因手动退出跳过;清标记,下次进页恢复自动游客
clearGuestLogoutFlag();
return Promise.resolve({ ok: true, skipped: true, reason: "manual-logout" });
}
if (!global.HttpRequest) {
return Promise.resolve({ ok: false, skipped: true, reason: "no-http" });
}
if (!guestLoginPromise) {
guestLoginPromise = guestLogin()
.then(function (res) {
return { ok: true, res: res };
})
.catch(function (err) {
return { ok: false, error: err };
})
.finally(function () {
guestLoginPromise = null;
});
}
return guestLoginPromise;
}
function uploadImage(file) {
var fd = new FormData();
fd.append("file", file);
return global.HttpRequest.post("/api/upload/image", fd).then(function (res) {
if (!res || res.code !== 200 || !res.data || !res.data.url) {
var err = new Error((res && (res.tip || res.msg)) || "上传失败");
err.code = res && res.code;
err.data = res;
throw err;
}
return res.data;
});
}
function updateProfile(payload) {
var body = {};
if (payload.nickName != null && String(payload.nickName).trim() !== "") {
body.nickName = String(payload.nickName).trim();
}
if (payload.introduction != null) {
body.introduction = String(payload.introduction).trim();
}
if (payload.avatar) body.avatar = payload.avatar;
if (payload.oldPassword) body.oldPassword = payload.oldPassword;
if (payload.newPassword) body.newPassword = payload.newPassword;
if (typeof payload.privacyMode === "boolean") body.privacyMode = payload.privacyMode;
return global.HttpRequest.post("/api/auth/profile", body).then(function (res) {
if (!res || res.code !== 200) {
var err = new Error((res && (res.tip || res.msg)) || "保存失败");
err.code = res && res.code;
err.data = res;
throw err;
}
if (res.data && global.CookieUtil && typeof global.CookieUtil.setAuthSession === "function") {
global.CookieUtil.setAuthSession(res.data);
}
if (res.data) syncTrackerUid(res.data);
return res;
});
}
function isValidEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(email || "").trim());
}
/** 登录凭证:账号 4–16 位,或合法邮箱 */
function isValidLoginAccount(account) {
var v = String(account || "").trim();
if (!v) return false;
if (v.indexOf("@") >= 0) return isValidEmail(v);
return v.length >= 4 && v.length <= 16;
}
global.AuthAPI = {
TOKEN_EXPIRED_CODE: TOKEN_EXPIRED_CODE,
register: register,
login: login,
resetPassword: resetPassword,
guestLogin: guestLogin,
ensureGuestSession: ensureGuestSession,
handleTokenExpired: handleTokenExpired,
isAuthEndpoint: isAuthEndpoint,
markGuestLogout: markGuestLogout,
hasSessionToken: hasSessionToken,
uploadImage: uploadImage,
updateProfile: updateProfile,
getInviteCode: getInviteCode,
getOrCreateDevID: getOrCreateDevID,
getChannel: getChannel,
isValidEmail: isValidEmail,
isValidLoginAccount: isValidLoginAccount,
toast: toast,
};
// 每次页面初始化都准备好持久设备 UUID,并捕获首次渠道。
getOrCreateDevID();
getChannel();
// 首屏无 token → 自动游客登录
ensureGuestSession();
})(typeof window !== "undefined" ? window : this);
-204
View File
@@ -1,204 +0,0 @@
/**
* Cookie 读写(登录 token / sid 等统一落 cookie)
*/
(function (global) {
function encode(value) {
return encodeURIComponent(String(value == null ? "" : value));
}
function decode(value) {
try {
// 兼容服务端历史 QueryEscape:空格被编成 "+",decodeURIComponent 不会还原
return decodeURIComponent(String(value || "").replace(/\+/g, "%20"));
} catch (e) {
return value;
}
}
function getCookie(name) {
if (!name) return "";
var key = encodeURIComponent(name) + "=";
var parts = String(document.cookie || "").split(";");
for (var i = 0; i < parts.length; i++) {
var part = parts[i].replace(/^\s+/, "");
if (part.indexOf(key) === 0) {
return decode(part.slice(key.length));
}
}
return "";
}
/**
* @param {string} name
* @param {string} value
* @param {{ days?: number, path?: string, sameSite?: string, secure?: boolean }} [options]
*/
function setCookie(name, value, options) {
options = options || {};
var days = options.days;
var path = options.path || "/";
var sameSite = options.sameSite || "Lax";
var parts = [
encodeURIComponent(name) + "=" + encode(value),
"path=" + path,
"SameSite=" + sameSite,
];
if (typeof days === "number") {
var expires = new Date();
expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
parts.push("expires=" + expires.toUTCString());
}
if (options.secure || (global.location && global.location.protocol === "https:")) {
parts.push("Secure");
}
document.cookie = parts.join("; ");
}
function removeCookie(name, path) {
setCookie(name, "", { days: -1, path: path || "/" });
}
var AUTH = {
TOKEN: "token",
SID: "sid",
S_TOKEN: "_s_token_",
USER_ID: "userId",
ACCOUNT_NO: "accountNo",
NICK_NAME: "nickName",
INTRODUCTION: "introduction",
AVATAR: "avatar",
EMAIL: "email",
INVITE_CODE: "inviteCode",
RECHARGE: "recharge",
VIP_TYPE: "vipType",
VIP_EXPIRE: "currentVipExpire",
SHOW_CARD_ID: "showCardId",
SHOW_CARD_NAME: "showCardName",
USER_TYPE: "userType",
IS_REGISTER: "isRegister",
};
var AUTH_KEYS = [
AUTH.TOKEN,
AUTH.USER_ID,
AUTH.ACCOUNT_NO,
AUTH.NICK_NAME,
AUTH.INTRODUCTION,
AUTH.AVATAR,
AUTH.EMAIL,
AUTH.INVITE_CODE,
AUTH.RECHARGE,
AUTH.VIP_TYPE,
AUTH.VIP_EXPIRE,
AUTH.SHOW_CARD_ID,
AUTH.SHOW_CARD_NAME,
AUTH.USER_TYPE,
AUTH.IS_REGISTER,
"_token_",
AUTH.SID,
AUTH.S_TOKEN,
];
function getToken() {
return getCookie(AUTH.TOKEN) || getCookie("_token_") || "";
}
function setToken(token, days) {
setCookie(AUTH.TOKEN, token || "", { days: typeof days === "number" ? days : 7 });
}
function getSid() {
return getCookie(AUTH.SID) || "";
}
function setSid(sid, days) {
setCookie(AUTH.SID, sid || "", { days: typeof days === "number" ? days : 7 });
}
function setAuthSession(user, days) {
if (!user) return;
var d = typeof days === "number" ? days : 7;
if (user.token) setToken(user.token, d);
if (user.userId != null) setCookie(AUTH.USER_ID, String(user.userId), { days: d });
if (user.accountNo) setCookie(AUTH.ACCOUNT_NO, user.accountNo, { days: d });
if (user.nickName) setCookie(AUTH.NICK_NAME, user.nickName, { days: d });
if (user.introduction != null) setCookie(AUTH.INTRODUCTION, user.introduction || "", { days: d });
if (user.avatar != null) setCookie(AUTH.AVATAR, user.avatar || "", { days: d });
if (user.email != null) setCookie(AUTH.EMAIL, user.email || "", { days: d });
if (user.inviteCode != null) setCookie(AUTH.INVITE_CODE, user.inviteCode || "", { days: d });
// 仅在响应显式带 recharge 时写入(含 0),避免局部更新把余额抹成 0
if (Object.prototype.hasOwnProperty.call(user, "recharge")) {
setCookie(AUTH.RECHARGE, String(Number(user.recharge) || 0), { days: d });
}
if (user.vipType != null) setCookie(AUTH.VIP_TYPE, String(user.vipType), { days: d });
if (user.currentVipExpire != null) {
setCookie(AUTH.VIP_EXPIRE, user.currentVipExpire || "", { days: d });
}
if (Object.prototype.hasOwnProperty.call(user, "showCardId")) {
setCookie(AUTH.SHOW_CARD_ID, String(user.showCardId != null ? user.showCardId : ""), { days: d });
}
if (Object.prototype.hasOwnProperty.call(user, "showCardName")) {
setCookie(AUTH.SHOW_CARD_NAME, user.showCardName || "", { days: d });
}
if (user.type != null) setCookie(AUTH.USER_TYPE, String(user.type), { days: d });
if (Object.prototype.hasOwnProperty.call(user, "isRegister") || user.type != null) {
var registered = !!(user.isRegister || Number(user.type) === 1);
setCookie(AUTH.IS_REGISTER, registered ? "1" : "0", { days: d });
}
}
function getAuthSession() {
var token = getToken();
if (!token) return null;
return {
token: token,
userId: getCookie(AUTH.USER_ID),
accountNo: getCookie(AUTH.ACCOUNT_NO),
nickName: getCookie(AUTH.NICK_NAME),
introduction: getCookie(AUTH.INTRODUCTION),
avatar: getCookie(AUTH.AVATAR),
email: getCookie(AUTH.EMAIL),
inviteCode: getCookie(AUTH.INVITE_CODE),
recharge: getCookie(AUTH.RECHARGE),
vipType: getCookie(AUTH.VIP_TYPE),
currentVipExpire: getCookie(AUTH.VIP_EXPIRE),
showCardId: getCookie(AUTH.SHOW_CARD_ID),
showCardName: getCookie(AUTH.SHOW_CARD_NAME),
type: getCookie(AUTH.USER_TYPE),
isRegister: getCookie(AUTH.IS_REGISTER) === "1",
};
}
function clearAuth() {
for (var i = 0; i < AUTH_KEYS.length; i++) {
removeCookie(AUTH_KEYS[i]);
}
}
function isLoggedIn() {
return !!getToken();
}
/** 是否正式注册账号(非游客) */
function isRegistered() {
if (!isLoggedIn()) return false;
if (getCookie(AUTH.IS_REGISTER) === "1") return true;
return Number(getCookie(AUTH.USER_TYPE)) === 1;
}
global.CookieUtil = {
get: getCookie,
set: setCookie,
remove: removeCookie,
AUTH: AUTH,
getToken: getToken,
setToken: setToken,
getSid: getSid,
setSid: setSid,
setAuthSession: setAuthSession,
getAuthSession: getAuthSession,
clearAuth: clearAuth,
isLoggedIn: isLoggedIn,
isRegistered: isRegistered,
};
})(typeof window !== "undefined" ? window : this);
+1 -39
View File
@@ -1,6 +1,6 @@
/**
* 前端请求封装。
* - 登录态走 cookie(credentials: include)
* - 游客会话走 cookie(credentials: include),会话失效由服务端重建
* - 浏览器无法改写 User-Agent;X-Real-IP 由服务端反代上游时注入
* - 直连上游时若需自定义头,请走本站 Go 代理接口
*/
@@ -87,49 +87,11 @@
return data;
});
})
.then(function (data) {
return handleTokenExpiredResponse(url, options, data);
})
.finally(function () {
if (timer) clearTimeout(timer);
});
}
/**
* 业务码 1000:token 失效。
* 游客 → 重新游客登录并重试一次;注册账号 → 打开登录弹窗/跳转登录页。
*/
function handleTokenExpiredResponse(url, options, data) {
options = options || {};
var expiredCode =
(global.AuthAPI && global.AuthAPI.TOKEN_EXPIRED_CODE) || 1000;
if (!data || Number(data.code) !== Number(expiredCode)) {
return data;
}
if (options._skipTokenRecovery || options._tokenRetried) {
return data;
}
if (
global.AuthAPI &&
typeof global.AuthAPI.isAuthEndpoint === "function" &&
global.AuthAPI.isAuthEndpoint(url)
) {
return data;
}
if (!global.AuthAPI || typeof global.AuthAPI.handleTokenExpired !== "function") {
return data;
}
return global.AuthAPI.handleTokenExpired().then(function (result) {
if (result && result.ok && result.guest) {
return request(
url,
Object.assign({}, options, { _tokenRetried: true })
);
}
return data;
});
}
global.HttpRequest = {
request: request,
get: function (url, options) {
-307
View File
@@ -1,307 +0,0 @@
(function () {
var mask = document.getElementById("coinDialog");
if (!mask) return;
var balanceEls = mask.querySelectorAll("[data-coin-balance]");
var costEls = mask.querySelectorAll("[data-coin-cost]");
var payBtn = mask.querySelector("[data-coin-dialog-pay]");
var loading = false;
var paying = false;
function formatCoins(n) {
var num = Number(n);
if (!Number.isFinite(num) || num < 0) num = 0;
return String(Math.floor(num));
}
function setBalance(n) {
var text = formatCoins(n);
balanceEls.forEach(function (el) {
el.textContent = text;
});
}
function setCost(n) {
var text = formatCoins(n);
costEls.forEach(function (el) {
el.textContent = text;
});
}
function toast(message, type) {
if (typeof window.showToast === "function") {
window.showToast(message, type);
return;
}
window.alert(message);
}
function openLogin() {
var loginOpen = document.querySelector("[data-login-dialog-open]");
if (loginOpen) loginOpen.click();
}
function goToCoinRecharge() {
window.location.href = "/deposit/coin/";
}
function isInsufficientBalance(res) {
if (!res) return false;
if (Number(res.code) === 20004) return true;
var message = String(res.tip || res.msg || "");
return /(?:金币|余额).{0,6}不足|不足.{0,6}(?:金币|余额)/.test(message);
}
function resolvePlayletId(trigger) {
if (trigger) {
var fromTrigger = Number(trigger.getAttribute("data-playlet-id") || 0);
if (fromTrigger > 0) return fromTrigger;
}
var fromMask = Number(mask.getAttribute("data-playlet-id") || 0);
if (fromMask > 0) return fromMask;
var playPage =
document.querySelector("[data-play-page]") ||
document.querySelector(".play-page");
if (playPage) {
var fromPage = Number(playPage.getAttribute("data-playlet-id") || 0);
if (fromPage > 0) return fromPage;
}
var player = document.querySelector("[data-play-player]");
if (player) {
var fromPlayer = Number(player.getAttribute("data-playlet-id") || 0);
if (fromPlayer > 0) return fromPlayer;
}
var likeBtn = document.querySelector("[data-playlet-id]");
if (likeBtn) {
var fromBtn = Number(likeBtn.getAttribute("data-playlet-id") || 0);
if (fromBtn > 0) return fromBtn;
}
return 0;
}
function resolvePlayletSlug(trigger) {
if (trigger) {
var fromTrigger = String(trigger.getAttribute("data-playlet-slug") || "").trim();
if (fromTrigger) return fromTrigger;
}
var fromMask = String(mask.getAttribute("data-playlet-slug") || "").trim();
if (fromMask) return fromMask;
var playPage =
document.querySelector("[data-play-page]") ||
document.querySelector(".play-page");
if (playPage) {
var fromPage = String(playPage.getAttribute("data-playlet-slug") || "").trim();
if (fromPage) return fromPage;
}
return "";
}
function buildPlayHref(playletId, chapterId) {
if (!playletId || !chapterId) return "";
var slug = resolvePlayletSlug(null);
var key = slug || String(playletId);
return "/play/" + encodeURIComponent(key) + "/" + chapterId + "/";
}
function isOnPlayPage() {
return !!(
document.querySelector("[data-play-page]") ||
document.querySelector(".play-page")
);
}
function afterUnlockSuccess(playletId, chapterId, data) {
var detail = {
playletId: playletId,
chapterId: chapterId,
balance: data && typeof data.balance === "number" ? data.balance : null,
canWatch: !!(data && data.canWatch),
unlocked: !!(data && data.unlocked),
};
window.dispatchEvent(
new CustomEvent("play:chapter-unlocked", { detail: detail })
);
if (
isOnPlayPage() &&
typeof window.playAfterChapterUnlock === "function"
) {
window.playAfterChapterUnlock(detail);
return;
}
var href = buildPlayHref(playletId, chapterId);
if (href) {
window.location.href = href;
}
}
function setPaying(on) {
paying = !!on;
if (!payBtn) return;
payBtn.disabled = paying;
payBtn.classList.toggle("is-loading", paying);
payBtn.setAttribute("aria-busy", paying ? "true" : "false");
}
function fetchBalance() {
if (!window.HttpRequest) {
setBalance(0);
return Promise.resolve(0);
}
return window.HttpRequest.get("/api/auth/getInfo")
.then(function (res) {
if (!res || res.code !== 200 || !res.data) {
if (res && res.code === 401) {
openLogin();
}
throw new Error((res && (res.tip || res.msg)) || "获取余额失败");
}
var recharge = res.data.recharge;
setBalance(recharge);
if (window.CookieUtil && CookieUtil.setAuthSession) {
CookieUtil.setAuthSession(res.data);
}
return Number(recharge) || 0;
})
.catch(function (err) {
setBalance(0);
toast((err && err.message) || "获取余额失败", "error");
return 0;
});
}
function unlockAndPlay() {
if (paying) return;
if (!window.HttpRequest) {
toast("网络模块未就绪", "error");
return;
}
var chapterId = Number(mask.getAttribute("data-chapter-id") || 0);
var playletId = Number(mask.getAttribute("data-playlet-id") || 0);
var cost = Number(mask.getAttribute("data-single-coins") || 0);
var balance = Number(
(balanceEls[0] && balanceEls[0].textContent) || 0
);
if (!chapterId || !playletId) {
toast("缺少剧集信息,请刷新后重试", "error");
return;
}
if (Number.isFinite(balance) && Number.isFinite(cost) && balance < cost) {
goToCoinRecharge();
return;
}
setPaying(true);
window.HttpRequest.post("/api/playlet/chapter/unlock", {
chapterId: chapterId,
playletId: playletId,
})
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
closeDialog();
openLogin();
return;
}
if (isInsufficientBalance(res)) {
goToCoinRecharge();
return;
}
throw new Error((res && (res.tip || res.msg)) || "解锁失败");
}
var data = res.data || {};
if (typeof data.balance === "number") {
setBalance(data.balance);
if (window.CookieUtil && CookieUtil.setAuthSession) {
CookieUtil.setAuthSession({ recharge: data.balance });
}
}
toast((res && res.tip) || "解锁成功", "success");
closeDialog();
afterUnlockSuccess(
Number(data.playletId) || playletId,
Number(data.chapterId) || chapterId,
data
);
})
.catch(function (err) {
toast((err && err.message) || "解锁失败,请稍后重试", "error");
})
.finally(function () {
setPaying(false);
});
}
function openDialog(event) {
if (event) event.preventDefault();
var trigger =
event && event.target && event.target.closest
? event.target.closest("[data-coin-dialog-open]")
: null;
var singleCoins = trigger
? Number(trigger.getAttribute("data-single-coins") || 0)
: 0;
setCost(singleCoins);
if (trigger) {
mask.setAttribute(
"data-chapter-id",
trigger.getAttribute("data-chapter-id") || ""
);
mask.setAttribute("data-single-coins", String(singleCoins || 0));
mask.setAttribute(
"data-playlet-id",
String(resolvePlayletId(trigger) || "")
);
mask.setAttribute("data-playlet-slug", resolvePlayletSlug(trigger));
} else if (!mask.getAttribute("data-playlet-id")) {
mask.setAttribute("data-playlet-id", String(resolvePlayletId(null) || ""));
}
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
if (loading) return;
loading = true;
fetchBalance().finally(function () {
loading = false;
});
}
function closeDialog() {
mask.classList.remove("is-open");
document.body.style.overflow = "";
}
document.addEventListener("click", function (event) {
if (event.target.closest("[data-coin-dialog-open]")) {
openDialog(event);
return;
}
if (event.target.closest("[data-coin-dialog-close]")) {
closeDialog();
return;
}
if (event.target.closest("[data-coin-dialog-pay]")) {
event.preventDefault();
unlockAndPlay();
return;
}
if (event.target === mask) {
closeDialog();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
closeDialog();
}
});
window.openCoinDialog = openDialog;
window.closeCoinDialog = closeDialog;
})();
-481
View File
@@ -1,481 +0,0 @@
/**
* 充值页:套餐 / 支付方式互斥选择,按套餐 payMethods 刷新;提交走 VIP/金币下单。
* VIP: POST /api/vip/pay 金币: POST /api/coin/buy
* 支付方式严格使用接口返回的 payMethods,不造假默认渠道。
*/
(function () {
var submitting = false;
var confirmMask = document.querySelector("[data-deposit-confirm]");
var confirmMethods = document.querySelector("[data-deposit-confirm-methods]");
var confirmSubmit = document.querySelector("[data-deposit-confirm-submit]");
var bodyOverflowBeforeConfirm = "";
function toast(message, type) {
if (window.AuthAPI && typeof AuthAPI.toast === "function") {
AuthAPI.toast(message, type || "info");
return;
}
if (typeof showToast === "function") showToast(message, type || "info");
}
function bindExclusive(root, selector, activeClass) {
var scope = root || document;
var nodes = scope.querySelectorAll(selector);
if (!nodes.length) return;
nodes.forEach(function (node) {
node.addEventListener("click", function () {
nodes.forEach(function (item) {
item.classList.remove(activeClass);
});
node.classList.add(activeClass);
syncPayTypeAcross(node.getAttribute("data-pay-type") || "");
});
});
}
function syncPayTypeAcross(payType) {
if (!payType) return;
document.querySelectorAll("[data-pay-type]").forEach(function (el) {
var match = String(el.getAttribute("data-pay-type") || "") === String(payType);
if (el.classList.contains("deposit-pay-btn")) {
el.classList.toggle("deposit-pay-btn--active", match);
}
if (el.classList.contains("deposit-mobile-pay")) {
el.classList.toggle("deposit-mobile-pay--active", match);
}
if (el.classList.contains("deposit-confirm-method")) {
el.classList.toggle("is-active", match);
}
});
}
function parsePayMethods(raw) {
if (!raw) return [];
try {
var list = JSON.parse(raw);
if (!Array.isArray(list)) return [];
return list
.map(function (item) {
return {
type: String((item && item.type) || "").trim(),
typeName: String((item && (item.typeName || item.type)) || "").trim(),
};
})
.filter(function (item) {
return item.type || item.typeName;
});
} catch (e) {
return [];
}
}
function currentPayType() {
var active =
document.querySelector(".deposit-confirm-method.is-active[data-pay-type]") ||
document.querySelector(".deposit-pay-btn--active[data-pay-type]") ||
document.querySelector(".deposit-mobile-pay--active[data-pay-type]");
return active ? String(active.getAttribute("data-pay-type") || "") : "";
}
function currentPackage() {
return (
document.querySelector(".deposit-mobile-pkg--active[data-package-id]") ||
document.querySelector(".deposit-package--active[data-package-id]")
);
}
function renderPayButtons(container, className, activeClass, methods, preferType) {
if (!container) return;
var list = Array.isArray(methods) ? methods : [];
if (!list.length) {
container.innerHTML = '<div class="deposit-package-empty">暂无可用支付方式</div>';
return;
}
var prefer = preferType || "";
var activeType = prefer;
if (!list.some(function (item) { return item.type === prefer; })) {
activeType = list[0] ? list[0].type : "";
}
container.innerHTML = list
.map(function (item) {
var isActive = item.type === activeType;
return (
'<button class="' +
className +
(isActive ? " " + activeClass : "") +
'" type="button" data-pay-type="' +
escapeAttr(item.type) +
'">' +
escapeHtml(item.typeName || item.type) +
"</button>"
);
})
.join("");
bindExclusive(container, "." + className.split(" ").join("."), activeClass);
}
function escapeHtml(text) {
return String(text || "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;");
}
function escapeAttr(text) {
return escapeHtml(text).replace(/'/g, "&#39;");
}
function payMethodVisual(item) {
var value = String((item && (item.typeName || item.type)) || "").toLowerCase();
if (/支付宝|alipay/.test(value)) {
return { kind: "alipay", icon: "/static/images/figma-dialogs/alipay.svg" };
}
if (/微信|wechat|weixin|wxpay/.test(value)) {
return { kind: "wechat", icon: "/static/images/figma-dialogs/wechat.svg" };
}
if (/usdt|tether/.test(value)) {
return { kind: "usdt", icon: "/static/images/figma-dialogs/usdt.svg" };
}
return { kind: "other", icon: "" };
}
function renderConfirmMethods(methods, preferType) {
if (!confirmMethods) return "";
var list = Array.isArray(methods) ? methods : [];
var activeType = preferType || (list[0] && list[0].type) || "";
if (!list.some(function (item) { return item.type === activeType; })) {
activeType = (list[0] && list[0].type) || "";
}
confirmMethods.innerHTML = list.map(function (item) {
var visual = payMethodVisual(item);
var icon = visual.icon
? '<img src="' + visual.icon + '" alt="" />'
: '<span aria-hidden="true">¥</span>';
return '<button class="deposit-confirm-method' +
(item.type === activeType ? ' is-active' : '') +
'" type="button" data-pay-type="' + escapeAttr(item.type) + '">' +
'<span class="deposit-confirm-method-copy"><span class="deposit-confirm-method-icon deposit-confirm-method-icon--' + visual.kind + '">' + icon + '</span>' +
'<span class="deposit-confirm-method-name">' + escapeHtml(item.typeName || item.type) + '</span></span>' +
'<span class="deposit-confirm-method-check" aria-hidden="true">✓</span></button>';
}).join("");
confirmMethods.querySelectorAll(".deposit-confirm-method").forEach(function (button) {
button.addEventListener("click", function () {
syncPayTypeAcross(button.getAttribute("data-pay-type") || "");
});
});
syncPayTypeAcross(activeType);
return activeType;
}
function hasPayMethods(el) {
var target = el || currentPackage();
if (!target) return false;
return parsePayMethods(target.getAttribute("data-pay-methods")).length > 0;
}
function syncPayMethods(el) {
var methods = parsePayMethods(el.getAttribute("data-pay-methods"));
var prefer = currentPayType();
renderPayButtons(
document.querySelector("[data-deposit-pay-pc]"),
"deposit-pay-btn",
"deposit-pay-btn--active",
methods,
prefer
);
renderPayButtons(
document.querySelector("[data-deposit-pay-mobile]"),
"deposit-mobile-pay",
"deposit-mobile-pay--active",
methods,
prefer
);
}
function syncPackageActive(kind, packageId) {
document.querySelectorAll(".deposit-package, .deposit-mobile-pkg").forEach(function (el) {
var match =
String(el.getAttribute("data-package-id") || "") === String(packageId) &&
String(el.getAttribute("data-package-kind") || "") === String(kind);
el.classList.toggle("deposit-package--active", match && el.classList.contains("deposit-package"));
el.classList.toggle(
"deposit-mobile-pkg--active",
match && el.classList.contains("deposit-mobile-pkg")
);
});
}
function updateSubmitButtons(price, loading) {
var canPay = hasPayMethods(currentPackage());
var disabled = !!loading || !canPay;
var pkg = currentPackage();
var packageName = pkg ? String(pkg.getAttribute("data-package-name") || "").trim() : "";
var text;
if (loading) {
text = "支付中...";
} else if (!canPay) {
text = "暂无支付方式";
} else {
text = "立即支付 ¥" + (price || "0");
}
document.querySelectorAll("[data-deposit-submit]").forEach(function (btn) {
btn.disabled = disabled;
btn.classList.toggle("is-loading", !!loading);
btn.classList.toggle("is-disabled", !canPay && !loading);
if (btn.classList.contains("deposit-pc-submit")) {
btn.textContent = loading ? "支付中..." : canPay ? "立即支付 ¥" + (price || "0") : "暂无支付方式";
} else {
btn.textContent = loading ? "支付中..." : canPay ? "支付 ¥" + (price || "0") + " 充值金币" : text;
}
});
document.querySelectorAll("[data-deposit-selected-note]").forEach(function (node) {
node.textContent = packageName
? "已选择 " + packageName + " · 点击后选择支付方式"
: "请选择金币套餐";
});
}
function onPackageClick(el) {
var kind = el.getAttribute("data-package-kind") || "";
var id = el.getAttribute("data-package-id") || "";
var price = el.getAttribute("data-price") || "0";
syncPackageActive(kind, id);
syncPayMethods(el);
updateSubmitButtons(price, false);
}
function openPayUrl(data) {
var url = data && data.payUrl ? String(data.payUrl).trim() : "";
if (!url) {
toast("未获取到支付链接", "error");
return;
}
var mode = String((data && data.payUrlMode) || "").toLowerCase();
var openNew =
!!(data && data.isOpenNewBrowser) ||
mode === "new" ||
mode === "blank" ||
mode === "external";
if (openNew) {
var win = window.open(url, "_blank");
if (!win) {
window.location.href = url;
}
return;
}
window.location.href = url;
}
function ensureLoggedIn() {
if (window.CookieUtil && CookieUtil.isLoggedIn()) return true;
toast("请先登录后再支付", "error");
var loginURL = "/login/return/deposit/";
if (typeof window.openLoginDialog === "function") {
var opened = window.openLoginDialog();
if (opened && typeof opened.then === "function") {
opened.catch(function () {
window.location.href = loginURL;
});
}
} else {
window.location.href = loginURL;
}
return false;
}
function closePayConfirm() {
if (!confirmMask) return;
confirmMask.classList.remove("is-open");
confirmMask.setAttribute("aria-hidden", "true");
document.body.style.overflow = bodyOverflowBeforeConfirm;
}
function openPayConfirm() {
if (submitting || !confirmMask) return;
if (!ensureLoggedIn()) return;
var pkg = currentPackage();
if (!pkg) {
toast("请选择套餐", "error");
return;
}
var methods = parsePayMethods(pkg.getAttribute("data-pay-methods"));
if (!methods.length) {
toast("当前套餐暂无可用支付方式", "error");
return;
}
var packageName = String(pkg.getAttribute("data-package-name") || "金币套餐").trim();
var price = String(pkg.getAttribute("data-price") || "0").trim();
var nameEl = confirmMask.querySelector("[data-deposit-confirm-name]");
var priceEl = confirmMask.querySelector("[data-deposit-confirm-price]");
if (nameEl) nameEl.textContent = packageName;
if (priceEl) priceEl.textContent = price;
renderConfirmMethods(methods, currentPayType());
bodyOverflowBeforeConfirm = document.body.style.overflow;
document.body.style.overflow = "hidden";
confirmMask.classList.add("is-open");
confirmMask.setAttribute("aria-hidden", "false");
}
function submitPay() {
if (submitting) return;
if (!window.HttpRequest) {
toast("请求组件未加载", "error");
return;
}
if (!ensureLoggedIn()) return;
var pkg = currentPackage();
if (!pkg) {
toast("请选择套餐", "error");
return;
}
var packageId = Number(pkg.getAttribute("data-package-id") || 0);
var kind = String(pkg.getAttribute("data-package-kind") || "");
var price = pkg.getAttribute("data-price") || "0";
var payMode = currentPayType();
if (!packageId || (kind !== "vip" && kind !== "coin")) {
toast("套餐无效,请重新选择", "error");
return;
}
if (!payMode) {
toast("请选择支付方式", "error");
return;
}
if (!hasPayMethods(pkg)) {
toast("当前套餐暂无可用支付方式", "error");
return;
}
var api = kind === "coin" ? "/api/coin/buy" : "/api/vip/pay";
submitting = true;
updateSubmitButtons(price, true);
if (confirmSubmit) {
confirmSubmit.disabled = true;
confirmSubmit.textContent = "支付中...";
}
HttpRequest.post(api, { packageId: packageId, payMode: payMode })
.then(function (res) {
if (!res || res.code !== 200 || !res.data) {
var err = new Error((res && (res.tip || res.msg)) || "发起支付失败");
err.code = res && res.code;
throw err;
}
openPayUrl(res.data);
})
.catch(function (err) {
if (err && err.code === 401) {
toast("请先登录后再支付", "error");
if (typeof window.openLoginDialog === "function") {
var opened = window.openLoginDialog();
if (opened && typeof opened.then === "function") {
opened.catch(function () {
window.location.href = "/login/return/deposit/";
});
}
}
return;
}
toast((err && err.message) || "发起支付失败", "error");
})
.finally(function () {
submitting = false;
updateSubmitButtons(price, false);
if (confirmSubmit) {
confirmSubmit.disabled = false;
confirmSubmit.textContent = "去支付";
}
});
}
bindExclusive(document, ".deposit-pay-btn", "deposit-pay-btn--active");
bindExclusive(document, ".deposit-mobile-pay", "deposit-mobile-pay--active");
document.querySelectorAll(".deposit-package[data-package-id]").forEach(function (node) {
node.addEventListener("click", function () {
onPackageClick(node);
});
});
document.querySelectorAll(".deposit-mobile-pkg[data-package-id]").forEach(function (node) {
node.addEventListener("click", function () {
onPackageClick(node);
});
});
document.querySelectorAll("[data-deposit-submit]").forEach(function (btn) {
btn.addEventListener("click", openPayConfirm);
});
if (confirmSubmit) confirmSubmit.addEventListener("click", submitPay);
document.querySelectorAll("[data-deposit-confirm-close]").forEach(function (button) {
button.addEventListener("click", closePayConfirm);
});
if (confirmMask) {
confirmMask.addEventListener("click", function (event) {
if (event.target === confirmMask) closePayConfirm();
});
}
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && confirmMask && confirmMask.classList.contains("is-open")) {
closePayConfirm();
}
});
var active =
document.querySelector(".deposit-mobile-pkg--active[data-price]") ||
document.querySelector(".deposit-package--active[data-price]");
if (active) {
syncPayMethods(active);
updateSubmitButtons(active.getAttribute("data-price") || "0", false);
} else {
updateSubmitButtons("0", false);
}
// /deposit/coin 时滚动到金币充值区域(套餐默认选中由 SSR 完成)
(function scrollPreferCoin() {
if (!/\/deposit\/coin\/?$/i.test(window.location.pathname || "")) return;
var isMobile = window.matchMedia("(max-width: 767px)").matches;
var target = isMobile
? document.getElementById("depositCoinMobileTitle")
: document.getElementById("depositCoinGroup");
if (!target) return;
setTimeout(function () {
target.scrollIntoView({ behavior: "smooth", block: "start" });
}, 80);
})();
function formatRecharge(value) {
var n = Number(value);
if (!isFinite(n) || n < 0) n = 0;
return String(Math.floor(n)).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function syncDepositRecharge(value) {
var text = formatRecharge(value);
document.querySelectorAll("[data-deposit-recharge]").forEach(function (el) {
el.textContent = text;
});
}
function refreshDepositWallet() {
if (!window.CookieUtil || !CookieUtil.isLoggedIn() || !window.HttpRequest) {
return;
}
var session = CookieUtil.getAuthSession();
if (session && session.recharge != null && session.recharge !== "") {
syncDepositRecharge(session.recharge);
}
HttpRequest.get("/api/auth/getInfo")
.then(function (res) {
if (!res || res.code !== 200 || !res.data) return;
if (CookieUtil.setAuthSession) CookieUtil.setAuthSession(res.data);
syncDepositRecharge(res.data.recharge);
})
.catch(function () {});
}
refreshDepositWallet();
})();
+24 -704
View File
@@ -120,239 +120,18 @@
})();
(function () {
// detail.js 同步执行早于 defer 的 request.js,需等 HttpRequest 就绪后再绑定
function toast(message, type) {
if (typeof window.showToast === "function") {
window.showToast(message, type);
return;
}
window.alert(message);
}
// 付费剧集:不再站内解锁,统一引导下载 APP
var lockedEpisodes = document.querySelectorAll("[data-episode-locked]");
if (!lockedEpisodes.length) return;
function bindLikeActions() {
var likeBtns = document.querySelectorAll("[data-detail-like]");
if (!likeBtns.length) return;
if (!window.HttpRequest || typeof window.HttpRequest.post !== "function") {
if (!bindLikeActions._retried) {
bindLikeActions._retried = true;
window.addEventListener("load", bindLikeActions, { once: true });
lockedEpisodes.forEach(function (el) {
el.addEventListener("click", function (e) {
e.preventDefault();
if (typeof window.openDownloadApp === "function") {
window.openDownloadApp();
}
return;
}
if (bindLikeActions._bound) return;
bindLikeActions._bound = true;
function applyLikeUI(isLike, countLike) {
var liked = Number(isLike) === 1;
likeBtns.forEach(function (btn) {
btn.classList.toggle("detail-action--active", liked);
btn.classList.toggle("detail-h5-top-btn--active", liked);
btn.classList.toggle("detail-h5-like--active", liked);
btn.classList.toggle("play-h5-side-item--active", liked);
btn.setAttribute("data-liked", liked ? "1" : "2");
btn.setAttribute("aria-pressed", liked ? "true" : "false");
if (countLike != null) {
btn.setAttribute("data-count-like", String(countLike));
}
var label = btn.querySelector("[data-detail-like-label]");
if (label) {
if (btn.getAttribute("data-like-label-mode") === "state") {
label.textContent = liked ? "已点赞" : "点赞";
} else {
var n = countLike != null ? countLike : btn.getAttribute("data-count-like");
label.textContent = String(n == null || n === "" ? 0 : n);
}
}
var h5Icon = btn.querySelector("[data-h5-like-icon]");
if (h5Icon) {
h5Icon.src = liked
? "/static/images/h5_liked.svg"
: "/static/images/like.svg";
}
});
}
likeBtns.forEach(function (btn) {
btn.addEventListener("click", function () {
if (btn.getAttribute("data-liking") === "1") return;
var playletId = Number(btn.getAttribute("data-playlet-id") || 0);
if (!playletId) return;
var likedNow = Number(btn.getAttribute("data-liked") || 2) === 1;
var countNow = Number(btn.getAttribute("data-count-like") || 0);
if (Number.isNaN(countNow)) countNow = 0;
var nextLike = !likedNow;
var nextCount = Math.max(0, countNow + (nextLike ? 1 : -1));
likeBtns.forEach(function (item) {
item.setAttribute("data-liking", "1");
item.disabled = true;
});
applyLikeUI(nextLike ? 1 : 2, nextCount);
window.HttpRequest.post("/api/playlet/like/set", {
id: playletId,
isLike: nextLike,
})
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
var loginOpen = document.querySelector(
"[data-login-dialog-open]"
);
if (loginOpen) loginOpen.click();
}
throw new Error((res && (res.tip || res.msg)) || "操作失败");
}
var data = res.data || {};
applyLikeUI(
data.isLike != null ? data.isLike : nextLike ? 1 : 2,
data.countLike != null ? data.countLike : nextCount
);
})
.catch(function (err) {
applyLikeUI(likedNow ? 1 : 2, countNow);
toast((err && err.message) || "操作失败,请稍后重试", "error");
})
.finally(function () {
likeBtns.forEach(function (item) {
item.removeAttribute("data-liking");
item.disabled = false;
});
});
});
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", bindLikeActions, { once: true });
} else {
bindLikeActions();
}
})();
(function () {
function toast(message, type) {
if (typeof window.showToast === "function") {
window.showToast(message, type);
return;
}
window.alert(message);
}
function bindCollectActions() {
var collectBtns = document.querySelectorAll("[data-detail-collect]");
if (!collectBtns.length) return;
if (!window.HttpRequest || typeof window.HttpRequest.post !== "function") {
if (!bindCollectActions._retried) {
bindCollectActions._retried = true;
window.addEventListener("load", bindCollectActions, { once: true });
}
return;
}
if (bindCollectActions._bound) return;
bindCollectActions._bound = true;
function applyCollectUI(isCollect, countCollect) {
var collected = Number(isCollect) === 1;
collectBtns.forEach(function (btn) {
btn.classList.toggle("detail-action--active", collected);
btn.classList.toggle("detail-h5-collect--active", collected);
btn.classList.toggle("detail-h5-top-btn--active", collected);
btn.classList.toggle("play-h5-side-item--active", collected);
btn.classList.toggle("is-collected", collected);
btn.setAttribute("data-collected", collected ? "1" : "2");
btn.setAttribute("aria-pressed", collected ? "true" : "false");
if (countCollect != null) {
btn.setAttribute("data-count-collect", String(countCollect));
}
var label = btn.querySelector("[data-detail-collect-label]");
if (label) {
if (btn.classList.contains("detail-h5-collect")) {
var n = countCollect != null
? countCollect
: btn.getAttribute("data-count-collect");
label.textContent = String(n == null || n === "" ? 0 : n);
} else {
label.textContent = collected ? "已收藏" : "收藏";
}
}
var h5Icon = btn.querySelector("[data-h5-collect-icon]");
if (h5Icon) {
if (btn.classList.contains("detail-h5-top-btn")) {
h5Icon.src = collected
? "/static/images/h5_collected.svg?v=2"
: "/static/images/collect.svg";
} else if (btn.classList.contains("play-h5-side-item")) {
h5Icon.src = collected
? "/static/images/h5_collected.svg?v=2"
: "/static/images/collect.svg";
} else {
h5Icon.src = collected
? "/static/images/h5_detail_collected.svg"
: "/static/images/h5_detail_collect.svg";
}
}
});
}
collectBtns.forEach(function (btn) {
btn.addEventListener("click", function () {
if (btn.getAttribute("data-collecting") === "1") return;
var playletId = Number(btn.getAttribute("data-playlet-id") || 0);
if (!playletId) return;
var collectedNow = Number(btn.getAttribute("data-collected") || 2) === 1;
var countNow = Number(btn.getAttribute("data-count-collect") || 0);
if (Number.isNaN(countNow)) countNow = 0;
var nextCollect = !collectedNow;
var nextCount = Math.max(0, countNow + (nextCollect ? 1 : -1));
collectBtns.forEach(function (item) {
item.setAttribute("data-collecting", "1");
item.disabled = true;
});
applyCollectUI(nextCollect ? 1 : 2, nextCount);
window.HttpRequest.post("/api/playlet/collect/set", {
id: playletId,
isCollect: nextCollect,
})
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
var loginOpen = document.querySelector(
"[data-login-dialog-open]"
);
if (loginOpen) loginOpen.click();
}
throw new Error((res && (res.tip || res.msg)) || "操作失败");
}
var data = res.data || {};
applyCollectUI(
data.isCollect != null ? data.isCollect : nextCollect ? 1 : 2,
data.countCollect != null ? data.countCollect : nextCount
);
})
.catch(function (err) {
applyCollectUI(collectedNow ? 1 : 2, countNow);
toast((err && err.message) || "操作失败,请稍后重试", "error");
})
.finally(function () {
collectBtns.forEach(function (item) {
item.removeAttribute("data-collecting");
item.disabled = false;
});
});
});
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", bindCollectActions, { once: true });
} else {
bindCollectActions();
}
});
})();
(function () {
@@ -593,15 +372,6 @@
return formatCommentTime(raw);
}
function formatCompactCount(n) {
n = Number(n);
if (!n || n < 0 || Number.isNaN(n)) return "0";
if (n < 10000) return String(n);
var v = n / 10000;
if (v >= 10) return Math.floor(v) + "w";
return (Math.round(v * 10) / 10) + "w";
}
function avatarURL(url) {
url = String(url || "").trim();
return url || DEFAULT_AVATAR;
@@ -614,10 +384,7 @@
}
function renderDetailComment(item, playPcMode) {
var liked = Number(item.isLike) === 1;
var avatar = avatarURL(item.userAvatar);
var commentId = item.id;
var parentsId = Number(item.parentsId || 0) || Number(commentId);
var avatarHtml = item.userAvatar
? '<img class="detail-comment-avatar lazy" src="' +
PLACEHOLDER +
@@ -627,9 +394,6 @@
escapeHtml((item.userName || "匿名用户") + "的头像") +
'" />'
: '<img class="detail-comment-avatar" src="' + DEFAULT_AVATAR + '" alt="匿名用户头像" />';
var likeIcon = liked
? "/static/images/like_solid.svg"
: "/static/images/like_hollow.svg";
var textHtml = escapeHtml(item.text || "");
if (item.replyUserName) {
textHtml =
@@ -691,11 +455,7 @@
}
return (
'<div class="detail-comment" data-comment-id="' +
escapeHtml(commentId) +
'" data-parents-id="' +
escapeHtml(parentsId) +
'" data-user-name="' +
escapeHtml(item.userName || "匿名用户") +
escapeHtml(item.id) +
'">' +
avatarHtml +
'<div class="detail-comment-body">' +
@@ -709,27 +469,6 @@
'<span class="detail-comment-time">' +
escapeHtml(formatCommentTime(item.createdAt)) +
"</span>" +
'<button class="detail-comment-like' +
(liked ? " detail-comment-like--active" : "") +
'" type="button" aria-label="点赞" data-comment-like="' +
escapeHtml(commentId) +
'" data-liked="' +
(liked ? "1" : "2") +
'">' +
'<img src="' +
likeIcon +
'" alt="点赞" />' +
'<span data-like-count>' +
escapeHtml(item.countLike == null ? 0 : item.countLike) +
"</span>" +
"</button>" +
'<button class="detail-comment-reply-label" type="button" data-comment-reply="' +
escapeHtml(commentId) +
'" data-parents-id="' +
escapeHtml(parentsId) +
'" data-reply-name="' +
escapeHtml(item.userName || "匿名用户") +
'">回复</button>' +
"</div>" +
repliesHtml +
"</div></div>"
@@ -737,10 +476,8 @@
}
function renderPlayComment(item) {
var liked = Number(item.isLike) === 1;
var avatar = avatarURL(item.userAvatar);
var commentId = item.id;
var parentsId = Number(item.parentsId || 0) || Number(commentId);
var children = Array.isArray(item.children) ? item.children : [];
var replyCount = Number(item.commentCount || children.length || 0);
var avatarHtml = item.userAvatar
@@ -752,9 +489,6 @@
escapeHtml((item.userName || "匿名用户") + "的头像") +
'" />'
: '<img class="play-comment-avatar" src="' + DEFAULT_AVATAR + '" alt="匿名用户头像" />';
var likeIcon = liked
? "/static/images/h5_liked.svg"
: "/static/images/like_hollow.svg";
var textHtml = escapeHtml(item.text || "");
if (item.replyUserName) {
textHtml =
@@ -807,10 +541,6 @@
return (
'<div class="play-comment-item" data-comment-id="' +
escapeHtml(commentId) +
'" data-parents-id="' +
escapeHtml(parentsId) +
'" data-user-name="' +
escapeHtml(item.userName || "匿名用户") +
'">' +
avatarHtml +
'<div class="play-comment-body">' +
@@ -825,30 +555,7 @@
'<span class="play-comment-time">' +
escapeHtml(formatRelativeTime(item.createdAt)) +
"</span>" +
'<button class="play-comment-reply-action" type="button" data-comment-reply="' +
escapeHtml(commentId) +
'" data-parents-id="' +
escapeHtml(parentsId) +
'" data-reply-name="' +
escapeHtml(item.userName || "匿名用户") +
'">回复</button>' +
"</div>" +
'<button class="play-comment-like' +
(liked ? " play-comment-like--active" : "") +
'" type="button" aria-label="点赞" data-comment-like="' +
escapeHtml(commentId) +
'" data-liked="' +
(liked ? "1" : "2") +
'" data-like-raw="' +
escapeHtml(item.countLike == null ? 0 : item.countLike) +
'">' +
'<img src="' +
likeIcon +
'" alt="点赞" />' +
'<span data-like-count>' +
escapeHtml(formatCompactCount(item.countLike)) +
"</span>" +
"</button>" +
"</div>" +
repliesHtml +
"</div></div>"
@@ -887,18 +594,12 @@
var scope = sheetRoot || section;
var listEl = section.querySelector("[data-comment-list]");
var moreBtn = section.querySelector("[data-comment-more]");
var composerInput =
scope.querySelector(".play-comment-composer-input") ||
scope.querySelector(".detail-comment-composer-input");
var composerCount = scope.querySelector(".detail-comment-composer-count");
var titleEl = section.querySelector("[data-comment-title]");
var sendBtn = scope.querySelector("[data-comment-send]");
var sortBtns = scope.querySelectorAll("[data-comment-sort]");
var sheetTitle = sheetRoot
? sheetRoot.querySelector("[data-play-comment-title]")
: document.querySelector("[data-play-comment-title]");
var sideCount = document.querySelector("[data-play-comment-count]");
var iconSend = !!(sendBtn && sendBtn.classList.contains("play-comment-composer-emoji"));
if (section.getAttribute("data-comment-inited") === "1") return;
section.setAttribute("data-comment-inited", "1");
@@ -910,169 +611,11 @@
var page = 0;
var total = 0;
var loading = false;
var sending = false;
var replyTarget = null; // { parentsId, replyCommentId, replyName }
var inlineSending = false;
function getObjectId() {
return Number(section.getAttribute("data-comment-object-id") || 0);
}
function clearReplyTarget() {
replyTarget = null;
if (!scope) return;
var boxes = scope.querySelectorAll("[data-comment-inline-composer]");
Array.prototype.forEach.call(boxes, function (el) {
el.remove();
});
}
function setReplyTarget(parentsId, replyCommentId, replyName, anchorEl) {
parentsId = Number(parentsId || 0);
replyCommentId = Number(replyCommentId || 0);
if (!parentsId || !replyCommentId || !anchorEl) return;
var root =
anchorEl.closest(commentItemSelector()) ||
anchorEl.closest("[data-comment-id]");
if (!root || !scope.contains(root)) return;
// 再次点击同一条:关闭内联输入框
var existingOnRoot = root.querySelector("[data-comment-inline-composer]");
if (
existingOnRoot &&
replyTarget &&
replyTarget.replyCommentId === replyCommentId
) {
clearReplyTarget();
return;
}
clearReplyTarget();
replyTarget = {
parentsId: parentsId,
replyCommentId: replyCommentId,
replyName: replyName || "用户",
};
var meta =
root.querySelector(".detail-comment-meta") ||
root.querySelector(".play-comment-meta");
var body =
root.querySelector(".detail-comment-body") ||
root.querySelector(".play-comment-body") ||
root;
var box = document.createElement("div");
box.className = sheetMode
? "play-comment-inline-composer"
: "detail-comment-inline-composer";
box.setAttribute("data-comment-inline-composer", "");
var placeholder = "回复 @" + replyTarget.replyName + "…";
if (sheetMode) {
box.innerHTML =
'<div class="play-comment-reply-hint" data-comment-reply-hint>' +
"<span>回复 @" +
escapeHtml(replyTarget.replyName) +
"</span>" +
'<button type="button" data-comment-reply-cancel>取消</button>' +
"</div>" +
'<div class="play-comment-inline-row">' +
'<input class="play-comment-inline-input" type="text" maxlength="200" placeholder="' +
escapeHtml(placeholder) +
'" data-comment-inline-input autocomplete="off" />' +
'<button class="play-comment-inline-send" type="button" data-comment-inline-send>发送</button>' +
"</div>";
} else {
box.innerHTML =
'<div class="detail-comment-reply-hint" data-comment-reply-hint>' +
"<span>回复 @" +
escapeHtml(replyTarget.replyName) +
"</span>" +
'<button type="button" data-comment-reply-cancel>取消</button>' +
"</div>" +
'<textarea class="detail-comment-inline-input" maxlength="200" rows="2" placeholder="' +
escapeHtml(placeholder) +
'" data-comment-inline-input></textarea>' +
'<div class="detail-comment-inline-footer">' +
'<button class="detail-comment-inline-send" type="button" data-comment-inline-send>发表回复</button>' +
"</div>";
}
if (meta && meta.parentNode === body) {
if (meta.nextSibling) {
body.insertBefore(box, meta.nextSibling);
} else {
body.appendChild(box);
}
} else {
body.appendChild(box);
}
var inlineInput = box.querySelector("[data-comment-inline-input]");
if (inlineInput) {
inlineInput.focus();
}
}
function sendInlineReply(box) {
if (!box || inlineSending || !replyTarget) return;
var objectId = getObjectId();
if (!objectId) return;
var input = box.querySelector("[data-comment-inline-input]");
var btn = box.querySelector("[data-comment-inline-send]");
if (!input) return;
var text = String(input.value || "").trim();
if (!text) {
toast("请输入评论内容", "error");
return;
}
if (Array.from(text).length > 200) {
toast("评论最多 200 字", "error");
return;
}
inlineSending = true;
if (btn) {
btn.disabled = true;
btn.classList.add("is-loading");
}
input.disabled = true;
var payload = {
objectId: objectId,
objectType: objectType,
text: text,
parentsId: replyTarget.parentsId,
replyCommentId:
replyTarget.replyCommentId > 0
? replyTarget.replyCommentId
: replyTarget.parentsId,
};
window.HttpRequest.post("/api/comment/send", payload)
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
var loginOpen = document.querySelector(
"[data-login-dialog-open]"
);
if (loginOpen) loginOpen.click();
}
throw new Error((res && (res.tip || res.msg)) || "发表失败");
}
clearReplyTarget();
toast("发布成功,评论审核后才会展示", "success");
})
.catch(function (err) {
toast((err && err.message) || "发表失败,请稍后重试", "error");
})
.finally(function () {
inlineSending = false;
if (btn) {
btn.disabled = false;
btn.classList.remove("is-loading");
}
if (input) input.disabled = false;
});
}
function commentItemSelector() {
return sheetMode ? ".play-comment-item" : ".detail-comment";
}
@@ -1089,32 +632,6 @@
}
}
function applyLikeUI(btn, isLike, countLike) {
var liked = Number(isLike) === 1;
btn.classList.toggle("detail-comment-like--active", liked);
btn.classList.toggle("play-comment-like--active", liked);
btn.setAttribute("data-liked", liked ? "1" : "2");
var img = btn.querySelector("img");
if (img) {
if (sheetMode) {
img.src = liked
? "/static/images/h5_liked.svg"
: "/static/images/like_hollow.svg";
} else {
img.src = liked
? "/static/images/like_solid.svg"
: "/static/images/like_hollow.svg";
}
}
var countEl = btn.querySelector("[data-like-count]");
if (countEl && countLike != null) {
btn.setAttribute("data-like-raw", String(countLike));
countEl.textContent = sheetMode
? formatCompactCount(countLike)
: String(countLike);
}
}
function syncSortActive() {
sortBtns.forEach(function (item) {
var active = Number(item.getAttribute("data-comment-sort")) === sortOrder;
@@ -1140,7 +657,6 @@
var emptyClass = sheetMode
? "section-empty play-comment-empty"
: "section-empty";
clearReplyTarget();
listEl.innerHTML =
'<div class="' +
emptyClass +
@@ -1179,7 +695,6 @@
updateTitleCount();
if (replace) {
clearReplyTarget();
if (!rows.length) {
showEmpty("暂无评论");
return;
@@ -1225,15 +740,6 @@
});
}
if (composerInput && composerCount) {
var syncCount = function () {
composerCount.textContent =
Array.from(composerInput.value).length + " / 200";
};
composerInput.addEventListener("input", syncCount);
syncCount();
}
syncSortActive();
sortBtns.forEach(function (btn) {
@@ -1251,149 +757,27 @@
});
});
if (sendBtn && composerInput) {
var sendBtnDefaultText = sendBtn.textContent || "发表评论";
sendBtn.addEventListener("click", function () {
var objectId = getObjectId();
if (sending || !objectId) return;
var text = String(composerInput.value || "").trim();
if (!text) {
toast("请输入评论内容", "error");
return;
}
if (Array.from(text).length > 200) {
toast("评论最多 200 字", "error");
return;
}
sending = true;
sendBtn.disabled = true;
sendBtn.classList.add("is-loading");
if (!iconSend) sendBtn.textContent = "发表中";
composerInput.disabled = true;
var payload = {
objectId: objectId,
objectType: objectType,
text: text,
parentsId: 0,
replyCommentId: 0,
};
window.HttpRequest.post("/api/comment/send", payload)
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
var loginOpen = document.querySelector(
"[data-login-dialog-open]"
);
if (loginOpen) loginOpen.click();
}
throw new Error((res && (res.tip || res.msg)) || "发表失败");
}
composerInput.value = "";
if (composerCount) composerCount.textContent = "0 / 200";
toast("发布成功,评论审核后才会展示", "success");
// 与 PC 一致:发表后不强制刷新列表(审核后才可见)
})
.catch(function (err) {
toast((err && err.message) || "发表失败,请稍后重试", "error");
})
.finally(function () {
sending = false;
sendBtn.disabled = false;
sendBtn.classList.remove("is-loading");
if (!iconSend) sendBtn.textContent = sendBtnDefaultText;
composerInput.disabled = false;
});
});
if (sheetMode) {
composerInput.addEventListener("keydown", function (e) {
if (e.key === "Enter") {
e.preventDefault();
sendBtn.click();
}
});
}
}
if (scope) {
scope.addEventListener("click", function (e) {
var cancel =
e.target && e.target.closest
? e.target.closest("[data-comment-reply-cancel]")
: null;
if (cancel) {
e.preventDefault();
clearReplyTarget();
return;
}
var inlineSend =
e.target && e.target.closest
? e.target.closest("[data-comment-inline-send]")
: null;
if (inlineSend && scope.contains(inlineSend)) {
e.preventDefault();
var box = inlineSend.closest("[data-comment-inline-composer]");
sendInlineReply(box);
return;
}
var repliesToggle =
e.target && e.target.closest
? e.target.closest("[data-comment-replies-toggle]")
: null;
if (repliesToggle && scope.contains(repliesToggle)) {
e.preventDefault();
var repliesBox = repliesToggle.closest(".detail-comment-replies");
if (!repliesBox) return;
var expanded = repliesToggle.getAttribute("aria-expanded") === "true";
expanded = !expanded;
repliesToggle.setAttribute("aria-expanded", expanded ? "true" : "false");
repliesToggle.textContent = replyToggleLabel(
expanded,
repliesToggle.getAttribute("data-reply-count")
);
var hiddenItems = repliesBox.querySelectorAll("[data-reply-collapsed-item]");
Array.prototype.forEach.call(hiddenItems, function (el) {
el.hidden = !expanded;
});
return;
}
var replyBtn =
e.target && e.target.closest
? e.target.closest("[data-comment-reply]")
: null;
if (!replyBtn || !scope.contains(replyBtn)) return;
if (!repliesToggle || !scope.contains(repliesToggle)) return;
e.preventDefault();
var replyCommentId = Number(replyBtn.getAttribute("data-comment-reply") || 0);
var parentsId = Number(replyBtn.getAttribute("data-parents-id") || 0);
var replyName = replyBtn.getAttribute("data-reply-name") || "用户";
if (!parentsId) {
var root =
replyBtn.closest("[data-parents-id]") ||
replyBtn.closest("[data-comment-id]");
if (root) {
parentsId = Number(
root.getAttribute("data-parents-id") ||
root.getAttribute("data-comment-id") ||
0
);
}
}
if (!replyCommentId) return;
if (!parentsId) parentsId = replyCommentId;
setReplyTarget(parentsId, replyCommentId, replyName, replyBtn);
});
scope.addEventListener("keydown", function (e) {
if (e.key !== "Enter") return;
var input =
e.target && e.target.closest
? e.target.closest("[data-comment-inline-input]")
: null;
if (!input || !scope.contains(input)) return;
if (input.tagName === "TEXTAREA" && !e.ctrlKey && !e.metaKey) return;
e.preventDefault();
var box = input.closest("[data-comment-inline-composer]");
sendInlineReply(box);
var repliesBox = repliesToggle.closest(".detail-comment-replies");
if (!repliesBox) return;
var expanded = repliesToggle.getAttribute("aria-expanded") === "true";
expanded = !expanded;
repliesToggle.setAttribute("aria-expanded", expanded ? "true" : "false");
repliesToggle.textContent = replyToggleLabel(
expanded,
repliesToggle.getAttribute("data-reply-count")
);
var hiddenItems = repliesBox.querySelectorAll("[data-reply-collapsed-item]");
Array.prototype.forEach.call(hiddenItems, function (el) {
el.hidden = !expanded;
});
});
}
@@ -1403,70 +787,6 @@
});
}
if (listEl) {
listEl.addEventListener("click", function (e) {
var btn =
e.target && e.target.closest
? e.target.closest("[data-comment-like]")
: null;
if (!btn || !listEl.contains(btn)) return;
var commentId = Number(btn.getAttribute("data-comment-like") || 0);
if (!commentId) return;
if (btn.getAttribute("data-liking") === "1") return;
var likedNow = Number(btn.getAttribute("data-liked") || 2) === 1;
var nextLike = !likedNow;
var rawAttr = btn.getAttribute("data-like-raw");
var countEl = btn.querySelector("[data-like-count]");
var prevCount = Number(
rawAttr != null
? rawAttr
: countEl && countEl.textContent
? countEl.textContent
: 0
);
if (Number.isNaN(prevCount)) prevCount = 0;
btn.setAttribute("data-liking", "1");
btn.disabled = true;
applyLikeUI(
btn,
nextLike ? 1 : 2,
Math.max(0, prevCount + (nextLike ? 1 : -1))
);
window.HttpRequest.post("/api/comment/like/set", {
commentId: commentId,
isLike: nextLike,
})
.then(function (res) {
if (!res || res.code !== 200) {
if (res && res.code === 401) {
var loginOpen = document.querySelector(
"[data-login-dialog-open]"
);
if (loginOpen) loginOpen.click();
}
throw new Error((res && (res.tip || res.msg)) || "操作失败");
}
var data = res.data || {};
applyLikeUI(
btn,
data.isLike != null ? data.isLike : nextLike ? 1 : 2,
data.countLike != null ? data.countLike : null
);
})
.catch(function (err) {
applyLikeUI(btn, likedNow ? 1 : 2, prevCount);
toast((err && err.message) || "操作失败,请稍后重试", "error");
})
.finally(function () {
btn.removeAttribute("data-liking");
btn.disabled = false;
});
});
}
if (!listEl || !getObjectId()) {
if (listEl) showEmpty("暂无评论");
return;
+14 -62
View File
@@ -7,20 +7,6 @@
js: "/static/js/pages/downloadAppDialog.js?v=4",
open: "openDownloadAppDialog",
},
login: {
endpoint: "/ui/dialog/login",
elementId: "loginDialog",
css: "/static/css/loginDialog.css?v=2",
js: "/static/js/pages/loginDialog.js?v=3",
open: "openLoginDialog",
},
register: {
endpoint: "/ui/dialog/register",
elementId: "registerDialog",
css: "/static/css/registerDialog.css?v=2",
js: "/static/js/pages/registerDialog.js?v=2",
open: "openRegisterDialog",
},
};
var pending = Object.create(null);
var stubOpeners = Object.create(null);
@@ -141,26 +127,6 @@
return pending[name];
}
function loginFallbackURL() {
var redirect = "";
try {
redirect = global.location.pathname || "/";
} catch (e) {
redirect = "/";
}
var url = "/login/";
if (
typeof redirect === "string" &&
redirect.charAt(0) === "/" &&
redirect.charAt(1) !== "/" &&
redirect !== "/" &&
redirect.indexOf("/?auth=") !== 0
) {
url = "/login/return" + redirect;
}
return url;
}
function openDialog(name, value) {
return ensureDialog(name)
.then(function () {
@@ -171,15 +137,6 @@
return opener(value);
})
.catch(function (error) {
if (name === "login") {
try {
var params = new URLSearchParams(global.location.search || "");
// 已在登录入口仍失败时避免死循环跳转
if (params.get("auth") !== "login") {
global.location.href = loginFallbackURL();
}
} catch (e) {}
}
throw error;
});
}
@@ -196,12 +153,6 @@
function triggerName(target) {
if (!target || !target.closest) return "";
if (target.closest("[data-download-app-open]")) return "download";
if (target.closest("[data-register-dialog-open], a[href=\"#register\"], a[href=\"/register/\"]")) {
return "register";
}
if (target.closest("[data-login-dialog-open], a[href=\"#login\"], a[href=\"/login/\"]")) {
return "login";
}
return "";
}
@@ -222,22 +173,23 @@
openDialog(name).catch(function () {});
}, true);
function openFromLocation() {
var params = new URLSearchParams(global.location.search || "");
var auth = params.get("auth");
if (auth === "login" || auth === "register") {
openDialog(auth).catch(function () {});
return;
}
if (global.location.hash === "#login") openDialog("login").catch(function () {});
if (global.location.hash === "#register") openDialog("register").catch(function () {});
function appDownloadURL() {
var el = document.querySelector("[data-app-download-url]");
var url = el ? (el.getAttribute("data-app-download-url") || "").trim() : "";
return url || "/download-app/";
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", openFromLocation, { once: true });
} else {
openFromLocation();
// 付费内容统一入口:移动端直接跳下载地址,PC 弹下载二维码。
function openDownloadApp() {
if (isMobileViewport()) {
global.location.href = appDownloadURL();
return Promise.resolve();
}
return openDialog("download").catch(function () {
global.location.href = appDownloadURL();
});
}
global.ensureDialog = ensureDialog;
global.openDownloadApp = openDownloadApp;
})(window);
-139
View File
@@ -1,139 +0,0 @@
/**
* 修改密码:POST /api/auth/profile { oldPassword, newPassword }
*/
(function () {
var form = document.querySelector("[data-edit-password-form]");
if (!form) return;
var currentInput = form.querySelector("[data-edit-password-current]");
var newInput = form.querySelector("[data-edit-password-new]");
var confirmInput = form.querySelector("[data-edit-password-confirm]");
var submitBtn = form.querySelector("[data-edit-password-submit]");
document.querySelectorAll("[data-password-toggle]").forEach(function (btn) {
btn.addEventListener("click", function () {
var id = btn.getAttribute("data-password-toggle");
var input = id ? document.getElementById(id) : null;
if (!input) return;
var show = input.type === "password";
input.type = show ? "text" : "password";
btn.textContent = show ? "隐藏" : "显示";
});
});
function getField(name) {
return form.querySelector('[data-edit-password-field="' + name + '"]');
}
function setFieldError(name, message) {
var field = getField(name);
if (!field) return;
var error = field.querySelector("[data-edit-password-error]");
field.classList.toggle("is-error", !!message);
if (error) {
if (message) {
error.hidden = false;
error.textContent = message;
} else {
error.hidden = true;
}
}
}
function clearErrors() {
setFieldError("current", "");
setFieldError("new", "");
setFieldError("confirm", "");
}
function isValidLength(value) {
return value.length >= 4 && value.length <= 16;
}
function toast(message, type) {
if (window.AuthAPI) AuthAPI.toast(message, type);
else if (typeof showToast === "function") showToast(message, type);
}
function validate() {
clearErrors();
var current = (currentInput && currentInput.value) || "";
var next = (newInput && newInput.value) || "";
var confirm = (confirmInput && confirmInput.value) || "";
var ok = true;
if (!current) {
setFieldError("current", "请输入当前密码");
ok = false;
} else if (!isValidLength(current)) {
setFieldError("current", "当前密码需为 4–16 个字符");
ok = false;
}
if (!next) {
setFieldError("new", "请输入新密码");
ok = false;
} else if (!isValidLength(next)) {
setFieldError("new", "新密码需为 4–16 个字符");
ok = false;
} else if (next === current) {
setFieldError("new", "新密码不能与当前密码相同");
ok = false;
}
if (!confirm) {
setFieldError("confirm", "请再次输入新密码");
ok = false;
} else if (confirm !== next) {
setFieldError("confirm", "两次输入的新密码不一致");
ok = false;
}
if (!ok) return null;
return { oldPassword: current, newPassword: next };
}
[currentInput, newInput, confirmInput].forEach(function (input) {
if (!input) return;
input.addEventListener("input", function () {
var field = input.closest("[data-edit-password-field]");
if (!field) return;
var name = field.getAttribute("data-edit-password-field");
setFieldError(name, "");
});
});
form.addEventListener("submit", function (event) {
event.preventDefault();
var payload = validate();
if (!payload) return;
if (!window.AuthAPI || !window.HttpRequest) {
return;
}
if (submitBtn) submitBtn.disabled = true;
AuthAPI.updateProfile(payload)
.then(function () {
toast("密码修改成功", "success");
setTimeout(function () {
window.location.href = "/setting/";
}, 400);
})
.catch(function (err) {
var tip = (err && err.message) || "修改失败,请稍后重试";
if (/旧|当前|原密码|old/i.test(tip)) {
setFieldError("current", tip);
return;
}
if (/新密码|new/i.test(tip)) {
setFieldError("new", tip);
return;
}
toast(tip, "error");
})
.finally(function () {
if (submitBtn) submitBtn.disabled = false;
});
});
})();
-68
View File
@@ -1,68 +0,0 @@
(function () {
var form = document.querySelector("[data-edit-profile-form]");
var nickInput = document.querySelector("[data-edit-profile-nickname]");
var bioInput = document.querySelector("[data-edit-profile-bio]");
var submitBtn = document.querySelector("[data-edit-profile-submit]");
if (!form) return;
var originalNick = nickInput ? String(nickInput.value || "").trim() : "";
var originalBio = bioInput ? String(bioInput.value || "").trim() : "";
function toast(message, type) {
if (window.AuthAPI) AuthAPI.toast(message, type);
else if (typeof showToast === "function") showToast(message, type);
}
form.addEventListener("submit", function (event) {
event.preventDefault();
if (!window.AuthAPI || !window.HttpRequest) {
return;
}
var nick = nickInput ? String(nickInput.value || "").trim() : "";
var bio = bioInput ? String(bioInput.value || "").trim() : "";
if (!nick) {
toast("请输入昵称", "error");
return;
}
if (nick.length > 20) {
toast("昵称最多 20 个字符", "error");
return;
}
if (bio.length > 120) {
toast("个人简介最多 120 个字符", "error");
return;
}
var nickChanged = nick !== originalNick;
var bioChanged = bio !== originalBio;
if (!nickChanged && !bioChanged) {
toast("暂无修改", "info");
return;
}
var payload = {};
if (nickChanged) payload.nickName = nick;
if (bioChanged) payload.introduction = bio;
if (!payload.nickName && !payload.introduction) {
toast(bioChanged ? "请填写个人简介或修改昵称" : "暂无修改", "error");
return;
}
if (submitBtn) submitBtn.disabled = true;
AuthAPI.updateProfile(payload)
.then(function () {
toast("保存成功", "success");
setTimeout(function () {
window.location.href = "/setting/";
}, 400);
})
.catch(function (err) {
toast((err && err.message) || "保存失败", "error");
})
.finally(function () {
if (submitBtn) submitBtn.disabled = false;
});
});
})();
-30
View File
@@ -495,23 +495,6 @@
});
}
function requireLogin() {
if (window.CookieUtil && CookieUtil.isLoggedIn()) return true;
toast("请先登录后再提交反馈", "error");
var loginURL = "/login/return/feedback/";
if (typeof window.openLoginDialog === "function") {
var opened = window.openLoginDialog();
if (opened && typeof opened.then === "function") {
opened.catch(function () {
window.location.href = loginURL;
});
}
} else {
window.location.href = loginURL;
}
return false;
}
function uploadAllImages() {
if (!selectedFiles.length) return Promise.resolve([]);
if (!window.AuthAPI || typeof AuthAPI.uploadImage !== "function") {
@@ -548,7 +531,6 @@
return;
}
if (submitBtn && submitBtn.classList.contains("is-loading")) return;
if (!requireLogin()) return;
var activeTypeChip = document.querySelector("[data-feedback-type-option].is-active");
var type = parseInt(
@@ -647,18 +629,6 @@
clearFiles();
})
.catch(function (err) {
if (err && err.code === 401) {
toast("请先登录后再提交反馈", "error");
if (typeof window.openLoginDialog === "function") {
var opened = window.openLoginDialog();
if (opened && typeof opened.then === "function") {
opened.catch(function () {
window.location.href = "/login/return/feedback/";
});
}
}
return;
}
toast((err && err.message) || "提交失败", "error");
})
.finally(function () {
-130
View File
@@ -93,142 +93,12 @@
});
}
var DEFAULT_AVATAR = "/static/images/avatar.png";
var PLACEHOLDER = "/static/images/placeholder.png?v=2";
function usableAvatar(url) {
var u = String(url || "").trim();
if (!u) return "";
if (/^https?:\/\//i.test(u) || u.indexOf("/static/") === 0) return u;
return "";
}
function setAvatarImg(img, url) {
if (!img) return;
var src = usableAvatar(url);
img.removeAttribute("data-decrypted");
if (src && typeof shouldDecryptImage === "function" && shouldDecryptImage(src)) {
img.classList.add("lazy");
img.src = PLACEHOLDER;
img.setAttribute("data-src", src);
} else {
img.classList.remove("lazy");
img.removeAttribute("data-src");
img.src = src || DEFAULT_AVATAR;
}
}
function refreshDecrypt(root) {
if (typeof window.initLazyImages === "function") {
window.initLazyImages(root || document);
}
}
/** 用 cookie 登录态同步 header-account */
function parseExpireTime(value) {
if (value == null || value === "") return NaN;
if (typeof value === "number") {
return value < 1e12 ? value * 1000 : value;
}
var text = String(value).trim();
if (!text) return NaN;
if (/^\d+$/.test(text)) {
var num = Number(text);
return num < 1e12 ? num * 1000 : num;
}
return Date.parse(text);
}
// vipType≠0 且 currentVipExpire 未过期(与 91ly 一致)
function isVipActive(user) {
if (!user) return false;
var type = Number(user.vipType);
if (!type || type === 0) return false;
var expireMs = parseExpireTime(user.currentVipExpire);
if (!isFinite(expireMs) || expireMs <= 0) return false;
return expireMs > Date.now();
}
function syncHeaderVip(session) {
var active = isVipActive(session);
document.querySelectorAll("[data-header-vip], [data-header-vip-sep]").forEach(function (el) {
el.hidden = !active;
});
}
function syncHeaderAccount() {
var account = document.querySelector("[data-header-account]");
if (!account || !window.CookieUtil) return;
// 有 token 即展示个人信息(含游客)
var loggedIn = CookieUtil.isLoggedIn();
var session = loggedIn ? CookieUtil.getAuthSession() : null;
var nameEl = account.querySelector("[data-header-username]");
if (loggedIn && session) {
var displayName =
session.nickName || session.accountNo || session.email || "用户";
var avatar = usableAvatar(session.avatar);
account.href = "/user-center/";
account.removeAttribute("data-login-dialog-open");
var guest = account.querySelector("[data-header-guest-avatar]");
if (guest) guest.remove();
var photo = account.querySelector("[data-header-avatar]");
if (!photo) {
photo = document.createElement("img");
photo.className = "account-avatar-photo";
photo.setAttribute("data-header-avatar", "");
photo.alt = displayName + "的头像";
account.insertBefore(photo, nameEl || account.firstChild);
}
setAvatarImg(photo, avatar);
if (nameEl) {
nameEl.textContent = displayName;
nameEl.classList.add("account-label--logged");
}
refreshDecrypt(account.parentElement || document);
syncHeaderVip(session);
return;
}
account.href = "#login";
account.setAttribute("data-login-dialog-open", "");
var loggedPhoto = account.querySelector("[data-header-avatar]");
if (loggedPhoto) loggedPhoto.remove();
if (!account.querySelector("[data-header-guest-avatar]")) {
var wrap = document.createElement("div");
wrap.className = "account-avatar";
wrap.setAttribute("data-header-guest-avatar", "");
wrap.innerHTML =
'<img class="account-avatar-ring" src="' +
DEFAULT_AVATAR +
'" alt="未登录用户头像" />' +
'<div class="account-avatar-body"></div>' +
'<div class="account-avatar-head"></div>';
account.insertBefore(wrap, nameEl || account.firstChild);
}
if (nameEl) {
nameEl.textContent = "未登录";
nameEl.classList.remove("account-label--logged");
}
syncHeaderVip(null);
}
syncHeaderAccount();
window.syncHeaderAccount = syncHeaderAccount;
document.addEventListener("auth:login", function () {
syncHeaderAccount();
});
document.addEventListener("auth:logout", function () {
syncHeaderAccount();
});
document.addEventListener(
"click",
-85
View File
@@ -1,85 +0,0 @@
/**
* 观看历史页:清空记录
*/
(function () {
var clearBtns = document.querySelectorAll("[data-history-clear]");
var confirmMask = document.querySelector("[data-history-confirm]");
var confirmCancelBtns = document.querySelectorAll(
"[data-history-confirm-cancel]"
);
var confirmOkBtn = document.querySelector("[data-history-confirm-ok]");
var clearing = false;
function toast(message, type) {
if (window.AuthAPI && typeof window.AuthAPI.toast === "function") {
window.AuthAPI.toast(message, type);
}
}
function openClearConfirm() {
if (!confirmMask) return;
confirmMask.hidden = false;
confirmMask.removeAttribute("hidden");
confirmMask.classList.add("is-open");
document.body.style.overflow = "hidden";
}
function closeClearConfirm() {
if (!confirmMask) return;
confirmMask.classList.remove("is-open");
confirmMask.hidden = true;
confirmMask.setAttribute("hidden", "");
document.body.style.overflow = "";
}
function clearHistory() {
if (clearing) return;
if (!window.HttpRequest) {
toast("清空失败,请稍后重试", "error");
return;
}
clearing = true;
window.HttpRequest.post("/api/playlet/history/clear")
.then(function (res) {
if (!res || res.code !== 200) {
throw new Error((res && (res.tip || res.msg)) || "清空失败");
}
window.location.reload();
})
.catch(function (err) {
clearing = false;
toast((err && err.message) || "清空失败,请稍后重试", "error");
});
}
clearBtns.forEach(function (btn) {
btn.addEventListener("click", function () {
openClearConfirm();
});
});
confirmCancelBtns.forEach(function (btn) {
btn.addEventListener("click", function () {
closeClearConfirm();
});
});
if (confirmMask) {
confirmMask.addEventListener("click", function (e) {
if (e.target === confirmMask) closeClearConfirm();
});
}
if (confirmOkBtn) {
confirmOkBtn.addEventListener("click", function () {
closeClearConfirm();
clearHistory();
});
}
document.addEventListener("keydown", function (e) {
if (e.key !== "Escape") return;
if (!confirmMask || !confirmMask.classList.contains("is-open")) return;
closeClearConfirm();
});
})();
-236
View File
@@ -1,236 +0,0 @@
(function () {
var mask = document.getElementById("loginDialog");
if (!mask) return;
var form = mask.querySelector("[data-login-dialog-form]");
var accountInput = mask.querySelector("[data-login-account]");
var passwordInput = mask.querySelector("[data-login-password]");
var submitBtn = mask.querySelector("[data-login-submit]");
var defaultSubmitText = (submitBtn && submitBtn.textContent) || "登录";
function setSubmitting(loading) {
if (!submitBtn) return;
submitBtn.disabled = !!loading;
submitBtn.classList.toggle("is-loading", !!loading);
submitBtn.setAttribute("aria-busy", loading ? "true" : "false");
submitBtn.textContent = loading ? "登录中..." : defaultSubmitText;
}
function getField(name) {
return mask.querySelector('[data-login-field="' + name + '"]');
}
function setFieldError(name, message) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-login-control]");
var error = field.querySelector("[data-login-error]");
if (control) control.classList.add("is-error");
if (error) {
error.textContent = message;
error.hidden = false;
}
}
function clearFieldError(name) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-login-control]");
var error = field.querySelector("[data-login-error]");
if (control) control.classList.remove("is-error");
if (error) error.hidden = true;
}
function clearAllErrors() {
clearFieldError("account");
clearFieldError("password");
}
function isValidLength(value) {
return value.length >= 4 && value.length <= 16;
}
function validateForm() {
var account = (accountInput && accountInput.value.trim()) || "";
var password = (passwordInput && passwordInput.value) || "";
var valid = true;
clearAllErrors();
if (!account) {
setFieldError("account", "账号格式不正确,请输入有效账号");
valid = false;
} else if (!window.AuthAPI || !AuthAPI.isValidLoginAccount(account)) {
setFieldError("account", "账号格式不正确,请输入有效账号");
valid = false;
}
if (!password) {
setFieldError("password", "密码错误,请检查后重新输入");
valid = false;
} else if (!isValidLength(password)) {
setFieldError("password", "密码错误,请检查后重新输入");
valid = false;
}
if (!valid) return null;
return { account: account, password: password };
}
function mapServerError(err) {
var tip = (err && err.message) || "登录失败,请稍后重试";
if (/密码|password/i.test(tip)) {
setFieldError("password", tip);
return;
}
if (/账号|账户|用户|邮箱|account|email|不存在|错误/i.test(tip)) {
setFieldError("account", tip);
return;
}
if (window.AuthAPI) AuthAPI.toast(tip, "error");
else if (typeof showToast === "function") showToast(tip, "error");
}
function openDialog(event) {
if (event) event.preventDefault();
if (typeof window.closeRegisterDialog === "function") {
window.closeRegisterDialog();
}
clearAllErrors();
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
return true;
}
function closeDialog() {
mask.classList.remove("is-open");
clearAllErrors();
if (!document.getElementById("registerDialog") || !document.getElementById("registerDialog").classList.contains("is-open")) {
document.body.style.overflow = "";
}
}
function setLoginErrors(errors) {
clearAllErrors();
if (!errors) return;
if (errors.account) setFieldError("account", errors.account);
if (errors.password) setFieldError("password", errors.password);
}
if (form) {
form.addEventListener("submit", function (event) {
event.preventDefault();
if (submitBtn && submitBtn.classList.contains("is-loading")) return;
var payload = validateForm();
if (!payload) return;
if (!window.AuthAPI || !window.HttpRequest) {
return;
}
setSubmitting(true);
AuthAPI.login(payload)
.then(function () {
AuthAPI.toast("登录成功", "success");
closeDialog();
setTimeout(function () {
goAfterAuth();
}, 400);
})
.catch(function (err) {
setSubmitting(false);
mapServerError(err);
});
});
}
function isSafeRedirect(path) {
return typeof path === "string" && path.charAt(0) === "/" && path.charAt(1) !== "/";
}
function goAfterAuth() {
var bodyRedirect = document.body && document.body.getAttribute("data-auth-redirect");
if (isSafeRedirect(bodyRedirect)) {
window.location.href = bodyRedirect;
return;
}
var params = new URLSearchParams(window.location.search);
var redirect = params.get("redirect");
if (isSafeRedirect(redirect)) {
window.location.href = redirect;
return;
}
window.location.reload();
}
function consumeAuthQuery(kind) {
var params = new URLSearchParams(window.location.search);
if (params.get("auth") !== kind) return false;
params.delete("auth");
var qs = params.toString();
var next = window.location.pathname + (qs ? "?" + qs : "") + window.location.hash;
window.history.replaceState(null, "", next);
return true;
}
if (accountInput) {
accountInput.addEventListener("input", function () {
clearFieldError("account");
});
}
if (passwordInput) {
passwordInput.addEventListener("input", function () {
clearFieldError("password");
});
}
document.addEventListener("click", function (event) {
var openEl = event.target.closest("[data-login-dialog-open]");
if (openEl) {
openDialog(event);
return;
}
var loginLink = event.target.closest('a[href="/login/"], a[href="#login"]');
if (loginLink) {
openDialog(event);
return;
}
if (event.target.closest("[data-login-dialog-close]")) {
closeDialog();
return;
}
if (event.target.closest("[data-login-dialog-eye]")) {
var btn = event.target.closest("[data-login-dialog-eye]");
var input = document.getElementById("loginDialogPassword");
var img = btn.querySelector("img");
if (!input || !img) return;
var show = input.type === "password";
input.type = show ? "text" : "password";
img.src = show ? "/static/images/eye_open.svg" : "/static/images/eye_close.svg";
btn.setAttribute("aria-label", show ? "隐藏密码" : "显示密码");
return;
}
if (event.target === mask) {
closeDialog();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
closeDialog();
}
});
window.openLoginDialog = openDialog;
window.closeLoginDialog = closeDialog;
window.setLoginDialogErrors = setLoginErrors;
if ((document.body && document.body.getAttribute("data-auth-mode") === "login") || consumeAuthQuery("login")) {
openDialog();
}
})();
+43 -255
View File
@@ -437,46 +437,6 @@
applyPlaySpeed(dp, currentPlaySpeed());
}
// 复用同一 meta 对象:bindVideoEvents 只绑一次,切集时就地更新字段即可生效。
var playTrackerMeta = {
media_id: "",
video_id: "",
video_title: "",
video_type_id: "playlet",
video_type_name: "短剧",
video_content_type: "playlet",
recommend_trace_id: "",
video_tag_key: "",
video_tag_name: "",
};
var playViewTracked = false;
function syncPlayTrackerMeta() {
var root = document.querySelector("[data-play-page]");
var ds = (root && root.dataset) || {};
var player = document.querySelector("[data-play-player]");
var pds = (player && player.dataset) || {};
var episode = ds.playEpisode || "";
playTrackerMeta.media_id = ds.playletId || "";
playTrackerMeta.video_id = ds.playletId || "";
playTrackerMeta.video_title = ds.playTitle || "";
playTrackerMeta.video_type_id = "playlet";
playTrackerMeta.video_type_name = ds.playTag || "短剧";
playTrackerMeta.video_content_type = "playlet";
playTrackerMeta.recommend_trace_id = "";
playTrackerMeta.video_tag_key = pds.chapterId || "";
playTrackerMeta.video_tag_name = episode ? "第" + episode + "集" : "";
return playTrackerMeta;
}
function bindPlayTracker(dp) {
if (!dp || !window.tracker || typeof window.tracker.bindVideoEvents !== "function") {
return;
}
syncPlayTrackerMeta();
window.tracker.bindVideoEvents(dp, playTrackerMeta);
}
function nextEpisodeElement() {
var active = document.querySelector(".play-ep-grid .play-ep--active");
if (!active) return null;
@@ -607,7 +567,6 @@
var player = container.closest(".play-player");
bindPlayerPoster(playDp, player);
bindH265Fallback(playDp, source);
bindPlayTracker(playDp);
setupDesktopPlayerControls(playDp);
return playDp;
} catch (e) {
@@ -681,7 +640,7 @@
if (id > 0 && next.getAttribute("data-play-switch") != null) {
return id;
}
// 付费/VIP 锁定集:返回 id 以便弹窗
// 付费锁定集:返回 id 以便引导下载 APP
if (id > 0) return id;
}
next = next.nextElementSibling;
@@ -721,14 +680,17 @@
if (dp && typeof dp.on === "function") {
dp.on("timeupdate", updateNextCountdown);
dp.on("ended", function () {
markCurrentEpisodeWatched();
var chapterId = findNextChapterId();
setNextCountdownVisible(false, 3);
if (chapterId) switchToChapter(chapterId, { autoplay: true });
if (!chapterId) return;
if (isLockedEpisode(chapterId)) {
openDownloadApp();
return;
}
switchToChapter(chapterId, { autoplay: true });
});
dp.on("play", function () {
applyPlaySpeed(dp, currentPlaySpeed());
markCurrentEpisodeWatched();
updateNextCountdown();
});
dp.on("seeked", updateNextCountdown);
@@ -770,26 +732,6 @@
(playPage && playPage.getAttribute("data-play-episode")) || 0
);
var switchingChapter = false;
var lastWatchReportKey = "";
function reportChapterWatch() {
if (!currentChapterId || !window.HttpRequest) return;
if (window.CookieUtil && !window.CookieUtil.isLoggedIn()) return;
var key = String(playletId || 0) + ":" + currentChapterId;
if (key === lastWatchReportKey) return;
lastWatchReportKey = key;
var body = { chapterId: currentChapterId };
if (playletId) body.playletId = playletId;
window.HttpRequest.post("/api/playlet/chapter/watch/report", body).catch(
function () {
/* 静默失败:未登录/网络错误不打断播放 */
}
);
}
function markCurrentEpisodeWatched() {
reportChapterWatch();
}
function padEpisode(n) {
var num = Number(n) || 0;
@@ -802,92 +744,42 @@
return "/play/" + encodeURIComponent(key) + "/" + chapterId + "/";
}
function resolvePayGate(chapter, el) {
if (chapter) {
if (chapter.canWatch || chapter.isUnlocked) return 0;
if (chapter.needUnlock) return 1;
if (chapter.needVip) return 2;
var payType = Number(chapter.payType || 0);
if (payType === 1 || payType === 2) return payType;
return 0;
}
if (el) {
if (el.getAttribute("data-can-watch") === "1") return 0;
if (el.getAttribute("data-need-unlock") === "1") return 1;
if (el.getAttribute("data-need-vip") === "1") return 2;
if (el.getAttribute("data-coin-dialog-open") != null) return 1;
if (el.getAttribute("data-vip-dialog-open") != null) return 2;
return Number(el.getAttribute("data-pay-type") || 0);
}
return 0;
function isChapterLocked(chapter) {
if (!chapter) return false;
if (chapter.canWatch || chapter.isUnlocked) return false;
if (chapter.needUnlock || chapter.needVip) return true;
// 与服务端 PlayletChapterData.AllowWatch 保持一致:仅免费集可直接播放。
return Number(chapter.payType || 0) !== 0;
}
function resolveUnlockCost(chapter, el) {
if (chapter) {
if (Number(chapter.costCoins) > 0) return Number(chapter.costCoins);
if (Number(chapter.singleCoins) > 0) return Number(chapter.singleCoins);
}
if (el) return Number(el.getAttribute("data-single-coins") || 0);
return 0;
function isLockedEpisode(chapterId) {
chapterId = Number(chapterId) || 0;
if (!chapterId) return false;
return !!document.querySelector(
'[data-play-locked][data-chapter-id="' + chapterId + '"]'
);
}
function openPayForChapter(el, chapter) {
var payGate = resolvePayGate(chapter, el);
if (payGate === 1) {
if (typeof window.openCoinDialog === "function") {
var coinTrigger = document.createElement("button");
coinTrigger.setAttribute("data-coin-dialog-open", "");
coinTrigger.setAttribute(
"data-chapter-id",
String((chapter && chapter.id) || (el && el.getAttribute("data-chapter-id")) || "")
);
coinTrigger.setAttribute(
"data-playlet-id",
String(
(chapter && chapter.playletId) ||
playletId ||
(el && el.getAttribute("data-playlet-id")) ||
""
)
);
coinTrigger.setAttribute(
"data-single-coins",
String(resolveUnlockCost(chapter, el))
);
coinTrigger.style.display = "none";
document.body.appendChild(coinTrigger);
coinTrigger.click();
coinTrigger.remove();
}
return true;
// 付费剧集统一引导下载 APP(移动端跳转下载地址,PC 弹出下载二维码)。
function openDownloadApp() {
if (typeof window.openDownloadApp === "function") {
return window.openDownloadApp();
}
if (payGate === 2) {
var vipBtn = document.querySelector("[data-vip-dialog-open]");
if (vipBtn) vipBtn.click();
else if (typeof window.openVipDialog === "function") {
window.openVipDialog();
}
return true;
}
return false;
return Promise.resolve();
}
function updateEpisodeActive(chapterId) {
document.querySelectorAll(".play-ep").forEach(function (el) {
var isActive = Number(el.getAttribute("data-chapter-id") || 0) === chapterId;
el.classList.toggle("play-ep--active", isActive);
var coin = el.querySelector(".play-ep-coin");
var lock = el.querySelector(".play-ep-lock");
if (coin) coin.style.display = isActive ? "none" : "";
if (lock) lock.style.display = isActive ? "none" : "";
});
document.querySelectorAll(".play-ep-sheet-item").forEach(function (el) {
var isActive =
Number(el.getAttribute("data-chapter-id") || 0) === chapterId;
el.classList.toggle("play-ep-sheet-item--active", isActive);
var coin = el.querySelector(".play-ep-sheet-coin");
var lock = el.querySelector(".play-ep-sheet-lock");
if (coin) coin.hidden = isActive;
if (lock) lock.hidden = isActive;
});
syncDesktopNextControl();
@@ -897,7 +789,6 @@
var ep = Number(chapter.currentEpisode) || 0;
currentEpisode = ep;
currentChapterId = Number(chapter.id) || currentChapterId;
lastWatchReportKey = "";
if (playPage) {
playPage.setAttribute("data-play-episode", String(ep));
}
@@ -922,10 +813,6 @@
player.setAttribute("data-chapter-id", String(chapter.id || ""));
player.setAttribute("data-playlet-id", String(playletId || chapter.playletId || ""));
player.setAttribute("data-pay-type", String(chapter.payType || 0));
player.setAttribute(
"data-single-coins",
String(resolveUnlockCost(chapter, null))
);
player.setAttribute(
"data-can-watch",
chapter.canWatch || chapter.isUnlocked ? "1" : "0"
@@ -935,10 +822,6 @@
chapter.needUnlock ? "1" : "0"
);
player.setAttribute("data-need-vip", chapter.needVip ? "1" : "0");
player.setAttribute(
"data-is-unlocked",
chapter.isUnlocked ? "1" : "0"
);
}
var commentCount = document.querySelector("[data-play-comment-count]");
@@ -976,6 +859,8 @@
container.setAttribute("data-url", videoUrl || "");
if (playCover) container.setAttribute("data-cover", playCover);
player.insertBefore(container, player.firstChild);
var lockedCta = player.querySelector("[data-play-locked-cta]");
if (lockedCta) lockedCta.remove();
var playBtn = player.querySelector("[data-play-poster-play]");
if (!playBtn) {
playBtn = document.createElement("button");
@@ -1016,24 +901,18 @@
throw new Error((res && (res.tip || res.msg)) || "加载失败");
}
var chapter = res.data;
var payGate = resolvePayGate(chapter, null);
if (payGate !== 0 && !options.skipPayCheck) {
openPayForChapter(null, chapter);
if (isChapterLocked(chapter)) {
openDownloadApp();
return;
}
var videoUrl = resolvePlayUrl(chapter.videoUrl || "");
if (!videoUrl) {
if (payGate !== 0) {
openPayForChapter(null, chapter);
return;
}
throw new Error("暂无播放地址");
}
currentChapterId = Number(chapter.id) || chapterId;
updateEpisodeActive(currentChapterId);
updateChapterMeta(chapter);
markCurrentEpisodeWatched();
if (!options.skipHistory) {
var href = buildPlayHref(currentChapterId);
@@ -1049,8 +928,6 @@
if (playDp && typeof playDp.switchVideo === "function") {
switchPlayerVideo(playDp, videoOption);
syncPlayTrackerMeta();
bindPlayTracker(playDp);
} else {
ensurePlayerContainer(chapter.videoUrl || "");
playDp = initDPlayer();
@@ -1078,69 +955,6 @@
});
}
function markEpisodeUnlocked(chapterId) {
chapterId = Number(chapterId) || 0;
if (!chapterId) return;
var href = buildPlayHref(chapterId);
document
.querySelectorAll(
'.play-ep[data-chapter-id="' +
chapterId +
'"], .play-ep-sheet-item[data-chapter-id="' +
chapterId +
'"]'
)
.forEach(function (el) {
el.removeAttribute("data-coin-dialog-open");
el.removeAttribute("data-vip-dialog-open");
el.removeAttribute("data-single-coins");
el.setAttribute("data-play-switch", "");
el.setAttribute("href", href || "javascript:;");
var coin = el.querySelector(
".play-ep-coin, .play-ep-sheet-coin"
);
if (coin) coin.remove();
var lock = el.querySelector(
".play-ep-lock, .play-ep-sheet-lock"
);
if (lock) lock.remove();
});
var player = document.querySelector("[data-play-player]");
if (
player &&
Number(player.getAttribute("data-chapter-id") || 0) === chapterId
) {
player.setAttribute("data-pay-type", "0");
player.setAttribute("data-can-watch", "1");
player.setAttribute("data-need-unlock", "0");
player.setAttribute("data-need-vip", "0");
player.setAttribute("data-is-unlocked", "1");
player.removeAttribute("data-single-coins");
}
}
function playAfterChapterUnlock(detail) {
detail = detail || {};
var chapterId = Number(detail.chapterId) || 0;
if (!chapterId) return;
if (detail.playletId) {
playletId = Number(detail.playletId) || playletId;
if (playPage) {
playPage.setAttribute("data-playlet-id", String(playletId));
}
}
markEpisodeUnlocked(chapterId);
switchToChapter(chapterId, {
force: true,
skipPayCheck: true,
autoplay: true,
replace: true,
});
}
window.playAfterChapterUnlock = playAfterChapterUnlock;
function bindEpisodeSwitch() {
document.addEventListener("click", function (e) {
var el =
@@ -1154,12 +968,27 @@
switchToChapter(chapterId, { autoplay: true });
});
document.addEventListener("click", function (e) {
var el =
e.target && e.target.closest
? e.target.closest("[data-play-locked], [data-play-download-app]")
: null;
if (!el) return;
e.preventDefault();
openDownloadApp();
});
window.addEventListener("popstate", function (e) {
var match = String(window.location.pathname || "").match(/\/play\/[^/]+\/(\d+)\/?$/);
var chapterId =
(e.state && e.state.chapterId) ||
Number((match && match[1]) || 0);
if (!chapterId) return;
if (isLockedEpisode(chapterId)) {
// 回退到付费集:交给服务端渲染下载 APP 引导,避免自动跳转。
window.location.reload();
return;
}
switchToChapter(chapterId, {
autoplay: true,
skipHistory: true,
@@ -1176,14 +1005,6 @@
}
}
function maybeOpenPayDialog() {
var player = document.querySelector("[data-play-player]");
if (!player) return;
var hasVideo = !!player.querySelector(".dplayer-video[data-url]");
if (hasVideo) return;
openPayForChapter(player, null);
}
function bindSidebarRanges() {
var ranges = document.querySelectorAll("[data-play-ep-ranges] .play-ep-range");
var episodes = document.querySelectorAll("[data-play-ep-grid] .play-ep");
@@ -1349,44 +1170,11 @@
window.alert(message);
}
function trackPlayView() {
if (playViewTracked || !window.tracker || typeof window.tracker.videoEvent !== "function") return;
var meta = syncPlayTrackerMeta();
if (!meta.video_id) return;
playViewTracked = true;
window.tracker.videoEvent({
media_id: meta.media_id,
video_id: meta.video_id,
video_title: meta.video_title,
video_type_id: meta.video_type_id,
video_type_name: meta.video_type_name,
video_content_type: meta.video_content_type,
recommend_trace_id: meta.recommend_trace_id,
video_tag_key: meta.video_tag_key,
video_tag_name: meta.video_tag_name,
video_behavior_key: "video_view",
video_behavior_name: "视频展示",
});
}
function bindTrackingWhenReady(dp) {
function activateTracking() {
bindPlayTracker(dp || playDp);
trackPlayView();
}
activateTracking();
if (!window.__trackerReady) {
window.addEventListener("tracker:ready", activateTracking, { once: true });
}
}
function boot() {
var dp = initDPlayer();
bindH5PlayerUI(dp);
bindSidebarRanges();
bindEpisodeSwitch();
maybeOpenPayDialog();
bindTrackingWhenReady(dp);
if (typeof window.initLazyImages === "function") {
window.initLazyImages(document.querySelector(".play-page") || document);
}
-213
View File
@@ -1,213 +0,0 @@
(function () {
var mask = document.getElementById("registerDialog");
if (!mask) return;
var form = mask.querySelector("[data-register-dialog-form]");
var accountInput = mask.querySelector("[data-register-account]");
var passwordInput = mask.querySelector("[data-register-password]");
var confirmInput = mask.querySelector("[data-register-password-confirm]");
var submitBtn = mask.querySelector("[data-register-submit]");
var defaultSubmitText = (submitBtn && submitBtn.textContent) || "立即注册";
function setSubmitting(loading) {
if (!submitBtn) return;
submitBtn.disabled = !!loading;
submitBtn.classList.toggle("is-loading", !!loading);
submitBtn.setAttribute("aria-busy", loading ? "true" : "false");
submitBtn.textContent = loading ? "注册中..." : defaultSubmitText;
}
function getField(name) {
return mask.querySelector('[data-register-field="' + name + '"]');
}
function setFieldError(name, message) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-register-control]");
var error = field.querySelector("[data-register-error]");
if (control) control.classList.add("is-error");
if (error) {
error.textContent = message;
error.hidden = false;
}
}
function clearFieldError(name) {
var field = getField(name);
if (!field) return;
var control = field.querySelector("[data-register-control]");
var error = field.querySelector("[data-register-error]");
if (control) control.classList.remove("is-error");
if (error) error.hidden = true;
}
function clearAllErrors() {
clearFieldError("account");
clearFieldError("password");
clearFieldError("password_confirm");
}
function isValidLength(value) {
return value.length >= 4 && value.length <= 16;
}
function validateForm() {
var account = (accountInput && accountInput.value.trim()) || "";
var password = (passwordInput && passwordInput.value) || "";
var confirm = (confirmInput && confirmInput.value) || "";
var valid = true;
clearAllErrors();
if (!account) {
setFieldError("account", "请输入账号");
valid = false;
} else if (!isValidLength(account)) {
setFieldError("account", "账号需为 4–16 个字符");
valid = false;
}
if (!password) {
setFieldError("password", "请输入密码");
valid = false;
} else if (!isValidLength(password)) {
setFieldError("password", "密码需为 4–16 个字符");
valid = false;
}
if (!confirm) {
setFieldError("password_confirm", "请再次输入密码");
valid = false;
} else if (confirm !== password) {
setFieldError("password_confirm", "两次输入的密码不一致");
valid = false;
}
if (!valid) return null;
return { accountNo: account, password: password };
}
function mapServerError(err) {
var tip = (err && err.message) || "注册失败,请稍后重试";
var code = err && err.code;
if (code === 5005 || /已存在|重复|占用/.test(tip)) {
setFieldError("account", tip);
return;
}
if (/密码|password/i.test(tip)) {
setFieldError("password", tip);
return;
}
if (window.AuthAPI) AuthAPI.toast(tip, "error");
else if (typeof showToast === "function") showToast(tip, "error");
}
function openDialog(event) {
if (event) event.preventDefault();
if (typeof window.closeLoginDialog === "function") {
window.closeLoginDialog();
}
clearAllErrors();
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
return true;
}
function closeDialog() {
mask.classList.remove("is-open");
clearAllErrors();
if (!document.getElementById("loginDialog") || !document.getElementById("loginDialog").classList.contains("is-open")) {
document.body.style.overflow = "";
}
}
if (form) {
form.addEventListener("submit", function (event) {
event.preventDefault();
if (submitBtn && submitBtn.classList.contains("is-loading")) return;
var payload = validateForm();
if (!payload) return;
if (!window.AuthAPI || !window.HttpRequest) {
return;
}
setSubmitting(true);
AuthAPI.register(payload)
.then(function () {
AuthAPI.toast("注册成功", "success");
closeDialog();
setTimeout(function () {
window.location.reload();
}, 400);
})
.catch(function (err) {
setSubmitting(false);
mapServerError(err);
});
});
}
function consumeAuthQuery(kind) {
var params = new URLSearchParams(window.location.search);
if (params.get("auth") !== kind) return false;
params.delete("auth");
var qs = params.toString();
var next = window.location.pathname + (qs ? "?" + qs : "") + window.location.hash;
window.history.replaceState(null, "", next);
return true;
}
if (accountInput) {
accountInput.addEventListener("input", function () {
clearFieldError("account");
});
}
if (passwordInput) {
passwordInput.addEventListener("input", function () {
clearFieldError("password");
});
}
if (confirmInput) {
confirmInput.addEventListener("input", function () {
clearFieldError("password_confirm");
});
}
document.addEventListener("click", function (event) {
var openEl = event.target.closest("[data-register-dialog-open]");
if (openEl) {
openDialog(event);
return;
}
var registerLink = event.target.closest('a[href="/register/"], a[href="#register"]');
if (registerLink) {
openDialog(event);
return;
}
if (event.target.closest("[data-register-dialog-close]")) {
closeDialog();
return;
}
if (event.target === mask) {
closeDialog();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
closeDialog();
}
});
window.openRegisterDialog = openDialog;
window.closeRegisterDialog = closeDialog;
if ((document.body && document.body.getAttribute("data-auth-mode") === "register") || consumeAuthQuery("register")) {
openDialog();
}
})();
-34
View File
@@ -1,34 +0,0 @@
(function () {
document.querySelectorAll(".setting-switch").forEach(function (btn) {
btn.addEventListener("click", function () {
var on = btn.classList.toggle("setting-switch--on");
btn.setAttribute("aria-pressed", on ? "true" : "false");
});
});
var logoutBtn = document.querySelector("[data-auth-logout]");
if (logoutBtn) {
logoutBtn.addEventListener("click", function () {
function done() {
if (window.AuthAPI && typeof AuthAPI.markGuestLogout === "function") {
AuthAPI.markGuestLogout();
}
if (window.CookieUtil && typeof CookieUtil.clearAuth === "function") {
CookieUtil.clearAuth();
}
try {
document.dispatchEvent(new CustomEvent("auth:logout"));
} catch (e) {}
window.location.href = "/";
}
if (window.HttpRequest) {
HttpRequest.post("/api/auth/logout", {})
.catch(function () {})
.then(done);
} else {
done();
}
});
}
})();
-161
View File
@@ -1,161 +0,0 @@
(function () {
function parseExpireTime(value) {
if (value == null || value === "") return NaN;
if (typeof value === "number") {
return value < 1e12 ? value * 1000 : value;
}
var text = String(value).trim();
if (!text) return NaN;
if (/^\d+$/.test(text)) {
var num = Number(text);
return num < 1e12 ? num * 1000 : num;
}
return Date.parse(text);
}
function isVipActive(user) {
if (!user) return false;
var type = Number(user.vipType);
if (!type || type === 0) return false;
var expireMs = parseExpireTime(user.currentVipExpire);
if (!isFinite(expireMs) || expireMs <= 0) return false;
return expireMs > Date.now();
}
function vipTypeLabel(vipType) {
var type = Number(vipType);
if (type === 1) return "月卡会员";
if (type === 2) return "年卡会员";
return "普通会员";
}
function vipDisplayLabel(user) {
var name = user && String(user.showCardName || "").trim();
if (name) return name;
return vipTypeLabel(user && user.vipType);
}
function vipExpireText(raw) {
var ms = parseExpireTime(raw);
if (!isFinite(ms) || ms <= 0) return "";
var d = new Date(ms);
var y = d.getFullYear();
var m = String(d.getMonth() + 1).padStart(2, "0");
var day = String(d.getDate()).padStart(2, "0");
return "有效期至 " + y + "/" + m + "/" + day;
}
function formatRecharge(value) {
var n = Number(value);
if (!isFinite(n) || n < 0) n = 0;
return String(Math.floor(n)).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function syncUserCenterRecharge(value) {
var text = formatRecharge(
value != null
? value
: CookieUtil.getAuthSession() && CookieUtil.getAuthSession().recharge,
);
var pc = document.querySelector("[data-user-center-recharge]");
if (pc) pc.textContent = text;
var hint = document.querySelector("[data-user-center-recharge-hint]");
if (hint) hint.textContent = text + "金币";
}
function syncUserCenterID(value) {
var id = String(value == null ? "" : value).trim();
if (!id) return;
document.querySelectorAll("[data-user-center-id]").forEach(function (el) {
el.textContent = el.getAttribute("data-id-layout") === "pc"
? "ID:" + id
: "ID " + id;
});
}
function refreshUserCenterWallet() {
if (!window.CookieUtil || !CookieUtil.isLoggedIn()) return;
syncUserCenterRecharge();
if (!window.HttpRequest) return;
HttpRequest.get("/api/auth/getInfo")
.then(function (res) {
if (!res || res.code !== 200 || !res.data) return;
if (CookieUtil.setAuthSession) CookieUtil.setAuthSession(res.data);
syncUserCenterID(res.data.userId);
syncUserCenterRecharge(res.data.recharge);
syncUserCenterVip();
})
.catch(function () {});
}
function syncUserCenterVip() {
if (!window.CookieUtil || !CookieUtil.isLoggedIn()) return;
var session = CookieUtil.getAuthSession();
var active = isVipActive(session);
var label = active ? vipDisplayLabel(session) : "";
var expire = active
? vipExpireText(session && session.currentVipExpire)
: "";
var pc = document.querySelector("[data-user-center-vip]");
if (pc) {
pc.classList.toggle("user-center-vip-card--active", active);
var status = pc.querySelector("[data-vip-status]");
var expireEl = pc.querySelector("[data-vip-expire]");
var action = pc.querySelector("[data-vip-action]");
if (status) {
status.textContent = active ? "尊享 VIP 会员" : "尚未开通会员";
}
if (expireEl) {
if (active && expire) {
expireEl.hidden = false;
expireEl.style.display = "";
expireEl.textContent = expire;
} else {
expireEl.hidden = true;
expireEl.style.display = "none";
expireEl.textContent = "";
}
}
if (action) {
if (active) {
action.hidden = true;
action.style.display = "none";
} else {
action.hidden = false;
action.style.display = "";
action.textContent = "立即开通 →";
}
}
}
var mobile = document.querySelector("[data-user-center-mobile-vip]");
if (mobile) {
mobile.classList.toggle("user-center-mobile-vip--active", active);
var title = mobile.querySelector("[data-mobile-vip-title]");
var desc = mobile.querySelector("[data-mobile-vip-desc]");
var btn = mobile.querySelector("[data-mobile-vip-btn]");
if (title) title.textContent = active ? label : "开通黄果短剧会员";
if (desc) {
desc.textContent = active
? expire || "全场免费看 · 热门短剧抢先看"
: "全场免费看 · 热门短剧抢先看";
}
if (btn) {
btn.hidden = false;
btn.style.display = "";
if (active) {
btn.textContent = "续费会员";
} else {
btn.textContent = "立即开通";
}
}
}
}
syncUserCenterVip();
refreshUserCenterWallet();
window.syncUserCenterVip = syncUserCenterVip;
window.syncUserCenterID = syncUserCenterID;
window.syncUserCenterRecharge = syncUserCenterRecharge;
})();
-52
View File
@@ -1,52 +0,0 @@
(function () {
var mask = document.getElementById("vipDialog");
if (!mask) return;
function openDialog(event) {
if (event) event.preventDefault();
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
}
function closeDialog() {
mask.classList.remove("is-open");
document.body.style.overflow = "";
}
function isVipLockedEpisode(target) {
var episode = target.closest(
".detail-episode, .play-ep, .play-ep-sheet-item, .detail-h5-ep-item"
);
if (!episode) return false;
// 金币解锁走 coinDialog,不在此打开 VIP 弹窗
if (episode.hasAttribute("data-coin-dialog-open")) return false;
return !!episode.querySelector(
".detail-episode-lock[src*='vip'], .detail-episode-vip, .play-ep-lock[src*='vip'], .play-ep-sheet-lock[src*='vip'], .detail-h5-ep-lock[src*='vip']"
);
}
document.addEventListener("click", function (event) {
if (event.target.closest("[data-vip-dialog-open]") || isVipLockedEpisode(event.target)) {
openDialog(event);
return;
}
if (event.target.closest("[data-vip-dialog-close]")) {
closeDialog();
return;
}
if (event.target === mask) {
closeDialog();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
closeDialog();
}
});
window.openVipDialog = openDialog;
window.closeVipDialog = closeDialog;
})();
File diff suppressed because it is too large Load Diff