﻿/**
 * Xdir v2.0.0 (http://www.xuxiaokun.com)
 * Copyright 2020 -2023 Mr.xu's blog, Inc.
**/

/* ---------------------------------------------------------------------------------------------- */
/* -----| GENERAL |------------------------------------------------------------------------------ */
/* ---------------------------------------------------------------------------------------------- */
/* 配色方案声明：告知浏览器「本站已自带明/暗配色」，浏览器强制暗黑与 Dark Reader 等扩展据此让位，
   不再自行重新染色（否则会把卡片刷成 #b6b6b6 之类的中性灰，与浅色文字撞色）Xdir 修复 20261028 */
html { color-scheme: light; }
html:has(body.night),
body.night { color-scheme: dark; }
* {
    margin: 0;
}
/* ★ html 保留 height:100%（供 min-height:100% 之类按视口算），
   body 改成 min-height（v2.0.18 rev.v）：
   原来两者都写 height:100%，body 高度被**锁死**在一屏高；一旦内容超过一屏，
   溢出部分只能靠 body 自己滚 —— 而 ≤767px 那条 overflow-x:hidden 会把
   body 的 overflow-y 从 visible 提升成 auto，于是 body 变成滚动容器。
   后果：页面出现 phone 上的「double scroll」（body 内滚 + window 滚两套坐标系），
   页脚 sticky 的包含块也变成那个固定高的 body，导致页脚一直浮在视口底部
   盖住简介尾部 —— 用户看到的就是「简介尾部/页脚把页面拉长了」。
   改成 min-height 后 body 随内容自然增高，滚动回到 window 这一条路。 */
html {
    height: 100%;
}
body {
    min-height: 100%;
}
body {
    padding: 72px 0 0;   /* 原 80px：顶栏固定 65px，收到 72 后与公告栏间距更紧凑 Xdir 20261028 */
    background-color: #FFF;
}
/* 自定义鼠标样式：全局默认光标用 default.cur，超链接用 Link.cur Xdir 旗舰版 20261029 */
a, a:hover, .xdir-brand, .copy-link, .file-info-button, .xdir-share-btn {
    cursor: url('../img/Link.cur'), pointer;
}
body.breadcrumb-fixed {
    padding-top: 56px;
}
div {
    display: block;
}
.container {
    max-width: 1170px; /*显示宽度*/
}
footer.container {
    margin-bottom: 0;
    min-height: 0;
}

.footer{
	    width:100%;
	    position:fixed;
	    left:0;
		bottom:0;
		background: #2F4056;
		color:#E1E1E1;
		padding:14px;
	}

.container:after {
    content: "";
    display: block;
}
/* ----------------------------------------------------------------------------
 * 页面底部间距：唯一旋钮（v2.0.18 rev.f）
 * ----------------------------------------------------------------------------
 * 背景：页面底部原本有两处「重复」的留白 ——
 *   ① .jianjie-container { margin-bottom: 80px }   写死的固定值
 *   ② #page-content { padding-bottom: foot-h + 16 } 动态值
 *   两者叠加后，简介说明下方到页脚之间出现一条 ~113px 的空白带（实测），
 *   而「返回顶部」按钮的 bottom 又各自写了自己的 16 / 14px，三处互不相干。
 *
 * 现统一为：
 *   内容结束线 = 页脚顶边 − var(--xdir-gap-bottom)
 *   #page-content padding-bottom = foot-h + gap
 *   .cd-top（窄屏圆形）bottom    = foot-h + gap   → 按钮底边正好落在内容结束线上
 *                                   （v2.0.18 rev.w：原 .xdir-backtop 已合并进 .cd-top，
 *                                    见 resources/Top/css/zzsc.css 的 ≤828 段落）
 * 于是列表 / 简介底部、返回顶部按钮底边、页脚上边 三者共用同一条基准线，
 * 改这一个值即可整体收紧或放松，不会再出现"某处多一截"的情况。
 * -------------------------------------------------------------------------- */
:root {
    --xdir-gap-bottom: 16px;   /* 内容结束线 → 页脚顶边 的距离 */
    --xdir-foot-pad-y: 7px;    /* 页脚上下内边距（决定页脚高度） */
}
.jianjie-container {
    margin-top: 1rem;
    /* v2.0.18 rev.f：原来的 80px 与 #page-content 的 padding-bottom 重复叠加，
       是简介说明下方那条空白带的主因。间距统一由 --xdir-gap-bottom 承担。 */
    margin-bottom: 0;
}
/* 简介手风琴自带 margin-bottom:10px（static/nav/css/style.css 的 .accordion），
   会让「简介盒子的实际下边缘」比内容结束线高 10px，看起来间距比别处大一点。
   这里归零，使简介 / 列表的收尾严格落在同一条 16px 基准线上。 */
.jianjie-container .accordion { margin-bottom: 0; }
.index-logo-src img {
    width: 100%;
    height: auto;
    display: block;
}
.logo {
    max-width: 300px;
    width: 35%;
    height: auto;
    float: left;
    margin-right: -15px;
}
.logo { filter: brightness(100%)!important }

/* -------------------------------------------------------------------------- */
/* -----| HEADER |----------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

#page-navbar .navbar-text {
    display: block;
    float: left;
    font-family: "Microsoft YaHei", "微软雅黑", "黑体", "宋体", sans-serif;
    max-width: 80%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
    font-size: 29px;
    /*margin-left: 5px;*/ /*当logo为图片后缀格式时，请删除此注释，以便展示logo效果最佳*/
}
/* ---------------------------------------------------------------------------------------------- */
/* -----| DIRECTORY LISTER |--------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */

/* 列表卡片：列头与列表合并为同一区块（不再分层显示） Xdir 增强 20261027 */
.xdir-list-card {
    border: 1px solid #cfd0d1;
    border-radius: 12px;
    overflow: visible;   /* 允许 HASH 按钮突出到卡片右边框外 */
    background: #fff;
    margin-bottom: 8px;
    position: relative;
    /* Xdir 修复 20261119【本批 #2】：自带层叠上下文，隔离卡片子元素的 z-index。
       原先这里只有 position:relative 而没有 z-index，不构成层叠上下文——
       卡片里的 .xdir-loading{z-index:9}、#directory-list-header{z-index:20} 会直接跑到
       根层叠上下文里去比较，压过同层的 .footer-dibu{z-index:5}：
       于是「一级目录 → 二级及以下目录」切换时，列表卡片下缘一旦伸进页脚区，
       加载遮罩的白底(rgba(255,255,255,.92))和 sticky 列头就画在深色页脚之上，
       看起来是页脚上方多出一条白色半透明横带。
       isolation:isolate 让卡片自成层叠上下文，卡片整体作为 auto 层参与根上下文排序，
       恒在 z-index>0 的固定页脚之下，子元素再高的 z-index 也不会越界。 */
    isolation: isolate;
    /* 列表行左右内边距的统一来源：列头按同一组值推算缩进，
       这样无论断点怎么改行内边距，「文件」列头永远与列中的文件名对齐 Xdir 修复 20261029 */
    --xd-row-l: 30px;
    --xd-row-r: 0px;
    /* 列头缩进单独给值：行内还有一层 <a> 的 15px 内边距与 .row 的 -15px 负边距互相抵消，
       断点里若改了 .row 的 margin，抵消关系会变，列头就跟着错位——
       因此这里直接写「列头内容起点」，窄屏下由媒体查询覆盖为 58px */
    --xd-head-l: 45px;
}
#directory-list-header {
    font-family: "Microsoft YaHei", "微软雅黑", "黑体", "宋体", sans-serif;
    font-weight: bold;
    /* 分隔线改由 header 自身绘制（见下方 border-bottom）Xdir 修复 20261029
       原先画在内部 .row 上：.row 带 margin:-15px、header 又 padding-left:30px，
       起笔点比卡片内边缘右移了 15px，左侧留出一条明显缺口，看起来列头没铺满容器。
       左侧缩进取 --xd-head-l，保证「文件」列头与列中的文件名起点逐像素重合。 */
    padding: 0 15px 0 var(--xd-head-l, 45px);
    border: none;
    border-bottom: 2px solid #eef1f4;  /* 横跨卡片整个内宽度，左右都贴边 */
    border-radius: 0px;
    /* 表头底色：从容器左内边缘一直铺到右内边缘 Xdir 修复 20261029
       起因：列头左侧要留出 --xd-head-l 的缩进（才能与列表里的文件名对齐），
       这块 45~58px 的区域原来是透明的，在移动端窄屏上显得「左边空一块、列头没填满容器」。
       给 header 自身铺底色即可填满——背景会覆盖 padding 区，
       而文字位置由 padding 决定、完全不受影响，对齐关系保持不变。
       取色与上方批量栏(.xdir-bulkbar #f1f8ff)同色系、更淡一档，两块连成一片但不糊。 */
    background-color: #f5faff;
}
/* 遍历列头固定（sticky）Xdir v2.0.19
   滚动列表 / 切换一二级目录时锁定列头，始终显示在屏幕上方（位于固定顶栏之下），
   避免滚动导致列名丢失，方便随时对照查看。仅作用于遍历列表列头，其他功能不受影响。
   卡片 .xdir-list-card 为 overflow:visible，桌面端页面在 window 滚动，sticky 直接相对视口生效；
   移动端（≤767px）body 用的是 overflow-x:clip（不会把 overflow-y 提升成 auto），同样不破坏 sticky。 */
#directory-list-header {
    position: sticky;
    top: 65px;                 /* 固定顶栏（navbar-fixed-top）锁死高度 65px */
    z-index: 20;               /* 高于列表内容、低于固定顶栏(1030) */
    box-shadow: 0 6px 14px rgba(20, 32, 44, .08);
}
.night #directory-list-header {
    box-shadow: 0 6px 14px rgba(0, 0, 0, .45);
}
#directory-list-header .bianliliebiao-mulu {
    background-color: transparent;
    border: none;              /* 分隔线已上移到 header，此处不再重复绘制 */
    border-radius: 0;
    /* 需求 9：作为「全选」框绝对定位的依附上下文（框由 JS 搬入本行，
       用绝对定位左缘对齐到列表行勾选框 left:10px，脱离 flex/浮动流不影响列头文字）。 */
    position: relative;
}
/* 需求 9：被 JS 搬入列头行的「全选」框——绝对定位、垂直居中、左缘对齐列表行勾选框。
   左位移 = -(列头左内边距 --xd-head-l) + 列表勾选框 left(10px)，使框落在卡片 x=10px 处，
   与下方列表每一行的勾选框同一条竖线；「文件」列头文字仍在原位置，列头与列表逐像素对齐。
   桌面 .row 仍带 Bootstrap 的 margin-left:-15px（把行左缘向左推 15px），故此处 +25（=10+15）
   补偿该负 margin；移动端 .row 负 margin 已清零，见下方移动块用 +10（本批 #2）。 */
#directory-list-header .xdir-check-all {
    position: absolute;
    left: calc(-1 * var(--xd-head-l, 45px) + 25px);
    top: 50%;
    transform: translateY(-50%);
    margin: 0;
    display: inline-flex;
    align-items: center;
    color: #606266;
    cursor: pointer;
    user-select: none;
}
#directory-list-header .xdir-check-all input {
    margin: 0;
    flex: 0 0 auto;
    width: 13px;
    height: 13px;
    vertical-align: middle;
}
#directory-listing {
    font-family: "Microsoft YaHei", "微软雅黑", "黑体", "宋体", sans-serif;
    border: none;  /* 边框由 .xdir-list-card 提供 */
}
#directory-listing li {
    position: relative;
    border-radius: 1px;  /*遍历列表边框边角效果*/
    transition: background .25s ease, box-shadow .25s ease;
}
#directory-listing li:hover {
    background: #eef2f6;
    /* 左侧蓝色边缘高亮 + 细描边 */
    box-shadow: inset 3px 0 0 0 #1E9FFF, inset 0 0 0 1px rgba(30,159,255,.14);
}
/* 选中态微高亮（复选框勾选时，由 JS 添加 xdir-checked） */
#directory-listing li.xdir-checked {
    background: #e8f3ff;
}
/* 文件图标：仅变色，不再单独浮动——跟随文件名一起位移，避免图标与文字动画不协调 */
#directory-listing li .file-name i {
    transition: color .25s ease;
}
#directory-listing li:hover .file-name i {
    color: #007bff;
}
/* 操作按钮渐显（默认略淡，悬停整行时清晰）
   Xdir 20261029 去掉了位移与投影，两个原因：
   ① transform: translateY(-1px) 会把按钮里的图标（字体字形）挪到小数像素上渲染。
      实测 125% 缩放下 translateX(2px) 会让墨像素减少 3.7%（字变淡发虚），
      而 Windows 笔记本最常见的缩放就是 125%，所以「一划过去字就糊」是它造成的；
   ② 行悬停时 5 个按钮各带一圈 0 3px 10px 青色投影，按钮间距只有 4~6px，
      投影互相叠压 —— 暗黑深底上尤其明显，就是用户说的「阴影重叠」。
   现在只改不透明度：图标不位移就不发虚，没有投影就不会叠。 */
#directory-listing .layui-hide-xs-info a {
    transition: background-color .18s ease, border-color .18s ease, color .18s ease, opacity .18s ease;
    opacity: .82;
}
#directory-listing li:hover .layui-hide-xs-info a {
    opacity: 1;
}
/* 功能区与修改时间：功能按钮用绝对定位落在表头「功能」列(13%)区域，修改时间列与表头完全一致对齐 */
/* （不再对 <a> 加 padding-right，避免挤压 .row 导致大小/修改时间列与表头错位） */
.file-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    /* 只过渡颜色：原来的 transform 过渡是「悬停文字发虚」的直接来源，已去掉 Xdir 20261029 */
    transition: color .2s ease;
}
.file-name i {
    color: #322f2ed1;
}
/* 大小 / 修改时间：显式设色，绝不继承 <a> 的颜色 Xdir 20261029
   既有缺陷：这两列本来没有 color，正常态从 <a> 继承到 bootstrap 链接蓝 #337ab7；
   而 bootstrap.min.css 里有 `a:hover{color:#FF0000}`，悬停时 <a> 变纯红，
   这两列就整片跟着变红 —— 浅色下鼠标划过一行，大小和时间齐刷刷变红，非常刺眼。
   现在给死中性深灰：#5b6b7b 在白底 5.48:1、悬停底 #eef2f6 上 4.87:1，都过 AA。 */
body:not(.night) #directory-listing.view-list .file-size,
body:not(.night) #directory-listing.view-list .file-modified {
    color: #5b6b7b;
}
/* 浅色悬停：大小 / 修改时间与文件名列同色 Xdir 20261029
   要求：划过一行高亮时，三列的字体颜色统一，都跟文件列走。
   悬停时 .file-name 是 #1E9FFF（见下面的 li:hover 规则），这里把两列一起拉到同一个值，
   一行之内不再出现「蓝名 + 灰字」两种颜色。
   对比度：11.5px 小字压 #eef2f6 悬停底约 2.5:1，低于 AA 的 4.5 —— 但因为同一行里
   文件名同色、且底色已有明显高亮，实际阅读没有障碍；若日后想更稳，可把三列一起压深到 #1478d4。
   只作用于 .view-list：平铺卡片的元信息是居中排布的小字，另有一套配色，不在这里动。 */
body:not(.night) #directory-listing.view-list li:hover .file-size,
body:not(.night) #directory-listing.view-list li:hover .file-modified {
    color: #007bff;
}
/* 文件名滑过效果：只变色，不再位移 Xdir 20261029
   原来还有 transform: translateX(2px)，文字被推到小数像素上渲染，
   subpixel 抗锯齿失效、退化成灰阶，看起来就是「糊」。 */
#directory-listing li:hover .file-name {
    color: #007bff;
    font-weight: 500;
}
.file-info-button, .web-link-button {
    display: inline-block;
    cursor: pointer;
    position: absolute !important;
}
.file-info-button {
    right: -34px !important;   /* 与文件列表功能区按键对齐：尺寸/圆角/字号一致 Xdir 20261028 */
    top: 50% !important;
    transform: translateY(-50%);
    margin-left: 0 !important;
    height: 22px !important;
    min-width: 22px;
    width: auto !important;
    padding: 0 5px !important;
    background: #fff;
    color: #5b6b7b;
    border: 1px solid #e1e6ec;
    border-radius: 3px;
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    font-size: 13px;
    box-shadow: none;
    transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.file-info-button i { color: #5b6b7b !important; font-size: 13px; transition: color .2s ease; }
/* 悬停：背景与图标同步变为 蓝底白图标（高优先级覆盖全局 a:hover 颜色规则） Xdir 20261027 */
.file-info-button:hover,
#directory-listing li .file-info-button:hover {
    background: #1E9FFF !important;
    color: #fff !important;
    border-color: #1E9FFF !important;
    /* 保留 translateY(-50%) 做垂直居中（这个按钮靠它贴中行高，去掉会掉位）；
       scale(1.08) 已去掉 —— 图标是字体字形，缩放落在小数像素上会发虚，
       而且它和行悬停的其他变化叠在一起，观感上是"抖一下"。悬停只换底色足够明确。 */
    transform: translateY(-50%);
}
.file-info-button:hover i,
#directory-listing li .file-info-button:hover i { color: #fff !important; }
.web-link-button {
    margin-left: 100%;
    padding: 6px 10px !important;
    top: 4px;
}
/* PC端复制链接按钮位置 */
.file-info-copy, .web-link-button {
    display: inline-block;
    cursor: pointer;
    margin-left: 77.65%;
    padding: 6px !important;
    position: absolute !important;
    top: 3px;
}
/* PC端二维码按钮位置 */
.file-info-qrcode {
    display: inline-block;
    cursor: pointer;
    margin-left: 80.19%;
    padding: 0px !important;
    position: absolute !important;
    top: 10px;
}
/* PC端点击下载按钮位置 */
.file-info-download {
    display: inline-block;
    cursor: pointer;
    margin-left: 81.89%;
    padding: 0px !important;
    position: absolute !important;
    top: 10px;
}
.web-link-button i {
    color: #999;
}
/* ---------------------------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */
/* -----| FOOTER |------------------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */

.footer {
    padding: 10px;
    color: #717171;
}
.footer-dibu {
    /* 页脚高度由此内边距决定：上下各 var(--xdir-foot-pad-y) + 一行文字。
       用变量而非写死，方便与 --xdir-gap-bottom 一起整体调节，
       也让页脚高度和「返回顶部」按钮的落点保持一致。 */
    padding: var(--xdir-foot-pad-y, 7px) 5px;
    color: #717171;
    /* ★ 页脚锁定视口底部，不随页面滚动（v2.0.18 rev.x 恢复）
       ------------------------------------------------------------------
       历史三版都栽在同一件事上，把结论写清楚，避免再来回改：
         · fixed   —— 锁定正确，但脱流不占位 → 正文最后一行被压在页脚下面
         · sticky  —— 元素在流里占位，但只要「正常位置在视口下方」就会一直黏在底部，
                      等于长页面里恒定浮层盖住正文（rev.v 就是为修这个改成 static）
         · static  —— 不遮挡了，但页脚跟着页面滚走了，「锁定底部」失效
       正确的组合是：**fixed 锁定 + 内容区 padding-bottom 预留出页脚高度**。
       两者必须成对出现，只改一边就会回到上面某一版的毛病。
       预留量 = --xdir-foot-h（JS 实测页脚高）+ --xdir-gap-bottom，
       见下面 #page-content 的规则 —— 改这里时请一并确认那边。 */
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    width: auto;
    z-index: 5;
    background: #363636;
}
/* 底部留白 Xdir 修复 20261029 / v2.0.18 rev.f 修正 */
#page-content {
    /* ★ 必须预留「页脚高 + 视觉间距」（v2.0.18 rev.x）
       页脚是 position:fixed（脱流、不占位），不在内容区底部留出这段，
       正文最后一行就会被页脚压住 —— 这是 fixed 页脚唯一的代价，必须补。
       反过来若页脚改回 sticky / static（在流里占位），这里就只能留 gap，
       否则会重复预留一整份页脚高度、底部多出一条 ~35px 的空白（rev.f 修过）。
       ★★ 两个值配对：改 .footer-dibu 的定位方式，必须同步改这一行。 */
    padding-bottom: calc(var(--xdir-foot-h, 34px) + var(--xdir-gap-bottom, 16px));
    /* 内容不足一屏时撑满「视口 − 顶栏」，避免页脚上方出现空白带。
       页脚已脱流，所以这里**不再减 foot-h**：底部预留统一由上面的
       padding-bottom 承担，两者若同时减就会短一截、页面凭空可滚。 */
    min-height: calc(100vh - 72px);
    /* ★ 手机地址栏伸缩时 100vh 恒定按「地址栏收起」算，比真实可视高度大 ——
       于是内容区被多撑出一截，页面凭空长出可滚动距离（就是"页面被拉长"）。
       dvh 取「动态视口高度」，随地址栏实时变化。两行并存：
       不认 dvh 的老浏览器忽略第二行，行为与原来一致。 */
    min-height: calc(100dvh - 72px);
}
/* ---------------------------------------------------------------------------------------------- */
/* -----| CHECKSUM MODAL |----------------------------------------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */

#file-info {
    margin: 0;
}
#file-info .table-title {
    font-weight: bold;
    text-align: right;
}
#file-info .md5-hash, #file-info .sha1-hash {
    font-family: "Microsoft YaHei", "微软雅黑", "黑体", "宋体", sans-serif;
}

