img.hitandrun {
    width: 35px;
    height: 12px;
    background: url(icons.gif) no-repeat -100px -171px;
    margin-left: 0.5em;
}
/* .spoiler-title / .spoiler-content 已删除（2026-09-17）：
   本文件在 stdhead 里的加载顺序【在 tokens/base/components/theme 之后】，
   同特异性下后手胜 —— 这里写死的 color:#4d6c99 / background rgba(77,108,153,.1)
   会把设计系统的 .spoiler-title（color: var(--nx-primary-strong)）整个压掉，
   深色主题下对比度只剩 2.62:1。
   两者在 components.css 里均有完整定义（含 :hover、transition），故直接移除本处重复。
   ⚠ 系统性提醒：本文件是「遗留全局样式」，加载靠后 = 会静默覆盖设计系统。
   后续若再看到「令牌色不生效」，优先怀疑这里。 */

.layui-layer {
    color: black;
}
.layer-form {
    padding: 10px 15px;
}
.layer-form .form-control-row input{
    padding: 4px;
}
.layer-form .form-control-row .label{
    margin-bottom: 4px;
}
.rainbow {
    text-align: center;
    text-decoration: underline;
    /*font-size: 32px;*/
    /*font-family: monospace;*/
    /*letter-spacing: 5px;*/
    background: linear-gradient(to right, #6666ff, #0099ff , #00ff00, #ff3399, #6666ff);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    animation: rainbow_animation 6s ease-in-out infinite;
    background-size: 400% 100%;
}

@keyframes rainbow_animation {
    0%,100% {
        background-position: 0 0;
    }

    50% {
        background-position: 100% 0;
    }
}
.nexus-media-info-raw {
    padding: 0 0.5rem;
    border: none;
}
.nexus-media-info-raw .spoiler-title-box{
    text-align: center;
}
.nexus-media-info-raw pre {
    white-space: break-spaces;
    overflow-wrap: anywhere;
}
.text-muted {
    color: #7d7b7b
}
.codemain>pre {
    margin: 0;
}
.word-break-all {
    word-break: break-all;
}

.form-box {
    padding: 15px;
}
.form-control-row {
    display: flex;
    align-items: center;
    padding: 10px 0;
}
.form-control-row .label {
    width: 80px
}
.form-control-row .field {

}
.form-control-row input[type=text],textarea {
    width: 300px;
    padding: 4px;
}
.form-control-row input[type=checkbox] {
    vertical-align: sub;
}

/* ── 未登录页顶部「登录 / 注册」按钮对 ─────────────────────────────
   2026-09-19 新增。标记见 include/functions.php 的 #nav_block 分支。
   放在本文件（而非各主题 components.css）：三主题共用一套造型，
   颜色/圆角/间距全部走 --nx-* 令牌，因此切主题、切明暗自动跟随。
   login = 实心主按钮，signup = 柔底次按钮，二者主次分明。 */
.nx-auth-actions {
    display: inline-flex;
    align-items: center;
    gap: var(--nx-space-3);
    vertical-align: middle;
}
.nx-auth-btn {
    display: inline-flex;
    align-items: center;
    gap: var(--nx-space-2);
    padding: var(--nx-space-2) var(--nx-space-5);
    border-radius: var(--nx-radius-full);
    font-size: 15px;
    font-weight: var(--nx-weight-semibold);
    line-height: 1.4;
    text-decoration: none;
    white-space: nowrap;
    border: 1px solid transparent;
    transition: background-color var(--nx-dur-fast) var(--nx-ease-out),
                border-color var(--nx-dur-fast) var(--nx-ease-out),
                box-shadow var(--nx-dur-fast) var(--nx-ease-out),
                transform var(--nx-dur-fast) var(--nx-ease-out);
}
.nx-auth-btn i {
    font-size: 0.95em;
}
.nx-auth-btn:hover {
    text-decoration: none;
    transform: translateY(-1px);
}
.nx-auth-btn:active {
    transform: translateY(0);
}
.nx-auth-btn:focus-visible {
    outline: none;
    box-shadow: var(--nx-shadow-focus);
}
/* 主按钮：实心主题色 */
.nx-auth-btn--login {
    background: var(--nx-primary);
    color: var(--nx-on-primary) !important;
    box-shadow: var(--nx-shadow-sm);
}
.nx-auth-btn--login:hover {
    background: var(--nx-primary-hover);
    color: var(--nx-on-primary) !important;
    box-shadow: var(--nx-shadow-md);
}
.nx-auth-btn--login:active {
    background: var(--nx-primary-active);
}
/* 次按钮：柔底描边 */
.nx-auth-btn--signup {
    background: var(--nx-primary-soft);
    color: var(--nx-primary-strong) !important;
    border-color: var(--nx-primary-border);
}
.nx-auth-btn--signup:hover {
    color: var(--nx-primary-strong-hover) !important;
    box-shadow: var(--nx-shadow-sm);
}

/* ── 页头「捐赠」按钮 ───────────────────────────────────────────────
   2026-09-19 新增，替换老的 donate.gif（文字烤进图里、不随主题、放大发虚）。
   标记见 include/functions.php 的 $enabledonation 分支。
   填充走主题主色渐变、文字 on-primary、爱心 currentColor —— 切主题/明暗自动跟随。
   ⚠️ 刻意不过渡 color/background：base.css 全局 `a{transition:color}` 会踩 Chromium
      的变量色不重算问题；这里只过渡位移/阴影/亮度，配色即时跟随。 */
.nx-donate-btn {
    display: inline-flex;
    align-items: center;
    gap: var(--nx-space-2);
    margin: 0 var(--nx-space-2);
    padding: var(--nx-space-2) var(--nx-space-4);
    border-radius: var(--nx-radius-full);
    font-size: var(--nx-font-sm);
    font-weight: var(--nx-weight-semibold);
    line-height: 1.4;
    text-decoration: none;
    white-space: nowrap;
    vertical-align: middle;
    color: var(--nx-on-primary) !important;
    background: linear-gradient(135deg, var(--nx-primary) 0%, var(--nx-primary-active) 100%);
    border: 1px solid transparent;
    box-shadow: var(--nx-shadow-sm);
    transition: transform var(--nx-dur-fast) var(--nx-ease-out),
                box-shadow var(--nx-dur-fast) var(--nx-ease-out),
                filter var(--nx-dur-fast) var(--nx-ease-out);
}
.nx-donate-btn:hover {
    color: var(--nx-on-primary) !important;
    text-decoration: none;
    transform: translateY(-1px);
    filter: brightness(1.06);
    box-shadow: var(--nx-shadow-md);
}
.nx-donate-btn:active { transform: translateY(0); filter: none; }
.nx-donate-btn:focus-visible {
    outline: none;
    box-shadow: var(--nx-shadow-focus);
}
.nx-donate-ico {
    width: 15px;
    height: 15px;
    fill: currentColor;
    flex: 0 0 auto;
}
/* 尊重「减少动态效果」偏好，去掉悬浮位移 */
@media (prefers-reduced-motion: reduce) {
    .nx-donate-btn,
    .nx-auth-btn { transition: none; }
    .nx-donate-btn:hover,
    .nx-auth-btn:hover { transform: none; }
}

/* ── 短讯列表「状态」列图标（2026-09-19）──────────────────────────────────
   原来是 public/styles/sprites.css 里的 icons.gif 雪碧图（35×36 的老黄信封），
   既不跟随主题，深色模式下还糊成一团。

   messages.php 输出的是 `<img class="unreadpm" src="pic/trans.gif">` ——
   图片本身只是 1px 透明像素，看到的图形完全由 CSS 的 background 画出来。
   所以不用动 PHP 就能整颗换掉：
     background-color 上色 → 走 --nx-* 令牌，明暗/配色自动跟随
     mask-image 决定形状   → 内联 SVG data URI（mask 取 SVG 的 alpha）
   未读=实心信封（封口 V 用 fill-rule='evenodd' 在信封里挖空），
   已读=描边信封。形状 + 颜色双重区分，色觉障碍或不看颜色也能分辨。

   ⚠️ 用 `html[data-nx-theme]` 限定：该属性只有分层主题（Nebula/Cyber/Kawaii）会输出
      （include/functions.php:3186）。Agsv / Pink 等旧主题没有它，继续用雪碧图。
   ⚠️ 选择器特异性 0-2-2 已高于 sprites.css 的 `img.unreadpm`（0-1-1），且 nexus.css
      在其之后加载（functions.php:3251 → 3256），不需要 !important。
   ⚠️ 刻意不加 transition：上色靠 background-color 变量，主题切换时若带过渡会踩
      「变量色不重算」那一类问题（见本文件 .nx-donate-btn 的说明）。 */
html[data-nx-theme] img.unreadpm,
html[data-nx-theme] img.readpm,
html[data-nx-theme] img.time {
    /* 雪碧图的 35×36 是给 bitmap 用的，矢量图按 1.4 倍字号走更贴合文字 */
    width: 22px;
    height: 22px;
    vertical-align: middle;
    /* ⚠️ 必须显式解除 base.css 的 `img{max-width:100%}`。
       状态列的 td 有左右各 12px 内距，列宽又常被「状态」两个字的 min-content
       压到 32px —— 内容盒只剩 8px，max-width:100% 会把 22px 的图标夹成 8×22
       的细长条（实测踩到）。图标是固定尺寸的装饰图，不存在溢出问题。 */
    max-width: none;
    /* 压掉 sprites.css 的 `background: url(icons.gif) -170px -100px` */
    background-image: none;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}
/* 未读：实心信封 + 主色 */
html[data-nx-theme] img.unreadpm {
    background-color: var(--nx-primary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M4.5 3.2h15a2.3 2.3 0 0 1 2.3 2.3v12.9a2.3 2.3 0 0 1-2.3 2.3h-15a2.3 2.3 0 0 1-2.3-2.3V5.5a2.3 2.3 0 0 1 2.3-2.3ZM4.2 3.6 12 10.6l7.8-7v2L12 12.6 4.2 5.6Z'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M4.5 3.2h15a2.3 2.3 0 0 1 2.3 2.3v12.9a2.3 2.3 0 0 1-2.3 2.3h-15a2.3 2.3 0 0 1-2.3-2.3V5.5a2.3 2.3 0 0 1 2.3-2.3ZM4.2 3.6 12 10.6l7.8-7v2L12 12.6 4.2 5.6Z'/%3E%3C/svg%3E");
}
/* 已读：描边信封 + 三级灰，视觉上退到内容之后 */
html[data-nx-theme] img.readpm {
    background-color: var(--nx-text-tertiary);
    opacity: .75;
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.6' width='18' height='14.8' rx='2.4'/%3E%3Cpath d='M3.9 6.1 12 12.4l8.1-6.3'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.6' width='18' height='14.8' rx='2.4'/%3E%3Cpath d='M3.9 6.1 12 12.4l8.1-6.3'/%3E%3C/svg%3E");
}
/* 表头那一格：log.php 的时间列头、messages.php 的时间列头，都是
   `<td class=colhead align=center><img class="time" src="pic/trans.gif">`。
   原来 16px + --nx-text-secondary + 1.8 描边，实测比同排的「事件」「用户」淡一档、
   细一档（表头文字是 theme.css 的 `td.colhead{color:var(--nx-text)}` + semibold），
   看着像没换干净的旧雪碧图残影。这里按「它就是列标题」来对齐：字号 18px、
   描边 2、颜色跟表头文字同档。

   ⚠️ `table:not(.torrents)` 这个限定**挡不住种子表**：种子表包在 begin_table 输出的
      布局 <table> 里，:not() 只要任一祖先 table 不带 .torrents 就命中，所以这条一直在
      把种子表头的时钟也改成 18px。种子表那侧由后面「表头的时钟」那条
      `table.torrents img.time`（0-3-3）盖回 13px。 */
html[data-nx-theme] table:not(.torrents) img.time {
    width: 18px;
    height: 18px;
    background-color: var(--nx-text);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9.1'/%3E%3Cpath d='M12 6.4v5.8l3.8 2.25'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9.1'/%3E%3Cpath d='M12 6.4v5.8l3.8 2.25'/%3E%3C/svg%3E");
}

/* ── 切换「界面外观」的那一帧：全站抑制过渡 ───────────────────────────────
   背景：大量元素带 `transition: color / background-color / border-color`，
   而这些值取自 --nx-* 变量。切明暗或配色时，它们会从旧值补间到新值，
   中间那一小段会出现「新文字色 + 还没变过来的旧底色」这类低对比中间态。
   与其逐个选择器去摘 color（之前给登录药丸、捐赠按钮就是这么打的补丁，
   治标且新链接还会再踩），不如在切换的那一瞬间统一关掉。

   这个类由 public/js/theme-switcher.js 的 flip() 在改属性前后同步挂上/摘掉，
   两次 `void root.offsetWidth` 强制重排之间类就已被移除 —— 它不会以某一帧被绘制，
   作用只是让浏览器把「变更前样式」直接记成新配色的当前值，过渡因此根本启动不了。

   ⚠️ 只关 transition，绝不要顺手关 animation：页面里有无限循环的加载动画，
      `animation: none` 会让它们销毁重建、从头再播，反而造成可见的跳动。
   ⚠️ 必须 !important：要压过三主题 components.css 里成百上千条 transition 声明。 */
html.nx-theme-flip,
html.nx-theme-flip *,
html.nx-theme-flip *::before,
html.nx-theme-flip *::after {
    transition: none !important;
}

/* ── 页头信息区：勋章 / 任务 图标（2026-09-19）────────────────────────────
   标记见 include/functions.php 的 .nx-info-chip--attend。
   沿用 base.css 已有的做法（FA5 solid 的 ::before 码点），只是补上此前漏掉的
   两个语义 class —— base.css 注释里写了「chip 含多个链接，href 定位会打架，
   所以改用…语义 class」，但勋章/任务那两条一直没落地。
   ⚠️ FA solid 必须 font-weight:900，否则显示成方框。
   ⚠️ 任务用 \f0ae（list-check）而不是直觉上的 \f828（tasks）：
      本地这份 FA 5.15.4 里 **f828 没有字形**（实测画到 canvas 上 0 像素，
      连兜底字体也不渲染，用户只会看到一段空白）。同类坑还有 f5d8、f7e2、f046。
      可用的有：f0ae 清单勾选 / f46c 剪贴板列表 / f14a 勾选方框 / f560 奖章。 */
#info_block .nx-info-link--medal::before,
#info_block .nx-info-link--task::before {
    font-family: "Font Awesome 5 Free";
    font-weight: 900;
    font-style: normal;
    display: inline-block;
    width: 1.05em;
    margin-right: 3px;
    text-align: center;
    opacity: .85;
}
#info_block .nx-info-link--medal::before { content: "\f5a2"; color: var(--nx-warning-text); }  /* medal      */
#info_block .nx-info-link--task::before  { content: "\f0ae"; color: var(--nx-info-text); }      /* list-check */

/* ── 页头右上角那一排图标（2026-09-19）───────────────────────────────────
   和短讯列表的状态列同一套办法：那些 <img class="inbox|rss|…"> 的 src 是
   1×1 的 pic/trans.gif，图形全部由 sprites.css 用 icons.gif 背景刷出来，
   所以只改 CSS 就能整颗换成矢量图标，PHP 一行不动。
     background-color 上色（--nx-* 令牌 → 明暗/配色自动跟随）
     mask-image 定形（内联 SVG data URI，取 alpha）

   配色按「这排数字要不要人看」来分：
     中性灰 —— 收件箱(无新) / 发件箱 / 好友 / RSS：只是入口
     主色   —— 收件箱有新短讯：唯一希望用户立刻注意到的一个
     语义色 —— 作弊(危险) / 举报(待处理) / 管理信箱(知讯)：都带待办数，
              颜色即优先级，和后面的数字形成呼应

   ⚠️ max-width:none 是必需的：base.css 有全局 `img{max-width:100%}`，
      在窄容器里会把固定尺寸的图标压成细长条（短讯状态列实测踩过）。
   ⚠️ 用 `html[data-nx-theme] #info_block …` 限定：分层主题才生效，
      Agsv / Pink 等旧主题继续用雪碧图；特异性 (1,3,2) 稳压
      theme.css 的 `img.inbox`(0,1,1) 与 base.css 的 `#info_block img`(1,0,2)。 */
html[data-nx-theme] #info_block img.inbox,
html[data-nx-theme] #info_block img.inboxnew,
html[data-nx-theme] #info_block img.sentbox,
html[data-nx-theme] #info_block img.buddylist,
html[data-nx-theme] #info_block img.rss,
html[data-nx-theme] #info_block img.cheaterbox,
html[data-nx-theme] #info_block img.reportbox,
html[data-nx-theme] #info_block img.staffbox {
    width: 15px;
    height: 15px;
    max-width: none;
    margin: 0 2px;
    vertical-align: -3px;
    background-image: none;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}
