ehbrowser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +531 -0
  3. package/dist/api/contract.js +7 -0
  4. package/dist/api/dto/auth.js +5 -0
  5. package/dist/api/dto/common.js +6 -0
  6. package/dist/api/dto/download.js +5 -0
  7. package/dist/api/dto/favorite.js +5 -0
  8. package/dist/api/dto/gallery.js +43 -0
  9. package/dist/api/dto/index.js +6 -0
  10. package/dist/api/dto/library.js +5 -0
  11. package/dist/api/dto/log.js +5 -0
  12. package/dist/api/dto/playlist.js +8 -0
  13. package/dist/api/dto/settings.js +5 -0
  14. package/dist/api/dto/storage.js +5 -0
  15. package/dist/api/dto/translate.js +6 -0
  16. package/dist/api/envelope.js +41 -0
  17. package/dist/api/events.js +20 -0
  18. package/dist/api/index.js +12 -0
  19. package/dist/api/routes.js +516 -0
  20. package/dist/config/atomic.js +85 -0
  21. package/dist/config/auth-setting.js +97 -0
  22. package/dist/config/cli.js +19 -0
  23. package/dist/config/db.js +168 -0
  24. package/dist/config/index.js +48 -0
  25. package/dist/config/json-store.js +219 -0
  26. package/dist/config/migrations.js +100 -0
  27. package/dist/config/schema.js +108 -0
  28. package/dist/config/user-setting.js +21 -0
  29. package/dist/config/validate.js +173 -0
  30. package/dist/eh/api.js +106 -0
  31. package/dist/eh/archives.js +100 -0
  32. package/dist/eh/auth.js +89 -0
  33. package/dist/eh/cookies.js +65 -0
  34. package/dist/eh/favorites.js +94 -0
  35. package/dist/eh/html.js +158 -0
  36. package/dist/eh/http.js +214 -0
  37. package/dist/eh/index.js +13 -0
  38. package/dist/eh/types.js +11 -0
  39. package/dist/eh/urls.js +81 -0
  40. package/dist/main.js +170 -0
  41. package/dist/platform/errors.js +76 -0
  42. package/dist/platform/open-external.js +90 -0
  43. package/dist/platform/os.js +28 -0
  44. package/dist/platform/paths.js +140 -0
  45. package/dist/server.js +1074 -0
  46. package/dist/services/auth-service.js +276 -0
  47. package/dist/services/config-service.js +227 -0
  48. package/dist/services/detail-cache.js +193 -0
  49. package/dist/services/detail-store.js +208 -0
  50. package/dist/services/download-file.js +127 -0
  51. package/dist/services/download-service.js +586 -0
  52. package/dist/services/favorite-service.js +237 -0
  53. package/dist/services/gallery-service.js +403 -0
  54. package/dist/services/local-library.js +471 -0
  55. package/dist/services/log-service.js +139 -0
  56. package/dist/services/playlist-service.js +85 -0
  57. package/dist/services/search-cache.js +78 -0
  58. package/dist/services/storage-service.js +27 -0
  59. package/dist/services/translate-service.js +208 -0
  60. package/dist/services/update-service.js +268 -0
  61. package/dist/services/upstream-service.js +64 -0
  62. package/dist/services/zip.js +210 -0
  63. package/dist/web/assets/index-C0tAHpmx.css +1 -0
  64. package/dist/web/assets/index-myYEnJ1q.js +4 -0
  65. package/dist/web/index.html +13 -0
  66. package/package.json +63 -0