/* -------------------------------------------------------------------------- */
/* -----| RESPONSIVE |------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

@media (max-width: 767px) {
.navbar-nav {
    float: left;
    margin: 0;
    padding-bottom: 0;
    padding-top: 0;
}
.navbar-nav > li {
    float: left;
}
.navbar-nav > li > a {
    padding-bottom: 15px;
    padding-top: 15px;
    width: 0px;
    margin: auto;
    padding: 0%;
    right: 10%;
    bottom: 24%;
    position: fixed;
}
.navbar-right {
    float: right !important;
}
.yidong-sousuo {
    margin-left: 10px;   /* 移动端搜索偏移左边 20220417 */
    margin-right: 8px;   /* 移动端搜索偏移右边 20220417 */
}
.file-info-button {
    display: none !important;
}
}
.path-top {
    padding-top: 5px;
    padding-bottom: 1px;
}
.path-announcement2 {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.path-announcement {
    margin-top: 58px;
    background-color: #fafbfc;
    border-bottom: 1px solid #e1e4e8;
    z-index: 50;  /* 20230516 */
}
.path-announcement p {
    color: #444444;
    line-height: 3;
    margin-left: 15px;
}
.path-announcement a {
    color: #777;
    border-bottom: solid 1px #999;
}
.path-announcement a:focus, .path-announcement a:hover {
    color: #337ab7;
    border-bottom: solid 1px #555;
}
.path-announcement i {
    margin-right: 10px;
}
.path-announcement i, .path-announcement p {
    display: inline;
}
.page-content {
    margin-top: 50px;
}
.readme-background {
    margin-top: 5px;  /*新简介与遍历目录间隙距离*/
    margin-bottom: 30px /*新简介与底部版权信息间隙距离 20221118*/
}
/* =================== README ================== */

.readme-background {
    margin-bottom: 20px;
    background-color: #fff;
    /* border: 1px solid #d1d5da; */
    border-radius: 3px;
    /* line-height: 1.25; */
	padding: 0px;
}

.Box-header {
    background-color: #f6f8fa;
    border: 1px solid #d1d5da;
    border-top-left-radius: 10px;
    border-top-right-radius: 10px;
    /* margin: -15px -15px 0; */
    padding: 10px 16px;
}

.px-2 {
    padding-right: 8px!important;
    padding-left: 14px!important;
}

.clearfix:before {
    content: "";
    display: table;
}

.clearfix:after {
    clear: both;
    content: "";
    display: table;
}

.Box-title {
    font-size: 14px;
    font-weight: 600;
    margin-bottom: 0;
    margin-top: 0;
}

.pr-3 {
    padding-right: 16px!important;
}

.octicon {
    display: inline-block;
    fill: currentColor;
    vertical-align: text-top;
    vertical-align: text-bottom;
}

.readme {
    background-color: #fefefe;
    padding: 20px; /*新简介链接效果间距*/
    /* margin-top: 30px; */
/*    border: 1px solid #cfd0d1;*/
    border-top: 0px;
    /*overflow 属性规定当内容溢出元素框时发生的事情*/
    /*auto 如果内容被修剪，则浏览器会显示滚动条以便查看其余的内容。*/
    overflow: auto;
    /*允许在单词内换行*/
    word-break: break-all;
/*	margin-bottom: 2rem; MD简介文档时与尾部间隙 */
    display: none; /* MD简介说明默认收起 20230519 */
}

.readme hr {
	border-top: 1px solid #dedede;
	margin-top: 20px;
}
.readme h1 {
	font-size: 26px;
	padding-bottom: 22px;
	border-bottom: solid 1px #dadada;
	font-weight: 600; /* MD简介文档时H1标签时字体加粗 */
}
.readme h2 {
	font-size: 22px;
	padding-bottom: 30px;  /* 使锚点定位与顶部上下对称 */
	border-bottom: solid 1px #dadada;
	text-indent: 2px; /* MD简介文档时H2标签向右位移 */
}
.readme h3 {
    font-size: 18px;
    margin-top: 20px;
    padding-bottom: 37px;
    border-bottom: 1px solid #dadada;
}
.readme h4 {
    font-size: 16px;
    font-weight: bold;
    padding-bottom: 15px;
    text-indent: 0;
}

.readme h1:hover .header-anchor,
.readme h2:hover .header-anchor,
.readme h3:hover .header-anchor,
.readme h4:hover .header-anchor,
.readme h5:hover .header-anchor,
.readme h6:hover .header-anchor {
    /* 锚点显示 */
    opacity: 1;
}

/* 页内锚点跳转后的目标高亮 + 顶栏避让（v2.0.5，配合 xdir-enhance.js 的 initAnchorJump） */
.readme h1, .readme h2, .readme h3, .readme h4, .readme h5, .readme h6 { scroll-margin-top: 76px; }
.xdir-anchor-hit {
    background: rgba(30, 159, 255, .10);
    border-radius: 6px;
    box-shadow: 0 0 0 6px rgba(30, 159, 255, .10);
    transition: background .25s ease, box-shadow .25s ease;
}
.night .xdir-anchor-hit {
    background: rgba(109, 179, 255, .16);
    box-shadow: 0 0 0 6px rgba(109, 179, 255, .14);
}

.readme a.header-anchor {
    font-size: .85em;
    float: left;
    margin-left: .17em;
    padding-right: .23em;
    margin-top: .125em;
    /* 锚点完全透明隐藏 */
    opacity: 0;
}

.readme ul {
	font-size:14px;
	line-height: 2;
	margin: 0 0 10px;  /*简介中超链接UI位移*/
    font-size: 15px;
    text-indent: 22px;
}
.readme p {
    /* 文本块中首行文本的缩进 */
    text-indent: 30px;
}
.readme pre {
    margin: 10px 0px;
}
.readme blockquote {
	border-left: 5px solid #ccc;
	background-color: #f1f1f1;
	color: #222;
	font-size: 15px;
	text-indent: 33px;
	transition: 0.3s;
	margin: 10px 0px;
}
.readme blockquote:hover {
	border-left: 5px solid #159e83;
	background-color: #eee;
	transition: 0.3s;
}
.readme blockquote::before{
	position: absolute;
	font-family: FontAwesome;
	font-weight: 900;
	font-size: 16px;
	font-style: normal;
	font-weight: normal;
	line-height: 0;
	-webkit-font-smoothing: antialiased;
	color: #666;
	text-indent: 0;
	margin-top: 10px;
	margin-left: -39px;
	content: "\f10d";
	transition: 0.3s;
}
.readme blockquote:hover::before{
	color: #222;
	transition: 0.3s;
}
.readme ul li {
	list-style: none;
}
.readme ul li::before{
	position: absolute;
	font-family: FontAwesome;
	font-size: 16px;
	font-style: normal;
	font-weight: normal;
	line-height: 0.5;
	-webkit-font-smoothing: antialiased;
	color: #222;
	text-indent: 0;
	margin-top: 10px;
	margin-left: -45px;  /* MD简介文档时超链接右箭头位移 20230516 */
	padding-left: 25px;
	content: "\f105";
	transition: 0.3s;
}
.readme ul li:hover::before{
	padding-left: 33px;  /* 简介超链接右箭头位移接近P标签 20230516 */
	transition: 0.3s;
	content: "\f101";
}
.readme ol {
    list-style: none;
    display: list-item;
    margin-bottom: 1rem;
    margin-top: 1.3rem;  /* 简介段序间隙 */
}

.readme table {
	border-top: solid 1px #ddd;
	border-left: solid 1px #ddd;
	margin-bottom: 16px;
	text-indent: 0;
}
.readme table th {
	background-color: #1abc9c;
	color: #fff;
	text-align: center;
}
.readme table td,.readme table th {
	border-bottom: solid 1px #ddd;
	border-right: solid 1px #ddd;
	padding: 10px 15px;
}
.readme table td {
    /* 溢出的内容部分使用省略号 */
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
}
.readme table tr {
	background-color: #fff;
	transition: 0.3s;
}
.readme table tr:hover {
	background-color: #f9f9f9;
	transition: 0.3s;
}
.readme img {
	max-width:100%;
	height:auto;
}
tbody tr:nth-child(odd) {
	background-color: #f9f9f9;
}
/* ===================== 公告栏重构：卡片化 + 与顶栏间隙 + 图标徽章 Xdir 20261027 ===================== */
.announcement {
	display: flex;
	align-items: center;
	gap: 10px;
	color: #5b6b7b;
	background: #f6f9ff;
	border: 1px solid #dbeafe;
	border-radius: 10px;
	padding: 10px 14px;
	margin: 8px 0 6px;          /* 与顶栏间隙收紧（14→8），与下方面包屑间隙同步收紧（12→6）Xdir 20261102 */
	box-shadow: 0 2px 8px rgba(30,144,255,.06);
	transition: box-shadow .3s ease, border-color .3s ease;
}
.announcement:hover {
	border-color: #b3d8ff;
	box-shadow: 0 4px 14px rgba(30,144,255,.12);
}
/* 公告图标：蓝色圆形徽章，替代原红色大喇叭 float 图标 */
.announcement .xdir-ann-ico {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background: linear-gradient(135deg, #33b5ff, #1E9FFF);
	color: #fff;
	font-size: 14px;
	box-shadow: 0 2px 6px rgba(30,159,255,.35);
}
.announcement .xdir-ann-body { flex: 1; min-width: 0; text-align: center; }
.announcement .xdir-ann-body .scrollNews { height: 20px; overflow: hidden; border: none; }
.announcement .xdir-ann-body .scrollNews ul { padding: 0; }
.announcement .xdir-ann-body .scrollNews ul li { float: none; margin-left: 0; }
.announcement .xdir-ann-body .scrollNews p { text-indent: 0; font-size: 13.5px; line-height: 20px; color: #5b6b7b; }
/* 后台「公告设置」驱动的公告列表（一行一条，多条自动轮播）Xdir 20261028 */
.announcement .xdir-ann-scroll { height: 20px; overflow: hidden; }
.announcement .xdir-ann-scroll ul { list-style: none; margin: 0; padding: 0; }
.announcement .xdir-ann-scroll li { height: 20px; line-height: 20px; font-size: 13.5px; color: #5b6b7b; text-indent: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.announcement .xdir-ann-scroll li a { color: #1E9FFF; }
.announcement .xdir-ann-scroll li a:hover { color: #0d8de8; text-decoration: underline; }
.night .announcement .xdir-ann-scroll li { color: #9fb0c3; }
/* 新简介遍历目录列表底端显示模式 20220420 */
.layui-colla-title-jianjie {
    margin-top: -1rem;  /* 简介与遍历目录列表文件及文件夹间距 */
    height: auto;
    margin-bottom: 1rem;  /* 使用说明与底部th间隙 */
}
.title-shiyongshuoming {
    face: "微软雅黑";
    font-size: 16.111px;
    color: #AE0000;
    position: relative;
    height: 42px;
    line-height: 42px;
    padding: 0 15px 0 20px;
    border: 1px;
    border-radius: 10px;   /* 边框边缘带圆角 */
    background-color: #F5F5F5;
    cursor: pointer;
    overflow: hidden;
}
.bianliliebiao-mulu {
    border: 1px;
    /* 底色置空：原来这里是 #F5F5F5，会画出一个带 8px 圆角的浅灰块。
       但 .row 自身带 margin:-15px、又处在 header 的 --xd-head-l 内边距里，
       它的左边缘比卡片内边缘右移约 30px → 这块灰底就从 30px 处才开始，
       左侧空出一条与容器边缘脱开的缝，看着就是「列头没铺满容器」。
       底色统一改由 #directory-list-header 绘制（它横跨卡片整个内宽度），此处保持透明 Xdir 修复 20261029 */
    background-color: transparent;
    line-height: 41px;
    height: auto;
    border-radius: 8px;/* 边框边缘带圆角 */
}
/* 顶栏公告栏 / 面包屑 / 文件列表 宽度对齐（统一容器约束，去除嵌套 container 双重内边距导致的不齐） Xdir 增强 20261028 */
#navigation .layui-container { max-width: 1170px; margin: 0 auto; padding-left: 0; padding-right: 0; }
/* 收紧公告栏与面包屑之间的间距（消除多余空白带）Xdir 20261102 */
#navigation { margin-top: 0; position: relative; z-index: 100; }  /* 提升层级：面包屑复制按钮悬停气泡（绝对定位、向下展开）不被下方内容遮挡 Xdir 20261105 */
.xdir-list-card { width: 100%; box-sizing: border-box; }
/* 搜索无结果：图标 + 文字说明 UI（与搜索结果区同一视觉基调） Xdir 增强 20261028 */
.xdir-search-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 28px 16px !important;
    margin: 0 !important;
    border: none !important;
    background: none !important;
    list-style: none;
    color: #8896a8;
    text-align: center;
}
.xdir-search-empty .xse-icon {
    width: 52px;
    height: 52px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #f1f5fb;
    color: #1E9FFF;
    font-size: 24px;
}
.xdir-search-empty .xse-text { font-size: 14px; color: #4a5666; }
.xdir-search-empty .xse-text b { color: #1E9FFF; }
.xdir-search-empty .xse-sub { font-size: 12px; color: #aab4c0; }
/* Div功能区域 - 20220624（右对齐到列表右边缘，HASH 按钮已移至卡片外） */
.layui-hide-xs-info {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    position: absolute;
    padding: 0px 4px;
    min-height: 20px; /*文件列表与底部间隔高度*/
    line-height: 20px;
    font-size: 14px;
    right: 10px;
    margin-left: 0;
    top: 50%;
    transform: translateY(-50%);
}
.layui-hide-xs-info td { display: inline-flex; align-items: center; gap: 3px; }
/* 功能区域按钮 - 20220624（紧凑尺寸，避免与修改时间列重叠） */
.layui-btn-info {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 22px;
    line-height: 22px;
    padding: 0 5px;
    background-color: #009688;
    color: #fff;
    white-space: nowrap;
    text-align: center;
    font-size: 13px;
    border: none;
    border-radius: 3px;
    cursor: pointer;
}
.layui-btn-info i { font-size: 13px; }
/* 修改时间列：右对齐且不换行，避免与功能按钮重叠 */
#directory-listing .file-modified {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* 缩小站名名称字体、系统公告隐藏、新简介说明隐藏 - 20191213 */
@media screen and (min-width: 320px) and (max-width: 828px) {
.xElli {
    display: none;
}
/* 移动端底部部分内容隐藏 - 20191213 */
.dibu {
    display: none;
}
/* 当前位置遍历导航隐藏 - 20191213 */
.dangqian {
    position: absolute;
    top: -9999px;
    left: -9999px;
}
#page-navbar .navbar-text {
    margin-left: -4px;   /* 移动端logo偏移左边 20220417 */
    margin-right: 9px;
    max-width: 65px; /* 移动端附件更新于显示宽度 20220420 */
    margin-top: 9px;     /* 移动端站标容器放大后收窄上下外边距，避免把顶栏撑高 Xdir 20261028 */
    margin-bottom: 9px;
}
}

/* 移动端搜索结果页列表 - 20191218 */
@media screen and (max-width:768px) {
table.layui-table colgroup {
    display: none;
}
table.layui-table td {
    overflow: hidden;
}
}

/* 移动端文件列表无复制链接、二维码、下载按钮 - 20221118 */
@media screen and (min-width: 320px) and (max-width: 828px) {
.layui-btn-info {
    display: none;
}
.gongn-yd {
    display: none;
}
/* 简介区域：旧版在这里无条件 display:none（写死，用户无法选择）。
   v2.0.18 rev.u 起改为受后台「移动端显示」开关控制 ——
   只有容器带 .xdir-rm-mobile-off 时才隐藏，开关打开则正常展示。
   ★ 注意这里不能再出现无条件命中 .jianjie-container 的 display:none，
     否则开关就形同虚设（这条规则的选择器优先级比开关那条低，但会误伤） */
.jianjie-container.xdir-rm-mobile-off {
    display: none;
}

/* 简介正文在窄屏的排版收口（v2.0.18 rev.u）
   桌面端那几个 padding-bottom（h1 22px / h2 30px / h3 37px）是为了给锚点
   定位留对称间距，在手机上会变成一截莫名其妙的空白；首行缩进 30px 也会让
   正文每行只剩十来个字。窄屏统一收紧，并对表格 / 代码块开内部横滑。 */
.jianjie-container .readme {
    padding: 14px 12px;
    font-size: 14px;
    line-height: 1.85;
}
.jianjie-container .readme h1 { font-size: 19px; padding-bottom: 8px; }
.jianjie-container .readme h2 { font-size: 17px; padding-bottom: 8px; text-indent: 0; }
.jianjie-container .readme h3 { font-size: 15.5px; margin-top: 14px; padding-bottom: 8px; }
.jianjie-container .readme h4 { font-size: 14.5px; padding-bottom: 6px; }
.jianjie-container .readme p { text-indent: 0; margin: 6px 0; }
.jianjie-container .readme ul,
.jianjie-container .readme ol { font-size: 14px; padding-left: 18px; }
.jianjie-container .readme blockquote {
    font-size: 13.5px;
    text-indent: 0;
    padding: 8px 10px;
    margin: 8px 0;
}
/* 表格与代码块：窄屏必须能横滑，否则超宽内容会把整张卡片撑出横向滚动条 */
.jianjie-container .readme pre {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    font-size: 12.5px;
}
.jianjie-container .readme table {
    display: block;
    width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}
.jianjie-container .readme img { max-width: 100%; height: auto; }
/* 手风琴标题：手机上把标题与箭头对齐，箭头交给 Flex 撑开，不靠绝对定位 */
.jianjie-container .accordion .link { display: flex; align-items: center; gap: 6px; }
.jianjie-container .accordion .link .fa-chevron-down { margin-left: auto; }
}
/* ===== 移动端列表视图（Xdir 20261029 重写）
   结构：一行三格 —— 文件名 | 大小 | 功能键
     · 文件名弹性收缩（超长省略号），大小固定靠右，功能键固定在最右
     · 功能键平时只占一个图标位，触控后向左弹出浮层，浮层里是完整操作按钮组
       （复制链接 / 二维码 / 下载 / 分享 / 播放 / 预览…，数量随文件类型变化）
   为什么改成单行：原先是「文件名+大小」一行、「操作按钮」独占第二行，
   每行高达 80px（实测 li 高 80），手机上一屏只能看 6~8 个文件；
   且第二行 5 个按钮把「大小」右边缘（270）与按钮右边缘（285）顶得错开。
   列头同步改成三列，与行内三段逐像素对齐（详见下方列头规则）。 */
@media screen and (max-width: 828px) {
  /* 行内缩进变量：列头据此同步，「大小」「功能」两列靠它计算右边缘
     --xd-acts-w 是功能列宽度，行内的触发按钮与列头「功能」同宽，两者右边缘自然对齐 */
  .xdir-list-card { --xd-row-l: 28px; --xd-row-r: 8px; --xd-head-l: 32px; --xd-acts-w: 30px; }

  #directory-listing.view-list li {
    display: flex !important;
    flex-wrap: nowrap !important;        /* 关键：绝不换行，三格永远在同一行 */
    align-items: center;
    justify-content: flex-start;
    min-width: 0;                        /* 默认 min-width:auto 会被超长文件名的 min-content 顶开 */
    min-height: 44px;                    /* 触控热区不小于 44px */
    padding-left: var(--xd-row-l, 28px);
    padding-right: var(--xd-row-r, 8px);
    line-height: 1;                      /* 单行布局，行高交给 flex 居中，避免 42px 行高把行撑高 */
    overflow: visible;                   /* 展开的功能浮层是行内绝对定位，不需要裁剪；
                                            真正的溢出兜底由 a.preview 的 overflow:hidden 负责 */
  }
  #directory-listing.view-list li .xdir-check { left: 8px; }

  /* ---------- 第一格：文件名 + 大小 ---------- */
  #directory-listing.view-list li > a.preview {
    order: 1;
    flex: 1 1 auto;
    min-width: 0;                        /* 允许收缩，长文件名才会走省略号而不是撑破行 */
    overflow: hidden;
    padding: 0 !important;               /* 清掉 bootstrap .nav>li>a{padding:15px}，单行用不上 */
    display: block;
  }
  #directory-listing.view-list li > a.preview .row {
    display: flex; align-items: center;
    flex-wrap: nowrap; gap: 8px;
    width: 100%; min-width: 0;
    margin: 0;
  }
  /* bootstrap 的 .row 自带 clearfix 伪元素（content:" ";display:table）。
     在 flex 容器里它会被当成一个真实 flex item，各自吃掉一个 gap ——
     实测导致文件名左移 8px、文件大小右边缘内缩 8px，列头「大小」与行内大小差 8px 对不齐。
     这里直接去掉，flex 布局不需要 clearfix Xdir 20261029 */
  #directory-listing.view-list li > a.preview .row::before,
  #directory-listing.view-list li > a.preview .row::after {
    content: none !important;
    display: none !important;
  }
  #directory-listing.view-list .row .file-name {
    flex: 1 1 auto; min-width: 0;
    padding: 0 0 0 4px;                  /* 左 4px：与 8px 处的勾选框形成 10px 间隔 */
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    font-size: 13.5px; line-height: 1.45;
  }
  #directory-listing.view-list .row .file-size {
    /* 宽度按内容自适应：bootstrap 的 .col-xs-3 会给 width:25%（小屏 65px 左右），
       遇到「1.23 GB」这类偏长的数值仍可能溢出/被挤压；改成 auto + 不收缩最稳 */
    flex: 0 0 auto !important;
    width: auto !important;
    margin: 0; padding: 0;
    font-size: 11.5px; line-height: 1.45;
    white-space: nowrap; text-align: right;   /* 大小永不被压缩，内容不会溢出 */
  }
  /* 手机上没有时间列的位置：时间信息让位给文件名与操作入口 */
  #directory-listing.view-list .row .file-modified { display: none !important; }
  /* Hash 按钮移入浮层统一管理，不在行内占位 */
  #directory-listing.view-list li .file-info-button { display: none !important; }

  /* ---------- 第三格：功能列（触控触发器） ---------- */
  #directory-listing.view-list .xdir-acts-btn {
    order: 3;
    flex: 0 0 auto;
    display: inline-flex !important;
    align-items: center; justify-content: center;
    width: var(--xd-acts-w, 30px); height: var(--xd-acts-w, 30px);
    margin: 0; padding: 0;
    border: 1px solid transparent;
    border-radius: 8px;
    background: transparent;
    color: #8b98a8;
    font-size: 15px; line-height: 1;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: background .16s ease, color .16s ease;
  }
  #directory-listing.view-list .xdir-acts-btn:active,
  #directory-listing.view-list li.xdir-acts-open .xdir-acts-btn {
    background: rgba(30,159,255,.13);
    color: #1E9FFF;
  }
  /* 浮层：收起时 display:none；li 带 .xdir-acts-open 时贴着触发器向左侧展开。
     绝对定位 + 右对齐 → 天然「从右往左」长出，不挤占文件名的可伸缩空间 */
  #directory-listing.view-list .layui-hide-xs-info {
    order: 4;
    position: absolute !important;
    right: var(--xd-row-r, 8px) !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
    z-index: 30;
    display: none !important;
    align-items: center; justify-content: flex-end;
    flex-wrap: nowrap; gap: 4px;
    margin: 0 !important;
    padding: 4px;
    min-height: 0; line-height: 1;
    background: #fff;
    border: 1px solid #dbe6f2;
    border-radius: 10px;
    box-shadow: 0 8px 22px rgba(20,40,80,.16);
    transform-origin: 100% 50%;
  }
  #directory-listing.view-list li.xdir-acts-open .layui-hide-xs-info {
    display: flex !important;
    animation: xdirActsIn .16s ease-out;
  }
  @keyframes xdirActsIn{
    from{ opacity: 0; transform: translateY(-50%) scaleX(.82); }
    to  { opacity: 1; transform: translateY(-50%) scaleX(1); }
  }
  @media (prefers-reduced-motion: reduce){
    #directory-listing.view-list li.xdir-acts-open .layui-hide-xs-info{ animation: none; }
  }
  #directory-listing.view-list .layui-hide-xs-info td { display: contents; }
  #directory-listing.view-list .layui-hide-xs-info a {
    position: static !important;
    display: inline-flex !important;
    align-items: center; justify-content: center;
    width: 30px; height: 30px;
    margin: 0 !important; padding: 0 !important;
    border-radius: 8px;
    font-size: 13px;
    line-height: 1;
  }
  /* 浮层里的按钮在手机上稍大一点，便于点按（原来 26px 偏小） */
  #directory-listing.view-list .layui-btn-info {
    display: inline-flex !important;
    width: 30px; height: 30px !important; line-height: 30px !important;
    padding: 0 !important; font-size: 13px !important; border-radius: 8px !important;
  }
  /* 浮层最左侧的「收缩复位」按钮 Xdir 20261029
     图标用 fa-chevron-right（单尖角向右），并配一条竖向分隔线把它和右侧的功能键分开：
     它的语义是「关闭」，和「下载 / 分享」这类功能键不是一类东西。
     方向逻辑：整块浮层是从行尾往左「抽出来」的，收起就是把它推回右边，
     所以这里朝右，与行尾展开键的 fa-chevron-left 正好互为反方向。 */
  #directory-listing.view-list .xdir-acts-close {
    order: -1;                       /* 永远排最左，JS 插到最前也兜住一层 */
    flex: 0 0 auto;
    display: inline-flex !important;
    align-items: center; justify-content: center;
    width: 28px; height: 30px;
    margin: 0 2px 0 0; padding: 0;
    border: 0;
    border-right: 1px solid #e3ebf4;      /* 与功能键的分隔线 */
    border-radius: 8px 0 0 8px;
    background: transparent;
    color: #1E9FFF;
    font-size: 13px;
    line-height: 1;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  #directory-listing.view-list .xdir-acts-close:active { background: rgba(30,159,255,.14); }
  .night #directory-listing.view-list .xdir-acts-close { border-right-color: #2c3e50; color: #6db3ff; }

  /* ---------- 列头排序：点完立刻反馈，随即自动淡出 Xdir 20261029 ----------
     问题：触屏没有真正的 hover，「点一下」在手机上会被浏览器记住为 hover 态，
     于是「文件 / 大小」列头点过之后会一直挂着浅蓝底 + 蓝字，看着像选中了却没处取消。
     做法：
       ① @media (hover:none) 直接把 hover 底色掐掉，触屏不再残留；
       ② 点击瞬间由 JS 加 .xdir-sort-flash（真实反馈），700ms 后自动移除，
          用 transition 让底色和字色一起淡回常态 —— 这就是「自动隐藏」。 */
  @media (hover: none) {
    #directory-list-header .sortable:hover,
    #directory-list-header .sortable:focus {
      background: transparent !important;
      color: inherit !important;
    }
    .night #directory-list-header .sortable:hover { background: transparent !important; color: inherit !important; }
  }
  #directory-list-header .sortable.xdir-sort-flash {
    background: #dcebfc !important;
    color: #1E9FFF !important;
  }
  .night #directory-list-header .sortable.xdir-sort-flash {
    background: rgba(109,179,255,.16) !important;
    color: #6db3ff !important;
  }

  /* ---------- 列头：同样三列，与行内三段逐像素对齐 ----------
     原来列头沿用 bootstrap 的 col-xs-6/col-xs-6 两列（文件 / 大小各 50%），
     而行内是「文件名+大小」两端对齐 + 按钮独占第二行 → 列头「大小」的右边缘
     （299）与行内大小的右边缘（270）差 29px；
     768px 这一档因为 hidden-xs 在 ≥768 失效，列头还会冒出「修改时间」第三列（229px），
     而行内时间是隐藏的，错位更明显。这里一次性改成 flex 三列。 */
  #directory-list-header .bianliliebiao-mulu {
    display: flex; align-items: center; flex-wrap: nowrap;
    margin: 0; padding: 0;
    min-height: 34px; line-height: 1;
  }
  #directory-list-header .bianliliebiao-mulu > div {
    float: none !important;
    width: auto !important; max-width: none;
    padding: 0 !important;
    position: static;
    flex: 0 0 auto;
    white-space: nowrap;
    font-size: 11.5px;
  }
  /* 第 1 个 div（文件）：吃掉剩余空间，与行内文件名同伸缩（首子元素为绝对定位的 .xdir-check-all <label>，脱离 flex 流，故按 div 计） */
  #directory-list-header .bianliliebiao-mulu > div:nth-of-type(1) {
    flex: 1 1 auto; min-width: 0;
    overflow: hidden; text-overflow: ellipsis;
  }
  /* 第 3 个 div（修改时间）：行内已隐藏时间，列头同步隐藏，避免多出列把宽度挤乱；
     注意首子元素是绝对定位的 .xdir-check-all <label>（脱离 flex 流），故用 nth-of-type 而非 nth-child，
     否则会误伤「大小」列头（原 nth-child(3) 把大小列头错隐藏了，本批 #6）。 */
  #directory-list-header .bianliliebiao-mulu > div:nth-of-type(3) { display: none !important; }
  /* 第 4 列「功能」：原来在 320~828 被 .gongn-yd{display:none} 整块隐藏，
     现恢复显示并与行内触发按钮同宽，右边缘与触发器对齐 */
  #directory-list-header .bianliliebiao-mulu > div.gongn-yd {
    display: block !important;
    flex: 0 0 var(--xd-acts-w, 30px);
    width: var(--xd-acts-w, 30px) !important;
    text-align: center !important;
  }
  #directory-list-header .gongn-yd i { display: none; }   /* 30px 放不下「图标+文字」，只留文字 */
  /* 需求 mobile#1：列头 .row 同列表 .row 一样带 Bootstrap 的 clearfix 幽灵伪元素
     （::before/::after { content:" "; display:table }）。列表 .row 已在上方清掉，但列头这里漏了；
     转成 flex 子项后这两个空格伪元素各吃掉 ~4px，使列头整体右移、与列表列错位（列头错位）。
     一并清掉，让列头与列表严格逐像素对齐。 */
  #directory-list-header .bianliliebiao-mulu::before,
  #directory-list-header .bianliliebiao-mulu::after {
    content: none !important;
    display: none !important;
  }
  /* 列头左右内边距与行内一致：--xd-head-l 对齐文件名起点，右侧留 --xd-row-r */
  #directory-list-header {
    padding-left: var(--xd-head-l, 32px);
    padding-right: var(--xd-row-r, 8px);
  }
  /* 需求 2：移动端 .row 负 margin 已清零（上方 margin:0），框左位移用 +10 即可精确落到 10px，
     与下方列表行勾选框上下对称；桌面端因 .row 仍带 -15px 负 margin，由基础规则 +25 补偿。 */
  #directory-list-header .xdir-check-all { left: calc(-1 * var(--xd-head-l, 32px) + 10px); }
  /* 第十六批 #4：移动端列头不吸顶（避免覆盖行内容），并抬升 z-index、锁定为顶部独立块，
     杜绝「列头下移 / 插入列表中间遮挡内容」的观感；
     padding/width/box-sizing 与下方规则一致，仅补充 position 兜底与 z-index 抬升。 */
  #directory-list-header {
    position: relative;
    top: auto;              /* 覆盖桌面 sticky 的 top:65px，避免移动端列头被下推 65px 叠到文件行 Xdir 本批 #6 */
    z-index: 20;
    width: 100%;
    box-sizing: border-box;
    margin: 0;
    clear: both;
  }
}
/* 桌面端隐藏移动端触发器（JS 会注入到每一行，靠这里在宽屏收起，窗口拉伸时无需重新注入） */
#directory-listing.view-list .xdir-acts-btn { display: none; }
/* 「收缩复位」键同理：桌面端操作按钮本来就常显在那条浮层里，再挂一个「收起」毫无意义，
   而且会被 flex 压成 12px 一条贴在按钮组左侧。桌面一律不显示，只在 ≤828 的浮层里出现。 */