/* 收件箱：无新 = 描边信封，有新 = 实心信封 + 主色 */
html[data-nx-theme] #info_block img.inbox {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.6' width='18' height='14.8' rx='2.4'/%3E%3Cpath d='M3.9 6.1 12 12.4l8.1-6.3'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4.6' width='18' height='14.8' rx='2.4'/%3E%3Cpath d='M3.9 6.1 12 12.4l8.1-6.3'/%3E%3C/svg%3E");
}
html[data-nx-theme] #info_block img.inboxnew {
    background-color: var(--nx-primary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M4.5 3.2h15a2.3 2.3 0 0 1 2.3 2.3v12.9a2.3 2.3 0 0 1-2.3 2.3h-15a2.3 2.3 0 0 1-2.3-2.3V5.5a2.3 2.3 0 0 1 2.3-2.3ZM4.2 3.6 12 10.6l7.8-7v2L12 12.6 4.2 5.6Z'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M4.5 3.2h15a2.3 2.3 0 0 1 2.3 2.3v12.9a2.3 2.3 0 0 1-2.3 2.3h-15a2.3 2.3 0 0 1-2.3-2.3V5.5a2.3 2.3 0 0 1 2.3-2.3ZM4.2 3.6 12 10.6l7.8-7v2L12 12.6 4.2 5.6Z'/%3E%3C/svg%3E");
}
/* 发件箱：纸飞机 */
html[data-nx-theme] #info_block img.sentbox {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21.4 3.1 2.9 10.3l6.4 2.7 2.7 6.4z'/%3E%3Cpath d='M21.4 3.1 9.3 13'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21.4 3.1 2.9 10.3l6.4 2.7 2.7 6.4z'/%3E%3Cpath d='M21.4 3.1 9.3 13'/%3E%3C/svg%3E");
}
/* 好友列表：两人 */
html[data-nx-theme] #info_block img.buddylist {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='8.2' r='3.5'/%3E%3Cpath d='M3.3 19.6c0-3.3 2.6-5.4 5.9-5.4s5.9 2.1 5.9 5.4'/%3E%3Cpath d='M16.3 5.2a3.4 3.4 0 0 1 0 6.3'/%3E%3Cpath d='M17.6 14.6c2.3.6 3.9 2.5 3.9 5'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='8.2' r='3.5'/%3E%3Cpath d='M3.3 19.6c0-3.3 2.6-5.4 5.9-5.4s5.9 2.1 5.9 5.4'/%3E%3Cpath d='M16.3 5.2a3.4 3.4 0 0 1 0 6.3'/%3E%3Cpath d='M17.6 14.6c2.3.6 3.9 2.5 3.9 5'/%3E%3C/svg%3E");
}
/* RSS：信号点 + 两道弧 */
html[data-nx-theme] #info_block img.rss {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4.6 12.4a7 7 0 0 1 7 7'/%3E%3Cpath d='M4.6 5.4a14 14 0 0 1 14 14'/%3E%3Ccircle cx='5.6' cy='18.4' r='1.9' fill='%23000' stroke='none'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4.6 12.4a7 7 0 0 1 7 7'/%3E%3Cpath d='M4.6 5.4a14 14 0 0 1 14 14'/%3E%3Ccircle cx='5.6' cy='18.4' r='1.9' fill='%23000' stroke='none'/%3E%3C/svg%3E");
}
/* 作弊清单：警示三角 */
html[data-nx-theme] #info_block img.cheaterbox {
    background-color: var(--nx-danger-text);
    -webkit-mask-image: var(--nx-i-alert);
            mask-image: var(--nx-i-alert);
}
/* 旗帜 */
html[data-nx-theme] #info_block img.reportbox {
    background-color: var(--nx-warning-text);
    -webkit-mask-image: var(--nx-i-flag);
            mask-image: var(--nx-i-flag);
}
/* 管理信箱：喇叭 */
html[data-nx-theme] #info_block img.staffbox {
    background-color: var(--nx-info-text);
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 9.6v4.8a1.4 1.4 0 0 0 1.4 1.4h1.2l7.8 3.8V4.4L6.8 8.2H5.6A1.4 1.4 0 0 0 4.2 9.6z'/%3E%3Cpath d='M18.6 9a4.2 4.2 0 0 1 0 6'/%3E%3Cpath d='M7.4 16.2v3.4a1.6 1.6 0 0 0 3.2 0'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 9.6v4.8a1.4 1.4 0 0 0 1.4 1.4h1.2l7.8 3.8V4.4L6.8 8.2H5.6A1.4 1.4 0 0 0 4.2 9.6z'/%3E%3Cpath d='M18.6 9a4.2 4.2 0 0 1 0 6'/%3E%3Cpath d='M7.4 16.2v3.4a1.6 1.6 0 0 0 3.2 0'/%3E%3C/svg%3E");
}

/* ── 状态条上下箭头 + 置顶图钉（2026-09-21）────────────────────────────────
   那排图标里最后两类还在吃 icons.gif 位图的：

   ① #info_block「活动种子 N↑ M↓」的箭头，原本 7×8（sprites.css:163），
      挤在 18px 文字里基本看不见，也不跟明暗。字形和配色直接照抄种子表头
      的 img.seeders / img.leechers（components.css ④⑤），让
      「做种=绿上箭、下载=红下箭」全站只有一种画法。
      ⚠️ 别去改 sprites.css：那是旧主题也要加载的共享层。
   ② img.sticky 置顶图钉，14×14（sprites.css:367）。种子列表按置顶等级
      重复 1~2 颗（include/functions.php:4519 的 str_repeat，所以复制标题时
      会带出两个 "Sticky" —— 那是 alt），论坛置顶帖在 public/forums.php:1287。
      放在标题同一行的名字单元格里（父级字号 12px）。
      配色用 --nx-warning-text：读作「官方钉住」，不和危险红/成功绿抢语义。

   两条都带上 max-width:none —— base.css 的全局 `img{max-width:100%}`
   会把固定尺寸图标压成细长条；html[data-nx-theme] 前缀保证
   Agsv / Pink 等旧主题继续走雪碧图。 */
html[data-nx-theme] #info_block img.arrowup,
html[data-nx-theme] #info_block img.arrowdown {
    width: 13px;
    height: 13px;
    max-width: none;
    margin: 0 2px 0 0;
    vertical-align: -2px;
    background-image: none;
    background-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}
/* 做种数：上箭头 */
html[data-nx-theme] #info_block img.arrowup {
    background-color: var(--nx-success-text);
    -webkit-mask-image: var(--nx-i-arrow-up);
            mask-image: var(--nx-i-arrow-up);
}
/* 下载数：下箭头 */
html[data-nx-theme] #info_block img.arrowdown {
    background-color: var(--nx-danger-text);
    -webkit-mask-image: var(--nx-i-arrow-down);
            mask-image: var(--nx-i-arrow-down);
}
/* 置顶图钉 */
html[data-nx-theme] img.sticky {
    width: 13px;
    height: 13px;
    max-width: none;
    margin-right: 3px;
    vertical-align: -2px;
    background-image: none;
    background-repeat: no-repeat;
    background-color: var(--nx-warning-text);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-image: var(--nx-i-pin);
            mask-image: var(--nx-i-pin);
}
/* 一级 / 二级置顶分级。class 由 include/functions.php:4519 按 pos_state 输出。
   颗数本身已经编码了等级（一级 2 颗、二级 1 颗，这个保留，不能只靠颜色区分），
   颜色只是让一级在长列表里跳出来：二级维持原来的琥珀色，一级升到主色。
   特异性同为 (0,2,2)，靠书写顺序压过上面那条 img.sticky。 */
html[data-nx-theme] img.sticky-lv1 {
    background-color: var(--nx-primary);
}
html[data-nx-theme] img.sticky-lv2 {
    background-color: var(--nx-warning-text);
}

/* ── 详情页操作行 + 列表/个人中心的「编辑·删除」小图标（2026-09-21）────────
   同一批 icons.gif 位图，两类容器：
   ① img.dt_*：详情页 `tr(行为)` 那一排「⬇下载种子 | ✎编辑/刪除 | 审核 | 举报种子」
      （public/details.php:182-211，offers.php:188-191 也复用同一批类名），
      14×14，跟在 12px 粗体文字前面，用 `&nbsp;|&nbsp;` 分隔。
   ② img.staff_edit / img.staff_delete：16×16，种子列表的管理列
      （include/functions.php:4717，编辑/删除上下叠两颗）、求种管理列
      （offers.php:837），以及个人中心做种列表和 API token 的删除按钮
      （usercp.php:1040 / 1135 —— 那两处 JS 是按 .staff_delete 类名绑定的，
       所以类名一个都不能改）。
   形状全部复用第 10 节已经定义好的 --nx-i-* 变量：铅笔/垃圾桶直接沿用
   折叠开关那套里已有的 --nx-i-edit / --nx-i-del，于是「编辑=铅笔、
   删除=垃圾桶」在详情页、列表管理列、个人中心三处是同一颗图。

   配色按语义而不是按新旧：下载=主色（这一排里唯一的主动作）、
   编辑=中性灰（工具，不抢注意力）、求种=成功绿（要的就是做种）、
   举报=警示琥珀（和页头 img.reportbox 同色同意）、删除=危险红。
   ⚠️ 审核那颗不是 img，是 details.php:190 内联的一整只 SVG，
      `fill="#e78d0f"` 写死在 path 上 —— 用 CSS 的 fill 覆盖表现型属性即可，
      不必动 PHP 一个字。 */
html[data-nx-theme] img.dt_download,
html[data-nx-theme] img.dt_edit,
html[data-nx-theme] img.dt_delete,
html[data-nx-theme] img.dt_report,
html[data-nx-theme] img.dt_reseed,
html[data-nx-theme] img.staff_edit,
html[data-nx-theme] img.staff_delete {
    max-width: none;
    vertical-align: -2px;
    background-image: none;
    background-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}
/* 详情页那排 14×14 挨着 12px 文字，留 3px 间距（原来是靠 &nbsp; 撑的） */
html[data-nx-theme] img.dt_download,
html[data-nx-theme] img.dt_edit,
html[data-nx-theme] img.dt_delete,
html[data-nx-theme] img.dt_report,
html[data-nx-theme] img.dt_reseed {
    width: 14px;
    height: 14px;
    margin-right: 3px;
}
html[data-nx-theme] img.staff_edit,
html[data-nx-theme] img.staff_delete {
    width: 15px;
    height: 15px;
    margin: 0 2px;
}
html[data-nx-theme] img.dt_download {
    background-color: var(--nx-primary);
    -webkit-mask-image: var(--nx-i-download);
            mask-image: var(--nx-i-download);
}
html[data-nx-theme] img.dt_edit,
html[data-nx-theme] img.staff_edit {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-edit);
            mask-image: var(--nx-i-edit);
}
html[data-nx-theme] img.dt_delete,
html[data-nx-theme] img.staff_delete {
    background-color: var(--nx-danger-text);
    -webkit-mask-image: var(--nx-i-del);
            mask-image: var(--nx-i-del);
}
html[data-nx-theme] img.dt_report {
    background-color: var(--nx-warning-text);
    -webkit-mask-image: var(--nx-i-flag);
            mask-image: var(--nx-i-flag);
}
html[data-nx-theme] img.dt_reseed {
    background-color: var(--nx-success-text);
    -webkit-mask-image: var(--nx-i-reseed);
            mask-image: var(--nx-i-reseed);
}
/* 审核：2026-09-22 起 PHP 里换成了描边「圆圈+勾」（details.php:191），
   造型走 stroke、颜色在这里给，明暗自动切换；顺带压到和旁边图标同档。
   注意 fill 必须显式设成 none —— 圆圈和勾都没有自己的 fill 属性，
   靠这里继承；上一版那条 svg path{fill:…} 会把描边图形重新填成实心块。 */
html[data-nx-theme] #approval svg,
html[data-nx-theme] .approval svg {
    width: 14px;
    height: 14px;
    vertical-align: -2px;
    margin-right: 3px;
    stroke: var(--nx-warning-text);
    fill: none;
}

/* ── 用户名后面的状态小徽章（2026-09-22）──────────────────────────────────
   `get_username()`（include/functions.php:4733）在用户名后拼 0~3 颗小图，
   全站所有出现用户名的地方都走它：种子列表上传者列、详情页、用户列表、
   论坛发帖人、短讯、举报/求种页…… 所以这 8 个类名一处改完全站生效。

   大小两套：`$big=false` → 11px（表格内），`$big=true` → 16px（详情页上传者、
   userdetails 头部）。类名是 `star / warned / leechwarned / disabled` 和它们的
   `*big` 版，**PHP 里靠变量拼出来，不能改类名**。

   旧图（icons.gif 第 41/57 行）：红禁止圈、黄三角!、金星、红三角! ——
   「被警告」和「比例警告」当年**只差一个颜色**，色觉障碍和小尺寸下根本分不开。
   现在形状也分开：
     disabled     圆圈斜杠  危险红   （复用页头已有的 --nx-i-ban）
     warned       警示三角  危险红   （和页头 img.cheaterbox 同一颗，--nx-i-alert）
     leechwarned  圆圈感叹  警示琥珀  （同族不同形，读作「提示级」）
     star（捐赠） 实心金星  警示琥珀  （实心=荣誉徽章、描边=状态提示）
   ⚠️ 捐赠星和比例警告同为琥珀：两者可能同时出现在一个用户名后面，
      但一颗实心五角、一个是圆圈感叹，形状差异足够，不必再开一个新色档。 */
html[data-nx-theme] img.disabled,
html[data-nx-theme] img.disabledbig,
html[data-nx-theme] img.warned,
html[data-nx-theme] img.warnedbig,
html[data-nx-theme] img.star,
html[data-nx-theme] img.starbig,
html[data-nx-theme] img.leechwarned,
html[data-nx-theme] img.leechwarnedbig {
    max-width: none;
    background-image: none;
    background-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
    mask-size: contain;
}
/* 表格内那一档：11 → 12px，和 12~13px 的用户名基线对齐 */
html[data-nx-theme] img.disabled,
html[data-nx-theme] img.warned,
html[data-nx-theme] img.star,
html[data-nx-theme] img.leechwarned {
    width: 12px;
    height: 12px;
    vertical-align: -1px;
}
/* 详情页 / userdetails 那一档 */
html[data-nx-theme] img.disabledbig,
html[data-nx-theme] img.warnedbig,
html[data-nx-theme] img.starbig,
html[data-nx-theme] img.leechwarnedbig {
    width: 16px;
    height: 16px;
    vertical-align: -3px;
}
html[data-nx-theme] img.disabled,
html[data-nx-theme] img.disabledbig {
    background-color: var(--nx-danger-text);
    -webkit-mask-image: var(--nx-i-ban);
            mask-image: var(--nx-i-ban);
}
html[data-nx-theme] img.warned,
html[data-nx-theme] img.warnedbig {
    background-color: var(--nx-danger-text);
    -webkit-mask-image: var(--nx-i-alert);
            mask-image: var(--nx-i-alert);
}
html[data-nx-theme] img.leechwarned,
html[data-nx-theme] img.leechwarnedbig {
    background-color: var(--nx-warning-text);
    -webkit-mask-image: var(--nx-i-alert-circle);
            mask-image: var(--nx-i-alert-circle);
}
html[data-nx-theme] img.star,
html[data-nx-theme] img.starbig {
    /* 用 --nx-warning 而不是 --nx-warning-text：后者是给文字调的对比度档，
       浅色下是 #92400e，画成实心星会变成脏褐色；前者浅色 #b45309 / 深色 #fbbf24，
       才是「金星」。警告类徽章仍走 -text 档（它们本来就是提示文字级别的东西）。 */
    background-color: var(--nx-warning);
    -webkit-mask-image: var(--nx-i-star);
            mask-image: var(--nx-i-star);
}

