{"code":200,"message":"success","data":{"allow_indexed":"false","allow_mounted":"true","announcement":"","audio_autoplay":"true","audio_cover":"https://res.oplist.org/logo/logo.svg","auto_update_index":"false","customize_head":"\u003cstyle id=\"ol-liquid-glass\"\u003e\n/* ============================================================\n   OpenList 液态玻璃主题  Liquid Glass  v3\n   适配: OpenList v4.2.6     注入: 全局设置 → 自定义内容 → 自定义头部\n   ------------------------------------------------------------\n   v3 相比 v2 的改变：\n     · 背景从「高饱和紫粉青网格渐变」改成「低饱和中性渐变」——安静、不抢眼\n     · 玻璃从「深色半透明」改成「浅色磨砂」——这才是液态玻璃\n     · 文字不再强制白色，浅色模式下用深色字，可读性靠背景保证\n     · 加了高光边缘（内阴影）+ 分层投影，做出玻璃的厚度和折射感\n   ============================================================ */\n\n/* ---------- 可调参数 ---------- */\n:root {\n  --lg-blur: 34px;          /* 毛玻璃模糊强度（液态玻璃要够糊） */\n  --lg-saturate: 180%;      /* 透过去的东西稍微提点色 */\n  --lg-brightness: 106%;    /* 稍微提亮，玻璃才通透 */\n  --lg-radius: 22px;        /* 圆角 */\n\n  /* ── 浅色玻璃 ── */\n  --lg-l-bg:        rgba(255, 255, 255, 0.46);\n  --lg-l-bg-hover:  rgba(255, 255, 255, 0.62);\n  --lg-l-border:    rgba(255, 255, 255, 0.75);\n  --lg-l-shadow:    0 12px 44px rgba(50, 60, 90, 0.13),\n                    0 2px 10px rgba(50, 60, 90, 0.06);\n  /* 顶部一道亮边 = 玻璃折射出的高光，这是「液态」感的关键 */\n  --lg-l-inner:     inset 0 1.5px 0 rgba(255, 255, 255, 1),\n                    inset 1px 0 0 rgba(255, 255, 255, 0.55),\n                    inset 0 -1px 0 rgba(255, 255, 255, 0.35);\n\n  /* ── 深色玻璃 ── */\n  --lg-d-bg:        rgba(32, 34, 40, 0.62);\n  --lg-d-bg-hover:  rgba(44, 46, 54, 0.76);\n  --lg-d-border:    rgba(255, 255, 255, 0.13);\n  --lg-d-shadow:    0 10px 40px rgba(0, 0, 0, 0.42),\n                    0 2px 8px  rgba(0, 0, 0, 0.24);\n  --lg-d-inner:     inset 0 1px 0 rgba(255, 255, 255, 0.16);\n\n  /* ── 背景 ──\n     低饱和的中性渐变：够安静，但又有轻微的明暗起伏，\n     这样玻璃压上去才有「折射」的层次感（纯色背景会让玻璃隐形）。\n     想换成自己的图：把 --lg-bg-image 改成 url(\"https://...\") 即可。 */\n  --lg-bg-image: none;\n\n  --lg-bg-light:\n    radial-gradient(1250px 820px at 14% -12%, rgba(146, 176, 234, 0.72) 0%, transparent 58%),\n    radial-gradient(1050px 720px at 90% 110%, rgba(229, 190, 186, 0.55) 0%, transparent 56%),\n    radial-gradient(900px  640px at 64% 36%,  rgba(174, 206, 226, 0.46) 0%, transparent 62%),\n    radial-gradient(700px  500px at 4%  78%,  rgba(196, 202, 232, 0.42) 0%, transparent 60%),\n    linear-gradient(165deg, #eef2f9 0%, #e7ebf4 48%, #eae6ee 100%);\n\n  --lg-bg-dark:\n    radial-gradient(1250px 820px at 14% -12%, rgba(62, 88, 152, 0.55) 0%, transparent 58%),\n    radial-gradient(1050px 720px at 90% 110%, rgba(118, 66, 108, 0.42) 0%, transparent 56%),\n    radial-gradient(900px  640px at 64% 36%,  rgba(52, 74, 104, 0.40) 0%, transparent 62%),\n    radial-gradient(700px  500px at 4%  78%,  rgba(44, 52, 88, 0.36) 0%, transparent 60%),\n    linear-gradient(165deg, #0f1116 0%, #15171e 48%, #12141a 100%);\n}\n\n/* ---------- 1. 背景：安静的中性渐变 ---------- */\n.hope-ui-light,\nbody.hope-ui-light {\n  background-image: var(--lg-bg-image), var(--lg-bg-light) !important;\n}\n.hope-ui-dark,\nbody.hope-ui-dark {\n  background-image: var(--lg-bg-image), var(--lg-bg-dark) !important;\n}\n.hope-ui-light,\n.hope-ui-dark {\n  background-size: cover !important;\n  background-position: center !important;\n  background-attachment: fixed !important;\n  background-repeat: no-repeat !important;\n  background-color: #eef1f6 !important;\n}\n.hope-ui-dark { background-color: #12141a !important; }\n\n/* ---------- 2. 干掉登录页那两个 SVG 背景装饰 ----------\n   必须排除 .hope-stack / .hope-flex：登录卡片内部也有 SVG 图标，\n   只写 :has(svg) 会把卡片本体一起隐藏掉。 */\n.hope-center \u003e .hope-c-PJLV:not(.hope-stack):not(.hope-flex):has(svg) {\n  display: none !important;\n}\n\n/* ---------- 3. 全屏容器不加玻璃（否则出现大色块）---------- */\n.hope-center,\n#root,\n#root \u003e div {\n  background-color: transparent !important;\n  backdrop-filter: none !important;\n  -webkit-backdrop-filter: none !important;\n  border: none !important;\n  box-shadow: none !important;\n}\n\n/* ---------- 4. 玻璃本体 ----------\n   ★★ 两个关键教训（都是看登录后的真实 DOM 才发现的）★★\n\n   教训 A：只写 :has(.hope-c-PJLV) 的话，只有「内部还装着别的组件」的容器\n     会被匹配到。菜单、下拉、弹窗这些\"叶子面板\"没有子容器 → 完全漏掉，\n     保持默认实色白底。\n\n   教训 B（更致命）：**玻璃叠层**。\n     .body / .obj-box / 里面的卡片 各自都加了一层 rgba(255,255,255,.58)，\n     三层半透明叠起来 → 接近纯白，看起来就是\"实心白板\"。\n     真实结构：\n       div.header.hope-center          ← 顶栏\n         div.body.hope-stack           ← 主容器\n           nav.nav                     ← 面包屑\n           div.obj-box.hope-stack      ← 文件列表\n           div.footer.hope-stack\n       div.left-toolbar-box\n     → 所以只给 .header / .body 这两层外壳加玻璃，**里面一律透明**。 */\n\n/* 4a. 应用外壳：唯一的两个玻璃面 */\n.hope-ui-light .header,\n.hope-ui-light .body {\n  background-color: var(--lg-l-bg) !important;\n  border: 1px solid var(--lg-l-border) !important;\n  box-shadow: var(--lg-l-shadow), var(--lg-l-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  border-radius: var(--lg-radius) !important;\n}\n.hope-ui-dark .header,\n.hope-ui-dark .body {\n  background-color: var(--lg-d-bg) !important;\n  border: 1px solid var(--lg-d-border) !important;\n  box-shadow: var(--lg-d-shadow), var(--lg-d-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  border-radius: var(--lg-radius) !important;\n}\n\n/* 4b. 外壳内部全部透明 —— 这是消除\"叠层变实心白\"的关键。\n   内容直接浮在外壳那一层玻璃上，这才是液态玻璃的做法。\n   ★ 必须排除 .body：真实 DOM 里主容器是嵌在 .header 里面的\n     （div.header \u003e div.hope-c-PJLV \u003e div.body），\n     不排除的话这条会把 .body 自己也弄透明，整块内容就没玻璃了。 */\n.hope-ui-light .header *:not(.body):not(.hope-button):not(input):not(textarea),\n.hope-ui-light .body   *:not(.hope-button):not(input):not(textarea),\n.hope-ui-dark  .header *:not(.body):not(.hope-button):not(input):not(textarea),\n.hope-ui-dark  .body   *:not(.hope-button):not(input):not(textarea) {\n  background-color: transparent !important;\n  background-image: none !important;\n  border-color: transparent !important;\n  box-shadow: none !important;\n  backdrop-filter: none !important;\n  -webkit-backdrop-filter: none !important;\n}\n\n/* 4c. 登录卡片（登录页没有 .body，卡片是独立的 .hope-stack） */\n.hope-ui-light .hope-center \u003e .hope-stack {\n  background-color: var(--lg-l-bg) !important;\n  border: 1px solid var(--lg-l-border) !important;\n  box-shadow: var(--lg-l-shadow), var(--lg-l-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  border-radius: var(--lg-radius) !important;\n}\n.hope-ui-dark .hope-center \u003e .hope-stack {\n  background-color: var(--lg-d-bg) !important;\n  border: 1px solid var(--lg-d-border) !important;\n  box-shadow: var(--lg-d-shadow), var(--lg-d-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  border-radius: var(--lg-radius) !important;\n}\n\n/* 4d. 全屏居中容器 / 根容器：不加玻璃\n   ★ 注意排除 .header —— 真实 DOM 里顶栏是\n     \u003cdiv class=\"header hope-center hope-c-...\"\u003e，同时带两个类。\n     如果不排除，这条会盖掉 4a 给顶栏的玻璃，顶栏就整条消失了。 */\n.hope-ui-light .hope-center:not(.header),\n.hope-ui-light #root,\n.hope-ui-dark  .hope-center:not(.header),\n.hope-ui-dark  #root {\n  background-color: transparent !important;\n  backdrop-filter: none !important;\n  -webkit-backdrop-filter: none !important;\n  border: none !important;\n  box-shadow: none !important;\n  border-radius: 0 !important;\n}\n\n/* 4e. 外壳里的「行」容器：保持透明，别再叠玻璃\n   （.body 本身是 .hope-stack，所以 .hope-stack .hope-stack 会误伤 .obj-box，\n     这里改成只针对外壳内部的嵌套，不影响 .obj-box 作为内容层） */\n.hope-ui-light .header .hope-stack,\n.hope-ui-light .body   .hope-stack,\n.hope-ui-dark  .header .hope-stack,\n.hope-ui-dark  .body   .hope-stack {\n  background-color: transparent !important;\n  border-color: transparent !important;\n  box-shadow: none !important;\n  backdrop-filter: none !important;\n  -webkit-backdrop-filter: none !important;\n}\n\n/* ---------- 4f. 浮层组件：菜单 / 下拉 / 弹窗 / 气泡 / 抽屉 ----------\n   这些是「叶子面板」，没有子容器，靠 :has() 匹配不到，\n   而且它们渲染在 #root 之外（portal），所以 4b 的透明规则也不影响它们。 */\n.hope-ui-light .hope-menu__content,\n.hope-ui-light .hope-menu__list,\n.hope-ui-light .hope-popover__content,\n.hope-ui-light .hope-modal__content,\n.hope-ui-light .hope-dialog__content,\n.hope-ui-light .hope-drawer__content,\n.hope-ui-light .hope-tooltip,\n.hope-ui-light .hope-select__content,\n.hope-ui-light .hope-alert,\n.hope-ui-light .hope-accordion__item,\n.hope-ui-light .hope-toast,\n.hope-ui-light [class*=\"menu__content\"],\n.hope-ui-light [class*=\"menu__list\"],\n.hope-ui-light [class*=\"popover__content\"],\n.hope-ui-light [class*=\"modal__content\"],\n.hope-ui-light [class*=\"dialog__content\"],\n.hope-ui-light [class*=\"drawer__content\"],\n.hope-ui-light [class*=\"select__content\"],\n.hope-ui-light [class*=\"dropdown\"],\n.hope-ui-light [class*=\"tooltip\"],\n.hope-ui-light [class*=\"context-menu\"] {\n  background-color: rgba(255, 255, 255, 0.72) !important;\n  background-image: none !important;\n  border: 1px solid var(--lg-l-border) !important;\n  box-shadow: var(--lg-l-shadow), var(--lg-l-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  border-radius: 16px !important;\n}\n\n.hope-ui-dark .hope-menu__content,\n.hope-ui-dark .hope-menu__list,\n.hope-ui-dark .hope-popover__content,\n.hope-ui-dark .hope-modal__content,\n.hope-ui-dark .hope-dialog__content,\n.hope-ui-dark .hope-drawer__content,\n.hope-ui-dark .hope-tooltip,\n.hope-ui-dark .hope-select__content,\n.hope-ui-dark .hope-alert,\n.hope-ui-dark .hope-accordion__item,\n.hope-ui-dark .hope-toast,\n.hope-ui-dark [class*=\"menu__content\"],\n.hope-ui-dark [class*=\"menu__list\"],\n.hope-ui-dark [class*=\"popover__content\"],\n.hope-ui-dark [class*=\"modal__content\"],\n.hope-ui-dark [class*=\"dialog__content\"],\n.hope-ui-dark [class*=\"drawer__content\"],\n.hope-ui-dark [class*=\"select__content\"],\n.hope-ui-dark [class*=\"dropdown\"],\n.hope-ui-dark [class*=\"tooltip\"],\n.hope-ui-dark [class*=\"context-menu\"] {\n  background-color: rgba(40, 42, 50, 0.80) !important;\n  background-image: none !important;\n  border: 1px solid var(--lg-d-border) !important;\n  box-shadow: var(--lg-d-shadow), var(--lg-d-inner) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  border-radius: 16px !important;\n}\n\n/* 遮罩层也要跟着变透明一点，否则弹窗后面一层死黑 */\n.hope-ui-light [class*=\"modal__overlay\"],\n.hope-ui-light [class*=\"drawer__overlay\"] { background-color: rgba(40, 48, 70, 0.22) !important; }\n.hope-ui-dark  [class*=\"modal__overlay\"],\n.hope-ui-dark  [class*=\"drawer__overlay\"] { background-color: rgba(0, 0, 0, 0.52) !important; }\n\n/* 菜单里的每一项：悬停时给个玻璃高光 */\n.hope-ui-light [class*=\"menu__item\"]:hover,\n.hope-ui-light [class*=\"select__option\"]:hover,\n.hope-ui-light [class*=\"menu__item\"][data-highlighted] {\n  background-color: rgba(255, 255, 255, 0.85) !important;\n  border-radius: 10px !important;\n}\n.hope-ui-dark [class*=\"menu__item\"]:hover,\n.hope-ui-dark [class*=\"select__option\"]:hover,\n.hope-ui-dark [class*=\"menu__item\"][data-highlighted] {\n  background-color: rgba(255, 255, 255, 0.12) !important;\n  border-radius: 10px !important;\n}\n\n/* 顶栏 / 工具栏 / 侧边栏 / 底部：这些也是\"面板\"，一起玻璃化 */\n.hope-ui-light [class*=\"header\"]:not([class*=\"header-cell\"]),\n.hope-ui-light [class*=\"toolbar\"],\n.hope-ui-light [class*=\"navbar\"],\n.hope-ui-light [class*=\"sidebar\"],\n.hope-ui-light [class*=\"footer-box\"],\n.hope-ui-light [class*=\"footer-new\"] {\n  background-color: var(--lg-l-bg) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) brightness(var(--lg-brightness)) !important;\n  border: 1px solid var(--lg-l-border) !important;\n  box-shadow: var(--lg-l-shadow), var(--lg-l-inner) !important;\n  border-radius: var(--lg-radius) !important;\n}\n.hope-ui-dark [class*=\"header\"]:not([class*=\"header-cell\"]),\n.hope-ui-dark [class*=\"toolbar\"],\n.hope-ui-dark [class*=\"navbar\"],\n.hope-ui-dark [class*=\"sidebar\"],\n.hope-ui-dark [class*=\"footer-box\"],\n.hope-ui-dark [class*=\"footer-new\"] {\n  background-color: var(--lg-d-bg) !important;\n  backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  -webkit-backdrop-filter: blur(var(--lg-blur)) saturate(var(--lg-saturate)) !important;\n  border: 1px solid var(--lg-d-border) !important;\n  box-shadow: var(--lg-d-shadow), var(--lg-d-inner) !important;\n  border-radius: var(--lg-radius) !important;\n}\n\n/* ---------- 5. 输入框：内凹的玻璃槽 ---------- */\ninput.hope-input,\ninput.hope-input.hope-c-PJLV,\ninput.hope-input.hope-c-PJLV.hope-c-PJLV,\n.hope-input input,\n.hope-select__trigger {\n  border-radius: 12px !important;\n  backdrop-filter: blur(14px) saturate(150%) !important;\n  -webkit-backdrop-filter: blur(14px) saturate(150%) !important;\n}\n.hope-ui-light input.hope-input,\n.hope-ui-light input.hope-input.hope-c-PJLV,\n.hope-ui-light input.hope-input.hope-c-PJLV.hope-c-PJLV,\n.hope-ui-light .hope-input input {\n  background-color: rgba(255, 255, 255, 0.66) !important;\n  background-image: none !important;\n  border: 1px solid rgba(255, 255, 255, 0.85) !important;\n  /* 内凹：左上暗、右下亮，做出「槽」的感觉 */\n  box-shadow: inset 0 2px 5px rgba(50, 60, 90, 0.09),\n              inset 0 -1px 0 rgba(255, 255, 255, 0.9) !important;\n  color: #1c2030 !important;\n  caret-color: #3b6fd4 !important;\n}\n.hope-ui-dark input.hope-input,\n.hope-ui-dark input.hope-input.hope-c-PJLV,\n.hope-ui-dark input.hope-input.hope-c-PJLV.hope-c-PJLV,\n.hope-ui-dark .hope-input input {\n  background-color: rgba(255, 255, 255, 0.09) !important;\n  background-image: none !important;\n  border: 1px solid rgba(255, 255, 255, 0.14) !important;\n  box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.28) !important;\n  color: #f2f4f8 !important;\n  caret-color: #7aa7ff !important;\n}\n\n.hope-ui-light input.hope-input::placeholder,\n.hope-ui-light .hope-input input::placeholder { color: rgba(28, 32, 48, 0.42) !important; opacity: 1 !important; }\n.hope-ui-dark  input.hope-input::placeholder,\n.hope-ui-dark  .hope-input input::placeholder  { color: rgba(242, 244, 248, 0.42) !important; opacity: 1 !important; }\n\n.hope-ui-light input.hope-input:focus,\n.hope-ui-light input.hope-input.hope-c-PJLV.hope-c-PJLV:focus {\n  background-color: rgba(255, 255, 255, 0.86) !important;\n  border-color: rgba(120, 160, 240, 0.85) !important;\n  box-shadow: inset 0 1px 3px rgba(50, 60, 90, 0.07),\n              0 0 0 3px rgba(120, 160, 240, 0.22) !important;\n  outline: none !important;\n}\n.hope-ui-dark input.hope-input:focus,\n.hope-ui-dark input.hope-input.hope-c-PJLV.hope-c-PJLV:focus {\n  background-color: rgba(255, 255, 255, 0.14) !important;\n  border-color: rgba(130, 165, 255, 0.65) !important;\n  box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.24),\n              0 0 0 3px rgba(130, 165, 255, 0.20) !important;\n  outline: none !important;\n}\n\n/* ---------- 6. 按钮 ---------- */\n.hope-button {\n  border-radius: 12px !important;\n  transition: background-color .22s ease, box-shadow .22s ease, transform .12s ease !important;\n}\n.hope-ui-light .hope-button {\n  background-color: rgba(255, 255, 255, 0.60) !important;\n  border: 1px solid rgba(255, 255, 255, 0.85) !important;\n  box-shadow: 0 1px 4px rgba(50, 60, 90, 0.08),\n              inset 0 1px 0 rgba(255, 255, 255, 0.95) !important;\n  backdrop-filter: blur(14px) saturate(150%) !important;\n  -webkit-backdrop-filter: blur(14px) saturate(150%) !important;\n}\n.hope-ui-light .hope-button:hover {\n  background-color: rgba(255, 255, 255, 0.82) !important;\n  box-shadow: 0 4px 14px rgba(50, 60, 90, 0.13),\n              inset 0 1px 0 rgba(255, 255, 255, 1) !important;\n  transform: translateY(-1px) !important;\n}\n.hope-ui-dark .hope-button {\n  background-color: rgba(255, 255, 255, 0.10) !important;\n  border: 1px solid rgba(255, 255, 255, 0.15) !important;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14) !important;\n  backdrop-filter: blur(14px) saturate(150%) !important;\n  -webkit-backdrop-filter: blur(14px) saturate(150%) !important;\n}\n.hope-ui-dark .hope-button:hover {\n  background-color: rgba(255, 255, 255, 0.18) !important;\n  transform: translateY(-1px) !important;\n}\n.hope-ui-light .hope-button:active,\n.hope-ui-dark  .hope-button:active { transform: translateY(0) !important; }\n\n/* ---------- 7. 通知条 ---------- */\n.hope-ui-light .hope-notification {\n  background-color: rgba(255, 255, 255, 0.80) !important;\n  border: 1px solid rgba(255, 255, 255, 0.92) !important;\n  box-shadow: 0 12px 40px rgba(50, 60, 90, 0.16), inset 0 1px 0 rgba(255,255,255,1) !important;\n}\n.hope-ui-dark .hope-notification {\n  background-color: rgba(30, 32, 38, 0.86) !important;\n  border: 1px solid rgba(255, 255, 255, 0.12) !important;\n  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5) !important;\n}\n.hope-notification {\n  backdrop-filter: blur(22px) saturate(170%) !important;\n  -webkit-backdrop-filter: blur(22px) saturate(170%) !important;\n  border-radius: 16px !important;\n}\n\n/* ---------- 8. 滚动条 ---------- */\n::-webkit-scrollbar { width: 10px; height: 10px; }\n::-webkit-scrollbar-track { background: transparent; }\n.hope-ui-light ::-webkit-scrollbar-thumb,\nbody.hope-ui-light::-webkit-scrollbar-thumb {\n  background: rgba(60, 70, 100, 0.22);\n  border-radius: 6px; border: 3px solid transparent; background-clip: content-box;\n}\n.hope-ui-dark ::-webkit-scrollbar-thumb,\nbody.hope-ui-dark::-webkit-scrollbar-thumb {\n  background: rgba(255, 255, 255, 0.20);\n  border-radius: 6px; border: 3px solid transparent; background-clip: content-box;\n}\n\n/* ---------- 9. 手机端降强度 ---------- */\n@media (max-width: 768px) {\n  :root { --lg-blur: 22px; --lg-radius: 16px; }\n\n  /* OpenList 登录卡片自带 min-width，窄屏会超出视口。\n     ★ min-width 优先级高于 max-width，必须一起归零才有效 */\n  .hope-center \u003e .hope-stack,\n  .hope-center \u003e .hope-stack.hope-c-PJLV,\n  .hope-center \u003e .hope-stack.hope-c-PJLV.hope-c-PJLV,\n  .hope-center \u003e .hope-c-PJLV.hope-c-PJLV {\n    min-width: 0 !important;\n    max-width: 100% !important;\n    width: 100% !important;\n    box-sizing: border-box !important;\n  }\n  .hope-center {\n    padding-left: 14px !important;\n    padding-right: 14px !important;\n    box-sizing: border-box !important;\n    width: 100vw !important;\n    max-width: 100vw !important;\n    overflow-x: hidden !important;\n  }\n  html, body { max-width: 100vw !important; overflow-x: hidden !important; }\n}\n\u003c/style\u003e\n\n\u003c!-- 启动接口预载：SPA 一启动就要 settings / archive_extensions / me，\n     提前发起可以把这几次往返和主包下载重叠起来（省 0.3~0.5 秒） --\u003e\n\u003clink rel=\"preload\" as=\"fetch\" href=\"/api/public/settings\"\u003e\n\u003clink rel=\"preload\" as=\"fetch\" href=\"/api/public/archive_extensions\"\u003e\n\u003clink rel=\"preload\" as=\"fetch\" href=\"/api/me\"\u003e\n\u003cscript id=\"ol-ip-report\"\u003e\n/* 访客真实 IP 报到：站点挂在 xray 后面，443 进来的请求源地址是 127.0.0.1，\n   看不到访客真实 IP。8443 是公网直听的 —— 让浏览器直连它打一次 /ip，\n   服务器就从这条连接上读到真实 IP，并用 cookie 绑定到本访客（之后所有请求都带上）。\n   每个会话只打一次；失败就当没这回事。 */\n(function () {\n  'use strict';\n  try {\n    if (sessionStorage.getItem('cz_ip_sent')) return;\n    sessionStorage.setItem('cz_ip_sent', '1');\n    var host = location.hostname;\n    var url = location.protocol + '//' + host + ':8443/ip';\n    fetch(url, { credentials: 'include', mode: 'cors' })\n      .then(function (r) { return r.json(); })\n      .then(function (j) { if (j \u0026\u0026 j.ip) try { window.__czIp = j.ip; } catch (e) {} })\n      .catch(function () {});\n  } catch (e) {}\n})();\n\u003c/script\u003e\n\u003cscript id=\"ol-raw-preview-fix\"\u003e\n/* ============================================================\n   CR3/RAW 文件页兜底：让「图像查看器」显示得出来\n   ------------------------------------------------------------\n   问题：OpenList 把 CR3 丢进内置图像查看器，但浏览器解不了 CR3 → 一片空白。\n   做法：本脚本只在【RAW 文件页】生效（URL 以 .cr3/.cr2/... 结尾），\n        用接口拿到该文件的签名直链，交给自建 /raw-preview 服务\n        （它会抠出 CR3 内嵌的全尺寸 JPEG 并缓存），塞进查看器区域。\n   安全性：① 不改 raw_url，下载走的仍是原文件；\n          ② 只在 RAW 页生效，JPG/PNG 等一律不碰；\n          ③ 全程 try/catch，出错就当没这回事，不影响原页面。\n   ============================================================ */\n(function () {\n  'use strict';\n  var RAW = /\\.(cr3|cr2|crw|nef|arw|dng|raf|orf|rw2|srw|pef)$/i;\n\n  function pagePath() {\n    try { return decodeURIComponent(location.pathname); } catch (e) { return location.pathname; }\n  }\n  function isRawPage() { return RAW.test(pagePath()); }\n\n  /* ============================================================\n     列表视图：把行首的文件类型图标换成真缩略图（不用点开就能看）\n     ------------------------------------------------------------\n     行结构：a.list-item \u003e div.name-box \u003e svg.icon（16px 图标）\n     缩略图地址来自 /api/fs/list 返回的 thumb 字段（反代注入的 /thumb 服务）\n     ============================================================ */\n  var thumbMapCache = {};\n  function folderOf(pathname) {\n    var p = pathname || '/';\n    if (/\\.[A-Za-z0-9]{2,5}$/.test(p)) p = p.replace(/\\/[^\\/]*$/, '');\n    return p || '/';\n  }\n  function loadThumbMap() {\n    var dir = folderOf(pagePath());\n    if (thumbMapCache[dir]) return Promise.resolve(thumbMapCache[dir]);\n    return fetch('/api/fs/list', {\n      method: 'POST',\n      headers: { 'content-type': 'application/json' },\n      body: JSON.stringify({ path: dir, password: '', page: 1, per_page: 200, refresh: false })\n    }).then(function (r) { return r.json(); }).then(function (j) {\n      var map = {};\n      var arr = (j \u0026\u0026 j.data \u0026\u0026 j.data.content) || [];\n      for (var i = 0; i \u003c arr.length; i++) {\n        if (arr[i] \u0026\u0026 arr[i].thumb) map[arr[i].name] = arr[i].thumb;\n      }\n      thumbMapCache[dir] = map;\n      return map;\n    });\n  }\n  function decorateList() {\n    var rows = document.querySelectorAll('a.list-item');\n    if (!rows.length) return;\n    loadThumbMap().then(function (map) {\n      var made = 0;\n      for (var i = 0; i \u003c rows.length; i++) {\n        var a = rows[i];\n        if (a.getAttribute('data-ol-thumb') === '1') continue;\n        var href = a.getAttribute('href') || '';\n        var name = href.split('/').pop();\n        try { name = decodeURIComponent(name); } catch (e) {}\n        var url = map[name];\n        if (!url) continue;\n        var svg = a.querySelector('.name-box \u003e svg') || a.querySelector('svg.icon');\n        if (!svg || !svg.parentNode) continue;\n        var img = document.createElement('img');\n        img.src = url;\n        img.setAttribute('loading', 'lazy');\n        img.setAttribute('decoding', 'async');\n        img.alt = '';\n        img.style.cssText = 'width:40px;height:30px;min-width:40px;object-fit:cover;border-radius:6px;margin-right:9px;background:rgba(120,140,180,.13);box-shadow:0 1px 3px rgba(20,30,60,.2)';\n        img.addEventListener('error', function () {\n          try { img.remove(); if (svg) svg.style.display = ''; } catch (e) {}\n        });\n        svg.style.display = 'none';\n        svg.parentNode.insertBefore(img, svg);\n        a.setAttribute('data-ol-thumb', '1');\n        made++;\n      }\n      if (made) console.log('[ol-thumb] 列表已贴缩略图 ' + made + ' 行');\n    }).catch(function () {});\n  }\n  var decorateTimer = null;\n  function scheduleDecorate() {\n    if (decorateTimer) return;\n    decorateTimer = setTimeout(function () { decorateTimer = null; decorateList(); }, 400);\n  }\n\n  /* 列表/灯箱里如果直接出现了 RAW 文件的 \u003cimg\u003e（src=/d/xxx.CR3?sign=...），\n     浏览器解不了码 → 改成指向已预热好的缩略图（不加这一步就是一片空白）。\n     注意：必须传【完整 URL 或站内路径 + sign】，且用 /thumb 而不是 /raw-preview，\n     因为 /raw-preview 要整文件回源（CR3 有 39MB），而缩略图是 275KB 且已缓存。 */\n  function fixImg(img) {\n    try {\n      var s = img.getAttribute('src') || '';\n      if (!s || s.indexOf('/raw-preview') \u003e= 0 || s.indexOf('/thumb') \u003e= 0) return;\n      var abs;\n      try { abs = new URL(s, location.origin); } catch (e) { return; }\n      var dec = '';\n      try { dec = decodeURIComponent(abs.pathname); } catch (e) { dec = abs.pathname; }\n      if (!RAW.test(dec)) return;\n      var sign = abs.searchParams.get('sign') || '';\n      var name = dec.split('/').pop();\n      img.setAttribute('src', '/thumb?u=' + encodeURIComponent(abs.pathname) +\n        (sign ? '\u0026s=' + encodeURIComponent(sign) : '') + '\u0026n=' + encodeURIComponent(name));\n    } catch (e) {}\n  }\n\n  /* ★ 关键性能优化：图库一页有 100 张缩略图，浏览器默认会全部同时开始加载，\n     而每张首次都要服务端现场抠图（~1 秒），于是一页要等十几秒。\n     这里在 \u003cimg\u003e 刚插入 DOM 时立刻打上 loading=\"lazy\"，\n     让浏览器只加载视口内的那十来张，其余滚动到时再加载 —— 首屏立刻出图。 */\n  function markLazy(img) {\n    try {\n      var s = img.getAttribute('src') || '';\n      if (s.indexOf('/thumb') \u003c 0 \u0026\u0026 s.indexOf('/raw-preview') \u003c 0) return;\n      if (img.getAttribute('loading') !== 'lazy') {\n        img.setAttribute('loading', 'lazy');\n        img.setAttribute('decoding', 'async');\n      }\n    } catch (e) {}\n  }\n  function scan(node) {\n    if (!node || node.nodeType !== 1) return;\n    if (node.tagName === 'IMG') { markLazy(node); fixImg(node); }\n    var list = node.querySelectorAll ? node.querySelectorAll('img') : [];\n    for (var i = 0; i \u003c list.length; i++) { markLazy(list[i]); fixImg(list[i]); }\n  }\n  try {\n    new MutationObserver(function (ms) {\n      for (var i = 0; i \u003c ms.length; i++) {\n        var m = ms[i];\n        if (m.type === 'attributes') { markLazy(m.target); fixImg(m.target); }\n        else for (var j = 0; j \u003c m.addedNodes.length; j++) scan(m.addedNodes[j]);\n      }\n      scheduleDecorate();\n    }).observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['src'] });\n    document.addEventListener('DOMContentLoaded', function () { scan(document.body); scheduleDecorate(); });\n  } catch (e) {}\n\n  /* RAW 文件页兜底：正常情况下 OpenList 自己会用 iframe 显示「RAW 在线预览」，\n     只有它迟迟没出来（既没 iframe 也没图）时才补一张，避免用户看到空白页。\n     用 /thumb（275KB，已预热）而不是 /raw-preview（要整文件回源 39MB）。 */\n  var injected = {};\n  function ensureRawPageImage() {\n    try {\n      if (!isRawPage()) return;\n      var path = pagePath();\n      if (injected[path]) return;\n      if (document.querySelector('iframe') || document.querySelector('img[src*=\"/thumb\"], img[src*=\"/raw-preview\"]')) {\n        injected[path] = 1;\n        return;\n      }\n      fetch('/api/fs/get', {\n        method: 'POST',\n        headers: { 'content-type': 'application/json' },\n        body: JSON.stringify({ path: path, password: '' })\n      }).then(function (r) { return r.json(); }).then(function (j) {\n        if (injected[path]) return;\n        if (document.querySelector('iframe')) return;      // iframe 只是慢了点，别重复贴\n        if (!j || !j.data || !j.data.sign) return;\n        var host = document.querySelector('.obj-box') || document.querySelector('.body');\n        if (!host) return;\n        injected[path] = 1;\n        var box = document.createElement('div');\n        box.setAttribute('data-ol-raw-preview', '1');\n        box.style.cssText = 'width:100%;display:flex;justify-content:center;padding:8px 0 20px';\n        var img = document.createElement('img');\n        img.src = '/thumb?u=' + encodeURIComponent('/d' + path) +\n          '\u0026s=' + encodeURIComponent(j.data.sign) +\n          '\u0026n=' + encodeURIComponent(j.data.name || '');\n        img.alt = (j.data.name || '') + ' 预览';\n        img.style.cssText = 'max-width:100%;max-height:76vh;border-radius:12px;box-shadow:0 6px 24px rgba(20,30,60,.18)';\n        img.onerror = function () { try { box.remove(); } catch (e) {} };\n        box.appendChild(img);\n        host.appendChild(box);\n      }).catch(function () {});\n    } catch (e) {}\n  }\n\n  setTimeout(function () { ensureRawPageImage(); scheduleDecorate(); }, 6000);\n  var lastPath = location.pathname;\n  setInterval(function () {\n    if (location.pathname !== lastPath) {\n      lastPath = location.pathname;\n      setTimeout(ensureRawPageImage, 1800);\n      setTimeout(scheduleDecorate, 900);\n    }\n  }, 1200);\n})();\n\u003c/script\u003e\n\n","default_page_size":"100","external_previews":"{\"cr3,cr2,crw,nef,arw,dng,raf,orf,rw2,srw,pef\": {\"RAW 在线预览（新标签页）\": \"https://pan.202505yuxian.school/raw-preview?u=$e_durl\"}}","favicon":"https://res.oplist.org/logo/logo.svg","filename_char_mapping":"{\"/\": \"|\"}","filter_readme_scripts":"true","forward_direct_link_params":"false","hide_files":"/\\/README.md/i","home_container":"max_980px","home_icon":"🏠","iframe_previews":"{\"doc,docx,xls,xlsx,ppt,pptx\": {\"Microsoft\": \"https://view.officeapps.live.com/op/view.aspx?src=$e_url\", \"Google\": \"https://docs.google.com/gview?url=$e_url\u0026embedded=true\"}, \"pdf\": {\"PDF.js\": \"https://res.oplist.org/pdf.js/web/viewer.html?file=$e_url\"}, \"epub\": {\"EPUB.js\": \"https://res.oplist.org/epub.js/viewer.html?url=$e_url\"}, \"cr3,cr2,crw,nef,arw,dng,raf,orf,rw2,srw,pef\": {\"RAW 在线预览\": \"https://pan.202505yuxian.school/raw-preview?u=$e_durl\u0026mode=html\"}}","ignore_direct_link_params":"sign,openlist_ts,raw","ldap_login_enabled":"false","ldap_login_tips":"login with ldap","logo":"https://res.oplist.org/logo/logo.svg","main_color":"#1890ff","multipart_chunk_size":"10","multipart_enabled":"true","non_efs_zip_encoding":"IBM437","ocr_api":"https://openlistteam-ocr-api-server.hf.space/ocr/file/json","package_download":"true","pagination_type":"load_more","preview_archives_by_default":"true","preview_download_by_default":"false","readme_autorender":"true","robots_txt":"User-agent: *\nAllow: /","search_index":"none","settings_layout":"list","share_archive_preview":"false","share_icon":"🎁","share_preview":"false","share_preview_archives_by_default":"false","share_preview_download_by_default":"true","share_summary_content":"@{{creator}} shared {{#each files}}{{#if @first}}\"{{filename this}}\"{{/if}}{{#if @last}}{{#unless (eq @index 0)}} and {{@index}} more files{{/unless}}{{/if}}{{/each}} from {{site_title}}: {{base_url}}/@s/{{id}}{{#if pwd}} , the share code is {{pwd}}{{/if}}{{#if expires}}, please access before {{dateLocaleString expires}}.{{/if}}","show_disk_usage_in_plain_text":"false","site_title":"OpenList","sso_compatibility_mode":"false","sso_login_enabled":"false","sso_login_platform":"","version":"v4.2.6 (Commit: 2bdf16d) - Frontend: v4.2.6 - Build at: 2026-09-01 15:18:59 +0000","video_autoplay":"true","webauthn_login_enabled":"false"}}