UI修改
This commit is contained in:
@@ -29,7 +29,7 @@ export default async function Page({params,searchParams}:PageProps) {
|
||||
if (!route) notFound();
|
||||
const {bootstrap,view,session,shared}=await getPageSeo(pathname(path),queryString(await searchParams));
|
||||
assertPageContent(pathname(path),bootstrap.content);
|
||||
const title=bootstrap.content.title||({'apps':'福利应用','home-road':'回家的路',center:'个人中心',favorites:'我的收藏',history:'观看历史',likes:'我的点赞',purchased:'已购剧集',settings:'账号设置',deposit:'金币充值',feedback:'意见反馈'} as Record<string,string>)[route.key]||'内容列表';
|
||||
const title=bootstrap.content.title||({'home-road':'回家的路'} as Record<string,string>)[route.key]||'内容列表';
|
||||
const fallback:PageView={panel:'channel',title,html:empty(bootstrap.content.failed?'内容暂不可用,请稍后重试':'暂无内容',true)};
|
||||
return <SiteFrame home={{}} homeLoaded={false} view={view||fallback} seo={bootstrap} session={session} shared={shared} />;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { isIP } from "node:net";
|
||||
import { allowedRequest, PUBLIC_PATHS, upstream } from "@/lib/api/server";
|
||||
import { UPSTREAM_HOP_HEADER } from '@/lib/api/config';
|
||||
import { ApiError, EXPIRED_CODES } from "@/lib/api/protocol";
|
||||
import { trackingHeaders } from "@/lib/api/tracking-headers";
|
||||
import { sdkHeaders } from "@/lib/api/sdk-headers";
|
||||
import type { Envelope, User } from "@/lib/api/types";
|
||||
|
||||
export const runtime = "nodejs";
|
||||
@@ -14,7 +14,6 @@ const BEARER = "drama_bearer";
|
||||
const DEVICE = "drama_device";
|
||||
const REGISTERED = "drama_registered";
|
||||
const CHANNEL = "drama_channel";
|
||||
const CREDENTIALS = new Set(['auth/login','auth/register','auth/resetPassword']);
|
||||
const text = (value: unknown) => typeof value === 'string' ? value.trim() : '';
|
||||
const deviceId = (value: unknown) => /^[a-zA-Z0-9_-]{1,100}$/.test(text(value)) ? text(value) : '';
|
||||
const expired = (code: number) => EXPIRED_CODES.has(code) || code === 401;
|
||||
@@ -32,11 +31,6 @@ function sessionUser(value: unknown, token = '', registered = false): User {
|
||||
return {...user, token:sessionToken, isRegister:Boolean(user.isRegister) || user.type === 1 || registered};
|
||||
}
|
||||
|
||||
function userIdOf(value: unknown) {
|
||||
const userId = value && typeof value === 'object' ? (value as User).userId : 0;
|
||||
return Number.isSafeInteger(userId) && userId > 0 ? userId : 0;
|
||||
}
|
||||
|
||||
async function handler(request: NextRequest, context: {params: Promise<{path: string[]}>}) {
|
||||
const path = (await context.params).path.join('/');
|
||||
const method = request.method;
|
||||
@@ -61,12 +55,11 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st
|
||||
const registered = request.cookies.get(REGISTERED)?.value === '1';
|
||||
let device = deviceId(request.cookies.get(DEVICE)?.value) || randomUUID();
|
||||
let channel = text(request.cookies.get(CHANNEL)?.value).slice(0,100);
|
||||
const establishesDevice = ['auth/guest','auth/login','auth/register'].includes(path);
|
||||
const establishesDevice = path === 'auth/guest';
|
||||
const userAgent = request.headers.get('user-agent') || '';
|
||||
const forwardedIp = (request.headers.get('x-real-ip') || request.headers.get('x-forwarded-for')?.split(',')[0] || '').trim();
|
||||
const clientIp = isIP(forwardedIp) ? forwardedIp : undefined;
|
||||
const tracking=trackingHeaders(request.headers,path,method);
|
||||
const identity=trackingHeaders(request.headers,'auth/guest','POST');
|
||||
const identity=sdkHeaders(request.headers);
|
||||
const setContextCookies = (response: NextResponse) => {
|
||||
if (establishesDevice) {
|
||||
response.cookies.set(DEVICE,device,{...cookieOptions,httpOnly:false,maxAge:365*86400});
|
||||
@@ -80,7 +73,7 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st
|
||||
};
|
||||
// Normalize HTTP 401 into the same recovery path as an expired business envelope.
|
||||
const call = async (callPath: string, options: Parameters<typeof upstream>[1]): Promise<Envelope<unknown>> => {
|
||||
try { return await upstream(callPath,{...options,request,clientIp,tracking:callPath.split('?')[0]===path?tracking:identity}); }
|
||||
try { return await upstream(callPath,{...options,request,clientIp,tracking:identity}); }
|
||||
catch (error) {
|
||||
if (error instanceof ApiError && error.code === 401) return {code:401,msg:error.message,data:null};
|
||||
throw error;
|
||||
@@ -90,21 +83,16 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st
|
||||
let body: unknown;
|
||||
if (method === 'POST') {
|
||||
const size = Number(request.headers.get('content-length') || 0);
|
||||
if (size > 6*1024*1024) throw new ApiError('文件过大,请上传小于 5MB 的图片',413);
|
||||
body = request.headers.get('content-type')?.includes('multipart/form-data') ? await request.formData() : await request.json().catch(()=>({}));
|
||||
if (size > 1024*1024) throw new ApiError('请求内容过大',413);
|
||||
body = await request.json().catch(()=>({}));
|
||||
}
|
||||
const input = body && typeof body === 'object' && !Array.isArray(body) && !(body instanceof FormData) ? body as Record<string,unknown> : {};
|
||||
const input = body && typeof body === 'object' && !Array.isArray(body) ? body as Record<string,unknown> : {};
|
||||
if (establishesDevice) {
|
||||
device = deviceId(request.cookies.get(DEVICE)?.value) || deviceId(input.devID) || device;
|
||||
channel ||= text(input.channel).slice(0,100) || text(process.env.API_CHANNEL).slice(0,100);
|
||||
}
|
||||
let session: User | undefined;
|
||||
let result: Envelope<unknown>;
|
||||
let switching = false;
|
||||
let previousUserId = 0;
|
||||
let switchedDevice = '';
|
||||
let switchAccount = '';
|
||||
let switchPassword = '';
|
||||
if (path === 'auth/guest') {
|
||||
if (token) {
|
||||
const info = await call('auth/getInfo',{token,device,userAgent});
|
||||
@@ -114,71 +102,20 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st
|
||||
session ||= await guest();
|
||||
result = {code:200,data:session};
|
||||
} else {
|
||||
if (path === 'auth/login' || path === 'auth/register') {
|
||||
const account = text(input[path === 'auth/login' ? 'account' : 'accountNo']);
|
||||
const password = typeof input.password === 'string' ? input.password : '';
|
||||
if (!account || !password) throw new ApiError('请填写账号和密码',400);
|
||||
// Binding keeps the guest. Switching must not: the upstream login finds
|
||||
// the current visitor by devID and would return that same account.
|
||||
switching = path === 'auth/login' && input.switchAccount === true;
|
||||
if (switching && token) {
|
||||
const info = await call('auth/getInfo',{token,device,userAgent});
|
||||
if (info.code === 200) previousUserId = userIdOf(info.data);
|
||||
}
|
||||
if (switching) switchedDevice = randomUUID();
|
||||
switchAccount = account;
|
||||
switchPassword = password;
|
||||
body = path === 'auth/login'
|
||||
? {account,password,devID:switchedDevice || device,channel}
|
||||
: {accountNo:account,password,email:text(input.email) || account+'@jgdj.local',devID:device,channel,...(text(input.agentInviteCode) ? {agentInviteCode:text(input.agentInviteCode).slice(0,100)} : {})};
|
||||
if (path === 'auth/login' || registered) token = '';
|
||||
} else if (path === 'auth/resetPassword') {
|
||||
const accountNo = text(input.accountNo);
|
||||
const email = text(input.email);
|
||||
const newPassword = typeof input.newPassword === 'string' ? input.newPassword : '';
|
||||
if (!accountNo || !email || !newPassword) throw new ApiError('请填写账号、绑定邮箱和新密码',400);
|
||||
body = {accountNo,email,newPassword};
|
||||
token = '';
|
||||
} else if (path === 'auth/profile') {
|
||||
const next: Record<string, unknown> = {};
|
||||
for (const key of ['nickName','avatar','introduction','oldPassword','newPassword'] as const) {
|
||||
if (typeof input[key] === 'string' && input[key]) next[key] = input[key];
|
||||
}
|
||||
if (typeof input.privacyMode === 'boolean') next.privacyMode = input.privacyMode;
|
||||
if (!Object.keys(next).length) throw new ApiError('请填写要修改的内容',400);
|
||||
body = next;
|
||||
} else if (path === 'feedback/add') {
|
||||
const content = typeof input.content === 'string' ? input.content.trim().slice(0,500) : '';
|
||||
let type = Number(input.type);
|
||||
if (type === 5) type = 4;
|
||||
if (!content) throw new ApiError('请填写问题描述',400);
|
||||
if (![1,2,3,4].includes(type)) throw new ApiError('请选择问题类型',400);
|
||||
const screenshots = Array.isArray(input.screenshots) ? input.screenshots.filter((item): item is string => typeof item === 'string' && !!item.trim()).map(item => item.trim()).slice(0,3) : [];
|
||||
const contact = text(input.contact).slice(0,120);
|
||||
body = {type,content,...(contact ? {contact} : {}),...(screenshots.length ? {screenshots} : {})};
|
||||
}
|
||||
result = await call(path+request.nextUrl.search,{method,body,token,device,userAgent});
|
||||
if (switching && result.code === 200 && previousUserId && userIdOf(result.data) === previousUserId) {
|
||||
body = {account:switchAccount,password:switchPassword,channel};
|
||||
result = await call(path+request.nextUrl.search,{method,body,token:'',device:switchedDevice,userAgent});
|
||||
}
|
||||
if (switching && result.code === 200) {
|
||||
if (previousUserId && userIdOf(result.data) === previousUserId) throw new ApiError('切换失败,请确认账号和密码',400);
|
||||
device = switchedDevice;
|
||||
}
|
||||
// Retry only an explicitly rejected guest request, once; never downgrade registered actions.
|
||||
if (expired(result.code) && !PUBLIC_PATHS.has(path) && !CREDENTIALS.has(path) && path !== 'auth/profile' && path !== 'feedback/add' && path !== 'upload/image' && !registered) {
|
||||
if (expired(result.code) && !PUBLIC_PATHS.has(path) && !registered) {
|
||||
session = await guest();
|
||||
token = session.token!;
|
||||
result = await call(path+request.nextUrl.search,{method,body,token,device,userAgent});
|
||||
}
|
||||
if (result.code === 200 && ['auth/login','auth/register','auth/getInfo'].includes(path)) {
|
||||
session = sessionUser(result.data,path === 'auth/getInfo' ? token : '',registered || CREDENTIALS.has(path));
|
||||
if (result.code === 200 && path === 'auth/getInfo') {
|
||||
session = sessionUser(result.data,token,registered);
|
||||
result = {...result,data:session};
|
||||
}
|
||||
}
|
||||
const data = result.data && typeof result.data === 'object' && 'token' in result.data ? {...result.data,token:undefined} : result.data;
|
||||
const isExpired = expired(result.code) && !CREDENTIALS.has(path);
|
||||
const isExpired = expired(result.code);
|
||||
const response = NextResponse.json({...result,data},{status:isExpired ? 401 : 200,headers});
|
||||
if (isExpired) {
|
||||
// A content or action failure must not erase a cookie that getInfo can still renew.
|
||||
@@ -197,7 +134,7 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st
|
||||
return response;
|
||||
} catch (error) {
|
||||
const code = error instanceof ApiError ? error.code : 502;
|
||||
const isExpired = expired(code) && !CREDENTIALS.has(path);
|
||||
const isExpired = expired(code);
|
||||
const response = NextResponse.json({code,msg:error instanceof Error ? error.message : '请求失败',data:null},{status:isExpired ? 401 : code >= 400 && code <= 599 ? code : 502,headers});
|
||||
if (isExpired) {
|
||||
if (path === 'auth/getInfo' || path === 'auth/guest') clearSession(response);
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
export default function PageError({retry}:{retry:()=>void}) {
|
||||
return <main className="route-not-found">
|
||||
<title>页面暂不可用 - 禁果短剧</title>
|
||||
<title>页面暂不可用 - 黄果短剧</title>
|
||||
<meta name="robots" content="noindex,follow" />
|
||||
<h1>页面暂不可用</h1>
|
||||
<p>内容服务暂时异常,请稍后重试</p>
|
||||
|
||||
@@ -183,11 +183,7 @@
|
||||
@media(max-width:1180px){.channel-shell .cards{grid-template-columns:repeat(3,minmax(0,1fr))}.road-grid{grid-template-columns:1fr}.channel-rank{gap:14px}}
|
||||
@media(max-width:760px){.mobile-pages{display:flex;gap:6px;overflow-x:auto;padding:12px 19px;border-bottom:1px solid var(--line);background:var(--bg)}.mobile-pages a{flex-shrink:0;font-size:12px;padding:8px 11px;border-radius:7px;color:var(--muted)}.mobile-pages a[aria-current=page]{color:var(--accent);background:#ec208314}.channel-shell{padding-top:22px!important}.channel-shell .cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 12px}.channel-topics{grid-template-columns:1fr}.channel-rank{grid-template-columns:24px 60px minmax(0,1fr);gap:12px;padding:16px}.channel-rank .score{grid-column:3;font-size:14px}.channel-rank .score small{display:inline;margin-left:8px}.channel-rank h2{font-size:16px}.channel-rank p.rank-desc{display:none}.channel-rank>.number{font-size:24px}.road-banner{padding:24px}.road-banner h2{font-size:24px}}
|
||||
|
||||
/* benefits-directory-styles */
|
||||
.benefits-directory{max-width:1400px}.benefits-directory>.channel-tabs{position:sticky;top:0;z-index:3;background:var(--bg);padding:14px 0;gap:12px;margin-bottom:16px}.benefits-directory>.channel-tabs button{border:1px solid transparent;padding:12px 20px;font-size:14px}.benefits-directory>.channel-tabs button[aria-pressed=true]{border-color:#ec20832c}.benefits-notice{font-size:12px;color:#80867d;margin:0 0 36px}.benefit-section{scroll-margin-top:96px;padding:0 0 34px;margin:0 0 32px;border-bottom:1px solid var(--line)}.benefit-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:24px}.benefit-heading h2{font-size:24px;letter-spacing:.3px;margin:0 0 8px}.benefit-heading p{font-size:14px;line-height:1.8;color:var(--muted);margin:0}.benefit-heading>span{flex-shrink:0;font-size:12px;color:#93998e;border:1px solid var(--line);padding:5px 10px;border-radius:20px}.benefit-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.benefit-grid>div{min-width:0}.benefit-card{display:flex;align-items:center;gap:16px;text-align:left;width:100%;height:116px;padding:20px;background:#1c1e1d;border:1px solid #ffffff0a;border-radius:14px;transition:background .2s,border-color .2s,transform .2s}.benefit-card:hover{background:#242622;border-color:#ec20834a;transform:translateY(-2px)}.benefit-icon{position:relative;display:grid;place-items:center;width:64px;height:64px;flex-shrink:0;border-radius:17px;background:linear-gradient(140deg,var(--app-color),#1b1e23);color:#fff5e7;overflow:hidden;box-shadow:inset 0 1px 0 #ffffff38,0 5px 14px #0003}.benefit-icon>span{position:relative;z-index:1;font:600 30px "Songti SC",serif}.benefit-icon:after{content:'';position:absolute;right:-10px;bottom:-14px;width:52px;height:52px;border:1px solid #ffffff3a;border-radius:50%}.benefit-icon i{position:absolute;width:40px;height:40px;border:1px solid #ffffff26;border-radius:50%;left:-14px;top:-9px}.benefit-copy{min-width:0;display:grid;gap:7px}.benefit-copy strong{font-size:16px;font-weight:650;color:var(--text)}.benefit-copy small{font-size:12px;color:#989e92;line-height:1.7}.benefit-arrow{margin-left:auto;color:#808878;font-size:18px}.benefit-card:hover .benefit-arrow{color:var(--accent)}.benefit-expand{display:block;margin:22px auto 0;padding:10px 28px;border:1px solid #ffffff18;border-radius:8px;color:#b5bbad;font-size:12px}.benefit-expand:hover{border-color:#ec208366}.benefit-pending{display:flex;align-items:center;gap:18px;border:1px dashed #ffffff20;border-radius:14px;padding:28px;background:#ffffff02}.benefit-pending>span{width:48px;height:48px;display:grid;place-items:center;border:1px solid var(--line);border-radius:12px;font-size:22px;color:#8c9385}.benefit-pending strong{font-size:14px;color:#a8ae9f;font-weight:500}.benefit-pending p{font-size:12px;color:#767d71;margin:7px 0 0}.benefit-detail{padding:44px;text-align:center}.benefit-detail>.benefit-icon{margin:0 auto 22px;width:80px;height:80px;border-radius:22px}.benefit-detail-label{font-size:12px;color:var(--accent);letter-spacing:2px}.benefit-detail h2{font-size:28px;margin:10px 0}.benefit-detail>p:not(.benefit-detail-label){font-size:14px;color:var(--muted)}.benefit-detail-note{padding:18px;background:#ffffff04;border-radius:10px;font-size:12px;line-height:1.9;color:#a1a899;margin:26px 0 20px}.benefit-disabled{background:#ffffff08;color:#747b6c;padding:12px 22px;border-radius:8px;cursor:not-allowed}
|
||||
|
||||
@media(max-width:1180px){.benefit-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.benefit-card{gap:13px;padding:16px}.benefits-directory>.channel-tabs{gap:6px}.benefits-directory>.channel-tabs button{font-size:12px;padding:10px 12px}}
|
||||
@media(max-width:760px){.benefits-directory>.channel-tabs{flex-wrap:nowrap;overflow-x:auto;margin-left:-19px;margin-right:-19px;padding-left:19px;padding-right:19px}.benefits-directory>.channel-tabs button{flex-shrink:0}.benefit-section{scroll-margin-top:82px}.benefit-heading{align-items:flex-start}.benefit-heading h2{font-size:20px}.benefit-heading p{font-size:12px}.benefit-heading>span{display:none}.benefit-grid{gap:12px}.benefit-card{height:158px;flex-direction:column;justify-content:flex-start;gap:10px;text-align:center;padding:16px 10px}.benefit-icon{width:54px;height:54px;border-radius:15px}.benefit-icon>span{font-size:26px}.benefit-copy{gap:4px}.benefit-copy strong{font-size:14px}.benefit-copy small{font-size:10px}.benefit-arrow{display:none}.benefit-detail{padding:36px 22px}.benefits-notice{line-height:1.8;margin-bottom:28px}}
|
||||
|
||||
/* remote-placeholder-covers */
|
||||
/* Placeholder cover source: https://hongguoduanju.com/ */
|
||||
@@ -201,7 +197,6 @@
|
||||
@media(max-width:760px){.hero-art{width:100%;opacity:.65}.dialog-art{background-position:center 24%!important}}
|
||||
|
||||
/* tencent-navigation-icons */
|
||||
.side>nav>a .qq-nav-icon{display:block;width:24px;height:24px;flex:0 0 24px;background-color:currentColor;-webkit-mask-image:var(--qq-icon);mask-image:var(--qq-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}.side>nav>a.active .qq-nav-icon{-webkit-mask-image:var(--qq-icon-selected);mask-image:var(--qq-icon-selected)}.side>nav>a[data-page="rank"] .qq-nav-icon{-webkit-mask-size:32px 32px;mask-size:32px 32px}.side>nav>a[data-page="home"]{--qq-icon:url("/assets/19ed41602046c136.svg");--qq-icon-selected:url("/assets/813abcae48078ac7.svg")}.side>nav>a[data-page="shorts"]{--qq-icon:url("/assets/f3d55d5dd5a321d3.png");--qq-icon-selected:url("/assets/7d05c412943babef.png")}.side>nav>a[data-page="series"]{--qq-icon:url("/assets/8c1c285ac6bd3b66.svg");--qq-icon-selected:url("/assets/49cffe02110af446.svg")}.side>nav>a[data-page="topics"]{--qq-icon:url("/assets/9903882b2da0df62.svg");--qq-icon-selected:url("/assets/bf82634dbd0f4907.svg")}.side>nav>a[data-page="rank"]{--qq-icon:url("/assets/c80f072eec53a3ca.svg");--qq-icon-selected:url("/assets/c80f072eec53a3ca.svg")}.side>nav>a[data-page="home-road"]{--qq-icon:url("/assets/350ab2f3118693a8.svg");--qq-icon-selected:url("/assets/350ab2f3118693a8.svg")}.side>nav>a[data-page="apps"]{--qq-icon:url("/assets/16bd37861fd6246c.svg");--qq-icon-selected:url("/assets/16bd37861fd6246c.svg")}
|
||||
|
||||
/* portrait-cover-ratio */
|
||||
/* All portrait poster frames use 3:4. Landscape modules retain their sizing. */
|
||||
@@ -693,7 +688,6 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle .brand-w
|
||||
@media(max-width:760px){#twist-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 12px}}
|
||||
.side>nav>a[data-page="rank"]{--qq-icon-selected:url("/assets/2699fa102e73d8c8.svg")}
|
||||
.side>nav>a[data-page="home-road"]{--qq-icon-selected:url("/assets/92fc7fda98f7db04.svg")}
|
||||
.side>nav>a[data-page="apps"]{--qq-icon-selected:url("/assets/3482d6856aee853d.svg")}
|
||||
html .side>nav>a[data-page="rank"].active .qq-nav-icon{-webkit-mask-size:contain;mask-size:contain}
|
||||
|
||||
/* martial-two-line-description */
|
||||
@@ -737,7 +731,6 @@ html .side>nav>a[data-page="rank"].active .qq-nav-icon{-webkit-mask-size:contain
|
||||
/* consistent-navigation-icons */
|
||||
.side>nav>a[data-page="rank"].active .qq-nav-icon,
|
||||
.side>nav>a[data-page="home-road"].active .qq-nav-icon,
|
||||
.side>nav>a[data-page="apps"].active .qq-nav-icon{-webkit-mask-image:var(--qq-icon);mask-image:var(--qq-icon)}
|
||||
html .side>nav>a[data-page="rank"].active .qq-nav-icon{-webkit-mask-size:32px 32px;mask-size:32px 32px}
|
||||
html:not(.sidebar-collapsed) .side>nav>a[data-page="rank"].active .qq-nav-icon{-webkit-mask-size:37px 37px;mask-size:37px 37px}
|
||||
|
||||
@@ -949,35 +942,7 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4
|
||||
@media(max-width:1000px){#channel-page[data-channel="rank"] #channel-content .channel-ranking-cards{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
||||
@media(max-width:600px){#channel-page[data-channel="rank"] #channel-content .channel-ranking-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 12px}.rank-home-badge{min-width:38px;height:32px;font-size:20px;border-radius:8px 8px 8px 0}}
|
||||
|
||||
/* benefits-reference-layout */
|
||||
#channel-page[data-channel="apps"] .benefits-directory{max-width:none}
|
||||
#channel-page[data-channel="apps"] .benefits-directory>.channel-tabs{position:static;gap:14px;padding:0;border:0;margin-bottom:34px;background:transparent}
|
||||
#channel-page[data-channel="apps"] .channel-tabs button{border:1px solid #ffffff0c;border-radius:9px;background:#202022;padding:12px 22px;font-size:16px;color:#99999f!important}
|
||||
#channel-page[data-channel="apps"] .channel-tabs button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:white!important}
|
||||
#channel-page[data-channel="apps"] .benefit-section{padding:0;margin:0 0 42px;border:0;scroll-margin-top:28px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading{margin-bottom:20px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading h2{font-size:22px;margin:0 0 9px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading p{font-size:14px;color:#85858e;margin:0}
|
||||
#channel-page[data-channel="apps"] .benefit-grid{display:grid;grid-template-columns:repeat(10,minmax(0,1fr));gap:22px;max-width:1440px}
|
||||
#channel-page[data-channel="apps"] .benefit-grid>[hidden]{display:none}
|
||||
#channel-page[data-channel="apps"] .benefit-card{display:flex;flex-direction:column;align-items:center;gap:10px;width:100%;height:auto;min-height:0;min-width:0;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;text-align:center}
|
||||
#channel-page[data-channel="apps"] .benefit-card:hover{background:transparent;transform:none}
|
||||
#channel-page[data-channel="apps"] .benefit-icon{width:100%;height:auto;max-width:110px;aspect-ratio:1;flex:none;border-radius:22%;overflow:hidden;background:transparent;box-shadow:none}
|
||||
.benefit-icon>img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .25s}
|
||||
.benefit-card:hover .benefit-icon>img{transform:scale(1.08)}
|
||||
#channel-page[data-channel="apps"] .benefit-copy{display:block;flex:none;min-width:0;width:100%}
|
||||
#channel-page[data-channel="apps"] .benefit-copy strong{display:block;font-size:14px;font-weight:500;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#ddd}
|
||||
#channel-page[data-channel="apps"] .benefit-copy small{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12px;line-height:1.5;margin-top:4px;color:#818188}
|
||||
#channel-page[data-channel="apps"] .benefit-card:hover strong{color:var(--accent)}
|
||||
#channel-page[data-channel="apps"] .benefit-expand{display:block;position:static;clear:both;margin:28px auto 0;padding:8px 18px;border:0;border-radius:999px;background:transparent;font-size:14px;color:#9898a0!important}
|
||||
#channel-page[data-channel="apps"] .benefit-expand:hover{color:var(--accent)!important;background:#ffffff05}
|
||||
@media(max-width:1100px){#channel-page[data-channel="apps"] .benefit-grid{grid-template-columns:repeat(5,minmax(0,1fr));gap:22px 18px}}
|
||||
@media(max-width:600px){#channel-page[data-channel="apps"] .benefit-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:20px 14px}#channel-page[data-channel="apps"] .channel-tabs button{padding:10px 14px;font-size:14px}#channel-page[data-channel="apps"] .benefit-copy strong{font-size:12px}#channel-page[data-channel="apps"] .benefit-heading h2{font-size:18px}}
|
||||
@media(prefers-reduced-motion:reduce){.benefit-icon>img{transition:none}.benefit-card:hover .benefit-icon>img{transform:none}}
|
||||
|
||||
/* benefits-two-visible-rows */
|
||||
@media(max-width:1100px){#channel-page[data-channel="apps"] .benefit-grid{grid-template-columns:repeat(var(--compact-app-columns),minmax(0,1fr))}}
|
||||
@media(max-width:600px){#channel-page[data-channel="apps"] .benefit-grid{gap:20px 10px}}
|
||||
|
||||
/* home-road-directory-style */
|
||||
.return-home-directory{display:flex;flex-direction:column;gap:36px;padding-bottom:36px}.return-hero{padding:38px 40px;border:1px solid #ec208325;border-radius:22px;background:radial-gradient(ellipse at top left,#ec208320,transparent 70%),#19191d}.return-eyebrow{font-size:14px;color:#f276b0;letter-spacing:2px}.return-hero h2{font-size:30px;line-height:1.4;margin:15px 0 12px}.return-hero p{font-size:14px;color:#9b98a2;margin:0 0 24px}.return-actions,.return-card-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.return-actions a,.return-actions button{display:inline-flex;gap:18px;padding:13px 24px;border-radius:999px;border:1px solid #ffffff18;background:#ffffff05;font-size:14px;color:white}.return-actions a{background:var(--accent);border-color:var(--accent)}.return-actions a:hover{filter:brightness(1.1)}.return-actions button:hover{background:#ffffff10}
|
||||
@@ -1947,22 +1912,7 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)}
|
||||
#drama-play-page .play-related .drama-meta{margin:0}
|
||||
}
|
||||
|
||||
/* mobile-benefits-directory-layout */
|
||||
@media(max-width:760px){
|
||||
#channel-page[data-channel="apps"] .benefits-directory{width:100%;min-width:0}
|
||||
#channel-page[data-channel="apps"] .benefits-directory>.channel-tabs{display:flex;flex-wrap:nowrap;width:100%;min-width:0;box-sizing:border-box;margin:0 0 24px;padding:8px 0;gap:8px;overflow-x:auto;scrollbar-width:none;top:var(--global-header-height);background:transparent;backdrop-filter:none}
|
||||
#channel-page[data-channel="apps"] .benefits-directory>.channel-tabs::-webkit-scrollbar{display:none}
|
||||
#channel-page[data-channel="apps"] .benefits-directory>.channel-tabs button{flex:0 0 auto;min-height:36px;padding:8px 12px;font-size:12px;line-height:18px;white-space:nowrap;border-radius:999px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading{margin-bottom:16px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading h2{font-size:18px;margin-bottom:6px}
|
||||
#channel-page[data-channel="apps"] .benefit-heading p{font-size:12px;line-height:1.7}
|
||||
#channel-page[data-channel="apps"] .benefit-section{margin-bottom:28px;scroll-margin-top:calc(var(--global-header-height) + 64px)}
|
||||
#channel-page[data-channel="apps"] .benefit-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:20px 10px}
|
||||
#channel-page[data-channel="apps"] .benefit-card{box-sizing:border-box;height:100%;padding:0;gap:8px;border:0;border-radius:0;background:transparent;justify-content:flex-start}
|
||||
#channel-page[data-channel="apps"] .benefit-card:hover{background:transparent}
|
||||
#channel-page[data-channel="apps"] .benefit-icon{width:100%;height:auto;max-width:72px;aspect-ratio:1;flex:none}
|
||||
#channel-page[data-channel="apps"] .benefit-copy strong{font-size:12px;line-height:1.5;white-space:normal;overflow-wrap:anywhere;text-overflow:clip}
|
||||
#channel-page[data-channel="apps"] .benefit-copy small{display:block;font-size:12px;line-height:1.6;margin-top:5px;white-space:normal;overflow:visible;-webkit-line-clamp:unset}
|
||||
}
|
||||
|
||||
/* mobile-member-ad-scroll */
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* 黄果短剧 media UI: tall gallery card, cinematic detail hero, film-strip player page.
|
||||
* Loaded after globals.css; selectors are scoped to new class names.
|
||||
*/
|
||||
|
||||
/* ---------- brand logo (PNG 444×108) ---------- */
|
||||
#global-site-header .top>.hg-header-brand .hg-complete-logo{width:164px;height:40px;aspect-ratio:444/108;object-fit:contain}
|
||||
.jg-masthead-brand img{width:222px;height:54px;object-fit:contain}
|
||||
.side-info .side-info-wordmark,#mobile-navigation-drawer .side-info-wordmark{width:110px;height:auto;aspect-ratio:444/108}
|
||||
.entry-brand-logo{aspect-ratio:444/108}
|
||||
.side .sidebar-header .sidebar-brand{object-position:left center}
|
||||
|
||||
/* ---------- card: 9:16 gallery cover ---------- */
|
||||
.hg-card{display:flex;flex-direction:column;min-width:0;color:inherit;text-decoration:none;outline:none;-webkit-tap-highlight-color:transparent}
|
||||
.hg-card-cover{position:relative;display:block;aspect-ratio:9/16;border-radius:16px;overflow:hidden;background:#1b1c1c}
|
||||
.hg-card-cover::after{content:"";position:absolute;inset:0;z-index:3;border-radius:inherit;box-shadow:inset 0 0 0 1px rgba(255,255,255,.09);pointer-events:none;transition:box-shadow .18s ease}
|
||||
.hg-card-cover>.ranking-poster-frame{position:absolute;inset:0;display:block;width:100%;height:100%}
|
||||
.hg-card-cover>.poster-source,.hg-card-cover>.ranking-poster-frame>.poster-source{position:absolute;inset:0;width:100%;height:100%;max-width:none;object-fit:cover;object-position:center top;transform:none!important;transition:none!important}
|
||||
.hg-card:hover .hg-card-cover::after,.hg-card:focus-visible .hg-card-cover::after{box-shadow:inset 0 0 0 3px var(--accent,#ec2083)}
|
||||
.hg-card-counter{position:absolute;top:8px;right:8px;z-index:2;padding:2px 7px;border-radius:6px;background:rgba(12,12,12,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:#fff;font:600 11px/1.55 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.03em;font-variant-numeric:tabular-nums}
|
||||
.hg-card-badge{position:absolute;left:0;bottom:0;z-index:2;display:block;line-height:0}
|
||||
.hg-card-badge .cover-corner-badge{position:static;inset:auto;display:block;width:auto;height:auto;min-width:0;margin:0;padding:4px 9px;border:0;border-radius:0;box-shadow:none;transform:none;clip-path:none;background:var(--accent,#ec2083);color:#fff;font-size:11px;font-weight:700;line-height:1.4;letter-spacing:.06em}
|
||||
.hg-card-badge .cover-corner-badge::before,.hg-card-badge .cover-corner-badge::after{content:none;display:none}
|
||||
.hg-card-badge .cover-corner-badge--hot{background:#ff5b1f}
|
||||
.hg-card-badge .cover-corner-badge--new{background:#13a77a}
|
||||
.hg-card-title{margin:10px 0 0;color:#ececec;font-size:14px;font-weight:600;line-height:1.45;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;min-height:2.9em;overflow-wrap:anywhere;transition:color .18s ease}
|
||||
.hg-card:hover .hg-card-title,.hg-card:focus-visible .hg-card-title{color:var(--accent,#ec2083)}
|
||||
.hg-card-title .search-keyword{color:var(--accent,#ec2083)}
|
||||
.hg-card-rule{display:block;height:0;margin:8px 0 7px;border-top:1px dotted rgba(255,255,255,.22)}
|
||||
.hg-card-meta{display:flex;align-items:center;gap:6px;min-width:0;color:var(--muted,#92958f);font-size:12px;line-height:1.4}
|
||||
.hg-card-views{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;font-variant-numeric:tabular-nums}
|
||||
.hg-card-views svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8}
|
||||
.hg-card-dot{opacity:.6}
|
||||
.hg-card-theme{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
|
||||
/* ---------- detail: cinematic hero ---------- */
|
||||
#drama-play-page .cine-hero{position:relative;isolation:isolate;display:flex;align-items:stretch;min-height:420px;border-radius:20px;overflow:hidden;background:#0b0c0c;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06)}
|
||||
#drama-play-page .cine-hero-art{position:absolute;top:0;right:0;bottom:0;width:48%;z-index:0}
|
||||
#drama-play-page .cine-hero-image{display:block;width:100%;height:100%;max-width:none;object-fit:cover;object-position:center 22%;-webkit-mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.55) 22%,#000 52%);mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.55) 22%,#000 52%)}
|
||||
#drama-play-page .cine-hero::after{content:"";position:absolute;inset:auto 0 0 0;height:90px;z-index:0;background:linear-gradient(180deg,transparent,rgba(11,12,12,.65));pointer-events:none}
|
||||
#drama-play-page .cine-hero-copy{position:relative;z-index:1;display:flex;flex-direction:column;justify-content:center;width:62%;max-width:720px;padding:44px 48px;box-sizing:border-box}
|
||||
#drama-play-page .cine-kicker{display:block;color:var(--accent,#ec2083);font-size:12px;font-weight:700;letter-spacing:.24em;line-height:1.4}
|
||||
#drama-play-page .cine-hero h1{margin:12px 0 16px;color:#fff;font-size:clamp(34px,4.1vw,58px);font-weight:800;line-height:1.08;letter-spacing:-.01em;overflow-wrap:anywhere}
|
||||
#drama-play-page .cine-facts{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;margin:0;color:#cfcfcf;font-size:14px;line-height:1.6}
|
||||
#drama-play-page .cine-facts i{font-style:normal;color:#666}
|
||||
#drama-play-page .cine-tags{display:flex;flex-wrap:wrap;gap:4px 14px;margin:12px 0 0}
|
||||
#drama-play-page .cine-tags a,#drama-play-page .cine-tags span{color:#9fa39f;font-size:13px;text-decoration:none}
|
||||
#drama-play-page .cine-tags a:hover{color:var(--accent,#ec2083)}
|
||||
#drama-play-page .cine-hero .series-description-wrap{max-width:560px;margin:16px 0 24px}
|
||||
#drama-play-page .cine-hero .series-description{color:#a9a9a9}
|
||||
#drama-play-page .cine-actions{display:flex;align-items:center;flex-wrap:wrap;gap:14px 26px}
|
||||
#drama-play-page .cine-play{display:inline-flex;align-items:center;gap:10px;height:48px;padding:0 28px;border-radius:12px;background:var(--accent,#ec2083);color:#fff;font-size:16px;font-weight:700;text-decoration:none;box-shadow:0 10px 26px -12px var(--accent,#ec2083)}
|
||||
#drama-play-page .cine-play svg{width:18px;height:18px;fill:currentColor}
|
||||
#drama-play-page .cine-play:hover{filter:brightness(1.08)}
|
||||
#drama-play-page .cine-download{display:inline-flex;align-items:center;gap:6px;padding-bottom:2px;border-bottom:1px solid rgba(255,255,255,.3);color:#eee;font-size:15px;text-decoration:none;cursor:pointer}
|
||||
#drama-play-page .cine-download[hidden]{display:none}
|
||||
#drama-play-page .cine-download svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;transition:transform .18s}
|
||||
#drama-play-page .cine-download:hover{color:var(--accent,#ec2083);border-color:currentColor}
|
||||
#drama-play-page .cine-download:hover svg{transform:translateX(3px)}
|
||||
#drama-play-page .series-unavailable{color:#888;font-size:14px}
|
||||
|
||||
/* small outlined text buttons (like / collect / share) */
|
||||
#drama-play-page .cine-engage.play-detail-actions{display:flex;flex-wrap:wrap;gap:8px;width:auto;margin:20px 0 0}
|
||||
#drama-play-page .cine-engage.play-detail-actions>button{display:inline-flex;flex:0 0 auto;width:auto;min-width:0;max-width:none;height:30px;min-height:0;padding:0 12px;gap:0;border:1px solid rgba(255,255,255,.24);border-radius:6px;background:transparent;color:#cfcfcf;font-size:12px;line-height:1}
|
||||
#drama-play-page .cine-engage.play-detail-actions .play-action-icon{display:none}
|
||||
#drama-play-page .cine-engage.play-detail-actions>button:hover{border-color:var(--accent,#ec2083)}
|
||||
#drama-play-page .cine-engage.play-detail-actions>button[aria-pressed="true"]{background:transparent!important;border-color:var(--accent,#ec2083)!important;color:var(--accent,#ec2083)!important}
|
||||
#drama-play-page .cine-engage.play-detail-actions>button[aria-pressed="true"]>span{color:var(--accent,#ec2083)!important}
|
||||
|
||||
/* ---------- play: player, edge arrows, app gate ---------- */
|
||||
#drama-play-page .play-stage{position:relative}
|
||||
#drama-play-page .play-edge{position:absolute;top:50%;z-index:6;display:grid;place-items:center;width:46px;height:46px;margin-top:-23px;border-radius:50%;background:rgba(10,10,10,.45);border:1px solid rgba(255,255,255,.2);color:#fff;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);opacity:.85;transition:background .18s,opacity .18s}
|
||||
#drama-play-page .play-edge--prev{left:14px}
|
||||
#drama-play-page .play-edge--next{right:14px}
|
||||
#drama-play-page .play-edge svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
|
||||
#drama-play-page .play-edge:hover,#drama-play-page .play-edge:focus-visible{background:var(--accent,#ec2083);border-color:transparent;opacity:1}
|
||||
#drama-play-page .play-app-gate{position:absolute;inset:0;z-index:5;display:grid;place-items:center;padding:24px;text-align:center;background:radial-gradient(circle at 50% 42%,rgba(236,32,131,.2),rgba(0,0,0,.88) 68%)}
|
||||
#drama-play-page .play-app-gate[hidden]{display:none}
|
||||
#drama-play-page .play-app-gate-copy[hidden],#drama-play-page .play-app-gate-fallback[hidden]{display:none}
|
||||
#drama-play-page .play-app-gate-copy strong{display:block;color:#fff;font-size:22px;font-weight:800;line-height:1.35}
|
||||
#drama-play-page .play-app-gate-copy p{margin:8px 0 18px;color:#bdbdbd;font-size:14px}
|
||||
#drama-play-page .play-app-gate-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 24px;border-radius:12px;background:var(--accent,#ec2083);color:#fff;font-size:15px;font-weight:700;text-decoration:none}
|
||||
#drama-play-page .play-app-gate-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2}
|
||||
#drama-play-page .play-app-gate-fallback{margin:0;color:#ddd;font-size:15px}
|
||||
#drama-play-page .play-screen.is-app-gated .play-screen-controls{display:none}
|
||||
|
||||
/* headline under the player: outlined episode number */
|
||||
#drama-play-page .play-headline{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:30px;padding:28px 0 26px;border-bottom:1px solid #ffffff12}
|
||||
#drama-play-page .play-headline-mark{padding-top:4px;color:transparent;-webkit-text-stroke:2px var(--accent,#ec2083);font:900 112px/.82 "Arial Black",Impact,"Helvetica Neue",system-ui,sans-serif;letter-spacing:-.04em;font-variant-numeric:tabular-nums;user-select:none}
|
||||
#drama-play-page .play-headline-mark.is-word{font-size:62px;letter-spacing:.02em;padding-top:10px}
|
||||
#drama-play-page .play-headline h1{margin:8px 0 10px;color:#fff;font-size:28px;line-height:1.3}
|
||||
#drama-play-page .play-headline .series-description-wrap{margin:14px 0 0;max-width:820px}
|
||||
|
||||
/* film-strip episode selector */
|
||||
#drama-play-page .play-episodes-section{margin-top:28px}
|
||||
#drama-play-page .film-strip{position:relative;display:flex;gap:10px;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;scroll-padding:0 14px;padding:20px 14px;border-radius:10px;background-color:#0a0a0b;background-image:radial-gradient(circle,#2f3033 2.6px,transparent 3.2px),radial-gradient(circle,#2f3033 2.6px,transparent 3.2px);background-size:18px 10px,18px 10px;background-repeat:repeat-x;background-position:4px 3px,4px calc(100% - 3px);background-attachment:local;scrollbar-width:thin;scrollbar-color:#3a3a3d transparent}
|
||||
#drama-play-page .film-strip::-webkit-scrollbar{height:6px}
|
||||
#drama-play-page .film-strip::-webkit-scrollbar-thumb{background:#3a3a3d;border-radius:3px}
|
||||
#drama-play-page .film-tile{position:relative;flex:0 0 56px;display:grid;place-items:center;width:56px;height:56px;box-sizing:border-box;scroll-snap-align:center;border:1px solid #ffffff12;border-radius:6px;background:#1e1f20;color:#ddd;font:700 16px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;text-decoration:none;transition:border-color .15s,color .15s}
|
||||
#drama-play-page .film-tile:hover,#drama-play-page .film-tile:focus-visible{border-color:var(--accent,#ec2083);color:#fff}
|
||||
#drama-play-page .film-tile.is-current{background:var(--accent,#ec2083);border-color:var(--accent,#ec2083);color:#fff}
|
||||
#drama-play-page .film-tile.is-locked{opacity:.5}
|
||||
#drama-play-page .film-tile.is-locked.is-current{opacity:1}
|
||||
#drama-play-page .film-tile-lock{position:absolute;top:4px;right:4px;width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2.2}
|
||||
|
||||
/* recommendations */
|
||||
#drama-play-page .play-recommend{margin-top:36px}
|
||||
#drama-play-page .recommend-heading{position:relative;margin-bottom:20px}
|
||||
#drama-play-page .recommend-outline{display:block;overflow:hidden;white-space:nowrap;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.2);font:900 66px/1 "Arial Black",Impact,"Helvetica Neue",system-ui,sans-serif;letter-spacing:.03em;user-select:none}
|
||||
#drama-play-page .recommend-heading h2{position:absolute;left:6px;top:16px;margin:0;color:#fff;font-size:26px;font-weight:800;line-height:1.3}
|
||||
#drama-play-page .recommend-heading p{margin:6px 0 0;color:var(--muted,#92958f);font-size:14px}
|
||||
#drama-play-page .recommend-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:24px 16px}
|
||||
#drama-play-page .play-official{margin-top:32px}
|
||||
|
||||
@media (max-width:1200px){
|
||||
#drama-play-page .recommend-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
|
||||
}
|
||||
@media (max-width:900px){
|
||||
#drama-play-page .recommend-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
|
||||
#drama-play-page .cine-hero-copy{width:70%;padding:36px 32px}
|
||||
}
|
||||
@media (max-width:760px){
|
||||
#drama-play-page .cine-hero{display:block;min-height:0;border-radius:0;background:transparent;box-shadow:none;overflow:visible}
|
||||
#drama-play-page .cine-hero::after{content:none}
|
||||
#drama-play-page .cine-hero-art{position:relative;width:auto;aspect-ratio:16/9;margin:0 -12px;overflow:hidden}
|
||||
#drama-play-page .cine-hero-image{object-position:center 18%;-webkit-mask-image:linear-gradient(180deg,#000 45%,transparent 100%);mask-image:linear-gradient(180deg,#000 45%,transparent 100%)}
|
||||
#drama-play-page .cine-hero-copy{width:auto;max-width:none;margin-top:-28px;padding:0}
|
||||
#drama-play-page .cine-hero h1{margin:8px 0 10px;font-size:28px}
|
||||
#drama-play-page .cine-actions{gap:12px 20px}
|
||||
#drama-play-page .cine-play{height:44px;padding:0 22px;font-size:15px}
|
||||
#drama-play-page .play-edge{width:36px;height:36px;margin-top:-18px}
|
||||
#drama-play-page .play-edge--prev{left:8px}
|
||||
#drama-play-page .play-edge--next{right:8px}
|
||||
#drama-play-page .play-app-gate{padding:12px 54px}
|
||||
#drama-play-page .play-app-gate-copy strong{font-size:16px}
|
||||
#drama-play-page .play-app-gate-copy p{margin:6px 0 12px;font-size:12px}
|
||||
#drama-play-page .play-app-gate-btn{height:38px;padding:0 16px;font-size:13px}
|
||||
#drama-play-page .play-headline{gap:16px;padding:20px 0}
|
||||
#drama-play-page .play-headline-mark{font-size:64px;-webkit-text-stroke-width:1.5px}
|
||||
#drama-play-page .play-headline-mark.is-word{font-size:34px}
|
||||
#drama-play-page .play-headline h1{font-size:20px}
|
||||
#drama-play-page .recommend-outline{font-size:44px}
|
||||
#drama-play-page .recommend-heading h2{top:8px;font-size:20px}
|
||||
.hg-card-cover{border-radius:12px}
|
||||
}
|
||||
@media (max-width:560px){
|
||||
#drama-play-page .recommend-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px 12px}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
@@ -1,32 +0,0 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_42558_134113)">
|
||||
<path d="M-0.0055542 19.984C-0.0055542 8.93831 8.94875 -0.0159912 19.9944 -0.0159912V-0.0159912C31.0401 -0.0159912 39.9944 8.93831 39.9944 19.984V19.984C39.9944 31.0297 31.0401 39.984 19.9944 39.984V39.984C8.94875 39.984 -0.0055542 31.0297 -0.0055542 19.984V19.984Z" fill="url(#paint0_linear_42558_134113)"/>
|
||||
<path d="M34.9795 20.2336C34.9651 20.0651 34.9542 19.8931 34.9421 19.7241L34.9358 19.682C34.9231 19.3903 34.8054 18.875 34.7423 18.5923L34.7292 18.5587C34.4771 17.3099 33.6857 16.01 32.8351 15.082C32.3404 14.5425 31.7519 14.0335 31.1963 13.5545C28.6032 11.2953 25.6656 9.45862 22.4934 8.11303C20.9669 7.48079 19.8656 7.11202 18.2159 7.00627C17.9724 7.00179 17.7289 7 17.4849 7C16.8459 7.0242 16.1103 7.1053 15.4776 7.24913C13.6755 7.65913 11.9186 8.63281 10.6423 9.9645C10.0998 10.5309 9.58342 11.199 9.1816 11.8684C7.52878 14.621 6.8857 18.1034 7.01603 21.279C7.1662 24.9353 8.31483 28.9425 11.0969 31.4867C12.9806 33.1943 15.4668 34.0945 18.0148 33.9919C19.8372 33.9149 21.2992 33.3825 22.9624 32.6719C26.0962 31.3379 28.9825 29.4919 31.502 27.2102C32.5704 26.2366 33.5341 25.3189 34.1786 23.9961L34.3454 23.6377C34.7653 22.6107 34.8731 22.0161 34.9772 20.9107C34.9849 20.8892 34.9849 20.8829 34.9948 20.8417C34.9975 20.7014 35.0102 20.3568 34.98 20.2336H34.9795ZM27.4253 21.1329C27.1637 21.568 25.6385 22.8831 25.165 23.2062C24.9445 23.3984 24.6067 23.6466 24.3654 23.8169C22.9061 24.843 21.3331 25.6993 19.6775 26.3692C19.2631 26.539 18.6475 26.7823 18.2065 26.8697C17.8764 26.936 17.5368 26.9423 17.2044 26.8885C15.9268 26.6689 15.2612 25.7163 14.8133 24.6006C14.0616 22.7276 13.9349 20.4922 14.2853 18.5184C14.3926 17.7759 14.6889 16.9174 15.0118 16.2376C15.1935 15.9168 15.3505 15.6368 15.589 15.3513C16.2461 14.5681 17.2946 14.2688 18.2872 14.4543C18.7224 14.5354 19.1661 14.7294 19.5765 14.9006C20.5173 15.2881 21.4318 15.7353 22.3148 16.2403C22.4745 16.3304 22.6594 16.4357 22.8104 16.5401C24.1485 17.3404 25.3882 18.3024 26.5553 19.3307C26.8151 19.5597 27.1105 19.7819 27.3242 20.0548C27.4117 20.1664 27.4776 20.2869 27.5127 20.4245C27.5736 20.662 27.5533 20.9192 27.4257 21.1316L27.4253 21.1329Z" fill="white"/>
|
||||
<g filter="url(#filter0_d_42558_134113)">
|
||||
<path d="M20.5 28.7835C25.0621 28.7835 28.7604 25.0852 28.7604 20.5232C28.7604 15.9611 25.0621 12.2628 20.5 12.2628C15.938 12.2628 12.2397 15.9611 12.2397 20.5232C12.2397 25.0852 15.938 28.7835 20.5 28.7835Z" fill="#0F0F0F"/>
|
||||
<path d="M16.6111 24.3571V17.1369L17.0821 17.7465L15.2763 18.6624L14.9065 17.212L17.3334 15.9523H18.2493V24.3542H16.6082L16.6111 24.3571ZM15.126 24.9783V23.4527H19.7777V24.9783H15.126Z" fill="white"/>
|
||||
<path d="M23.5916 25.016C23.0224 25.016 22.5052 24.9004 22.0343 24.6664C21.5633 24.4323 21.1877 24.1203 20.9103 23.7245C20.6301 23.3315 20.4914 22.8924 20.4914 22.4099C20.4914 22.1209 20.5318 21.8551 20.6127 21.6095C20.6936 21.364 20.8121 21.1444 20.9681 20.9479C21.1241 20.7543 21.3148 20.5781 21.5402 20.4192C21.7656 20.2632 22.0198 20.1245 22.3087 20.006L22.2076 20.3614C21.988 20.2689 21.7858 20.1591 21.6038 20.032C21.4217 19.9049 21.2657 19.7575 21.1328 19.5929C20.9999 19.4282 20.9017 19.249 20.8352 19.0583C20.7688 18.8677 20.7341 18.6654 20.7341 18.4545C20.7341 17.998 20.8641 17.5848 21.1212 17.2208C21.3784 16.8567 21.7251 16.5649 22.1585 16.3511C22.5919 16.1344 23.0686 16.0275 23.5944 16.0275C24.1203 16.0275 24.6115 16.1344 25.0448 16.3511C25.4782 16.5678 25.8221 16.8567 26.0821 17.2208C26.3392 17.5848 26.4692 17.9951 26.4692 18.4545C26.4692 18.6654 26.4346 18.8677 26.3681 19.0583C26.3017 19.249 26.2063 19.4224 26.0821 19.5784C25.9578 19.7344 25.8047 19.8789 25.6169 20.0118C25.4291 20.1447 25.2153 20.2603 24.9697 20.3614L24.9062 20.0551C25.1778 20.1476 25.4233 20.2718 25.6429 20.4249C25.8625 20.5781 26.0532 20.7543 26.215 20.9595C26.3768 21.1617 26.501 21.3871 26.5906 21.6327C26.6802 21.8782 26.7235 22.1383 26.7235 22.407C26.7235 22.8981 26.5848 23.3402 26.3046 23.736C26.0243 24.129 25.6487 24.441 25.1806 24.6693C24.7126 24.8975 24.1839 25.0131 23.5973 25.0131L23.5916 25.016ZM23.5916 23.5945C23.8805 23.5945 24.1376 23.5396 24.3659 23.4298C24.5941 23.32 24.7733 23.1726 24.9062 22.9848C25.0362 22.7999 25.1026 22.5832 25.1026 22.3376C25.1026 22.0747 25.0362 21.8436 24.9062 21.6442C24.7733 21.4449 24.5941 21.2888 24.3659 21.1733C24.1376 21.0577 23.8776 21.0028 23.5916 21.0028C23.3055 21.0028 23.0599 21.0606 22.8346 21.1733C22.6092 21.2888 22.4301 21.4449 22.2943 21.6442C22.1585 21.8436 22.092 22.0747 22.092 22.3376C22.092 22.5746 22.1585 22.7884 22.2943 22.9733C22.4301 23.1611 22.6092 23.3113 22.8346 23.424C23.0599 23.5396 23.3113 23.5945 23.5916 23.5945ZM23.5916 19.6015C23.8458 19.6015 24.0712 19.5553 24.2705 19.4628C24.4699 19.3704 24.623 19.2433 24.7357 19.0815C24.8455 18.9197 24.9004 18.7347 24.9004 18.5209C24.9004 18.3071 24.8455 18.1078 24.7357 17.9431C24.6259 17.7784 24.4699 17.6455 24.2705 17.5502C24.0712 17.4519 23.8458 17.4028 23.5916 17.4028C23.3373 17.4028 23.1235 17.4519 22.9241 17.5502C22.7248 17.6484 22.5688 17.7784 22.459 17.9431C22.3492 18.1078 22.2943 18.3014 22.2943 18.5209C22.2943 18.7405 22.3492 18.9197 22.459 19.0815C22.5688 19.2433 22.7248 19.3704 22.9241 19.4628C23.1235 19.5553 23.346 19.6015 23.5916 19.6015Z" fill="white"/>
|
||||
<path d="M20.5 11.5C15.5363 11.5 11.5 15.5363 11.5 20.5C11.5 25.4637 15.5363 29.5 20.5 29.5C25.4637 29.5 29.5 25.4637 29.5 20.5C29.5 15.5363 25.4637 11.5 20.5 11.5ZM28.0583 20.5C28.0583 22.0284 27.5989 23.4528 26.8159 24.6432L16.7266 13.9588C17.839 13.3144 19.1276 12.9417 20.5029 12.9417C24.6692 12.9417 28.0583 16.3308 28.0583 20.4971V20.5ZM20.5 28.0554C16.3337 28.0554 12.9446 24.6663 12.9446 20.5C12.9446 18.2319 13.9501 16.195 15.5392 14.8082L25.9 25.7787C24.5276 27.1828 22.6149 28.0554 20.5029 28.0554H20.5Z" fill="#DB0015"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_d_42558_134113" x="10.4177" y="10.4177" width="20.1647" height="20.1647" 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="0.541168"/>
|
||||
<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 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_42558_134113"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_42558_134113" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_42558_134113" x1="30.5469" y1="9.57031" x2="5.54686" y2="33.75" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#89FFEB"/>
|
||||
<stop offset="0.5" stop-color="#FFA53E"/>
|
||||
<stop offset="1" stop-color="#FD6119"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_42558_134113">
|
||||
<rect width="40" height="40" rx="20" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.8 KiB |
+4
-2
@@ -1,12 +1,14 @@
|
||||
import type { Metadata, Viewport } from "next";
|
||||
import Script from "next/script";
|
||||
import "./globals.css";
|
||||
import "./hg-media.css";
|
||||
import { SITE_NAME } from "@/lib/brand";
|
||||
|
||||
const GTM_ID = "GTM-TXLP67SX";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "禁果短剧 · 精品原创 · 日更爽看",
|
||||
applicationName: "禁果短剧",
|
||||
title: `${SITE_NAME} · 精品原创 · 日更爽看`,
|
||||
applicationName: SITE_NAME,
|
||||
icons: {icon:[{url:'/favicon.png',sizes:'48x48',type:'image/png'}],apple:[{url:'/apple-touch-icon.png',sizes:'180x180',type:'image/png'}]},
|
||||
verification: {google: "QJFFfKYHJsNfa-lGTdGjsCJc4rytPw-4wsTty-BM6iU"},
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { Metadata } from 'next';
|
||||
|
||||
export const metadata:Metadata={title:'页面不存在 - 禁果短剧',robots:{index:false,follow:true},alternates:{canonical:null}};
|
||||
export const metadata:Metadata={title:'页面不存在 - 黄果短剧',robots:{index:false,follow:true},alternates:{canonical:null}};
|
||||
|
||||
export default function NotFound() {
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user