/* ==========================================================================
   10. 折叠开关 + 区块标题里的「[ 操作 ]」文字链接（2026-09-19）
   --------------------------------------------------------------------------
   两处老写法：
     ① `<img class="plus|minus" src="pic/trans.gif">` —— 首页新闻、details 简介/NFO、
        userdetails 五组种子列表、torrents 搜索箱、PTGen 评论都在用，
        图形同样来自 icons.gif 的 sprite，所以还是走「mask 换矢量」这套，
        一处改动覆盖全站。
     ② `<h2>标题 - <font class="small">[<a class="altlink"><b>发布</b></a>]</font></h2>`
        —— 方括号是写在 PHP 字符串里的**裸文本节点**，CSS 删不掉；
        但可以让它看不见：把容器 font-size 压成 0，再给元素子节点恢复字号，
        于是只剩 `[` `]` 和 ` - ` 这些散落的文本隐形。
        新闻条目下的 `[编] [删]`（index.php:67-68）在 **recent_news 页面缓存**里，
        改 PHP 要清缓存才生效，所以同样用 CSS 处理，一行标记都不动。

   形状集中在 html 上定义成 --nx-i-* 自定义属性，下面用 var() 取，
   省掉每条规则重复两遍（-webkit- + 标准）的 data URI。
   ========================================================================== */
html[data-nx-theme] {
    /* 折叠态：圆角方牌 + 镂空的加号 */
    --nx-i-plus:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M5 2h14a3 3 0 0 1 3 3v14a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3Zm5 4v4H6v4h4v4h4v-4h4v-4h-4V6h-4Z'/%3E%3C/svg%3E");
    /* 展开态：同一块牌，镂空换成减号 —— 只有孔变化，切换时不跳位 */
    --nx-i-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M5 2h14a3 3 0 0 1 3 3v14a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3Zm1 8h12v4H6v-4Z'/%3E%3C/svg%3E");
    --nx-i-edit:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M16.9 3.6a2.6 2.6 0 0 1 3.7 3.7L7.6 20.3 3 21l.7-4.6Z'/%3E%3Cpath d='M14.4 6.1l3.7 3.7'/%3E%3C/svg%3E");
    --nx-i-del:   url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.8 6.4h16.4'/%3E%3Cpath d='M18.6 6.4v13a2 2 0 0 1-2 2H7.4a2 2 0 0 1-2-2v-13'/%3E%3Cpath d='M9 6.4V4.7A1.7 1.7 0 0 1 10.7 3h2.6A1.7 1.7 0 0 1 15 4.7v1.7'/%3E%3Cpath d='M10.3 10.6v6.2'/%3E%3Cpath d='M13.7 10.6v6.2'/%3E%3C/svg%3E");
    --nx-i-ban:   url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M5.6 5.6l12.8 12.8'/%3E%3C/svg%3E");
    --nx-i-new:   url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M12 5.2v13.6'/%3E%3Cpath d='M5.2 12h13.6'/%3E%3C/svg%3E");
    --nx-i-more:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='5.2' cy='12' r='1.9' fill='%23000'/%3E%3Ccircle cx='12' cy='12' r='1.9' fill='%23000'/%3E%3Ccircle cx='18.8' cy='12' r='1.9' fill='%23000'/%3E%3C/svg%3E");
    --nx-i-news:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3.4' y='5' width='12.6' height='14' rx='1.8'/%3E%3Cpath d='M16 9.4h2.4a1.6 1.6 0 0 1 1.6 1.6v6.2a2 2 0 0 1-2 2H16'/%3E%3Cpath d='M6.4 8.8h6.6'/%3E%3Cpath d='M6.4 12h6.6'/%3E%3Cpath d='M6.4 15.2h4.2'/%3E%3C/svg%3E");
    --nx-i-clear: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8.9 8.9l6.2 6.2'/%3E%3Cpath d='M15.1 8.9 8.9 15.1'/%3E%3C/svg%3E");
    /* 状态条上下箭头：和 components.css 种子表头 ④⑤ 的 img.seeders/img.leechers
       同一套几何与描边宽度，「做种=绿上箭、下载=红下箭」全站只有一种画法。 */
    --nx-i-arrow-up:    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='19.5' x2='12' y2='5'/%3E%3Cpolyline points='5.5 11.5 12 5 18.5 11.5'/%3E%3C/svg%3E");
    --nx-i-arrow-down:  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='12' y1='4.5' x2='12' y2='19'/%3E%3Cpolyline points='18.5 12.5 12 19 5.5 12.5'/%3E%3C/svg%3E");
    /* 置顶图钉 */
    --nx-i-pin: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z'/%3E%3Cline x1='12' y1='17' x2='12' y2='22'/%3E%3C/svg%3E");
    /* 旗帜：页头「举报清单」img.reportbox 和详情页「举报种子」img.dt_report 共用 */
    --nx-i-flag: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.4 21.2V3.6'/%3E%3Cpath d='M5.4 4.6h11.4l-2.1 3.8 2.1 3.8H5.4z'/%3E%3C/svg%3E");
    /* 详情页操作：下载 = 竖线 + 箭头 + 托盘；求种 = 顺时针回转箭头 */
    --nx-i-download: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.8v10.4'/%3E%3Cpolyline points='7.4 9.8 12 14.4 16.6 9.8'/%3E%3Cpath d='M4.4 16.4v2a2 2 0 0 0 2 2h11.2a2 2 0 0 0 2-2v-2'/%3E%3C/svg%3E");
    --nx-i-reseed: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M19.8 12a7.8 7.8 0 1 1-2.3-5.5'/%3E%3Cpolyline points='19.9 3.2 19.9 7.2 15.9 7.2'/%3E%3C/svg%3E");
    /* 警示三角：页头 img.cheaterbox（作弊清单）和用户名后的 img.warned（被警告）共用 */
    --nx-i-alert: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.8 21.9 20.6H2.1z'/%3E%3Cpath d='M12 9.6v4.6'/%3E%3Cpath d='M12 17.4h.01'/%3E%3C/svg%3E");
    /* 圆圈感叹：和警示三角同族，靠形状区分「比例警告 / 一般警告」 */
    --nx-i-alert-circle: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7.2v5.4'/%3E%3Cpath d='M12 16.5h.01'/%3E%3C/svg%3E");
    /* 捐赠者金星：实心而非描边 —— 11px 下描边星会糊成一团，
       而且「实心=荣誉徽章、描边=状态提示」本身是一层区分。 */
    --nx-i-star: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' stroke='%23000' stroke-width='1' stroke-linejoin='round' d='M12 2.6l2.9 6 6.6 1-4.8 4.7 1.2 6.6L12 17.7l-5.9 3.2 1.2-6.6L2.5 9.6l6.6-1z'/%3E%3C/svg%3E");
    /* 论坛状态图标（见下面第 13 节）。气泡轮廓一条路径复用四次：
       描边版=已读、实心版=未读；带锁的两把是「只读」，锁在实心版里是挖空的洞。 */
    --nx-i-bubble: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 4.6h16.2a1.8 1.8 0 0 1 1.8 1.8v9.2a1.8 1.8 0 0 1-1.8 1.8h-8.1L7.4 21.4v-4H4a1.8 1.8 0 0 1-1.8-1.8V6.4a1.8 1.8 0 0 1 1.8-1.8Z'/%3E%3C/svg%3E");
    --nx-i-bubble-solid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M4 4.6h16.2a1.8 1.8 0 0 1 1.8 1.8v9.2a1.8 1.8 0 0 1-1.8 1.8h-8.1L7.4 21.4v-4H4a1.8 1.8 0 0 1-1.8-1.8V6.4a1.8 1.8 0 0 1 1.8-1.8Z'/%3E%3C/svg%3E");
    --nx-i-bubble-lock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 4.6h16.2a1.8 1.8 0 0 1 1.8 1.8v9.2a1.8 1.8 0 0 1-1.8 1.8h-8.1L7.4 21.4v-4H4a1.8 1.8 0 0 1-1.8-1.8V6.4a1.8 1.8 0 0 1 1.8-1.8Z'/%3E%3Cpath fill='%23000' stroke='none' d='M10.4 11.2V9a1.6 1.6 0 0 1 3.2 0v2.2Z'/%3E%3Cpath fill='%23000' stroke='none' d='M9.4 11.2h5.2a1.2 1.2 0 0 1 1.2 1.2v2.4a1.2 1.2 0 0 1-1.2 1.2H9.4a1.2 1.2 0 0 1-1.2-1.2v-2.4a1.2 1.2 0 0 1 1.2-1.2Z'/%3E%3C/svg%3E");
    --nx-i-bubble-lock-solid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' fill-rule='evenodd' d='M4 4.6h16.2a1.8 1.8 0 0 1 1.8 1.8v9.2a1.8 1.8 0 0 1-1.8 1.8h-8.1L7.4 21.4v-4H4a1.8 1.8 0 0 1-1.8-1.8V6.4a1.8 1.8 0 0 1 1.8-1.8ZM10.4 11.2V9a1.6 1.6 0 0 1 3.2 0v2.2ZM9.4 11.2h5.2a1.2 1.2 0 0 1 1.2 1.2v2.4a1.2 1.2 0 0 1-1.2 1.2H9.4a1.2 1.2 0 0 1-1.2-1.2v-2.4a1.2 1.2 0 0 1 1.2-1.2Z'/%3E%3C/svg%3E");
    /* 下拉箭头：给 select::picker-icon 当 mask 用（见第 14 节），
       形状和 components.css:1343 那个 data-URI 箭头一致，只是改成 mask 后颜色能跟着变量走。 */
    --nx-i-caret: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1.5 2L6 6.2L10.5 2'/%3E%3C/svg%3E");
    /* 时间区间：时钟=最近 N 天，无穷=全部时间。成对出现，只用来区分「有界 / 无界」。 */
    --nx-i-clock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7.4V12l3.4 2'/%3E%3C/svg%3E");
    --nx-i-infinity: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 12c-2-2.67-4-4-6-4a4 4 0 1 0 0 8c2 0 4-1.33 6-4Zm0 0c2 2.67 4 4 6 4a4 4 0 0 0 0-8c-2 0-4 1.33-6 4Z'/%3E%3C/svg%3E");
    /* 帖子/评论操作条（见文末第 16 节）：回复 = 向左上折的箭头，短讯 = 信封。
       和同排的 edit / del / flag 一样是 1.9 描边，保持一族。 */
    --nx-i-reply: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.2 14.2 4 9l5.2-5.2'/%3E%3Cpath d='M20 20.4v-6.8a4.4 4.4 0 0 0-4.4-4.4H4.4'/%3E%3C/svg%3E");
    --nx-i-mail: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.8' y='5.4' width='18.4' height='13.2' rx='2.2'/%3E%3Cpath d='M3.6 7.6 12 13.2l8.4-5.6'/%3E%3C/svg%3E");
    /* 引用是这一族里唯一的实心图形：描边版的双引号在 13px 下会糊成两个圈，
       而引号本身就是「块」的意象，实心反而比描边更像它。 */
    --nx-i-quote: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z'/%3E%3C/svg%3E");

    /* ── 站点数据表行首图标（见文末第 21 节）──────────────────────
       全部沿用上面同一套几何：24 viewBox、1.9 描边、圆头圆角。
       只有 crown / torrent / quote 这类「小尺寸下描边会糊」的用实心或双圈。 */
    --nx-i-calendar: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3.4' y='5.2' width='17.2' height='15.2' rx='2.2'/%3E%3Cpath d='M8 3.4v3.6'/%3E%3Cpath d='M16 3.4v3.6'/%3E%3Cpath d='M3.4 10.2h17.2'/%3E%3C/svg%3E");
    --nx-i-users: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.6'/%3E%3Cpath d='M3 20.2v-.8a5.4 5.4 0 0 1 5.4-5.4h1.2A5.4 5.4 0 0 1 15 19.4v.8'/%3E%3Cpath d='M16.2 4.8a3.6 3.6 0 0 1 0 6.6'/%3E%3Cpath d='M17.6 14.2a5.4 5.4 0 0 1 3.4 5.2v.8'/%3E%3C/svg%3E");
    --nx-i-user: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='4'/%3E%3Cpath d='M4.8 20.4v-1a6.4 6.4 0 0 1 6.4-6.4h1.6a6.4 6.4 0 0 1 6.4 6.4v1'/%3E%3C/svg%3E");
    --nx-i-user-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.4' cy='8' r='3.6'/%3E%3Cpath d='M3 20.4v-.9a5.5 5.5 0 0 1 5.5-5.5h1.7'/%3E%3Cpath d='M14.4 18.6l2.2 2.2 4.2-4.4'/%3E%3C/svg%3E");
    --nx-i-crown: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.6 6.8 8.2 10.8 12 4.6l3.8 6.2 4.6-4-1.7 9.9H5.3z'/%3E%3Cpath d='M5.3 16.7h13.4v2.7H5.3z'/%3E%3C/svg%3E");
    --nx-i-heart: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20.2S3.8 15.2 3.8 9.6a4.5 4.5 0 0 1 8.2-2.6 4.5 4.5 0 0 1 8.2 2.6c0 5.6-8.2 10.6-8.2 10.6z'/%3E%3C/svg%3E");
    --nx-i-male: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='14.2' r='5.8'/%3E%3Cpath d='M14.4 9.8 20.4 3.8'/%3E%3Cpath d='M15.2 3.8h5.2v5.2'/%3E%3C/svg%3E");
    --nx-i-female: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8.6' r='5.6'/%3E%3Cpath d='M12 14.2v6.2'/%3E%3Cpath d='M8.8 17.6h6.4'/%3E%3C/svg%3E");
    --nx-i-torrent: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Ccircle cx='12' cy='12' r='3.2'/%3E%3C/svg%3E");
    --nx-i-ghost: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 20.4V10.6a7 7 0 0 1 14 0v9.8l-2.3-1.7-2.35 1.7L12 18.7l-2.35 1.7L7.3 18.7z'/%3E%3Cpath d='M9.6 10.4h.01'/%3E%3Cpath d='M14.4 10.4h.01'/%3E%3C/svg%3E");
    --nx-i-share-nodes: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='6.2' cy='12' r='2.7'/%3E%3Ccircle cx='17.8' cy='5.6' r='2.7'/%3E%3Ccircle cx='17.8' cy='18.4' r='2.7'/%3E%3Cpath d='M8.7 10.7 15.3 6.9'/%3E%3Cpath d='M8.7 13.3 15.3 17.1'/%3E%3C/svg%3E");
    --nx-i-percent: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 18 18 6'/%3E%3Ccircle cx='7.4' cy='7.4' r='2.3'/%3E%3Ccircle cx='16.6' cy='16.6' r='2.3'/%3E%3C/svg%3E");
    --nx-i-globe: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M3.2 12h17.6'/%3E%3Cpath d='M12 3a14 14 0 0 1 0 18'/%3E%3Cpath d='M12 3a14 14 0 0 0 0 18'/%3E%3C/svg%3E");
    --nx-i-activity: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12.4h4.2L9.8 5.6l4.4 12.8 2.4-6H21'/%3E%3C/svg%3E");
    --nx-i-hard-drive: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.8 13 7.9 6.2a1.9 1.9 0 0 1 1.8-1.3h4.6a1.9 1.9 0 0 1 1.8 1.3L18.2 13'/%3E%3Crect x='3' y='13' width='18' height='7.2' rx='2'/%3E%3Cpath d='M16.6 16.6h.01'/%3E%3Cpath d='M6.6 16.6h4'/%3E%3C/svg%3E");
    --nx-i-database: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.6c4.6 0 8.4 1.3 8.4 3s-3.8 3-8.4 3-8.4-1.3-8.4-3 3.8-3 8.4-3z'/%3E%3Cpath d='M3.6 6.6v10.8c0 1.7 3.8 3 8.4 3s8.4-1.3 8.4-3V6.6'/%3E%3Cpath d='M3.6 12c0 1.7 3.8 3 8.4 3s8.4-1.3 8.4-3'/%3E%3C/svg%3E");
    --nx-i-shield: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.6 3.6h14.8v8c0 4.9-7.4 9-7.4 9s-7.4-4.1-7.4-9z'/%3E%3C/svg%3E");
    /* ── 种子列表：收藏 + 表头三颗（见文末第 22 节）──────────────────
       这批引用先写、定义漏了 ⇒ mask 取初始值 none，元素只剩 14/15px 的
       background-color 方块。几何沿用同族：24 viewBox、1.9 描边、圆头圆角。 */
    --nx-i-bookmark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 3.6h10a1.6 1.6 0 0 1 1.6 1.6v15.6L12 16.6l-6.6 4.2V5.2A1.6 1.6 0 0 1 7 3.6Z'/%3E%3C/svg%3E");
    --nx-i-bookmark-solid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' stroke='%23000' stroke-width='1' stroke-linejoin='round' d='M7 3.6h10a1.6 1.6 0 0 1 1.6 1.6v15.6L12 16.6l-6.6 4.2V5.2A1.6 1.6 0 0 1 7 3.6Z'/%3E%3C/svg%3E");
    /* 评论 = 气泡，和论坛状态图标同一条路径，只是这里是排序提示不是未读状态。 */
    --nx-i-comment: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 4.6h16.2a1.8 1.8 0 0 1 1.8 1.8v9.2a1.8 1.8 0 0 1-1.8 1.8h-8.1L7.4 21.4v-4H4a1.8 1.8 0 0 1-1.8-1.8V6.4a1.8 1.8 0 0 1 1.8-1.8Z'/%3E%3C/svg%3E");
    /* 体积 = 折角文档：只留折角，14px 下加内容线会糊成横杠。 */
    --nx-i-file: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.6 3.6H7.2a1.9 1.9 0 0 0-1.9 1.9v13a1.9 1.9 0 0 0 1.9 1.9h9.6a1.9 1.9 0 0 0 1.9-1.9V8.8z'/%3E%3Cpath d='M13.6 3.6v5.2H18.7'/%3E%3C/svg%3E");
    /* 完成次数 = 圆里一个对勾，读作「已达成」而不是「下载中」。 */
    --nx-i-badge-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M7.9 12.1l2.9 2.9 5.3-5.8'/%3E%3C/svg%3E");
}