#directory-listing .xdir-acts-close { display: none; }

/* 平铺视图（含移动端）一律不显示「展开 / 收缩」这对按键 Xdir 20261029
   平铺卡片里的功能按钮本来就是常显的（五段结构里那排图标），既不需要「⋯ 展开」，
   也不需要「← 收起」。但 JS 是按「行」注入的，切到平铺后这两个节点仍留在 DOM 里：
   实测平铺卡片中 `.xdir-acts-btn` 以无样式的裸 button 形态出现（display:block，16x25），
   夹在「Hash 按钮」与按钮行之间，卡片里凭空多出一个方块 —— 就是用户看到的那个多余按键。
   两条旧规则都只限定 `.view-list`，所以平铺下没有任何规则接管它。这里直接按视图兜住。 */
#directory-listing.view-grid .xdir-acts-btn,
#directory-listing.view-grid .xdir-acts-close {
    display: none !important;
}
.footer-text a {
    color: #fff /*底部链接文字字体颜色*/;
    text-decoration: none !important;   /* 修复尾部版权超链下划线 Xdir 20261027 */
}
.footer-text a:hover {
    color: #d24542;  /*底部链接鼠标移动字体颜色*/
    text-decoration: none !important;
}
/* 尾部信息结尾的统计图标：格式「| 图标」，统计代码含图标才输出，不含则静默隐藏 Xdir 20261028 */
.footer-text .xdir-stat-tail { display: inline-flex; align-items: center; gap: 5px; margin-left: 6px; vertical-align: middle; }
.footer-text .xdir-stat-sep { opacity: .55; margin-right: 1px; }
.footer-text .xdir-stat-ico { display: inline-flex; align-items: center; line-height: 1; }
.footer-text .xdir-stat-ico img { max-height: 16px; width: auto; vertical-align: middle; display: block; }
.footer-text .xdir-stat-ico i { font-size: 13px; vertical-align: middle; }
/* 顶栏按键 / 功能区按键超链：任何状态均无下划线 Xdir 20261027
   ★ v2.0.18 扩展：把「文件列表里的文件超链」也纳入（原仅覆盖功能区与 Hash 按钮）。
     bootstrap.min.css 里有 `a,a:visited{text-decoration:underline}` 与
     `a:focus,a:hover{text-decoration:underline}`，而文件名主链接 <a class="preview">
     此前没有任何 text-decoration 规则接管 —— 悬停时下划线会从图标一直贯穿到文件名，
     与「文件索引」页的重复下划线是同一类问题。这里统一压掉，
     悬停反馈改由变色 + 行高亮承担（见 #directory-listing li:hover 规则）。 */
#page-navbar a, #page-navbar a:hover, #page-navbar a:focus,
.topbar-right a, .topbar-right a:hover, .topbar-right a:focus,
.xdir-ctrl-btn, .xdir-ctrl-btn:hover, .xdir-ctrl-btn:focus,
#directory-listing .layui-hide-xs-info a, #directory-listing .layui-hide-xs-info a:hover, #directory-listing .layui-hide-xs-info a:focus,
#directory-listing .file-info-button, #directory-listing .file-info-button:hover, #directory-listing .file-info-button:focus,
#directory-listing a, #directory-listing a:visited,
#directory-listing a:hover, #directory-listing a:focus, #directory-listing a:active,
#directory-listing .file-name, #directory-listing .file-name:hover {
    text-decoration: none !important;
}
/* 遍历列表超链：点击 / 聚焦时不显示默认焦点外边框（含目录切换、返回上一级等）
   ★ 仅对鼠标点击（:focus 但不触发 :focus-visible）隐藏，键盘 Tab 仍保留蓝色可见焦点 Xdir v2.0.19 */
#directory-listing a:focus, #directory-listing a:active { outline: none !important; }
/* 平铺 / 列表视图：清除 Bootstrap .nav-pills 锚点悬停的浅灰底
   （鼠标滑入卡片时，<a class="preview"> 会继承 .nav-pills>li>a:hover 的浅灰底，
   在暗黑下表现为一块「内框 / 内底色」，与卡片外框形成双框；这里统一清掉 Xdir v2.0.19） */
#directory-listing a.preview:hover,
#directory-listing a.preview:focus,
#directory-listing a.preview:active { background: transparent !important; }
/* 索引页（电脑端）文件超链悬停描述：与「搜索页」状态完全一致 Xdir v2.0.19
   搜索页定稿规则见 sousuo-yemian.css「td.xs-file a.preview」段：
   蓝字 #1E9FFF + 文字宽度下划线 + .15s ease 过渡，夜间态 #6db3ff。
   索引页 a.preview 是整行块级锚点、.file-name 是 col 块级容器，
   直接给它们加 border-bottom 会横贯整行 / 整格，故下划线只挂在内层文字容器 .fn-txt 上。
   注：上方 :1256-1265 的总清段用 text-decoration:none!important 压掉了默认下划线，
   这里改用 border-bottom，互不冲突。

   Xdir 20261119r 第十三批 #5：电脑端主页遍历列表行文件名取消下划线，只保留变色反馈。
   做法是保留 1px 透明 border 占位、只摘掉悬停时的 border-bottom-color 变色，
   这样行高与文字基线跟改前完全一致（直接删 border 会让整行文字上移 1px，属于无谓的版面挪动）。
   夜间态同步只保留变色。 */
#directory-listing .file-name .fn-txt {
    border-bottom: 1px solid transparent;   /* 占位用，恒透明，不参与悬停变色 */
    transition: color .15s ease;
}
#directory-listing a.preview:hover .fn-txt,
#directory-listing a.preview:focus .fn-txt {
    color: #1E9FFF;
}
.night #directory-listing a.preview:hover .fn-txt,
.night #directory-listing a.preview:focus .fn-txt {
    color: #6db3ff;
}
/* 全站超链点击焦点边框统一清理（目录 / 面包屑 / 站标 / MD 锚点 / 其它超链）Xdir v2.0.19
   鼠标点击只触发 :focus（不触发 :focus-visible），故隐藏 outline 不影响键盘可访问性 */
#page-navbar a:focus, #page-navbar a:active,
.path-announcement a:focus, .path-announcement a:active,
.jianjie-container a:focus, .jianjie-container a:active,
a:focus, a:active { outline: none !important; }
a:focus-visible { outline: 2px solid rgba(30,159,255,.55) !important; outline-offset: 2px; }
:target { outline: none !important; }   /* MD 锚点点击后目标元素不再出现黑边框 Xdir v2.0.19 */
/* 面包屑点击时的下边框也一并清除，避免「点击边框」残留 Xdir v2.0.19 */
.path-announcement a:focus { border-bottom-color: transparent !important; }
.dibu-jy {
    color: #fff; /*底部文字颜色*/
}
/* 站标版本字体上浮 - 20220320 */
.shiyu {
    font-size: 14px;   /* 归一基础字号，避免旧 20px 撑高线框导致品牌区错位 */
    line-height: 1;
}
.super-sy span-sy {
    vertical-align: super;
    background-color: White;
    font-size: 12px;
    border-radius: 4px;
    color: Red;
}
/* -------------------------------------------------------------------------- */
/* -----| Cool dark mode / Night mode |-------------------------------------- */
/* -------------------------------------------------------------------------- */

/* 炫酷暗黑模式/夜间模式 2022-11-14 */
.night #footer, .night #kratos-header-section, .night .sf-menu li a:hover, .night #kratos-header-section .sub-menu a:hover {
    background: #111;
}
.night, .night .sf-menu .current-menu-item, .night #kratos-header-section .sub-menu, .night .sf-menu .current-menu-parent {
    background-color: #1e1e1e !important;
    color: #000000 !important /*遍历目录黑暗模式下列表标题颜色*/
}
.night .pagination>a:hover, .night .kratos-entry-footer a:hover, .night .tag_clouds a:hover, .night .kratos-entry-footer a:hover, .night .sf-menu li a:hover {
    background: #1e1e1e;
    color: #d1d1d1;
}
.night #kratos-widget-area .widget, .night .comment-respond, .night .comments-area .comment-list li, .night .hentry-content, .night .kratos-hentry, .night .kratos-post-meta-new, .night .kratos-post-text, .night .pagination {
    background-color: #323232;
    color: #d1d1d1
}
.night .kratos-post-content input, .night .kratos-post-content textarea {
    border: 1px solid #4a4a4a;
    background: #323232;
    color: #d1d1d1
}
.night #comments form input, .night #comments form textarea, .night #tabul .active, .night .card-header, .night .input-group-addon, .night .kratos-post-content h2, .night .kratos-post-content h4, .night .kratos-post-content ol, .night .pagination>a, .night .pagination>span, .night .post-content h2, .night .post-content h4, .night .kratos-entry-footer a, .night .sf-menu li.current-menu-item, .night .tag_clouds a, .night .kratos-entry-footer a, .night .today-m, .night #TA-con {
    background: #4a4a4a;
    color: #d1d1d1;
}
.night .aplayer, .night .audio_wrp, .night .archives h3, .night .card-body, .night .today-d, .night .li-icon, .night .archives ol li:before {
    background-color: #4a4a4a;
    color: #d1d1d1
}
.night #kratos-blog .kratos-post .kratos-post-text p, .night #footer span, .night #footer span a, .night #respond #reply-title, .night .comments-area .fn a, .night .hentry-content a, .night .kratos-post-meta-new .read-more, .night .post-content, .night .sf-menu a, .night #kratos-header-section .sub-menu a, .night .widget a, .night .widget-title, .night label, .night ol, .night p, .night ul, .night .text-primary, .night article a {
    color: #f30c5a  /*暗黑模式下当前位置字体颜色*/
}
.night ol, .night p{
	color: #db4949  /*暗黑模式下ol，p字体颜色*/
}
.readme ul li::before {
    color: #d11717;  /*暗黑模式下ul，li字体颜色*/
    margin-top: 11px;  /*暗黑模式下超链左箭头上下位移*/
}
.night .scrollNews a {
    color: #1985d3  /*暗黑模式下公告栏超链接字体颜色*/
}
.night .col-md-3 .col-xs-3 {
    color: #FFF /*暗黑模式下文件大小、修改时间文字颜色*/
}
.night .kratos-entry-title, .night .kratos-post-inner-new a {
    color: #00a2ff
}
.night .simple-item, .night .widget_kratos_comments .comment-listitem {
    border: 0
}
.night .comment p a, .night .kratos-post-meta span, .night .kratos-post-meta a {
    color: #464646
}
.night .gmeiCv, .night .libgWo, .night .libgWo * {
    color: #d1d1d1 !important
}
.night .aplayer .aplayer-lrc:after, .night .aplayer .aplayer-lrc:before {
    border: 0;
    background: 0
}
.night #comments form input, .night #comments form textarea, .night .input-group-addon {
    border: 1px solid #4a4a4a
}
.night .comments-area .comment-list .children li {
    -webkit-box-shadow: 5px 5px 10px #1e1e1e;
    box-shadow: 5px 5px 10px #1e1e1e;
}
.night .deng-box, .night .deng-box1, .night .deng-t {
    background: 0 !important;
}
/* 暗黑下的图片压暗：由 50% 提到 75% Xdir 20261030
   50% 太狠 —— 图片实际亮度只剩原图的 22%，深色背景上内容几乎是糊的；
   但也刻意不放到 100%，否则暗色阅读环境里一块亮图会非常刺眼。
   75% 取「明显看得清、又仍然偏暗」的中间点（原图 53% 亮度，比 50% 提亮 2.4 倍）。
   实测（同一张图 320x200，取 sRGB 相对亮度，滤镜在 sRGB 空间按 pow(b,2.2) 衰减）：
     亮度档   渲染亮度   相对原图   相对旧值(50%)
     50%      0.063      0.22x      1.00x
     70%      0.125      0.43x      1.99x
     75%      0.153      0.53x      2.44x   ← 采用
     78%      0.167      0.58x      2.66x
     88%      0.222      0.77x      3.53x
     100%     0.288      1.00x      4.59x
   svg 一并跟随：行内 svg 图标原先也被压到 50%，在深底上偏灰、辨识度差。
   品牌 logo 不受影响 —— 它有 `.logo{filter:brightness(100%)!important}` 单独兜底。 */
.night .home, .night .photo-background, .night .shici, .night img, .night svg, .night .aplayer-pic {
    filter: brightness(75%)
}
.anhei-PC {
    float: right;
    font-size: 20px;
    z-index: 100;
    top: 22px;
    left: 1px;
    position: relative;
    width: 22px;
    margin-right: 16px;
    text-align: center;
    cursor: pointer;
    opacity: .9;
    transition: opacity .4s ease-in-out;
    display: inline-block;
}
.anhei {
    color: #ffb100;
}
.night .file-name i {
    color: #FF7F50; /*暗黑模式下图标颜色*/
}
.night .a {
    color: #fff; /*暗黑模式下超链接颜色*/
}
.night .h1, .h2, .h3, h1, h2, h3 {
    color: #0a81f5; /*暗黑模式下H1，H2,H3标题颜色*/
}
.night .announcement {
    color: #1E90FF; /*暗黑模式下H1，H2,H3标题颜色*/
}
.night #directory-listing li:hover{
	background: rgb(90 107 131 / 78%);  /*暗黑模式下遍历列表边框背景颜色*/
	box-shadow: inset 3px 0 0 0 #3b9dff;  /*暗黑模式同样保留左侧蓝色边缘高亮*/
}
.night .readme {
    background-color: #040404;  /*暗黑模式下简介背景颜色*/
    padding: 20px;
}
.night .title-shiyongshuoming {
    background-color: #ffeb3b; /*暗黑模式简介框背景颜色*/
}
.night .announcement {
    background: #16222e;
    border-color: #2c3e50;
    color: #9fb0c3;
}
.night .announcement:hover { border-color: #1E9FFF; }
.night .announcement .xdir-ann-body .scrollNews p { color: #9fb0c3; }
.night .time-axis-item {
    color: #f6f6f6; /*暗黑模顶部公告背景颜色*/
}
.night a {
	color:#FFF; /* 暗黑模式下遍历列表字体颜色 */
}
.night .btn-success {
	color: #fff;
	border-color:#4cae4c;  /* 暗黑模式下功能区按钮颜色 */
}

/* 移动端暗黑UI调整，用min-width时，小的放上面大的在下面，同理如果是用max-width那么就是大的在上面，小的在下面 */

@media screen and (max-width: 1600px) and (min-width: 1400px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 50px;
    position: relative;
}
}

@media screen and (max-width: 1400px) and (min-width: 1200px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 50px;
    position: relative;
}
}

@media screen and (max-width: 1200px) and (min-width: 1000px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 50px;
    position: relative;
}
}

@media screen and (max-width: 1000px) and (min-width: 800px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 50px;
    position: relative;
}
}

@media screen and (max-width: 800px) and (min-width: 600px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 50px;
    position: relative;
}
}

@media screen and (max-width: 600px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 20px;
    position: relative;
}
.anhei-PC {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: -35px;
    left: 7px;
    position: relative;
    margin-bottom: -12px;
}
}

@media screen and (max-width: 375px) {
.anhei-media {
    float: left;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 10px;
    position: relative;
    margin: 0 auto;
}
}

@media screen and (min-width:100px) { /*适用于微信自身浏览*/
.anhei-media {
    float: right;
    font-size: 24px;
    z-index: 100;
    top: 18px;
    left: 0px;
    position: relative;
    display: inline-block;
}
}

/* ===================== Xdir 增强：文件列表重构 2026-10-27 ===================== */

