diff --git a/.env.example b/.env.example index 51c4c8f..2f8b8b4 100644 --- a/.env.example +++ b/.env.example @@ -1,14 +1,9 @@ # Legacy development-only .env.local example. Prefer config/development.local.env. # Development uses this configured backend; browsers call the current site's /api/*. -# Test uses this same backend; production uses http://172.104.56.28:26125. -UPSTREAM_API_URL=http://172.104.181.99:21022 +# Test and production use this same backend. +UPSTREAM_API_URL=https://webhgcgapi.mfcg.me # API_BASE_URL remains supported for existing local overrides. # Optional channel code passed when creating a guest account. API_CHANNEL= # Public configuration/navigation: 60s; homepage: 30s. Optional cap in milliseconds; 0 disables. # PUBLIC_DATA_CACHE_TTL_MS=60000 - -# Analytics application ID. Must match this site's reportSdkConfig and upstream app ID. -NEXT_PUBLIC_TRACKER_APP_ID=1047 -# Optional same-project encrypted config fallback when config/info omits reportSdkConfig. -NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG= diff --git a/README.md b/README.md index 6b45d1c..8c20147 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 91短剧 · Next.js +# 黄果吃瓜 · Next.js Next.js App Router、React、TypeScript。保留 HTML 原稿布局和移动端导航,业务数据通过 Swagger API 动态获取。 @@ -35,7 +35,7 @@ npm start 测试环境按生产模式构建、启动,使用 `APP_ENV=test` 和 `NODE_ENV=production`;`npm run dev:test` 则使用测试配置启动开发服务器。业务环境通过 `APP_ENV` 区分,不把测试部署误设为单元测试使用的 `NODE_ENV=test`。 -浏览器始终访问当前站点的相对地址 `/api/*`,Next.js 服务端通过 `UPSTREAM_API_URL` 请求 Go 的 `/api/app/*`。开发、测试环境使用 `http://172.104.181.99:21022`,生产环境使用 `http://172.104.56.28:26125`。上游地址仅由服务端读取。默认应用端口均为 `21021`。公开接口缓存和 SEO 快照按解析后的上游域名隔离。修改服务器配置时,在对应目录新增 `config/test.local.env` 或 `config/production.local.env`;这些本地文件已忽略提交。优先级为:进程环境变量 > 对应 `*.local.env` > 对应基础配置。开发环境兼容旧 `.env.local`,其优先级低于 `config/development.local.env`;测试和生产不从旧 `.env.local` 加载本站业务配置。 +浏览器始终访问当前站点的相对地址 `/api/*`,Next.js 服务端通过 `UPSTREAM_API_URL` 请求 Go 的 `/api/app/*`。开发、测试、生产环境均使用 `https://webhgcgapi.mfcg.me`。上游地址仅由服务端读取。默认应用端口均为 `21021`。公开接口缓存和 SEO 快照按解析后的上游域名隔离。修改服务器配置时,在对应目录新增 `config/test.local.env` 或 `config/production.local.env`;这些本地文件已忽略提交。优先级为:进程环境变量 > 对应 `*.local.env` > 对应基础配置。开发环境兼容旧 `.env.local`,其优先级低于 `config/development.local.env`;测试和生产不从旧 `.env.local` 加载本站业务配置。 原有 `API_BASE_URL` 仍作为兼容别名。在同一配置层内 `UPSTREAM_API_URL` 优先;较高配置层的旧变量仍可覆盖较低层的新变量,启动后统一为同一个上游地址。上游地址仅在服务端读取,不写入浏览器代码。 @@ -103,15 +103,14 @@ DEPLOY_JUMP_HOST=user@jump-host DEPLOY_JUMP_DIR=/srv/91dj/h5 bash deploy_prod.sh - 官方入口 `/navigation/`:独立展示线路、官方渠道与 App 下载,不加载首页导航、播放器或账户交互;首页和业务页面不再弹出入口导航页。 - 专题、题材、标签、栏目:`/topics/:id/`、`/theme/:id/`、`/tag/:id/`、`/config/:id/`。 - 详情 `/detail/:id/`;章节播放 `/play/:id/:chapterId/`。 -- 内容路由优先使用接口返回的英文或拼音 `slug`(字母、数字、连字符、下划线),中文或无效 slug 回退到 ID,例如 `/detail/city-story/`、`/play/city-story/90001/`、`/topics/urban/`、`/tag/urban/`、`/config/editors-choice/`。章节段仍是章节 ID。卡片、轮播、选集、评论/列表分页、解锁后跳转和 SEO 地址使用同一规则;原 ID 地址继续直接访问。有配置的 `moreUrl` 优先级不变。 +- 内容路由优先使用接口返回的英文或拼音 `slug`(字母、数字、连字符、下划线),中文或无效 slug 回退到 ID,例如 `/detail/city-story/`、`/play/city-story/90001/`、`/topics/urban/`、`/tag/urban/`、`/config/editors-choice/`。章节段仍是章节 ID。卡片、轮播、选集、评论/列表分页和 SEO 地址使用同一规则;原 ID 地址继续直接访问。有配置的 `moreUrl` 优先级不变。 - 搜索 `/search/关键词/`;分页 `/search/关键词/page/2/`。关键词通过 `encodeURIComponent` 作为单个路径段编码,支持中文和特殊字符。 -- 独立导航页 `/navigation/` 从 `config/info` 读取站名、介绍、`navPageList`、永久入口、TG/X 和 App 下载地址。线路按 `line` 排序;旧配置兼容 `dhNewUrlAddr1/2/3` 与最新地址字段。未配置或无效的链接不展示,不使用演示账号或首页链接兜底。 -- 个人中心 `/member/center/`,收藏、历史、点赞、已购和设置分别为 `/member/favorites/`、`/member/history/`、`/member/likes/`、`/member/purchased/`、`/member/settings/`。 -- 帮助与平台信息 `/info/:slug/`;充值 `/info/deposit/`;VIP `/info/deposit/vip/`。 -- 所有分页使用独立路径,例如 `/shorts/page/2/`、`/rank/new/page/2/`、`/topics/31/page/2/`、`/member/history/page/2/`、`/info/deposit/vip/page/2/`;详情和播放页的 `/page/2/` 对应评论第 2 页。页码、上一页和下一页均为真实链接,可直接访问、刷新和前进后退。 -- 排序通过 `?sort=2` 保留;评论排序使用 `?commentSort=1`。切换排序时链接指向第一页,翻页时保留当前条件;第一页链接使用原页面路径,不执行自动跳转或地址替换。 +- 独立导航页 `/navigation/` 站名固定为“黄果吃瓜”,入口线路和永久入口固定为 `https://huangguocg.com/`(`src/lib/site.ts`),联系方式固定为官方 TG `@jbd125`;不使用后台 `navPageList`、`newUrlAddr*`、`foreverUrlAddr` 和联系方式字段。介绍和 App 下载地址仍读取 `config/info`,未配置或无效的下载链接不展示。 +- 帮助与平台信息 `/info/:slug/`。个人中心(`/member/*`)、充值/VIP(`/info/deposit/*`)、`/info/user-center/`、`/info/settings/` 已删除,返回 404。 +- 所有分页使用独立路径,例如 `/shorts/page/2/`、`/rank/new/page/2/`、`/topics/31/page/2/`。详情和播放页不分页(评论已删除),`/page/N/` 返回 404。页码、上一页和下一页均为真实链接,可直接访问、刷新和前进后退。 +- 排序通过 `?sort=2` 保留。切换排序时链接指向第一页,翻页时保留当前条件;第一页链接使用原页面路径,不执行自动跳转或地址替换。 -页面直接根据 URL 路径加载,不解析或转换旧 hash 路由。站内导航、动态卡片、播放选集、搜索和会员入口均使用路径地址;无效路径返回 404。 +页面直接根据 URL 路径加载,不解析或转换旧 hash 路由。站内导航、动态卡片、播放选集和搜索入口均使用路径地址;无效路径返回 404。 页面地址统一使用尾斜杠。`src/proxy.ts` 对有效页面的无尾斜杠地址返回 `308` 永久重定向,例如 `/shorts` → `/shorts/`,分页、搜索关键词和查询参数完整保留;首页 `/` 直接响应。Next.js 保留 `trailingSlash: true` 和 `skipTrailingSlashRedirect: true`,由 Proxy 仅处理页面,API、播放列表、密钥、静态资源地址不受影响;无效路径直接返回 404。 @@ -123,7 +122,7 @@ DEPLOY_JUMP_HOST=user@jump-host DEPLOY_JUMP_DIR=/srv/91dj/h5 bash deploy_prod.sh 页面 head 由本项目(`JHA-1047`)的 `src/lib/seo-server.ts` 和 `src/lib/seo.ts` 生成:全站名称与首页 TDK 取 `config/info.seoInfo`,栏目 TDK 优先使用 `translation/category/list` 的导航配置,具体专题、剧集使用对应接口信息。兼容字符串形式的 SEO 配置及 `keyworld` 等旧字段。`/navigation/` 使用 `seoNavInfo`。 -canonical 的域名优先取 `config.foreverUrlAddr`,其次取 `newAddressInfo.foreverUrlAddr`,只使用配置中的永久域名,不回退到请求 Host、API 或 CDN 域名。配置沿用 60 秒公共缓存,成功取得有效永久域名后,将公开 SEO 信息保存到 `.next/cache/seo/`,按 API 地址隔离;接口超时、报错、配置或永久域名暂缺时沿用最近一次有效值,服务重启也可读取已有快照。快照不包含 SDK 配置、账号或凭证;部署时需保留该缓存目录,完全没有有效配置/快照时不输出猜测的 canonical 和站点 JSON-LD。后台更新为有效永久域名后,缓存过期后的新页面请求采用新配置;同一浏览器文档沿用服务端给出的 canonical、site_name 和发布者身份。 +canonical、sitemap 和结构化数据的域名固定为 `https://huangguocg.com`(`src/lib/site.ts` 的 `SITE_ORIGIN`),不使用后台的 `foreverUrlAddr`,也不回退到请求 Host、API 或 CDN 域名。页面上展示的站点地址(导航页线路与永久入口、回家的路、详情页“官方地址”)同样固定为该域名。配置沿用 60 秒公共缓存,公开 SEO 信息保存到 `.next/cache/seo/`,按 API 地址隔离;接口超时或报错时沿用最近一次有效的站名与 TDK,服务重启也可读取已有快照。快照不包含账号或凭证;部署时需保留该缓存目录。同一浏览器文档沿用服务端给出的 canonical、site_name 和发布者身份。 canonical 不带查询参数,分页各自生成规范地址和有边界的 `prev/next`,第 1 页使用栏目地址。搜索、账户、充值和工具页按参考项目输出 `noindex`。服务端将 TDK、robots、Open Graph、Twitter 和图标信息直接写入 ``,每次页面请求都返回对应页面的完整 head。本次未新增统计脚本。 @@ -131,19 +130,19 @@ canonical 不带查询参数,分页各自生成规范地址和有边界的 `pr 公开正文与 SEO 使用同一次服务端取数:短剧、三个榜单、专题列表/详情、题材/标签、首页更多栏目、短剧详情、播放页及各自分页直接输出当前页的标题、简介、内容卡片、集数和已有评论,分页与免费集数保留原生链接。搜索结果也直接输出首屏正文,继续保持 `noindex`。详情/播放和栏目模板在服务端与站内导航间共用,沿用现有 HTML 样式。 -请求与渲染方式:服务端先完成当前页面取数,再返回页头和完整正文;福利应用、回家的路、反馈、个人中心、收藏/历史/点赞/已购、设置及充值/VIP 页面也直接输出内容。链接和搜索使用浏览器原生页面请求,旧页面保留到新响应到达,不清空正文或插入页面加载占位。浏览器复用首屏快照绑定轮播、播放、表单和支付等交互,不再重复获取整页数据;提交成功后重新请求当前页面。 +请求与渲染方式:服务端先完成当前页面取数,再返回页头和完整正文;福利应用和回家的路页面也直接输出内容。链接和搜索使用浏览器原生页面请求,旧页面保留到新响应到达,不清空正文或插入页面加载占位。浏览器复用首屏快照绑定轮播、播放、表单和支付等交互,不再重复获取整页数据;提交成功后重新请求当前页面。 公共配置、导航、分类、页脚和标签选项使用 60 秒进程内缓存,首页使用 30 秒;同一上游地址及查询参数的并发请求合并,返回独立数据副本,缓存有数量上限。配置及首页刷新失败可沿用已成功取得的数据;错误和无效响应不写入缓存。账户、余额、套餐及付费观看权限不使用公共缓存,HTML 继续保持私有响应。可用 `PUBLIC_DATA_CACHE_TTL_MS` 缩短公共缓存时间,设为 `0` 可关闭;多实例各自维护缓存。 -详情、章节、选集、评论和推荐按 URL 中的 ID 并行请求。浏览器复用首屏中的公开配置和页脚数据,下载与广告交互不再等待重复取数;SDK 配置仍单独读取,不写入 HTML。支持浏览器前进后退缓存时,公开页保留 DOM、滚动位置和交互,并在后台恢复当前会话和页面埋点;账户、播放及打开弹窗的页面仍重新请求,防止恢复已处置的支付/权限状态。 +详情、章节、选集和推荐按 URL 中的 ID 并行请求。浏览器复用首屏中的公开配置和页脚数据,下载与广告交互不再等待重复取数。支持浏览器前进后退缓存时,公开页保留 DOM、滚动位置和交互,并在后台恢复当前会话;账户、播放及打开弹窗的页面仍重新请求,防止恢复已处置的支付/权限状态。 -有效业务页面在 Proxy 中恢复账号或建立游客会话,将同一身份的 Cookie 传给本次服务端渲染并写回浏览器。客户端复用已准备的用户信息,避免首屏再次初始化游客。正式账号过期显示登录入口,接口异常直接返回重试状态;账户页面保持 `private, no-store` 和 `noindex`。首屏账号、账户列表、套餐、流水和播放器数据均按字段白名单传递,未授权付费视频源、服务端账号凭证及 SDK 私密配置不写入 HTML;点击金币集数仍读取实时权限、价格并由用户确认解锁。当前 Next.js 动态参数在路由入口只解码一次,中文和含空格、斜杠、百分号的搜索词与浏览器保持一致。 +有效业务页面在 Proxy 中恢复或建立游客会话,将同一身份的 Cookie 传给本次服务端渲染并写回浏览器。客户端复用已准备的用户信息,避免首屏再次初始化游客。正式账号过期显示登录入口,接口异常直接返回重试状态;账户页面保持 `private, no-store` 和 `noindex`。首屏账号、账户列表、套餐、流水和播放器数据均按字段白名单传递,未授权付费视频源、服务端账号凭证及 SDK 私密配置不写入 HTML;点击金币集数仍读取实时权限、价格并由用户确认解锁。当前 Next.js 动态参数在路由入口只解码一次,中文和含空格、斜杠、百分号的搜索词与浏览器保持一致。 JSON-LD 参考 `huangguo.com` 的品牌节点及参考项目 `seoser/jsonld.go`:收录页输出 `Organization`、`WebSite` 和对应 `WebPage` / `CollectionPage`,列表输出实际内容的 `ItemList`,详情使用 `TVSeries`,播放页关联 `TVEpisode` 与具备真实封面、发布时间的 `VideoObject`。关于页使用 `AboutPage`,常见问题直接从页面可见问答生成 `FAQPage`。URL、站名与分页序号沿用现有动态 SEO 配置;不使用参考站的品牌、域名、伪造日期或评分。每份页面响应包含本页的原生 JSON-LD script,不收录页不输出旧页面的数据。测试覆盖脚本安全转义和重复节点清理。 - 文档:https://91av-wz.80sygtm.com/swagger/index.html -- `UPSTREAM_API_URL`:开发、测试环境为 `http://172.104.181.99:21022`,生产环境为 `http://172.104.56.28:26125`;兼容旧 `API_BASE_URL`。 -- `API_CHANNEL`:可选游客、登录和绑定的默认渠道码;已有首次渠道时优先保留。 +- `UPSTREAM_API_URL`:三套环境均为 `https://webhgcgapi.mfcg.me`;兼容旧 `API_BASE_URL`。 +- `API_CHANNEL`:可选游客会话的默认渠道码;已有首次渠道时优先保留。 - 项目编号:`JHA-1047`。接口读取与业务处理位于 `src/lib/api/server.ts`、`src/lib/client/config.ts`、`src/lib/client/channel.ts`、`src/lib/client/auth.ts` 和 `src/lib/client/account.ts`。 浏览器访问同源 `/api/*`,由 Next.js 按白名单代理到配置上游的 `/api/app/*`。Nginx 已有的 `/api/app/* → Go` 规则可以保留,其他 `/api/*` 交给 Next.js;不能将整个 `/api/` 都交给 Go。旧 Next.js `/api/app/*` 处理器仍保留供本地兼容访问。首页由服务端渲染,公开首页数据缓存 30 秒。公共接口不携带用户 token;用户接口使用 HttpOnly、SameSite Cookie。token 和密码不会写入浏览器本地存储或返回给前端脚本。 @@ -152,18 +151,13 @@ JSON-LD 参考 `huangguo.com` 的品牌节点及参考项目 `seoser/jsonld.go` 请求处理参考 `jha-1045-hgdjnet-web`:Next.js 接口代理不根据 `Origin`、`Host` 或 `Sec-Fetch-Site` 拦截 POST,避免 CloudFront / Nginx 转发后域名或协议变化导致正常浏览器请求返回 403。浏览器继续请求当前站点的 `/api/*`,代理负责接口白名单、参数处理和会话传递,业务权限由上游校验。 -## 登录与游客绑定 +## 游客会话 -登录流程由本项目(`JHA-1047`)的 `src/lib/client/auth.ts` 和 `src/app/api/app/[...path]/route.ts` 实现,保留本站登录弹窗。 +已删除登录、注册/绑定、找回密码和退出,全站只使用游客身份(点赞、收藏仍需要它)。实现位于 `src/lib/client/api.ts`、`src/lib/api/page-session.ts` 和 `src/app/api/app/[...path]/route.ts`。 -- 首次访问自动建立游客会话;已有 Cookie 时先读取 `auth/getInfo` 恢复身份、昵称和余额,接口未返回新 token 时继续使用原 token。 -- 游客、登录和绑定使用同一持久设备标识,发送 `devID` 和渠道;首次渠道取 `dc/ch/pc`,后续访问保持不变。绑定支持 `inviteCode/invite/code` 邀请参数。服务端按参考项目发送设备头,并透传有效的客户端 IP。 -- 绑定携带当前游客凭证以保留其数据;前端填写账号、密码和确认密码并同意协议,无需邮箱。上游要求的缺省邮箱由服务端生成为 `账号@91dj.local`;实际已绑定邮箱仍用于找回密码。 -- 绑定账号为 6–20 位字母或数字,密码为 8–64 位且包含字母和数字;登录兼容旧账号的 4 位密码及绑定允许的较长账号、密码,支持邮箱登录。 -- 登录失败保留原身份;成功后更新账户并重新读取当前页面。自动游客、登录和退出响应串行处理,旧请求的失效结果不会清除客户端刚登录的身份。 -- 游客请求明确返回会话失效时重建游客并重试一次;正式账号失效会清理会话并提示登录。登录、注册、找回密码自身的错误不触发游客恢复。 -- 退出清理会话,并跳过紧接着一次页面初始化的自动游客登录。当前页面保持未登录,主动登录或绑定可恢复使用。 -- 表单提交期间禁用重复提交;支持显示/隐藏密码,关闭和成功后均清除密码值。仅设备与渠道写本地存储,凭证保留在 HttpOnly Cookie。 +- 首次访问自动建立游客会话;已有 Cookie 时先读取 `auth/getInfo` 恢复身份,接口未返回新 token 时继续使用原 token。 +- 游客使用持久设备标识,发送 `devID` 和渠道;首次渠道取 `dc/ch/pc`,后续访问保持不变。服务端按参考项目发送设备头,并透传有效的客户端 IP。 +- 会话失效时(包括旧版本遗留的已登录 Cookie)清理会话并重建游客后重试一次,不再提示登录。仅设备与渠道写本地存储,凭证保留在 HttpOnly Cookie。 ## 已接入 @@ -171,44 +165,38 @@ JSON-LD 参考 `huangguo.com` 的品牌节点及参考项目 `seoser/jsonld.go` - 短剧运营分类、剧集视频列表、榜单、专题、题材/标签、分页和更多列表。 - 搜索、搜索联想、热搜、猜你喜欢;搜索记录单独保存在当前浏览器。 - 短剧详情、章节列表、章节权限和实际播放地址;HLS 播放、媒体代理和播放上报。 -- 游客会话、登录、注册/游客绑定、找回密码、资料与头像更新。 -- 个人中心统计、收藏、历史、点赞、已购列表;点赞、收藏、评论、回复、评论点赞。 -- 金币/VIP 套餐、支付方式、订单创建、余额查询和逐集解锁。 -- 应用列表、下载配置、固定平台说明页、反馈提交。 +- 游客会话;点赞、收藏、分享。评论已删除,详情页和播放页的评论区换成“推荐视频”(`playlet/guess-like/list`,12 部)。 +- 全部短剧和视频免费观看:前端不再识别 `needUnlock`/`needVip`/`payType`/`canWatch`,只要接口返回了视频地址就直接播放,选集里没有付费角标。接口没返回地址的章节显示“本集视频暂未开放”,有免费预告时可看预告。**付费章节目前后端不返回 `videoUrl`,需要在后台把这些章节设为免费后才能播放。** +- 应用列表、下载配置、固定平台说明页。 首页“推荐 / 最新 / 热门 / 随机”筛选项保持移除。栏目排序、列表数据、总数与观看权限由接口决定,失败时显示错误或空状态。 首页动态栏目沿用 HTML 的模块间距(桌面 48px、移动端 32px)与卡片网格,首个栏目不再复用原稿图文混排区域的选择器。首页封面统一为 3:4,图片居中裁切,避免接口方图、竖图混排时卡片高度不齐,并在图片解密加载前预留封面高度。 -全站以 `91短剧-2组 (3).html` 的页面结构和样式为基准:短剧、剧集、专题、题材/标签、更多列表和搜索页沿用原稿网格、标题、筛选栏和封面框;排行榜使用原稿数字角标、五列布局及窄屏断点,排名按接口分页顺序连续计算,榜单 tab 保持独立路由。搜索关键词只在已转义的标题中高亮。 +全站以原稿 HTML 的页面结构和样式为基准:短剧、剧集、专题、题材/标签、更多列表和搜索页沿用原稿网格、标题、筛选栏和封面框;排行榜使用原稿数字角标、五列布局及窄屏断点,排名按接口分页顺序连续计算,榜单 tab 保持独立路由。搜索关键词只在已转义的标题中高亮。 专题列表与专题详情按 HTML 直接展示卡片和分页,不增加“最新专题 / 热门专题”或“编辑推荐 / 最新 / 最热”等分类选项。 搜索结果由本项目(`JHA-1047`)的 `src/lib/client/search.ts` 和 `src/lib/seo-server.ts` 实现:服务端准备会话后调用 `playlet/search`,传入 `keyword/pageNum/pageSize`,默认每页 25 条;展示接口总数、关键词和实际 `pageSize`,剧名优先使用 `playName`,不再本地筛选接口结果。无结果优先展示 `everyoneWatching`,缺少推荐时请求 `playlet/hot/list`;推荐不计入搜索数量。`/search/` 可直接进入,空关键词跳过搜索接口,翻页使用 `/search/{关键词}/page/{页码}/`,搜索框、热搜、搜索历史和联想词入口均直接生成关键词路径,不通过重定向转换。标题高亮沿用 HTML 的 NFKC、大小写和空白处理;无结果/失败状态使用原稿插图,接口错误保留重试入口,不伪装为零结果。 -个人中心、收藏、历史、点赞与已购页共用原稿的头像/金币余额卡片、资料入口、书架导航与卡片列表;个人中心默认展示真实观看历史,分页链接进入历史页。设置页恢复头像编辑、昵称保存和账号安全卡片,资料、头像、密码仍通过原有接口保存;登录/绑定弹窗恢复原稿输入框、眼睛图标与按钮层级。页脚与桌面导航采用新版 HTML 的排版。 +“关于我们、用户协议、隐私政策、常见问题、2257、DMCA”六页固定使用 `src/lib/info-pages.ts` 中的原 HTML 文案与结构,不再请求富文本接口,底部入口也保持固定。每次访问均由服务端输出正文、标题和对应样式标记,无须等待首页或富文本接口。保留分节间距、折叠问答、编号段落和 `mailto:` 邮箱链接。 -“关于我们、用户协议、隐私政策、常见问题、2257、DMCA”六页固定使用 `src/lib/info-pages.ts` 中的原 HTML 文案与结构,不再请求富文本接口,底部入口也保持固定。每次访问均由服务端输出正文、标题和对应样式标记,无须等待首页或富文本接口。保留分节间距、折叠问答、编号段落和 `mailto:` 邮箱链接,反馈链接直接使用 `/info/feedback/`。 +联系方式与其他黄果站点一致,全站只展示官方 TG `@jbd125`(`https://t.me/jbd125`,`src/lib/site.ts` 的 `OFFICIAL_TG_HANDLE`/`OFFICIAL_TG_URL`):关于我们的“联系我们”、DMCA 联系方式、页脚和侧栏图标、导航页“官方TG”、回家的路“保持联系”、详情页官方链接以及结构化数据 `sameAs`。不再读取后台的 `telegram`、`tgGroup`、`twitterAddr`、邮箱或页脚 `contactList`,也不展示 X、邮箱和 TG 群。 -“关于我们”的“联系我们”沿用 HTML 分节和段落样式:商务合作读取 `config.telegram`(兼容 `telegramAdd`),用户反馈读取 `config.tgGroup`,空值再取 `newAddressInfo`;不使用邮箱或在线客服地址代替 TG。服务时间等附加说明读取 `config/footer/info` 的 `footerInfo.contactList`。这些内容随正文一起由服务端输出,未配置的项目不展示。 -反馈页恢复原稿的问题选项、环境/设备面板、描述计数、上传区域和提交区。实际提交通过 `feedback/add`,环境信息随描述保存;图片通过现有 `upload/image` 上传,支持最多 3 张、每张 5MB 以内的 JPG/PNG/WebP,不展示接口尚未支持的视频上传。上传失败不清空表单,提交时阻止重复写入,离开页面后隔离迟到的结果。 +本站 UI 为了收录和与其他黄果站点区分,使用独立的 `hg-*` 组件(`src/lib/client/render.ts`、`detail.ts`、`player-markup.ts`,样式在 `globals.css` 末尾): -详情页结构按原 HTML 调整:封面与资料卡、热度图标和标签、播放/下载与互动操作栏、三行简介展开/收起、选集横向分段和金币角标、官方链接、评论及嵌套回复。移动端复用原稿的封面、四列操作栏与五列选集布局;无下载配置时只显示播放入口,无推荐数据时不留空侧栏。内容和章节 ID 继续由接口提供,评论分页保持独立路由。 - -支付和解锁均由用户在页面确认后发起;创建订单不会直接把本地余额改为“支付成功”,余额通过用户信息接口刷新。 - -充值页按 `91短剧-2组 (3).html#info/deposit` 展示余额与金币用途卡片、套餐面板、推荐角标、选中标记、独立支付按钮和交易明细。先选择接口套餐,再点击“立即支付”打开确认弹窗;价格、赠送金币与流水收支读取真实字段,不使用原稿的模拟金额和交易记录。桌面端四列、移动端三列套餐,交易明细继续使用独立分页路由。 - -充值确认弹窗按原 HTML 展示订单摘要、赠送/合计金币、金额徽标、支付渠道图标与选中圆点、“去支付”按钮和确认说明。金币数读取 `baseCoin/giftCoin/totalCoin`,价格按接口分单位换算;仅展示套餐配置的支付方式。切换样式按钮会同步实际下单参数,提交期间禁止重复下单。金币和 VIP 下单成功后自动在新标签页打开支付地址;原页保留“打开支付页面”供再次打开同一订单,以及“我已完成支付,刷新余额”。点击去支付时先预留标签页以避免异步弹窗拦截,下单失败或离开页面时关闭等待页,浏览器禁止新窗口时自动在当前页继续支付。创建订单后仍需用户完成真实支付。 - -详情和播放页点击金币集数,直接打开原 HTML 样式的解锁弹窗,读取所选章节的最新权限、余额和价格;价格优先使用 `costCoins`,其次 `singleCoins`。确认后提交该集的 `chapterId/playletId`,成功后刷新余额并进入对应播放页;余额不足进入充值,会员章节进入会员套餐。读取期间禁止支付,支付期间禁止重复提交或切换目标;关闭弹窗、切换集数或离开页面会隔离迟到的读取结果。已允许观看的章节仍使用真实播放链接。 +- 短剧卡片 `card()`:`
`,整卡一个链接,`title` 为“《剧名》全N集 在线观看”,海报 alt 为“《剧名》海报”,可见标题、题材标签、简介、热度和集数角标;榜单显示排名数字。 +- 推荐视频条目 `videoItem()`:横向缩略图加 `

` 标题链接、题材/集数/热度和三行简介,用于详情页和播放页的“推荐视频”区。 +- 首页 banner `hero()`:主图区输出当前推荐的 `

` 标题链接、题材/集数/热度、简介和“立即观看”;右侧 `
    ` 列出全部 banner 的真实详情链接(首次点击切换主图,再次点击进入详情),只有 1 个 banner 时隐藏列表。 +- 详情页:海报 + `

    `、“《剧名》全N集在线观看”导语、`
    ` 信息表(类型链接、集数、热度、收藏、点赞)、操作区;随后是“《剧名》剧情简介”“《剧名》全集列表”“推荐视频”和官方链接。 +- 播放页:播放器(桌面端限高居中)、“剧名 第N集” `

    `、同一信息表与操作、剧情简介、全集列表(链接带“《剧名》第N集” title)、推荐视频。 App 下载入口(顶部、悬浮图标、首页底部、详情页和 `/navigation/`)统一校验配置。配置返回前隐藏入口;没有有效的 HTTP(S) 下载链接时不展示。电脑端直接点击链接下载,已移除悬浮二维码面板和触发脚本;移动端保留点击下载弹窗,二维码只在实际点击时生成。 图片解密由本项目(`JHA-1047`)的 `src/lib/client/images.ts` 实现:使用相同密钥对前 100 字节做 XOR,识别 JPEG、PNG、GIF、WebP,并兼容未加密图片。封面、轮播、题材、广告、应用图标、用户/评论头像和视频 poster 统一处理;接口原图放在 `data-src` / `data-poster`,完成解密后展示 Blob URL。本地素材和下载二维码保持直接加载。移动端并发 2、桌面端并发 4,首屏主图和弹窗优先;共享请求与缓存、视口懒加载、12 秒超时及占位图回退,页面离开时释放 Blob URL。 -播放逻辑由本项目(`JHA-1047`)的 `src/lib/client/player.ts`、`src/lib/client/playback.ts` 和 `src/lib/api/media.ts` 实现:绝对地址直接播放,相对地址走 `/h5/m3u8/`;Safari 优先原生 HLS,其余浏览器优先 hls.js,无 MSE 时再尝试原生 HLS。保留移动端内联属性,HLS 致命错误最多恢复 3 次,重试会重建播放器;切换预告、正片或离开路由时销毁旧实例。锁定章节可看配置的免费预告,正片按 `canWatch` 和参考项目的旧字段兼容规则判定;金币解锁需用户确认,成功后重新获取账户与章节,预告不提交正片观看上报。上一集/下一集使用接口的真实章节 ID。 +播放逻辑由本项目(`JHA-1047`)的 `src/lib/client/player.ts`、`src/lib/client/playback.ts` 和 `src/lib/api/media.ts` 实现:绝对地址直接播放,相对地址走 `/h5/m3u8/`;Safari 优先原生 HLS,其余浏览器优先 hls.js,无 MSE 时再尝试原生 HLS。保留移动端内联属性,HLS 致命错误最多恢复 3 次,重试会重建播放器;切换预告、正片或离开路由时销毁旧实例。正片只要接口返回有效 `videoUrl` 即可播放(不判断付费字段),没有地址时可看配置的免费预告;预告不提交正片观看上报。上一集/下一集使用接口的真实章节 ID。 H.264/AVC 与 H.265/HEVC 使用 `hls.js` 1.7.3 完整版解析,保留 HEVC MPEG-2 TS 支持(参考项目为 1.6.13 完整版)。多编码清单按设备能力保留 H.264、`hvc1`、`hev1`,不强制改写编码或限制为 H.264。编码不兼容时在 hls.js 与原生 HLS 之间各尝试一次,保留签名与播放位置;普通网络/密钥错误仍走原有恢复逻辑。无可用解码方式时显示编码不支持提示。H.265 的实际解码依赖浏览器、系统及设备能力,前端不提供转码或软件解码器,参见 [hls.js 官方说明](https://github.com/video-dev/hls.js/blob/v1.7.3/README.md)。 @@ -255,27 +243,14 @@ SMOKE_PUBLIC_ONLY=1 PREVIEW_URL=http://127.0.0.1:21021 npm run smoke:api - `src/lib/api/page-session.ts`:页面会话准备及同一次请求的 Cookie 传递。 - `src/lib/api/public-cache.ts`:有上限的公共数据缓存、过期刷新及并发合并。 - `src/lib/site-shared-data.ts`:首屏公开配置和页脚数据白名单。 -- `src/lib/client/`:共享页面模板及轮播、播放、登录、支付、下载等浏览器交互。 +- `src/lib/client/`:共享页面模板及轮播、播放、下载等浏览器交互。 - `public/scripts/site-runtime.js`:原稿布局、移动端菜单和播放器控件。 -- `public/assets/`:本地品牌、图标和空状态素材。 +- `public/assets/`:本地品牌、图标和空状态素材。黄果吃瓜 logo 为 `hgcg-logo.png`(500×176 比例,左侧图标、右侧字标),悬浮 App 图标为 `hgcg-app-icon.png`;`favicon.png`、`apple-touch-icon.png`、`src/app/icon.png` 和分享图 `og-default.png` 均由同一黄果图标生成。 - `tests/api-integration.test.mjs`:SSR、鉴权隔离和代理边界测试。 - `tests/routing.test.mjs`:路径解析、搜索关键词编码、hash 地址不转换与原生页面导航测试。 - `src/lib/client/startup.ts` 与 `tests/startup.test.mjs`:年龄确认、广告队列和会话进度,以及控制器与浏览器事件适配测试。 -## 埋点 +## 已删除的功能 -按照 [Web SDK v1.2.0 文档](https://doc2.adcenteryyds.cc/web/getting-started.html) 、[飞书埋点规范](https://djprsdgo4i4n.jp.larksuite.com/wiki/X8sjwbzs2ib01Ak2TWzj9Y94pFd)(已通过 Google Chrome 读取,包含 2026-10-17 更新)为本项目(`JHA-1047`)接入,官方 SDK 固定保存在 `public/scripts/web-sdk-v1.2.0.js`。应用 ID 默认 `1047`,可通过 `NEXT_PUBLIC_TRACKER_APP_ID` 配置,必须与当前站点密文和上游应用一致;初始化优先读取 `config/info.reportSdkConfig`,可选 `NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG` 作为同项目的密文备用配置。缺少配置或 SDK 加载失败时,业务页面继续工作。 +已移除 Web SDK 埋点(含 `X-SDK-Common`、`X-Tracker-*` 请求头透传)、意见反馈/在线客服、充值与 VIP、个人中心(收藏/历史/点赞/已购/设置)、登录注册以及付费章节解锁。对应页面返回 404,代理白名单不再放行 `auth/login`、`auth/register`、`auth/resetPassword`、`auth/profile`、`coin/*`、`vip/*`、`recharge/*`、`playlet/chapter/unlock`、个人列表和 `upload/image`。 -- SDK 自动采集生命周期、网络和会话;关闭自动 PV/点击,由接入层按真实路径上报,避免重复。支持首页、榜单、分页、专题、搜索、账户、信息页和独立导航页;登录、游客恢复和退出后同步 UID,渠道沿用首次归因。 -- 内容曝光以可见元素为准,关闭的弹窗、被模态弹窗遮挡的页面、后台标签页和轮播副本不计入;关闭弹窗或恢复标签页后重新观察尚未曝光的元素。短剧、专题和普通福利应用均有曝光、点击;内容无父级时 `parent_item_id` 使用 `0`,满足 SDK 的必填非空字符串校验。 -- 广告保留接口广告代码和广告位字段,上报 `adImpression/adClick`;页面广告、大图弹窗、宫格弹窗按实际展示位置分别去重,避免同一广告出现在宫格时被首页曝光记录吞掉。宫格仅统计滚动区域内可见的项目。两种弹窗另按参考项目协议上报 `advertising` 的 `show/click/close` 行为;只关闭实际曝光过的项目,同一展示只记一次关闭,关闭不算广告点击。福利应用有 `advitiseId` 时使用该广告 ID 上报,没有广告关联时按普通内容统计。 -- 搜索成功后上报关键词与实际总数,结果点击使用含页码的全局位置;未接推荐引擎的追踪字段保留空串。顶部、侧栏、独立入口页渠道和 App 下载入口记录导航点击。 -- 短剧使用 `dramaEvent/dramaStatusChange`,记录展示、播放、暂停、快进/快退、完成、分享、切集和成功解锁;独立视频使用 `videoEvent`。终止播放失败分别上报 `ep_failed/video_failed`(播放失败),自动恢复中的中间错误和预告失败不作为正片失败上报。短剧完播同时补报 `ep_play`,进度固定 100%,保留最后一段播放时长。播放时长按实际播放区间累计,排除缓冲和免费预告,进度为百分比,倍速乘以 100。 -- 所有同源业务 API 请求携带 SDK 原始公共字段 `X-SDK-Common`,保留 SDK 返回的完整公共字段,包括应用、渠道、UID、数值时间戳、会话、设备、指纹和版本等;注册、登录、充值及 VIP 下单都使用同一份字段格式。字段来自 `WebSDK.getCommonFields()`,不重新生成指纹或会话 ID,等待最多 1.5 秒。 -- 点赞、收藏、评论、购买由上游服务端上报,前端传入 `X-Tracker-Request-Id/X-Tracker-Event-Name/X-DC-Request-Context`,包含完整公共字段和目标剧集上下文。Next.js 代理校验应用 ID、事件对应接口和字段结构后透传;游客重试复用原始快照和请求 ID,不额外从客户端发送业务成功事件。 - -SDK 未初始化时最多缓存 1000 条事件,配置到达后按顺序补发;配置接口的首次请求不等待 SDK 加载,避免互相等待,首次 SDK 脚本失败后在取得配置时再尝试加载。SDK 返回字段校验失败、事件不在允许列表、地址不可用或异常时,仅触发脱敏的 `tracker:diagnostic` 事件,不向浏览器控制台输出。自带 SDK 仅移除了三处控制台警告,保留字段校验、HTTPS 地址限制和配置解密失败兜底;网络重试和持久队列由官方 SDK 负责。 - -埋点回归使用 SDK 替身及项目自带官方 SDK 的真实字段校验器;浏览器验证使用同一 SDK 的事件地址参数,将签名后的测试记录发送到本机接收端,不向真实统计后台发送测试事件。生产环境还需在广告中心为当前应用的 `reportSdkConfig` 配置业务域名反向代理地址(SDK 的 `batchUrls`),由部署层转发到文档指定的生产批量上报接口,不能让客户端直连生产上报域名。代理需保留请求体、真实来源 IP 和 SDK 签名;目前未变更线上域名或 Nginx 配置。 - -“我的点赞”入口位于头像菜单和个人中心书架导航,路由为 `/member/likes/`,分页使用 `/member/likes/page/N/`。服务端通过当前账号请求 `GET /api/app/playlet/like/list?pageNum=N&pageSize=24`,列表不进入公开缓存或搜索索引;空列表显示原 HTML 的空状态和发现入口,接口失败显示重试状态。 diff --git a/config/development.env b/config/development.env index 846f819..5c7f0ba 100644 --- a/config/development.env +++ b/config/development.env @@ -2,8 +2,6 @@ APP_ENV=development PORT=21021 # Server-only Go API origin. Browser requests use the current site's /api/*. -UPSTREAM_API_URL=http://172.104.181.99:21022 +UPSTREAM_API_URL=https://webhgcgapi.mfcg.me API_CHANNEL= PUBLIC_DATA_CACHE_TTL_MS=0 -NEXT_PUBLIC_TRACKER_APP_ID=1047 -NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG= diff --git a/config/production.env b/config/production.env index 7dfbb6d..0d0231f 100644 --- a/config/production.env +++ b/config/production.env @@ -2,8 +2,6 @@ APP_ENV=production PORT=21021 # Server-only Go API origin. Browser requests use the current site's /api/*. -UPSTREAM_API_URL=http://172.104.56.28:26125 +UPSTREAM_API_URL=https://webhgcgapi.mfcg.me API_CHANNEL= PUBLIC_DATA_CACHE_TTL_MS=60000 -NEXT_PUBLIC_TRACKER_APP_ID=1047 -NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG= diff --git a/config/test.env b/config/test.env index 060cce5..7de0ef3 100644 --- a/config/test.env +++ b/config/test.env @@ -2,8 +2,6 @@ APP_ENV=test PORT=21021 # Server-only Go API origin. Browser requests use the current site's /api/*. -UPSTREAM_API_URL=http://172.104.181.99:21022 +UPSTREAM_API_URL=https://webhgcgapi.mfcg.me API_CHANNEL= PUBLIC_DATA_CACHE_TTL_MS=60000 -NEXT_PUBLIC_TRACKER_APP_ID=1047 -NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG= diff --git a/docs/api-contract.md b/docs/api-contract.md index e0210b2..f77ccff 100644 --- a/docs/api-contract.md +++ b/docs/api-contract.md @@ -1,6 +1,6 @@ # 91av 页面接口对照 -核对日期:2026-10-21。来源:[当前 Swagger](https://91av-wz.80sygtm.com/swagger/index.html)。上游地址通过 `API_BASE_URL` 配置,默认 `https://91av-wz.80sygtm.com`;下表省略 `/api/app/` 前缀。 +核对日期:2026-10-21。来源:[当前 Swagger](https://91av-wz.80sygtm.com/swagger/index.html)。上游地址通过 `UPSTREAM_API_URL` 配置,默认 `https://webhgcgapi.mfcg.me`;下表省略 `/api/app/` 前缀。 | 页面 | 接口及关键参数 | | --- | --- | @@ -18,23 +18,16 @@ | 短剧详情 | `playlet/detail` 传 `slug` 或 `id`;`playlet/chapter/list` 传 `playletSlug` 或 `playletId` | | 详情推荐 | `playlet/guess-like/list`;必须传当前 `playletId`,不依赖详情中未定义的推荐字段 | | 章节播放 | `playlet/chapter/detail`;`chapterId` 加 `playletSlug` 或 `playletId`,使用实时观看权限、费用、余额及视频地址。章节 SEO 优先于整剧 SEO | -| 评论 | `comment/list`;`objectId,objectType,pageNum,pageSize,sortOrder`;整剧类型 10、章节类型 11 | -| 收藏、历史、已购 | `playlet/collect/list`、`playlet/history/list`、`playlet/bought/list`;`pageNum,pageSize`;服务端使用 `auth/getInfo` 恢复当前账号,直接输出列表 | -| 账号设置 | `auth/profile`;头像上传 `upload/image`,使用返回的 `sourceNameFs` | -| 充值、VIP | `recharge/package/list`;读取真实套餐金额(分)、金币及支付渠道;余额明细 `coin/trans/list` 使用 `page,pageSize,type` | | 福利应用 | `applist/list?categoryId=…`;保留分类锚点及空分类隐藏逻辑 | -| 回家的路、独立导航 | `config/info` 的永久地址、备用线路、TG、App 链接;没有 App 地址时隐藏下载入口 | -| 关于等六个信息页 | 按既有要求保留 HTML 静态正文;联系我们使用配置中的商务 TG 与 TG 群,服务时间可取 `config/footer/info` | +| 回家的路、独立导航 | 站点地址固定 `https://huangguocg.com/`,联系方式固定官方 TG `@jbd125`;`config/info` 只提供导航介绍和 App 链接,没有 App 地址时隐藏下载入口 | +| 关于等六个信息页 | 按既有要求保留 HTML 静态正文;联系我们与 DMCA 只展示官方 TG `@jbd125` | ## 写接口 2026-10-22 本项目(`JHA-1047`)调整内容地址:链接优先使用非空 slug,缺少时使用 ID,保留尾斜杠和独立分页。专题详情接口仍必填 ID,slug 路由先分页查询专题目录解析 ID,再读取详情;目录故障返回服务错误,不伪装成专题不存在。详情评论和推荐等只支持数字 ID 的接口在详情返回后使用真实 ID;支持 slug 的章节请求继续并行。canonical、面包屑、选集和 ItemList 使用对应主地址,旧 ID 地址不新增转向 slug 的重定向。 -登录、绑定和找回密码使用 `auth/login`、`auth/register`、`auth/resetPassword`;凭证保存在 HttpOnly Cookie。整剧点赞/收藏传 `id` 和布尔状态,章节点赞/收藏只传 `chapterId` 和布尔状态。解锁传 `playletId,chapterId`,仍在用户确认后提交。评论发送、点赞、观看报告的字段按各自请求模型发送。 +只使用游客会话 `auth/guest`,凭证保存在 HttpOnly Cookie;登录、注册、找回密码、资料修改、充值/VIP 下单和章节解锁已删除,代理不再放行。整剧点赞/收藏传 `id` 和布尔状态,章节点赞/收藏只传 `chapterId` 和布尔状态。评论发送、点赞、观看报告的字段按各自请求模型发送。 -金币下单 `coin/buy`、VIP 下单 `vip/pay` 均使用 `packageId,payMode`,支付渠道只取套餐配置。没有在真实服务上创建订单、付费解锁、注册账号、发送评论或提交反馈。 - -反馈按 `proto.FeedbackReq` 模型:1 建议、2 Bug、3 体验、4 账号、5 其他;操作描述仍写旧的四类,与模型不一致,本次以请求模型为准。问题正文与附加环境信息合计最多 500 字,优先完整保留用户正文。 ## 已移除的旧接口依赖 diff --git a/docs/indexation-policy.md b/docs/indexation-policy.md index 4fb8c20..652d3fc 100644 --- a/docs/indexation-policy.md +++ b/docs/indexation-policy.md @@ -15,22 +15,21 @@ | 范围 | 设置 | | --- | --- | | 内部搜索、导航入口、回家的路、福利应用 | `noindex,follow` | -| 个人中心、收藏、历史、已购、设置、充值/VIP、反馈 | `noindex,nofollow` | -| 非默认有效排序变体、非默认评论排序 | `noindex,follow`,沿用原有例外规则 | -| 详情和播放页的评论分页,页码大于 1 | `noindex,follow` | +| 个人中心、充值/VIP 等已删除页面 | 返回 404 | +| 非默认有效排序变体 | `noindex,follow`,沿用原有例外规则 | | 接口成功确认 `totalCount=0` 的公开列表第一页 | `noindex,follow`,继续返回 200 | | 缺少独立栏目信息的更多列表、纯解锁或无有效正片的播放页 | `noindex,follow`,继续提供原页面 | -noindex 页面不输出 canonical、head 中的 prev/next 或内容 JSON-LD;正文的选集、评论、分页链接继续提供。作品详情没有评论时仍可索引,评论数为 0 不等于作品为空。 +noindex 页面不输出 canonical、head 中的 prev/next 或内容 JSON-LD;正文的选集、推荐、分页链接继续提供。作品详情没有评论时仍可索引,评论数为 0 不等于作品为空。 ## 去重和结构化数据 - 同 ID 的 `/theme/{id}/` 与 `/topics/{id}/` 当前读取相同资源,以 `/topics/{id}/` 为 canonical。两条路由都可直接访问,不新增重定向。 - 自动生成的专题卡片与 ItemList 链接使用 `/topics/{id}/`;后台明确配置的 `moreUrl` 保留原值。 - 数字资源 ID 的前导零在 canonical 与播放实体 URL 中归一;普通分页仍保留自己的页码。搜索关键词不进行数字归一。 -- canonical 仍仅取配置的永久域名,去除跟踪参数;`/rank/`、`/page/1/` 继续使用既有主地址。 +- canonical 固定使用 `https://huangguocg.com`,去除跟踪参数;`/rank/`、`/page/1/` 继续使用既有主地址。 - 2026-10-22 起内容主地址优先使用接口的非空 slug,缺少时使用 ID。ID 地址仍直接提供内容,其 canonical 与结构化数据指向该内容的 slug 主地址;评论与操作请求继续使用真实数字 ID。 -- 可索引的付费播放页标记 `isAccessibleForFree:false` 与 `hasPart.cssSelector:.play-paywalled-content`,选择器对应真实播放器容器,不改变样式。 +- 全部内容免费:有正片地址的播放页即可索引,TVEpisode/VideoObject 标记 `isAccessibleForFree:true`,不再输出付费区域标记。 - VideoObject 只在真实媒体源、有效日期与封面均存在时输出。无权观看的媒体地址不进入 SEO 数据;不编造视频日期或媒体源。 ## 状态码与验证 diff --git a/docs/sitemap-backend-contract.md b/docs/sitemap-backend-contract.md index 611033d..aca9db5 100644 --- a/docs/sitemap-backend-contract.md +++ b/docs/sitemap-backend-contract.md @@ -9,7 +9,7 @@ ## 1. 域名与通用约定 - `D` 表示正式站点的 origin,即协议、域名和可选端口,不带末尾 `/`。 -- 域名优先取 `config.config.foreverUrlAddr`;无有效值时取 `config.newAddressInfo.foreverUrlAddr`。移除配置中的路径、查询参数和锚点,与前端 canonical 保持一致。 +- 域名固定为 `https://huangguocg.com`,与前端 canonical(`src/lib/site.ts` 的 `SITE_ORIGIN`)保持一致,不读取 `foreverUrlAddr`。 - 不使用 API 域名、CDN 域名、请求 Host、临时访问域名或本地地址作为页面域名。 - 生成任务没有有效正式域名时,不猜测域名;暂停本次发布并保留上一份成功结果。 - 页面 URL 以 `/` 结尾;sitemap 中使用绝对地址 `D + 规范路径`。 @@ -93,8 +93,8 @@ sitemap 提交页面 URL,不写入用户凭证或受限媒体源。 - 更多栏目当前使用有限首页栏目快照:类型 `1` 取实际作品列表,类型 `3` 取实际专题列表,以实际条目数为 `totalCount`。SEO 层取 `pageSize = max(24, totalCount)`,因此当前只发布栏目基础地址,不生成 `/config/{key}/page/2/` 等额外分页。 - 第一页只提交基础地址,不额外提交 `/page/1/`。 - 第 2 页及以后保留自己的 canonical,例如 `/shorts/page/2/`,不统一归并到第一页。 -- 作品详情和播放页的 `/page/{n}/` 是评论分页;`n > 1` 时不进入 sitemap。 -- 搜索、收藏、历史、已购和充值即使有分页,也不进入 sitemap。 +- 作品详情和播放页没有分页(评论已删除),`/page/{n}/` 返回 404,不进入 sitemap。 +- 搜索即使有分页,也不进入 sitemap;个人中心和充值页已删除。 ## 4. Canonical 规则 @@ -152,13 +152,6 @@ sitemap 提交页面 URL,不写入用户凭证或受限媒体源。 | 独立入口 | `/navigation/` | `noindex,follow` | | 回家的路 | `/home-road/` | `noindex,follow` | | 福利应用 | `/apps/` | `noindex,follow` | -| 个人中心 | `/member/center/`、`/info/user-center/` | `noindex,nofollow` | -| 收藏 | `/member/favorites/`,包括分页 | `noindex,nofollow` | -| 历史 | `/member/history/`,包括分页 | `noindex,nofollow` | -| 已购 | `/member/purchased/`,包括分页 | `noindex,nofollow` | -| 账号设置 | `/member/settings/`、`/info/settings/` | `noindex,nofollow` | -| 充值及 VIP | `/info/deposit/`、`/info/deposit/vip/`,包括支持的分页 | `noindex,nofollow` | -| 意见反馈 | `/info/feedback/` | `noindex,nofollow` | 以上页面及其参数变体均不进入 sitemap。 @@ -176,13 +169,11 @@ sitemap 提交页面 URL,不写入用户凭证或受限媒体源。 | 情况 | 当前前端行为 | 后端生成处理 | | --- | --- | --- | | 空公开列表 | 接口成功确认 `totalCount=0` 时,第一页 `noindex,follow`,仍返回 200 | 不提交 | -| 详情或播放页评论分页 | `/detail/{key}/page/{n}/`、`/play/{key}/{chapterId}/page/{n}/`,`n>1` 时 `noindex,follow` | 不提交 | | 非默认列表排序 | 除榜单和更多栏目外,公开列表 `sort != 1` 时 noindex | 只生成无参数的默认地址 | | 非法列表排序 | 公开列表的 `sort` 不属于 `1、2、3` 时 noindex;未传时默认 `1` | 不生成非法变体 | -| 非默认评论排序 | 存在 `commentSort` 且值不等于字符串 `2` 时 noindex | 不生成参数变体 | | 更多栏目内容不足或无效 | 已存在栏目缺少自己的标题、正文简介或有效卡片时 `noindex,follow`;找不到启用的类型 `1/3` 栏目时按资源缺失处理 | 不提交 | | 播放页条件不足 | 预告、纯解锁提示、无有效正片或无观看权限时 `noindex,follow` | 不提交 | -| 明确禁止索引或需要登录 | `indexable=false` 或 `loginRequired=true` 时 noindex | 不提交 | +| 明确禁止索引 | `indexable=false` 时 noindex | 不提交 | | 无效路由或不存在的资源 | 返回 404,且无 canonical | 不提交 | | 已确认越界的分页 | 返回 404,且无 canonical | 不提交 | | 临时取数故障 | `failed` 或 `unavailable` 时返回 500,且无 canonical | 不将故障误判为删除;保留上次成功结果,稍后重试 | @@ -190,7 +181,7 @@ sitemap 提交页面 URL,不写入用户凭证或受限媒体源。 补充约定: - 榜单和更多栏目可以接受 `sort=2/3`,但 canonical 仍不含参数;sitemap 不重复提交这些参数地址。 -- 作品详情的评论数为 0,不等于作品内容为空,不能按空列表规则排除作品详情。 +- 推荐视频为空不等于作品内容为空,不能按空列表规则排除作品详情。 - 不存在的内容与临时故障必须区分;无法可靠判断一批内容时,不发布因取数失败而缺项的新结果。 ## 7. 建议的生成与发布约定 diff --git a/docs/verification.md b/docs/verification.md index 11b8ff9..5350407 100644 --- a/docs/verification.md +++ b/docs/verification.md @@ -171,3 +171,21 @@ H.264/H.265 兼容测试另覆盖 MSE/原生 HLS 编码错误回退、签名与 浏览器使用真实页面及未修改的官方 SDK,测试专用包装通过 SDK 支持的单次事件地址参数把请求送入本机接收端,避开官方域名解析器对配置地址的 HTTPS 要求。已验证大图广告展示/点击、宫格展示/点击、页面访问、内容曝光,以及原生页面跳转前的内容点击均实际发出带 `event_sig` 的网络记录。UI 点击和弹窗滚动经浏览器执行,未向正式统计后台发测试事件。未验证正式部署的反向代理和统计后台入库结果。 最终验证:测试环境构建(含 TypeScript)及全部 323 项回归测试通过。最后一轮本机浏览器验证收到 78 条带签名的 SDK 事件,其中 `advertising` 为 show 21、click 2、close 21;大图广告的三种行为均到达,宫格关闭只覆盖实际曝光的广告,关闭未增加 `ad_click`。另外一轮已确认原生页面跳转前的 `app_pageitem_click` 实际到达,内容父级字段为字符串 `0`。所有网络验证仅使用本地模拟业务数据和本地测试签名配置。 + +## 2026-10-27 移除埋点与客服、切换接口域名 + +删除 Web SDK 及埋点适配层、`X-SDK-Common`/`X-Tracker-*` 请求头透传、内容与广告的追踪属性和相关环境变量;删除意见反馈页(`/info/feedback/` 返回 404)、`feedback/add` 代理白名单、页脚/侧栏/播放页/充值页的反馈与客服入口及样式。上游接口统一为 `https://webhgcgapi.mfcg.me`;配置和快照都没有永久域名时,canonical 使用 `https://huangguocg.com`。类型检查、生产构建通过;除部署脚本测试因中文目录名被 URL 编码导致找不到 `node_modules` 外,其余测试全部通过。 + +## 2026-10-27 删除充值、用户中心、登录与付费解锁;品牌与联系方式 + +删除充值/VIP(`/info/deposit/*`)、个人中心(`/member/*`、`/info/user-center/`、`/info/settings/`)、登录注册/找回密码/退出、头像与资料修改以及付费章节解锁;对应页面返回 404,代理白名单只保留游客会话与浏览、点赞、收藏、评论所需接口。旧版本遗留的已登录 Cookie 失效后自动换成游客,不再提示登录。付费集保留锁定标记和免费预告,播放区提示“本集为付费内容,暂不可观看”。 + +站点地址(canonical、sitemap、导航页线路与永久入口、回家的路、详情页官方地址)固定为 `https://huangguocg.com`;导航站名固定为“黄果吃瓜”,页面上写死的“91短剧”改为“黄果吃瓜”;logo、favicon、touch icon、App 图标与分享图换成黄果图标。联系方式与其他黄果站点一致,只保留官方 TG `@jbd125`。类型检查、生产构建通过,307 项测试中除部署脚本测试(中文目录名被 URL 编码,环境问题,改动前同样失败)外全部通过。 + +## 2026-10-27 详情页、播放页、卡片与首页 banner 改版;评论改为推荐视频 + +为收录及与其他黄果站点区分,短剧卡片、推荐视频条目、首页 banner、详情页和播放页改用独立的 `hg-*` 结构和样式:全部内容由服务端输出,使用 `article`、`h1/h2/h3`、`dl` 信息表、描述性链接 title 与“《剧名》海报”类 alt;首页 banner 以 `
      ` 输出全部推荐的真实详情链接;详情/播放页增加“剧情简介”“全集列表”“推荐视频”小标题。评论读取、发表、点赞及评论分页全部删除,`/detail|play/.../page/N/` 返回 404,代理不再放行 `comment/*`;评论区换成 `playlet/guess-like/list` 的 12 部推荐。桌面与 390px 手机宽度截图核对;类型检查、生产构建通过,除部署脚本环境问题外测试全部通过。 + +## 2026-10-27 全部短剧和视频免费观看 + +前端去掉付费判断:`chapterAccess` 只看接口是否返回有效视频地址,`needUnlock`/`needVip`/`payType`/`canWatch` 不再影响播放、选集链接、SSR 正片地址和索引;选集付费角标、`play-paywalled-content` 及 `isAccessibleForFree:false` 结构化数据删除,帮助中心常见问题改为“全部免费观看”。真实接口核对:付费章节(如 14193 第 2 集起)`chapter/detail` 返回 `videoUrl: ''`,地址由后端签名下发,需后台将章节设为免费后前端即可播放。 diff --git a/project.md b/project.md index e92e75d..27b4f07 100644 --- a/project.md +++ b/project.md @@ -1,5 +1,5 @@ --- -项目名称: 91短剧web +项目名称: 黄果吃瓜web 一级部门: 北斗 二级部门: 瑞升 @@ -48,7 +48,7 @@ DMP编码: JHA-1047 # 1. 项目说明 -91短剧 Web 项目,DMP 编码 **JHA-1047**,应用及埋点 App ID 为 **1047**。采用 Next.js App Router、React、TypeScript,实现 PC 和移动端响应式页面,布局依据提供的 HTML 原稿还原。 +黄果吃瓜 Web 项目,DMP 编码 **JHA-1047**,站点域名为 **huangguocg.com**。采用 Next.js App Router、React、TypeScript,实现 PC 和移动端响应式页面,布局依据提供的 HTML 原稿还原。 本文按当前仓库代码整理,更新日期为 **2026-10-26**;该日期不代表安全审计或线上验收时间。人员信息沿用原登记信息,部署目标以当前脚本默认值为准。 @@ -56,10 +56,10 @@ DMP编码: JHA-1047 - 首页动态栏目、轮播、顶部及侧栏导航、广告与宫格广告弹窗。 - 短剧列表、排行榜、专题、题材/标签、栏目更多页、搜索及独立分页。 -- 短剧详情、章节播放、HLS 播放、图片解密、点赞、收藏、评论与分享。 -- 游客/账号登录、个人中心、观看历史、我的收藏、我的点赞、已购剧集、账号设置。 -- 金币充值、VIP 套餐、章节解锁、反馈、App 下载、福利应用、回家的路和独立导航页。 -- 服务端 SEO 元数据、JSON-LD、robots.txt 与广告/页面/播放等埋点。 +- 短剧详情、章节播放、HLS 播放、图片解密、点赞、收藏与分享;详情/播放页以“推荐视频”代替评论。 +- 游客会话(已删除登录注册、个人中心、充值/VIP 和付费解锁)。 +- App 下载、福利应用、回家的路和独立导航页。 +- 服务端 SEO 元数据、JSON-LD、robots.txt。 本仓库负责网站页面、浏览器交互和服务端 API 代理,不包含 Go 业务服务、管理后台或数据库部署代码。独立“剧集”入口及 `/series/`、`/video/*` 页面已移除。 @@ -70,7 +70,7 @@ DMP编码: JHA-1047 | `src/app/` | App Router 页面、API/媒体代理、robots 和健康检查 | | `src/components/site/` | 首页、详情、播放、导航等页面组件 | | `src/lib/api/` | 上游配置、接口白名单、会话、公共缓存和媒体请求 | -| `src/lib/client/` | 登录、账户、播放、解锁、广告、图片及埋点交互 | +| `src/lib/client/` | 游客会话、播放、广告及图片交互 | | `src/lib/routing.ts` | 路由解析、slug/ID、分页地址与导航匹配 | | `src/lib/seo*.ts`、`src/lib/structured-data.ts` | TDK、canonical、索引策略、SEO 快照和 JSON-LD | | `src/proxy.ts` | 页面尾斜杠规范化和首屏会话准备 | @@ -84,8 +84,6 @@ DMP编码: JHA-1047 | 专题 / 标签 / 更多栏目 | `/topics/`、`/topics/{key}/`、`/tag/{key}/`、`/config/{key}/` | | 详情 / 播放 | `/detail/{key}/`、`/play/{key}/{chapterId}/` | | 搜索 | `/search/{keyword}/` | -| 个人中心及书架 | `/member/center/`、`/member/history/`、`/member/favorites/`、`/member/likes/`、`/member/purchased/` | -| 充值 / VIP | `/info/deposit/`、`/info/deposit/vip/` | | 官方入口 / 回家的路 / 福利应用 | `/navigation/`、`/home-road/`、`/apps/` | 内容地址优先使用有效英文/拼音 slug,无效或缺失时使用 ID;播放页章节段使用真实章节 ID。搜索词作为单个路径段编码。支持分页的页面使用 `/page/{N}/`,第一页使用基础路径;详情和播放页的分页对应评论。有效页面无尾斜杠访问返回 308,API、媒体和静态资源保留原路径。确认不存在的资源或越界分页返回 404,上游业务服务异常与资源不存在分别处理。 @@ -101,7 +99,7 @@ DMP编码: JHA-1047 - 浏览器请求本站 `/api/*`,Next.js 按白名单转发到 Go 后端的 `/api/app/*`。`UPSTREAM_API_URL` 仅服务端使用,`API_BASE_URL` 是兼容别名。 - `/h5/m3u8/*`、`/enkey`、`/newenkey` 由媒体代理处理,保留签名查询、客户端相关请求信息;媒体和密钥不缓存,不转发应用登录 Cookie 或 Authorization。 -登录会话通过 HttpOnly Cookie 传递;SSR 启动数据按字段白名单输出,不向浏览器暴露后端登录凭证。公共接口和账户、余额、订单、付费权限数据采用不同缓存策略。 +游客会话通过 HttpOnly Cookie 传递;SSR 启动数据按字段白名单输出,不向浏览器暴露后端登录凭证。公共接口和账户、余额、订单、付费权限数据采用不同缓存策略。 本仓库不直接连接 MongoDB、Redis 或 Elasticsearch。Go 后端是否使用这些中间件及其拓扑,由后端/运维文档确认;本仓库没有 Telegram Bot 部署通知实现。 @@ -109,9 +107,9 @@ DMP编码: JHA-1047 | 环境 | 配置文件 | Go API 上游 | 网站端口 | 构建目录 | | --- | --- | --- | --- | --- | -| 开发 | `config/development.env` | `http://172.104.181.99:21022` | `21021` | `.next-dev/` | -| 测试 | `config/test.env` | `http://172.104.181.99:21022` | `21021` | `.next-test/` | -| 生产 | `config/production.env` | `http://172.104.56.28:26125` | `21021` | `.next/` | +| 开发 | `config/development.env` | `https://webhgcgapi.mfcg.me` | `21021` | `.next-dev/` | +| 测试 | `config/test.env` | `https://webhgcgapi.mfcg.me` | `21021` | `.next-test/` | +| 生产 | `config/production.env` | `https://webhgcgapi.mfcg.me` | `21021` | `.next/` | 配置由 [scripts/next-env.mjs](scripts/next-env.mjs) 加载,优先级为:进程环境变量 > `config/{环境}.local.env` > `config/{环境}.env`。开发环境兼容旧 `.env.local`,优先级低于 `config/development.local.env`;测试和生产不从旧 `.env.local` 加载本站业务配置。 @@ -121,11 +119,10 @@ DMP编码: JHA-1047 - 公共配置、页脚、导航、分类和标签选项默认缓存 60 秒,首页缓存 30 秒,进程内最多 128 条并合并并发请求;开发配置关闭缓存。`PUBLIC_DATA_CACHE_TTL_MS=0` 可关闭,正数仅缩短既有缓存上限。 - 公共缓存按上游地址隔离,各实例独立;配置和首页刷新失败可沿用已成功的数据。账户及付费权限不进入公共缓存。 -- canonical 和站点身份取后台配置的永久域名,优先 `config.foreverUrlAddr`,其次 `newAddressInfo.foreverUrlAddr`。有效 SEO 配置保存在对应构建目录的 `cache/seo/`,异常时复用最近一次有效快照;不以 API IP 或访问 Host 作为正式域名。 -- 生产 `/robots.txt` 允许抓取公开资源,限制 `/api/` 和 `/healthz`;开发、测试禁止全站抓取。账户、充值、搜索、工具等页面另有页面级 `noindex` 规则。 -- 生产 robots 在取得有效永久域名后声明 `https://{永久域名}/sitemap.xml` 形式的绝对 URL。**本仓库没有 sitemap XML 生成或读取路由**;现有 XSL 和响应头配置不等于已提供 XML,需由后端/反向代理另行接入。规则见 [后端 Sitemap 对接约定](docs/sitemap-backend-contract.md)。 -- 导航、官方入口、商务 TG、用户反馈 TG 群、广告和下载地址由接口动态配置;未配置有效 App 下载链接时隐藏入口。 -- 埋点使用 App ID `1047`,优先读取接口 `reportSdkConfig`,构建配置 `NEXT_PUBLIC_TRACKER_ENCRYPTED_CONFIG` 为兜底;配置及上报链路需与后端保持一致。 +- canonical、sitemap 和页面展示的站点地址固定为 `https://huangguocg.com`(`src/lib/site.ts`),不读取后台 `foreverUrlAddr`。有效 SEO 配置保存在对应构建目录的 `cache/seo/`,异常时复用最近一次有效快照;不以 API IP 或访问 Host 作为正式域名。 +- 生产 `/robots.txt` 允许抓取公开资源,限制 `/api/` 和 `/healthz`;开发、测试禁止全站抓取。搜索、工具等页面另有页面级 `noindex` 规则。 +- 生产 robots 声明 `https://huangguocg.com/sitemap.xml`。**本仓库没有 sitemap XML 生成或读取路由**;现有 XSL 和响应头配置不等于已提供 XML,需由后端/反向代理另行接入。规则见 [后端 Sitemap 对接约定](docs/sitemap-backend-contract.md)。 +- 站名(导航页固定“黄果吃瓜”)、官方入口和联系方式(官方 TG `@jbd125`)固定;广告和下载地址由接口动态配置,未配置有效 App 下载链接时隐藏入口。 # 3. 运维部署 @@ -193,11 +190,11 @@ PREVIEW_URL=http://127.0.0.1:21021 npm run smoke:api | 风险点 | 影响及处理要求 | | --- | --- | -| 上游及反向代理配置错误 | SSR、登录或媒体可能失败;区分网站 `21021`、API `21022/26125` 和 SSH `22889`。本站 `/api/*` 应进入 Next.js,避免上游回环;如启用可选 `current` 模式,必须先确认 `/api/app/*` 转发到 Go。 | +| 上游及反向代理配置错误 | SSR、游客会话或媒体可能失败;区分网站 `21021`、API `21022/26125` 和 SSH `22889`。本站 `/api/*` 应进入 Next.js,避免上游回环;如启用可选 `current` 模式,必须先确认 `/api/app/*` 转发到 Go。 | | 播放签名、IP、UA 或密钥异常 | 可能出现播放 502;保留签名查询和客户端信息,检查真实上游响应,AES 密钥必须为 16 字节。H.265 解码受设备及浏览器限制,前端不提供转码。 | | 个人数据误入共享缓存 | 可能造成身份或权限混用;新增接口需延续公开数据与账户、订单、付费权限隔离,首屏输出遵守字段白名单。 | | 发布包平台或环境不匹配 | 生产需匹配 Linux 架构/libc,测试包需安装运行依赖;同名产物发布前核对配置和校验值。 | -| SEO 配置或 sitemap 未接入 | 测试环境禁止抓取;生产需核对 `APP_ENV`、永久域名、robots、页面索引标记及实际 sitemap 响应,不能只确认 Sitemap 声明。 | +| SEO 配置或 sitemap 未接入 | 测试环境禁止抓取;生产需核对 `APP_ENV`、robots、页面索引标记及实际 sitemap 响应,不能只确认 Sitemap 声明。 | | 服务器更新脚本未交接 | 本地脚本成功不等于业务验收通过;运维应提供远端脚本、服务管理、日志、监控告警及回退说明。 | # 5. 历史事故(可选) @@ -206,10 +203,9 @@ PREVIEW_URL=http://127.0.0.1:21021 npm run smoke:api # 6. 交接说明(可选) -- **应用标识**:DMP 为 `JHA-1047`;三套环境的 `NEXT_PUBLIC_TRACKER_APP_ID` 均为 `1047`,对接后台与 SDK 时保持一致。 +- **应用标识**:DMP 为 `JHA-1047`。 - **新增页面**:复用集中路由、slug/ID、分页和 SEO 规则,补充有效/缺失/异常状态处理。导航与下载入口优先消费动态配置,不写死演示链接。 -- **个人列表**:我的点赞入口为 `/member/likes/`,上游接口为 `GET /api/app/playlet/like/list`,与收藏、历史、已购共同保持私有响应及禁止索引。 -- **配置交接**:确认实际运行目录的私有覆盖、上游连通性、正式永久域名、TG 联系方式、广告、下载及埋点配置。新版本切换需保留服务器私有配置和对应 SEO 快照。 +- **配置交接**:确认实际运行目录的私有覆盖、上游连通性、广告及下载配置。新版本切换需保留服务器私有配置和对应 SEO 快照。 - **发布交接**:确认 SSH 权限、远端 `run.sh`/`rsupdate.sh`、服务管理名称、日志与回退方法;本文记录的是仓库默认值,不替代服务器实际配置验收。 - **待补登记**:最后审计人、最后审计时间、告警群,以及运维确认后的监控和事故台账;不将本次文档整理视为已完成审计。 - **参考资料**:[运行与部署说明](README.md)、[页面接口对照](docs/api-contract.md)、[索引策略](docs/indexation-policy.md)、[Sitemap 对接约定](docs/sitemap-backend-contract.md)。历史核对记录以其日期为界,当前配置和行为以代码为准。 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index db10c5b..a7bc649 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/assets/5178e628105b82b4.svg b/public/assets/5178e628105b82b4.svg deleted file mode 100644 index 781cdfa..0000000 --- a/public/assets/5178e628105b82b4.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/assets/6dd2c76631816aa2.svg b/public/assets/6dd2c76631816aa2.svg deleted file mode 100644 index 4d0e338..0000000 --- a/public/assets/6dd2c76631816aa2.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -APP 下载 \ No newline at end of file diff --git a/public/assets/hgcg-app-icon.png b/public/assets/hgcg-app-icon.png new file mode 100644 index 0000000..b6c0ca2 Binary files /dev/null and b/public/assets/hgcg-app-icon.png differ diff --git a/public/assets/hgcg-logo.png b/public/assets/hgcg-logo.png new file mode 100644 index 0000000..c6e04fc Binary files /dev/null and b/public/assets/hgcg-logo.png differ diff --git a/public/favicon.png b/public/favicon.png index ef90914..8741bf0 100644 Binary files a/public/favicon.png and b/public/favicon.png differ diff --git a/public/og-default.png b/public/og-default.png index 3a7e2b8..1a6df57 100644 Binary files a/public/og-default.png and b/public/og-default.png differ diff --git a/public/og-default.svg b/public/og-default.svg deleted file mode 100644 index c06453c..0000000 --- a/public/og-default.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/public/scripts/site-runtime.js b/public/scripts/site-runtime.js index 214bc45..5757f38 100644 --- a/public/scripts/site-runtime.js +++ b/public/scripts/site-runtime.js @@ -59,7 +59,7 @@ function installPlayerControls(screen,currentEpisode=1,actions={}){ async function retry(){overlay.querySelector('.ui-empty-state')?.remove();center.hidden=false;status.hidden=false;status.textContent='正在重新加载…';try{if(actions.retry)await actions.retry();else{video.load();await play()}}catch{status.textContent='视频加载失败,请重试';overlay.hidden=false}} async function fullscreen(){try{if(document.fullscreenElement)await document.exitFullscreen();else if(screen.requestFullscreen)await screen.requestFullscreen();else if(video.webkitEnterFullscreen)video.webkitEnterFullscreen();else throw Error()}catch{status.textContent='当前浏览器暂不支持全屏';overlay.hidden=false}} function closeMenus(){bar.querySelectorAll('[data-options]').forEach(e=>e.hidden=true);bar.querySelectorAll('[data-menu]').forEach(e=>e.setAttribute('aria-expanded','false'))} - screen.addEventListener('click',e=>{const b=e.target.closest('button');if(!b){if(e.target===video){closeMenus();play()}return}if(['previous','next'].includes(b.dataset.playAction)||b.hasAttribute('data-show-unlock'))return;e.stopPropagation();if(b.dataset.media==='retry')void retry();if(b.dataset.media==='toggle')play();if(b.dataset.media==='mute'){if(video.muted||!video.volume){video.muted=false;if(!video.volume)video.volume=.5}else video.muted=true;sync()}if(b.dataset.media==='fullscreen')fullscreen();if(b.dataset.menu){const menu=bar.querySelector('[data-options="'+b.dataset.menu+'"]'),open=menu.hidden;closeMenus();menu.hidden=!open;b.setAttribute('aria-expanded',String(open))}else if(b.dataset.speed){video.playbackRate=Number(b.dataset.speed);bar.querySelector('[data-menu="speed"]').textContent=b.dataset.speed==='1'?'倍速':b.dataset.speed+'×';bar.querySelectorAll('[data-speed]').forEach(e=>e.setAttribute('aria-checked',String(e===b)));closeMenus()}else closeMenus()}); + screen.addEventListener('click',e=>{const b=e.target.closest('button');if(!b){if(e.target===video){closeMenus();play()}return}if(['previous','next'].includes(b.dataset.playAction))return;e.stopPropagation();if(b.dataset.media==='retry')void retry();if(b.dataset.media==='toggle')play();if(b.dataset.media==='mute'){if(video.muted||!video.volume){video.muted=false;if(!video.volume)video.volume=.5}else video.muted=true;sync()}if(b.dataset.media==='fullscreen')fullscreen();if(b.dataset.menu){const menu=bar.querySelector('[data-options="'+b.dataset.menu+'"]'),open=menu.hidden;closeMenus();menu.hidden=!open;b.setAttribute('aria-expanded',String(open))}else if(b.dataset.speed){video.playbackRate=Number(b.dataset.speed);bar.querySelector('[data-menu="speed"]').textContent=b.dataset.speed==='1'?'倍速':b.dataset.speed+'×';bar.querySelectorAll('[data-speed]').forEach(e=>e.setAttribute('aria-checked',String(e===b)));closeMenus()}else closeMenus()}); seek.addEventListener('input',()=>{if(Number.isFinite(video.duration)&&video.duration>0){video.currentTime=Math.min(video.duration,Math.max(0,Number(seek.value)));sync()}}); volume.addEventListener('input',()=>{video.volume=Number(volume.value);video.muted=video.volume===0;sync()}); screen.addEventListener('keydown',e=>{if(e.target.matches('input,button'))return;if(e.code==='Space'){e.preventDefault();play()}else if(e.key.toLowerCase()==='m'){mute.click()}else if(e.key.toLowerCase()==='f')fullscreen();else if(['ArrowLeft','ArrowRight'].includes(e.key)&&Number.isFinite(video.duration)){e.preventDefault();video.currentTime=Math.min(video.duration,Math.max(0,video.currentTime+(e.key==='ArrowRight'?5:-5)));sync()}else if(e.key==='Escape')closeMenus()}); @@ -95,14 +95,14 @@ function installPlayerControls(screen,currentEpisode=1,actions={}){ const header=document.querySelector('#global-site-header .top'),sidebar=document.getElementById('site-sidebar');if(!header||!sidebar)return; const mobile=matchMedia('(max-width:760px)'),trigger=document.createElement('button');trigger.type='button';trigger.className='mobile-menu-trigger';trigger.setAttribute('aria-label','打开导航菜单');trigger.setAttribute('aria-controls','mobile-navigation-drawer');trigger.setAttribute('aria-expanded','false');trigger.innerHTML='';header.prepend(trigger); const drawer=document.createElement('dialog');drawer.id='mobile-navigation-drawer';drawer.setAttribute('aria-label','网站导航'); - drawer.innerHTML='
      '; + drawer.innerHTML='
      '; const brand=sidebar.querySelector('.sidebar-brand').cloneNode(true);brand.removeAttribute('class');drawer.querySelector('.mobile-drawer-brand').append(brand); const nav=drawer.querySelector('.mobile-drawer-links'); const sourceNavigation=sidebar.querySelector('[data-site-navigation="sidebar"]'); if(sourceNavigation)nav.innerHTML=sourceNavigation.innerHTML; nav.querySelectorAll('a[data-page]').forEach(link=>{link.dataset.mobileRoute=link.dataset.page;link.dataset.siteNav='sidebar';}); const pcInfo=sidebar.querySelector('.side-info');if(pcInfo)drawer.querySelector('.mobile-drawer-info').innerHTML=pcInfo.innerHTML; - const footerLogo=drawer.querySelector('.mobile-drawer-info .side-info-wordmark');if(footerLogo){const brandText=document.createElement('span');brandText.className='mobile-drawer-brand-text';brandText.textContent='91短剧';footerLogo.replaceWith(brandText);} + const footerLogo=drawer.querySelector('.mobile-drawer-info .side-info-wordmark');if(footerLogo){const brandText=document.createElement('span');brandText.className='mobile-drawer-brand-text';brandText.textContent='黄果吃瓜';footerLogo.replaceWith(brandText);} sidebar.querySelectorAll('.sidebar-social a').forEach(link=>drawer.querySelector('.mobile-drawer-social').append(link.cloneNode(true))); document.body.append(drawer);let timer=null,start=null; function finishClose(){clearTimeout(timer);timer=null;drawer.classList.remove('is-closing');if(drawer.open)drawer.close();document.body.classList.remove('mobile-drawer-open');trigger.setAttribute('aria-expanded','false')} diff --git a/public/scripts/web-sdk-v1.2.0.js b/public/scripts/web-sdk-v1.2.0.js deleted file mode 100644 index f2268b8..0000000 --- a/public/scripts/web-sdk-v1.2.0.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).WebSDK=t()}(this,function(){"use strict";function e(e){var t,n,r,o,i,a,s,c,u,l,d,_,p,f,h,g,m,y,v,w,k,b,C,S,P=function(e){var t,n,r,o,i,a;for(t=(null==e?"":e)+"",n=[],r=0;t.length>r;r++)128>(o=t.charCodeAt(r))?n.push(o):2048>o?n.push(192|o>>6,128|63&o):55296>o||o>56319||r+1>=t.length||56320>(i=t.charCodeAt(r+1))||i>57343?n.push(224|o>>12,128|o>>6&63,128|63&o):(n.push(240|(a=i-56320+(o-55296<<10)+65536)>>18,128|a>>12&63,128|a>>6&63,128|63&a),r++);return n}((null==e?"":e)+""),E=8*P.length;for(P.push(128);P.length%64!=56;)P.push(0);for(t=0;8>t;t++)P.push(E>>>8*t&255);for(n=function(e,t){return e<>>32-t},r=function(e,t){return((e>>>0)+(t>>>0)&4294967295)>>>0},o=function(e,t,n,o){return r(r(e,t),r(n,o))},i=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21],a=Array(64),s=0;64>s;s++)a[s]=Math.floor(4294967296*Math.abs(Math.sin(s+1)))>>>0;for(c=1732584193,u=4023233417,l=2562383102,d=271733878,_=0;P.length>_;_+=64){for(p=Array(16),f=0;16>f;f++)p[f]=(P[h=_+4*f]|P[h+1]<<8|P[h+2]<<16|P[h+3]<<24)>>>0;for(g=c,m=u,y=l,v=d,w=0;64>w;w++)16>w?(k=m&y|~m&v,b=w):32>w?(k=v&m|~v&y,b=(5*w+1)%16):48>w?(k=m^y^v,b=(3*w+5)%16):(k=y^(m|~v),b=7*w%16),C=v,v=y,y=m,m=r(m,n(o(g,k,a[w],p[b]),i[w])),g=C;c=r(c,g),u=r(u,m),l=r(l,y),d=r(d,v)}return S=function(e){for(var t="",n=0;4>n;n++)t+=(256+(e>>>8*n&255)).toString(16).slice(1);return t},S(c)+S(u)+S(l)+S(d)}function t(e,t){return(e>>>t|e<<32-t)>>>0}function n(e,t,n){return(e&t^~e&n)>>>0}function r(e,t,n){return(e&t^e&n^t&n)>>>0}function o(e){return(t(e,2)^t(e,13)^t(e,22))>>>0}function i(e){return(t(e,6)^t(e,11)^t(e,25))>>>0}function a(e){return(t(e,7)^t(e,18)^e>>>3)>>>0}function s(e){return(t(e,17)^t(e,19)^e>>>10)>>>0}function c(e){for(var t=(e>>>0).toString(16);8>t.length;)t="0"+t;return t}function u(e,t){return((255&e[t])<<24|(255&e[t+1])<<16|(255&e[t+2])<<8|255&e[t+3])>>>0}function l(e){for(var t=function(e){var t,c,l,d,_,p,f,h,g,m,y,v,w,k,b,C,S,P,E,T,x,D=e.slice(),M=0,I=8*D.length>>>0;for(D.length>=536870912&&(M=Math.floor(D.length/536870912),0==(I=D.length%536870912*8>>>0)&&D.length>0&&M--),D.push(128);D.length%64!=56;)D.push(0);for(D.push(M>>>24&255,M>>>16&255,M>>>8&255,255&M,I>>>24&255,I>>>16&255,I>>>8&255,255&I),t=1779033703,c=3144134277,l=1013904242,d=2773480762,_=1359893119,p=2600822924,f=528734635,h=1541459225,g=0;D.length>g;g+=64){for(y=Array(64),m=0;16>m;m++)y[m]=u(D,g+4*m);for(m=16;64>m;m++)y[m]=s(y[m-2])+y[m-7]+a(y[m-15])+y[m-16]>>>0;for(v=t,w=c,k=l,b=d,C=_,S=p,P=f,E=h,m=0;64>m;m++)T=E+i(C)+n(C,S,P)+zt[m]+y[m]>>>0,x=o(v)+r(v,w,k)>>>0,E=P,P=S,S=C,C=b+T>>>0,b=k,k=w,w=v,v=T+x>>>0;t=t+v>>>0,c=c+w>>>0,l=l+k>>>0,d=d+b>>>0,_=_+C>>>0,p=p+S>>>0,f=f+P>>>0,h=h+E>>>0}return[t,c,l,d,_,p,f,h]}(e||[]),l="",d=0;t.length>d;d++)l+=c(t[d]);return l}function d(e){return l(function(e){var t,n,r,o,i,a;for(t=(null==e?"":e)+"",n=[],r=0;t.length>r;r++)128>(o=t.charCodeAt(r))?n.push(o):2048>o?n.push(192|o>>6,128|63&o):55296>o||o>56319||r+1>=t.length||56320>(i=t.charCodeAt(r+1))||i>57343?n.push(224|o>>12,128|o>>6&63,128|63&o):(n.push(240|(a=i-56320+(o-55296<<10)+65536)>>18,128|a>>12&63,128|a>>6&63,128|63&a),r++);return n}((null==e?"":e)+""))}function _(e){var t,n,r,o,i,a;for(t=(null==e?"":e)+"",n=[],r=0;t.length>r;r++)128>(o=t.charCodeAt(r))?n.push(o):2048>o?n.push(192|o>>6,128|63&o):55296>o||o>56319||r+1>=t.length||56320>(i=t.charCodeAt(r+1))||i>57343?n.push(224|o>>12,128|o>>6&63,128|63&o):(n.push(240|(a=i-56320+(o-55296<<10)+65536)>>18,128|a>>12&63,128|a>>6&63,128|63&a),r++);return n}function p(e){for(var t=(null==e?"":e)+"",n=[],r=0;t.length>r;r+=2)n.push(parseInt(t.substr(r,2),16));return n}function f(e,t){var n,r=Array(e.length+t.length);for(n=0;e.length>n;n++)r[n]=e[n];for(n=0;t.length>n;n++)r[e.length+n]=t[n];return r}function h(e,t){var n,r;return null===e?"__t:null__":"string"==typeof e?"__t:str__:"+e:"number"==typeof e&&isFinite(e)?"__t:num__:"+e:"boolean"==typeof e?"__t:bool__:"+(e?"1":"0"):Array.isArray(e)?-1!==t.indexOf(e)?"__t:circular__":(t.push(e),n="["+e.map(function(e){return h(e,t)}).join(",")+"]",t.splice(t.indexOf(e),1),n):null!==e&&"object"==typeof e?-1!==t.indexOf(e)?"__t:circular__":(t.push(e),r="{"+Object.keys(e).sort().map(function(n){return n+":"+h(e[n],t)}).join(",")+"}",t.splice(t.indexOf(e),1),r):"__t:any__:"+e}function g(e){return h(e,[])}function m(t){var n,r=t||{},o=Object.keys(r).filter(function(e){return"event_id"!==e}).sort();return o.length?(n=o.map(function(t){return e(g(r[t]))}).join(""),e(n)):e("")}function y(){if("undefined"==typeof navigator)return"PC";var e=navigator.userAgent||"";return/iPhone|iPad|iPod/i.test(e)?"iOS":function(e){return/HarmonyOS|OpenHarmony/i.test((null==e?"":e)+"")}(e)||/Android/i.test(e)?"Android":"PC"}function v(e){var t=((null==e?"":e)+"").trim();return t&&/^\d+\.\d+\.\d+$/.test(t)?t:"1.0.0"}function w(e,t){return null==e||""===e?"":"int"===t?parseInt(e,10)+"":(e+"").replace(/^\s+|\s+$/g,"").toLowerCase()}function k(e,t){try{return e()}catch(e){return t}}function b(t){return e((null==t?"":t)+"").substr(0,32)}function C(e){return b((e||[]).slice().sort().join("|"))}function S(){return k(function(){var e,t,n,r,o,i,a,s="undefined"!=typeof OfflineAudioContext?OfflineAudioContext:"undefined"!=typeof webkitOfflineAudioContext?webkitOfflineAudioContext:null;if(!s)return"";if((t=(e=new s(1,44100,44100)).createOscillator()).type="triangle",t.frequency.value=1e4,n=e.createDynamicsCompressor(),t.connect(n),n.connect(e.destination),t.start(0),(r=e.startRendering())&&"function"==typeof r.then)return"";if(!r||!r.getChannelData)return"";for(o=r.getChannelData(0),i=0,a=4500;5e3>a&&o.length>a;a++)i+=Math.abs(o[a]);return b(i+"")},"")}function P(){return k(function(){function e(e){var t,n=document.createElement("span");return n.style.cssText="position:absolute;left:-9999px;top:-9999px;visibility:hidden;font-size:72px;font-family:"+e+",monospace;",n.textContent="mmmmmmmmmmlli",document.body.appendChild(n),t=n.offsetWidth,document.body.removeChild(n),t}var t,n,r,o;if("undefined"==typeof document||!document.body)return{hash:"",installed:[],count:-1};for(t=e("monospace"),n=[],r=0;$t.length>r;r++)e("'"+(o=$t[r])+"'")!==t&&n.push(o);return n.sort(),{hash:C(n.map(function(e){return e.toLowerCase()})),installed:n,count:n.length}},{hash:"",installed:[],count:-1})}function E(){return k(function(){var e,t,n,r,o,i,a;if("undefined"==typeof document)return{hash:"",supported:[]};for(e=document.createElement("video"),t=document.createElement("audio"),n=[],r=0;Zt.length>r;r++){i="video"===(o=Zt[r]).kind?e:t,a="";try{a=i.canPlayType?(i.canPlayType(o.type)||"")+"":""}catch(e){}a&&"no"!==a&&n.push(o.type+":"+a)}return n.sort(),{hash:C(n.map(function(e){return e.toLowerCase()})),supported:n}},{hash:"",supported:[]})}function T(e){var t;try{return"undefined"==typeof window?0:(t="session"===e?window.sessionStorage:window.localStorage)?(t.setItem("__sdk_probe__","1"),t.removeItem("__sdk_probe__"),1):0}catch(e){return 0}}function x(){try{return"undefined"!=typeof indexedDB?1:0}catch(e){return 0}}function D(){try{return"undefined"!=typeof navigator&&navigator.serviceWorker?1:0}catch(e){return 0}}function M(e){return/Trident|MSIE/i.test(e=(e||"")+"")?"trident":/Edge\/\d/i.test(e)&&!/Edg\//i.test(e)?"edgehtml":/Edg\//i.test(e)||/Chrome\//i.test(e)&&!/Edg\//i.test(e)?"chromium":/Firefox\//i.test(e)?"gecko":/Safari\//i.test(e)&&!/Chrome\//i.test(e)?"webkit":"unknown"}function I(e,t){return t=(t||"")+"",/HarmonyOS|OpenHarmony/i.test(e=(e||"")+"")?"harmonyos":/iPhone|iPad|iPod/i.test(e)?"ios":/Android/i.test(e)?"android":/Mac OS X|Macintosh/i.test(e)||/^Mac/i.test(t)?"macos":/Windows/i.test(e)||/^Win/i.test(t)?"windows":/Linux/i.test(e)||/Linux/i.test(t)?"linux":"unknown"}function A(e){return/iPad|Tablet/i.test(e=(e||"")+"")?"tablet":/Mobile|iPhone|Android/i.test(e)?"phone":"desktop"}function O(e){var t,n,r;for(e=(e||"")+"",t=[[/EdgiOS\/([\d.]+)/i,"Edge"],[/CriOS\/([\d.]+)/i,"Chrome"],[/FxiOS\/([\d.]+)/i,"Firefox"],[/Edg\/([\d.]+)/i,"Edge"],[/OPR\/([\d.]+)/i,"Opera"],[/Chrome\/([\d.]+)/i,"Chrome"],[/Firefox\/([\d.]+)/i,"Firefox"],[/Version\/([\d.]+).*Safari/i,"Safari"]],n=0;t.length>n;n++)if(r=e.match(t[n][0]))return{browser_name:t[n][1],browser_version:r[1]||"unknown"};return{browser_name:"unknown",browser_version:"unknown"}}function L(){var e=k(function(){var e,t="undefined"!=typeof screen?screen:null;if(t&&t.orientation&&t.orientation.type)return t.orientation.type+"";if("undefined"!=typeof window&&"number"==typeof window.orientation){if(0===(e=window.orientation)||180===e)return"portrait-primary";if(90===e||-90===e)return"landscape-primary"}return t&&null!=t.width&&null!=t.height?t.width>t.height?"landscape-primary":"portrait-primary":"unknown"},"unknown");if(-1!==e.indexOf("landscape"))return"landscape";if(-1!==e.indexOf("portrait"))return"portrait";try{if("undefined"!=typeof screen&&null!=screen.width&&null!=screen.height){if(screen.width>screen.height)return"landscape";if(screen.widthu;u++){l=s[u];try{null!=(d=t[l])&&(c[l]=t.getParameter(d)+"")}catch(e){}}for(_=Object.keys(c).sort(),p=[],f=0;_.length>f;f++)p.push((h=_[f])+"="+c[h]);return g=b(p.join("|")),m=b([n,r,a,g].join("|")),{vendor:n,renderer:r,extensions_hash:a,params_hash:g,webgl_fp:m}},{vendor:"",renderer:"",extensions_hash:"",params_hash:"",webgl_fp:""}),H=F.webgl_fp||"",U=S(),X=k(function(){var e,t,n;if("undefined"==typeof navigator||!navigator.plugins)return"";for(e=[],t=0;t0?Math.round(t):-1},-1),J=(R.platform||"")+"",Q=0;try{Q=R.plugins?R.plugins.length:0}catch(R){}e=G.count,t=H?"available":"unavailable",n=!0===R.webdriver?1:0,r=0,o=0;try{K&&K.documentElement&&(r=K.documentElement.clientWidth||B.innerWidth||0,o=K.documentElement.clientHeight||B.innerHeight||0)}catch(R){}i=0,(1===n||"available"!==t&&0===Q&&e>=0&&2>=e&&(0>=r||0>=o))&&(i=1),a="";try{"undefined"!=typeof Intl&&Intl.DateTimeFormat&&(a=Intl.DateTimeFormat().resolvedOptions().timeZone||"")}catch(R){}s=function(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(R){return""}}(),c="",u="",l="";try{"undefined"!=typeof location&&(c=location.hostname||"",u=location.pathname||"",location.search&&(l=b(location.search)))}catch(R){}_=function(e){var t,n=((e||"")+"").trim();if(!n)return{referer_domain:"",referer_path:""};try{return{referer_domain:(t=new URL(n)).hostname||"",referer_path:t.pathname||""}}catch(e){return{referer_domain:"",referer_path:""}}}(d=K&&K.referrer?K.referrer+"":""),p=function(e){var t,n,r,o;if(t=(e=e||{}).userAgent,/iPhone|iPad|iPod/i.test(t=(t||"")+"")&&!/CriOS\/|FxiOS\/|EdgiOS\/|OPiOS\//i.test(t)&&/Version\/[\d.]+.*Safari/i.test(t))return O(e.userAgent);try{if((n=e.userAgentData&&e.userAgentData.brands)&&n.length)for(r=0;n.length>r;r++)if((o=(n[r].brand||"")+"")&&"Chromium"!==o&&0!==o.indexOf("Not")&&"Not.A/Brand"!==o)return{browser_name:o,browser_version:(n[r].version||"unknown")+""}}catch(e){}return O(e.userAgent)}(R),f=z.supported?z.supported.length:-1,g=Math.round(96*(h=B.devicePixelRatio||1)),m=-1;try{null!=R.hardwareConcurrency&&R.hardwareConcurrency>0&&(m=R.hardwareConcurrency)}catch(R){}y=m,v=-1;try{null!=R.deviceMemory&&R.deviceMemory>0&&(v=Math.round(10*R.deviceMemory)/10)}catch(R){}return w=j&&j.type?j.type+"":"unknown",C=R.maxTouchPoints||0,{platform:"web",os_family:I(V,J),device_type:A(V),browser_kernel:M(V),browser_name:p.browser_name,browser_version:p.browser_version,browser_platform:J,display_mode:k(function(){return"undefined"==typeof window||"function"!=typeof window.matchMedia?"unknown":window.matchMedia("(display-mode: standalone)").matches?"standalone":window.matchMedia("(display-mode: fullscreen)").matches?"fullscreen":window.matchMedia("(display-mode: minimal-ui)").matches?"minimal-ui":"browser"},"unknown"),visibility_state:k(function(){if("undefined"==typeof document)return"unknown";var e=document.visibilityState;return"visible"===e||"hidden"===e?e:"unknown"},"unknown"),screen_width:q.width||0,screen_height:q.height||0,screen_dpi:g,device_pixel_ratio:Math.round(100*h),orientation:L(),viewport_width:r>0?Math.round(r):-1,viewport_height:o>0?Math.round(o):-1,color_depth:q.colorDepth||0,max_touch_points:C,touch_support:C>0?1:0,hardware_concurrency:m,cpu_cores:y,device_memory_gb:v,is_debug:0,language:R.language||"",timezone:a,cookie_enabled:R.cookieEnabled?1:0,local_storage_enabled:T("local"),session_storage_enabled:T("session"),indexeddb_enabled:x(),service_worker_enabled:D(),network_type:"unknown",connection_type:w,effective_type:j&&j.effectiveType?j.effectiveType+"":"unknown",downlink:j&&null!=j.downlink?Math.round(1e3*j.downlink):-1,rtt:j&&null!=j.rtt?j.rtt:-1,canvas_fp:N,webgl_fp:H,webgl_vendor:F.vendor||"",webgl_renderer:F.renderer||"",webgl_extensions_hash:F.extensions_hash||"",webgl_params_hash:F.params_hash||"",audio_fp:U,audio_sample_rate:W>0?W:44100,fonts:G.installed||[],fonts_hash:G.hash,plugins:Y,plugins_hash:X,mimes:z.supported||[],mimes_hash:z.hash,mime_count:f,plugin_count:Q,font_count:e,webgl_status:t,has_webdriver:n,is_headless:i,headless_reason:i?n?"webdriver":"composite":"",current_url:s,current_domain:c,current_path:u,current_query_hash:l,referer:d,referer_domain:_.referer_domain,referer_path:_.referer_path}}function q(e){return null==e?"":e+""}function B(e){var t=e||{},n={app_id:(t.appId||"")+"",uid:null!=t.uid?t.uid:0,channel:(t.channel||"")+"",sid:(t.sid||"")+"",client_ts:Math.floor(Date.now()/1e3),device:(t.deviceType||"PC")+"",device_id:(t.deviceId||"")+"",device_brand:(t.deviceBrand||"")+"",device_model:(t.deviceModel||"")+"",device_fingerprint:(t.deviceFingerprint||"")+"",fp_version:(t.fpVersion||"")+"",user_agent:"undefined"!=typeof navigator&&navigator.userAgent||"",sdk_version:(t.sdkVersion||"")+"",app_version:(t.appVersion||"1.0.0")+""};return null!=t.deviceEnv&&(n.device_env=t.deviceEnv),n}function K(){var e,t,n,r=new Uint8Array(16);if("undefined"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(r);else for(e=0;16>e;e++)r[e]=Math.floor(256*Math.random());for(t="",n=0;r.length>n;n++)t+=("0"+r[n].toString(16)).slice(-2);return t}function V(){try{return!("undefined"==typeof window||!window.sessionStorage||(window.sessionStorage.setItem("__sdk_ss_ping__","1"),window.sessionStorage.removeItem("__sdk_ss_ping__"),0))}catch(e){return!1}}function j(){if(!un){if(un=!0,function(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem("__web_sdk_ping__","1"),window.localStorage.removeItem("__web_sdk_ping__"),0))}catch(e){return!1}}())try{window.localStorage.removeItem(rn)}catch(e){}if("undefined"!=typeof document&&"string"==typeof document.cookie)try{var t="path=/;max-age=0;SameSite=Lax";"undefined"!=typeof location&&"https:"===location.protocol&&(t+=";Secure"),document.cookie=encodeURIComponent(on)+"=;"+t}catch(e){}}}function N(t){j();var n=function(e){return JSON.stringify({sid:e.sid,sessionStartTs:e.sessionStartTs,lastValidBehaviorAt:e.lastValidBehaviorAt})}(t);if(V())try{window.sessionStorage.setItem(tn,t.sid),window.sessionStorage.setItem(nn,n)}catch(e){}cn=t}function F(){if(cn)return cn;j();var t=null;if(V())try{t=window.sessionStorage.getItem(nn)}catch(e){}return cn=t?function(t){try{var n=JSON.parse(t);return n&&n.sid?{sid:n.sid+"",sessionStartTs:"number"==typeof n.sessionStartTs?n.sessionStartTs:Date.now(),lastValidBehaviorAt:"number"==typeof n.lastValidBehaviorAt?n.lastValidBehaviorAt:Date.now()}:null}catch(e){return null}}(t):null,cn}function H(e){return{sid:K(),sessionStartTs:e,lastValidBehaviorAt:e}}function U(e){return"number"==typeof e&&isFinite(e)?1e12>e?1e3*e:e:null}function X(e,t,n){var r=U(e.sessionStartTs)||n,o=U(e.lastValidBehaviorAt)||r,i=n;return"idle"===t?i=Math.min(i=Math.max(r,o+an),n):"forced"===t&&(i=Math.min(r+sn,n)),Math.max(r,i)}function Y(e,t,n){var r,o;return n=n||Date.now(),r=U(e.sessionStartTs)||n,o=X(e,t,n),{sid:e.sid,sessionStartTs:r,lastValidBehaviorAt:U(e.lastValidBehaviorAt)||r,sessionEndTs:o,endReason:t}}function G(e){var t,n,r,o,i;return e=e||Date.now(),(t=F())?(r=e-t.sessionStartTs>sn,e-t.lastValidBehaviorAt>an||r?(o=Y(t,r?"forced":"idle",e),N(i=H(e)),{sid:i.sid,isNew:!0,endedSession:o}):{sid:t.sid,isNew:!1}):(N(n=H(e)),{sid:n.sid,isNew:!0})}function z(){var e=F();return e?e.sid:""}function W(){cn=null}function J(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem(dn,"1"),window.localStorage.removeItem(dn),0))}catch(e){return!1}}function Q(){var t,n;if(!J())return Promise.resolve(_n||"NULL");try{return(t=window.localStorage.getItem(ln))&&/^[0-9a-f]{32}$/.test(t)?Promise.resolve(t):(n=function(){var e,t,n,r=new Uint8Array(16);if("undefined"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(r);else for(e=0;16>e;e++)r[e]=Math.floor(256*Math.random());for(t="",n=0;r.length>n;n++)t+=("0"+r[n].toString(16)).slice(-2);return t}(),window.localStorage.setItem(ln,n),_n=n,Promise.resolve(n))}catch(e){return Promise.resolve("NULL")}}function $(t,n){n&&(t.audio_fp=n),fn=t;var r=function(){if(!J())return"";try{var t=window.localStorage.getItem(pn);if(t&&/^[0-9a-f]{16,64}$/i.test(t))return t.toLowerCase()}catch(e){}return""}();return r?hn=r:(hn=function(e){var t,n,r,o,i,a;for(t=e||{},n={screen_width:1,screen_height:1,screen_dpi:1,device_pixel_ratio:1,color_depth:1,max_touch_points:1,cpu_cores:1,cookie_enabled:1,local_storage_enabled:1,session_storage_enabled:1,indexeddb_enabled:1,service_worker_enabled:1},r={canvas_fp:1,webgl_fp:1,audio_fp:1,fonts_hash:1,plugins_hash:1,mimes_hash:1},o=[],i=0;Qt.length>i;i++)o.push((a=Qt[i])+"="+w(t[a],n[a]?"int":r[a]?"hash":"string"));return d("fp_v3|fingerprint_platform=web|"+o.join("|"))}(t),function(t){if(t&&J())try{window.localStorage.setItem(pn,t)}catch(e){}}(hn)),{snapshot:t,fingerprint:hn}}function Z(){return fn&&hn?Promise.resolve({snapshot:fn,fingerprint:hn}):gn||(gn=new Promise(function(e){k(function(){var t,n,r,o,i="undefined"!=typeof OfflineAudioContext?OfflineAudioContext:"undefined"!=typeof webkitOfflineAudioContext?webkitOfflineAudioContext:null;i?((n=(t=new i(1,44100,44100)).createOscillator()).type="triangle",n.frequency.value=1e4,r=t.createDynamicsCompressor(),n.connect(r),r.connect(t.destination),n.start(0),(o=t.startRendering())&&"function"==typeof o.then?o.then(function(t){for(var n=t.getChannelData(0),r=0,o=4500;5e3>o&&n.length>o;o++)r+=Math.abs(n[o]);e(b(r+""))}).catch(function(){e("")}):e(S())):e("")},e(""))}).then(function(e){return $(R(),e)}).catch(function(){return $(R(),"")}),gn)}function ee(){return hn}function te(){return Wt}function ne(){return mn.digest()}function re(){try{if("undefined"!=typeof screen&&screen.orientation&&screen.orientation.type){var t=screen.orientation.type+"";if(-1!==t.indexOf("landscape"))return"landscape";if(-1!==t.indexOf("portrait"))return"portrait"}if("undefined"!=typeof screen&&null!=screen.width&&null!=screen.height){if(screen.width>screen.height)return"landscape";if(screen.width0?Math.round(n):-1}catch(e){return-1}}function ie(e,t){var n=t.accumulated_ms||0;return null!=t.resume_at_ms&&(n+=Math.max(0,e-t.resume_at_ms)),n}function ae(){return xn.pageSeqCounter++,xn.currentPageSeq=xn.pageSeqCounter,xn.currentPageSeq}function se(){try{return!("undefined"==typeof window||!window.sessionStorage||(window.sessionStorage.setItem("__sdk_metrics_ping__","1"),window.sessionStorage.removeItem("__sdk_metrics_ping__"),0))}catch(e){return!1}}function ce(e){var t,n=e||xn;return{eventCountTotal:n.eventCountTotal||0,businessEventCount:n.businessEventCount||0,pageViewCount:n.pageViewCount||0,pageClickCount:n.pageClickCount||0,networkChangeCount:n.networkChangeCount||0,backgroundCount:n.backgroundCount||0,pageKeys:le({},n.pageKeys||{}),pageStayList:(n.pageStayList||[]).slice(),pageSeqCounter:n.pageSeqCounter||0,currentPageSeq:n.currentPageSeq||0,lastEventName:n.lastEventName||"",scrollTotalCount:n.scrollTotalCount||0,scrollTotalDistance:n.scrollTotalDistance||0,scrollUpCount:n.scrollUpCount||0,scrollDownCount:n.scrollDownCount||0,scrollDirectionChangeCount:n.scrollDirectionChangeCount||0,lastScrollDirection:n.lastScrollDirection||0,firstScrollDelayMs:null!=n.firstScrollDelayMs?n.firstScrollDelayMs:-1,hasScrolled:!!n.hasScrolled,maxScrollDepthPercent:n.maxScrollDepthPercent||0,isReachBottom:n.isReachBottom||0,keydownTotalCount:n.keydownTotalCount||0,inputCount:n.inputCount||0,focusTotalCount:n.focusTotalCount||0,firstInteractionDelayMs:null!=n.firstInteractionDelayMs?n.firstInteractionDelayMs:-1,firstInteractionRecorded:!!n.firstInteractionRecorded,lastOrientation:n.lastOrientation||"unknown",touchTotalCount:n.touchTotalCount||0,swipeTotalCount:n.swipeTotalCount||0,longPressTotalCount:n.longPressTotalCount||0,pinchTotalCount:n.pinchTotalCount||0,currentPage:(t=n.currentPage,t&&"object"==typeof t?{page_key:(t.page_key||"")+"",page_name:(t.page_name||"")+"",enter_time:null!=t.enter_time?t.enter_time:Date.now(),enter_time_ms:null!=t.enter_time_ms?t.enter_time_ms:t.enter_time,page_seq_in_sid:t.page_seq_in_sid||0,has_interaction:!!t.has_interaction,accumulated_ms:t.accumulated_ms||0,resume_at_ms:null!=t.resume_at_ms?t.resume_at_ms:null,hidden_paused:!!t.hidden_paused,stay_duration_ms:t.stay_duration_ms}:null)}}function ue(e,t){return null==e||0>e||t>0&&e>t?-1:e}function le(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function de(e){return kn+":"+(e||"")}function _e(t){var n,r;if(!t)return null;if(n=null,se())try{n=window.sessionStorage.getItem(de(t))}catch(e){}if(!n&&ye())try{n=window.localStorage.getItem(de(t))}catch(e){}if(!n)return null;try{return(r=JSON.parse(n))&&r.sid===t?r:null}catch(e){return null}}function pe(t,n){if(t){var r=JSON.stringify(n||{});if(se())try{window.sessionStorage.setItem(de(t),r)}catch(e){}if(ye())try{window.localStorage.setItem(de(t),r)}catch(e){}}}function fe(e){if(!e)return null;var t=_e(e);return t&&t.metrics?t.metrics:null}function he(){var e,t=z();t&&(Cn?Sn||(Sn=t):(Cn=!0,(e=_e(t))&&e.metrics?(xn=ce(e.metrics),e.sessionStartedAt&&(Dn=e.sessionStartedAt),Sn=t):Sn=t))}function ge(e){var t=_e(e);return t&&t.behaviorHash?t.behaviorHash:""}function me(){var e=z();e&&(Sn&&Sn!==e||(Sn||(Sn=e),function(e){e&&pe(e,{sid:e,savedAt:Date.now(),sessionStartedAt:Dn,behaviorHash:ne(),metrics:ce(xn)})}(e)))}function ye(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem("__sdk_metrics_ping__","1"),window.localStorage.removeItem("__sdk_metrics_ping__"),0))}catch(e){return!1}}function ve(){var t,n;if(!ye())return[];try{return(t=window.localStorage.getItem(wn))?(n=JSON.parse(t),Array.isArray(n)?n:[]):[]}catch(e){return[]}}function we(t){if(ye())try{window.localStorage.setItem(wn,JSON.stringify(t||[]))}catch(e){}}function ke(e){we(ve().filter(function(t){return t&&t.sid!==e}))}function be(e){for(var t,n=e.slice(0,yn);n.length>0;){if(t=JSON.stringify(n),vn>=t.length)return n;n.pop()}return n}function Ce(e){var t,n=xn.currentPage;n&&(n.stay_duration_ms=ie(e,n),t={page_key:n.page_key,page_name:n.page_name||"",stay_duration_ms:n.stay_duration_ms,enter_time:Math.floor(n.enter_time/1e3),has_interaction:n.has_interaction?1:0},n.page_seq_in_sid&&(t.page_seq_in_sid=n.page_seq_in_sid),xn.pageStayList.push(t),xn.pageStayList=be(xn.pageStayList),xn.currentPage=null)}function Se(){xn.firstInteractionRecorded||(xn.firstInteractionRecorded=!0,xn.firstInteractionDelayMs=Math.max(0,Date.now()-Dn))}function Pe(){xn.lastOrientation=re()}function Ee(e){e&&xn.currentPage&&xn.currentPage.page_key===e&&(xn.currentPage.has_interaction=!0)}function Te(e,t,n,r){var o=Date.now();Ce(o),xn.currentPage={page_key:(e||"")+"",page_name:(t||"")+"",enter_time:null!=n?1e3*n:o,enter_time_ms:o,page_seq_in_sid:r||xn.currentPageSeq||0,has_interaction:!1,accumulated_ms:0,resume_at_ms:o,hidden_paused:!1}}function xe(){Ce(Date.now())}function De(t){var n,r=t;if(null==r)return null;if("string"==typeof r)try{r=JSON.parse(r)}catch(e){return null}return r&&"object"==typeof r?(n={page_key:(r.page_key||"")+"",page_name:(r.page_name||"")+"",stay_duration_ms:null!=r.stay_duration_ms?r.stay_duration_ms:0,enter_time:null!=r.enter_time?r.enter_time:0,has_interaction:r.has_interaction?1:0},null!=r.page_seq_in_sid&&(n.page_seq_in_sid=r.page_seq_in_sid),n):null}function Me(e,t,n){var r,o,i,a,s,c,u,l,d,_,p,f=e||{},h=f.sid||z(),g=h&&h===z();for(n?r=ce(n):g?(xe(),me(),r=ce(xn)):r=function(e){var t,n;return he(),!(t=e||z())||t!==z()||Sn&&Sn!==t?(n=fe(t))?ce(n):Sn&&Sn!==t?{eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null}:ce(xn):ce(xn)}(h),o=function(e,t){var n=Date.now(),r=e||{},o=U(r.sessionStartTs)||n,i=null!=r.sessionEndTs?U(r.sessionEndTs):X(r,t||"idle",n);return{startTs:o,endTs:i=Math.max(o,i||n)}}(f,t),s=Math.max(0,(a=o.endTs)-(i=o.startTs)),c=le({},r.pageKeys||{}),u=function(e){var t,n,r=[];for(t=0;(e||[]).length>t;t++)(n=De(e[t]))&&r.push(n);return r}(function(e){var t,n,r,o={},i=[];for(t=0;e.length>t;t++)null!=(r=(n=e[t])&&n.page_seq_in_sid)&&o[r]||(null!=r&&(o[r]=!0),i.push(n));return i}((r.pageStayList||[]).slice()).sort(function(e,t){return(e.page_seq_in_sid||0)-(t.page_seq_in_sid||0)})),u=function(e,t,n){var r,o,i,a=Math.floor((t||0)/1e3),s=Math.floor((n||Date.now())/1e3),c=Math.max(0,a-5),u=[];for(r=0;(e||[]).length>r;r++)(o=e[r])&&((i=null!=o.enter_time?+o.enter_time:0)>0&&c>i||i>s+5||u.push(o));return u}(u,i,a),l=0;u.length>l;l++)(d=u[l]&&u[l].page_key?u[l].page_key+"":"")&&(c[d]=1);return _=Object.keys(c),p=n?ge(h)||ne():g?ne():ge(h)||ne(),{session_start_ts:Math.floor(i/1e3),session_end_ts:Math.floor(a/1e3),session_duration_ms:s,event_count_total:r.eventCountTotal||0,business_event_count:r.businessEventCount||0,page_count:_.length,page_view_count:r.pageViewCount||0,page_click_count:r.pageClickCount||0,session_end_reason:(t||"idle")+"",last_event_name:r.lastEventName||"",page_stay_list:u,behavior_sequence_hash:p,network_change_count:r.networkChangeCount||0,scroll_total_count:r.scrollTotalCount||0,scroll_total_distance_px:Math.round(r.scrollTotalDistance||0),scroll_up_count:r.scrollUpCount||0,scroll_down_count:r.scrollDownCount||0,scroll_direction_change_count:r.scrollDirectionChangeCount||0,first_scroll_delay_ms:ue(null!=r.firstScrollDelayMs?r.firstScrollDelayMs:-1,s),max_scroll_depth_percent:r.maxScrollDepthPercent||0,is_reach_bottom:r.isReachBottom||0,content_height:oe(),keydown_total_count:r.keydownTotalCount||0,input_count:r.inputCount||0,focus_total_count:r.focusTotalCount||0,first_interaction_delay_ms:ue(null!=r.firstInteractionDelayMs?r.firstInteractionDelayMs:-1,s),orientation:r.lastOrientation||re(),touch_total_count:r.touchTotalCount||0,swipe_total_count:r.swipeTotalCount||0,long_press_total_count:r.longPressTotalCount||0,pinch_total_count:r.pinchTotalCount||0}}function Ie(){On=!0,setTimeout(function(){On=!1},2e3)}function Ae(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function Oe(t){return e((null==t?"":t)+"").substr(0,32)}function Le(e){return null!=e&&""!==(e+"").trim()}function Re(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(e){return""}}function qe(e){var t=(null==e?"":e)+"";return(t=(t=(t=t.replace(/\.html?$/i,"")).replace(/[^a-zA-Z0-9_]+/g,"_")).replace(/_+/g,"_").replace(/^_|_$/g,""))||"index"}function Be(){try{return qe(("undefined"!=typeof location&&location.pathname?location.pathname:"/").replace(/^\/+|\/+$/g,"").replace(/\//g,"_")||"index")}catch(e){return"index"}}function Ke(){try{return document.scrollingElement||document.documentElement||document.body||null}catch(e){return null}}function Ve(){try{var t=Ke();return t?{scroll_top:Math.max(0,Math.round(t.scrollTop||0)),scroll_left:Math.max(0,Math.round(t.scrollLeft||0))}:{scroll_top:-1,scroll_left:-1}}catch(e){return{scroll_top:-1,scroll_left:-1}}}function je(e,t){if(null==e||!isFinite(e))return-1;var n=Math.round(+e);return 0>n&&(n=0),null!=t&&t>0&&n>t&&(n=t),n}function Ne(){var t,n,r;try{return(t=document.documentElement||document.body)?(r=t.scrollHeight||0,(n=t.scrollWidth||0)>0&&r>0?{page_width:Math.round(n),page_height:Math.round(r)}:{page_width:-1,page_height:-1}):{page_width:-1,page_height:-1}}catch(e){return{page_width:-1,page_height:-1}}}function Fe(){var t,n;try{return"undefined"==typeof window?{viewport_width:-1,viewport_height:-1}:(t=window.innerWidth||0,n=window.innerHeight||0,t>0&&n>0?{viewport_width:Math.round(t),viewport_height:Math.round(n)}:{viewport_width:-1,viewport_height:-1})}catch(e){return{viewport_width:-1,viewport_height:-1}}}function He(){var t,n;try{return"undefined"==typeof screen?{screen_width:-1,screen_height:-1}:(t=screen.width||0,n=screen.height||0,t>0&&n>0?{screen_width:Math.round(t),screen_height:Math.round(n)}:{screen_width:-1,screen_height:-1})}catch(e){return{screen_width:-1,screen_height:-1}}}function Ue(){var t,n,r;try{if("undefined"!=typeof performance&&performance.timing&&(t=performance.timing).loadEventEnd&&t.navigationStart&&t.loadEventEnd>0)return Math.max(0,t.loadEventEnd-t.navigationStart);if("undefined"!=typeof performance&&"function"==typeof performance.getEntriesByType&&(n=performance.getEntriesByType("navigation"))&&n.length>0&&(r=n[0]).loadEventEnd>0&&r.fetchStart>=0)return Math.max(0,Math.round(r.loadEventEnd-r.fetchStart))}catch(e){}return 0}function Xe(e,t){return t>0?Math.min(100,Math.max(0,Math.round(e/t*100))):0}function Ye(e){return e?{clientX:null!=e.clientX?e.clientX:null,clientY:null!=e.clientY?e.clientY:null,pageX:null!=e.pageX?e.pageX:null,pageY:null!=e.pageY?e.pageY:null}:{}}function Ge(e){var t,n,r,o,i,a,s,c,u=e||{},l=Fe(),d=Ne(),_=Ve(),p=function(e){return!!e&&(null!=e.clientX||null!=e.clientY||null!=e.pageX||null!=e.pageY)}(u),f=d.page_width>0&&d.page_height>0,h=He(),g=f&&_.scroll_top>=0?_.scroll_top:0,m=f&&_.scroll_left>=0?_.scroll_left:0,y=l.viewport_width>0?l.viewport_width:-1,v=l.viewport_height>0?l.viewport_height:-1;return p?(n=null!=u.clientY?+u.clientY:null,r=null!=u.pageX?+u.pageX:null,o=null!=u.pageY?+u.pageY:null,null!=(t=null!=u.clientX?+u.clientX:null)||null!=n?(i=null!=t&&isFinite(t)?t:0,a=null!=n&&isFinite(n)?n:0,s=f?null!=r&&isFinite(r)?r:i+m:-1,c=f?null!=o&&isFinite(o)?o:a+g:-1):(s=f&&null!=r&&isFinite(r)?r:-1,c=f&&null!=o&&isFinite(o)?o:-1,i=null!=r&&isFinite(r)?r-m:0,a=null!=o&&isFinite(o)?o-g:0),i=je(i,y),a=je(a,v),f&&(s=je(s,d.page_width),c=je(c,d.page_height)),Ae({click_viewport_x:i,click_viewport_y:a,click_document_x:f?s:-1,click_document_y:f?c:-1,click_page_x:i,click_page_y:a,click_x_percent:y>0?Xe(i,y):-1,click_y_percent:v>0?Xe(a,v):-1,screen_width:h.screen_width,screen_height:h.screen_height},l,f?d:{page_width:-1,page_height:-1},f?_:{scroll_top:-1,scroll_left:-1})):{click_viewport_x:-1,click_viewport_y:-1,click_document_x:-1,click_document_y:-1,click_page_x:-1,click_page_y:-1,click_x_percent:-1,click_y_percent:-1,screen_width:h.screen_width,screen_height:h.screen_height,viewport_width:l.viewport_width,viewport_height:l.viewport_height,page_width:f?d.page_width:-1,page_height:f?d.page_height:-1,scroll_top:f?_.scroll_top:-1,scroll_left:f?_.scroll_left:-1}}function ze(t){var n=t||{},r=qe(n.pageKey||Be()),o=n.pageName||"undefined"!=typeof document&&document.title||r,i=function(){try{return"undefined"==typeof location?{}:{page_url:Re(),page_domain:(location.hostname||"")+"",page_path:(location.pathname||"")+"",page_query_hash:location.search?Oe(location.search):""}}catch(e){return{}}}(),a=Fe();return{user_type:"",page_key:r,page_name:o,referrer_page_key:(n.previousPageKey||"")+"",referrer_page_name:(n.previousPageName||"")+"",current_page_key:r,current_page_name:o,recommend_trace_id:"",page_url:i.page_url,viewport_width:a.viewport_width,viewport_height:a.viewport_height,is_sdk_auto_collected:1}}function We(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function Je(e,t){var n,r;return"app_session_summary"===t?We({},e.summaryFields||{},e.payload||{}):(n=function(e){var t=We({},e||{});return delete t._metricsRecorded,delete t._pageSeqPrealloc,delete t._clickSnap,t}(e.payload||{}),r={event:1,payload:1,event_id:1,summaryFields:1,_pageSeqInSid:1,_metricsRecorded:1,_sdkAutoClick:1,_pageSeqPrealloc:1},Object.keys(e).forEach(function(t){r[t]||(n[t]=e[t])}),n)}function Qe(e,t,n,r,o){var i,a,s,c,u,d,h,g=e||{},y=((n.event||"")+"").trim(),v=n.lifecycle_event_key||n.payload&&n.payload.lifecycle_event_key||"";return function(e,t){var n,r=(e||"")+"";return"app_page_view"===r||"page_click"===r||("app_lifecycle"===r?"cold_start"==(n=(t||"")+"")||"web_load"===n||"warm_start"===n||"foreground"===n:"sdk_init"!==r&&"network_state_change"!==r&&"app_session_summary"!==r&&"background"!==r)}(y,v)&&(c=Date.now(),(u=F())?(u.lastValidBehaviorAt=c,N(u)):N(H(c))),i="",n.payload&&null!=n.payload.page_key?i=n.payload.page_key+"":null!=n.page_key&&(i=n.page_key+""),function(e,t,n){"app_lifecycle"===e&&t&&en[t]?mn.append(t,n):("app_page_view"===e||"page_click"===e||e&&!Tn[e])&&mn.append(e,n)}(y,v,i),a=function(e,t){return B({appId:e.appId,channel:e.channel,uid:e.uid,sid:t,deviceId:(n=e.deviceId,((null==n?"":n)+"").trim()||"NULL"),deviceType:e.deviceType||"PC",deviceBrand:e.deviceBrand||"",deviceModel:e.deviceModel||"",deviceFingerprint:ee(),fpVersion:te(),sdkVersion:e.sdkVersion,appVersion:e.appVersion});var n}(g,t),function(e,t){var n,r;if(he(),(n=(e||"")+"")&&"app_session_summary"!==n){if("app_page_view"===n&&t&&t._metricsRecorded)return xn.lastEventName=n,void me();xn.eventCountTotal++,xn.lastEventName=n,Tn[n]||xn.businessEventCount++,r=t&&null!=t.page_key?t.page_key+"":"","app_page_view"===n?(xn.pageViewCount++,r&&(xn.pageKeys[r]=1)):"page_click"===n?(xn.pageClickCount++,Ee(r)):"network_state_change"===n?xn.networkChangeCount++:r&&Ee(r),me()}}(y,n.payload||{}),s=function(e,t){return function(e,t){for(var n=t||{},r={},o=Object.keys(e||{}),i=0;o.length>i;i++)r[o[i]]=e[o[i]];return r.event_sig_version=(n.eventSigVersion||Jt)+"",r.event_sig=n.hmacKey?function(e,t){return t?function(e,t){var n,r,o,i,a=_((null==t?"":t)+"");for(a.length>64&&(a=p(l(a)));64>a.length;)a.push(0);for(n=[],r=[],o=0;64>o;o++)n.push(54^a[o]),r.push(92^a[o]);return i=p(l(f(n,_((null==e?"":e)+"")))),l(f(r,i))}(function(e){var t=e||{};return[q(t.event),q(t.event_id),q(t.app_id),q(t.client_ts),q(t.device_fingerprint)].join("|")}(e),t+""):""}(e,n.hmacKey):"",r}(e,{hmacKey:t&&t.hmacKey?t.hmacKey:"",eventSigVersion:Jt})}(function(e,t,n){return function(e,t){var n=function(){var e,t,n,r,o;for(e={},t=0;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)e[r[o]]=n[r[o]];return e}(e,t);return n.event_id||(n.event_id=m(n)),n}(e,{event:n,payload:Je(t,n)})}(a,n,y),r),"app_page_view"===y&&n.payload&&n.payload.page_key&&(n.payload._metricsRecorded||n._metricsRecorded||Te(n.payload.page_key,n.payload.page_name,n.payload.page_enter_ts,null!=n._pageSeqInSid?n._pageSeqInSid:n.payload.page_seq_in_sid)),"page_click"===y&&n.payload&&!n._sdkAutoClick&&An.push({x:null!=(d=null!=n.payload.click_viewport_x?n.payload.click_viewport_x:n.payload.click_page_x)?d:0,y:null!=(h=null!=n.payload.click_viewport_y?n.payload.click_viewport_y:n.payload.click_page_y)?h:0,t:Date.now()}),s._sessionInfo=o||null,s}function $e(t,n,r){var o=We({},n||{}),i=((o.event||"")+"").trim();return Bn[i]&&o.payload&&1!==o.payload.is_sdk_auto_collected&&(o.payload=function(e,t,n){var r,o=e||{},i=1===o.is_sdk_auto_collected,a=((n||"")+"").trim(),s="app_page_view"===a||null!=o.page_key&&(null!=o.current_page_key||null!=o.user_type),c="page_click"===a,u={}||{},l=qe(o.page_key||Be());return r=s?ze(Ae(u,{pageKey:l,pageName:o.page_name})):c?Ae({page_key:l,page_name:o.page_name||"undefined"!=typeof document&&document.title||l,recommend_trace_id:"",referrer_page_key:u.previousPageKey||""},function(e){var t=e||{},n=Fe(),r=He(),o=Ne(),i=Ve(),a=o.page_width>0&&o.page_height>0,s=a&&i.scroll_top>=0?i.scroll_top:0,c=a&&i.scroll_left>=0?i.scroll_left:0,u=n.viewport_width>0?n.viewport_width:-1,l=n.viewport_height>0?n.viewport_height:-1,d=null!=t.click_page_x?+t.click_page_x:null,_=null!=t.click_page_y?+t.click_page_y:null,p=-1,f=-1,h=-1,g=-1;return null!=d&&isFinite(d)&&null!=_&&isFinite(_)?(p=d,f=_,a&&(h=d+c,g=_+s)):null!=t.click_x_percent&&null!=t.click_y_percent&&u>0&&l>0&&(p=+t.click_x_percent/100*u,f=+t.click_y_percent/100*l,a&&(h=p+c,g=f+s)),-1!==p&&(p=je(p,u)),-1!==f&&(f=je(f,l)),a&&-1!==h&&(h=je(h,o.page_width)),a&&-1!==g&&(g=je(g,o.page_height)),{click_viewport_x:p,click_viewport_y:f,click_document_x:a?h:-1,click_document_y:a?g:-1,screen_width:r.screen_width,screen_height:r.screen_height,viewport_width:n.viewport_width,viewport_height:n.viewport_height,page_width:a?o.page_width:-1,page_height:a?o.page_height:-1,scroll_top:a?i.scroll_top:-1,scroll_left:a?i.scroll_left:-1}}(o)):{page_key:l,page_name:o.page_name||"undefined"!=typeof document&&document.title||l,recommend_trace_id:"",referrer_page_key:u.previousPageKey||""},i||s?i&&(r.is_sdk_auto_collected=1):delete r.is_sdk_auto_collected,function(e,t){var n,r,o=Ae({},e||{}),i=Object.keys(t||{});for(n=0;i.length>n;n++)Le(o[r=i[n]])||(o[r]=t[r]);return o}(o,r)}(o.payload,0,i)),Z().then(function(){var n,a=G();if(a.endedSession&&qn)try{qn(a.endedSession)}catch(e){}return n=a.sid||z(),Bn[i]&&o.payload&&function(t,n){var r,o,i,a=((t.event||"")+"").trim();Bn[a]&&t.payload&&("app_page_view"===a?1===t.payload.is_sdk_auto_collected?(r=t.payload._pageSeqPrealloc||ae(),o=t.payload._metricsRecorded,null!=t.payload._pageSeqPrealloc&&delete t.payload._pageSeqPrealloc,t.payload=function(e,t,n){var r=e||{},o=Fe(),i=Math.floor(Date.now()/1e3),a=Oe((t||"")+"|"+(n||0)+"|"+i),s=Ue(),c=qe(r.page_key||""),u=(r.page_name||"")+"";return{user_type:(null!=r.user_type?r.user_type:"")+"",page_key:c,page_name:u,referrer_page_key:(null!=r.referrer_page_key?r.referrer_page_key:"")+"",referrer_page_name:(null!=r.referrer_page_name?r.referrer_page_name:"")+"",current_page_key:(null!=r.current_page_key?r.current_page_key:c)+"",current_page_name:(null!=r.current_page_name?r.current_page_name:u)+"",recommend_trace_id:(null!=r.recommend_trace_id?r.recommend_trace_id:"")+"",page_id:a,page_enter_ts:i,page_url:r.page_url||Re(),page_load_time:null!=s?s:0,viewport_width:o.viewport_width,viewport_height:o.viewport_height}}(t.payload,n,r),t._pageSeqInSid=r,o&&(t._metricsRecorded=1)):(i=function(t,n){var r,o=t||{},i=null!=o.page_enter_ts?o.page_enter_ts:Math.floor(Date.now()/1e3),a=o.page_seq_in_sid||ae();return{page_seq_in_sid:a,page_id:o.page_id||e((null==(r=(n||"")+"|"+a+"|"+i)?"":r)+"").substr(0,32),page_enter_ts:i}}(t.payload,n),t.payload=We(t.payload,i)):"page_click"===a&&1===t.payload.is_sdk_auto_collected&&(t.payload=function(e){var t=e||{},n=Ge(t._clickSnap||t);return{page_key:qe(t.page_key||""),page_name:(t.page_name||"")+"",recommend_trace_id:(null!=t.recommend_trace_id?t.recommend_trace_id:"")+"",referrer_page_key:(null!=t.referrer_page_key?t.referrer_page_key:"")+"",click_viewport_x:n.click_viewport_x,click_viewport_y:n.click_viewport_y,click_document_x:n.click_document_x,click_document_y:n.click_document_y,click_page_x:n.click_page_x,click_page_y:n.click_page_y,click_x_percent:n.click_x_percent,click_y_percent:n.click_y_percent,screen_width:n.screen_width,screen_height:n.screen_height,viewport_width:n.viewport_width,viewport_height:n.viewport_height,page_width:n.page_width,page_height:n.page_height,scroll_top:n.scroll_top,scroll_left:n.scroll_left}}(t.payload),t._sdkAutoClick=1,delete t.payload.is_sdk_auto_collected,delete t.payload._clickSnap))}(o,n),Qe(t,n,o,r,a)})}function Ze(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(e){return""}}function et(){var t,n;try{return(t=function(){try{return document.scrollingElement||document.documentElement||document.body||null}catch(e){return null}}())&&(n=Math.max(0,(t.scrollHeight||0)-(t.clientHeight||0)))>0?Math.min(100,Math.max(0,Math.round((t.scrollTop||0)/n*100))):0}catch(e){return 0}}function tt(){if(On)return"navigation";try{if("hidden"===document.visibilityState)return"visibility_hidden"}catch(e){}return"unknown"}function nt(){return function(){if(xn.currentPage&&xn.currentPage.page_key)return xn.currentPage.page_key;var e=xn.pageStayList||[];return e.length>0&&e[e.length-1].page_key||""}()||Be()}function rt(){var t,n="unknown";try{n="visible"===document.visibilityState||"hidden"===document.visibilityState?document.visibilityState:"unknown"}catch(e){}return{page_url:Ze(),unload_reason:tt(),scroll_depth_percent_at_unload:et(),web_visibility_state:n,page_stay_duration_ms:(t=xn.currentPage,t?ie(Date.now(),t):0),last_active_page_key:nt()}}function ot(e,t,n,r){var o,i,a=n||{};return a.lifecycle_event_key=t,t===Kn&&(a=at((o=Fe(),{page_url:Ze(),page_load_time_ms:Ue(),viewport_width:o.viewport_width,viewport_height:o.viewport_height}),a)),t===Nn&&(a=at(a,rt())),t===jn&&((i=xn.currentPage)&&!i.hidden_paused&&(i.accumulated_ms=ie(Date.now(),i),i.resume_at_ms=null,i.hidden_paused=!0),a.last_active_page_key||(a.last_active_page_key=nt())),t===Vn&&function(){var e=xn.currentPage;e&&e.hidden_paused&&(e.resume_at_ms=Date.now(),e.hidden_paused=!1)}(),$e(e,{event:"app_lifecycle",payload:a},r)}function it(e,t,n,r){return function(e,t,n,r){var o=We({},n||{});return Z().then(function(){return Qe(e,t,o,r,null)})}(e,r||z(),{event:"app_session_summary",summaryFields:t||{}},n)}function at(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function st(e){var t,n;return!e||2>e.length?0:Math.sqrt((t=e[0].clientX-e[1].clientX)*t+(n=e[0].clientY-e[1].clientY)*n)}function ct(){Gn&&(clearTimeout(Gn),Gn=null)}function ut(t,n,r){var o,i,a,s,c,u;if(r=r||{},!t)return Promise.resolve({sent:!1,ok:!1,status:0,reason:"no_endpoint"});if(!Array.isArray(n)||0===n.length)return Promise.resolve({sent:!0,ok:!0,status:200,reason:"empty_batch"});if(o=JSON.stringify(n),i=!0===r.useBeacon,a=!1!==r.requireHttps,c=isFinite(s=+r.timeoutMs)&&s>0?Math.floor(s):Qn,!function(e,t){if(!t)return!0;var n=((e||"")+"").match(/^(https?):\/\/([^/:?#]+)/i);return!(!n||"https"!==n[1].toLowerCase()&&("http"!==n[1].toLowerCase()||!function(e){var t=((e||"")+"").toLowerCase();return"localhost"===t||"127.0.0.1"===t||"::1"===t}(n[2])))}(t,a))return Promise.resolve({sent:!1,ok:!1,status:0,reason:"insecure_endpoint"});if(i&&"undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon)try{if(u=new Blob([o],{type:"application/json"}),navigator.sendBeacon(t,u))return Promise.resolve({sent:!0,ok:!0,status:200,transport:"beacon",uncertain:!0})}catch(e){}return function(e,t,n){var r,o;return"function"!=typeof fetch?Promise.resolve(null):(r="undefined"!=typeof AbortController?new AbortController:null,o=r&&n>0?setTimeout(function(){r.abort()},n):null,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,keepalive:!0,signal:r?r.signal:void 0}).then(function(e){return o&&clearTimeout(o),{sent:!0,ok:e.ok,status:+(e.status||0),transport:"fetch"}}).catch(function(e){return o&&clearTimeout(o),e&&"object"==typeof e&&"AbortError"===e.name?{sent:!1,ok:!1,status:0,reason:"timeout",transport:"fetch"}:null}))}(t,o,c).then(function(n){return null!==n?n:function(t,n,r){return new Promise(function(o){try{if("undefined"==typeof XMLHttpRequest)return o({sent:!1,ok:!1,status:0,reason:"no_xhr"});var i=new XMLHttpRequest;i.open("POST",t,!0),i.timeout=r,i.setRequestHeader("Content-Type","application/json"),i.onreadystatechange=function(){4===i.readyState&&o({sent:!0,ok:i.status>=200&&300>i.status,status:i.status,transport:"xhr"})},i.onerror=function(){o({sent:!1,ok:!1,status:0,reason:"xhr_error"})},i.ontimeout=function(){o({sent:!1,ok:!1,status:0,reason:"timeout",transport:"xhr"})},i.send(n)}catch(e){o({sent:!1,ok:!1,status:0,reason:"xhr_exception"})}})}(t,o,c)})}function lt(e){e=e||{},this.selectedBatchEndpoint="",this.remoteEndpoints=[],this.remoteProbePromise=null,this.remoteProbeKey="",this.shouldPersistOnFail=!1,this.hasBatchProbeStarted=!1,this.initialized=!1,this.initPromise=null,this.endpointReadyListeners=[],this.timeoutMs=+e.pingTimeoutMs||1500}function dt(e){return 255&(e<<1^(128&e?27:0))}function _t(e){return(Mt[e>>>24&255]<<24|Mt[e>>>16&255]<<16|Mt[e>>>8&255]<<8|Mt[255&e])>>>0}function pt(e,t){var n,r,o,i,a,s,c,u,l,d,_,p,f=e.slice(0);for(o=[],i=0;16>i;i++)f[i]=255&(f[i]^t[i>>2]>>>24-8*(3&i));for(a=1;14>=a;a++){for(n=[],i=0;16>i;i++)n[i]=Mt[f[i]];for(r=[],c=0;4>c;c++)for(u=0;4>u;u++)r[c+4*u]=n[c+4*(u+c&3)];if(14>a){for(o=[],s=0;4>s;s++)d=r[4*s+1],_=r[4*s+2],p=r[4*s+3],o[4*s]=255&(dt(l=r[4*s])^dt(d)^d^_^p),o[4*s+1]=255&(l^dt(d)^dt(_)^_^p),o[4*s+2]=255&(l^d^dt(_)^dt(p)^p),o[4*s+3]=255&(dt(l)^l^d^_^dt(p));for(f=o,o=[],i=0;16>i;i++)f[i]=255&(f[i]^t[4*a+(i>>2)]>>>24-8*(3&i))}else for(f=r,i=0;16>i;i++)f[i]=255&(f[i]^t[4*a+(i>>2)]>>>24-8*(3&i))}return f}function ft(e,t){var n,r,o,i=[],a=t.slice(0);for(n=0;16>n;n++)i[n]=0;for(n=0;128>n;n++){if(e[n>>3]&128>>(7&n))for(r=0;16>r;r++)i[r]^=a[r];for(o=1&a[15],r=15;r>0;r--)a[r]=255&(a[r]>>>1|a[r-1]<<7);a[0]=a[0]>>>1&255,o&&(a[0]^=225)}return i}function ht(e){var t,n=e.slice(0);for(t=15;t>=12&&(n[t]=n[t]+1&255,!n[t]);t--);return n}function gt(e){this.encryptedConfigText=(e=e||{}).encryptedConfig||e.configCipher||"",this.cachedConfigPromise=null,this._secondGcmKeyBase64="en1BNo0VBrN/zi+mI2LO7E9W40ehCBYwC+frBn8s3rQ="}function mt(e,t){var n=((e&&e.event_id||"")+"").trim();return n?n+"|||"+(t||""):null}function yt(e){var t,n={},r=Object.keys(e);for(t=0;r.length>t;t++)n[r[t]]=e[r[t]];return n}function vt(){this.maxSize=tr}function wt(e){var t,n,r=e||{},o=r.im_behavior_key,i=qt[o];if(!i)throw(t=Error("[sdk][web] 未知 im_behavior_key:"+o)).name="EventValidationError",t.eventMethod="imEvent",t.typeErrorFields=["im_behavior_key(unknown)"],t;return n={},Object.keys(r).forEach(function(e){"im_behavior_name"!==e&&(n[e]=r[e])}),n.im_behavior_name=i,n}function kt(e,t){var n,r,o,i,a,s=Lt[e];if(!s)throw Error("[sdk][web] 未知事件方法:"+e);if(n=t||{},r={},o=[],i=[],Object.keys(s).forEach(function(e){var t,a=s[e],c=1&a,u=a>>1&3,l=!!(8&a),d=n[e];l&&null===d&&(d=""),!c||l||null!=d&&""!==d?c&&l&&void 0===d?o.push(e):(c||null!=d)&&(t=1===u?function(e){return"number"==typeof e&&isFinite(e)&&e===Math.floor(e)}(d):2===u?function(e){return"number"==typeof e&&isFinite(e)}(d):function(e){return"string"==typeof e}(d),t?r[e]=d:i.push(e+"(expected "+(1===u?"int":2===u?"number":"string")+")")):o.push(e)}),o.length||i.length)throw(a=Error("[sdk][web] 事件字段校验失败:"+e)).name="EventValidationError",a.eventMethod=e,a.missingFields=o.slice(),a.typeErrorFields=i.slice(),a;return r}function bt(){var e,t,n,r,o={};for(e=0;arguments.length>e;e++)if(t=arguments[e])for(n=Object.keys(t),r=0;n.length>r;r++)o[n[r]]=t[n[r]];return o}function Ct(e){var t,n,r={};if(!e||!Array.isArray(e))return r;for(t=0;e.length>t;t++)(n=((null==e[t]?"":e[t])+"").trim())&&(Vt[n]?r[n]=1:Kt('[sdk][web] disableAutoEvents 含未知事件 "'+n+'",已忽略'));return r}function St(e){var t,n=[],r=Object.keys(e||{});for(t=0;r.length>t;t++)n.push(r[t]);return n}function Pt(e,t){this.opts=e,this.resolver=t,this.queue=[],this.timer=null,this.flushTail=Promise.resolve(),this.replaying=!1,this.replayTimer=null,this.hasPersistentItems=!0,this.persistentQueue=new vt,this._resolveEndpoint=null,this._getEventCodes=null,this.startReplayTimer()}function Et(e){var t,n;if("undefined"==typeof window)return Kt("[web-sdk] 非浏览器环境(SSR/Node.js),SDK 仅支持浏览器,初始化已跳过。"),this._ssrSkipped=!0,this.options=e,this.configMgr=null,this.resolver=null,void(this.batcher=null);if(!Object.prototype.hasOwnProperty.call(e,"channel"))throw Error('channel 为必传字段(可传空字符串 "")');this._ssrSkipped=!1,(t=bt(e)).channel=null==e.channel?"":e.channel+"",this._disableAutoEvents=Ct(t.disableAutoEvents),t.disableAutoEvents=St(this._disableAutoEvents),this.options=t,this.configMgr=new gt(e),this.resolver=new lt({pingTimeoutMs:nr}),this.batcher=new Pt(this.options,this.resolver),n=this,this.batcher._resolveEndpoint=function(e){return n.resolver.resolveEndpoint(function(){return n.configMgr.getBatchEndpoints()},e)},this.batcher._getEventCodes=function(){return n.configMgr.getEventCodes()},this.batcher._getSigningConfig=function(){return n.configMgr.getSigningConfig()},this._unsubReady=null,this._refreshTimer=null,this._autoLifecycleTeardown=null,this._webLoadTeardown=null,this._autoNetworkTeardown=null,this._pageTrackerTeardown=null,this._webInteractionTeardown=null,this._sessionPollTimer=null,this._autoEventsStarted=!1,this._init({}),this._startAutoEvents()}function Tt(e){if(!Ht)throw Error("请先调用 init() 初始化(参数须包含 channel)");return Ht}function xt(e,t,n){var r,o,i;if(n>=e.length)return Promise.resolve();if(!Ht||Ht!==t){for(o=(r=e.slice(n)).length-1;o>=0;o--)Ut.unshift(r[o]);return Promise.resolve()}return t.track((i=e[n]).event,i.endpoint).catch(function(){}).then(function(){return xt(e,t,n+1)})}function Dt(e,t){var n;return Ht?(n=Ht,(Xt||Promise.resolve()).then(function(){return n.track(e,t)})):(Ut.push({event:e,endpoint:t}),Ut.length>500&&Ut.shift(),Promise.resolve({sent:!1,ok:!0,status:0,reason:"pre_init_cached"}))}var Mt,It,At,Ot,Lt,Rt,qt,Bt,Kt,Vt,jt,Nt,Ft,Ht,Ut,Xt,Yt,Gt,zt=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],Wt="3.0.1",Jt="sig_v2",Qt=["os_family","browser_kernel","browser_platform","screen_width","screen_height","screen_dpi","device_pixel_ratio","color_depth","max_touch_points","cpu_cores","cookie_enabled","local_storage_enabled","session_storage_enabled","indexeddb_enabled","service_worker_enabled","canvas_fp","webgl_fp","audio_fp","fonts_hash","plugins_hash","mimes_hash"],$t=["Arial","Arial Black","Comic Sans MS","Courier New","Georgia","Impact","Times New Roman","Trebuchet MS","Verdana","Microsoft YaHei","SimHei","SimSun","PingFang SC","Helvetica","Roboto","Monaco","Menlo","Consolas","Palatino Linotype","Tahoma","Lucida Console","Candara","Futura","Geneva"],Zt=[{kind:"video",type:'video/mp4; codecs="avc1.42E01E"'},{kind:"video",type:'video/webm; codecs="vp8, vorbis"'},{kind:"video",type:'video/ogg; codecs="theora"'},{kind:"video",type:"video/mp4"},{kind:"video",type:"video/webm"},{kind:"audio",type:"audio/mpeg"},{kind:"audio",type:'audio/ogg; codecs="vorbis"'},{kind:"audio",type:'audio/wav; codecs="1"'},{kind:"audio",type:"audio/mp4"},{kind:"audio",type:"audio/aac"}],en={cold_start:1,web_load:1,warm_start:1,foreground:1,background:1,web_unload:1,terminate:1,unknown:1},tn="__web_sdk_sid__",nn="__web_sdk_sid_meta__",rn="__web_sdk_sid__",on="__web_sdk_sid_v1",an=18e5,sn=216e5,cn=null,un=!1,ln="__web_sdk_device_id__",dn="__web_sdk_ping__",_n=null,pn="__web_sdk_device_fp__",fn=null,hn="",gn=null,mn=function(){var e="";return{append:function(t,n){var r=((t||"")+"").trim();r&&(e+=r+"|"+(null!=n?n+"":"")+";")},digest:function(){return d(e)},reset:function(){e=""}}}(),yn=50,vn=16384,wn="__web_sdk_pending_session_summaries__",kn="__web_sdk_session_metrics_v1__",bn="__web_sdk_summary_claimed__:",Cn=!1,Sn="",Pn={},En={},Tn={sdk_init:1,app_lifecycle:1,app_session_summary:1,network_state_change:1},xn={eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},Dn=Date.now(),Mn=0,In=0,An=[],On=!1,Ln="",Rn="",qn=null,Bn={app_page_view:1,page_click:1},Kn="web_load",Vn="foreground",jn="background",Nn="web_unload",Fn=null,Hn=0,Un=0,Xn=0,Yn=0,Gn=null,zn=!1,Wn=null,Jn=!1,Qn=1e4,$n="1.2.0",Zn=5e3,er=3e4,tr=2e3,nr=1500,rr=!1;if(lt.prototype.normalizeBatchEndpoints=function(e){return(Array.isArray(e)?e:[]).map(function(e){return((e||"")+"").trim()}).filter(Boolean).filter(function(e){return/^https:\/\//i.test(e)}).map(function(e){var t=e.match(/^(https?:\/\/[^/?#]+)/i);return(t?t[1]:e.replace(/\/+$/,""))+"/api/eventTracking/batchReport.json"})},lt.prototype._withTimeout=function(e,t){return new Promise(function(n,r){var o=setTimeout(function(){r(Error("timeout"))},t);e.then(function(e){clearTimeout(o),n(e)}).catch(function(e){clearTimeout(o),r(e)})})},lt.prototype._xhrRace=function(t,n){return t.length?new Promise(function(r){function o(){for(var t=0;c.length>t;t++)try{c[t].abort()}catch(e){}}var i,a=t.length,s=!1,c=[];for(i=0;t.length>i;i++)(function(t){var i,u,l;try{function d(e){l||(l=!0,u&&(clearTimeout(u),u=null),e&&!s?(s=!0,o(),r(t)):e||(a--,s||0!==a||r("")))}i=new XMLHttpRequest,u=null,l=!1,c.push(i),u=setTimeout(function(){d(!1)},n),i.open("POST",t,!0),i.setRequestHeader("Content-Type","application/json"),i.onreadystatechange=function(){4===i.readyState&&d(i.status>0)},i.onerror=function(){d(!1)},i.send("[]")}catch(e){a--,s||0!==a||r("")}})(t[i])}):Promise.resolve("")},lt.prototype._pickFastest=function(t,n){function r(){if(o)for(var t=0;i.length>t;t++)try{i[t].abort()}catch(e){}}var o,i,a=this;return"undefined"==typeof fetch?a._xhrRace(t,n):t.length?(o="undefined"!=typeof AbortController,i=[],new Promise(function(e){var s,c=t.length,u=!1;for(s=0;t.length>s;s++)(function(t){var s,l=o?new AbortController:null;l&&i.push(l),s={method:"POST",mode:"cors",headers:{"Content-Type":"application/json"},body:"[]",cache:"no-store"},l&&(s.signal=l.signal),a._withTimeout(fetch(t,s),n).then(function(n){n&&n.status>0?u||(u=!0,r(),e(t)):(c--,u||0!==c||e(""))}).catch(function(){c--,u||0!==c||e("")})})(t[s])})):Promise.resolve("")},lt.prototype._notifyReady=function(){var t=this.selectedBatchEndpoint;this.endpointReadyListeners.forEach(function(n){try{n(t)}catch(e){}})},lt.prototype._setSelectedEndpoint=function(e){var t=(e||"")+"";t&&t!==this.selectedBatchEndpoint&&(this.selectedBatchEndpoint=t,this._notifyReady())},lt.prototype.startRemoteProbe=function(e){var t,n,r=e.join("|");return e.length?this.remoteProbePromise&&this.remoteProbeKey===r?this.remoteProbePromise:(this.remoteProbeKey=r,this.shouldPersistOnFail=!1,t=this,n=this._pickFastest(e,this.timeoutMs).then(function(r){if(t.remoteProbePromise!==n)return t.selectedBatchEndpoint;if(t.remoteProbePromise=null,r)t._setSelectedEndpoint(r);else if(!t.selectedBatchEndpoint&&e.length){t.shouldPersistOnFail=!0;var o=e[Math.floor(Math.random()*e.length)];t._setSelectedEndpoint(o)}return t.selectedBatchEndpoint}).catch(function(){return t.remoteProbePromise===n&&(t.remoteProbePromise=null),t.selectedBatchEndpoint}),this.remoteProbePromise=n,n):Promise.resolve("")},lt.prototype.refreshDomainConfig=function(e){var t=this;return e().then(function(e){var n=t.normalizeBatchEndpoints(e);return t.remoteEndpoints=n,n.length?(t.hasBatchProbeStarted=!0,t.startRemoteProbe(n)):t.selectedBatchEndpoint})},lt.prototype.init=function(e){return this.initialized?Promise.resolve():(this.initPromise||(this.initialized=!0,this.initPromise=this.refreshDomainConfig(e).catch(function(){})),this.initPromise)},lt.prototype.resolveEndpoint=function(e,t){if(t)return Promise.resolve(t);var n=this;return this.init(e).then(function(){return n.selectedBatchEndpoint||""})},lt.prototype.onEndpointReady=function(e){if("function"!=typeof e)return function(){};this.endpointReadyListeners.push(e);var t=this;return function(){var n=t.endpointReadyListeners.indexOf(e);0>n||t.endpointReadyListeners.splice(n,1)}},lt.prototype.consumeProbeFailurePersistSignal=function(){return!!this.shouldPersistOnFail&&(this.shouldPersistOnFail=!1,!0)},lt.prototype.getEndpointState=function(){return this.selectedBatchEndpoint?"ready":this.remoteEndpoints.length>0?"probing":"unavailable"},lt.prototype.getSelectedBatchEndpoint=function(){return this.selectedBatchEndpoint},Mt=function(){var e,t=[];for(e=0;1272>e;e+=2)t.push(parseInt("637c777bf26b6fc53001672bed2a28a248888da76f3248a3043813899432c6b326fb8d0d37e84760dad3574759e0b764532a380602b1fc71a9e7f97d3b6415c21d02b5612440a4500bf9c043d33e085f45c20e0b65124603dfa8cd7a76b65c11b829e69a4e7f7872c6c7150b6a0f0801d163ae27d4d6cd5d19e77a9b1b48aaf2428594d3752f1d67250bab67676203b9b40df3d7cdf7eebf4b1bd5b6e16416be39a4c4a56e644726087d013b8ea78a6750d8b0339b871ee1b6a9ab66c8032cc1ac2462c695459dc034deae0678ae1779d9e7abce45d167e719b7776c73222f3c7e3cc11ae6da5cd659b79ce60ca82ec97f6059f674c029a68db0853dc22bb6518048ed4f66256d430b74de2f1a95f0589c341befce783e7c6d9dc7dd8e21cb643ee710b3c11329260195e0c0a956f14f970a9e61e594c663f68266a11045baf84a11e051ea5b6a42067253b2d37392c3516e1fc226a5cd4ab8990c475651a4698910219b94e2eb7d2b7129f38c94e3b1246a3298fef32dcae306137c39e1f0e32fe97d11b986c41a55bd5351319f7f078010fa81eb86b8a0556f880000e3630c6a0b136307027bf70e1b5722632937a93b53bf2d240e3949fa5a6e4e6a2a6f4d5b43a39d051df60bc98f25ff3130c31fd85b6e4167b276aed3276b70c3e527f2f2963b60554543e32e1f0c1754766b610c20b0ffe75d3fb88f6fa49605d6a3d6ca3022ffc62f5c8d297b65c778da96c8941ac9c55845e094f1c4a020bff5bb01a0cb04f5a8ac42b1cb41c38d27c1e1358256f3e99e3295a6e3b8c9c0481ed49af7d43f580a8571a0b13162171ebe8666ee5365e9ce6bef0a682080268b3bb67a1076a5776a996c26c2c8c12c7490c356348d10351b5279fa09851ebf".substr(e,2),16));return t}(),It=[1,2,4,8,16,32,64,128,27,54],At="__web_sdk_remote_config_cache__",gt.prototype.setEncryptedConfig=function(e){this.encryptedConfigText!==e&&(this.encryptedConfigText=e,this.cachedConfigPromise=null)},gt.prototype._tryParse=function(t){try{return JSON.parse(t)}catch(e){return t}},gt.prototype._unwrap=function(e,t){var n,r,o;for(t=t||3,n=e,r=0;t>r&&"string"==typeof n&&(o=this._tryParse(n))!==n;r++)n=o;return n},gt.prototype._toStringArray=function(e){var t,n=this._unwrap(e);return Array.isArray(n)?n.map(function(e){return((e||"")+"").trim()}).filter(Boolean):"string"==typeof n&&n.trim()?(t=this._tryParse(n),Array.isArray(t)?t.map(function(e){return((e||"")+"").trim()}).filter(Boolean):[n.trim()]):[]},gt.prototype._getStorage=function(){try{return"undefined"!=typeof window&&window.localStorage?window.localStorage:null}catch(e){return null}},gt.prototype._readPersisted=function(){var t,n,r;try{return(t=this._getStorage())&&(n=t.getItem(At))?(r=JSON.parse(n),Date.now()-(r.updatedAt||0)>24e5?{}:this._mapPayload(r)):{}}catch(e){return{}}},gt.prototype._mapPayload=function(e){if(!e||"object"!=typeof e)return{};var t=e.data&&"object"==typeof e.data?e.data:e;return{batchUrls:this._toStringArray(null!=t.batchUrls?t.batchUrls:t.domainList),eventCodes:this._toStringArray(null!=t.eventCodes?t.eventCodes:t.eventList),signKey:(t.signKey||t.hmacKey||t.eventSignKey||"")+"",securityKeyVersion:(t.securityKeyVersion||t.signKeyVersion||"")+""}},gt.prototype._persist=function(t){try{var n=this._getStorage();if(!n)return;n.setItem(At,JSON.stringify({batchUrls:this._toStringArray(t.batchUrls),eventCodes:this._toStringArray(t.eventCodes),signKey:(t.signKey||"")+"",securityKeyVersion:(t.securityKeyVersion||"")+"",updatedAt:Date.now()}))}catch(e){}},gt.prototype._base64ToBytes=function(e){var t,n,r,o,i=((e||"")+"").trim().replace(/-/g,"+").replace(/_/g,"/"),a=i.length%4?4-i.length%4:0;for(t=0;a>t;t++)i+="=";if("undefined"!=typeof atob&&"undefined"!=typeof Uint8Array){for(n=atob(i),r=new Uint8Array(n.length),o=0;n.length>o;o++)r[o]=n.charCodeAt(o);return r}return new Uint8Array(0)},gt.prototype._decryptAes256Gcm=function(t,n){var r,o,i,a,s,c,u;try{if(28>(r=this._base64ToBytes(t)).length)return Promise.reject(Error("密文过短"));if(o=this._base64ToBytes(n),i=r.slice(0,12),a=r.slice(12),"undefined"!=typeof crypto&&crypto.subtle)return crypto.subtle.importKey("raw",o,{name:"AES-GCM"},!1,["decrypt"]).then(function(e){return crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,a)}).then(function(e){return new Uint8Array(e)});if(!(s=function(e,t,n){var r,o,i,a,s,c,u,l,d,_,p,f,h,g,m=[],y=[],v=[],w=[];for(r=0;32>r;r++)m[r]=e[r]||0;for(r=0;12>r;r++)y[r]=t[r]||0;if(0>(i=n.length-16))return null;for(r=0;i>r;r++)v[r]=n[r];for(r=0;16>r;r++)w[r]=n[i+r];for(a=function(e){var t,n,r=[];for(t=0;8>t;t++)r[t]=(e[4*t]<<24|e[4*t+1]<<16|e[4*t+2]<<8|e[4*t+3])>>>0;for(t=8;60>t;t++)n=r[t-1],t%8?t%8==4&&(n=_t(n)):n=(_t((n<<8|n>>>24)>>>0)^It[t/8-1]<<24)>>>0,r[t]=(r[t-8]^n)>>>0;return r}(m),s=[],r=0;16>r;r++)s[r]=0;for(c=pt(s,a),u=y.slice(0),r=12;15>r;r++)u[r]=0;for(u[15]=1,l=pt(u,a),d=ht(u),_=[],r=0;i>r;r+=16)for(p=pt(d,a),d=ht(d),o=0;16>o&&i>r+o;o++)_[r+o]=v[r+o]^p[o];for(f=v.slice(0);15&f.length;)f.push(0);for(r=0;8>r;r++)f.push(0);for(h=8*i,f.push(0,0,0,0),f.push(h>>>24&255,h>>>16&255,h>>>8&255,255&h),g=function(e,t){var n,r,o=[];for(n=0;16>n;n++)o[n]=0;for(n=0;t.length>n;n+=16){for(r=0;16>r;r++)o[r]^=t[n+r]||0;o=ft(o,e)}return o}(c,f),r=0;16>r;r++)if((l[r]^g[r])!==w[r])return null;return _}(o,i,a)))return Promise.reject(Error("AES-GCM 认证标签校验失败"));if("undefined"!=typeof Uint8Array)for(c=new Uint8Array(s.length),u=0;s.length>u;u++)c[u]=s[u];else c=s;return Promise.resolve(c)}catch(e){return Promise.reject(e)}},gt.prototype.fetchAndDecryptConfig=function(){var e,t,n;return this.cachedConfigPromise?this.cachedConfigPromise:(e=this,t=this._readPersisted(),this.encryptedConfigText?(n=this._decryptAes256Gcm(this.encryptedConfigText,this._secondGcmKeyBase64).then(function(t){var n,r,o,i;if("undefined"!=typeof TextDecoder)n=(new TextDecoder).decode(t);else{for(r=[],o=0;t.length>o;o++)r[o]=t[o];n=String.fromCharCode.apply(null,r)}return i=e._mapPayload(JSON.parse(n)),e._persist(i),i}).catch(function(e){return t}),this.cachedConfigPromise=n,n):(this.cachedConfigPromise=Promise.resolve(t),this.cachedConfigPromise))},gt.prototype.getBatchEndpoints=function(){return this.fetchAndDecryptConfig().then(function(e){return e.batchUrls||[]})},gt.prototype.getEventCodes=function(){return this.fetchAndDecryptConfig().then(function(e){return Array.isArray(e.eventCodes)&&e.eventCodes.length>0?e.eventCodes:[]})},gt.prototype.getSigningConfig=function(){return this.fetchAndDecryptConfig().then(function(e){return{hmacKey:(e.signKey||"")+"",securityKeyVersion:(e.securityKeyVersion||"")+""}})},gt.prototype.prewarm=function(){this.fetchAndDecryptConfig().catch(function(){})},gt.prototype.forceRefresh=function(){this.cachedConfigPromise=null},Ot="events",vt.prototype.isAvailable=function(){return"undefined"!=typeof indexedDB&&"undefined"!=typeof window&&null!=window.indexedDB},vt.prototype.openDb=function(){var t=this;return new Promise(function(n,r){if(!t.isAvailable())return n(null);var o=indexedDB.open("web_sdk_event_queue",3);o.onerror=function(){r(o.error||Error("open indexedDB failed"))},o.onupgradeneeded=function(t){var n,r,i,a,s=o.result,c=t.oldVersion,u=t.target.transaction;if(!s.objectStoreNames.contains(Ot))return(n=s.createObjectStore(Ot,{keyPath:"id",autoIncrement:!0})).createIndex("createdAt","createdAt",{unique:!1}),void n.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0});2>c&&u&&((r=u.objectStore(Ot)).indexNames.contains("pendingDedupeKey")||r.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!1})),3>c&&u&&((i=u.objectStore(Ot)).indexNames.contains("pendingDedupeKey")&&i.deleteIndex("pendingDedupeKey"),(a=i.getAll()).onsuccess=function(){var t,n,r,o,s,c,u,l=a.result||[],d={};for(t=0;l.length>t;t++)(r=(n=l[t]).pendingDedupeKey||mt(n.record,n.endpointOverride))&&(d[r]||(d[r]=[]),d[r].push(n.id));for(o=Object.keys(d),s=0;o.length>s;s++)if((c=d[o[s]]).length>=2)for(c.sort(function(e,t){return e-t}),u=1;c.length>u;u++)i.delete(c[u]);try{i.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0})}catch(e){}},a.onerror=function(){try{i.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0})}catch(e){}})},o.onsuccess=function(){n(o.result)}})},vt.prototype._txDone=function(e){return new Promise(function(t,n){e.oncomplete=function(){t()},e.onerror=function(){n(e.error||Error("tx failed"))},e.onabort=function(){n(e.error||Error("tx aborted"))}})},vt.prototype._trimOverflow=function(e){var t=this,n=Ot,r=e.transaction(n,"readonly");return new Promise(function(e,t){var o=r.objectStore(n).count();o.onsuccess=function(){e(+(o.result||0))},o.onerror=function(){t(o.error)}}).then(function(e){return t._txDone(r).then(function(){return e})}).then(function(r){var o,i,a,s;if(r>t.maxSize)return o=r-t.maxSize,i=e.transaction(n,"readwrite"),a=i.objectStore(n).index("createdAt"),s=0,new Promise(function(e,t){var r=a.openCursor();r.onerror=function(){t(r.error)},r.onsuccess=function(){var t=r.result;if(!t||s>=o)return e();i.objectStore(n).delete(t.primaryKey),s++,t.continue()}}).then(function(){return t._txDone(i)})})},vt.prototype.enqueueMany=function(e){var t=this;return e&&e.length?this.openDb().then(function(n){var r,o;if(n)return r=Date.now(),o=e.map(function(e,t){var n=e&&"object"==typeof e&&"record"in e?e:{record:e},o=mt(n.record,n.endpointOverride||""),i={createdAt:r+t,record:n.record,endpointOverride:n.endpointOverride||"",retryCount:0,nextRetryAt:0};return o&&(i.pendingDedupeKey=o),i}),new Promise(function(e,t){var r,i=n.transaction(Ot,"readwrite"),a=i.objectStore(Ot);i.oncomplete=function(){e()},i.onerror=function(){t(i.error)},i.onabort=function(){t(i.error)},r=0,function e(){var n,i;o.length>r&&(n=o[r++],(i=a.add(n)).onsuccess=function(){e()},i.onerror=function(n){var r=i.error;if(r&&"ConstraintError"===r.name)return n.preventDefault(),void e();t(r||Error("add failed"))})}()}).then(function(){return t._trimOverflow(n)}).then(function(){n.close()}).catch(function(e){throw n.close(),e})}):Promise.resolve()},vt.prototype.readOldest=function(e){return e=e||20,this.openDb().then(function(t){var n,r;return t?(n=Date.now(),r=[],new Promise(function(o,i){var a=t.transaction(Ot,"readonly").objectStore(Ot).index("createdAt").openCursor();a.onerror=function(){i(a.error)},a.onsuccess=function(){var t,i,s,c,u,l=a.result;if(!l||r.length>=e)return o();(s=isFinite(i=+(t=l.value).nextRetryAt)?Math.floor(i):0)>n||((c=yt(t)).endpointOverride=t.endpointOverride||"",c.retryCount=isFinite(u=+t.retryCount)?Math.floor(u):0,c.nextRetryAt=s,r.push(c)),l.continue()}}).then(function(){return t.close(),r}).catch(function(e){throw t.close(),e})):[]})},vt.prototype.removeByIds=function(e){var t=this;return e&&e.length?this.openDb().then(function(n){var r,o,i;if(n){for(o=(r=n.transaction(Ot,"readwrite")).objectStore(Ot),i=0;e.length>i;i++)o.delete(e[i]);return t._txDone(r).then(function(){n.close()}).catch(function(e){throw n.close(),e})}}):Promise.resolve()},vt.prototype.updateRetryMeta=function(e,t,n){var r=this;return e&&e.length?this.openDb().then(function(o){var i,a,s,c,u,l,d,_,p,f,h,g,m,y,v;if(!o)return{dropped:0,kept:0};for(i=Date.now(),s=isFinite(a=+t)?Math.max(0,Math.floor(a)):0,u=isFinite(c=+n)?Math.max(0,Math.floor(c)):0,l=0,d=0,p=(_=o.transaction(Ot,"readwrite")).objectStore(Ot),f=0;e.length>f;f++)u<(m=(isFinite(g=+(h=e[f]).retryCount)?Math.floor(g):0)+1)?(l++,p.delete(h.id)):(d++,y=h.pendingDedupeKey||mt(h.record,h.endpointOverride||""),v=yt(h),y&&(v.pendingDedupeKey=y),v.retryCount=m,v.nextRetryAt=i+s,p.put(v));return r._txDone(_).then(function(){return o.close(),{dropped:l,kept:d}}).catch(function(e){throw o.close(),e})}):Promise.resolve({dropped:0,kept:0})},vt.prototype.count=function(){var e=this;return this.openDb().then(function(t){if(!t)return 0;var n=t.transaction(Ot,"readonly");return new Promise(function(e,t){var r=n.objectStore(Ot).count();r.onsuccess=function(){e(+(r.result||0))},r.onerror=function(){t(r.error)}}).then(function(r){return e._txDone(n).then(function(){return t.close(),r})}).catch(function(e){throw t.close(),e})})},Lt={navigation:{navigation_key:1,navigation_name:1},appPageView:{user_type:1,page_key:1,page_name:1,referrer_page_key:9,referrer_page_name:9,current_page_key:1,current_page_name:1,page_load_time:3,recommend_trace_id:0},appInstall:{trace_id:1,attribution_flag:2},pageClick:{page_key:1,page_name:1,click_page_x:3,click_page_y:3,click_x_percent:3,click_y_percent:3,screen_width:3,screen_height:3,recommend_trace_id:0},recommendListView:{page_key:1,page_name:1,recommend_content_type:1,recommend_trace_id:0,recommend_id:1,recommend_trace_info:0,client_version:0},recommendListClick:{page_key:1,page_name:1,recommend_content_type:1,recommend_trace_id:0,recommend_id:1,recommend_trace_info:0,client_version:0},advertising:{event_type:1,advertising_key:1,advertising_name:1,advertising_id:1},videoEvent:{media_id:0,video_id:1,video_title:1,video_type_id:1,video_type_name:1,video_content_type:9,recommend_trace_id:0,video_tag_key:9,video_tag_name:9,video_duration:3,play_duration:3,play_progress:3,play_speed:3,video_behavior_key:1,video_behavior_name:1,post_id:0},novelEvent:{media_id:0,novel_id:1,novel_title:1,chapter_id:0,chapter_name:0,novel_type_id:1,novel_type_name:1,recommend_trace_id:0,novel_tag_key:9,novel_tag_name:9,read_progress:3,page_no:3,novel_behavior_key:1,novel_behavior_name:1},comicEvent:{media_id:0,comic_id:1,comic_title:1,chapter_id:0,chapter_name:0,comic_type_id:1,comic_type_name:1,recommend_trace_id:0,comic_tag_key:9,comic_tag_name:9,read_progress:3,page_no:3,comic_behavior_key:1,comic_behavior_name:1},keywordSearch:{keyword:1,search_result_count:3,search_content_type:0,search_trace_id:0,search_id:0},keywordClick:{keyword:1,click_item_id:1,click_item_type_key:1,click_item_type_name:1,click_position:3,search_trace_id:0},adImpression:{page_key:1,page_name:1,ad_slot_key:1,ad_slot_name:1,ad_id:1,creative_id:0,ad_type:0},adClick:{page_key:1,page_name:1,ad_slot_key:1,ad_slot_name:1,ad_id:1,creative_id:0,ad_type:0},appPageitemExposure:{item_id:1,item_type:1,item_name:1,parent_item_id:1,page_key:1,page_name:1,referrer_page_key:9,referrer_page_name:9,recommend_trace_id:9,recommend_id:9,recommend_trace_info:9},appPageitemClick:{item_id:1,item_type:1,item_name:1,parent_item_id:1,position:3,page_key:1,page_name:1,recommend_trace_id:9,recommend_id:9,recommend_trace_info:9},adRequest:{request_id:1,ad_slot_key:1},adFill:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,fill_count:3,is_skippable:3,is_closable:3},adNoFill:{request_id:1,ad_slot_key:1,ad_type:1,reason:1},adLoadSuccess:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,load_duration:3},adImpressionSdk:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,material_size:1,is_skippable:3,is_closable:3},adClickSdk:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1},adClose:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,close_type:1},adError:{trace_id:1,request_id:0,ad_slot_key:1,ad_type:1,ad_id:9,error_code:1,error_msg:1,error_stage:1},imEvent:{conversation_id:1,conversation_type:1,current_uid:1,target_uid:1,target_role_key:1,target_role_name:1,message_id:9,message_type:9,im_behavior_key:1,im_behavior_name:1},imConversationView:{current_uid:1,conversation_count:3,total_unread_count:3,normal_conversation_count:3,archived_count:3,pinned_count:3},imConnectionSuccess:{current_uid:9,im_sdk_version:1},imMessageContent:{conversation_id:1,conversation_type:1,current_uid:1,target_uid:1,sender_uid:1,message_id:1,message_type:1,message:9,message_content_length:3,content_hash:9},postEvent:{media_id:0,post_id:1,post_title:1,post_create_time:3,post_user_id:1,post_user_nick:1,post_type_id:1,post_type_name:1,post_content_type:1,recommend_trace_id:9,post_tag_key:9,post_tag_name:9,post_behavior_key:1,post_behavior_name:1},dramaEvent:{media_id:0,drama_id:1,drama_title:1,episode:3,total_episode:3,video_id:1,drama_type_id:1,drama_type_name:1,drama_content_type:1,recommend_trace_id:9,drama_tag_key:9,drama_tag_name:9,drama_duration:3,play_duration:3,play_progress:3,play_speed:3,play_behavior_key:1,play_behavior_name:1},dramaStatusChange:{media_id:0,drama_id:1,drama_title:1,episode:3,video_id:1,pre_episode:3,drama_behavior_key:1,drama_behavior_name:1}},qt={message_send:"发送消息",message_receive:"收到消息",message_read:"消息已读",message_recall:"消息撤回",conversation_pin:"置顶会话",conversation_unpin:"取消置顶",conversation_archive:"归档会话",conversation_unarchive:"取消归档"},Bt=Object.keys(Rt={navigation:"navigation",appPageView:"app_page_view",appInstall:"app_install",pageClick:"page_click",recommendListView:"recommend_list_view",recommendListClick:"recommend_list_click",advertising:"advertising",videoEvent:"video_event",novelEvent:"novel_event",comicEvent:"comic_event",keywordSearch:"keyword_search",keywordClick:"keyword_click",adImpression:"ad_impression",adClick:"ad_click",appPageitemExposure:"app_pageitem_exposure",appPageitemClick:"app_pageitem_click",adRequest:"ad_request",adFill:"ad_fill",adNoFill:"ad_no_fill",adLoadSuccess:"ad_load_success",adImpressionSdk:"ad_impression_sdk",adClickSdk:"ad_click_sdk",adClose:"ad_close",adError:"ad_error",imEvent:"im_event",imConversationView:"im_conversation_view",imConnectionSuccess:"im_connection_success",imMessageContent:"im_message_content",postEvent:"post_event",dramaEvent:"drama_event",dramaStatusChange:"drama_status_change"}).reduce(function(e,t){var n=Rt[t];return e[t]="imEvent"===t?function(e){return{event:n,payload:kt(t,wt(e))}}:function(e){return{event:n,payload:kt(t,e||{})}},e},{}),Kt=function(){},Vt={sdk_init:1,app_lifecycle:1,network_state_change:1,app_session_summary:1,app_page_view:1,page_click:1},jt=6e4,Nt="__web_sdk_recent_ok_event_ids__",Ft=function(){function t(e){var t,n=Object.keys(r);for(t=0;n.length>t;t++)e-r[n[t]]>jt&&delete r[n[t]]}function n(){try{"undefined"!=typeof window&&window.localStorage&&window.localStorage.setItem(Nt,JSON.stringify(r))}catch(e){}}var r={};if(function(){var t,n,o,i,a;try{if("undefined"!=typeof window&&window.localStorage&&(t=window.localStorage.getItem(Nt)))for(n=JSON.parse(t),o=Date.now(),i=Object.keys(n),a=0;i.length>a;a++)/^[0-9a-f]{32}$/.test(i[a])&&(o-n[i[a]]>jt||(r[i[a]]=n[i[a]]))}catch(e){}}(),"undefined"!=typeof window)try{window.addEventListener("storage",function(e){var t,n,o,i,a;try{if(e.key!==Nt||!e.newValue)return;for(t=JSON.parse(e.newValue),n=Date.now(),o=Object.keys(t),i=0;o.length>i;i++)a=t[o[i]],/^[0-9a-f]{32}$/.test(o[i])&&(n-a>jt||(r[o[i]]=a))}catch(s){}})}catch(e){}return{has:function(e){var n,o;return!!e&&(t(n=Date.now()),void 0!==(o=r[e])&&jt>=n-o)},set:function(e){var o,i,a,s,c,u=Date.now();for(t(u),o=0;e.length>o;o++)e[o]&&(r[e[o]]=u);if((i=Object.keys(r)).length>500){for(a="",s=1/0,c=0;i.length>c;c++)s>r[i[c]]&&(s=r[i[c]],a=i[c]);a&&delete r[a]}n()},reset:function(){r={},n()}}}(),Pt.prototype.startReplayTimer=function(){var e=this;this.replayTimer=setInterval(function(){e.replayPersistent()},Zn)},Pt.prototype._stopTimer=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},Pt.prototype._settleItem=function(e,t){e.settled||(e.settled=!0,e.timeoutTimer&&(clearTimeout(e.timeoutTimer),e.timeoutTimer=null),e.resolve(t))},Pt.prototype._purgeSettled=function(){this.queue.length&&(this.queue=this.queue.filter(function(e){return!e.settled}))},Pt.prototype._toPersistentEntries=function(e){return e.map(function(e){return{record:e.record,endpointOverride:e.endpointOverride||"",retryCount:0,nextRetryAt:0}})},Pt.prototype._getRetryDelay=function(e){return Math.min(6e4,Math.max(Zn,Math.floor(Zn*Math.pow(2,Math.min(10,Math.max(0,e))))))},Pt.prototype.schedule=function(){var e=this;this._purgeSettled(),!this.timer&&this.queue.length&&(this.timer=setTimeout(function(){e.timer=null,e.flush().catch(function(){})},5e3))},Pt.prototype.flush=function(){var e=this,t=this.flushTail.then(function(){return e.flushOnce()});return this.flushTail=t.catch(function(){}),t},Pt.prototype._processFlushGroup=function(e,t,n){var r,o,i,a,s,c,u,l,d,_,p,f=this,h="__default__"===e?"":e,g=[],m=[];for(r=0;t.length>r;r++)((i=(((o=t[r]).record&&o.record.event_id||"")+"").trim())&&Ft.has(i)?m:g).push(o);for(a=0;m.length>a;a++)f._settleItem(m[a],{sent:!1,ok:!1,status:0,reason:"cross_batch_recent_success_deduped"});if(!g.length)return Promise.resolve();if(!f._resolveEndpoint){for(Kt("[sdk][web] _resolveEndpoint 未注入,事件无法发送"),s=0;g.length>s;s++)f._settleItem(g[s],{sent:!1,ok:!1,status:0,reason:"no_endpoint_resolver"});return Promise.resolve()}for(c={},u=[],l={},d=0;g.length>d;d++)c[p=(((_=g[d]).record&&_.record.event_id||"")+"").trim()||"__empty__:"+d]||(c[p]=!0,u.push(_.record),l[d]=!0);return f.resolver.consumeProbeFailurePersistSignal()?f.persistentQueue.enqueueMany(f._toPersistentEntries(g)).then(function(){f.hasPersistentItems=!0;for(var e=0;g.length>e;e++)f._settleItem(g[e],{sent:!1,ok:!1,status:0,reason:"probe_all_failed"})}).catch(function(){}):f._resolveEndpoint(h).then(function(e){var t,r,o,i,a,s;if(e){for(r=[],o=0;u.length>o;o++)if((i=((u[o]&&u[o].event_id||"")+"").trim())&&Ft.has(i)){for(a=0;g.length>a;a++)if(l[a]&&((g[a].record&&g[a].record.event_id||"")+"").trim()===i){f._settleItem(g[a],{sent:!1,ok:!1,status:0,reason:"cross_batch_recent_success_deduped"}),l[a]=!1;break}}else r.push(u[o]);if(!r.length){for(s=0;g.length>s;s++)l[s]||f._settleItem(g[s],{sent:!1,ok:!1,status:0,reason:"batch_deduped_duplicate"});return Promise.resolve()}return ut(e,r,{useBeacon:rr}).then(function(e){var t,n,o,i,a,s=Promise.resolve();if(e&&e.ok){for(t=[],n=0;r.length>n;n++)(o=((r[n]&&r[n].event_id||"")+"").trim())&&t.push(o);Ft.set(t)}else{for(i=[],a=0;g.length>a;a++)l[a]&&i.push(g[a]);s=f.persistentQueue.enqueueMany(f._toPersistentEntries(i)).then(function(){f.hasPersistentItems=!0}).catch(function(){})}return s.then(function(){for(var t=0;g.length>t;t++)f._settleItem(g[t],l[t]?e:{sent:!1,ok:!1,status:0,reason:"batch_deduped_duplicate"})})})}if("unavailable"===f.resolver.getEndpointState())return f.persistentQueue.enqueueMany(f._toPersistentEntries(g)).then(function(){f.hasPersistentItems=!0;for(var e=0;g.length>e;e++)f._settleItem(g[e],{sent:!1,ok:!1,status:0,reason:"endpoint_unavailable"})}).catch(function(){});for(t=0;g.length>t;t++)n.push(g[t])})},Pt.prototype.flushOnce=function(){var e,t,n,r,o,i,a,s,c,u=this;if(this._purgeSettled(),!this.queue.length)return Promise.resolve();for(this._stopTimer(),e=this.queue.splice(0,10),t={},n=0;e.length>n;n++)(r=e[n]).settled||(t[o=r.endpointOverride||"__default__"]||(t[o]=[]),t[o].push(r));for(i=[],a=Object.keys(t),s=Promise.resolve(),c=0;a.length>c;c++)(function(e){s=s.then(function(){return u._processFlushGroup(e,t[e],i)})})(a[c]);return s.then(function(){var e,t,n,r,o,a,s;if(i.length){for(e=Date.now(),t=[],n=[],r=0;i.length>r;r++)(i[r].timeoutAt>e?n:t).push(i[r]);for(o=0;n.length>o;o++)u.queue.push(n[o]);for(a=Promise.resolve(),s=0;t.length>s;s++)(function(e){a=a.then(function(){return u.persistentQueue.enqueueMany(u._toPersistentEntries([e])).catch(function(){}).then(function(){u.hasPersistentItems=!0,u._settleItem(e,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})})})(t[s]);return a}}).then(function(){u.queue.length&&u.schedule()},function(e){throw u.queue.length&&u.schedule(),e})},Pt.prototype._processReplayGroup=function(e,t){var n=this;return n._resolveEndpoint?n._resolveEndpoint("__default__"===e?"":e).then(function(e){var r,o,i,a,s,c,u,l,d;if(e){for(r={},o=[],i=[],a=[],s=0;t.length>s;s++)u=(((c=t[s]).record&&c.record.event_id||"")+"").trim()||"__empty__:"+c.id,(l=((c.record&&c.record.event_id||"")+"").trim())&&Ft.has(l)||r[u]?a.push(c.id):(r[u]=!0,o.push(c.record),i.push(c.id));return d=Promise.resolve(),a.length&&(d=d.then(function(){return n.persistentQueue.removeByIds(a)})),o.length?d.then(function(){return ut(e,o,{useBeacon:rr})}).then(function(e){var r,s,c,u,l,d,_,p,f,h;if(e&&e.ok){for(r=[],s=0;o.length>s;s++)(c=((o[s]&&o[s].event_id||"")+"").trim())&&r.push(c);for(Ft.set(r),u=[],l=0;i.length>l;l++)u.push(i[l]);for(d=0;a.length>d;d++)u.push(a[d]);return n.persistentQueue.removeByIds(u)}for(_=0,p=0;t.length>p;p++)(f=t[p].retryCount||0)>_&&(_=f);return h=n._getRetryDelay(_),n.persistentQueue.updateRetryMeta(t,h,5)}):d}}):(Kt("[sdk][web] _resolveEndpoint 未注入,持久队列重试跳过"),Promise.resolve())},Pt.prototype.replayPersistent=function(){var e=this;return!this.hasPersistentItems||this.replaying?Promise.resolve():(this.replaying=!0,this.persistentQueue.readOldest(10).then(function(t){var n,r,o,i,a,s,c;if(!t.length)return e.persistentQueue.count().then(function(t){0===t&&(e.hasPersistentItems=!1)});for(n={},r=0;t.length>r;r++)n[i=(o=t[r]).endpointOverride||"__default__"]||(n[i]=[]),n[i].push(o);for(a=Object.keys(n),s=Promise.resolve(),c=0;a.length>c;c++)(function(t){s=s.then(function(){return e._processReplayGroup(t,n[t])})})(a[c]);return s}).catch(function(){}).then(function(){e.replaying=!1},function(){e.replaying=!1}))},Pt.prototype.enqueueAssembled=function(e,t){var n=this;return(n._getEventCodes?n._getEventCodes():Promise.resolve([])).then(function(r){return r&&0===r.length||r&&-1===r.indexOf(e.event)?{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}:new Promise(function(r){var o={record:e,endpointOverride:t||"",resolve:r,reject:r,settled:!1,timeoutAt:Date.now()+er,timeoutTimer:null};o.timeoutTimer=setTimeout(function(){o.settled||n.persistentQueue.enqueueMany(n._toPersistentEntries([o])).catch(function(){}).then(function(){n.hasPersistentItems=!0,n._settleItem(o,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})},er),n.queue.push(o),10>n.queue.length?n.schedule():n.flush().catch(function(){})})})},Pt.prototype.track=function(e,t){var n=this;return Q().then(function(r){var o={appId:n.opts.appId,channel:n.opts.channel,uid:n.opts.uid||"",deviceId:n.opts.deviceId||r,deviceType:y(),sdkVersion:$n,appVersion:v(n.opts.appVersion)};return(n._getSigningConfig?n._getSigningConfig():Promise.resolve({hmacKey:"",securityKeyVersion:""})).then(function(t){return $e(o,e,t)}).then(function(e){return delete e._sessionInfo,(n._getEventCodes?n._getEventCodes():Promise.resolve([])).then(function(r){return r&&0===r.length?(Kt("[sdk][web] 当前没有事件允许上报,请检查服务端配置(eventCodes 为空)"),{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}):r&&-1===r.indexOf(e.event)?(Kt('[sdk][web] 事件 "'+e.event+'" 不在服务端允许上报的列表中,已忽略'),{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}):new Promise(function(r,o){var i={record:e,endpointOverride:t||"",resolve:r,reject:o,settled:!1,timeoutAt:Date.now()+er,timeoutTimer:null};i.timeoutTimer=setTimeout(function(){i.settled||n.persistentQueue.enqueueMany(n._toPersistentEntries([i])).catch(function(){}).then(function(){n.hasPersistentItems=!0,n._settleItem(i,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})},er),n.queue.push(i),10>n.queue.length?n.schedule():n.flush().catch(function(){})})})})})},Pt.prototype.stop=function(){var e,t;this._stopTimer(),this.replayTimer&&(clearInterval(this.replayTimer),this.replayTimer=null),e={sent:!1,ok:!1,status:0,reason:"stopped"},t=this,this.queue.splice(0).forEach(function(n){t._settleItem(n,e)})},Pt.prototype.getConfig=function(){return{batchMaxSize:10,batchIntervalMs:5e3,replayBatchSize:10,replayIntervalMs:Zn}},Et.prototype._sdkOpts=function(){return{appId:this.options.appId,channel:this.options.channel,uid:this.options.uid||"",deviceId:this.options.deviceId||"",deviceType:y(),sdkVersion:$n,appVersion:v(this.options.appVersion)}},Et.prototype._isAutoDisabled=function(e){return!(!this._disableAutoEvents||!this._disableAutoEvents[e])},Et.prototype._handleEndedSession=function(t){var n,r,o,i,a,s,c;return t&&t.sid&&!this._ssrSkipped?this._isAutoDisabled("app_session_summary")?Promise.resolve():function(t){if(!t)return!1;if(Pn[t]||En[t])return!1;if(se())try{if(window.sessionStorage.getItem(bn+(t+"")))return Pn[t]=1,!1}catch(e){}return En[t]=1,!0}(t.sid)?(n=this,o=t.sid,a=(null!=t.sessionEndTs?1e12>t.sessionEndTs?1e3*t.sessionEndTs:t.sessionEndTs:Date.now())||Date.now(),s=fe(o),c=!Sn||Sn===o||!s&&(xn.eventCountTotal>0||xn.currentPage||(xn.pageStayList||[]).length>0),s&&Sn&&Sn!==o&&(c=!1),s&&c&&(s.eventCountTotal||0)>(xn.eventCountTotal||0)&&(c=!1),c?(xe(),i=ce(xn)):i=s?function(e,t){var n,r,o,i=e&&e.currentPage;return i?(n=t||Date.now(),r=i.accumulated_ms||0,null!=i.resume_at_ms&&(r+=Math.max(0,n-i.resume_at_ms)),o={page_key:i.page_key,page_name:i.page_name||"",stay_duration_ms:r,enter_time:Math.floor((i.enter_time||n)/1e3),has_interaction:i.has_interaction?1:0},i.page_seq_in_sid&&(o.page_seq_in_sid=i.page_seq_in_sid),e.pageStayList=be((e.pageStayList||[]).concat([o])),e.currentPage=null,e):e}(ce(s),a):{eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},pe(o,{sid:o,savedAt:Date.now(),sessionStartedAt:Dn,behaviorHash:ne(),metrics:i}),r=i,Q().then(function(e){var o=bt(n._sdkOpts(),{deviceId:e});return n.configMgr.getSigningConfig().then(function(e){var n=Me(t,t.endReason,r);return it(o,n,e,t.sid)})}).then(function(e){return e}).then(function(e){return delete e._sessionInfo,n.batcher.enqueueAssembled(e,"")}).then(function(){var n,r;!function(t){if(t&&(delete En[t],Pn[t]=1,se()))try{window.sessionStorage.setItem(bn+(t+""),"1")}catch(e){}}(t.sid),ke(t.sid),n={pageKey:Ln||"",pageName:Rn||""},r=function(e){if(!e||null==e.sessionStartTs)return Date.now();var t=e.sessionStartTs;return 1e12>t?1e3*t:t}(F()),function(t,n){var r,o;t&&function(t){if(t){if(se())try{window.sessionStorage.removeItem(de(t))}catch(e){}if(ye())try{window.localStorage.removeItem(de(t))}catch(e){}}}(t),xn={eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},Dn=r=n&&"number"==typeof n.sessionStartMs&&isFinite(n.sessionStartMs)?n.sessionStartMs:Date.now(),xn.lastOrientation=re(),mn.reset(),Cn=!0,Sn=z()||"",(o=n&&n.carryOver)&&o.pageKey?function(t,n,r){var o,i,a,s,c=((t||"")+"").trim();if(!c)return!1;o="number"==typeof r&&isFinite(r)?r:Date.now(),i=Date.now(),a=!1;try{a="undefined"!=typeof document&&"hidden"===document.visibilityState}catch(e){}xn.pageKeys[c]=1,s=ae(),xn.currentPage={page_key:c,page_name:(n||"")+"",enter_time:o,enter_time_ms:o,page_seq_in_sid:s,has_interaction:!1,accumulated_ms:0,resume_at_ms:a?null:i,hidden_paused:a},me()}(o.pageKey,o.pageName,r):me()}(t.sid,{sessionStartMs:r,carryOver:n.pageKey?{pageKey:n.pageKey,pageName:n.pageName}:null})}).catch(function(){var e;(e=t.sid)&&delete En[e],function(e){if(e&&e.sid){var t=ve().filter(function(t){return t&&t.sid!==e.sid});t.push(e),we(t)}}({sid:t.sid,sessionStartTs:t.sessionStartTs,sessionEndTs:t.sessionEndTs,endReason:t.endReason,fields:Me(t,t.endReason,r)})})):Promise.resolve():Promise.resolve()},Et.prototype._replayPendingSummaries=function(e,t,n){var r,o,i=ve();if(!i.length)return Promise.resolve();for(r=Promise.resolve(),o=0;i.length>o;o++)(function(o){r=r.then(function(){return n(it(e,o.fields,t,o.sid)).then(function(){return ke(o.sid),null}).catch(function(){})})})(i[o]);return r},Et.prototype._startAutoEvents=function(){if(!this._ssrSkipped&&!this._autoEventsStarted){var t=this;this._autoEventsStarted=!0,qn=function(e){t._handleEndedSession(e).catch(function(){})},Z().then(function(){return Q()}).then(function(n){var r=bt(t._sdkOpts(),{deviceId:n});return t.configMgr.getSigningConfig().then(function(n){return t.configMgr.fetchAndDecryptConfig().then(function(o){function i(e){return!s||-1!==s.indexOf(e)}function a(e){return i(e)&&!t._isAutoDisabled(e)}var s=o.eventCodes&&o.eventCodes.length>0?o.eventCodes:null,c=function(e){return e.then(function(e){return delete e._sessionInfo,t.batcher.enqueueAssembled(e,"")})};return t._replayPendingSummaries(r,n,c).then(function(){function o(e){if(!s&&(s=!0,a("app_session_summary"))){var n=function(e){var t,n,r=Date.now()||Date.now(),o=F();return o?(t=Y(o,e||"web_visibility_hidden",r),"web_visibility_hidden"!==e&&"app_exit"!==e||(t.sessionEndTs=r),N(n=H(r)),{endedSession:t,sid:n.sid}):null}(e);n&&n.endedSession&&t._handleEndedSession(n.endedSession).catch(function(){})}}var s,u,l,d,_,p,f,h,g,m,y,v,w,k,b;a("sdk_init")&&c(function(e,t){var n,r=fn||{},o={},i=Object.keys(r);for(n=0;i.length>n;n++)o[i[n]]=r[i[n]];return $e(e,{event:"sdk_init",payload:o},t)}(r,n)).catch(function(){}),a("app_lifecycle")&&(t._webLoadTeardown=function(t,n,r){function o(){a||(a=!0,s&&(window.removeEventListener("load",s,!1),s=null),t(ot(n,Kn,{},r)).catch(function(){}))}function i(){(function(){var t,n,r;try{if("undefined"!=typeof performance&&performance.timing&&(t=performance.timing).loadEventEnd&&t.navigationStart&&t.loadEventEnd>0)return!0;if("undefined"!=typeof performance&&"function"==typeof performance.getEntriesByType&&(n=performance.getEntriesByType("navigation"))&&n.length>0&&(r=n[0]).loadEventEnd>0&&r.fetchStart>=0)return!0}catch(e){}return!1})()&&o()}var a,s;return"undefined"==typeof window?(t(ot(n,Kn,{},r)).catch(function(){}),function(){}):(a=!1,s=null,"complete"===document.readyState?(i(),a||o(),function(){}):(s=function(){i(),a||o()},window.addEventListener("load",s,!1),setTimeout(function(){a||o()},1e4),function(){a=!0,s&&(window.removeEventListener("load",s,!1),s=null)}))}(c,r,n)),s=!1,t._autoLifecycleTeardown=function(e,t){var n,r,o,i,a;return"undefined"==typeof window||"undefined"==typeof document?function(){}:(r=!0===(n=t||{}).webMode,o=function(){"visible"===document.visibilityState?r?n.onVisible&&n.onVisible():e(Vn,{}):"hidden"===document.visibilityState&&(r?n.onVisibleHidden&&n.onVisibleHidden():e(jn,{}),n.onHidden&&n.onHidden())},i=function(){e(Nn,rt()),n.onPageUnload&&n.onPageUnload()},a=function(e){e&&e.persisted||n.onPageHide&&n.onPageHide()},window.addEventListener("visibilitychange",o,!1),window.addEventListener("beforeunload",i,!1),window.addEventListener("pagehide",a,!1),function(){window.removeEventListener("visibilitychange",o,!1),window.removeEventListener("beforeunload",i,!1),window.removeEventListener("pagehide",a,!1)})}(function(e,t){return a("app_lifecycle")?c(ot(r,e,t||{},n)):Promise.resolve()},{onHidden:function(){t.batcher.flush().catch(function(){})},onPageUnload:function(){t.batcher.flush().catch(function(){}),o("app_exit")},onPageHide:function(){t.batcher.flush().catch(function(){}),o("web_visibility_hidden")}}),t._autoNetworkTeardown=(l=function(e){return a("network_state_change")?c(function(e,t,n){return $e(e,{event:"network_state_change",payload:t||{}},n)}(r,e,n)):Promise.resolve()},"undefined"==typeof navigator?function(){}:(d=navigator.connection||navigator.mozConnection||navigator.webkitConnection)?(_="unknown",p=d.type?d.type+"":"",f="boolean"==typeof navigator.onLine?navigator.onLine:null,d.onchange=function(){var e,t,n,r,o,i,a=d.type?d.type+"":"",s="boolean"==typeof navigator.onLine?navigator.onLine:null;(a!==p||s!==f)&&(p=a,f=s,r="boolean"==typeof(t=s)?t?1:0:-1,"none"==(n=(a||"")+"")&&1===r?n="unknown":n&&"none"!==n&&"unknown"!==n&&0===r&&(r=1),l(at({network_type:_,from_network_type:_,to_network_type:_,is_online:(e={connection_type:n,is_online:r}).is_online,change_count_in_sid:(xn.networkChangeCount||0)+1},(i={},(o=e.connection_type)?i.connection_type=o+"":d.type&&(i.connection_type=d.type+""),d.effectiveType&&(i.effective_type=d.effectiveType+""),null!=d.downlink&&(i.downlink=Math.round(1e3*d.downlink)),null!=d.rtt&&(i.rtt=d.rtt),i))))},function(){d.onchange=null}):function(){}),t._webInteractionTeardown="undefined"==typeof window||"undefined"==typeof document?function(){}:(h=function(e){!e||e.repeat||e.isComposing||(Se(),he(),xn.keydownTotalCount++,me())},g=function(e){var t,n=e&&e.target;(function(t){if(!t||1!==t.nodeType)return!1;var n=((t.tagName||"")+"").toLowerCase();if("input"===n||"textarea"===n)return!0;try{if(t.isContentEditable)return!0}catch(e){}return!1})(n)&&(t=Date.now(),Fn===n&&50>t-Hn||(Fn=n,Hn=t,Se(),he(),xn.inputCount++,me()))},m=function(e){(function(t){if(!t||1!==t.nodeType)return!1;var n=((t.tagName||"")+"").toLowerCase();if("input"===n||"textarea"===n||"select"===n)return!0;try{if(t.isContentEditable)return!0}catch(e){}return!1})(e&&e.target)&&(Se(),he(),xn.focusTotalCount++,me())},y=function(){Pe()},v=function(e){e&&e.changedTouches&&e.changedTouches.length&&(Se(),he(),xn.touchTotalCount++,me(),e.touches&&1===e.touches.length?(Un=e.touches[0].clientX,Xn=e.touches[0].clientY,Yn=Date.now(),ct(),zn=!1,Gn=setTimeout(function(){zn=!0,he(),xn.longPressTotalCount++,me()},500)):(Yn=0,ct()),e.touches&&2===e.touches.length&&(Wn=st(e.touches),Jn=!1))},w=function(e){var t,n,r;e&&e.touches&&(1===e.touches.length&&Yn>0&&Math.sqrt((t=e.touches[0].clientX-Un)*t+(n=e.touches[0].clientY-Xn)*n)>8&&ct(),2===e.touches.length&&(r=st(e.touches),null==Wn||Jn||12>Math.abs(r-Wn)||(he(),xn.pinchTotalCount++,me(),Jn=!0),Wn=r))},k=function(e){var t,n;ct(),Yn>0&&e.changedTouches&&e.changedTouches.length&&!zn&&(30>Math.sqrt((t=e.changedTouches[0].clientX-Un)*t+(n=e.changedTouches[0].clientY-Xn)*n)||(he(),xn.swipeTotalCount++,me())),Yn=0,zn=!1,e.touches&&e.touches.length>=2||(Wn=null,Jn=!1)},b=function(){ct(),Yn=0,zn=!1,Wn=null,Jn=!1},document.addEventListener("keydown",h,!1),document.addEventListener("input",g,!1),document.addEventListener("focusin",m,!1),window.addEventListener("orientationchange",y,!1),document.addEventListener("touchstart",v,!1),document.addEventListener("touchmove",w,!1),document.addEventListener("touchend",k,!1),document.addEventListener("touchcancel",b,!1),Pe(),function(){document.removeEventListener("keydown",h,!1),document.removeEventListener("input",g,!1),document.removeEventListener("focusin",m,!1),window.removeEventListener("orientationchange",y,!1),document.removeEventListener("touchstart",v,!1),document.removeEventListener("touchmove",w,!1),document.removeEventListener("touchend",k,!1),document.removeEventListener("touchcancel",b,!1),ct()}),(i("app_page_view")||i("page_click"))&&(u=a("app_page_view"),t._pageTrackerTeardown=function(t){function n(){if(u.resolvePageKey)try{var t=u.resolvePageKey();if(t)return qe(t+"")}catch(e){}return Be()}function r(){var e,t=n(),r=ze({previousPageKey:d,previousPageName:_,pageKey:t});d=t,_=r.page_name,Ln=t,Rn=r.page_name||"",l&&(e=ae(),function(e,t,n,r){he(),xn.eventCountTotal++,xn.lastEventName="app_page_view",xn.pageViewCount++;var o=(e||"")+"";o&&(xn.pageKeys[o]=1),Te(o,t,n,r),me()}(t,r.page_name,Math.floor(Date.now()/1e3),e),r._pageSeqPrealloc=e,r._metricsRecorded=1,u.onPageView&&u.onPageView(r))}function o(){var t,n,r,o,i=Date.now();200>i-Mn||(Mn=i,(t=Ke())&&(r=(n=t.scrollTop||0)-In,In=n,o=function(){var t,n,r;try{return(t=Ke())?(n=Math.max(0,(t.scrollHeight||0)-(t.clientHeight||0)))>0?{depthPercent:Math.min(100,Math.max(0,Math.round((r=t.scrollTop||0)/n*100))),atBottom:r>=n-8}:{depthPercent:0,atBottom:!0}:{depthPercent:0,atBottom:!1}}catch(e){return{depthPercent:0,atBottom:!1}}}(),u.onScroll&&u.onScroll(r,o.depthPercent,o.atBottom)))}function i(e){var t,r,o,i;e&&0>=e.button&&((t=e.target)&&"function"==typeof t.closest&&t.closest("[data-sdk-no-auto-click]")||(r=null!=e.clientX?e.clientX:0,o=null!=e.clientY?e.clientY:0,i=Ye(e),setTimeout(function(){if(!function(e,t){var n,r;for(function(e){for(var t=An.length-1;t>=0;t--)e-An[t].t>300&&An.splice(t,1)}(Date.now()),n=0;An.length>n;n++)if(10>=Math.abs((r=An[n]).x-e)&&10>=Math.abs(r.y-t))return!0;return!1}(r,o)){Se();var e=function(e,t){var n=e||{},r=qe(n.pageKey||Be()),o=Ye(t);return Ae({page_key:r,page_name:n.pageName||"undefined"!=typeof document&&document.title||r,recommend_trace_id:"",referrer_page_key:n.previousPageKey||"",is_sdk_auto_collected:1,_clickSnap:o},Ge(o))}({pageKey:d||n(),pageName:_,previousPageKey:d},i);u.onPageClick&&u.onPageClick(e)}},50)))}function a(){Ie(),r()}function s(e){e&&e.persisted&&r()}function c(){var e,t,n=Ke();In=n&&n.scrollTop||0,r(),!p&&window.history&&(p=!0,e=history.pushState,t=history.replaceState,history.pushState=function(){var t=e.apply(history,arguments);return Ie(),setTimeout(r,0),t},history.replaceState=function(){var e=t.apply(history,arguments);return Ie(),setTimeout(r,0),e},window.addEventListener("popstate",a,!1))}var u,l,d,_,p;return"undefined"==typeof window||"undefined"==typeof document?function(){}:(l=!1!==(u=t||{}).enableAutoPageView,d="",_="",p=!1,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",c,!1):c(),window.addEventListener("pageshow",s,!1),window.addEventListener("scroll",o,!1),document.addEventListener("click",i,!0),function(){document.removeEventListener("click",i,!0),window.removeEventListener("scroll",o,!1),window.removeEventListener("pageshow",s,!1),window.removeEventListener("popstate",a,!1),document.removeEventListener("DOMContentLoaded",c,!1)})}({resolvePageKey:t.options.pageKeyResolver,enableAutoPageView:u,onPageView:function(e){u&&t.batcher.track({event:"app_page_view",payload:e},"").catch(function(){})},onPageClick:function(e){a("page_click")&&t.batcher.track({event:"page_click",payload:e},"").catch(function(){})},onScroll:function(e,t,n){!function(e,t,n){var r,o;he(),8>(r=Math.abs(e))||(xn.hasScrolled||(xn.hasScrolled=!0,xn.firstScrollDelayMs=Math.max(0,Date.now()-Dn)),xn.scrollTotalCount++,xn.scrollTotalDistance+=r,o=e>0?1:-1,0!==xn.lastScrollDirection&&o!==xn.lastScrollDirection&&xn.scrollDirectionChangeCount++,xn.lastScrollDirection=o,0>e?xn.scrollUpCount++:e>0&&xn.scrollDownCount++,null!=t&&(xn.maxScrollDepthPercent=Math.max(xn.maxScrollDepthPercent,Math.min(100,Math.max(0,Math.round(t))))),n&&(xn.isReachBottom=1),me())}(e,t,n)}})),t._sessionPollTimer&&clearInterval(t._sessionPollTimer),t._sessionPollTimer=setInterval(function(){var e=G();e.endedSession&&t._handleEndedSession(e.endedSession).catch(function(){})},6e4)})})})}).catch(function(){})}},Et.prototype._init=function(e){var t,n,r;if(this._ssrSkipped)return this._buildInitReturn();for(t=Object.keys(e||{}),n=0;t.length>n;n++)this.options[t[n]]=e[t[n]];return null==this.options.channel&&(this.options.channel=""),this._disableAutoEvents=Ct(this.options.disableAutoEvents),this.options.disableAutoEvents=St(this._disableAutoEvents),this.configMgr.setEncryptedConfig(this.options.encryptedConfig||this.options.configCipher||""),this.configMgr.prewarm(),r=this,this.resolver.init(function(){return r.configMgr.getBatchEndpoints()}),this._refreshTimer&&clearInterval(this._refreshTimer),this._refreshTimer=setInterval(function(){r.refreshConfig()},12e5),this._unsubReady&&this._unsubReady(),this._unsubReady=this.resolver.onEndpointReady(function(){r.batcher.flush().catch(function(){})}),this._buildInitReturn()},Et.prototype.refreshConfig=function(){var e=this;return this.configMgr.forceRefresh(),this.resolver.refreshDomainConfig(function(){return e.configMgr.getBatchEndpoints()}).catch(function(){})},Et.prototype.track=function(e,t){return this._ssrSkipped?Promise.resolve({sent:!1,ok:!0,status:0,reason:"ssr_skipped"}):this.batcher.track(e,t)},Et.prototype.setContext=function(e){if(this._ssrSkipped)return this.getConfig();var t=e&&"object"==typeof e?e:{};return Object.prototype.hasOwnProperty.call(t,"uid")&&(this.options.uid=null==t.uid?"":t.uid+""),Object.prototype.hasOwnProperty.call(t,"channel")&&(this.options.channel=null==t.channel?"":t.channel+""),this.batcher.opts=bt(this.options),this.getConfig()},Et.prototype.setUid=function(e){return this.setContext({uid:e})},Et.prototype.getSelectedHost=function(){var e,t;return this._ssrSkipped||!this.resolver?"":(e=this.resolver.getSelectedBatchEndpoint())&&(t=/^(https?:\/\/[^/]+)/.exec(e))?t[1]:""},Et.prototype._buildInitReturn=function(){return this._ssrSkipped||!this.batcher?{selectedHost:"",version:$n}:bt(this.batcher.getConfig(),{selectedHost:this.getSelectedHost(),version:$n})},Et.prototype.getConfig=function(){if(this._ssrSkipped||!this.batcher)return bt(this.options,{selectedHost:"",selectedBatchEndpoint:"",version:$n});var e=bt(this.options,this.batcher.getConfig(),{selectedHost:this.getSelectedHost(),selectedBatchEndpoint:this.resolver.getSelectedBatchEndpoint(),version:$n});return delete e.encryptedConfig,delete e.configCipher,e},Et.prototype.flush=function(){return this._ssrSkipped?Promise.resolve():this.batcher.flush()},Et.prototype.refreshDomainConfig=function(){if(this._ssrSkipped)return Promise.resolve({selectedBatchEndpoint:"",selectedHost:"",version:$n});var e=this;return this.resolver.refreshDomainConfig(function(){return e.configMgr.getBatchEndpoints()}).then(function(t){return{selectedBatchEndpoint:t,selectedHost:e.getSelectedHost(),version:$n}})},Et.prototype.stop=function(){this._ssrSkipped||(this._sessionPollTimer&&(clearInterval(this._sessionPollTimer),this._sessionPollTimer=null),this._pageTrackerTeardown&&(this._pageTrackerTeardown(),this._pageTrackerTeardown=null),this._webInteractionTeardown&&(this._webInteractionTeardown(),this._webInteractionTeardown=null),this._webLoadTeardown&&(this._webLoadTeardown(),this._webLoadTeardown=null),this._autoLifecycleTeardown&&(this._autoLifecycleTeardown(),this._autoLifecycleTeardown=null),this._autoNetworkTeardown&&(this._autoNetworkTeardown(),this._autoNetworkTeardown=null),this._unsubReady&&(this._unsubReady(),this._unsubReady=null),this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=null),this.batcher.stop())},Ht=null,Ut=[],Xt=null,(Yt=Dt).setContext=function(e){return Tt().setContext(e)},Yt.setUid=function(e){return Tt().setUid(e)},Yt.setChannel=function(e){return Tt().setContext({channel:e})},Yt.notifyPageLoad=function(){!function(){if(cn=null,V())try{window.sessionStorage.removeItem(tn),window.sessionStorage.removeItem(nn)}catch(e){}}(),G(Date.now())},Yt.debugInvalidateSessionCache=function(){W()},Yt.debugForceEnsureSession=function(){var e,t;return W(),e=G(),t=Tt(),e.endedSession&&t._handleEndedSession(e.endedSession).catch(function(){}),e},Yt.getConfig=function(){return Tt().getConfig()},Yt.flush=function(){return Tt().flush()},Yt.refreshDomainConfig=function(){return Tt().refreshDomainConfig()},Yt.stop=function(){Ht?(Ht.stop(),Ht=null):Ut.length=0},Yt.version=$n,Yt.getCommonFields=function(e){var t=Ht?Ht.getConfig():{};return Z().then(function(){return Q().then(function(n){var r,o,i,a,s=B({appId:t.appId,channel:t.channel,uid:t.uid,deviceId:t.deviceId||n,sid:(a=z(),a||G().sid),deviceType:y(),deviceBrand:"",deviceModel:"",deviceFingerprint:ee(),fpVersion:te(),sdkVersion:$n,appVersion:v(t.appVersion)});if(!Array.isArray(e)||!e.length)return s;for(r={},o=0;e.length>o;o++)(i=((e[o]||"")+"").trim())&&(r[i]=Object.prototype.hasOwnProperty.call(s,i)?s[i]:"");return r})})},Yt.getCommonField=function(e){var t=((e||"")+"").trim();return t?Yt.getCommonFields([t]).then(function(e){return e[t]}):Promise.resolve("")},Yt.init=function(e){var t,n,r,o;return Ht&&(t=Ht,Ht=null,t.flush().catch(function(){}).then(function(){t.stop()})),n=new Et(e),Ht=n,o=xt(Ut.splice(0),n,0).then(function(){Xt===r&&(Xt=null)},function(){Xt===r&&(Xt=null)}),Xt=r=o,bt(n._buildInitReturn(),{track:Yt.track,setContext:Yt.setContext,setUid:Yt.setUid,setChannel:Yt.setChannel,notifyPageLoad:Yt.notifyPageLoad,getCommonFields:Yt.getCommonFields,getCommonField:Yt.getCommonField})},Gt=function(){return Kt("[sdk][web] 非法上报:禁止直接调用 WebSDK.track({...}),请使用 WebSDK.track.videoEvent({...}) 等具名方法"),Promise.resolve({sent:!1,ok:!1,status:0,reason:"direct_track_forbidden"})},Object.keys(Bt).forEach(function(t){var n=Bt[t];Gt[t]=function(r,o){try{return Dt(n(r),o)}catch(e){if(e&&"EventValidationError"===e.name)return Promise.resolve({sent:!1,ok:!1,status:0,reason:"event_validation_failed",event:e.eventMethod||t,missingFields:e.missingFields||[],typeErrorFields:e.typeErrorFields||[]});throw e}}}),Yt.track="undefined"!=typeof Proxy?new Proxy(Gt,{get:function(e,t){return"string"!=typeof t||t in e||!/^[a-z]/.test(t)?e[t]:function(){return Kt('[sdk][web] 未知上报事件 "'+t+'",该方法不存在,事件未上报'),Promise.resolve({sent:!1,ok:!1,status:0,reason:"unknown_event_method",method:t})}}}):Gt,"undefined"!=typeof globalThis)try{globalThis.WebSDK=Yt}catch(e){}else"undefined"!=typeof window&&(window.WebSDK=Yt);return Yt}); diff --git a/scripts/smoke-api.mjs b/scripts/smoke-api.mjs index e2c4cd1..e3119c9 100644 --- a/scripts/smoke-api.mjs +++ b/scripts/smoke-api.mjs @@ -36,10 +36,10 @@ if (!publicOnly) { } console.log("PASS: SSR homepage"); -const checks = ["config/info", "config/footer/info", "navigation/header", "translation/category/list", "theme/list", "playlet/tag/options", "playlet/all/list?sortType=1&pageNum=1&pageSize=4", "playlet/hot/list?pageNum=1&pageSize=4", ...[1,2,3].map(rank=>`playlet/hot/rank/list?rankType=${rank}&pageNum=1&pageSize=4`), "playlet/topic/list?pageNum=1&pageSize=4", "applist/list?categoryId=0", "recharge/package/list", "playlet/hot-like", ...(!publicOnly?["auth/getInfo", "user/center/data", "playlet/history/list?pageNum=1&pageSize=4", "playlet/collect/list?pageNum=1&pageSize=4&watchStatus=0", "playlet/bought/list?pageNum=1&pageSize=4", "coin/trans/list?page=1&pageSize=10&type=0"]:[])]; +const checks = ["config/info", "config/footer/info", "navigation/header", "translation/category/list", "theme/list", "playlet/tag/options", "playlet/all/list?sortType=1&pageNum=1&pageSize=4", "playlet/hot/list?pageNum=1&pageSize=4", ...[1,2,3].map(rank=>`playlet/hot/rank/list?rankType=${rank}&pageNum=1&pageSize=4`), "playlet/topic/list?pageNum=1&pageSize=4", "applist/list?categoryId=0", "playlet/hot-like", ...(!publicOnly?["auth/getInfo", "user/center/data", "playlet/history/list?pageNum=1&pageSize=4", "playlet/collect/list?pageNum=1&pageSize=4&watchStatus=0", "playlet/bought/list?pageNum=1&pageSize=4", "coin/trans/list?page=1&pageSize=10&type=0"]:[])]; const dataByPath=new Map(); for(let offset=0;offset{const data=await request(path);assert.ok(data,`${path}: missing data`);dataByPath.set(path.split('?')[0],data);console.log(`PASS: ${path.split("?")[0]}`);})); -const pages=['/shorts/','/shorts/page/2/','/rank/hot/','/rank/new/','/rank/follow/','/topics/','/apps/','/home-road/','/navigation/','/info/about-us/','/info/user-agreement/','/info/privacy-policy/','/info/help-center/','/info/2257/','/info/dmca/','/info/feedback/']; +const pages=['/shorts/','/shorts/page/2/','/rank/hot/','/rank/new/','/rank/follow/','/topics/','/apps/','/home-road/','/navigation/','/info/about-us/','/info/user-agreement/','/info/privacy-policy/','/info/help-center/','/info/2257/','/info/dmca/']; const topic=dataByPath.get('playlet/topic/list')?.list?.[0]; if(topic){ const detail=await request(`playlet/topic/detail?id=${topic.id}&pageNum=1&pageSize=4`); @@ -72,17 +72,15 @@ if (first) { } console.log("PASS: search"); } -if(!publicOnly)pages.push('/member/center/','/member/favorites/','/member/history/','/member/purchased/','/member/settings/','/info/deposit/','/info/deposit/vip/'); for(let offset=0;offset{ const response=await fetch(base+path,{headers:{Cookie:cookieHeader()},redirect:'manual'}),html=await response.text(); assert.equal(response.status,200,path);assert.equal(response.headers.get('location'),null,path);assert.ok(!html.includes('内容暂不可用,请稍后重试'),path);assert.ok(!html.includes('class="api-loading"'),path); - const marker=path.startsWith('/member/settings/')?'member-settings':path.startsWith('/member/')?'member-center':path.startsWith('/info/deposit/')?'wallet-page':path==='/info/feedback/'?'id="feedback-form"':path==='/home-road/'?'return-home-directory':path.startsWith('/search/')?'data-search-results':''; + const marker=path==='/home-road/'?'return-home-directory':path.startsWith('/search/')?'data-search-results':''; if(marker)assert.ok(html.includes(marker),path+' must contain the complete server-rendered page'); console.log(`PASS: page ${path}`); })); const rejected=await fetch(`${base}/api/not-allowed`); assert.equal(rejected.status,404); -const invalidLogin=await fetch(`${base}/api/auth/login`,{method:"POST",headers:{Origin:new URL(base).origin,"Sec-Fetch-Site":"same-origin","Content-Type":"application/json"},body:"{}"}); -assert.equal(invalidLogin.status,400); -assert.equal((await invalidLogin.json()).code,400); -console.log("PASS: proxy endpoint allowlist and browser login input validation"); +const removedLogin=await fetch(`${base}/api/auth/login`,{method:"POST",headers:{Origin:new URL(base).origin,"Sec-Fetch-Site":"same-origin","Content-Type":"application/json"},body:"{}"}); +assert.equal(removedLogin.status,404); +console.log("PASS: proxy endpoint allowlist rejects removed account routes"); diff --git a/src/app/[...path]/page.tsx b/src/app/[...path]/page.tsx index d109a54..89c39f2 100644 --- a/src/app/[...path]/page.tsx +++ b/src/app/[...path]/page.tsx @@ -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)[route.key]||'内容列表'; + const title=bootstrap.content.title||({'apps':'福利应用','home-road':'回家的路'} as Record)[route.key]||'内容列表'; const fallback:PageView={panel:'channel',title,html:empty(bootstrap.content.failed?'内容暂不可用,请稍后重试':'暂无内容',true)}; return ; } diff --git a/src/app/api/app/[...path]/route.ts b/src/app/api/app/[...path]/route.ts index 55aa474..fda3d03 100644 --- a/src/app/api/app/[...path]/route.ts +++ b/src/app/api/app/[...path]/route.ts @@ -4,27 +4,23 @@ 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 type { Envelope, User } from "@/lib/api/types"; export const runtime = "nodejs"; export const dynamic = "force-dynamic"; const AUTH = "drama_session"; const DEVICE = "drama_device"; -const REGISTERED = "drama_registered"; const CHANNEL = "drama_channel"; -const SKIP_AUTO = "drama_skip_auto"; -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; -function sessionUser(value: unknown, token = '', registered = false): User { +function sessionUser(value: unknown, token = ''): User { if (!value || typeof value !== 'object' || !Number.isSafeInteger((value as User).userId) || (value as User).userId <= 0) throw new ApiError('登录响应缺少用户信息,请稍后重试',502); const user = value as User; const sessionToken = text(user.token) || token; if (!sessionToken) throw new ApiError('登录响应缺少凭证,请稍后重试',502); - return {...user, token:sessionToken, isRegister:user.isRegister || user.type === 1 || (user.isRegister === undefined && user.type === undefined && registered)}; + return {...user, token:sessionToken}; } async function handler(request: NextRequest, context: {params: Promise<{path: string[]}>}) { @@ -32,30 +28,17 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st const method = request.method; const headers = {'Cache-Control':'no-store'}; if (request.headers.has(UPSTREAM_HOP_HEADER)) return NextResponse.json({code:502,msg:'上游请求返回本站,请检查 Nginx 的 /api/app/ 后端转发配置',data:null},{status:502,headers:{...headers,[UPSTREAM_HOP_HEADER]:'1'}}); - if (!allowedRequest(path,method) && path !== 'auth/logout') return NextResponse.json({code:404,msg:'接口不存在',data:null},{status:404,headers}); + if (!allowedRequest(path,method)) return NextResponse.json({code:404,msg:'接口不存在',data:null},{status:404,headers}); const secure = request.nextUrl.protocol === 'https:'; const cookieOptions = {httpOnly:true,sameSite:'lax' as const,secure,path:'/',maxAge:7*86400}; - const clearSession = (response: NextResponse) => { - response.cookies.set(AUTH,'',{...cookieOptions,maxAge:0}); - response.cookies.set(REGISTERED,'',{...cookieOptions,maxAge:0}); - }; - if (path === 'auth/logout') { - if (method !== 'POST') return NextResponse.json({code:405,data:null},{status:405,headers}); - const response = NextResponse.json({code:200,data:null},{headers}); - clearSession(response); - response.cookies.set(SKIP_AUTO,'1',{httpOnly:true,sameSite:'lax',secure,path:'/'}); - return response; - } + const clearSession = (response: NextResponse) => response.cookies.set(AUTH,'',{...cookieOptions,maxAge:0}); let token = PUBLIC_PATHS.has(path) ? '' : request.cookies.get(AUTH)?.value || ''; - 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 setContextCookies = (response: NextResponse) => { if (establishesDevice) { response.cookies.set(DEVICE,device,{...cookieOptions,httpOnly:false,maxAge:365*86400}); @@ -63,13 +46,13 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st } }; const guest = async () => { - const result = await upstream('auth/guest',{request,method:'POST',body:{devID:device,deviceId:device,channel,mac:''},device,userAgent,clientIp,tracking:identity}); + const result = await upstream('auth/guest',{request,method:'POST',body:{devID:device,deviceId:device,channel,mac:''},device,userAgent,clientIp}); if (result.code !== 200) throw new ApiError(result.tip || result.msg || '游客登录失败',result.code); return sessionUser(result.data); }; // Normalize HTTP 401 into the same recovery path as an expired business envelope. const call = async (callPath: string, options: Parameters[1]): Promise> => { - try { return await upstream(callPath,{...options,request,clientIp,tracking:callPath.split('?')[0]===path?tracking:identity}); } + try { return await upstream(callPath,{...options,request,clientIp}); } catch (error) { if (error instanceof ApiError && error.code === 401) return {code:401,msg:error.message,data:null}; throw error; @@ -90,66 +73,38 @@ async function handler(request: NextRequest, context: {params: Promise<{path: st let session: User | undefined; let result: Envelope; if (path === 'auth/guest') { - if (!token && input.automatic === true && request.cookies.get(SKIP_AUTO)?.value === '1') { - const response = NextResponse.json({code:200,data:null},{headers}); - response.cookies.set(SKIP_AUTO,'',{...cookieOptions,maxAge:0}); - setContextCookies(response); - return response; - } if (token) { const info = await call('auth/getInfo',{token,device,userAgent}); - if (info.code === 200) session = sessionUser(info.data,token,registered); - else if (!expired(info.code) || registered) throw new ApiError(info.tip || info.msg || '登录已过期,请重新登录',info.code); + if (info.code === 200) session = sessionUser(info.data,token); + else if (!expired(info.code)) throw new ApiError(info.tip || info.msg || '会话暂不可用,请稍后重试',info.code); } 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); - body = path === 'auth/login' - ? {account,password,devID:device,channel} - : {accountNo:account,password,email:text(input.email) || account+'@91dj.local',devID:device,channel,...(text(input.agentInviteCode) ? {agentInviteCode:text(input.agentInviteCode).slice(0,100)} : {})}; - // Only guest binding inherits the old identity; account switching does not. - if (path === 'auth/login' || registered) token = ''; - } else if (path === 'auth/resetPassword') { - body = {accountNo:text(input.accountNo),email:text(input.email),newPassword:input.newPassword}; - token = ''; - } result = await call(path+request.nextUrl.search,{method,body,token,device,userAgent}); - // Retry only an explicitly rejected guest request, once; never downgrade registered actions. - if (expired(result.code) && !PUBLIC_PATHS.has(path) && !CREDENTIALS.has(path) && !registered) { + // Retry an explicitly rejected session once with a fresh guest. + if (expired(result.code) && !PUBLIC_PATHS.has(path)) { 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); 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) { - clearSession(response); - if (registered) response.headers.set('X-Auth-State','login-required'); - } else if (session?.token) { - response.cookies.set(AUTH,session.token,cookieOptions); - response.cookies.set(REGISTERED,session.isRegister || session.type === 1 ? '1' : '0',cookieOptions); - response.cookies.set(SKIP_AUTO,'',{...cookieOptions,maxAge:0}); - } + if (isExpired) clearSession(response); + else if (session?.token) response.cookies.set(AUTH,session.token,cookieOptions); setContextCookies(response); 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) { - clearSession(response); - if (registered) response.headers.set('X-Auth-State','login-required'); - } + if (isExpired) clearSession(response); setContextCookies(response); return response; } diff --git a/src/app/error.tsx b/src/app/error.tsx index 7db3bab..5efa98f 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -2,7 +2,7 @@ export default function PageError({retry}:{retry:()=>void}) { return
      - 页面暂不可用 - 91短剧 + 页面暂不可用 - 黄果吃瓜

      页面暂不可用

      内容服务暂时异常,请稍后重试

      diff --git a/src/app/globals.css b/src/app/globals.css index 63e1708..22489c4 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -174,10 +174,10 @@ .info-layout{display:grid;grid-template-columns:180px minmax(0,860px);gap:28px;align-items:start} .info-nav{display:grid;gap:8px;position:sticky;top:24px}.info-nav a{padding:13px 16px;border-radius:10px;color:#9b9e98;font-size:14px}.info-nav a[aria-current="page"]{background:#FFC00010;color:var(--accent)} .info-card{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:36px;min-width:0}.info-card h2{font-size:20px;margin:30px 0 12px}.info-card h2:first-child{margin-top:0}.info-card p,.info-card li{font-size:14px;line-height:1.95;color:#b6b9b2}.info-card ul{padding-left:22px}.info-card a{color:var(--accent)}.info-card .note{border-left:3px solid var(--accent);background:#FFC00008;padding:12px 16px;color:#c3b3a5;font-size:12px;margin:0 0 26px}.info-card details{border-bottom:1px solid var(--line);padding:18px 0}.info-card summary{cursor:pointer;font-size:16px;color:var(--text)}.info-card details p{margin-bottom:0}.info-card .return-home{display:inline-block;border:1px solid #ffffff20;border-radius:8px;padding:10px 16px;margin-top:18px;font-size:14px} -.feedback-form{display:grid;gap:22px}.feedback-form label,.feedback-form legend{display:block;font-size:14px;color:#dedfd8}.feedback-form input,.feedback-form textarea,.feedback-form select{display:block;width:100%;margin-top:9px;border:1px solid #ffffff20;background:#151717;color:var(--text);border-radius:8px;padding:12px;font:inherit;box-sizing:border-box;color-scheme:dark}.feedback-form textarea{min-height:150px;resize:vertical}.feedback-form :is(input,select,textarea):focus-visible{outline:2px solid var(--accent);outline-offset:3px}.feedback-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.feedback-form .field-note{font-size:12px;color:var(--muted);margin:6px 0 0}.feedback-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap}.feedback-actions .primary{border-radius:8px}.feedback-status{font-size:12px;color:#c4cbb8;line-height:1.8}.info-shell>.footer{margin-top:48px} +.info-shell>.footer{margin-top:48px} @media(min-width:761px){.side{width:216px;align-items:stretch}.side>.mark{margin-left:20px}.side>nav{margin-top:30px;gap:8px;padding:0 12px}.side>nav>a{display:flex;align-items:center;gap:12px;text-align:left;padding:13px 14px;font-size:14px}.side>nav>a svg{margin:0;width:20px;height:20px;flex-shrink:0}.shell{margin-left:248px;padding-left:24px;padding-right:32px}} @media(min-width:761px) and (max-width:1180px){.side{width:188px}.shell{margin-left:220px;padding-left:20px;padding-right:24px}.side-info{padding-left:16px;padding-right:16px}.top{flex-wrap:wrap;height:auto;min-height:106px;padding:18px 0;gap:14px}.top .nav{height:44px}.top .search{width:220px;flex:1 1 190px}.hero-content{max-width:78%}.info-layout{grid-template-columns:1fr}.info-nav{position:static;display:flex;flex-wrap:wrap;gap:6px}.info-nav a{padding:10px 14px}} -@media(max-width:760px){.info-shell{padding-top:22px!important}.info-topbar span{letter-spacing:0}.info-heading{padding:30px 0 24px}.info-heading h1{font-size:30px}.info-layout{grid-template-columns:1fr;gap:20px}.info-nav{position:static;display:flex;flex-wrap:wrap;gap:6px}.info-nav a{padding:9px 12px;font-size:12px}.info-card{padding:24px 20px}.feedback-grid{grid-template-columns:1fr}.footer{align-items:flex-start}.footer .policy-links{gap:10px 18px}} +@media(max-width:760px){.info-shell{padding-top:22px!important}.info-topbar span{letter-spacing:0}.info-heading{padding:30px 0 24px}.info-heading h1{font-size:30px}.info-layout{grid-template-columns:1fr;gap:20px}.info-nav{position:static;display:flex;flex-wrap:wrap;gap:6px}.info-nav a{padding:9px 12px;font-size:12px}.info-card{padding:24px 20px}.footer{align-items:flex-start}.footer .policy-links{gap:10px 18px}} @@ -354,7 +354,7 @@ .ui-empty-state .ui-empty-action{display:inline-flex;align-items:center;justify-content:center;margin-top:22px;min-width:116px;padding:10px 22px;border:1px solid #ffffff25;border-radius:999px;background:#ffffff06;color:#bfc0c8!important;font-size:14px;text-decoration:none;cursor:pointer} .ui-empty-state .ui-empty-action:hover{border-color:#FFC000;color:#fff!important;background:#FFC00016} .ui-empty-state .ui-empty-action:focus-visible{outline:2px solid #FFC000;outline-offset:4px} -.play-comment-list .ui-empty-state{min-height:270px;padding:20px}.play-comment-list .ui-empty-state>img{width:180px;height:180px} + #drama-play-page .play-screen-overlay .ui-empty-state{min-height:0;padding:12px}#drama-play-page .play-screen-overlay .ui-empty-state>img{width:160px;height:160px}#drama-play-page .play-screen-overlay .ui-empty-action{pointer-events:auto;width:auto;height:auto;border-radius:999px;font-size:14px} @media(max-width:600px){.ui-empty-state{min-height:260px;padding:26px 16px}.ui-empty-state>img{width:176px;height:176px}} @@ -520,13 +520,13 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle .brand-w .header-actions{display:flex;align-items:center;gap:24px;margin-left:auto;flex-shrink:0} .header-action{display:flex;align-items:center;justify-content:center;gap:9px;padding:8px 0;white-space:nowrap;font-size:14px;border-radius:8px} .header-action:hover{opacity:.8}.header-action>svg{width:22px;height:22px} -.coin-entry{gap:8px}.coin-symbol{display:grid;place-items:center;width:32px;height:32px;border:2px solid #ffe88c;border-radius:50%;background:linear-gradient(145deg,#fff495,#ffbf39);box-shadow:inset 0 0 0 3px #ffd563;color:#d68b13;font-size:20px;text-shadow:0 1px #fff5b0}.coin-value{font-size:18px;font-variant-numeric:tabular-nums}.coin-label{font-size:12px;color:var(--muted)} -.account-divider{height:24px;width:1px;background:#ffffff20}.account-avatar{width:38px;height:38px;display:grid;place-items:center;border-radius:50%;background:#343439;overflow:hidden}.account-avatar svg{width:24px;height:24px;color:#b8b8c0}.account-entry.is-logged-in .account-avatar{background:#FFC00025}.account-entry.is-logged-in .account-avatar svg{color:#FFCF40}.account-copy{text-align:left;display:grid;gap:2px}.account-copy strong{font-size:14px;font-weight:500}.account-copy small{font-size:12px;color:#96969e} +.coin-label{font-size:12px;color:var(--muted)} +.account-divider{height:24px;width:1px;background:#ffffff20} .top .header-saved-proxy{display:none!important} -#account-dialog{width:min(420px,calc(100vw - 32px));padding:32px;border-radius:20px;background:#202024;border:1px solid #ffffff18} -#account-dialog h2{font-size:24px;margin:0 0 12px}#account-dialog p{font-size:14px;line-height:1.8;color:#a8a8b0;margin:12px 0 24px}#account-dialog .primary{width:100%;border-radius:10px}#account-dialog .account-secondary{display:block;width:100%;padding:12px;margin-top:10px;border-radius:10px;background:#ffffff08}#account-dialog .balance{display:flex;align-items:center;gap:12px;margin:24px 0;font-size:36px}#account-dialog .balance small{font-size:14px;color:#a8a8b0}#account-dialog .unavailable{padding:12px;border-radius:10px;background:#ffffff08;text-align:center;color:#9898a0;font-size:14px} + + @media(max-width:1180px){.header-actions{gap:16px}.top{gap:18px}.coin-label{display:none}} -@media(max-width:760px){.top{height:auto;min-height:0;flex-wrap:wrap;padding:18px 0 22px;gap:14px}.top .search{flex:1 0 100%;max-width:none}.header-actions{width:100%;justify-content:flex-end;gap:20px}.download-entry{margin-right:auto}.header-action{padding:2px 0}.account-avatar{width:34px;height:34px}} +@media(max-width:760px){.top{height:auto;min-height:0;flex-wrap:wrap;padding:18px 0 22px;gap:14px}.top .search{flex:1 0 100%;max-width:none}.header-actions{width:100%;justify-content:flex-end;gap:20px}.download-entry{margin-right:auto}.header-action{padding:2px 0}} @@ -539,13 +539,13 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle .brand-w .header-action{flex-direction:column;gap:5px;min-width:44px;padding:2px 0;font-size:12px;line-height:1.3;opacity:.8;transition:opacity .2s,transform .2s} .header-action:hover{opacity:1;transform:translateY(-1px)} .header-action>svg{width:24px;height:24px;stroke-width:1.6} -.coin-symbol{width:25px;height:25px;font-size:14px;box-shadow:inset 0 0 0 2px #ffd563} -.coin-caption{font-size:12px}.coin-value{font-size:12px} -.account-entry{min-width:46px;gap:4px}.account-avatar{width:34px;height:34px;background:linear-gradient(145deg,#56565e,#303036);border:1px solid #ffffff18}.account-avatar svg{width:23px;height:23px} -.account-copy{display:block;text-align:center}.account-copy strong{font-size:12px;font-weight:400}.account-copy small{display:none} -.account-entry.is-logged-in .account-avatar{border-color:#FFC00055} -.account-history-list{display:grid;gap:10px;margin-top:20px;max-height:50vh;overflow:auto} -.account-history-item{display:flex;align-items:center;gap:12px;text-align:left;padding:10px;border-radius:10px;background:#ffffff05;width:100%}.account-history-item:hover{background:#ffffff0a}.account-history-item img{width:42px;height:58px;object-fit:cover;border-radius:5px}.account-history-item strong{display:block;font-size:14px;font-weight:500}.account-history-item small{display:block;font-size:12px;color:#94949c;margin-top:5px} + + + + + + + @media(max-width:1180px){.top{gap:20px}.header-actions{gap:16px}.top .search{flex-basis:300px}} @media(max-width:760px){.top{height:auto;min-height:0;flex-wrap:wrap;padding:18px 0;gap:16px}.top .search{flex:1 0 100%;max-width:none;height:46px}.header-actions{justify-content:flex-end;gap:24px;width:100%}.download-entry{margin-right:auto}} @@ -558,12 +558,12 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle .brand-w .header-actions{gap:24px} .header-actions .download-entry{flex-direction:row;gap:8px;height:50px;padding:0 18px;border-radius:999px;border:1px solid #ffffff1c;background:#ffffff09;font-size:14px;opacity:1;backdrop-filter:blur(12px)} .header-actions .download-entry:hover{background:#ffffff14;transform:none} -.header-actions .coin-entry{flex-direction:row;height:50px;padding:0 16px;gap:8px;background:#d6aa4610;border:1px solid #d6aa4630;border-radius:999px;opacity:1} -.header-actions .coin-caption,.header-actions .coin-value{font-size:14px;color:#e6bf68}.header-actions .coin-symbol{width:25px;height:25px} + + .header-actions .history-entry{gap:4px;min-width:38px;font-size:12px}.header-actions .history-entry>svg{width:28px;height:28px;color:#bfc0c7} -.header-actions .account-entry{padding:0;min-width:50px;opacity:1}.header-actions .account-avatar{width:50px;height:50px;background:linear-gradient(145deg,#777780,#39393f);border:1px solid #ffffff28;box-shadow:inset 0 1px 0 #ffffff15}.header-actions .account-avatar svg{width:30px;height:30px;color:#ececf0}.header-actions .account-copy{display:none}.header-actions .account-entry.is-logged-in .account-avatar{background:linear-gradient(145deg,#ad3570,#4a2538);border-color:#FFC00080} -@media(max-width:1180px){.top{gap:18px}.header-actions{gap:14px}.header-actions .download-entry{padding:0 14px}.header-actions .coin-entry{padding:0 12px}.top .search{flex-basis:300px}} -@media(max-width:760px){.top{height:auto;min-height:0;gap:16px}.top .search{flex:1 0 100%;height:50px;padding-left:18px}.top .search input{font-size:14px}.header-actions{justify-content:flex-end;gap:16px}.header-actions .download-entry{margin-right:0;height:42px;font-size:12px;padding:0 12px}.header-actions .coin-entry{height:42px;margin-right:auto}.header-actions .account-entry{min-width:42px}.header-actions .account-avatar{width:42px;height:42px}} + +@media(max-width:1180px){.top{gap:18px}.header-actions{gap:14px}.header-actions .download-entry{padding:0 14px}.top .search{flex-basis:300px}} +@media(max-width:760px){.top{height:auto;min-height:0;gap:16px}.top .search{flex:1 0 100%;height:50px;padding-left:18px}.top .search input{font-size:14px}.header-actions{justify-content:flex-end;gap:16px}.header-actions .download-entry{margin-right:0;height:42px;font-size:12px;padding:0 12px}} @@ -775,10 +775,10 @@ html .side>nav>a[data-page="rank"].active .qq-nav-icon{-webkit-mask-size:contain -.header-actions .account-entry:not(.is-logged-in) .account-avatar{background:transparent;border:0;box-shadow:none} -.account-avatar .guest-avatar-image{display:block;width:100%;height:100%;object-fit:contain} -.account-entry:not(.is-logged-in) .account-avatar>svg{display:none} -.account-entry.is-logged-in .guest-avatar-image{display:none} + + + + .promo-tile-image{aspect-ratio:1/1}.promo-tile-image img{object-fit:contain;object-position:center}.promo-tile:hover img{transform:none} @@ -879,7 +879,7 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 .download-panel-brand .download-brand-complete{display:block;width:184px;max-width:100%;height:auto;aspect-ratio:92/24;object-fit:contain} -.header-actions .account-avatar .member-avatar-image{display:block;width:100%;height:100%;object-fit:cover;border-radius:50%} + .bottom-app-prompt{display:flex;align-items:center;justify-content:space-between;gap:36px;padding:34px 40px;border:1px solid #ffffff12;border-radius:24px;background:linear-gradient(110deg,#28170c 0%,#1b120d 48%,#141416 100%)} .bottom-app-eyebrow{display:flex;align-items:center;gap:14px;color:#FFD24D;font-size:16px;letter-spacing:2px;margin-bottom:14px} .bottom-app-eyebrow::before{content:"";width:24px;height:2px;background:currentColor} @@ -894,10 +894,10 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 -.history-dialog{width:min(440px,calc(100vw - 32px));max-height:80dvh;padding:28px;border:1px solid #ffffff18;border-radius:20px;background:#202124;color:#f4f2f4} -.history-dialog::backdrop{background:#0009;backdrop-filter:blur(4px)} -.history-dialog h2{font-size:22px;margin:0 36px 8px 0}.history-note{color:#96969f;font-size:14px;margin:0}.history-empty{color:#a5a5ae;font-size:14px;line-height:1.8;padding:24px 0} -.history-dialog .account-history-list{margin-top:20px;max-height:50dvh}.history-clear{display:block;margin:20px 0 0 auto;border:0;background:transparent;font-size:14px;color:#aaa;cursor:pointer}.history-clear:hover{color:var(--accent)!important}.history-clear[hidden]{display:none} + + + + @@ -1057,26 +1057,6 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 -#info-page[data-info="feedback"] .info-layout{display:block} -#info-page[data-info="feedback"] #info-content{padding:0;border:0;border-radius:0;background:transparent;box-shadow:none}#info-page[data-info="feedback"] .info-nav{display:none} -#feedback-form.feedback-reference{display:flex;flex-direction:column;gap:30px;width:100%;max-width:none;padding:40px 48px;border:1px solid #ffffff0e;border-radius:20px;background:#ffffff04} -#feedback-form .feedback-part{display:block;min-width:0;margin:0;padding:0;border:0}#feedback-form legend{padding:0;margin-bottom:16px;font-size:18px;font-weight:600;color:#eee}#feedback-form legend em{font-style:normal;color:var(--accent)} -#feedback-form .feedback-options{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px} -#feedback-form label.feedback-option{display:block;position:relative;margin:0;cursor:pointer} -#feedback-form .feedback-option input{position:absolute;opacity:0;width:1px;height:1px;padding:0;margin:0} -#feedback-form .feedback-option span{display:flex;align-items:center;justify-content:center;min-height:48px;padding:10px 12px;border:1px solid #ffffff12;border-radius:10px;background:#ffffff03;color:#aaa;font-size:14px;transition:background .15s,color .15s,border-color .15s} -#feedback-form .feedback-option:hover span{border-color:var(--accent);color:var(--accent)}#feedback-form .feedback-option input:checked+span{background:var(--accent);border-color:var(--accent);color:#fff}#feedback-form .feedback-option input:focus-visible+span{outline:2px solid #eee;outline-offset:3px} -#feedback-form .feedback-panel{display:flex;flex-direction:column;gap:16px;padding:22px;border:1px solid #ffffff0b;border-radius:12px;background:#ffffff02} -#feedback-form label:not(.feedback-option):not(.feedback-upload-box){display:flex;flex-direction:column;gap:10px;font-size:14px;color:#aaaaaa} -#feedback-form .feedback-address{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}#feedback-form .feedback-field-label{font-size:14px;color:#aaaaaa} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]),#feedback-form select,#feedback-form textarea{box-sizing:border-box;display:block;width:100%;min-width:0;border:1px solid #ffffff14;border-radius:10px;padding:14px 16px;color:#dddddd;background:#1c1c1c;font:inherit;font-size:14px;outline:none;color-scheme:dark} -#feedback-form input:focus,#feedback-form select:focus,#feedback-form textarea:focus{border-color:#ffffff50} -#feedback-form .feedback-description-wrap{position:relative}#feedback-form textarea{min-height:180px;resize:vertical;padding-bottom:40px;line-height:1.8}#feedback-count{position:absolute;bottom:14px;right:16px;font-size:12px;color:#888888} -#feedback-form .feedback-uploads{display:flex;flex-wrap:wrap;gap:16px}#feedback-form .feedback-upload-box{display:flex;position:relative;flex-direction:column;align-items:center;justify-content:center;gap:12px;min-height:160px;width:250px;border:1px dashed #ffffff30;border-radius:12px;background:#ffffff02;cursor:pointer;text-align:center;padding:18px} -#feedback-form .feedback-upload-box input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}#feedback-form .feedback-upload-box:focus-within{outline:2px solid #eee;outline-offset:3px}#feedback-form .feedback-upload-box svg{width:32px;height:32px;fill:none;stroke:#b5acbe;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}#feedback-form .feedback-upload-box strong{font-size:14px;font-weight:500}#feedback-form .feedback-upload-box small,#feedback-form .feedback-file-note{font-size:12px;color:#8f8898;line-height:1.6}.feedback-file-note{margin:12px 0 0} -#feedback-file-list{display:flex;flex-wrap:wrap;gap:12px}.feedback-attachment{position:relative;width:140px;padding:10px;border-radius:12px;background:#ffffff05}.feedback-attachment img,.feedback-attachment video{display:block;width:120px;height:95px;object-fit:cover;border-radius:7px}.feedback-attachment span{display:block;font-size:12px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin-top:8px}.feedback-attachment button{position:absolute;right:4px;top:4px;width:24px;height:24px;padding:0;background:#252329;border-radius:50%;border:1px solid #ffffff30}#feedback-file-error{font-size:12px;color:#ff956a;margin:8px 0 0} -.feedback-submit-area{text-align:center}.feedback-submit-button{min-width:240px;padding:16px 36px;border:0;border-radius:999px;background:var(--accent);color:white;font-size:16px;cursor:pointer}.feedback-submit-button:hover{filter:brightness(1.1);color:white!important}.feedback-submit-area>p{font-size:12px;color:#888888;line-height:1.7;margin:16px 0 0} -@media(max-width:760px){#feedback-form.feedback-reference{padding:24px 20px;gap:26px}#feedback-form .feedback-options{grid-template-columns:repeat(2,minmax(0,1fr))}#feedback-form .feedback-address{grid-template-columns:1fr}#feedback-form .feedback-panel{padding:16px}#feedback-form .feedback-upload-box{width:100%}.feedback-submit-button{width:100%;min-width:0}} @@ -1087,61 +1067,15 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 -#feedback-form .feedback-select{position:relative;min-width:0;width:100%} -#feedback-form .feedback-select select{position:absolute;width:1px;height:1px;min-height:0;padding:0;opacity:0;pointer-events:none} -#feedback-form .feedback-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:16px;box-sizing:border-box;width:100%;min-height:49px;padding:14px 20px 14px 16px;border:1px solid #ffffff14;border-radius:10px;background:#1c1c1c;color:#dddddd;font:inherit;font-size:14px;text-align:left;cursor:pointer;box-shadow:none} -#feedback-form .feedback-select-trigger[data-placeholder="true"]{color:#999999} -#feedback-form .feedback-select-trigger:hover{background:#242424;border-color:#ffffff30} -#feedback-form .feedback-select-trigger:focus-visible,#feedback-form .feedback-select-trigger[aria-expanded="true"]{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px #FFC00012} -#feedback-form .feedback-select-trigger svg{width:16px;height:16px;flex:0 0 16px;fill:none;stroke:#aaaaaa;stroke-width:2;transition:transform .15s} -#feedback-form .feedback-select-trigger[aria-expanded="true"] svg{transform:rotate(180deg)} -#feedback-form .feedback-select-menu{position:absolute;top:calc(100% + 8px);left:0;right:0;z-index:50;margin:0;padding:6px;max-height:280px;overflow-y:auto;overscroll-behavior:contain;list-style:none;border:1px solid #ffffff24;border-radius:12px;background:#242424;color:#dddddd;box-shadow:0 14px 32px #0006;scrollbar-width:thin;scrollbar-color:#5d5d5d #242424} -#feedback-form .feedback-select-menu[hidden]{display:none} -#feedback-form .feedback-select-menu [role="option"]{padding:12px 14px;border-radius:8px;cursor:pointer;font-size:14px;line-height:1.5} -#feedback-form .feedback-select-menu [role="option"]:hover,#feedback-form .feedback-select-menu .is-active{background:#333333;color:#fff} -#feedback-form .feedback-select-menu [aria-selected="true"]{color:#ffad83;background:#FFC00019} -#feedback-form .feedback-upload-box{box-sizing:border-box;width:360px;max-width:100%;aspect-ratio:1;min-height:0;padding:28px 16px;gap:10px;border:1px solid #ffffff12;border-radius:28px;background:#222;transition:background .18s,border-color .18s} -#feedback-form .feedback-upload-box:hover{background:#262626;border-color:#ffffff25} -#feedback-form .feedback-upload-box input{margin:0;padding:0;z-index:1} -#feedback-form .feedback-upload-plus{display:flex;align-items:center;justify-content:center;width:48px;height:48px;margin-bottom:18px;border-radius:18px;background:#383838} -#feedback-form .feedback-upload-plus svg{width:25px;height:25px;stroke:#fff;stroke-width:4;fill:none;stroke-linecap:round} -#feedback-form .feedback-upload-box strong{color:#ccc;font-size:18px;font-weight:400;line-height:1.5} -#feedback-form .feedback-upload-box small{color:#828282;font-size:14px;line-height:1.6} -#feedback-form .feedback-file-note{margin:18px 0 0;color:#828282;font-size:14px;line-height:1.6} -@media(max-width:600px){#feedback-form .feedback-upload-box{width:100%;max-width:360px;border-radius:24px}} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]), -#feedback-form textarea, -#feedback-form .feedback-select-trigger{box-sizing:border-box;margin:0;border:1px solid #ffffff14;border-radius:10px;background:#1c1c1c;color:#dddddd;font-size:14px;line-height:20px;transition:background .18s,border-color .18s,box-shadow .18s} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]), -#feedback-form .feedback-select-trigger{height:50px;min-height:50px;padding:14px 16px} -#feedback-form .feedback-select-trigger{padding-right:20px} -#feedback-form textarea{padding:14px 16px 40px} -#feedback-form input::placeholder,#feedback-form textarea::placeholder,#feedback-form .feedback-select-trigger[data-placeholder="true"]{color:#999999;opacity:1} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]):hover, -#feedback-form textarea:hover, -#feedback-form .feedback-select-trigger:hover{background:#242424;border-color:#ffffff30;color:#dddddd} -#feedback-form .feedback-select-trigger[data-placeholder="true"]:hover{color:#999999} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]):focus, -#feedback-form textarea:focus, -#feedback-form .feedback-select-trigger:focus-visible, -#feedback-form .feedback-select-trigger[aria-expanded="true"]{outline:none;outline-offset:0;background:#1c1c1c;border-color:#ffffff50;box-shadow:0 0 0 2px #ffffff08} -#feedback-form .feedback-address{align-items:start} -#feedback-form .feedback-option span{background:#1c1c1c;border-color:#2d2d2d;color:#aaa} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]),#feedback-form textarea,#feedback-form .feedback-select-trigger{background:#1c1c1c;border-color:#2d2d2d;color:#ddd} -#feedback-form input::placeholder,#feedback-form textarea::placeholder,#feedback-form .feedback-select-trigger[data-placeholder="true"]{color:#999} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]):hover,#feedback-form textarea:hover,#feedback-form .feedback-select-trigger:hover{background:#222;border-color:#444} -#feedback-form input:not([type="radio"]):not([type="file"]):not([type="hidden"]):focus,#feedback-form textarea:focus,#feedback-form .feedback-select-trigger:focus-visible,#feedback-form .feedback-select-trigger[aria-expanded="true"]{background:#1c1c1c;border-color:#666;box-shadow:0 0 0 2px #ffffff08} -#feedback-form .feedback-option:hover span{border-color:var(--accent);color:var(--accent)} -#feedback-form .feedback-option input:checked+span{background:var(--accent);border-color:var(--accent);color:#fff} @@ -1266,187 +1200,187 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 -#account-entry .account-copy small{display:none}#account-entry .account-copy strong{font-size:14px}#account-entry{gap:10px} -.account-chevron{width:14px;height:14px;fill:none;stroke:#888;stroke-width:2;transition:transform .15s}#account-entry[aria-expanded="true"] .account-chevron{transform:rotate(180deg)} -#profile-popover{position:fixed;z-index:1500;width:280px;max-width:calc(100vw - 24px);box-sizing:border-box;padding:18px 8px 8px;border:1px solid #ffffff26;border-radius:18px;background:#141416;color:#eee;box-shadow:0 18px 50px #0007;max-height:calc(100dvh - 100px);overflow:auto} -#profile-popover[hidden]{display:none}.profile-popover-head{display:flex;align-items:center;gap:12px;padding:0 12px 16px}.profile-popover-head img{width:44px;height:44px;border-radius:50%;object-fit:cover}.profile-popover-head strong{display:block;font-size:16px}.profile-popover-head small{display:block;font-size:12px;color:#85858f;margin-top:4px} -#profile-popover button{display:flex;align-items:center;gap:12px;width:100%;min-height:40px;padding:10px 12px;border:0;border-radius:9px;background:transparent;color:#eee;text-align:left;font-size:14px} -#profile-popover button:hover{background:#ffffff09}#profile-popover button:focus-visible{outline:1px solid #888;outline-offset:-1px} -#profile-popover button svg{width:19px;height:19px;flex:0 0 19px;fill:none;stroke:#92929c;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round} -#profile-popover .profile-row-label{flex:1}#profile-popover .profile-count,#profile-popover .profile-next{color:#85858f;font-size:14px}#profile-popover .profile-next{font-size:20px} -#profile-popover .profile-switch{border-top:1px solid #ffffff12;border-radius:0;margin-top:6px;padding-top:14px;color:#aaa!important} -#profile-popover .profile-avatar-link{display:block;flex:0 0 44px;width:44px;height:44px;min-height:0;padding:0;border-radius:50%;cursor:pointer} -#profile-popover .profile-avatar-link:hover{box-shadow:0 0 0 2px var(--accent)} -#profile-popover .profile-avatar-link:focus-visible{outline:2px solid var(--accent);outline-offset:3px} +.account-chevron{width:14px;height:14px;fill:none;stroke:#888;stroke-width:2;transition:transform .15s} + + + + + + + + + + + #info-page[data-info="user-center"] .info-layout{display:block}#info-page[data-info="user-center"] .info-nav{display:none} #info-page[data-info="user-center"] #info-content{padding:0;background:transparent;border:0;border-radius:0;box-shadow:none} -.member-center{display:grid;gap:24px}.member-summary{display:flex;align-items:center;justify-content:space-between;gap:32px;padding:36px;border:1px solid #ffffff14;border-radius:20px;background:#ffffff04} -.member-identity{display:flex;align-items:center;gap:22px}.member-identity img{width:88px;height:88px;object-fit:cover;border-radius:50%;border:2px solid #ffffff20} -#info-content .member-identity h2{margin:0 0 8px;font-size:26px;line-height:1.4;color:#eee}#info-content .member-identity p{margin:0;font-size:14px;color:#888} -.member-wallet{display:grid;grid-template-columns:1fr auto;gap:14px 40px;min-width:290px;text-align:left;background:#ffffff05;border:1px solid #ffffff0d;border-radius:16px;padding:22px 26px;color:#ddd}.member-wallet>span:first-child{font-size:14px}.member-wallet small{color:#888}.member-wallet strong{grid-row:2;font-size:32px;color:#e6c46d;display:flex;align-items:center;gap:8px}.member-wallet-link{grid-column:2;grid-row:2;align-self:center;font-size:14px;color:#d5b566} -.member-features{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}.member-features>button{display:flex;flex-direction:column;align-items:flex-start;gap:12px;padding:26px;text-align:left;background:#ffffff07;border:1px solid #ffffff10;border-radius:16px;transition:background .18s,border-color .18s}.member-features>button:hover,.member-wallet:hover{background:#ffffff0c;border-color:#ffffff25}.member-feature-icon{display:grid;place-items:center;width:44px;height:44px;border-radius:12px;background:#FFC00013;color:var(--accent);margin-bottom:6px}.member-feature-icon svg{width:25px;height:25px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.member-features strong{font-size:18px;font-weight:500}.member-features small{font-size:14px;color:#888;line-height:1.6} -@media(max-width:1000px){.member-features{grid-template-columns:repeat(2,minmax(0,1fr))}.member-summary{padding:28px;gap:24px}.member-wallet{min-width:240px}} -@media(max-width:600px){.member-summary{align-items:stretch;flex-direction:column;padding:24px}.member-identity img{width:68px;height:68px}.member-wallet{min-width:0;width:100%}.member-features{gap:12px}.member-features>button{padding:20px 16px}.member-features strong{font-size:16px}} - -.member-advertisements{position:relative;min-width:0;padding:0;border:0;background:transparent} -.member-ad-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap} -.member-ad-grid{display:grid;grid-template-columns:repeat(16,minmax(0,1fr));gap:14px;width:100%} -#info-content .member-ad-tile{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0;color:#c7c7cc;text-decoration:none;font-size:12px;line-height:1.5} -.member-ad-tile img{display:block;width:100%;height:auto;aspect-ratio:1;object-fit:contain;border-radius:22%;transition:transform .2s} -.member-ad-tile span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -#info-content .member-ad-tile:hover{color:var(--accent)}.member-ad-tile:hover img{transform:translateY(-3px)} -.member-ad-tile:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:8px} -@media(max-width:1180px){.member-ad-grid{grid-template-columns:repeat(8,minmax(0,1fr));gap:18px 14px}} -@media(max-width:760px){.member-ad-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:18px 14px}} -@media(prefers-reduced-motion:reduce){.member-ad-tile img{transition:none}.member-ad-tile:hover img{transform:none}} -#profile-popover button .account-collection-icon{width:20px;height:20px;flex:0 0 20px;fill:currentColor;stroke:none;color:#92929c} -#profile-popover button .account-collection-icon path{fill:currentColor;stroke:none} -.member-library{min-width:0}.member-library-tabs{display:flex;gap:40px;border-bottom:1px solid #ffffff12;overflow-x:auto} -.member-library-tabs button{position:relative;flex-shrink:0;padding:16px 0 20px;background:none;border:0;color:#929299;font-size:16px;font-weight:500;white-space:nowrap;transition:color .18s ease} -.member-library-tabs button[aria-selected="true"]{color:var(--accent)}.member-library-tabs button[aria-selected="true"]::after{content:'';position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:26px;height:3px;border-radius:3px;background:var(--accent)} -.member-library-tabs button[aria-selected="false"]:hover{color:var(--accent)}.member-library-tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:6px}.member-library-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:66px;color:#999;font-size:14px} -.member-library-tools{display:flex;align-items:center;gap:12px}.member-library-tools button{padding:8px 18px;border:1px solid #ffffff20;border-radius:999px;background:#242424;color:#ddd;font-size:14px}.member-library-tools button[data-library-action="delete"]{background:var(--accent);border-color:var(--accent);color:white}.member-library-tools button:disabled{opacity:.35;cursor:not-allowed} -.member-library-cards{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:24px 20px}.member-library-item{position:relative;min-width:0}.member-library-item>.card{display:block;width:100%;text-align:left;background:transparent;padding:0;border:0;opacity:1;animation:none;transform:none} -#info-content .member-library-item h3{font-size:16px;line-height:1.5;color:#eee;margin:10px 0 6px}.member-library-item .cover{display:block;position:relative;aspect-ratio:640/914;overflow:hidden;border-radius:12px}.member-library-item .poster-source{width:100%;height:100%;object-fit:cover} -.member-library-item .drama-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:#888;font-size:12px;line-height:1.6}.member-library-item .drama-meta{font-size:12px} -.member-library-item.is-selected .cover{outline:3px solid var(--accent);outline-offset:-3px}.member-library-select{position:absolute;z-index:4;top:10px;left:10px;display:grid;place-items:center;width:28px;height:28px;cursor:pointer} -.member-library-select input{appearance:none;-webkit-appearance:none;display:block;box-sizing:border-box;width:24px;height:24px;margin:0;padding:0;border:0;border-radius:50%;background:transparent url("/assets/d2182785de825f85.svg") center/24px 24px no-repeat;cursor:pointer} -.member-library-select input:checked{background-image:url("/assets/69304455ce1e30ae.svg")} -.member-library-select input:focus-visible{outline:2px solid var(--accent);outline-offset:2px} - - -.member-library-empty{grid-column:1/-1;text-align:center;padding:60px 20px;color:#888}.member-library-empty a{display:inline-block;margin-top:16px;color:var(--accent)} -#member-delete-dialog{width:400px;max-width:calc(100vw - 32px);padding:30px;border:1px solid #ffffff20;border-radius:20px;background:#1b1b1e;color:#eee}#member-delete-dialog::backdrop{background:#0009;backdrop-filter:blur(4px)}#member-delete-dialog h2{font-size:22px;margin:0 0 16px}#member-delete-dialog p{color:#aaa;font-size:14px;line-height:1.8;margin:0 0 26px}.member-delete-actions{display:flex;justify-content:flex-end;gap:12px}.member-delete-actions button{padding:10px 22px;border-radius:999px;background:#303033;color:white;border:0}.member-delete-actions button[value="confirm"]{background:var(--accent)} -@media(max-width:1180px){.member-library-cards{grid-template-columns:repeat(4,minmax(0,1fr))}} -@media(max-width:760px){.member-library-tabs{gap:24px}.member-library-tabs button{font-size:14px}.member-library-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px 14px}.member-library-toolbar{align-items:flex-start;padding:14px 0;flex-direction:column}.member-library-tools{flex-wrap:wrap}} -#info-content .member-watch-status{display:block;margin:10px 0 0;color:var(--accent);font-size:14px;line-height:1.5;font-weight:500} -#info-content .member-watch-status.is-complete{color:#9a9a9f} -#info-content .member-library-item h3{margin-top:5px} -.member-name-row{display:flex;align-items:center;flex-wrap:wrap;gap:16px;margin-bottom:8px}#info-content .member-name-row h2{margin:0;overflow-wrap:anywhere} -#info-content .member-settings-link{display:inline-flex;align-items:center;gap:10px;padding:6px 13px;border:1px solid #ffffff20;border-radius:999px;color:#aaa;text-decoration:none;font-size:12px;white-space:nowrap;transition:color .18s,border-color .18s}#info-content .member-settings-link:hover{color:var(--accent);border-color:var(--accent)} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #info-page[data-info="account-settings"] .info-layout{display:block}#info-page[data-info="account-settings"] .info-nav{display:none}#info-page[data-info="account-settings"] #info-content{padding:0;border:0;background:transparent;box-shadow:none} -.member-settings{max-width:900px;display:grid;gap:24px}.member-settings-back{font-size:14px;color:#999!important;text-decoration:none}.member-settings-card{padding:28px;border:1px solid #ffffff14;border-radius:18px;background:#191919}#info-content .member-settings-card h2{font-size:18px;color:#eee;margin:0 0 24px}.member-settings-card label{display:block;margin-bottom:12px;font-size:14px;color:#bbb}.member-nickname-editor{display:flex;gap:16px}.member-nickname-editor input{min-width:0;flex:1;padding:12px 16px;height:46px;border:1px solid #363636;border-radius:10px;background:#222;color:#eee;font:inherit}.member-nickname-editor input:focus{outline:1px solid var(--accent);border-color:var(--accent)}.member-nickname-editor button{padding:0 22px;border-radius:999px;border:0;background:var(--accent);color:white;font-size:14px;white-space:nowrap}#info-content #member-nickname-hint{font-size:12px;color:#777;margin:10px 0 0}#info-content #member-nickname-status{font-size:14px;color:var(--accent);margin:8px 0 0;min-height:20px} -.member-settings-action{width:100%;display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px 0;border:0;background:transparent;color:#888;text-align:left}.member-settings-action+.member-settings-action{border-top:1px solid #ffffff12}.member-settings-action strong{display:block;color:#ddd;font-size:16px;font-weight:500}.member-settings-action small{display:block;margin-top:8px;color:#777;font-size:14px}.member-settings-action:hover strong{color:var(--accent)}.member-settings-trailing{display:flex;gap:16px;align-items:center;font-size:14px}.member-settings-action>span:last-child{flex-shrink:0} -@media(max-width:600px){.member-name-row{gap:8px}.member-settings-card{padding:20px}.member-nickname-editor{gap:10px}.member-nickname-editor button{padding:0 14px}} -#member-auth-dialog{box-sizing:border-box;width:440px;max-width:calc(100vw - 32px);max-height:calc(100dvh - 40px);overflow:auto;padding:36px;border:1px solid #ffffff20;border-radius:24px;background:#19191c;color:#eee;box-shadow:0 24px 100px #0008}#member-auth-dialog::backdrop{background:#000a;backdrop-filter:blur(6px)} -#member-auth-dialog .auth-close{position:absolute;right:18px;top:14px;width:32px;height:32px;background:none;border:0;color:#888;font-size:28px}#member-auth-dialog h2{font-size:24px;margin:0 0 10px}.auth-subtitle{font-size:14px;line-height:1.7;color:#888;margin:0 0 24px}.auth-tabs{display:flex;gap:28px;border-bottom:1px solid #ffffff12;margin-bottom:24px}.auth-tabs button{position:relative;padding:0 0 13px;border:0;background:none;color:#888;font-size:16px}.auth-tabs button[aria-selected="true"]{color:var(--accent)}.auth-tabs button[aria-selected="true"]::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent)} -.auth-field{display:block;font-size:14px;color:#bbb;margin-bottom:10px}.auth-input-row{display:flex;align-items:center;gap:10px;margin-bottom:20px}.auth-input-row input{box-sizing:border-box;min-width:0;width:100%;height:48px;padding:0 14px;border:1px solid #38383d;border-radius:10px;background:#222225;color:#eee;font-size:14px}.auth-input-row input:focus{outline:none;border-color:var(--accent)}.auth-input-row input[aria-invalid="true"]{border-color:#ff597b}.auth-code-button{flex-shrink:0;background:transparent;border:0;color:var(--accent);font-size:14px;padding:10px 0}.auth-code-button:disabled{color:#777;cursor:not-allowed}.auth-note{font-size:12px;color:#89898f;line-height:1.7;margin:-8px 0 20px}.auth-error{font-size:14px;color:#ff718b;min-height:20px;margin:0 0 12px}.auth-submit{width:100%;height:46px;border:0;border-radius:999px;background:var(--accent);color:white;font-size:16px;font-weight:500}.auth-agreement{display:flex;align-items:flex-start;gap:8px;margin:18px 0;font-size:12px;line-height:1.7;color:#888}.auth-agreement input{accent-color:var(--accent);margin:3px 0 0}.auth-agreement a{color:#bbb;text-decoration:none}.auth-footer{text-align:center;font-size:12px;color:#666;margin:18px 0 0}.auth-success{padding-top:16px;text-align:center}.auth-success-icon{display:grid;place-items:center;margin:0 auto 22px;width:64px;height:64px;background:#FFC0001a;color:var(--accent);border-radius:50%;font-size:30px}.auth-success p{font-size:14px;color:#aaa;line-height:1.8;margin:18px 0 28px} -@media(max-width:520px){#member-auth-dialog{padding:30px 24px}} -.auth-password-row{position:relative}.auth-password-row input{padding-right:64px}.auth-password-toggle{position:absolute;right:14px;top:50%;transform:translateY(-50%);padding:6px 0;background:none;border:0;color:#999;font-size:12px}.auth-password-toggle:hover{color:var(--accent)} -.auth-password-toggle{width:28px;height:32px;display:grid;place-items:center;padding:0}.auth-password-toggle svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round} -.auth-password-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:5px} -.auth-remember{display:flex;align-items:center;gap:9px;width:fit-content;margin:0 0 16px;color:#a0a0a8;font-size:14px;cursor:pointer}.auth-remember input{appearance:none;-webkit-appearance:none;position:relative;display:block;width:18px;height:18px;margin:0;border:1px solid #64646b;border-radius:4px;background:#252528;cursor:pointer}.auth-remember input:checked{border-color:var(--accent);background:var(--accent)}.auth-remember input:checked::after{content:'';position:absolute;left:5px;top:2px;width:5px;height:9px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.auth-remember input:focus-visible{outline:2px solid var(--accent);outline-offset:3px} -#member-auth-dialog .auth-footer{font-size:12px;line-height:1.8;color:#888;margin-top:20px}#member-auth-dialog .auth-footer a{color:#bbb;text-decoration:none}#member-auth-dialog .auth-footer a:hover{color:var(--accent)} -#member-auth-dialog.auth-bind-mode{width:440px;padding:32px;background:#141416;border-radius:24px} -#member-auth-dialog.auth-bind-mode h2{font-size:26px;margin-bottom:10px}.auth-bind-mode .auth-subtitle{margin-bottom:24px;font-size:14px;line-height:1.7;color:#9999a1} -#member-auth-dialog.auth-bind-mode .auth-close{top:16px;right:16px;width:32px;height:32px;display:grid;place-items:center;padding:0;border-radius:50%;background:#202023;color:#96969e;font-size:24px} -.auth-bind-mode .auth-field{font-size:14px;color:#a3a3ac;margin-bottom:8px}.auth-bind-mode .auth-input-row{margin-bottom:18px;position:relative}.auth-bind-mode .auth-input-row input{height:48px;padding-left:44px;border:1px solid transparent;border-radius:12px;background:#232326;font-size:16px}.auth-bind-mode .auth-input-row input:focus{border-color:var(--accent)}.auth-bind-mode .auth-input-row input[aria-invalid="true"]{border-color:#ff597b}.auth-bind-mode .auth-input-row input::placeholder{color:#7d7d87}.auth-bind-mode .auth-password-row input{padding-right:46px} -.auth-icon-row>svg{position:absolute;left:16px;top:50%;transform:translateY(-50%);width:18px;height:18px;fill:none;stroke:#7d7d87;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;pointer-events:none} -.auth-bind-agreement{display:flex;align-items:flex-start;gap:10px;font-size:14px;line-height:1.7;color:#a0a0aa;margin:0 0 14px}.auth-bind-agreement input{appearance:none;flex:0 0 18px;width:18px;height:18px;margin:2px 0 0;border:1px solid #555;border-radius:4px;position:relative;background:transparent;cursor:pointer}.auth-bind-agreement input:checked{background:var(--accent);border-color:var(--accent)}.auth-bind-agreement input:checked::after{content:'';position:absolute;left:5px;top:2px;width:5px;height:9px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.auth-bind-agreement input:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.auth-bind-agreement a{color:inherit;text-decoration:underline;text-underline-offset:3px}.auth-bind-agreement a:hover{color:var(--accent)} -.auth-bind-mode .auth-error:empty{display:none}.auth-bind-mode .auth-submit{height:52px;font-size:16px;background:linear-gradient(110deg,#ff4085 0%,#FFC000 56%,#953c20 100%)}.auth-bind-login{display:flex;align-items:center;justify-content:center;gap:8px;margin:20px 0 0;color:#9b9ba5;font-size:14px}.auth-bind-login button{background:none;border:0;padding:0;color:#ff4085;font-size:14px}.auth-bind-login button:hover{color:#ff9b79} -@media(max-width:480px){#member-auth-dialog.auth-bind-mode{padding:28px 22px}.auth-bind-agreement{font-size:12px}} - - -#member-auth-dialog .auth-password-toggle{color:#a3a3ad;background:transparent}#member-auth-dialog .auth-password-toggle .auth-eye-image{display:block;width:22px;height:22px;max-width:none;object-fit:contain;pointer-events:none}#member-auth-dialog .auth-password-toggle:hover .auth-eye-image{opacity:.8} - - -.member-avatar-editor{display:flex;align-items:center;gap:22px;margin-bottom:28px}.member-avatar-preview{position:relative;width:88px;height:88px;flex:0 0 88px;padding:0;border:1px solid #ffffff20;border-radius:50%;overflow:hidden;background:#252528;cursor:pointer}.member-avatar-preview img{display:block;width:100%;height:100%;object-fit:cover}.member-avatar-preview span{position:absolute;bottom:0;left:0;right:0;padding:5px 0 7px;background:#0009;color:white;font-size:12px}.member-avatar-controls button{padding:7px 14px;border:1px solid #ffffff25;border-radius:999px;color:#ccc;background:transparent;font-size:14px}.member-avatar-controls button:hover{color:var(--accent);border-color:var(--accent)}#info-content .member-avatar-controls p{margin:8px 0 0;font-size:12px;color:#888}.member-avatar-controls [data-avatar-action="save"]{background:var(--accent);color:white;border-color:var(--accent)}#member-avatar-confirm{margin-top:10px}#member-avatar-confirm button+button{margin-left:8px}#info-content #member-avatar-status{color:var(--accent)} -@media(max-width:600px){.member-avatar-editor{gap:16px}.member-avatar-preview{width:76px;height:76px;flex-basis:76px}} -#info-page[data-info="deposit"] .info-layout{display:block}#info-page[data-info="deposit"] .info-nav{display:none}#info-page[data-info="deposit"] #info-content{padding:0;background:transparent;border:0;box-shadow:none}.wallet-page{min-width:0}.wallet-balance{color:#999;font-size:14px;margin:-10px 0 28px}.wallet-balance strong{color:#efca75;font-size:22px;margin:0 5px} -.wallet-hero{padding:30px 32px;border:1px solid #ffffff18;border-radius:18px;background:#ffffff08;margin-bottom:30px}.wallet-hero>span{display:inline-block;color:var(--accent);font-size:12px;background:#FFC00013;border-radius:999px;padding:5px 12px}#info-content .wallet-hero h2{margin:14px 0 10px;font-size:26px;color:#f1f1f1}#info-content .wallet-hero p{font-size:14px;color:#999;margin:0}.wallet-section-title,#info-content .wallet-section-title{font-size:20px;color:#eee;margin:0 0 18px}.wallet-pack-panel{padding:26px;border:1px solid #ffffff18;border-radius:18px;background:#ffffff06}.wallet-pack-heading{display:flex;align-items:center;gap:14px;margin-bottom:22px}.wallet-pack-heading strong{color:#eee;font-size:18px}.wallet-pack-heading>span{color:#888;font-size:14px}.wallet-pack-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}.wallet-package{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:12px;min-width:0;padding:24px;border:1px solid #ffffff1c;border-radius:15px;background:#ffffff06;text-align:left;transition:border-color .15s,background .15s}.wallet-package:hover{border-color:#FFC00080;background:#FFC00009}.wallet-package[aria-pressed="true"]{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);background:#FFC0000d}.wallet-package-price{font-size:30px;font-weight:650;color:#eee}.wallet-package-name{font-size:18px;color:#ddd}.wallet-package-hint{font-size:12px;color:#888}.wallet-package-hint em{font-style:normal;color:#e7b96d}.wallet-package-check{position:absolute;right:14px;top:14px;width:21px;height:21px;display:none;place-items:center;border-radius:50%;background:var(--accent);color:white;font-size:14px}.wallet-package[aria-pressed="true"] .wallet-package-check{display:grid}.wallet-pay-area{text-align:center;margin:28px 0 38px}.wallet-submit{min-width:250px;padding:14px 30px;border:0;border-radius:999px;background:var(--accent);color:white;font-size:16px;font-weight:600}#info-content #wallet-selection{font-size:14px;color:#888;margin:12px 0 0}.wallet-empty{text-align:center;padding:38px 20px;border:1px solid #ffffff12;background:#ffffff03;border-radius:16px;color:#666}.wallet-empty svg{width:32px;height:32px;stroke:currentColor}#info-content .wallet-empty p{font-size:14px;color:#777;margin:10px 0 0}#info-content .wallet-support{text-align:center;font-size:14px;color:#777;margin:22px 0 0}.wallet-support a{color:var(--accent)} -#wallet-payment-dialog{width:440px;max-width:calc(100vw - 32px);box-sizing:border-box;background:#19191c;border:1px solid #ffffff20;border-radius:22px;padding:32px;color:#eee}#wallet-payment-dialog::backdrop{background:#0009;backdrop-filter:blur(5px)}.wallet-dialog-close{position:absolute;right:16px;top:14px;background:none;border:0;color:#999;font-size:26px}.wallet-payment-title{font-size:24px;margin:0 0 25px}.wallet-order{padding:20px;border-radius:14px;background:#ffffff05;display:grid;gap:10px}.wallet-order>span{font-size:14px;color:#999}.wallet-order strong{font-size:24px}.wallet-order small{color:#dfb769;font-size:12px}.wallet-order b{font-size:30px;color:var(--accent);margin-top:4px}.wallet-method-title{font-size:16px;margin:24px 0 14px}.wallet-methods{display:flex;gap:12px}.wallet-methods button{flex:1;display:flex;justify-content:center;align-items:center;gap:8px;padding:14px 8px;border:1px solid #ffffff24;border-radius:12px;background:#242427;color:#bbb}.wallet-methods button[aria-pressed="true"]{border-color:var(--accent);color:#eee;background:#FFC0000c}.wallet-method-symbol{display:grid;place-items:center;width:24px;height:24px;border-radius:6px;background:#1677ff;color:white;font-size:16px}.wallet-method-symbol.wechat{background:#19ad60}.wallet-payment-go{width:100%;margin-top:26px}.wallet-payment-note{font-size:12px;color:#777;line-height:1.8;text-align:center;margin:14px 0 0}.wallet-payment-status{font-size:14px;color:#dca5bf;line-height:1.7}.wallet-payment-status:empty{display:none} -@media(max-width:900px){.wallet-pack-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:600px){.wallet-hero{padding:24px}.wallet-pack-panel{padding:18px}.wallet-pack-grid{gap:12px}.wallet-package{padding:20px 14px}.wallet-package-price{font-size:26px}.wallet-package-name{font-size:16px}.wallet-package-hint{font-size:12px}.wallet-pack-heading{align-items:flex-start;flex-direction:column;gap:8px}.wallet-submit{width:100%;min-width:0}#wallet-payment-dialog{padding:28px 24px}} -#wallet-payment-dialog{width:440px;max-height:calc(100dvh - 32px);overflow:auto;padding:34px 32px;border:1px solid #ffffff28;border-radius:36px;background:#0e0e0f;box-shadow:0 24px 100px #0005} -#wallet-payment-dialog::backdrop{background:#0008;backdrop-filter:blur(9px)}#wallet-payment-dialog .wallet-dialog-close{font-size:20px;right:16px;top:12px;width:24px;height:24px;padding:0;color:#888} -.wallet-payment-heading{display:flex;align-items:center;gap:12px;margin-bottom:20px}.wallet-payment-heading .wallet-payment-title{font-size:24px;line-height:1.4;margin:0}.wallet-payment-heading>span{font-size:16px;color:#929292} -#wallet-payment-dialog .wallet-order{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:18px 16px;border:1px solid #ffffff0c;border-radius:20px;background:#1a1a1b}.wallet-order-copy{display:grid;gap:12px}.wallet-order-copy strong{font-size:20px;font-weight:400;line-height:1.4}.wallet-order-copy>span{font-size:14px;color:#909090}.wallet-order-copy small{font-size:12px;line-height:1.6;color:#bda578}#wallet-payment-dialog .wallet-order>b{flex-shrink:0;display:grid;place-items:center;min-width:78px;padding:10px 16px;margin:0;background:#FFC00010;border-radius:999px;color:var(--accent);font-size:22px;font-weight:600} -#wallet-payment-dialog .wallet-method-title{font-size:18px;margin:20px 0 18px}#wallet-payment-dialog .wallet-methods{display:flex;flex-direction:column;gap:12px}#wallet-payment-dialog .wallet-methods button{display:flex;align-items:center;justify-content:flex-start;flex:none;gap:12px;width:100%;padding:14px 16px;min-height:66px;border:1px solid #ffffff0d;border-radius:20px;background:#1a1a1b;color:#f5f5f5;text-align:left}#wallet-payment-dialog .wallet-methods button:hover{border-color:#FFC00080}#wallet-payment-dialog .wallet-methods button[aria-pressed="true"]{border-color:var(--accent)}.wallet-method-name{flex:1;font-size:16px;font-weight:500}.wallet-method-check{display:grid;place-items:center;width:20px;height:20px;flex:0 0 20px;border-radius:50%;background:#333;color:white;font-size:14px}.wallet-methods [aria-pressed="true"] .wallet-method-check{background:var(--accent)} -.wallet-pay-logo{width:36px;height:36px;flex:0 0 36px;display:grid;place-items:center;border-radius:50%;color:white}.wallet-pay-logo.alipay{background:#3459ed;font-size:28px;font-family:var(--font-ui)}.wallet-pay-logo.wechat{background:#11bb0d}.wallet-pay-logo.usdt{background:#269f80}.wallet-pay-logo svg{width:29px;height:29px;stroke:none} -#wallet-payment-dialog .wallet-payment-go{min-width:0;width:100%;height:50px;margin-top:18px;padding:0;border-radius:12px;font-size:18px;font-weight:500}#wallet-payment-dialog .wallet-payment-note{font-size:12px;line-height:1.7;margin:18px 0 0;color:#858585} -#wallet-payment-dialog .wallet-dialog-close{display:grid;place-items:center} -#wallet-payment-dialog .wallet-order-copy{min-width:0;overflow-wrap:anywhere} -#wallet-payment-dialog .wallet-methods button:disabled,#wallet-payment-dialog .wallet-payment-go:disabled{opacity:.6;cursor:not-allowed} -#wallet-payment-dialog .wallet-pay-logo--other{background:#39424b;color:#fff} -#wallet-payment-dialog .wallet-pay-logo--other svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.8} -#wallet-payment-dialog .wallet-payment-link{display:flex;margin-top:18px;border-radius:12px} -@media(max-width:480px){#wallet-payment-dialog{padding:30px 24px;border-radius:28px}.wallet-payment-heading .wallet-payment-title{font-size:22px}.wallet-payment-heading>span{font-size:14px}} - - -.wallet-pay-area>.wallet-submit{width:420px;max-width:100%;min-width:0}@media(max-width:600px){.wallet-pay-area>.wallet-submit{width:100%}} -.wallet-pay-area>.wallet-submit:disabled{opacity:.5;cursor:not-allowed}.wallet-pack-empty{grid-column:1/-1}.wallet-balance-copy{min-width:0}.wallet-balance-amount{flex-wrap:wrap;overflow-wrap:anywhere}.wallet-transaction-row>div{min-width:0;overflow-wrap:anywhere} - - -.wallet-balance-card{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(300px,1fr);align-items:center;gap:40px;padding:36px 38px;margin-bottom:30px;border:1px solid #ffffff16;border-radius:24px;background:linear-gradient(110deg,#2c1a10 0%,#1b140f 48%,#141416 100%)}.wallet-balance-summary{display:flex;align-items:center;gap:26px;min-width:0}.wallet-large-coin{display:block;flex:0 0 130px;width:130px;height:140px;object-fit:contain}.wallet-balance-copy>span{font-size:14px;color:#8b8391}.wallet-balance-amount{display:flex;align-items:baseline;gap:16px;margin:8px 0}.wallet-balance-amount strong{font-size:48px;line-height:1.2;font-weight:600;color:#ecd079}.wallet-balance-amount b{font-size:18px;color:#eee;font-weight:500}#info-content .wallet-balance-copy p{font-size:14px;color:#8b8391;line-height:1.7;margin:0}#info-content .wallet-usage h2{font-size:14px;font-weight:400;color:#8a8490;margin:0 0 14px}.wallet-usage{min-width:0}.wallet-usage-item{display:flex;align-items:flex-start;gap:10px;margin-top:12px}.wallet-usage-item svg{width:20px;height:20px;flex:0 0 20px;fill:none;stroke:#dec269;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.wallet-usage-item strong{font-size:14px;font-weight:600;line-height:1.5;color:#ddd}#info-content .wallet-usage-item p{font-size:14px;line-height:1.6;color:#847f8b;margin:3px 0 0} -@media(max-width:1000px){.wallet-balance-card{grid-template-columns:1fr;gap:28px;padding:28px}.wallet-usage{padding-top:22px;border-top:1px solid #ffffff0e}.wallet-large-coin{width:105px;height:115px;flex-basis:105px}} -@media(max-width:600px){.wallet-balance-card{padding:24px 20px;border-radius:20px}.wallet-balance-summary{gap:16px}.wallet-large-coin{width:80px;height:90px;flex-basis:80px}.wallet-balance-amount strong{font-size:38px}.wallet-balance-amount b{font-size:16px}#info-content .wallet-balance-copy p{font-size:12px}} -.wallet-balance-coin{flex:0 0 110px;width:110px;height:110px;box-sizing:border-box;border-width:5px;font-size:68px;box-shadow:inset 0 0 0 7px #ffd563} -@media(max-width:1000px){.wallet-balance-coin{flex-basis:96px;width:96px;height:96px;font-size:58px}} -@media(max-width:600px){.wallet-balance-coin{flex-basis:76px;width:76px;height:76px;border-width:4px;font-size:46px;box-shadow:inset 0 0 0 5px #ffd563}} -.wallet-package-coins{display:flex;align-items:center;gap:12px;max-width:100%;padding-right:12px} -.wallet-package .wallet-package-coin{flex:0 0 32px;width:32px;height:32px;box-sizing:border-box;font-size:20px} -.wallet-package .wallet-package-name{display:flex;align-items:baseline;flex-wrap:wrap;gap:6px;font-size:30px;line-height:1.3;font-weight:650;color:#f0d281} -.wallet-package-name small{font-size:18px;font-weight:500} -.wallet-package .wallet-package-price{font-size:18px;line-height:1.4;font-weight:500;color:#c5c5ca} -@media(max-width:1180px){.wallet-package-coins{gap:8px}.wallet-package .wallet-package-name{font-size:26px}.wallet-package-name small{font-size:16px}} -@media(max-width:600px){.wallet-package .wallet-package-coin{flex-basis:26px;width:26px;height:26px;font-size:16px}.wallet-package .wallet-package-name{font-size:24px}.wallet-package-name small{font-size:14px}.wallet-package .wallet-package-price{font-size:16px}.wallet-package-coins{gap:7px;padding-right:0}} - - -.coin-symbol .coin-soft-star{display:block;width:76%;height:76%;object-fit:contain;pointer-events:none;filter:drop-shadow(0 1px 0 #fff5b0)} - - -.wallet-package{overflow:hidden;padding-bottom:32px}.wallet-package .wallet-package-hint{line-height:1.6}.wallet-package:has(.wallet-package-recommend) .wallet-package-hint{padding-right:62px}.wallet-package .wallet-package-recommend{position:absolute;right:-12px;bottom:-22px;width:96px;height:96px;object-fit:contain;pointer-events:none} -@media(max-width:600px){.wallet-package{padding-bottom:30px}.wallet-package .wallet-package-recommend{width:76px;height:76px;right:-9px;bottom:-18px}.wallet-package:has(.wallet-package-recommend) .wallet-package-hint{padding-right:45px}} -.wallet-transaction-list{padding:0 22px;border:1px solid #ffffff10;border-radius:16px;background:#1a1a1b}.wallet-transaction-row{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:22px 0}.wallet-transaction-row+.wallet-transaction-row{border-top:1px solid #ffffff0b}.wallet-transaction-row strong{display:block;color:#e5e5e5;font-size:16px;font-weight:400;line-height:1.5}.wallet-transaction-row time{display:block;margin-top:12px;color:#85858b;font-size:14px}.wallet-transaction-amount{font-size:18px;font-weight:500;white-space:nowrap;font-variant-numeric:tabular-nums}.wallet-transaction-amount.income{color:#00c780}.wallet-transaction-amount.expense{color:#ff3d43}#info-content .wallet-demo-records{font-size:12px;color:#707076;margin:12px 0 0} -@media(max-width:600px){.wallet-transaction-list{padding:0 16px}.wallet-transaction-row{padding:18px 0}} -#drama-play-page[hidden]{display:none}#drama-play-page{padding-top:30px}.play-detail-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:28px;margin-top:26px}.play-detail-main{min-width:0}.play-screen{position:relative;width:100%;aspect-ratio:16/9;overflow:hidden;border-radius:16px;background:#050505}.play-screen video{display:block;width:100%;height:100%;object-fit:contain}.play-screen-overlay{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:14px;background:#0008;padding:20px;text-align:center}.play-screen-overlay button{width:66px;height:66px;border:1px solid #ffffff60;border-radius:50%;background:#FFC000dd;color:white;font-size:28px}.play-screen-overlay p{font-size:14px;color:#ccc;margin:0}.play-screen-controls{position:absolute;bottom:0;left:0;right:0;display:flex;align-items:center;gap:16px;padding:14px 18px;background:linear-gradient(transparent,#000d);color:#aaa;font-size:12px}.play-screen-controls button{background:none;border:0;color:#ddd;font-size:14px}.play-screen-controls span{flex:1}.play-advertisements{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:12px;padding:22px 0}.play-advertisements a{display:block;text-align:center;color:#999;font-size:12px;min-width:0;text-decoration:none}.play-advertisements img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:22%;display:block;margin-bottom:7px}.play-advertisements span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.play-detail-info{padding:4px 0 26px;border-bottom:1px solid #ffffff12}.play-detail-info h1{font-size:26px;line-height:1.5;margin:8px 0 14px;color:#eee}.play-episode-caption{color:var(--accent);font-size:14px}.play-detail-meta{display:flex;flex-wrap:wrap;gap:12px;color:#8d8d96;font-size:14px;margin:12px 0}.play-detail-tags{display:flex;align-items:center;gap:10px;flex-wrap:wrap;color:#888;font-size:14px}.play-detail-tags a{color:#c49bad;background:#FFC00010;border-radius:6px;padding:4px 9px;text-decoration:none}.play-detail-description{font-size:14px;color:#999;line-height:1.9;margin:14px 0 20px}.play-detail-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.play-detail-actions button,.play-detail-actions a{display:inline-flex;align-items:center;gap:7px;background:#ffffff06;border:1px solid #ffffff15;border-radius:999px;padding:9px 17px;color:#bbb;font-size:14px;text-decoration:none}.play-detail-actions [aria-pressed="true"]{color:var(--accent);border-color:#FFC00050}.play-detail-actions .play-download{margin-left:auto;background:var(--accent);color:#fff;border-color:var(--accent)}.play-episodes-section{padding:26px 0}.play-section-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px}.play-section-heading h2,.play-related h2{font-size:20px;color:#eee;margin:0}.play-section-heading span{font-size:14px;color:#888}.play-episode-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(44px,1fr));gap:10px;max-height:254px;overflow:auto;padding:2px 4px 4px 2px}.play-episode-grid a{display:grid;place-items:center;aspect-ratio:1;min-height:44px;border-radius:9px;background:#252527;color:#bbb;text-decoration:none;font-size:14px;border:1px solid transparent}.play-episode-grid a:hover{color:var(--accent);border-color:#FFC00070}.play-episode-grid a[aria-current="true"]{background:var(--accent);color:white}.play-official{padding:20px 22px;border:1px solid #ffffff10;border-radius:14px;background:#ffffff04;color:#999;font-size:14px;line-height:2}.play-official strong{color:#ddd;display:block;margin-bottom:6px}.play-official a{color:var(--accent);margin-right:18px}.play-comments{margin-top:28px}.play-comment-form textarea{box-sizing:border-box;display:block;width:100%;height:100px;resize:vertical;padding:15px;border:1px solid #ffffff20;border-radius:12px;background:#202023;color:#eee;font:inherit;font-size:14px}.play-comment-form textarea:focus{outline:1px solid var(--accent)}.play-comment-footer{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:12px;color:#777;font-size:12px}.play-comment-footer button{border:0;border-radius:999px;background:var(--accent);color:white;padding:10px 23px}.play-comment-list{margin-top:20px}.play-comment-item{display:flex;gap:12px;padding:18px 0;border-bottom:1px solid #ffffff0c}.play-comment-item img{width:36px;height:36px;object-fit:cover;border-radius:50%}.play-comment-item strong{font-size:14px;color:#ccc}.play-comment-item time{font-size:12px;color:#777;margin-left:10px}.play-comment-item p{font-size:14px;color:#aaa;line-height:1.7;margin:8px 0 0;white-space:pre-wrap;overflow-wrap:anywhere}.play-comments-empty{color:#777;text-align:center;font-size:14px;padding:28px}.play-related{border-left:1px solid #ffffff10;padding-left:24px;min-width:0}.play-related h2{margin-bottom:18px}.play-related .card{display:block;width:100%;margin-bottom:24px;opacity:1;animation:none;text-align:left}.play-related .card :is(h2,h3){font-size:16px}.play-related .cover{aspect-ratio:640/914;display:block;overflow:hidden;border-radius:12px}.play-related .poster-source{width:100%;height:100%;object-fit:cover}.play-related .drama-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12px;color:#888;line-height:1.6}.play-related .drama-meta{font-size:12px}.play-sort button{background:none;border:0;color:#777;padding:4px 8px}.play-sort button[aria-pressed="true"]{color:var(--accent)} -@media(max-width:1100px){.play-detail-layout{grid-template-columns:minmax(0,1fr) 230px;gap:20px}.play-related{padding-left:18px}.play-detail-info h1{font-size:22px}} -@media(max-width:800px){.play-detail-layout{grid-template-columns:minmax(0,1fr)}.play-related{border:0;padding:0}.play-related-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.play-advertisements{grid-template-columns:repeat(4,minmax(0,1fr))}.play-detail-actions .play-download{margin-left:0}.play-detail-info h1{font-size:20px}.play-screen{border-radius:10px}.play-screen-overlay button{width:48px;height:48px;font-size:22px}} + + + + + + + + + + + + +#info-page[data-info="deposit"] .info-layout{display:block}#info-page[data-info="deposit"] .info-nav{display:none}#info-page[data-info="deposit"] #info-content{padding:0;background:transparent;border:0;box-shadow:none} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#drama-play-page[hidden]{display:none}#drama-play-page{padding-top:30px}.play-detail-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:28px;margin-top:26px}.play-detail-main{min-width:0}.play-screen{position:relative;width:100%;aspect-ratio:16/9;overflow:hidden;border-radius:16px;background:#050505}.play-screen video{display:block;width:100%;height:100%;object-fit:contain}.play-screen-overlay{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:14px;background:#0008;padding:20px;text-align:center}.play-screen-overlay button{width:66px;height:66px;border:1px solid #ffffff60;border-radius:50%;background:#FFC000dd;color:white;font-size:28px}.play-screen-overlay p{font-size:14px;color:#ccc;margin:0}.play-screen-controls{position:absolute;bottom:0;left:0;right:0;display:flex;align-items:center;gap:16px;padding:14px 18px;background:linear-gradient(transparent,#000d);color:#aaa;font-size:12px}.play-screen-controls button{background:none;border:0;color:#ddd;font-size:14px}.play-screen-controls span{flex:1}.play-advertisements{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:12px;padding:22px 0}.play-advertisements a{display:block;text-align:center;color:#999;font-size:12px;min-width:0;text-decoration:none}.play-advertisements img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:22%;display:block;margin-bottom:7px}.play-advertisements span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.play-detail-info{padding:4px 0 26px;border-bottom:1px solid #ffffff12}.play-detail-info h1{font-size:26px;line-height:1.5;margin:8px 0 14px;color:#eee}.play-episode-caption{color:var(--accent);font-size:14px}.play-detail-meta{display:flex;flex-wrap:wrap;gap:12px;color:#8d8d96;font-size:14px;margin:12px 0}.play-detail-tags{display:flex;align-items:center;gap:10px;flex-wrap:wrap;color:#888;font-size:14px}.play-detail-tags a{color:#c49bad;background:#FFC00010;border-radius:6px;padding:4px 9px;text-decoration:none}.play-detail-description{font-size:14px;color:#999;line-height:1.9;margin:14px 0 20px}.play-detail-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.play-detail-actions button,.play-detail-actions a{display:inline-flex;align-items:center;gap:7px;background:#ffffff06;border:1px solid #ffffff15;border-radius:999px;padding:9px 17px;color:#bbb;font-size:14px;text-decoration:none}.play-detail-actions [aria-pressed="true"]{color:var(--accent);border-color:#FFC00050}.play-detail-actions .play-download{margin-left:auto;background:var(--accent);color:#fff;border-color:var(--accent)}.play-episodes-section{padding:26px 0}.play-section-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px}.play-section-heading h2{font-size:20px;color:#eee;margin:0}.play-section-heading span{font-size:14px;color:#888}.play-episode-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(44px,1fr));gap:10px;max-height:254px;overflow:auto;padding:2px 4px 4px 2px}.play-episode-grid a{display:grid;place-items:center;aspect-ratio:1;min-height:44px;border-radius:9px;background:#252527;color:#bbb;text-decoration:none;font-size:14px;border:1px solid transparent}.play-episode-grid a:hover{color:var(--accent);border-color:#FFC00070}.play-episode-grid a[aria-current="true"]{background:var(--accent);color:white}.play-official{padding:20px 22px;border:1px solid #ffffff10;border-radius:14px;background:#ffffff04;color:#999;font-size:14px;line-height:2}.play-official strong{color:#ddd;display:block;margin-bottom:6px}.play-official a{color:var(--accent);margin-right:18px} +@media(max-width:1100px){.play-detail-layout{grid-template-columns:minmax(0,1fr) 230px;gap:20px}.play-detail-info h1{font-size:22px}} +@media(max-width:800px){.play-detail-layout{grid-template-columns:minmax(0,1fr)}.play-advertisements{grid-template-columns:repeat(4,minmax(0,1fr))}.play-detail-actions .play-download{margin-left:0}.play-detail-info h1{font-size:20px}.play-screen{border-radius:10px}.play-screen-overlay button{width:48px;height:48px;font-size:22px}} @@ -1457,9 +1391,9 @@ html:not(.sidebar-collapsed) .side .sidebar-header>.sidebar-logo-toggle{height:4 .play-official{padding:28px 30px;background:#1a1a1b;border:0;border-radius:20px;font-size:14px;line-height:1.7}.play-official-line{margin-bottom:20px}.play-official-line:last-child{margin-bottom:0}.play-official-line>span{display:block;color:#c1c1c6}.play-official-line a{display:inline-block;color:var(--accent);text-decoration:none;margin:0;overflow-wrap:anywhere}.play-official-line a:hover{text-decoration:underline}.play-official-inline{display:flex;gap:6px;flex-wrap:wrap} -.play-comments{margin-top:28px;padding:26px;background:#1a1a1b;border-radius:20px}.play-comments .play-section-heading{margin-bottom:18px}.play-comments .play-section-heading h2{font-size:16px;font-weight:500}.play-sort{padding:5px;background:#252527;border-radius:9px}.play-sort button{font-size:14px;padding:5px 8px}.play-sort button[aria-pressed="true"]{color:#eee}.play-sort button:hover{color:var(--accent)} -.play-comment-form{display:flex;gap:14px;padding:14px;background:#252527;border-radius:13px}.play-compose-avatar{width:38px;height:38px;flex:0 0 38px;object-fit:cover;border-radius:50%}.play-compose-body{flex:1;min-width:0}.play-comment-form textarea{height:66px;min-height:66px;border:0;border-radius:9px;background:#090909;padding:12px 14px;font-size:14px}.play-comment-footer{margin-top:12px}.play-comment-footer>span{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12px}.play-comment-footer em{font-style:normal;color:var(--accent)}.play-comment-footer button{padding:8px 20px;font-size:14px;white-space:nowrap}.play-comment-list{margin-top:12px}.play-comment-item{padding:20px 0;border:0;gap:12px}.play-comment-item>img,.play-comment-avatar{width:36px;height:36px;flex:0 0 36px;border-radius:50%}.sample-avatar{display:grid;place-items:center;color:#eedbe5;font-size:16px}.sample-avatar-0{background:linear-gradient(135deg,#665665,#372d26)}.sample-avatar-1{background:linear-gradient(135deg,#6d6655,#37322c)}.sample-avatar-2{background:linear-gradient(135deg,#506570,#27343a)}.play-comment-body{min-width:0;flex:1}.play-comment-body>strong{font-size:14px;color:#929299;font-weight:400}.play-comment-body>p{margin:8px 0 6px;font-size:14px;line-height:1.7;color:#ccc}.play-comment-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;color:#85858d}.play-comment-meta time{margin:0;font-size:12px}.play-comment-meta button{padding:0;border:0;background:none;color:#888;font-size:12px}.play-comment-meta button:hover,.play-comment-meta button[aria-pressed="true"]{color:var(--accent)} -@media(max-width:600px){.play-official{padding:22px}.play-comments{padding:20px 16px}.play-comment-form{gap:10px;padding:12px}.play-compose-avatar{width:30px;height:30px;flex-basis:30px}.play-comment-footer{align-items:flex-start;gap:10px;flex-wrap:wrap}.play-comment-footer button{margin-left:auto}} + +.sample-avatar{display:grid;place-items:center;color:#eedbe5;font-size:16px}.sample-avatar-0{background:linear-gradient(135deg,#665665,#372d26)}.sample-avatar-1{background:linear-gradient(135deg,#6d6655,#37322c)}.sample-avatar-2{background:linear-gradient(135deg,#506570,#27343a)} +@media(max-width:600px){.play-official{padding:22px}} @@ -1537,21 +1471,21 @@ body{min-height:100vh;background-color:#131414;background-image:radial-gradient( #global-site-header .hg-header-brand{height:44px}#global-site-header .hg-header-brand .hg-complete-logo{width:125px;height:44px;aspect-ratio:500/176;object-fit:contain} -.member-library-item[hidden]{display:none!important} -.member-history-pagination{display:flex;justify-content:center;align-items:center;gap:14px;flex-wrap:wrap;margin:32px 0 8px} -.member-history-pagination button{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:46px;min-width:46px;height:46px;padding:0;border:0;border-radius:50%;background:#262628;color:#aaa!important;font:inherit;font-size:16px;cursor:pointer;transition:background .16s,color .16s} -.member-history-pagination button:hover:not(:disabled){color:#fff!important;background:#363638} -.member-history-pagination button[aria-current=page]{background:var(--accent);color:#fff!important} -.member-history-pagination button:disabled{opacity:.4;cursor:default} -.member-history-pagination .pagination-ellipsis{color:#909096;padding:0 5px} -.member-history-pagination .history-page-jump{display:flex;align-items:center;gap:12px;margin-left:8px;color:#929298;font-size:16px} -.member-history-pagination input{box-sizing:border-box;width:70px;height:46px;border:1px solid transparent;border-radius:999px;background:#262628;color:#fff;text-align:center;font:inherit;outline:none;appearance:textfield} -.member-history-pagination input::-webkit-inner-spin-button,.member-history-pagination input::-webkit-outer-spin-button{appearance:none;margin:0} -.member-history-pagination input:focus{border-color:var(--accent)} -.member-history-pagination .history-page-confirm{width:94px;border-radius:999px;background:var(--accent);color:#fff!important} -.member-history-pagination .history-page-confirm:hover{background:var(--accent);filter:brightness(1.1)} -.member-history-pagination button:focus-visible{outline:2px solid var(--accent);outline-offset:4px} -@media(max-width:600px){.member-history-pagination{gap:9px}.member-history-pagination button{width:38px;min-width:38px;height:38px}.member-history-pagination .history-page-jump{justify-content:center;flex-basis:100%;margin:6px 0 0}.member-history-pagination input{height:38px}.member-history-pagination .history-page-confirm{width:80px}} + + + + + + + + + + + + + + + @@ -1581,7 +1515,7 @@ body{min-height:100vh;background-color:#131414;background-image:radial-gradient( #drama-play-page .play-screen-overlay{pointer-events:none} #drama-play-page .play-screen-overlay button{pointer-events:auto;display:grid;place-items:center} #drama-play-page .play-screen-overlay button svg{width:30px;height:30px} -#drama-play-page .play-screen-overlay button[data-show-unlock]{width:auto;height:auto;min-height:44px;padding:10px 20px;border-radius:999px;font-size:14px} + #drama-play-page .play-screen:fullscreen{border-radius:0;width:100vw;height:100vh;aspect-ratio:auto;background:#000} @media(max-width:600px){#drama-play-page .play-screen-controls{padding:24px 10px 8px}#drama-play-page .player-control-row{gap:5px}#drama-play-page .player-volume input{width:38px}#drama-play-page .player-time{font-size:10px}#drama-play-page .player-control-row button{font-size:12px}} @@ -1595,34 +1529,34 @@ body{min-height:100vh;background-color:#131414;background-image:radial-gradient( #drama-play-page .play-episode-pages button{border:1px solid transparent;background:#252527;color:#aaa;border-radius:8px;padding:10px 18px;font-size:14px;cursor:pointer;transition:color .15s,background .15s} #drama-play-page .play-episode-pages button:hover{color:#fff;background:#343436} #drama-play-page .play-episode-pages button[aria-pressed=true]{color:#FFC000;background:#FFC00018;border-color:#FFC00040} -#drama-play-page .play-episode-locked{position:relative;display:grid;place-items:center;aspect-ratio:1;min-height:44px;padding:0;border:1px solid transparent;border-radius:9px;background:#252527;color:#888;font:inherit;font-size:16px;cursor:pointer} -#drama-play-page .play-episode-locked:hover{border-color:#FFC00070;background:#303032;color:#ddd} + + #drama-play-page .episode-lock-icon{position:absolute;bottom:4px;right:4px;width:12px;height:12px;fill:none;stroke:#a9a9ae;stroke-width:1.4} -#drama-play-page .play-episode-locked:focus-visible,#drama-play-page .play-episode-pages button:focus-visible{outline:2px solid #FFC000;outline-offset:3px} -#play-episode-lock{width:min(460px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;box-sizing:border-box;padding:36px;border:1px solid #3b3b3b;border-radius:40px;background:#0d0d0d;color:#fff;text-align:center;box-shadow:0 24px 90px #0005} -#play-episode-lock::backdrop{background:#0009;backdrop-filter:blur(10px)} -#play-episode-lock .unlock-close{position:absolute;right:16px;top:16px;display:grid;place-items:center;width:32px;height:32px;padding:6px;border:0;border-radius:50%;background:transparent;color:#999;cursor:pointer} -#play-episode-lock .unlock-close:hover{background:#ffffff0d;color:#fff} -#play-episode-lock .unlock-close svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round} -#play-episode-lock .unlock-coin{display:grid;place-items:center;width:64px;height:64px;margin:0 auto 22px;border:0;background:none} -#play-episode-lock .unlock-coin .coin-symbol{width:60px;height:60px;box-sizing:border-box;border:2px solid #ffe88c;box-shadow:inset 0 0 0 3px #ffd563} -#play-episode-lock h2{margin:0 0 20px;font-size:26px;line-height:1.4;font-weight:600;color:#fff} -#play-episode-lock .episode-lock-copy{margin:0 0 20px;font-size:16px;line-height:1.6;color:#929292} -#play-episode-lock .unlock-cost-summary{display:flex;justify-content:space-between;gap:20px;padding:20px 18px;border:1px solid #303030;border-radius:14px;background:#1a1a1a;text-align:left} -#play-episode-lock .unlock-cost-summary>div:last-child{text-align:right} -#play-episode-lock .unlock-cost-summary span{display:block;margin-bottom:8px;color:#919191;font-size:14px} -#play-episode-lock .unlock-cost-summary strong{font-size:18px;font-weight:500;color:#fff} -#play-episode-lock .unlock-cost-summary .unlock-cost{color:var(--accent)} -#play-episode-lock .unlock-confirm-note{margin:20px 0;font-size:14px;line-height:1.6;color:#929292} -#play-episode-lock .unlock-pay{display:block;width:100%;padding:18px 12px;border:0;border-radius:20px;background:var(--accent);color:#fff!important;font-size:18px;font-weight:500;cursor:pointer;transition:filter .15s} -#play-episode-lock .unlock-pay:hover{filter:brightness(1.07)} -#play-episode-lock .unlock-pay:disabled,#play-episode-lock .unlock-close:disabled{cursor:wait;opacity:.6} -#play-episode-lock .unlock-error{margin:0 0 16px;color:#ff718b;font-size:14px;line-height:1.6} -#play-episode-lock .unlock-error[hidden]{display:none} -#play-episode-lock .unlock-recharge{display:inline-block;margin-top:20px;padding:0;border:0;background:none;color:var(--accent)!important;font-size:18px;font-weight:500;text-decoration:none} -#play-episode-lock .unlock-recharge:hover{color:var(--accent)!important;filter:brightness(1.15)} -#play-episode-lock :is(button,a):focus-visible{outline:2px solid var(--accent);outline-offset:5px} -@media(max-width:480px){#play-episode-lock{padding:28px 24px;border-radius:30px}#play-episode-lock h2{font-size:22px}} +#drama-play-page .play-episode-pages button:focus-visible{outline:2px solid #FFC000;outline-offset:3px} + + + + + + + + + + + + + + + + + + + + + + + + @@ -1634,41 +1568,41 @@ body{min-height:100vh;background-color:#131414;background-image:radial-gradient( #drama-play-page .play-episode-pages .episode-page-track button:hover{color:#fff!important;background:transparent;border-color:transparent} #drama-play-page .play-episode-pages .episode-page-track button[aria-pressed=true]{color:#fff!important;background:transparent;border-color:transparent} #drama-play-page .play-episode-grid{grid-template-columns:repeat(15,minmax(0,1fr));grid-auto-rows:auto;gap:12px;min-height:0;align-content:start;overflow:visible;width:100%;max-width:100%;padding-bottom:4px} -#drama-play-page .play-episode-grid>a,#drama-play-page .play-episode-locked{position:relative;overflow:hidden;display:grid;place-items:center;aspect-ratio:1;border:0;border-radius:12px;background:#252527;color:#eee;font-size:20px;width:100%;height:auto;min-width:0;min-height:0;box-sizing:border-box} -#drama-play-page .play-episode-grid>a:hover,#drama-play-page .play-episode-locked:hover{background:#373739;color:#fff} +#drama-play-page .play-episode-grid>a{position:relative;overflow:hidden;display:grid;place-items:center;aspect-ratio:1;border:0;border-radius:12px;background:#252527;color:#eee;font-size:20px;width:100%;height:auto;min-width:0;min-height:0;box-sizing:border-box} +#drama-play-page .play-episode-grid>a:hover{background:#373739;color:#fff} #drama-play-page .play-episode-grid>a[aria-current=true]{background:#FFC00017;color:#FFC000} -#drama-play-page .episode-lock-corner{position:absolute;top:0;left:0;width:19px;height:16px;display:grid;place-items:center;border-radius:0 0 8px 0;background:#ffffff0d} + #drama-play-page .episode-lock-icon{position:static;width:10px;height:10px;stroke:#888;fill:#888} #drama-play-page .episode-lock-icon path{fill:none;stroke-width:2} #drama-play-page .episode-playing{position:absolute;top:5px;right:5px;display:flex;align-items:center;gap:2px;height:9px} #drama-play-page .episode-playing i{display:block;width:2px;height:9px;background:currentColor;border-radius:2px} #drama-play-page .episode-playing i:nth-child(2){height:5px} #drama-play-page .episode-playing i:nth-child(3){height:7px} -@media(max-width:600px){#drama-play-page .play-episode-grid{gap:12px}#drama-play-page .play-episode-grid>a,#drama-play-page .play-episode-locked{font-size:20px;border-radius:12px}#drama-play-page .episode-playing{top:5px;right:5px}#drama-play-page .episode-page-track{gap:22px}#drama-play-page .play-episode-pages .episode-page-track button{font-size:16px}} +@media(max-width:600px){#drama-play-page .play-episode-grid{gap:12px}#drama-play-page .play-episode-grid>a{font-size:20px;border-radius:12px}#drama-play-page .episode-playing{top:5px;right:5px}#drama-play-page .episode-page-track{gap:22px}#drama-play-page .play-episode-pages .episode-page-track button{font-size:16px}} + + + + -#drama-play-page .episode-lock-corner{width:21px;height:18px;background:#dba44312} -#drama-play-page .episode-lock-corner .coin-symbol{display:inline-flex;align-items:center;justify-content:center;position:relative;flex:none;box-sizing:border-box;width:13px;height:13px;min-width:13px;margin:0;padding:0;border:1px solid #ffe595;border-radius:50%;background:linear-gradient(135deg,#fff1a1,#ffc735);box-shadow:inset 0 0 0 1px #ffdc69;line-height:1} -#drama-play-page .episode-lock-corner .coin-soft-star{display:block;width:76%;height:76%;margin:0;filter:none} -#drama-play-page .episode-vip-mark{font-size:8px;line-height:1;color:var(--accent)} #drama-play-page .play-episode-pages .episode-page-track button[aria-pressed="false"]{color:#888!important} #drama-play-page .play-episode-pages .episode-page-track button[aria-pressed="false"]:hover{color:#fff!important;background:transparent;border-color:transparent} -#drama-play-page .play-comment-item>img{width:40px;height:40px;flex:0 0 40px;object-fit:cover;border-radius:50%} -#drama-play-page .play-comment-replies{margin-top:18px;padding:16px 18px;background:#ffffff04;border-radius:12px} -#drama-play-page .play-comment-replies .play-comment-child{padding:0;margin:0 0 20px;gap:12px} -#drama-play-page .play-comment-replies .play-comment-child:last-child{margin-bottom:0} -#drama-play-page .play-comment-child>img{width:30px;height:30px;flex-basis:30px} -#drama-play-page .play-comment-child .play-comment-body p{margin:7px 0 10px;font-size:14px;line-height:1.8} -#drama-play-page .play-reply-target{color:#bba5b0} -#drama-play-page .play-reply-context{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;font-size:14px;color:#bbb} -#drama-play-page .play-reply-context button{padding:3px 6px;background:none;color:#999!important;font-size:12px} -#drama-play-page .play-reply-context button:hover{color:#fff!important} -#drama-play-page .play-comment-meta button{color:#888!important} -#drama-play-page .play-comment-meta button:hover,#drama-play-page .play-comment-meta button[aria-pressed=true]{color:#FFC000!important} -@media(max-width:600px){#drama-play-page .play-comment-replies{padding:12px 10px}#drama-play-page .play-comment-child>img{width:26px;height:26px;flex-basis:26px}} + + + + + + + + + + + + + @@ -1712,14 +1646,14 @@ body{min-height:100vh;background-color:#131414;background-image:radial-gradient( -#drama-play-page .play-sort{display:inline-flex;align-items:center;gap:4px;padding:4px;border:1px solid #ffffff08;border-radius:11px;background:#252527} -#drama-play-page .play-sort button{min-width:56px;padding:7px 13px;border:0;border-radius:8px;background:transparent;color:#929299!important;font-size:14px;font-weight:400;line-height:1.5;transition:color .16s,background .16s,box-shadow .16s;cursor:pointer} -#drama-play-page .play-sort button[aria-pressed="false"]:hover{color:#eee!important;background:#ffffff0d} -#drama-play-page .play-sort button[aria-pressed="true"]{color:#fff!important;background:#FFC000;box-shadow:0 2px 8px #0002;font-weight:400} -#drama-play-page .play-sort button[aria-pressed="true"]:hover{background:#ff6829} -#drama-play-page .play-sort button:active{box-shadow:inset 0 1px 4px #0003} -#drama-play-page .play-sort button:focus-visible{outline:2px solid #ff9b73;outline-offset:2px} -@media(prefers-reduced-motion:reduce){#drama-play-page .play-sort button{transition:none}} + + + + + + + + @@ -1759,12 +1693,12 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} -#global-site-header .top .search,#global-site-header .header-actions .coin-entry,#global-site-header .header-actions .download-entry{background:#ffffff09;border-color:#ffffff1c;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:none;opacity:1} -#global-site-header .top .search:hover,#global-site-header .top .search:focus-within,#global-site-header .header-actions .coin-entry:hover,#global-site-header .header-actions .download-entry:hover{background:#ffffff14;border-color:#ffffff35;opacity:1} +#global-site-header .top .search,#global-site-header .header-actions .download-entry{background:#ffffff09;border-color:#ffffff1c;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:none;opacity:1} +#global-site-header .top .search:hover,#global-site-header .top .search:focus-within,#global-site-header .header-actions .download-entry:hover{background:#ffffff14;border-color:#ffffff35;opacity:1} #global-site-header .top .search input{color:#fff;caret-color:var(--accent);text-shadow:0 1px 3px #0008} #global-site-header .top .search input::placeholder{color:#eeeef2;opacity:1} -#global-site-header .header-actions .coin-entry{color:#f3cf75;text-shadow:0 1px 3px #0008} -@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){#global-site-header .top .search,#global-site-header .header-actions .coin-entry,#global-site-header .header-actions .download-entry{background:#29292de8}} + +@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){#global-site-header .top .search,#global-site-header .header-actions .download-entry{background:#29292de8}} @@ -1777,16 +1711,16 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} -.channel-pagination,.member-history-pagination{gap:12px;margin:30px 0 20px;font-size:14px} +.channel-pagination{gap:12px;margin:30px 0 20px;font-size:14px} .channel-pagination .pagination-pages{gap:10px} -.channel-pagination .pagination-pages button,.member-history-pagination>button{width:36px;min-width:36px;height:36px;padding:0;border-radius:50%;font-size:14px} -.channel-pagination .pagination-gap,.member-history-pagination .pagination-ellipsis{padding:0 3px;font-size:14px} -.channel-pagination .pagination-jump,.channel-pagination .pagination-jump label,.member-history-pagination .history-page-jump{gap:9px;font-size:14px} -.member-history-pagination .history-page-jump{margin-left:0} -.channel-pagination .pagination-jump input,.member-history-pagination .history-page-jump input{box-sizing:border-box;width:56px;height:36px;border-radius:999px;font-size:14px;padding:0 6px} -.channel-pagination .pagination-jump button,.member-history-pagination .history-page-confirm{width:76px;min-width:76px;height:36px;padding:0 16px;font-size:14px;border-radius:999px} -.member-history-pagination>button[aria-current="page"]:hover{background:var(--accent)} -@media(max-width:600px){.channel-pagination,.member-history-pagination{gap:9px}.channel-pagination .pagination-pages{gap:8px}} +.channel-pagination .pagination-pages button{width:36px;min-width:36px;height:36px;padding:0;border-radius:50%;font-size:14px} +.channel-pagination .pagination-gap{padding:0 3px;font-size:14px} +.channel-pagination .pagination-jump,.channel-pagination .pagination-jump label{gap:9px;font-size:14px} + +.channel-pagination .pagination-jump input{box-sizing:border-box;width:56px;height:36px;border-radius:999px;font-size:14px;padding:0 6px} +.channel-pagination .pagination-jump button{width:76px;min-width:76px;height:36px;padding:0 16px;font-size:14px;border-radius:999px} + +@media(max-width:600px){.channel-pagination{gap:9px}.channel-pagination .pagination-pages{gap:8px}} @@ -1813,20 +1747,20 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} #global-site-header .top .search button[type=submit]{width:30px;height:32px;min-width:30px;flex:0 0 30px;padding:5px} #global-site-header .top .search button[type=submit] svg{width:18px;height:18px} #global-site-header .header-actions{width:auto;flex:0 0 auto;gap:8px;justify-content:flex-end} - #global-site-header .header-actions .coin-entry{height:36px;padding:0 8px;gap:4px;margin:0} - #global-site-header .coin-entry .coin-symbol{width:20px;height:20px;flex:0 0 20px} - #global-site-header .coin-caption{font-size:0} - #global-site-header .coin-value{font-size:12px;white-space:nowrap} + + + + #global-site-header .header-download-wrap{display:none} #global-site-header .header-actions .download-entry{width:34px;height:36px;padding:0;min-width:0;margin:0;justify-content:center} #global-site-header .download-entry>span{display:none} #global-site-header .download-entry>svg{width:18px;height:18px} #global-site-header .header-download-qr{position:fixed;top:var(--global-header-height);left:auto;right:16px;max-width:calc(100vw - 32px);box-sizing:border-box} - #global-site-header .account-entry{width:34px;height:34px;padding:0;gap:0} - #global-site-header .account-avatar,#global-site-header .account-avatar img{width:34px;height:34px} - #global-site-header .account-copy{display:none} + + + #global-site-header .search-discovery{position:fixed;top:calc(var(--global-header-height) - 4px);left:12px;right:12px;width:auto;max-width:none;max-height:calc(100dvh - var(--global-header-height) - var(--mobile-bottom-height) - 20px);padding:20px;border-radius:18px} - #profile-popover{position:fixed;top:var(--global-header-height);right:16px;max-width:calc(100vw - 32px)} + .mobile-pages{position:fixed;left:0;right:0;bottom:0;z-index:70;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:0;height:var(--mobile-bottom-height);box-sizing:border-box;padding:6px 8px calc(6px + env(safe-area-inset-bottom,0px));border:0;border-top:1px solid #ffffff10;background:#171719ed;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:visible} .mobile-pages>a{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:4px 0;min-width:0;min-height:44px;border-radius:10px;font-size:10px;line-height:1.2;color:#96969e;text-decoration:none} .mobile-pages>a[data-page=home-road],.mobile-pages>a[data-page=apps]{display:none} @@ -1853,7 +1787,7 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} .section-head{gap:12px}.section-head h2{font-size:20px!important;line-height:1.4}.section-head button{font-size:12px;white-space:nowrap} .home-content .topic-section>.section-head,.home-content #library>.section-head{margin-bottom:16px} #library #cards,.cards,#search-results-page .cards{gap:22px 12px} - .drama-data-card>:is(h2,h3),#info-content .member-library-item h3{font-size:14px;line-height:1.5;margin-top:9px} + .drama-data-card>:is(h2,h3){font-size:14px;line-height:1.5;margin-top:9px} .drama-description{font-size:12px;line-height:1.6} .drama-data-card .drama-tags>span,.drama-data-card .drama-heat{font-size:10px} .drama-data-card .drama-tags>span+span{margin-left:4px;padding-left:4px} @@ -1887,33 +1821,33 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} #drama-play-page .play-episode-pages .episode-page-track button{font-size:14px;padding:0;min-height:36px} #drama-play-page .play-section-heading h2{font-size:18px} #drama-play-page .play-banner-ads{gap:10px;margin:22px 0} - #drama-play-page .play-official,#drama-play-page .play-comments{padding:20px 16px;border-radius:16px} + #drama-play-page .play-official{padding:20px 16px;border-radius:16px} #drama-play-page .play-official-line{font-size:14px;line-height:1.7} #drama-play-page .play-official-inline{flex-wrap:wrap;gap:0 8px} - #drama-play-page .play-comment-form{padding:12px;gap:10px} - #drama-play-page .play-compose-avatar{width:30px;height:30px} - #drama-play-page .play-compose-body{min-width:0} - #drama-play-page .play-comment-form textarea{font-size:14px;min-height:84px} - #drama-play-page .play-comment-footer{gap:8px;flex-wrap:wrap;font-size:12px} - #drama-play-page .play-related-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 12px} + + + + + + #drama-play-page .player-control-row{gap:6px;flex-wrap:wrap} #drama-play-page .play-screen-controls{padding:24px 10px 6px} #drama-play-page .player-time{font-size:10px} #drama-play-page .player-control-row button{min-width:26px;font-size:12px} - .member-summary{padding:20px;gap:20px;border-radius:16px}.member-identity{gap:14px} - #info-content .member-identity h2{font-size:22px} - .member-library-tabs{gap:0;justify-content:space-between}.member-library-tabs button{font-size:14px} - .member-library-toolbar{flex-direction:row;align-items:center;gap:8px;font-size:12px} - .member-library-cards{gap:22px 12px} + + + + + .channel-tabs{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;gap:8px}.channel-tabs button{flex-shrink:0;font-size:14px;padding:9px 14px} #search-results-page h1{font-size:22px}#search-results-page .search-results-heading{margin:20px 0 24px} .ui-empty-state{min-height:260px;padding:24px 12px}.ui-empty-state>img{width:164px;height:164px} - .page-tools{bottom:calc(var(--mobile-bottom-height) + 14px)!important;right:12px!important}.page-tools .page-tool-download{display:block}.page-tools #floating-history{display:grid} + .page-tools{bottom:calc(var(--mobile-bottom-height) + 14px)!important;right:12px!important}.page-tools .page-tool-download{display:block} .page-tools .page-tool{width:38px;height:38px;min-width:38px;border-radius:12px} .footer{font-size:12px;line-height:1.8;gap:14px;padding-bottom:24px} dialog{max-width:calc(100vw - 24px);max-height:calc(100dvh - 32px);overflow:auto} } -@media(max-width:360px){#global-site-header{padding-left:12px;padding-right:12px}#global-site-header .top{gap:7px}#global-site-header .header-actions{gap:6px}#global-site-header .coin-value{font-size:12px}.home-content .hero{height:420px}} +@media(max-width:360px){#global-site-header{padding-left:12px;padding-right:12px}#global-site-header .top{gap:7px}#global-site-header .header-actions{gap:6px}.home-content .hero{height:420px}} @@ -1950,7 +1884,7 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} #mobile-navigation-drawer{padding-top:calc(60px + env(safe-area-inset-top,0px));padding-bottom:calc(30px + env(safe-area-inset-bottom,0px))} .mobile-drawer-close{top:calc(12px + env(safe-area-inset-top,0px))} } -@media(max-width:390px){#global-site-header .header-actions{gap:5px}#global-site-header .header-actions .coin-entry{padding:0 6px}#global-site-header .top .search{padding-left:9px}#mobile-navigation-drawer{padding-left:22px;padding-right:22px}.mobile-drawer-brand img{width:150px}} +@media(max-width:390px){#global-site-header .header-actions{gap:5px}#global-site-header .top .search{padding-left:9px}#mobile-navigation-drawer{padding-left:22px;padding-right:22px}.mobile-drawer-brand img{width:150px}} @media(prefers-reduced-motion:reduce){#mobile-navigation-drawer[open],#mobile-navigation-drawer.is-closing{animation:none}} @@ -2089,20 +2023,14 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} -#drama-play-page .play-comments{background:transparent;border:0;border-radius:0;padding:0;box-shadow:none} -#drama-play-page .play-sort{gap:2px;padding:3px;border-radius:999px;flex-shrink:0} -#drama-play-page .play-sort button{min-width:42px;min-height:28px;padding:4px 8px;border-radius:999px;font-size:12px;line-height:20px;font-weight:400;box-sizing:border-box} -#drama-play-page .play-sort button[aria-pressed="true"],#drama-play-page .play-sort button[aria-pressed="true"]:hover{background:#55555b;color:#f2f2f4!important;font-weight:400;box-shadow:none} -@media(max-width:760px){ - #drama-play-page .play-related-list{gap:22px 12px} - #drama-play-page .play-related .card{margin-bottom:0} - #drama-play-page .play-related .card :is(h2,h3){font-size:14px;font-weight:500;line-height:1.5;margin:9px 0 9px} - #drama-play-page .play-related .drama-description{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:unset;min-height:0;font-size:12px;line-height:1.8;margin:0 0 7px} - #drama-play-page .play-related .drama-meta{margin:0} -} + + + + + @@ -2125,33 +2053,27 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} -@media(max-width:760px){ - #info-content .member-advertisements{width:100%;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch} - #info-content .member-advertisements::-webkit-scrollbar{display:none} - #info-content .member-ad-grid{display:flex;flex-wrap:nowrap;gap:10px;width:100%;padding:0} - #info-content .member-ad-tile{flex:0 0 calc((100% - 50px) / 5.3);width:calc((100% - 50px) / 5.3);min-width:0;gap:7px;font-size:12px;line-height:1.4;scroll-snap-align:start} - #info-content .member-ad-tile img{width:100%;height:auto;aspect-ratio:1;transform:none} -} + @media(max-width:760px){ #info-page[data-info="account-settings"] .info-layout,#info-page[data-info="account-settings"] #info-content{min-width:0;width:100%;max-width:100%;box-sizing:border-box} - #info-content .member-settings{width:100%;max-width:100%;min-width:0;grid-template-columns:minmax(0,1fr);gap:20px} - #info-content .member-settings-card{box-sizing:border-box;width:100%;min-width:0;max-width:100%;padding:20px} - #info-content .member-avatar-editor{min-width:0;gap:14px} - #info-content .member-avatar-controls{flex:1 1 0;min-width:0} - #info-content .member-avatar-controls p{white-space:normal;overflow-wrap:anywhere;line-height:1.6} - #info-content .member-nickname-editor{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;min-width:0} - #info-content .member-nickname-editor input{width:100%;min-width:0;box-sizing:border-box;padding:10px 12px} - #info-content .member-nickname-editor button{padding:0 12px;font-size:14px} - #info-content .member-settings-action{box-sizing:border-box;gap:12px;min-width:0} - #info-content .member-settings-action>span:first-child{min-width:0;flex:1} - #info-content .member-settings-action small{white-space:normal;overflow-wrap:anywhere;line-height:1.6} - #info-content .member-settings-trailing{gap:8px;white-space:nowrap} - #info-content #member-avatar-confirm{display:flex;flex-wrap:wrap;gap:8px} - #info-content #member-avatar-confirm[hidden]{display:none} - #info-content #member-avatar-confirm button+button{margin-left:0} + + + + + + + + + + + + + + + } @@ -2160,10 +2082,10 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} /* Keep every centered modal inside the same mobile safe gutter. */ body dialog:not(#mobile-navigation-drawer){box-sizing:border-box;min-width:0!important;max-width:calc(100vw - 48px - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px))!important;max-height:calc(100dvh - 48px - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px))!important;margin:auto;overflow-y:auto;overscroll-behavior:contain} body dialog:not(#mobile-navigation-drawer) form{min-width:0;max-width:100%} - #member-auth-dialog,#member-auth-dialog.auth-bind-mode,#wallet-payment-dialog,#member-delete-dialog,#play-episode-lock,.app-download-dialog{padding-left:20px;padding-right:20px} - #member-auth-dialog .auth-input-row{min-width:0} - #member-auth-dialog .auth-input-row input{min-width:0;font-size:14px} - #member-auth-dialog .auth-bind-agreement,#member-auth-dialog .auth-agreement{white-space:normal;overflow-wrap:anywhere} + .app-download-dialog{padding-left:20px;padding-right:20px} + + + .app-download-dialog .app-download-code{box-sizing:border-box;max-width:100%;height:auto;aspect-ratio:1} .app-download-dialog .app-download-code img{max-width:100%;height:auto} .app-download-dialog .app-download-link button{min-width:0;max-width:100%;width:100%} @@ -2171,59 +2093,41 @@ html{scroll-padding-top:calc(var(--global-header-height) + 20px)} -body dialog button.close,body dialog button.auth-close,body dialog button.wallet-dialog-close{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;min-width:32px;padding:0;line-height:0} +body dialog button.close{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;min-width:32px;padding:0;line-height:0} body dialog button .dialog-close-icon{display:block;width:20px;height:20px;flex:0 0 20px;margin:0;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;transform:none;pointer-events:none} - #info-content .wallet-pack-panel{box-sizing:border-box;width:100%;min-width:0;padding:20px 12px;border:1px solid #ffd39933;border-radius:24px;background:linear-gradient(150.751deg,#3228201a 0%,#16100b1a 50.05%,#3228201a 100%)} - #info-content .wallet-pack-heading{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;gap:8px 12px;margin:0 0 18px} - #info-content .wallet-pack-heading strong{font-size:16px;font-weight:500;line-height:22px;color:#ffddc4;white-space:nowrap} - #info-content .wallet-pack-heading>span{display:flex;align-items:center;gap:12px;font-size:12px;line-height:18px;color:#ffddc44d;white-space:nowrap} - #info-content .wallet-pack-heading>span:before{content:'';height:10px;width:1px;background:#ffffff1a} - #info-content .wallet-pack-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px 10px} - #info-content .wallet-mobile-package{position:relative;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;min-width:0;height:152px;padding:20px 4px;border:1px solid #ffd39933;border-radius:18px;overflow:visible;background:#ffffff0d;box-shadow:none;color:#fff;text-align:center} - #info-content .wallet-mobile-package:hover{border-color:#febf8b99;background:#ffffff12} - #info-content .wallet-mobile-package[aria-pressed="true"]{border-color:#febf8b;background:linear-gradient(180deg,#febe8b4d,#febe8b1a);box-shadow:inset 0 0 0 1px #febf8b} - #info-content .wallet-mobile-package:focus-visible{outline:2px solid #febf8b;outline-offset:3px} - #info-content .wallet-figma-coin{display:block;width:24px;height:24px;max-width:none;flex:0 0 24px} - #info-content .wallet-mobile-coins{font-size:14px;font-weight:400;line-height:20px;white-space:nowrap;color:#fff} - #info-content .wallet-mobile-bonus{font-size:12px;line-height:18px;white-space:nowrap;color:#999} - #info-content .wallet-mobile-price{display:flex;align-items:center;justify-content:center;gap:4px;white-space:nowrap} - #info-content .wallet-mobile-price small{font-size:12px;line-height:18px;font-weight:400} - #info-content .wallet-mobile-price strong{font-size:18px;line-height:24px;font-weight:600} - #info-content .wallet-mobile-selected{display:none;position:absolute;left:50%;bottom:-10px;transform:translateX(-50%);width:24px;height:24px;max-width:none} - #info-content .wallet-mobile-package[aria-pressed="true"] .wallet-mobile-selected{display:block} - #info-content .wallet-double-badge{position:absolute;right:-5px;bottom:-6px;width:40px;height:40px;display:grid;place-items:center;pointer-events:none} - #info-content .wallet-double-badge>img{width:37.0911px;height:37.0911px;max-width:none} - #info-content .wallet-double-badge>span{position:absolute;inset:0;display:grid;place-items:center;font-size:10px;font-weight:700;line-height:16px;color:white} - #info-content .wallet-mobile-package:first-child{overflow:visible} - #info-content .wallet-mobile-package .wallet-package-coin{width:24px;height:24px;flex:0 0 24px;border-width:2px;box-sizing:border-box;box-shadow:inset 0 0 0 2px #ffd563} - #info-content .wallet-mobile-package .wallet-double-badge{right:-4px;top:-10px;bottom:auto;width:32px;height:32px;transform:rotate(-8deg)} - #info-content .wallet-mobile-package .wallet-double-badge>img{position:absolute;width:37.0911px;height:37.0911px;transform:scale(.86)} - #info-content .wallet-mobile-package .wallet-double-badge>span{font-size:10px} - #info-content .wallet-mobile-package .wallet-mobile-selected{z-index:2;bottom:-10px} - #info-content .wallet-mobile-package .wallet-mobile-price{position:relative;z-index:1} -@media(min-width:761px){ - #info-content .wallet-pack-panel{padding:26px 24px} - #info-content .wallet-pack-heading{margin-bottom:24px} - #info-content .wallet-pack-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:24px 20px} - #info-content .wallet-mobile-package{height:180px;padding:24px 12px;gap:10px} - #info-content .wallet-mobile-package .wallet-package-coin{width:32px;height:32px;flex-basis:32px} - #info-content .wallet-mobile-coins{font-size:16px;line-height:22px} - #info-content .wallet-mobile-bonus{font-size:14px;line-height:20px} - #info-content .wallet-mobile-price strong{font-size:22px;line-height:28px} - #info-content .wallet-mobile-price small{font-size:14px} - #info-content .wallet-mobile-package .wallet-double-badge{width:46px;height:46px;right:-6px;top:-14px} - #info-content .wallet-mobile-package .wallet-double-badge>img{transform:scale(1.24)} - #info-content .wallet-mobile-package .wallet-double-badge>span{font-size:12px;line-height:18px} -} -@media(max-width:350px){ - #info-content .wallet-pack-panel{padding-left:10px;padding-right:10px} - #info-content .wallet-pack-grid{column-gap:6px} - #info-content .wallet-mobile-coins{font-size:12px} - #info-content .wallet-mobile-bonus{font-size:10px} -} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2414,17 +2318,17 @@ body{padding-top:90px}html{scroll-padding-top:110px} #global-site-header .search button[type=submit]{display:grid;place-items:center;width:20px;height:20px;min-width:20px;padding:0;background:none} .hg-search-icon{display:block;width:16.6666px;height:16.6663px} #global-site-header .header-actions{flex:0 0 auto;gap:24px;min-width:0;margin:0} -#global-site-header .header-actions .coin-entry{padding:0;width:28px;height:28px;background:none!important;border:0;box-shadow:none} -#global-site-header .coin-caption{display:none} -#global-site-header .coin-symbol{display:block;position:relative;overflow:hidden;width:28px;height:28px;flex:0 0 28px;background:none;box-shadow:none;border:0} -#global-site-header .coin-symbol:after,#global-site-header .coin-symbol:before{content:none} -#global-site-header .coin-symbol img{position:absolute;max-width:none;width:100%;height:100%;left:0;top:0;transform:none;filter:none} + + + + + #global-site-header .header-download-wrap{display:none} -#global-site-header .account-entry{padding:0 0 0 24px;position:relative;gap:8px;display:flex;flex-direction:row;align-items:center;width:auto;height:32px;border-radius:0} -#global-site-header .account-entry:before{content:'';position:absolute;left:0;top:10px;width:1px;height:12px;background:#ffffff1a} -#global-site-header .account-avatar,#global-site-header .account-avatar img{width:32px;height:32px;flex-basis:32px;flex-shrink:0;border-radius:50%;background:none;border:0} -#global-site-header .account-copy{display:flex;justify-content:center}.account-copy strong{font-size:16px;font-weight:400} -#global-site-header .account-copy small{display:none} + + + + + .hg-footer{margin-top:70px;padding:24px max(24px,calc((100% - 1520px)/2));min-height:252px;background:#282828;border-top:1px solid #ffffff1a;color:#ffffff8c} .hg-footer-main{display:flex;justify-content:space-between;align-items:flex-end;gap:36px} .hg-footer-brand{display:flex;align-items:center;gap:18px;margin-bottom:18px} @@ -2461,8 +2365,8 @@ body{padding-top:90px}html{scroll-padding-top:110px} #global-site-header>.top{height:68px;min-height:68px;gap:8px;max-width:none} .hg-header-brand,.hg-desktop-nav{display:none}#global-site-header .mobile-menu-trigger{display:grid!important} #global-site-header .top .search{flex:1 1 0;min-width:0;width:0;margin:0;height:40px;padding:0 12px;gap:8px} - #global-site-header .header-actions{gap:10px}#global-site-header .account-entry{padding:0;width:32px;gap:0}#global-site-header .account-entry:before{content:none}#global-site-header .account-copy{display:none} - #global-site-header .header-actions .coin-entry{width:24px;height:24px}#global-site-header .coin-symbol{width:24px;height:24px;flex-basis:24px} + #global-site-header .header-actions{gap:10px} + .hg-footer{padding:24px 20px;margin-top:40px;min-height:0}.hg-footer-main{display:block}.hg-footer-brand{align-items:flex-start;flex-direction:column;gap:12px}.hg-footer-brand span{font-size:14px}.hg-footer-addresses{font-size:12px;line-height:20px} .hg-footer-links{gap:10px;margin-top:22px;font-size:12px}.hg-footer-links a+a{padding-left:10px}.hg-footer-bottom{align-items:flex-start;flex-direction:column;font-size:11px;gap:16px} #mobile-navigation-drawer .mobile-drawer-brand img{width:125px;height:36px}#mobile-navigation-drawer .side-info-wordmark{width:125px;height:36px} @@ -2490,11 +2394,11 @@ body{padding-top:var(--global-header-height)} #global-site-header .header-download-wrap{display:block;order:-1} #global-site-header .header-actions .download-entry{display:flex;align-items:center;justify-content:center;gap:7px;height:40px;padding:0 14px;margin:0;border:1px solid #ffffff1c;border-radius:999px;background:#ffffff09;color:#fff;white-space:nowrap;font-size:14px} #global-site-header .header-actions .download-entry svg{width:18px;height:18px;flex:0 0 18px} -#global-site-header .header-actions .coin-entry{display:flex;flex-direction:row;align-items:center;gap:7px;width:auto;height:40px;padding:0 14px;border:1px solid #ffffff1c;border-radius:999px;background:#ffffff09!important;box-shadow:none;box-sizing:border-box;white-space:nowrap} -#global-site-header .coin-caption{display:flex;align-items:center;height:100%;font-size:0;line-height:1} -#global-site-header .coin-value{display:flex;align-items:center;height:100%;line-height:1} -#global-site-header .header-actions .coin-entry:hover{background:#ffffff14!important;border-color:#ffffff35} -#global-site-header .coin-value{font-size:14px;font-weight:500;color:#f3cf75} + + + + + @media(min-width:761px) and (max-width:1350px){ #global-site-header>.top{height:114px;min-height:114px;flex-wrap:wrap;align-content:center;row-gap:12px} .hg-header-brand{order:0;margin-right:auto}.hg-desktop-nav{order:3;width:100%;justify-content:center;margin:0} @@ -2504,8 +2408,8 @@ body{padding-top:var(--global-header-height)} #global-site-header .header-actions{gap:8px} #global-site-header .header-actions .download-entry{width:30px;height:34px;padding:0;border:0;background:none} #global-site-header .download-entry>span{display:none} - #global-site-header .header-actions .coin-entry{gap:4px;height:34px;padding:0 8px} - #global-site-header .coin-value{font-size:12px} + + #global-site-header .header-download-qr{position:fixed;top:calc(var(--global-header-height) + 8px);right:16px} } @@ -2523,8 +2427,8 @@ body{padding-top:var(--global-header-height)} -#global-site-header .account-entry .account-copy{display:none} -#global-site-header .account-entry{gap:0} + + .home-content #romance-rows{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:26px 22px} @media(min-width:761px) and (max-width:1150px){.home-content #romance-rows{grid-template-columns:repeat(4,minmax(0,1fr));gap:24px 18px}} @media(max-width:760px){.home-content #romance-rows{grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 12px}} @@ -2686,12 +2590,12 @@ body{padding-top:var(--global-header-height)} :root{--action-fill:linear-gradient(90deg,rgba(255,192,0,.6) 0%,#FFC000 100%);--action-stroke:#FFC000} -body .primary,body .bottom-app-download,body .feedback-submit-button,body .auth-submit,body .startup-age-confirm{background:var(--action-fill);border:1px solid var(--action-stroke);color:#fff;box-sizing:border-box;transition:filter .2s,box-shadow .2s,transform .2s} -body .primary:hover,body .bottom-app-download:hover,body .feedback-submit-button:hover,body .auth-submit:hover,body #startup-age .startup-age-confirm:hover{background:var(--action-fill);color:#fff;filter:brightness(1.1);box-shadow:0 4px 16px #FFC0001c} -body .primary:active,body .bottom-app-download:active,body .feedback-submit-button:active,body .auth-submit:active,body #startup-age .startup-age-confirm:active{background:var(--action-fill);filter:brightness(.94);box-shadow:none} +body .primary,body .bottom-app-download,body .startup-age-confirm{background:var(--action-fill);border:1px solid var(--action-stroke);color:#fff;box-sizing:border-box;transition:filter .2s,box-shadow .2s,transform .2s} +body .primary:hover,body .bottom-app-download:hover,body #startup-age .startup-age-confirm:hover{background:var(--action-fill);color:#fff;filter:brightness(1.1);box-shadow:0 4px 16px #FFC0001c} +body .primary:active,body .bottom-app-download:active,body #startup-age .startup-age-confirm:active{background:var(--action-fill);filter:brightness(.94);box-shadow:none} .hg-footer-original .hg-footer-social a{background:linear-gradient(135deg,#ffffff0b,#ffffff03);border:1px solid #ffffff16;box-shadow:inset 0 1px 0 #ffffff08} .hg-footer-original .hg-footer-social a:hover,.hg-footer-original .hg-footer-social a:focus-visible{background:var(--action-fill);border-color:var(--action-stroke);box-shadow:0 4px 14px #FFC00026;transform:translateY(-2px)} -@media(prefers-reduced-motion:reduce){body .primary,body .bottom-app-download,body .feedback-submit-button,body .auth-submit,body .startup-age-confirm{transition:none}} +@media(prefers-reduced-motion:reduce){body .primary,body .bottom-app-download,body .startup-age-confirm{transition:none}} @@ -2724,9 +2628,9 @@ body .primary:active,body .bottom-app-download:active,body .feedback-submit-butt :root{--modal-surface:linear-gradient(45deg,rgba(17,21,24,.9) 0%,rgba(36,43,49,.9) 100%);--modal-outline:rgba(255,255,255,.05);--modal-shadow:0 6px 40px rgba(0,0,0,.5)} body dialog:not(#startup-ad):not(#startup-grid){background:var(--modal-surface)!important;border:1px solid var(--modal-outline)!important;box-shadow:var(--modal-shadow)!important;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);border-radius:20px!important} -body #member-auth-dialog .auth-submit{height:46px;font-size:16px;font-weight:500;border-radius:999px;background:var(--action-fill)!important;border:1px solid var(--action-stroke)!important;color:#fff;box-shadow:inset 0 1px 0 #ffffff16} -body #member-auth-dialog .auth-submit:hover{filter:brightness(1.1);box-shadow:inset 0 1px 0 #ffffff20,0 4px 16px #FFC0001c} -body #member-auth-dialog .auth-submit:active{filter:brightness(.94);box-shadow:inset 0 1px 0 #ffffff16} + + + @media(max-width:600px){body #startup-age{background:transparent!important;border:0!important;box-shadow:none!important}body #startup-age .startup-age-layout{background:var(--modal-surface)!important;border:1px solid var(--modal-outline)!important;box-shadow:var(--modal-shadow)!important}} @@ -2801,31 +2705,16 @@ html body .channel-pagination .pagination-jump button:hover:not(:disabled), html body .channel-pagination .pagination-jump button:focus-visible, html body #channel-page[data-channel="apps"] .channel-tabs button[aria-pressed="true"], html body .return-actions a, -html body .feedback-submit-button, html body #detail .detail-play, html body #detail .series-episodes .episodes button.active, -html body .member-library-tools button[data-library-action="delete"], -html body .member-delete-actions button[value="confirm"], -html body .member-nickname-editor button, -html body .auth-submit, -html body .auth-bind-mode .auth-submit, -html body .member-avatar-controls [data-avatar-action="save"], -html body .wallet-submit, html body .play-screen-overlay button, html body .play-detail-actions .play-download, html body .play-episode-grid a[aria-current="true"], -html body .play-comment-footer button, html body #drama-play-page .series-actions .detail-play, html body #channel-page[data-channel="rank"] .channel-tabs button[aria-pressed="true"]:hover, -html body .member-history-pagination button[aria-current=page], -html body .member-history-pagination .history-page-confirm, -html body .member-history-pagination .history-page-confirm:hover, -html body #play-episode-lock .unlock-pay, html body #drama-play-page .play-detail-actions button[data-engage="like"][aria-pressed="true"], html body #drama-play-page .play-detail-actions button[data-engage="collect"][aria-pressed="true"], -html body #drama-play-page .play-sort button[aria-pressed="true"], html body .search-results-form button, -html body .member-history-pagination>button[aria-current="page"]:hover, html body .startup-age-confirm, html body .hg-desktop-nav a[aria-current=page], html body .hg-footer-social a:hover, @@ -2833,19 +2722,13 @@ html body .ranking-carousel-arrow:hover, html body .ranking-carousel-arrow:focus-visible, html body .primary:hover, html body .bottom-app-download:hover, -html body .feedback-submit-button:hover, -html body .auth-submit:hover, html body #startup-age .startup-age-confirm:hover, html body .primary:active, html body .bottom-app-download:active, -html body .feedback-submit-button:active, -html body .auth-submit:active, html body #startup-age .startup-age-confirm:active, html body .hg-footer-original .hg-footer-social a:hover, html body .hg-footer-original .hg-footer-social a:focus-visible, -html body .hg-desktop-nav a[aria-current=page]:hover, -html body #member-auth-dialog .auth-submit, -html body #feedback-form .feedback-option input:checked+span{color:#191919!important} +html body .hg-desktop-nav a[aria-current=page]:hover{color:#191919!important} @@ -2994,7 +2877,7 @@ html body #drama-play-page .play-detail-actions button[data-engage="collect"][ar -html body #info-content #member-nickname-input:focus,html body #info-content #member-nickname-input:focus-visible{outline:none;outline-offset:0;box-shadow:none;border:1px solid var(--accent)} + /* Live API content states and shared controls. */ .api-error{color:#f47b75;font-size:13px;line-height:1.8} @@ -3023,9 +2906,9 @@ html body #info-content #member-nickname-input:focus,html body #info-content #me .home-content .home-block .drama-data-card>.cover>.poster-source{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center} .home-content .hero-content .primary{display:inline-flex;align-items:center;gap:10px} .info-layout:has(.info-nav[hidden]){grid-template-columns:minmax(0,1fr)} -#profile-popover>a{display:block;padding:12px 18px;font-size:14px;color:var(--text)} -#profile-popover>a:hover{background:#ffffff09;color:var(--accent)} -#profile-popover .profile-popover-head>img{border-radius:50%;object-fit:cover} + + + .channel-tabs>a{display:inline-block;padding:10px 18px;border-radius:8px;color:var(--muted);font-size:14px} .channel-tabs>a[aria-current=page]{color:var(--accent);background:#FFC00014} .channel-pagination .pagination-pages{flex-wrap:wrap;justify-content:center} @@ -3043,19 +2926,18 @@ html body #channel-page[data-channel="rank"] .rank-tabs>a[aria-current="page"]{b #channel-page[data-channel="rank"] .rank-tabs>a:active{filter:brightness(.94)} @media(max-width:760px){#channel-page[data-channel="rank"] .rank-tabs>a{padding:9px 14px}} @media(prefers-reduced-motion:reduce){#channel-page[data-channel="rank"] .rank-tabs>a{transition:none}} -.member-settings input,.member-settings textarea,.feedback-form input,.feedback-form textarea,.feedback-form select{display:block;width:100%;background:#222;color:var(--text);border:1px solid #ffffff20;border-radius:8px;padding:12px;margin-top:8px;font:inherit} -.member-settings textarea,.feedback-form textarea{min-height:120px;resize:vertical} -.feedback-form{display:grid;gap:24px} + + .api-transaction{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:18px 0;border-bottom:1px solid var(--line);font-size:14px} .api-transaction time{color:var(--muted);font-size:12px} -.play-comment{display:flex;gap:14px;padding:20px 0;border-bottom:1px solid var(--line);min-width:0} -.play-comment>div{flex:1;min-width:0}.play-comment>img{width:40px;height:40px;object-fit:cover;border-radius:50%} -.play-comment p{white-space:pre-wrap;overflow-wrap:anywhere;color:#ccc;font-size:14px}.play-comment time{font-size:12px;color:var(--muted)} -.play-comment-actions{display:flex;gap:20px;margin-top:10px;font-size:12px;color:#999} -.play-comment-actions button[aria-pressed=true]{color:var(--accent)} -.wallet-methods label{display:block;padding:14px;border:1px solid var(--line);border-radius:10px} -.wallet-topbar{display:flex;align-items:center;justify-content:space-between;gap:20px} -@media(max-width:760px){.api-transaction{flex-wrap:wrap;gap:8px}.home-content .cards{grid-template-columns:repeat(2,minmax(0,1fr))}.play-comment .play-comment{gap:8px}.play-comment .play-comment>img{width:28px;height:28px}.wallet-topbar{align-items:flex-start;flex-direction:column}} + + + + + + + +@media(max-width:760px){.api-transaction{flex-wrap:wrap;gap:8px}.home-content .cards{grid-template-columns:repeat(2,minmax(0,1fr))}} /* Detail markup follows the original HTML, with live API content. */ #drama-play-page .play-detail-layout--single{grid-template-columns:minmax(0,1fr)} @@ -3064,43 +2946,42 @@ html body #channel-page[data-channel="rank"] .rank-tabs>a[aria-current="page"]{b #drama-play-page .series-actions:has(>[hidden]){grid-template-columns:minmax(0,1fr)} #drama-play-page .series-unavailable{color:#999;font-size:14px} #drama-play-page .play-banner-ad>span{display:none} -#drama-play-page .play-compose-body:has(#comment-error:empty) #comment-error{display:none} + #drama-play-page .play-episode-grid>.ui-empty-state{grid-column:1/-1} #drama-play-page .play-episode-pages:empty{display:none} /* Keep the original section spacing even when the API supplies no banner ads. */ #drama-play-page .play-banner-ads{margin:26px 0} #drama-play-page .play-episodes-section+.play-official{margin-top:26px} -#drama-play-page .play-official+.play-comments{margin-top:28px} + @media(max-width:760px){ #drama-play-page .play-banner-ads{margin:22px 0} #drama-play-page .play-episodes-section+.play-official{margin-top:22px} } /* Dynamic page markup uses the same frames and controls as the HTML reference. */ -.channel-shell .drama-data-card>.cover,#search-results-page .drama-data-card>.cover,.play-related .drama-data-card>.cover{width:100%;aspect-ratio:var(--portrait);background:#191b19} -.channel-shell .drama-data-card>.cover>.poster-source,#search-results-page .drama-data-card>.cover>.poster-source,.play-related .drama-data-card>.cover>.poster-source{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center} +.channel-shell .drama-data-card>.cover,#search-results-page .drama-data-card>.cover{width:100%;aspect-ratio:var(--portrait);background:#191b19} +.channel-shell .drama-data-card>.cover>.poster-source,#search-results-page .drama-data-card>.cover>.poster-source{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center} .channel-ranking-cards .ranking-poster-frame{position:absolute;inset:0;width:100%;height:100%;border-radius:inherit} .channel-ranking-cards .ranking-poster-frame>.poster-source{display:block;width:100%;height:100%;object-fit:cover;object-position:center} -.member-library-tabs>a{position:relative;flex-shrink:0;padding:16px 0 20px;color:#929299;font-size:16px;font-weight:500;white-space:nowrap} -.member-library-tabs>a[aria-current="page"]{color:var(--accent)} -.member-library-tabs>a[aria-current="page"]::after{content:'';position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:26px;height:3px;border-radius:3px;background:var(--accent)} -.member-library-tabs>a:hover{color:var(--accent)} -#info-content .member-library-title{display:inline;margin:0;font:inherit;color:inherit} -#info-content .member-library-item .cover>.poster-source{position:absolute;inset:0} -.member-settings input[hidden]{display:none!important} -#info-content .member-settings-card .member-avatar-controls p{margin:8px 0 0;font-size:12px;color:#888;line-height:1.7} -.member-settings-card .member-nickname-editor input{margin:0} -.member-settings-card .member-introduction-label{margin-top:24px} -.member-settings-card .member-security-password{border-top:1px solid #ffffff12;border-bottom:1px solid #ffffff12} -.member-security-password>summary{list-style:none;cursor:pointer}.member-security-password>summary::-webkit-details-marker{display:none} -.member-security-password[open]>summary>span:last-child{transform:rotate(90deg)} -.member-security-password form{padding:0 0 20px}.member-security-password .primary{border-radius:999px;font-size:14px;padding:12px 24px} -#member-auth-dialog:not(.auth-bind-mode) .auth-password-row input{padding-right:52px} -#member-auth-dialog .auth-password-toggle svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.6} -#member-auth-dialog .auth-footer button{padding:0;background:none;color:#bbb;font-size:12px} -#member-auth-dialog .auth-footer button:hover{color:var(--accent)} -#feedback-form .feedback-status{display:block;min-height:24px;margin-top:12px;color:var(--accent);font-size:14px;line-height:1.7} + + + + + + + + + + + + + + + + + + #info-page[data-info="help-center"] #info-content h2:not(:first-child){margin-top:30px} html body .hg-footer-original .hg-footer-original-title .footer-brand-text{display:block;margin:0;color:#f3f0e9;font-family:var(--font-ui);font-size:24px;font-weight:600;line-height:32px;letter-spacing:0} @media(min-width:1151px){html body #global-site-header .hg-desktop-nav{gap:24px}} @@ -3126,7 +3007,7 @@ html body .hg-footer-original .hg-footer-original-title .footer-brand-text{displ #mobile-navigation-drawer .site-nav-group>summary{padding:12px 14px;color:#a8a8ae} #mobile-navigation-drawer .site-nav-children{padding-left:12px} @media(max-width:760px){.mobile-pages{grid-template-columns:none;grid-auto-flow:column;grid-auto-columns:minmax(64px,1fr);overflow-x:auto}.mobile-pages>a{flex-shrink:0}} -@media(max-width:760px){.member-library-tabs{gap:26px}.member-library-tabs>a{font-size:14px;padding:14px 0 18px}} + /* Search uses the HTML empty state and section/card spacing with real API results. */ #search-results-page .search-empty>img{width:210px;height:210px;object-fit:contain;margin:0 0 8px;opacity:1} @@ -3155,6 +3036,109 @@ html body .hg-footer-original .hg-footer-original-title .footer-brand-text{displ #drama-play-page button[data-request-pending]{cursor:wait;opacity:.75} #drama-play-page button[data-request-pending]::before{content:'';display:inline-block;flex:0 0 14px;width:14px;height:14px;box-sizing:border-box;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:request-pending-spin .7s linear infinite;vertical-align:middle} #drama-play-page button[data-request-pending]>.play-action-icon{display:none} -#drama-play-page .play-comment-meta button[data-request-pending],#drama-play-page .play-comment-footer button[data-request-pending]{display:inline-flex;align-items:center;gap:7px} + @keyframes request-pending-spin{to{transform:rotate(360deg)}} @media(prefers-reduced-motion:reduce){#drama-play-page button[data-request-pending]::before{animation:none}} + +/* ---- 黄果吃瓜 components: poster card, recommendation row, home banner, detail and watch pages ---- */ +.hg-card{position:relative;min-width:0} +.hg-card-link{display:flex;flex-direction:column;gap:10px;color:inherit;text-decoration:none} +.hg-card-cover{position:relative;display:block;aspect-ratio:3/4;border-radius:14px;overflow:hidden;background:#232425;box-shadow:inset 0 0 0 1px #ffffff10} +.hg-card-cover img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .35s ease} +.hg-card-link:hover .hg-card-cover img{transform:scale(1.04)} +.hg-card-cover:after{content:'';position:absolute;inset:auto 0 0;height:42%;background:linear-gradient(transparent,#000000c4);pointer-events:none} +.hg-card-eps{position:absolute;right:8px;bottom:8px;z-index:1;padding:2px 8px;border-radius:999px;background:#00000099;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fff;font-size:12px;line-height:1.6} +.hg-card-badge{position:absolute;left:0;top:10px;z-index:1;padding:3px 9px 3px 8px;border-radius:0 999px 999px 0;background:var(--accent);color:#1b1400;font-size:11px;font-weight:700} +.hg-card-badge--hot{background:#ff5a4e;color:#fff} +.hg-card-rank{position:absolute;left:8px;bottom:2px;z-index:1;color:#fff;font:italic 900 40px/1 Georgia,"Times New Roman",serif;text-shadow:0 2px 10px #000a} +.hg-card--ranked:nth-child(-n+3) .hg-card-rank{color:var(--accent)} +.hg-card-body{display:flex;flex-direction:column;gap:6px;min-width:0} +.hg-card-title{display:-webkit-box;margin:0;overflow:hidden;font-size:15px;font-weight:600;line-height:1.4;-webkit-line-clamp:2;-webkit-box-orient:vertical} +.hg-card-link:hover .hg-card-title{color:var(--accent)} +.hg-card-title .search-keyword{color:var(--accent);background:transparent;padding:0;font:inherit} +.hg-card-tags{display:flex;flex-wrap:wrap;gap:6px} +.hg-card-tags span{padding:1px 7px;border:1px solid #ffc00055;border-radius:4px;color:#ffd666;font-size:11px;line-height:1.6} +.hg-card-desc{display:-webkit-box;overflow:hidden;color:var(--muted);font-size:12px;line-height:1.6;-webkit-line-clamp:2;-webkit-box-orient:vertical} +.hg-card-heat{display:inline-flex;align-items:center;gap:4px;color:#ff8a7a;font-size:12px} +.hg-card-heat svg{width:13px;height:13px;fill:currentColor;stroke:none} + +.hg-recommend{margin-top:28px} +.hg-recommend-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px} +.hg-vitem{display:flex;gap:14px;min-width:0;padding:12px;border:1px solid #ffffff0d;border-radius:14px;background:#1b1c1d;transition:border-color .2s} +.hg-vitem:hover{border-color:#ffc00045} +.hg-vitem-thumb{position:relative;flex:0 0 96px;aspect-ratio:3/4;overflow:hidden;border-radius:10px;background:#232425} +.hg-vitem-thumb img{display:block;width:100%;height:100%;object-fit:cover} +.hg-vitem-thumb span{position:absolute;inset:auto 0 0;padding:3px 0;background:linear-gradient(transparent,#000000bb);color:#fff;font-size:11px;text-align:center} +.hg-vitem-body{display:flex;flex-direction:column;gap:6px;min-width:0} +.hg-vitem-title{margin:0;font-size:15px;font-weight:600;line-height:1.4} +.hg-vitem-title a{color:inherit;text-decoration:none} +.hg-vitem-title a:hover{color:var(--accent)} +.hg-vitem-meta{display:flex;flex-wrap:wrap;gap:4px 10px;margin:0;color:#c9b98a;font-size:12px} +.hg-vitem-desc{display:-webkit-box;margin:0;overflow:hidden;color:var(--muted);font-size:13px;line-height:1.6;-webkit-line-clamp:3;-webkit-box-orient:vertical} +@media(min-width:1400px){.hg-recommend-list{grid-template-columns:repeat(3,minmax(0,1fr))}} +@media(max-width:760px){.hg-recommend-list{grid-template-columns:1fr}.hg-vitem-thumb{flex-basis:84px}} + +.home-content .hero:is(#hero,.hero-outgoing){display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;height:auto;min-height:0;overflow:visible;border-radius:0;background:none;cursor:auto} +.home-content .hero:is(#hero,.hero-outgoing)::before,.home-content .hero:is(#hero,.hero-outgoing)::after{display:none} +.home-content .hero>.hero-outgoing{background:var(--bg)} +.hg-hero-stage{position:relative;min-height:440px;overflow:hidden;border-radius:20px;background:#1d1e1e;isolation:isolate} +.home-content .hg-hero-stage .hero-art{position:absolute;inset:0;z-index:-2;width:100%;max-width:none;height:100%;object-fit:cover;opacity:1} +.hg-hero-stage::after{content:'';position:absolute;inset:0;z-index:-1;background:linear-gradient(0deg,#0b0c0ce8 0%,#0b0c0c80 40%,transparent 72%),linear-gradient(90deg,#0b0c0cb0,transparent 58%);pointer-events:none} +.hg-hero-copy{position:absolute;inset:auto 0 0;display:flex;flex-direction:column;gap:12px;max-width:660px;padding:32px 36px} +.hg-hero-label{align-self:flex-start;padding:4px 10px;border-radius:6px;background:var(--accent);color:#1b1400;font-size:12px;font-weight:700;letter-spacing:2px} +.hg-hero-title{margin:0;font-size:clamp(28px,3.2vw,46px);font-weight:800;line-height:1.2} +.hg-hero-title a{color:#fff;text-decoration:none} +.hg-hero-meta{display:flex;flex-wrap:wrap;gap:8px;margin:0} +.hg-hero-meta span{padding:3px 10px;border-radius:999px;background:#ffffff1f;color:#eee;font-size:12px} +.hg-hero-desc{display:-webkit-box;margin:0;overflow:hidden;color:#d4d4d4;font-size:14px;line-height:1.8;-webkit-line-clamp:2;-webkit-box-orient:vertical} +.hg-hero-actions .primary{display:inline-flex;align-items:center;gap:8px;padding:11px 22px;border-radius:999px} +.hg-hero-actions svg{fill:currentColor;stroke:none} +.hg-hero-list{display:flex;flex-direction:column;gap:6px;margin:0;padding:10px;overflow:auto;list-style:none;border:1px solid #ffffff0d;border-radius:20px;background:#1b1c1d} +.hg-hero-list a{display:grid;grid-template-columns:24px 44px minmax(0,1fr);align-items:center;gap:10px;padding:8px;border-radius:12px;color:inherit;text-decoration:none} +.hg-hero-list a:hover{background:#ffffff0a} +.hg-hero-list a[aria-current="true"]{background:#ffc0001a;box-shadow:inset 3px 0 0 var(--accent)} +.hg-hero-num{color:#777;font:italic 800 16px/1 Georgia,"Times New Roman",serif} +.hg-hero-list a[aria-current="true"] .hg-hero-num{color:var(--accent)} +.hg-hero-list img{width:44px;height:58px;border-radius:8px;object-fit:cover} +.hg-hero-item{display:flex;flex-direction:column;gap:3px;min-width:0} +.hg-hero-item strong{overflow:hidden;font-size:14px;font-weight:600;white-space:nowrap;text-overflow:ellipsis} +.hg-hero-item small{color:var(--muted);font-size:12px} +@media(max-width:1180px){.home-content .hero:is(#hero,.hero-outgoing){grid-template-columns:1fr}.hg-hero-list{flex-direction:row;padding:8px}.hg-hero-list li{flex:0 0 220px}} +@media(max-width:760px){.hg-hero-stage{min-height:360px;border-radius:16px}.hg-hero-copy{gap:10px;padding:20px}.hg-hero-list li{flex-basis:180px}} + +.hg-detail{display:grid;grid-template-columns:240px minmax(0,1fr);gap:28px;padding:24px;border:1px solid #ffffff0d;border-radius:20px;background:linear-gradient(135deg,#1f2021,#171818)} +.hg-detail-poster{position:relative;aspect-ratio:3/4;overflow:hidden;border-radius:14px;background:#232425} +.hg-detail-poster .series-poster{display:block;width:100%;max-width:none;height:100%;object-fit:cover} +.hg-detail-badge{position:absolute;left:10px;top:10px;padding:3px 10px;border-radius:6px;background:var(--accent);color:#1b1400;font-size:12px;font-weight:700} +.hg-detail-badge--hot{background:#ff5a4e;color:#fff} +.hg-detail-head{display:flex;flex-direction:column;gap:14px;min-width:0} +.hg-detail-head h1,.hg-watch-info h1{margin:0;font-size:clamp(24px,2.6vw,34px);line-height:1.25} +.hg-detail-lead{margin:0;color:#c9b98a;font-size:14px} +.hg-facts{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px;margin:0} +.hg-facts>div{padding:10px 12px;border-radius:12px;background:#ffffff08} +.hg-facts>div:has(.hg-facts-links){grid-column:1/-1} +.hg-facts dt{margin:0 0 4px;color:var(--muted);font-size:12px} +.hg-facts dd{margin:0;font-size:15px;font-weight:600} +.hg-facts-links{display:flex;flex-wrap:wrap;gap:6px 12px} +.hg-facts-links :is(a,span){color:#ffd666;font-size:13px;font-weight:500;text-decoration:none} +.hg-facts-links a:hover{text-decoration:underline} +.hg-detail-actions{display:flex;flex-wrap:wrap;align-items:center;gap:12px} +.hg-detail-actions .play-detail-actions{margin:0} +.hg-synopsis{margin-top:20px;padding:20px 24px;border:1px solid #ffffff0d;border-radius:16px;background:#1b1c1d} +.hg-synopsis h2,.hg-recommend h2{margin:0 0 10px;font-size:18px} +.hg-synopsis .series-description{color:#cfcfcf;font-size:14px;line-height:1.9} +.hg-watch-info{display:flex;flex-direction:column;gap:14px;margin-top:18px} +.hg-recommend .play-section-heading span{color:var(--muted);font-size:13px} +@media(max-width:760px){.hg-detail{grid-template-columns:110px minmax(0,1fr);gap:14px;padding:14px;border-radius:16px}.hg-facts{grid-template-columns:repeat(2,minmax(0,1fr))}.hg-synopsis{padding:16px}} +.home-content .hero:is(#hero,.hero-outgoing):has(.hg-hero-list>li:only-child){grid-template-columns:1fr} +.home-content .hero:has(.hg-hero-list>li:only-child) .hg-hero-list{display:none} +.hg-hero-title{font-size:clamp(24px,2.6vw,38px);text-shadow:0 2px 14px #000c} +.hg-detail-actions .series-download:not([hidden]){display:inline-flex;align-items:center;gap:6px;height:44px;padding:0 18px;border:1px solid #ffffff1a;border-radius:999px;background:#ffffff08;color:#eee;font-size:14px;text-decoration:none} +.hg-detail-actions .series-download svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8} +.hg-detail-actions .detail-play{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 22px;border-radius:999px} +.hg-detail-actions .detail-play svg{width:16px;height:16px;fill:currentColor;stroke:none} +@media(min-width:761px){.hg-facts{grid-template-columns:repeat(4,minmax(0,1fr))}.hg-watch .play-screen{max-height:min(68vh,620px);width:auto;max-width:100%;margin-inline:auto}} +.home-content .hero .hg-hero-copy .hg-hero-title{margin:0;font-size:clamp(24px,2.6vw,38px);letter-spacing:0;line-height:1.25} +.hg-detail-actions .play-detail-actions{display:flex;flex-direction:row;flex-wrap:wrap;gap:8px} +@media(max-width:760px){.hg-detail-actions .play-detail-actions{width:100%}.hg-detail-actions .play-detail-actions>button{flex:1 1 0;min-width:0}.hg-detail-actions .detail-play,.hg-detail-actions .series-download:not([hidden]){flex:1 1 auto;justify-content:center}} +@media(max-width:760px){#drama-play-page .hg-detail-actions .play-detail-actions{flex-wrap:nowrap}#drama-play-page .hg-detail-actions .play-detail-actions>button{flex:1 1 0;width:auto;min-width:0;max-width:none;padding:9px 6px;justify-content:center}} diff --git a/src/app/icon.png b/src/app/icon.png new file mode 100644 index 0000000..b5b9905 Binary files /dev/null and b/src/app/icon.png differ diff --git a/src/app/icon.svg b/src/app/icon.svg deleted file mode 100644 index a6db8b2..0000000 --- a/src/app/icon.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 07e8461..1138169 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,8 +2,8 @@ import type { Metadata, Viewport } from "next"; import "./globals.css"; export const metadata: Metadata = { - title: "91短剧 · 百万大神原创短剧", - applicationName: "91短剧", + title: "黄果吃瓜 · 百万大神原创短剧", + applicationName: "黄果吃瓜", icons: {icon:[{url:'/favicon.png',sizes:'48x48',type:'image/png'}],apple:[{url:'/apple-touch-icon.png',sizes:'180x180',type:'image/png'}]}, }; diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index fd6cd4f..0579463 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -1,6 +1,6 @@ import type { Metadata } from 'next'; -export const metadata:Metadata={title:'页面不存在 - 91短剧',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 ( diff --git a/src/components/site/AppDownloadDialog.tsx b/src/components/site/AppDownloadDialog.tsx index e16e773..5f6384b 100644 --- a/src/components/site/AppDownloadDialog.tsx +++ b/src/components/site/AppDownloadDialog.tsx @@ -20,16 +20,16 @@ export function AppDownloadDialog({download, qr, status, dialogRef, onClose, onC

      -{"下载91短剧 App"} +{"下载黄果吃瓜 App"}

      {"扫码下载,随时继续追剧"}

      -{"91短剧 +{"黄果吃瓜

      -{download === undefined ? "" : download ? "扫码下载安装 91短剧 App" : "暂未配置 App 下载地址"} +{download === undefined ? "" : download ? "扫码下载安装 黄果吃瓜 App" : "暂未配置 App 下载地址"}

      diff --git a/src/components/site/ChannelPages.tsx b/src/components/site/ChannelPages.tsx index f127960..5a9e4bd 100644 --- a/src/components/site/ChannelPages.tsx +++ b/src/components/site/ChannelPages.tsx @@ -63,9 +63,6 @@ export function ChannelPages({info,view}: {info?:InfoPageDefinition;view?:PageVi {"DMCA"} - -{"意见反馈"} -
      diff --git a/src/components/site/Footer.tsx b/src/components/site/Footer.tsx index 67dec81..644e538 100644 --- a/src/components/site/Footer.tsx +++ b/src/components/site/Footer.tsx @@ -1,10 +1,11 @@ +import { OFFICIAL_TG_HANDLE, OFFICIAL_TG_URL } from "@/lib/site"; export function Footer({content}:{content?:string}={}) { return ( <>