/* — ① 折叠开关 ————————————————————————————————————————————— */
html[data-nx-theme] img.plus,
html[data-nx-theme] img.minus {
    width: 16px;
    height: 16px;
    /* ⚠️ base.css 的 `img{max-width:100%}` 在窄表格里会把图标压成细条，必须显式解除 */
    max-width: none;
    vertical-align: -3px;
    background-image: none;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
    -webkit-mask-position: center;  mask-position: center;
    -webkit-mask-size: contain;     mask-size: contain;
}
/* 折叠着的时候才是「点开看看」，用主色勾出来；已经展开就退成中性色 */
html[data-nx-theme] img.plus {
    background-color: var(--nx-primary);
    -webkit-mask-image: var(--nx-i-plus);
    mask-image: var(--nx-i-plus);
}
html[data-nx-theme] img.minus {
    background-color: var(--nx-text-tertiary);
    -webkit-mask-image: var(--nx-i-minus);
    mask-image: var(--nx-i-minus);
}
/* 组件层 `#outer a[href*="klappe_news"] img{opacity:.6}` 会把牌子洗淡，这里翻回全强度 */
html[data-nx-theme] #outer a[href*="klappe_news"] img.plus,
html[data-nx-theme] #outer a[href*="klappe_news"] img.minus { opacity: 1; }
/* 折叠标题行是 flex（components.css:860），index.php 折叠态那个裸 `<br />` 会变成一个
   占位的 flex 项，白白撑出一道 gap —— 干掉。 */
html[data-nx-theme] #outer a[href*="klappe_news"] > br { display: none; }
/* 上下间距**不再额外补 margin**：容器那条 strut（见上面的 line-height）本身是上下对称的，
   实测「标题→自己的操作胶囊」和「胶囊→下一条标题」都是 8.3px。之前给非首条标题加过
   `margin-top: var(--nx-space-3)`（想让分组关系更明显、做成 1:2），用户反馈「上下间隔要一致」，
   所以删掉 —— 留着它就成了上面 8.3 / 下面 16.3 的偏心。 */

/* — ② 让方括号隐形 ————————————————————————————————————————— */
html[data-nx-theme] #outer h2 font.small {
    display: inline-flex;
    align-items: center;
    font-size: 0;   /* ← 只有裸文本节点（`[` `]` ` - `）受影响，子元素下面会恢复 */
}
html[data-nx-theme] #outer td.text > div[style*="margin-left"] {
    font-size: 0;
    /* font-size 归零让裸方括号隐形，行高就得自己补：胶囊那一行是匿名行盒，
       没有任何元素能挂 margin，只能靠 strut 把它撑出上下各 ~8px 的呼吸。
       取一个完整的间距节拍（--nx-space-9 = 40px）：胶囊本身 23.4px 居中，
       上下各余 (40-23.4)/2 ≈ 8.3px。 */
    line-height: var(--nx-space-9);
}
html[data-nx-theme] #outer td.text > div[style*="margin-left"] > * {
    font-size: var(--nx-font-base);
    line-height: var(--nx-leading-normal);
}

/* — ③ 操作链接做成小号胶囊，配矢量图标 ——————————————————————— */
/* 折叠标题本身也是这个 div 的直接子节点，必须排除掉，别把它做成胶囊 */
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a:not([href*="klappe_news"]) {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    margin-left: var(--nx-space-2);
    padding: 1px 9px 1px 7px;
    font-size: var(--nx-font-xs);
    font-weight: var(--nx-weight-medium);
    line-height: 1.8;
    /* ⚠️ 必须 !important：components.css:696 那条「上古通知条」规则漏写了
       `td:only-child:not([class])` 的 :not，于是首页新闻区的
       `#outer > table:not([class]) > tr > td.text a` 全被它命中，
       给每条链接刷上 `color: var(--nx-link) !important`。
       通知条本体（678 行）要求 td 无 class，这条 a 却没要求 —— 属误伤，
       但它在三份主题 components.css 里都有，改它波及面比改这里大得多，
       所以只在胶囊这一小片范围内把它压回去。 */
    color: var(--nx-text-secondary) !important;
    background: var(--nx-surface-alt);
    border: var(--nx-border-thin) solid var(--nx-border);
    border-radius: 999px;
    text-decoration: none;
    vertical-align: middle;
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a b {
    font-weight: inherit;
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a:hover {
    color: var(--nx-primary-strong) !important;
    background: var(--nx-primary-soft);
    border-color: var(--nx-primary-border);
    /* 通知条那条规则命中时会顺便加下划线，胶囊不需要 */
    text-decoration: none;
}
/* 删除 / 禁止 是破坏性操作，悬停给红 */
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=delete"]:hover,
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=ban"]:hover {
    color: var(--nx-danger-text) !important;
    background: var(--nx-danger-soft);
    border-color: var(--nx-danger-text);
}

html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a::before {
    content: "";
    flex: 0 0 auto;
    width: 12px;
    height: 12px;
    -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
    -webkit-mask-position: center;  mask-position: center;
    -webkit-mask-size: contain;     mask-size: contain;
}
/* 按 href 认领图标。⚠️ 用 `*=`（包含）不是 `^=`（前缀）—— href 是绝对 URL。
   background-color 跟 mask 写在同一条里：万一某个 href 没被下面命中，
   最坏是「没图标」而不是「一个 12px 的实心方块」。 */
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=edit"]::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-edit); mask-image: var(--nx-i-edit);
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=delete"]::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-del); mask-image: var(--nx-i-del);
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=ban"]::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-ban); mask-image: var(--nx-i-ban);
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="action=new"]::before {
    background-color: var(--nx-primary);
    -webkit-mask-image: var(--nx-i-new); mask-image: var(--nx-i-new);
}
html[data-nx-theme] #outer :is(h2 font.small, td.text > div[style*="margin-left"]) > a[href*="log.php"]::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-more); mask-image: var(--nx-i-more);
}
/* 「新闻页面」是纯 news.php，不带 action；带 action 的编辑/删除已经被上面截走了，
   这里再加一道 :not 兜底，避免同一条链接叠两个图标。 */
html[data-nx-theme] #outer h2 font.small > a[href*="news.php"]:not([href*="action="])::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-news); mask-image: var(--nx-i-news);
}

/* ==========================================================================
   11. 登录 / 找回密码类页面：把内容卡的「上边圆角」露出来（2026-09-19）
   ==========================================================================
   这几页的 DOM 是 `body > table.mainouter > tr > td#nav_block`，#nav_block 不是导航条
   而是整页内容卡。base.css:183 已经给它配了 --nx-radius-xl 圆角 + 内边距，但圆角
   看不见 —— 因为它外面那张 table.mainouter（base.css:132）是**直角的白底 + 同色描边 +
   投影**，白压白，卡片上方两个角被完全盖住，看起来就是「登录页上边没有圆角」。
   （和 2026-09-17 那次「菜单下边的 div 没圆弧」是同一类问题：圆角被同色直角层盖掉。）

   解法：这几页把外层表退成透明、无边、无影，卡片外观整个交给 #nav_block 自己负责；
   再让它和顶部条之间留一道缝，圆角背后有渐变底可透，才真的读得出「圆」。
   判据沿用 base.css:183 那三条（login / recover+confirm_resend / signup 提示页）。
   ⚠️ 不能写成 `table.mainouter:has(td#nav_block:has(#login-form))` —— 实测这一版
   Chromium 的 CSS 解析器直接判为非法选择器，**整条规则被丢弃**（连 :has 里再套 :has
   都不行）。所以下面一律摊平成一层 `:has(后代选择器)`。 */
html[data-nx-theme] table.mainouter:has(#login-form),
html[data-nx-theme] table.mainouter:has(#nav_block > form > table[border]),
html[data-nx-theme] table.mainouter:has(#nav_block > table > tbody > tr > td.embedded) {
    background: transparent;
    border: 0;
    box-shadow: none;
    margin-top: var(--nx-space-5);
}
/* #nav_block 原本是「贴在白表上的导航条」，所以只有底色、没有描边和投影；
   现在它独立成卡，补上和 #footer 同一档次的边与影。

   ⚠️ 2026-09-20 补 `:not(:has(ul.menu))`：上面那三条判据里的
   `#nav_block > table > tbody > tr > td.embedded` 其实**把普通导航页也扫进来了**
   —— begin_main_frame() 就是把 `<nav id="nav">` 包在 table.main > td.embedded 里的，
   于是每一页的 #nav_block 都被画成一张铺满 mainouter 整行的卡（实测 0..1620），
   而正文卡被 #outer 的 16px padding 收窄到 16..1604：头部每边凭空比下面宽 16px，
   就是用户反馈的「这两边看着比上边窄」。
   判据换成「nav_block 里没有导航菜单才算内容容器」—— 登录 / 找回 / 注册关闭
   三页都没有 ul.menu，照旧拿到整页卡；导航页的卡片感由里面的 table.main（导航条）
   和 #info_block（用户信息条）自己承担，正好和下面的公告块、内容卡左右对齐。 */
html[data-nx-theme] #nav_block:has(#login-form),
html[data-nx-theme] #nav_block:has(> form > table[border]),
html[data-nx-theme] #nav_block:has(> table > tbody > tr > td.embedded):not(:has(ul.menu)) {
    border: var(--nx-border-thin) solid var(--nx-card-border);
    box-shadow: var(--nx-shadow-sm);
}
/* 清空聊天室的链接 href 是 `javascript:;`，只能靠容器 id 定位 */
html[data-nx-theme] #outer h2 #clear-shout-box > a::before {
    background-color: var(--nx-text-secondary);
    -webkit-mask-image: var(--nx-i-clear); mask-image: var(--nx-i-clear);
}

/* ==========================================================================
   12. 论坛搜索卡（forums.php?action=search，2026-09-19）
   ==========================================================================
   原来整块是烤死的图：pic/search.gif 当背景、search_button.gif 当提交按钮，
   外面套一个 .search{width:579px;height:95px} 的死盒，标题色 #0062AE / 底色
   #DAF3FB 写死在 forums.php 的内联 <style> 里 —— 不跟主题、不跟宽度、放大发虚。

   输入框和按钮**不在这里定义**：改成无 class 的 <input> 和 <button class="nx-btn-primary">
   之后，components.css:275（#outer input:not([class])）和 :332（button / .nx-btn-primary）
   的既有体系直接接管，和站内其它表单一个长相。这里只负责拆掉那张图和排布局。 */
html[data-nx-theme] .search.nx-forum-search {
    width: auto;
    height: auto;
    margin: 0 0 var(--nx-space-6);
    background: var(--nx-surface);
    border: var(--nx-border-thin) solid var(--nx-card-border);
    border-radius: var(--nx-radius-lg);
    box-shadow: var(--nx-shadow-sm);
    overflow: hidden;
}
/* 标题行：老的「淡蓝底 + 蓝字」换成分区头（和表格 colhead 同一档次） */
html[data-nx-theme] .nx-forum-search .search_title {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--nx-space-3);
    padding: var(--nx-space-4) var(--nx-space-6);
    background: var(--nx-surface-sunken);
    border-bottom: var(--nx-border-thin) solid var(--nx-border);
    color: var(--nx-text);
    font-size: var(--nx-font-base);
    font-weight: var(--nx-weight-semibold);
    line-height: var(--nx-leading-snug);
}
/* 「找到 N 条 / 没有找到」是次要信息，别和标题抢视线 */
html[data-nx-theme] .nx-forum-search__status {
    font-size: var(--nx-font-sm);
    font-weight: var(--nx-weight-normal);
    color: var(--nx-text-secondary);
}
html[data-nx-theme] .nx-forum-search__form {
    /* 内联 style 里的 Tahoma/11px 已经跟着 markup 一起删了，这里只留呼吸 */
    padding: var(--nx-space-6);
    margin: 0;
}
html[data-nx-theme] .nx-forum-search__label {
    display: block;
    margin-bottom: var(--nx-space-2);
    font-size: var(--nx-font-sm);
    color: var(--nx-text-secondary);
}
html[data-nx-theme] .nx-forum-search__row {
    display: flex;
    flex-wrap: wrap;
    gap: var(--nx-space-3);
}
/* 输入框自己长出来填满一行，按钮靠右；markup 上那个 width:400px 是留给老主题的，
   flex-basis 优先级高于 width，所以在这里会被自然覆盖掉。 */
html[data-nx-theme] .nx-forum-search__row > input {
    flex: 1 1 240px;
    min-width: 0;
}
html[data-nx-theme] .nx-forum-search__row > button {
    flex: 0 0 auto;
}
@media (max-width: 640px) {
    html[data-nx-theme] .nx-forum-search__form { padding: var(--nx-space-5); }
    html[data-nx-theme] .nx-forum-search__row > input,
    html[data-nx-theme] .nx-forum-search__row > button { flex: 1 1 100%; }
}

/* ==========================================================================
   13. 论坛「已读 / 未读 / 锁定」状态图标（forums.php，2026-09-19）
   ==========================================================================
   和上面短讯列表那一节是同一个病：public/styles/sprites.css:61-77 把
   img.unlocked / .unlockednew / .locked / .lockednew 指向 icons.gif 雪碧图的
   35×36 老 bitmap —— 不跟主题、深色下糊成一团、放大发虚。
   标记见 public/forums.php:67 的 get_topic_image()，输出的是
   `<img class="unlocked" src="pic/trans.gif">`：图本身是 1px 透明像素，
   看到的形状全由 CSS 画，所以不动 PHP 就能整颗换掉。

   配色/形状仍走「描边=已读、实心=未读」这套（和 readpm/unreadpm 一致），
   锁定态在气泡里加一把锁。四种状态：
     unlocked    描边气泡 + 三级灰   —— 可回复，没有新帖
     unlockednew 实心气泡 + 主色     —— 可回复，有新帖
     locked      描边气泡 + 锁       —— 只读，没有新帖
     lockednew   实心气泡 + 挖空锁   —— 只读，有新帖
   ⚠️ 挖空那版用 fill-rule='evenodd'：气泡是外轮廓，锁的两段（拱 + 体）作为
      内子路径变成洞，这样锁是「透出来」的，不需要第二层颜色。
   ⚠️ 同 readpm：必须显式 max-width:none，否则会被 base.css 的 `img{max-width:100%}`
      按列宽夹扁；也不加 transition，避免主题切换时变量色不重算。 */