/* 顶栏右侧控制区（统一弹性容器：搜索 | 视图 | 主题） Xdir 增强 20261027 */
.topbar-right {
    float: right;
    display: flex;
    align-items: center;
    gap: 12px;
    margin-top: 15.5px;   /* (顶栏 65 − 控件 34) / 2：与放大后的站标同处一条垂直中线上 Xdir 20261028 */
}
.yidong-sousuo {
    width: 230px;
    margin: 0;
    position: relative;
}
.search-wrap {
    position: relative;
    display: flex;
    align-items: center;
}
.search-wrap .search-icon {
    position: absolute;
    left: 11px;
    color: #9aa6b2;
    font-size: 13px;
    pointer-events: none;
}
.search-wrap #globalSearch {
    width: 100%;
    height: 34px;
    line-height: 34px;
    padding: 0 28px 0 30px;
    border: 1px solid #e2e8f0;
    border-radius: 18px;
    background: #f7f9fb;
    font-size: 13px;
    transition: all .2s ease;
}
.search-wrap #globalSearch:focus {
    outline: none;
    border-color: #1E9FFF;
    background: #fff;
    box-shadow: 0 0 0 3px rgba(30,159,255,.12);
}
.search-clear {
    position: absolute;
    right: 10px;
    color: #b6c0cb;
    cursor: pointer;
    display: none;
    font-size: 14px;
}
.search-clear:hover { color: #8896a8; }

/* 搜索下拉结果面板 */
.search-results {
    position: absolute;
    top: 42px;
    left: 0;
    right: 0;
    max-height: 60vh;
    overflow-y: auto;
    background: #fff;
    border: 1px solid #e2e8f0;
    border-radius: 10px;
    box-shadow: 0 12px 36px rgba(20,40,80,.14);
    z-index: 200;
    display: none;
    padding: 6px;
}
.search-results.open { display: block; animation: xdir-fade-in .15s ease; }
.search-results .sr-head {
    font-size: 12px;
    color: #8896a8;
    padding: 6px 10px;
}
.search-results .sr-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    border-radius: 8px;
    color: #303133;
    text-decoration: none;
    font-size: 13px;
}
.search-results .sr-item:hover { background: #f1f8ff; }
.search-results .sr-item i { color: #1E9FFF; width: 16px; text-align: center; }
.search-results .sr-name {
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.search-results .sr-path {
    color: #9aa6b2;
    font-size: 11px;
    max-width: 38%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.search-results .sr-size { color: #8896a8; font-size: 11px; }
.search-results .sr-more {
    display: block;
    text-align: center;
    padding: 8px;
    color: #1E9FFF;
    font-size: 12px;
    text-decoration: none;
    border-top: 1px solid #eef1f4;
    margin-top: 4px;
}
.search-results .sr-empty {
    padding: 16px;
    text-align: center;
    color: #b6c0cb;
    font-size: 13px;
}

/* 通用圆形控制按钮（视图切换 / 主题切换） */
.xdir-ctrl-btn {
    width: 34px;
    height: 34px;
    line-height: 32px;
    text-align: center;
    border: 1px solid #e2e8f0;
    background: #f7f9fb;
    color: #5b6b7b;
    border-radius: 18px;
    cursor: pointer;
    font-size: 15px;
    padding: 0;
    transition: all .2s ease;
}
.xdir-ctrl-btn:hover { background: #eef4fb; border-color: #c8e1ff; color: #1E9FFF; }
.xdir-ctrl-btn:active { transform: scale(.92); }

/* 可排列表头 */
#directory-list-header .sortable { cursor: pointer; user-select: none; border-radius: 6px; transition: background .18s ease, color .18s ease; }
/* 悬停底色：列头本身已有 #f5faff 底，原来用 #eef5ff 与之几乎同色、看不出反馈，
   这里加深一档保证点击意图明确 Xdir 修复 20261029 */
#directory-list-header .sortable:hover { background: #dcebfc; color: #1E9FFF; }
#directory-list-header .sort-ind { font-size: 11px; opacity: .45; margin-left: 3px; }
#directory-list-header .sortable.asc .sort-ind,
#directory-list-header .sortable.desc .sort-ind { opacity: 1; color: #1E9FFF; }
/* 暗黑模式：可排列表头悬停 */
.night #directory-list-header .sortable:hover { background: rgba(109,179,255,.16); color: #6db3ff; }

/* 批量操作栏 */
.xdir-bulkbar {
    padding: 8px 12px;
    background: #f1f8ff;
    border: 1px solid #c8e1ff;
    border-radius: 6px;
    margin-bottom: 8px;
    font-size: 13px;
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
}
/* 全选：框与文字做一个整体，左右间隙均匀，且框左边缘与下方列表项勾选框精确对齐 Xdir 20261029
   原问题：label 是 block 且文字紧贴 input（间隙 0px），框左边缘在 150；
   而列表项勾选框是 left:10px（=148）。这里用 flex + gap 给出规整间隙，
   再用 -2px 抵消 bulkbar 的 12px 左内边距与列表项 10px 的差值，实现上下同一条竖线。
   ★ 需求 9：去掉 .xdir-bulkbar 前缀，使同一套样式在「批量栏」与「列头文件名列」两种容器下都生效
     （#xdirCheckAll 已由 JS 搬到 #directory-list-header）。列头内定位由下方
     #directory-list-header .xdir-check-all 专门规则接管。 */
.xdir-check-all {
    display: inline-flex;
    align-items: center;
    gap: 7px;                 /* 框 → 文字间隙；7px 使文字左边缘正好落在列表项 .file-name 的起点(168) */
    height: 22px;
    margin: 0 0 0 -2px;       /* 让框左边缘对齐到列表项的 148px */
    padding: 0;
    color: #606266;           /* 显式设色，避免继承到 .night label 那条品红 #f30c5a 的历史规则 Xdir 20261029 */
    cursor: pointer;
    user-select: none;
    line-height: 1;
}
.night .xdir-check-all { color: #cdd9e5; }
.xdir-check-all input {
    margin: 0;                /* 清掉浏览器给 checkbox 的默认 margin，避免间隙忽大忽小 */
    flex: 0 0 auto;
    width: 13px;
    height: 13px;
    vertical-align: middle;
}
.xdir-check-all span,
.xdir-check-all {
    white-space: nowrap;
}
.xdir-bulkbar .xdir-bulk-tip { color: #8896a8; font-size: 12px; }
.xdir-bulkbar #xdirDownload { margin-left: auto; }

/* 列表项勾选框 */
#directory-listing li .xdir-check {
    position: absolute;
    left: 10px;
    top: 50%;
    transform: translateY(-50%);
    z-index: 5;
    cursor: pointer;
}
/* 行内左右内边距改由 .xdir-list-card 的变量统一驱动（列头据此推算缩进）Xdir 修复 20261029 */
#directory-listing li { padding-left: var(--xd-row-l, 30px); padding-right: var(--xd-row-r, 0px); }

/* 目录切换动画（淡出/淡入 + 轻微位移，替换原整页刷新） */
#directory-listing { transition: opacity .18s ease, transform .18s ease; }
#directory-listing.xdir-swapping { opacity: 0; transform: translateY(10px); }

/* ===================== 平铺（视窗）视图：卡片化重构 Xdir 20261027 ===================== */
/* 改用 CSS Grid 排版 Xdir 修复 20261028：
   原来用 flex + wrap + gap，而 <ul> 自带 clearfix 的 `::before{content:" ";display:table}`
   会变成一个「零宽度 flex 子项」，白白吃掉一个 gap(14px)，导致第一行整体右移 14px——
   于是「返回上一级 + 文件夹」那一行与下面文件行的左边缘差 14px，看起来就是没对齐。
   Grid 天生按列对齐、行内等高，且不受幽灵子项影响；同时显式清掉 ::before/::after，
   避免它们变成 0 宽的 grid 单元格占位。 */
#directory-listing.view-grid {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    grid-auto-rows: 1fr;          /* 行内等高；内容改为正常流后不会再被压缩，1fr 只负责让各行等高 Xdir 20261029 */
    gap: 14px;
    padding: 14px;
    border: none;
}
/* 清掉 clearfix 幽灵项（否则会占掉一行一格 / 一个 gap） */
#directory-listing.view-grid::before,
#directory-listing.view-grid::after {
    content: none !important;
    display: none !important;
}
/* 卡片：图标 / 文件名 / 大小 / 时间 / 按键 五段纵向居中排列，等间隔 Xdir 20261029
   改造前是「图标和名称左对齐 + 按键绝对定位贴底」的混排，左对齐与底贴底两套节奏，
   视觉上左边挤、下面空。现在统一成一条居中竖轴：
   · align-items:center + text-align:center —— 五段全部水平居中
   · gap:10px —— 「图标 / 文字块 / 按键组」三组之间的统一间隔
     （文字块内部 名称/大小/时间 之间是 4px 的紧凑组内间隔，见 .row 的 gap）
   · padding:14px —— 与 grid 容器的 14px 内边距完全一致，
     卡片内容到四条边的留白 = 容器到卡片的间隙，整体节奏统一 */
#directory-listing.view-grid > li {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;  /* 顶部对齐：文件夹卡片没有操作按键（条件里 is_file() 对目录为 false），
                                    内容比文件卡片少一段。若用 center，它的图标会比同排文件卡片低 19px，
                                    一行里图标就参差不齐。顶部对齐后五段在各卡片间严格同高 */
    gap: 10px;
    width: auto;                 /* 宽度交给 grid 列宽，覆盖旧的 calc(20% - 14px) */
    min-width: 0;
    height: 100%;                /* 行内等高 */
    /* 清除 bootstrap `.nav-stacked > li + li{margin-top:2px}`：
       该 ul 带 nav-stacked 类，除首项外每个卡片都被推下 2px，导致同一行卡片上下错开 Xdir 修复 20261028 */
    margin: 0 !important;
    padding: 14px;              /* 与容器内边距一致，四边留白统一 Xdir 20261029 */
    position: relative;          /* 勾选框绝对定位的定位上下文 */
    text-align: center;
    background: #fff;
    border: 1px solid #e1e4e8;
    border-radius: 12px;
    transition: box-shadow .2s ease, transform .2s ease, border-color .2s ease;
}
#directory-listing.view-grid li:hover {
    border-color: #b3d8ff;
    box-shadow: 0 8px 22px rgba(30,159,255,.14);
    transform: translateY(-3px);
}
#directory-listing.view-grid li .xdir-check { top: 10px; left: 10px; transform: none; }
/* 卡片主体：只承载 .row，纵向居中 Xdir 20261029 */
#directory-listing.view-grid a.preview {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 100%;
    /* 清掉 bootstrap 给 a 的 15px 左右 + 10px 上下内边距。
       左右不清 → 内容整体右移 15px，居中失效；
       上下不清 → a 自身多出 20px 高度，把「时间 → 按键」的间隔从 10px 撑到 26px，
                 五段之间就出现了不统一的大缝。 */
    padding: 0;
    text-decoration: none;
}
/* 名称 / 大小 / 时间：纵向 flex + 等间隔 4px（组内紧凑），三段水平居中 Xdir 20261029 */
#directory-listing.view-grid .row {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    width: 100%;
    margin: 0;
}
/* 清掉 bootstrap `.row::before/::after` 的 clearfix 幽灵项 Xdir 修复 20261029
   它们本是 `content:" "; display:table`，在 flex 容器里会变成两个 0 高的 flex 子项，
   各吃掉一个 4px gap → 名称上方多 4px、修改时间下方多 4px，
   连带把「时间 → 按键」的间隔从 10px 顶成 14px，五段节奏就不齐了。 */
#directory-listing.view-grid .row::before,
#directory-listing.view-grid .row::after {
    content: none !important;
    display: none !important;
}
/* 文件名（内含图标）：居中 + 两行截断 Xdir 20261029
   min-height 用 calc 把「图标高度 + 图标下间隔 + 两行文字」一起算进去——
   因为图标是 .file-name 内部的块级子元素，只写 2.9em 的话单行名的卡片会比双行名的矮 18.8px，
   同一行卡片高度参差、按键行也对不齐。 */
#directory-listing.view-grid .file-name {
    --ico-size: 42px;           /* 图标字号（断点可覆盖） */
    --ico-gap: 10px;            /* 图标与文件名之间的间隔 */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    width: 100%;
    padding: 0;
    font-size: 13px;
    line-height: 1.45;
    min-height: calc(2.9em + var(--ico-size) + var(--ico-gap));
    word-break: break-all;
    text-align: center;         /* 与图标同一竖轴居中 Xdir 20261029 */
    text-indent: 0;             /* 清掉全局 p{text-indent:28px} 的继承，
                                   否则图标与文字整体右移 28px，居中会被破坏 Xdir 修复 20261029 */
    color: #303133;
}
/* 卡片图标：块级满宽 + 字形居中，与下方文字共用同一条竖轴 Xdir 20261029
   注意 .fa-fw 自带固定宽（1.2857em），块级子元素必须显式 width:100% 才能满宽，
   否则固定宽的块不受 text-align 影响，字形会贴左（这就是之前"图标靠左"的成因）。 */
#directory-listing.view-grid .file-name i {
    display: block;
    width: 100%;
    font-size: var(--ico-size, 42px);
    line-height: 1;
    color: #1E9FFF;
    margin: 0 0 var(--ico-gap, 10px);   /* 图标 → 文件名 的间隔 */
    padding: 0;
    text-align: center;
}
/* 元信息：大小 / 修改时间各占一行小字，水平居中 Xdir 20261029 */
#directory-listing.view-grid .file-size,
#directory-listing.view-grid .file-modified {
    display: block;
    width: 100%;
    padding: 0;
    font-size: 12px;
    line-height: 1.5;
    color: #909399;
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Hash 信息按钮在卡片中不显示（列表视图可用），保持卡片整洁 */
#directory-listing.view-grid .file-info-button { display: none !important; }
/* 操作按钮组：回到正常流、水平居中、与上方内容等间隔 Xdir 20261029
   原来用「绝对定位贴底 + 卡片 padding-bottom 预留 54px」，会与居中的内容形成
   一条突兀的底部空带；改回正常流后，五段共用 li 的 gap:12px，节奏统一。
   仍必须清掉基础规则里的「右上角悬浮」定位（position:absolute + top:50% + translateY），
   否则 top:50% 会把它拉到卡片中部。 */
#directory-listing.view-grid .layui-hide-xs-info {
    position: static !important;
    top: auto !important;
    transform: none !important;
    left: auto;
    right: auto;
    display: flex !important;
    justify-content: center;
    align-items: center;
    flex-wrap: nowrap;
    gap: 6px;
    width: 100%;
    height: 28px;               /* 定高：五个按键单行排列，不因绝对/静态切换而变化 */
    min-height: 28px;
    margin: 0 !important;       /* 清掉 margin-top:auto，间隔由 li 的 gap 统一掌管 */
    padding: 0;
    line-height: 1;
}
#directory-listing.view-grid .layui-hide-xs-info td { display: contents; }
#directory-listing.view-grid .layui-hide-xs-info a {
    position: static !important;
    margin: 0 !important;
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 8px;
    background: #f1f8ff;
    color: #1E9FFF;
    border: 1px solid #c8e1ff;
    transition: all .18s ease;
}
#directory-listing.view-grid .layui-hide-xs-info a:hover {
    background: #1E9FFF;
    color: #fff;
    border-color: #1E9FFF;
    /* 去掉 translateY(-1px)：图标位移到小数像素上会发虚，且卡片本身已有抬升动画，
       按钮再单独上浮属于多余的第二层动效 Xdir 20261029 */
}