@@ -0,0 +1,210 @@
1
+ /*
2
+ * 最小 zip 读取器。只做本地库需要的两件事:按中央目录顺序列出条目、把某一条解到磁盘。
3
+ * 支持 stored(0) 与 deflate(8),解压后校验 CRC32;中央目录与条目尺寸支持 Zip64。
4
+ * 不处理加密、分卷与自解压头;条目数据用随机读,不把整个归档读进内存。
5
+ */
6
+ import { open, writeFile } from "node:fs/promises";
7
+ import { inflateRaw } from "node:zlib";
8
+ import { promisify } from "node:util";
9
+ const inflate = promisify(inflateRaw);
10
+ const EOCD_SIGNATURE = 0x06054b50;
11
+ const ZIP64_LOCATOR_SIGNATURE = 0x07064b50;
12
+ const ZIP64_EOCD_SIGNATURE = 0x06064b50;
13
+ const CENTRAL_SIGNATURE = 0x02014b50;
14
+ const LOCAL_SIGNATURE = 0x04034b50;
15
+ /** 尾部里找 EOCD 的范围:注释最长 64KB,加上 EOCD 自身 22 字节 */
16
+ const TAIL_SCAN_BYTES = 0xffff + 22;
17
+ /** 一条中央目录记录的固定部分长度 */
18
+ const CENTRAL_FIXED_BYTES = 46;
19
+ const LOCAL_FIXED_BYTES = 30;
20
+ /** 目录分隔符统一为 /,便于按层级过滤 */
21
+ function normalizeName(name) {
22
+ return name.replaceAll("\\", "/");
23
+ }
24
+ /** 是否为目录条目。目录只占位,不参与解压 */
25
+ export function isDirectory(entry) {
26
+ return entry.name.endsWith("/") || entry.name.endsWith("\\");
27
+ }
28
+ async function readAt(handle, length, position) {
29
+ const buffer = Buffer.alloc(length);
30
+ const { bytesRead } = await handle.read(buffer, 0, length, position);
31
+ if (bytesRead < length) {
32
+ throw new Error(`归档读取不完整:位置 ${position} 需要 ${length} 字节,实际 ${bytesRead}`);
33
+ }
34
+ return buffer;
35
+ }
36
+ /** 从尾部找出中央目录的位置与条目数。返回的是相对整个文件的偏移 */
37
+ async function readDirectoryLocation(handle, fileSize) {
38
+ const tailLength = Math.min(fileSize, TAIL_SCAN_BYTES);
39
+ const tail = await readAt(handle, tailLength, fileSize - tailLength);
40
+ let eocd = -1;
41
+ for (let index = tail.length - 22; index >= 0; index -= 1) {
42
+ if (tail.readUInt32LE(index) === EOCD_SIGNATURE) {
43
+ eocd = index;
44
+ break;
45
+ }
46
+ }
47
+ if (eocd === -1) {
48
+ throw new Error("不是有效的 zip:找不到中央目录结束记录");
49
+ }
50
+ let count = tail.readUInt16LE(eocd + 10);
51
+ let size = tail.readUInt32LE(eocd + 12);
52
+ let offset = tail.readUInt32LE(eocd + 16);
53
+ // 三项里出现 sentinel 就说明用的是 Zip64,真正的值在 Zip64 记录里
54
+ const needsZip64 = count === 0xffff || size === 0xffffffff || offset === 0xffffffff || eocd < 20;
55
+ if (!needsZip64) {
56
+ return { offset, size, count };
57
+ }
58
+ if (eocd < 20) {
59
+ throw new Error("不是有效的 zip:Zip64 定位记录缺失");
60
+ }
61
+ const locator = tail.subarray(eocd - 20, eocd);
62
+ if (locator.readUInt32LE(0) !== ZIP64_LOCATOR_SIGNATURE) {
63
+ throw new Error("不是有效的 zip:Zip64 定位记录缺失");
64
+ }
65
+ const zip64Offset = Number(locator.readBigUInt64LE(8));
66
+ const record = await readAt(handle, 56, zip64Offset);
67
+ if (record.readUInt32LE(0) !== ZIP64_EOCD_SIGNATURE) {
68
+ throw new Error("不是有效的 zip:Zip64 结束记录缺失");
69
+ }
70
+ count = Number(record.readBigUInt64LE(32));
71
+ size = Number(record.readBigUInt64LE(40));
72
+ offset = Number(record.readBigUInt64LE(48));
73
+ return { offset, size, count };
74
+ }
75
+ /** 条目里的 Zip64 附加字段:按 sentinel 出现顺序依次给出被省略的值 */
76
+ function parseZip64Extra(extra, fields) {
77
+ let at = 0;
78
+ while (at + 4 <= extra.length) {
79
+ const id = extra.readUInt16LE(at);
80
+ const length = extra.readUInt16LE(at + 2);
81
+ const body = extra.subarray(at + 4, at + 4 + length);
82
+ if (id === 0x0001) {
83
+ let cursor = 0;
84
+ const result = {};
85
+ if (fields.size && cursor + 8 <= body.length) {
86
+ result.size = Number(body.readBigUInt64LE(cursor));
87
+ cursor += 8;
88
+ }
89
+ if (fields.compressedSize && cursor + 8 <= body.length) {
90
+ result.compressedSize = Number(body.readBigUInt64LE(cursor));
91
+ cursor += 8;
92
+ }
93
+ if (fields.headerOffset && cursor + 8 <= body.length) {
94
+ result.headerOffset = Number(body.readBigUInt64LE(cursor));
95
+ }
96
+ return result;
97
+ }
98
+ at += 4 + length;
99
+ }
100
+ return {};
101
+ }
102
+ /** 列出归档里的条目,顺序与归档内一致(也就是分页顺序) */
103
+ export async function readZipEntries(file) {
104
+ const handle = await open(file, "r");
105
+ try {
106
+ const { size: fileSize } = await handle.stat();
107
+ const location = await readDirectoryLocation(handle, fileSize);
108
+ const directory = await readAt(handle, location.size, location.offset);
109
+ const entries = [];
110
+ let at = 0;
111
+ for (let index = 0; index < location.count; index += 1) {
112
+ if (at + CENTRAL_FIXED_BYTES > directory.length) {
113
+ throw new Error("zip 中央目录不完整");
114
+ }
115
+ if (directory.readUInt32LE(at) !== CENTRAL_SIGNATURE) {
116
+ throw new Error("zip 中央目录记录签名不对");
117
+ }
118
+ const method = directory.readUInt16LE(at + 10);
119
+ const rawCrc = directory.readUInt32LE(at + 16);
120
+ let compressedSize = directory.readUInt32LE(at + 20);
121
+ let size = directory.readUInt32LE(at + 24);
122
+ const nameLength = directory.readUInt16LE(at + 28);
123
+ const extraLength = directory.readUInt16LE(at + 30);
124
+ const commentLength = directory.readUInt16LE(at + 32);
125
+ let headerOffset = directory.readUInt32LE(at + 42);
126
+ const name = normalizeName(directory
127
+ .subarray(at + CENTRAL_FIXED_BYTES, at + CENTRAL_FIXED_BYTES + nameLength)
128
+ .toString("utf8"));
129
+ const extra = directory.subarray(at + CENTRAL_FIXED_BYTES + nameLength, at + CENTRAL_FIXED_BYTES + nameLength + extraLength);
130
+ const zip64 = parseZip64Extra(extra, {
131
+ size: size === 0xffffffff,
132
+ compressedSize: compressedSize === 0xffffffff,
133
+ headerOffset: headerOffset === 0xffffffff,
134
+ });
135
+ if (zip64.size !== undefined) {
136
+ size = zip64.size;
137
+ }
138
+ if (zip64.compressedSize !== undefined) {
139
+ compressedSize = zip64.compressedSize;
140
+ }
141
+ if (zip64.headerOffset !== undefined) {
142
+ headerOffset = zip64.headerOffset;
143
+ }
144
+ entries.push({ name, method, compressedSize, size, crc32: rawCrc, headerOffset });
145
+ at += CENTRAL_FIXED_BYTES + nameLength + extraLength + commentLength;
146
+ }
147
+ return entries;
148
+ }
149
+ finally {
150
+ await handle.close();
151
+ }
152
+ }
153
+ /** CRC32 查表,首次使用时算出来 */
154
+ let crcTable = null;
155
+ function crc32(buffer) {
156
+ if (crcTable === null) {
157
+ const table = new Uint32Array(256);
158
+ for (let index = 0; index < 256; index += 1) {
159
+ let value = index;
160
+ for (let bit = 0; bit < 8; bit += 1) {
161
+ value = (value & 1) === 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
162
+ }
163
+ table[index] = value >>> 0;
164
+ }
165
+ crcTable = table;
166
+ }
167
+ let crc = 0xffffffff;
168
+ for (const byte of buffer) {
169
+ crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);
170
+ }
171
+ return (crc ^ 0xffffffff) >>> 0;
172
+ }
173
+ /**
174
+ * 解出某一条到 targetPath
175
+ * 压缩数据一次性读进内存:单个条目是图片,几 MB 量级,整体归档多大都不影响
176
+ */
177
+ export async function extractEntry(file, entry, targetPath) {
178
+ const handle = await open(file, "r");
179
+ try {
180
+ const header = await readAt(handle, LOCAL_FIXED_BYTES, entry.headerOffset);
181
+ if (header.readUInt32LE(0) !== LOCAL_SIGNATURE) {
182
+ throw new Error(`条目头签名不对:${entry.name}`);
183
+ }
184
+ const nameLength = header.readUInt16LE(26);
185
+ const extraLength = header.readUInt16LE(28);
186
+ const dataOffset = entry.headerOffset + LOCAL_FIXED_BYTES + nameLength + extraLength;
187
+ const compressed = await readAt(handle, entry.compressedSize, dataOffset);
188
+ let data;
189
+ if (entry.method === 0) {
190
+ data = compressed;
191
+ }
192
+ else if (entry.method === 8) {
193
+ data = await inflate(compressed);
194
+ }
195
+ else {
196
+ throw new Error(`不支持的压缩方式 ${entry.method}:${entry.name}`);
197
+ }
198
+ if (data.length !== entry.size) {
199
+ throw new Error(`解压后大小不符:${entry.name}(${data.length} != ${entry.size})`);
200
+ }
201
+ // 中央目录里的 CRC 是解压后的校验值,对不上说明归档损坏,此时报错而不落盘
202
+ if (entry.crc32 !== 0 && crc32(data) !== entry.crc32) {
203
+ throw new Error(`CRC 校验失败:${entry.name}`);
204
+ }
205
+ await writeFile(targetPath, data);
206
+ }
207
+ finally {
208
+ await handle.close();
209
+ }
210
+ }
@@ -0,0 +1 @@
1
+ :root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:#ffffffb3;--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-light:#757575;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error);--toastify-color-progress-colored:#ddd}.Toastify__toast-container{box-sizing:border-box;color:#fff;transform:translate3d(0,0,var(--toastify-z-index) px);width:var(--toastify-toast-width);z-index:var(--toastify-z-index);padding:4px;position:fixed}.Toastify__toast-container--top-left{top:1em;left:1em}.Toastify__toast-container--top-center{top:1em;left:50%;transform:translate(-50%)}.Toastify__toast-container--top-right{top:1em;right:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;transform:translate(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (width<=480px){.Toastify__toast-container{width:100vw;margin:0;padding:0;left:0}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;transform:translate(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;transform:translate(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{box-sizing:border-box;cursor:pointer;font-family:var(--toastify-font-family);max-height:var(--toastify-toast-max-height);min-height:var(--toastify-toast-min-height);z-index:0;direction:ltr;border-radius:4px;justify-content:space-between;margin-bottom:1rem;padding:8px;display:flex;position:relative;overflow:hidden;box-shadow:0 1px 10px #0000001a,0 2px 15px #0000000d}.Toastify__toast--rtl{direction:rtl}.Toastify__toast-body{white-space:pre-wrap;flex:auto;align-items:center;margin:auto 0;padding:6px;display:flex}.Toastify__toast-body>div:last-child{flex:1}.Toastify__toast-icon{flex-shrink:0;width:20px;margin-inline-end:10px;display:flex}.Toastify__toast-text{flex-direction:column;gap:2px;width:100%;line-height:1.35;display:flex}.Toastify__toast-text-title{font-weight:600}.Toastify__toast-text-content{opacity:.92}.Toastify--animate{animation-duration:.7s;animation-fill-mode:both}.Toastify--animate-icon{animation-duration:.3s;animation-fill-mode:both}@media only screen and (width<=480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:var(--toastify-color-info);color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:var(--toastify-color-success);color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:var(--toastify-color-warning);color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:var(--toastify-color-error);color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--default{background:var(--toastify-color-progress-colored)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;cursor:pointer;opacity:.7;background:0 0;border:none;outline:none;align-self:flex-start;padding:0;transition:all .3s}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;width:14px;height:16px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{opacity:.7;transform-origin:0;width:100%;height:5px;z-index:var(--toastify-z-index);position:absolute;bottom:0;left:0}.Toastify__progress-bar--animated{animation:linear forwards Toastify__trackProgress}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{transform-origin:100%;left:auto;right:0}.Toastify__spinner{border:2px solid;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);box-sizing:border-box;border-radius:100%;width:20px;height:20px;animation:.65s linear infinite Toastify__spin}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate(3000px)}60%{opacity:1;transform:translate(-25px)}75%{transform:translate(10px)}90%{transform:translate(-5px)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate(-20px)}to{opacity:0;transform:translate(2000px)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate(-3000px)}60%{opacity:1;transform:translate(25px)}75%{transform:translate(-10px)}90%{transform:translate(5px)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate(20px)}to{opacity:0;transform:translate(-2000px)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translateY(3000px)}60%{opacity:1;transform:translateY(-20px)}75%{transform:translateY(10px)}90%{transform:translateY(-5px)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translateY(-10px)}40%,45%{opacity:1;transform:translateY(20px)}to{opacity:0;transform:translateY(-2000px)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translateY(-3000px)}60%{opacity:1;transform:translateY(25px)}75%{transform:translateY(-10px)}90%{transform:translateY(5px)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translateY(10px)}40%,45%{opacity:1;transform:translateY(-20px)}to{opacity:0;transform:translateY(2000px)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__none{0%,60%,75%,90%,to{animation-duration:0;animation-timing-function:none}0%{opacity:1;transform:translateZ(0)}to{transform:translateZ(0)}}.Toastify__none-enter--bottom-center,.Toastify__none-enter--bottom-left,.Toastify__none-enter--bottom-right,.Toastify__none-enter--top-center,.Toastify__none-enter--top-left,.Toastify__none-enter--top-right{animation-name:Toastify__none}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{opacity:0;animation-timing-function:ease-in;transform:perspective(400px)rotateX(90deg)}40%{animation-timing-function:ease-in;transform:perspective(400px)rotateX(-20deg)}60%{opacity:1;transform:perspective(400px)rotateX(10deg)}80%{transform:perspective(400px)rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px)rotateX(-20deg)}to{opacity:0;transform:perspective(400px)rotateX(90deg)}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{visibility:visible;transform:translate(110%)}to{transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{visibility:visible;transform:translate(-110%)}to{transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{visibility:visible;transform:translateY(110%)}to{transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{visibility:visible;transform:translateY(-110%)}to{transform:translateZ(0)}}@keyframes Toastify__slideOutRight{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate(110%)}}@keyframes Toastify__slideOutLeft{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate(-110%)}}@keyframes Toastify__slideOutDown{0%{transform:translateZ(0)}to{visibility:hidden;transform:translateY(500px)}}@keyframes Toastify__slideOutUp{0%{transform:translateZ(0)}to{visibility:hidden;transform:translateY(-500px)}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}#nprogress{pointer-events:none}#nprogress .bar{z-index:1031;background:#29d;width:100%;height:2px;position:fixed;top:0;left:0}#nprogress .peg{opacity:1;width:100px;height:100%;display:block;position:absolute;right:0;-webkit-transform:rotate(3deg)translateY(-4px);-ms-transform:rotate(3deg)translateY(-4px);transform:rotate(3deg)translateY(-4px);box-shadow:0 0 10px #29d,0 0 5px #29d}#nprogress .spinner{z-index:1031;display:block;position:fixed;top:15px;right:15px}#nprogress .spinner-icon{box-sizing:border-box;border:2px solid #0000;border-color:#29d #0000 #0000 #29d;border-radius:50%;width:18px;height:18px;-webkit-animation:.4s linear infinite nprogress-spinner;animation:.4s linear infinite nprogress-spinner}.nprogress-custom-parent{position:relative;overflow:hidden}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.box[data-v-802c20c9]{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px}h2[data-v-802c20c9]{font-size:var(--font-size-base);color:var(--accent);margin:0 0 8px}h2[data-v-802c20c9]:not(:first-child){margin-top:22px}dl[data-v-802c20c9]{font-size:var(--font-size-md);grid-template-columns:max-content 1fr;gap:2px 14px;margin:0;display:grid}dt[data-v-802c20c9]{color:var(--muted)}dd[data-v-802c20c9]{margin:0}.grid[data-v-802c20c9]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;display:grid}table[data-v-802c20c9]{border-collapse:collapse;width:100%;font-size:var(--font-size-md)}th[data-v-802c20c9]{text-align:left;color:var(--muted);padding:4px 8px 4px 0;font-weight:500}td[data-v-802c20c9]{border-top:1px solid var(--line);padding:4px 8px 4px 0}.ops[data-v-802c20c9]{gap:6px;display:flex}.ops button[data-v-802c20c9]{font-size:var(--font-size-sm);padding:2px 8px}.actions[data-v-802c20c9]{align-items:center;gap:12px;margin-top:14px;display:flex}.mask[data-v-ab613432]{z-index:var(--z-dialog);background:#00000094;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.dialog[data-v-ab613432]{width:min(var(--dialog-width,420px), 100%);background:var(--panel);border:1px solid var(--line);border-radius:8px;outline:none;flex-direction:column;max-height:80vh;display:flex;overflow:hidden;box-shadow:0 24px 64px #0000008c}.head[data-v-ab613432]{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}.head h2[data-v-ab613432]{font-size:var(--font-size-lg);color:var(--accent);margin:0}.close[data-v-ab613432]{background:0 0;border-color:#0000;place-items:center;width:28px;height:28px;padding:0;display:grid}.close svg[data-v-ab613432]{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;width:14px;height:14px}.close[data-v-ab613432]:hover{border-color:var(--accent)}.body[data-v-ab613432]{font-size:var(--font-size-md);padding:14px;overflow:auto}.body[data-v-ab613432] p{margin:0}.body[data-v-ab613432] p+p{margin-top:8px}.foot[data-v-ab613432]{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;padding:12px 14px;display:flex}.dialog-enter-active[data-v-ab613432],.dialog-leave-active[data-v-ab613432]{transition:opacity .18s}.dialog-enter-active .dialog[data-v-ab613432],.dialog-leave-active .dialog[data-v-ab613432]{transition:transform .18s cubic-bezier(.2,.9,.3,1),opacity .18s}.dialog-enter-from[data-v-ab613432],.dialog-leave-to[data-v-ab613432]{opacity:0}.dialog-enter-from .dialog[data-v-ab613432],.dialog-leave-to .dialog[data-v-ab613432]{opacity:0;transform:translateY(10px)scale(.97)}@media (prefers-reduced-motion:reduce){.dialog-enter-active[data-v-ab613432],.dialog-leave-active[data-v-ab613432],.dialog-enter-active .dialog[data-v-ab613432],.dialog-leave-active .dialog[data-v-ab613432]{transition:opacity .12s}.dialog-enter-from .dialog[data-v-ab613432],.dialog-leave-to .dialog[data-v-ab613432]{transform:none}}.veil[data-v-49ad4a53]{background:var(--placeholder-base);pointer-events:none;place-items:center;transition:opacity .22s cubic-bezier(.4,0,.2,1);display:grid;position:absolute;inset:0;overflow:hidden;container-type:inline-size}.veil.loaded[data-v-49ad4a53]{opacity:0}.veil.error[data-v-49ad4a53]{pointer-events:auto}.bar[data-v-49ad4a53]{background:var(--placeholder-track);height:3px;position:absolute;bottom:0;left:0;right:0}.bar i[data-v-49ad4a53]{background:var(--placeholder-fill);transform-origin:0;height:100%;animation:30s cubic-bezier(.215,.61,.355,1) forwards placeholder-progress-49ad4a53;display:block;transform:scaleX(0)}@keyframes placeholder-progress-49ad4a53{to{transform:scaleX(.9)}}.veil.loaded .bar i[data-v-49ad4a53]{transition:transform .18s ease-out;animation:none;transform:scaleX(1)}.slow[data-v-49ad4a53]{color:var(--muted);font-size:var(--font-size-xs);background:color-mix(in srgb, var(--bg) 76%, transparent);border-radius:3px;margin:0;padding:3px 9px}.failure[data-v-49ad4a53]{color:var(--muted);text-align:center;flex-direction:column;align-items:center;gap:6px;padding:8px;display:flex}.glyph[data-v-49ad4a53]{fill:none;stroke:currentColor;stroke-width:1.4px;stroke-linecap:round;stroke-linejoin:round;width:22px;height:22px}.label[data-v-49ad4a53]{font-size:var(--font-size-xs)}.retry[data-v-49ad4a53]{font-size:var(--font-size-xs);padding:2px 8px}@container (width<104px){.bar[data-v-49ad4a53],.slow[data-v-49ad4a53]{display:none}.failure[data-v-49ad4a53]{gap:4px;padding:4px}.label[data-v-49ad4a53]{display:none}}@container (width<56px){.failure[data-v-49ad4a53]{gap:2px}.glyph[data-v-49ad4a53]{width:18px;height:18px}.retry[data-v-49ad4a53]{padding:0 5px}}@media (prefers-reduced-motion:reduce){.veil[data-v-49ad4a53]{transition:none}.bar i[data-v-49ad4a53],.veil.loaded .bar i[data-v-49ad4a53]{transition:none;animation:none}.bar i[data-v-49ad4a53]{transform:scaleX(.35)}}.skeleton[data-v-88927a4b]{background:var(--placeholder-base);aspect-ratio:var(--media-ratio,var(--skeleton-ratio,4/3));display:block;position:relative;overflow:hidden}.skeleton img[data-v-88927a4b]{object-fit:var(--skeleton-fit,cover);width:100%;height:100%;display:block;position:absolute;inset:0}.group+.group[data-v-be49e711]{margin-top:24px}.group-title[data-v-be49e711]{font-size:var(--font-size-lg);color:var(--accent);margin:0 0 10px}.empty[data-v-be49e711]{font-size:var(--font-size-md);margin:0}.cards[data-v-be49e711]{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;display:grid}.card[data-v-be49e711]{width:100%;color:inherit;font:inherit;text-align:left;background:var(--panel);border:1px solid var(--line);cursor:pointer;border-radius:6px;padding:0;text-decoration:none;transition:box-shadow .18s cubic-bezier(.215,.61,.355,1),border-color .18s cubic-bezier(.215,.61,.355,1);display:block;overflow:hidden}.card.popped[data-v-be49e711],.card[data-v-be49e711]:hover{border-color:var(--accent);z-index:var(--z-card);box-shadow:0 12px 30px #00000073}.card.picked[data-v-be49e711]{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 45%, transparent)}.card[data-v-be49e711]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.thumb[data-v-be49e711]{width:100%;height:var(--thumb-height,220px)}.meta[data-v-be49e711]{padding:8px 10px}.title[data-v-be49e711]{-webkit-line-clamp:2;font-size:var(--font-size-md);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.sub[data-v-be49e711]{font-size:var(--font-size-sm);margin-top:4px}.preview-card[data-v-be49e711]{z-index:var(--z-overlay);visibility:hidden;background:var(--panel);border:1px solid var(--accent);cursor:pointer;transform-origin:50%;will-change:transform;border-radius:8px;position:fixed;overflow:hidden;box-shadow:0 20px 60px #0000008c}.preview-inner[data-v-be49e711]{grid-template-columns:var(--thumb-w,200px) 1fr;gap:var(--preview-gap,14px);height:100%;padding:var(--preview-pad,14px);box-sizing:border-box;grid-template-rows:100%;display:grid}.preview-thumb[data-v-be49e711]{--skeleton-fit:contain;border-radius:4px;width:100%;height:100%}.preview-body[data-v-be49e711]{flex-direction:column;gap:10px;min-width:0;display:flex}.preview-title[data-v-be49e711]{font-size:var(--font-size-base);color:var(--accent);-webkit-line-clamp:3;-webkit-box-orient:vertical;font-weight:600;display:-webkit-box;overflow:hidden}.preview-rating[data-v-be49e711]{font-size:var(--font-size-lg);flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.preview-rating .score[data-v-be49e711]{color:var(--ok)}.preview-tags[data-v-be49e711]{flex-wrap:wrap;align-content:flex-start;gap:4px;display:flex;overflow:auto}.preview-tags .chip[data-v-be49e711]{background:var(--panel-2);border:1px solid var(--line);font-size:var(--font-size-sm);border-radius:3px;padding:1px 6px}.preview-tags .ns[data-v-be49e711]{color:var(--muted)}.preview-tags .more[data-v-be49e711]{font-size:var(--font-size-sm)}.preview-hint[data-v-be49e711]{font-size:var(--font-size-sm);margin-top:auto}.mask[data-v-1111208e]{z-index:var(--z-dialog);background:#00000094;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.manager[data-v-1111208e]{background:var(--panel);border:1px solid var(--line);border-radius:8px;flex-direction:column;width:min(880px,100%);max-height:82vh;display:flex;box-shadow:0 24px 64px #0000008c}.head[data-v-1111208e]{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.head h2[data-v-1111208e]{font-size:var(--font-size-lg);color:var(--accent);margin:0}.close[data-v-1111208e]{background:0 0;border-color:#0000;place-items:center;width:28px;height:28px;padding:0;display:grid}.close svg[data-v-1111208e]{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;width:14px;height:14px}.body[data-v-1111208e]{flex:1;padding:12px 14px;overflow:auto}.empty[data-v-1111208e]{font-size:var(--font-size-md);margin:0}.rows[data-v-1111208e]{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.row[data-v-1111208e]{background:var(--panel-2);border:1px solid var(--line);border-radius:6px;grid-template-columns:56px 1fr max-content max-content;align-items:center;gap:12px;padding:8px;display:grid}.cover[data-v-1111208e]{--skeleton-fit:cover;border-radius:4px;width:56px;height:76px}.info[data-v-1111208e]{min-width:0}.title[data-v-1111208e]{color:var(--accent);font-size:var(--font-size-md);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sub[data-v-1111208e]{font-size:var(--font-size-sm);margin-top:2px}.dates[data-v-1111208e]{font-size:var(--font-size-md);white-space:nowrap;align-items:center;gap:8px;display:flex}.dates .arrow[data-v-1111208e]{color:var(--muted)}.dates .latest[data-v-1111208e]{color:var(--ok)}.dates .badge[data-v-1111208e]{font-size:var(--font-size-xs);border:1px solid;border-radius:3px;padding:0 4px}.acts[data-v-1111208e]{gap:6px;display:flex}.foot[data-v-1111208e]{border-top:1px solid var(--line);align-items:center;gap:8px;padding:12px 14px;display:flex}.foot .grow[data-v-1111208e]{flex:1}.foot .summary[data-v-1111208e]{font-size:var(--font-size-sm)}.err[data-v-1111208e]{color:var(--danger)}.manager-enter-active[data-v-1111208e],.manager-leave-active[data-v-1111208e]{transition:opacity .18s}.manager-enter-active .manager[data-v-1111208e],.manager-leave-active .manager[data-v-1111208e]{transition:transform .18s cubic-bezier(.2,.9,.3,1),opacity .18s}.manager-enter-from[data-v-1111208e],.manager-leave-to[data-v-1111208e]{opacity:0}.manager-enter-from .manager[data-v-1111208e],.manager-leave-to .manager[data-v-1111208e]{transform:translateY(12px)scale(.98)}@media (prefers-reduced-motion:reduce){.manager-enter-active[data-v-1111208e],.manager-leave-active[data-v-1111208e],.manager-enter-active .manager[data-v-1111208e],.manager-leave-active .manager[data-v-1111208e]{transition:opacity .12s}.manager-enter-from .manager[data-v-1111208e],.manager-leave-to .manager[data-v-1111208e]{transform:none}}.head[data-v-70ae6ddb]{align-items:center;gap:10px;margin-bottom:12px;display:flex}.head h2[data-v-70ae6ddb]{font-size:var(--font-size-xl);color:var(--accent);margin:0}.top-manager[data-v-70ae6ddb]{align-items:center;gap:6px;margin-left:auto;display:flex}.top-manager svg[data-v-70ae6ddb],.rail svg[data-v-70ae6ddb]{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:17px;height:17px}.rail[data-v-70ae6ddb]{z-index:var(--z-floating);flex-direction:column;align-items:flex-start;gap:6px;display:flex;position:fixed;bottom:18px;left:16px}.group[data-v-70ae6ddb]{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.rail-btn[data-v-70ae6ddb],.group.sub button[data-v-70ae6ddb]{background:color-mix(in srgb, var(--panel) 92%, transparent);border:1px solid var(--line);backdrop-filter:blur(4px);border-radius:6px;align-items:center;gap:8px;padding:7px 9px;display:flex;box-shadow:0 6px 18px #00000059}.label[data-v-70ae6ddb]{white-space:nowrap;opacity:0;max-width:0;transition:max-width .14s,opacity .14s;overflow:hidden}.rail:hover .label[data-v-70ae6ddb],.rail .group:hover .label[data-v-70ae6ddb]{opacity:1;max-width:180px;transition-delay:.5s}.rail-btn.on[data-v-70ae6ddb]{border-color:var(--accent);color:var(--accent)}.group.sub button[data-v-70ae6ddb]{color:var(--muted)}.group.sub button.danger[data-v-70ae6ddb]:hover:not(:disabled){color:var(--danger);border-color:var(--danger)}.size[data-v-70ae6ddb]{position:relative}.popover[data-v-70ae6ddb]{background:var(--panel);border:1px solid var(--accent);border-radius:6px;gap:4px;padding:8px;display:flex;position:absolute;bottom:0;left:calc(100% + 8px);box-shadow:0 12px 32px #00000073}.popover button[data-v-70ae6ddb]{min-width:32px;padding:4px 6px}.popover button.on[data-v-70ae6ddb]{border-color:var(--accent);color:var(--accent)}@media (prefers-reduced-motion:reduce){.label[data-v-70ae6ddb]{transition:none}}.hint[data-v-f714dab6]{font-size:var(--font-size-sm);margin:6px 0 0}.mask[data-v-9d52e33c]{z-index:var(--z-dialog);cursor:zoom-out;background:#000000d1;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.stage[data-v-9d52e33c]{cursor:default;flex-direction:column;align-items:center;gap:10px;max-width:min(1200px,100%);max-height:100%;margin:0;display:flex;position:relative}.stage img[data-v-9d52e33c]{object-fit:contain;border-radius:4px;max-width:100%;max-height:calc(100vh - 120px);box-shadow:0 24px 64px #0009}.stage img.waiting[data-v-9d52e33c]{position:absolute}.placeholder[data-v-9d52e33c]{aspect-ratio:2/3;width:min(720px,80vw,66.6667vh - 80px);position:relative}.bar[data-v-9d52e33c]{background:var(--panel);border:1px solid var(--line);width:100%;font-size:var(--font-size-md);border-radius:6px;align-items:center;gap:8px;padding:6px 8px;display:flex}.bar .grow[data-v-9d52e33c]{flex:1}.bar button[data-v-9d52e33c]{min-width:32px;font-size:var(--font-size-lg);line-height:1}.lightbox-enter-active[data-v-9d52e33c],.lightbox-leave-active[data-v-9d52e33c]{transition:opacity .16s}.lightbox-enter-from[data-v-9d52e33c],.lightbox-leave-to[data-v-9d52e33c]{opacity:0}.sprite[data-v-d2fdd293]{background-color:var(--placeholder-base);aspect-ratio:var(--cell-ratio,2/3);position:relative;overflow:hidden}.sheet[data-v-d2fdd293]{width:var(--sheet-width,100%);aspect-ratio:var(--sheet-ratio,4/3);background-image:var(--sprite-url,none);transform:translate(var(--sheet-shift-x,0%), var(--sheet-shift-y,0%));background-repeat:no-repeat;background-size:100% 100%;position:absolute;top:0;left:0}.update-note[data-v-243b771b]{color:var(--text);font-size:var(--font-size-md);background:color-mix(in srgb, var(--accent) 12%, transparent);border:1px solid var(--accent);border-radius:4px;align-items:center;gap:10px;margin:10px 0 0;padding:6px 10px;display:flex}.versions[data-v-243b771b]{flex-direction:column;gap:8px;margin:10px 0 0;padding:0;list-style:none;display:flex}.versions li[data-v-243b771b]{font-size:var(--font-size-md);align-items:center;gap:8px;display:flex}.versions .tag[data-v-243b771b]{border:1px solid var(--line);font-size:var(--font-size-sm);border-radius:3px;padding:1px 6px}.versions .tag.accent[data-v-243b771b]{color:var(--accent);border-color:var(--accent)}.versions .ver-title[data-v-243b771b]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.loading-note[data-v-243b771b]{color:var(--accent);font-size:var(--font-size-lg);margin:0 0 10px}.skeleton-bar[data-v-243b771b]{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;height:16px;margin:8px 0}.skeleton-bar.wide[data-v-243b771b]{width:70%;height:22px}.skeleton-bar.short[data-v-243b771b]{width:40%}.skeleton-bar.button[data-v-243b771b]{width:88px;height:30px;margin:0}.loading .bar-row[data-v-243b771b]{gap:8px;margin:14px 0;display:flex}.gallery[data-v-243b771b]{grid-template-columns:minmax(200px,32%) 1fr;align-items:start;gap:20px;display:grid}.media[data-v-243b771b]{flex-direction:column;gap:10px;display:flex;position:sticky;top:16px}.media .page[data-v-243b771b]{border:1px solid var(--line);--skeleton-fit:contain;border-radius:6px;width:100%;max-height:72vh}.loading .media .page[data-v-243b771b]{aspect-ratio:2/3;position:relative}.cover-note[data-v-243b771b]{text-align:center;font-size:var(--font-size-sm);margin:0}.previews[data-v-243b771b]{grid-template-columns:repeat(auto-fill,minmax(56px,1fr));gap:6px;display:grid}.previews .preview[data-v-243b771b]{cursor:pointer;border:1px solid #0000;border-radius:4px;width:100%}.more[data-v-243b771b]{width:100%;font-size:var(--font-size-md)}.tag-search[data-v-243b771b]{z-index:var(--z-floating);text-align:right;background:var(--panel);border:1px solid var(--accent);flex-direction:column;align-items:flex-end;gap:2px;max-width:320px;padding:10px 14px;display:flex;position:fixed;bottom:24px;right:20px;box-shadow:0 12px 32px #00000073}.tag-search .line[data-v-243b771b]{white-space:nowrap}.tag-search .preview-of-selection[data-v-243b771b]{color:var(--muted);font-size:var(--font-size-sm);word-break:break-all;text-align:right}.tag-search .warn[data-v-243b771b]{color:var(--danger);font-size:var(--font-size-sm);white-space:normal}.tag-search-enter-active[data-v-243b771b],.tag-search-leave-active[data-v-243b771b]{transition:opacity .18s,transform .18s}.tag-search-enter-from[data-v-243b771b],.tag-search-leave-to[data-v-243b771b]{opacity:0;transform:translateY(8px)}.info h2[data-v-243b771b]{font-size:var(--font-size-xl);color:var(--accent);margin:0}.jpn[data-v-243b771b]{font-size:var(--font-size-md);margin:4px 0 0}.meta[data-v-243b771b]{font-size:var(--font-size-md);grid-template-columns:max-content 1fr;gap:2px 14px;margin:14px 0 0;display:grid}.meta dt[data-v-243b771b]{color:var(--muted)}.meta dd[data-v-243b771b]{margin:0}.actions[data-v-243b771b]{border-top:1px solid var(--line);border-bottom:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:8px;margin:16px 0;padding:10px 0;display:flex}.actions a[data-v-243b771b]{color:var(--accent);font-size:var(--font-size-md)}.tags[data-v-243b771b]{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.tags li[data-v-243b771b]{grid-template-columns:84px 1fr;align-items:start;gap:8px;display:grid}.ns[data-v-243b771b]{color:var(--muted);font-size:var(--font-size-sm);padding-top:2px}.chips[data-v-243b771b]{flex-wrap:wrap;gap:4px;display:flex}.chip[data-v-243b771b]{background:var(--panel-2);color:var(--text);border:1px solid var(--line);font:inherit;font-size:var(--font-size-sm);cursor:pointer;border-radius:3px;padding:1px 6px}.chip[data-v-243b771b]:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.chip.on[data-v-243b771b]{background:var(--accent);border-color:var(--accent);color:var(--bg)}.err[data-v-243b771b]{color:var(--danger)}@media (width<=860px){.gallery[data-v-243b771b]{grid-template-columns:1fr}.media[data-v-243b771b]{position:static}}.head[data-v-4ab64e6c]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.head h2[data-v-4ab64e6c]{font-size:var(--font-size-xl);color:var(--accent);margin:0}.count[data-v-4ab64e6c]{font-size:var(--font-size-md);margin:4px 0 0}.head-actions[data-v-4ab64e6c]{align-items:center;gap:10px;display:flex}.head-actions a[data-v-4ab64e6c]{color:var(--accent);font-size:var(--font-size-md)}.grid[data-v-4ab64e6c]{grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:8px;margin-top:16px;display:grid}.cell[data-v-4ab64e6c]{border:1px solid var(--line);border-radius:4px;transition:transform .16s cubic-bezier(.4,0,.2,1),border-color .16s cubic-bezier(.4,0,.2,1);display:block;position:relative;overflow:hidden}.cell[data-v-4ab64e6c]:hover,.cell[data-v-4ab64e6c]:focus-visible{border-color:var(--accent);transform:translateY(-2px)}.cell[data-v-4ab64e6c]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.cell .num[data-v-4ab64e6c]{font-size:var(--font-size-xs);color:var(--text);background:#0000008c;border-radius:3px;padding:0 5px;position:absolute;bottom:4px;right:4px}.err[data-v-4ab64e6c]{color:var(--danger)}.foot[data-v-4ab64e6c]{font-size:var(--font-size-md);margin-top:14px}@media (prefers-reduced-motion:reduce){.cell[data-v-4ab64e6c]{transition:none}.cell[data-v-4ab64e6c]:hover,.cell[data-v-4ab64e6c]:focus-visible{transform:none}}.player[data-v-23add80b]{flex-direction:column;gap:10px;display:flex;position:relative}.player.full[data-v-23add80b]{z-index:var(--z-player);background:var(--bg);gap:0;position:fixed;inset:0}.corner[data-v-23add80b]{z-index:2;color:var(--text);font-size:var(--font-size-lg);pointer-events:none;background:#00000073;border-radius:4px;padding:6px 10px;position:absolute}.corner.left[data-v-23add80b]{top:14px;left:16px}.corner.right[data-v-23add80b]{color:var(--ok);letter-spacing:.08em;top:14px;right:16px}.stage[data-v-23add80b]{grid-template-columns:56px 1fr 56px;align-items:center;gap:8px;min-height:320px;display:grid;position:relative}.player.full .stage[data-v-23add80b]{grid-template-columns:68px 1fr 68px;height:100%}.frame[data-v-23add80b]{place-items:center;min-height:0;display:grid;overflow:hidden}.sheet[data-v-23add80b]{border:1px solid var(--line);--skeleton-fit:contain;border-radius:6px;width:100%;height:74vh;transition:transform .12s ease-out}.player.full .sheet[data-v-23add80b]{border:none;border-radius:0;height:calc(100vh - 8px)}.side[data-v-23add80b]{height:56px;color:var(--text);background:#00000059;border-color:#0000;border-radius:50%;place-items:center;padding:0;display:grid}.side svg[data-v-23add80b]{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:26px;height:26px}.side[data-v-23add80b]:hover:not(:disabled){color:var(--accent);border-color:var(--accent)}.controls[data-v-23add80b]{background:var(--panel);border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;display:flex}.controls.floating[data-v-23add80b]{z-index:3;backdrop-filter:blur(6px);opacity:0;pointer-events:none;background:#14161be0;width:max-content;max-width:calc(100% - 32px);margin:0 auto;transition:opacity .18s,transform .18s cubic-bezier(.2,.9,.3,1);position:absolute;bottom:0;left:0;right:0;transform:translateY(14px);box-shadow:0 12px 32px #0000008c}.controls.floating.shown[data-v-23add80b]{opacity:1;pointer-events:auto;bottom:14px;transform:translateY(0)}.count[data-v-23add80b]{font-size:var(--font-size-md);color:var(--muted);white-space:nowrap}.track[data-v-23add80b]{background:var(--placeholder-track);cursor:pointer;touch-action:none;border-radius:3px;flex:160px;min-width:120px;height:6px;position:relative}.track i[data-v-23add80b]{background:var(--accent);border-radius:3px;height:100%;display:block}.icon[data-v-23add80b]{min-width:32px;height:30px;font-size:var(--font-size-sm);place-items:center;padding:0 6px;display:grid}.icon svg[data-v-23add80b]{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:17px;height:17px}.icon.on[data-v-23add80b]{color:var(--danger);border-color:var(--danger)}.icon.heart.on svg[data-v-23add80b]{fill:currentColor}.auto[data-v-23add80b]{font-size:var(--font-size-sm);align-items:center;gap:4px;margin:0;display:flex}.auto select[data-v-23add80b]{width:auto;font-size:var(--font-size-sm);padding:3px 4px}.tune[data-v-23add80b]{position:relative}.popover[data-v-23add80b]{z-index:4;background:var(--panel);border:1px solid var(--accent);border-radius:6px;flex-direction:column;gap:8px;min-width:180px;padding:10px;display:flex;position:absolute;bottom:calc(100% + 8px);right:0;box-shadow:0 16px 40px #0000008c}.popover label[data-v-23add80b]{justify-content:space-between;align-items:center;gap:8px;margin:0;display:flex}.popover input[data-v-23add80b],.popover select[data-v-23add80b]{width:90px}.zoom[data-v-23add80b]{font-variant-numeric:tabular-nums}@media (prefers-reduced-motion:reduce){.controls.floating[data-v-23add80b],.sheet[data-v-23add80b]{transition:none}}.head[data-v-7dbd25d2]{align-items:center;gap:10px;margin-bottom:10px;display:flex}.title[data-v-7dbd25d2]{font-size:var(--font-size-lg);font-weight:600;text-decoration:none}.title[data-v-7dbd25d2]:hover{text-decoration:underline}.tag[data-v-7dbd25d2]{font-size:var(--font-size-sm);border:1px solid var(--line);border-radius:3px;padding:1px 6px}.actions[data-v-7dbd25d2]{font-size:var(--font-size-md);gap:12px;margin-left:auto;display:flex}.hint[data-v-7dbd25d2]{font-size:var(--font-size-sm);margin:8px 0 0}.err[data-v-7dbd25d2]{color:var(--danger)}.head[data-v-87b0c578]{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:12px;display:flex}.head h2[data-v-87b0c578]{font-size:var(--font-size-xl);color:var(--accent);margin:0}.picker[data-v-87b0c578]{align-items:center;gap:6px;display:flex;position:relative}.folder[data-v-87b0c578]{align-items:center;gap:6px;display:flex}.folder svg[data-v-87b0c578]{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;width:12px;height:12px}.menu[data-v-87b0c578]{z-index:var(--z-overlay);background:var(--panel);border:1px solid var(--accent);border-radius:6px;flex-direction:column;gap:4px;min-width:260px;max-height:60vh;padding:10px;display:flex;position:absolute;top:calc(100% + 6px);left:0;overflow:auto;box-shadow:0 16px 40px #0000008c}.menu button[data-v-87b0c578]{text-align:left}.menu button.on[data-v-87b0c578]{border-color:var(--accent);color:var(--accent)}.menu .group-title[data-v-87b0c578]{font-size:var(--font-size-sm);margin-top:4px}.menu .empty[data-v-87b0c578]{font-size:var(--font-size-sm);margin:0}.divider[data-v-87b0c578]{background:var(--line);height:1px;margin:6px 0}.new-row[data-v-87b0c578]{gap:6px;display:flex}.menu .danger[data-v-87b0c578]:hover:not(:disabled){border-color:var(--danger);color:var(--danger)}.rail[data-v-87b0c578]{z-index:var(--z-floating);flex-direction:column;align-items:flex-start;gap:6px;display:flex;position:fixed;bottom:18px;left:16px}.group[data-v-87b0c578]{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.rail-btn[data-v-87b0c578],.group.sub button[data-v-87b0c578]{background:color-mix(in srgb, var(--panel) 92%, transparent);border:1px solid var(--line);backdrop-filter:blur(4px);border-radius:6px;align-items:center;gap:8px;padding:7px 9px;display:flex;box-shadow:0 6px 18px #00000059}.label[data-v-87b0c578]{white-space:nowrap;opacity:0;max-width:0;transition:max-width .14s,opacity .14s;overflow:hidden}.rail:hover .label[data-v-87b0c578]{opacity:1;max-width:180px;transition-delay:.5s}.rail-btn.on[data-v-87b0c578]{border-color:var(--accent);color:var(--accent)}.rail svg[data-v-87b0c578]{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:17px;height:17px}.size[data-v-87b0c578]{position:relative}.popover[data-v-87b0c578]{background:var(--panel);border:1px solid var(--accent);border-radius:6px;gap:4px;padding:8px;display:flex;position:absolute;bottom:0;left:calc(100% + 8px);box-shadow:0 12px 32px #00000073}.popover.wrap[data-v-87b0c578]{flex-wrap:wrap;width:200px}.popover button[data-v-87b0c578]{min-width:32px;padding:4px 6px}.popover button.on[data-v-87b0c578]{border-color:var(--accent);color:var(--accent)}.err[data-v-87b0c578]{color:var(--danger)}@media (prefers-reduced-motion:reduce){.label[data-v-87b0c578]{transition:none}}.head[data-v-f0b83524]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;display:flex}.progress[data-v-f0b83524]{font-size:var(--font-size-lg);align-items:baseline;gap:6px;display:flex}.acts[data-v-f0b83524]{flex-wrap:wrap;gap:8px;display:flex}.acts .danger[data-v-f0b83524]:hover:not(:disabled){border-color:var(--danger);color:var(--danger)}.empty[data-v-f0b83524]{font-size:var(--font-size-md)}.rows[data-v-f0b83524]{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.row[data-v-f0b83524]{background:var(--panel);border:1px solid var(--line);border-radius:6px;align-items:stretch;gap:8px;display:flex}.row.done[data-v-f0b83524]{opacity:.62}.row.current[data-v-f0b83524]{border-color:var(--accent)}.open[data-v-f0b83524]{text-align:left;background:0 0;border:none;border-radius:6px;flex:1;grid-template-columns:64px 1fr auto;align-items:center;gap:12px;padding:8px;display:grid}.cover[data-v-f0b83524]{--skeleton-fit:cover;border-radius:4px;width:64px;height:86px}.info[data-v-f0b83524]{flex-direction:column;gap:4px;min-width:0;display:flex}.title[data-v-f0b83524]{color:var(--accent);font-size:var(--font-size-md);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sub[data-v-f0b83524]{font-size:var(--font-size-sm)}.count[data-v-f0b83524]{color:var(--muted);font-size:var(--font-size-md);font-variant-numeric:tabular-nums;padding-right:8px}.drop[data-v-f0b83524]{width:40px;color:var(--muted);border:none;border-left:1px solid var(--line);background:0 0;border-radius:0 6px 6px 0;place-items:center;padding:0;display:grid}.drop svg[data-v-f0b83524]{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;width:14px;height:14px}.drop[data-v-f0b83524]:hover:not(:disabled){color:var(--danger)}.rows[data-v-124c9b62]{flex-direction:column;gap:6px;margin-left:20px;display:flex}.row-line[data-v-124c9b62]{font-size:var(--font-size-md);align-items:center;gap:10px;display:flex}.row-line strong[data-v-124c9b62]{color:var(--accent);font-variant-numeric:tabular-nums}.row-line button[data-v-124c9b62]{margin-left:auto}.row.keep[data-v-124c9b62]{align-items:center;gap:8px;margin-top:4px}.row.keep label[data-v-124c9b62]{margin:0}.row.keep input[data-v-124c9b62]{width:90px}.box[data-v-124c9b62]{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px}.module[data-v-124c9b62]{border-bottom:1px solid var(--line)}.module[data-v-124c9b62]:last-of-type{border-bottom:none}.module>summary[data-v-124c9b62]{cursor:pointer;align-items:center;gap:8px;padding:10px 0;list-style:none;display:flex}.module>summary[data-v-124c9b62]::-webkit-details-marker{display:none}.module>summary[data-v-124c9b62]:before{content:"▸";color:var(--muted);transition:transform .15s}.module>summary:hover h2[data-v-124c9b62]{color:var(--text)}.module[open]>summary[data-v-124c9b62]:before{transform:rotate(90deg)}.module[open]>.grid[data-v-124c9b62]:last-child{padding-bottom:12px}.module>.grid[data-v-124c9b62],.module>h3[data-v-124c9b62],.module>p[data-v-124c9b62]{margin-left:20px}h2[data-v-124c9b62]{font-size:var(--font-size-base);color:var(--accent);margin:0}h3[data-v-124c9b62]{font-size:var(--font-size-lg);margin:18px 0 6px}.grid[data-v-124c9b62]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;display:grid}.hint[data-v-124c9b62]{font-size:var(--font-size-sm);margin:2px 0 0}.notice[data-v-124c9b62]{font-size:var(--font-size-sm);color:var(--text);background:var(--panel-2);border:1px solid var(--danger);border-left-width:3px;border-radius:4px;margin:16px 0 0;padding:10px 12px}.row[data-v-124c9b62]{align-items:center;gap:8px;margin-top:6px;display:flex}.actions[data-v-124c9b62]{align-items:center;gap:12px;margin-top:20px;display:flex}.head[data-v-ca762390]{justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.head h2[data-v-ca762390]{font-size:var(--font-size-xl);color:var(--accent);margin:0}.plain[data-v-ca762390]{color:var(--muted);background:0 0;border-color:#0000}.rows[data-v-ca762390]{flex-direction:column;gap:10px;margin:12px 0 0;padding:0;list-style:none;display:flex}.row[data-v-ca762390]{background:var(--panel);border:1px solid var(--line);border-radius:6px;grid-template-columns:64px 1fr;gap:12px;padding:10px;display:grid}.cover[data-v-ca762390]{--skeleton-fit:cover;border-radius:4px;width:64px;height:86px}.main[data-v-ca762390]{flex-direction:column;gap:8px;min-width:0;display:flex}.line[data-v-ca762390]{align-items:baseline;gap:8px;min-width:0;display:flex}.name[data-v-ca762390]{color:var(--text);font-size:var(--font-size-md);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.tag[data-v-ca762390]{font-size:var(--font-size-sm);flex-shrink:0}.bar-row[data-v-ca762390]{align-items:center;gap:10px;display:flex}.bar[data-v-ca762390]{background:var(--placeholder-track);border-radius:4px;flex:1;height:8px;position:relative;overflow:hidden}.bar i[data-v-ca762390]{background:var(--accent);border-radius:4px;height:100%;transition:width .24s ease-out;display:block}.pct[data-v-ca762390]{text-align:right;min-width:96px;font-size:var(--font-size-md);font-variant-numeric:tabular-nums}.speed[data-v-ca762390]{text-align:right;min-width:92px;font-size:var(--font-size-sm);font-variant-numeric:tabular-nums}.err[data-v-ca762390]{font-size:var(--font-size-sm);margin:0}.settings[data-v-ca762390]{z-index:var(--z-floating);color:var(--text);font-size:var(--font-size-md);background:color-mix(in srgb, var(--panel) 92%, transparent);border:1px solid var(--line);backdrop-filter:blur(4px);border-radius:6px;align-items:center;gap:8px;padding:8px 12px;text-decoration:none;display:flex;position:fixed;bottom:18px;left:16px;box-shadow:0 6px 18px #00000059}.settings[data-v-ca762390]:hover{border-color:var(--accent);color:var(--accent)}.settings .iconfont[data-v-ca762390]{font-size:var(--font-size-lg)}@media (prefers-reduced-motion:reduce){.bar i[data-v-ca762390]{transition:none}}.filters[data-v-1c386992]{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:14px 16px}.row[data-v-1c386992]{align-items:flex-end;gap:12px;display:flex}.grow[data-v-1c386992]{flex:1}.search[data-v-1c386992]{align-items:center;gap:6px;display:inline-flex}.hint[data-v-1c386992]{font-size:var(--font-size-sm);margin:4px 0 0}.cats[data-v-1c386992]{flex-wrap:wrap;gap:6px;margin-top:12px;display:flex}.cats button[data-v-1c386992]{font-size:var(--font-size-md);padding:4px 10px}.cats button.on[data-v-1c386992]{border-color:var(--accent);color:var(--accent)}.size[data-v-1c386992]{position:relative}.popover[data-v-1c386992]{z-index:var(--z-overlay);background:var(--panel);border:1px solid var(--accent);border-radius:6px;flex-wrap:wrap;gap:4px;width:200px;padding:8px;display:flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 12px 32px #00000073}.popover button[data-v-1c386992]{min-width:32px;font-size:var(--font-size-sm);padding:4px 6px}.popover button.on[data-v-1c386992]{border-color:var(--accent);color:var(--accent)}.results[data-v-1c386992]{margin-top:16px}footer[data-v-1c386992]{justify-content:center;align-items:center;gap:12px;margin-top:20px;display:flex}.box[data-v-008b7c43]{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:16px}h2[data-v-008b7c43]{font-size:var(--font-size-base);color:var(--accent);margin:0 0 8px}h2[data-v-008b7c43]:not(:first-child){margin-top:20px}dl[data-v-008b7c43]{font-size:var(--font-size-md);grid-template-columns:max-content 1fr;gap:2px 14px;margin:0;display:grid}dt[data-v-008b7c43]{color:var(--muted)}dd[data-v-008b7c43]{word-break:break-all;margin:0}pre[data-v-008b7c43]{max-height:260px;font-size:var(--font-size-md);color:var(--muted);white-space:pre-wrap;word-break:break-all;margin:0;overflow:auto}pre.logs[data-v-008b7c43]{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;max-height:320px;margin-top:8px;padding:8px}.actions[data-v-008b7c43]{flex-wrap:wrap;gap:8px;margin-top:16px;display:flex}.actions .danger[data-v-008b7c43]:hover:not(:disabled){border-color:var(--danger);color:var(--danger)}p[data-v-1b1675e1]{margin:0}p+p[data-v-1b1675e1]{margin-top:10px}a[data-v-1b1675e1]{word-break:break-all}header[data-v-5b5b1bdd]{border-bottom:1px solid var(--line);background:var(--panel);align-items:center;gap:16px;padding:12px 20px;display:flex}.brand[data-v-5b5b1bdd]{align-items:baseline;gap:8px;display:flex}nav[data-v-5b5b1bdd]{gap:6px;display:flex}nav a[data-v-5b5b1bdd]{background:var(--panel-2);color:var(--text);border:1px solid var(--line);border-radius:4px;padding:6px 12px;text-decoration:none}nav a[data-v-5b5b1bdd]:hover,nav a.active[data-v-5b5b1bdd]{border-color:var(--accent);color:var(--accent)}.downloads[data-v-5b5b1bdd]{width:34px;height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);border-radius:4px;place-items:center;display:grid;position:relative}.downloads[data-v-5b5b1bdd]:hover{border-color:var(--accent);color:var(--accent)}.downloads svg[data-v-5b5b1bdd]{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px}.downloads .badge[data-v-5b5b1bdd]{color:#fff;min-width:17px;font-size:var(--font-size-xs);text-align:center;background:var(--danger);box-shadow:0 0 0 2px var(--panel);border-radius:9px;padding:0 4px;line-height:17px;position:absolute;top:-6px;right:-6px}.status[data-v-5b5b1bdd]{margin-left:auto}main[data-v-5b5b1bdd]{padding:20px}:root{color-scheme:dark;--bg:#14161b;--panel:#1c1f26;--panel-2:#23262e;--line:#2e323b;--text:#d8dbe2;--muted:#8b929e;--accent:#6ea8fe;--danger:#f2777a;--ok:#7ec699;--z-card:10;--z-floating:20;--z-overlay:30;--z-player:40;--z-dialog:50;--placeholder-base:var(--panel-2);--placeholder-track:color-mix(in srgb, var(--line) 70%, transparent);--placeholder-fill:var(--accent);--font-size-xs:.8rem;--font-size-sm:.9rem;--font-size-md:1rem;--font-size-lg:1.1rem;--font-size-base:1.2rem;--font-size-xl:1.4rem}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);font:var(--font-size-base)/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;margin:0}button{background:var(--panel-2);color:var(--text);border:1px solid var(--line);font:inherit;cursor:pointer;border-radius:4px;padding:6px 12px}button:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}button:disabled{opacity:.5;cursor:default}input,select{background:var(--panel-2);color:var(--text);border:1px solid var(--line);font:inherit;border-radius:4px;width:100%;padding:6px 8px}input:focus,select:focus{border-color:var(--accent);outline:none}label{color:var(--muted);margin-bottom:4px;display:block}a{color:var(--accent)}code{color:var(--muted)}.err{color:var(--danger)}.muted{color:var(--muted)}.Toastify__toast,.Toastify__toast-body,.Toastify__toast-body>div:last-child{min-width:0}.Toastify__toast-body{overflow-wrap:anywhere}.Toastify__toast-body>div:last-child{max-height:40vh;overflow:auto}.Toastify__close-button{flex-shrink:0}#nprogress .bar{background:var(--accent)}#nprogress .peg{box-shadow:0 0 10px var(--accent), 0 0 5px var(--accent)}.page-enter-active,.page-leave-active{transition:opacity .35s cubic-bezier(.4,0,.2,1),transform .35s cubic-bezier(.4,0,.2,1)}.page-enter-from{opacity:0;transform:translateY(.75rem)}.page-leave-to{opacity:0;transform:translateY(-.75rem)}@media (prefers-reduced-motion:reduce){.page-enter-active,.page-leave-active{transition:opacity .2s,transform .2s}.page-enter-from,.page-leave-to{transform:none}}@font-face{font-family:iconfont;src:url(data:font/ttf;base64,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)format("truetype");font-display:block}.iconfont{text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:iconfont,sans-serif;font-size:1em;font-style:normal;font-weight:400;line-height:1;display:inline-block}.icon-setting:before{content:""}.icon-search:before{content:""}