html[data-nx-theme] img.unlocked,
html[data-nx-theme] img.unlockednew,
html[data-nx-theme] img.locked,
html[data-nx-theme] img.lockednew {
    width: 22px;
    height: 22px;
    vertical-align: middle;
    max-width: none;
    background-image: none;
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-position: center;
    mask-position: center;
    -webkit-mask-size: contain;
}
/* 可回复 · 已读：描边气泡 */
html[data-nx-theme] img.unlocked {
    background-color: var(--nx-text-tertiary);
    opacity: .75;
    -webkit-mask-image: var(--nx-i-bubble); mask-image: var(--nx-i-bubble);
}
/* 可回复 · 未读：实心气泡 + 主色 */
html[data-nx-theme] img.unlockednew {
    background-color: var(--nx-primary);
    -webkit-mask-image: var(--nx-i-bubble-solid); mask-image: var(--nx-i-bubble-solid);
}
/* 只读 · 已读：描边气泡里嵌一把实心锁 */
html[data-nx-theme] img.locked {
    background-color: var(--nx-text-tertiary);
    opacity: .75;
    -webkit-mask-image: var(--nx-i-bubble-lock); mask-image: var(--nx-i-bubble-lock);
}
/* 只读 · 未读：实心气泡把锁挖空 */
html[data-nx-theme] img.lockednew {
    background-color: var(--nx-primary);
    -webkit-mask-image: var(--nx-i-bubble-lock-solid); mask-image: var(--nx-i-bubble-lock-solid);
}


/* ==========================================================================
   14. <select> 展开面板（弹层里的 option 列表）——2026-09-19，2026-09-20 实测修正
   --------------------------------------------------------------------------
   目标：弹层原先是白底 + 系统蓝高亮 + 系统字体，和卡片式的设计系统不搭。

   ⚠️ 2026-09-20 用 CDP 真点开弹层截图量过（.workbuddy/tools/picker-shot.php），
   结论和当初的设想不一样，先记在这儿免得下次重新踩：
   Edge/Chromium 153 (Windows) 下 `appearance: base-select` 只升级了【按钮那一行】，
   弹层仍旧是老的原生菜单。判据是一个不带任何本站样式的裸页面（.workbuddy/_lab_bare.html）：
     ✅ 会生效：::picker-icon（箭头换图/变色/转 180°）、option 的 color / background-color / font-size
     ❌ 不生效：::picker(select) 的 background / padding / border / border-radius / box-shadow，
                option 的 padding / border-radius（30px 内边距量出来行高仍是 26px）
     ❌ 盖不掉：选中项那条整宽实心高亮（系统画的，option:checked 被它压住）
     ❌ 进不去：CDP 的 mouseMoved 落不到弹层里，option:hover 实测永不命中
   也就是说：这一节里【容器和 option 盒模型的部分现在画不出来】，留着是因为写法本身是
   标准方向，浏览器真把弹层交给 web 渲染时会自动点亮；不要据此以为弹层已经改好了。
   现在真正改变外观的只有箭头那一枚，和 option 的字色/底色。
   ⇒ 所以对外的正经方案是第 15 节的自绘面板（select[data-nx-dd]，逐个勾选启用）；
     本节继续负责所有没勾选的普通 select：按钮那一行 + 箭头 + 选项字色/底色仍然是它的。

   不支持 base-select 的浏览器（Safari、Firefox）走 @supports 外面，保持原生弹层。
   这里不给弹层加自定义淡入：Chrome 默认已带开合动画，自己写 opacity + @starting-style
   一旦 :open 选不中就会得到「透明的下拉框」，风险远大于收益。

   两个坑仍然成立：
   ① 开 base-select 后必须关掉原来的 data-URI 背景箭头，否则出现两支箭头。
      components.css 那两条带 `#outer`（ID 特异度 1,1,1），所以这里也要补一份
      `html[data-nx-theme] #outer select`；nexus.css 在主题 CSS 之后加载，同特异度靠书写顺序赢。
   ② option 同理：components.css:1364/1370 的 `#outer select option[:checked]`
      特异度 (1,0,3)/(1,0,4)，比 `html[data-nx-theme] select option` 高，
      所以每条 option 规则都得写成两份。 */
@supports (appearance: base-select) {
    /* 关掉系统外观 + 抹掉背景箭头（见上方坑 ①） */
    html[data-nx-theme] select,
    html[data-nx-theme] #outer select {
        appearance: base-select;
        background-image: none;
        /* 弹层里「当前项」那条实心高亮是 Chrome 用 accent-color 画的，option:hover
           盖不住它（实测：截图里那一条饱和蓝就是系统蓝，不是我们的浅灰）。
           把它交给主题色，至少蓝的是我们的蓝。 */
        accent-color: var(--nx-primary);
        /* 2026-09-19 实测：开 base-select 后 select 变成 flex 行，盒高不再是
           「padding + 一行字」那么直白，而是跟着当前脚本的行盒走 —— 同样 8px 上下
           内边距，中文项 36.8、纯英文项 32.8，和并排的输入框（32.8）怎么都对不齐，
           这正是用户反复抓的「不一样高」。这里把行高钉成一个与字形无关的定值：
           13px × 1.17 = 15.2px，正好等于输入框自己（tahoma / line-height:normal）的
           内容高。于是中英混排一律 32.81 ≈ 32.8，上下内边距也保住了设计系统的原值。 */
        line-height: calc(var(--nx-font-base) * 1.17);
        /* base-select 把 select 变成普通盒子，于是也会跟着换行：筛选栏挤一点，
           选中项就折成两行、盒高一倍（实测 32.8 → 48）。按原生 select 的行为钉死。
           注：想再补一句 overflow:hidden 把超长的选中项裁掉是无效的 —— 实测这条
           会被强制回 visible（弹层是 select 的后代，浏览器不肯让它被裁），
           而 ::selectedcontent 在本机构建里能读到伪元素却样式化不了。好在 flex
           子项的 min-width:auto 已经不允许盒子缩到内容宽度以下，正常工具栏挤不出来。 */
        white-space: nowrap;
        /* 箭头从「背景图 + 24px 留位」变成了真正的 flex 子项，右边留 16px 就够
           （16 + 11/2 = 21.5px，和原先背景箭头的中心位置分毫不差）。 */
        padding-inline-end: var(--nx-space-5);
    }

    /* 箭头：mask 上色的 chevron，贴右端，悬停/展开时换色 */
    html[data-nx-theme] select::picker-icon {
        content: "";
        width: 11px;
        height: 8px;
        flex-shrink: 0;
        margin-inline-start: auto;
        background-color: var(--nx-text-tertiary);
        -webkit-mask-image: var(--nx-i-caret); mask-image: var(--nx-i-caret);
        -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
        -webkit-mask-position: center; mask-position: center;
        -webkit-mask-size: contain; mask-size: contain;
        /* 箭头本来就靠 margin-inline-start:auto 贴在右端，转起来不会偏。
           只 transition transform —— 颜色走变量，加了过渡主题切换时不重算（全站老坑）。 */
        transform-origin: center;
        transition: transform var(--nx-dur-fast) var(--nx-ease-out);
    }
    html[data-nx-theme] select:hover::picker-icon { background-color: var(--nx-text-secondary); }
    /* :open 选不中时最坏结果只是「箭头不转」，不会出现看不见控件的情况 */
    html[data-nx-theme] select:open::picker-icon {
        background-color: var(--nx-primary);
        transform: rotate(180deg);
    }

    /* 弹层本体：和卡片同一套圆角/描边/阴影 */
    html[data-nx-theme] select::picker(select) {
        background: var(--nx-surface);
        border: var(--nx-border-thin) solid var(--nx-card-border);
        border-radius: var(--nx-radius-lg);
        box-shadow: var(--nx-shadow-lg);
        padding: var(--nx-space-2);
        color: var(--nx-text);
        font-family: inherit;
    }

    /* 选项。实测这一版浏览器只把 color / background-color / font-size 画进弹层，
       padding / border-radius / line-height 都吃不到（见本节开头），所以底色必须
       是不透明的 surface 而不是 transparent —— transparent 会让弹层露出系统白，
       深色主题下就成了白底浅字。盒模型那几条留着，等浏览器接管弹层渲染时自动生效。 */
    html[data-nx-theme] select option,
    html[data-nx-theme] #outer select option {
        padding: var(--nx-space-3) var(--nx-space-4);
        border-radius: var(--nx-radius-sm);
        /* 上面给 select 钉了 nowrap，这里还给选项：弹层宽度不跟着内容长，
           长选项宁可换行走两层，也不要被裁掉半个词。 */
        white-space: normal;
        color: var(--nx-text);
        background-color: var(--nx-surface);
        line-height: var(--nx-leading-snug);
        cursor: pointer;
    }
    html[data-nx-theme] select option:hover,
    html[data-nx-theme] select option:focus,
    html[data-nx-theme] #outer select option:hover,
    html[data-nx-theme] #outer select option:focus {
        background-color: var(--nx-surface-hover);
        color: var(--nx-text);
    }
    /* 选中项：设计系统里 hover / 选中本来就是两档（--nx-surface-hover /
       --nx-surface-active）。原先我错用了 --nx-primary-soft，浅色下它和
       --nx-surface-hover 都是 #eff6ff，两态撞成同一个颜色，等于没有反馈。 */
    html[data-nx-theme] select option:checked,
    html[data-nx-theme] #outer select option:checked {
        color: var(--nx-primary-strong);
        background-color: var(--nx-surface-active);
        font-weight: var(--nx-weight-semibold);
    }
    html[data-nx-theme] select option:checked:hover,
    html[data-nx-theme] #outer select option:checked:hover {
        background-color: var(--nx-surface-active);
        color: var(--nx-primary-strong);
    }
    html[data-nx-theme] select option:disabled,
    html[data-nx-theme] #outer select option:disabled {
        color: var(--nx-text-disabled);
        background-color: transparent;
        cursor: not-allowed;
    }
}


/* ==========================================================================
   15. 自绘下拉（select[data-nx-dd] + nexus.js 末尾那段 IIFE）——2026-09-20
   --------------------------------------------------------------------------
   ⏸ 当前【休眠】：全站没有 select 带 data-nx-dd，本节和 JS 那段都不生效，
     线上仍是第 14 节那套（原生弹层）。启用 = 给某个 select 加 data-nx-dd；
     启用前先读 nexus.js 里那条「点选项没提交」的待查 bug。
   --------------------------------------------------------------------------
   第 14 节量明白了一件事：弹层那层 CSS 在这台浏览器上画不出来，想要设计系统里那张
   圆角卡片只能自己画。JS 保留真 <select>（表单、value、GET 参数、onchange 全不动），
   把它从版面上摘掉，另画 button + ul[role=listbox] 顶上。本节只负责外观。

   结构（JS 生成）：
     <span class="nx-dd">              定位上下文；min-width 由 JS 按「最宽选项」写入
       <select data-nx-dd>             绝对定位 + visibility:hidden，只剩可提交能力
       <button class="nx-dd__btn">     看见的那一行
         <span class="nx-dd__label">   当前项文字
         <span class="nx-dd__caret">   箭头（--nx-i-caret）
       </button>
       <ul class="nx-dd__list">        面板 = surface + 描边 + radius-lg + shadow-lg
         <li class="nx-dd__opt">       选项：键盘/悬停当前项 is-active，选中项 is-selected
         <li class="nx-dd__group">     optgroup 标题
       </ul>
     </span>

   ① 只处理带 data-nx-dd 的 select：这是人工逐个勾选的开关，不给全站裸 select 默认换
      实现 —— 自绘面板要自己扛键盘、滚动、窄屏翻转，未验证过的地方不该冒这个险。
   ② 按钮盒模型和第 14 节 / components.css:1321 的裸 select 逐条对齐（同一套内边距、
      1px 描边、radius-md、inset 阴影、13px×1.17 行盒 = 32.81px 高），所以它能和并排的
      输入框严格等高对齐，不会又变成「上下差一截」。
   ③ components.css:338 有条 `button:not([class*="xdsoft"])` 的全局胶囊样式；
      .nx-dd__btn 带 class，天然免役，因此这里是从零定义，别指望继承到任何东西。
   ④ 面板是 ul、选项是 li，正好撞在 components.css:1159/1166/1169 那批 `#outer ul` /
      `#outer li` 上（ID 特异度 1,0,1，比 `html[data-nx-theme] .nx-dd__list` 的 0,2,1 高）：
      实测吃到的是 padding-left 24px、list-style: disc、li margin-bottom 8px。
      和第 14 节一样，凡是会被这批规则命中的都写成两份，带 #outer 的那份才管用。 */
html[data-nx-theme] .nx-dd {
    position: relative;
    display: inline-block;
    vertical-align: middle;
}

/* 真 select：还在表单里、还能提交，只是不占版面也不画。
   绝对定位是为了不撑父容器宽度（宽度归 min-width 管），visibility:hidden 比 opacity:0
   更省心 —— 不会有半透明的原生控件漏出来，也不参与命中测试。 */
html[data-nx-theme] .nx-dd select[data-nx-dd] {
    position: absolute;
    left: 0;
    top: 0;
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    visibility: hidden;
    pointer-events: none;
}

html[data-nx-theme] .nx-dd__btn {
    display: flex;
    align-items: center;
    box-sizing: border-box;
    width: 100%;
    padding: var(--nx-space-3) var(--nx-space-5) var(--nx-space-3) var(--nx-space-4);
    line-height: calc(var(--nx-font-base) * 1.17);
    color: var(--nx-text);
    background-color: var(--nx-surface);
    border: var(--nx-border-thin) solid var(--nx-border-strong);
    border-radius: var(--nx-radius-md);
    box-shadow: var(--nx-shadow-inset);
    cursor: pointer;
    text-align: start;
}
html[data-nx-theme] .nx-dd__btn:hover { border-color: var(--nx-primary); }
html[data-nx-theme] .nx-dd[data-nx-open] .nx-dd__btn {
    border-color: var(--nx-primary);
    color: var(--nx-primary-strong);
}
html[data-nx-theme] .nx-dd__btn:disabled {
    color: var(--nx-text-disabled);
    cursor: not-allowed;
    opacity: 0.6;
}

html[data-nx-theme] .nx-dd__label {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

/* 箭头和第 14 节 ::picker-icon 同一枚 mask、同一个落点（右边距 16 + 半个箭头 5.5），
   所以勾选过和没勾选的下拉框并排看不会看出两套样式。只 transition transform。 */
html[data-nx-theme] .nx-dd__caret {
    flex-shrink: 0;
    width: 11px;
    height: 8px;
    margin-inline-start: var(--nx-space-2);
    background-color: var(--nx-text-tertiary);
    -webkit-mask-image: var(--nx-i-caret); mask-image: var(--nx-i-caret);
    -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
    -webkit-mask-position: center; mask-position: center;
    -webkit-mask-size: contain; mask-size: contain;
    transform-origin: center;
    transition: transform var(--nx-dur-fast) var(--nx-ease-out);
}
html[data-nx-theme] .nx-dd__btn:hover .nx-dd__caret { background-color: var(--nx-text-secondary); }
html[data-nx-theme] .nx-dd[data-nx-open] .nx-dd__caret {
    background-color: var(--nx-primary);
    transform: rotate(180deg);
}

html[data-nx-theme] .nx-dd__list,
html[data-nx-theme] #outer .nx-dd__list {
    position: absolute;
    z-index: var(--nx-z-popover);
    left: 0;
    top: calc(100% + var(--nx-space-2));
    box-sizing: border-box;
    /* 窄屏兜底：面板最宽到 20rem，但不越过视口左右各 16px；装不下就跟着按钮收缩 */
    width: max-content;
    min-width: 100%;
    max-width: min(20rem, calc(100vw - 2 * var(--nx-space-5)));
    max-height: 17rem;
    overflow: auto;
    overscroll-behavior: contain;
    margin: 0;
    padding: var(--nx-space-2);
    list-style: none;
    line-height: var(--nx-leading-snug);
    font-size: var(--nx-font-base);
    color: var(--nx-text);
    background-color: var(--nx-surface);
    border: var(--nx-border-thin) solid var(--nx-card-border);
    border-radius: var(--nx-radius-lg);
    box-shadow: var(--nx-shadow-lg);
}
html[data-nx-theme] .nx-dd__list[hidden],
html[data-nx-theme] #outer .nx-dd__list[hidden] { display: none; }
/* 下方放不下时 JS 加 .nx-dd--up，朝上开 */
html[data-nx-theme] .nx-dd--up .nx-dd__list {
    top: auto;
    bottom: calc(100% + var(--nx-space-2));
}