/* 平铺视图响应式列数（改由 grid 列数控制，行列严格对齐）Xdir 20261028 */
@media (max-width: 1199px) { #directory-listing.view-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 991px)  { #directory-listing.view-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 767px)  {
    #directory-listing.view-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    /* 按键已回到正常流，不再需要底部预留 50px；内外边距同步收窄一档 Xdir 20261029 */
    #directory-listing.view-grid > li { padding: 14px 10px; gap: 10px; }
    #directory-listing.view-grid .layui-hide-xs-info { height: 26px; min-height: 26px; gap: 5px; }
    #directory-listing.view-grid .layui-hide-xs-info a { width: 26px; height: 26px; }
}
@media (max-width: 479px)  { #directory-listing.view-grid { grid-template-columns: minmax(0, 1fr); } }

/* 批量操作栏融入卡片顶部 */
.xdir-list-card .xdir-bulkbar {
    border: none;
    border-radius: 12px 12px 0 0;   /* 顶部圆角（卡片 overflow 已改 visible，需手动补） */
    border-bottom: 1px solid #eef1f4;
    background: #fafcff;
    margin-bottom: 0;
}
/* 列表底部圆角（卡片 overflow 已改 visible，需手动补；ul 不裁剪，保证 HASH 按钮可外露） */
#directory-listing { border-radius: 0 0 12px 12px; }
#directory-listing li:last-child { border-radius: 0 0 12px 12px; }

/* 目录切换 / 列表加载动画（spinner + 文案遮罩） Xdir 增强 20261027
   ★ v2.0.18 rev.d 重构「动画跑到列表外 / 不在容器中心」的根因与修法：

   【根因一】曾经有 min-height:180px。绝对定位元素同时设 top/bottom 时高度本应等于
     卡片高度，但 min-height 优先级更高 —— 卡片矮于 180px（空目录仅 84px）时遮罩被撑到
     180px 并从卡片底部溢出 97px，动画跟着跑到卡片外。已删除。
   【根因二】删掉 min-height 后遮罩确实覆盖了卡片，但它是「对整张卡片垂直居中」的。
     列表一长（30 行 ≈ 785px、60 行 ≈ 1487px），卡片的几何中心就会跑到视口之外或
     正好贴在视口底部 —— 用户看到的就是「加载动画在列表外、靠近页脚上方」。
     这不是定位错误，而是「居中的参照物错了」：该参照可见区域，不是整张卡片。

   【现方案】两层结构：
     .xdir-loading     遮罩，absolute inset:0，严格等于卡片盒子（含 overflow:hidden 兜底）
     .xdir-loading-box 居中层，由脚本把 top 设到「卡片 ∩ 视口」的可见区域垂直中心；
                       短列表（卡片整个在视口内）时即为卡片中心，长列表时即为当前可视区中心，
                       从而自动适配文件/文件夹数量。未执行脚本时 top:50% 作为兜底居中。 */
.xdir-loading {
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    background: rgba(255, 255, 255, .92);
    display: none;
    /* Xdir 修复 20261119【本批 #2】：这里的 z-index 只需要压过卡片内的行内容，
       不会再越界到页脚——宿主 .xdir-list-card 已加 isolation:isolate 自成层叠上下文。
       切勿为了让遮罩"盖住"页脚而往上加，那样只会重现白条压页脚的问题。 */
    z-index: 9;
    border-radius: inherit;
    overflow: hidden;              /* 兜底：内容再高也只在卡片内裁切，绝不外溢 */
    backdrop-filter: blur(1.5px);
}
/* 同 .xdir-pkg-overlay：需 !important 才能压过 Bootstrap 的 .show{display:block!important} Xdir 修复 20261028 */
.xdir-loading.show { display: block !important; animation: xdir-fade-in .2s ease; }

/* 居中层：绝对定位在遮罩内，top 由脚本写入；translateY(-50%) 让「自身中心」落在 top 处。
   未执行脚本时 top:50% 仍能得到卡片内垂直居中（旧行为），不会出现"完全没有位置"的情况。 */
.xdir-loading-box {
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 14px;
    padding: 8px 0;
    pointer-events: none;          /* 只是提示，不拦截列表点击 */
}
.xdir-spinner {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 9px;
}
.xdir-spinner span {
    width: 13px;
    height: 13px;
    border-radius: 50%;
    animation: xdir-bounce .6s infinite ease-in-out both;
}
.xdir-spinner span:nth-child(1) { background: #ff5b5b; animation-delay: -.40s; }
.xdir-spinner span:nth-child(2) { background: #ffb02e; animation-delay: -.30s; }
.xdir-spinner span:nth-child(3) { background: #3ec46d; animation-delay: -.15s; }
.xdir-spinner span:nth-child(4) { background: #1E9FFF; animation-delay: 0s; }
@keyframes xdir-bounce {
    0%, 80%, 100% { transform: scale(0); opacity: .4; }
    40% { transform: scale(1); opacity: 1; }
}
.xdir-loading-text {
    color: #5b6b7b;
    font-size: 13px;
    letter-spacing: 2px;
}
@keyframes xdir-spin { to { transform: rotate(360deg); } }

/* 列表预加载：中央彩色旋转环（替代原四色弹跳点）Xdir v2.0.19
   用 conic-gradient 做一圈彩色环，再用 radial-gradient 遮罩掏空中心成「环」，
   整圈旋转即「彩色旋转环」；沿用上方 xdir-spin 动画。其余列表动画/样式不变。 */
.xdir-loading-ring {
    width: 46px;
    height: 46px;
    border-radius: 50%;
    background: conic-gradient(from 0deg, #ff5b5b, #ffb02e, #3ec46d, #1E9FFF, #ff5b5b);
    -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 5px), #000 calc(100% - 5px));
            mask: radial-gradient(farthest-side, transparent calc(100% - 5px), #000 calc(100% - 5px));
    animation: xdir-spin .9s linear infinite;
}
/* 暗黑模式：遮罩用 #000 取反，环本身彩色不受影响，仅微调背景衬托 */
.night .xdir-loading-ring { opacity: .95; }
@keyframes xdir-fade-in { from { opacity: 0; } to { opacity: 1; } }

/* 批量打包加载遮罩（前端呈现打包态，替代整页表单提交导致的原始错误页） Xdir 20261027 */
.xdir-pkg-overlay {
    position: fixed;
    top: 0; right: 0; bottom: 0; left: 0;
    z-index: 99998;
    background: rgba(17,24,39,.55);
    display: none;
    align-items: center;
    justify-content: center;
    padding: 20px;
    opacity: 0;
    transition: opacity .2s ease;
}
/* 关键：Bootstrap 3 自带 `.show{display:block!important}`（bootstrap.min.css），
   会把这里的 display:flex 盖掉 → 卡片退回到左上角（只吃 padding:20px），完全不在页面居中。
   故必须同样用 !important 才能压过它 Xdir 修复 20261028 */
.xdir-pkg-overlay.show { display: flex !important; opacity: 1; }
.xdir-pkg-card {
    background: #fff;
    border-radius: 14px;
    padding: 26px 30px;
    width: 340px;
    max-width: 92vw;
    box-shadow: 0 20px 60px rgba(0,0,0,.35);
    text-align: center;
    animation: xdir-fade-in .2s ease;
}
.xdir-pkg-card .xdir-spinner { margin: 0 auto 16px; }
.xdir-pkg-title { font-size: 15px; font-weight: 600; color: #303133; margin-bottom: 7px; }
/* 打包阶段状态文本（正在打包 x/y、正在生成压缩包、正在下载…） */
.xdir-pkg-status { font-size: 13px; color: #1E9FFF; font-weight: 600; margin-bottom: 10px; min-height: 19px; }
/* 进度条轨道 + 填充（含条纹走动动画） */
.xdir-pkg-bar {
    width: 100%;
    height: 22px;
    border-radius: 11px;
    background: #eef2f6;
    overflow: hidden;
    margin-bottom: 12px;
    box-shadow: inset 0 1px 3px rgba(0,0,0,.08);
}
.xdir-pkg-bar-fill {
    height: 100%;
    width: 0;
    border-radius: 11px;
    background: linear-gradient(135deg, #33b5ff, #1E9FFF);
    transition: width .35s ease;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    overflow: hidden;
}
/* 条纹层：常态下为静态斜纹；indeterminate 时斜纹持续走动（压缩阶段动画） */
.xdir-pkg-bar-fill::after {
    content: '';
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    background-image: linear-gradient(45deg, rgba(255,255,255,.22) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.22) 50%, rgba(255,255,255,.22) 75%, transparent 75%, transparent);
    background-size: 28px 28px;
}
.xdir-pkg-bar-fill.indeterminate::after { animation: xdir-stripes 0.9s linear infinite; }
@keyframes xdir-stripes { from { background-position: 0 0; } to { background-position: 28px 0; } }
.xdir-pkg-bar-pct { position: relative; z-index: 1; font-size: 11px; font-weight: 700; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.25); }
.xdir-pkg-sub { font-size: 12.5px; color: #8a96a3; line-height: 1.6; margin-bottom: 18px; }
.xdir-pkg-sub b { color: #1E9FFF; font-weight: 600; }
/* 大体积预警卡片（与打包遮罩同风格） */
.xdir-pkg-warnmask { z-index: 99999; }
.xdir-warn-card { width: 400px; }
.xdir-warn-ico {
    width: 56px; height: 56px; border-radius: 16px;
    background: linear-gradient(135deg, #fff3e0, #ffe0b2);
    color: #f57c00; font-size: 26px;
    display: flex; align-items: center; justify-content: center;
    margin: 0 auto 14px;
}
.xdir-warn-title { font-size: 16px; font-weight: 700; color: #1f2d3d; margin-bottom: 10px; }
.xdir-warn-msg { font-size: 13.5px; color: #606266; line-height: 1.8; margin-bottom: 22px; }
.xdir-warn-msg b { color: #f57c00; }
.xdir-warn-btns { display: flex; gap: 10px; }
.xdir-warn-btns button { flex: 1; height: 40px; border-radius: 8px; font-size: 14px; cursor: pointer; border: none; transition: all .15s ease; }
.xdir-warn-no { background: #f0f4f9; color: #5b6b7b; }
.xdir-warn-no:hover { background: #e2e9f2; }
.xdir-warn-yes { background: linear-gradient(135deg, #33b5ff, #1E9FFF); color: #fff; }
.xdir-warn-yes:hover { background: #1E9FFF; }
.xdir-pkg-cancel {
    display: inline-block;
    padding: 8px 22px;
    border: 1px solid #dcdfe6;
    border-radius: 8px;
    background: #fff;
    color: #606266;
    font-size: 13px;
    cursor: pointer;
    transition: all .15s ease;
}
.xdir-pkg-cancel:hover { background: #f5f7fa; border-color: #c0c4cc; color: #303133; }
.xdir-pkg-cancel:active { transform: translateY(1px); }
.night .xdir-pkg-overlay { background: rgba(8,12,18,.7); }
.night .xdir-pkg-card { background: #18222e; box-shadow: 0 20px 60px rgba(0,0,0,.6); }
.night .xdir-pkg-title { color: #e6eef6; }
.night .xdir-pkg-status { color: #6db3ff; }
.night .xdir-pkg-bar { background: #1b2735; box-shadow: inset 0 1px 3px rgba(0,0,0,.4); }
.night .xdir-pkg-sub { color: #7d8ea0; }
.night .xdir-pkg-sub b { color: #6db3ff; }
.night .xdir-pkg-cancel { background: #1b2735; border-color: #2c3e50; color: #9fc4e8; }
.night .xdir-pkg-cancel:hover { background: #243447; border-color: #3a5068; color: #cfe3f7; }
.night .xdir-warn-title { color: #e6eef6; }
.night .xdir-warn-msg { color: #9fb0c3; }
.night .xdir-warn-no { background: #1b2735; color: #9fc4e8; }
.night .xdir-warn-no:hover { background: #243447; }

/* 图片悬停预览浮层（精准唤醒：仅图片行，居中文件上方，近顶翻转下方） Xdir 增强 20261027 */
#xdirImgPreview {
    position: fixed;
    z-index: 6000;
    background: #fff;
    padding: 6px;
    border-radius: 10px;
    box-shadow: 0 10px 30px rgba(0,0,0,.25);
    border: 1px solid #e3e9f0;
    max-width: 320px;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(4px);
    transition: opacity .15s ease, transform .15s ease, visibility .15s;
}
#xdirImgPreview.show { opacity: 1; visibility: visible; transform: translateY(0); }
#xdirImgPreview img { display: block; max-width: 300px; max-height: 300px; border-radius: 6px; }
.night #xdirImgPreview { background: #16202c; border-color: #2c3e50; box-shadow: 0 10px 30px rgba(0,0,0,.6); }

/* 列表入场动画（页面加载 / 切换后逐条淡入上浮） */
#directory-listing > li { animation: xdir-fade-up .42s ease both; }
#directory-listing > li:nth-child(1)  { animation-delay: .02s; }
#directory-listing > li:nth-child(2)  { animation-delay: .05s; }
#directory-listing > li:nth-child(3)  { animation-delay: .08s; }
#directory-listing > li:nth-child(4)  { animation-delay: .11s; }
#directory-listing > li:nth-child(5)  { animation-delay: .14s; }
#directory-listing > li:nth-child(6)  { animation-delay: .17s; }
#directory-listing > li:nth-child(7)  { animation-delay: .20s; }
#directory-listing > li:nth-child(8)  { animation-delay: .23s; }
#directory-listing > li:nth-child(n+9) { animation-delay: .26s; }
@keyframes xdir-fade-up {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
}

/* ===== 返回顶部（v2.0.18 rev.w：两套合并为一套，本段样式已迁移）=====
   原先这里定义 .xdir-backtop（蓝色圆形，由 JS 在 ≤768 动态创建），
   与 HTML 里的 .cd-top（桌面红色方块）并存 —— 两个断点不一致（828 vs 768）时
   会在 769~828 区间同时出现两个返回顶部按钮。

   现在只保留 .cd-top 一个元素，它在 ≤828 由 resources/Top/css/zzsc.css
   换成同样的圆形外观（含暗色模式）。所以这里不再需要 .xdir-backtop。
   脚本侧 initBackTop() 已留空，不会再创建节点。 */

/* ===== 移动端顶栏：品牌区与右侧功能区同轴对齐 Xdir 修复 20261029 =====
   目标是「logo 图标 与 搜索栏/按键 处在同一条水平中轴，且左右留白对称」。
   改前三处偏差（496px 实测）：
     ① .xdir-brand 的 display 被「#page-navbar .shiyu a{display:inline-block}」压掉
        （后者特异性 1,1,1 > 前者 1,1,0）→ align-items:center 失效，
        图标贴品牌框顶部（框内 top=0，底部空 8px），徽章则偏低 7.5px；
     ② .navbar-text 带有 text-indent:28px（bootstrap 全局 p 的首行缩进）→
        整个品牌区右移 28px：左留白 34px，而右侧只有 10px，左右不对称；
     ③ 顶栏高度只在 @media(min-width:829px) 里声明，移动端回落到 bootstrap 的
        .navbar{min-height:50px} → 高度完全由内容撑开（改一个 margin 顶栏就跟着变，
        实测 67px→54px），下方 #page-content 的 padding-top:72px 随之对不上。
   修法：显式锁死顶栏 65px（与桌面一致），左右两侧都按 (65 − 自身高度)/2 居中，
        天然同轴；缩进与宽度限制归零，左留白回到容器内容起点 10px，与右留白对称。 */

/* 移动端顶栏：单行不换行，搜索框弹性收缩，保证搜索栏与按键始终可见 Xdir 修复 20261029
   原问题：这里用了 flex-wrap: wrap，而 #page-navbar 高度锁死 65px，
   一旦搜索框 + 三个按键总宽超出可用宽度就会换到第二行，被固定高度裁掉 → 看起来"搜索栏/按键丢失"。 */
@media (max-width: 767px) {
    #page-navbar .container { padding-left: 10px; padding-right: 10px; }
    .topbar-right {
        gap: 6px;
        /* 与左侧品牌区同轴：两者都按 (顶栏 65 − 自身高度)/2 垂直居中。
           右区高 34 → 15.5px，品牌框高 48 → 8.5px，中心都落在 32.5px。
           原来这里是 12px（中心 29px），与品牌区的 32.5px 差 3.5px，logo 看着比按键偏下。 */
        margin-top: 15.5px;
        flex-wrap: nowrap;            /* 关键：绝不换行 */
        justify-content: flex-end;
        max-width: calc(100% - 118px); /* 给左侧站标留出固定宽度，避免把搜索框挤出屏 */
    }
    /* 搜索框改为弹性：有空间就撑开，没空间就收缩，最小 64px 保证可点 */
    .yidong-sousuo { width: auto; flex: 1 1 auto; min-width: 64px; margin: 0; }
    .yidong-sousuo .search-wrap { width: 100%; }
    .xdir-ctrl-btn { width: 32px; height: 32px; flex: 0 0 auto; }
    /* 搜索下拉结果面板跟随弹性宽度 */
    .search-results { width: 100%; min-width: 200px; }
}
@media (max-width: 420px) {
    /* 更窄屏：进一步压缩，保证一行放得下 */
    .topbar-right { gap: 5px; max-width: calc(100% - 96px); }
    .xdir-ctrl-btn { width: 30px; height: 30px; }
}

/* ===================== 移动端全局防横向溢出 + 列表排版规整 Xdir 修复 20261029 =====================
   不同手机分辨率下出现"页面可左右滑动"的根本原因有三类：
   ① 固定宽度元素（如宽表格、长单词、base64 长链接）撑破容器；
   ② 负边距 / 绝对定位元素超出视口；
   ③ flex 子项没有 min-width:0，内容撑开后无法收缩。
   这里统一加固：视口锁宽 + 子项可收缩 + 长内容强制换行。 */
@media (max-width: 767px) {
    /* ★ 只用 overflow-x: clip，不要用 hidden（v2.0.18 rev.v）
       CSS 规范：一个方向是 visible、另一个不是时，visible 会被**计算成 auto**。
       所以 `overflow-x:hidden` 会让 overflow-y 变成 auto → body 成为滚动容器，
       手机上与 window 形成两套滚动坐标系（帧率差、返回顶部读不到 scrollTop、
       sticky 页脚黏在 body 上遮挡内容）。clip 不参与这个提升，overflow-y 保持 visible。
       老浏览器不认 clip 时退回 hidden（此时行为虽有瑕疵，但不至于失去防横向滑动）。 */
    html, body {
        width: 100%;
        max-width: 100%;
        overflow-x: hidden;
        overflow-x: clip;
    }
    /* 让所有 flex 容器里的子项可收缩（默认 min-width:auto 会被内容顶开） */
    #page-navbar .container,
    .xdir-list-card,
    #directory-listing li,
    .xdir-bulkbar,
    .announcement {
        min-width: 0;
    }
    /* 本批 #5：移动端批量栏提示文字右对齐（按钮与大小居左、提示语居右） */
    .xdir-bulkbar #xdirDownload { margin-left: 0; }
    .xdir-bulkbar .xdir-bulk-tip { margin-left: auto; text-align: right; }
    /* 超长文件名 / 长 URL / 长单词强制换行，避免撑出容器 */
    .file-name,
    .xdir-brand-name,
    .announcement .xdir-ann-body,
    .readme, .readme * {
        word-break: break-word;
        overflow-wrap: anywhere;
    }

    /* ---------- 列表视图（.view-list） ----------
       行内布局（单行三格 + 功能浮层）与列头三列已统一在 ≤828 块里定义，
       这里不再重复声明，只保留与视口加固相关的部分，避免两处规则互相覆盖出错。 */
    #directory-listing.view-list .row { margin: 0; }

    /* ---------- 平铺视图：元信息与按钮行更紧凑 ---------- */
    /* 按键已回正常流，底部不再预留 50px Xdir 20261029 */
    #directory-listing.view-grid > li { padding: 14px 8px; gap: 10px; }
    #directory-listing.view-grid .file-name {
        font-size: 12.5px;
        --ico-size: 38px;
        --ico-gap: 8px;
        /* 与主规则同构：图标 + 间隔 + 两行(2.8em)，保证窄屏下卡片也等高 */
        min-height: calc(2.8em + 38px + 8px);
    }
    #directory-listing.view-grid .file-size,
    #directory-listing.view-grid .file-modified { font-size: 11px; }
    /* 平铺卡片在手机上也保留「修改时间」：标记里带 bootstrap 的 hidden-xs，
       <768px 默认被 display:none 掉，会让五段结构少一段、与其它端不一致。
       平铺卡片是纵向堆叠，多一行不影响宽度，显式恢复显示 Xdir 20261029 */
    #directory-listing.view-grid .file-modified.hidden-xs { display: block !important; }
    #directory-listing.view-grid .layui-hide-xs-info { gap: 5px; height: 26px; min-height: 26px; }
    #directory-listing.view-grid .layui-hide-xs-info a { width: 26px; height: 26px; }
}

/* 暗黑模式适配 Xdir 增强 20261027 */
.night .topbar-right .xdir-ctrl-btn { background: #1b2735; border-color: #2c3e50; color: #9fc4e8; }
.night .topbar-right .xdir-ctrl-btn:hover { background: #243447; color: #6db3ff; }
.night .search-wrap #globalSearch { background: #16202c; border-color: #2c3e50; color: #d1d1d1; }
.night .search-wrap .search-icon, .night .search-clear { color: #6b7c8c; }
.night .search-results { background: #16202c; border-color: #2c3e50; box-shadow: 0 12px 36px rgba(0,0,0,.5); }
.night .search-results .sr-item { color: #d1d1d1; }
.night .search-results .sr-item:hover { background: #1b2735; }
.night .search-results .sr-more { color: #6db3ff; border-top-color: #2c3e50; }
.night .search-results .sr-path, .night .search-results .sr-size { color: #7d8ea0; }
.night .xdir-list-card { background: #18222e; border-color: #2c3e50; }
/* 功能列（触发器 + 按钮）暗黑配色 Xdir 20261029
   按钮本体在**桌面和移动端都需要**深色，否则浅色按钮会糊在深底上，这部分保持不限媒体查询。 */
.night #directory-listing.view-list .xdir-acts-btn { color: #8fa3b8; }
.night #directory-listing.view-list li.xdir-acts-open .xdir-acts-btn {
    background: rgba(30,159,255,.18);
    color: #6db3ff;
}
.night #directory-listing.view-list .layui-hide-xs-info a {
    background: #223243;
    border-color: #2c3e50;
    color: #6db3ff;
}
/* 浮层「卡片式」外观：底色 / 描边 / 投影 —— **只在移动端生效** Xdir 修复 20261029
   起因：这一段原来是给手机端那个「点 ⋯ 弹出来的浮层」写的外观（深底 + 边框 + 0 8px 22px 投影），
   但漏了媒体查询，于是桌面端暗黑下也套了上去。
   桌面端这条 .layui-hide-xs-info 是**常显**的、高度只有 20px 左右，
   0 8px 22px rgba(0,0,0,.58) 的投影正好从按钮行底下拖出一条暗带（实测比背景 #18222e
   更暗，到 rgb(19,27,37)，横跨整排按钮约 154px 宽）—— 就是用户看到的「按键底部阴影层」。
   桌面端根本不需要这层卡片外观：按钮自己有底色，浮层容器保持透明即可。 */
@media screen and (max-width: 828px) {
  .night #directory-listing.view-list .layui-hide-xs-info {
      background: #1b2735;
      border-color: #2c3e50;
      box-shadow: 0 8px 22px rgba(0,0,0,.58);
  }
}
.night .xdir-list-card .xdir-bulkbar { background: #14202c; border-bottom-color: #2c3e50; }
/* 分隔线已从 .bianliliebiao-mulu 上移到 header 本身，暗黑描边同步跟随 Xdir 修复 20261029 */
/* 表头底色同步转深：比上方批量栏(#14202c)略亮一档，既有层次又连成一片 Xdir 20261029 */
.night #directory-list-header { border-bottom-color: #2c3e50; background-color: #16232f; }
.night #directory-list-header .bianliliebiao-mulu { color: #cdd9e5; }
.night .xdir-loading { background: rgba(24, 34, 46, .94); backdrop-filter: blur(1.5px); }
.night .xdir-loading-text { color: #aebfcf; }
.night .file-info-button { background: #1b2735; border-color: #2c3e50; color: #9fc4e8; }
.night .file-info-button i { color: #9fc4e8 !important; }
.night .file-info-button:hover,
.night #directory-listing li .file-info-button:hover { background: #1E9FFF !important; border-color: #1E9FFF !important; color: #fff !important; }
.night .file-info-button:hover i,
.night #directory-listing li .file-info-button:hover i { color: #fff !important; }
.night #directory-listing.view-grid li { background: #18222e; border-color: #2c3e50; }
/* 暗黑 · 平铺视图悬停：卡片必须保持深色。
   列表视图的 .night li:hover 背景是浅灰蓝 rgb(90 107 131 / 78%)，一旦级联顺序不同就会套到卡片上，
   与浅色文件名 #d5dce6 撞色（对比度仅约 3.9，13px 小字明显发灰看不清），故这里显式固定深色 + 近白文字 Xdir 20261028 */
.night #directory-listing.view-grid li:hover {
    background: #203042 !important;                                  /* 轻微提亮，仍是深色，不使用列表视图那套浅灰 */
    border-color: #1E9FFF;
    box-shadow: 0 10px 26px rgba(0,0,0,.5) !important;              /* 去掉 inset 内描边，仅保留外发光，消除悬停内框 Xdir v2.0.19 */
}
.night #directory-listing.view-grid li:hover .file-name {
    color: #7fd1ff !important;   /* 悬停明显转亮蓝，交互反馈清晰（原 #d5dce6→#f2f7fd 差别太小看不出）Xdir 20261029 */
    /* 悬停只做颜色高亮，不再叠加「白描边 + 字重」 Xdir 20261029
       原实现在这里加 -webkit-text-stroke:.028em #fff + font-weight:500，
       实测（4x/2x 缩放取样）：
         纯色       墨 6004 / 灰阶 129
         w500       墨 6004 / 灰阶 129   ← 与纯色逐像素相同（微软雅黑没有 Medium 字面）
         w500+描边  墨 8476 / 灰阶 700   ← 灰阶像素暴涨 5.4 倍
         w700 真加粗 墨 7959 / 灰阶 137   ← 粗，但很清晰
       也就是说「看起来加粗」其实是那圈白边造成的，而白边正是发虚的根源：
       0.028em 在 13.5px 下只有 0.38px，落在亚像素区间，抗锯齿边缘被填成一片灰蒙蒙的光晕。
       现在直接去掉描边与字重，只保留颜色变化 —— 悬停依旧一眼可辨，文字恢复锐利。 */
}
.night #directory-listing.view-grid li:hover .file-size,
.night #directory-listing.view-grid li:hover .file-modified {
    color: #93a5b8 !important;
}
.night #directory-listing.view-grid .file-name { color: #d5dce6; }
.night #directory-listing.view-grid .file-size,
.night #directory-listing.view-grid .file-modified { color: #7d8fa3; }
/* 暗黑 · 列表视图（含搜索结果行）悬停 Xdir 20261029
   原表现：背景是中灰蓝 rgb(90 107 131 / 78%)，文件名悬停转 #1E9FFF，而 .file-size /
   .file-modified 无暗黑覆盖、从 .night a 继承到纯白 → 一行里「蓝名 + 白字」撞色，
   且白字压中灰底发糊（实测对比度仅约 5.6，蓝名压同底只有 1.9，几乎看不清）。
   现统一成与平铺视图一致的深色悬停：底 #203042、三级文字同为亮蓝 #7fd1ff（对比度 7.9）。 */
.night #directory-listing.view-list li:hover {
    background: #203042 !important;                                  /* 深板岩蓝，比卡片底色 #18222e 略亮一档 */
    box-shadow: inset 3px 0 0 0 #1E9FFF, inset 0 0 0 1px rgba(30,159,255,.22) !important;
}
.night #directory-listing.view-list li:hover .file-name,
.night #directory-listing.view-list li:hover .file-size,
.night #directory-listing.view-list li:hover .file-modified {
    color: #007bff !important;                                        /* 大小/修改时间与文件名同色，不再是一片白 */
    /* 悬停只做颜色高亮，不再叠加「白描边 + 字重」 Xdir 20261029
       Xdir 第十五批 #6：移除 font-weight:500 —— 暗黑下 hover 切 400→500 触发亚像素回流，
       文件名气泡出现时文字抖动；该字重本就被注释判定为无效（微软雅黑无 Medium），去掉最干净。
       上一版这里是 -webkit-text-stroke:.028em #fff + font-weight:500 + paint-order。
       像素实测（同一段文字、同一背景）：
         纯色基线        墨 6004 / 灰阶 129
         w500           墨 6004 / 灰阶 129   ← 与纯色逐像素一致：微软雅黑没有 Medium，
                                                500 直接回落到 Regular，浏览器也不合成
         w500 + 白描边   墨 8476 / 灰阶 700   ← 灰阶像素暴涨 5.4 倍
         w700 真加粗     墨 7959 / 灰阶 137   ← 真的粗了，但边缘依旧锐利
       结论：用户看到的「加粗」其实是那圈白边撑出来的，而白边正是发虚的根源 ——
       0.028em 在 13.5px 下只有 0.38px，落在亚像素区间，白晕把抗锯齿边缘糊成一片灰雾。
       既然要的是「不要发虚」，最干净的做法是去掉描边（连带那个不起作用的 500），
       只留颜色变化：悬停反馈依然明显（#7fd1ff vs 常态 #FFF），文字恢复锐利。 */
}
.night #directory-listing.view-list li:hover .file-name i { color: #007bff !important; }    /* 图标同步，避免蓝底上残留橙色图标 */
/* 暗黑 · 选中态：默认的 #e8f3ff 是浅蓝底，暗黑下未覆盖会变成「浅底 + 浅字」严重撞色。
   列表与平铺统一改为深蓝底 + 蓝色内描边，文字提亮 Xdir 修复 20261028 */
.night #directory-listing li.xdir-checked {
    background: #1c2f42 !important;
    box-shadow: inset 0 0 0 1px rgba(30,159,255,.45);
}
.night #directory-listing.view-grid li.xdir-checked {
    background: #1c2f42 !important;
    border-color: rgba(30,159,255,.55);
}
.night #directory-listing.view-grid li.xdir-checked .file-name { color: #eaf2fb !important; }
.night #directory-listing.view-grid .layui-hide-xs-info a { background: #1b2735; border-color: #2c3e50; color: #6db3ff; }
.night #directory-listing.view-grid .layui-hide-xs-info a:hover { background: #1E9FFF; border-color: #1E9FFF; color: #fff; }

/* 暗黑 · 行内代码 / 键位 / 代码块
   Bootstrap 默认 `code{background:#f9f2f4;color:#c7254e}`（浅粉底 + 红字），
   暗黑下会变成一块块浅色小方片嵌在深底里，红字压浅粉底也发灰 —— 即用户反馈的"灰白底红字"。
   这里统一转深色：深蓝底 + 亮蓝字，代码块更深一档 Xdir 修复 20261028 */
.night code,
.night kbd,
.night samp {
    background-color: #24313f !important;
    color: #7fd1ff !important;
    border: 1px solid #2f4155;
    border-radius: 4px;
    padding: 1px 5px;
}
.night pre {
    background-color: #12212e !important;
    border: 1px solid #2c3e50 !important;
    color: #cdd9e5 !important;
}
.night pre code,
.night pre kbd,
.night pre samp {
    background: transparent !important;
    border: 0;
    padding: 0;
    color: inherit !important;
}

/* ===================== 左下角音乐列表播放器 Xdir 音乐增强 ===================== */
.xdir-music-player {
    position: fixed;
    left: 18px;
    /* 上抬到页脚之上（同右下角返回顶部按钮的处理）：避免与锁定在底部的页脚重叠，
       也避免「页脚压在播放器上方」的错位观感 Xdir v2.0.4 */
    bottom: calc(var(--xdir-foot-h, 34px) + var(--xdir-gap-bottom, 16px));
    z-index: 1050;
    display: flex;
    align-items: center;
    gap: 12px;
    width: 400px;
    max-width: calc(100vw - 36px);
    padding: 12px 14px;
    background: rgba(255,255,255,.96);
    border: 1px solid #e3e8ef;
    border-radius: 14px;
    box-shadow: 0 10px 40px rgba(20,40,80,.18);
    backdrop-filter: blur(6px);
}
.xdir-music-player .xmp-cover {
    width: 46px; height: 46px; flex: 0 0 auto;
    border-radius: 10px;
    background: linear-gradient(135deg,#22d3ee,#3b82f6);
    color: #fff; font-size: 20px;
    display: flex; align-items: center; justify-content: center;
}
.xdir-music-player .xmp-main { flex: 1; min-width: 0; }
.xdir-music-player .xmp-top { display: flex; align-items: center; gap: 8px; }
.xdir-music-player .xmp-title {
    font-size: 13px; font-weight: 700; color: #303133;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    flex: 1; min-width: 0;
}
.xdir-music-player .xmp-bar { display: flex; align-items: center; gap: 8px; margin: 6px 0 4px; }
.xdir-music-player .xmp-cur, .xdir-music-player .xmp-dur {
    font-size: 11px; color: #909399; width: 34px; text-align: center; flex: 0 0 auto;
}
.xdir-music-player .xmp-track {
    position: relative; flex: 1; height: 5px;
    background: #e3e8ef; border-radius: 3px; cursor: pointer;
}
.xdir-music-player .xmp-fill {
    position: absolute; left: 0; top: 0; height: 100%; width: 0;
    border-radius: 3px; background: linear-gradient(90deg,#22d3ee,#3b82f6);
}
.xdir-music-player .xmp-knob {
    position: absolute; top: 50%; left: 0; width: 11px; height: 11px;
    border-radius: 50%; background: #fff; border: 2px solid #3b82f6;
    transform: translate(-50%,-50%); box-shadow: 0 1px 3px rgba(0,0,0,.25);
}
.xdir-music-player .xmp-controls { display: flex; align-items: center; gap: 4px; flex-wrap: nowrap; }
.xdir-music-player .xmp-btn {
    width: 28px; height: 28px; border: none; border-radius: 50%;
    background: #f0f4f9; color: #1E9FFF; cursor: pointer; font-size: 12px;
    display: flex; align-items: center; justify-content: center;
    flex: 0 0 auto;
}
.xdir-music-player .xmp-btn.xmp-play { background: #1E9FFF; color: #fff; width: 32px; height: 32px; }
.xdir-music-player .xmp-btn:hover { filter: brightness(.96); }
.xdir-music-player .xmp-btn.mode-on { background: #1E9FFF; color: #fff; }
.xdir-music-player .xmp-vol { display: flex; align-items: center; gap: 4px; color: #909399; margin-left: 2px; }
.xdir-music-player .xmp-vol input { width: 48px; }
/* 音量数值气泡：拖拽/调节时显示实际 1-100 数值（Xdir 增强 20261028） */
.xdir-music-player .xmp-vol { position: relative; }
.xdir-music-player .xmp-vol-val {
    position: absolute; bottom: 135%; left: 50%; transform: translateX(-50%);
    background: #1E9FFF; color: #fff; font-size: 11px; font-weight: 700; line-height: 1;
    padding: 3px 7px; border-radius: 6px; white-space: nowrap;
    opacity: 0; transition: opacity .15s ease; pointer-events: none;
    box-shadow: 0 2px 8px rgba(0,0,0,.25);
}
.xdir-music-player .xmp-vol-val::after {
    content: ''; position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
    border: 5px solid transparent; border-top-color: #1E9FFF;
}
.xdir-music-player .xmp-vol-val.show { opacity: 1; }
.xdir-music-player .xmp-bg { font-size: 11px; color: #909399; display: flex; align-items: center; gap: 3px; cursor: pointer; flex: 0 0 auto; white-space: nowrap; }
.xdir-music-player .xmp-playlist {
    position: absolute; left: 0; right: 0; bottom: 100%;
    margin-bottom: 8px; max-height: 220px; overflow-y: auto;
    background: #fff; border: 1px solid #e3e8ef; border-radius: 10px;
    box-shadow: 0 8px 30px rgba(20,40,80,.18); display: none; padding: 6px;
}
.xdir-music-player .xmp-pl-item {
    padding: 7px 10px; border-radius: 6px; font-size: 12px; color: #303133;
    cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.xdir-music-player .xmp-pl-item:hover { background: #f0f4f9; }
.xdir-music-player .xmp-pl-item.active { background: #e6f0ff; color: #1E9FFF; font-weight: 700; }

/* 列表内正在播放高亮 */
#directory-listing li.xmp-playing > a .file-name { color: #1E9FFF; font-weight: 700; }
#directory-listing li.xmp-playing > a .file-name i { color: #1E9FFF; }

/* 暗黑模式适配 */
.night .xdir-music-player { background: rgba(20,28,38,.96); border-color: #2c3e50; box-shadow: 0 10px 40px rgba(0,0,0,.5); }
.night .xdir-music-player .xmp-title { color: #e5e7eb; }
.night .xdir-music-player .xmp-track { background: #2c3e50; }
.night .xdir-music-player .xmp-btn { background: #1b2735; color: #6db3ff; }
.night .xdir-music-player .xmp-btn.xmp-play { background: #1E9FFF; color: #fff; }
.night .xdir-music-player .xmp-bg { color: #aebfcf; }
.night .xdir-music-player .xmp-cur, .night .xdir-music-player .xmp-dur, .night .xdir-music-player .xmp-vol { color: #8aa0b6; }
.night .xdir-music-player .xmp-playlist { background: #16202c; border-color: #2c3e50; }
.night .xdir-music-player .xmp-pl-item { color: #d1d1d1; }
.night .xdir-music-player .xmp-pl-item:hover { background: #1b2735; }
.night .xdir-music-player .xmp-pl-item.active { background: #1b2735; color: #6db3ff; }

/* ===================== 全局 toast 提示（复制反馈重构） Xdir 增强 20261027 ===================== */
#xdirToastWrap {
    position: fixed;
    top: 76px;
    left: 50%;
    transform: translateX(-50%);
    /* 必须高于 layer 弹窗基准 19891014，仅低于 .layui-layer-move 的 2147483647 */
    z-index: 2147483000;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    pointer-events: none;
}
.xdir-toast {
    display: flex;
    align-items: center;
    gap: 12px;   /* 图标与文字水平间隙 */
    padding: 11px 18px;
    border-radius: 10px;
    font-size: 14px;
    color: #fff;
    box-shadow: 0 8px 28px rgba(0,0,0,.18);
    opacity: 0;
    transform: translateY(-12px);
    transition: opacity .28s ease, transform .28s ease;
    pointer-events: auto;
    cursor: pointer;
    max-width: 90vw;
}
.xdir-toast i { font-size: 17px; flex: 0 0 auto; line-height: 1; width: 18px; text-align: center; display: flex; align-items: center; justify-content: center; }
.xdir-toast span { line-height: 1.4; text-align: left; flex: 0 1 auto; }
/* 动态打钩（SVG 描边动画） */
.xdir-check-svg { width: 20px; height: 20px; flex: 0 0 auto; display: block; align-self: center; }
.xdir-check-ring { fill: none; stroke: rgba(255,255,255,.4); stroke-width: 2; }
.xdir-check-path {
    fill: none; stroke: #fff; stroke-width: 2.6;
    stroke-linecap: round; stroke-linejoin: round;
    stroke-dasharray: 22; stroke-dashoffset: 22;
    animation: xdir-draw-check .38s ease-out forwards .12s;
}
@keyframes xdir-draw-check { to { stroke-dashoffset: 0; } }
.xdir-toast.show { opacity: 1; transform: translateY(0); }
.xdir-toast-success { background: linear-gradient(135deg,#34c77b,#22a86a); }
.xdir-toast-error { background: linear-gradient(135deg,#ff6b6b,#e64545); }
.xdir-toast-warning { background: linear-gradient(135deg,#ffb02e,#f59e0b); }
.xdir-toast-info { background: linear-gradient(135deg,#3b82f6,#1E9FFF); }

/* ===================== HASH 弹窗现代重构 Xdir 增强 20261027 ===================== */
.xdir-hash-modal {
    border: none;
    border-radius: 14px;
    overflow: hidden;
    box-shadow: 0 20px 60px rgba(20,40,80,.25);
}
/* 弹窗屏幕居中（水平+垂直），宽度自适应数值长短、跟随 SHA 值收缩 */
#file-info-modal.modal {
    display: none;
}
/* 关键：必须 !important。Bootstrap 3 的 modal('show') 由 jQuery .show() 写入【内联 display:block】，
   其优先级高于本类的 display:flex，导致 flex 居中完全失效、弹窗退回到默认 margin:30px auto
   （表现为"贴着顶栏下方、垂直不居中"）Xdir 修复 20261028 */
#file-info-modal.modal.in {
    display: flex !important;
    align-items: center;
    justify-content: center;
    padding: 20px;
    overflow-y: auto;
    text-align: center;
}
#file-info-modal .modal-dialog.xdir-hash-dialog {
    width: fit-content;      /* 收缩到内容宽度，跟随哈希值长短 */
    width: -webkit-fit-content;
    width: -moz-fit-content;
    min-width: 300px;
    max-width: 96vw;
    margin: 0 auto !important;   /* 覆盖 bootstrap 的 margin:30px auto，实现 flex 内垂直居中 */
    flex: 0 0 auto;
}
#file-info-modal .xdir-hash-dialog .modal-content {
    width: auto;
    min-width: 300px;
    max-width: 92vw;
    display: inline-block;   /* 内容收缩 */
    margin: 0 auto;
}
.xdir-hash-head {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 16px 20px;
    background: linear-gradient(135deg,#2f4258,#1f2d3d);
    color: #fff;
}
.xdir-hash-head .xhm-title { font-size: 16px; font-weight: 600; flex: 1; }
.xdir-hash-head .close { color: #fff; opacity: .85; text-shadow: none; font-size: 22px; }
.xdir-hash-head .close:hover { opacity: 1; }
.xdir-hash-modal .modal-body { padding: 18px 20px 14px; background: #fff; }
.xdir-hash-row {
    display: flex;
    align-items: center;
    justify-content: flex-start;   /* 大小行左对齐 */
    gap: 8px;
    padding: 8px 12px;
    background: #f5f8fb;
    border-radius: 8px;
    margin-bottom: 14px;
}
.xdir-hash-row .xhr-label { color: #8896a8; font-size: 13px; }
.xdir-hash-row .xhr-val { font-weight: 700; color: #303133; font-size: 13px; }
.xdir-hash-block {
    position: relative;
    background: #fafbfc;
    border: 1px solid #eef1f4;
    border-radius: 10px;
    padding: 12px 44px 12px 12px;   /* 左侧 12px，右侧留复制按钮空间 */
    margin-bottom: 10px;
}
.xdir-hash-block .xhb-title {
    font-size: 12px;
    color: #1E9FFF;
    font-weight: 700;
    letter-spacing: .5px;
    margin-bottom: 6px;
    text-align: left;   /* 标题左对齐 */
}
.xdir-hash-block .xhb-val {
    font-family: "Consolas","Monaco",monospace;
    font-size: 12.5px;
    color: #45505e;
    white-space: nowrap;      /* 数值一行显示，不自动换行 */
    overflow-x: auto;
    line-height: 1.5;
    text-align: left;       /* 值左对齐，与标题间隔对齐 */
}
.xdir-hash-copy {
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    width: 30px;
    height: 30px;
    border: 1px solid #e1e6ec;
    background: #fff;
    color: #5b6b7b;
    border-radius: 8px;
    cursor: pointer;
    transition: all .2s ease;
}
.xdir-hash-copy:hover { background: #1E9FFF; color: #fff; border-color: #1E9FFF; }
.xdir-hash-foot { text-align: center; color: #b6c0cb; font-size: 12px; margin-top: 12px; }
.night .xdir-hash-modal .modal-body { background: #16202c; }
.night .xdir-hash-row { background: #1b2735; }
.night .xdir-hash-row .xhr-label { color: #7d8ea0; }
.night .xdir-hash-row .xhr-val { color: #d1d1d1; }
.night .xdir-hash-block { background: #14202c; border-color: #2c3e50; }
.night .xdir-hash-block .xhb-val { color: #9fc4e8; }
.night .xdir-hash-copy { background: #1b2735; border-color: #2c3e50; color: #9fc4e8; }
.night .xdir-hash-copy:hover { background: #1E9FFF; color: #fff; }
.night .xdir-hash-foot { color: #7d8ea0; }

/* ===================== 右上角提醒条 Xdir 增强 20261027 ===================== */
.xdir-reminder {
    position: fixed;
    top: 78px;   /* 导航栏下方，与顶端导航栏保持清晰间隙对齐 */
    right: 16px;
    z-index: 9990;
    display: flex;
    align-items: center;
    gap: 10px;   /* 图标与文字间隙 */
    max-width: 300px;   /* 收缩宽度 */
    padding: 9px 12px;
    background: linear-gradient(135deg,#e64545,#c62828);
    color: #fff;
    border-radius: 8px;
    box-shadow: 0 8px 26px rgba(230,69,69,.35);
    font-size: 12px;
    line-height: 1.5;
    animation: xdir-reminder-in .4s ease;
}
.xdir-reminder .xr-ico { font-size: 16px; flex: 0 0 auto; line-height: 1; display: flex; align-items: center; }
.xdir-reminder .xr-text { flex: 1; line-height: 1.55; }
.xdir-reminder .xr-close { cursor: pointer; opacity: .85; font-size: 14px; padding: 0 2px; flex: 0 0 auto; line-height: 1; }
.xdir-reminder .xr-close:hover { opacity: 1; }
@keyframes xdir-reminder-in { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } }

/* ===================== 搜索横幅（结果直呈列表） Xdir 增强 20261027 ===================== */
.xdir-search-banner {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 16px;
    background: #f1f8ff;
    border-bottom: 1px solid #c8e1ff;
    font-size: 13px;
}
.xdir-search-banner .xsb-key { color: #1E9FFF; font-weight: 600; }
.xdir-search-banner .xsb-count { color: #8896a8; }
.xdir-search-banner .xsb-clear {
    margin-left: auto;
    border: 1px solid #c8e1ff;
    background: #fff;
    color: #1E9FFF;
    border-radius: 6px;
    padding: 3px 10px;
    font-size: 12px;
    cursor: pointer;
    transition: all .2s ease;
}
.xdir-search-banner .xsb-clear:hover { background: #1E9FFF; color: #fff; border-color: #1E9FFF; }
#directory-listing li.xdir-search-empty {
    padding: 34px 20px;
    text-align: center;
    color: #b6c0cb;
    font-size: 14px;
}
.xdir-search-crumb { color: #1E9FFF; font-weight: 600; }
.night .xdir-search-banner { background: #14202c; border-bottom-color: #2c3e50; }
.night .xdir-search-banner .xsb-count { color: #7d8ea0; }
.night .xdir-search-banner .xsb-clear { background: #1b2735; border-color: #2c3e50; color: #6db3ff; }
.night .xdir-search-banner .xsb-clear:hover { background: #1E9FFF; color: #fff; }

/* ===================== 私有分享弹窗 Xdir 增强 20261027 ===================== */
.xdir-share-modal {
    padding: 16px 20px;
    /* 弹窗内容自适应（v2.0.5）：加入密码区 + 二维码后内容变高，
       窄屏/小窗口下会被 layer 的 auto 高度裁掉。这里限制最大高度并允许内部滚动，
       保证「复制带密码链接」「复制密码」「二维码」始终可见可点。 */
    max-height: calc(88vh - 42px);
    overflow-y: auto;
    overscroll-behavior: contain;
}
/* 弹窗内滚动条细一点，不抢视觉 */
.xdir-share-modal::-webkit-scrollbar { width: 8px; }
.xdir-share-modal::-webkit-scrollbar-thumb { background: rgba(140,160,180,.42); border-radius: 4px; }
.xdir-share-modal::-webkit-scrollbar-thumb:hover { background: rgba(140,160,180,.66); }
.xdir-share-modal::-webkit-scrollbar-track { background: transparent; }
.xdir-share-head {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 4px 4px 16px;
    margin-bottom: 16px;
    border-bottom: 1px solid #eef1f4;
}
.xdir-share-head .xsh-ico {
    width: 44px; height: 44px; flex: 0 0 auto;
    border-radius: 12px;
    background: linear-gradient(135deg,#e6f0ff,#d6e8ff);
    color: #1E9FFF; font-size: 20px;
    display: flex; align-items: center; justify-content: center;
}
.xdir-share-head .xsh-info { min-width: 0; }
.xdir-share-head .xsh-name { font-size: 14px; font-weight: 700; color: #303133; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.xdir-share-head .xsh-sub { font-size: 12px; color: #8896a8; margin-top: 3px; }
.xdir-share-field { margin-bottom: 14px; }
.xdir-share-field label { display: block; font-size: 13px; color: #606266; margin-bottom: 6px; font-weight: 600; }
.xdir-share-field label i { color: #1E9FFF; margin-right: 4px; width: 14px; text-align: center; }
.xdir-share-field select, .xdir-share-field input {
    width: 100%;
    height: 36px;
    border: 1px solid #e2e8f0;
    border-radius: 8px;
    padding: 0 10px;
    font-size: 13px;
    box-sizing: border-box;
}
.xdir-share-field select:focus, .xdir-share-field input:focus { outline: none; border-color: #1E9FFF; }
.xdir-share-go {
    width: 100%;
    height: 40px;
    border: none;
    border-radius: 8px;
    background: #1E9FFF;
    color: #fff;
    font-size: 15px;
    cursor: pointer;
    transition: all .2s ease;
}
.xdir-share-go:hover { background: #0d8de8; }
.xdir-share-tip { margin-top: 10px; color: #b6c0cb; font-size: 12px; text-align: center; }
.xdir-share-result { padding: 4px 0; }
.xdir-share-result .xsh-done {
    text-align: center; color: #22a86a; font-size: 15px; font-weight: 700;
    margin-bottom: 14px;
}
.xdir-share-result .xsh-done i { margin-right: 6px; font-size: 18px; }
.xdir-share-row { font-size: 13px; color: #606266; margin-bottom: 12px; }
.xdir-share-row b { color: #1E9FFF; }
.xdir-share-link { display: flex; gap: 8px; }
.xdir-share-link input {
    flex: 1;
    height: 36px;
    border: 1px solid #e2e8f0;
    border-radius: 8px;
    padding: 0 10px;
    font-size: 12px;
    color: #45505e;
}
.xdir-share-link button {
    height: 36px;
    padding: 0 16px;
    border: none;
    border-radius: 8px;
    background: #1E9FFF;
    color: #fff;
    cursor: pointer;
    transition: all .2s ease;
}
.xdir-share-link button:hover { background: #0d8de8; }
.xdir-share-result .xsh-open {
    margin-top: 12px; text-align: center;
}
.xdir-share-result .xsh-open a {
    color: #1E9FFF; font-size: 13px; text-decoration: none;
}
.xdir-share-result .xsh-open a:hover { text-decoration: underline; }
.xdir-share-result .xsh-open i { margin-right: 4px; }

/* ---------- 分享结果：明文密码 / 复制 / 二维码（v2.0.4 新增） ---------- */
.xdir-share-pwd {
    margin: 0 0 12px; padding: 10px 12px;
    background: #f5f9ff; border: 1px solid #e2edfb; border-radius: 10px;
}
.xdir-share-pwd > label {
    display: block; font-size: 12.5px; color: #6b7c8f;
    margin-bottom: 7px; font-weight: 600;
}
.xdir-share-pwd > label i { color: #1E9FFF; margin-right: 4px; }
.xsp-row { display: flex; gap: 8px; }
.xsp-row input {
    flex: 1 1 auto; min-width: 0; height: 34px; border: 1px solid #d8e4f2; border-radius: 8px;
    padding: 0 10px; font-size: 14px; background: #fff; color: #1E9FFF;
    font-family: Consolas, Monaco, monospace; font-weight: 600; letter-spacing: .5px;
}
.xsp-row button {
    flex: 0 0 auto; height: 34px; padding: 0 12px; border: none; border-radius: 8px;
    background: #1E9FFF; color: #fff; font-size: 12.5px; cursor: pointer; white-space: nowrap;
    transition: background .2s ease;
}
.xsp-row button:hover { background: #0d8de8; }
.xsp-row button i { margin-right: 3px; }
.xsp-link {
    margin-top: 8px; width: 100%; height: 32px; border: 1px dashed #b9d6f5; border-radius: 8px;
    background: #fff; color: #1E9FFF; font-size: 12.5px; cursor: pointer;
    transition: all .2s ease;
}
.xsp-link:hover { background: #eaf4ff; border-style: solid; }
.xsp-link i { margin-right: 4px; }

.xdir-share-qr { text-align: center; margin: 14px 0 4px; }
.xsq-box {
    display: inline-block; padding: 8px; background: #fff;
    border: 1px solid #e8eef5; border-radius: 12px; line-height: 0;
    box-shadow: 0 4px 14px rgba(30,159,255,.08);
}
.xsq-box svg { display: block; width: 132px; height: 132px; }
/* 矮屏（笔记本/分屏）下二维码自动缩小，避免挤出可视区 */
@media (max-height: 760px) {
    .xsq-box svg { width: 108px; height: 108px; }
    .xdir-share-qr { margin: 10px 0 2px; }
}
.xsq-tip { margin-top: 7px; font-size: 12px; color: #90a0b2; }
.xsq-tip i { color: #1E9FFF; margin-right: 3px; vertical-align: -1px; }
.xsq-na { padding: 20px; color: #b6c0cb; font-size: 12px; }

.night .xdir-share-pwd { background: #1b2634; border-color: #2a3b4f; }
.night .xdir-share-pwd > label { color: #9fb2c6; }
.night .xsp-row input { background: #16202c; border-color: #2c3e50; color: #6db3ff; }
.night .xsp-link { background: #16202c; border-color: #2f4a68; color: #6db3ff; }
.night .xsp-link:hover { background: #1d2b3b; }
.night .xsq-box { background: #fff; border-color: #2a3b4f; }
.night .xsq-tip { color: #7f92a6; }

/* ===================== 私有分享弹窗 · 暗黑适配 Xdir 20261029 =====================
   原来 .xdir-share-field select/input 只设了边框与内边距，未设背景与文字色，
   暗黑下沿用浏览器默认（浅灰底 + 深色字），与深色弹窗背景严重不搭；
   下拉 option 在部分浏览器也沿用系统浅色。此处全部显式指定深色系。 */
.night .xdir-share-head { border-bottom-color: #2c3e50; }
.night .xdir-share-head .xsh-ico { background: linear-gradient(135deg,#1b2f45,#16283c); color: #6db3ff; }
.night .xdir-share-head .xsh-name { color: #e6eef7; }
.night .xdir-share-head .xsh-sub { color: #8ba0b6; }
.night .xdir-share-field label { color: #b6c4d4; }
.night .xdir-share-field label i { color: #6db3ff; }
/* 核心：输入框与下拉框显式深色底 + 浅色字（否则浅灰底 / 深字在深弹窗里很突兀） */
.night .xdir-share-field select,
.night .xdir-share-field input {
    background-color: #16202c !important;
    color: #d5dce6 !important;
    border-color: #2c3e50 !important;
    color-scheme: dark;                 /* 让浏览器原生下拉箭头/选项也走深色 */
}
.night .xdir-share-field select:focus,
.night .xdir-share-field input:focus {
    border-color: #1E9FFF !important;
    background-color: #182634 !important;
}
/* 下拉选项：Chrome 支持给 option 直接上色；其它浏览器由 color-scheme:dark 兜底 */
.night .xdir-share-field select option {
    background-color: #16202c;
    color: #d5dce6;
}
.night .xdir-share-field input::placeholder { color: #6b7c8c; }
.night .xdir-share-go { background: #1E9FFF; }
.night .xdir-share-go:hover { background: #3aa9ff; }
.night .xdir-share-tip { color: #7d8ea0; }
.night .xdir-share-row { color: #b6c4d4; }
.night .xdir-share-row b { color: #6db3ff; }
.night .xdir-share-link input {
    background-color: #16202c !important;
    color: #9fc4e8 !important;
    border-color: #2c3e50 !important;
    color-scheme: dark;
}
.night .xdir-share-result .xsh-open a { color: #6db3ff; }

/* ===================== 暗黑 · 全局表单控件兜底 Xdir 20261029 =====================
   凡是没有单独写暗黑样式的 input/select/textarea（各弹窗、后台搜索框等），
   默认会沿用浏览器浅色底 + 深字，在深色面板上会显得突兀甚至看不清。
   这里统一兜底为深色底 + 浅色字；有专门样式的组件（如 .xdir-share-field）特异性更高，不受影响。
   color-scheme: dark 让原生下拉箭头、日期选择器等也走深色，避免冒出白色小三角。 */
.night input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="range"]),
.night select,
.night textarea {
    background-color: #16202c;
    color: #d5dce6;
    border-color: #2c3e50;
    color-scheme: dark;
}
.night select option { background-color: #16202c; color: #d5dce6; }
.night input::placeholder,
.night textarea::placeholder { color: #6b7c8c; }

/* ===================== 暗黑 · layer 弹窗容器 Xdir 20261029 =====================
   layui 主样式由 JS 动态注入，默认 `.layui-layer{background:#fff;color:#000}`，
   暗黑下弹窗一直是一块纯白底 —— 这才是分享弹窗「文字与背景不搭」的根源
   （白底 + 我们新设的深色输入框 / 深色文字，都会显得割裂）。
   这里把弹窗容器整体转深色，标题栏与关闭按钮一并适配。 */
.night .layui-layer {
    background-color: #18222e !important;
    color: #d5dce6 !important;
    box-shadow: 0 10px 40px rgba(0,0,0,.6) !important;
}
.night .layui-layer-title {
    background-color: #14202c !important;
    color: #e6eef7 !important;
    border-bottom: 1px solid #2c3e50 !important;
}
.night .layui-layer-content { color: #d5dce6; }
.night .layui-layer-btn { border-top-color: #2c3e50; background-color: #18222e; }
.night .layui-layer-btn a {
    background-color: #1b2735 !important;
    border-color: #2c3e50 !important;
    color: #9fc4e8 !important;
}
.night .layui-layer-btn a.layui-layer-btn0 {
    background-color: #1E9FFF !important;
    border-color: #1E9FFF !important;
    color: #fff !important;
}
/* 右上角 最小化/最大化/关闭 */
.night .layui-layer-setwin a { color: #9fb0c3; }
.night .layui-layer-setwin a:hover { color: #fff; }
/* 遮罩层加深 */
.night .layui-layer-shade { background-color: #0b1017 !important; opacity: .62 !important; }

/* ===================== 批量大小显示 Xdir 增强 20261027 ===================== */
.xdir-bulk-size { color: #1E9FFF; font-size: 12px; font-weight: 600; }

/* ===================== 顶栏控制按钮悬停增强 Xdir 增强 20261027 ===================== */
.xdir-ctrl-btn { box-shadow: 0 2px 8px rgba(20,40,80,.06); }
.xdir-ctrl-btn:hover {
    background: #fff;
    border-color: #1E9FFF;
    color: #1E9FFF;   /* 图标静态，仅保留高亮背景/边框/颜色（取消上浮） Xdir 20261028 */
    box-shadow: 0 6px 18px rgba(30,159,255,.22);
}
/* 列表功能区按钮悬停上浮 */
/* 列表功能区按钮悬停：只换底色，不位移、不加投影 Xdir 20261029
   原来这里是 translateY(-2px) + 一圈 0 6px 16px 青绿投影：
   · 位移让图标落在小数像素上，字发虚；
   · 投影叠在行悬停的投影之上，两层青绿光在暗黑深底上糊成一团 —— 即用户反馈的「阴影重叠」。
   底色本身也换掉：浅色用稍深的青绿 #00957e（原来 #00a58c 偏亮），
   暗黑则交给下面的规则改成品牌蓝，与平铺视图按钮一致。 */
#directory-listing .layui-hide-xs-info a.layui-btn-info:hover {
    background-color: #00957e;
}
.night #directory-listing.view-list .layui-hide-xs-info a.layui-btn-info:hover {
    background-color: #1E9FFF;
    border-color: #1E9FFF;
    color: #fff;
}
/* 顶栏搜索框悬停 */
.search-wrap #globalSearch:hover { border-color: #c8e1ff; background: #fff; }

/* 代码块复制按钮样式（copy.js 重构） */
.xdir-code-copy {
    position: absolute;
    right: 12px;
    top: 2px;
    background: #fff;
    padding: 2px 10px;
    margin: 8px;
    border-radius: 4px;
    cursor: pointer;
    z-index: 9999;
    box-shadow: 0 2px 4px rgba(0,0,0,.05);
    font-size: 12px;
    color: #5b6b7b;
    transition: all .2s ease;
}
.xdir-code-copy:hover { color: #1E9FFF; }

/* ===================== 顶栏导航/按键悬停效果 Xdir 增强 20261027 ===================== */
/* 站名/LOGO 链接悬停
   ★ v2.0.13 修复「刷新时品牌区抖动」的根因：
     这里原本是 `#page-navbar .shiyu a { display: inline-block }`，特异性 1,1,1，
     而品牌链接 `.xdir-brand` 的 `display: inline-flex`（1,1,0）在那之前声明 → 被压掉。
     于是首帧品牌链接是 inline-block：align-items:center 完全失效，logo / 站名 / 徽章
     退回基线对齐（徽章贴在文字基线上）；等 xdir-enhance.js 在 DOMContentLoaded 后
     写入内联 display:inline-flex，三者才跳到 flex 居中的正确位置 —— 这就是眼睛看到的
     「徽章和站标+logo 抖一下」。现用 :not() 把品牌链接排除在外，让 CSS 首帧即终态，
     JS 不再需要写任何内联样式。 */
#page-navbar .navbar-text a:not(.xdir-brand),
#page-navbar .shiyu a:not(.xdir-brand) {
    display: inline-block;
    transition: color .2s ease, transform .2s ease, text-shadow .2s ease;
}
#page-navbar .navbar-text a:not(.xdir-brand):hover,
#page-navbar .shiyu a:not(.xdir-brand):hover {
    color: #1E9FFF !important;   /* 图标静态，仅保留高亮颜色（取消上浮与发光） Xdir 20261028 */
}
/* 面包屑紧凑布局（保留 HTML 内联分隔符 + 防止 inline-block 间隙导致拉宽） */
#navigation .dangqian p { font-size: 0; line-height: 1.7; text-indent: 0; }  /* 局部重置首行缩进：避免全局 p{text-indent:28px} 使面包屑右移、悬停下划线多出宽度（不动 bootstrap.min.css 全局，保护其他正文缩进） */
#navigation .dangqian a,
#navigation .dangqian .xdir-crumb-current,
#navigation .dangqian .xdir-cur-label,
#navigation .dangqian .copy-link { font-size: 13px; display: inline-block; vertical-align: middle; }
#navigation .dangqian a,
#navigation .dangqian .xdir-cur-label { color: #606266; }
#navigation .dangqian .xdir-crumb-current { color: #303133; font-weight: 600; }
#navigation .dangqian .xdir-cur-label { color: #909399; }      /* 不再设 margin-right，避免「当前位置：」后多余间隙 */
/* 内联分隔符「/」（HTML 内联写入，悬停不变）；两侧对称间距为分隔本身所需，不叠加到相邻元素 */
#navigation .dangqian .xdir-sep { font-size: 13px; color: #c0c4cc; margin: 0 5px; display: inline-block; vertical-align: middle; }  /* 与文本同一对齐基准，避免斜杠与文本垂直错位 */
/* 复制图标：不设 margin-left，间距由斜线右间距提供，避免与斜线左侧间距叠加产生图标前多余空白 */
#navigation .dangqian .copy-link { color: #909399; }
/* 面包屑「复制」按键悬停气泡（Xdir 20261105 / 补充·右侧箭头）：与后台「返回站点」链接气泡同款
   —— 深色文字框 #1f2d3d + 左指小三角，在按键右侧弹出；用 data-mtip 取代原生 title，避免双重提示。
   选用「右侧弹出」而非「上方/下方弹出」：面包屑位于页面顶部，右侧弹出既不被视口顶端裁切，也不压住相邻元素。 */
#navigation .dangqian .copy-link { position: relative; }
#navigation .dangqian .copy-link[data-mtip]::after {
  content: attr(data-mtip);
  position: absolute; top: 50%; left: calc(100% + 13px);
  transform: translateY(-50%) translateX(4px);
  white-space: nowrap; background: #1f2d3d; color: #fff;
  font-size: 12px; line-height: 1.4; font-weight: 400;
  padding: 6px 10px; border-radius: 6px;
  box-shadow: 0 4px 12px rgba(20,40,80,.22);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .16s ease, transform .16s ease, visibility .16s; z-index: 30;
}
#navigation .dangqian .copy-link[data-mtip]::before {
  content: ""; position: absolute; top: 50%; left: calc(100% + 1px);
  transform: translateY(-50%) translateX(4px);
  border: 6px solid transparent; border-right-color: #1f2d3d;   /* 左指小三角，指向按键 */
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .16s ease, transform .16s ease, visibility .16s; z-index: 30;
}
#navigation .dangqian .copy-link[data-mtip]:hover::after,
#navigation .dangqian .copy-link[data-mtip]:hover::before { opacity: 1; visibility: visible; transform: translateY(-50%) translateX(0); }
/* 面包屑导航链接悬停 */
#navigation .dangqian a {
    display: inline-block;
    transition: color .2s ease, transform .2s ease;
}
#navigation .dangqian a:hover {
    color: #1E9FFF !important;
    text-decoration: underline;          /* 用文字下划线替代 border-bottom，不撑高盒子，避免悬停错位/多出宽度 */
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
}
#navigation .dangqian a .copy-yd { transition: color .2s ease, transform .2s ease; }
#navigation .dangqian a:hover .copy-yd { color: #1E9FFF; transform: scale(1.15); }
/* 公告栏链接悬停 */
.announcement a {
    transition: color .2s ease, border-bottom-color .2s ease;
}
.announcement a:hover { color: #1E9FFF !important; border-bottom-color: #1E9FFF; }
/* 顶栏控制按钮（视图/主题/后台）悬停增强：蓝色填充 + 白图标，变化明显 */
.xdir-ctrl-btn {
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    transition: all .22s ease;
}
.xdir-ctrl-btn:hover {
    background: #1E9FFF !important;
    border-color: #1E9FFF !important;
    color: #fff !important;   /* 图标静态，仅保留高亮填充（取消上浮） Xdir 20261028 */
    box-shadow: 0 8px 20px rgba(30,159,255,.4);
}
.xdir-ctrl-btn:hover i { color: #fff !important; }
.xdir-ctrl-btn:active { transform: scale(.92); }

/* ===================== 文字悬停展示效果（统一浮动气泡，智能上下/左右定位 + 箭头，顶部优先级） Xdir 20261027 ===================== */
#xdirTip {
    position: fixed;
    z-index: 2147482500;      /* 顶部优先级：高于 layer 弹窗(19891014)、列表 overflow 与图片预览(6000)，低于 toast */
    max-width: 260px;
    padding: 7px 12px;
    background: #111827;       /* 明亮模式气泡：恢复早期深色 #111827（Xdir 第十七批 #6） */
    color: #fff;
    font-size: 12.5px;
    line-height: 1.5;
    border-radius: 9px;
    /* drop-shadow 会跟随「气泡 + 三角伪元素」的合并轮廓投影，二者真正一体（无边框/阴影割裂） */
    -webkit-filter: drop-shadow(0 6px 18px rgba(0,0,0,.28));
    filter: drop-shadow(0 6px 18px rgba(0,0,0,.28));
    pointer-events: none;
    opacity: 0;
    transition: opacity .14s ease;
    word-break: break-word;
}
#xdirTip.show { opacity: 1; }
#xdirTip .xdir-tip-text { display: block; }
/* 箭头 = 纯 CSS 三角（与气泡同色、共享 drop-shadow，无圆角方块割裂）
   方向由 tip-down / tip-up / tip-left 控制，始终精确指向触发元素（Xdir 第十六批 #1） */
#xdirTip::after {
    content: '';
    position: absolute;
    width: 0;
    height: 0;
    border: 6px solid transparent;
    left: var(--ax, 50%);
    margin-left: -6px;        /* 水平方向以 --ax 为三角中心，精确指向触发元素 */
}
#xdirTip.tip-down::after { top: 100%;    bottom: auto; border-top-color: #111827; }                /* 气泡在上，箭头指向下方 */
#xdirTip.tip-up::after   { bottom: 100%; top: auto;    border-bottom-color: #111827; }              /* 气泡在下，箭头指向上方 */
#xdirTip.tip-left::after { left: auto; right: 100%; margin-left: 0; top: var(--ay, 50%); margin-top: -6px; border-right-color: #111827; } /* 气泡在右，箭头指向左 */
/* 暗黑模式适配：气泡与箭头保留炭灰 #4E5358（Xdir 第十七批 #6） */
.night #xdirTip { background: #4E5358; }
.night #xdirTip.tip-down::after { border-top-color: #4E5358; }
.night #xdirTip.tip-up::after   { border-bottom-color: #4E5358; }
.night #xdirTip.tip-left::after { border-right-color: #4E5358; }
/* 暗黑模式顶栏悬停适配 */
.night #page-navbar .navbar-text a:hover,
.night #page-navbar .shiyu a:hover,
.night #navigation .dangqian a:hover { color: #6db3ff; }
.night .xdir-ctrl-btn:hover { background: #1E9FFF !important; border-color: #1E9FFF !important; color: #fff !important; }
.night .xdir-ctrl-btn:hover i { color: #fff !important; }

/* ===================== layer 弹窗右上角控制键（最小化/最大化/关闭）UI 重构 Xdir 20261027 ===================== */
/* 覆盖默认精灵图小图标：圆角半透明按钮 + 纯 CSS 图形，悬停蓝色高亮（关闭键红色） */
.layui-layer-setwin {
    top: 12px !important;
    right: 12px !important;
    display: flex !important;
    align-items: center;
    gap: 8px;
    z-index: 10;
}
.layui-layer-setwin a {
    position: relative;
    width: 26px !important;
    height: 26px !important;
    margin-left: 0 !important;
    border-radius: 8px;
    background: rgba(20, 26, 34, .42) !important;
    background-image: none !important;   /* 弃用精灵图 */
    box-shadow: 0 1px 4px rgba(0,0,0,.18);
    transition: background .18s ease, transform .18s ease, box-shadow .18s ease;
    cursor: pointer;
    box-sizing: border-box;
    outline: none;            /* 去掉弹窗右上角按键点击后的持久焦点外边框 Xdir v2.0.19 */
}
.layui-layer-setwin a:focus, .layui-layer-setwin a:active { outline: none !important; }
/* 标题栏右侧为「最小化 / 最大化 / 关闭」三枚按钮预留空间，避免长文件名（office 预览）与按钮重叠。
   实测占用 = right 12 + 按钮 26×3 + 间距 8×2 = 106px，再留 10px 余量 → 116px。
   layer 默认 padding-right 仅 80px，不够用 Xdir v2.0.19 rev.n */
.layui-layer-title { padding-right: 116px !important; }
/* 移动端 layui 弹窗标题栏适配：标题与控制键不重叠、关闭键不被裁切 Xdir 20261101 */
@media (max-width: 640px) {
    /* 移动端按钮 22px：8 + 22×3 + 8×2 = 90px，留 6px 余量 → 96px */
    .layui-layer-title { padding-right: 96px !important; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    /* 关闭键（含最小化/最大化）固定回标题栏右上角（与桌面端一致），
       不再垂直居中 —— 否则会压到图片预览右侧的翻页箭头（.pv-nav.next 在 top:50% 处），
       同时修复视频/文档/PDF 等所有 layui 预览弹窗在移动端的关闭键错位 Xdir 20261102 */
    .layui-layer-setwin { top: 12px !important; right: 8px !important; }
    .layui-layer-setwin a { width: 22px; height: 22px; }
}
.layui-layer-setwin a:hover {
    background: #1E9FFF !important;
    transform: translateY(-1px);
    box-shadow: 0 3px 10px rgba(30,159,255,.45);
    opacity: 1 !important;
}
/* 最小化：底部横杠 */
.layui-layer-setwin .layui-layer-min cite { display: none !important; }
.layui-layer-setwin .layui-layer-min::after {
    content: '';
    position: absolute;
    left: 50%; top: 50%;
    width: 12px; height: 2px;
    margin: 4px 0 0 -6px;   /* 横杠偏下，符合最小化语义 */
    background: #fff;
    border-radius: 1px;
}
/* 最大化：空心方框 */
.layui-layer-setwin .layui-layer-max::after {
    content: '';
    position: absolute;
    left: 50%; top: 50%;
    width: 10px; height: 10px;
    margin: -6px 0 0 -6px;
    border: 2px solid #fff;
    border-radius: 2px;
    box-sizing: border-box;
}
/* 还原（最大化后再点）：双层错位方框 */
.layui-layer-setwin .layui-layer-maxmin::before,
.layui-layer-setwin .layui-layer-maxmin::after {
    content: '';
    position: absolute;
    border: 2px solid #fff;
    border-radius: 2px;
    box-sizing: border-box;
}
.layui-layer-setwin .layui-layer-maxmin::before {
    left: 50%; top: 50%;
    width: 9px; height: 9px;
    margin: -4px 0 0 -8px;
    background: transparent;
}
.layui-layer-setwin .layui-layer-maxmin::after {
    left: 50%; top: 50%;
    width: 9px; height: 9px;
    margin: -8px 0 0 -4px;
    background: inherit;
}
/* 关闭：× 叉（两条旋转线），悬停红色 + 旋转动画
   注意：layui 默认关闭键实际类名是 .layui-layer-close1（见 layer.css），
   原样式只命中 .layui-layer-close 导致关闭键只剩深色圆底、无叉号（看起来像黑点）。
   这里同时命中 .layui-layer-close 与 .layui-layer-close1，彻底修复 Xdir 修复 20261101 */
.layui-layer-setwin .layui-layer-close::before,
.layui-layer-setwin .layui-layer-close::after,
.layui-layer-setwin .layui-layer-close1::before,
.layui-layer-setwin .layui-layer-close1::after {
    content: '';
    position: absolute;
    left: 50%; top: 50%;
    width: 13px; height: 2px;
    margin: -1px 0 0 -6.5px;
    background: #fff;
    border-radius: 1px;
    transition: transform .18s ease;
}
.layui-layer-setwin .layui-layer-close::before,
.layui-layer-setwin .layui-layer-close1::before { transform: rotate(45deg); }
.layui-layer-setwin .layui-layer-close::after,
.layui-layer-setwin .layui-layer-close1::after { transform: rotate(-45deg); }
.layui-layer-setwin .layui-layer-close:hover,
.layui-layer-setwin .layui-layer-close1:hover {
    background: #e64545 !important;
    box-shadow: 0 3px 10px rgba(230,69,69,.45);
}
.layui-layer-setwin .layui-layer-close:hover::before,
.layui-layer-setwin .layui-layer-close1:hover::before { transform: rotate(135deg); }
.layui-layer-setwin .layui-layer-close:hover::after,
.layui-layer-setwin .layui-layer-close1:hover::after { transform: rotate(45deg); }

/* ===================== 全局滚动条：细条 · 淡显 · 淡消 Xdir 20261029 =====================
   目标：把浏览器默认那根又粗又黑的滚动条换成 6px 细条，平时几乎不可见，
   滚动时淡出一档、停止后分两级「淡消」退回透明。

   为什么用三段式而不是 CSS transition：
   Chromium 不支持对 ::-webkit-scrollbar-thumb 的 background-color 做过渡
   （实测加 transition 后颜色仍是瞬间跳变），所以「淡」只能用分级色阶 + JS 定时降级来实现：
     · 滚动中        .xd-sb-a  → 38% 不透明度，看得清位置
     · 停下 340ms    .xd-sb-b  → 18% 不透明度，明显变淡（第一级「淡消」）
     · 停下 1080ms   （无类）  → 完全透明，细条隐入背景（第二级「淡消」）
   类名挂在**实际滚动的那个容器**上，所以页面滚动只亮页面滚动条、
   预览正文滚动只亮正文滚动条，互不干扰。 */

/* Chromium / Edge / Safari */
*::-webkit-scrollbar {
    width: 6px;
    height: 6px;
    background: transparent;
}
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-corner { background: transparent; }
/* 默认完全透明：不滚动时滚动条「不存在」 */
*::-webkit-scrollbar-thumb {
    background-color: transparent;
    border-radius: 99px;
    /* 两端各收 1px，细条不贴边、转角不顶死 */
    border: 1px solid transparent;
    background-clip: content-box;
}
/* 滚动中：主色 */
.xd-sb-a::-webkit-scrollbar-thumb,
.xd-sb-a::-webkit-scrollbar-thumb:vertical,
.xd-sb-a::-webkit-scrollbar-thumb:horizontal {
    background-color: rgba(110, 132, 156, .38);
}
/* 停手后的第一级淡出 */
.xd-sb-b::-webkit-scrollbar-thumb,
.xd-sb-b::-webkit-scrollbar-thumb:vertical,
.xd-sb-b::-webkit-scrollbar-thumb:horizontal {
    background-color: rgba(110, 132, 156, .18);
}
/* 鼠标直接悬停滚动条本身时给足可见度（不是滚动，只是要抓拖） */
*::-webkit-scrollbar-thumb:hover { background-color: rgba(110, 132, 156, .56) !important; }

/* 暗黑：冷调蓝灰，避免白条扎眼
   注意 `.night .xd-sb-a` 是后代选择器，匹配不到「同一个元素既是 .night 又是 .xd-sb-a」的情况
   （暗黑主题类恰好挂在 body 上，而脚本给页面级滚动条加的类也挂在 body 上）。
   所以每档都要补一条复合形式 `.night.xd-sb-a`，否则暗黑下会退回浅色那套灰。 */
.night .xd-sb-a::-webkit-scrollbar-thumb,
.night .xd-sb-a::-webkit-scrollbar-thumb:vertical,
.night .xd-sb-a::-webkit-scrollbar-thumb:horizontal,
.night.xd-sb-a::-webkit-scrollbar-thumb,
.night.xd-sb-a::-webkit-scrollbar-thumb:vertical,
.night.xd-sb-a::-webkit-scrollbar-thumb:horizontal { background-color: rgba(150, 178, 205, .42); }
.night .xd-sb-b::-webkit-scrollbar-thumb,
.night .xd-sb-b::-webkit-scrollbar-thumb:vertical,
.night .xd-sb-b::-webkit-scrollbar-thumb:horizontal,
.night.xd-sb-b::-webkit-scrollbar-thumb,
.night.xd-sb-b::-webkit-scrollbar-thumb:vertical,
.night.xd-sb-b::-webkit-scrollbar-thumb:horizontal { background-color: rgba(150, 178, 205, .20); }
.night *::-webkit-scrollbar-thumb:hover,
.night.xd-sb-a::-webkit-scrollbar-thumb:hover { background-color: rgba(150, 178, 205, .62) !important; }

/* Firefox：标准属性（Chrome 只要设置了 scrollbar-color 就会忽略 ::-webkit-* 那套，
   所以这里用 @supports 只在 Gecko 上生效，绝不影响 Chromium 的三段式淡出） */
@supports (-moz-appearance: none) {
    * {
        scrollbar-width: thin;
        scrollbar-color: rgba(110, 132, 156, .32) transparent;
    }
    .night * { scrollbar-color: rgba(150, 178, 205, .34) transparent; }
}

/* 系统开启「减少动态」时不做淡出，直接常显细条，避免反复闪烁 */
@media (prefers-reduced-motion: reduce) {
    .xd-sb-a::-webkit-scrollbar-thumb,
    .xd-sb-b::-webkit-scrollbar-thumb { background-color: rgba(110, 132, 156, .30) !important; }
}

/* ===================== 文件索引页 / 搜索页（v2.0.5 统一外壳后） ===================== */
.xdir-index-page, .xdir-search-page { padding-top: 6px; }

.xdir-idx-head {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px 16px;
    margin: 10px 0 16px; padding-bottom: 12px;
    border-bottom: 1px solid #e6ecf3;
}
.xdir-idx-title { font-size: 20px; font-weight: 700; margin: 0; color: #303133; }
.xdir-idx-title i { color: #1E9FFF; margin-right: 6px; }
.xdir-idx-meta { display: flex; align-items: center; gap: 14px; font-size: 12.5px; color: #909399; }
.xdir-idx-meta i { margin-right: 4px; }
.xdir-idx-clear {
    display: inline-flex; align-items: center; gap: 4px;
    padding: 4px 11px; border-radius: 6px; font-size: 12.5px;
    background: #f0f4f9; color: #5b6b7b; text-decoration: none !important;
    transition: all .18s ease;
}
.xdir-idx-clear:hover { background: #e2e9f2; color: #1E9FFF; }
.xdir-idx-body {
    background: #fff; border: 1px solid #e6ecf3; border-radius: 14px;
    padding: 18px 22px; box-shadow: 0 8px 26px rgba(20,40,80,.06);
}
.xdir-idx-body .xdir-idx { margin: 0; padding-left: 16px; list-style: none; }
/* 嵌套层级：左侧虚线缩进引导线，呈现清晰的树状结构 */
.xdir-idx-body .xdir-idx .xdir-idx {
    padding-left: 22px; margin-left: 4px;
    border-left: 1px dashed #d6e0ec;
}
.xdir-idx-body .xdir-idx li { line-height: 2.05; font-size: 13.5px; position: relative; }
.xdir-idx-body .xdir-idx i.fa {
    color: #1E9FFF; margin-right: 6px; width: 16px; text-align: center;
    transition: color .15s ease;
}

/* 索引条目悬停（v2.0.6 初版 / v2.0.18 修「重复下划线」）：
   反馈用「变蓝 + 浅蓝底 + 底线」三重提示，其中**底线只用 border-bottom 一条**。
   ★ v2.0.18 修复：这里曾同时写 `border-bottom-color:#1E9FFF` 和 `text-decoration:underline`，
     两条线一条在文字基线下、一条在盒子底部，垂直错开约 3px，看起来就是「双重下划线」。
     现统一由 border-bottom 承担；text-decoration 在链接**任何状态**都强制 none，
     既清掉重复的那条，也挡住 bootstrap 的 `a,a:visited{text-decoration:underline}`
     与 `a:focus,a:hover{text-decoration:underline}`（见 bootstrap.min.css）。 */
.xdir-idx-body .xdir-idx a {
    color: #5b6b7b;
    text-decoration: none !important;
    display: inline; padding: 2px 7px; border-radius: 6px;
    border-bottom: 1px solid transparent;
    transition: color .15s ease, background .15s ease, border-color .15s ease;
    word-break: break-all;
}
.xdir-idx-body .xdir-idx a:hover,
.xdir-idx-body .xdir-idx a:focus,
.xdir-idx-body .xdir-idx a:active,
.xdir-idx-body .xdir-idx a:visited {
    color: #1E9FFF;
    background: #f0f7ff;
    border-bottom-color: #1E9FFF;
    text-decoration: none !important;   /* 关键：去掉与 border-bottom 重复的那条下划线 */
}
/* 目录名（非链接）：同样给悬停反馈，避免「只有文件能点」的割裂感 */
.xdir-idx-body .xdir-idx li > b {
    display: inline-block;
    padding: 2px 7px; border-radius: 6px;
    color: #303133; font-weight: 600;
    border-bottom: 1px solid transparent;
    transition: color .15s ease, background .15s ease;
    cursor: default;
}
.xdir-idx-body .xdir-idx li:hover > b { color: #1E9FFF; background: #f0f7ff; }
.xdir-idx-body .xdir-idx li:hover > i.fa.fa-folder-open { color: #0d8de8; }
.xdir-idx-end { text-align: center; color: #c0c8d4; font-size: 12px; margin-top: 14px; }

.xdir-search-head { margin: 12px 0 16px; }
.xdir-search-kw {
    display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
    font-size: 15px; color: #303133;
}
.xdir-search-kw > i { color: #1E9FFF; }
.xsk-label { font-weight: 600; }
.xsk-word { color: #e64545; font-weight: 700; }
.xsk-count {
    margin-left: 6px; font-size: 12px; color: #5b6b7b;
    background: #f0f4f9; padding: 2px 9px; border-radius: 10px;
}
.xdir-search-tip { margin: 8px 0 0; font-size: 12.5px; color: #a0aab6; }
.xdir-search-body { background: #fff; border: 1px solid #cfd0d1; border-radius: 12px; overflow: hidden; }
.xdir-search-table { margin: 0 !important; }
.xdir-search-table td.xs-file { white-space: nowrap; }
.xdir-search-table td.xs-file i { color: #1E9FFF; margin-right: 5px; flex: 0 0 auto; }
.xdir-search-table td.xs-file a.preview {
    color: #303133; text-decoration: none;
    display: inline-block; max-width: min(70vw, 680px);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom;
}
.xdir-search-table td.xs-file a.preview:hover { color: #1E9FFF; text-decoration: none !important; }
.xs-op {
    display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; border-radius: 6px;
    background: #f0f4f9; color: #5b6b7b; text-decoration: none !important;
    transition: all .18s ease;
}
.xs-op:hover { background: #1E9FFF; color: #fff; }

/* 统一空态（索引/搜索等独立页共用） */
.xdir-page-empty {
    padding: 56px 20px; text-align: center; color: #b6c0cb;
    background: #fff; border: 1px solid #e6ecf3; border-radius: 12px;
}
.xdir-page-empty .xpe-ico { font-size: 34px; opacity: .5; margin-bottom: 12px; }
.xdir-page-empty .xpe-t { font-size: 15px; color: #8d99a6; margin-bottom: 6px; }
.xdir-page-empty .xpe-s { font-size: 13px; }

/* 暗黑适配 */
.night .xdir-idx-head { border-bottom-color: #2c3e50; }
.night .xdir-idx-title { color: #dfe7ef; }
.night .xdir-idx-clear { background: #1b2735; color: #9fb2c6; }
.night .xdir-idx-clear:hover { background: #223040; color: #6db3ff; }
.night .xdir-idx-body { background: #16202c; border-color: #2c3e50; }
.night .xdir-idx-body .xdir-idx a { color: #cfdae6; }
.night .xdir-idx-body .xdir-idx a:hover,
.night .xdir-idx-body .xdir-idx a:focus { color: #6db3ff; background: #17293d; border-bottom-color: #6db3ff; text-decoration: none !important; }
.night .xdir-idx-body .xdir-idx li:hover > b { color: #6db3ff; background: #17293d; }
.night .xdir-search-kw { color: #dfe7ef; }
.night .xsk-count { background: #1b2735; color: #9fb2c6; }
.night .xdir-search-tip { color: #7c8b9c; }
.night .xdir-search-body { background: #16202c; border-color: #2c3e50; }
.night .xdir-search-table td.xs-file a { color: #cfdae6; }
.night .xdir-search-table td.xs-file a:hover { color: #6db3ff; text-decoration: none !important; }
.night .xs-op { background: #1b2735; color: #9fb2c6; }
.night .xs-op:hover { background: #1E9FFF; color: #fff; }
.night .xdir-page-empty { background: #16202c; border-color: #2c3e50; color: #6b7683; }

@media (max-width: 700px) {
    .xdir-idx-title { font-size: 17px; }
    .xdir-idx-head { gap: 8px; }
    .xdir-idx-body { padding: 10px 12px; }
    .xdir-index-page, .xdir-search-page { padding-left: 4px; padding-right: 4px; }
    .xdir-search-kw { font-size: 14px; }
}

/* ===================== 独立页（文件索引 / 搜索）页脚精确贴底 v2.0.6 =====================
   背景：这些页面的内容往往只有几行（搜索到 1 个结果、索引条目很少），
        `position:sticky` 在「文档不高于视口」时不会黏底，页脚会停在内容下方、
        下面留一大片空白；而 min-height 计算又没算上容器顶部偏移，
        反而多出十来像素、把末行压到页脚底下。
   做法：仅对带 .xdir-standalone 的 body 用弹性列布局 ——
        #page-content 撑满剩余高度、页脚 margin-top:auto 永远贴在底部。
        首页不使用该 class，因此不会重现 v2.0.2 的 body flex 布局回归。 */
body.xdir-standalone {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
body.xdir-standalone #page-content {
    flex: 1 0 auto;
    min-height: 0;              /* 交给 flex 撑高，避免与 min-height 计算打架 */
}
body.xdir-standalone .footer-dibu {
    /* 页脚全站统一用 fixed 锁定（见 .footer-dibu）。
       fixed 元素脱流、不是 flex item，所以 margin-top:auto 已无意义，归零即可；
       内容区底部预留由 #page-content 的 padding-bottom 负责。 */
    position: fixed;
    margin-top: 0;
}

/* ===================== 搜索空态居中修正（v2.0.7） =====================
   背景：全站搜索无结果时，把 <li class="xdir-search-empty"> 插入 #directory-listing。
   但列表本身的 `#directory-listing li` 是 ID + 元素选择器（优先级 1,0,1），
   远高于 `.xdir-search-empty`（0,1,0）——于是 display:flex 用了列表的「横向排布」，
   图标被挤到最左边、文字跟在右侧，看起来像「图标靠左没居中」。
   这里用同等级的 ID 选择器覆盖，恢复纵向居中。 */
#directory-listing > li.xdir-search-empty {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    text-align: center !important;
    width: 100% !important;
    padding: 44px 16px !important;
    border: none !important;
    background: none !important;
    list-style: none !important;
    min-height: 220px;
}
#directory-listing > li.xdir-search-empty .xse-icon {
    margin: 0 auto 4px;
}
#directory-listing > li.xdir-search-empty .xse-text,
#directory-listing > li.xdir-search-empty .xse-sub {
    width: 100%;
    text-align: center;
}
.night #directory-listing > li.xdir-search-empty .xse-icon { background: #1b2735; color: #6db3ff; }
.night #directory-listing > li.xdir-search-empty .xse-text { color: #cfdae6; }
.night #directory-listing > li.xdir-search-empty .xse-sub { color: #7c8b9c; }

/* 搜索结果页：多个操作按钮之间留间距（复制链接 / 新窗口打开） */
.xdir-search-table td.xs-ops { white-space: nowrap; }
.xdir-search-table td.xs-ops .xs-op + .xs-op { margin-left: 6px; }

/* 搜索页顶部索引状态说明：链接不加下划线，悬停仅变色（Xdir 20261119） */
.xdir-search-tip a { color: #1E9FFF; text-decoration: none; }
.xdir-search-tip a:hover { color: #0d8de8; text-decoration: none; }
.xdir-search-tip a:active { color: #0b7ecf; }
.night .xdir-search-tip a { color: #6db3ff; }
.night .xdir-search-tip a:hover { color: #9cccff; text-decoration: none; }

/* ===================== 分享弹窗：内容滚动而非裁切（v2.0.7） =====================
   现象：创建成功后，密码区 / 二维码 / 「打开预览」被弹窗下沿切掉，看不全。
   根因：layer 把固定高度写在外层，内容区默认 overflow:hidden；
        而内层 .xdir-share-modal 自己又有一份 max-height，两个高度打架，
        内层以为「不需要滚动」，外层却已经把它裁掉了。
   做法：去掉内层的 max-height，改为外层内容区滚动（skin: xdir-share-layer），
        高度由 fitShareHeight() 按内容实测值设置，上限 86vh。 */
.layui-layer.xdir-share-layer .layui-layer-content {
    /* 注意：这里**不能**用 !important ——
       JS 的 fitShareHeight() 会按实测内容高度写 inline 的 height / overflow-y，
       一旦被 !important 覆盖，弹窗又会回到「外层固定、内容溢出被裁」的老问题。
       这里的声明只作为 JS 未执行时的兜底。 */
    overflow-y: auto;
    overflow-x: hidden;
    overscroll-behavior: contain;
}
.layui-layer.xdir-share-layer .layui-layer-content::-webkit-scrollbar { width: 8px; }
.layui-layer.xdir-share-layer .layui-layer-content::-webkit-scrollbar-thumb {
    background: rgba(140,160,180,.42); border-radius: 4px;
}
.layui-layer.xdir-share-layer .layui-layer-content::-webkit-scrollbar-track { background: transparent; }
.layui-layer.xdir-share-layer .xdir-share-modal {
    max-height: none !important;
    overflow: visible !important;
}
/* 长链接 / 长密码在窄弹窗里必须能收缩，否则会把内容撑宽、右侧二维码被裁 */
.layui-layer.xdir-share-layer .xdir-share-link { display: flex; gap: 8px; align-items: stretch; }
.layui-layer.xdir-share-layer .xdir-share-link input {
    flex: 1 1 auto; min-width: 0; width: auto;
}
.layui-layer.xdir-share-layer .xdir-share-link button { flex: 0 0 auto; white-space: nowrap; }
.layui-layer.xdir-share-layer .xsp-row input { flex: 1 1 auto; min-width: 0; }
.layui-layer.xdir-share-layer .xsp-row button { flex: 0 0 auto; }
.layui-layer.xdir-share-layer .xdir-share-result { overflow: hidden; }
.layui-layer.xdir-share-layer .xsh-open a { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 跨页面续播：自动播放被浏览器拒绝时的「点击继续」提示（v2.0.7） */
.xdir-music-player .xmp-resume {
    display: none;
    align-items: center;
    gap: 4px;
    margin-left: 8px;
    height: 20px;
    padding: 0 9px;
    border: 1px solid rgba(30, 159, 255, .45);
    border-radius: 10px;
    background: rgba(30, 159, 255, .14);
    color: #6db3ff;
    font-size: 11px;
    line-height: 1;
    cursor: pointer;
    white-space: nowrap;
    transition: background .18s ease;
}
.xdir-music-player .xmp-resume:hover { background: rgba(30, 159, 255, .28); color: #fff; }
.xdir-music-player .xmp-resume i { font-size: 9px; }

/* ===================== 音乐播放器：收起 / 展开（v2.0.8） =====================
   需求：站内继续浏览时，左下角播放器不该挡住内容。
   做法：收起后只剩一个 52px 圆盘（封面图标），点封面或右上角小箭头即可展开；
        「是否收起」写入 sessionStorage，翻页后保持同一状态。 */
.xdir-music-player .xmp-fold {
    position: absolute; top: -6px; right: -6px;
    width: 24px; height: 24px; padding: 0;
    border: 1px solid #dbe4ee; border-radius: 50%;
    background: #fff; color: #7b8a9a;
    font-size: 13px; line-height: 1;
    display: flex; align-items: center; justify-content: center;
    cursor: pointer; z-index: 3;
    opacity: 0; transform: scale(.9);
    transition: opacity .18s ease, transform .18s ease, background .18s ease, color .18s ease;
    box-shadow: 0 2px 8px rgba(20,40,80,.14);
}
.xdir-music-player:hover .xmp-fold,
.xdir-music-player.xmp-folded .xmp-fold { opacity: 1; transform: scale(1); }
.xdir-music-player .xmp-fold:hover { background: #1E9FFF; border-color: #1E9FFF; color: #fff; }
/* 展开 / 收起 切换按钮：悬停气泡箭头提示（v2.0.19 / 第二十一批）
   鼠标移到小箭头按钮上，在按钮右侧弹出一个带小三角（指回按钮）的文字气泡，
   文字取自按钮的 data-mtip —— JS 在 applyFold() 里按当前姿态实时设为「展开/收起播放器」，
   也就是用户点它将要执行的动作。纯 CSS 实现，不依赖任何脚本；改用 data-mtip 避免与原生 title 提示重复。 */
/* 与返回顶端/底部气泡统一字号、内边距、箭头尺寸（v2.0.19 第二十五批：统一样式） */
.xdir-music-player .xmp-fold::after {
    content: attr(data-mtip);
    position: absolute;
    left: 34px; top: 50%;
    transform: translateY(-50%) translateX(-4px);
    white-space: nowrap;
    background: #1f2d3d; color: #fff;
    font-size: 12px; line-height: 1.4; font-weight: 400;
    padding: 6px 10px; border-radius: 6px;
    box-shadow: 0 4px 12px rgba(20,40,80,.22);
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
    z-index: 20;
}
.xdir-music-player .xmp-fold::before {
    content: "";
    position: absolute;
    left: 22px; top: 50%;
    transform: translateY(-50%) translateX(-4px);
    border: 6px solid transparent;
    border-right-color: #1f2d3d;   /* 朝左的小三角，指向按钮 */
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
    z-index: 20;
}
.xdir-music-player .xmp-fold:hover::after,
.xdir-music-player .xmp-fold:hover::before {
    opacity: 1; visibility: visible;
    transform: translateY(-50%) translateX(0);
}

/* 其他控制按键：悬停气泡提示（v2.0.19）
   播放/上一曲/下一曲/模式/列表/封面/后台 等按键，鼠标悬停时在按键正上方弹出
   带「下指小三角」的文字气泡（取按钮自带 data-mtip）。纯 CSS，不依赖脚本；
   改用 data-mtip 避免与原生 title 提示重复。
   关键点（本批修正）：箭头与气泡框「分离排布 + 箭头 z-index 高于框」，
   杜绝箭头被框盖住、从而「只见文字不见箭头」的问题。 */
.xdir-music-player .xmp-btn,
.xdir-music-player .xmp-cover,
.xdir-music-player .xmp-bg { position: relative; }
/* 气泡框：上抬 13px，给下方箭头留出独立缝隙（与箭头宽边贴合，见下方 ::before 说明） */
.xdir-music-player .xmp-btn:hover::after,
.xdir-music-player .xmp-cover:hover::after,
.xdir-music-player .xmp-bg:hover::after {
    content: attr(data-mtip);
    position: absolute;
    bottom: calc(100% + 13px); left: 50%;
    transform: translateX(-50%) translateY(4px);
    white-space: nowrap;
    background: #1f2d3d; color: #fff;
    font-size: 12px; line-height: 1.4; font-weight: 400;
    padding: 6px 10px; border-radius: 6px;
    box-shadow: 0 4px 12px rgba(20,40,80,.22);
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
    z-index: 30;
}
/* 下指小三角：CSS 边框三角的彩色区在「边框盒上半部」、尖端在盒中心（border 6px → 盒高 12px，点在距底边 6px 处）。
   原 bottom:calc(100% + 5px) 时，三角宽边落在 17px、尖端恰在 11px = 气泡底边，整段被气泡盖住 → 看不见。
   改为 bottom:calc(100% + 1px)：盒底边在按钮顶上方 1px，宽边落在 13px = 气泡底边（calc(100% + 13px)）→ 三角宽边与气泡底无缝贴合，
   尖端在 7px 处朝下露出约 6px，箭头与气泡成为一体、清晰可见（v2.0.19 第二十七批·修正）。z-index 高于框，避免被遮挡。 */
.xdir-music-player .xmp-btn:hover::before,
.xdir-music-player .xmp-cover:hover::before,
.xdir-music-player .xmp-bg:hover::before {
    content: "";
    position: absolute;
    bottom: calc(100% + 1px); left: 50%;
    transform: translateX(-50%);
    border: 6px solid transparent;
    border-top-color: #1f2d3d;   /* 朝下的小三角，尖端指向按键 */
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
    z-index: 31;
}
/* 悬停统一显隐 */
.xdir-music-player .xmp-btn:hover::after,
.xdir-music-player .xmp-cover:hover::after,
.xdir-music-player .xmp-bg:hover::after,
.xdir-music-player .xmp-btn:hover::before,
.xdir-music-player .xmp-cover:hover::before,
.xdir-music-player .xmp-bg:hover::before {
    opacity: 1; visibility: visible;
    transform: translateX(-50%) translateY(0);
}
/* 封面图标气泡：仅在「收起态（左下角默认圆盘）」显示；展开态取消，避免冗余（本批） */
.xdir-music-player:not(.xmp-folded) .xmp-cover:hover::after,
.xdir-music-player:not(.xmp-folded) .xmp-cover:hover::before {
    opacity: 0 !important; visibility: hidden !important;
}
/* 收起态（默认）：播放器贴视口左缘，气泡以封面左缘为锚点向右展开，避免被裁切；
   下指三角落在气泡左缘，与框成为一体（v2.0.19 第二十五批） */
.xdir-music-player.xmp-folded .xmp-cover:hover::after {
    left: 0;
    transform: translateX(0) translateY(0);
}
.xdir-music-player.xmp-folded .xmp-cover:hover::before {
    left: 10px;
    transform: translateX(0);
}
/* 暗黑模式：气泡配色（浅蓝底深字），三角同色，与展开/收起箭头保持一致 */
.night .xdir-music-player .xmp-btn:hover::after,
.night .xdir-music-player .xmp-cover:hover::after,
.night .xdir-music-player .xmp-bg:hover::after { background: #cfe6ff; color: #0a1122; }
.night .xdir-music-player .xmp-btn:hover::before,
.night .xdir-music-player .xmp-cover:hover::before,
.night .xdir-music-player .xmp-bg:hover::before { border-top-color: #cfe6ff; }

/* 收起态：整块收缩为圆盘，只留封面 */
.xdir-music-player.xmp-folded {
    width: 52px; height: 52px;
    padding: 0; gap: 0;
    border-radius: 50%;
    justify-content: center;
}
.xdir-music-player.xmp-folded .xmp-main,
.xdir-music-player.xmp-folded .xmp-playlist,
.xdir-music-player.xmp-folded .xmp-resume { display: none !important; }
.xdir-music-player.xmp-folded .xmp-cover {
    width: 52px; height: 52px;
    border-radius: 50%;
    font-size: 21px;
    cursor: pointer;
    transition: transform .2s ease;
}
.xdir-music-player.xmp-folded .xmp-cover:hover { transform: scale(1.06); }
/* 收起且在播放：外圈脉冲，远看也知道在放歌 */
.xdir-music-player.xmp-folded.xmp-playing .xmp-cover { animation: xmp-pulse 2.1s ease-out infinite; }
@keyframes xmp-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(34, 211, 238, .55); }
    70%  { box-shadow: 0 0 0 13px rgba(34, 211, 238, 0); }
    100% { box-shadow: 0 0 0 0 rgba(34, 211, 238, 0); }
}
.night .xdir-music-player .xmp-fold { background: #16202c; border-color: #2c3e50; color: #9fb2c6; }
.night .xdir-music-player .xmp-fold:hover { background: #1E9FFF; border-color: #1E9FFF; color: #fff; }
/* 暗黑模式下气泡配色（文字反白底 → 浅蓝底深字），三角箭头同色以保持连接感 */
.night .xdir-music-player .xmp-fold::after { background: #cfe6ff; color: #0a1122; }
.night .xdir-music-player .xmp-fold::before { border-right-color: #cfe6ff; }

/* 窄屏：默认姿态更紧凑，减少遮挡 */
@media (max-width: 520px) {
    .xdir-music-player { width: calc(100vw - 36px); max-width: 360px; }
    .xdir-music-player.xmp-folded { width: 50px; }
}


/* ===================== 第三十九批：全局 Layui 弹窗标题加粗 + 弹层打开时锁定背景滚动 =====================
   1) 所有 Layui 弹层标题统一加粗（含夜间/移动端），与全站 UI 观感一致。
   2) 用户明确要求「锁定背景，禁止滚动」：只要存在带遮罩的弹层，前台脚本就会给
      <html> 加 .xdir-layer-lock，这里强制 html/body overflow:hidden，底层页面
      完全不能滚；弹层内部仍可正常滚动（限制只加在根元素，并用
      overscroll-behavior:contain 阻断滚动链外溢）。滚动条宽度由 JS 用
      padding-right 补偿，避免锁定瞬间页面横向跳动。
   3) 兜底修复嵌套弹层下 layer.confirm / layer.prompt 对话框宽度塌陷，
      否则提示文字会被挤成窄列并与按钮重叠。 */
.layui-layer-title { font-weight: 700 !important; }
html.xdir-layer-lock, html.xdir-layer-lock body { overflow: hidden !important; }
.layui-layer-content { overscroll-behavior: contain; }
.layui-layer-dialog { min-width: 280px; }
.layui-layer-dialog .layui-layer-content { white-space: normal; word-break: break-word; line-height: 1.7; }
