commit e3bf77296c9af17d588dafdafca001d71dd8b594 Author: Stardream Date: Tue Jun 16 19:26:32 2026 +1000 Initial release diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..553d57e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.gitignore +node_modules +dist +data +*.log +*.tmp +.DS_Store diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/docker-publish.yml new file mode 100644 index 0000000..7816d0d --- /dev/null +++ b/.gitea/workflows/docker-publish.yml @@ -0,0 +1,37 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Log in to Gitea Container Registry + run: | + echo "${{ secrets.CR_TOKEN }}" | \ + docker login 127.0.0.1:3333 -u ${{ github.actor }} --password-stdin + + - name: Build and push + run: | + IMAGE=127.0.0.1:3333/stardream/bangumi-vault + PUBLIC=git.stdm.moe/stardream/bangumi-vault + REF="${{ github.ref }}" + + if [[ "$REF" == refs/tags/* ]]; then + VERSION="${REF#refs/tags/}" + docker build -t "${IMAGE}:${VERSION}" -t "${IMAGE}:latest" . + docker push "${IMAGE}:${VERSION}" + docker push "${IMAGE}:latest" + else + docker build -t "${IMAGE}:latest" . + docker push "${IMAGE}:latest" + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39077f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +dist/ +data/ +*.log +*.tmp +.DS_Store +AGENTS.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d651307 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:24-slim + +WORKDIR /app + +ENV NODE_ENV=production +ENV PORT=3000 +ENV BANGUMI_VAULT_FILES_DIR=/data/files + +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev + +COPY server ./server +COPY app ./app + +RUN mkdir -p /data/files + +EXPOSE 3000 + +CMD ["npm", "start"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8ce145a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 AKISATO + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5c84d98 --- /dev/null +++ b/README.md @@ -0,0 +1,294 @@ +
+ +# Bangumi Vault + +**用于备份、浏览、导出和保存 Bangumi 收藏的私有 Docker 网页应用** + +[![][license-shield]][license-link] +[![][node-shield]][node-link] +[![][docker-shield]][docker-link] +[![][postgres-shield]][postgres-link] + +
+ +--- + +- [✨ 功能特性](#-功能特性) +- [🚀 快速开始](#-快速开始) +- [⚙️ 配置](#️-配置) +- [🐳 服务](#-服务) +- [📁 项目结构](#-项目结构) +- [🧪 本地开发](#-本地开发) +- [🔤 自托管字体](#-自托管字体) +- [🔐 安全说明](#-安全说明) +- [📄 作者与许可](#-作者与许可) + +## ✨ 功能特性 + +- **私有网页界面** - 自托管 Bangumi 收藏保管库,内置管理员登录;可选「公共模式」对外只读分享。 +- **Bangumi 同步** - 沿用 Bangumi API 流程,支持最近增量同步与完整同步;可在容器内按 cron 定时自动同步。 +- **安全箱** - 完整同步时若远端疑似「吞」掉本地已有条目,不直接删除,而是放入安全箱由你人工裁决。 +- **收藏浏览与筛选** - 按收藏状态、类型、标签(我的 / 公共)、标题、吐槽、有无吐槽、NSFW 等筛选;一键清除筛选。 +- **条目详情** - 封面 banner、评分、进度、章节格、历史版本、条目资料(游戏引擎/开发商等 infobox)。 +- **封面缓存** - 在服务端缓存封面,通过鉴权后的图片路由访问。 +- **外观自定义** - 主题明暗 / 跟随系统、强调配色、字体风格、卡片尺寸、动效强度、预览行数、白边粗细等;访客也可本地保存自己的外观偏好。 +- **多格式导出** - JSON、CSV、离线 HTML、Word、Excel 和完整 ZIP 备份包,全部由浏览器直接下载。 +- **PostgreSQL 持久化** - 应用状态、收藏、同步记录、历史、设置与密码哈希存储在独立 PostgreSQL 容器中。 +- **自托管网页字体** - 不依赖用户本机字体;中文/日文字体按 `unicode-range` 分块按需加载。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 🚀 快速开始 + +**1. 启动服务** + +```bash +docker compose up -d +``` + +默认从镜像仓库拉取 `git.stdm.moe/stardream/bangumi-vault:latest`;若要从源码构建,编辑 `docker-compose.yml`(注释掉 `image:`、取消注释 `build: .`),再 `docker compose up -d --build`。 + +**2. 查看初始管理员密码** + +```bash +docker logs bangumi-vault +``` + +找到: + +```text +Bangumi Vault initial admin password: +... +``` + +这个密码只会在新的数据库 volume 首次启动时打印一次。 + +**3. 打开网页** + +```text +http://localhost:8080 +``` + +使用 Docker 日志中的密码登录,然后在 **设置** 中修改管理员密码。 + +**4. 更新版本** + +```bash +docker compose pull +docker compose up -d +``` + +> [!TIP] +> **忘记管理员密码?** 密码以哈希存储、无法找回,但可以重置:删除数据库里的密码记录后重启 Web 容器,它会像首次启动一样重新生成并在日志里打印一个新的初始密码。 +> +> ```bash +> docker exec -it bangumi-vault-db psql -U bangumi_vault -d bangumi_vault -c "DELETE FROM settings WHERE key='admin_password_hash';" +> docker restart bangumi-vault && docker logs bangumi-vault +> ``` +> +> 登录后到 **设置** 里改成你自己的密码。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +## ⚙️ 配置 + +默认 `docker-compose.yml` 不需要 `.env` 文件即可运行。 + +| 变量 | 默认值 | 必填 | 说明 | +|---|---:|:---:|---| +| `PORT` | `3000` | 否 | 容器内 Web 服务端口 | +| `DATABASE_URL` | compose 内置值 | **是** | PostgreSQL 连接字符串 | +| `BANGUMI_VAULT_FILES_DIR` | `/data/files` | 否 | 封面缓存和日志文件目录 | + +> [!WARNING] +> compose 文件中的 PostgreSQL 账号密码适合私有本地部署。若要暴露到可信内网之外,请修改 `POSTGRES_PASSWORD` 和 `DATABASE_URL`。 +> +> 空数据库首次启动时,应用会生成初始管理员密码并只在 Docker 日志中打印一次。登录后请立即修改。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 🐳 服务 + +compose 默认启动两个容器: + +| 容器 | 镜像 | 用途 | +|---|---|---| +| `bangumi-vault` | 由本仓库构建 | Node.js Web 服务、静态 UI、认证 API、封面缓存处理、定时同步 | +| `bangumi-vault-db` | `postgres:16-alpine` | 持久化 PostgreSQL 数据库 | + +持久化数据使用本地路径挂载: + +| 路径 | 用途 | +|---|---| +| `./data/postgres` | PostgreSQL 数据 | +| `./data/files` | Web 容器使用的缓存封面和日志 | + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 📁 项目结构 + +```text +AKI-Bangumi-Vault/ +├── app/ # 前端:原生 ES 模块,无构建步骤 +│ ├── BangumiVault.html # 单页 UI 入口 +│ ├── css/ +│ │ ├── styles.css # 全部样式 +│ │ └── fonts.css # 自托管字体 @font-face(由脚本生成) +│ ├── fonts/ # 自托管 woff2 字体(按 unicode-range 分块) +│ └── js/ # 按职责拆分的模块 +│ ├── core.js # 状态、设置、外观、IndexedDB、API、infobox 预取 +│ ├── model.js # 数据归一化、筛选、排序、封面取址 +│ ├── view.js # 卡片/侧栏/详情/统计渲染 +│ ├── cron.js # 定时同步可视化编辑器 +│ ├── sync.js # 设置读写、同步触发与进度 +│ ├── covers.js # 封面缓存 +│ ├── exports.js # JSON/CSV/HTML/Word/Excel/ZIP 导出 +│ └── main.js # 事件绑定与启动 +├── server/ # Node 24 HTTP 服务(CommonJS,唯一依赖 pg) +│ ├── index.js # 入口:建库、初始管理员密码、启动服务、容器内定时同步 +│ ├── routes.js # 请求处理:静态资源(/js /css /fonts)+ 全部 API +│ ├── store.js # PostgreSQL 存储、表结构与迁移(含历史独立表) +│ ├── auth.js # 会话鉴权、密码哈希 +│ ├── http.js # HTTP 辅助、MIME、gzip、缓存 +│ ├── bgm.js # Bangumi API 客户端 +│ ├── sync.js # 同步流程(最近/完整、安全箱判定) +│ ├── normalize.js # 条目数据归一化 +│ ├── covers.js # 封面下载与缓存 +│ └── constants.js # 常量 +├── tools/ +│ └── fetch-fonts.mjs # 从 jsDelivr 抓取字体并生成 app/fonts + css/fonts.css +├── .gitea/workflows/ +│ └── docker-publish.yml # Gitea Actions:构建并推送 Docker 镜像 +├── docker-compose.yml # Web + PostgreSQL 服务定义 +├── Dockerfile # Web 容器镜像 +├── package.json # Node 脚本与依赖 +├── package-lock.json # npm 锁定文件 +├── README.md # 本文档(简体中文) +└── LICENSE # MIT License +``` + +本项目为纯 Web 版本(由上游 Electron 单文件版本派生):Electron 桌面运行时、启动脚本、旧构建资源等均已移除。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 🧪 本地开发 + +**前置条件** + +- Node.js 24 或更高版本 +- PostgreSQL 16 或兼容版本 + +安装依赖: + +```bash +npm install +``` + +设置 PostgreSQL 连接字符串: + +```bash +set DATABASE_URL=postgres://bangumi_vault:bangumi_vault@localhost:5432/bangumi_vault +``` + +运行检查并启动: + +```bash +npm run check +npm start +``` + +打开: + +```text +http://localhost:3000 +``` + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 🔤 自托管字体 + +5 种字体风格(系统默认 Inter、圆润 Nunito / M PLUS Rounded、日系 Noto Sans JP、文楷 LXGW WenKai Screen、等宽 JetBrains Mono)全部自托管,不依赖用户本机已装字体。`@font-face` 定义在 `app/css/fonts.css`,woff2 文件位于 `app/fonts/<字体>/`,由服务端 `/fonts/*` 公共路由提供;CJK 按 `unicode-range` 分块、浏览器只下载用到的字块。 + +重新抓取 / 更新字体(从 jsDelivr 下载并重新生成 `fonts.css`): + +```bash +node tools/fetch-fonts.mjs +``` + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 🔐 安全说明 + +- 管理员密码以 PBKDF2-SHA256 哈希形式存储在 PostgreSQL 中。 +- 只有数据库中不存在管理员密码哈希时,才会打印初始管理员密码;这是初始化行为,不会以明文形式持久化保存。 +- 会话 Cookie 使用 HTTP-only,由服务端自动生成并持久化在数据库中的随机密钥签名。 +- 公共模式下,访客只读浏览,管理操作(同步/导出/导入/缓存/设置保存等)在前端与服务端双重隔离。 +- Bangumi Access Token 由用户填写,仅用于访问 Bangumi API;界面中不回显、不可复制。 +- 不要公开 Docker 日志、截图、备份、导出文件或数据库转储,因为其中可能包含 token 或私有收藏数据。 +- 报告安全问题时,请不要包含真实 token 或真实备份数据。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +## 📄 作者与许可 + +本项目派生自原项目并在其基础上二次开发: + +- 原仓库:[AKISATO57/AKI-Bangumi-Vault](https://github.com/AKISATO57/AKI-Bangumi-Vault) +- 原作者:**AKISATO** ([@AKISATO57](https://github.com/AKISATO57)) + +本项目是用于个人 Bangumi 收藏备份的独立第三方工具,与 Bangumi 官方无从属、背书或正式关联关系。 + +Copyright (c) 2026 AKISATO. + +本项目基于 [MIT License](./LICENSE) 发布。贡献内容默认以相同许可发布。 + +
+ +[![][back-to-top]](#readme-top) + +
+ +--- + + +[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-black?style=flat-square +[license-shield]: https://img.shields.io/badge/license-MIT-white?labelColor=black&style=flat-square +[license-link]: ./LICENSE +[node-shield]: https://img.shields.io/badge/node.js-24-339933?labelColor=black&logo=node.js&logoColor=white&style=flat-square +[node-link]: https://nodejs.org/ +[docker-shield]: https://img.shields.io/badge/docker-compose-2496ED?labelColor=black&logo=docker&logoColor=white&style=flat-square +[docker-link]: https://docs.docker.com/compose/ +[postgres-shield]: https://img.shields.io/badge/postgres-16-336791?labelColor=black&logo=postgresql&logoColor=white&style=flat-square +[postgres-link]: https://www.postgresql.org/ diff --git a/app/BangumiVault.html b/app/BangumiVault.html new file mode 100644 index 0000000..a2b5cd6 --- /dev/null +++ b/app/BangumiVault.html @@ -0,0 +1,331 @@ + + + + + + Bangumi 保管库 + + + + + + +
Bangumi 保管库
+
+ +
+
+
+ + +
+
+
+ +
目录
+ 未登录 + 0 条 +
+
+
同步中…
+
+
+ + + + + +
+
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
+ 全部条目 + 最近同步 · 手动增量 +
+
+ + + + +
+
+
+
+
+ +
+
+ + + + + + + + + +
+ + + + + + + + + + + diff --git a/app/css/fonts.css b/app/css/fonts.css new file mode 100644 index 0000000..e171724 --- /dev/null +++ b/app/css/fonts.css @@ -0,0 +1,124 @@ +/* Auto-generated by tools/fetch-fonts.mjs — do not edit by hand. */ + +/* Inter (inter) — 2 faces */ +@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter/files/inter-latin-ext-wght-normal.woff2) format('woff2-variations');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;} +@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;src:url(/fonts/inter/files/inter-latin-wght-normal.woff2) format('woff2-variations');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;} + +/* Nunito (nunito) — 2 faces */ +@font-face{font-family:'Nunito';font-style:normal;font-weight:200 1000;font-display:swap;src:url(/fonts/nunito/files/nunito-latin-ext-wght-normal.woff2) format('woff2-variations');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;} +@font-face{font-family:'Nunito';font-style:normal;font-weight:200 1000;font-display:swap;src:url(/fonts/nunito/files/nunito-latin-wght-normal.woff2) format('woff2-variations');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;} + +/* JetBrains Mono (jetbrains-mono) — 2 faces */ +@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono/files/jetbrains-mono-latin-ext-wght-normal.woff2) format('woff2-variations');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;} +@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:100 800;font-display:swap;src:url(/fonts/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2) format('woff2-variations');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;} + +/* Noto Sans JP (noto-sans-jp) — 4 faces */ +@font-face{font-family:'Noto Sans JP';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/noto-sans-jp/files/noto-sans-jp-latin-ext-400-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;} +@font-face{font-family:'Noto Sans JP';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/noto-sans-jp/files/noto-sans-jp-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;} +@font-face{font-family:'Noto Sans JP';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/noto-sans-jp/files/noto-sans-jp-japanese-400-normal.woff2) format('woff2');} +@font-face{font-family:'Noto Sans JP';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/noto-sans-jp/files/noto-sans-jp-japanese-700-normal.woff2) format('woff2');} + +/* M PLUS Rounded 1c (m-plus-rounded-1c) — 4 faces */ +@font-face{font-family:'M PLUS Rounded 1c';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-ext-400-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;} +@font-face{font-family:'M PLUS Rounded 1c';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;} +@font-face{font-family:'M PLUS Rounded 1c';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-400-normal.woff2) format('woff2');} +@font-face{font-family:'M PLUS Rounded 1c';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-700-normal.woff2) format('woff2');} + +/* LXGW WenKai Screen (wenkai) — 97 faces */ +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-4.woff2) format('woff2');unicode-range:U+1f1e9-1f1f5, U+1f1f7-1f1ff, U+1f21a, U+1f232, U+1f234-1f237, U+1f250-1f251, U+1f300, U+1f302-1f308, U+1f30a-1f311, U+1f315, U+1f319-1f320, U+1f324, U+1f327, U+1f32a, U+1f32c-1f32d, U+1f330-1f357, U+1f359-1f37e;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-5.woff2) format('woff2');unicode-range:U+fee3, U+fef3, U+ff03-ff04, U+ff07, U+ff0a, U+ff17-ff19, U+ff1c-ff1d, U+ff20-ff3a, U+ff3c, U+ff3e-ff5b, U+ff5d, U+ff61-ff65, U+ff67-ff6a, U+ff6c, U+ff6f-ff78, U+ff7a-ff7d, U+ff80-ff84, U+ff86, U+ff89-ff8e, U+ff92, U+ff97-ff9b, U+ff9d-ff9f, U+ffe0-ffe4, U+ffe6, U+ffe9, U+ffeb, U+ffed, U+fffc, U+1f004, U+1f170-1f171, U+1f192-1f195, U+1f198-1f19a, U+1f1e6-1f1e8;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-6.woff2) format('woff2');unicode-range:U+f0a7, U+f0b2, U+f0b7, U+f0c9, U+f0d8, U+f0da, U+f0dc-f0dd, U+f0e0, U+f0e6, U+f0eb, U+f0fc, U+f101, U+f104-f105, U+f107, U+f10b, U+f11b, U+f14b, U+f18a, U+f193, U+f1d6-f1d7, U+f244, U+f27a, U+f296, U+f2ae, U+f471, U+f4b3, U+f610-f611, U+f880-f881, U+f8ec, U+f8f5, U+f8ff, U+f901, U+f90a, U+f92c-f92d, U+f934, U+f937, U+f941, U+f965, U+f967, U+f969, U+f96b, U+f96f, U+f974, U+f978-f979, U+f97e, U+f981, U+f98a, U+f98e, U+f997, U+f99c, U+f9b2, U+f9b5, U+f9ba, U+f9be, U+f9ca, U+f9d0-f9d1, U+f9dd, U+f9e0-f9e1, U+f9e4, U+f9f7, U+fa00-fa01, U+fa08, U+fa0a, U+fa11, U+fb01-fb02, U+fdfc, U+fe0e, U+fe30-fe31, U+fe33-fe44, U+fe49-fe52, U+fe54-fe57, U+fe59-fe66, U+fe68-fe6b, U+fe8e, U+fe92-fe93, U+feae, U+feb8, U+fecb-fecc, U+fee0;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-21.woff2) format('woff2');unicode-range:U+9f3d-9f3e, U+9f41, U+9f4a-9f4b, U+9f51-9f52, U+9f61-9f63, U+9f66-9f67, U+9f80-9f81, U+9f83, U+9f85-9f8d, U+9f90-9f91, U+9f94-9f96, U+9f98, U+9f9b-9f9c, U+9f9e, U+9fa0, U+9fa2, U+9ff4, U+a001, U+a007, U+a025, U+a046-a047, U+a057, U+a072, U+a078-a079, U+a083, U+a085, U+a100, U+a118, U+a132, U+a134, U+a1f4, U+a242, U+a4a6, U+a4aa, U+a4b0-a4b1, U+a4b3, U+a9c1-a9c2, U+ac00-ac01, U+ac04, U+ac08, U+ac10-ac11, U+ac13-ac16, U+ac19, U+ac1c-ac1d, U+ac24, U+ac70-ac71, U+ac74, U+ac77-ac78, U+ac80-ac81, U+ac83, U+ac8c, U+ac90, U+ac9f-aca0, U+aca8-aca9, U+acac, U+acb0, U+acbd, U+acc1, U+acc4, U+ace0-ace1, U+ace4, U+ace8, U+acf3, U+acf5, U+acfc-acfd, U+ad00, U+ad0c, U+ad11, U+ad1c, U+ad34, U+ad50, U+ad64, U+ad6c, U+ad70, U+ad74, U+ad7f, U+ad81, U+ad8c, U+adc0, U+adc8, U+addc, U+ade0, U+adf8-adf9, U+adfc, U+ae00, U+ae08-ae09, U+ae0b, U+ae30, U+ae34, U+ae38, U+ae40, U+ae4a, U+ae4c, U+ae54, U+ae68, U+aebc, U+aed8, U+af2c-af2d, U+af34;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-22.woff2) format('woff2');unicode-range:U+9dfa, U+9e0a, U+9e11, U+9e1a, U+9e1e, U+9e20, U+9e22, U+9e28-9e2c, U+9e2e-9e33, U+9e35-9e3b, U+9e3e, U+9e40-9e44, U+9e46-9e4e, U+9e51, U+9e53, U+9e55-9e58, U+9e5a-9e5c, U+9e5e-9e63, U+9e66-9e6e, U+9e71, U+9e73, U+9e75, U+9e78-9e79, U+9e7c-9e7e, U+9e82, U+9e86-9e88, U+9e8b-9e8c, U+9e90-9e91, U+9e93, U+9e95, U+9e97, U+9e9d, U+9ea4-9ea5, U+9ea9-9eaa, U+9eb4-9eb5, U+9eb8-9eba, U+9ebc-9ebf, U+9ec3, U+9ec9, U+9ecd, U+9ed0, U+9ed2-9ed3, U+9ed5-9ed6, U+9ed9, U+9edc-9edd, U+9edf-9ee0, U+9ee2, U+9ee5, U+9ee7-9eea, U+9eef, U+9ef1, U+9ef3-9ef4, U+9ef6, U+9ef9, U+9efb-9efc, U+9efe, U+9f0b, U+9f0d, U+9f10, U+9f14, U+9f17, U+9f19, U+9f22, U+9f29, U+9f2c, U+9f2f, U+9f31, U+9f37, U+9f39;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-23.woff2) format('woff2');unicode-range:U+9c3b, U+9c40, U+9c47-9c49, U+9c53, U+9c57, U+9c64, U+9c72, U+9c77-9c78, U+9c7b, U+9c7f-9c80, U+9c82-9c83, U+9c85-9c8c, U+9c8e-9c92, U+9c94-9c9b, U+9c9e-9ca3, U+9ca5-9ca7, U+9ca9, U+9cab, U+9cad-9cae, U+9cb1-9cb7, U+9cb9-9cbd, U+9cbf-9cc0, U+9cc3, U+9cc5-9cc7, U+9cc9-9cd1, U+9cd3-9cda, U+9cdc-9cdd, U+9cdf, U+9ce1-9ce3, U+9ce5, U+9ce9, U+9cee-9cef, U+9cf3-9cf4, U+9cf6, U+9cfc-9cfd, U+9d02, U+9d08-9d09, U+9d12, U+9d1b, U+9d1e, U+9d26, U+9d28, U+9d37, U+9d3b, U+9d3f, U+9d51, U+9d59, U+9d5c-9d5d, U+9d5f-9d61, U+9d6c, U+9d70, U+9d72, U+9d7a, U+9d7e, U+9d84, U+9d89, U+9d8f, U+9d92, U+9daf, U+9db4, U+9db8, U+9dbc, U+9dc4, U+9dc7, U+9dc9, U+9dd7, U+9ddf, U+9df2, U+9df9;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-24.woff2) format('woff2');unicode-range:U+9a5f, U+9a62, U+9a65, U+9a69, U+9a6b, U+9a6e, U+9a75, U+9a77-9a7a, U+9a7d, U+9a80, U+9a83, U+9a85, U+9a87-9a8a, U+9a8d-9a8e, U+9a90, U+9a92-9a93, U+9a95-9a96, U+9a98-9a99, U+9a9b-9aa2, U+9aa5, U+9aa7, U+9aaf-9ab1, U+9ab5-9ab6, U+9ab9-9aba, U+9abc, U+9ac0-9ac4, U+9ac8, U+9acb-9acc, U+9ace-9acf, U+9ad1-9ad2, U+9ad9, U+9adf, U+9ae1, U+9ae3, U+9aea-9aeb, U+9aed-9aef, U+9af4, U+9af9, U+9afb, U+9b03-9b04, U+9b06, U+9b08, U+9b0d, U+9b0f-9b10, U+9b13, U+9b18, U+9b1a, U+9b1f, U+9b22-9b23, U+9b25, U+9b27-9b28, U+9b2a, U+9b2f, U+9b31-9b32, U+9b3b, U+9b43, U+9b46-9b49, U+9b4d-9b4e, U+9b51, U+9b56, U+9b58, U+9b5a, U+9b5c, U+9b5f, U+9b61-9b62, U+9b6f, U+9b77, U+9b80, U+9b88, U+9b8b, U+9b8e, U+9b91, U+9b9f-9ba0, U+9ba8, U+9baa-9bab, U+9bad-9bae, U+9bb0-9bb1, U+9bb8, U+9bc9-9bca, U+9bd3, U+9bd6, U+9bdb, U+9be8, U+9bf0-9bf1, U+9c02, U+9c10, U+9c15, U+9c24, U+9c2d, U+9c32, U+9c39;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-25.woff2) format('woff2');unicode-range:U+98c8, U+98cf-98d6, U+98da-98db, U+98dd, U+98e1-98e2, U+98e7-98ea, U+98ec, U+98ee-98ef, U+98f2, U+98f4, U+98fc-98fe, U+9903, U+9905, U+9908, U+990a, U+990c-990d, U+9913-9914, U+9918, U+991a-991b, U+991e, U+9921, U+9928, U+992c, U+992e, U+9935, U+9938-9939, U+993d-993e, U+9945, U+994b-994c, U+9951-9952, U+9954-9955, U+9957, U+995e, U+9963, U+9966-9969, U+996b-996c, U+996f, U+9974-9975, U+9977-9979, U+997d-997e, U+9980-9981, U+9983-9984, U+9987, U+998a-998b, U+998d-9991, U+9993-9995, U+9997-9998, U+99a5, U+99ab-99ae, U+99b1, U+99b3-99b4, U+99bc, U+99bf, U+99c1, U+99c3-99c6, U+99cc, U+99d0, U+99d2, U+99d5, U+99db, U+99dd, U+99e1, U+99ed, U+99f1, U+99ff, U+9a01, U+9a03-9a04, U+9a0e-9a0f, U+9a11-9a13, U+9a19, U+9a1b, U+9a28, U+9a2b, U+9a30, U+9a32, U+9a37, U+9a40, U+9a45, U+9a4a, U+9a4d-9a4e, U+9a52, U+9a55, U+9a57, U+9a5a-9a5b;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-26.woff2) format('woff2');unicode-range:U+972a, U+972d, U+9730, U+973d, U+9742, U+9744, U+9748-9749, U+9750-9751, U+975a-975c, U+9763, U+9765-9766, U+976c-976d, U+9773, U+9776, U+977a, U+977c, U+9784-9785, U+978e-978f, U+9791-9792, U+9794-9795, U+9798, U+979a, U+979e, U+97a3, U+97a5-97a6, U+97a8, U+97ab-97ac, U+97ae-97af, U+97b2, U+97b4, U+97c6, U+97cb-97cc, U+97d3, U+97d8, U+97dc, U+97e1, U+97ea-97eb, U+97ee, U+97fb, U+97fe-97ff, U+9801-9803, U+9805-9806, U+9808, U+980c, U+9810-9814, U+9817-9818, U+981e, U+9820-9821, U+9824, U+9828, U+982b-982d, U+9830, U+9834, U+9838-9839, U+983c, U+9846, U+984d-984f, U+9851-9852, U+9854-9855, U+9857-9858, U+985a-985b, U+9862-9863, U+9865, U+9867, U+986b, U+986f-9871, U+9877-9878, U+987c, U+9880, U+9883, U+9885, U+9889, U+988b-988f, U+9893-9895, U+9899-989b, U+989e-989f, U+98a1-98a2, U+98a5-98a7, U+98a9, U+98af, U+98b1, U+98b6, U+98ba, U+98be, U+98c3-98c4, U+98c6-98c7;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-27.woff2) format('woff2');unicode-range:U+95b9-95ca, U+95cc-95cd, U+95d4-95d6, U+95d8, U+95e1-95e2, U+95e9, U+95f0-95f1, U+95f3, U+95f6, U+95fc, U+95fe-95ff, U+9602-9604, U+9606-960d, U+960f, U+9611-9613, U+9615-9617, U+9619-961b, U+961d, U+9621, U+9628, U+962f, U+963c-963e, U+9641-9642, U+9649, U+9654, U+965b-965f, U+9661, U+9663, U+9665, U+9667-9668, U+966c, U+9670, U+9672-9674, U+9678, U+967a, U+967d, U+9682, U+9685, U+9688, U+968a, U+968d-968e, U+9695, U+9697-9698, U+969e, U+96a0, U+96a3-96a4, U+96a8, U+96aa, U+96b0-96b1, U+96b3-96b4, U+96b7-96b9, U+96bb-96bd, U+96c9, U+96cb, U+96ce, U+96d1-96d2, U+96d6, U+96d9, U+96db-96dc, U+96de, U+96e0, U+96e3, U+96e9, U+96eb, U+96f0-96f2, U+96f9, U+96ff, U+9701-9702, U+9705, U+9708, U+970a, U+970e-970f, U+9711, U+9719, U+9727;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-28.woff2) format('woff2');unicode-range:U+94e7-94ec, U+94ee-94f1, U+94f3, U+94f5, U+94f7, U+94f9, U+94fb-94fd, U+94ff, U+9503-9504, U+9506-9507, U+9509-950a, U+950d-950f, U+9511-9518, U+951a-9520, U+9522, U+9528-952d, U+9530-953a, U+953c-953f, U+9543-9546, U+9548-9550, U+9552-9555, U+9557-955b, U+955d-9568, U+956a-956d, U+9570-9574, U+9583, U+9586, U+9589, U+958e-958f, U+9591-9592, U+9594, U+9598-9599, U+959e-95a0, U+95a2-95a6, U+95a8-95b2, U+95b4, U+95b8;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-29.woff2) format('woff2');unicode-range:U+9410-941a, U+941c-942b, U+942d-942e, U+9432-9433, U+9435, U+9438, U+943a, U+943e, U+9444, U+944a, U+9451-9452, U+945a, U+9462-9463, U+9465, U+9470-9487, U+948a-9492, U+9494-9498, U+949a, U+949c-949d, U+94a1, U+94a3-94a4, U+94a8, U+94aa-94ad, U+94af, U+94b2, U+94b4-94ba, U+94bc-94c0, U+94c4, U+94c6-94db, U+94de-94e6;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-30.woff2) format('woff2');unicode-range:U+92b7, U+92b9, U+92c1, U+92c5-92c6, U+92c8, U+92cc, U+92d0, U+92d2, U+92e4, U+92ea, U+92ec-92ed, U+92f0, U+92f3, U+92f8, U+92fc, U+9304, U+9306, U+9310, U+9312, U+9315, U+9318, U+931a, U+931e, U+9320-9322, U+9324, U+9326-9329, U+932b-932c, U+932f, U+9331-9332, U+9335-9336, U+933e, U+9340-9341, U+934a-9360, U+9362-9363, U+9365-936b, U+936e, U+9375, U+937e, U+9382, U+938a, U+938c, U+938f, U+9393-9394, U+9396-9397, U+939a, U+93a2, U+93a7, U+93ac-93cd, U+93d0-93d1, U+93d6-93d8, U+93de-93df, U+93e1-93e2, U+93e4, U+93f8, U+93fb, U+93fd, U+940e-940f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-31.woff2) format('woff2');unicode-range:U+914c, U+914e-9150, U+9154, U+9157, U+915a, U+915d-915e, U+9161-9164, U+9169, U+9170, U+9172, U+9174, U+9179-917a, U+917d-917e, U+9182-9183, U+9185, U+918c-918d, U+9190-9191, U+919a, U+919c, U+91a1-91a4, U+91a8, U+91aa-91af, U+91b4-91b5, U+91b8, U+91ba, U+91be, U+91c0-91c1, U+91c6, U+91c8, U+91cb, U+91d0, U+91d2, U+91d7-91d8, U+91dd, U+91e3, U+91e6-91e7, U+91ed, U+91f0, U+91f5, U+91f9, U+9200, U+9205, U+9207-920a, U+920d-920e, U+9210, U+9214-9215, U+921c, U+921e, U+9221, U+9223-9227, U+9229-922a, U+922d, U+9234-9235, U+9237, U+9239-923a, U+923c-9240, U+9244-9246, U+9249, U+924e-924f, U+9251, U+9253, U+9257, U+925b, U+925e, U+9262, U+9264-9266, U+9268, U+926c, U+926f, U+9271, U+927b, U+927e, U+9280, U+9283, U+9285-928a, U+928e, U+9291, U+9293, U+9296, U+9298, U+929c-929d, U+92a8, U+92ab-92ae, U+92b3, U+92b6;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-32.woff2) format('woff2');unicode-range:U+8fe2-8fe5, U+8fe8-8fe9, U+8fee, U+8ff3-8ff4, U+8ff8, U+8ffa, U+9004, U+900b, U+9011, U+9015-9016, U+901e, U+9021, U+9026, U+902d, U+902f, U+9031, U+9035-9036, U+9039-903a, U+9041, U+9044-9046, U+904a, U+904f-9052, U+9054-9055, U+9058-9059, U+905b-905e, U+9060-9062, U+9068-9069, U+906f, U+9072, U+9074, U+9076-907a, U+907c-907d, U+9081, U+9083, U+9085, U+9087-908b, U+908f, U+9095, U+9097, U+9099-909b, U+909d, U+90a0-90a1, U+90a8-90a9, U+90ac, U+90b0, U+90b2-90b4, U+90b6, U+90b8, U+90ba, U+90bd-90be, U+90c3-90c5, U+90c7-90c8, U+90cf-90d0, U+90d3, U+90d5, U+90d7, U+90da-90dc, U+90de, U+90e2, U+90e4, U+90e6-90e7, U+90ea-90eb, U+90ef, U+90f4-90f5, U+90f7, U+90fe-9100, U+9104, U+9109, U+910c, U+9112, U+9114-9115, U+9118, U+911c, U+911e, U+9120, U+9122-9123, U+9127, U+912d, U+912f-9132, U+9139-913a, U+9143, U+9146, U+9149-914a;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-33.woff2) format('woff2');unicode-range:U+8e2d-8e31, U+8e34-8e35, U+8e39-8e3a, U+8e3d, U+8e40-8e42, U+8e47, U+8e49-8e4b, U+8e50-8e53, U+8e59-8e5a, U+8e5f-8e60, U+8e64, U+8e69, U+8e6c, U+8e70, U+8e74, U+8e76, U+8e7a-8e7c, U+8e7f, U+8e84-8e85, U+8e87, U+8e89, U+8e8b, U+8e8d, U+8e8f-8e90, U+8e94, U+8e99, U+8e9c, U+8e9e, U+8eaa, U+8eac, U+8eb0, U+8eb6, U+8ec0, U+8ec6, U+8eca-8ece, U+8ed2, U+8eda, U+8edf, U+8ee2, U+8eeb, U+8ef8, U+8efb-8efe, U+8f03, U+8f09, U+8f0b, U+8f12-8f15, U+8f1b, U+8f1d, U+8f1f, U+8f29-8f2a, U+8f2f, U+8f36, U+8f38, U+8f3b, U+8f3e-8f3f, U+8f44-8f45, U+8f49, U+8f4d-8f4e, U+8f5f, U+8f6b, U+8f6d, U+8f71-8f73, U+8f75-8f76, U+8f78-8f7a, U+8f7c, U+8f7e, U+8f81-8f82, U+8f84, U+8f87, U+8f8a-8f8b, U+8f8d-8f8f, U+8f94-8f95, U+8f97-8f9a, U+8fa6, U+8fad-8faf, U+8fb2, U+8fb5-8fb7, U+8fba-8fbc, U+8fbf, U+8fc2, U+8fcb, U+8fcd, U+8fd3, U+8fd5, U+8fd7, U+8fda;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-34.woff2) format('woff2');unicode-range:U+8caf-8cb0, U+8cb3-8cb4, U+8cb6-8cb9, U+8cbb-8cbd, U+8cbf-8cc4, U+8cc7-8cc8, U+8cca, U+8ccd, U+8cd1, U+8cd3, U+8cdb-8cdc, U+8cde, U+8ce0, U+8ce2-8ce4, U+8ce6-8ce8, U+8cea, U+8ced, U+8cf4, U+8cf8, U+8cfa, U+8cfc-8cfd, U+8d04-8d05, U+8d07-8d08, U+8d0a, U+8d0d, U+8d0f, U+8d13-8d14, U+8d16, U+8d1b, U+8d20, U+8d2e, U+8d30, U+8d32-8d33, U+8d36, U+8d3b, U+8d3d, U+8d40, U+8d42-8d43, U+8d45-8d46, U+8d48-8d4a, U+8d4d, U+8d51, U+8d53, U+8d55, U+8d59, U+8d5c-8d5d, U+8d5f, U+8d61, U+8d66-8d67, U+8d6a, U+8d6d, U+8d71, U+8d73, U+8d84, U+8d90-8d91, U+8d94-8d95, U+8d99, U+8da8, U+8daf, U+8db1, U+8db5, U+8db8, U+8dba, U+8dbc, U+8dbf, U+8dc2, U+8dc4, U+8dc6, U+8dcb, U+8dce-8dcf, U+8dd6-8dd7, U+8dda-8ddb, U+8dde, U+8de1, U+8de3-8de4, U+8de9, U+8deb-8dec, U+8df0-8df1, U+8df6-8dfd, U+8e05, U+8e07, U+8e09-8e0a, U+8e0c, U+8e0e, U+8e10, U+8e14, U+8e1d-8e1f, U+8e23, U+8e26, U+8e2b-8e2c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-35.woff2) format('woff2');unicode-range:U+8b5e, U+8b60, U+8b6c, U+8b6f-8b70, U+8b72, U+8b74, U+8b77, U+8b7d, U+8b80, U+8b83, U+8b8a, U+8b8c, U+8b90, U+8b93, U+8b99-8b9a, U+8ba0, U+8ba3, U+8ba5-8ba7, U+8baa-8bac, U+8bb3-8bb5, U+8bb7, U+8bb9, U+8bc2-8bc3, U+8bc5, U+8bcb-8bcc, U+8bce-8bd0, U+8bd2-8bd4, U+8bd6, U+8bd8-8bd9, U+8bdc, U+8bdf, U+8be3-8be4, U+8be7-8be9, U+8beb-8bec, U+8bee, U+8bf0, U+8bf2-8bf3, U+8bf6, U+8bf9, U+8bfc-8bfd, U+8bff-8c00, U+8c02, U+8c04, U+8c06-8c07, U+8c0c, U+8c0f, U+8c11-8c12, U+8c14-8c1b, U+8c1d-8c21, U+8c24-8c25, U+8c27, U+8c2a-8c2c, U+8c2e-8c30, U+8c32-8c36, U+8c3f, U+8c47-8c4c, U+8c4e-8c50, U+8c54-8c56, U+8c62, U+8c68, U+8c6c, U+8c73, U+8c78, U+8c7a, U+8c82, U+8c85, U+8c89-8c8a, U+8c8d-8c8e, U+8c90, U+8c93-8c94, U+8c98, U+8c9d-8c9e, U+8ca0-8ca2, U+8ca7-8cac;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-36.woff2) format('woff2');unicode-range:U+8a02-8a03, U+8a07-8a0a, U+8a0e-8a0f, U+8a13, U+8a15-8a18, U+8a1a-8a1b, U+8a1d, U+8a1f, U+8a22-8a23, U+8a25, U+8a2b, U+8a2d, U+8a31, U+8a33-8a34, U+8a36-8a38, U+8a3a, U+8a3c, U+8a3e, U+8a40-8a41, U+8a46, U+8a48, U+8a50, U+8a52, U+8a54-8a55, U+8a58, U+8a5b, U+8a5d-8a63, U+8a66, U+8a69-8a6b, U+8a6d-8a6e, U+8a70, U+8a72-8a73, U+8a7a, U+8a85, U+8a87, U+8a8a, U+8a8c-8a8d, U+8a90-8a92, U+8a95, U+8a98, U+8aa0-8aa1, U+8aa3-8aa6, U+8aa8-8aa9, U+8aac-8aae, U+8ab0, U+8ab2, U+8ab8-8ab9, U+8abc, U+8abe-8abf, U+8ac7, U+8acf, U+8ad2, U+8ad6-8ad7, U+8adb-8adc, U+8adf, U+8ae1, U+8ae6-8ae8, U+8aeb, U+8aed-8aee, U+8af1, U+8af3-8af4, U+8af7-8af8, U+8afa, U+8afe, U+8b00-8b02, U+8b07, U+8b0a, U+8b0c, U+8b0e, U+8b10, U+8b17, U+8b19, U+8b1b, U+8b1d, U+8b20-8b21, U+8b26, U+8b28, U+8b2c, U+8b33, U+8b39, U+8b3e-8b3f, U+8b41, U+8b45, U+8b49, U+8b4c, U+8b4f, U+8b57-8b58, U+8b5a, U+8b5c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-37.woff2) format('woff2');unicode-range:U+8869-886a, U+886e-886f, U+8872, U+8879, U+887d-887f, U+8882, U+8884-8886, U+8888, U+888f, U+8892-8893, U+889b, U+88a2, U+88a4, U+88a6, U+88a8, U+88aa, U+88ae, U+88b1, U+88b4, U+88b7, U+88bc, U+88c0, U+88c6-88c9, U+88ce-88cf, U+88d1-88d3, U+88d8, U+88db-88dd, U+88df, U+88e1-88e3, U+88e5, U+88e8, U+88ec, U+88f0-88f1, U+88f3-88f4, U+88fc-88fe, U+8900, U+8902, U+8906-8907, U+8909-890c, U+8912-8915, U+8918-891b, U+8921, U+8925, U+892b, U+8930, U+8932, U+8934, U+8936, U+893b, U+893d, U+8941, U+894c, U+8955-8956, U+8959, U+895c, U+895e-8960, U+8966, U+896a, U+896c, U+896f-8970, U+8972, U+897b, U+897e, U+8980, U+8983, U+8985, U+8987-8988, U+898c, U+898f, U+8993, U+8997, U+899a, U+89a1, U+89a7, U+89a9-89aa, U+89b2-89b3, U+89b7, U+89c0, U+89c7, U+89ca-89cc, U+89ce-89d1, U+89d6, U+89da, U+89dc, U+89de, U+89e5, U+89e7, U+89eb, U+89ef, U+89f1, U+89f3-89f4, U+89f8, U+89ff, U+8a01;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-38.woff2) format('woff2');unicode-range:U+86e4, U+86e6, U+86e9, U+86ed, U+86ef-86f4, U+86f8-86f9, U+86fb, U+86fe, U+8703, U+8706-870a, U+870d, U+8711-8713, U+871a, U+871e, U+8722-8723, U+8725, U+8729, U+872e, U+8731, U+8734, U+8737, U+873a-873b, U+873e-8740, U+8742, U+8747-8748, U+8753, U+8755, U+8757-8758, U+875d, U+875f, U+8762-8766, U+8768, U+876e, U+8770, U+8772, U+8775, U+8778, U+877b-877e, U+8782, U+8785, U+8788, U+878b, U+8793, U+8797, U+879a, U+879e-87a0, U+87a2-87a3, U+87a8, U+87ab-87ad, U+87af, U+87b3, U+87b5, U+87bd, U+87c0, U+87c4, U+87c6, U+87ca-87cb, U+87d1-87d2, U+87db-87dc, U+87de, U+87e0, U+87e5, U+87ea, U+87ec, U+87ee, U+87f2-87f3, U+87fb, U+87fd-87fe, U+8802-8803, U+8805, U+880a-880b, U+880d, U+8813-8816, U+8819, U+881b, U+881f, U+8821, U+8823, U+8831-8832, U+8835-8836, U+8839, U+883b-883c, U+8844, U+8846, U+884a, U+884e, U+8852-8853, U+8855, U+8859, U+885b, U+885d-885e, U+8862, U+8864;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-39.woff2) format('woff2');unicode-range:U+8532, U+8534-8535, U+8538-853a, U+853c, U+8543, U+8545, U+8548, U+854e, U+8553, U+8556-8557, U+8559, U+855e, U+8561, U+8564-8565, U+8568-856a, U+856d, U+856f-8570, U+8572, U+8576, U+8579-857b, U+8580, U+8585-8586, U+8588, U+858a, U+858f, U+8591, U+8594, U+8599, U+859c, U+85a2, U+85a4, U+85a6, U+85a8-85a9, U+85ab-85ac, U+85ae, U+85b7-85b9, U+85be, U+85c1, U+85c7, U+85cd, U+85d0, U+85d3, U+85d5, U+85dc-85dd, U+85df-85e0, U+85e5-85e6, U+85e8-85ea, U+85f4, U+85f9, U+85fe-85ff, U+8602, U+8605-8607, U+860a-860b, U+8616, U+8618, U+861a, U+8627, U+8629, U+862d, U+8638, U+863c, U+863f, U+864d, U+864f, U+8652-8655, U+865b-865c, U+865f, U+8662, U+8667, U+866c, U+866e, U+8671, U+8675, U+867a-867c, U+867f, U+868b, U+868d, U+8693, U+869c-869d, U+86a1, U+86a3-86a4, U+86a7-86a9, U+86ac, U+86af-86b1, U+86b4-86b6, U+86ba, U+86c0, U+86c4, U+86c6, U+86c9-86ca, U+86cd-86d1, U+86d4, U+86d8, U+86de-86df;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-40.woff2) format('woff2');unicode-range:U+83b4, U+83b6, U+83b8, U+83ba, U+83bc-83bd, U+83bf-83c0, U+83c2, U+83c5, U+83c8-83c9, U+83cb, U+83d1, U+83d3-83d6, U+83d8, U+83db, U+83dd, U+83df, U+83e1, U+83e5, U+83ea-83eb, U+83f0, U+83f4, U+83f8-83f9, U+83fb, U+83fd, U+83ff, U+8401, U+8406, U+840a-840b, U+840f, U+8411, U+8418, U+841c, U+8420, U+8422-8424, U+8426, U+8429, U+842c, U+8438-8439, U+843b-843c, U+843f, U+8446-8447, U+8449, U+844e, U+8451-8452, U+8456, U+8459-845a, U+845c, U+8462, U+8466, U+846d, U+846f-8470, U+8473, U+8476-8478, U+847a, U+847d, U+8484-8485, U+8487, U+8489, U+848c, U+848e, U+8490, U+8493-8494, U+8497, U+849b, U+849e-849f, U+84a1, U+84a5, U+84a8, U+84af, U+84b4, U+84b9-84bf, U+84c1-84c2, U+84c5-84c7, U+84ca-84cb, U+84cd, U+84d0-84d1, U+84d3, U+84d6, U+84df-84e0, U+84e2-84e3, U+84e5-84e7, U+84ee, U+84f3, U+84f6, U+84fa, U+84fc, U+84ff-8500, U+850c, U+8511, U+8514-8515, U+8517-8518, U+851f, U+8523, U+8525-8526, U+8529, U+852b, U+852d;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-41.woff2) format('woff2');unicode-range:U+82a9-82ab, U+82ae, U+82b0, U+82b2, U+82b4-82b6, U+82bc, U+82be, U+82c0-82c2, U+82c4-82c8, U+82ca-82cc, U+82ce, U+82d0, U+82d2-82d3, U+82d5-82d6, U+82d8-82d9, U+82dc-82de, U+82e0-82e4, U+82e7, U+82e9-82eb, U+82ed-82ee, U+82f3-82f4, U+82f7-82f8, U+82fa-8301, U+8306-8308, U+830c-830d, U+830f, U+8311, U+8313-8315, U+8318, U+831a-831b, U+831d, U+8324, U+8327, U+832a, U+832c-832d, U+832f, U+8331-8334, U+833a-833c, U+8340, U+8343-8345, U+8347-8348, U+834a, U+834c, U+834f, U+8351, U+8356, U+8358-835c, U+835e, U+8360, U+8364-8366, U+8368-836a, U+836c-836e, U+8373, U+8378, U+837b-837d, U+837f-8380, U+8382, U+8388, U+838a-838b, U+8392, U+8394, U+8396, U+8398-8399, U+839b-839c, U+83a0, U+83a2-83a3, U+83a8-83aa, U+83ae-83b0, U+83b3;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-42.woff2) format('woff2');unicode-range:U+814d-814e, U+8151, U+8153, U+8158-815a, U+815e, U+8160, U+8166-8169, U+816b, U+816d, U+8171, U+8173-8174, U+8178, U+817c-817d, U+8182, U+8188, U+8191, U+8198-819b, U+81a0, U+81a3, U+81a5-81a6, U+81a9, U+81b6, U+81ba-81bb, U+81bd, U+81bf, U+81c1, U+81c3, U+81c6, U+81c9-81ca, U+81cc-81cd, U+81d1, U+81d3-81d4, U+81d8, U+81db-81dc, U+81de-81df, U+81e5, U+81e7-81e9, U+81eb-81ec, U+81ee-81ef, U+81f5, U+81f8, U+81fa, U+81fc, U+81fe, U+8200-8202, U+8204, U+8208-820a, U+820e-8210, U+8216-8218, U+821b-821c, U+8221-8224, U+8226-8228, U+822b, U+822d, U+822f, U+8232-8234, U+8237-8238, U+823a-823b, U+823e, U+8244, U+8249, U+824b, U+824f, U+8259-825a, U+825f, U+8266, U+8268, U+826e, U+8271, U+8276-8279, U+827d, U+827f, U+8283-8284, U+8288-828a, U+828d-8291, U+8293-8294, U+8296-8298, U+829f-82a1, U+82a3-82a4, U+82a7-82a8;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-43.woff2) format('woff2');unicode-range:U+7ffa, U+7ffe, U+8004, U+8006, U+800b, U+800e, U+8011-8012, U+8014, U+8016, U+8018-8019, U+801c, U+801e, U+8026-802a, U+8031, U+8034-8035, U+8037, U+8043, U+804b, U+804d, U+8052, U+8056, U+8059, U+805e, U+8061, U+8068-8069, U+806e-8074, U+8076-8078, U+807c-8080, U+8082, U+8084-8085, U+8088, U+808f, U+8093, U+809c, U+809f, U+80ab, U+80ad-80ae, U+80b1, U+80b6-80b8, U+80bc-80bd, U+80c2, U+80c4, U+80ca, U+80cd, U+80d1, U+80d4, U+80d7, U+80d9-80db, U+80dd, U+80e0, U+80e4-80e5, U+80e7-80ed, U+80ef-80f1, U+80f3-80f4, U+80fc, U+8101, U+8104-8105, U+8107-8108, U+810c-810e, U+8112-8115, U+8117-8119, U+811b-811f, U+8121-8130, U+8132-8134, U+8137, U+8139, U+813f-8140, U+8142, U+8146, U+8148;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-44.woff2) format('woff2');unicode-range:U+7ed7, U+7edb, U+7ee0-7ee2, U+7ee5-7ee6, U+7ee8, U+7eeb, U+7ef0-7ef2, U+7ef6, U+7efa-7efb, U+7efe, U+7f01-7f04, U+7f08, U+7f0a-7f12, U+7f17, U+7f19, U+7f1b-7f1c, U+7f1f, U+7f21-7f23, U+7f25-7f28, U+7f2a-7f33, U+7f35-7f37, U+7f3d, U+7f42, U+7f44-7f45, U+7f4c-7f4d, U+7f52, U+7f54, U+7f58-7f59, U+7f5d, U+7f5f-7f61, U+7f63, U+7f65, U+7f68, U+7f70-7f71, U+7f73-7f75, U+7f77, U+7f79, U+7f7d-7f7e, U+7f85-7f86, U+7f88-7f89, U+7f8b-7f8c, U+7f90-7f91, U+7f94-7f96, U+7f98-7f9b, U+7f9d, U+7f9f, U+7fa3, U+7fa7-7fa9, U+7fac-7fb2, U+7fb4, U+7fb6, U+7fb8, U+7fbc, U+7fbf-7fc0, U+7fc3, U+7fca, U+7fcc, U+7fce, U+7fd2, U+7fd5, U+7fd9-7fdb, U+7fdf, U+7fe3, U+7fe5-7fe7, U+7fe9, U+7feb-7fec, U+7fee-7fef, U+7ff1, U+7ff3-7ff4, U+7ff9;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-45.woff2) format('woff2');unicode-range:U+7dc4, U+7dc7-7dc8, U+7dca-7dcd, U+7dcf, U+7dd1-7dd2, U+7dd4, U+7dd6-7dd8, U+7dda-7de0, U+7de2-7de6, U+7de8-7ded, U+7def, U+7df1-7df5, U+7df7, U+7df9, U+7dfb-7dfc, U+7dfe-7e02, U+7e04, U+7e08-7e0b, U+7e12, U+7e1b, U+7e1e, U+7e20, U+7e22-7e23, U+7e26, U+7e29, U+7e2b, U+7e2e-7e2f, U+7e31, U+7e37, U+7e39-7e3e, U+7e40, U+7e43-7e44, U+7e46-7e47, U+7e4a-7e4b, U+7e4d-7e4e, U+7e51, U+7e54-7e56, U+7e58-7e5b, U+7e5d-7e5e, U+7e61, U+7e66-7e67, U+7e69-7e6b, U+7e6d, U+7e70, U+7e73, U+7e77, U+7e79, U+7e7b-7e7d, U+7e81-7e82, U+7e8c-7e8d, U+7e8f, U+7e92-7e94, U+7e96, U+7e98, U+7e9a-7e9c, U+7e9e-7e9f, U+7ea1, U+7ea3, U+7ea5, U+7ea8-7ea9, U+7eab, U+7ead-7eae, U+7eb0, U+7ebb, U+7ebe, U+7ec0-7ec2, U+7ec9, U+7ecb-7ecc, U+7ed0, U+7ed4;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-46.woff2) format('woff2');unicode-range:U+7ccc-7ccd, U+7cd7, U+7cdc, U+7cde, U+7ce0, U+7ce4-7ce5, U+7ce7-7ce8, U+7cec, U+7cf0, U+7cf5-7cf9, U+7cfc, U+7cfe, U+7d00, U+7d04-7d0b, U+7d0d, U+7d10-7d14, U+7d17-7d19, U+7d1b-7d1f, U+7d21, U+7d24-7d26, U+7d28-7d2a, U+7d2c-7d2e, U+7d30-7d31, U+7d33, U+7d35-7d36, U+7d38-7d3a, U+7d40, U+7d42-7d44, U+7d46, U+7d4b-7d4c, U+7d4f, U+7d51, U+7d54-7d56, U+7d58, U+7d5b-7d5c, U+7d5e, U+7d61-7d63, U+7d66, U+7d68, U+7d6a-7d6c, U+7d6f, U+7d71-7d73, U+7d75-7d77, U+7d79-7d7a, U+7d7e, U+7d81, U+7d84-7d8b, U+7d8d, U+7d8f, U+7d91, U+7d94, U+7d96, U+7d98-7d9a, U+7d9c-7da0, U+7da2, U+7da6, U+7daa-7db1, U+7db4-7db8, U+7dba-7dbf, U+7dc1;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-47.woff2) format('woff2');unicode-range:U+7bc3-7bc4, U+7bc6, U+7bc8-7bcc, U+7bd1, U+7bd3-7bd4, U+7bd9-7bda, U+7bdd, U+7be0-7be1, U+7be4-7be6, U+7be9-7bea, U+7bef, U+7bf4, U+7bf6, U+7bfc, U+7bfe, U+7c01, U+7c03, U+7c07-7c08, U+7c0a-7c0d, U+7c0f, U+7c11, U+7c15-7c16, U+7c19, U+7c1e-7c21, U+7c23-7c24, U+7c26, U+7c28-7c33, U+7c35, U+7c37-7c3b, U+7c3d-7c3e, U+7c40-7c41, U+7c43, U+7c47-7c48, U+7c4c, U+7c50, U+7c53-7c54, U+7c59, U+7c5f-7c60, U+7c63-7c65, U+7c6c, U+7c6e, U+7c72, U+7c74, U+7c79-7c7a, U+7c7c, U+7c81-7c82, U+7c84-7c85, U+7c88, U+7c8a-7c91, U+7c93-7c96, U+7c99, U+7c9b-7c9e, U+7ca0-7ca2, U+7ca6-7ca9, U+7cac, U+7caf-7cb3, U+7cb5-7cb7, U+7cba-7cbd, U+7cbf-7cc2, U+7cc5, U+7cc7-7cc9;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-48.woff2) format('woff2');unicode-range:U+7aca, U+7ad1-7ad2, U+7ada-7add, U+7ae1, U+7ae4, U+7ae6, U+7af4-7af7, U+7afa-7afb, U+7afd-7b0a, U+7b0c, U+7b0e-7b0f, U+7b13, U+7b15-7b16, U+7b18-7b19, U+7b1e-7b20, U+7b22-7b25, U+7b29-7b2b, U+7b2d-7b2e, U+7b30-7b3b, U+7b3e-7b3f, U+7b41-7b42, U+7b44-7b47, U+7b4a, U+7b4c-7b50, U+7b58, U+7b5a, U+7b5c, U+7b60, U+7b66-7b67, U+7b69, U+7b6c-7b6f, U+7b72-7b76, U+7b7b-7b7d, U+7b7f, U+7b82, U+7b85, U+7b87, U+7b8b-7b96, U+7b98-7b99, U+7b9b-7b9f, U+7ba2-7ba4, U+7ba6-7bac, U+7bae-7bb0, U+7bb4, U+7bb7-7bb9, U+7bbb, U+7bc0-7bc1;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-49.woff2) format('woff2');unicode-range:U+797c, U+797e-7980, U+7982, U+7986-7987, U+7989-798e, U+7992, U+7994-7995, U+7997-7998, U+799a-799c, U+799f, U+79a3-79a6, U+79a8-79ac, U+79ae-79b1, U+79b3-79b5, U+79b8, U+79ba, U+79bf, U+79c2, U+79c6, U+79c8, U+79cf, U+79d5-79d6, U+79dd-79de, U+79e3, U+79e7-79e8, U+79eb, U+79ed, U+79f4, U+79f7-79f8, U+79fa, U+79fe, U+7a02-7a03, U+7a05, U+7a0a, U+7a14, U+7a17, U+7a19, U+7a1c, U+7a1e-7a1f, U+7a23, U+7a25-7a26, U+7a2c, U+7a2e, U+7a30-7a32, U+7a36-7a37, U+7a39, U+7a3c, U+7a40, U+7a42, U+7a47, U+7a49, U+7a4c-7a4f, U+7a51, U+7a55, U+7a5b, U+7a5d-7a5e, U+7a62-7a63, U+7a66, U+7a68-7a69, U+7a6b, U+7a70, U+7a78, U+7a80, U+7a85-7a88, U+7a8a, U+7a90, U+7a93-7a96, U+7a98, U+7a9b-7a9c, U+7a9e, U+7aa0-7aa1, U+7aa3, U+7aa8-7aaa, U+7aac-7ab0, U+7ab3, U+7ab8, U+7aba, U+7abd-7abf, U+7ac4-7ac5, U+7ac7-7ac8;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-50.woff2) format('woff2');unicode-range:U+783e, U+7841-7844, U+7847-7849, U+784b-784c, U+784e-7854, U+7856-7857, U+7859-785a, U+7865, U+7869-786a, U+786d, U+786f, U+7876-7877, U+787c, U+787e-787f, U+7881, U+7887-7889, U+7893-7894, U+7898-789e, U+78a1, U+78a3, U+78a5, U+78a9, U+78ad, U+78b2, U+78b4, U+78b6, U+78b9-78ba, U+78bc, U+78bf, U+78c3, U+78c9, U+78cb, U+78d0-78d2, U+78d4, U+78d9-78da, U+78dc, U+78de, U+78e1, U+78e5-78e6, U+78ea, U+78ec, U+78ef, U+78f1-78f2, U+78f4, U+78fa-78fb, U+78fe, U+7901-7902, U+7905, U+7907, U+7909, U+790b-790c, U+790e, U+7910, U+7913, U+7919-791b, U+791e-791f, U+7921, U+7924, U+7926, U+792a-792b, U+7934, U+7936, U+7939, U+793b, U+793d, U+7940, U+7942-7943, U+7945-7947, U+7949-794a, U+794c, U+794e-7951, U+7953-7955, U+7957-795a, U+795c, U+795f-7960, U+7962, U+7964, U+7966-7967, U+7969, U+796b, U+796f, U+7972, U+7974, U+7979, U+797b;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-51.woff2) format('woff2');unicode-range:U+770f, U+7712, U+7714, U+7716, U+7719-771b, U+771e, U+7721-7722, U+7726, U+7728, U+772b-7730, U+7732-7736, U+7739-773a, U+773d-773f, U+7743, U+7746-7747, U+774c-774f, U+7751-7752, U+7758-775a, U+775c-775e, U+7762, U+7765-7766, U+7768-776a, U+776c-776d, U+7771-7772, U+777a, U+777c-777e, U+7780, U+7785, U+7787, U+778b-778d, U+778f-7791, U+7793, U+779e-77a0, U+77a2, U+77a5, U+77ad, U+77af, U+77b4-77b7, U+77bd-77c0, U+77c2, U+77c5, U+77c7, U+77cd, U+77d6-77d7, U+77d9-77da, U+77dd-77de, U+77e7, U+77ea, U+77ec, U+77ef, U+77f8, U+77fb, U+77fd-77fe, U+7800, U+7803, U+7806, U+7809, U+780f-7812, U+7815, U+7817-7818, U+781a-781f, U+7821-7823, U+7825-7827, U+7829, U+782b-7830, U+7832-7833, U+7835, U+7837, U+7839-783c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-52.woff2) format('woff2');unicode-range:U+760a-760e, U+7610-7619, U+761b-761d, U+761f-7622, U+7625, U+7627-762a, U+762e-7630, U+7632-7635, U+7638-763a, U+763c-763d, U+763f-7640, U+7642-7643, U+7647-7648, U+764d-764e, U+7652, U+7654, U+7658, U+765a, U+765c, U+765e-765f, U+7661-7663, U+7665, U+7669, U+766c, U+766e-766f, U+7671-7673, U+7675-7676, U+7678-767a, U+767f, U+7681, U+7683, U+7688, U+768a-768c, U+768e, U+7690-7692, U+7695, U+7698, U+769a-769b, U+769d-76a0, U+76a2, U+76a4-76a7, U+76ab-76ac, U+76af-76b0, U+76b2, U+76b4-76b5, U+76ba-76bb, U+76bf, U+76c2-76c3, U+76c5, U+76c9, U+76cc-76ce, U+76dc-76de, U+76e1-76ea, U+76f1, U+76f9-76fb, U+76fd, U+76ff-7700, U+7703-7704, U+7707-7708, U+770c-770e;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-53.woff2) format('woff2');unicode-range:U+74ef, U+74f4, U+74ff, U+7501, U+7503, U+7505, U+7508, U+750d, U+750f, U+7511, U+7513, U+7515, U+7517, U+7519, U+7521-7527, U+752a, U+752c-752d, U+752f, U+7534, U+7536, U+753a, U+753e, U+7540, U+7544, U+7547-754b, U+754d-754e, U+7550-7553, U+7556-7557, U+755a-755b, U+755d-755e, U+7560, U+7562, U+7564, U+7566-7568, U+756b-756c, U+756f-7573, U+7575, U+7579-757c, U+757e-757f, U+7581-7584, U+7587, U+7589-758e, U+7590, U+7592, U+7594, U+7596, U+7599-759a, U+759d, U+759f-75a0, U+75a3, U+75a5, U+75a8, U+75ac-75ad, U+75b0-75b1, U+75b3-75b5, U+75b8, U+75bd, U+75c1-75c4, U+75c8-75ca, U+75cc-75cd, U+75d4, U+75d6, U+75d9, U+75de, U+75e0, U+75e2-75e4, U+75e6-75ea, U+75f1-75f3, U+75f7, U+75f9-75fa, U+75fc, U+75fe-7601, U+7603, U+7605-7606, U+7608-7609;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-54.woff2) format('woff2');unicode-range:U+73e7-73ea, U+73ee-73f0, U+73f2, U+73f4-73f5, U+73f7, U+73f9-73fa, U+73fc-73fd, U+73ff-7402, U+7404, U+7407-7408, U+740a-740f, U+7418, U+741a-741c, U+741e, U+7424-7425, U+7428-7429, U+742c-7430, U+7432, U+7435-7436, U+7438-743b, U+743e-7441, U+7443-7446, U+7448, U+744a-744b, U+7452, U+7457, U+745b, U+745d, U+7460, U+7462-7465, U+7467-746a, U+746d, U+746f, U+7471, U+7473-7474, U+7477, U+747a, U+747e, U+7481-7482, U+7484, U+7486, U+7488-748b, U+748e-748f, U+7493, U+7498, U+749a, U+749c-74a0, U+74a3, U+74a6, U+74a9-74aa, U+74ae, U+74b0-74b2, U+74b6, U+74b8-74ba, U+74bd, U+74bf, U+74c1, U+74c3, U+74c5, U+74c8, U+74ca, U+74cc, U+74cf, U+74d1-74d2, U+74d4-74d5, U+74d8-74db, U+74de-74e0, U+74e2, U+74e4-74e5, U+74e7-74e9, U+74ee;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-55.woff2) format('woff2');unicode-range:U+72dd-72df, U+72e1, U+72e5-72e6, U+72e8, U+72ef-72f0, U+72f2-72f4, U+72f6-72f7, U+72f9-72fb, U+72fd, U+7300-7304, U+7307, U+730a-730c, U+7313-7317, U+731d-7322, U+7327, U+7329, U+732c-732d, U+7330-7331, U+7333, U+7335-7337, U+7339, U+733d-733e, U+7340, U+7342, U+7344-7345, U+734a, U+734d-7350, U+7352, U+7355, U+7357, U+7359, U+735f-7360, U+7362-7363, U+7365, U+7368, U+736c-736d, U+736f-7370, U+7372, U+7374-7376, U+7378, U+737a-737b, U+737d-737e, U+7382-7383, U+7386, U+7388, U+738a, U+738c-7393, U+7395, U+7397-739a, U+739c, U+739e, U+73a0-73a3, U+73a5-73a8, U+73aa, U+73ad, U+73b1, U+73b3, U+73b6-73b7, U+73b9, U+73c2, U+73c5-73c9, U+73cc, U+73ce-73d0, U+73d2, U+73d6, U+73d9, U+73db-73de, U+73e3, U+73e5-73e6;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-56.woff2) format('woff2');unicode-range:U+719c, U+71a0, U+71a4-71a5, U+71a8, U+71af, U+71b1-71bc, U+71be, U+71c1-71c2, U+71c4, U+71c8-71cb, U+71ce-71d0, U+71d2, U+71d4, U+71d9-71da, U+71dc, U+71df-71e0, U+71e6-71e8, U+71ea, U+71ed-71ee, U+71f4, U+71f6, U+71f9, U+71fb-71fc, U+71ff-7200, U+7207, U+720c-720d, U+7210, U+7216, U+721a-721e, U+7223, U+7228, U+722b, U+722d-722e, U+7230, U+7232, U+723a-723c, U+723e-7242, U+7246, U+724b, U+724d-724e, U+7252, U+7256, U+7258, U+725a, U+725c-725d, U+7260, U+7264-7266, U+726a, U+726c, U+726e-726f, U+7271, U+7273-7274, U+7278, U+727b, U+727d-727e, U+7281-7282, U+7284, U+7287, U+728a, U+728d, U+728f, U+7292, U+729b, U+729f-72a0, U+72a7, U+72ad-72ae, U+72b0-72b5, U+72b7-72b8, U+72ba-72be, U+72c0-72c1, U+72c3, U+72c5-72c6, U+72c8, U+72cc-72ce, U+72d2, U+72d6, U+72db;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-57.woff2) format('woff2');unicode-range:U+7005-7006, U+7009, U+700b, U+700d, U+7015, U+7018, U+701b, U+701d-701f, U+7023, U+7026-7028, U+702c, U+702e-7030, U+7035, U+7037, U+7039-703a, U+703c-703e, U+7044, U+7049-704b, U+704f, U+7051, U+7058, U+705a, U+705c-705e, U+7061, U+7064, U+7066, U+706c, U+707d, U+7080-7081, U+7085-7086, U+708a, U+708f, U+7091, U+7094-7095, U+7098-7099, U+709c-709d, U+709f, U+70a4, U+70a9-70aa, U+70af-70b2, U+70b4-70b7, U+70bb, U+70c0, U+70c3, U+70c7, U+70cb, U+70ce-70cf, U+70d4, U+70d9-70da, U+70dc-70dd, U+70e0, U+70e9, U+70ec, U+70f7, U+70fa, U+70fd, U+70ff, U+7104, U+7108-7109, U+710c, U+7110, U+7113-7114, U+7116-7118, U+711c, U+711e, U+7120, U+712e-712f, U+7131, U+713c, U+7142, U+7144-7147, U+7149-714b, U+7150, U+7152, U+7155-7156, U+7159-715a, U+715c, U+7161, U+7165-7166, U+7168-7169, U+716d, U+7173-7174, U+7176, U+7178, U+717a, U+717d, U+717f-7180, U+7184, U+7186-7188, U+7192, U+7198;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-58.woff2) format('woff2');unicode-range:U+6ed8-6ed9, U+6edb, U+6edd, U+6edf-6ee0, U+6ee2, U+6ee6, U+6eea, U+6eec, U+6eee-6eef, U+6ef2-6ef3, U+6ef7-6efa, U+6efe, U+6f01, U+6f03, U+6f08-6f09, U+6f15-6f16, U+6f19, U+6f22-6f25, U+6f28-6f2a, U+6f2c-6f2d, U+6f2f, U+6f31-6f32, U+6f36-6f38, U+6f3f, U+6f43-6f46, U+6f48, U+6f4b, U+6f4e-6f4f, U+6f51, U+6f54-6f57, U+6f59-6f5b, U+6f5e-6f5f, U+6f61, U+6f64-6f67, U+6f69-6f6c, U+6f6f-6f72, U+6f74-6f76, U+6f78-6f7e, U+6f80-6f83, U+6f86, U+6f89, U+6f8b-6f8d, U+6f90, U+6f92, U+6f94, U+6f97-6f98, U+6f9b, U+6fa3-6fa5, U+6fa7, U+6faa, U+6faf, U+6fb1, U+6fb4, U+6fb6, U+6fb9, U+6fc1-6fcb, U+6fd1-6fd3, U+6fd5, U+6fdb, U+6fde-6fe1, U+6fe4, U+6fe9, U+6feb-6fec, U+6fee-6ff1, U+6ffa, U+6ffe;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-59.woff2) format('woff2');unicode-range:U+6dc3, U+6dc5-6dc6, U+6dc9, U+6dcc, U+6dcf, U+6dd2-6dd3, U+6dd6, U+6dd9-6dde, U+6de0, U+6de4, U+6de6, U+6de8-6dea, U+6dec, U+6def-6df0, U+6df5-6df6, U+6df8, U+6dfa, U+6dfc, U+6e03-6e04, U+6e07-6e09, U+6e0b-6e0c, U+6e0e, U+6e11, U+6e13, U+6e15-6e16, U+6e19-6e1b, U+6e1e-6e1f, U+6e22, U+6e25-6e27, U+6e2b-6e2c, U+6e36-6e37, U+6e39-6e3a, U+6e3c-6e41, U+6e44-6e45, U+6e47, U+6e49-6e4b, U+6e4d-6e4e, U+6e51, U+6e53-6e55, U+6e5c-6e5f, U+6e61-6e63, U+6e65-6e67, U+6e6a-6e6b, U+6e6d-6e70, U+6e72-6e74, U+6e76-6e78, U+6e7c, U+6e80-6e82, U+6e86-6e87, U+6e89, U+6e8d, U+6e8f, U+6e96, U+6e98, U+6e9d-6e9f, U+6ea1, U+6ea5-6ea7, U+6eab, U+6eb1-6eb2, U+6eb4, U+6eb7, U+6ebb-6ebd, U+6ebf-6ec6, U+6ec8-6ec9, U+6ecc, U+6ecf-6ed0, U+6ed3-6ed4, U+6ed7;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-60.woff2) format('woff2');unicode-range:U+6cb2, U+6cb4-6cb5, U+6cb7, U+6cba, U+6cbc-6cbd, U+6cc1-6cc3, U+6cc5-6cc7, U+6cd0-6cd4, U+6cd6-6cd7, U+6cd9-6cda, U+6cde-6ce0, U+6ce4, U+6ce6, U+6ce9, U+6ceb-6cef, U+6cf1-6cf2, U+6cf6-6cf7, U+6cfa, U+6cfe, U+6d03-6d05, U+6d07-6d08, U+6d0a, U+6d0c, U+6d0e-6d11, U+6d13-6d14, U+6d16, U+6d18-6d1a, U+6d1c, U+6d1f, U+6d22-6d23, U+6d26-6d29, U+6d2b, U+6d2e-6d30, U+6d33, U+6d35-6d36, U+6d38-6d3a, U+6d3c, U+6d3f, U+6d42-6d44, U+6d48-6d49, U+6d4d, U+6d50, U+6d52, U+6d54, U+6d56-6d58, U+6d5a-6d5c, U+6d5e, U+6d60-6d61, U+6d63-6d65, U+6d67, U+6d6c-6d6d, U+6d6f, U+6d75, U+6d7b-6d7d, U+6d87, U+6d8a, U+6d8e, U+6d90-6d9a, U+6d9c-6da0, U+6da2-6da3, U+6da7, U+6daa-6dac, U+6dae, U+6db3-6db4, U+6db6, U+6db8, U+6dbc, U+6dbf, U+6dc2;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-61.woff2) format('woff2');unicode-range:U+6b85-6b86, U+6b89, U+6b8d, U+6b91-6b93, U+6b95, U+6b97-6b98, U+6b9a-6b9b, U+6b9e, U+6ba1-6ba4, U+6ba9-6baa, U+6bad, U+6baf-6bb0, U+6bb2-6bb3, U+6bba-6bbd, U+6bc0, U+6bc2, U+6bc6, U+6bca-6bcc, U+6bce, U+6bd0-6bd1, U+6bd3, U+6bd6-6bd8, U+6bda, U+6be1, U+6be6, U+6bec, U+6bf1, U+6bf3-6bf5, U+6bf9, U+6bfd, U+6c05-6c08, U+6c0d, U+6c10, U+6c15-6c1a, U+6c21, U+6c23-6c26, U+6c29-6c2d, U+6c30-6c33, U+6c35-6c37, U+6c39-6c3a, U+6c3c-6c3f, U+6c46, U+6c4a-6c4c, U+6c4e-6c50, U+6c54, U+6c56, U+6c59-6c5c, U+6c5e, U+6c63, U+6c67-6c69, U+6c6b, U+6c6d, U+6c6f, U+6c72-6c74, U+6c78-6c7a, U+6c7c, U+6c84-6c87, U+6c8b-6c8c, U+6c8f, U+6c91, U+6c93-6c96, U+6c98, U+6c9a, U+6c9d, U+6ca2-6ca4, U+6ca8-6ca9, U+6cac-6cae, U+6cb1;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-62.woff2) format('woff2');unicode-range:U+6a01, U+6a06, U+6a09, U+6a0b, U+6a11, U+6a13, U+6a17-6a19, U+6a1b, U+6a1e, U+6a23, U+6a28-6a29, U+6a2b, U+6a2f-6a30, U+6a35, U+6a38-6a40, U+6a46-6a48, U+6a4a-6a4b, U+6a4e, U+6a50, U+6a52, U+6a5b, U+6a5e, U+6a62, U+6a65-6a67, U+6a6b, U+6a79, U+6a7c, U+6a7e-6a7f, U+6a84, U+6a86, U+6a8e, U+6a90-6a91, U+6a94, U+6a97, U+6a9c, U+6a9e, U+6aa0, U+6aa2, U+6aa4, U+6aa9, U+6aab, U+6aae-6ab0, U+6ab2-6ab3, U+6ab5, U+6ab7-6ab8, U+6aba-6abb, U+6abd, U+6abf, U+6ac2-6ac4, U+6ac6, U+6ac8, U+6acc, U+6ace, U+6ad2-6ad3, U+6ad8-6adc, U+6adf-6ae0, U+6ae4-6ae5, U+6ae7-6ae8, U+6afb, U+6b04-6b05, U+6b0d-6b13, U+6b16-6b17, U+6b19, U+6b24-6b25, U+6b2c, U+6b37-6b39, U+6b3b, U+6b3d, U+6b43, U+6b46, U+6b4e, U+6b50, U+6b53-6b54, U+6b58-6b59, U+6b5b, U+6b60, U+6b69, U+6b6d, U+6b6f-6b70, U+6b73-6b74, U+6b77-6b7a, U+6b80-6b84;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-63.woff2) format('woff2');unicode-range:U+68e1, U+68e3-68e4, U+68e6-68ed, U+68ef-68f0, U+68f2, U+68f4, U+68f6-68f7, U+68f9, U+68fb-68fd, U+68ff-6902, U+6906-6908, U+690b, U+6910, U+691a-691c, U+691f-6920, U+6924-6925, U+692a, U+692d, U+6934, U+6939, U+693c-6945, U+694a-694b, U+6952-6954, U+6957, U+6959, U+695b, U+695d, U+695f, U+6962-6964, U+6966, U+6968-696c, U+696e-696f, U+6971, U+6973-6974, U+6978-6979, U+697d, U+697f-6980, U+6985, U+6987-698a, U+698d-698e, U+6994-6999, U+699b, U+69a3-69a4, U+69a6-69a7, U+69ab, U+69ad-69ae, U+69b1, U+69b7, U+69bb-69bc, U+69c1, U+69c3-69c5, U+69c7, U+69ca-69ce, U+69d0-69d1, U+69d3-69d4, U+69d7-69da, U+69e0, U+69e4, U+69e6, U+69ec-69ed, U+69f1-69f3, U+69f8, U+69fa-69fc, U+69fe-6a00;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-64.woff2) format('woff2');unicode-range:U+6792-6793, U+6796, U+6798, U+679e-67a1, U+67a5, U+67a7-67a9, U+67ac-67ad, U+67b0-67b1, U+67b3, U+67b5, U+67b7, U+67b9, U+67bb-67bc, U+67c0-67c1, U+67c3, U+67c5-67ca, U+67d1-67d2, U+67d7-67d9, U+67dd-67df, U+67e2-67e4, U+67e6-67e9, U+67f0, U+67f5, U+67f7-67f8, U+67fa-67fb, U+67fd-67fe, U+6800-6801, U+6803-6804, U+6806, U+6809-680a, U+680c, U+680e, U+6812, U+681d-681f, U+6822, U+6824-6829, U+682b-682d, U+6831-6835, U+683b, U+683e, U+6840-6841, U+6844-6845, U+6849, U+684e, U+6853, U+6855-6856, U+685c-685d, U+685f-6862, U+6864, U+6866-6868, U+686b, U+686f, U+6872, U+6874, U+6877, U+687f, U+6883, U+6886, U+688f, U+689b, U+689f-68a0, U+68a2-68a3, U+68b1, U+68b6, U+68b9-68ba, U+68bc-68bf, U+68c1-68c4, U+68c6, U+68c8, U+68ca, U+68cc, U+68d0-68d1, U+68d3, U+68d7, U+68dd, U+68df;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-65.woff2) format('woff2');unicode-range:U+663a-663b, U+663d, U+6641, U+6644-6645, U+6649, U+664c, U+664f, U+6654, U+6659, U+665b, U+665d-665e, U+6660-6667, U+6669, U+666b-666c, U+6671, U+6673, U+6677-6679, U+667c, U+6680-6681, U+6684-6685, U+6688-6689, U+668b-668e, U+6690, U+6692, U+6695, U+6698, U+669a, U+669d, U+669f-66a0, U+66a2-66a3, U+66a6, U+66aa-66ab, U+66b1-66b2, U+66b5, U+66b8-66b9, U+66bb, U+66be, U+66c1, U+66c6-66c9, U+66cc, U+66d5-66d8, U+66da-66dc, U+66de-66e2, U+66e8-66ea, U+66ec, U+66f1, U+66f3, U+66f7, U+66fa, U+66fd, U+6702, U+6705, U+670a, U+670f-6710, U+6713, U+6715, U+6719, U+6722-6723, U+6725-6727, U+6729, U+672d-672e, U+6732-6733, U+6736, U+6739, U+673b, U+673f, U+6744, U+6748, U+674c-674d, U+6753, U+6755, U+6762, U+6767, U+6769-676c, U+676e, U+6772-6773, U+6775, U+6777, U+677a-677d, U+6782-6783, U+6787, U+678a-678d, U+678f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-66.woff2) format('woff2');unicode-range:U+64f8, U+64fa, U+64fc, U+64fe-64ff, U+6503, U+6509, U+650f, U+6514, U+6518, U+651c-651e, U+6522-6525, U+652a-652c, U+652e, U+6530-6532, U+6534-6535, U+6537-6538, U+653a, U+653c-653d, U+6542, U+6549-654b, U+654d-654e, U+6553-6555, U+6557-6558, U+655d, U+6564, U+6569, U+656b, U+656d-656f, U+6571, U+6573, U+6575-6576, U+6578-657e, U+6581-6583, U+6585-6586, U+6589, U+658e-658f, U+6592-6593, U+6595-6596, U+659b, U+659d, U+659f-65a1, U+65a3, U+65ab-65ac, U+65b2, U+65b6-65b7, U+65ba-65bb, U+65be-65c0, U+65c2-65c4, U+65c6-65c8, U+65cc, U+65ce, U+65d0, U+65d2-65d3, U+65d6, U+65db, U+65dd, U+65e1, U+65e3, U+65ee-65f0, U+65f3-65f5, U+65f8, U+65fb-65fc, U+65fe-6600, U+6603, U+6607, U+6609, U+660b, U+6610-6611, U+6619-661a, U+661c-661e, U+6621, U+6624, U+6626, U+662a-662c, U+662e, U+6630-6631, U+6633-6634, U+6636;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-67.woff2) format('woff2');unicode-range:U+63bc, U+63be, U+63c0, U+63c3-63c4, U+63c6, U+63c8, U+63cd-63ce, U+63d1, U+63d6, U+63da-63db, U+63de, U+63e0, U+63e3, U+63e9-63ea, U+63ee, U+63f2, U+63f5-63fa, U+63fc, U+63fe-6400, U+6406, U+640b-640d, U+6410, U+6414, U+6416-6417, U+641b, U+6420-6423, U+6425-6428, U+642a, U+6431-6432, U+6434-6437, U+643d-6442, U+6445, U+6448, U+6450-6452, U+645b-645f, U+6462, U+6465, U+6468, U+646d, U+646f-6471, U+6473, U+6477, U+6479-647d, U+6482-6485, U+6487-6488, U+648c, U+6490, U+6493, U+6496-649a, U+649d, U+64a0, U+64a5, U+64ab-64ac, U+64b1-64b7, U+64b9-64bb, U+64be-64c1, U+64c4, U+64c7, U+64c9-64cb, U+64d0, U+64d4, U+64d7-64d8, U+64da, U+64de, U+64e0-64e2, U+64e4, U+64e9, U+64ec, U+64f0-64f2, U+64f4, U+64f7;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-68.woff2) format('woff2');unicode-range:U+623b, U+623d-623e, U+6243, U+6246, U+6248-6249, U+624c, U+6255, U+6259, U+625e, U+6260-6261, U+6265-6266, U+626a, U+6271, U+627a, U+627c-627d, U+6283, U+6286, U+6289, U+628e, U+6294, U+629c, U+629e-629f, U+62a1, U+62a8, U+62ba-62bb, U+62bf, U+62c2, U+62c4, U+62c8, U+62ca-62cb, U+62ce-62cf, U+62d1, U+62d7, U+62d9-62da, U+62dd, U+62e0-62e1, U+62e3-62e4, U+62e7, U+62eb, U+62ee, U+62f0, U+62f4-62f6, U+6308, U+630a-630e, U+6310, U+6312-6313, U+6317, U+6319, U+631b, U+631d-631f, U+6322, U+6326, U+6329, U+6331-6332, U+6334-6337, U+6339, U+633b-633c, U+633e-6340, U+6343, U+6347, U+634b-634e, U+6354, U+635c-635d, U+6368-6369, U+636d, U+636f-6372, U+6376, U+637a-637b, U+637d, U+6382-6383, U+6387, U+638a-638b, U+638d-638e, U+6391, U+6393-6397, U+6399, U+639b, U+639e-639f, U+63a1, U+63a3-63a4, U+63ac-63ae, U+63b1-63b5, U+63b7-63bb;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-69.woff2) format('woff2');unicode-range:U+60fa, U+6100, U+6106, U+610d-610e, U+6112, U+6114-6115, U+6119, U+611c, U+6120, U+6122-6123, U+6126, U+6128-6130, U+6136-6137, U+613a, U+613d-613e, U+6144, U+6146-6147, U+614a-614b, U+6151, U+6153, U+6158, U+615a, U+615c-615d, U+615f, U+6161, U+6163-6165, U+616b-616c, U+616e, U+6171, U+6173-6177, U+617e, U+6182, U+6187, U+618a, U+618d-618e, U+6190-6191, U+6194, U+6199-619a, U+619c, U+619f, U+61a1, U+61a3-61a4, U+61a7-61a9, U+61ab-61ad, U+61b2-61b3, U+61b5-61b7, U+61ba-61bb, U+61bf, U+61c3-61c4, U+61c6-61c7, U+61c9-61cb, U+61d0-61d1, U+61d3-61d4, U+61d7, U+61da, U+61df-61e1, U+61e6, U+61ee, U+61f0, U+61f2, U+61f6-61f8, U+61fa, U+61fc-61fe, U+6200, U+6206-6207, U+6209, U+620b, U+620d-620e, U+6213-6215, U+6217, U+6219, U+621b-6223, U+6225-6226, U+622c, U+622e-6230, U+6232, U+6238;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-70.woff2) format('woff2');unicode-range:U+5fd1-5fd6, U+5fda-5fde, U+5fe1-5fe2, U+5fe4-5fe5, U+5fea, U+5fed-5fee, U+5ff1-5ff3, U+5ff6, U+5ff8, U+5ffb, U+5ffe-5fff, U+6002-6006, U+600a, U+600d, U+600f, U+6014, U+6019, U+601b, U+6020, U+6023, U+6026, U+6029, U+602b, U+602e-602f, U+6031, U+6033, U+6035, U+6039, U+603f, U+6041-6043, U+6046, U+604f, U+6053-6054, U+6058-605b, U+605d-605e, U+6060, U+6063, U+6065, U+6067, U+606a-606c, U+6075, U+6078-6079, U+607b, U+607d, U+607f, U+6083, U+6085-6087, U+608a, U+608c, U+608e-608f, U+6092-6093, U+6095-6097, U+609b-609d, U+60a2, U+60a7, U+60a9-60ab, U+60ad, U+60af-60b1, U+60b3-60b6, U+60b8, U+60bb, U+60bd-60be, U+60c0-60c3, U+60c6-60c9, U+60cb, U+60ce, U+60d3-60d4, U+60d7-60db, U+60dd, U+60e1-60e4, U+60e6, U+60ea, U+60ec-60ee, U+60f0-60f1, U+60f4, U+60f6;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-71.woff2) format('woff2');unicode-range:U+5ea3-5ea5, U+5ea8, U+5eab, U+5eaf, U+5eb3, U+5eb5-5eb6, U+5eb9, U+5ebe, U+5ec1-5ec3, U+5ec6, U+5ec8, U+5ecb-5ecc, U+5ed1-5ed2, U+5ed4, U+5ed9-5edb, U+5edd, U+5edf-5ee0, U+5ee2-5ee3, U+5ee8, U+5eea, U+5eec, U+5eef-5ef0, U+5ef3-5ef4, U+5ef8, U+5efb-5efc, U+5efe-5eff, U+5f01, U+5f07, U+5f0b-5f0e, U+5f10-5f12, U+5f14, U+5f1a, U+5f22, U+5f28-5f29, U+5f2c-5f2d, U+5f35-5f36, U+5f38, U+5f3b-5f43, U+5f45-5f4a, U+5f4c-5f4e, U+5f50, U+5f54, U+5f56-5f59, U+5f5b-5f5f, U+5f61, U+5f63, U+5f65, U+5f67-5f68, U+5f6b, U+5f6e-5f6f, U+5f72-5f78, U+5f7a, U+5f7e-5f7f, U+5f82-5f83, U+5f87, U+5f89-5f8a, U+5f8d, U+5f91, U+5f93, U+5f95, U+5f98-5f99, U+5f9c, U+5f9e, U+5fa0, U+5fa6-5fa9, U+5fac-5fad, U+5faf, U+5fb3-5fb5, U+5fb9, U+5fbc, U+5fc4, U+5fc9, U+5fcb, U+5fce-5fd0;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-72.woff2) format('woff2');unicode-range:U+5d32-5d34, U+5d3c-5d3e, U+5d41-5d44, U+5d46-5d48, U+5d4a-5d4b, U+5d4e, U+5d50, U+5d52, U+5d55-5d58, U+5d5a-5d5d, U+5d68-5d69, U+5d6b-5d6c, U+5d6f, U+5d74, U+5d7f, U+5d82-5d89, U+5d8b-5d8c, U+5d8f, U+5d92-5d93, U+5d99, U+5d9d, U+5db2, U+5db6-5db7, U+5dba, U+5dbc-5dbd, U+5dc2-5dc3, U+5dc6-5dc7, U+5dc9, U+5dcc, U+5dd2, U+5dd4, U+5dd6-5dd8, U+5ddb-5ddc, U+5de3, U+5ded, U+5def, U+5df3, U+5df6, U+5dfa-5dfd, U+5dff-5e00, U+5e07, U+5e0f, U+5e11, U+5e13-5e14, U+5e19-5e1b, U+5e22, U+5e25, U+5e28, U+5e2a, U+5e2f-5e31, U+5e33-5e34, U+5e36, U+5e39-5e3c, U+5e3e, U+5e40, U+5e44, U+5e46-5e48, U+5e4c, U+5e4f, U+5e53-5e54, U+5e57, U+5e59, U+5e5b, U+5e5e-5e5f, U+5e61, U+5e63, U+5e6a-5e6b, U+5e75, U+5e77, U+5e79-5e7a, U+5e7e, U+5e80-5e81, U+5e83, U+5e85, U+5e87, U+5e8b, U+5e91-5e92, U+5e96, U+5e98, U+5e9b, U+5e9d, U+5ea0-5ea2;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-73.woff2) format('woff2');unicode-range:U+5bf5-5bf6, U+5bfe, U+5c02-5c03, U+5c05, U+5c07-5c09, U+5c0b-5c0c, U+5c0e, U+5c10, U+5c12-5c13, U+5c15, U+5c17, U+5c19, U+5c1b-5c1c, U+5c1e-5c1f, U+5c22, U+5c25, U+5c28, U+5c2a-5c2b, U+5c2f-5c30, U+5c37, U+5c3b, U+5c43-5c44, U+5c46-5c47, U+5c4d, U+5c50, U+5c59, U+5c5b-5c5c, U+5c62-5c64, U+5c66, U+5c6c, U+5c6e, U+5c74, U+5c78-5c7e, U+5c80, U+5c83-5c84, U+5c88, U+5c8b-5c8d, U+5c91, U+5c94-5c96, U+5c98-5c99, U+5c9c, U+5c9e, U+5ca1-5ca3, U+5cab-5cac, U+5cb1, U+5cb5, U+5cb7, U+5cba, U+5cbd-5cbf, U+5cc1, U+5cc3-5cc4, U+5cc7, U+5ccb, U+5cd2, U+5cd8-5cd9, U+5cdf-5ce0, U+5ce3-5ce6, U+5ce8-5cea, U+5ced, U+5cef, U+5cf3-5cf4, U+5cf6, U+5cf8, U+5cfd, U+5d00-5d04, U+5d06, U+5d08, U+5d0b-5d0d, U+5d0f-5d13, U+5d15, U+5d17-5d1a, U+5d1d-5d22, U+5d24-5d27, U+5d2e-5d31;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-74.woff2) format('woff2');unicode-range:U+5ab2, U+5ab4-5ab5, U+5ab7-5aba, U+5abd-5abf, U+5ac3-5ac4, U+5ac6-5ac8, U+5aca-5acb, U+5acd, U+5acf-5ad2, U+5ad4, U+5ad8-5ada, U+5adc, U+5adf-5ae2, U+5ae4, U+5ae6, U+5ae8, U+5aea-5aed, U+5af0-5af3, U+5af5, U+5af9-5afb, U+5afd, U+5b01, U+5b05, U+5b08, U+5b0b-5b0c, U+5b11, U+5b16-5b17, U+5b1b, U+5b21-5b22, U+5b24, U+5b27-5b2e, U+5b30, U+5b32, U+5b34, U+5b36-5b38, U+5b3e-5b40, U+5b43, U+5b45, U+5b4a-5b4b, U+5b51-5b53, U+5b56, U+5b5a-5b5b, U+5b62, U+5b65, U+5b67, U+5b6a-5b6e, U+5b70-5b71, U+5b73, U+5b7a-5b7b, U+5b7f-5b80, U+5b84, U+5b8d, U+5b91, U+5b93-5b95, U+5b9f, U+5ba5-5ba6, U+5bac, U+5bae, U+5bb8, U+5bc0, U+5bc3, U+5bcb, U+5bd0-5bd1, U+5bd4-5bd8, U+5bda-5bdc, U+5be2, U+5be4-5be7, U+5be9, U+5beb-5bec, U+5bee-5bf0, U+5bf2-5bf3;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-75.woff2) format('woff2');unicode-range:U+5981, U+598f, U+5997-5998, U+599a, U+599c-599d, U+59a0-59a1, U+59a3-59a4, U+59a7, U+59aa-59ad, U+59af, U+59b2-59b3, U+59b5-59b6, U+59b8, U+59ba, U+59bd-59be, U+59c0-59c1, U+59c3-59c4, U+59c7-59ca, U+59cc-59cd, U+59cf, U+59d2, U+59d5-59d6, U+59d8-59d9, U+59db, U+59dd-59e0, U+59e2-59e7, U+59e9-59eb, U+59ee, U+59f1, U+59f3, U+59f5, U+59f7-59f9, U+59fd, U+5a06, U+5a08-5a0a, U+5a0c-5a0d, U+5a11-5a13, U+5a15-5a16, U+5a1a-5a1b, U+5a21-5a23, U+5a2d-5a2f, U+5a32, U+5a38, U+5a3c, U+5a3e-5a45, U+5a47, U+5a4a, U+5a4c-5a4d, U+5a4f-5a51, U+5a53, U+5a55-5a57, U+5a5e, U+5a60, U+5a62, U+5a65-5a67, U+5a6a, U+5a6c-5a6d, U+5a72-5a73, U+5a75-5a76, U+5a79-5a7c, U+5a81-5a84, U+5a8c, U+5a8e, U+5a93, U+5a96-5a97, U+5a9c, U+5a9e, U+5aa0, U+5aa3-5aa4, U+5aaa, U+5aae-5aaf, U+5ab1;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-76.woff2) format('woff2');unicode-range:U+5831, U+583a, U+583d, U+583f-5842, U+5844-5846, U+5848, U+584a, U+584d, U+5852, U+5857, U+5859-585a, U+585c-585d, U+5862, U+5868-5869, U+586c-586d, U+586f-5873, U+5875, U+5879, U+587d-587e, U+5880-5881, U+5888-588a, U+588d, U+5892, U+5896-5898, U+589a, U+589c-589d, U+58a0-58a1, U+58a3, U+58a6, U+58a9, U+58ab-58ae, U+58b0, U+58b3, U+58bb-58bf, U+58c2-58c3, U+58c5-58c8, U+58ca, U+58cc, U+58ce, U+58d1-58d3, U+58d5, U+58d8-58d9, U+58de-58df, U+58e2, U+58e9, U+58ec, U+58ef, U+58f1-58f2, U+58f5, U+58f7-58f8, U+58fa, U+58fd, U+5900, U+5902, U+5906, U+5908-590c, U+590e, U+5910, U+5914, U+5919, U+591b, U+591d-591e, U+5920, U+5922-5925, U+5928, U+592c-592d, U+592f, U+5932, U+5936, U+593c, U+593e, U+5940-5942, U+5944, U+594c-594d, U+5950, U+5953, U+5958, U+595a, U+5961, U+5966-5968, U+596a, U+596c-596e, U+5977, U+597b-597c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-77.woff2) format('woff2');unicode-range:U+570a, U+570c-570d, U+570f, U+5712-5713, U+5718-5719, U+571c, U+571e, U+5725, U+5727, U+5729-572a, U+572c, U+572e-572f, U+5734-5735, U+5739, U+573b, U+5741, U+5743, U+5745, U+5749, U+574c-574d, U+575c, U+5763, U+5768-5769, U+576b, U+576d-576e, U+5770, U+5773, U+5775, U+5777, U+577b-577c, U+5785-5786, U+5788, U+578c, U+578e-578f, U+5793-5795, U+5799-57a1, U+57a3-57a4, U+57a6-57aa, U+57ac-57ad, U+57af-57b2, U+57b4-57b6, U+57b8-57b9, U+57bd-57bf, U+57c2, U+57c4-57c8, U+57cc-57cd, U+57cf, U+57d2, U+57d5-57de, U+57e1-57e2, U+57e4-57e5, U+57e7, U+57eb, U+57ed, U+57ef, U+57f4-57f8, U+57fc-57fd, U+5800-5801, U+5803, U+5805, U+5807, U+5809, U+580b-580e, U+5811, U+5814, U+5819, U+581b-5820, U+5822-5823, U+5825-5826, U+582c, U+582f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-78.woff2) format('woff2');unicode-range:U+5605-5606, U+5608, U+560c-560d, U+560f, U+5614, U+5616-5617, U+561a, U+561c, U+561e, U+5621-5625, U+5627, U+5629, U+562b-5630, U+5636, U+5638-563a, U+563c, U+5640-5642, U+5649, U+564c-5650, U+5653-5655, U+5657-565b, U+5660, U+5663-5664, U+5666, U+566b, U+566f-5671, U+5673-567c, U+567e, U+5684-5687, U+568c, U+568e-5693, U+5695, U+5697, U+569b-569c, U+569e-569f, U+56a1-56a2, U+56a4-56a9, U+56ac-56af, U+56b1, U+56b4, U+56b6-56b8, U+56bf, U+56c1-56c3, U+56c9, U+56cd, U+56d1, U+56d4, U+56d6-56d9, U+56dd, U+56df, U+56e1, U+56e3-56e6, U+56e8-56ec, U+56ee-56ef, U+56f1-56f3, U+56f5, U+56f7-56f9, U+56fc, U+56ff-5700, U+5703-5704, U+5709;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-79.woff2) format('woff2');unicode-range:U+5519, U+551b, U+551d-551e, U+5520, U+5522-5523, U+5526-5527, U+552a-552c, U+5530, U+5532-5535, U+5537-5538, U+553b-5541, U+5543-5544, U+5547-5549, U+554b, U+554d, U+5550, U+5553, U+5555-5558, U+555b-555f, U+5567-5569, U+556b-5572, U+5574-5577, U+557b-557c, U+557e-557f, U+5581, U+5583, U+5585-5586, U+5588, U+558b-558c, U+558e-5591, U+5593, U+5599-559a, U+559f, U+55a5-55a6, U+55a8-55ac, U+55ae, U+55b0-55b3, U+55b6, U+55b9-55ba, U+55bc-55be, U+55c4, U+55c6-55c7, U+55c9, U+55cc-55d2, U+55d4-55db, U+55dd-55df, U+55e1, U+55e3-55e6, U+55ea-55ee, U+55f0-55f3, U+55f5-55f7, U+55fb, U+55fe, U+5600-5601;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-80.woff2) format('woff2');unicode-range:U+53fb-5400, U+5402, U+5405-5407, U+540b, U+540f, U+5412, U+5414, U+5416, U+5418-541a, U+541d, U+5420-5423, U+5425, U+5429-542a, U+542d-542e, U+5431-5433, U+5436, U+543d, U+543f, U+5442-5443, U+5449, U+544b-544c, U+544e, U+5451-5454, U+5456, U+5459, U+545b-545c, U+5461, U+5463-5464, U+546a-5472, U+5474, U+5476-5478, U+547a, U+547e-5484, U+5486, U+548a, U+548d-548e, U+5490-5491, U+5494, U+5497-5499, U+549b, U+549d, U+54a1-54a7, U+54a9, U+54ab, U+54ad, U+54b4-54b5, U+54b9, U+54bb, U+54be-54bf, U+54c2-54c3, U+54c9-54cc, U+54cf-54d0, U+54d3, U+54d5-54d6, U+54d9-54da, U+54dc-54de, U+54e2, U+54e7, U+54f3-54f4, U+54f8-54f9, U+54fd-54ff, U+5501, U+5504-5506, U+550c-550f, U+5511-5514, U+5516-5517;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-81.woff2) format('woff2');unicode-range:U+52a2, U+52a6-52a7, U+52ac-52ad, U+52af, U+52b4-52b5, U+52b9, U+52bb-52bc, U+52be, U+52c1, U+52c5, U+52ca, U+52cd, U+52d0, U+52d6-52d7, U+52d9, U+52db, U+52dd-52de, U+52e0, U+52e2-52e3, U+52e5, U+52e7-52f0, U+52f2-52f3, U+52f5-52f9, U+52fb-52fc, U+5302, U+5304, U+530b, U+530d, U+530f-5310, U+5315, U+531a, U+531c-531d, U+5321, U+5323, U+5326, U+532e-5331, U+5338, U+533c-533e, U+5340, U+5344-5345, U+534b-534d, U+5350, U+5354, U+5358, U+535d-535f, U+5363, U+5368-5369, U+536c, U+536e-536f, U+5372, U+5379-537b, U+537d, U+538d-538e, U+5390, U+5393-5394, U+5396, U+539b-539d, U+53a0-53a1, U+53a3-53a5, U+53a9, U+53ad-53ae, U+53b0, U+53b2-53b3, U+53b5-53b8, U+53bc, U+53be, U+53c1, U+53c3-53c7, U+53ce-53cf, U+53d2-53d3, U+53d5, U+53da, U+53de-53df, U+53e1-53e2, U+53e7-53e9, U+53f1, U+53f4-53f5, U+53fa;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-82.woff2) format('woff2');unicode-range:U+5110, U+5113, U+5115, U+5117-5118, U+511a-511c, U+511e-511f, U+5121, U+5128, U+512b-512d, U+5131-5135, U+5137-5139, U+513c, U+5140, U+5142, U+5147, U+514c, U+514e-5150, U+5155-5158, U+5162, U+5169, U+5172, U+517f, U+5181-5184, U+5186-5187, U+518b, U+518f, U+5191, U+5195-5197, U+519a, U+51a2-51a3, U+51a6-51ab, U+51ad-51ae, U+51b1, U+51b4, U+51bc-51bd, U+51bf, U+51c3, U+51c7-51c8, U+51ca-51cb, U+51cd-51ce, U+51d4, U+51d6, U+51db-51dc, U+51e6, U+51e8-51eb, U+51f1, U+51f5, U+51fc, U+51ff, U+5202, U+5205, U+5208, U+520b, U+520d-520e, U+5215-5216, U+5228, U+522a, U+522c-522d, U+5233, U+523c-523d, U+523f-5240, U+5245, U+5247, U+5249, U+524b-524c, U+524e, U+5250, U+525b-525f, U+5261, U+5263-5264, U+5270, U+5273, U+5275, U+5277, U+527d, U+527f, U+5281-5285, U+5287, U+5289, U+528b, U+528d, U+528f, U+5291-5293, U+529a;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-83.woff2) format('woff2');unicode-range:U+4fe3-4fe4, U+4fe6, U+4fe8, U+4feb-4fed, U+4ff3, U+4ff5-4ff6, U+4ff8, U+4ffe, U+5001, U+5005-5006, U+5009, U+500c, U+500f, U+5013-5018, U+501b-501e, U+5022-5025, U+5027-5028, U+502b-502e, U+5030, U+5033-5034, U+5036-5039, U+503b, U+5041-5043, U+5045-5046, U+5048-504a, U+504c-504e, U+5051, U+5053, U+5055-5057, U+505b, U+505e, U+5060, U+5062-5063, U+5067, U+506a, U+506c, U+5070-5072, U+5074-5075, U+5078, U+507b, U+507d-507e, U+5080, U+5088-5089, U+5091-5092, U+5095, U+5097-509e, U+50a2-50a3, U+50a5-50a7, U+50a9, U+50ad, U+50b3, U+50b5, U+50b7, U+50ba, U+50be, U+50c4-50c5, U+50c7, U+50ca, U+50cd, U+50d1, U+50d5-50d6, U+50da, U+50de, U+50e5-50e6, U+50ec-50ee, U+50f0-50f1, U+50f3, U+50f9-50fb, U+50fe-5102, U+5104, U+5106-5107, U+5109-510b, U+510d, U+510f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-84.woff2) format('woff2');unicode-range:U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0-4fd1, U+4fd3, U+4fda-4fdc, U+4fdf-4fe0, U+4fe2;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-85.woff2) format('woff2');unicode-range:U+3127-3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2-4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-86.woff2) format('woff2');unicode-range:U+279c, U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-87.woff2) format('woff2');unicode-range:U+2650-2655, U+2658, U+265a-265b, U+265d-265e, U+2660-266d, U+266f, U+267b, U+2688, U+2693-2696, U+2698-2699, U+269c, U+26a0-26a1, U+26a4, U+26aa-26ab, U+26bd-26be, U+26c4-26c5, U+26d4, U+26e9, U+26f0-26f1, U+26f3, U+26f5, U+26fd, U+2702, U+2704-2706, U+2708-270f, U+2712-2718, U+271a-271b, U+271d, U+271f, U+2721, U+2724-2730, U+2732-2734, U+273a, U+273d-2744, U+2747-2749, U+274c, U+274e-274f, U+2753-2757, U+275b, U+275d-275e, U+2763, U+2765-2767, U+276e-276f, U+2776-277e, U+2780-2782, U+278a-278c, U+278e, U+2794-2796;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-88.woff2) format('woff2');unicode-range:U+254b, U+2550-2551, U+2554, U+2557, U+255a-255b, U+255d, U+255f-2560, U+2562-2563, U+2565-2567, U+2569-256a, U+256c-2572, U+2579, U+2580-2595, U+25a1, U+25a3, U+25a9-25ad, U+25b0, U+25b3-25bb, U+25bd-25c2, U+25c4, U+25c8-25cb, U+25cd, U+25d0-25d1, U+25d4-25d5, U+25d8, U+25dc-25e6, U+25ea-25eb, U+25ef, U+25fe, U+2600-2604, U+2609, U+260e-260f, U+2611, U+2614-2615, U+2618, U+261a-2620, U+2622-2623, U+262a, U+262d-2630, U+2639-2640, U+2642, U+2648-264f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-89.woff2) format('woff2');unicode-range:U+23e9, U+23f0, U+23f3, U+2445, U+2449, U+2465-2471, U+2474-249b, U+24b8, U+24c2, U+24c7, U+24c9, U+24d0, U+24d2, U+24d4, U+24d8, U+24dd-24de, U+24e3, U+24e6, U+24e8, U+2500-2509, U+250b-2526, U+2528-2534, U+2536-2537, U+253b-2548, U+254a;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-90.woff2) format('woff2');unicode-range:U+207b-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-91.woff2) format('woff2');unicode-range:U+1d34-1d35, U+1d38-1d3a, U+1d3c, U+1d3f-1d40, U+1d49, U+1d4e-1d4f, U+1d52, U+1d55, U+1d5b, U+1d5e, U+1d9c, U+1da0, U+1dc4-1dc5, U+1e69, U+1e73, U+1ea0-1ea9, U+1eab-1ead, U+1eaf, U+1eb1, U+1eb3, U+1eb5, U+1eb7, U+1eb9, U+1ebb, U+1ebd-1ebe, U+1ec0-1ec3, U+1ec5-1ec6, U+1ec9-1ecd, U+1ecf-1ed3, U+1ed5, U+1ed7-1edf, U+1ee1, U+1ee3, U+1ee5-1eeb, U+1eed, U+1eef-1ef1, U+1ef3, U+1ef7, U+1ef9, U+1f62, U+1f7b, U+2001-2002, U+2004-2006, U+2009-200a, U+200c-2012, U+2015-2016, U+201a, U+201e-2021, U+2023, U+2025, U+2027-2028, U+202a-202d, U+202f-2030, U+2032-2033, U+2035, U+2038, U+203c, U+203e-203f, U+2043-2044, U+2049, U+204d-204e, U+2060-2061, U+2070, U+2074-2078, U+207a;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-97.woff2) format('woff2');unicode-range:U+2ae-2b3, U+2b5-2bf, U+2c2-2c3, U+2c6-2d1, U+2d8-2da, U+2dc, U+2e1-2e3, U+2e5, U+2eb, U+2ee-2f0, U+2f2-2f7, U+2f9-2ff, U+302-30d, U+311, U+31b, U+321-325, U+327-329, U+32b-32c, U+32e-32f, U+331-339, U+33c-33d, U+33f, U+348, U+352, U+35c, U+35e-35f, U+361, U+363, U+368, U+36c, U+36f, U+530-540, U+55d-55e, U+561, U+563, U+565, U+56b, U+56e-579;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-98.woff2) format('woff2');unicode-range:U+176-17f, U+192, U+194, U+19a-19b, U+19d, U+1a0-1a1, U+1a3-1a4, U+1aa, U+1ac-1ad, U+1af-1bf, U+1d2, U+1d4, U+1d6, U+1d8, U+1da, U+1dc, U+1e3, U+1e7, U+1e9, U+1ee, U+1f0-1f1, U+1f3, U+1f5-1ff, U+219-21b, U+221, U+223-226, U+228, U+22b, U+22f, U+231, U+234-237, U+23a-23b, U+23d, U+250-252, U+254-255, U+259-25e, U+261-263, U+265, U+268, U+26a-26b, U+26f-277, U+279, U+27b-280, U+282-283, U+285, U+28a, U+28c, U+28f, U+292, U+294-296, U+298-29a, U+29c, U+29f, U+2a1-2a4, U+2a6-2a7, U+2a9, U+2ab;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-99.woff2) format('woff2');unicode-range:U+a1-a4, U+a6-a8, U+aa, U+ac, U+af, U+b1, U+b3-b6, U+b8-ba, U+bc-d6, U+d8-de, U+e6, U+eb, U+ee-f0, U+f5, U+f7-f8, U+fb, U+fd-100, U+102, U+104-107, U+10d, U+10f-112, U+115, U+117, U+119, U+11b, U+11e-11f, U+121, U+123, U+125-127, U+129-12a, U+12d, U+12f-13f, U+141-142, U+144, U+146, U+14b-14c, U+14f-153, U+158-15b, U+15e-160, U+163-165, U+168-16a, U+16d-175;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-100.woff2) format('woff2');unicode-range:U+221a, U+2264, U+2464, U+25a0, U+3008, U+4e10, U+512a, U+5152, U+5201, U+5241, U+5352, U+549a, U+54b2, U+54c6, U+54d7, U+54e1, U+5509, U+55c5, U+560e, U+5618, U+565c, U+56bc, U+5716, U+576f, U+5784, U+57a2, U+589f, U+5a20, U+5a25, U+5a29, U+5a34, U+5a7f, U+5ac9, U+5ad6, U+5b09, U+5b5c, U+5bc7, U+5c27, U+5d2d, U+5dcd, U+5f1b, U+5f37, U+604d, U+6055, U+6073, U+60eb, U+61ff, U+620c, U+62c7, U+62ed, U+6320, U+6345, U+6390, U+63b0, U+64ae, U+64c2, U+64d2, U+6556, U+663c, U+667e, U+66d9, U+66f8, U+6756, U+6789, U+689d, U+68f1, U+695e, U+6975, U+6a1f, U+6b0a, U+6b61, U+6b87, U+6c5d, U+6c7e, U+6c92, U+6d31, U+6df9, U+6e0d, U+6e2d, U+6f3e, U+70b3, U+70bd, U+70ca, U+70e8, U+725f, U+72e9, U+733f, U+7396, U+739f, U+7459-745a, U+74a7, U+75a1, U+75f0, U+76cf, U+76d4, U+7729, U+77aa, U+77b0, U+77e3, U+780c, U+78d5, U+7941, U+7977, U+797a, U+79c3, U+7a20, U+7a92, U+7b71, U+7bf1, U+7c9f, U+7eb6, U+7eca, U+7ef7, U+7f07, U+7f09, U+7f15, U+7f81, U+7fb9, U+8038, U+8098, U+80b4, U+8110, U+814b-814c, U+816e, U+818a, U+8205, U+8235, U+828b, U+82a5, U+82b7, U+82d4, U+82db, U+82df, U+8317, U+8338, U+8385-8386, U+83c1, U+83cf, U+8537, U+853b, U+854a, U+8715, U+8783, U+892a, U+8a71, U+8aaa, U+8d58, U+8dbe, U+8f67, U+8fab, U+8fc4, U+8fe6, U+9023, U+9084, U+9091, U+916a, U+91c9, U+91dc, U+94b3, U+9502, U+9523, U+9551, U+956f, U+960e, U+962a, U+962e, U+9647, U+96f3, U+9739, U+97a0, U+97ed, U+983b, U+985e, U+988a, U+9a6f, U+9a8b, U+9ab7, U+9ac5, U+9e25, U+e608, U+ff06, U+ff14-ff16;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-101.woff2) format('woff2');unicode-range:U+161, U+926, U+928, U+939, U+93f-940, U+94d, U+e17, U+e22, U+e44, U+2463, U+25c7, U+25ce, U+2764, U+3009, U+3016-3017, U+4e4d, U+4e53, U+4f5a, U+4f70, U+4fae, U+4fd8, U+4ffa, U+5011, U+501a, U+516e, U+51c4, U+5225, U+5364, U+547b, U+5495, U+54e8, U+54ee, U+5594, U+55d3, U+55dc, U+55fd, U+5662, U+5669, U+566c, U+5742, U+5824, U+5834, U+598a, U+5992, U+59a9, U+5a04, U+5b75, U+5b7d, U+5bc5, U+5c49, U+5c90, U+5e1c, U+5e27, U+5e2b, U+5e37, U+5e90, U+618b, U+61f5, U+620a, U+6273, U+62f7, U+6342, U+6401-6402, U+6413, U+6512, U+655b, U+65a7, U+65f1, U+65f7, U+665f, U+6687, U+66a7, U+673d, U+67b8, U+6854, U+68d8, U+68fa, U+696d, U+6a02, U+6a0a, U+6a80, U+6b7c, U+6bd9, U+6c2e, U+6c76, U+6cf8, U+6d4a, U+6d85, U+6e24, U+6e32, U+6ec7, U+6ed5, U+6f88, U+700f, U+701a, U+7078, U+707c, U+70ac, U+70c1, U+7409, U+7422, U+7480, U+74a8, U+752b, U+7574, U+7656, U+7699, U+7737, U+785d, U+78be, U+79b9, U+7a3d, U+7a91, U+7a9f, U+7ae3, U+7b77, U+7c3f, U+7d1a, U+7d50, U+7d93, U+803f, U+8042, U+808b, U+8236, U+82b8-82b9, U+82ef, U+8309, U+836b, U+83ef, U+8431, U+85c9, U+865e, U+868c, U+8759, U+8760, U+8845, U+89ba, U+8a2a, U+8c41, U+8cec, U+8d2c, U+8d4e, U+8e66, U+8e6d, U+8eaf, U+902e, U+914b, U+916e, U+919b, U+949b, U+94a0, U+94b0, U+9541-9542, U+9556, U+95eb, U+95f5, U+964b, U+968b, U+96cc-96cd, U+96cf, U+9704, U+9713, U+9890, U+98a8, U+9985, U+9992, U+9a6d, U+9a81, U+9a86, U+9ab8, U+9ca4, U+9f9a, U+e606-e607, U+e60a, U+e60c, U+e60e, U+fe0f, U+ff02, U+ff1e, U+ff3d;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-102.woff2) format('woff2');unicode-range:U+10c, U+627-629, U+639, U+644, U+64a, U+203b, U+2265, U+2573, U+25b2, U+3448-3449, U+4e1e, U+4e5e, U+4f3a, U+4f5f, U+4fea, U+5026, U+508d, U+5189, U+5254, U+5288, U+52d8, U+52fa, U+5306, U+5308, U+5384, U+53ed, U+543c, U+5450, U+5455, U+5466, U+54c4, U+5578, U+55a7, U+561f, U+5631, U+572d, U+575f, U+57ae, U+57e0, U+5830, U+594e, U+5984, U+5993, U+5bdd, U+5c0d, U+5c7f, U+5c82, U+5e62, U+5ed3, U+5f08, U+607a, U+60bc, U+60df, U+625b, U+6292, U+62e2, U+6363, U+6467, U+6714, U+675e, U+6771, U+67a2, U+67ff, U+6805, U+6813, U+6869, U+68a7, U+68e0, U+6930, U+6986, U+69a8, U+69df, U+6a44, U+6a5f, U+6c13, U+6c1f, U+6c22, U+6c2f, U+6c40, U+6c81, U+6c9b, U+6ca5, U+6da4, U+6df3, U+6e85, U+6eba, U+6f13, U+6f33, U+6f62, U+715e, U+72c4, U+73d1, U+73fe, U+7405, U+7455, U+7487, U+7578, U+75a4, U+75eb, U+7693, U+7738, U+7741, U+776b, U+7792, U+77a7, U+77a9, U+77b3, U+788c, U+7984, U+79a7, U+79e4, U+7a1a, U+7a57, U+7aa6, U+7b0b, U+7b5d, U+7c27, U+7c7d, U+7caa, U+7cd9, U+7cef, U+7eda, U+7ede, U+7f24, U+8046, U+80fa, U+81b3, U+81fb, U+8207, U+8258, U+8335, U+8339, U+8354, U+840e, U+85b0, U+85fb, U+8695, U+86aa, U+8717, U+8749, U+874c, U+8996, U+89bd, U+89c5, U+8bdb, U+8bf5, U+8c5a, U+8d3f, U+8d9f, U+8e44, U+8fed, U+9005, U+9019, U+904e, U+9082, U+90af, U+90dd, U+90e1, U+90f8, U+9119, U+916f, U+9176, U+949e, U+94a7, U+94c2, U+9525, U+9580, U+95dc, U+96e2, U+96fb, U+9a7c, U+9a7f, U+9b41, U+9ca8, U+9cc4, U+9cde, U+9e92, U+9ede, U+e60b, U+e610, U+ff10, U+ff13, U+ff3b, U+f012b;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-103.woff2) format('woff2');unicode-range:U+60, U+631, U+2606, U+3014-3015, U+309c, U+33a1, U+4e52, U+4ec6, U+4f86, U+4f8d, U+4fde, U+4fef, U+500b, U+502a, U+515c, U+518a, U+51a5, U+51f3, U+5243, U+52c9, U+52d5, U+53a2, U+53ee, U+54ce, U+54fa, U+54fc, U+5580, U+5587, U+563f, U+56da, U+5792, U+5815, U+5960, U+59d7, U+5a1f, U+5b78, U+5b9b, U+5be1, U+5c4e, U+5c51, U+5c6f, U+5c9a, U+5cfb, U+5d16, U+5ed6, U+5f27, U+5f6a, U+5f6c, U+603c, U+609a, U+6168, U+61c8, U+6236, U+62d0, U+62f1, U+62fd, U+631a, U+6328, U+632b, U+6346, U+638f, U+63a0, U+63c9, U+655e, U+6590, U+6615, U+6627, U+66ae, U+66e6, U+66f0, U+6703, U+67da, U+67ec, U+6816, U+6893, U+68ad, U+68f5, U+6977, U+6984, U+69db, U+6b72, U+6bb7, U+6ce3, U+6cfb, U+6d47, U+6da1, U+6dc4, U+6e43, U+6eaf, U+6eff, U+6f8e, U+7011, U+7063, U+7076, U+7096, U+70ba, U+70db, U+70ef, U+7119-711a, U+7172, U+718f, U+7194, U+727a, U+72d9, U+72ed, U+7325, U+73ae, U+73ba, U+73c0, U+7410, U+7426, U+7554, U+7576, U+75ae, U+75b9, U+762b, U+766b, U+7682, U+7750, U+7779, U+7784, U+77eb, U+77ee, U+78f7, U+79e9, U+7a79, U+7b1b, U+7b28, U+7bf7, U+7db2, U+7ec5, U+7eee, U+7f14, U+7f1a, U+7fe1, U+8087, U+809b, U+8231, U+830e, U+835f, U+83e9, U+849c, U+851a, U+868a, U+8718, U+874e, U+8822, U+8910, U+8944, U+8a3b, U+8bb6, U+8bbc, U+8d50, U+8e72, U+8f9c, U+900d, U+904b, U+9063, U+90a2, U+90b9, U+94f2, U+952f, U+9576-9577, U+9593, U+95f8, U+961c, U+9631, U+969b, U+96a7, U+96c1, U+9716, U+9761, U+97ad, U+97e7, U+98a4, U+997a, U+9a73, U+9b44, U+9e3d, U+9ecf, U+9ed4, U+ff11-ff12, U+fffd;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-104.woff2) format('woff2');unicode-range:U+2003, U+2193, U+2462, U+4e19, U+4e2b, U+4e36, U+4ea8, U+4ed1, U+4ed7, U+4f51, U+4f63, U+4f83, U+50e7, U+5112, U+5167, U+51a4, U+51b6, U+5239, U+5265, U+532a, U+5351, U+537f, U+5401, U+548f, U+5492, U+54af, U+54b3, U+54bd, U+54d1, U+54df, U+554f, U+5564, U+5598, U+5632, U+56a3, U+56e7, U+574e, U+575d-575e, U+57d4, U+584c, U+58e4, U+5937, U+5955, U+5a05, U+5a49, U+5ac2, U+5bb0, U+5c39, U+5c61, U+5d0e, U+5de9, U+5e9a, U+5eb8, U+5f0a, U+5f13, U+5f8c, U+608d, U+611b, U+6127, U+62a0, U+634f, U+635e, U+63fd, U+6577, U+658b, U+65bc, U+660a, U+6643, U+6656, U+6760, U+67af, U+67c4, U+67e0, U+6817, U+68cd, U+690e, U+6960, U+69b4, U+6a71, U+6aac, U+6b67, U+6bb4, U+6c55, U+6c70, U+6c82, U+6ca6, U+6cb8, U+6cbe, U+6e9c, U+6ede, U+6ee5, U+6f4d, U+6f84, U+6f9c, U+7115, U+7121, U+722a, U+7261, U+7272, U+7280, U+72f8, U+7504, U+754f, U+75d8, U+767c, U+76ef, U+778e, U+77bb, U+77f6, U+786b, U+78b1, U+7948, U+7985, U+79be, U+7a83, U+7a8d, U+7eac, U+7eef, U+7ef8, U+7efd, U+7f00, U+803d, U+8086, U+810a, U+8165, U+819d, U+81a8, U+8214, U+829c, U+831c, U+8328, U+832b, U+8367, U+83e0, U+83f1, U+8403, U+846b, U+8475, U+84b2, U+8513, U+8574, U+85af, U+86d9, U+86db, U+8acb, U+8bbd, U+8be0-8be1, U+8c0e, U+8d29, U+8d63, U+8e81, U+8f7f, U+9032, U+9042, U+90b1, U+90b5, U+9165, U+9175, U+94a6, U+94c5, U+950c, U+9540, U+9610, U+9699, U+96c7, U+973e, U+978d, U+97ec, U+97f6, U+984c, U+987d, U+9882, U+9965, U+996a, U+9972, U+9a8f, U+9ad3, U+9ae6, U+9cb8, U+9edb, U+e600, U+e60f, U+e611, U+ff05, U+ff0b;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-105.woff2) format('woff2');unicode-range:U+5e, U+2190, U+250a, U+25bc, U+25cf, U+300f, U+4e56, U+4ea9, U+4f3d, U+4f6c, U+4f88, U+4fa8, U+4fcf, U+5029, U+5188, U+51f9, U+5203, U+524a, U+5256, U+529d, U+5375, U+53db, U+541f, U+5435, U+5457, U+548b, U+54b1, U+54c7, U+54d4, U+54e9, U+556a, U+5589, U+55bb, U+55e8, U+55ef, U+563b, U+566a, U+576a, U+58f9, U+598d, U+599e, U+59a8, U+5a9b, U+5ae3, U+5bde, U+5c4c, U+5c60, U+5d1b, U+5deb, U+5df7, U+5e18, U+5f26, U+5f64, U+601c, U+6084, U+60e9, U+614c, U+61be, U+6208, U+621a, U+6233, U+6254, U+62d8, U+62e6, U+62ef, U+6323, U+632a, U+633d, U+6361, U+6380, U+6405, U+640f, U+6614, U+6642, U+6657, U+67a3, U+6808, U+683d, U+6850, U+6897, U+68b3, U+68b5, U+68d5, U+6a58, U+6b47, U+6b6a, U+6c28, U+6c90, U+6ca7, U+6cf5, U+6d51, U+6da9, U+6dc7, U+6dd1, U+6e0a, U+6e5b, U+6f47, U+6f6d, U+70ad, U+70f9, U+710a, U+7130, U+71ac, U+745f, U+7476, U+7490, U+7529, U+7538, U+75d2, U+7696, U+76b1, U+76fc, U+777f, U+77dc, U+789f, U+795b, U+79bd, U+79c9, U+7a3b, U+7a46, U+7aa5, U+7ad6, U+7ca5, U+7cb9, U+7cdf, U+7d6e, U+7f06, U+7f38, U+7fa1, U+7fc1, U+8015, U+803b, U+80a2, U+80aa, U+8116, U+813e, U+82ad, U+82bd, U+8305, U+8346, U+846c, U+8549, U+859b, U+8611, U+8680, U+87f9, U+884d, U+8877, U+888d, U+88d4, U+898b, U+8a79, U+8a93, U+8c05, U+8c0d, U+8c26, U+8d1e, U+8d31, U+8d81, U+8e22, U+8f90, U+8f96, U+90ca, U+916c, U+917f, U+9187, U+918b, U+9499, U+94a9, U+9524, U+958b, U+9600, U+9640, U+96b6, U+96ef, U+98d9, U+9976, U+997f, U+9a74, U+9a84, U+9c8d, U+9e26, U+9e9f, U+ad6d, U+c5b4, U+d55c, U+ff0f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-106.woff2) format('woff2');unicode-range:U+b0, U+2191, U+2460-2461, U+25c6, U+300e, U+4e1b, U+4e7e, U+4ed5, U+4ef2, U+4f10, U+4f1e, U+4f50, U+4fa6, U+4faf, U+5021, U+50f5, U+5179, U+5180, U+51d1, U+522e, U+52a3, U+52c3, U+52cb, U+5300, U+5319, U+5320, U+5349, U+5395, U+53d9, U+541e, U+5428, U+543e, U+54c0, U+54d2, U+570b, U+5858, U+58f6, U+5974, U+59a5, U+59e8, U+59ec, U+5a36, U+5a9a, U+5ab3, U+5b99, U+5baa, U+5ce1, U+5d14, U+5d4c, U+5dc5, U+5de2, U+5e99, U+5e9e, U+5f18, U+5f66, U+5f70, U+6070, U+60d5, U+60e7, U+6101, U+611a, U+6241, U+6252, U+626f, U+6296, U+62bc, U+62cc, U+63a9, U+644a, U+6454, U+64a9, U+64b8, U+6500, U+6572, U+65a5, U+65a9, U+65ec, U+660f, U+6749, U+6795, U+67ab, U+68da, U+6912, U+6bbf, U+6bef, U+6cab, U+6cca, U+6ccc, U+6cfc, U+6d3d, U+6d78, U+6dee, U+6e17, U+6e34, U+6e83, U+6ea2, U+6eb6, U+6f20, U+6fa1, U+707f, U+70d8, U+70eb, U+714c, U+714e, U+7235, U+7239, U+73ca, U+743c, U+745c, U+7624, U+763e, U+76f2, U+77db, U+77e9, U+780d, U+7838, U+7845, U+78ca, U+796d, U+7a84, U+7aed, U+7b3c, U+7eb2, U+7f05, U+7f20, U+7f34, U+7f62, U+7fc5, U+7fd8, U+7ff0, U+800d, U+8036, U+80ba, U+80be, U+80c0-80c1, U+8155, U+817a, U+8180, U+81e3, U+8206, U+8247, U+8270, U+8299, U+8304, U+8393, U+83b9, U+83ca, U+840d, U+8427, U+8469, U+8471, U+84c4, U+84ec, U+853d, U+8681-8682, U+8721, U+8854, U+88d5, U+88f9, U+8bc0, U+8c0a, U+8c29, U+8c2d, U+8d41, U+8dea, U+8eb2, U+8f9f, U+903b, U+903e, U+9102, U+9493, U+94a5, U+94f8, U+95ef, U+95f7, U+9706, U+9709, U+9774, U+9887, U+98a0, U+9e64, U+9f9f, U+e601, U+e603;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-107.woff2) format('woff2');unicode-range:U+200b, U+2103, U+4e18, U+4e27-4e28, U+4e38, U+4e59, U+4e8f, U+4ead, U+4ec7, U+4fe9, U+503a, U+5085, U+5146, U+51af, U+51f8, U+52ab, U+5339, U+535c, U+5378, U+538c, U+5398, U+53f9, U+5415, U+5475, U+54aa, U+54ac, U+54b8, U+5582, U+5760, U+5764, U+57cb, U+5835, U+5885, U+5951, U+5983, U+59da, U+5a77, U+5b5d, U+5b5f, U+5bb5, U+5bc2, U+5be8, U+5bfa, U+5c2c, U+5c34, U+5c41, U+5c48, U+5c65, U+5cad, U+5e06, U+5e42, U+5ef7, U+5f17, U+5f25, U+5f6d, U+5f79, U+6028, U+6064, U+6068, U+606d, U+607c, U+6094, U+6109, U+6124, U+6247, U+626d, U+6291, U+629a, U+62ac, U+62b9, U+62fe, U+6324, U+6349, U+6367, U+6398, U+6495, U+64a4, U+64b0, U+64bc, U+64ce, U+658c, U+65ed, U+6602, U+6674, U+6691, U+66a8, U+674f, U+679a, U+67ef, U+67f4, U+680b, U+6876, U+68a8, U+6a59, U+6a61, U+6b20, U+6bc5, U+6d12, U+6d46, U+6d8c, U+6dc0, U+6e14, U+6e23, U+6f06, U+7164, U+716e, U+7199, U+71e5, U+72ac, U+742a, U+755c, U+75ab, U+75b2, U+75f4, U+7897, U+78b3, U+78c5, U+7978, U+79fd, U+7a74, U+7b4b, U+7b5b, U+7ece, U+7ed2, U+7ee3, U+7ef3, U+7f50, U+7f55, U+7f9e, U+7fe0, U+809d, U+8106, U+814a, U+8154, U+817b, U+818f, U+81c2, U+81ed, U+821f, U+82a6, U+82d1, U+8302, U+83c7, U+845b, U+848b, U+84c9, U+85e4, U+86ee, U+8700, U+8774, U+886c, U+8881, U+8c1c, U+8c79, U+8d2a, U+8d3c, U+8eba, U+8f70, U+8fa9, U+8fb1, U+900a, U+9017, U+901d, U+9022, U+906e, U+946b, U+94dd, U+94ed, U+953b, U+95fa, U+95fd, U+964c, U+96c0, U+971c, U+971e, U+9753, U+9756, U+97e6, U+9881, U+9b4f, U+9e2d, U+9f0e, U+e602, U+e604-e605, U+ff5c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-108.woff2) format('woff2');unicode-range:U+24, U+4e08, U+4e43, U+4e4f, U+4ef0, U+4f2a, U+507f, U+50ac, U+50bb, U+5151, U+51bb, U+51f6, U+51fd, U+5272, U+52fe, U+5362, U+53c9, U+53d4, U+53e0, U+543b, U+54f2, U+5507, U+5524, U+558a, U+55b5, U+561b, U+56ca, U+5782, U+57c3, U+5893, U+5915, U+5949, U+5962, U+59ae, U+59dc, U+59fb, U+5bd3, U+5c38, U+5cb3, U+5d07, U+5d29, U+5de1, U+5dfe, U+5e15, U+5eca, U+5f2f, U+5f7c, U+5fcc, U+6021, U+609f, U+60f9, U+6108, U+6148, U+6155, U+6170, U+61d2, U+6251, U+629b, U+62ab, U+62e8, U+62f3, U+6321, U+6350, U+6566, U+659c, U+65e8, U+6635, U+6655, U+6670, U+66f9, U+6734, U+679d, U+6851, U+6905, U+6b49, U+6b96, U+6c1b, U+6c41, U+6c6a, U+6c83, U+6cf3, U+6d9b, U+6dcb, U+6e1d, U+6e20-6e21, U+6eaa, U+6ee4, U+6ee9, U+6f58, U+70e4, U+722c, U+7262, U+7267, U+72b9, U+72e0, U+72ee, U+72f1, U+7334, U+73ab, U+7433, U+7470, U+758f, U+75d5, U+764c, U+7686, U+76c6, U+76fe, U+7720, U+77e2, U+7802, U+7816, U+788d, U+7891, U+7a00, U+7a9d, U+7b52, U+7bad, U+7c98, U+7cca, U+7eba, U+7eea, U+7ef5, U+7f1d, U+7f69, U+806a, U+809a, U+80bf, U+80c3, U+81c0, U+820c, U+82ac, U+82af, U+82cd, U+82d7, U+838e, U+839e, U+8404, U+84b8, U+852c, U+8587, U+85aa, U+8650, U+8679, U+86c7, U+8702, U+87ba, U+886b, U+8870, U+8c10, U+8c23, U+8c6b, U+8d3e, U+8d4b-8d4c, U+8d64, U+8d6b, U+8d74, U+8e29, U+8f69, U+8f74, U+8fb0, U+8fdf, U+901b, U+9038, U+9093, U+90aa, U+9171, U+9489, U+94ae, U+94c3, U+9508, U+9510, U+9601, U+9614, U+9675, U+97f5, U+9888, U+98d8, U+9971, U+9aa4, U+9e3f, U+9e45, U+9e4f, U+9e70, U+9f7f, U+e715;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-109.woff2) format('woff2');unicode-range:U+a5, U+2022, U+2192, U+2605, U+4e11, U+4e22, U+4e32, U+4f0d, U+4f0f, U+4f69, U+4ff1, U+50b2, U+5154, U+51dd, U+51f0, U+5211, U+5269, U+533f, U+5366-5367, U+5389, U+5413, U+5440, U+5446, U+5561, U+574a, U+5751, U+57ab, U+5806, U+5821, U+582a, U+58f3, U+5938, U+5948, U+5978, U+59d1, U+5a03, U+5a07, U+5ac1, U+5acc, U+5ae9, U+5bb4, U+5bc4, U+5c3f, U+5e3d, U+5e7d, U+5f92, U+5faa, U+5fe0, U+5ffd, U+6016, U+60a0, U+60dc, U+60e8, U+614e, U+6212, U+6284, U+62c6, U+62d3-62d4, U+63f4, U+642c, U+6478, U+6491-6492, U+64e6, U+6591, U+65a4, U+664b, U+6735, U+6746, U+67f1, U+67f3, U+6842, U+68af, U+68c9, U+68cb, U+6a31, U+6b3a, U+6bc1, U+6c0f, U+6c27, U+6c57, U+6cc4, U+6ce5, U+6d2a, U+6d66, U+6d69, U+6daf, U+6e58, U+6ecb, U+6ef4, U+707e, U+7092, U+70ab, U+71d5, U+7275, U+7384, U+73b2, U+7434, U+74e6, U+74f7, U+75bc, U+76c8, U+76d0, U+7709, U+77ac, U+7855, U+78a7, U+78c1, U+7a77, U+7b79, U+7c92, U+7cae, U+7cd5, U+7ea4, U+7eb5, U+7ebd, U+7f5a, U+7fd4, U+7ffc, U+8083, U+8096, U+80a0, U+80d6, U+80de, U+8102, U+8109, U+810f, U+8179, U+8292, U+82b3, U+8352, U+8361, U+83cc, U+841d, U+8461, U+8482, U+8521, U+857e, U+866b, U+8776, U+8896, U+889c, U+88f8, U+8a9e, U+8bc8, U+8bf8, U+8c0b, U+8c28, U+8d2b, U+8d2f, U+8d37, U+8d3a, U+8d54, U+8dc3, U+8dcc, U+8df5, U+8e0f, U+8e48, U+8f86, U+8f88, U+8f9e, U+8fc1, U+8fc8, U+8feb, U+9065, U+90a6, U+90bb, U+90c1, U+94dc, U+9521, U+9676, U+96d5, U+970d, U+9897, U+997c, U+9a70, U+9a76, U+9a9a, U+9ad4, U+9e23, U+9e7f, U+9f3b, U+e675, U+e6b9, U+ffe5;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-110.woff2) format('woff2');unicode-range:U+300c-300d, U+4e54, U+4e58, U+4e95, U+4ec1, U+4f2f, U+4f38, U+4fa3, U+4fca, U+503e, U+5141, U+5144, U+517c, U+51cc, U+51ed, U+5242, U+52b2, U+52d2, U+52e4, U+540a, U+5439, U+5448, U+5496, U+54ed, U+5565, U+5761, U+5766, U+58ee, U+593a, U+594b, U+594f, U+5954, U+5996, U+59c6, U+59ff, U+5b64, U+5bff, U+5c18, U+5c1d, U+5c97, U+5ca9, U+5cb8, U+5e9f, U+5ec9, U+5f04, U+5f7b, U+5fa1, U+5fcd, U+6012, U+60a6, U+60ac, U+60b2, U+60ef, U+626e, U+6270, U+6276, U+62d6, U+62dc, U+6316, U+632f, U+633a, U+6355, U+63aa, U+6447, U+649e, U+64c5, U+654c, U+65c1, U+65cb, U+65e6, U+6606, U+6731, U+675c, U+67cf, U+67dc, U+6846, U+6b8b, U+6beb, U+6c61, U+6c88, U+6cbf, U+6cdb, U+6cea, U+6d45, U+6d53, U+6d74, U+6d82, U+6da8, U+6db5, U+6deb, U+6eda, U+6ee8, U+6f0f, U+706d, U+708e, U+70ae, U+70bc, U+70c2, U+70e6, U+7237-7238, U+72fc, U+730e, U+731b, U+739b, U+73bb, U+7483, U+74dc, U+74f6, U+7586, U+7626, U+775b, U+77ff, U+788e, U+78b0, U+7956, U+7965, U+79e6, U+7af9, U+7bee, U+7c97, U+7eb1, U+7eb7, U+7ed1, U+7ed5, U+7f6a, U+7f72, U+7fbd, U+8017, U+808c, U+80a9, U+80c6, U+80ce, U+8150, U+8170, U+819c, U+820d, U+8230, U+8239, U+827e, U+8377, U+8389, U+83b2, U+8428, U+8463, U+867e, U+88c2, U+88d9, U+8986, U+8bca, U+8bde, U+8c13, U+8c8c, U+8d21, U+8d24, U+8d56, U+8d60, U+8d8b, U+8db4, U+8e2a, U+8f68, U+8f89, U+8f9b, U+8fa8, U+8fbd, U+9003, U+90ce, U+90ed, U+9189, U+94bb, U+9505, U+95f9, U+963b, U+9655, U+966a, U+9677, U+96fe, U+9896, U+99a8, U+9a71, U+9a82, U+9a91, U+9b45, U+9ece, U+9f20, U+feff, U+ff0d;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-111.woff2) format('woff2');unicode-range:U+4e4c, U+4e88, U+4ea1, U+4ea6, U+4ed3-4ed4, U+4eff, U+4f30, U+4fa7, U+4fc4, U+4fd7, U+500d, U+504f, U+5076-5077, U+517d, U+5192, U+51c9, U+51ef, U+5238, U+5251, U+526a, U+52c7, U+52df, U+52ff, U+53a6, U+53a8, U+53ec, U+5410, U+559d, U+55b7, U+5634, U+573e, U+5783, U+585e, U+586b, U+58a8, U+5999, U+59d3, U+5a1c, U+5a46, U+5b54-5b55, U+5b85, U+5b8b, U+5b8f, U+5bbf, U+5bd2, U+5c16, U+5c24, U+5e05, U+5e45, U+5e7c, U+5e84, U+5f03, U+5f1f, U+5f31, U+5f84, U+5f90, U+5fbd, U+5fc6, U+5fd9, U+5fe7, U+6052, U+6062, U+6089, U+60a3, U+60d1, U+6167, U+622a, U+6234, U+624e, U+6269, U+626c, U+62b5, U+62d2, U+6325, U+63e1, U+643a, U+6446, U+6562, U+656c, U+65e2, U+65fa, U+660c, U+6628, U+6652, U+6668, U+6676, U+66fc, U+66ff, U+6717, U+676d, U+67aa, U+67d4, U+6843, U+6881, U+68d2, U+695a, U+69fd, U+6a2a, U+6b8a, U+6c60, U+6c64, U+6c9f, U+6caa, U+6cc9, U+6ce1, U+6cfd, U+6d1b, U+6d1e, U+6d6e, U+6de1, U+6e10, U+6e7f, U+6f5c, U+704c, U+7070, U+7089, U+70b8, U+718a, U+71c3, U+723d, U+732a, U+73cd, U+7518, U+756a, U+75af, U+75be, U+75c7, U+76d2, U+76d7, U+7763, U+78e8, U+795d, U+79df, U+7c4d, U+7d2f, U+7ee9, U+7f13, U+7f8a, U+8000, U+8010, U+80af, U+80f6, U+80f8, U+8212, U+8273, U+82f9, U+83ab, U+83b1, U+83f2, U+8584, U+871c, U+8861, U+888b, U+88c1, U+88e4, U+8bd1, U+8bf1, U+8c31, U+8d5a, U+8d75-8d76, U+8de8, U+8f85, U+8fa3, U+8fc5, U+9006, U+903c, U+904d, U+9075, U+9178, U+9274, U+950b, U+9526, U+95ea, U+9636, U+9686, U+978b, U+987f, U+9a7e, U+9b42, U+9e1f, U+9ea6, U+9f13, U+9f84, U+ff5e;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-112.woff2) format('woff2');unicode-range:U+23, U+3d, U+4e01, U+4e39, U+4e73, U+4ecd, U+4ed9, U+4eea, U+4f0a, U+4f1f, U+4f5b, U+4fa0, U+4fc3, U+501f, U+50a8, U+515a, U+5175, U+51a0, U+51c0, U+51e1, U+51e4, U+5200, U+520a, U+5224, U+523a, U+52aa, U+52b1, U+52b3, U+5348, U+5353, U+5360, U+5371, U+5377, U+539a, U+541b, U+5434, U+547c, U+54e6, U+5510, U+5531, U+5609, U+56f0, U+56fa, U+5733, U+574f, U+5851, U+5854, U+5899, U+58c1, U+592e, U+5939, U+5976, U+5986, U+59bb, U+5a18, U+5a74, U+5b59, U+5b87, U+5b97, U+5ba0, U+5bab, U+5bbd-5bbe, U+5bf8, U+5c0a, U+5c3a, U+5c4a, U+5e16, U+5e1d, U+5e2d, U+5e8a, U+6015, U+602a, U+6050, U+6069, U+6162, U+61c2, U+6293, U+6297, U+62b1, U+62bd, U+62df, U+62fc, U+6302, U+635f, U+638c, U+63ed, U+6458, U+6469, U+6563, U+6620, U+6653, U+6696-6697, U+66dd, U+675f, U+676f-6770, U+67d0, U+67d3, U+684c, U+6865, U+6885, U+68b0, U+68ee, U+690d, U+6b23, U+6b32, U+6bd5, U+6c89, U+6d01, U+6d25, U+6d89, U+6da6, U+6db2, U+6df7, U+6ed1, U+6f02, U+70c8, U+70df, U+70e7, U+7126, U+7236, U+7259, U+731c, U+745e, U+74e3, U+751a, U+751c, U+7532, U+7545, U+75db, U+7761, U+7a0d, U+7b51, U+7ca4, U+7cd6, U+7d2b, U+7ea0, U+7eb9, U+7ed8, U+7f18, U+7f29, U+8033, U+804a, U+80a4-80a5, U+80e1, U+817f, U+829d, U+82e6, U+8336, U+840c, U+8499, U+864e, U+8651, U+865a, U+88ad, U+89e6, U+8bd7, U+8bfa, U+8c37, U+8d25, U+8d38, U+8ddd, U+8fea, U+9010, U+9012, U+906d, U+907f-9080, U+90d1, U+9177, U+91ca, U+94fa, U+9501, U+9634-9635, U+9694, U+9707, U+9738, U+9769, U+9a7b, U+9a97, U+9aa8, U+9b3c, U+9c81, U+9ed8;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-113.woff2) format('woff2');unicode-range:U+26, U+3c, U+d7, U+4e4e, U+4e61, U+4e71, U+4ebf, U+4ee4, U+4f26, U+5012, U+51ac, U+51b0, U+51b2, U+51b7, U+5218, U+521a, U+5220, U+5237, U+523b, U+526f, U+5385, U+53bf, U+53e5, U+53eb, U+53f3, U+53f6, U+5409, U+5438, U+54c8, U+54e5, U+552f, U+5584, U+5706, U+5723, U+5750, U+575a, U+5987-5988, U+59b9, U+59d0, U+59d4, U+5b88, U+5b9c, U+5bdf, U+5bfb, U+5c01, U+5c04, U+5c3e, U+5c4b, U+5c4f, U+5c9b, U+5cf0, U+5ddd, U+5de6, U+5de8, U+5e01, U+5e78, U+5e7b, U+5e9c, U+5ead, U+5ef6, U+5f39, U+5fd8, U+6000, U+6025, U+604b, U+6076, U+613f, U+6258, U+6263, U+6267, U+6298, U+62a2, U+62e5, U+62ec, U+6311, U+6377, U+6388-6389, U+63a2, U+63d2, U+641e, U+642d, U+654f, U+6551, U+6597, U+65cf, U+65d7, U+65e7, U+6682, U+66f2, U+671d, U+672b, U+6751, U+6768, U+6811, U+6863, U+6982, U+6bd2, U+6cf0, U+6d0b, U+6d17, U+6d59, U+6dd8, U+6dfb, U+6e7e, U+6f6e, U+6fb3, U+706f, U+719f, U+72af, U+72d0, U+72d7, U+732b, U+732e, U+7389, U+73e0, U+7530, U+7687, U+76d6, U+76db, U+7840, U+786c, U+79cb, U+79d2, U+7a0e, U+7a33, U+7a3f, U+7a97, U+7ade-7adf, U+7b26, U+7e41, U+7ec3, U+7f3a, U+8089, U+80dc, U+811a, U+8131, U+8138, U+821e, U+8349, U+83dc, U+8457, U+867d, U+86cb, U+8a89, U+8ba8, U+8bad, U+8bef, U+8bfe, U+8c6a, U+8d1d, U+8d4f, U+8d62, U+8dd1, U+8df3, U+8f6e, U+8ff9, U+900f, U+9014, U+9057, U+9192, U+91ce, U+9488, U+94a2, U+9547, U+955c, U+95f2, U+9644, U+964d, U+96c4-96c5, U+96e8, U+96f6-96f7, U+9732, U+9759, U+9760, U+987a, U+989c, U+9910, U+996d-996e, U+9b54, U+9e21, U+9ebb, U+9f50;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-114.woff2) format('woff2');unicode-range:U+7e, U+2026, U+4e03, U+4e25, U+4e30, U+4e34, U+4e45, U+4e5d, U+4e89, U+4eae, U+4ed8, U+4f11, U+4f19, U+4f24, U+4f34, U+4f59, U+4f73, U+4f9d, U+4fb5, U+5047, U+505c, U+5170, U+519c, U+51cf, U+5267, U+5356, U+5374, U+5382, U+538b, U+53e6, U+5426, U+542b, U+542f, U+5462, U+5473, U+554a, U+5566, U+5708, U+571f, U+5757, U+57df, U+57f9, U+5802, U+590f, U+591c, U+591f, U+592b, U+5965, U+5979, U+5a01, U+5a5a, U+5b69, U+5b81, U+5ba1, U+5ba3, U+5c3c, U+5c42, U+5c81, U+5de7, U+5dee, U+5e0c, U+5e10, U+5e55, U+5e86, U+5e8f, U+5ea7, U+5f02, U+5f52, U+5f81, U+5ff5, U+60ca, U+60e0, U+6279, U+62c5, U+62ff, U+63cf, U+6444, U+64cd, U+653b, U+65bd, U+65e9, U+665a, U+66b4, U+66fe, U+6728, U+6740, U+6742, U+677e, U+67b6, U+680f, U+68a6, U+68c0, U+699c, U+6b4c, U+6b66, U+6b7b, U+6bcd, U+6bdb, U+6c38, U+6c47, U+6c49, U+6cb3, U+6cb9, U+6ce2, U+6d32, U+6d3e, U+6d4f, U+6e56, U+6fc0, U+7075, U+7206, U+725b, U+72c2, U+73ed, U+7565, U+7591, U+7597, U+75c5, U+76ae, U+76d1, U+76df, U+7834, U+7968, U+7981, U+79c0, U+7a7f, U+7a81, U+7ae5, U+7b14, U+7c89, U+7d27, U+7eaf, U+7eb3, U+7eb8, U+7ec7, U+7ee7, U+7eff, U+7f57, U+7ffb, U+805a, U+80a1, U+822c, U+82cf, U+82e5, U+8363, U+836f, U+84dd, U+878d, U+8840, U+8857, U+8863, U+8865, U+8b66, U+8bb2, U+8bda, U+8c01, U+8c08, U+8c46, U+8d1f, U+8d35, U+8d5b, U+8d5e, U+8da3, U+8ddf, U+8f93, U+8fdd, U+8ff0, U+8ff7, U+8ffd, U+9000, U+9047, U+9152, U+949f, U+94c1, U+94f6, U+9646, U+9648, U+9669, U+969c, U+96ea, U+97e9, U+987b, U+987e, U+989d, U+9970, U+9986, U+9c7c, U+9c9c;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-115.woff2) format('woff2');unicode-range:U+25, U+4e14, U+4e1d, U+4e3d, U+4e49, U+4e60, U+4e9a, U+4eb2, U+4ec5, U+4efd, U+4f3c, U+4f4f, U+4f8b, U+4fbf, U+5019, U+5145, U+514b, U+516b, U+516d, U+5174, U+5178, U+517b, U+5199, U+519b, U+51b3, U+51b5, U+5207, U+5212, U+5219, U+521d, U+52bf, U+533b, U+5343, U+5347, U+534a, U+536b, U+5370, U+53e4, U+53f2, U+5403, U+542c, U+547d, U+54a8, U+54cd, U+54ea, U+552e, U+56f4, U+5747, U+575b, U+5883, U+589e, U+5931, U+5947, U+5956-5957, U+5a92, U+5b63, U+5b83, U+5ba4, U+5bb3, U+5bcc, U+5c14, U+5c1a, U+5c3d, U+5c40, U+5c45, U+5c5e, U+5df4, U+5e72, U+5e95, U+5f80, U+5f85, U+5fb7, U+5fd7, U+601d, U+626b, U+627f, U+62c9, U+62cd, U+6309, U+63a7, U+6545, U+65ad, U+65af, U+65c5, U+666e, U+667a, U+670b, U+671b, U+674e, U+677f, U+6781, U+6790, U+6797, U+6821, U+6838-6839, U+697c, U+6b27, U+6b62, U+6bb5, U+6c7d, U+6c99, U+6d4e, U+6d6a, U+6e29, U+6e2f, U+6ee1, U+6f14, U+6f2b, U+72b6, U+72ec, U+7387, U+7533, U+753b, U+76ca, U+76d8, U+7701, U+773c, U+77ed, U+77f3, U+7814, U+793c, U+79bb, U+79c1, U+79d8, U+79ef, U+79fb, U+7a76, U+7b11, U+7b54, U+7b56, U+7b97, U+7bc7, U+7c73, U+7d20, U+7eaa, U+7ec8, U+7edd, U+7eed, U+7efc, U+7fa4, U+804c, U+8058, U+80cc, U+8111, U+817e, U+826f, U+8303, U+843d, U+89c9, U+89d2, U+8ba2, U+8bbf, U+8bc9, U+8bcd, U+8be6, U+8c22, U+8c61, U+8d22, U+8d26-8d27, U+8d8a, U+8f6f, U+8f7b, U+8f83, U+8f91, U+8fb9, U+8fd4, U+8fdc, U+9002, U+94b1, U+9519, U+95ed, U+961f, U+9632-9633, U+963f, U+968f-9690, U+96be, U+9876, U+9884, U+98de, U+9988, U+9999, U+9ec4, U+ff1b;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-116.woff2) format('woff2');unicode-range:U+2b, U+40, U+3000, U+300a-300b, U+4e16, U+4e66, U+4e70, U+4e91-4e92, U+4e94, U+4e9b, U+4ec0, U+4eca, U+4f01, U+4f17-4f18, U+4f46, U+4f4e, U+4f9b, U+4fee, U+503c, U+5065, U+50cf, U+513f, U+5148, U+518d, U+51c6, U+51e0, U+5217, U+529e-529f, U+5341, U+534f, U+5361, U+5386, U+53c2, U+53c8, U+53cc, U+53d7-53d8, U+5404, U+5411, U+5417, U+5427, U+5468, U+559c, U+5668, U+56e0, U+56e2, U+56ed, U+5740, U+57fa, U+58eb, U+5904, U+592a, U+59cb, U+5a31, U+5b58, U+5b9d, U+5bc6, U+5c71, U+5dde, U+5df1, U+5e08, U+5e26, U+5e2e, U+5e93, U+5e97, U+5eb7, U+5f15, U+5f20, U+5f3a, U+5f62, U+5f69, U+5f88, U+5f8b, U+5fc5, U+600e, U+620f, U+6218, U+623f, U+627e, U+628a, U+62a4, U+62db, U+62e9, U+6307, U+6362, U+636e, U+64ad, U+6539, U+653f, U+6548, U+6574, U+6613, U+6625, U+663e, U+666f, U+672a, U+6750, U+6784, U+6a21, U+6b3e, U+6b65, U+6bcf, U+6c11, U+6c5f, U+6d4b, U+6df1, U+706b, U+7167, U+724c, U+738b, U+73a9, U+73af, U+7403, U+7537, U+754c, U+7559, U+767d, U+7740, U+786e, U+795e, U+798f, U+79f0, U+7aef, U+7b7e, U+7bb1, U+7ea2, U+7ea6, U+7ec4, U+7ec6, U+7ecd, U+7edc, U+7ef4, U+8003, U+80b2, U+81f3-81f4, U+822a, U+827a, U+82f1, U+83b7, U+8425, U+89c2, U+89c8, U+8ba9, U+8bb8, U+8bc6, U+8bd5, U+8be2, U+8be5, U+8bed, U+8c03, U+8d23, U+8d2d, U+8d34, U+8d70, U+8db3, U+8fbe, U+8fce, U+8fd1, U+8fde, U+9001, U+901f-9020, U+90a3, U+914d, U+91c7, U+94fe, U+9500, U+952e, U+9605, U+9645, U+9662, U+9664, U+9700, U+9752, U+975e, U+97f3, U+9879, U+9886, U+98df, U+9a6c, U+9a8c, U+9ed1, U+9f99;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-117.woff2) format('woff2');unicode-range:U+4e, U+201c-201d, U+3010-3011, U+4e07, U+4e1c, U+4e24, U+4e3e, U+4e48, U+4e50, U+4e5f, U+4e8b-4e8c, U+4ea4, U+4eab-4eac, U+4ecb, U+4ece, U+4ed6, U+4ee3, U+4ef6-4ef7, U+4efb, U+4f20, U+4f55, U+4f7f, U+4fdd, U+505a, U+5143, U+5149, U+514d, U+5171, U+5177, U+518c, U+51fb, U+521b, U+5229, U+522b, U+52a9, U+5305, U+5317, U+534e, U+5355, U+5357, U+535a, U+5373, U+539f, U+53bb, U+53ca, U+53cd, U+53d6, U+53e3, U+53ea, U+53f0, U+5458, U+5546, U+56db, U+573a, U+578b, U+57ce, U+58f0, U+590d, U+5934, U+5973, U+5b57, U+5b8c, U+5b98, U+5bb9, U+5bfc, U+5c06, U+5c11, U+5c31, U+5c55, U+5df2, U+5e03, U+5e76, U+5e94, U+5efa, U+5f71, U+5f97, U+5feb, U+6001, U+603b, U+60f3, U+611f, U+6216, U+624d, U+6253, U+6295, U+6301, U+6392, U+641c, U+652f, U+653e, U+6559, U+6599, U+661f, U+671f, U+672f, U+6761, U+67e5, U+6807, U+6837, U+683c, U+6848, U+6b22, U+6b64, U+6bd4, U+6c14, U+6c34, U+6c42, U+6ca1, U+6d41, U+6d77, U+6d88, U+6e05, U+6e38, U+6e90, U+7136, U+7231, U+7531, U+767e, U+76ee, U+76f4, U+771f, U+7801, U+793a, U+79cd, U+7a0b, U+7a7a, U+7acb, U+7ae0, U+7b2c, U+7b80, U+7ba1, U+7cbe, U+7d22, U+7ea7, U+7ed3, U+7ed9, U+7edf, U+7f16, U+7f6e, U+8001, U+800c, U+8272, U+8282, U+82b1, U+8350, U+88ab, U+88c5, U+897f, U+89c1, U+89c4, U+89e3, U+8a00, U+8ba1, U+8ba4, U+8bae-8bb0, U+8bbe, U+8bc1, U+8bc4, U+8bfb, U+8d28, U+8d39, U+8d77, U+8d85, U+8def, U+8eab, U+8f66, U+8f6c, U+8f7d, U+8fd0, U+9009, U+90ae, U+90fd, U+91cc-91cd, U+91cf, U+95fb, U+9650, U+96c6, U+9891, U+98ce, U+ff1f;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-118.woff2) format('woff2');unicode-range:U+d, U+3e, U+5f, U+7c, U+a0, U+a9, U+4e09-4e0b, U+4e0d-4e0e, U+4e13, U+4e1a, U+4e2a, U+4e3a-4e3b, U+4e4b, U+4e86, U+4e8e, U+4ea7, U+4eba, U+4ee5, U+4eec, U+4f1a, U+4f4d, U+4f53, U+4f5c, U+4f60, U+4fe1, U+5165, U+5168, U+516c, U+5173, U+5176, U+5185, U+51fa, U+5206, U+5230, U+5236, U+524d, U+529b, U+52a0-52a1, U+52a8, U+5316, U+533a, U+53cb, U+53d1, U+53ef, U+53f7-53f8, U+5408, U+540c-540e, U+544a, U+548c, U+54c1, U+56de, U+56fd-56fe, U+5728, U+5730, U+5907, U+5916, U+591a, U+5927, U+5929, U+597d, U+5982, U+5b50, U+5b66, U+5b89, U+5b9a, U+5b9e, U+5ba2, U+5bb6, U+5bf9, U+5c0f, U+5de5, U+5e02, U+5e38, U+5e73-5e74, U+5e7f, U+5ea6, U+5f00, U+5f0f, U+5f53, U+5f55, U+5fae, U+5fc3, U+6027, U+606f, U+60a8, U+60c5, U+610f, U+6210-6211, U+6237, U+6240, U+624b, U+6280, U+62a5, U+63a5, U+63a8, U+63d0, U+6536, U+6570, U+6587, U+65b9, U+65e0, U+65f6, U+660e, U+662d, U+662f, U+66f4, U+6700, U+670d, U+672c, U+673a, U+6743, U+6765, U+679c, U+682a, U+6b21, U+6b63, U+6cbb, U+6cd5, U+6ce8, U+6d3b, U+70ed, U+7247-7248, U+7269, U+7279, U+73b0, U+7406, U+751f, U+7528, U+7535, U+767b, U+76f8, U+770b, U+77e5, U+793e, U+79d1, U+7ad9, U+7b49, U+7c7b, U+7cfb, U+7ebf, U+7ecf, U+7f8e, U+8005, U+8054, U+80fd, U+81ea, U+85cf, U+884c, U+8868, U+8981, U+89c6, U+8bba, U+8bdd, U+8bf4, U+8bf7, U+8d44, U+8fc7, U+8fd8-8fd9, U+8fdb, U+901a, U+9053, U+90e8, U+91d1, U+957f, U+95e8, U+95ee, U+95f4, U+9762, U+9875, U+9898, U+9996, U+9ad8, U+ff01, U+ff08-ff09;} +@font-face{font-family:'LXGW WenKai Screen';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/wenkai/files/lxgwwenkaiscreen-subset-119.woff2) format('woff2');unicode-range:U+20-22, U+27-2a, U+2c-3b, U+3f, U+41-4d, U+4f-5d, U+61-7b, U+7d, U+ab, U+ae, U+b2, U+b7, U+bb, U+df-e5, U+e7-ea, U+ec-ed, U+f1-f4, U+f6, U+f9-fa, U+fc, U+101, U+103, U+113, U+12b, U+148, U+14d, U+16b, U+1ce, U+1d0, U+300-301, U+1ebf, U+1ec7, U+2013-2014, U+2039-203a, U+2122, U+3001-3002, U+3042, U+3044, U+3046, U+3048, U+304a-3055, U+3057, U+3059-305b, U+305d, U+305f-3061, U+3063-306b, U+306d-3073, U+3075-3076, U+3078-3079, U+307b, U+307e-307f, U+3081-308d, U+308f, U+3092-3093, U+30a1-30a4, U+30a6-30bb, U+30bd, U+30bf-30c1, U+30c3-30c4, U+30c6-30cb, U+30cd-30d7, U+30d9-30e1, U+30e3-30e7, U+30e9-30ed, U+30ef, U+30f3, U+30fb-30fc, U+4e00, U+4e2d, U+65b0, U+65e5, U+6708-6709, U+70b9, U+7684, U+7f51, U+ff0c, U+ff0e, U+ff1a;} diff --git a/app/css/styles.css b/app/css/styles.css new file mode 100644 index 0000000..aad2e26 --- /dev/null +++ b/app/css/styles.css @@ -0,0 +1,826 @@ + :root{ + --bg:#10111a; --bg2:#151725; --panel:rgba(255,255,255,.08); --panel2:rgba(255,255,255,.12); + --text:#f7f3ff; --muted:#ada8c1; --soft:#d8d1ee; --line:rgba(255,255,255,.14); + --a:#ff7eb6; --b:#f472b6; --c:#fb7185; --tag-my:#ff7eb6; --tag-public:#38bdf8; --good:#65e6a5; --warn:#ffd166; --bad:#ff6b6b; + --shadow:0 24px 70px rgba(0,0,0,.35); --radius:24px; --blur:blur(22px); + --cardw:190px; + } + [data-theme="light"]{ + --bg:#f6f4fb; --bg2:#ede9f7; --panel:rgba(255,255,255,.74); --panel2:rgba(255,255,255,.92); + --text:#242033; --muted:#6b637d; --soft:#413957; --line:rgba(54,43,77,.14); --shadow:0 24px 70px rgba(86,62,110,.16); + } + *{box-sizing:border-box} html,body{height:100%} + body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;background:radial-gradient(circle at 12% 4%,color-mix(in srgb,var(--a) 26%,transparent),transparent 34rem),radial-gradient(circle at 84% 8%,color-mix(in srgb,var(--c) 18%,transparent),transparent 30rem),radial-gradient(circle at 45% 88%,color-mix(in srgb,var(--b) 24%,transparent),transparent 32rem),linear-gradient(135deg,var(--bg),var(--bg2));color:var(--text);overflow:hidden} + [data-theme="light"] body{background:radial-gradient(circle at 10% 2%,color-mix(in srgb,var(--a) 16%,transparent),transparent 34rem),radial-gradient(circle at 84% 8%,color-mix(in srgb,var(--c) 12%,transparent),transparent 30rem),radial-gradient(circle at 48% 92%,color-mix(in srgb,var(--b) 14%,transparent),transparent 32rem),linear-gradient(135deg,var(--bg),var(--bg2))} + button,input,select,textarea{font:inherit;color:inherit} button{border:0;cursor:pointer} button:disabled{cursor:not-allowed;opacity:.5} + .app{display:grid;grid-template-columns:300px minmax(0,1fr);height:100vh;gap:18px;padding:18px} + .side,.main,.drawer,.modal-card{background:var(--panel);border:1px solid var(--line);box-shadow:var(--shadow);backdrop-filter:var(--blur);-webkit-backdrop-filter:var(--blur);border-radius:var(--radius)} + .side{padding:18px;display:flex;flex-direction:column;min-width:0;overflow:hidden}.brand{display:flex;gap:12px;align-items:center;margin-bottom:18px}.logo{width:48px;height:48px;border-radius:17px;background:linear-gradient(135deg,var(--a),var(--b) 58%,var(--c));box-shadow:0 16px 35px rgba(255,126,182,.24);display:grid;place-items:center;font-weight:900;letter-spacing:-.08em}.brand h1{margin:0;font-size:22px;letter-spacing:-.03em}.brand p{margin:2px 0 0;color:var(--muted);font-size:12px}.pill{display:inline-flex;gap:6px;align-items:center;padding:7px 10px;border:1px solid var(--line);border-radius:999px;background:rgba(255,255,255,.06);color:var(--soft);font-size:12px;white-space:nowrap}.stats{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:4px 0 16px}.stat{border:1px solid var(--line);border-radius:18px;background:rgba(255,255,255,.06);padding:12px}.stat b{display:block;font-size:22px;line-height:1}.stat span{display:block;margin-top:5px;color:var(--muted);font-size:12px}.nav-title{font-size:12px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;margin:14px 0 8px}.nav{display:grid;gap:8px}.nav button{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:11px 12px;border-radius:16px;background:transparent;color:var(--soft);text-align:left}.nav button:hover,.nav button.active{background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.16));color:var(--text)}.badge{padding:3px 8px;border-radius:999px;background:rgba(255,255,255,.08);color:var(--muted);font-size:11px}.danger{color:var(--bad)}.tag-list{overflow:auto;min-height:0;display:flex;gap:8px;flex-wrap:wrap;align-content:flex-start;padding:4px 4px 0 0;margin-top:-4px} + #accountPill a{color:inherit;text-decoration:none} + .tag-head{display:flex;align-items:center;justify-content:space-between;gap:8px} + /* "show more" toggle for the tag list — only surfaced on mobile (see media query) */ + .tag-list-more{display:none;width:100%;margin-top:8px;padding:7px 10px;border:1px solid var(--line);border-radius:10px;background:transparent;color:var(--muted);font-size:12.5px;cursor:pointer;transition:color .15s ease,border-color .15s ease} + .tag-list-more:hover{color:var(--text);border-color:color-mix(in srgb,var(--a) 40%,var(--line))} + .tag-search-toggle{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:8px;border:0;background:transparent;color:var(--muted);cursor:pointer;padding:0;flex:none} + .tag-search-toggle:hover{color:var(--text);background:rgba(255,255,255,.08)} + .tag-search-toggle.active{color:var(--text);background:color-mix(in srgb,var(--a) 16%,transparent)} + .tag-search-toggle svg{width:15px;height:15px} + .tag-filter{flex:none;max-height:0;opacity:0;overflow:hidden;position:relative;margin:0;transition:max-height .26s cubic-bezier(.22,1,.36,1),opacity .2s ease,margin .26s cubic-bezier(.22,1,.36,1)} + .tag-filter.open{max-height:64px;opacity:1;margin:2px 0 10px} + .tag-filter-ico{position:absolute;left:11px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--muted);pointer-events:none} + .tag-filter-input{width:100%;background:rgba(0,0,0,.16);border:1px solid var(--line);border-radius:14px;padding:8px 12px 8px 33px;outline:0;color:var(--text);font-size:13px} + .tag-filter-input:focus{border-color:var(--accent-line)!important;box-shadow:0 0 0 3px color-mix(in srgb,var(--a) 13%,transparent)!important}.tag-chip{border:1px solid var(--line);background:rgba(255,255,255,.05);border-radius:999px;padding:7px 10px;font-size:12px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag-chip.active{background:linear-gradient(135deg,rgba(70,217,255,.2),rgba(124,92,255,.18));border-color:rgba(70,217,255,.36)}.tag-chip.my-tag{border-color:rgba(255,126,182,.30);background:rgba(255,126,182,.08)}.tag-chip.public-tag{border-color:rgba(70,217,255,.30);background:rgba(70,217,255,.08)}.tag-chip.tag-filter-btn{cursor:pointer}.tag-chip .tag-kind{opacity:.68;font-size:.86em;margin-right:4px}.tag-pair{display:inline-flex;align-items:center;gap:2px;max-width:100%}.tag-open{margin-left:0;opacity:.72;text-decoration:none;color:inherit;font-size:.92em;flex:none}.tag-open:hover{opacity:1;color:var(--c)} + .main{min-width:0;display:flex;flex-direction:column;overflow:hidden}.top{padding:18px 18px 12px;border-bottom:1px solid var(--line)}.row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.grow{flex:1}.title{font-size:26px;font-weight:900;letter-spacing:-.04em}.search{position:relative;min-width:240px;flex:1}.search input,.field input,.field textarea,.field select{width:100%;background:rgba(0,0,0,.16);border:1px solid var(--line);border-radius:16px;padding:12px 14px;outline:0}.search input:focus,.field input:focus,.field textarea:focus{border-color:rgba(255,126,182,.6);box-shadow:0 0 0 4px rgba(255,126,182,.12)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:12px 14px;border-radius:16px;background:rgba(255,255,255,.08);border:1px solid var(--line);color:var(--text);white-space:nowrap}.btn.primary{background:linear-gradient(135deg,var(--a),var(--b));border-color:transparent;color:white;font-weight:800}.btn.good{background:rgba(101,230,165,.14);border-color:rgba(101,230,165,.28)}.btn.warn{background:rgba(255,209,102,.14);border-color:rgba(255,209,102,.32)}.btn.bad{background:rgba(255,107,107,.14);border-color:rgba(255,107,107,.32)}.btn.small{padding:8px 10px;border-radius:13px;font-size:12px}.filters{padding:12px 18px;border-bottom:1px solid var(--line);display:flex;gap:10px;align-items:center;flex-wrap:wrap}.content{min-height:0;overflow:auto;padding:18px}.poster-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cardw),1fr));gap:18px}.card{position:relative;min-width:0;border:1px solid var(--line);background:rgba(255,255,255,.07);border-radius:22px;overflow:hidden;box-shadow:0 18px 45px rgba(0,0,0,.16);transition:transform .18s ease, border-color .18s ease, background .18s ease}.card:hover{transform:translateY(-4px);border-color:rgba(255,126,182,.45);background:rgba(255,255,255,.11)}.cover-wrap{aspect-ratio:3/4;position:relative;background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.17));overflow:hidden}.cover{width:100%;height:100%;object-fit:cover;display:block}.no-cover{height:100%;display:grid;place-items:center;padding:18px;color:var(--muted);text-align:center}.status-ribbon{position:absolute;top:10px;left:10px;z-index:2;font-size:12px;font-weight:800;padding:6px 9px;border-radius:999px;background:rgba(16,17,26,.72);backdrop-filter:blur(10px)}.rate{position:absolute;top:10px;right:10px;z-index:2;font-size:13px;font-weight:900;padding:6px 9px;border-radius:999px;background:linear-gradient(135deg,var(--warn),#ff8fab);color:#201526}.card-body{padding:12px}.name{font-weight:900;line-height:1.35;letter-spacing:.03em;margin-bottom:5px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.meta{font-size:12px;color:var(--muted);display:flex;gap:8px;flex-wrap:wrap}.comment{margin-top:9px;color:var(--soft);font-size:13px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;min-height:0}.mini-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}.mini-tags span{font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:3px 7px;max-width:100%;overflow:hidden;text-overflow:ellipsis}.notice{border:1px solid rgba(255,209,102,.28);background:rgba(255,209,102,.1);border-radius:18px;padding:12px 14px;color:var(--soft);line-height:1.5}.empty{height:45vh;display:grid;place-items:center;text-align:center;color:var(--muted)}.empty h2{color:var(--text);margin:0 0 8px}.drawer-mask,.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:50;display:none}.drawer-mask.show,.modal-mask.show{display:block}.drawer{position:fixed;right:18px;top:18px;bottom:18px;width:min(520px,calc(100vw - 36px));z-index:60;display:none;overflow:hidden}.drawer.show{display:flex;flex-direction:column}.drawer-head{padding:18px;border-bottom:1px solid var(--line);display:flex;gap:14px;align-items:flex-start}.drawer-cover{width:98px;aspect-ratio:3/4;border-radius:16px;object-fit:cover;background:rgba(255,255,255,.08);flex:none}.drawer-body{padding:18px;overflow:auto}.kv{display:grid;grid-template-columns:100px 1fr;gap:8px 12px;font-size:14px;margin:14px 0}.kv div:nth-child(odd){color:var(--muted)}.longtext{white-space:pre-wrap;line-height:1.75;border:1px solid var(--line);border-radius:18px;padding:14px;background:rgba(0,0,0,.13)}.history-list{display:grid;gap:10px}.hist{border:1px solid var(--line);border-radius:16px;padding:10px;background:rgba(255,255,255,.05);font-size:13px;color:var(--soft)}.modal-card{width:min(760px,calc(100vw - 32px));max-height:calc(100vh - 32px);overflow:auto;margin:16px auto;padding:20px}.field{margin:14px 0}.field label{display:block;margin-bottom:7px;color:var(--muted);font-size:13px}.help{color:var(--muted);font-size:13px;line-height:1.65}.progress{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden}.bar{height:100%;width:0;background:linear-gradient(90deg,var(--a),var(--b),var(--c));transition:width .25s}.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(20px);opacity:0;z-index:90;background:rgba(18,19,30,.92);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:999px;padding:12px 16px;color:white;transition:.25s;max-width:min(720px,calc(100vw - 36px));text-align:center}.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}.split{display:grid;grid-template-columns:1fr 1fr;gap:12px}.footer-note{margin-top:auto;padding-top:12px;color:var(--muted);font-size:12px;line-height:1.55}.sync-log{max-height:160px;overflow:auto;background:rgba(0,0,0,.14);border:1px solid var(--line);border-radius:16px;padding:10px;font-size:12px;color:var(--muted);white-space:pre-wrap}.hidden{display:none!important} + + /* v0.3 polish: custom scrollbar, dropdowns, motion */ + /* Slim, rounded, arrow-less scrollbar that auto-hides until you hover the scrollable area. */ + *{scrollbar-width:thin;scrollbar-color:rgba(255,126,182,.12) transparent} + *:hover{scrollbar-color:rgba(255,126,182,.5) transparent} + *::-webkit-scrollbar{width:9px;height:9px} + *::-webkit-scrollbar-track{background:transparent;border:0} + *::-webkit-scrollbar-button, + *::-webkit-scrollbar-button:single-button, + *::-webkit-scrollbar-button:double-button, + *::-webkit-scrollbar-button:start, + *::-webkit-scrollbar-button:end, + *::-webkit-scrollbar-button:vertical, + *::-webkit-scrollbar-button:horizontal{display:none!important;width:0!important;height:0!important;background:transparent!important} + *::-webkit-scrollbar-corner{background:transparent} + *::-webkit-scrollbar-thumb{background-color:rgba(255,126,182,.10);border:2px solid transparent;background-clip:padding-box;border-radius:999px;transition:background-color .35s ease} + *:hover::-webkit-scrollbar-thumb{background-color:rgba(255,126,182,.5)} + *::-webkit-scrollbar-thumb:hover{background-color:rgba(255,126,182,.85)} + *::-webkit-scrollbar-thumb:active{background-color:rgba(124,92,255,.9)} + .brand{position:relative}.brand:after{content:"";position:absolute;inset:auto 4px -10px 4px;height:1px;background:linear-gradient(90deg,transparent,rgba(255,126,182,.5),rgba(70,217,255,.32),transparent)} + .official-logo{width:118px;height:42px;border-radius:15px;background:rgba(255,255,255,.86);border:1px solid rgba(255,255,255,.35);display:flex;align-items:center;justify-content:center;padding:8px 11px;box-shadow:0 18px 45px rgba(255,126,182,.22);overflow:hidden;transition:.22s ease}.official-logo:hover{transform:translateY(-1px) scale(1.02);box-shadow:0 22px 55px rgba(255,126,182,.28)}.official-logo img{max-width:100%;max-height:100%;object-fit:contain;display:block}.official-logo span{display:none;color:#f09199;font-weight:900;font-size:19px;letter-spacing:-.05em}.official-logo.fallback img{display:none}.official-logo.fallback span{display:block} + .btn{transition:transform .18s ease, box-shadow .18s ease, background .18s ease, border-color .18s ease}.btn:hover{transform:translateY(-1px);box-shadow:0 14px 34px rgba(0,0,0,.16)}.btn.primary:hover{box-shadow:0 18px 42px rgba(255,126,182,.32)} + .search:before{content:"⌕";position:absolute;left:14px;top:50%;transform:translateY(-52%);font-size:19px;opacity:.66;pointer-events:none}.search input{padding-left:38px;transition:border-color .18s ease, box-shadow .18s ease, background .18s ease}.search input:focus{background:rgba(255,255,255,.08)} + .selectish{position:relative;display:inline-flex}.select-trigger{min-width:160px;justify-content:space-between}.select-trigger .chev{opacity:.72;transition:transform .18s ease}.selectish.open .chev{transform:rotate(180deg)}.select-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:40;min-width:220px;padding:7px;border:1px solid var(--line);background:rgba(23,24,38,.88);backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);border-radius:18px;box-shadow:var(--shadow);display:grid;gap:4px;opacity:0;transform:translateY(-6px) scale(.98);pointer-events:none;transition:opacity .16s ease, transform .16s ease}.selectish.open .select-menu{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.select-menu button{width:100%;text-align:left;border-radius:13px;background:transparent;padding:10px 11px;color:var(--soft);transition:.15s ease}.select-menu button:hover,.select-menu button.active{background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.16));color:var(--text)}[data-theme="light"] .select-menu{background:rgba(255,255,255,.86)} + @keyframes cardIn{from{opacity:0;transform:translateY(16px) scale(.985);filter:blur(5px)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}@keyframes drawerIn{from{opacity:0;transform:translateX(18px) scale(.985)}to{opacity:1;transform:translateX(0) scale(1)}}@keyframes modalIn{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes pulseSoft{0%,100%{opacity:.55}50%{opacity:1}} + .card{animation:cardIn .42s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(min(var(--i,0), 18) * 18ms);will-change:transform}.card:before{content:"";position:absolute;inset:-1px;z-index:0;background:radial-gradient(circle at var(--mx,50%) var(--my,10%),rgba(255,255,255,.18),transparent 34%);opacity:0;transition:opacity .18s}.card:hover:before{opacity:1}.card>*{position:relative;z-index:1}.cover:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 55%,rgba(0,0,0,.35));opacity:.88;pointer-events:none}.drawer.show{animation:drawerIn .24s cubic-bezier(.2,.8,.2,1)}.modal-mask.show .modal-card{animation:modalIn .2s ease both}.tag-chip,.nav button{transition:transform .16s ease, background .16s ease, border-color .16s ease}.tag-chip:hover,.nav button:hover{transform:translateY(-1px)} + .safety-empty{max-width:760px;margin:6vh auto;display:grid;gap:16px}.safety-panel{border:1px solid rgba(255,209,102,.28);background:linear-gradient(135deg,rgba(255,209,102,.12),rgba(124,92,255,.08));border-radius:26px;padding:22px;box-shadow:0 18px 60px rgba(0,0,0,.16)}.safety-panel h2{margin:0 0 8px;font-size:25px;letter-spacing:-.03em}.safety-panel p{margin:8px 0;color:var(--soft);line-height:1.7}.safety-steps{display:grid;gap:10px;margin-top:14px}.safety-step{border:1px solid var(--line);border-radius:18px;background:rgba(255,255,255,.055);padding:12px 14px;color:var(--soft)}.safety-step b{color:var(--text)} + + + /* v0.4 performance and motion polish */ + body{overscroll-behavior:none} + body:before,body:after{content:"";position:fixed;z-index:-1;pointer-events:none;border-radius:999px;filter:blur(90px);opacity:.45;animation:floatAura 13s ease-in-out infinite alternate} + body:before{width:38vw;height:38vw;left:-9vw;top:10vh;background:radial-gradient(circle,rgba(255,126,182,.42),transparent 62%)} + body:after{width:46vw;height:46vw;right:-16vw;bottom:-12vh;background:radial-gradient(circle,rgba(70,217,255,.28),rgba(124,92,255,.18),transparent 66%);animation-duration:16s} + @keyframes floatAura{from{transform:translate3d(0,0,0) scale(1)}to{transform:translate3d(4vw,-3vh,0) scale(1.08)}} + .bangumi-logo{width:54px;height:54px;display:grid;place-items:center;border-radius:19px;color:#f09199;background:linear-gradient(135deg,rgba(255,255,255,.88),rgba(255,241,248,.72));box-shadow:0 18px 45px rgba(255,126,182,.25),inset 0 1px 0 rgba(255,255,255,.78);border:1px solid rgba(255,255,255,.45);transition:transform .22s ease, box-shadow .22s ease, color .22s ease;position:relative;overflow:hidden;flex:none}.bangumi-logo:before{content:"";position:absolute;inset:-45%;background:conic-gradient(from 90deg,transparent,rgba(255,126,182,.28),rgba(70,217,255,.2),transparent);animation:spinLogo 6s linear infinite}.bangumi-logo svg{width:38px;height:38px;position:relative;z-index:1;filter:drop-shadow(0 6px 14px rgba(240,145,153,.28))}.bangumi-logo:hover{transform:translateY(-2px) scale(1.04);color:#ff6fa6;box-shadow:0 24px 58px rgba(255,126,182,.34),inset 0 1px 0 rgba(255,255,255,.82)}@keyframes spinLogo{to{transform:rotate(360deg)}} + .poster-grid{align-items:start}.card{content-visibility:auto;contain-intrinsic-size:310px 470px;contain:layout style paint}.cover{transform:translateZ(0);will-change:auto}.card:hover .cover{transform:scale(1.035);transition:transform .42s cubic-bezier(.2,.8,.2,1)} + .load-more-wrap{display:flex;justify-content:center;padding:20px 0 8px}.load-more-wrap .btn{min-width:220px;background:linear-gradient(135deg,rgba(255,126,182,.16),rgba(70,217,255,.12));border-color:rgba(255,126,182,.28)} + .sync-mode-note{border-color:rgba(101,230,165,.32);background:rgba(101,230,165,.10)} + @media (prefers-reduced-motion: reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}} + + @media (max-width: 920px){body{overflow:auto}.app{height:auto;min-height:100vh;grid-template-columns:1fr}.side{max-height:none}.tag-list{max-height:130px}.drawer{right:8px;top:8px;bottom:8px;width:calc(100vw - 16px)}.search{min-width:100%}.split{grid-template-columns:1fr}:root{--cardw:150px}} + + + /* v0.5 layout / interaction polish */ + :root{--poster-body-h:156px;--poster-body-hover:226px;--comment-lines:3;--font-main:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;} + [data-card-size="compact"]{--cardw:158px;--poster-body-h:136px;--poster-body-hover:190px;} + [data-card-size="standard"]{--cardw:190px;--poster-body-h:156px;--poster-body-hover:226px;} + [data-card-size="large"]{--cardw:226px;--poster-body-h:176px;--poster-body-hover:260px;} + [data-font="system"]{--font-main:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;} + [data-font="wenkai"]{--font-main:"LXGW WenKai Screen","LXGW WenKai","霞鹜文楷","Noto Serif SC","Songti SC",serif;} + [data-font="rounded"]{--font-main:"Nunito","M PLUS Rounded 1c","PingFang SC","Microsoft YaHei",sans-serif;} + [data-font="jp"]{--font-main:"Noto Sans JP","Hiragino Sans","Hiragino Kaku Gothic ProN","Yu Gothic","Microsoft YaHei",sans-serif;} + [data-font="mono"]{--font-main:"JetBrains Mono","Cascadia Code","SFMono-Regular",Consolas,"Microsoft YaHei",monospace;} + body{font-family:var(--font-main);transition:background-color .35s,color .35s;} + ::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal;display:block}::view-transition-new(root){z-index:9999}::view-transition-old(root){z-index:1} + .poster-grid{align-items:start;gap:28px 18px;overflow:visible;contain:layout paint style}.content{overflow:auto;overflow-x:hidden;padding-bottom:90px;overscroll-behavior:contain}.card{height:auto;min-height:0;display:flex;flex-direction:column;overflow:visible;border-radius:22px;isolation:isolate;content-visibility:auto;contain-intrinsic-size:360px 460px;animation:cardIn .36s cubic-bezier(.22,1,.36,1) both;animation-delay:calc(min(var(--i),18) * 18ms)}@keyframes cardIn{from{opacity:0;transform:translateY(16px) scale(.985)}to{opacity:1;transform:translateY(0) scale(1)}} + .card::before{content:"";position:absolute;inset:0;border-radius:22px;background:rgba(255,255,255,.07);border:1px solid var(--line);box-shadow:0 18px 45px rgba(0,0,0,.16);z-index:-1;transition:transform .26s cubic-bezier(.22,1,.36,1), box-shadow .26s, border-color .26s, background .26s}.card:hover{transform:none;z-index:30}.card:hover::before{transform:translateY(-10px) scale(1.035);border-color:rgba(255,126,182,.5);background:rgba(255,255,255,.12);box-shadow:0 28px 80px rgba(0,0,0,.28),0 0 0 1px rgba(255,126,182,.14)}.card-glow{position:absolute;inset:-1px;border-radius:22px;background:radial-gradient(circle at var(--mx,50%) var(--my,20%),rgba(255,255,255,.22),transparent 36%);opacity:0;pointer-events:none;transition:.22s;z-index:3}.card:hover .card-glow{opacity:1}.cover-wrap{border-radius:22px 22px 0 0;overflow:hidden;flex:0 0 auto;transform:translateZ(0);transition:transform .28s cubic-bezier(.22,1,.36,1)}.card:hover .cover-wrap{transform:translateY(-10px) scale(1.035)}.cover{transition:transform .45s cubic-bezier(.22,1,.36,1),filter .3s}.card:hover .cover{transform:scale(1.08);filter:saturate(1.12)}.card-body{height:var(--poster-body-h);flex:0 0 var(--poster-body-h);padding:12px;background:rgba(24,25,40,.38);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-radius:0 0 22px 22px;overflow:hidden;transition:height .26s cubic-bezier(.22,1,.36,1),flex-basis .26s,transform .26s,background .26s}.card:hover .card-body{height:var(--poster-body-hover);flex-basis:var(--poster-body-hover);transform:translateY(-10px) scale(1.035);background:rgba(24,25,40,.72)}[data-theme="light"] .card-body{background:rgba(255,255,255,.72)}[data-theme="light"] .card:hover .card-body{background:rgba(255,255,255,.94)}.name{min-height:2.5em}.meta{height:1.45em;overflow:hidden;flex-wrap:nowrap}.comment{min-height:calc(1.45em * min(var(--comment-lines),3));-webkit-line-clamp:var(--comment-lines);transition:.22s}.card:hover .comment{-webkit-line-clamp:6}.comment.no-comment{opacity:.42;font-style:italic}.mini-tags{max-height:2.15em;overflow:hidden} + .drawer-mask.show{display:block;animation:maskIn .25s ease both}@keyframes maskIn{from{opacity:0}to{opacity:1}}.drawer{left:50%;top:50%;right:auto;bottom:auto;width:min(980px,calc(100vw - 36px));max-height:min(860px,calc(100vh - 36px));transform:translate(-50%,-50%) scale(.94);opacity:0;border-radius:30px;overflow:hidden}.drawer.show{display:flex;flex-direction:column;animation:detailPop .38s cubic-bezier(.22,1,.36,1) both}@keyframes detailPop{from{opacity:0;transform:translate(-50%,-48%) scale(.92);filter:blur(10px)}to{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}}.detail-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.detail-bg img{width:100%;height:100%;object-fit:cover;filter:blur(34px) saturate(1.2);opacity:.24;transform:scale(1.1)}.detail-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(135deg,rgba(16,17,26,.86),rgba(20,16,34,.76) 45%,rgba(16,17,26,.92))}[data-theme="light"] .detail-bg::after{background:linear-gradient(135deg,rgba(255,255,255,.92),rgba(246,242,255,.82) 45%,rgba(255,255,255,.96))}.detail-top,.drawer-body{position:relative;z-index:1}.detail-top{padding:22px;border-bottom:1px solid var(--line);display:grid;grid-template-columns:120px minmax(0,1fr) auto;gap:18px;align-items:start}.detail-cover-wrap{border-radius:22px;padding:4px;background:linear-gradient(135deg,rgba(255,126,182,.44),rgba(124,92,255,.36),rgba(70,217,255,.28));box-shadow:0 22px 55px rgba(0,0,0,.24)}.drawer-cover{width:112px;aspect-ratio:3/4;border-radius:18px;object-fit:cover;display:block;background:rgba(255,255,255,.08)}.detail-titlebox h2{font-size:clamp(24px,4vw,42px);letter-spacing:-.04em;line-height:1.08;margin:6px 0 12px}.detail-kicker{font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}.detail-close{align-self:start}.detail-layout{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:18px;padding:22px;overflow:auto}.detail-main,.detail-side{display:grid;align-content:start;gap:14px}.detail-actions{position:sticky;top:0;z-index:2;padding-bottom:4px}.info-card{border:1px solid var(--line);background:rgba(255,255,255,.06);border-radius:22px;padding:14px}.info-card h3,.detail-main h3{margin:0 0 10px}.big-comment{font-size:15px}.tag-cloud{display:flex;gap:8px;flex-wrap:wrap}.muted-inline{color:var(--muted)} + .settings-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:10px}.setting-card{border:1px solid var(--line);background:rgba(255,255,255,.055);border-radius:20px;padding:14px}.setting-title{font-weight:900;margin-bottom:6px}.segmented{display:flex;flex-wrap:wrap;gap:8px}.segmented button{border:1px solid var(--line);background:rgba(255,255,255,.06);border-radius:999px;padding:8px 11px;color:var(--soft);transition:.2s}.segmented button:hover{transform:translateY(-1px);border-color:rgba(255,126,182,.4)}.segmented button.active{background:linear-gradient(135deg,rgba(255,126,182,.28),rgba(124,92,255,.25));border-color:rgba(255,126,182,.45);color:var(--text);box-shadow:0 10px 24px rgba(255,126,182,.12)}.setting-help{font-size:12px;color:var(--muted);line-height:1.55;margin-top:8px}.number-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.number-grid .field{margin:0}.field input[type="number"]{appearance:textfield} + [data-motion="soft"] .card{animation:none}[data-motion="soft"] .card:hover::before{transform:translateY(-6px) scale(1.018)}[data-motion="soft"] .card:hover .cover-wrap,[data-motion="soft"] .card:hover .card-body{transform:translateY(-6px) scale(1.018)}[data-motion="off"] *,[data-motion="off"] *::before,[data-motion="off"] *::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}[data-motion="off"] .card:hover::before,[data-motion="off"] .card:hover .cover-wrap,[data-motion="off"] .card:hover .card-body{transform:none}.load-more-wrap{padding:34px 0 70px;text-align:center} + @media (max-width: 920px){.drawer{width:calc(100vw - 16px);max-height:calc(100vh - 16px)}.detail-top{grid-template-columns:82px 1fr auto;padding:14px;gap:12px}.drawer-cover{width:74px}.detail-layout{grid-template-columns:1fr;padding:14px}.settings-grid{grid-template-columns:1fr}.number-grid{grid-template-columns:1fr}.card:hover .card-body{height:var(--poster-body-h);flex-basis:var(--poster-body-h)}.card:hover .comment{-webkit-line-clamp:var(--comment-lines)}} + + + /* v0.6 fix pass: stable poster wall, centered detail, border control, closing animations */ + :root{--ui-border-width:1px;--modal-max:980px;} + .side,.main,.drawer,.modal-card,.stat,.pill,.tag-chip,.btn,.search input,.field input,.field textarea,.field select,.select-menu,.select-menu button,.setting-card,.info-card,.longtext,.hist,.sync-log,.notice,.card,.mini-tags span{border-width:var(--ui-border-width)!important;} + [data-border-zero="true"] .side,[data-border-zero="true"] .main,[data-border-zero="true"] .drawer,[data-border-zero="true"] .modal-card,[data-border-zero="true"] .stat,[data-border-zero="true"] .pill,[data-border-zero="true"] .tag-chip,[data-border-zero="true"] .btn,[data-border-zero="true"] .search input,[data-border-zero="true"] .field input,[data-border-zero="true"] .field textarea,[data-border-zero="true"] .field select,[data-border-zero="true"] .select-menu,[data-border-zero="true"] .select-menu button,[data-border-zero="true"] .setting-card,[data-border-zero="true"] .info-card,[data-border-zero="true"] .longtext,[data-border-zero="true"] .hist,[data-border-zero="true"] .sync-log,[data-border-zero="true"] .notice,[data-border-zero="true"] .card,[data-border-zero="true"] .mini-tags span{border-color:transparent!important;} + .select-trigger{min-width:180px;padding-right:13px}.select-trigger .chev{font-size:0;width:9px;height:9px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);margin-left:10px;opacity:.66;flex:none;transition:transform .18s ease,opacity .18s ease}.selectish.open .chev{transform:rotate(225deg);opacity:1}.select-menu{transform-origin:top right;z-index:80} + .poster-grid{align-items:start;gap:30px 20px;overflow:visible;contain:none}.content{overflow:visible auto;overflow-x:hidden;padding-bottom:120px}.card{cursor:pointer;background:rgba(255,255,255,.07);border:1px solid var(--line);box-shadow:0 18px 45px rgba(0,0,0,.16);padding-bottom:var(--poster-body-h);overflow:visible;contain:layout style;transform-origin:center center;transition:transform .22s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .22s,background .22s;will-change:transform}.card::before{display:none!important}.card:hover{transform:translateY(-12px) scale(1.035);z-index:60;border-color:rgba(255,126,182,.52);background:rgba(255,255,255,.115);box-shadow:0 30px 86px rgba(0,0,0,.30),0 0 0 1px rgba(255,126,182,.12)}.card-glow{border-radius:22px;z-index:7}.cover-wrap{border-radius:21px 21px 0 0;transition:none}.card:hover .cover-wrap{transform:none}.card:hover .cover{transform:scale(1.065);filter:saturate(1.10)}.card-body{position:absolute;left:0;right:0;bottom:0;z-index:6;height:var(--poster-body-h);flex:initial;padding:13px;background:rgba(24,25,40,.58);border-radius:0 0 21px 21px;overflow:hidden;transition:height .24s cubic-bezier(.22,1,.36,1),background .22s,box-shadow .22s}.card:hover .card-body{height:var(--poster-body-hover);transform:none;background:rgba(24,25,40,.92);box-shadow:0 -16px 40px rgba(0,0,0,.22);border-radius:0 0 21px 21px}.name{min-height:2.7em}.meta{min-height:1.45em}.mini-tags{max-height:2.25em;overflow:hidden}.card:hover .mini-tags{max-height:4.6em}.comment{min-height:calc(1.45em * min(var(--comment-lines),3));-webkit-line-clamp:var(--comment-lines)}.card:hover .comment{-webkit-line-clamp:7}[data-motion="soft"] .card:hover{transform:translateY(-7px) scale(1.018)}[data-motion="soft"] .card:hover .card-body{height:calc(var(--poster-body-hover) - 28px)}[data-motion="off"] .card:hover{transform:none!important}[data-motion="off"] .card:hover .card-body{height:var(--poster-body-hover)!important;transition:none!important}[data-motion="off"] .drawer.show,[data-motion="off"] .modal-mask.show .modal-card{animation:none!important} + .drawer-mask,.modal-mask{opacity:0;display:none;transition:opacity .22s ease}.drawer-mask.show,.modal-mask.show{display:flex;opacity:1}.drawer-mask.closing,.modal-mask.closing{display:flex;opacity:0}.modal-mask{align-items:center;justify-content:center;padding:16px}.modal-card{width:min(var(--modal-max),calc(100vw - 32px));margin:0;max-height:calc(100vh - 32px);scrollbar-gutter:stable}.settings-card{--modal-max:900px}.modal-mask.show .modal-card{animation:modalIn .24s cubic-bezier(.22,1,.36,1) both}.modal-mask.closing .modal-card{animation:modalOut .18s ease both}@keyframes modalOut{from{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}to{opacity:0;transform:translateY(10px) scale(.985);filter:blur(8px)}}.modal-mask.show.closing{opacity:0}.sync-log:empty{display:none}.field label{font-weight:800;color:var(--soft)} + .drawer{left:50%;top:50%;right:auto;bottom:auto;width:min(1060px,calc(100vw - 44px));max-height:min(890px,calc(100vh - 44px));transform:translate(-50%,-50%) scale(.96);opacity:0;border-radius:32px;overflow:hidden;display:none;flex-direction:column}.drawer.show{display:flex;opacity:1;transform:translate(-50%,-50%) scale(1);animation:detailPopV6 .36s cubic-bezier(.22,1,.36,1) both}.drawer.closing{display:flex;animation:detailOutV6 .18s ease both}.drawer-mask.show{background:rgba(0,0,0,.50);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}@keyframes detailPopV6{from{opacity:0;transform:translate(-50%,-48%) scale(.92);filter:blur(12px)}to{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}}@keyframes detailOutV6{from{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}to{opacity:0;transform:translate(-50%,-48%) scale(.965);filter:blur(8px)}}.detail-bg img{filter:blur(38px) saturate(1.25);opacity:.25}.detail-bg::after{background:linear-gradient(135deg,rgba(16,17,26,.90),rgba(24,18,39,.82) 48%,rgba(16,17,26,.94))}.detail-titlebar{position:relative;z-index:1;padding:24px 24px 18px;border-bottom:1px solid var(--line);display:grid;grid-template-columns:minmax(0,1fr) auto;gap:16px;align-items:start}.detail-titlebar h2{font-size:clamp(26px,4.5vw,48px);line-height:1.04;letter-spacing:-.045em;margin:8px 0 14px}.detail-layout-v6{position:relative;z-index:1;display:grid;grid-template-columns:minmax(210px,300px) minmax(0,1fr);gap:20px;padding:22px;overflow:auto;min-height:0;flex:1}.detail-poster-panel{display:grid;align-content:start;gap:14px}.detail-poster-shell{border-radius:26px;padding:5px;background:linear-gradient(135deg,rgba(255,126,182,.55),rgba(124,92,255,.42),rgba(70,217,255,.34));box-shadow:0 24px 70px rgba(0,0,0,.32)}.detail-poster-shell .drawer-cover{width:100%;border-radius:21px}.detail-content{display:grid;align-content:start;gap:14px}.detail-actions{position:static}.detail-side{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.detail-side .info-card:last-child{grid-column:1/-1}.kv{grid-template-columns:86px minmax(0,1fr)}.kv div:nth-child(even){min-width:0;word-break:break-word}.big-comment{font-size:15px;max-height:none}.longtext{box-shadow:inset 0 1px 0 rgba(255,255,255,.05)} + @media (max-width: 980px){.drawer{width:calc(100vw - 16px);max-height:calc(100vh - 16px)}.detail-layout-v6{grid-template-columns:1fr;padding:14px}.detail-titlebar{padding:16px}.detail-side{grid-template-columns:1fr}.detail-poster-panel{grid-template-columns:120px minmax(0,1fr);align-items:start}.detail-poster-shell{max-width:120px}.card:hover .card-body{height:var(--poster-body-h)}.card:hover .comment{-webkit-line-clamp:var(--comment-lines)}.card:hover .mini-tags{max-height:2.25em}} + + + /* v0.7 card hover and detail redesign */ + :root{ + --poster-body-h:156px; + --poster-body-hover:238px; + --card-rise:-13px; + --card-hover-scale:1.025; + --card-shadow-base:0 18px 44px rgba(0,0,0,.18); + --card-shadow-hover:0 32px 95px rgba(0,0,0,.38),0 0 0 1px rgba(255,126,182,.20),0 0 42px rgba(124,92,255,.16); + } + [data-card-size="compact"]{--poster-body-h:132px;--poster-body-hover:206px;--cardw:166px} + [data-card-size="large"]{--poster-body-h:178px;--poster-body-hover:270px;--cardw:224px} + .poster-grid{gap:34px 22px;align-items:start;overflow:visible;contain:layout paint style;padding:6px 2px 48px} + .content{overflow:auto;overflow-x:hidden;overscroll-behavior:contain;padding-bottom:96px} + .card{height:auto;overflow:visible;border:0;background:transparent;box-shadow:none;isolation:isolate;transform-origin:center 52%;transition:transform .34s cubic-bezier(.16,1,.3,1),filter .34s cubic-bezier(.16,1,.3,1);will-change:transform;contain:layout style;content-visibility:visible;contain-intrinsic-size:360px 520px} + .card::before{content:"";position:absolute;inset:-1px;border-radius:24px;background:linear-gradient(180deg,rgba(255,255,255,.105),rgba(255,255,255,.055));border:var(--ui-border-width) solid var(--line);box-shadow:var(--card-shadow-base);z-index:-2;transition:transform .36s cubic-bezier(.16,1,.3,1),box-shadow .36s cubic-bezier(.16,1,.3,1),background .36s,border-color .36s;pointer-events:none} + .card::after{content:"";position:absolute;inset:-10px;border-radius:30px;background:radial-gradient(circle at var(--mx,50%) var(--my,20%),rgba(255,255,255,.18),transparent 38%),linear-gradient(135deg,rgba(255,126,182,.10),rgba(124,92,255,.08),rgba(70,217,255,.06));opacity:0;z-index:-3;filter:blur(8px);transition:opacity .34s cubic-bezier(.16,1,.3,1),transform .34s cubic-bezier(.16,1,.3,1);pointer-events:none} + .card:hover{z-index:80;transform:translateY(var(--card-rise)) scale(var(--card-hover-scale));filter:saturate(1.03)} + .card:hover::before{transform:translateY(-2px);box-shadow:var(--card-shadow-hover);border-color:rgba(255,126,182,.46);background:linear-gradient(180deg,rgba(255,255,255,.15),rgba(255,255,255,.082))} + .card:hover::after{opacity:1;transform:scale(1.035)} + .card-glow{position:absolute;inset:-1px;border-radius:24px;background:radial-gradient(circle at var(--mx,50%) var(--my,15%),rgba(255,255,255,.26),transparent 35%);opacity:0;pointer-events:none;transition:opacity .24s cubic-bezier(.16,1,.3,1);z-index:4}.card:hover .card-glow{opacity:1} + .cover-wrap{aspect-ratio:3/4;position:relative;overflow:hidden;border-radius:24px 24px 0 0;transform:translateZ(0);transition:transform .38s cubic-bezier(.16,1,.3,1),filter .38s cubic-bezier(.16,1,.3,1);background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.17))} + .card:hover .cover-wrap{transform:translateY(-2px)} + .cover{width:100%;height:100%;object-fit:cover;display:block;transition:transform .58s cubic-bezier(.16,1,.3,1),filter .45s cubic-bezier(.16,1,.3,1)} + .card:hover .cover{transform:scale(1.075);filter:saturate(1.12) contrast(1.03)} + .cover-wrap::after{content:"";position:absolute;inset:auto 0 0 0;height:42%;background:linear-gradient(180deg,transparent,rgba(8,9,15,.42));pointer-events:none} + .card-body{height:var(--poster-body-h);flex:0 0 var(--poster-body-h);margin-bottom:0;padding:13px 13px 12px;border-radius:0 0 24px 24px;background:linear-gradient(180deg,rgba(30,31,48,.76),rgba(22,23,36,.86));backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);overflow:hidden;transition:height .36s cubic-bezier(.16,1,.3,1),margin-bottom .36s cubic-bezier(.16,1,.3,1),transform .36s cubic-bezier(.16,1,.3,1),background .36s cubic-bezier(.16,1,.3,1);position:relative} + [data-theme="light"] .card-body{background:linear-gradient(180deg,rgba(255,255,255,.78),rgba(247,244,253,.90))} + .card:hover .card-body{height:var(--poster-body-hover);margin-bottom:calc(var(--poster-body-h) - var(--poster-body-hover));transform:translateY(-1px);background:linear-gradient(180deg,rgba(34,35,54,.88),rgba(22,23,36,.94))} + [data-theme="light"] .card:hover .card-body{background:linear-gradient(180deg,rgba(255,255,255,.94),rgba(247,244,253,.98))} + .name{font-size:15px;font-weight:920;letter-spacing:-.025em;line-height:1.28;margin-bottom:7px;min-height:2.55em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-wrap:balance} + .meta{min-height:1.5em;font-size:12px;color:var(--muted);display:flex;gap:7px;flex-wrap:nowrap;overflow:hidden;white-space:nowrap}.meta span{min-width:0;text-overflow:ellipsis;overflow:hidden}.meta .pill{padding:2px 7px;font-size:11px;flex:0 0 auto} + .comment{position:relative;margin-top:10px;color:var(--soft);font-size:13px;line-height:1.52;display:block;max-height:calc(1.52em * var(--comment-lines));min-height:calc(1.52em * min(var(--comment-lines),2));overflow:hidden;white-space:pre-wrap;-webkit-mask-image:linear-gradient(180deg,#000 58%,rgba(0,0,0,.76) 74%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 58%,rgba(0,0,0,.76) 74%,rgba(0,0,0,0));transition:max-height .36s cubic-bezier(.16,1,.3,1),opacity .28s}.comment.no-comment{font-style:italic;color:var(--muted);opacity:.82}.card:hover .comment{max-height:calc(1.52em * 7);-webkit-mask-image:linear-gradient(180deg,#000 78%,rgba(0,0,0,.72) 90%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 78%,rgba(0,0,0,.72) 90%,rgba(0,0,0,0))} + .mini-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:11px;height:24px;max-height:24px;overflow:hidden;transition:height .32s cubic-bezier(.16,1,.3,1),max-height .32s cubic-bezier(.16,1,.3,1),opacity .28s;-webkit-mask-image:linear-gradient(90deg,#000 82%,rgba(0,0,0,0));mask-image:linear-gradient(90deg,#000 82%,rgba(0,0,0,0))} + .card:hover .mini-tags{height:56px;max-height:56px;-webkit-mask-image:linear-gradient(180deg,#000 78%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 78%,rgba(0,0,0,0))} + .mini-tags span{height:23px;line-height:22px;font-size:11px;color:var(--muted);border:var(--ui-border-width) solid var(--line);border-radius:999px;padding:0 8px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;background:rgba(255,255,255,.045)} + .rate{position:absolute;top:10px;right:10px;z-index:2;font-size:13px;font-weight:950;padding:6px 10px;border-radius:999px;background:linear-gradient(135deg,var(--warn),#ff8fab);color:#201526;box-shadow:0 10px 28px rgba(0,0,0,.22)} + [data-motion="soft"]{--card-rise:-8px;--card-hover-scale:1.015;--poster-body-hover:210px} + [data-motion="soft"] .card:hover .comment{max-height:calc(1.52em * 5)} + [data-motion="off"] .card,[data-motion="off"] .card::before,[data-motion="off"] .card::after,[data-motion="off"] .card-body,[data-motion="off"] .cover,[data-motion="off"] .mini-tags,[data-motion="off"] .comment{transition:none!important;animation:none!important} + [data-motion="off"] .card:hover{transform:none!important} + [data-motion="off"] .card:hover .card-body{height:var(--poster-body-h)!important;margin-bottom:0!important;transform:none!important} + [data-motion="off"] .card:hover .mini-tags{height:24px!important;max-height:24px!important} + [data-motion="off"] .card:hover .comment{max-height:calc(1.52em * var(--comment-lines))!important} + + .drawer{left:50%;top:50%;right:auto;bottom:auto;width:min(1120px,calc(100vw - 44px));max-height:min(900px,calc(100vh - 44px));transform:translate(-50%,-50%) scale(.96);opacity:0;border-radius:32px;overflow:hidden;display:none;flex-direction:column;background:linear-gradient(135deg,rgba(35,36,54,.76),rgba(22,23,36,.88));border:var(--ui-border-width) solid var(--line);box-shadow:0 38px 120px rgba(0,0,0,.48);backdrop-filter:blur(28px);-webkit-backdrop-filter:blur(28px)} + [data-theme="light"] .drawer{background:linear-gradient(135deg,rgba(255,255,255,.82),rgba(246,242,253,.92))} + .drawer.show{display:flex;opacity:1;transform:translate(-50%,-50%) scale(1);animation:detailPopV7 .38s cubic-bezier(.16,1,.3,1) both}.drawer.closing{display:flex;animation:detailOutV7 .20s ease both}.drawer-mask.show{background:rgba(0,0,0,.52);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)} + @keyframes detailPopV7{from{opacity:0;transform:translate(-50%,-47%) scale(.91);filter:blur(14px)}to{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}}@keyframes detailOutV7{from{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}to{opacity:0;transform:translate(-50%,-47%) scale(.965);filter:blur(10px)}} + .detail-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.detail-bg img{position:absolute;inset:-40px;width:calc(100% + 80px);height:calc(100% + 80px);object-fit:cover;filter:blur(46px) saturate(1.35);opacity:.20;transform:scale(1.04)}.detail-bg::after{content:"";position:absolute;inset:0;background:radial-gradient(circle at 18% 18%,rgba(255,126,182,.18),transparent 32%),radial-gradient(circle at 86% 8%,rgba(70,217,255,.12),transparent 28%),linear-gradient(135deg,rgba(16,17,26,.92),rgba(28,23,43,.84) 48%,rgba(16,17,26,.95))}[data-theme="light"] .detail-bg::after{background:radial-gradient(circle at 18% 18%,rgba(255,126,182,.16),transparent 32%),radial-gradient(circle at 86% 8%,rgba(70,217,255,.10),transparent 28%),linear-gradient(135deg,rgba(250,247,255,.92),rgba(246,242,253,.82) 48%,rgba(250,247,255,.95))} + .detail-titlebar{position:relative;z-index:1;padding:26px 28px 18px;border-bottom:var(--ui-border-width) solid var(--line);display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:start}.detail-kicker{display:inline-flex;width:max-content;margin-bottom:8px;padding:6px 10px;border-radius:999px;background:linear-gradient(135deg,rgba(255,126,182,.16),rgba(124,92,255,.14));border:var(--ui-border-width) solid rgba(255,255,255,.12);font-size:12px;font-weight:850;color:var(--soft)}.detail-titlebar h2{font-size:clamp(28px,4.7vw,54px);line-height:.98;letter-spacing:-.055em;margin:0 0 15px;text-wrap:balance}.detail-close{align-self:start} + .detail-layout-v7{position:relative;z-index:1;display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr);gap:22px;padding:24px;overflow:auto;min-height:0;flex:1;scrollbar-gutter:stable}.detail-sidebar{position:sticky;top:0;display:grid;align-content:start;gap:15px;align-self:start}.detail-poster-shell{border-radius:28px;padding:5px;background:linear-gradient(135deg,rgba(255,126,182,.62),rgba(124,92,255,.48),rgba(70,217,255,.38));box-shadow:0 26px 80px rgba(0,0,0,.35)}.detail-poster-shell .drawer-cover{display:block;width:100%;aspect-ratio:3/4;border-radius:23px;object-fit:cover;background:rgba(255,255,255,.08)}.detail-main{display:grid;align-content:start;gap:16px;min-width:0}.detail-section-grid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr);gap:16px}.info-card{border:var(--ui-border-width) solid var(--line);border-radius:24px;background:rgba(255,255,255,.072);box-shadow:inset 0 1px 0 rgba(255,255,255,.045);padding:16px;min-width:0}.info-card h3{margin:0 0 12px;font-size:14px;letter-spacing:.03em;color:var(--soft)}.longtext{white-space:pre-wrap;line-height:1.76;border:var(--ui-border-width) solid var(--line);border-radius:18px;padding:14px;background:rgba(0,0,0,.12);box-shadow:inset 0 1px 0 rgba(255,255,255,.04)}.big-comment{font-size:15px;max-height:none}.tag-cloud{display:flex;gap:8px;flex-wrap:wrap}.tag-cloud .tag-chip{height:auto;max-width:100%;white-space:normal;line-height:1.25}.detail-actions{display:flex;gap:10px;flex-wrap:wrap}.detail-actions .btn{flex:1 1 auto}.score-card{position:relative;overflow:hidden;border-radius:26px;background:linear-gradient(135deg,rgba(255,209,102,.14),rgba(255,126,182,.12),rgba(124,92,255,.10));padding:18px;border:var(--ui-border-width) solid rgba(255,209,102,.24)}.score-card::after{content:"";position:absolute;right:-36px;top:-48px;width:150px;height:150px;border-radius:999px;background:radial-gradient(circle,rgba(255,209,102,.24),transparent 68%)}.score-top{position:relative;display:flex;align-items:end;justify-content:space-between;gap:14px}.score-number{font-size:58px;font-weight:950;letter-spacing:-.08em;line-height:.82;background:linear-gradient(135deg,var(--warn),#ff8fab,var(--b));-webkit-background-clip:text;background-clip:text;color:transparent}.score-number small{font-size:18px;color:var(--muted);-webkit-text-fill-color:var(--muted);letter-spacing:0}.score-label{color:var(--muted);font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.1em}.score-bar{position:relative;margin-top:18px;height:12px;border-radius:999px;background:rgba(255,255,255,.10);overflow:hidden;box-shadow:inset 0 1px 2px rgba(0,0,0,.18)}.score-fill{height:100%;width:var(--score-pct);border-radius:inherit;background:linear-gradient(90deg,var(--warn),#ff8fab,var(--b));box-shadow:0 0 22px rgba(255,126,182,.34);transition:width .55s cubic-bezier(.16,1,.3,1)}.score-caption{display:flex;justify-content:space-between;margin-top:8px;color:var(--muted);font-size:12px}.kv{display:grid;grid-template-columns:88px minmax(0,1fr);gap:9px 12px;font-size:14px;margin:0}.kv div:nth-child(odd){color:var(--muted);font-weight:700}.kv div:nth-child(even){min-width:0;word-break:break-word}.history-list{display:grid;gap:10px}.hist{border:var(--ui-border-width) solid var(--line);border-radius:16px;padding:10px;background:rgba(255,255,255,.05);font-size:13px;color:var(--soft)} + @media (max-width: 1050px){.detail-layout-v7{grid-template-columns:1fr}.detail-sidebar{position:relative;top:auto;grid-template-columns:150px minmax(0,1fr);align-items:start}.detail-poster-shell{max-width:150px}.detail-section-grid{grid-template-columns:1fr}.score-card{align-self:stretch}} + @media (max-width: 680px){.poster-grid{gap:22px 14px}.drawer{width:calc(100vw - 16px);max-height:calc(100vh - 16px);border-radius:24px}.detail-titlebar{padding:18px}.detail-layout-v7{padding:14px;gap:14px}.detail-sidebar{grid-template-columns:112px minmax(0,1fr)}.detail-poster-shell{max-width:112px}.score-number{font-size:42px}.card:hover{transform:none}.card:hover .card-body{height:var(--poster-body-h);margin-bottom:0}.card:hover .comment{max-height:calc(1.52em * var(--comment-lines))}.card:hover .mini-tags{height:24px;max-height:24px}} + + + /* v0.8 rebuilt poster hover + media-detail layout + Goals: no layout shift, no cut tag borders, cinematic hover, score visualization. */ + :root{ + --v8-card-ratio:.62; + --v8-card-body:132px; + --v8-card-body-hover:228px; + --v8-card-lift:-15px; + --v8-card-scale:1.035; + --v8-card-shadow:0 18px 42px rgba(0,0,0,.22); + --v8-card-shadow-hover:0 34px 90px rgba(0,0,0,.42),0 0 0 max(var(--ui-border-width), 0px) rgba(255,126,182,.36),0 0 46px rgba(124,92,255,.20); + } + [data-card-size="compact"]{--v8-card-body:116px;--v8-card-body-hover:196px;--cardw:164px} + [data-card-size="standard"]{--v8-card-body:132px;--v8-card-body-hover:228px;--cardw:190px} + [data-card-size="large"]{--v8-card-body:152px;--v8-card-body-hover:258px;--cardw:224px} + [data-motion="soft"]{--v8-card-lift:-9px;--v8-card-scale:1.018;--v8-card-body-hover:198px} + + .poster-grid{ + grid-template-columns:repeat(auto-fill,minmax(var(--cardw),1fr)); + gap:28px 22px; + align-items:start; + overflow:visible; + contain:layout style; + padding:8px 4px 74px; + } + .content{overflow:auto;overflow-x:hidden;overscroll-behavior:contain;padding-bottom:96px} + .card{ + position:relative; + aspect-ratio:var(--v8-card-ratio); + height:auto!important; + min-height:0!important; + overflow:visible!important; + border:0!important; + border-radius:26px; + background:transparent!important; + box-shadow:none!important; + isolation:isolate; + transform:translateY(0) scale(1) translateZ(0); + transform-origin:center center; + transition:transform .42s cubic-bezier(.16,1,.3,1), filter .42s cubic-bezier(.16,1,.3,1); + will-change:transform; + contain:layout style; + cursor:pointer; + } + .card::before{ + content:""; + position:absolute; + inset:0; + z-index:-2; + border-radius:26px; + background:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.055)); + border:var(--ui-border-width) solid var(--line); + box-shadow:var(--v8-card-shadow); + transition:box-shadow .42s cubic-bezier(.16,1,.3,1), border-color .42s, background .42s, transform .42s cubic-bezier(.16,1,.3,1); + pointer-events:none; + } + .card::after{ + content:""; + position:absolute; + inset:-12px; + z-index:-3; + border-radius:34px; + opacity:0; + background:radial-gradient(circle at var(--mx,50%) var(--my,25%),rgba(255,255,255,.22),transparent 32%),linear-gradient(135deg,rgba(255,126,182,.13),rgba(124,92,255,.10),rgba(70,217,255,.08)); + filter:blur(10px); + transition:opacity .42s cubic-bezier(.16,1,.3,1), transform .42s cubic-bezier(.16,1,.3,1); + pointer-events:none; + } + .card:hover{z-index:120;transform:translateY(var(--v8-card-lift)) scale(var(--v8-card-scale)) translateZ(0);filter:saturate(1.04)} + .card:hover::before{box-shadow:var(--v8-card-shadow-hover);border-color:rgba(255,126,182,.46);background:linear-gradient(180deg,rgba(255,255,255,.16),rgba(255,255,255,.085));transform:translateY(-2px)} + .card:hover::after{opacity:1;transform:scale(1.04)} + .card-glow{position:absolute;inset:0;border-radius:26px;background:radial-gradient(circle at var(--mx,50%) var(--my,22%),rgba(255,255,255,.24),transparent 32%);opacity:0;z-index:7;pointer-events:none;transition:opacity .32s cubic-bezier(.16,1,.3,1)} + .card:hover .card-glow{opacity:1} + .cover-wrap{ + position:absolute!important; + inset:0!important; + aspect-ratio:auto!important; + border-radius:26px!important; + overflow:hidden!important; + transform:none!important; + background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.17)); + z-index:0; + } + .cover,.no-cover{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:26px;transition:transform .7s cubic-bezier(.16,1,.3,1),filter .48s cubic-bezier(.16,1,.3,1)} + .card:hover .cover{transform:scale(1.075);filter:saturate(1.13) contrast(1.04)} + .cover-wrap::after{content:"";position:absolute;inset:0;height:auto;background:linear-gradient(180deg,rgba(9,10,16,.04) 0%,rgba(9,10,16,.10) 34%,rgba(9,10,16,.62) 66%,rgba(9,10,16,.94) 100%);pointer-events:none;z-index:1} + .status-ribbon,.rate{z-index:5} + .card-body{ + position:absolute!important; + left:0;right:0;bottom:0; + height:var(--v8-card-body)!important; + margin:0!important; + padding:14px 14px 13px!important; + z-index:4; + border-radius:0 0 26px 26px!important; + overflow:hidden!important; + background:linear-gradient(180deg,rgba(33,34,52,.72),rgba(18,19,30,.92))!important; + backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px); + transition:height .42s cubic-bezier(.16,1,.3,1), background .42s cubic-bezier(.16,1,.3,1), transform .42s cubic-bezier(.16,1,.3,1); + box-shadow:0 -16px 34px rgba(0,0,0,.18); + } + [data-theme="light"] .card-body{background:linear-gradient(180deg,rgba(255,255,255,.78),rgba(247,244,253,.94))!important;box-shadow:0 -16px 34px rgba(82,58,105,.10)} + .card:hover .card-body{ + height:min(var(--v8-card-body-hover), calc(100% - 20px))!important; + margin:0!important; + transform:translateY(-1px); + border-radius:22px!important; + background:linear-gradient(180deg,rgba(37,38,58,.88),rgba(18,19,30,.96))!important; + } + [data-theme="light"] .card:hover .card-body{background:linear-gradient(180deg,rgba(255,255,255,.94),rgba(247,244,253,.99))!important} + .name{font-size:15px;font-weight:930;letter-spacing:-.025em;line-height:1.28;margin-bottom:7px;min-height:2.55em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-wrap:balance} + .meta{min-height:1.45em;display:flex;gap:7px;flex-wrap:nowrap;overflow:hidden;white-space:nowrap;color:var(--muted);font-size:12px}.meta span{min-width:0;text-overflow:ellipsis;overflow:hidden}.meta .pill{padding:2px 7px;font-size:11px;flex:0 0 auto} + .comment{position:relative;margin-top:9px;color:var(--soft);font-size:13px;line-height:1.52;display:block!important;white-space:pre-wrap;max-height:calc(1.52em * var(--comment-lines));min-height:calc(1.52em * min(var(--comment-lines),2));overflow:hidden;-webkit-mask-image:linear-gradient(180deg,#000 58%,rgba(0,0,0,.70) 76%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 58%,rgba(0,0,0,.70) 76%,rgba(0,0,0,0));transition:max-height .42s cubic-bezier(.16,1,.3,1), opacity .28s cubic-bezier(.16,1,.3,1)} + .comment.no-comment{font-style:italic;color:var(--muted);opacity:.82;min-height:0!important} + .card:hover .comment{max-height:calc(1.52em * 7);-webkit-mask-image:linear-gradient(180deg,#000 80%,rgba(0,0,0,.74) 91%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 80%,rgba(0,0,0,.74) 91%,rgba(0,0,0,0))} + /* Expanded comment that fully fits (≤7 lines) doesn't reach the bottom → no fade */ + .card:hover .comment.cmt-fits-hover{-webkit-mask-image:none!important;mask-image:none!important} + .mini-tags{display:flex;gap:6px;flex-wrap:nowrap;margin-top:10px;height:24px;max-height:24px;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#000 82%,rgba(0,0,0,0));mask-image:linear-gradient(90deg,#000 82%,rgba(0,0,0,0));transition:height .38s cubic-bezier(.16,1,.3,1), max-height .38s cubic-bezier(.16,1,.3,1)} + .card:hover .mini-tags{flex-wrap:wrap;height:56px;max-height:56px;-webkit-mask-image:linear-gradient(180deg,#000 76%,rgba(0,0,0,0));mask-image:linear-gradient(180deg,#000 76%,rgba(0,0,0,0))} + .mini-tags span{height:23px;line-height:22px;font-size:11px;color:var(--muted);border:var(--ui-border-width) solid var(--line);border-radius:999px;padding:0 8px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 0 auto;background:rgba(255,255,255,.045)} + [data-motion="off"] .card,[data-motion="off"] .card::before,[data-motion="off"] .card::after,[data-motion="off"] .card-body,[data-motion="off"] .cover,[data-motion="off"] .comment,[data-motion="off"] .mini-tags{transition:none!important;animation:none!important} + [data-motion="off"] .card:hover{transform:none!important;filter:none!important} + [data-motion="off"] .card:hover .card-body{height:var(--v8-card-body)!important;border-radius:0 0 26px 26px!important;transform:none!important} + [data-motion="off"] .card:hover .mini-tags{flex-wrap:nowrap!important;height:24px!important;max-height:24px!important} + [data-motion="off"] .card:hover .comment{max-height:calc(1.52em * var(--comment-lines))!important} + + .drawer{ + left:50%;top:50%;right:auto;bottom:auto; + width:min(1180px,calc(100vw - 36px)); + max-height:min(920px,calc(100vh - 36px)); + transform:translate(-50%,-50%) scale(.96); + opacity:0; + border-radius:32px; + overflow:hidden; + display:none; + flex-direction:column; + background:rgba(17,18,30,.80); + border:var(--ui-border-width) solid var(--line); + box-shadow:0 42px 140px rgba(0,0,0,.54); + backdrop-filter:blur(30px);-webkit-backdrop-filter:blur(30px); + } + [data-theme="light"] .drawer{background:rgba(255,255,255,.84)} + .drawer.show{display:flex;opacity:1;animation:detailPopV8 .42s cubic-bezier(.16,1,.3,1) both}.drawer.closing{display:flex;animation:detailOutV8 .22s ease both}.drawer-mask.show{display:block;background:rgba(0,0,0,.56);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)} + @keyframes detailPopV8{from{opacity:0;transform:translate(-50%,-47%) scale(.91);filter:blur(16px)}to{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}} + @keyframes detailOutV8{from{opacity:1;transform:translate(-50%,-50%) scale(1);filter:blur(0)}to{opacity:0;transform:translate(-50%,-47%) scale(.965);filter:blur(12px)}} + .detail-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.detail-bg img{position:absolute;inset:-50px;width:calc(100% + 100px);height:calc(100% + 100px);object-fit:cover;filter:blur(44px) saturate(1.35);opacity:.26;transform:scale(1.04)}.detail-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(9,10,16,.90) 0%,rgba(12,14,24,.72) 44%,rgba(12,14,24,.90) 100%),radial-gradient(circle at 20% 10%,rgba(70,217,255,.16),transparent 32%),radial-gradient(circle at 80% 0%,rgba(255,126,182,.16),transparent 30%)} + [data-theme="light"] .detail-bg::after{background:linear-gradient(90deg,rgba(245,241,251,.90) 0%,rgba(255,255,255,.78) 44%,rgba(245,241,251,.92) 100%),radial-gradient(circle at 20% 10%,rgba(70,217,255,.11),transparent 32%),radial-gradient(circle at 80% 0%,rgba(255,126,182,.12),transparent 30%)} + .detail-v8{position:relative;z-index:1;display:grid;flex:1;grid-template-columns:minmax(230px,300px) minmax(0,1fr);gap:24px;padding:28px;min-height:0;overflow:hidden} + /* Each column scrolls independently so the short left pane doesn't wait for the long right pane. + Left pane sizes to its content (fully shown when it fits) and only scrolls if it ever exceeds. + Scrollbars stay hidden in the detail drawer, matching the previous look. */ + .detail-side-v8{align-self:start;max-height:100%;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;display:grid;align-content:start;gap:16px;padding-bottom:6px} + .detail-side-v8::-webkit-scrollbar,.detail-main-v8::-webkit-scrollbar{display:none!important;width:0!important;height:0!important} + .detail-poster-frame{border-radius:30px;padding:5px;background:linear-gradient(145deg,rgba(255,255,255,.35),rgba(255,255,255,.06));border:var(--ui-border-width) solid rgba(255,255,255,.16);box-shadow:0 28px 88px rgba(0,0,0,.42)} + .detail-poster-frame img,.detail-poster-frame .drawer-cover{display:block;width:100%;aspect-ratio:3/4;border-radius:24px;object-fit:cover;background:rgba(255,255,255,.08)} + .detail-actions-v8{display:grid;grid-template-columns:1fr 1fr;gap:10px}.detail-actions-v8 .btn{min-width:0;padding:11px 12px;border-radius:16px}.detail-actions-v8 .wide{grid-column:1/-1} + .detail-main-v8{display:flex;flex-direction:column;gap:18px;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;padding-bottom:6px} + /* Children must not shrink, or the hero (which has an explicit min-height) gets compressed below its + content and its bottom-anchored title/kicker get clipped by overflow:hidden. */ + .detail-main-v8 > *{flex:0 0 auto;min-width:0} + .detail-hero-v8{min-height:200px;border:0;border-radius:30px;background:linear-gradient(135deg,rgba(255,255,255,.085),rgba(255,255,255,.035));padding:30px;display:grid;align-content:end;position:relative;overflow:hidden;box-shadow:inset 0 1px 0 rgba(255,255,255,.06)} + .detail-hero-v8::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(10,11,18,.72),rgba(10,11,18,.28),transparent);pointer-events:none}[data-theme="light"] .detail-hero-v8::before{background:linear-gradient(90deg,rgba(255,255,255,.70),rgba(255,255,255,.32),transparent)} + .detail-hero-content{position:relative;z-index:1;max-width:780px}.detail-kicker-v8{display:inline-flex;align-items:center;width:max-content;margin-bottom:12px;padding:7px 10px;border-radius:999px;background:rgba(255,255,255,.11);border:var(--ui-border-width) solid var(--line);font-size:12px;font-weight:850;color:var(--soft);letter-spacing:.06em}.detail-hero-v8 h2{font-size:clamp(32px,5vw,66px);line-height:.95;letter-spacing:-.06em;margin:0 0 16px;text-shadow:0 6px 24px rgba(0,0,0,.24);text-wrap:balance}.detail-pills-v8{display:flex;gap:8px;flex-wrap:wrap}.detail-close-v8{position:absolute;right:44px;top:44px;z-index:5} + .detail-grid-v8{display:grid;grid-template-columns:minmax(0,1.16fr) minmax(260px,.84fr);gap:18px}.detail-stack{display:grid;gap:18px;align-content:start}.info-card{border:var(--ui-border-width) solid var(--line);border-radius:24px;background:rgba(255,255,255,.072);box-shadow:inset 0 1px 0 rgba(255,255,255,.045);padding:17px;min-width:0}.info-card h3{margin:0 0 12px;font-size:14px;letter-spacing:.03em;color:var(--soft)}.longtext{white-space:pre-wrap;line-height:1.76;border:var(--ui-border-width) solid var(--line);border-radius:18px;padding:15px;background:rgba(0,0,0,.12);box-shadow:inset 0 1px 0 rgba(255,255,255,.04)}.big-comment{font-size:15.5px;max-height:none}.tag-cloud{display:flex;gap:8px;flex-wrap:wrap}.tag-cloud .tag-chip{height:auto;max-width:100%;white-space:normal;line-height:1.25}.kv{display:grid;grid-template-columns:86px minmax(0,1fr);gap:9px 12px;font-size:14px;margin:0}.kv div:nth-child(odd){color:var(--muted);font-weight:800}.kv div:nth-child(even){min-width:0;word-break:break-word} + .score-card-v8{position:relative;overflow:hidden;border-radius:28px;background:linear-gradient(135deg,rgba(255,209,102,.16),rgba(255,126,182,.12),rgba(124,92,255,.10));padding:20px;border:var(--ui-border-width) solid rgba(255,209,102,.26);box-shadow:inset 0 1px 0 rgba(255,255,255,.06)}.score-card-v8::after{content:"";position:absolute;right:-46px;top:-58px;width:170px;height:170px;border-radius:999px;background:radial-gradient(circle,rgba(255,209,102,.25),transparent 68%)}.score-row-v8{position:relative;z-index:1;display:flex;align-items:end;justify-content:space-between;gap:16px}.score-big-v8{font-size:70px;font-weight:970;letter-spacing:-.09em;line-height:.78;background:linear-gradient(135deg,var(--warn),#ff8fab,var(--b));-webkit-background-clip:text;background-clip:text;color:transparent}.score-big-v8 small{font-size:18px;color:var(--muted);-webkit-text-fill-color:var(--muted);letter-spacing:0}.score-word-v8{font-size:12px;color:var(--muted);font-weight:850;text-transform:uppercase;letter-spacing:.12em;text-align:right}.stars-v8{display:flex;gap:3px;margin:17px 0 12px}.stars-v8 span{font-size:18px;color:rgba(255,255,255,.24);text-shadow:0 0 0 transparent}.stars-v8 span.on{color:var(--warn);text-shadow:0 0 16px rgba(255,209,102,.42)}[data-theme="light"] .stars-v8 span{color:rgba(36,32,51,.22)}[data-theme="light"] .stars-v8 span.on{color:#f4a000}.score-track-v8{height:13px;border-radius:999px;background:rgba(255,255,255,.12);overflow:hidden;box-shadow:inset 0 1px 2px rgba(0,0,0,.18)}.score-fill-v8{height:100%;width:var(--score-pct);border-radius:inherit;background:linear-gradient(90deg,var(--warn),#ff8fab,var(--b));box-shadow:0 0 22px rgba(255,126,182,.34);transition:width .55s cubic-bezier(.16,1,.3,1)}.score-caption-v8{display:flex;justify-content:space-between;margin-top:8px;color:var(--muted);font-size:12px} + @media (max-width: 980px){.detail-v8{grid-template-columns:1fr}.detail-side-v8{position:relative;grid-template-columns:150px minmax(0,1fr);align-items:start}.detail-poster-frame{max-width:150px}.detail-grid-v8{grid-template-columns:1fr}.detail-actions-v8{grid-template-columns:1fr 1fr}.score-big-v8{font-size:52px}} + @media (max-width: 680px){.poster-grid{gap:22px 14px}.card:hover{transform:none}.card:hover .card-body{height:var(--v8-card-body)!important;border-radius:0 0 26px 26px!important}.card:hover .mini-tags{flex-wrap:nowrap;height:24px;max-height:24px}.drawer{width:calc(100vw - 16px);max-height:calc(100vh - 16px);border-radius:24px}.detail-v8{padding:14px;gap:14px}.detail-side-v8{grid-template-columns:112px minmax(0,1fr)}.detail-poster-frame{max-width:112px}.detail-hero-v8{min-height:170px;padding:20px}.detail-hero-v8 h2{font-size:clamp(28px,10vw,42px)}.detail-grid-v8{gap:14px}} + + + + /* v0.9 detail progress + score refinement */ + .detail-hero-content{max-width:900px!important} + .episode-strip-v9{position:relative;z-index:2;margin-top:16px;display:grid;gap:9px;max-width:760px} + .episode-strip-head{display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--soft);font-size:12px;font-weight:850;letter-spacing:.04em} + .episode-grid-v9{display:grid;grid-template-columns:repeat(var(--ep-cols, 24), minmax(7px, 1fr));gap:5px;padding:10px;border:var(--ui-border-width) solid rgba(255,255,255,.14);border-radius:16px;background:rgba(0,0,0,.16);box-shadow:inset 0 1px 0 rgba(255,255,255,.04);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)} + [data-theme="light"] .episode-grid-v9{background:rgba(255,255,255,.36);border-color:rgba(54,43,77,.13)} + .ep-cell-v9{height:10px;border-radius:999px;background:rgba(255,255,255,.16);box-shadow:inset 0 1px 0 rgba(255,255,255,.05);transition:transform .18s ease, background .18s ease, box-shadow .18s ease} + [data-theme="light"] .ep-cell-v9{background:rgba(54,43,77,.16)} + .ep-cell-v9.watched{background:linear-gradient(135deg,var(--a),var(--b));box-shadow:0 0 14px rgba(255,126,182,.24)} + .ep-cell-v9:hover{transform:translateY(-2px) scale(1.18)} + .episode-grid-v9.too-many{grid-template-columns:repeat(32, minmax(5px, 1fr))} + .episode-grid-v9.too-many .ep-cell-v9{height:8px} + .episode-strip-v9.compact .episode-grid-v9{grid-template-columns:repeat(16,minmax(6px,1fr))} + .score-card-v8{padding:18px!important;overflow:hidden!important} + .score-row-v8{align-items:center!important} + .score-big-v8{font-size:62px!important;line-height:1!important;letter-spacing:-.055em!important;padding-bottom:4px;min-height:70px;display:flex;align-items:flex-end;gap:2px} + .score-big-v8 small{font-size:16px!important;margin-bottom:8px;letter-spacing:0!important} + .score-empty-v9{font-size:30px!important;letter-spacing:0!important;color:var(--muted)!important;-webkit-text-fill-color:var(--muted)!important;background:none!important;line-height:1.15!important;min-height:auto!important;padding:0!important} + .score-sub-v9{position:relative;z-index:1;margin:14px 0 4px;display:grid;gap:8px} + .score-sub-row{display:grid;grid-template-columns:72px 1fr auto;gap:8px;align-items:center;font-size:12px;color:var(--muted)} + .score-sub-row b{color:var(--soft);font-size:13px}.sub-track{height:7px;border-radius:999px;background:rgba(255,255,255,.11);overflow:hidden}.sub-fill{height:100%;width:var(--sub-pct);background:linear-gradient(90deg,rgba(70,217,255,.72),rgba(124,92,255,.72));border-radius:inherit}.score-caption-v8{margin-top:10px!important} + .detail-grid-v8{grid-template-columns:minmax(0,1.15fr) minmax(300px,.85fr)!important} + .detail-main-v8{gap:16px!important}.detail-hero-v8{padding:28px!important}.detail-hero-v8 h2{margin-bottom:12px!important} + /* Right side: banner + columns scroll together; once the banner is scrolled out, pin the 2-col grid and let each column scroll independently with their tops aligned. .cols-pinned is toggled by JS at the threshold (see openDrawer). */ + .detail-grid-v8.cols-pinned{position:sticky;top:0;height:100%;} + .detail-grid-v8.cols-pinned > .detail-stack{max-height:100%;overflow-y:auto;scrollbar-width:none;} + .detail-grid-v8.cols-pinned > .detail-stack::-webkit-scrollbar{display:none;} + @media (max-width:980px){.detail-grid-v8.cols-pinned{position:static;height:auto;}.detail-grid-v8.cols-pinned > .detail-stack{max-height:none;overflow:visible;}} + /* Infobox card collapse: show ~5 rows, fold the rest behind a translucent "查看更多" gradient bar */ + .infobox-extra{max-height:0;overflow:hidden;transition:max-height .3s ease} + .infobox-check:checked ~ .infobox-extra{max-height:none} + .infobox-toggle{display:block;text-align:center;margin-top:6px;padding:10px 0 6px;cursor:pointer;font-size:12px;font-weight:700;color:var(--soft);border-radius:14px;user-select:none;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--a) 14%,transparent))} + .infobox-toggle:hover{color:var(--text)} + .infobox-toggle::after{content:"查看更多 ▾"} + .infobox-check:checked ~ .infobox-toggle{background:none} + .infobox-check:checked ~ .infobox-toggle::after{content:"收起 ▴"} + @media (max-width: 980px){.detail-grid-v8{grid-template-columns:1fr!important}.episode-grid-v9{grid-template-columns:repeat(var(--ep-cols-mobile, 18), minmax(7px,1fr))}.score-big-v8{font-size:50px!important;min-height:58px}.score-sub-row{grid-template-columns:64px 1fr auto}} + @media (max-width: 680px){.episode-grid-v9{grid-template-columns:repeat(12,minmax(6px,1fr));gap:4px}.ep-cell-v9{height:8px}.detail-hero-v8{padding:18px!important}.score-empty-v9{font-size:24px!important}} + + + /* v0.12 user requested fixes: no seam, hover panel flush, shorter per-episode cells, 16:9 detail */ + :root{ + --v12-detail-w: min(1280px, calc(100vw - 36px)); + --v12-detail-h: min(672px, calc(100vh - 36px)); + } + + /* 卡片:只覆盖,不撑开;遮罩层向下重叠 1px,消除海报与文字遮罩之间的细缝 */ + .card{aspect-ratio:var(--v8-card-ratio)!important;} + .card::before{overflow:hidden;} + .cover-wrap{inset:0!important;border-radius:26px!important;} + .cover-wrap::after{bottom:-2px!important;height:auto!important;background:linear-gradient(180deg,rgba(9,10,16,.02) 0%,rgba(9,10,16,.08) 36%,rgba(9,10,16,.58) 65%,rgba(9,10,16,.96) 100%)!important;} + .card-body{ + left:0!important; + right:0!important; + bottom:-1px!important; + width:100%!important; + height:calc(var(--v8-card-body) + 2px)!important; + padding:14px 14px 18px!important; + border-radius:0 0 26px 26px!important; + box-shadow:0 -18px 34px rgba(0,0,0,.18)!important; + } + .card:hover .card-body{ + height:min(var(--v8-card-body-hover), calc(100% - 18px))!important; + bottom:-1px!important; + transform:none!important; + border-radius:0 0 26px 26px!important; + box-shadow:0 -20px 44px rgba(0,0,0,.24)!important; + } + [data-theme="light"] .card-body{box-shadow:0 -18px 34px rgba(82,58,105,.10)!important;} + [data-theme="light"] .card:hover .card-body{box-shadow:0 -20px 44px rgba(82,58,105,.14)!important;} + /* Unified soft bottom: a transparent->dark vignette over the card body's bottom so comment text + and tag pills both sink into the body's bottom color, without per-element (pill-breaking) fades. */ + .card-body::after{content:"";position:absolute;left:0;right:0;bottom:0;height:48px;pointer-events:none;z-index:5;background:linear-gradient(180deg,rgba(18,19,30,0) 30%,rgba(18,19,30,1) 82%)} + [data-theme="light"] .card-body::after{background:linear-gradient(180deg,rgba(247,244,253,0) 30%,rgba(247,244,253,1) 82%)} + /* Hover expands the body to show more text, so keep the vignette soft (not fully opaque) there. */ + .card:hover .card-body::after{background:linear-gradient(180deg,rgba(18,19,30,0),rgba(18,19,30,.5) 70%,rgba(18,19,30,.85))} + [data-theme="light"] .card:hover .card-body::after{background:linear-gradient(180deg,rgba(247,244,253,0),rgba(247,244,253,.5) 70%,rgba(247,244,253,.9))} + + /* 标签离底部留出距离;默认与悬停都不露半截边框 */ + .mini-tags{ + /* base 12px, plus 0.6em extra ONLY when comment preview lines = 0 (drops tags a touch without overflowing the card) */ + margin-top:calc(12px + 0.6em * max(0, 1 - var(--comment-lines)))!important; + margin-bottom:4px!important; + height:24px!important; + max-height:24px!important; + padding-bottom:0!important; + align-content:flex-start; + } + .card:hover .mini-tags{ + /* expanded state: pull tags up closer to the comment (override the resting margin) */ + margin-top:6px!important; + height:54px!important; + max-height:54px!important; + padding-bottom:2px!important; + } + .mini-tags span{height:22px!important;line-height:21px!important;} + /* Keep the first tag row from being top-clipped: top-align the pills and give them a top buffer. */ + .mini-tags{align-items:flex-start!important;align-content:flex-start!important;padding-top:4px!important;height:28px!important;max-height:28px!important;} + .card:hover .mini-tags{height:62px!important;max-height:62px!important;} + + /* 详情页:外框接近 16:9,内部滚动但隐藏滚动条 */ + .drawer{ + width:var(--v12-detail-w)!important; + height:auto!important; + aspect-ratio:16/9!important; + max-height:var(--v12-detail-h)!important; + max-width:calc(100vw - 36px)!important; + } + @media (min-aspect-ratio: 16/9){ + .drawer{height:var(--v12-detail-h)!important;width:calc(var(--v12-detail-h) * 16 / 9)!important;} + } + @media (max-aspect-ratio: 16/9){ + .drawer{width:var(--v12-detail-w)!important;height:calc(var(--v12-detail-w) * 9 / 16)!important;} + } + .detail-v8{overflow:hidden!important;padding-bottom:18px!important;} + /* Soften the bottom of both inner scroll columns: rounded clip + fade-out so overflowing content + no longer ends in a flat hard cut. padding-bottom matches the fade band so the last item/buttons + stay fully visible when scrolled to the end. */ + .detail-main-v8, + .detail-side-v8{ + padding-bottom:24px!important; + border-radius:0 0 20px 20px; + -webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 24px), transparent); + mask-image:linear-gradient(180deg,#000 calc(100% - 24px), transparent); + } + /* Single-column layout on narrow screens: let the whole drawer scroll as one again. */ + @media (max-width: 980px){ + .detail-v8{overflow:auto!important;} + .detail-side-v8,.detail-main-v8{overflow:visible!important;min-height:auto!important;padding-right:0!important;-webkit-mask-image:none!important;mask-image:none!important;padding-bottom:6px!important;} + } + + /* 进度格:整体宽度保持,只缩短每个单集条条 */ + .episode-strip-v9{max-width:760px!important;} + .episode-grid-v9{ + width:100%!important; + grid-template-columns:repeat(var(--ep-cols, 24), minmax(7px, 1fr))!important; + justify-items:center!important; + } + .episode-grid-v9.too-many{grid-template-columns:repeat(32, minmax(5px, 1fr))!important;} + .episode-strip-v9.compact .episode-grid-v9{grid-template-columns:repeat(16,minmax(6px,1fr))!important;} + .ep-cell-v9{ + width:68%!important; + min-width:5px!important; + justify-self:center!important; + height:9px!important; + } + .episode-grid-v9.too-many .ep-cell-v9{height:7px!important;width:62%!important;} + @media (max-width: 980px){ + .drawer{width:calc(100vw - 20px)!important;height:auto!important;max-height:calc(100vh - 36px)!important;aspect-ratio:auto!important;} + .detail-side-v8{display:none!important;} + .episode-grid-v9{grid-template-columns:repeat(var(--ep-cols-mobile, 18), minmax(7px,1fr))!important;} + } + @media (max-width: 680px){ + .episode-grid-v9{grid-template-columns:repeat(12,minmax(6px,1fr))!important;gap:4px!important;} + .ep-cell-v9{height:7px!important;width:64%!important;} + } + + + /* v0.13 detail title + status readability + episode cell tuning */ + .detail-hero-content{ + max-width:min(920px, 94%)!important; + } + .detail-hero-v8 h2{ + font-size:clamp(28px,3.75vw,52px)!important; + line-height:1.06!important; + letter-spacing:-.045em!important; + margin:0 0 14px!important; + max-width:900px!important; + text-wrap:pretty!important; + overflow-wrap:normal!important; + word-break:normal!important; + } + .status-ribbon{ + color:#fff!important; + background:rgba(30,24,43,.82)!important; + text-shadow:0 1px 3px rgba(0,0,0,.55)!important; + box-shadow:0 8px 22px rgba(0,0,0,.22), inset 0 1px 0 rgba(255,255,255,.12)!important; + } + [data-theme="light"] .status-ribbon{ + color:#fff!important; + background:rgba(42,32,62,.76)!important; + text-shadow:0 1px 3px rgba(0,0,0,.55)!important; + } + .episode-grid-v9{ + gap:3px!important; + column-gap:3px!important; + row-gap:4px!important; + } + .ep-cell-v9{ + width:54%!important; + height:8px!important; + border-radius:999px!important; + } + .episode-grid-v9.too-many .ep-cell-v9{ + width:50%!important; + height:6px!important; + } + .episode-strip-v9.compact .ep-cell-v9{ + width:52%!important; + height:7px!important; + } + @media (max-width: 680px){ + .detail-hero-v8 h2{font-size:clamp(26px,8.8vw,40px)!important;line-height:1.08!important;} + .episode-grid-v9{gap:3px!important;} + .ep-cell-v9{width:52%!important;height:7px!important;} + } + + + + /* v0.14 episode grid vertical alignment fix */ + .episode-grid-v9{ + grid-auto-flow:row!important; + grid-template-columns:repeat(var(--ep-cols,24), 18px)!important; + justify-content:start!important; + justify-items:center!important; + align-items:center!important; + gap:4px 5px!important; + row-gap:4px!important; + column-gap:5px!important; + padding:11px 20px!important; + overflow:hidden!important; + } + .episode-grid-v9.too-many{ + grid-template-columns:repeat(32, 14px)!important; + gap:3px 4px!important; + row-gap:3px!important; + column-gap:4px!important; + } + .episode-strip-v9.compact .episode-grid-v9{ + grid-template-columns:repeat(24, 14px)!important; + gap:3px 4px!important; + } + .ep-cell-v9{ + width:12px!important; + height:7px!important; + min-width:0!important; + justify-self:center!important; + align-self:center!important; + border-radius:999px!important; + display:block!important; + } + .episode-grid-v9.too-many .ep-cell-v9, + .episode-strip-v9.compact .ep-cell-v9{ + width:10px!important; + height:6px!important; + } + @media (max-width: 980px){ + .episode-grid-v9{ + grid-template-columns:repeat(var(--ep-cols-mobile,18), 16px)!important; + gap:4px 5px!important; + } + .episode-grid-v9.too-many, + .episode-strip-v9.compact .episode-grid-v9{ + grid-template-columns:repeat(18, 13px)!important; + gap:3px 4px!important; + } + } + @media (max-width: 680px){ + .episode-grid-v9{ + grid-template-columns:repeat(12, 15px)!important; + gap:3px 4px!important; + padding:9px 14px!important; + } + .ep-cell-v9{width:10px!important;height:6px!important;} + } + + + /* v0.15 episode strip background auto-fit + 背景玻璃层跟随实际格子宽度,不再铺满整条导致右侧空白。 */ + .episode-strip-v9{ + align-items:start!important; + justify-items:start!important; + max-width:100%!important; + } + .episode-grid-v9{ + display:inline-grid!important; + width:max-content!important; + max-width:100%!important; + box-sizing:border-box!important; + justify-self:start!important; + justify-content:start!important; + } + @supports (width: fit-content){ + .episode-grid-v9{width:fit-content!important;} + } + .episode-grid-v9.too-many, + .episode-strip-v9.compact .episode-grid-v9{ + width:max-content!important; + max-width:100%!important; + } + @supports (width: fit-content){ + .episode-grid-v9.too-many, + .episode-strip-v9.compact .episode-grid-v9{width:fit-content!important;} + } + @media (max-width: 680px){ + .episode-strip-v9{max-width:100%!important;} + .episode-grid-v9{max-width:100%!important;} + } + + + .hist-change{margin-top:4px;color:var(--text-muted);line-height:1.45}.hist-change span{color:var(--text);font-weight:700} + .login-shell{position:fixed;inset:0;z-index:200;display:grid;place-items:center;padding:22px;background:radial-gradient(circle at 18% 18%,rgba(255,126,182,.24),transparent 30rem),radial-gradient(circle at 82% 18%,rgba(70,217,255,.18),transparent 28rem),linear-gradient(135deg,var(--bg),var(--bg2));} + .login-shell.hidden{display:none!important} + .login-card{width:min(430px,calc(100vw - 32px));border:1px solid var(--line);border-radius:24px;background:rgba(24,25,40,.78);box-shadow:0 34px 100px rgba(0,0,0,.42);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);padding:24px} + [data-theme="light"] .login-card{background:rgba(255,255,255,.84)} + .login-card h2{margin:0 0 8px;font-size:28px;letter-spacing:-.04em} + .login-card p{margin:0 0 18px;color:var(--muted);line-height:1.6} + .auth-status{min-height:20px;margin-top:12px;color:var(--muted);font-size:13px;line-height:1.5} + .password-panel{margin-top:14px;border:1px solid var(--line);border-radius:18px;background:rgba(255,255,255,.055);padding:14px} + .password-panel h3{margin:0 0 8px;font-size:15px;color:var(--soft)} + #syncMiniBar{display:none;align-items:center;gap:9px;padding:7px 13px;border-radius:14px;background:rgba(255,255,255,.06);border:1px solid var(--line);cursor:pointer;color:var(--text);font-size:12px;font-weight:700;white-space:nowrap;transition:background .18s ease,border-color .18s ease;} + #syncMiniBar.show{display:inline-flex;} + #syncMiniBar:hover{background:rgba(255,126,182,.12);border-color:rgba(255,126,182,.32);} + .smi-ring{width:15px;height:15px;border-radius:999px;flex:none;border:2px solid rgba(255,126,182,.25);border-top-color:#ff7eb6;animation:smiSpin .8s linear infinite;} + #syncMiniBar.smi-done .smi-ring{border-color:rgba(101,230,165,.4);border-top-color:#65e6a5;animation:none;} + @keyframes smiSpin{to{transform:rotate(360deg)}} + .smi-body{min-width:0;display:flex;align-items:center;gap:8px;} + .smi-label{white-space:nowrap;} + .smi-track{height:4px;width:64px;border-radius:999px;background:rgba(255,255,255,.12);overflow:hidden;flex:none;} + .smi-fill{height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,var(--a),var(--b));transition:width .28s cubic-bezier(.16,1,.3,1);} + #loadingScreen{position:fixed;inset:0;z-index:9999;display:grid;place-items:center;background:radial-gradient(circle at 18% 18%,rgba(255,126,182,.22),transparent 34rem),radial-gradient(circle at 80% 8%,rgba(70,217,255,.16),transparent 28rem),linear-gradient(135deg,#10111a,#151725);transition:opacity .5s cubic-bezier(.4,0,.2,1),visibility .5s;pointer-events:auto} + #loadingScreen.done{opacity:0;visibility:hidden;pointer-events:none} + .ld-inner{display:flex;flex-direction:column;align-items:center;gap:20px} + #loadingScreen .bangumi-logo{width:72px;height:72px;border-radius:24px;pointer-events:none;cursor:default;animation:ldPulse 2.4s ease-in-out infinite} + #loadingScreen .bangumi-logo svg{width:50px;height:50px} + @keyframes ldPulse{0%,100%{box-shadow:0 18px 45px rgba(255,126,182,.25),inset 0 1px 0 rgba(255,255,255,.78)}50%{box-shadow:0 26px 68px rgba(255,126,182,.55),0 0 36px rgba(124,92,255,.22),inset 0 1px 0 rgba(255,255,255,.9)}} + .ld-title{font-size:18px;font-weight:800;letter-spacing:-.02em;color:#f7f3ff} + .ld-dots{display:flex;gap:8px;align-items:center} + .ld-dots span{width:8px;height:8px;border-radius:999px;background:linear-gradient(135deg,#ff7eb6,#7c5cff);animation:ldDot 1.2s ease-in-out infinite} + .ld-dots span:nth-child(2){animation-delay:.18s}.ld-dots span:nth-child(3){animation-delay:.36s} + @keyframes ldDot{0%,80%,100%{transform:scale(.5);opacity:.3}40%{transform:scale(1);opacity:1}} + .settings-tabs{display:flex;gap:6px;margin:16px 0 0;padding-bottom:14px;border-bottom:1px solid var(--line);} + .settings-tab{padding:8px 18px;border-radius:14px;background:transparent;border:1px solid transparent;color:var(--muted);font-weight:700;font-size:14px;transition:.18s;} + .settings-tab:hover{background:rgba(255,255,255,.06);color:var(--soft);} + .settings-tab.active{background:linear-gradient(135deg,rgba(255,126,182,.18),rgba(124,92,255,.16));border-color:rgba(255,126,182,.30);color:var(--text);} + .settings-pane{display:none;padding-top:16px;} + .settings-pane.active{display:block;} + .settings-footer{margin-top:18px;padding-top:14px;border-top:1px solid var(--line);} + + /* Sync tab: card-grouped layout (scoped so it never touches the appearance tab) */ + #stab-sync .sync-master{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;margin-top:2px;} + #autoSyncOptions{display:grid;gap:14px;margin-top:16px;} + #stab-sync .setting-card input[type=number]:not(.btn),#stab-sync .setting-card input[type=text]:not(.btn),#stab-sync .setting-card select{background:rgba(0,0,0,.16);border:1px solid var(--line);border-radius:14px;padding:10px 12px;outline:0;color:var(--text);} + #stab-sync .setting-card input:not(.btn):focus,#stab-sync .setting-card select:focus{border-color:rgba(255,126,182,.6);box-shadow:0 0 0 4px rgba(255,126,182,.12);} + #stab-sync .setting-card input:disabled,#stab-sync .setting-card select:disabled{opacity:.55;cursor:not-allowed;} + #stab-sync .sync-cover{display:flex;align-items:center;justify-content:space-between;gap:14px;} + /* 高级 tab: group loose toggles/inputs into cards, matching the 同步/外观 tabs */ + .advanced-grid{display:grid;gap:14px;margin-top:4px;} + #stab-advanced .setting-card > .field{margin:12px 0 0;} + #stab-advanced .setting-card > .pill{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:pointer;} + #stab-advanced .setting-card > .pill + .pill{margin-top:10px;} + /* Collapsible "网络与镜像" card (native
, collapsed by default) */ + details.net-collapse > summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;user-select:none;margin:0;} + details.net-collapse > summary::-webkit-details-marker{display:none;} + details.net-collapse > summary::after{content:"";width:7px;height:7px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:rotate(-45deg);transition:transform .2s ease;margin-left:auto;} + details.net-collapse[open] > summary::after{transform:rotate(45deg);} + details.net-collapse > summary:hover::after{border-color:var(--text);} + #stab-sync .selectish.disabled{opacity:.55;pointer-events:none;} + + /* Home toolbar split into left (summary/sync pills) and right (action buttons) groups */ + .filters{justify-content:space-between;} + .filters-left,.filters-right{display:flex;gap:10px;align-items:center;flex-wrap:wrap;min-width:0;} + + /* Theme color (accent). Palettes override --a/--b/--c (default pink = original :root values). + Derived --accent-* (color-mix from --a/--b) recolor selection/hover/focus/active states, which in + this project were hardcoded pink — that's why changing the accent only moved buttons before. */ + [data-accent="wisteria"]{--a:#a78bfa;--b:#8b5cf6;--c:#c084fc;--tag-my:#a78bfa;--tag-public:#34d399;} + [data-accent="cyan"]{--a:#38bdf8;--b:#06b6d4;--c:#60a5fa;--tag-my:#38bdf8;--tag-public:#f472b6;} + [data-accent="amber"]{--a:#fbbf24;--b:#f59e0b;--c:#fb7185;--tag-my:#f59e0b;--tag-public:#06b6d4;} + [data-accent="mint"]{--a:#34d399;--b:#10b981;--c:#22d3ee;--tag-my:#10b981;--tag-public:#a78bfa;} + :root{--accent-bg:color-mix(in srgb,var(--a) 16%,transparent);--accent-bg-2:color-mix(in srgb,var(--b) 14%,transparent);--accent-line:color-mix(in srgb,var(--a) 42%,transparent);--accent-glow:color-mix(in srgb,var(--a) 22%,transparent);} + /* My/Public tag chips: upstream v0.30.0 dual-tone — colored text/border/kind + hover/active, follows accent. */ + .tag-chip.my-tag{border-color:color-mix(in srgb,var(--tag-my) 56%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-my) 16%,transparent),color-mix(in srgb,var(--tag-my) 7%,transparent))!important;color:color-mix(in srgb,var(--tag-my) 24%,var(--text))!important;} + .tag-chip.public-tag{border-color:color-mix(in srgb,var(--tag-public) 62%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-public) 17%,transparent),color-mix(in srgb,var(--tag-public) 7%,transparent))!important;color:color-mix(in srgb,var(--tag-public) 26%,var(--text))!important;} + .tag-chip.my-tag .tag-kind{color:color-mix(in srgb,var(--tag-my) 62%,var(--muted))!important;opacity:1!important;} + .tag-chip.public-tag .tag-kind{color:color-mix(in srgb,var(--tag-public) 66%,var(--muted))!important;opacity:1!important;} + .nav button:hover,.nav button.active,.segmented button.active,.settings-tab.active,.select-menu button:hover,.select-menu button.active{background:linear-gradient(135deg,var(--accent-bg),var(--accent-bg-2))!important;border-color:var(--accent-line)!important;box-shadow:0 10px 24px var(--accent-glow)!important;color:var(--text)!important;} + .tag-chip.my-tag:hover{border-color:color-mix(in srgb,var(--tag-my) 78%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-my) 23%,transparent),color-mix(in srgb,var(--tag-my) 10%,transparent))!important;box-shadow:0 10px 24px color-mix(in srgb,var(--tag-my) 13%,transparent)!important;} + .tag-chip.public-tag:hover{border-color:color-mix(in srgb,var(--tag-public) 82%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-public) 24%,transparent),color-mix(in srgb,var(--tag-public) 10%,transparent))!important;box-shadow:0 10px 24px color-mix(in srgb,var(--tag-public) 14%,transparent)!important;} + .tag-chip.my-tag.active{border-color:color-mix(in srgb,var(--tag-my) 88%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-my) 34%,transparent),color-mix(in srgb,var(--tag-my) 16%,transparent))!important;box-shadow:0 12px 26px color-mix(in srgb,var(--tag-my) 18%,transparent)!important;color:var(--text)!important;} + .tag-chip.public-tag.active{border-color:color-mix(in srgb,var(--tag-public) 90%,transparent)!important;background:linear-gradient(135deg,color-mix(in srgb,var(--tag-public) 35%,transparent),color-mix(in srgb,var(--tag-public) 16%,transparent))!important;box-shadow:0 12px 26px color-mix(in srgb,var(--tag-public) 18%,transparent)!important;color:var(--text)!important;} + /* Generic (untyped) tag filter chip still follows accent --c/--line. */ + .tag-chip.active{background:linear-gradient(135deg,color-mix(in srgb,var(--c) 18%,transparent),var(--accent-bg-2))!important;border-color:color-mix(in srgb,var(--c) 38%,transparent)!important;} + .tag-chip:hover{border-color:var(--accent-line)!important;} + .search input:focus,.field input:focus,.field textarea:focus,#stab-sync .setting-card input:not(.btn):focus{border-color:var(--accent-line)!important;box-shadow:0 0 0 4px color-mix(in srgb,var(--a) 13%,transparent)!important;} + .card:hover::before{border-color:var(--accent-line)!important;} + .accent-buttons button{position:relative;padding-left:28px;} + .accent-buttons button::before{content:"";position:absolute;left:9px;top:50%;width:12px;height:12px;border-radius:999px;transform:translateY(-50%);background:var(--accent-dot,#ff7eb6);box-shadow:0 0 0 2px rgba(255,255,255,.1);} + .accent-buttons button[data-value="pink"]{--accent-dot:#ff7eb6;} + .accent-buttons button[data-value="wisteria"]{--accent-dot:#a78bfa;} + .accent-buttons button[data-value="cyan"]{--accent-dot:#38bdf8;} + .accent-buttons button[data-value="amber"]{--accent-dot:#fbbf24;} + .accent-buttons button[data-value="mint"]{--accent-dot:#34d399;} + /* 同步最近: lightweight purple (follows accent --b), matching upstream */ + #syncBtn.btn.primary,#mSyncRecent.btn.primary{background:color-mix(in srgb,var(--b) 15%,transparent)!important;border-color:color-mix(in srgb,var(--b) 36%,transparent)!important;color:var(--text)!important;box-shadow:none!important;font-weight:850;} + #syncBtn.btn.primary:hover,#mSyncRecent.btn.primary:hover{background:color-mix(in srgb,var(--b) 22%,transparent)!important;border-color:color-mix(in srgb,var(--b) 48%,transparent)!important;box-shadow:0 14px 30px color-mix(in srgb,var(--b) 14%,transparent)!important;} + + /* Reusable toggle switch (matches the glass/gradient style) */ + .switch-input{position:absolute;opacity:0;pointer-events:none;width:0;height:0;} + .switch{position:relative;flex:none;width:44px;height:25px;border-radius:999px;background:rgba(255,255,255,.14);border:1px solid var(--line);transition:background .2s,border-color .2s;} + .switch::after{content:"";position:absolute;top:2px;left:2px;width:19px;height:19px;border-radius:50%;background:#fff;box-shadow:0 2px 5px rgba(0,0,0,.35);transition:transform .2s;} + .switch-input:checked + .switch{background:linear-gradient(135deg,var(--a),var(--b));border-color:transparent;} + .switch-input:checked + .switch::after{transform:translateX(19px);} + .switch-input:focus-visible + .switch{box-shadow:0 0 0 4px rgba(255,126,182,.18);} + + /* Access Token: permanently mask the value with dots; copy/cut are also blocked in JS. */ + .masked-input{-webkit-text-security:disc;text-security:disc;} + #stab-sync .cron-summary{margin-top:12px;padding-top:12px;border-top:1px solid var(--line);} + + .status-ribbon[data-ct="1"]{background:rgba(70,217,255,.55)!important;} + .status-ribbon[data-ct="2"]{background:rgba(101,230,165,.60)!important;} + .status-ribbon[data-ct="3"]{background:rgba(255,138,54,.68)!important;} + .status-ribbon[data-ct="4"]{background:rgba(173,168,193,.52)!important;} + .status-ribbon[data-ct="5"]{background:rgba(255,107,107,.62)!important;} + .r18-badge{position:absolute;bottom:calc(var(--v8-card-body) + 7px);right:10px;z-index:6;font-size:10px;font-weight:900;letter-spacing:.05em;padding:3px 8px;border-radius:999px;background:rgba(220,60,60,.48);color:#fff;pointer-events:none;text-shadow:0 1px 3px rgba(0,0,0,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:bottom .42s cubic-bezier(.16,1,.3,1);} + .card:hover .r18-badge{bottom:calc(var(--v8-card-body-hover) + 14px);} + [data-motion="soft"] .r18-badge{transition:bottom .28s ease;} + [data-motion="off"] .r18-badge{transition:none!important;} + + /* ===== Mobile UI: off-canvas sidebar drawer + condensed toolbar (desktop unchanged) ===== */ + .menu-btn{display:none} + /* Icon-only theme toggle (icon injected by applyAppearance). #themeBtnTop is the mobile title-row copy, desktop-hidden. */ + .theme-toggle{align-items:center;justify-content:center} + .theme-toggle svg{width:18px;height:18px;display:block} + #themeBtnTop{display:none} + /* Clickable "有吐槽" stat → toggles the has-comment filter */ + .stat-clickable{cursor:pointer;transition:background .18s,border-color .18s,transform .1s} + .stat-clickable:hover{border-color:color-mix(in srgb,var(--a) 42%,var(--line));background:rgba(255,255,255,.1)} + .stat-clickable:active{transform:translateY(1px)} + .stat-clickable.active{border-color:color-mix(in srgb,var(--a) 55%,transparent);background:color-mix(in srgb,var(--a) 14%,transparent)} + .stat-clickable.active b{color:var(--a)} + /* Filter-summary pill = one-click clear (only interactive when a filter is active) */ + #filterSummary.has-active{cursor:pointer;color:var(--text);border-color:color-mix(in srgb,var(--a) 40%,var(--line));transition:background .15s,border-color .15s} + #filterSummary.has-active::after{content:"✕";margin-left:7px;font-size:11px;opacity:.7} + #filterSummary.has-active:hover{background:color-mix(in srgb,var(--a) 14%,transparent);border-color:color-mix(in srgb,var(--a) 55%,transparent)} + .side-backdrop{display:none} + .drawer-actions{display:none} + @media (max-width:920px){ + body{overflow:hidden} + .app{grid-template-columns:1fr;gap:0;padding:0;height:100vh;min-height:0} + .main{height:100vh;min-height:0;border-radius:0;border:0;box-shadow:none} + .content{padding:12px} + .menu-btn{display:inline-flex;align-items:center;justify-content:center;font-size:18px;padding:7px 12px;flex:none;transition:transform .3s cubic-bezier(.22,1,.36,1)} + .menu-btn.open{transform:rotate(90deg)} + #themeBtnTop{display:inline-flex;flex:none} + .side-backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:79;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease} + .side-backdrop.open{opacity:1;visibility:visible} + .side{position:fixed;left:0;top:0;bottom:0;width:min(86vw,330px);max-height:none;z-index:80;transform:translateX(-100%);transition:transform .3s cubic-bezier(.22,1,.36,1);overflow-y:auto;overflow-x:hidden;background:linear-gradient(160deg,rgba(28,29,46,.97),rgba(18,19,30,.99));box-shadow:0 0 60px rgba(0,0,0,.55);border-right:1px solid var(--line)} + [data-theme="light"] .side{background:linear-gradient(160deg,rgba(255,255,255,.98),rgba(247,244,253,.99))} + .side.open{transform:none} + .tag-list{flex:none;max-height:138px;overflow:hidden;transition:max-height .28s cubic-bezier(.22,1,.36,1)} + .tag-list.tags-expanded{max-height:none;overflow:visible} + .tag-list-more.show{display:block} + .footer-note{margin-top:18px} + .drawer-actions{display:grid;gap:8px;margin-top:14px} + .poster-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px} + /* Settings modal: pin header + tabs, only the active pane scrolls — 关闭 stays reachable without a glass-overlap band */ + #settingsModal .modal-card{display:flex;flex-direction:column;overflow:hidden} + #settingsModal .modal-card > .row:first-child, + #settingsModal .settings-tabs, + #settingsModal .settings-footer{flex:none} + #settingsModal .settings-pane.active{flex:1 1 auto;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch} + #syncBtn,#fullSyncBtn,#exportBtn,#settingsBtn,#themeBtn,#cacheCoversBtn,#enrichTagsBtn,#importBtn{display:none} + .top{padding:12px 12px 10px} + .top .row{gap:8px} + .search{min-width:100%;flex:1 1 100%} + #typeDropdown,#sortDropdown{flex:1 1 0;min-width:0} + #typeDropdown .select-trigger,#sortDropdown .select-trigger{width:100%} + /* NSFW floats at the right; left pills scroll the FULL width under it. The float has a SEMI-transparent frosted backing + so pills passing underneath are softly dimmed/blurred but still visible (not fully transparent, not a solid block). */ + .filters{padding:10px 12px;flex-wrap:nowrap;position:relative} + .filters-left{flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-right:100px} + .filters-left::-webkit-scrollbar{display:none} + .filters-left > *{flex:none} + /* NSFW filter floats over the right end of the scroll strip; admin filter-right buttons live in the drawer. + Frosted glass + a theme-colored dim (accent --c blended into --bg, semi-transparent → matches the toolbar tint, + auto-adapts to theme/accent) + a left-side mask so it fades in softly (no hard edge). */ + .filters-right{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;padding:0 12px 0 38px;pointer-events:none;background:linear-gradient(90deg,transparent,color-mix(in srgb,color-mix(in srgb,var(--c) 18%,var(--bg)) 64%,transparent));backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);-webkit-mask-image:linear-gradient(to right,transparent,#000 46px);mask-image:linear-gradient(to right,transparent,#000 46px)} + .filters-right > *{pointer-events:auto} + .filters-right #cacheCoversBtn,.filters-right #enrichTagsBtn,.filters-right #importBtn{display:none} + } + /* Touch devices: no hover-expand on catalog cards (reset every .card:hover to the default state) */ + @media (hover: none){ + .card:hover{transform:none!important;filter:none!important;z-index:auto!important} + .card:hover::before{transform:none!important;box-shadow:var(--v8-card-shadow)!important;border-color:var(--line)!important;background:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.055))!important} + .card:hover::after{opacity:0!important;transform:none!important} + .card:hover .card-glow{opacity:0!important} + .card:hover .cover{transform:none!important;filter:none!important} + .card:hover .card-body{height:calc(var(--v8-card-body) + 2px)!important;transform:none!important;box-shadow:0 -18px 34px rgba(0,0,0,.18)!important;border-radius:0 0 26px 26px!important} + .card:hover .comment{max-height:calc(1.52em * var(--comment-lines))!important} + .card:hover .mini-tags{flex-wrap:nowrap!important;height:24px!important;max-height:24px!important} + .card:hover .r18-badge{bottom:calc(var(--v8-card-body) + 7px)!important} + } + diff --git a/app/fonts/inter/files/inter-latin-ext-wght-normal.woff2 b/app/fonts/inter/files/inter-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000..479d010 Binary files /dev/null and b/app/fonts/inter/files/inter-latin-ext-wght-normal.woff2 differ diff --git a/app/fonts/inter/files/inter-latin-wght-normal.woff2 b/app/fonts/inter/files/inter-latin-wght-normal.woff2 new file mode 100644 index 0000000..d15208d Binary files /dev/null and b/app/fonts/inter/files/inter-latin-wght-normal.woff2 differ diff --git a/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-ext-wght-normal.woff2 b/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000..01769d9 Binary files /dev/null and b/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-ext-wght-normal.woff2 differ diff --git a/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2 b/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2 new file mode 100644 index 0000000..cd5102a Binary files /dev/null and b/app/fonts/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2 differ diff --git a/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-400-normal.woff2 b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-400-normal.woff2 new file mode 100644 index 0000000..d25ea48 Binary files /dev/null and b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-400-normal.woff2 differ diff --git a/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-700-normal.woff2 b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-700-normal.woff2 new file mode 100644 index 0000000..0ae9bcc Binary files /dev/null and b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-japanese-700-normal.woff2 differ diff --git a/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-400-normal.woff2 b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-400-normal.woff2 new file mode 100644 index 0000000..3b059ad Binary files /dev/null and b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-400-normal.woff2 differ diff --git a/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-ext-400-normal.woff2 b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-ext-400-normal.woff2 new file mode 100644 index 0000000..5fe5145 Binary files /dev/null and b/app/fonts/m-plus-rounded-1c/files/m-plus-rounded-1c-latin-ext-400-normal.woff2 differ diff --git a/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-400-normal.woff2 b/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-400-normal.woff2 new file mode 100644 index 0000000..d3d4293 Binary files /dev/null and b/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-400-normal.woff2 differ diff --git a/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-700-normal.woff2 b/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-700-normal.woff2 new file mode 100644 index 0000000..4123611 Binary files /dev/null and b/app/fonts/noto-sans-jp/files/noto-sans-jp-japanese-700-normal.woff2 differ diff --git a/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-400-normal.woff2 b/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-400-normal.woff2 new file mode 100644 index 0000000..73d57da Binary files /dev/null and b/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-400-normal.woff2 differ diff --git a/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-ext-400-normal.woff2 b/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-ext-400-normal.woff2 new file mode 100644 index 0000000..adf59d7 Binary files /dev/null and b/app/fonts/noto-sans-jp/files/noto-sans-jp-latin-ext-400-normal.woff2 differ diff --git a/app/fonts/nunito/files/nunito-latin-ext-wght-normal.woff2 b/app/fonts/nunito/files/nunito-latin-ext-wght-normal.woff2 new file mode 100644 index 0000000..14a9f78 Binary files /dev/null and b/app/fonts/nunito/files/nunito-latin-ext-wght-normal.woff2 differ diff --git a/app/fonts/nunito/files/nunito-latin-wght-normal.woff2 b/app/fonts/nunito/files/nunito-latin-wght-normal.woff2 new file mode 100644 index 0000000..3e909a1 Binary files /dev/null and b/app/fonts/nunito/files/nunito-latin-wght-normal.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-100.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-100.woff2 new file mode 100644 index 0000000..f054dc0 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-100.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-101.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-101.woff2 new file mode 100644 index 0000000..887f68e Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-101.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-102.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-102.woff2 new file mode 100644 index 0000000..6c8a832 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-102.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-103.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-103.woff2 new file mode 100644 index 0000000..5b19efc Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-103.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-104.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-104.woff2 new file mode 100644 index 0000000..e19dcc3 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-104.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-105.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-105.woff2 new file mode 100644 index 0000000..dc24d7c Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-105.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-106.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-106.woff2 new file mode 100644 index 0000000..c3235c4 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-106.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-107.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-107.woff2 new file mode 100644 index 0000000..4ddb66c Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-107.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-108.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-108.woff2 new file mode 100644 index 0000000..4f5c12d Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-108.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-109.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-109.woff2 new file mode 100644 index 0000000..2f331bb Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-109.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-110.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-110.woff2 new file mode 100644 index 0000000..71b0a9d Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-110.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-111.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-111.woff2 new file mode 100644 index 0000000..fb105a1 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-111.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-112.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-112.woff2 new file mode 100644 index 0000000..603eaff Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-112.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-113.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-113.woff2 new file mode 100644 index 0000000..72b5858 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-113.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-114.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-114.woff2 new file mode 100644 index 0000000..0e874e7 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-114.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-115.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-115.woff2 new file mode 100644 index 0000000..1c221e0 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-115.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-116.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-116.woff2 new file mode 100644 index 0000000..e66f0fe Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-116.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-117.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-117.woff2 new file mode 100644 index 0000000..0bad87c Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-117.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-118.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-118.woff2 new file mode 100644 index 0000000..2016bb1 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-118.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-119.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-119.woff2 new file mode 100644 index 0000000..4a14d5d Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-119.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-21.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-21.woff2 new file mode 100644 index 0000000..3b36dc1 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-21.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-22.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-22.woff2 new file mode 100644 index 0000000..58f045e Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-22.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-23.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-23.woff2 new file mode 100644 index 0000000..24fd3b8 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-23.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-24.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-24.woff2 new file mode 100644 index 0000000..10a30ab Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-24.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-25.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-25.woff2 new file mode 100644 index 0000000..7bd9088 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-25.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-26.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-26.woff2 new file mode 100644 index 0000000..5d0c101 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-26.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-27.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-27.woff2 new file mode 100644 index 0000000..f9148ee Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-27.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-28.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-28.woff2 new file mode 100644 index 0000000..95bae3a Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-28.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-29.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-29.woff2 new file mode 100644 index 0000000..0b1a47b Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-29.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-30.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-30.woff2 new file mode 100644 index 0000000..840e989 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-30.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-31.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-31.woff2 new file mode 100644 index 0000000..36a3203 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-31.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-32.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-32.woff2 new file mode 100644 index 0000000..4754cee Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-32.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-33.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-33.woff2 new file mode 100644 index 0000000..d97e335 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-33.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-34.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-34.woff2 new file mode 100644 index 0000000..b67bd57 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-34.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-35.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-35.woff2 new file mode 100644 index 0000000..9298c3f Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-35.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-36.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-36.woff2 new file mode 100644 index 0000000..d42acf9 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-36.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-37.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-37.woff2 new file mode 100644 index 0000000..6cccf24 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-37.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-38.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-38.woff2 new file mode 100644 index 0000000..1d6785a Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-38.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-39.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-39.woff2 new file mode 100644 index 0000000..d8f1ad1 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-39.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-4.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-4.woff2 new file mode 100644 index 0000000..52a3bd0 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-4.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-40.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-40.woff2 new file mode 100644 index 0000000..965b5af Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-40.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-41.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-41.woff2 new file mode 100644 index 0000000..cb123c1 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-41.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-42.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-42.woff2 new file mode 100644 index 0000000..f303058 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-42.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-43.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-43.woff2 new file mode 100644 index 0000000..aecc174 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-43.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-44.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-44.woff2 new file mode 100644 index 0000000..0f4c35c Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-44.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-45.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-45.woff2 new file mode 100644 index 0000000..65f9025 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-45.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-46.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-46.woff2 new file mode 100644 index 0000000..3eaf759 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-46.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-47.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-47.woff2 new file mode 100644 index 0000000..54cdd75 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-47.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-48.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-48.woff2 new file mode 100644 index 0000000..fa79591 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-48.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-49.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-49.woff2 new file mode 100644 index 0000000..d774a14 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-49.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-5.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-5.woff2 new file mode 100644 index 0000000..404eec6 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-5.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-50.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-50.woff2 new file mode 100644 index 0000000..058a705 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-50.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-51.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-51.woff2 new file mode 100644 index 0000000..9fe9778 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-51.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-52.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-52.woff2 new file mode 100644 index 0000000..a2b4330 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-52.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-53.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-53.woff2 new file mode 100644 index 0000000..ef68101 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-53.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-54.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-54.woff2 new file mode 100644 index 0000000..210898e Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-54.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-55.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-55.woff2 new file mode 100644 index 0000000..410697b Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-55.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-56.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-56.woff2 new file mode 100644 index 0000000..9019c52 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-56.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-57.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-57.woff2 new file mode 100644 index 0000000..2ee17e7 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-57.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-58.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-58.woff2 new file mode 100644 index 0000000..d2d8930 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-58.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-59.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-59.woff2 new file mode 100644 index 0000000..17269df Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-59.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-6.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-6.woff2 new file mode 100644 index 0000000..5a86abc Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-6.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-60.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-60.woff2 new file mode 100644 index 0000000..685a381 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-60.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-61.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-61.woff2 new file mode 100644 index 0000000..d3bc67b Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-61.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-62.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-62.woff2 new file mode 100644 index 0000000..630dbdb Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-62.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-63.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-63.woff2 new file mode 100644 index 0000000..676eb52 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-63.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-64.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-64.woff2 new file mode 100644 index 0000000..6beeb7b Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-64.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-65.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-65.woff2 new file mode 100644 index 0000000..0e449aa Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-65.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-66.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-66.woff2 new file mode 100644 index 0000000..5e9d357 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-66.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-67.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-67.woff2 new file mode 100644 index 0000000..a5a9cd5 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-67.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-68.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-68.woff2 new file mode 100644 index 0000000..586dd3f Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-68.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-69.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-69.woff2 new file mode 100644 index 0000000..22fe0cb Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-69.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-70.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-70.woff2 new file mode 100644 index 0000000..30153e2 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-70.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-71.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-71.woff2 new file mode 100644 index 0000000..659f553 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-71.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-72.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-72.woff2 new file mode 100644 index 0000000..29cff9c Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-72.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-73.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-73.woff2 new file mode 100644 index 0000000..8367aaa Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-73.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-74.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-74.woff2 new file mode 100644 index 0000000..7ca34af Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-74.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-75.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-75.woff2 new file mode 100644 index 0000000..28a86e8 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-75.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-76.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-76.woff2 new file mode 100644 index 0000000..4440b70 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-76.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-77.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-77.woff2 new file mode 100644 index 0000000..b68c4a0 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-77.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-78.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-78.woff2 new file mode 100644 index 0000000..f8e71a4 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-78.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-79.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-79.woff2 new file mode 100644 index 0000000..3657a13 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-79.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-80.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-80.woff2 new file mode 100644 index 0000000..f381a55 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-80.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-81.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-81.woff2 new file mode 100644 index 0000000..21ee496 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-81.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-82.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-82.woff2 new file mode 100644 index 0000000..9a9bb05 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-82.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-83.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-83.woff2 new file mode 100644 index 0000000..f5f3181 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-83.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-84.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-84.woff2 new file mode 100644 index 0000000..0db14e7 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-84.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-85.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-85.woff2 new file mode 100644 index 0000000..4eab8b9 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-85.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-86.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-86.woff2 new file mode 100644 index 0000000..b17848b Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-86.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-87.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-87.woff2 new file mode 100644 index 0000000..a16b938 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-87.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-88.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-88.woff2 new file mode 100644 index 0000000..7de80a5 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-88.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-89.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-89.woff2 new file mode 100644 index 0000000..c772a3e Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-89.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-90.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-90.woff2 new file mode 100644 index 0000000..79309ca Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-90.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-91.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-91.woff2 new file mode 100644 index 0000000..afb75a5 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-91.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-97.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-97.woff2 new file mode 100644 index 0000000..71f0404 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-97.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-98.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-98.woff2 new file mode 100644 index 0000000..3631701 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-98.woff2 differ diff --git a/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-99.woff2 b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-99.woff2 new file mode 100644 index 0000000..c310584 Binary files /dev/null and b/app/fonts/wenkai/files/lxgwwenkaiscreen-subset-99.woff2 differ diff --git a/app/js/core.js b/app/js/core.js new file mode 100644 index 0000000..8c6b77c --- /dev/null +++ b/app/js/core.js @@ -0,0 +1,320 @@ +'use strict'; + let authReady = false; + let isPublicMode = false; + let publicShowNsfw = false; + async function apiJSON(path, options = {}){ + const res = await fetch(path, { + cache: 'no-store', + credentials: 'same-origin', + ...options, + headers: { + ...(options.body && !(options.body instanceof Blob) ? {'Content-Type':'application/json'} : {}), + ...(options.headers || {}) + } + }); + if(!res.ok){ + let message = res.statusText; + try{ const js = await res.json(); message = js.error || message; }catch{} + throw new Error(message || `HTTP ${res.status}`); + } + if(res.status === 204) return null; + const text = await res.text(); + return text ? JSON.parse(text) : null; + } + async function ensureSession(){ + const shell = document.getElementById('loginShell'); + const status = document.getElementById('loginStatus'); + const form = document.getElementById('loginForm'); + async function check(){ + try{ + const session = await apiJSON('/api/session'); + authReady = !!session?.authenticated; + isPublicMode = !!session?.publicMode; + publicShowNsfw = !!session?.publicShowNsfw; + }catch{ authReady = false; isPublicMode = false; publicShowNsfw = false; } + if(shell) shell.classList.toggle('hidden', authReady || isPublicMode); + return authReady || isPublicMode; + } + if(await check()) return true; + if(status) status.textContent = ''; + if(form){ + form.onsubmit = async (e) => { + e.preventDefault(); + const input = document.getElementById('adminPasswordInput'); + const button = document.getElementById('loginSubmitBtn'); + if(button) button.disabled = true; + if(status) status.textContent = '验证中…'; + try{ + await apiJSON('/api/login', {method:'POST', body:JSON.stringify({password: input?.value || ''})}); + if(input) input.value = ''; + location.reload(); + }catch(err){ + if(status) status.textContent = '密码不正确,请重试'; + }finally{ + if(button) button.disabled = false; + } + }; + } + return false; + } + async function changeAdminPassword(){ + const current = $('currentAdminPasswordInput')?.value || ''; + const next = $('newAdminPasswordInput')?.value || ''; + if(next.length < 10){ toast('New admin password must be at least 10 characters'); return; } + try{ + await apiJSON('/api/admin/password', {method:'POST', body:JSON.stringify({currentPassword:current, newPassword:next})}); + $('currentAdminPasswordInput').value = ''; + $('newAdminPasswordInput').value = ''; + toast('Admin password changed'); + }catch(err){ toast('Password change failed: ' + err.message); } + } + async function logout(){ + try{ await apiJSON('/api/logout', {method:'POST'}); }catch{} + location.reload(); + } + function bgmApiBase(){ return (state.settings.bgmApiBase || '').trim().replace(/\/+$/,'') || 'https://api.bgm.tv'; } + // Bangumi site base for opening subject/tag pages in the browser (mirror-friendly; not used server-side). + function bgmSiteBase(){ return (state.settings.siteBase || '').trim().replace(/\/+$/,'') || 'https://bgm.tv'; } + const TOKEN_URL = 'https://next.bgm.tv/demo/access-token'; + const SUBJECT_TYPES = [2,1,4,3,6]; + const COLLECTION_TYPES = [1,2,3,4,5]; + const STATUS = {0:'全部',1:'想看',2:'看过',3:'在看',4:'搁置',5:'抛弃',99:'安全箱'}; + const STATUS_BY_TYPE = { + 1:{1:'想读',2:'读过',3:'在读'}, + 3:{1:'想听',2:'听过',3:'在听'}, + 4:{1:'想玩',2:'玩过',3:'在玩'}, + }; + function statusLabelFor(ct, st){ return (STATUS_BY_TYPE[st]?.[ct]) || STATUS[ct] || '未知'; } + const SUBJECT_LABEL = {1:'书籍',2:'动画',3:'音乐',4:'游戏',6:'三次元'}; + const BGM_TYPE_PATH = {1:'book',2:'anime',3:'music',4:'game',6:'real'}; + const DEFAULT_STATE = {schema:9, settings:{username:'', token:'', autoCacheCovers:false, autoSyncEnabled:false, autoSyncCron:'0 2 * * *', autoSyncMode:'recent', autoSyncRangeMode:'fixed', autoSyncRangeValue:3, autoSyncRangeUnit:'month', autoSyncLastRunKey:'', theme:'dark', themeMode:'dark', recentMonths:3, fontFamily:'system', cardSize:'standard', pageSize:120, commentLines:0, motion:'full', borderWidth:1, accentColor:'pink', bgmApiBase:'', imageProxy:'', siteBase:''}, collections:{}, history:[], runs:[]}; + let state = structuredClone(DEFAULT_STATE); + let filters = {status:0, tag:'全部', type:0, q:'', sort:'updated_desc', nsfw:'all', hasComment:false}; + let runtimeToken = ''; + let activeDrawerId = null; + let syncInProgress = false; + let renderLimit = 0; + + const $ = (id) => document.getElementById(id); + const nowISO = () => new Date().toISOString(); + const sleep = (ms) => new Promise(r => setTimeout(r, ms)); + const esc = (s) => String(s ?? '').replace(/[&<>"']/g, m => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m])); + const safeName = (s) => String(s || 'bangumi_vault').replace(/[\\/:*?"<>|]+/g,'_').slice(0,80); + function toast(msg){ const t=$('toast'); t.textContent=msg; t.classList.add('show'); clearTimeout(t._tm); t._tm=setTimeout(()=>t.classList.remove('show'),3200); } + function log(id,msg){ const el=$(id); if(!el) return; el.textContent += `[${new Date().toLocaleTimeString()}] ${msg}\n`; el.scrollTop = el.scrollHeight; } + function setProgress(p){ const pct=Math.max(0,Math.min(100,p)); $('syncBar').style.width = pct + '%'; const mf=$('syncMiniFill'); if(mf) mf.style.width = pct + '%'; const ml=$('syncMiniLabel'); if(ml) ml.textContent = `同步中 ${Math.round(pct)}%`; } + function showSyncMini(){ const el=$('syncMiniBar'); if(el && syncInProgress){ el.classList.remove('smi-done'); el.classList.add('show'); } } + function hideSyncMini(){ const el=$('syncMiniBar'); if(el) el.classList.remove('show'); } + + + function clampNum(v, min, max, fallback){ + const n = Number(v); + return Number.isFinite(n) ? Math.max(min, Math.min(max, n)) : fallback; + } + function pageSize(){ return clampNum(state.settings.pageSize, 40, 360, 120); } + function resetRenderLimit(){ renderLimit = pageSize(); } + function effectiveTheme(){ + const mode = state.settings.themeMode || state.settings.theme || 'dark'; + if(mode === 'system') return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + return mode === 'light' ? 'light' : 'dark'; + } + // Theme toggle icons (stroke = currentColor, matching .tag-search-toggle). Dark active → sun (click to lighten); light → moon. + const THEME_ICON_SUN = ''; + const THEME_ICON_MOON = ''; + function applyAppearance(animate=false, ev=null){ + const update = () => { + const root = document.documentElement; + const theme = effectiveTheme(); + root.dataset.theme = theme; + root.dataset.themeMode = state.settings.themeMode || state.settings.theme || 'dark'; + root.dataset.font = state.settings.fontFamily || 'system'; + root.dataset.cardSize = state.settings.cardSize || 'standard'; + root.dataset.motion = state.settings.motion || 'full'; + root.dataset.accent = state.settings.accentColor || 'pink'; + root.style.setProperty('--comment-lines', String(clampNum(state.settings.commentLines, 0, 6, 0))); + root.style.setProperty('--ui-border-width', clampNum(state.settings.borderWidth, 0, 4, 1) + 'px'); + root.dataset.borderZero = clampNum(state.settings.borderWidth, 0, 4, 1) === 0 ? 'true' : 'false'; + const themeIcon = theme === 'dark' ? THEME_ICON_SUN : THEME_ICON_MOON; + document.querySelectorAll('.theme-toggle').forEach(b => b.innerHTML = themeIcon); + }; + if(!animate || !document.startViewTransition){ update(); return; } + const x = ev?.clientX ?? (window.innerWidth - 96); + const y = ev?.clientY ?? 38; + const endRadius = Math.hypot(Math.max(x, window.innerWidth - x), Math.max(y, window.innerHeight - y)); + const transition = document.startViewTransition(update); + transition.ready.then(() => { + document.documentElement.animate({clipPath:[`circle(0px at ${x}px ${y}px)`,`circle(${endRadius}px at ${x}px ${y}px)`], filter:['blur(18px)','blur(0px)']}, {duration:520, easing:'cubic-bezier(.22,1,.36,1)', pseudoElement:'::view-transition-new(root)'}); + document.documentElement.animate({filter:['blur(0px)','blur(18px)']}, {duration:520, easing:'cubic-bezier(.22,1,.36,1)', pseudoElement:'::view-transition-old(root)'}); + }).catch(()=>{}); + } + async function setThemeMode(mode, ev){ + state.settings.themeMode = mode; + state.settings.theme = mode === 'system' ? effectiveTheme() : mode; + applyAppearance(true, ev); + refreshSegmentedControls(); + await saveSettings(); + } + async function toggleTheme(ev){ + const next = effectiveTheme() === 'dark' ? 'light' : 'dark'; + await setThemeMode(next, ev); + } + function refreshSegmentedControls(){ + document.querySelectorAll('[data-segment]').forEach(group => { + const key = group.dataset.segment; + const value = String(state.settings[key] ?? DEFAULT_STATE.settings[key] ?? ''); + group.querySelectorAll('button[data-value]').forEach(btn => btn.classList.toggle('active', String(btn.dataset.value) === value)); + }); + if($('pageSizeInput')) $('pageSizeInput').value = pageSize(); + if($('commentLinesInput')) $('commentLinesInput').value = clampNum(state.settings.commentLines, 0, 6, 0); + if($('borderWidthInput')) $('borderWidthInput').value = clampNum(state.settings.borderWidth, 0, 4, 1); + } + const APPEARANCE_SEGMENTS = ['themeMode','fontFamily','cardSize','motion','accentColor']; + // Appearance preview snapshot: admin previews on click and we revert on close-without-save. + let appearanceSnapshot = null; + const APPEARANCE_KEYS = ['themeMode','theme','fontFamily','cardSize','motion','accentColor','pageSize','commentLines','borderWidth']; + function snapshotAppearance(){ appearanceSnapshot = {}; for(const k of APPEARANCE_KEYS) appearanceSnapshot[k] = state.settings[k]; } + function restoreAppearance(){ + if(!appearanceSnapshot) return; + let changed = false; + for(const k of APPEARANCE_KEYS){ if(state.settings[k] !== appearanceSnapshot[k]){ state.settings[k] = appearanceSnapshot[k]; changed = true; } } + if(changed){ applyAppearance(false); refreshSegmentedControls(); renderCards(); } + } + function bindSegmentedControls(){ + document.querySelectorAll('[data-segment]').forEach(group => { + const key = group.dataset.segment; + group.querySelectorAll('button[data-value]').forEach(btn => { + btn.onclick = async (e) => { + const value = btn.dataset.value; + state.settings[key] = value; + if(key === 'themeMode'){ + state.settings.theme = value === 'system' ? effectiveTheme() : value; + applyAppearance(true, e); + } else { + applyAppearance(false); + } + refreshSegmentedControls(); + if(APPEARANCE_SEGMENTS.includes(key)){ + // Admin: click is preview-only (persisted via 保存设置). Guest: no save button, so persist locally now. + if(!authReady) await saveSettings(); + if(key === 'cardSize' || key === 'motion') renderCards(); + } + if(key === 'autoSyncMode' || key === 'autoSyncEnabled') updateAutoSyncHelp(); + if(key === 'autoSyncEnabled' && typeof refreshAutoSyncCollapse === 'function') refreshAutoSyncCollapse(); + }; + }); + }); + } + + function openDB(){ + return new Promise((resolve,reject)=>{ + const req = indexedDB.open('BangumiVaultPosterWall', 1); + req.onupgradeneeded = () => { const db=req.result; if(!db.objectStoreNames.contains('kv')) db.createObjectStore('kv', {keyPath:'key'}); }; + req.onsuccess = () => resolve(req.result); req.onerror = () => reject(req.error); + }); + } + async function idbGet(key){ const db=await openDB(); return new Promise((resolve,reject)=>{ const tx=db.transaction('kv','readonly'); const req=tx.objectStore('kv').get(key); req.onsuccess=()=>resolve(req.result?.value); req.onerror=()=>reject(req.error); }); } + async function idbSet(key,value){ const db=await openDB(); return new Promise((resolve,reject)=>{ const tx=db.transaction('kv','readwrite'); tx.objectStore('kv').put({key,value}); tx.oncomplete=()=>resolve(); tx.onerror=()=>reject(tx.error); }); } + async function idbDelete(key){ const db=await openDB(); return new Promise((resolve,reject)=>{ const tx=db.transaction('kv','readwrite'); tx.objectStore('kv').delete(key); tx.oncomplete=()=>resolve(); tx.onerror=()=>reject(tx.error); }); } + const LOCAL_API = (location.protocol === 'http:' || location.protocol === 'https:') ? location.origin : ''; + let localApiKnown = null; + async function localApiAvailable(){ + if(!LOCAL_API) return false; + if(localApiKnown !== null) return localApiKnown; + try{ const r = await fetch('/api/ping', {cache:'no-store'}); localApiKnown = !!(r.ok); } + catch{ localApiKnown = false; } + return localApiKnown; + } + async function localGetJSON(path){ return await apiJSON(path); } + async function localPostJSON(path, obj){ return await apiJSON(path, {method:'POST', body:JSON.stringify(obj)}); } + // History is no longer bundled into /api/state (kept the payload huge); fetch it on demand. + async function fetchSubjectHistory(id){ + if(window.BANGUMI_VAULT_OFFLINE_STATE) return (state.history||[]).filter(h=>String(h.subject_id)===String(id)); + try{ const r = await apiJSON('/api/history?subject_id='+encodeURIComponent(id)); return r?.history || []; }catch{ return []; } + } + // Subject infobox (game type/engine/developer…) is stripped from /api/state. Kept in a separate + // in-memory cache (NOT in `state`, so saveState never posts it back and re-bloats app_state.json). + let infoboxCache = {}; + let infoboxPrefetch = null; + async function fetchSubjectInfobox(id){ + if(window.BANGUMI_VAULT_OFFLINE_STATE){ const local = state.collections?.[id]?.infobox; return Array.isArray(local) ? local : []; } + if(Array.isArray(infoboxCache[id])) return infoboxCache[id]; + // Warm-up window: wait for the in-flight bulk prefetch instead of firing another slow per-subject query. + if(infoboxPrefetch){ try{ await infoboxPrefetch; }catch{} if(Array.isArray(infoboxCache[id])) return infoboxCache[id]; } + try{ const r = await apiJSON('/api/subject-meta?subject_id='+encodeURIComponent(id)); const ib = r?.infobox || []; infoboxCache[id] = ib; return ib; }catch{ return []; } + } + // Background-prefetch every infobox after load so opening any drawer shows 条目资料 instantly. + function prefetchInfoboxes(){ + if(window.BANGUMI_VAULT_OFFLINE_STATE) return; + infoboxPrefetch = (async () => { + try{ + const r = await apiJSON('/api/infoboxes'); + const map = (r && r.infoboxes) || {}; + const next = {}; + for(const id in state.collections) next[id] = Array.isArray(map[id]) ? map[id] : []; + infoboxCache = next; + }catch{} + })(); + return infoboxPrefetch; + } + // Pull the full history back into state (only needed before a backup export). + async function loadFullHistory(){ + if(window.BANGUMI_VAULT_OFFLINE_STATE) return; + if(Array.isArray(state.history) && state.history.length) return; + try{ const r = await apiJSON('/api/history'); if(r?.history) state.history = r.history; }catch{} + } + // Appearance/display prefs a guest may keep locally (never affects the shared library). + const GUEST_PREF_KEYS = ['theme','themeMode','fontFamily','cardSize','motion','borderWidth','pageSize','commentLines']; + async function applyGuestPrefs(){ + if(authReady || !isPublicMode) return; + try{ + const prefs = await idbGet('guestSettings'); + if(prefs) for(const k of GUEST_PREF_KEYS){ if(prefs[k] !== undefined) state.settings[k] = prefs[k]; } + }catch{} + } + async function loadState(){ + try{ + if(window.BANGUMI_VAULT_OFFLINE_STATE){ + state = mergeState(window.BANGUMI_VAULT_OFFLINE_STATE); + } else { + if(await localApiAvailable()){ + const loaded = await localGetJSON('/api/state'); + if(loaded){ state = mergeState(loaded); await applyGuestPrefs(); } + } + // Server (PostgreSQL) is the single source of truth — purge any legacy full-state browser cache. + idbDelete('state').catch(()=>{}); try{ localStorage.removeItem('BangumiVaultState'); }catch{} + } + }catch(e){ console.warn(e); } + runtimeToken = state.settings.token || ''; + applyAppearance(false); resetRenderLimit(); + // Warm the infobox cache ASAP (fire-and-forget; network-bound so it won't block render). Re-runs after each sync's loadState. + if(!window.BANGUMI_VAULT_OFFLINE_STATE) prefetchInfoboxes(); + } + function mergeState(loaded){ + const settings = {...DEFAULT_STATE.settings, ...(loaded.settings||{})}; if(!settings.themeMode) settings.themeMode = settings.theme || 'dark'; return {schema:9, settings, collections:loaded.collections||{}, history:loaded.history||[], runs:loaded.runs||[]}; + } + async function saveState(){ + if(window.BANGUMI_VAULT_OFFLINE_STATE) return; + if(!authReady && isPublicMode){ + try{ await idbSet('guestSettings', structuredClone(state.settings)); }catch{} + return; + } + if(await localApiAvailable()) await localPostJSON('/api/state', structuredClone(state)); + } + // Save only the settings subtree; never touch collections (avoids clobbering server-side sync results). + async function saveSettings(){ + if(window.BANGUMI_VAULT_OFFLINE_STATE) return; + const settings = structuredClone(state.settings); + if(!authReady && isPublicMode){ + try{ await idbSet('guestSettings', settings); }catch{} + return; + } + if(await localApiAvailable()) await localPostJSON('/api/settings', {settings}); + } + // Update one collection's status fields (safety box). Updates local state then patches the server row. + async function setCollectionStatus(id, status, missingCount){ + const row = state.collections[String(id)]; + if(row){ row.status = status; if(missingCount !== undefined) row.missing_count = missingCount; } + try{ await localPostJSON('/api/collections/status', {subject_id:String(id), status, missing_count:missingCount}); } + catch(e){ toast('状态更新失败:' + e.message); } + } + diff --git a/app/js/covers.js b/app/js/covers.js new file mode 100644 index 0000000..9643e68 --- /dev/null +++ b/app/js/covers.js @@ -0,0 +1,85 @@ +'use strict'; + async function cacheCoversAuto(){ + const portable = await localApiAvailable(); + const todo = getAllCollections().filter(c => c.status !== 'confirmed_deleted' && !c.cover_local_url); + if(!todo.length){ log('syncLog','封面自动缓存:全部已缓存,跳过。'); return; } + log('syncLog', `封面自动缓存:开始缓存 ${todo.length} 个未缓存封面${portable ? '到 Docker 文件卷' : '到浏览器 IndexedDB'}...`); + let ok=0, fail=0; + for(let i=0; i{ const r=new FileReader(); r.onload=()=>resolve(r.result); r.onerror=()=>reject(r.error); r.readAsDataURL(blob); }); } + + async function imageBlobToDataURLFromCache(c){ + const offlineData = c.cover_data_url || ''; + const localUrl = c.cover_local_url || ''; + const remoteUrl = onlineCoverUrl(c); + // v0.20: 导出用的 base64 只在内存中的离线副本里生成,不写回 收藏数据.json。 + // Web 运行界面优先使用服务端缓存封面或在线原图。 + if(localUrl){ + try{ const res = await fetch(localUrl, {cache:'no-store'}); if(res.ok) return await blobToDataURL(await res.blob()); }catch{} + } + try{ const cached = await idbGet('img:'+c.subject_id); if(cached?.dataUrl) return cached.dataUrl; }catch{} + if(offlineData) return offlineData; + // 没有本地缓存时,不主动在线拉远端图片进 HTML,避免导出完整 ZIP 时大量跨域下载卡住。 + // 需要离线封面的条目,请先点“缓存当前封面到目录”。 + return ''; + } + async function collectCachedImageFiles(arr,onProgress){ + const files = {}; + let i = 0; + for(const c of arr){ + i++; + if(onProgress) onProgress(i, arr.length, c); + if(!c.cover_local_url) { if(i % 40 === 0) await sleep(0); continue; } + const file = (c.cover_local_file || '').split(/[\\/]/).pop() || (`${c.subject_id}.jpg`); + try{ const res = await fetch(c.cover_local_url, {cache:'no-store'}); if(!res.ok) continue; files['images/' + file] = new Uint8Array(await res.arrayBuffer()); } + catch{} + if(i % 30 === 0) await sleep(0); + } + return files; + } diff --git a/app/js/cron.js b/app/js/cron.js new file mode 100644 index 0000000..34ad27c --- /dev/null +++ b/app/js/cron.js @@ -0,0 +1,267 @@ +'use strict'; + // Visual cron editor + pure cron helpers (5-field: min hour day-of-month month day-of-week). + // Classic script sharing the global scope (uses $, state, updateAutoSyncHelp from other modules). + + const CRON_WEEKDAY_NAMES = ['日', '一', '二', '三', '四', '五', '六']; + // Editor UI state: which frequency preset is active, and the weekly day picks. + const cronUI = { mode: 'daily', weeklyDays: new Set() }; + let rangeUnitDropdown = null; // custom .selectish for the auto-sync range unit + + // Parse one cron field into a sorted array of allowed values. Mirrors the server matcher. + function cronParseField(field, min, max){ + const out = new Set(); + for(const part of String(field).split(',')){ + const m = part.trim().match(/^(\*|\d+)(?:-(\d+))?(?:\/(\d+))?$/); + if(!m) return null; // any invalid token => whole field invalid + const step = m[3] ? Number(m[3]) : 1; + if(step < 1) return null; + let lo, hi; + if(m[1] === '*'){ lo = min; hi = max; } + else { lo = Number(m[1]); hi = m[2] !== undefined ? Number(m[2]) : (m[3] ? max : lo); } + if(lo < min || hi > max || lo > hi) return null; + for(let v = lo; v <= hi; v += step) out.add(v); + } + return [...out].sort((a,b)=>a-b); + } + + function cronValidate(expr){ + const parts = String(expr || '').trim().split(/\s+/); + if(parts.length !== 5) return false; + const ranges = [[0,59],[0,23],[1,31],[1,12],[0,6]]; + return parts.every((p,i)=>cronParseField(p, ranges[i][0], ranges[i][1]) !== null); + } + + function cronMatchesClient(expr, date){ + const parts = String(expr).trim().split(/\s+/); + if(parts.length !== 5) return false; + const [mi, ho, dom, mon, dow] = parts; + const miS = cronParseField(mi,0,59), hoS = cronParseField(ho,0,23), monS = cronParseField(mon,1,12); + const domS = cronParseField(dom,1,31), dowS = cronParseField(dow,0,6); + if(!miS || !hoS || !monS || !domS || !dowS) return false; + if(!miS.includes(date.getMinutes())) return false; + if(!hoS.includes(date.getHours())) return false; + if(!monS.includes(date.getMonth()+1)) return false; + const domR = dom.trim() !== '*', dowR = dow.trim() !== '*'; + const domOk = domS.includes(date.getDate()), dowOk = dowS.includes(date.getDay()); + if(domR && dowR) return domOk || dowOk; + if(domR) return domOk; + if(dowR) return dowOk; + return true; + } + + // Next n run times after `from`, scanning minute by minute up to ~366 days. + function cronNextRuns(expr, n = 3, from = new Date()){ + if(!cronValidate(expr)) return []; + const out = []; + const d = new Date(from.getTime()); + d.setSeconds(0, 0); + d.setMinutes(d.getMinutes() + 1); // start from the next minute + const limit = 366 * 24 * 60; + for(let i = 0; i < limit && out.length < n; i++){ + if(cronMatchesClient(expr, d)) out.push(new Date(d.getTime())); + d.setMinutes(d.getMinutes() + 1); + } + return out; + } + + // Human-readable Chinese description for common cron shapes; falls back to echoing the expression. + function cronDescribe(expr){ + if(!cronValidate(expr)) return '表达式无效'; + const [mi, ho, dom, mon, dow] = expr.trim().split(/\s+/); + const everyMin = mi.match(/^\*\/(\d+)$/); + if(everyMin && ho === '*' && dom === '*' && mon === '*' && dow === '*') return `每隔 ${everyMin[1]} 分钟`; + if(mi === '*' && ho === '*' && dom === '*' && mon === '*' && dow === '*') return '每分钟'; + const everyHour = ho.match(/^\*\/(\d+)$/); + if(/^\d+$/.test(mi) && everyHour && dom === '*' && mon === '*' && dow === '*') return `每隔 ${everyHour[1]} 小时(第 ${mi} 分)`; + const hhmm = (/^\d+$/.test(mi) && /^\d+$/.test(ho)) ? `${String(ho).padStart(2,'0')}:${String(mi).padStart(2,'0')}` : null; + if(hhmm && dom === '*' && mon === '*' && dow === '*') return `每天 ${hhmm}`; + if(hhmm && dom === '*' && mon === '*' && dow !== '*'){ + const days = cronParseField(dow,0,6) || []; + return `每周${days.map(d=>CRON_WEEKDAY_NAMES[d]).join('、')} ${hhmm}`; + } + if(hhmm && dom !== '*' && mon === '*' && dow === '*'){ + const days = cronParseField(dom,1,31) || []; + return `每月 ${days.join('、')} 日 ${hhmm}`; + } + return `cron:${expr.trim()}`; + } + + // --- editor wiring --- + + function clampInt(v, lo, hi, dflt){ const n = Math.round(Number(v)); return Number.isFinite(n) ? Math.max(lo, Math.min(hi, n)) : dflt; } + + function selectCronFreq(mode){ + cronUI.mode = mode; + document.querySelectorAll('#cronFreqRow button[data-freq]').forEach(b=>b.classList.toggle('active', b.dataset.freq === mode)); + const panes = { minutes:'cronFreqMinutes', hours:'cronFreqHours', daily:'cronFreqDaily', weekly:'cronFreqWeekly', custom:'cronFreqCustom' }; + // minutes/hours/daily are inline rows (need flex so their gap/align-items apply); weekly/custom are blocks. + const flexRow = { minutes:1, hours:1, daily:1 }; + for(const [m, id] of Object.entries(panes)){ + const el = $(id); if(!el) continue; + el.style.display = (m === mode) ? (flexRow[m] ? 'flex' : 'block') : 'none'; + } + refreshCronUI(); + } + + // Collapse the auto-sync options when auto-sync is off (values stay in state and are still saved). + function refreshAutoSyncCollapse(){ + const wrap = $('autoSyncOptions'); if(!wrap) return; + wrap.style.display = (String(state.settings.autoSyncEnabled) === 'true') ? 'grid' : 'none'; + } + + // A rough "约 N 小时/天/分钟" estimate of the scheduling interval (gap between the next two fires). + function cronIntervalText(){ + const runs = cronNextRuns(state.settings.autoSyncCron || '0 2 * * *', 2); + if(runs.length < 2) return ''; + const mins = Math.round((runs[1] - runs[0]) / 60000); + if(mins < 60) return `(约 ${mins} 分钟)`; + if(mins % 1440 === 0) return `(约 ${mins/1440} 天)`; + if(mins % 60 === 0) return `(约 ${mins/60} 小时)`; + return `(约 ${Math.round(mins/60*10)/10} 小时)`; + } + + const CRON_UNIT_LABEL = { minute:'分钟', hour:'小时', day:'天', month:'个月' }; + // Convert the scheduling interval (gap between the next two fires) into a {value, unit} pair. + function cronIntervalParts(){ + const runs = cronNextRuns(state.settings.autoSyncCron || '0 2 * * *', 2); + if(runs.length < 2) return null; + const mins = Math.round((runs[1] - runs[0]) / 60000); + if(mins <= 0) return null; + if(mins % 1440 === 0) return { value: mins/1440, unit:'day' }; + if(mins % 60 === 0) return { value: mins/60, unit:'hour' }; + return { value: mins, unit:'minute' }; + } + // Update only the help line (so live typing in fixed mode isn't reset). + function updateAutoSyncRangeHelp(){ + const help = $('autoSyncRangeHelp'); if(!help) return; + const interval = String(state.settings.autoSyncRangeMode) === 'interval'; + const num = $('recentMonthsInput'), unit = $('autoSyncRangeUnit'); + const v = num ? (num.value || 3) : 3; + const u = CRON_UNIT_LABEL[unit ? unit.value : 'month'] || '个月'; + help.textContent = interval + ? `自动同步跟随调度频率,只回看一个调度周期(≈ ${v} ${u});手动“同步最近”不受影响。` + : `自动同步回看最近 ${v} ${u}内更新的条目。手动“同步最近”的范围在它的弹窗里单独设置。`; + } + // Full apply: 'interval' fills the inputs with the computed schedule interval and disables them; + // fixed restores the user's saved value/unit and enables them. + function refreshAutoSyncRange(){ + const interval = String(state.settings.autoSyncRangeMode) === 'interval'; + const num = $('recentMonthsInput'), unit = $('autoSyncRangeUnit'), btn = $('autoSyncRangeBtn'); + if(btn){ btn.classList.toggle('good', interval); btn.textContent = interval ? '跟随调度频率 ✓' : '跟随调度频率'; } + const dd = $('autoSyncRangeUnitDropdown'); + const setUnit = (v)=>{ if(rangeUnitDropdown) rangeUnitDropdown.setValue(v, true); else if(unit) unit.value = v; }; + if(interval){ + const p = cronIntervalParts(); + if(num){ if(p) num.value = p.value; num.disabled = true; } + if(p) setUnit(p.unit); + }else{ + if(num){ num.value = state.settings.autoSyncRangeValue || 3; num.disabled = false; } + setUnit(state.settings.autoSyncRangeUnit || 'month'); + } + if(dd) dd.classList.toggle('disabled', interval); + updateAutoSyncRangeHelp(); + } + + function refreshCronWeeklyDays(){ + document.querySelectorAll('#cronWeeklyDaysRow button[data-day]').forEach(btn=>{ + btn.classList.toggle('active', cronUI.weeklyDays.has(Number(btn.dataset.day))); + }); + } + + // Read the active preset controls and produce a cron string. + function buildCronFromControls(){ + switch(cronUI.mode){ + case 'minutes': { + const n = clampInt($('cronEveryMinutes')?.value, 1, 59, 30); + return `*/${n} * * * *`; + } + case 'hours': { + const n = clampInt($('cronEveryHours')?.value, 1, 23, 4); + const m = clampInt($('cronHourMinute')?.value, 0, 59, 0); + return `${m} */${n} * * *`; + } + case 'daily': { + const [h, m] = String($('cronDailyTime')?.value || '02:00').split(':').map(Number); + return `${m || 0} ${h || 0} * * *`; + } + case 'weekly': { + const [h, m] = String($('cronWeeklyTime')?.value || '08:00').split(':').map(Number); + const days = [...cronUI.weeklyDays].sort((a,b)=>a-b); + const dow = days.length ? days.join(',') : '*'; + return `${m || 0} ${h || 0} * * ${dow}`; + } + case 'custom': + default: + return String($('cronCustomInput')?.value || '').trim(); + } + } + + // Parse a cron string and reflect it back into the preset controls (best-effort; else 'custom'). + function applyCronToControls(cron){ + const expr = cronValidate(cron) ? cron.trim() : '0 2 * * *'; + const [mi, ho, dom, mon, dow] = expr.split(/\s+/); + if($('cronCustomInput')) $('cronCustomInput').value = expr; + let mode = 'custom'; + const everyMin = mi.match(/^\*\/(\d+)$/); + const everyHour = ho.match(/^\*\/(\d+)$/); + if(everyMin && ho === '*' && dom === '*' && mon === '*' && dow === '*'){ + mode = 'minutes'; if($('cronEveryMinutes')) $('cronEveryMinutes').value = everyMin[1]; + } else if(/^\d+$/.test(mi) && everyHour && dom === '*' && mon === '*' && dow === '*'){ + mode = 'hours'; if($('cronEveryHours')) $('cronEveryHours').value = everyHour[1]; if($('cronHourMinute')) $('cronHourMinute').value = Number(mi); + } else if(/^\d+$/.test(mi) && /^\d+$/.test(ho) && dom === '*' && mon === '*' && dow === '*'){ + mode = 'daily'; if($('cronDailyTime')) $('cronDailyTime').value = `${String(ho).padStart(2,'0')}:${String(mi).padStart(2,'0')}`; + } else if(/^\d+$/.test(mi) && /^\d+$/.test(ho) && dom === '*' && mon === '*' && dow !== '*' && cronParseField(dow,0,6)){ + mode = 'weekly'; + if($('cronWeeklyTime')) $('cronWeeklyTime').value = `${String(ho).padStart(2,'0')}:${String(mi).padStart(2,'0')}`; + cronUI.weeklyDays = new Set(cronParseField(dow,0,6)); + } + cronUI.mode = mode; + refreshCronWeeklyDays(); + selectCronFreq(mode); + } + + function refreshCronUI(){ + const cron = buildCronFromControls(); + state.settings.autoSyncCron = cron; + const exprEl = $('cronExprText'); if(exprEl) exprEl.textContent = cron || '(空)'; + const nextEl = $('cronNextText'); + if(nextEl){ + if(!cronValidate(cron)){ nextEl.textContent = '表达式无效,请检查'; } + else { + const runs = cronNextRuns(cron, 3); + nextEl.textContent = runs.length ? '下次运行:' + runs.map(d=>d.toLocaleString()).join(';') : '一年内无匹配时间'; + } + } + if(typeof updateAutoSyncHelp === 'function') updateAutoSyncHelp(); + // In interval mode the range tracks the cron, so re-fill it when the cron changes. + if(String(state.settings.autoSyncRangeMode) === 'interval') refreshAutoSyncRange(); + } + + function bindCronEditor(){ + document.querySelectorAll('#cronFreqRow button[data-freq]').forEach(btn=>{ btn.onclick = ()=>selectCronFreq(btn.dataset.freq); }); + const enabledInput = $('autoSyncEnabledInput'); + if(enabledInput) enabledInput.onchange = ()=>{ + state.settings.autoSyncEnabled = enabledInput.checked; + refreshAutoSyncCollapse(); + if(typeof updateAutoSyncHelp === 'function') updateAutoSyncHelp(); + }; + const rangeBtn = $('autoSyncRangeBtn'); + if(rangeBtn) rangeBtn.onclick = ()=>{ + state.settings.autoSyncRangeMode = (String(state.settings.autoSyncRangeMode) === 'interval') ? 'fixed' : 'interval'; + refreshAutoSyncRange(); + }; + // Live-update only the help when the user edits the value (don't reset the field). + const rangeNum = $('recentMonthsInput'); if(rangeNum) rangeNum.addEventListener('input', updateAutoSyncRangeHelp); + // Custom .selectish dropdown for the unit (matches the type/sort dropdowns); onChange refreshes the help. + if(typeof setupDropdown === 'function') rangeUnitDropdown = setupDropdown('autoSyncRangeUnitDropdown','autoSyncRangeUnit','autoSyncRangeUnitLabel', ()=>updateAutoSyncRangeHelp()); + ['cronEveryMinutes','cronEveryHours','cronHourMinute','cronDailyTime','cronWeeklyTime','cronCustomInput'].forEach(id=>{ + const el = $(id); if(el) el.oninput = refreshCronUI; + }); + document.querySelectorAll('#cronWeeklyDaysRow button[data-day]').forEach(btn=>{ + btn.onclick = ()=>{ + const d = Number(btn.dataset.day); + if(cronUI.weeklyDays.has(d)) cronUI.weeklyDays.delete(d); else cronUI.weeklyDays.add(d); + refreshCronWeeklyDays(); refreshCronUI(); + }; + }); + } diff --git a/app/js/exports.js b/app/js/exports.js new file mode 100644 index 0000000..fbad0bd --- /dev/null +++ b/app/js/exports.js @@ -0,0 +1,594 @@ +'use strict'; + function safeExportState(){ + const s=structuredClone(state); + delete s.settings.token; + // v0.20: 常规 JSON 备份不携带 base64 图片,避免 state 变巨大;离线 HTML 会临时内嵌。 + for(const c of Object.values(s.collections || {})) delete c.cover_data_url; + return s; + } + function manifest(){ const arr=getAllCollections(); return {app:'Bangumi 保管库 PosterWall', schema:9, exported_at:nowISO(), username:state.settings.username||'', collections_count:arr.length, active_count:arr.filter(c=>c.status!=='confirmed_deleted'&&c.status!=='missing_candidate').length, missing_count:arr.filter(c=>c.status==='missing_candidate').length, history_count:state.history.length}; } + function buildJson(){ return JSON.stringify({manifest:manifest(), state:safeExportState()}, null, 2); } + function csvCell(s){ return '"' + String(s ?? '').replace(/"/g,'""') + '"'; } + function buildCsv(){ + const head=['subject_id','分类','状态','标题','原名','中文名','日期','我的评分','Bangumi均分','进度章节','进度卷','我的标签','公共标签','全部标签','吐槽/观后感','是否私密','条目最后更新时间','本地同步时间','本地状态','首次备份','最后确认存在']; + const lines=[head.map(csvCell).join(',')]; + for(const c of getAllCollections()) lines.push([c.subject_id,SUBJECT_LABEL[c.subject_type]||c.subject_type,STATUS[c.collection_type]||c.collection_type,c.title,c.name,c.name_cn,c.date,c.rate,(formatScoreValue(c.bgm_score || c.raw?.subject?.score || c.raw?.subject?.rating?.score) || ''),c.ep_status,c.vol_status,myTagsOf(c).join(' / '),publicTagNames(c).join(' / '),allTagNames(c).join(' / '),c.comment,c.private?'是':'否',c.bangumi_updated_at,c.last_synced_at || c.last_seen_at || '',c.status,c.first_seen_at,c.last_seen_at].map(csvCell).join(',')); + return '\ufeff' + lines.join('\r\n'); + } + async function enrichExportCollections(mode='inline', onProgress){ + const arr = getAllCollections().map(c=>structuredClone(c)); + let i = 0; + for(const c of arr){ + i++; + if(onProgress) onProgress(i, arr.length, c); + if(mode === 'relative' && c.cover_local_file){ + const file = String(c.cover_local_file).split(/[\\/]/).pop(); + c.cover_local_url = 'images/' + file; + delete c.cover_data_url; + } else { + const dataUrl = await imageBlobToDataURLFromCache(c); + if(dataUrl){ + c.cover_data_url = dataUrl; + // 离线 HTML 优先使用内嵌图片,避免 /images/... 在 file:// 或压缩包预览中失效。 + delete c.cover_local_url; + delete c.cover_local_file; + } else { + // 没缓存到本地的条目,离线 HTML 可以在有网时继续显示远程图;离线则显示占位。 + delete c.cover_data_url; + } + } + if(i % 25 === 0) await sleep(0); + } + return arr; + } + async function buildOfflineHtml(mode='inline', onProgress){ + const offlineState = safeExportState(); + offlineState.collections = {}; + for(const c of await enrichExportCollections(mode, onProgress)) offlineState.collections[String(c.subject_id)] = c; + const payload = JSON.stringify(offlineState).replace(/ 一起删掉,导致离线 HTML 点击海报后没有详情容器。 + // 这里克隆整页,只移除打开态/关闭态,并清空详情容器,保留设置、导出、drawer、toast 等必要节点。 + const cloned = document.documentElement.cloneNode(true); + cloned.querySelectorAll('.show,.closing').forEach(el => el.classList.remove('show','closing')); + const drawer = cloned.querySelector('#drawer'); + if(drawer) drawer.innerHTML = ''; + cloned.querySelectorAll('.sync-log').forEach(el => { el.textContent = ''; }); + const toastEl = cloned.querySelector('#toast'); + if(toastEl) toastEl.textContent = ''; + + // Inline the stylesheet so the exported file is self-contained. + try{ + const cssText = await fetch('css/styles.css').then(r=>r.text()); + const link = cloned.querySelector('link[rel="stylesheet"]'); + if(link){ const styleEl = document.createElement('style'); styleEl.textContent = cssText; link.replaceWith(styleEl); } + }catch{} + + // Bundle every JS module into one inline script. The modules behave as ordered classic + // scripts (shared scope), so concatenating them inside one IIFE reproduces the live app. + const moduleNames = ['core','model','view','cron','sync','covers','exports','main']; + let bundleBody = ''; + for(const n of moduleNames){ + try{ bundleBody += (await fetch('js/'+n+'.js').then(r=>r.text())) + '\n'; }catch{} + } + // Escape any literal closing-script token so the inline