html[data-nx-theme] .nx-dd__opt,
html[data-nx-theme] #outer .nx-dd__opt,
html[data-nx-theme] .nx-dd__group,
html[data-nx-theme] #outer .nx-dd__group {
    margin: 0;   /* 见上方坑 ② */
}
html[data-nx-theme] .nx-dd__opt,
html[data-nx-theme] #outer .nx-dd__opt {
    padding: var(--nx-space-3) var(--nx-space-4);
    border-radius: var(--nx-radius-sm);
    line-height: var(--nx-leading-snug);
    white-space: normal;
    cursor: pointer;
}
/* 当前项（键盘高亮）和选中项分两档，和设计系统里 hover / 选中的关系一致 */
html[data-nx-theme] .nx-dd__opt.is-active,
html[data-nx-theme] #outer .nx-dd__opt.is-active { background-color: var(--nx-surface-hover); }
html[data-nx-theme] .nx-dd__opt.is-selected,
html[data-nx-theme] #outer .nx-dd__opt.is-selected {
    color: var(--nx-primary-strong);
    font-weight: var(--nx-weight-semibold);
    background-color: var(--nx-surface-active);
}
html[data-nx-theme] .nx-dd__opt.is-disabled,
html[data-nx-theme] #outer .nx-dd__opt.is-disabled {
    color: var(--nx-text-disabled);
    cursor: not-allowed;
}

html[data-nx-theme] .nx-dd__group,
html[data-nx-theme] #outer .nx-dd__group {
    padding: var(--nx-space-3) var(--nx-space-4) var(--nx-space-1);
    font-size: var(--nx-font-xs);
    font-weight: var(--nx-weight-semibold);
    letter-spacing: 0.04em;
    color: var(--nx-text-tertiary);
}

/* ── 进度条一族（2026-09-22）──────────────────────────────────────────────
   原来这些条全是从 public/styles/bar.gif 上按行切出来的位图带
   （sprites.css:409-476），明暗两套主题共用同一张灰图，深色下像贴了块胶带。
   在用的只有三处：
     · mybonus.php:500  做种积分进度   td.loadbarbg > img.loadbar{green,yellow,red}
     · index.php:371    首页投票条     img.bar_end + img.sltbar / img.unsltbar
     · log.php:432      统计条         img.bar_end + img.unsltbar
   sprites.css 里的 progbar* / bar_left / bar_right 不给样式 —— 它们是死代码，
   唯一的产出者 include/functions.php 的 get_progress_bar() 全站零调用。
   宽度全部由 PHP 写在 style="width: Npx" 上，这里不碰，只换底色 / 圆角 / 配色。 */
html[data-nx-theme] td.loadbarbg {
    background: var(--nx-surface-sunken);
    border-radius: 999px;
    overflow: hidden;
    /* 单元格里的 img 是行内元素，基线下方会留出行高余量（实测 15px 的条
       把 td 顶到 19px），轨道因此比填充高出一圈。清掉行高即可贴合。 */
    line-height: 0;
}
html[data-nx-theme] img.loadbargreen,
html[data-nx-theme] img.loadbaryellow,
html[data-nx-theme] img.loadbarred,
html[data-nx-theme] img.sltbar,
html[data-nx-theme] img.unsltbar {
    max-width: none;
    background-image: linear-gradient(180deg, rgba(255, 255, 255, .22), rgba(255, 255, 255, 0) 55%);
    border-radius: 999px;
}
html[data-nx-theme] img.loadbargreen  { background-color: var(--nx-success); }
html[data-nx-theme] img.loadbaryellow { background-color: var(--nx-warning); }
html[data-nx-theme] img.loadbarred    { background-color: var(--nx-danger); }
/* 投票条：没投过的那档也要看得见，所以给它描边而不是只铺浅底 */
html[data-nx-theme] img.unsltbar {
    background-color: var(--nx-surface-sunken);
    box-shadow: inset 0 0 0 1px var(--nx-border);
}
html[data-nx-theme] img.sltbar { background-color: var(--nx-primary); }
/* 两端那 1px 封口（bar_end）在胶囊造型下会变成两个灰点，收掉 */
html[data-nx-theme] img.bar_end { display: none; }

/* ── 首页「最多上传」的时间区间切换（index.php:249，2026-09-22）──────────
   原来是一整行 <td class="colhead">：点一下 colhead 类被 JS 挪到另一格
   （index.php:235-245），于是「当前区间」长得和表格表头一模一样 —— 半张
   灰带贴在列表上，看不出这是个可以点的开关。
   改成设计系统里的分段控件：下沉轨道 + 一枚抬起的滑块，图标区分「有界 /
   无界」两种区间。标记一行都不动，状态仍然由 JS 的 colhead 决定。
   ⚠️ 选择器不能嵌 :has()（Chromium 会整条丢弃），这里 :has() 只用一层。
   ⚠️ 必须带 #outer：components.css 的「无 class 布局表」规则是 #outer 开头的
      （ID 特异性 (1,2,1)），不带它 border / border-radius 会被压掉。 */
html[data-nx-theme] #outer table:has(> tbody > tr.tr-top-uploader-tab) {
    display: block;
    width: 100%;
    margin: 0 0 var(--nx-space-4);
    padding: 3px;
    background-color: var(--nx-surface-sunken);
    border: var(--nx-border-thin) solid var(--nx-border);
    border-radius: 999px;
}
/* tbody 显式回 block，tr 才能占满整行；tr 自己是 flex 容器，把两格等分。
   （只给 tbody 设 flex 的话，tr 作为 flex-item 不生长，两格会缩成文字宽。） */
html[data-nx-theme] #outer table:has(> tbody > tr.tr-top-uploader-tab) > tbody {
    display: block;
}
html[data-nx-theme] #outer table:has(> tbody > tr.tr-top-uploader-tab) > tbody > tr {
    display: flex;
    gap: 3px;
}
html[data-nx-theme] tr.tr-top-uploader-tab > td {
    flex: 1 1 0;
    display: block;
    padding: var(--nx-space-2) var(--nx-space-4);
    border: 0;
    border-radius: 999px;
    background-image: none;
    color: var(--nx-text-secondary);
    font-size: var(--nx-font-sm);
    font-weight: var(--nx-weight-medium);
    text-align: center;
    white-space: nowrap;
    cursor: pointer;
    transition: background-color .15s ease, color .15s ease;
}
html[data-nx-theme] tr.tr-top-uploader-tab > td:not(.colhead):hover {
    color: var(--nx-text);
    background-color: var(--nx-surface-hover);
}
/* 选中格：theme.css:480 给 td.colhead 铺了表头渐变，这里整条换掉 */
html[data-nx-theme] tr.tr-top-uploader-tab > td.colhead {
    background-image: none;
    background-color: var(--nx-surface);
    color: var(--nx-primary-strong);
    font-weight: var(--nx-weight-semibold);
    box-shadow: inset 0 0 0 1px var(--nx-primary-border), 0 1px 2px rgba(0, 0, 0, .16);
}
/* 区间图标：最近 30 天 = 时钟，全部时间 = 无穷 */
html[data-nx-theme] tr.tr-top-uploader-tab > td::before {
    content: "";
    display: inline-block;
    width: 14px;
    height: 14px;
    margin-right: var(--nx-space-2);
    vertical-align: -2.5px;
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}
html[data-nx-theme] tr.tr-top-uploader-tab > td[data-table="top-uploader-recently"]::before {
    -webkit-mask-image: var(--nx-i-clock);
            mask-image: var(--nx-i-clock);
}
html[data-nx-theme] tr.tr-top-uploader-tab > td[data-table="top-uploader-all"]::before {
    -webkit-mask-image: var(--nx-i-infinity);
            mask-image: var(--nx-i-infinity);
}

/* 排名列：前三名做成一枚金属圆牌、名次压在牌面上，第四名起只留数字。
   名次 = 行序（index.php:257/270 按聚合结果的顺序打印 ranking+1），所以用
   nth-child 挑档位就行，PHP 只负责给数字套一个 .nx-rank。表头占第 1 行，
   数据行从第 2 行开始。

   为什么不是「一枚小奖牌图标 + 旁边的数字」：试过画一枚 mask 奖牌（圆牌 + 顶部
   V 形绶带 + 挖空五角），
   16px 下圆牌 + 顶部 V 形绶带的绶带会读成两只兔耳，实心挖星也糊成一个点；
   而「数字本身坐在金银铜的牌面上」不需要任何细节就能分出三档。
   牌面自带颜色场，所以深浅两档画布共用同一组渐变 —— 不像文字色那样要跟着
   模式翻；银盘在浅色画布上偏淡，靠内描边那一圈撑出边界。
   ⚠️ 定义在 nexus.css 而不是三个主题的 tokens.css：tokens.css 不参与
      sync-theme-shared.php 同步，Cyber 还多一个强制浅色块，八处手改必出错。
   ⚠️ 共用几何那条和金银铜三条特异性都是 (0,5,5)，靠先后覆盖。别把共用那条
      合并成 :nth-child(n+2):nth-child(-n+4) —— 多一个伪类多一档特异性，
      会把后面的三档渐变压回共用值。 */
html[data-nx-theme] {
    --nx-medal-gold:   linear-gradient(150deg, #fef3c7 0%, #fbbf24 45%, #d97706 100%);
    --nx-medal-silver: linear-gradient(150deg, #f8fafc 0%, #cbd5e1 45%, #94a3b8 100%);
    --nx-medal-bronze: linear-gradient(150deg, #fde4cb 0%, #e0955a 45%, #b45309 100%);
}
html[data-nx-theme] table.top-uploader > tbody > tr > td:last-child:not(.colhead) {
    font-variant-numeric: tabular-nums;
    color: var(--nx-text-tertiary);
    /* 22px = 圆牌的高度。整列（含第四名起的纯数字）共用这一档行框，
       否则前三名会因为挂了牌而被撑高 3px，一列里行高不齐。 */
    line-height: 22px;
}
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(2) > td:last-child .nx-rank,
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(3) > td:last-child .nx-rank,
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(4) > td:last-child .nx-rank {
    /* block 而不是 inline-flex：inline 盒会在行框里额外要到基线空间，
       22px 的牌放进 22px 的行框照样把行撑到 24；block 才是严丝合缝。 */
    display: block;
    width: 22px;
    height: 22px;
    margin: 0 auto;
    font-size: var(--nx-font-xs);
    font-weight: var(--nx-weight-semibold);
    line-height: 22px;
    text-align: center;
    /* 三档牌共用近黑墨色：金/铜渐变本身够深，银的落点 #94a3b8 上放白字会糊 */
    color: #1c1917;
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(28, 25, 23, .25), 0 1px 2px rgba(0, 0, 0, .18);
}
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(2) > td:last-child .nx-rank {
    background-image: var(--nx-medal-gold);
}
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(3) > td:last-child .nx-rank {
    background-image: var(--nx-medal-silver);
}
html[data-nx-theme] table.top-uploader > tbody > tr:nth-child(4) > td:last-child .nx-rank {
    background-image: var(--nx-medal-bronze);
}

/* ==========================================================================
   16. 帖子 / 评论操作条：.nx-pbtn 胶囊 + .nx-pstat 在线状态（2026-09-22）
   ==========================================================================
   forums.php 的帖子工具箱和 functions.php:4179 的评论区操作条本来是同一套位图
   按钮（pic/forum_pic 各语言目录下的 forumsprites.css，一张 25px 高的 forum.gif）。
   那套图把「引用 / 删除 / 编辑」这些字直接烧进了像素，所以按语言分了四份、
   也永远跟不了主题色 —— 唯一的出路是 PHP 侧换成带文案的 <a>/<span>，
   图形交给 mask（第 10 节末尾新加的 reply / mail / quote 三个形状）。
   ⚠️ 旧主题（Agsv / Pink / Classic …）的精灵规则一律写成 `img.f_xxx`，
   元素换掉后它们不再命中，只会显示成纯文字链接 —— 与 .nx-promo 同一处置。
   ========================================================================== */
html[data-nx-theme] .nx-pbtn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    margin: 2px;
    padding: 2px 10px 2px 8px;
    font-size: var(--nx-font-xs);
    font-weight: var(--nx-weight-medium);
    line-height: 1.7;
    color: var(--nx-text-secondary);
    background-color: var(--nx-surface-alt);
    border: var(--nx-border-thin) solid var(--nx-border);
    border-radius: 999px;
    text-decoration: none;
    white-space: nowrap;
    /* 胶囊本身不许被压窄：inline-flex 的 min-content 只有「图标 + 一个字」宽，
       父格一旦收窄就会缩成一条竖杠，看着就像按钮消失了。 */
    min-width: max-content;
    vertical-align: middle;
    transition: color .15s ease, background-color .15s ease, border-color .15s ease;
}
html[data-nx-theme] .nx-pbtn::before {
    content: "";
    flex: 0 0 auto;
    width: 13px;
    height: 13px;
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}
html[data-nx-theme] .nx-pbtn:hover,
html[data-nx-theme] .nx-pbtn:focus-visible {
    color: var(--nx-primary-strong);
    background-color: var(--nx-primary-soft);
    border-color: var(--nx-primary-border);
    text-decoration: none;
}
html[data-nx-theme] .nx-pbtn--new::before    { -webkit-mask-image: var(--nx-i-new);    mask-image: var(--nx-i-new); }
html[data-nx-theme] .nx-pbtn--reply::before  { -webkit-mask-image: var(--nx-i-reply);  mask-image: var(--nx-i-reply); }
html[data-nx-theme] .nx-pbtn--quote::before  { -webkit-mask-image: var(--nx-i-quote);  mask-image: var(--nx-i-quote); }
html[data-nx-theme] .nx-pbtn--pm::before     { -webkit-mask-image: var(--nx-i-mail);   mask-image: var(--nx-i-mail); }
html[data-nx-theme] .nx-pbtn--report::before { -webkit-mask-image: var(--nx-i-flag);   mask-image: var(--nx-i-flag); }
html[data-nx-theme] .nx-pbtn--del::before    { -webkit-mask-image: var(--nx-i-del);    mask-image: var(--nx-i-del); }
html[data-nx-theme] .nx-pbtn--edit::before   { -webkit-mask-image: var(--nx-i-edit);   mask-image: var(--nx-i-edit); }
/* 删除是破坏性操作、举报是提报操作，各占一档语义色，不共用悬停的青色 */
html[data-nx-theme] .nx-pbtn--del:hover,
html[data-nx-theme] .nx-pbtn--del:focus-visible {
    color: var(--nx-danger-text);
    background-color: var(--nx-danger-soft);
    border-color: var(--nx-danger-border);
}
html[data-nx-theme] .nx-pbtn--report:hover,
html[data-nx-theme] .nx-pbtn--report:focus-visible {
    color: var(--nx-warning-text);
    background-color: var(--nx-warning-soft);
    border-color: var(--nx-warning-border);
}

/* 在线状态不是按钮，去掉描边和点击态，只留一颗点 + 文字 */
html[data-nx-theme] .nx-pstat {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    margin: 2px;
    padding: 2px 9px;
    font-size: var(--nx-font-xs);
    line-height: 1.7;
    color: var(--nx-text-tertiary);
    background-color: var(--nx-surface-sunken);
    border-radius: 999px;
    white-space: nowrap;
    vertical-align: middle;
}
html[data-nx-theme] .nx-pstat::before {
    content: "";
    flex: 0 0 auto;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background-color: var(--nx-text-tertiary);
}
html[data-nx-theme] .nx-pstat--on            { color: var(--nx-success-text); }
html[data-nx-theme] .nx-pstat--on::before    { background-color: var(--nx-success); }

/* 状态 + 短讯 + 举报挤在头像下面那一格（帖子 150px、评论同构）：
   让状态独占一行，两个按钮在第二行居中，免得 69px 的胶囊互相挤。
   左右内边距收到 --nx-space-2：格子 150px、两颗胶囊连外边距刚好 128px，
   原来的 12px 会把内容区压到 126px，差 2px 就得换行成三排。 */
html[data-nx-theme] #outer td.nx-pmeta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    /* ⚠️ 必须 !important：components.css:1335 给 td.toolbox / .toolbox 写了
       `padding: var(--nx-space-5) !important`（16px）。评论区的这一格正是
       td.toolbox，16px 会把内容区压到 118px，两颗 60px 胶囊加边距要 128px，
       于是排成三行；论坛帖子那一格是 td.rowfollow（12px）不受影响，
       两边就对不齐了。 */
    padding-left: var(--nx-space-2) !important;
    padding-right: var(--nx-space-2) !important;
}
html[data-nx-theme] #outer td.nx-pmeta .nx-pstat {
    flex: 0 0 100%;
    justify-content: center;
    /* 独占一行时浅底会铺成一条 142px 的横带，读起来像分隔条不像状态标签；
       这一格里去掉底，只留点 + 文字。 */
    background-color: transparent;
}

/* 主题页顶部的「回复」、版块页顶部的「新主题」所在那一格，HTML 写的是
   class="embedded nowrap" width="1%"（forums.php:666 / :1200）。自动布局下
   它靠内容撑到 108px；可一旦这张表走了 fixed 布局，1% 就是字面意义的 17px，
   胶囊被格子裁成一条竖杠 —— 按钮「看不见」就是这么来的。
   CSS 的 width 优先于表现层属性，这里把宽度还给内容，格子就不会再塌。 */
html[data-nx-theme] #outer td.embedded:has(> .nx-pbtn) {
    width: auto;
    white-space: nowrap;
}

/* ==========================================================================
   17. 分页器 .nexus-pagination.nx-pager
   --------------------------------------------------------------------------
   胶囊样式 components.css §9 早就有（.nx-pager + .current），但全站 51 个页面
   的分页都由 include/functions.php 的 pager() 一个函数吐出，而它过去输出的是
   `<p align="center" class="nexus-pagination">` + `<b>` + `<font class="gray">`
   + `" | "` 拼接 —— 那个 class 在整份样式表里**根本不存在**，所以那 51 页一直
   是一行裸文本链接。pager() 现在改吐 .nx-pager 结构，这里只补它缺的三件：
   行容器、省略号、禁用态。
   ⚠️ 写在 nexus.css 而不是 components.css：后者是三主题同步层，改一次要跑
      sync-theme-shared.php；这几条只服务 pager() 一个产出者，放共享层更省事。
   ========================================================================== */

/* 两行（上/下一页一行、页码一行）纵向排、各自居中 */
html[data-nx-theme] .nexus-pagination.nx-pager {
    flex-direction: column;
    align-items: center;
}
html[data-nx-theme] .nexus-pagination.nx-pager .nx-pg-row {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--nx-space-2);
}

/* 省略号不能跟着吃 `.nx-pager span` 的胶囊底和 34px 高度 —— 否则一行里
   会多出一枚空白药丸，比原来的 " | " 竖线还显眼。 */
html[data-nx-theme] .nexus-pagination.nx-pager .nx-pg-dots {
    min-width: 18px;
    height: auto;
    padding: 0;
    color: var(--nx-text-tertiary);
    background: transparent;
    border: 0;
}

/* 到头 / 到底的那一侧。老写法是 `<font class="gray"><b>…</b></font>`，
   灰是灰了，但看不出「点不动」。这里压成占位胶囊：保住形状和行高不跳，
   去掉边框和悬停反馈。 */
html[data-nx-theme] .nexus-pagination.nx-pager .nx-pg-disabled {
    color: var(--nx-text-tertiary);
    background: transparent;
    border-color: transparent;
    cursor: default;
}

/* ==========================================================================
   18. 种子列表搜索框的即时建议浮层 #suggestions
   --------------------------------------------------------------------------
   老代码在 torrents.php 的行内 style 里写死了 `color:#000 / background:#fff`，
   suggest.js 的 select()/unselect() 又逐行往 element.style 上刷同样的两个值
   —— 行内样式压不过，深色主题下弹出来就是一块白底黑字。现在 HTML 只留容器、
   JS 只切 .nx-sugg-on 类，颜色和形状都收到这里。
   ⚠️ 别给 #suggestions 加 padding：suggest.js 按 `条数 × 20px` 硬设它的 height，
      每条也是 height:20px + 左右 6px（全站 border-box），加了内边距最后一行会被裁掉。
   ========================================================================== */
html[data-nx-theme] #suggestions {
    position: absolute;
    width: 204px;
    z-index: var(--nx-z-popover);
    cursor: default;
    overflow: hidden;
    background-color: var(--nx-surface);
    color: var(--nx-text);
    border: var(--nx-border-thin) solid var(--nx-border-strong);
    border-radius: var(--nx-radius-md);
    box-shadow: var(--nx-shadow-lg);
}
html[data-nx-theme] #suggestions > div {
    transition: background-color var(--nx-dur-fast) var(--nx-ease-out),
                color var(--nx-dur-fast) var(--nx-ease-out);
}
html[data-nx-theme] #suggestions > div.nx-sugg-on {
    background-color: var(--nx-primary);
    color: var(--nx-text-inverse);
}

/* ==========================================================================
   19. 首页「站点数据」表 .nx-stats
   --------------------------------------------------------------------------
   PHP 写的是 `width="60%"`，但 components.css 第 1 节把 `table.main` 定成
   `width:100%`，特异性更高 ⇒ 60% 从来没生效过。四列定死成 22 / 28 / 22 / 28，
   左右两半严格镜像，表格铺满内容区。
   数值一律右对齐（账本式）：标签贴左、数字贴着本半区的右边缘，两半各对齐一条
   竖线。曾经这里写过 `max-width:1120px` 去压「数字右边拖一大片空白」，代价是
   1681px 视口下整块偏左、右边空出约 480px —— 空白从格子里挪到了表格外面，
   并没有消失。铺满 + 右对齐才是把这段空白真正吃掉。
   ⚠️ 右对齐后数值的右边缘正好顶到下一列标签的左边缘 ⇒ 第二对标签
      （nth-child(3)）必须留 padding-left，否则「1,318」和「本周访问用户数」贴脸。
      窄屏 §19 的媒体查询在文件后面，等特异性下 `padding:0` 会覆盖这条，
      两列清单态不会被这 24px 挤歪。
   ⚠️ 三个分组之间的分隔行是 `<td colspan="4" class="rowhead">&nbsp;</td>`，
      rowhead 自带 sunken 底 + 上下各 16px 内边距 ⇒ 渲染成一条 40px 高的空带。
      收成 1px 的分隔线，分组关系照样读得出来。
   ========================================================================== */
html[data-nx-theme] #outer table.nx-stats {
    width: 100%;
    margin: 0 0 var(--nx-space-5);
    table-layout: fixed;
}
/* 表格左对齐：PHP 把它包在 `<td class="text" align="center">` 里，
   而固定宽度的表格在 `text-align:center` 的格子里会被整体居中 ——
   光给表格写 margin-left:0 压不住（居中不是靠 auto 外边距算出来的）。
   首页其它小节都是左对齐的，这里把包裹格改成左对齐才对得上标题。 */
html[data-nx-theme] #outer td.text:has(> table.nx-stats) {
    text-align: left;
}
html[data-nx-theme] #outer table.nx-stats > tbody > tr > td.rowhead { width: 22%; }
html[data-nx-theme] #outer table.nx-stats > tbody > tr > td.rowfollow {
    width: 28%;
    text-align: right;
    font-variant-numeric: tabular-nums;
}
/* 两半之间的呼吸位（见上面 ⚠️） */
html[data-nx-theme] #outer table.nx-stats > tbody > tr > td:nth-child(3) {
    padding-left: var(--nx-space-7);
}
html[data-nx-theme] table.nx-stats > tbody > tr:has(> td.rowhead[colspan="4"]) > td {
    height: 12px;
    padding: 0;
    border: 0;
    /* 格子里是一个 &nbsp; —— 表格单元格不吃 min-height，高度由字体行高撑住，
       不压掉字体的话这行仍是 20px 的一整条 sunken 带。 */
    font-size: 0;
    line-height: 0;
    background: transparent;
}

/* 窄屏（≤560px）：四列定宽在这档只有 390px 可用，实测表格被内容撑到 450px
   溢出（标签列 86px 装不下「做种数 / 下载数比例」）。改成「标签左 / 数值右」
   的清单：tr 变两列网格，一行四格自动拆成两行，每行一对。
   ⚠️ td 必须用 `display:block` 当网格项，**不能用 `contents`**：
      Chromium 下 `display:contents` 的表格单元格里只有文本节点时，
      不会为每个格子生成独立的匿名网格项 —— 实测第二列被算成 0px，
      四段文字全挤在同一行（「今日访问用户数2本周访问用户数2」）。
      改 block 后格子恢复成自己的盒子，所以要顺手把 rowhead 的
      sunken 底、内边距和分隔线都清掉，行距与分隔线画在 tr 上。
   ⚠️ 覆盖格子的选择器必须带 `#outer`。theme.css 有一条
      `#outer table[border="1"] > tbody > tr > td { border-bottom: … }`（给带边框的
      老式表格画行分隔线），带 ID ⇒ 特异性 (1,1,5)，压过不带 #outer 的 (0,3,5)。
      少了这三个字，每格各自留一条 1px 底边：标签格 150px、数值格只有 6px，
      渲染成一截截对不齐的短横线。同理 §19 的 `width:22%` 也赢不过
      theme.css 的 `#outer table.main > tbody > tr > td.rowhead { width:150px }`。
   ⚠️ 数值列要 `white-space:nowrap`：§20 给 #outer td 加了 `overflow-wrap:anywhere`，
      它会把 min-content 压到单个字符，`auto`/`max-content` 轨道于是塌成一列宽，
      「3,430 / 4,025」被拆成一行一个字。 */
@media (max-width: 560px) {
    html[data-nx-theme] table.nx-stats,
    html[data-nx-theme] table.nx-stats > tbody {
        display: block;
        max-width: 100%;
    }
    html[data-nx-theme] table.nx-stats > tbody > tr {
        display: grid;
        grid-template-columns: minmax(0, 1fr) max-content;
        column-gap: var(--nx-space-3);
        padding: var(--nx-space-2) var(--nx-space-4);
        border-bottom: var(--nx-border-thin) solid var(--nx-divider);
    }
    html[data-nx-theme] #outer table.nx-stats > tbody > tr > td.rowhead,
    html[data-nx-theme] #outer table.nx-stats > tbody > tr > td.rowfollow {
        display: block;
        width: auto;
        min-width: 0;
        padding: 0;
        border: 0;
        background: transparent;
    }
    html[data-nx-theme] #outer table.nx-stats > tbody > tr > td.rowfollow {
        text-align: right;
        white-space: nowrap;
    }
    html[data-nx-theme] table.nx-stats > tbody > tr:has(> td.rowhead[colspan="4"]) {
        height: var(--nx-space-3);
        padding: 0;
        background: var(--nx-surface-sunken);
    }
    html[data-nx-theme] table.nx-stats > tbody > tr:has(> td.rowhead[colspan="4"]) > td {
        display: none;
    }
}

/* ==========================================================================
   20. 窄屏（≤768px）兜底：老式表格布局的横向溢出
   --------------------------------------------------------------------------
   实测 390px 视口下 documentElement.scrollWidth：首页 942、种子列表 858、
   topten 609、详情页 660 —— 整页横向可拖，用户第一反应是「页面坏了」。
   根因不是某一页写错，是 NexusPHP 的骨架本身：`td#outer` 里塞的是
   `begin_main_frame()` 输出的 `table.main width="1200"`，自动布局下
   它的最小宽度由内容里最宽的那个「不可断原子」决定，全站普遍有四类：
     ① `<input size=100>`（首页群聊输入框，实测 min-content 696px）；
     ② `<iframe width=100%>`（群聊框，撑到 876px）；
     ③ 长串不可断文本（种子名 `[LongPT].星际穿越.Interstellar.2014...`）；
     ④ 不折行的行内 `display:flex`（群聊那一行，min-content 474px）。
   下面逐条治，把「真正撑破」的量消掉（首页 #outer 942→417、topten 609→432）；
   剩下的老式宽数据表压不动也不该压 —— 与其把十列挤成不可读，
   不如用 `#outer{overflow-x:auto}` 让它在内容区里横向滚。
   ⚠️ `overflow-y` 会跟着从 visible 变成 auto，但 #outer 高度是 auto，
      盒子永远和内容一样高，实际不会出现第二个竖向滚动条。
   ⚠️ 别在这儿给 `#outer img` 补 `max-width:100%`：base.css 已有全局规则，
      而它会把 mask 矢量化图标一起压掉尺寸（老 sprite 图标已经踩过一次）。
   ========================================================================== */
@media (max-width: 768px) {
    html[data-nx-theme] #outer {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
    }
    html[data-nx-theme] #outer input,
    html[data-nx-theme] #outer select,
    html[data-nx-theme] #outer textarea {
        max-width: 100%;
    }
    html[data-nx-theme] #outer input[size],
    html[data-nx-theme] #outer textarea[cols] {
        width: 100%;
    }
    html[data-nx-theme] #outer iframe,
    html[data-nx-theme] #outer embed,
    html[data-nx-theme] #outer object {
        max-width: 100%;
    }
    html[data-nx-theme] #outer td,
    html[data-nx-theme] #outer th,
    html[data-nx-theme] #outer div,
    html[data-nx-theme] #outer p {
        overflow-wrap: anywhere;
    }
    /* 群聊那一行是行内写的 `display:flex` 且不换行：标签 + size=100 输入框 +
       三个按钮的 min-content 相加 = 474px，比视口还宽，是首页剩下的主要溢出源。
       允许换行并把输入框的 flex-basis 收到能收缩（实测 #outer 524 → 417）。 */
    html[data-nx-theme] form[name="shbox"] > div {
        flex-wrap: wrap;
        gap: var(--nx-space-2);
    }
    html[data-nx-theme] #shbox_text {
        flex: 1 1 120px;
        min-width: 0;
    }
}

/* ==========================================================================
   21. 站点数据表行首图标（index.php，2026-09-24）
   --------------------------------------------------------------------------
   「站点数据」原本是一整块 34 行的纯文字表格，标签列全靠字号和颜色区分，
   扫一眼抓不到重点。这里给每个标签加一颗 14px 的行首图标。

   几个刻意的取舍：
   ① 形状全部走上面第 10 节那套 `--nx-i-*` mask 令牌（24 viewBox / 1.9 描边 /
      圆头），和折叠开关、上下箭头、警示徽章同一族 —— 不引 Font Awesome，
      也不用 sprite 图，所以浅色/深色/三主题的颜色都跟着变量走。
   ② 图标是 `<i>` 不是 `<img>`：base.css 的 `img{max-width:100%}`
      压过老 sprite 图标（见第 20 节注释），用 `<i>` 直接绕开这一类坑。
   ③ 定宽槽位（14px 图 + 8px 间距）⇒ 所有标签文字左边缘自动对齐成一条竖线，
      不需要给 td 加 padding-left，窄屏 §19 的两列网格也不受影响。
   ④ 只给「做种/上传/下载」三颗上色（绿上箭 / 红下箭），其余一律次要灰。
      这三颗的语义和颜色都复用种子表头 img.seeders / img.leechers
      （components.css ④⑤），全站「上=绿做种、下=红下载」只有一种画法。
      其它图标再上色就会变成圣诞树，读不出主次。
   ⑤ 等级段（无颚龙→霸王龙 10 行）统一用盾牌：那是一串「职级」，
      给每种恐龙硬配一个形状既没有依据也记不住，同图标反而读得出「一组」。

   ⚠️ 标签后面原有的 ★/⚠/🚫/ⓘ 是**状态徽章**（用户名后面同款），
      行首这颗是**类目图标**，位置不同、语义不同，同时出现不冲突；
      但「捐赠者」行已经有一枚金星，所以行首用心形而不是再来一颗星。
   ========================================================================== */
html[data-nx-theme] table.nx-stats .nx-si {
    display: inline-block;
    width: 14px;
    height: 14px;
    margin-right: var(--nx-space-3, 8px);
    vertical-align: -0.18em;
    background-color: var(--nx-text-tertiary, var(--nx-text-secondary));
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}

/* 形状：一个类名对应一颗，和 index.php 里 nx_stat_icon('名字') 的参数一一对应 */
html[data-nx-theme] table.nx-stats .nx-si-clock        { -webkit-mask-image: var(--nx-i-clock);        mask-image: var(--nx-i-clock); }
html[data-nx-theme] table.nx-stats .nx-si-calendar     { -webkit-mask-image: var(--nx-i-calendar);     mask-image: var(--nx-i-calendar); }
html[data-nx-theme] table.nx-stats .nx-si-users        { -webkit-mask-image: var(--nx-i-users);        mask-image: var(--nx-i-users); }
html[data-nx-theme] table.nx-stats .nx-si-user         { -webkit-mask-image: var(--nx-i-user);         mask-image: var(--nx-i-user); }
html[data-nx-theme] table.nx-stats .nx-si-user-check   { -webkit-mask-image: var(--nx-i-user-check);   mask-image: var(--nx-i-user-check); }
html[data-nx-theme] table.nx-stats .nx-si-crown        { -webkit-mask-image: var(--nx-i-crown);        mask-image: var(--nx-i-crown); }
html[data-nx-theme] table.nx-stats .nx-si-heart        { -webkit-mask-image: var(--nx-i-heart);        mask-image: var(--nx-i-heart); }
html[data-nx-theme] table.nx-stats .nx-si-male         { -webkit-mask-image: var(--nx-i-male);         mask-image: var(--nx-i-male); }
html[data-nx-theme] table.nx-stats .nx-si-female       { -webkit-mask-image: var(--nx-i-female);       mask-image: var(--nx-i-female); }
html[data-nx-theme] table.nx-stats .nx-si-torrent      { -webkit-mask-image: var(--nx-i-torrent);      mask-image: var(--nx-i-torrent); }
html[data-nx-theme] table.nx-stats .nx-si-ghost        { -webkit-mask-image: var(--nx-i-ghost);        mask-image: var(--nx-i-ghost); }
html[data-nx-theme] table.nx-stats .nx-si-share-nodes  { -webkit-mask-image: var(--nx-i-share-nodes);  mask-image: var(--nx-i-share-nodes); }
html[data-nx-theme] table.nx-stats .nx-si-percent      { -webkit-mask-image: var(--nx-i-percent);      mask-image: var(--nx-i-percent); }
html[data-nx-theme] table.nx-stats .nx-si-globe        { -webkit-mask-image: var(--nx-i-globe);        mask-image: var(--nx-i-globe); }
html[data-nx-theme] table.nx-stats .nx-si-activity     { -webkit-mask-image: var(--nx-i-activity);     mask-image: var(--nx-i-activity); }
html[data-nx-theme] table.nx-stats .nx-si-hard-drive   { -webkit-mask-image: var(--nx-i-hard-drive);   mask-image: var(--nx-i-hard-drive); }
html[data-nx-theme] table.nx-stats .nx-si-database     { -webkit-mask-image: var(--nx-i-database);     mask-image: var(--nx-i-database); }
html[data-nx-theme] table.nx-stats .nx-si-shield       { -webkit-mask-image: var(--nx-i-shield);       mask-image: var(--nx-i-shield); }
html[data-nx-theme] table.nx-stats .nx-si-arrow-up     { -webkit-mask-image: var(--nx-i-arrow-up);     mask-image: var(--nx-i-arrow-up); }
html[data-nx-theme] table.nx-stats .nx-si-arrow-down   { -webkit-mask-image: var(--nx-i-arrow-down);   mask-image: var(--nx-i-arrow-down); }

/* 语义色档：只有做种/上传、下载两类上色，其余保持次要灰。
   灰档直接用 --nx-text-tertiary：它在 tokens.css 里已经分浅色/深色/auto 三档
   各自调过对比度，这里不再按明暗覆写一遍（覆写会漏掉 auto 跟随系统那一档）。 */
html[data-nx-theme] table.nx-stats .nx-si.is-up {
    background-color: var(--nx-success-text);
}
html[data-nx-theme] table.nx-stats .nx-si.is-down {
    background-color: var(--nx-danger-text);
}


/* 两端那 1px 封口（bar_end）在胶囊造型下会变成两个灰点，收掉 */
html[data-nx-theme] img.bar_end { display: none; }

/* ---- 图标矢量化（第 2 批，2026-09-22）----
   这六个还在吃 icons.gif 的 sprite 帧：speed_up / speed_down 是 10×15 的细长条、
   button_pm 21×13、listicon 4×4、forum_mod 20×20、multipage 8×10。
   统一换成 mask + 令牌上色；类名一个都不能改（PHP 里拼出来的）。
   上色分两档（沿用 9-22 徽章那条经验）：描边图形用 -text 档、实心图形用色相档。 */
html[data-nx-theme] img.speed_up,
html[data-nx-theme] img.speed_down,
html[data-nx-theme] img.button_pm,
html[data-nx-theme] img.listicon,
html[data-nx-theme] img.forum_mod,
html[data-nx-theme] img.multipage {
    max-width: none;
    background-image: none;
    background-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}
/* 尺寸：原来细长的 10×15 收成 10×10（方形箭头才认得出是箭头），其余基本保持原尺寸 */
html[data-nx-theme] img.speed_up,
html[data-nx-theme] img.speed_down { width: 10px; height: 10px; vertical-align: -1px; }
html[data-nx-theme] img.button_pm  { width: 14px; height: 14px; vertical-align: -2px; }
html[data-nx-theme] img.listicon   { width: 4px;  height: 4px;  vertical-align: 1px; }
html[data-nx-theme] img.forum_mod  { width: 16px; height: 16px; vertical-align: -3px; }
html[data-nx-theme] img.multipage  { width: 8px;  height: 10px; vertical-align: -1px; }

/* 速率箭头：沿用「上传=绿 / 下载=蓝」这套语义色（与首页数据卡一致） */
html[data-nx-theme] img.speed_up   { -webkit-mask-image: var(--nx-i-arrow-up);   mask-image: var(--nx-i-arrow-up);   background-color: var(--nx-success-text); }
html[data-nx-theme] img.speed_down { -webkit-mask-image: var(--nx-i-arrow-down); mask-image: var(--nx-i-arrow-down); background-color: var(--nx-info-text); }
/* 发私信：复用已有的气泡图标，中性色（它只是个操作入口，不该抢眼） */
html[data-nx-theme] img.button_pm  { -webkit-mask-image: var(--nx-i-bubble);     mask-image: var(--nx-i-bubble);     background-color: var(--nx-text-tertiary); }
/* BBCode 列表符号：实心圆点，用主色（实心 → 用色相档，不用 -text） */
html[data-nx-theme] img.listicon {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Ccircle cx='4' cy='4' r='3.2' fill='%23000'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Ccircle cx='4' cy='4' r='3.2' fill='%23000'/%3E%3C/svg%3E");
    background-color: var(--nx-primary);
}
/* 版主标识：盾牌 + 勾（描边图形） */
html[data-nx-theme] img.forum_mod {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.2 4.8 6v5.4c0 4.2 2.9 7.6 7.2 9.4 4.3-1.8 7.2-5.2 7.2-9.4V6Z'/%3E%3Cpath d='m8.8 11.7 2.4 2.4 4.2-4.5'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.2 4.8 6v5.4c0 4.2 2.9 7.6 7.2 9.4 4.3-1.8 7.2-5.2 7.2-9.4V6Z'/%3E%3Cpath d='m8.8 11.7 2.4 2.4 4.2-4.5'/%3E%3C/svg%3E");
    background-color: var(--nx-primary);
}
/* 多页标记：叠起来的纸 */
html[data-nx-theme] img.multipage {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='8.5' y='3' width='12' height='15' rx='2'/%3E%3Cpath d='M15.5 21H6a2 2 0 0 1-2-2V6.5'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='8.5' y='3' width='12' height='15' rx='2'/%3E%3Cpath d='M15.5 21H6a2 2 0 0 1-2-2V6.5'/%3E%3C/svg%3E");
    background-color: var(--nx-text-tertiary);
}

/* ==========================================================================
   16. 图标矢量化（第 3 批，2026-09-22）：种子列表行内 + 表头 + 性别 + 在线点
   -------------------------------------------------------------------------
   sprites.css 80 个图标类到这里全部接管完毕（其余是死类：azureus / files /
   ie / utorrent / progbar* / bar_left / bar_right / pro_*，无产出者或规则已失效）。

   ⚠️ 类名一个都不能改，也不动 PHP —— 这批全部由 trans.gif + class 驱动：
     · download / bookmark / delbookmark  include/functions.php:4293-4296, 4614
     · comments / size / snatched         include/functions.php:4422, 4426, 4429（表头）
     · male / female / no_gender          public/userdetails.php:67-72
     · button_online / button_offline     public/staff.php:15-16

   ⚠️ bookmark / delbookmark 是**反的**，别当 typo 去"修"：
   get_torrent_bookmark_state() 在「尚未收藏」时输出 class="delbookmark"，
   「已收藏」时输出 class="bookmark"（两个 title 也是交叉的）。
   所以 实心=已收藏、描边=可收藏，形状各自表达的是「点下去会发生什么」。

   上色仍按 9-22 定的分档：描边图形走 -text 档，实心图形走色相档。
   表头三颗（评论/体积/完成）是排序提示、不是状态，统一 tertiary，
   和同一排已经处理过的 time / seeders / leechers 对齐。 */
html[data-nx-theme] img.download,
html[data-nx-theme] img.bookmark,
html[data-nx-theme] img.delbookmark,
html[data-nx-theme] img.comments,
html[data-nx-theme] img.size,
html[data-nx-theme] img.snatched,
html[data-nx-theme] img.male,
html[data-nx-theme] img.female,
html[data-nx-theme] img.no_gender,
html[data-nx-theme] img.button_online,
html[data-nx-theme] img.button_offline {
    max-width: none;
    background-image: none;
    background-repeat: no-repeat;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: contain;
            mask-size: contain;
}

/* ---- 种子列表操作列（16×16，和已矢量化了的 img.dt_* 同一颗下载箭头）---- */
html[data-nx-theme] img.download {
    width: 15px; height: 15px;
    vertical-align: -2px;
    -webkit-mask-image: var(--nx-i-download); mask-image: var(--nx-i-download);
    background-color: var(--nx-primary);
}
html[data-nx-theme] img.bookmark,
html[data-nx-theme] img.delbookmark {
    width: 15px; height: 15px;
    vertical-align: -2px;
}
html[data-nx-theme] img.bookmark {
    -webkit-mask-image: var(--nx-i-bookmark-solid); mask-image: var(--nx-i-bookmark-solid);
    background-color: var(--nx-warning);
}
html[data-nx-theme] img.delbookmark {
    -webkit-mask-image: var(--nx-i-bookmark); mask-image: var(--nx-i-bookmark);
    background-color: var(--nx-text-tertiary);
}

/* ---- 表头：评论 / 体积 / 完成次数 ----
   ⚠️ 盒尺寸分 14 和 13 两档不是笔误：四颗 mask 在 24 viewBox 里占的格数不同
      （气泡 90×78%、折角文档 64×78%、时钟与圆圈勾都是 83×83%），同一只盒子下
      圆形那两颗会高出约 0.7px，看着就大一圈。按「渲染出来的图形高度对齐」给：
        14px 盒 × 78% ≈ 10.9px —— 气泡、文档
        13px 盒 × 83% ≈ 10.8px —— 时钟、圆圈勾
      以后改任何一颗的 path 几何，都要回来重算这两档。 */
html[data-nx-theme] img.comments,
html[data-nx-theme] img.size {
    width: 14px; height: 14px;
    vertical-align: -2px;
    background-color: var(--nx-text-tertiary);
}
html[data-nx-theme] img.snatched {
    width: 13px; height: 13px;
    vertical-align: -1.5px;
    background-color: var(--nx-text-tertiary);
}
html[data-nx-theme] img.comments  { -webkit-mask-image: var(--nx-i-comment);     mask-image: var(--nx-i-comment); }
html[data-nx-theme] img.size      { -webkit-mask-image: var(--nx-i-file);        mask-image: var(--nx-i-file); }
html[data-nx-theme] img.snatched  { -webkit-mask-image: var(--nx-i-badge-check); mask-image: var(--nx-i-badge-check); }

/* ---- 表头的时钟：先脱离 18px 那档，再按上面口径落到 13px ----
   前面那条 `table:not(.torrents) img.time`（18px + --nx-text）本意是放过种子表、
   只管 messages.php 那种日期列。但种子表包在 begin_table 输出的布局 <table> 里，
   :not() 只要**任一**祖先 table 不带 .torrents 就命中 ⇒ 它一直在改种子表的时钟。
   这里用 `table.torrents`（特异性 0-3-3）显式盖回，并换成本族的 --nx-i-clock
   （1.9 描边 / r=9），和评论、体积、完成三颗同一套几何。
   做种/下载两颗（15×16 + 绿/红）留着不动：它们是靠颜色跳出来的语义图标，不是排序提示。 */
html[data-nx-theme] table.torrents img.time {
    width: 13px; height: 13px;
    vertical-align: -1.5px;
    background-color: var(--nx-text-tertiary);
    -webkit-mask-image: var(--nx-i-clock); mask-image: var(--nx-i-clock);
}

/* ---- 性别：原图 32×32（female / male）和 16×23（no_gender），跟在用户名后面明显过大。
   统一收到 13px，颜色一律 tertiary —— 性别是普通属性，不该用粉/蓝做语义区分。
   no_gender 保持「圆 + 斜杠」，和 --nx-i-ban 同族、也和站里其它「不适用」一致。 ---- */
html[data-nx-theme] img.male,
html[data-nx-theme] img.female,
html[data-nx-theme] img.no_gender {
    width: 13px; height: 13px;
    vertical-align: -2px;
    background-color: var(--nx-text-tertiary);
}
/* 火星：圆 + 右上箭头 */
html[data-nx-theme] img.male {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='14' r='7.2'/%3E%3Cpath d='M15.1 8.9 21 3'/%3E%3Cpath d='M14.6 3H21v6.4'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10' cy='14' r='7.2'/%3E%3Cpath d='M15.1 8.9 21 3'/%3E%3Cpath d='M14.6 3H21v6.4'/%3E%3C/svg%3E");
}
/* 金星：圆 + 下方十字 */
html[data-nx-theme] img.female {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='7.2'/%3E%3Cpath d='M12 16.2V22'/%3E%3Cpath d='M8.2 19.4h7.6'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='9' r='7.2'/%3E%3Cpath d='M12 16.2V22'/%3E%3Cpath d='M8.2 19.4h7.6'/%3E%3C/svg%3E");
}
html[data-nx-theme] img.no_gender {
    -webkit-mask-image: var(--nx-i-ban); mask-image: var(--nx-i-ban);
}

/* ---- staff.php 在线状态点：原图是 15×15 的方块按钮。
   这里和 9-21 那批「数据卡在线状态点」保持同一颗圆点，只区分实/空：
   在线=成功绿实心，离线=disabled 灰描边圈（不靠颜色单独承载信息，
   两态的形状本身也不同）。 ---- */
html[data-nx-theme] img.button_online,
html[data-nx-theme] img.button_offline {
    width: 10px; height: 10px;
    vertical-align: 0;
}
html[data-nx-theme] img.button_online {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='%23000'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10' fill='%23000'/%3E%3C/svg%3E");
    background-color: var(--nx-success);
}
html[data-nx-theme] img.button_offline {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E");
    background-color: var(--nx-text-disabled);
}

/* ---- staff.php 五张表的列对齐（2026-09-24）─────────────────────────────
   老写法只在【表头】那三格上写了 align=center，数据格全是默认左对齐，
   于是「国家 / 是否在线 / 联系」三列的表头悬在中间、底下的国旗和圆点贴左，
   肉眼看着就是错开的（实测：版块表 联系 表头 cx=1078，短讯按钮 cx=951）。
   第五张 VIP 表更干脆，四张表居中、它全左对齐，同页两种规矩。

   这里按「列的位置」一次性收口：2/3/4 三列（国旗 / 状态点 / 短讯按钮）
   表头和数据一起居中，其余列一律左对齐；五张表同一套。
   配套的 13 处 align=center 已从 staff.php 删掉 —— 对齐只在这一个地方说一次。
   ⚠️ 位置选择器的前提是这三列恒为第 2/3/4 列；staff.php 加列时要同步这里。
   :not([colspan]) 保住 general staff 表里那行 `colspan=5 align=right` 的职级分隔行。 ---- */
html[data-nx-theme] table.staff-table td.embedded:not([colspan]) {
    text-align: left;
}
html[data-nx-theme] table.staff-table td.embedded:nth-child(2),
html[data-nx-theme] table.staff-table td.embedded:nth-child(3),
html[data-nx-theme] table.staff-table td.embedded:nth-child(4) {
    text-align: center;
}


/* ── 首页「最多上传」的时间区间切换（index.php:249，2026-09-22）──────────
   原来是一整行 <td class="colhead">：点一下 colhead 类被 JS 挪到另一格
   （index.php:235-245），于是「当前区间」长得和表格表头一模一样 —— 半张
