/*
 * 旧时光俱乐部 —— 皮肤站全站手帐样式
 *
 * 目的
 * --------------------------------------------------------------------------
 * 皮肤站（mc.oldtimes.club）原来是一套白底 Bootstrap/AdminLTE：
 * 白背景、灰卡片、蓝色按钮 —— 和 oldtimes.club 那本「深色手帐」完全两套语言。
 * 登录页已经单独做过了（oldtimes-auth.css），这份把剩下的页面补齐：
 * 首页、皮肤库、用户中心、上传页等等。
 *
 * 配色不另起一套
 * --------------------------------------------------------------------------
 * 直接用登录页那份令牌（--otm-paper / --otm-ink / --otm-grass ...），
 * 保证两边是同一张纸、同一支笔。
 *
 * 与 oldtimes-brand.css 的分工
 * --------------------------------------------------------------------------
 *   oldtimes-brand.css   只管站名那根竖线的字体
 *   oldtimes-skin.css    其余全部（这份）
 *
 * 覆盖策略
 * --------------------------------------------------------------------------
 * AdminLTE 的规则优先级不低，而插件样式表排在主题样式表**前面** ——
 * 所以关键处一律 !important。这是这个站既有的做法（登录页那份也这么写）。
 */

:root {
  --otm-workbench: #252421;
  --otm-workbench-line: rgba(255, 246, 232, .045);
  --otm-paper: #f7f3ea;
  --otm-paper-deep: #ebe3d4;
  --otm-ink: #2e2a26;
  --otm-ink-soft: #70675e;
  --otm-grass: #52a535;
  --otm-grass-dark: #2a641c;
  --otm-grass-light: #86d562;
  --otm-shadow: 0 2px 0 rgba(0, 0, 0, .34), 0 8px 18px -10px rgba(0, 0, 0, .55);
}

/* ==========================================================================
   1 台面：深色工作台 + 淡格线
   --------------------------------------------------------------------------
   登录页就是这么铺的，其余页面照抄 —— 这样从头到尾是一张桌子。
   ========================================================================== */
body:not(.login-page) {
  background-color: var(--otm-workbench) !important;
  background-image:
    linear-gradient(90deg, var(--otm-workbench-line) 1px, transparent 1px),
    linear-gradient(180deg, var(--otm-workbench-line) 1px, transparent 1px) !important;
  background-size: 28px 28px !important;
  color: var(--otm-ink);
  font-family: "Noto Sans", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
}

/* 顶栏：压深一点，和台面区分开 */
.main-header.navbar {
  background-color: rgba(20, 19, 17, .96) !important;
  border-bottom: 1px solid rgba(0, 0, 0, .55);
  box-shadow: 0 6px 18px -8px rgba(0, 0, 0, .9);
}

/* 页脚 */
.main-footer {
  background-color: transparent !important;
  border-top: 1px dashed rgba(255, 246, 232, .12) !important;
  color: rgba(246, 232, 206, .55) !important;
}

.main-footer a { color: var(--otm-grass-light) !important; }

/* ==========================================================================
   2 纸：内容区就是那张纸
   ========================================================================== */
.content-wrapper {
  background-color: transparent !important;
}

/* 面板 / 卡片 → 纸 */
.card,
.box,
.card-body,
.box-body,
.card-header,
.box-header,
.card-footer,
.box-footer {
  background-color: var(--otm-paper) !important;
  color: var(--otm-ink) !important;
}

.card,
.box {
  border: 1px solid rgba(0, 0, 0, .34) !important;
  border-radius: 2px !important;
  box-shadow: 12px 14px 0 rgba(0, 0, 0, .28) !important;
  overflow: visible;
}

.card-header,
.box-header {
  border-bottom: 1px solid rgba(0, 0, 0, .14) !important;
  font-weight: 800;
}

/* 卡片顶上那道上沿胶带 —— 首页与登录页都用它，这里也补上 */
.card::before,
.box::before {
  content: "";
  position: absolute;
  top: -10px;
  left: 16px;
  right: 16px;
  height: 20px;
  background-image: repeating-linear-gradient(
    90deg,
    var(--otm-grass-light) 0 18px,
    var(--otm-grass) 18px 36px,
    var(--otm-grass-dark) 36px 44px
  );
  box-shadow: 0 4px 0 rgba(42, 100, 28, .4);
  pointer-events: none;
}

/* 卡片之间留出胶带的位置 */
.card, .box { margin-top: 14px; }

/* ==========================================================================
   3 文字
   ========================================================================== */
.content-wrapper h1,
.content-wrapper h2,
.content-wrapper h3,
.content-wrapper h4,
.content-wrapper h5,
.content-wrapper .content-header,
.content-wrapper .card-title,
.content-wrapper .box-title {
  color: var(--otm-ink) !important;
}

.content-wrapper .text-muted,
.content-wrapper small,
.content-wrapper .description-block > .description-text {
  color: var(--otm-ink-soft) !important;
}

.content-wrapper a:not(.btn):not(.nav-link):not(.navbar-brand) {
  color: var(--otm-grass-dark) !important;
  text-decoration: underline;
  text-decoration-color: rgba(42, 100, 28, .4);
  text-underline-offset: 3px;
}

/* 台面上的标题（不在纸里，比如「Skin Library」那行）写成浅色 */
.content-header h1,
.content-header h2 {
  color: var(--otm-paper) !important;
  text-shadow: 3px 3px 0 rgba(0, 0, 0, .38);
}

/* 面包屑 */
.breadcrumb {
  background-color: rgba(252, 245, 241, .06) !important;
  border: 1px dashed rgba(255, 246, 232, .14);
  border-radius: 2px;
}

.breadcrumb-item, .breadcrumb-item a { color: var(--otm-grass-light) !important; }
.breadcrumb-item.active { color: rgba(246, 232, 206, .7) !important; }

/* ==========================================================================
   4 按钮：纸签
   ========================================================================== */
.btn {
  border-radius: 2px !important;
  font-weight: 700 !important;
  letter-spacing: .04em;
  text-shadow: none !important;
}

.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger,
.btn-secondary,
.btn-default,
.btn-outline-primary,
.btn-outline-secondary {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  border: 1px solid rgba(0, 0, 0, .3) !important;
  color: var(--otm-ink) !important;
  box-shadow: 0 3px 0 rgba(0, 0, 0, .34) !important;
}

/* 主操作：荧光笔压在字下面 —— 与网页端「上传」按钮同一套做法 */
.btn-primary::after,
.btn-success::after {
  content: "";
  position: absolute;
  left: 8px;
  right: 8px;
  bottom: 6px;
  height: 8px;
  z-index: -1;
  background: linear-gradient(90deg, rgba(108, 195, 73, .66), rgba(134, 213, 98, .46));
  transform: rotate(-.8deg);
  pointer-events: none;
}

.btn-primary,
.btn-success { position: relative; z-index: 0; }

.btn:hover,
.btn:focus {
  transform: translateY(-2px);
  box-shadow: 0 5px 0 rgba(0, 0, 0, .36) !important;
}

.btn:active {
  transform: translateY(1px);
  box-shadow: 0 1px 0 rgba(0, 0, 0, .4) !important;
}

/* ==========================================================================
   5 表单：纸上画的横线格
   ========================================================================== */
.form-control,
.custom-select,
.input-group-text {
  background-color: #fffdf8 !important;
  background-image: repeating-linear-gradient(
    180deg,
    transparent 0 25px,
    rgba(120, 100, 70, .1) 25px 26px
  ) !important;

  border: 1px solid rgba(0, 0, 0, .22) !important;
  border-radius: 2px !important;
  color: var(--otm-ink) !important;
  box-shadow: none !important;
}

.form-control:focus,
.custom-select:focus {
  border-color: var(--otm-grass) !important;
  box-shadow: 0 0 0 3px rgba(108, 195, 73, .22) !important;
}

.form-control::placeholder { color: #91887f !important; }

label { color: var(--otm-ink) !important; font-weight: 700; }

/* ==========================================================================
   6 表格
   ========================================================================== */
.table {
  color: var(--otm-ink) !important;
  background-color: transparent !important;
}

.table thead th {
  border-bottom: 2px solid rgba(0, 0, 0, .18) !important;
  color: var(--otm-ink) !important;
}

.table td, .table th {
  border-color: rgba(0, 0, 0, .1) !important;
}

.table-striped tbody tr:nth-of-type(odd) {
  background-color: rgba(120, 100, 70, .05) !important;
}

/* ==========================================================================
   7 标签与徽章：小纸片
   ========================================================================== */
.badge,
.label {
  padding: 3px 8px !important;
  background-color: var(--otm-paper-deep) !important;
  border: 1px solid rgba(0, 0, 0, .22);
  border-radius: 2px !important;
  color: var(--otm-ink) !important;
  font-weight: 700 !important;
  box-shadow: 0 1px 0 rgba(0, 0, 0, .25);
}

/* ==========================================================================
   8 皮肤库：一格一张白框相片
   --------------------------------------------------------------------------
   原来每格是一块浅灰方块。改成白框 —— 与 oldtimes.club 美好瞬间页同一套做法：
   四周留白、投一层软影、悬停抬起。
   ========================================================================== */
.skin-card,
.skin-card-wrapper,
.skinlib-item,
div[class*="skin"] > .card,
.item {
  background-color: #fff !important;
  border: 1px solid rgba(0, 0, 0, .26) !important;
  border-radius: 2px !important;
  box-shadow: 0 10px 20px -12px rgba(0, 0, 0, .85), 0 2px 5px rgba(0, 0, 0, .35) !important;
  transition: transform .2s ease, box-shadow .2s ease;
}

.skin-card:hover,
.skinlib-item:hover,
.item:hover {
  transform: translateY(-4px) !important;
  box-shadow: 0 18px 30px -14px rgba(0, 0, 0, .9), 0 4px 10px rgba(0, 0, 0, .4) !important;
}

/* 皮肤预览底：淡淡一层格，像方格纸 */
.skin-preview,
.skin-card img,
.skinlib-item img {
  background-color: #fbfaf7 !important;
  background-image:
    linear-gradient(90deg, rgba(120, 100, 70, .07) 1px, transparent 1px),
    linear-gradient(180deg, rgba(120, 100, 70, .07) 1px, transparent 1px);
  background-size: 10px 10px;
  image-rendering: pixelated;
}

/* ==========================================================================
   9 分页与标签页
   ========================================================================== */
.page-link {
  background-color: var(--otm-paper) !important;
  border: 1px solid rgba(0, 0, 0, .3) !important;
  color: var(--otm-ink) !important;
  border-radius: 2px !important;
  margin: 0 3px;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .3);
}

.page-item.active .page-link {
  background-image: linear-gradient(180deg, rgba(134, 213, 98, .95), rgba(108, 195, 73, .95)) !important;
  border-color: var(--otm-grass-dark) !important;
  color: #1d2b14 !important;
  font-weight: 800;
}

.nav-tabs .nav-link {
  background-color: rgba(252, 245, 241, .06) !important;
  border: 1px solid rgba(255, 246, 232, .12) !important;
  border-radius: 2px 2px 0 0 !important;
  color: rgba(246, 232, 206, .8) !important;
}

.nav-tabs .nav-link.active {
  background-color: var(--otm-paper) !important;
  border-color: rgba(0, 0, 0, .3) !important;
  color: var(--otm-ink) !important;
  font-weight: 800;
}

/* ==========================================================================
   10 下拉菜单
   ========================================================================== */
.dropdown-menu {
  background-color: var(--otm-paper) !important;
  border: 1px solid rgba(0, 0, 0, .34) !important;
  border-radius: 2px !important;
  box-shadow: 8px 10px 0 rgba(0, 0, 0, .3) !important;
}

.dropdown-item {
  color: var(--otm-ink) !important;
}

.dropdown-item:hover,
.dropdown-item:focus {
  background-color: var(--otm-paper-deep) !important;
  color: var(--otm-ink) !important;
}

.dropdown-divider { border-top-color: rgba(0, 0, 0, .14) !important; }

/* ==========================================================================
   11 弹窗
   ========================================================================== */
.modal-content {
  background-color: var(--otm-paper) !important;
  border: 1px solid rgba(0, 0, 0, .4) !important;
  border-radius: 2px !important;
  box-shadow: 14px 16px 0 rgba(0, 0, 0, .35) !important;
}

.modal-header, .modal-footer {
  border-color: rgba(0, 0, 0, .14) !important;
}

/* ==========================================================================
   12 无障碍：焦点可见
   ========================================================================== */
.content-wrapper :focus-visible,
.main-header :focus-visible {
  outline: 3px solid var(--otm-grass-light);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  .btn, .skin-card, .skinlib-item, .item { transition: none !important; }
}

/* ==========================================================================
   13 修正：胶带只贴最外那层纸
   --------------------------------------------------------------------------
   上面第 2 节给所有 .card 都加了上沿胶带 —— 但皮肤库里**每一格皮肤本身也是 .card**
   （框架用 CSS-in-JS 生成的，类名带 css- 前缀），结果每一格都贴了一道，
   满屏绿条纹，比原来还乱。

   胶带是用来「固定这一页纸」的，一层就够；里面的小卡片不该再贴。
   所以：带 css- 前缀的 .card 不贴胶带，改成白框相片 ——
   与 oldtimes.club 美好瞬间页的相片卡同一套做法。
   ========================================================================== */
.card[class*="css-"]::before,
.box[class*="css-"]::before {
  content: none !important;
  display: none !important;
}

/* 皮肤格：白框相片 */
.card[class*="css-"] {
  margin-top: 0 !important;

  background-color: #fff !important;
  border: 1px solid rgba(0, 0, 0, .26) !important;
  border-radius: 2px !important;
  box-shadow:
    0 10px 20px -12px rgba(0, 0, 0, .85),
    0 2px 5px rgba(0, 0, 0, .35) !important;

  transform: rotate(var(--otm-rot, 0deg));
  transition: transform .2s ease, box-shadow .2s ease !important;
}

/* 三张一组换一个角度 —— 与网页端相片卡同一套做法 */
.card[class*="css-"]:nth-of-type(3n+1) { --otm-rot: -.7deg; }
.card[class*="css-"]:nth-of-type(3n+2) { --otm-rot: .55deg; }
.card[class*="css-"]:nth-of-type(3n)   { --otm-rot: -.3deg; }

.card[class*="css-"]:hover {
  transform: rotate(0deg) translateY(-5px) !important;
  box-shadow:
    0 20px 34px -16px rgba(0, 0, 0, .95),
    0 5px 12px rgba(0, 0, 0, .45) !important;
}

/* 纸面下面那条页脚（名字 + 标签）也保持白，别和上面对不上 */
.card[class*="css-"] > .card-footer {
  background-color: transparent !important;
  border-top: 1px solid rgba(0, 0, 0, .1) !important;
}

/* ==========================================================================
   14 修正：AdminLTE 的背景色工具类
   --------------------------------------------------------------------------
   上面第 4 节按 .btn-primary / .btn-success 这些**语义类**覆盖按钮，
   但站里实际用的是 AdminLTE 的**背景色工具类**：

       <button class="btn bg-olive">Most Likes</button>

   bg-* 是直接设 background-color 的，优先级不低于 .btn-success，
   所以那排按钮一直是原来的绿色。

   用 [class*="bg-"] 一次覆盖所有这类工具类 —— 以后换成 bg-navy、bg-maroon 也一样。
   ========================================================================== */
.btn[class*="bg-"],
.btn-group > .btn[class*="bg-"] {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  border: 1px solid rgba(0, 0, 0, .3) !important;
  color: var(--otm-ink) !important;
  box-shadow: 0 3px 0 rgba(0, 0, 0, .34) !important;
}

/* 按钮组里首尾两端的圆角按纸签来 */
.btn-group > .btn:first-child { border-radius: 2px 0 0 2px !important; }
.btn-group > .btn:last-child  { border-radius: 0 2px 2px 0 !important; }

/* 选中态：荧光笔 —— 与网页端选中的年份标签同一套做法 */
.btn[class*="bg-"].active,
.btn[class*="bg-"]:active,
.btn-group > .btn[class*="bg-"].active {
  background-image: linear-gradient(180deg, rgba(134, 213, 98, .95), rgba(108, 195, 73, .95)) !important;
  border-color: var(--otm-grass-dark) !important;
  color: #1d2b14 !important;
  font-weight: 800 !important;
}

/* ==========================================================================
   15 描边按钮（首页那个 Register Now）
   --------------------------------------------------------------------------
   首页是整屏大图，上面只有一个按钮，用的是 .btn-outline-* ——
   在照片底上是一条细白框，和手帐纸签不是一套。
   一并做成纸签：米色纸、深墨字、投影。
   ========================================================================== */
.btn[class*="btn-outline"] {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  border: 1px solid rgba(0, 0, 0, .32) !important;
  color: var(--otm-ink) !important;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, .9) inset,
    0 4px 0 rgba(0, 0, 0, .36),
    0 12px 24px -12px rgba(0, 0, 0, .8) !important;
}

.btn[class*="btn-outline"]:hover,
.btn[class*="btn-outline"]:focus {
  background-color: #fdfbf6 !important;
  color: var(--otm-ink) !important;
  transform: translateY(-2px);
}

/* ==========================================================================
   16 控制台：左侧边栏 + 统计块
   --------------------------------------------------------------------------
   反馈：登录后的控制台也要改成手帐。

   侧栏原来是 AdminLTE 的深色菜单：条目是暗底浅字，当前项是一块**蓝色**高亮。
   这里的做法和站点其它地方一致：
       · 侧栏本身是台面（比内容区更深），条目是**贴在台面上的纸签**
       · 当前项不涂蓝块，改用**荧光笔** —— 和网页端选中的年份标签同一招
       · 分组标题（用户中心 / 浏览 / 管理）做成**小纸条**
       · 用户那块做成一张压着胶带的纸

   注意：全部限定在 .main-sidebar 里 —— .nav-link 顶栏也在用，
   不限定的话会把顶部导航一起带偏。
   ========================================================================== */

/* 侧栏：台面 */
.main-sidebar {
  background-color: #1c1b19 !important;
  border-right: 1px solid rgba(0, 0, 0, .55) !important;
  box-shadow: 6px 0 20px -10px rgba(0, 0, 0, .9) !important;
}

/* 顶部那条站名：做成一条纸 */
.main-sidebar .brand-link {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  border-bottom: 1px solid rgba(0, 0, 0, .35) !important;
  box-shadow: 0 4px 8px -4px rgba(0, 0, 0, .8) !important;
}

.main-sidebar .brand-link .brand-text {
  color: var(--otm-ink) !important;
  font-weight: 800 !important;
  letter-spacing: .02em;
  text-shadow: none !important;
}

/* 用户那块：一张纸 + 上沿胶带 */
.main-sidebar .user-panel {
  position: relative;
  margin: 14px 10px 6px;
  padding: 10px 12px;

  background-color: var(--otm-paper) !important;
  border: 1px solid rgba(0, 0, 0, .34);
  border-radius: 2px;
  box-shadow: 0 4px 0 rgba(0, 0, 0, .35), 0 10px 20px -12px rgba(0, 0, 0, .9);
}

.main-sidebar .user-panel::before {
  content: "";
  position: absolute;
  top: -8px;
  left: 50%;
  width: 64px;
  height: 16px;
  transform: translateX(-50%) rotate(-2.4deg);
  background-image: repeating-linear-gradient(
    90deg,
    rgba(134, 213, 98, .55) 0 9px,
    rgba(160, 224, 129, .38) 9px 18px
  );
  box-shadow: 0 2px 4px rgba(0, 0, 0, .4);
  pointer-events: none;
}

.main-sidebar .user-panel .info a,
.main-sidebar .user-panel .info p,
.main-sidebar .user-panel .info .d-block {
  color: var(--otm-ink) !important;
  font-weight: 700;
}

/* 分组标题（用户中心 / 浏览 / 管理）：小纸条 */
.main-sidebar .nav-header {
  display: inline-block;
  margin: 16px 0 8px 12px;
  padding: 2px 10px;

  background-color: var(--otm-paper) !important;
  border: 1px solid rgba(0, 0, 0, .3);
  border-radius: 2px;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .34);

  color: var(--otm-ink) !important;
  font-size: 11px !important;
  font-weight: 800 !important;
  letter-spacing: .12em;
  text-transform: none !important;

  transform: rotate(-.9deg);
}

.main-sidebar .nav-header:nth-of-type(2n) { transform: rotate(.8deg); }

/* 菜单项：纸签 */
.main-sidebar .nav-sidebar .nav-item > .nav-link {
  position: relative;
  z-index: 0;

  margin: 3px 8px;
  padding: 8px 12px;

  background-color: var(--otm-paper) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;

  border: 1px solid rgba(0, 0, 0, .28);
  border-radius: 2px;

  color: var(--otm-ink) !important;
  font-weight: 700;

  box-shadow: 0 2px 0 rgba(0, 0, 0, .34);
  transform: rotate(var(--otm-nav-rot, 0deg));
  transition: transform .18s ease, box-shadow .18s ease;
}

/* 三张一组换角度 */
.main-sidebar .nav-sidebar .nav-item:nth-of-type(3n+1) > .nav-link { --otm-nav-rot: -.6deg; }
.main-sidebar .nav-sidebar .nav-item:nth-of-type(3n+2) > .nav-link { --otm-nav-rot: .5deg; }
.main-sidebar .nav-sidebar .nav-item:nth-of-type(3n)   > .nav-link { --otm-nav-rot: -.25deg; }

.main-sidebar .nav-sidebar .nav-item > .nav-link:hover,
.main-sidebar .nav-sidebar .nav-item > .nav-link:focus {
  background-color: #fdfbf6 !important;
  color: var(--otm-ink) !important;
  transform: rotate(0deg) translateY(-2px);
  box-shadow: 0 4px 0 rgba(0, 0, 0, .36);
}

/* 当前项：荧光笔，不是蓝块 */
.main-sidebar .nav-sidebar .nav-item > .nav-link.active {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  color: var(--otm-ink) !important;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .34);
}

.main-sidebar .nav-sidebar .nav-item > .nav-link.active::after {
  content: "";
  position: absolute;
  left: 30px;
  right: 10px;
  bottom: 5px;
  height: 11px;
  z-index: -1;
  background: linear-gradient(90deg, rgba(108, 195, 73, .72), rgba(134, 213, 98, .5));
  transform: rotate(-.8deg);
  pointer-events: none;
}

/* 图标跟着墨色走 */
.main-sidebar .nav-sidebar .nav-link .nav-icon {
  color: var(--otm-ink-soft) !important;
}

.main-sidebar .nav-sidebar .nav-link.active .nav-icon {
  color: var(--otm-grass-dark) !important;
}

/* 徽章（比如那个 STAFF）已经由第 7 节做成纸片 */

/* ==========================================================================
   17 统计块（使用情况那三块）
   --------------------------------------------------------------------------
   原来是绿 / 粉的实心大色块，非常跳。改成纸 + 一枚彩色的图标圆片 ——
   数字仍要一眼看清，但整页回到同一张纸上。
   ========================================================================== */
.small-box,
.info-box {
  position: relative;

  background-color: var(--otm-paper) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;

  border: 1px solid rgba(0, 0, 0, .3) !important;
  border-radius: 2px !important;
  color: var(--otm-ink) !important;
  box-shadow: 0 4px 0 rgba(0, 0, 0, .34), 0 12px 24px -14px rgba(0, 0, 0, .85) !important;
  transform: rotate(var(--otm-rot, 0deg));
}

.small-box:nth-of-type(3n+1), .info-box:nth-of-type(3n+1) { --otm-rot: -.6deg; }
.small-box:nth-of-type(3n+2), .info-box:nth-of-type(3n+2) { --otm-rot: .45deg; }
.small-box:nth-of-type(3n),   .info-box:nth-of-type(3n)   { --otm-rot: -.3deg; }

.small-box:hover, .info-box:hover {
  transform: rotate(0deg) translateY(-3px);
}

/* 里面的字 */
.small-box .inner h3,
.small-box .inner p,
.info-box .info-box-text,
.info-box .info-box-number {
  color: var(--otm-ink) !important;
  font-weight: 800;
}

/* 图标那一块：留一个小的彩色圆片，作为唯一的点缀 */
.small-box .icon,
.info-box .info-box-icon {
  background-color: transparent !important;
  color: inherit !important;
  opacity: .9;
}

.small-box .icon > i,
.info-box .info-box-icon > i {
  display: inline-flex;
  align-items: center;
  justify-content: center;

  width: 44px;
  height: 44px;

  background-color: rgba(108, 195, 73, .2);
  border: 1px solid rgba(42, 100, 28, .35);
  border-radius: 50%;

  color: var(--otm-grass-dark) !important;
  font-size: 20px;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .2);
}

/* 底部的进度条也压成纸上的淡色 */
.small-box .progress,
.small-box .small-box-footer {
  background-color: rgba(120, 100, 70, .12) !important;
  color: var(--otm-ink-soft) !important;
}

.small-box .progress .progress-bar {
  background-color: var(--otm-grass) !important;
}

/* 卡片里那条「签到」按钮已由第 4 节做成纸签 */

/* ==========================================================================
   18 修正：顶栏里的字要浅色
   --------------------------------------------------------------------------
   我在第 1 节把 body 的 color 设成了 --otm-ink（深墨）—— 那是**写在纸上**用的颜色。
   但顶栏（.main-header）是深色的，它从 body 继承到深墨，
   结果右上角那排（深色切换、通知、语言、头像）全成了**深色压在深色上**，糊成一片。

   所以顶栏里的文字与图标要单独给浅色。
   ========================================================================== */
.main-header.navbar,
.main-header .nav-link,
.main-header a,
.main-header .navbar-nav .nav-link,
.main-header .dropdown-toggle,
.main-header .navbar-brand {
  color: rgba(246, 232, 206, .88) !important;
}

.main-header .nav-link:hover,
.main-header .navbar-nav .nav-link:hover,
.main-header a:hover {
  color: var(--otm-grass-light) !important;
}

/* 顶栏里的图标 */
.main-header .nav-link i,
.main-header .nav-link .fas,
.main-header .nav-link .far {
  color: inherit !important;
}

/* 顶栏里的头像框：加一圈纸边，和深底分开 */
.main-header .user-image,
.main-header img.user-image {
  border: 2px solid rgba(246, 232, 206, .5) !important;
  border-radius: 2px !important;
}

/* 顶栏下拉（通知、语言）已是纸，里面字仍用墨色 —— 别被上面的浅色带跑 */
.main-header .dropdown-menu,
.main-header .dropdown-menu .dropdown-item,
.main-header .dropdown-menu a {
  color: var(--otm-ink) !important;
}

.main-header .dropdown-menu .dropdown-item:hover,
.main-header .dropdown-menu a:hover {
  color: var(--otm-ink) !important;
  background-color: var(--otm-paper-deep) !important;
}

/* 顶栏里那条分隔线 */
.main-header .navbar-nav .nav-item {
  border-color: rgba(255, 246, 232, .12) !important;
}

/* ==========================================================================
   19 修正：统计块的图标溢出
   --------------------------------------------------------------------------
   AdminLTE 给 .small-box .icon 设了 font-size: 70px，
   而我第 17 节把里面的 <i> 做成 44px 的圆片 —— 字号没跟着改，
   70px 的字形撑爆 44px 的圆，糊成一坨盖在数字上，整块就看不清了。

   三处一起修：
       · 图标字号收到 20px，圆片才装得下
       · 数字加大加黑，一眼能看清
       · 每块按 .bg-* 给一个彩色圆片，四块颜色区分开
   ========================================================================== */
.small-box .icon {
  font-size: 20px !important;
  opacity: 1 !important;
  top: 12px !important;
  right: 12px !important;
}

.small-box .icon > i,
.info-box .info-box-icon > i {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;

  width: 46px !important;
  height: 46px !important;

  font-size: 20px !important;      /* 关键：把 70px 拉回来 */
  line-height: 1 !important;

  border-radius: 50%;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .22);
}

/* 数字与说明：加大加黑 */
.small-box .inner h3 {
  margin: 0 0 4px !important;
  font-size: 34px !important;
  font-weight: 900 !important;
  letter-spacing: .01em;
  color: var(--otm-ink) !important;
  text-shadow: none !important;
}

.small-box .inner p {
  margin: 0 0 10px !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  color: var(--otm-ink-soft) !important;
}

/* 底部那条「用户管理 →」：纸上的浅色条，字要看得清 */
.small-box > .small-box-footer {
  display: block;
  padding: 7px 12px !important;

  background-color: rgba(120, 100, 70, .1) !important;
  border-top: 1px solid rgba(0, 0, 0, .12) !important;

  color: var(--otm-ink) !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  text-align: right;
}

.small-box > .small-box-footer:hover {
  background-color: rgba(120, 100, 70, .18) !important;
  color: var(--otm-grass-dark) !important;
}

/* 每块按自己的 .bg-* 给圆片上色 —— 四块颜色区分开，但都压在同一张纸上 */
.small-box .icon > i { background-color: rgba(120, 100, 70, .14); color: var(--otm-ink-soft) !important; }

.small-box.bg-info    .icon > i { background-color: rgba(60, 140, 190, .22); color: #1d5a80 !important; }
.small-box.bg-success .icon > i { background-color: rgba(108, 195, 73, .26); color: var(--otm-grass-dark) !important; }
.small-box.bg-warning .icon > i { background-color: rgba(224, 178, 60, .28); color: #8a6410 !important; }
.small-box.bg-danger  .icon > i { background-color: rgba(196, 84, 84, .24); color: #8f2f2f !important; }
.small-box.bg-primary .icon > i { background-color: rgba(90, 120, 200, .22); color: #33478f !important; }

/* ==========================================================================
   20 修正：左上角那块白方块
   --------------------------------------------------------------------------
   我第 16 节给 .brand-link 铺了**整块米色纸** —— 想的是「站名写在一条纸上」。
   但在深色页面上，左上角就出现了**一个突兀的白方块**，
   旁边紧挨着深色顶栏，像页面缺了一块；☰ 还挤在里面。

   问题是「整块铺纸」这个做法太重了。改成：
       · 那一块跟顶栏同色（不再是一块白）
       · 站名做成**一张小纸条**贴在上面 —— 是「贴了张名牌」，不是「缺了一块」
       · ☰ 用浅色，和顶栏一致
   ========================================================================== */

/* 那一块：与顶栏同色，不再铺满纸 */
.main-sidebar .brand-link,
.main-header .brand-link {
  background-color: rgba(20, 19, 17, .96) !important;
  background-image: none !important;
  border-bottom: 1px solid rgba(0, 0, 0, .5) !important;
  box-shadow: none !important;
}

/* 站名：一张小纸条 */
.main-sidebar .brand-link .brand-text,
.main-header .brand-link .brand-text {
  display: inline-block;

  padding: 3px 12px;

  background-color: var(--otm-paper);
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%);

  border: 1px solid rgba(0, 0, 0, .34);
  border-radius: 2px;

  color: var(--otm-ink) !important;
  font-size: 14px !important;
  font-weight: 800 !important;
  letter-spacing: .02em;
  text-shadow: none !important;

  box-shadow: 0 2px 0 rgba(0, 0, 0, .38);
  transform: rotate(-.7deg);
}

/* 站名纸条下沿压一道小胶带，像真的贴上去 */
.main-sidebar .brand-link .brand-text::before,
.main-header .brand-link .brand-text::before {
  content: none;   /* 纸条本身已经够小，再加胶带就碎了 */
}

/* ☰ 等顶栏图标：浅色 */
.main-header .sidebar-toggle,
.main-header .nav-link[data-widget="pushmenu"],
.main-sidebar .brand-link {
  color: rgba(246, 232, 206, .85) !important;
}

.main-header .sidebar-toggle:hover {
  color: var(--otm-grass-light) !important;
}

/* 窄屏（侧栏收起）时，那一块是顶栏的一部分，不要有下边框 */
@media (max-width: 991.98px) {
  .main-header .brand-link {
    border-bottom: 0 !important;
  }
}

/* ==========================================================================
   23 首页：只把「大图以下」做成主站那样
   --------------------------------------------------------------------------
   上一版我把整屏大图本身也改成了相片，做过头了 —— 反馈是「太难看了」。

   其实要的是主站首页那种结构：
       · 上面一张整屏大图（**不动**）
       · 图以下是深色手帐纸，标题写在一张纸卡片上，周围散着相片

   所以这一节只碰 #intro（功能那节）与页脚，.hp-wrapper 与 .splash 一个字不改。
   ========================================================================== */

/* 功能那节：白底 → 深色纸 */
#intro {
  position: relative;

  margin-top: 0;
  padding: 54px 0 60px !important;

  background-color: var(--otm-workbench) !important;
  background-image:
    linear-gradient(90deg, var(--otm-workbench-line) 1px, transparent 1px),
    linear-gradient(180deg, var(--otm-workbench-line) 1px, transparent 1px) !important;
  background-size: 28px 28px !important;

  border-top: 0 !important;
}

/* 那一节顶上压一道和纸胶带 —— 主站首页同一处也有一道 */
#intro::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 16px;
  background-image: repeating-linear-gradient(
    90deg,
    rgba(108, 195, 73, .5) 0 14px,
    rgba(134, 213, 98, .34) 14px 28px
  );
  box-shadow: 0 2px 6px rgba(0, 0, 0, .45);
  pointer-events: none;
}

/* 大标题：写在一张纸卡片上（主站首页那块「欢迎来到…」就是这个做法） */
#intro h1 {
  display: inline-block;
  margin: 0 0 26px !important;
  padding: 10px 34px 14px !important;

  background-color: var(--otm-paper) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;

  border: 1px solid rgba(0, 0, 0, .3) !important;
  border-radius: 2px !important;

  color: var(--otm-ink) !important;
  font-size: clamp(20px, 2.6vw, 30px) !important;
  font-weight: 800 !important;
  letter-spacing: .04em;
  text-shadow: none !important;

  box-shadow:
    0 1px 0 rgba(255, 255, 255, .9) inset,
    0 6px 14px -6px rgba(0, 0, 0, .9),
    0 2px 4px rgba(0, 0, 0, .4) !important;

  transform: rotate(-.5deg);
}

/* 三张「功能」小卡：各贴一张纸 + 上沿胶带 */
#intro .col-lg {
  position: relative;

  margin: 10px 8px 0;
  padding: 22px 18px 20px !important;

  background-color: var(--otm-paper) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;

  border: 1px solid rgba(0, 0, 0, .3);
  border-radius: 2px;

  box-shadow:
    0 1px 0 rgba(255, 255, 255, .9) inset,
    0 6px 0 rgba(0, 0, 0, .3),
    0 16px 30px -18px rgba(0, 0, 0, .95);

  transform: rotate(var(--otm-rot, 0deg));
  transition: transform .2s ease;
}

#intro .col-lg:nth-child(3n+1) { --otm-rot: -.7deg; }
#intro .col-lg:nth-child(3n+2) { --otm-rot: .6deg; }
#intro .col-lg:nth-child(3n)   { --otm-rot: -.35deg; }

#intro .col-lg:hover { transform: rotate(0deg) translateY(-4px); }

#intro .col-lg::before {
  content: "";
  position: absolute;
  top: -9px;
  left: 50%;
  width: 64px;
  height: 18px;
  transform: translateX(-50%) rotate(-2.4deg);
  background-image: repeating-linear-gradient(
    90deg,
    rgba(134, 213, 98, .55) 0 8px,
    rgba(160, 224, 129, .38) 8px 16px
  );
  box-shadow: 0 2px 5px rgba(0, 0, 0, .45);
  pointer-events: none;
}

/* 卡片里的字：墨色写在纸上 */
#intro .col-lg h3 {
  margin: 10px 0 8px !important;
  color: var(--otm-ink) !important;
  font-size: 18px !important;
  font-weight: 800 !important;
  text-shadow: none !important;
}

#intro .col-lg p {
  color: var(--otm-ink-soft) !important;
  font-size: 14px !important;
  line-height: 1.7;
}

#intro .col-lg i {
  font-size: 42px !important;
  color: var(--otm-grass-dark) !important;
}

/* 页脚：深色实心 → 台面 + 纸签按钮 */
#footer-wrap {
  background-color: var(--otm-workbench) !important;
  background-image:
    linear-gradient(90deg, var(--otm-workbench-line) 1px, transparent 1px),
    linear-gradient(180deg, var(--otm-workbench-line) 1px, transparent 1px) !important;
  background-size: 28px 28px !important;

  border-top: 1px dashed rgba(255, 246, 232, .14) !important;
  color: rgba(246, 232, 206, .7) !important;
}

#footer-wrap a { color: var(--otm-grass-light) !important; }

#footer-wrap .main-button {
  background-color: var(--otm-paper) !important;
  background-image: linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  border: 1px solid rgba(0, 0, 0, .32) !important;
  color: var(--otm-ink) !important;
  box-shadow: 0 4px 0 rgba(0, 0, 0, .38), 0 14px 24px -14px rgba(0, 0, 0, .9) !important;
}

#footer-wrap .main-button:hover {
  background-color: #fdfbf6 !important;
  color: var(--otm-ink) !important;
}

/* 版权那一条 */
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  background-color: var(--otm-workbench) !important;
  color: rgba(246, 232, 206, .5) !important;
  border-top: 1px dashed rgba(255, 246, 232, .1) !important;
}

@media (max-width: 767.98px) {
  #intro { padding: 40px 0 40px !important; }
  #intro h1 { padding: 8px 18px 11px !important; }
  #intro .col-lg { margin: 10px 0; }
}

/* ==========================================================================
   27 字体统一 + 深色底上的字加 MC 硬阴影
   --------------------------------------------------------------------------
   需求：字体和主站统一，深色底上的字加 MC 那种硬阴影。

   字体
       主站用的是系统中文默认（macOS 上是 PingFang ✅ Windows 上是微软雅黑），
       这边原来写的是 "Noto Sans" —— 两边字形不一样。改成和主站同一套回退顺序。

   阴影
       MC 的硬阴影是 **1px 1px 0 / 2px 2px 0 纯色偏移**，不是模糊阴影 ——
       像素风的东西模糊了就散了。
       主站也是这么用的：
           导航项   rgba(0,0,0,.55) 1px 1px 0
           站名     rgba(0,0,0,.7)  2px 2px 0

       **只加在深色底上的字**：
       纸面（卡片）上的字是墨色写在米色纸上，再压一道黑阴影会发闷，
       主站的做法也是这样 —— 相片说明、正文都没有阴影。

       所以下面按「字所在的底」分组：底部深色 → 加；纸面 → 不加。
   ========================================================================== */

/* --------------------------------------------------------------------------
   27.1 字体与主站统一
   -------------------------------------------------------------------------- */
body,
body:not(.login-page) {
  font-family: "PingFang SC", "PingFang TC", "Hiragino Sans GB",
               "Microsoft YaHei", "Noto Sans", sans-serif !important;
}

h1, h2, h3, h4, h5, h6,
.navbar-brand, .nav-link, .btn,
.card-title, .box-title,
.splash-head, .splash-subhead,
.main-button, .small-box .inner h3 {
  font-family: "PingFang SC", "PingFang TC", "Hiragino Sans GB",
               "Microsoft YaHei", "Noto Sans", sans-serif !important;
}

/* --------------------------------------------------------------------------
   27.2 深色底上的字：MC 硬阴影
   -------------------------------------------------------------------------- */

/* 顶栏（深色） —— 与主站导航项同一档：1px 1px 0 */
.main-header.navbar,
.main-header .nav-link,
.main-header .navbar-brand,
.main-header a,
.navbar .nav-link {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .55) !important;
}

/* 工作台上的大标题（内容区顶部那行「Skin Library」）—— 与主站站名同一档：2px */
.content-header h1,
.content-header h2,
.content-header h3 {
  text-shadow:
    2px 2px 0 rgba(0, 0, 0, .7),
    0 4px 10px rgba(0, 0, 0, .35) !important;
}

/* 面包屑（深底） */
.breadcrumb,
.breadcrumb-item,
.breadcrumb-item a,
.breadcrumb-item.active {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* 首页首屏：照片上的白字 —— 最需要阴影的地方 */
.hp-wrapper .splash-head {
  text-shadow:
    2px 2px 0 rgba(0, 0, 0, .62),
    0 6px 16px rgba(0, 0, 0, .35) !important;
}

.hp-wrapper .splash-subhead {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .55) !important;
}

.hp-wrapper .main-button {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* 首屏顶栏（浮在照片上，底不可靠）—— 也加上 */
.hp-wrapper .navbar .nav-link,
.hp-wrapper .navbar .navbar-brand {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .6) !important;
}

/* 页脚（深底） */
#footer-wrap,
#footer-wrap *,
#copyright,
#copyright * {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* 首页功能那节（深底） */
#intro h1,
#intro h3,
#intro p {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* 侧栏里那些**不在纸上**的字：分组标题之外的小字、页脚版权 */
.main-sidebar .nav-header { text-shadow: none !important; }   /* 它在纸上了 */

/* 登录页本来就在深色台面上 —— 页头那行站名加一道 */
body.login-page .login-logo a {
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .55) !important;
}

/* --------------------------------------------------------------------------
   27.3 明确不给阴影的：纸面上的字
   --------------------------------------------------------------------------
   这些地方的字写在米色纸上，再加黑阴影会发闷 —— 主站同样没加。
   写出来是为了**留下记录**：以后有人看到「别处都有阴影、这里没有」时，
   知道这是有意的，而不是漏了。
   -------------------------------------------------------------------------- */
.card, .card *,
.box, .box *,
.card-body, .card-body *,
.small-box, .small-box *,
.info-box, .info-box *,
.main-sidebar .nav-sidebar .nav-link,
.main-sidebar .nav-sidebar .nav-link *,
.main-sidebar .user-panel *,
.modal-content, .modal-content *,
.dropdown-menu, .dropdown-menu *,
.table, .table * {
  text-shadow: none !important;
}

/* ==========================================================================
   28 首屏顶栏两项统一 + 按钮外框加阴影
   --------------------------------------------------------------------------
   反馈两条：

   ① 「右上角没统一」
      左上角站名（.navbar-brand）是 15px / 字重 800 / 白字 / 带阴影，
      右上那三项（皮肤库、语言、用户）却是**更小、更细**的字 ——
      同一条顶栏里两套字号字重，看着就是没做完。

      统一成与站名同一档：同一字号、同一字重、同一道阴影。

   ②「用户中心按钮的外框也加阴影」
      原来按钮只有一圈 1px 白描边，**没有 box-shadow**，
      于是它只是「一圈线」，不像一块能按下去的东西。
      加一道 MC 那种硬阴影（和文字阴影同一套语言，不用模糊阴影）。
   ========================================================================== */

/* --------------------------------------------------------------------------
   28.1 顶栏左右统一
   -------------------------------------------------------------------------- */
.hp-wrapper .navbar .nav-link,
.hp-wrapper .navbar .navbar-brand,
.main-header .navbar .nav-link,
.main-header .navbar .navbar-brand {
  font-size: 15px !important;
  font-weight: 800 !important;
  letter-spacing: .02em;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .6) !important;
}

/* 顶栏里的图标跟着同一档字重，别一粗一细 */
.hp-wrapper .navbar .nav-link i,
.main-header .navbar .nav-link i {
  font-size: 14px !important;
}

/* 右上角之间留出均匀的间距，别挤在一起 */
.hp-wrapper .navbar-custom-menu .nav-item,
.main-header .navbar-nav .nav-item {
  margin-left: 6px;
}

/* 语言那一项里的下拉箭头与文字同色同影 */
.hp-wrapper .navbar .dropdown-toggle,
.main-header .navbar .dropdown-toggle {
  font-weight: 800 !important;
}

/* --------------------------------------------------------------------------
   28.2 首屏那个按钮：外框加硬阴影
   --------------------------------------------------------------------------
   和文字阴影同一套语言 —— 纯色偏移，不用模糊。
   另外给一点极淡的深色底：纯透明的话，框外的硬阴影会像一块悬空的暗色方块，
   底下垫一点点深色，它才像一块牌子压在照片上。
   -------------------------------------------------------------------------- */
.hp-wrapper .main-button {
  background-color: rgba(0, 0, 0, .22) !important;
  border: 1px solid rgba(255, 255, 255, .9) !important;

  box-shadow:
    3px 3px 0 rgba(0, 0, 0, .5),
    0 10px 24px -8px rgba(0, 0, 0, .55) !important;
}

.hp-wrapper .main-button:hover,
.hp-wrapper .main-button:focus {
  background-color: rgba(0, 0, 0, .34) !important;
  box-shadow:
    5px 5px 0 rgba(0, 0, 0, .55),
    0 14px 30px -10px rgba(0, 0, 0, .6) !important;
}

.hp-wrapper .main-button:active {
  background-color: rgba(0, 0, 0, .45) !important;
  box-shadow:
    1px 1px 0 rgba(0, 0, 0, .5),
    0 4px 12px -4px rgba(0, 0, 0, .5) !important;
}

/* 非首屏页（皮肤库等）的按钮沿用同一套硬阴影，保持一致 */
#footer-wrap .main-button {
  box-shadow: 3px 3px 0 rgba(0, 0, 0, .5), 0 10px 24px -8px rgba(0, 0, 0, .5) !important;
}

/* ==========================================================================
   29 修正：纸面上的字被加了黑阴影，糊得看不清
   --------------------------------------------------------------------------
   反馈：这些阴影加的都要看不清字了（指向首页「优势」那节与「开始使用」按钮）。

   是我第 27 节打偏了。当时的原则是「只给深色底上的字加阴影」，
   但落笔时用了**父容器**去框范围：
       #intro h1 / #intro h3 / #intro p      → 加
       #footer-wrap, #footer-wrap *          → 加

   问题在于这两个父容器里**混着两种底**：
       「优势」标题与三张功能卡  → 本身是**纸**（米色纸卡）
       「开始使用」按钮          → 本身是**纸**
       只有卡外的说明文字         → 才在深色台面上

   纸上是**深字**，再压一道 rgba(0,0,0,.5) 的黑阴影，
   等于深字压深影 —— 边缘糊成一团。

   这一节把范围改**精确到元素本身**：凡是自己带纸底的，一律不加。
   ========================================================================== */

/* 「优势」大标题在纸卡上 —— 去掉阴影 */
#intro h1,
#intro > .container > .text-center > h1 {
  text-shadow: none !important;
}

/* 三张功能卡是纸卡，里面的字全都不加 */
#intro .col-lg,
#intro .col-lg * {
  text-shadow: none !important;
}

/* 「开始使用」是纸按钮 —— 里面的字也不加 */
#footer-wrap .main-button,
#footer-wrap .main-button * {
  text-shadow: none !important;
}

/* 版权那条在台面上、且没有纸底 —— 保留阴影 */
#copyright,
#copyright * {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* 「开始使用」左边那段说明文字在台面上 —— 保留阴影（它没有纸底） */
#footer-wrap > .container > .row > .col-lg-6,
#footer-wrap > .container > .row > .col-lg-6 * {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* ==========================================================================
   29.1 复核：凡是自带纸底的元素，一律不给文字阴影
   --------------------------------------------------------------------------
   这是本节的**总规则**，比上面逐条举例更可靠 ——
   以后再加纸面元素（比如新的卡片类），只要命中这个列表就自动不会有阴影。
   ========================================================================== */
#intro h1,
#intro .col-lg,
#intro .col-lg *,
#footer-wrap .main-button,
#footer-wrap .main-button *,
.card, .card *,
.box, .box *,
.small-box, .small-box *,
.info-box, .info-box *,
.badge, .label,
.table, .table *,
.modal-content, .modal-content *,
.dropdown-menu, .dropdown-menu *,
.main-sidebar .nav-sidebar .nav-link,
.main-sidebar .nav-sidebar .nav-link *,
.main-sidebar .user-panel *,
.nav-header,
.page-link {
  text-shadow: none !important;
}

/* ==========================================================================
   30 顶栏的字全部改成纯白
   --------------------------------------------------------------------------
   反馈：这里的所有字都用纯白色。

   现状是两档：
       站名        #fff（纯白）
       右上三项    rgba(255, 255, 255, .75)  ← 七五折的白，在深色栏上看着发灰

   同一条栏里两种白，也是「没统一」的一种。全部改成 #fff。

   注意 :hover 也跟着改 —— 原来悬停会变草绿，那又跳出「都是白」这条规则了。
   悬停改用**透明度不变、加一道更亮的阴影**来提示，颜色始终是白。
   ========================================================================== */

.hp-wrapper .navbar .nav-link,
.hp-wrapper .navbar .navbar-brand,
.hp-wrapper .navbar .nav-item,
.hp-wrapper .navbar .dropdown-toggle,
.hp-wrapper .navbar .navbar-nav,
.hp-wrapper .navbar a,
.hp-wrapper .navbar i,
.main-header.navbar,
.main-header .navbar .nav-link,
.main-header .navbar .navbar-brand,
.main-header .navbar .nav-item,
.main-header .navbar .dropdown-toggle,
.main-header .navbar .navbar-nav,
.main-header .navbar a,
.main-header .navbar i {
  color: #ffffff !important;
}

/* 悬停：颜色仍是纯白，靠阴影变亮来提示 */
.hp-wrapper .navbar .nav-link:hover,
.hp-wrapper .navbar .nav-link:focus,
.hp-wrapper .navbar a:hover,
.main-header .navbar .nav-link:hover,
.main-header .navbar .nav-link:focus,
.main-header .navbar a:hover {
  color: #ffffff !important;
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .7) !important;
}

/* 顶栏里的下拉箭头、计数这类装饰也跟着白 */
.hp-wrapper .navbar .badge,
.main-header .navbar .badge,
.main-header .navbar .dropdown-toggle::after {
  color: #ffffff !important;
  border-top-color: #ffffff !important;
}

/* 头像旁边那个用户名（Yadiel_）也是纯白 */
.hp-wrapper .navbar .d-none.d-sm-inline,
.main-header .navbar .d-none.d-sm-inline,
.main-header .navbar .user-menu,
.main-header .navbar .user-menu span {
  color: #ffffff !important;
}

/* 顶栏里的下拉菜单是纸面，里面的字仍用墨色 —— 别被上面的白带跑 */
.hp-wrapper .navbar .dropdown-menu,
.hp-wrapper .navbar .dropdown-menu *,
.main-header .navbar .dropdown-menu,
.main-header .navbar .dropdown-menu * {
  color: #2e2a26 !important;
}

/* ==========================================================================
   31 修正：站内页的顶栏没变白
   --------------------------------------------------------------------------
   首页好了，站内页（皮肤库、控制台等）还是米色字。原因在选择器写法：

   站内页的标记是
       <nav class="main-header navbar navbar-expand ...">
    **两个类在同一个元素上**。

   而我写的是
       .main-header .navbar a          ← 后代选择器
   它要求 .navbar 是 .main-header 的**子孙**，而这里两者是同一个元素 ——
   所以整条规则一条都没命中，一直是第 18 节那条米色字在起作用。

   首页能生效是因为那边结构不同：
       <div class="hp-wrapper"><nav class="navbar ...">
   .navbar 确实是 .hp-wrapper 的后代，后代选择器成立。

   改成 .main-header.navbar（同一个元素上两个类）就对了。
   ========================================================================== */

.main-header.navbar,
.main-header.navbar .nav-link,
.main-header.navbar .navbar-brand,
.main-header.navbar .nav-item,
.main-header.navbar .dropdown-toggle,
.main-header.navbar .navbar-nav,
.main-header.navbar a,
.main-header.navbar i,
.main-header.navbar span,
.main-header.navbar .d-none.d-sm-inline,
.main-header.navbar .user-menu,
.main-header.navbar .user-menu span {
  color: #ffffff !important;
}

/* 悬停：仍是纯白，只把阴影加亮 */
.main-header.navbar .nav-link:hover,
.main-header.navbar .nav-link:focus,
.main-header.navbar a:hover {
  color: #ffffff !important;
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .7) !important;
}

/* 下拉箭头 */
.main-header.navbar .dropdown-toggle::after {
  border-top-color: #ffffff !important;
}

/* 顶栏里的下拉菜单是纸面 —— 里面的字仍用墨色，别被上面的白带跑 */
.main-header.navbar .dropdown-menu,
.main-header.navbar .dropdown-menu * {
  color: #2e2a26 !important;
}

/* 侧栏收起时那个 ☰ 也是白 */
.main-header.navbar .sidebar-toggle,
.main-header.navbar .nav-link[data-widget="pushmenu"] {
  color: #ffffff !important;
}

/* ==========================================================================
   32 顶栏背景与主站导航栏一致
   --------------------------------------------------------------------------
   反馈：背景色和主页导航栏一致。

   实测两边：

       主站导航栏   linear-gradient(rgb(66,61,57) → rgb(46,42,39))
                    + backdrop-filter: blur(14px) saturate(1.4)
                    → 暖深灰

       皮肤站顶栏   rgba(20,19,17,.96)
                    → 近黑，比主站暗一大截，也更冷

   按主站那一套改：同一个渐变、同一个毛玻璃参数。
   长页面滚动时它会盖住下面的照片，所以毛玻璃要一起带过来，否则是一块死的深色。
   ========================================================================== */

.main-header.navbar,
.main-header,
.hp-wrapper .navbar {
  background-color: rgb(55, 51, 47) !important;
  background-image: linear-gradient(180deg, rgb(66, 61, 57) 0%, rgb(46, 42, 39) 100%) !important;

  -webkit-backdrop-filter: blur(14px) saturate(1.4) !important;
  backdrop-filter: blur(14px) saturate(1.4) !important;

  border-bottom: 1px solid rgba(0, 0, 0, .55) !important;
  box-shadow: 0 6px 18px -8px rgba(0, 0, 0, .9) !important;
}

/* 首屏那条顶栏浮在照片上 —— 让它透一点，才看得出底下是照片 */
.hp-wrapper .navbar.transparent {
  background-color: rgba(46, 42, 39, .82) !important;
  background-image: linear-gradient(180deg, rgba(66, 61, 57, .86) 0%, rgba(46, 42, 39, .92) 100%) !important;
}

/* --------------------------------------------------------------------------
   侧栏也用同一个色 —— 它是同一套「框」，两处不一样会更显眼
   -------------------------------------------------------------------------- */
.main-sidebar {
  background-color: rgb(46, 42, 39) !important;
  background-image: linear-gradient(180deg, rgb(58, 53, 49) 0%, rgb(40, 37, 34) 100%) !important;
  border-right: 1px solid rgba(0, 0, 0, .6) !important;
}

/* 页脚也归到同一档，免得深浅不一 */
#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  background-color: rgb(46, 42, 39) !important;
  background-image: linear-gradient(180deg, rgb(52, 48, 44) 0%, rgb(40, 37, 34) 100%) !important;
}

/* ==========================================================================
   33 统一：站名与菜单在首页 / 控制台两处的观感
   --------------------------------------------------------------------------
   反馈：首页和控制台页，菜单与左上角站名 UI 没统一。

   量下来问题出在两处（顶栏那个站名其实两边一致，都是透明底 + 纯白）：

   ① 控制台**侧栏顶部**的站名
      我早前（第 16 / 20 节）把它做成了「台面同色 + 站名一张米色小纸条」，
      于是控制台左上角是一块**米色方块**；而首页那个站名是**一行白字**。
      同一站里两种站名，就是没统一。

      → 统一成首页那种：**纯白文字，不要底色、不要纸条**。

   ② 用户下拉菜单
      虽然已经是米色纸（第 10 节的通用规则），但那一列就是**一行行平铺**：
      没有圆角、没有分项间距、没有分隔，看着像没做完。

      → 补上圆角、内边距、分项间距、悬停底色与一道硬影。
   ========================================================================== */

/* --------------------------------------------------------------------------
   33.1 侧栏顶部的站名：去掉纸片，改纯白文字
   -------------------------------------------------------------------------- */
.main-sidebar .brand-link {
  background-color: transparent !important;
  background-image: none !important;
  border-bottom: 1px solid rgba(0, 0, 0, .55) !important;
  box-shadow: none !important;
}

.main-sidebar .brand-link .brand-text {
  display: inline !important;

  padding: 0 !important;
  background: none !important;
  border: 0 !important;
  box-shadow: none !important;
  transform: none !important;

  color: #ffffff !important;
  font-size: 16px !important;
  font-weight: 800 !important;
  letter-spacing: .02em;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .6) !important;
}

/* 侧栏里那个可点区域整体也在深色底上 —— 白字 */
.main-sidebar .brand-link,
.main-sidebar .brand-link * {
  color: #ffffff !important;
}

/* --------------------------------------------------------------------------
   33.2 下拉菜单：补齐排版
   -------------------------------------------------------------------------- */
.dropdown-menu {
  min-width: 190px !important;
  padding: 7px !important;

  border-radius: 4px !important;
  border: 1px solid rgba(0, 0, 0, .32) !important;

  box-shadow:
    0 3px 0 rgba(0, 0, 0, .34),
    0 14px 28px -12px rgba(0, 0, 0, .8) !important;

  overflow: hidden;
}

.dropdown-item {
  padding: 9px 14px !important;
  border-radius: 3px !important;

  font-weight: 700;
  line-height: 1.4;
  white-space: nowrap;
}

.dropdown-item:hover,
.dropdown-item:focus {
  background-color: rgba(108, 195, 73, .18) !important;
  color: var(--otm-grass-dark) !important;
}

/* 分项之间一条极淡的线 —— 一列字没有分隔读起来是糊的 */
.dropdown-item + .dropdown-item {
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, .07);
}

/* 分隔线本身也压细一点 */
.dropdown-divider {
  margin: 5px 4px !important;
  border-top-color: rgba(0, 0, 0, .12) !important;
}

/* 菜单里那种「退出登录」常放在最后一格，给它一点顶部间隔 */
.dropdown-menu .dropdown-divider + .dropdown-item {
  box-shadow: none;
}

/* 侧栏收起时那个 ☰ 与站名同色 */
.main-sidebar .brand-link .brand-image,
.main-sidebar .brand-link i {
  color: #ffffff !important;
}

/* ==========================================================================
   34 右上角三项：做成主站导航那样的按钮，并带小图标
   --------------------------------------------------------------------------
   需求：把这里按钮化，并且和主页一样有个小 icon。

   主站导航项的样子（对着截图量的）：
       暗底  rgba(255, 246, 232, .075)
       描边  1px solid rgba(0, 0, 0, .5)
       直角  border-radius: 0
       白字  字重 700，带一道硬阴影
       前面  一个小绿方块（内嵌模式的标记）+ 一个 emoji 图标

   皮肤站这边原来只是一行白字，没有底、没有边、没有图标 ——
   所以照主站那套做。
   ========================================================================== */

/* --------------------------------------------------------------------------
   34.1 按钮化
   -------------------------------------------------------------------------- */
.hp-wrapper .navbar .nav-link,
.main-header.navbar .nav-link {
  display: inline-flex !important;
  align-items: center;
  gap: 7px;

  margin: 0 4px !important;
  padding: 7px 13px !important;

  background-color: rgba(255, 246, 232, .075) !important;
  background-image: none !important;

  border: 1px solid rgba(0, 0, 0, .5) !important;
  border-radius: 0 !important;

  color: #ffffff !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  line-height: 1.2;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .55) !important;

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .1),
    0 2px 0 rgba(0, 0, 0, .45) !important;

  transition: background-color .16s ease, transform .16s ease;
}

/* 悬停：底稍微亮一点 + 上面抬一抬 —— 主站也是这个反应 */
.hp-wrapper .navbar .nav-link:hover,
.hp-wrapper .navbar .nav-link:focus,
.main-header.navbar .nav-link:hover,
.main-header.navbar .nav-link:focus {
  background-color: rgba(255, 246, 232, .16) !important;
  color: #ffffff !important;
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .7) !important;
  transform: translateY(-1px);
}

/* 按下：陷回去 */
.hp-wrapper .navbar .nav-link:active,
.main-header.navbar .nav-link:active {
  background-color: rgba(0, 0, 0, .35) !important;
  transform: translateY(1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06) !important;
}

/* --------------------------------------------------------------------------
   34.2 每项前面一个小绿方块 —— 与主站那个内嵌标记同款
   -------------------------------------------------------------------------- */
.hp-wrapper .navbar .nav-link::before,
.main-header.navbar .nav-item > .nav-link::before {
  content: "";
  flex: 0 0 auto;

  width: 5px;
  height: 5px;

  background-color: var(--otm-grass-light, #86d562);
  opacity: .9;
}

/* 「皮肤库」原来没有图标 —— 补一个（主站每项都有一个 emoji） */
.main-header.navbar .nav-link[href*="skinlib"]::after,
.hp-wrapper .navbar .nav-link[href*="skinlib"]::after {
  content: "👕";
  font-size: 14px;
  line-height: 1;
  filter: none;
}

/* 站名自己不算导航项，不该有小方块 */
.main-header.navbar .navbar-brand::before,
.hp-wrapper .navbar .navbar-brand::before {
  content: none !important;
  display: none !important;
}

/* 用户那一项前面已经有头像了，不再加方块（避免「方块 + 头像」两个标） */
.main-header.navbar .nav-item:has(.bs-avatar) > .nav-link::before,
.hp-wrapper .navbar .nav-item:has(.bs-avatar) > .nav-link::before {
  content: none !important;
  display: none !important;
}

/* 语言那一项自带一个图标，方块保留（主站也是方块 + emoji 两个都在） */

/* 头像外面那圈纸边与按钮风格对齐：改成直角细框 */
.hp-wrapper .navbar .bs-avatar,
.main-header.navbar .bs-avatar,
.hp-wrapper .navbar img.bs-avatar,
.main-header.navbar img.bs-avatar {
  border: 1px solid rgba(0, 0, 0, .5) !important;
  border-radius: 0 !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12) !important;
  image-rendering: pixelated;
}

/* 窄屏：按钮别太宽 */
@media (max-width: 767.98px) {
  .hp-wrapper .navbar .nav-link,
  .main-header.navbar .nav-link {
    padding: 6px 9px !important;
    font-size: 13px !important;
    margin: 0 2px !important;
  }
}

/* ==========================================================================
   35 按钮严格对齐主站规格 + emoji 挪到文字前面
   --------------------------------------------------------------------------
   反馈两条：
       ① emoji 要在文字前面（我上一版用了 ::after，加到了后面）
       ② 按钮的配色和阴影要和主站一致

   ② 这次不是凭印象 —— 我把主站导航栏那一项**逐属性量了一遍**，
      连阴影的三层构成都抄了下来：

       常态
           background  rgba(255, 246, 232, .075)
           border      1px solid rgba(0, 0, 0, .5)
           radius      0
           padding     10px 16px
           color       rgb(237, 229, 226)
           font        15px / 700
           text-shadow rgba(0, 0, 0, .55) 1px 1px 0
           box-shadow  inset  2px  2px 0 rgba(255,255,255,.2)    ← 上左受光
                       inset -2px -2px 0 rgba(0,0,0,.65)         ← 下右压暗
                             0px  3px 0 rgba(0,0,0,.4)           ← 底下一条硬边

       悬停
           background  rgba(108, 195, 73, .22)                   ← 变草绿
           color       rgb(252, 245, 241)
           box-shadow  同上，另加 inset 0 0 0 1px rgba(134,213,98,.5)  ← 内圈一层绿光

       绿方块  5×5 / rgb(108,195,73) / 右间距 8px / vertical-align 2px

   ① emoji 的位置
      绿方块用的是 ::before、emoji 用的是 ::after —— 而 ::after 天然排在末尾。
      但这是个 flex 容器，可以用 order 调顺序：
          ::before（方块）order: -2  →  最前
          ::after（emoji）order: -1  →  其次
          文字            默认 0    →  最后
      于是顺序变成「方块 · emoji · 文字」，正好是主站那个样子。
   ========================================================================== */

.hp-wrapper .navbar .nav-link,
.main-header.navbar .nav-link {
  display: inline-flex !important;
  align-items: center;
  gap: 0;                    /* 间距由两个伪元素自己给，好对齐 */

  margin: 0 4px !important;
  padding: 10px 16px !important;

  background-color: rgba(255, 246, 232, .075) !important;
  background-image: none !important;

  border: 1px solid rgba(0, 0, 0, .5) !important;
  border-radius: 0 !important;

  color: rgb(237, 229, 226) !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  line-height: 1.2;
  text-shadow: rgba(0, 0, 0, .55) 1px 1px 0 !important;

  /* 三层：上左受光 / 下右压暗 / 底下一条硬边 —— 与主站逐字一致 */
  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .2),
    inset -2px -2px 0 rgba(0, 0, 0, .65),
    0 3px 0 rgba(0, 0, 0, .4) !important;

  transform: none;
  filter: none;
  transition: background-color .16s ease, color .16s ease, box-shadow .16s ease;
}

/* ① 绿方块：排最前 */
.hp-wrapper .navbar .nav-link::before,
.main-header.navbar .nav-item > .nav-link::before {
  content: "";
  order: -2;
  flex: 0 0 auto;

  width: 5px;
  height: 5px;
  margin-right: 8px;

  background-color: rgb(108, 195, 73);
  opacity: .9;
  align-self: center;
}

/* ① emoji：排在方块之后、文字之前 */
.main-header.navbar .nav-link[href*="skinlib"]::after,
.hp-wrapper .navbar .nav-link[href*="skinlib"]::after {
  content: "👕";
  order: -1;
  flex: 0 0 auto;

  margin-right: 7px;
  font-size: 14px;
  line-height: 1;
}

/* 悬停：与主站一致 —— 底变草绿，并加内圈一层绿光 */
.hp-wrapper .navbar .nav-link:hover,
.hp-wrapper .navbar .nav-link:focus,
.main-header.navbar .nav-link:hover,
.main-header.navbar .nav-link:focus {
  background-color: rgba(108, 195, 73, .22) !important;
  color: rgb(252, 245, 241) !important;
  text-shadow: rgba(0, 0, 0, .55) 1px 1px 0 !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .24),
    inset -2px -2px 0 rgba(0, 0, 0, .6),
    0 3px 0 rgba(0, 0, 0, .4),
    inset 0 0 0 1px rgba(134, 213, 98, .5) !important;

  transform: none;
}

/* 按下：主站的按钮是实的，不做位移 —— 只把底压暗 */
.hp-wrapper .navbar .nav-link:active,
.main-header.navbar .nav-link:active {
  background-color: rgba(0, 0, 0, .3) !important;
  transform: none;
}

/* 站名不是导航项：不要方块、不要 emoji */
.main-header.navbar .navbar-brand::before,
.main-header.navbar .navbar-brand::after,
.hp-wrapper .navbar .navbar-brand::before,
.hp-wrapper .navbar .navbar-brand::after {
  content: none !important;
  display: none !important;
}

/* 用户那一项前面是头像，不要方块 */
.main-header.navbar .nav-item:has(.bs-avatar) > .nav-link::before,
.hp-wrapper .navbar .nav-item:has(.bs-avatar) > .nav-link::before {
  content: none !important;
  display: none !important;
}

/* 窄屏 */
@media (max-width: 767.98px) {
  .hp-wrapper .navbar .nav-link,
  .main-header.navbar .nav-link {
    padding: 8px 10px !important;
    font-size: 13px !important;
    margin: 0 2px !important;
  }
  .main-header.navbar .nav-link[href*="skinlib"]::after,
  .hp-wrapper .navbar .nav-link[href*="skinlib"]::after { font-size: 12px; margin-right: 5px; }
}

/* ==========================================================================
   36 按钮等宽
   --------------------------------------------------------------------------
   反馈：按钮大小要一致。

   实测三个按钮高度已经一样（都 40px），但宽度随文字长短走：
       Skin Library  162px
       English       118px
       Log In        111px
   一排宽窄不一的按钮，看着就是没排整齐。

   做法：给一个统一的最小宽度，内容居中 ——
   短的自然撑到这个宽度，长的（Skin Library 162px）也只比它多一点，
   于是三个按钮实际一样宽。
   最小宽度取 170px：Skin Library 要 162px，取 170 能把它一起收进来。
   ========================================================================== */
.hp-wrapper .navbar .nav-link,
.main-header.navbar .nav-link {
  min-width: 170px !important;
  justify-content: center !important;
}

/* 内容整体居中之后，方块与 emoji 的间距仍要保持 */
.hp-wrapper .navbar .nav-link::before,
.main-header.navbar .nav-item > .nav-link::before {
  margin-right: 8px;
}

/* 首页那条顶栏本身较窄（还有站名在同一行）—— 窄屏放宽到 100% 会换行，所以分档 */
@media (max-width: 991.98px) {
  .hp-wrapper .navbar .nav-link,
  .main-header.navbar .nav-link {
    min-width: 0 !important;
    padding: 8px 12px !important;
  }
}

/* 手机上三项并排本来就挤，不强制等宽 */
@media (max-width: 575.98px) {
  .hp-wrapper .navbar .nav-link,
  .main-header.navbar .nav-link {
    min-width: 0 !important;
    padding: 7px 10px !important;
    font-size: 13px !important;
  }
}

/* ==========================================================================
   37 修正：侧栏收起时的两处
   --------------------------------------------------------------------------
   反馈：侧栏收起后，左上那块会缩进去（截图里那个被挤扁的用户面板）。

   两处问题：

   ① ☰ 那个按钮被当成了导航项
      它的类名也是 .nav-link（data-widget="pushmenu"），
      于是被第 34/35/36 节那套「导航项按钮化 + 等宽」一起套上了 ——
      多出一个绿方块、还被撑到 170px 宽，挤在左上角很怪。
      它不是导航项，要排除掉。

   ② 侧栏收起时用户面板被压扁
      AdminLTE 收起侧栏会把 body 加上 .sidebar-collapse，
      侧栏宽度只剩约 50px。而我的 .user-panel 是
      margin: 14px 10px + padding: 10px 12px ——
      左右各占 22px，50px 的栏里放不下，于是溢出、被裁成一条。
      收起状态要单独给一套紧凑值。
   ========================================================================== */

/* --------------------------------------------------------------------------
   37.1 ☰ 不是导航项
   -------------------------------------------------------------------------- */
.main-header.navbar .nav-link[data-widget="pushmenu"],
.main-header.navbar .sidebar-toggle,
.hp-wrapper .navbar .nav-link[data-widget="pushmenu"] {
  min-width: 0 !important;
  width: auto !important;

  margin: 0 6px 0 0 !important;
  padding: 8px 14px !important;

  background-color: rgba(255, 246, 232, .075) !important;
  border: 1px solid rgba(0, 0, 0, .5) !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .2),
    inset -2px -2px 0 rgba(0, 0, 0, .65),
    0 2px 0 rgba(0, 0, 0, .4) !important;

  justify-content: center !important;
}

/* 它前面不要那个绿方块 */
.main-header.navbar .nav-link[data-widget="pushmenu"]::before,
.main-header.navbar .sidebar-toggle::before,
.hp-wrapper .navbar .nav-link[data-widget="pushmenu"]::before {
  content: none !important;
  display: none !important;
}

/* 顶栏里所有不是导航项的 .nav-link（比如 ☰）都不参与等宽 */
.main-header.navbar .nav-link[data-widget="pushmenu"],
.main-header.navbar .sidebar-toggle {
  flex: 0 0 auto !important;
}

/* --------------------------------------------------------------------------
   37.2 侧栏收起时的紧凑值
   --------------------------------------------------------------------------
   AdminLTE 收起时给 body 加 .sidebar-collapse，侧栏宽度约 50px。
   下面这套值按那个宽度算：左右各留 6px，中间还剩 ~38px 放头像。
   -------------------------------------------------------------------------- */
body.sidebar-collapse .main-sidebar .user-panel {
  margin: 10px 6px 6px !important;
  padding: 6px !important;
  border-radius: 2px;
}

/* 收起时头像居中、去掉白边宽度占用 */
body.sidebar-collapse .main-sidebar .user-panel .image,
body.sidebar-collapse .main-sidebar .user-panel img {
  width: 26px !important;
  height: 26px !important;
  margin: 0 auto !important;
  display: block;
}

/* 名字与角色标签在 50px 里放不下 —— 收起时藏起来（鼠标悬停有 title 提示） */
body.sidebar-collapse .main-sidebar .user-panel .info,
body.sidebar-collapse .main-sidebar .user-panel .info * {
  display: none !important;
}

/* 收起时顶部站名也放不下，只留一个缩写记号 */
body.sidebar-collapse .main-sidebar .brand-link {
  padding: 10px 0 !important;
  text-align: center;
}

body.sidebar-collapse .main-sidebar .brand-link .brand-text {
  font-size: 0 !important;          /* 藏掉整串站名 */
}

body.sidebar-collapse .main-sidebar .brand-link .brand-text::before {
  content: "旧";
  font-size: 15px !important;
  font-weight: 800;
  color: #ffffff;
}

/* 收起时菜单项只留图标：方块与 emoji 都去掉，图标居中 */
body.sidebar-collapse .main-sidebar .nav-sidebar .nav-link {
  margin: 3px 6px !important;
  padding: 8px 0 !important;
  justify-content: center !important;
  text-align: center;
}

body.sidebar-collapse .main-sidebar .nav-sidebar .nav-link p {
  display: none !important;         /* 文字藏起来，只留图标 */
}

/* 展开时的状态不变 */
body:not(.sidebar-collapse) .main-sidebar .brand-link .brand-text::before {
  content: none !important;
}

/* ==========================================================================
   38 下拉菜单：选中项改成白字
   --------------------------------------------------------------------------
   反馈：这里选中文字应该和首页一样变白，而不是变黑。

   原来我写的是
       background-color: rgba(108, 195, 73, .18)     ← 浅绿
       color: var(--otm-grass-dark)                  ← 深绿字
   在米色纸上，浅绿底 + 深绿字确实能看清，但和首页那套不一致 ——
   首页导航悬停是「绿底 + 白字」。

   为什么这里不照抄首页的半透明绿：
   首页那条栏底是深色，半透明绿压上去仍然偏深，白字压得住；
   下拉菜单的底是米色纸，半透明绿压上去是很浅的一层，白字就飘了。

   所以这里用**实心草绿**（--otm-grass = #52a535）——
   底够深，白字才立得住，同时仍然是「绿底白字」这套语言。
   ========================================================================== */

.dropdown-menu .dropdown-item:hover,
.dropdown-menu .dropdown-item:focus,
.dropdown-menu .dropdown-item:active,
.dropdown-menu .dropdown-item.active {
  background-color: var(--otm-grass, #52a535) !important;
  background-image: linear-gradient(180deg, #63b455 0%, #4e9c44 100%) !important;

  color: #ffffff !important;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .35) !important;

  box-shadow: none !important;
}

/* 悬停项里的图标、小字也跟着白 */
.dropdown-menu .dropdown-item:hover *,
.dropdown-menu .dropdown-item:focus *,
.dropdown-menu .dropdown-item:active *,
.dropdown-menu .dropdown-item.active * {
  color: #ffffff !important;
}

/* 悬停那项的分隔线不要压在上面 */
.dropdown-menu .dropdown-item:hover,
.dropdown-menu .dropdown-item:focus {
  box-shadow: inset 0 1px 0 rgba(0, 0, 0, .06) !important;
}

/* 相邻的下一项在上一项悬停时不要露出分隔线压边 */
.dropdown-menu .dropdown-item:hover + .dropdown-item {
  box-shadow: none !important;
}

/* 顶栏那条「通知」下拉也用同一套 */
.dropdown-menu .dropdown-item,
.dropdown-menu a {
  transition: background-color .14s ease, color .14s ease;
}

/* ==========================================================================
   39 修正：下拉悬停的底色与字色没压过去
   --------------------------------------------------------------------------
   实测：悬停时 background-image 是我的（绿渐变），
   但 background-color 与 color 仍是更早第 10 节那条
   「--otm-paper-deep + 墨色字」，于是绿渐变叠在米色底上、字还是深色。

   三条规则都带 !important，只能比选择器强度。第 38 节三个类本该赢但没赢，
   推演下去没意义 —— 直接把强度提到明确更高的一档：
   带上 .main-header.navbar / .hp-wrapper .navbar 两个宿主前缀。
   ========================================================================== */
.main-header.navbar .dropdown-menu .dropdown-item:hover,
.main-header.navbar .dropdown-menu .dropdown-item:focus,
.main-header.navbar .dropdown-menu .dropdown-item:active,
.main-header.navbar .dropdown-menu .dropdown-item.active,
.hp-wrapper .navbar .dropdown-menu .dropdown-item:hover,
.hp-wrapper .navbar .dropdown-menu .dropdown-item:focus,
.hp-wrapper .navbar .dropdown-menu .dropdown-item:active,
.hp-wrapper .navbar .dropdown-menu .dropdown-item.active,
.main-sidebar .dropdown-menu .dropdown-item:hover,
.main-sidebar .dropdown-menu .dropdown-item:focus {
  background-color: #52a535 !important;
  background-image: linear-gradient(180deg, #63b455 0%, #4e9c44 100%) !important;

  color: #ffffff !important;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .35) !important;

  box-shadow: inset 0 1px 0 rgba(0, 0, 0, .06) !important;
}

.main-header.navbar .dropdown-menu .dropdown-item:hover *,
.main-header.navbar .dropdown-menu .dropdown-item:focus *,
.hp-wrapper .navbar .dropdown-menu .dropdown-item:hover *,
.main-header.navbar .dropdown-menu .dropdown-item.active * {
  color: #ffffff !important;
}

/* ==========================================================================
   40 修正：页脚「一楞一楞」的横带
   --------------------------------------------------------------------------
   反馈：这里不要一楞一楞的，不好看。

   那道道横带是我自己叠出来的。前后一共给页脚铺过三次底色：
       第 23 节  #footer-wrap  → 台面 + 格线
       第 32 节  #footer-wrap / #copyright / ... → 各自一条渐变
       另外     容器与行里还有父主题自己的底

   每一层的渐变都从 #3a3430 到 #2a2724 之间取色，彼此差一两个色阶 ——
   单看几乎一样，叠在一起就成了一层层横带。

   改法：页脚这几层**全部透明**，直接露出页面本身那个台面。
   台面是一整片（body 上的格线），于是页脚与正文是同一个底，没有接缝。
   只留一条虚线，表示「正文到这里结束」。
   ========================================================================== */

#footer-wrap,
#footer-wrap > .container,
#footer-wrap .row,
#footer-wrap [class*="col-"],
#copyright,
#copyright > .container,
#copyright.with-intro,
#copyright.without-intro {
  background-color: transparent !important;
  background-image: none !important;
  box-shadow: none !important;
}

/* 正文与页脚之间那一条分界 —— 只要一条 */
#footer-wrap {
  border-top: 1px dashed rgba(255, 246, 232, .12) !important;
  padding: 36px 0 12px !important;
}

/* 页脚下面那条版权 —— 与上面同一片，不再另起一条分界 */
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  border-top: 0 !important;
  padding: 10px 0 22px !important;
}

/* 台面上那段说明文字的字色与阴影保持（它是深底上的字） */
#footer-wrap > .container > .row > .col-lg-6,
#footer-wrap > .container > .row > .col-lg-6 * {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}
#copyright, #copyright * {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .5) !important;
}

/* ==========================================================================
   41 页脚给一个实底（取主站的底色）
   --------------------------------------------------------------------------
   反馈：这里的颜色变成和主页一样的底色。

   上一节我把页脚几层全改成透明，想的是「露出页面本身那个台面」——
   但实际效果是**首屏那张大图透上来了**：页脚那块本来是浮在照片上的。

   实测两边：
       主站 body    rgb(32, 30, 28)  + 格线
       皮肤站 body  rgb(37, 36, 33)  + 格线   ← 已经接近，但差一点

   所以这一节直接给页脚**一个实底**，取主站那个色，连格线一起带上 ——
   既盖住底下的照片，又和主站是同一个底色。
   ========================================================================== */

#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  background-color: rgb(32, 30, 28) !important;
  background-image:
    linear-gradient(90deg, rgba(255, 246, 232, .045) 1px, transparent 1px),
    linear-gradient(180deg, rgba(255, 246, 232, .045) 1px, transparent 1px) !important;
  background-size: 28px 28px, 28px 28px !important;

  box-shadow: none !important;
}

/* 容器与外层仍透明，免得又叠出横带 */
#footer-wrap > .container,
#footer-wrap .row,
#footer-wrap [class*="col-"],
#copyright > .container {
  background-color: transparent !important;
  background-image: none !important;
}

/* 只在正文与页脚之间保留一条虚线 */
#footer-wrap {
  border-top: 1px dashed rgba(255, 246, 232, .12) !important;
  padding: 36px 0 12px !important;
}

/* 页脚与版权条之间不再另起分界 —— 它们现在是同一片实底 */
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  border-top: 0 !important;
  padding: 10px 0 22px !important;
}

/* 「开始使用」那个纸签按钮压在实底上也好看，不用改；只确认它有影 */
#footer-wrap .main-button {
  box-shadow: 3px 3px 0 rgba(0, 0, 0, .5), 0 10px 24px -8px rgba(0, 0, 0, .6) !important;
}

/* --------------------------------------------------------------------------
   顺带：把整站的台面色也对齐主站那一档
   --------------------------------------------------------------------------
   皮肤站原来是 rgb(37,36,33)，主站是 rgb(32,30,28) —— 差 5 个色阶，
   挨着看能看出来。既然要对齐，就一起改。
   -------------------------------------------------------------------------- */
body:not(.login-page) {
  background-color: rgb(32, 30, 28) !important;
}

/* ==========================================================================
   42 台面底纹改成主站那个「方格子」
   --------------------------------------------------------------------------
   反馈：取主站的那个方格子底色。

   我原来用的是 28px 的**细线格**（两条 linear-gradient 画出来的网格线），
   而主站用的是 112px 的**棋盘格** —— 两者看着都是「有格子的深色」，
   但放大看完全不同。

   把主站 body 上那套逐字量了出来：

       background-color: rgb(32, 30, 28)
       background-image: repeating-conic-gradient(
           rgba(226, 209, 184, .03) 0%,
           rgba(226, 209, 184, .03) 25%,
           rgba(0, 0, 0, 0) 0%,
           rgba(0, 0, 0, 0) 50%)
       background-size: 112px 112px
       background-attachment: fixed

   repeating-conic-gradient 每 25% 换一档色，于是画成棋盘；
   112px 是**一个格子**的边长（棋盘是 2×2 格组成一个循环，实际周期 224px）。
   attachment: fixed 让底纹不随页面滚动 —— 主站也是这么做的。

   页脚一并改成同一套，这样正文与页脚是一片连续的棋盘。
   ========================================================================== */

body:not(.login-page),
#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro,
#intro {
  background-color: rgb(32, 30, 28) !important;
  background-image: repeating-conic-gradient(
    rgba(226, 209, 184, .03) 0%,
    rgba(226, 209, 184, .03) 25%,
    rgba(0, 0, 0, 0) 0%,
    rgba(0, 0, 0, 0) 50%
  ) !important;
  background-size: 112px 112px !important;
  background-position: 0% 0% !important;
  background-repeat: repeat !important;
  background-attachment: fixed !important;
}

/* 容器与外层仍透明，免得又叠出横带 */
#footer-wrap > .container,
#footer-wrap .row,
#footer-wrap [class*="col-"],
#copyright > .container,
#intro > .container,
#intro .row,
#intro [class*="col-"] {
  background-color: transparent !important;
  background-image: none !important;
}

/* 只在正文与页脚之间保留一条虚线 */
#footer-wrap {
  border-top: 1px dashed rgba(255, 246, 232, .12) !important;
  padding: 36px 0 12px !important;
}

#copyright,
#copyright.with-intro,
#copyright.without-intro {
  border-top: 0 !important;
  padding: 10px 0 22px !important;
}

/* ==========================================================================
   43 修正：功能卡被「容器一律透明」那条清掉了
   --------------------------------------------------------------------------
   实测：棋盘底纹生效了，但首页三张功能卡变成透明的 ——
   卡片上的字飘在棋盘上，几乎看不见。

   原因是第 42 节我写了一条「容器与外层一律透明，免得叠出横带」：

       #intro > .container,
       #intro .row,
       #intro [class*="col-"] { background: transparent !important }

   而**三张功能卡本身也是 .col-lg** —— 它们被一并清掉了。
   那三张卡是**纸**，不是「容器外层」；透明了就不是纸了。

   改法：把 #intro 里那两条选择器去掉（只留页脚那几条），
   并且把三张卡的纸底重新写一遍，确保不被别的规则压掉。
   ========================================================================== */

/* 页脚的容器仍然透明（那几层没有自己的底） */
#footer-wrap > .container,
#footer-wrap .row,
#footer-wrap [class*="col-"],
#copyright > .container {
  background-color: transparent !important;
  background-image: none !important;
}

/* 三张功能卡：把纸底写回来 */
#intro .col-lg,
#intro > .container > .text-center > .container-lg > .row > .col-lg {
  background-color: var(--otm-paper, #f7f3ea) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  background-size: auto !important;
  background-attachment: scroll !important;

  border: 1px solid rgba(0, 0, 0, .3) !important;
  border-radius: 2px !important;

  box-shadow:
    0 1px 0 rgba(255, 255, 255, .9) inset,
    0 6px 0 rgba(0, 0, 0, .3),
    0 16px 30px -18px rgba(0, 0, 0, .95) !important;
}

/* 「优势」那张标题纸卡也写回来 */
#intro h1 {
  background-color: var(--otm-paper, #f7f3ea) !important;
  background-image:
    repeating-linear-gradient(180deg, rgba(120, 100, 70, .03) 0 1px, transparent 1px 3px),
    linear-gradient(180deg, #fdfbf6 0%, #efe8d9 100%) !important;
  background-size: auto !important;
  background-attachment: scroll !important;
}

/* 卡片内文字恢复墨色（第 42 节的棋盘只该在台面上，不该进纸里） */
#intro .col-lg h3 { color: var(--otm-ink, #2e2a26) !important; }
#intro .col-lg p  { color: var(--otm-ink-soft, #70675e) !important; }
#intro h1 { color: var(--otm-ink, #2e2a26) !important; }

/* ==========================================================================
   44 修正：下拉菜单里的字阴影压不掉
   --------------------------------------------------------------------------
   反馈：这里阴影太重、都要看不清字了。

   查了一下为什么 —— 是**选择器强度**的一个细节：

       第 27 节  .main-header a              →  权重 (0,1,1)   ← 加阴影
       第 27 节  .dropdown-menu *            →  权重 (0,1,0)   ← 去阴影（本该赢）
       第 29 节  .dropdown-menu *            →  权重 (0,1,0)   ← 同上

   **通配符 * 不计权重**。所以「.dropdown-menu *」实际只有 1 个类，
   而「.main-header a」是 1 个类 + 1 个类型 —— 后者更具体，于是
   两条「去阴影」的规则全被压掉了，下拉菜单里的字一直带着黑阴影。

   教训：**用 * 写「里面所有元素」时，权重比想象的弱**；
   要压住带类型选择器的规则，自己也得带上类型或更多类。

   这里改成明确带上 .dropdown-item（它是 <a>，权重 (0,3,0)），稳赢。
   ========================================================================== */

.main-header.navbar .dropdown-menu,
.main-header.navbar .dropdown-menu .dropdown-item,
.main-header.navbar .dropdown-menu .dropdown-item *,
.main-header.navbar .dropdown-menu a,
.main-header.navbar .dropdown-menu span,
.main-header.navbar .dropdown-menu i,
.hp-wrapper .navbar .dropdown-menu,
.hp-wrapper .navbar .dropdown-menu .dropdown-item,
.hp-wrapper .navbar .dropdown-menu .dropdown-item *,
.hp-wrapper .navbar .dropdown-menu a,
.hp-wrapper .navbar .dropdown-menu span,
.main-sidebar .dropdown-menu,
.main-sidebar .dropdown-menu .dropdown-item,
.main-sidebar .dropdown-menu .dropdown-item *,
.main-sidebar .dropdown-menu a,
.main-sidebar .dropdown-menu span {
  text-shadow: none !important;
}

/* 悬停那一项：绿底白字本身对比就够，也不再加阴影 */
.main-header.navbar .dropdown-menu .dropdown-item:hover,
.main-header.navbar .dropdown-menu .dropdown-item:focus,
.main-header.navbar .dropdown-menu .dropdown-item.active,
.hp-wrapper .navbar .dropdown-menu .dropdown-item:hover,
.hp-wrapper .navbar .dropdown-menu .dropdown-item.active {
  text-shadow: none !important;
}

/* 顺带把「台面/深底上加阴影」那条的范围收窄 —— 只给顶栏那几项，不再用 .main-header a
   （就是它把下拉菜单里的 <a> 一起带上的） */
.main-header.navbar > .navbar-nav > .nav-item > .nav-link,
.main-header.navbar .nav-link:not(.dropdown-item),
.main-header.navbar .navbar-brand {
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .55) !important;
}

/* ==========================================================================
   45 三个按钮严格一样大
   --------------------------------------------------------------------------
   第 36 节我用的是 min-width: 170px —— 它只能把**短的**垫到 170，
   长的（带头像那一项）会自己撑得更宽，于是三个仍然不一样：

       皮肤库       ~165px（被垫到 170）
       中文（简体）  ~170px
       Yadiel_      ~175px（带头像，超出 170）

   要用**固定宽度**才严格相等：短的长的一律 200px，内容居中。
   200px 是按最宽的那项（头像 26 + 间距 8 + 名字约 60 + 内边距 32 ≈ 126）
   再留出余量定的，任何一项都放得下。

   注意要排除 ☰（它有 data-widget="pushmenu"）——
   第 37 节专门把它设成按内容走，这里不能再把它一起定死。
   ========================================================================== */
.hp-wrapper .navbar .nav-link:not([data-widget="pushmenu"]),
.main-header.navbar .nav-link:not([data-widget="pushmenu"]) {
  width: 200px !important;
  min-width: 200px !important;
  max-width: 200px !important;

  box-sizing: border-box !important;
  justify-content: center !important;
  flex: 0 0 auto !important;
}

/* ☰ 保持按内容走 */
.main-header.navbar .nav-link[data-widget="pushmenu"],
.main-header.navbar .sidebar-toggle {
  width: auto !important;
  min-width: 0 !important;
  max-width: none !important;
}

/* 窄屏：定宽会挤出屏幕，退回按内容走 */
@media (max-width: 1199.98px) {
  .hp-wrapper .navbar .nav-link:not([data-widget="pushmenu"]),
  .main-header.navbar .nav-link:not([data-widget="pushmenu"]) {
    width: auto !important;
    min-width: 140px !important;
    max-width: none !important;
  }
}

/* 手机上不要固定宽度 */
@media (max-width: 575.98px) {
  .hp-wrapper .navbar .nav-link:not([data-widget="pushmenu"]),
  .main-header.navbar .nav-link:not([data-widget="pushmenu"]) {
    min-width: 0 !important;
    padding: 7px 10px !important;
    font-size: 13px !important;
  }
}

/* ==========================================================================
   46 通知那项：补上「通知」二字，并与另两项统一
   --------------------------------------------------------------------------
   反馈：三项要和外面的一样、统一，并且把通知的中文写上去。

   这项的结构比较特殊：
       resources/views/shared/notifications.twig 里只有一个**空的** <li>
       （带 data-notifications），铃铛是前端编译好的 JS 包注入进去的。

   所以不能改模板加文字 —— 那个 JS 包是构建产物，不该动它。

   改用 CSS：
       · 把 <li> 本身做成按钮（底、描边、三层阴影，与另两项逐字一致）
       · 里面被注入的 <a> 清成透明（不然会出现「按钮里套按钮」）
       · 用 li::after 补上「通知」两个字，排在铃铛之后

   顺序用 order 排：注入的 <a>（默认 0）在前，::after（order 2）在后。
   ========================================================================== */
.main-header.navbar li[data-notifications],
.hp-wrapper .navbar li[data-notifications] {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: 8px;

  width: 200px !important;
  min-width: 200px !important;
  max-width: 200px !important;
  box-sizing: border-box !important;

  position: relative;

  margin: 0 4px !important;
  padding: 10px 16px !important;

  background-color: rgba(255, 246, 232, .075) !important;
  background-image: none !important;

  border: 1px solid rgba(0, 0, 0, .5) !important;
  border-radius: 0 !important;

  color: rgb(237, 229, 226) !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  line-height: 1.2;
  text-shadow: rgba(0, 0, 0, .55) 1px 1px 0 !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .2),
    inset -2px -2px 0 rgba(0, 0, 0, .65),
    0 3px 0 rgba(0, 0, 0, .4) !important;

  cursor: pointer;
  transition: background-color .16s ease, box-shadow .16s ease;
}

/* 悬停：与另两项同一反应 */
.main-header.navbar li[data-notifications]:hover,
.hp-wrapper .navbar li[data-notifications]:hover {
  background-color: rgba(108, 195, 73, .22) !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .24),
    inset -2px -2px 0 rgba(0, 0, 0, .6),
    0 3px 0 rgba(0, 0, 0, .4),
    inset 0 0 0 1px rgba(134, 213, 98, .5) !important;
}

/* 里面被注入的 <a> 清成透明 —— 不然是「按钮里套按钮」 */
.main-header.navbar li[data-notifications] > a,
.main-header.navbar li[data-notifications] .nav-link,
.hp-wrapper .navbar li[data-notifications] > a {
  display: inline-flex !important;
  align-items: center;

  order: 0 !important;
  width: auto !important;
  min-width: 0 !important;
  max-width: none !important;

  margin: 0 !important;
  padding: 0 !important;

  background: none !important;
  border: 0 !important;
  box-shadow: none !important;

  color: inherit !important;
  font-size: inherit !important;
  text-shadow: inherit !important;
}

/* 铃铛与未读小红点保持原位 */
.main-header.navbar li[data-notifications] i,
.hp-wrapper .navbar li[data-notifications] i {
  font-size: 15px !important;
  color: inherit !important;
}

/* 「通知」两个字：排在铃铛之后 */
.main-header.navbar li[data-notifications]::after,
.hp-wrapper .navbar li[data-notifications]::after {
  content: "通知";
  order: 2;

  font-size: 15px;
  font-weight: 700;
  letter-spacing: .02em;
  color: inherit;
  white-space: nowrap;
}

/* 那个绿色小方块：与另两项同款，排在铃铛之前 */
.main-header.navbar li[data-notifications]::before,
.hp-wrapper .navbar li[data-notifications]::before {
  content: "";
  order: -2;

  flex: 0 0 auto;
  width: 5px;
  height: 5px;
  margin-right: 8px;

  background-color: rgb(108, 195, 73);
  opacity: .9;
}

/* 窄屏退回按内容走 */
@media (max-width: 1199.98px) {
  .main-header.navbar li[data-notifications],
  .hp-wrapper .navbar li[data-notifications] {
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
  }
}

/* ==========================================================================
   47 首页导航条：从「浮在图上」改成「在图下面」，和主站一样
   --------------------------------------------------------------------------
   反馈：把这个导航栏和主站一样，放到图片的下面。

   原来首页的导航是 fixed-top，浮在整屏大图的上沿；
   主站是「大图在上、导航条在图下面，往下滚时吸顶」。

   光靠 CSS 挪不动 —— 因为导航原来写在 .hp-wrapper 里面，
   而 .hp-wrapper 就是那张大图本身（背景图 + 100vh），
   孙子元素不可能跑到父元素外面去。

   所以先在模板里把它搬出来（home.twig）：
       <div class="hp-wrapper"> …大图与标题… </div>
       <nav class="navbar …"> …导航… </nav>        ← 现在是兄弟节点

   这一节再把它的定位从 fixed-top 改成 sticky：
       静态排布（于是落在图下面）、往下滚时吸在顶部 —— 与主站一致。
   ========================================================================== */

body > nav.navbar.fixed-top,
body > nav.navbar,
.hp-wrapper ~ nav.navbar {
  position: sticky !important;
  top: 0 !important;
  right: auto !important;
  left: auto !important;

  width: 100% !important;
  margin: 0 !important;

  background-color: rgb(55, 51, 47) !important;
  background-image: linear-gradient(180deg, rgb(66, 61, 57) 0%, rgb(46, 42, 39) 100%) !important;

  border-top: 1px solid rgba(0, 0, 0, .5);
  border-bottom: 1px solid rgba(0, 0, 0, .55);

  box-shadow: 0 6px 18px -8px rgba(0, 0, 0, .9);
  z-index: 40;
}

/* 之前给「浮在照片上」留的那点半透明不再需要 —— 现在是实底 */
body > nav.navbar.transparent {
  background-color: rgb(55, 51, 47) !important;
  background-image: linear-gradient(180deg, rgb(66, 61, 57) 0%, rgb(46, 42, 39) 100%) !important;
}

/* 大图因此要减掉导航条的高度，否则会多出一条缝 */
.hp-wrapper {
  height: calc(100vh - 60px) !important;
}

@media (max-width: 991.98px) {
  .hp-wrapper { height: calc(100vh - 58px) !important; }
}

/* ==========================================================================
   48 首页导航按钮 + 大图尺寸，对齐主站
   --------------------------------------------------------------------------
   反馈：按钮和阴影也要做出来；背景图片占网页的面积和主站一样。

   ① 按钮的底色与阴影**没了** —— 这是我上一轮搬导航造成的
      第 34/35 节那套按钮样式写的是 `.hp-wrapper .navbar .nav-link`，
      要求 .navbar 是 .hp-wrapper 的**子孙**。
      而第 47 节把导航搬到了 .hp-wrapper 外面（变成兄弟节点），
      那条选择器于是**一条都不匹配**，样式全掉了。

      → 补上搬家后的选择器 `body > nav.navbar …`，并把主站那套逐字抄过来：
            底      rgba(255, 246, 232, .075)
            边框    1px solid rgba(0, 0, 0, .5)
            圆角    0
            内边距  10px 16px
            字号    15px / 700
            阴影    inset  2px  2px 0 rgba(255, 255, 255, .2)
                    inset -2px -2px 0 rgba(0, 0, 0, .65)
                          0px  3px 0 rgba(0, 0, 0, .4)
      主站导航项实测是 124×45（按内容宽）—— 首页这边也按内容宽，
      不做第 45 节那个 200px 定宽（定宽是给站内页那三颗用的）。

   ② 大图尺寸
      主站首屏实测 1500×522 = **视口高的 58%**
      皮肤站原来是 840（93%）—— 高了近一半
      → 改成 58vh
   ========================================================================== */

/* --------------------------------------------------------------------------
   48.1 首页导航按钮（搬家后的选择器）
   -------------------------------------------------------------------------- */
body > nav.navbar .nav-link,
body > nav.navbar .nav-link:not([data-widget="pushmenu"]) {
  display: inline-flex !important;
  align-items: center;
  gap: 0;

  width: auto !important;
  min-width: 0 !important;
  max-width: none !important;

  margin: 0 4px !important;
  padding: 10px 16px !important;

  background-color: rgba(255, 246, 232, .075) !important;
  background-image: none !important;

  border: 1px solid rgba(0, 0, 0, .5) !important;
  border-radius: 0 !important;

  color: rgb(237, 229, 226) !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  line-height: 1.2;
  text-shadow: rgba(0, 0, 0, .55) 1px 1px 0 !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .2),
    inset -2px -2px 0 rgba(0, 0, 0, .65),
    0 3px 0 rgba(0, 0, 0, .4) !important;

  transform: none;
  filter: none;
  transition: background-color .16s ease, box-shadow .16s ease;
}

/* 每项前面一个小绿方块 —— 与主站一致 */
body > nav.navbar .nav-link::before {
  content: "";
  flex: 0 0 auto;
  width: 5px;
  height: 5px;
  margin-right: 8px;
  background-color: rgb(108, 195, 73);
  opacity: .9;
}

/* 「皮肤库」补个图标 */
body > nav.navbar .nav-link[href*="skinlib"]::after {
  content: "👕";
  margin-left: 7px;
  font-size: 14px;
  line-height: 1;
}

/* 悬停：草绿底 + 内圈绿光（与主站一致） */
body > nav.navbar .nav-link:hover,
body > nav.navbar .nav-link:focus {
  background-color: rgba(108, 195, 73, .22) !important;
  color: rgb(252, 245, 241) !important;

  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .24),
    inset -2px -2px 0 rgba(0, 0, 0, .6),
    0 3px 0 rgba(0, 0, 0, .4),
    inset 0 0 0 1px rgba(134, 213, 98, .5) !important;
}

/* 站名：纯白文字，不做成按钮 */
body > nav.navbar .navbar-brand,
body > nav.navbar .navbar-brand::before,
body > nav.navbar .navbar-brand::after {
  background: none !important;
  border: 0 !important;
  box-shadow: none !important;
  content: none !important;
  border-radius: 0 !important;
}

body > nav.navbar .navbar-brand {
  display: inline !important;
  width: auto !important;
  min-width: 0 !important;
  padding: 0 !important;
  color: #ffffff !important;
  font-size: 15px !important;
  font-weight: 800 !important;
  text-shadow: 1px 1px 0 rgba(0, 0, 0, .6) !important;
  transform: none !important;
}

/* 用户那一项前面是头像，不要绿方块 */
body > nav.navbar .nav-item:has(.bs-avatar) > .nav-link::before {
  content: none !important;
  display: none !important;
}

/* --------------------------------------------------------------------------
   48.2 大图尺寸对齐主站（占视口高 58%）
   -------------------------------------------------------------------------- */
.hp-wrapper {
  height: 58vh !important;
  min-height: 320px;
}

@media (max-width: 767.98px) {
  .hp-wrapper { height: 46vh !important; min-height: 240px; }
}

/* ==========================================================================
   49 大图变矮之后，标题与按钮被导航条切掉了
   --------------------------------------------------------------------------
   原模板（home-css.css）里 .splash 是这样定的：

       .splash {
         position: absolute;
         top: 100px;
         bottom: 0;
         height: 50%;
         …
       }

   那是按「大图占视口 93%」算的高度 —— 第 48 节把大图压到 58%（对齐主站）之后，
   这块绝对定位的内容就超出大图下沿了，于是标题被导航条盖住、按钮被切掉半截。

   改法：不再用写死的 top + 高度，改成**在大图里垂直居中** ——
   上下各留一段，高度按内容走。这样大图高矮变化都不受影响。
   ========================================================================== */
.hp-wrapper .splash {
  position: absolute !important;

  top: 50% !important;
  bottom: auto !important;
  left: 0 !important;
  right: 0 !important;

  width: 100% !important;
  height: auto !important;

  transform: translateY(-50%);

  margin: 0 auto !important;
  padding: 0 20px !important;
}

/* 大图矮的时候（窄屏）字号收一档，免得标题顶到边 */
@media (max-width: 767.98px) {
  .hp-wrapper .splash { padding: 0 12px !important; }
  .hp-wrapper .splash-head { font-size: 150% !important; }
  .hp-wrapper .splash-subhead { margin-bottom: 1.4em !important; }
  .hp-wrapper .main-button { padding: .7em 1.8em !important; }
}

/* ==========================================================================
   50 修正：.splash 的居中偏了（包含块不对）
   --------------------------------------------------------------------------
   第 49 节我给 .splash 写了 top: 50% + translateY(-50%)，想让它在大图里居中，
   但实测仍超出大图 65px。

   原因是**包含块**：
   .splash 是 position: absolute，top/left 是相对**最近的已定位祖先**算的。
   而 .hp-wrapper 自己没有 position（原模板只给它设了背景与高度）——
   于是 .splash 一路往上找到了更外层的定位元素，居中自然偏了。

   给 .hp-wrapper 加上 position: relative 即可，它才是那个包含块。
   （原模板其实也该加，只是原来用写死的 top: 100px，偏得不明显。）
   ========================================================================== */
.hp-wrapper {
  position: relative !important;
}

/* 大图里那层 fixed-bg 也归位 */
.hp-wrapper > #fixed-bg {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  z-index: 0;
}

/* 标题层浮在背景之上 */
.hp-wrapper .container,
.hp-wrapper .splash {
  z-index: 1;
}

/* ==========================================================================
   51「优势」那节：从「直接铺在棋盘上」改成「放在一张手帐纸上」
   --------------------------------------------------------------------------
   反馈：这些元素和主站一样，放在手帐纸上。

   主站的结构是两层：
       棋盘格   —— **页面底色**（body 上那层 repeating-conic-gradient）
       一张纸   —— .site-content > .wrap，深色纸 + 28px 细线格 + 投影，
                   所有内容都写在纸上

   而这边「优势」那节是三张纸卡**直接摆在棋盘上** ——
   卡片是纸、底也是（另一种）格纹，两层格纹叠在一起，看着没有层次。

   主站那张纸实测规格：
       底      rgb(58, 55, 52)
       格纹    两条 28px 的细线，rgba(255, 246, 232, .043)
       边框    1px solid rgba(0, 0, 0, .55)
       内影    inset 0 1px 0 rgba(255, 246, 232, .12) 等
       宽      900px（这边内容更宽，取 1200 上限）

   于是层次变成：棋盘（底）→ 纸（这一节）→ 三张纸卡（卡上还有胶带）。
   照主站的做法，纸的上沿也贴一道和纸胶带。
   ========================================================================== */

#intro {
  position: relative;

  max-width: min(1200px, calc(100vw - 48px)) !important;
  margin: 34px auto 0 !important;
  padding: 56px 40px 52px !important;

  background-color: rgb(58, 55, 52) !important;
  background-image:
    linear-gradient(90deg, rgba(255, 246, 232, .043) 0px, rgba(255, 246, 232, .043) 1px, rgba(0, 0, 0, 0) 1px),
    linear-gradient(180deg, rgba(255, 246, 232, .043) 0px, rgba(255, 246, 232, .043) 1px, rgba(0, 0, 0, 0) 1px) !important;
  background-size: 28px 28px, 28px 28px !important;
  background-attachment: scroll !important;

  border: 1px solid rgba(0, 0, 0, .55) !important;
  border-radius: 0 !important;

  box-shadow:
    inset 0 1px 0 rgba(255, 246, 232, .12),
    inset 1px 0 0 rgba(255, 246, 232, .04),
    inset -1px 0 0 rgba(0, 0, 0, .3),
    inset 0 -1px 0 rgba(0, 0, 0, .5),
    0 26px 60px -10px rgba(0, 0, 0, .85),
    0 4px 12px rgba(0, 0, 0, .5) !important;

  overflow: visible;
}

/* 纸的上沿一道和纸胶带 —— 与主站首页那张纸同款 */
#intro::before {
  content: "" !important;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 16px;

  background-image: repeating-linear-gradient(
    90deg,
    rgba(108, 195, 73, .5) 0 14px,
    rgba(134, 213, 98, .34) 14px 28px
  ) !important;

  box-shadow: 0 2px 6px rgba(0, 0, 0, .45);
  pointer-events: none;
}

/* 纸上的内容区不再重复格纹，免得两层格纹打架 */
#intro > .container,
#intro .container-lg,
#intro .row {
  background: none !important;
  background-image: none !important;
}

/* 窄屏：纸的左右留白收一点 */
@media (max-width: 767.98px) {
  #intro {
    max-width: calc(100vw - 20px) !important;
    margin-top: 22px !important;
    padding: 44px 16px 36px !important;
  }
}

/* ==========================================================================
   52 页面底纹改成「跟着滚」
   --------------------------------------------------------------------------
   反馈：滑动的时候要和主站一样，背景图跟着动的呀。

   实测两边：

       皮肤站大图 #fixed-bg    position: absolute   滚动 300 → top -300   跟着动 ✅
       皮肤站页面底纹          background-attachment: fixed                钉住 ❌
       主站页面底纹            background-attachment: fixed                也是钉住

   也就是说**大图本来就跟着动**；感觉「不动」的是**页面底纹那层棋盘** ——
   它被设成 fixed，钉在屏幕上，滚动时只有内容在动。

   主站其实也是 fixed —— 但主站那张纸几乎铺满视口，棋盘只在两侧露出一条，
   不容易察觉；这边棋盘露得多，一眼就看出来了。

   所以把底纹从 fixed 改成 scroll：让整页一起动。
   （这处**与主站不同**，是按你的实际观感来的 —— 主站那点差异在这里会被放大。）
   ========================================================================== */
body:not(.login-page),
#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro,
#intro {
  background-attachment: scroll !important;
}

/* 大图那层也明确成 scroll（它本来就是，写出来免得以后被别的规则带走） */
.hp-wrapper,
.hp-wrapper > #fixed-bg {
  background-attachment: scroll !important;
}

/* ==========================================================================
   53 控制台顶栏：拿掉 ☰、通知去重、三项等宽
   --------------------------------------------------------------------------
   反馈三条：
       ① 最左边的按钮（☰ 侧栏开关）拿掉
       ② 右边三个按钮大小一致
       ③（截图里能看出来的）通知那项前头有**两个绿方块**

   ③ 是怎么来的：
       我给 li[data-notifications] 加了一个 ::before 绿方块（第 46 节）；
       而里面被注入的铃铛本身是个 <a class="nav-link">，
       它又命中了第 34/35 节那条「导航项前面加绿方块」——
       于是方块叠了两个。
       → 把内层那个去掉，只留 li 上那一个。

   ① 用 display: none 藏掉 ☰。
      注意这是**隐藏**而不是删除 —— 侧栏收起这个功能还在，
      想恢复把这一段的 display 改成 revert 即可。
      另外收起侧栏后，AdminLTE 会给 body 加 .sidebar-collapse，
      第 37 节那套紧凑值仍然有效 —— 只是没法再手动切换了。
   ========================================================================== */

/* ① 拿掉 ☰ */
.main-header.navbar .nav-link[data-widget="pushmenu"],
.main-header.navbar .sidebar-toggle,
.hp-wrapper .navbar .nav-link[data-widget="pushmenu"] {
  display: none !important;
}

/* 顺带把它占的那点外边距也收掉，站名可以更靠左 */
.main-header.navbar .navbar-nav > .nav-item:first-child {
  margin-left: 0 !important;
}

/* ③ 通知那项去掉内层的绿方块（li 上那个留着） */
.main-header.navbar li[data-notifications] > a::before,
.main-header.navbar li[data-notifications] .nav-link::before,
.hp-wrapper .navbar li[data-notifications] > a::before,
.hp-wrapper .navbar li[data-notifications] .nav-link::before {
  content: none !important;
  display: none !important;
}

/* ② 三项等宽 —— 用与第 45 节同一个值，横向对齐 */
.main-header.navbar li[data-notifications] {
  width: 200px !important;
  min-width: 200px !important;
  max-width: 200px !important;
  box-sizing: border-box !important;
  justify-content: center !important;
}

/* 通知里的「通知」二字与铃铛之间的间距也统一 */
.main-header.navbar li[data-notifications]::after {
  margin-left: 2px;
}

/* 窄屏：定宽会把顶栏挤爆，退回按内容走 */
@media (max-width: 1199.98px) {
  .main-header.navbar li[data-notifications] {
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
  }
}

/* ==========================================================================
   54 修正：顶栏按钮挤成两排
   --------------------------------------------------------------------------
   反馈：这里的按钮布局太乱了。

   截图里六个按钮分成了两排：
       左：皮肤库 / 我的衣柜（上下叠着）
       右：上传新皮肤 / 通知（上排）、中文（简体）/ Yadiel_（下排）

   原因是我第 45 节定的 **width: 200px** —— 那个值是**按三个按钮**算的
   （1500px 里站名 + 3×200 + 间距，正好）。
   但登录后顶栏其实是**六个**：皮肤库、我的衣柜、上传新皮肤、通知、语言、用户
   ——6 × 200 = 1200px，再加站名与间距直接超出，于是换行。

   改法：**去掉定宽，按内容宽**（与主站一致 —— 主站导航项就是按内容走的，实测 124×45）。
   高度、内边距、字号、阴影仍与主站逐项一致，只是不再强行等宽。
   这样无论登录与否、有几项，都排成一排。

   如果以后确实想等宽，应改成「容器 flex + 各项 flex:1」按可用宽度均分，
   而不是写死像素 —— 写死就会像这次一样，项数一变就崩。
   ========================================================================== */
.hp-wrapper .navbar .nav-link:not([data-widget="pushmenu"]),
.main-header.navbar .nav-link:not([data-widget="pushmenu"]),
.main-header.navbar li[data-notifications] {
  width: auto !important;
  min-width: 0 !important;
  max-width: none !important;
  flex: 0 0 auto !important;

  box-sizing: border-box !important;
  justify-content: center !important;
}

/* 内边距统一为 10px 16px（与主站一致），保证高度一致 */
.hp-wrapper .navbar .nav-link,
.main-header.navbar .nav-link,
.main-header.navbar li[data-notifications] {
  padding: 10px 16px !important;
}

/* 各项之间的间距收紧到 6px，六项也放得下 */
.main-header.navbar .navbar-nav .nav-item,
.hp-wrapper .navbar .nav-item {
  margin-left: 6px !important;
  margin-right: 0 !important;
}

/* 顶栏容器允许收缩，别硬撑出横向滚动 */
.main-header.navbar,
.hp-wrapper .navbar {
  flex-wrap: nowrap !important;
  overflow: visible;
}

.main-header.navbar .navbar-nav,
.hp-wrapper .navbar .navbar-nav {
  flex-wrap: nowrap !important;
  align-items: center;
}

/* 窄屏（六项放不下时）允许换行，但每项不再被定宽撑开 */
@media (max-width: 991.98px) {
  .main-header.navbar .navbar-nav,
  .hp-wrapper .navbar .navbar-nav {
    flex-wrap: wrap !important;
    justify-content: flex-end;
  }
  .main-header.navbar .navbar-nav .nav-item,
  .hp-wrapper .navbar .nav-item {
    margin: 3px 0 3px 6px !important;
  }
}

/* ==========================================================================
   55 修正：通知项比别的项高（内层 <a> 被重复加了内边距）
   --------------------------------------------------------------------------
   登录后实测：

       通知项   109 x 62       ← 比别的高
       另两项   ~128 x 40

   原因是第 54 节把 `padding: 10px 16px` 应用到了
   `.main-header.navbar .nav-link` —— 而通知里面被注入的铃铛**本身也是 .nav-link**，
   于是它也被加了 10px 内边距，和 li 上的叠加，整项就高出 20px。

   第 46 节本来已经把它清过零，但第 54 节写的选择器在后面、又把它带上了。
   这里再明确一次：通知**内层**那个 <a> 一律不留内边距，撑高交给外面的 li。
   ========================================================================== */
.main-header.navbar li[data-notifications] > a,
.main-header.navbar li[data-notifications] > a.nav-link,
.main-header.navbar li[data-notifications] .nav-link,
.hp-wrapper .navbar li[data-notifications] > a,
.hp-wrapper .navbar li[data-notifications] .nav-link {
  padding: 0 !important;
  margin: 0 !important;

  background: none !important;
  background-image: none !important;
  border: 0 !important;
  box-shadow: none !important;

  min-width: 0 !important;
  width: auto !important;
  max-width: none !important;

  color: inherit !important;
  font-size: inherit !important;
  text-shadow: inherit !important;
}

/* 内层图标（铃铛）的大小跟着来 */
.main-header.navbar li[data-notifications] > a i {
  font-size: 15px !important;
}

/* 整项高度对齐另两项 */
.main-header.navbar li[data-notifications] {
  height: 40px !important;
  padding: 0 16px !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: 8px;
}

/* ==========================================================================
   56 修正：收起时「STAFF」标签被裁断
   --------------------------------------------------------------------------
   登录后实测收起态：侧栏 74px、面板 45px 宽、名字已隐藏 —— 都对。
   但角色标签（STAFF）没藏，在 45px 里放不下，被裁成「STA…」。

   第 37 节我藏的是 .user-panel .info（名字那一块），
   而角色标签在另一个元素里（AdminLTE 用的是 .badge / .user-panel 下的另一个节点）。
   这里把整个面板里**除头像以外**的内容在收起态一并藏掉。
   ========================================================================== */
body.sidebar-collapse .main-sidebar .user-panel .info,
body.sidebar-collapse .main-sidebar .user-panel .info *,
body.sidebar-collapse .main-sidebar .user-panel .badge,
body.sidebar-collapse .main-sidebar .user-panel small,
body.sidebar-collapse .main-sidebar .user-panel p,
body.sidebar-collapse .main-sidebar .user-panel span:not(.image):not(:has(img)),
body.sidebar-collapse .main-sidebar .user-panel a:not(:has(img)) {
  display: none !important;
}

/* 头像居中；面板高度按头像收，不留多余空白 */
body.sidebar-collapse .main-sidebar .user-panel {
  display: flex !important;
  align-items: center;
  justify-content: center;

  margin: 10px 6px 6px !important;
  padding: 8px 6px !important;
  min-height: 0;
}

body.sidebar-collapse .main-sidebar .user-panel .image,
body.sidebar-collapse .main-sidebar .user-panel img {
  display: block !important;
  margin: 0 auto !important;
  width: 26px !important;
  height: 26px !important;
}

/* ==========================================================================
   57 首页大图的环境粒子（与官网同款）+ 棋盘改回固定
   --------------------------------------------------------------------------
   ① 粒子
      官网首页大图里有缓缓上浮的方块碎屑，这边没有。这一段照抄官网的样式：

          亮粒  rgba(226, 255, 210, .55)  +  一点绿色辉光
          暗粒  rgba(255, 255, 255, .28)
          动画  从大图底部升起 320px，中途淡入、接近终点时略淡

      生成逻辑在同目录的 oldtimes-home.js 里（首页的 JS 是编译产物，不该动它）。

      层级：粒子放在大图内容之上（z-index 3），所以标题层要再高一档 ——
      **装饰绝不能盖住文字**，这一点官网也踩过（见那边 mc.css 的 28.9 节）。

   ② 棋盘改回固定
      上一轮按「背景跟着动」把棋盘从 fixed 改成了 scroll；
      但官网其实是**棋盘固定、大图跟着滚** —— 两者叠在一起才有那个纵深。
      现在改回去，与官网一致。
   ========================================================================== */

/* --------------------------------------------------------------------------
   57.1 粒子
   -------------------------------------------------------------------------- */
.hp-wrapper .otm-particle {
  position: absolute;
  bottom: -10px;
  z-index: 3;

  width: 4px;
  height: 4px;

  background: rgba(226, 255, 210, .55);
  box-shadow: 0 0 6px rgba(134, 213, 98, .45);

  pointer-events: none;
  animation: otmFloat linear infinite;
}

.hp-wrapper .otm-particle--dim {
  background: rgba(255, 255, 255, .28);
  box-shadow: none;
}

@keyframes otmFloat {
  0% {
    transform: translateY(0) translateX(0);
    opacity: 0;
  }

  12% { opacity: 1; }
  85% { opacity: .8; }

  100% {
    transform: translateY(-320px) translateX(var(--drift, 12px));
    opacity: 0;
  }
}

/* 标题与按钮要盖住粒子 —— 装饰不能压文字 */
.hp-wrapper .container,
.hp-wrapper .splash {
  position: relative;
  z-index: 4;
}

/* 减少动效：不显示 */
@media (prefers-reduced-motion: reduce) {
  .hp-wrapper .otm-particle { display: none !important; }
}

/* --------------------------------------------------------------------------
   57.2 棋盘改回固定（与官网一致：棋盘不动、内容动）
   -------------------------------------------------------------------------- */
body:not(.login-page),
#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro,
#intro {
  background-attachment: fixed !important;
}

/* ==========================================================================
   58 首页那三颗按钮等宽
   --------------------------------------------------------------------------
   反馈：登录后按钮大小还是和其他两个不一致。

   是我第 54 节把定宽**全局**去掉造成的。那次去得对 —— 站内页登录后有
   六颗按钮（皮肤库、我的衣柜、上传新皮肤、通知、语言、用户），
   定宽会换行。

   但**首页只有三颗**（皮肤库、语言、用户/登录），定宽在首页是安全的。
   所以这里按「只给首页」补回来 —— 用 body > nav.navbar 限定，
   不会影响站内页。

   200px 与站内页那三颗用同一个值，两边观感一致。
   ========================================================================== */
body > nav.navbar .nav-link:not([data-widget="pushmenu"]),
body > nav.navbar li[data-notifications] {
  width: 200px !important;
  min-width: 200px !important;
  max-width: 200px !important;

  box-sizing: border-box !important;
  justify-content: center !important;
  flex: 0 0 auto !important;
}

/* 首页顶栏上如果出现通知项，也按同样宽度 */
body > nav.navbar li[data-notifications] {
  display: inline-flex !important;
  align-items: center !important;
  padding: 0 16px !important;
  height: 40px !important;
}

/* 窄屏：三颗 × 200 会挤出屏幕，退回按内容走 */
@media (max-width: 991.98px) {
  body > nav.navbar .nav-link:not([data-widget="pushmenu"]),
  body > nav.navbar li[data-notifications] {
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
  }
}

/* ==========================================================================
   59 修正：带头像那一项比别的项高
   --------------------------------------------------------------------------
   实测（登录后的首页）：

       皮肤库        200 x 40
       中文（简体）  200 x 40
       Yadiel_      200 x 56   ← 高了 16px

   原因是那一项里有个头像（.bs-avatar，约 33px），
   叠上上下各 10px 的内边距就成了 56px，而另两项只有文字，是 40px。

   改法：把整项高度**定死 40px**，头像缩到 26px 并垂直居中 ——
   于是三项宽高完全一致。
   ========================================================================== */
body > nav.navbar .nav-link,
.main-header.navbar .nav-link {
  height: 40px !important;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  align-items: center !important;
}

/* 顶栏里的头像：缩到 26px，不再把整项撑高 */
body > nav.navbar .bs-avatar,
.main-header.navbar .bs-avatar,
body > nav.navbar img.bs-avatar,
.main-header.navbar img.bs-avatar {
  width: 26px !important;
  height: 26px !important;
  margin-top: 0 !important;
  margin-bottom: 0 !important;
  flex: 0 0 auto !important;
  vertical-align: middle !important;
}

/* 头像与名字之间的间距由 gap 给，去掉它自带的 mr-2 */
body > nav.navbar .nav-link .bs-avatar,
.main-header.navbar .nav-link .bs-avatar {
  margin-right: 8px !important;
}

/* 名字那一行也不要撑高 */
body > nav.navbar .nav-link > span,
.main-header.navbar .nav-link > span,
body > nav.navbar .nav-link > picture,
.main-header.navbar .nav-link > picture {
  display: inline-flex !important;
  align-items: center;
  line-height: 1 !important;
}

/* 站内页那六项同样定高，免得夹着头像的那项又高一截 */
.main-header.navbar li[data-notifications],
.main-header.navbar .navbar-nav .nav-item {
  height: 40px;
}

.main-header.navbar li[data-notifications] {
  height: 40px !important;
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}

/* ==========================================================================
   60 大图：填充方式跟主站 + 配合视差
   --------------------------------------------------------------------------
   ① 填充方式
      主站实测是 background-size: **auto**（图片按自身像素尺寸铺，不缩放），
      这边原来写的是 cover（按比例铺满、允许裁切）。
      改成 auto + 居中，与主站一致。

      auto 意味着「按原图像素铺」——
      站里的截图多是 1920×1080，而大图高 58vh（约 522px），
      于是图片上下会被裁掉一些、左右铺满，和 cover 的视觉效果接近，
      但**缩放基准不同**（auto 不放大，cover 会放大到铺满），
      像素游戏的截图不放大更清晰。

   ② 视差
      位移由 oldtimes-home.js 用 transform 施加在图片层上。
      这里只把「层会被推下去」这件事准备好：给它一个更高的 z-index 与背景裁切，
      免得下移时露出边界。

      位移期间大图底部可能短暂露空，脚本会把层加高来补 ——
      两边配合才不会在滚动时看到一条缝。
   ========================================================================== */
.hp-wrapper {
  background-size: auto !important;
  background-position: 50% 0 !important;
  background-repeat: no-repeat !important;
}

.hp-wrapper > #fixed-bg {
  background-size: auto !important;
  background-position: 50% 0 !important;
  background-repeat: no-repeat !important;

  /* 视差会用 transform 推它，提前留好合成层 */
  will-change: transform;
  backface-visibility: hidden;
}

/* 大图自己裁掉溢出 —— 层被推下去时不会把下面的内容顶开 */
.hp-wrapper {
  overflow: hidden;
}

/* 减少动效：不位移 */
@media (prefers-reduced-motion: reduce) {
  .hp-wrapper > #fixed-bg {
    transform: none !important;
  }
}

/* ==========================================================================
   61 修正：「优势那张纸」的格纹被棋盘那条规则误伤了
   --------------------------------------------------------------------------
   第 57 节我把 `#intro` 也列进了「底纹固定」那一组 —— 那是为了修棋盘，
   但 `#intro` **不是棋盘**，它是**一张纸**：

       棋盘   页面底色       → 该钉住（fixed）
       纸     #intro 这一节  → 该跟着内容滚（scroll）

   把纸的格纹设成 fixed 之后，滚动时会看到**纸在动、纸上的格子不动** ——
   格子从纸面上滑过去，错位很明显。

   这一节把纸单独改回 scroll；棋盘那几层保持 fixed。
   ========================================================================== */
#intro {
  background-attachment: scroll !important;
}

/* 页脚那两层是棋盘的一部分，明确保持固定 */
body:not(.login-page),
#footer-wrap,
#copyright,
#copyright.with-intro,
#copyright.without-intro {
  background-attachment: fixed !important;
}

/* ==========================================================================
   62 大图重新裁剪：让风景（船）回到画面里
   --------------------------------------------------------------------------
   反馈：船的风景图被裁得看不见风景了。

   查了一下，是两件事叠出来的：

   ① `background-size: auto`
      第 60 节我按「跟主站一样」改成了 auto。auto 是**按原图像素铺**，
      而站里的截图多是 1920×1080，大图区约 1400×522 ——
      1920 宽的原图横着塞进 1400 的框里，等于只看到左边一大半。

   ② `background-position: 50% 0`
      纵向锚在**顶部**。原图 1080 高、可见区 522 —— 只看得到上面 48%。
      而船的截图里，天空在上面、船与水面在中下部 ——
      **正好把船裁掉了，只剩天空和树梢。**

   两条一起改成：
       background-size: cover      按比例放大到铺满（1400×787，纵向裁掉 34%）
       background-position: 50% 50% 纵向取中 —— 保留画面中间那一段

   为什么不再坚持 auto：
   主站那张图是按自家尺寸挑过的，auto 正好；站里 520 张截图尺寸五花八门，
   用 auto 会出现「有的图只露一角」。cover + 居中 对任何尺寸都稳定。
   ========================================================================== */
.hp-wrapper,
.hp-wrapper > #fixed-bg {
  background-size: cover !important;
  background-position: 50% 50% !important;
  background-repeat: no-repeat !important;
}

/* ==========================================================================
   63 修正：通知按钮只有图标能点，文字点不动
   --------------------------------------------------------------------------
   反馈：通知按钮只有这个 icon 是有效的点击区。

   原因在结构上：
   · 真正能点的是**注入进来的那个 <a>**（铃铛就在它里面）——
     它带着 dropdown 的开关；
   · 而「通知」两个字是我用 li::after 加的 —— **在 <a> 的外面**，
     所以点文字不触发，只有点在铃铛上才有反应。

   改法：给 <a> 加一个**铺满整个 li 的伪元素**。
   伪元素属于 <a>，所以点到它等于点到 <a> ——
   而它是绝对定位的，不会影响 li 里原有的排版（方块 · 铃铛 · 文字的顺序不变）。

   为什么不用「让 <a> 自己 absolute 铺满」：
   那样 <a> 就脱离文档流了，铃铛会跑到中间盖住文字 ——
   得靠手写 padding 把它挪回去，换成 <li> 宽度一变就又要调。
   用伪元素铺满，布局一个字都不用动。
   ========================================================================== */
.main-header.navbar li[data-notifications],
.hp-wrapper .navbar li[data-notifications] {
  position: relative !important;
}

.main-header.navbar li[data-notifications] > a,
.hp-wrapper .navbar li[data-notifications] > a {
  position: static !important;   /* 保持流内，排版不变 */
}

/* 铺满整项的点击区 —— 它属于 <a>，所以点它等于点 <a> */
.main-header.navbar li[data-notifications] > a::after,
.hp-wrapper .navbar li[data-notifications] > a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  cursor: pointer;

  /* 不要挡住 li 上那两个字（文字在 ::after 里，层级更高） */
  background: none;
}

/* 文字与方块要比点击区更高一层，才看得见 */
.main-header.navbar li[data-notifications]::before,
.main-header.navbar li[data-notifications]::after,
.hp-wrapper .navbar li[data-notifications]::before,
.hp-wrapper .navbar li[data-notifications]::after {
  position: relative;
  z-index: 4;
}

/* 整项都显示手型，让「能点」这件事看得出来 */
.main-header.navbar li[data-notifications],
.hp-wrapper .navbar li[data-notifications] {
  cursor: pointer;
}

/* ==========================================================================
   64 通知项：去掉点下去那个绿框（focus 描边）
   --------------------------------------------------------------------------
   反馈：点 icon 会跳出绿框。

   那个绿框是**焦点样式** —— 我第 35 节给导航项写了：

       .nav-link:focus {
         background-color: rgba(108, 195, 73, .22);
         box-shadow: … inset 0 0 0 1px rgba(134, 213, 98, .5);
       }

   鼠标点下去之后元素保持 :focus，于是那圈绿色内描边就**留在那儿**，
   看着像「选中框」而不是「点过了」。

   改法：鼠标点击不显示这圈（用 :focus-visible 只给键盘用户保留）——
   键盘 Tab 过来仍然能看到焦点，这是无障碍要求，不能一起去掉。
   ========================================================================== */
.main-header.navbar .nav-link:focus:not(:focus-visible),
.hp-wrapper .navbar .nav-link:focus:not(:focus-visible),
.main-header.navbar li[data-notifications]:focus,
.main-header.navbar li[data-notifications] a:focus:not(:focus-visible) {
  box-shadow:
    inset 2px 2px 0 rgba(255, 255, 255, .2),
    inset -2px -2px 0 rgba(0, 0, 0, .65),
    0 3px 0 rgba(0, 0, 0, .4) !important;

  outline: none !important;
}

/* 浏览器默认的那圈 outline 也去掉（只对鼠标） */
.main-header.navbar .nav-link:focus:not(:focus-visible) {
  outline: none !important;
}

/* 键盘 Tab 过来仍然要有可见的焦点 —— 换成外圈虚线，不占用按钮内部 */
.main-header.navbar .nav-link:focus-visible,
.hp-wrapper .navbar .nav-link:focus-visible {
  outline: 2px dashed rgba(134, 213, 98, .9) !important;
  outline-offset: 2px !important;
}

/* 通知那一项：鼠标点过之后不要留任何绿框 */
.main-header.navbar li[data-notifications] a:focus,
.main-header.navbar li[data-notifications] > a:focus {
  box-shadow: none !important;
  outline: none !important;
  background: none !important;
}

/* ==========================================================================
   65「开始使用」按钮：手帐里的纸片（字体 / 拟物 / 胶布 / 动效）
   --------------------------------------------------------------------------
   反馈：修改字体、拟物、贴上胶布、有手帐动效。

   原来它只是一张干净的白纸签 —— 形状对了，但**太"数码"**：
   纯色、纯符号化的投影、没有任何实物的痕迹。
   手帐里那一张纸片之所以像纸，靠的是四样东西，这里一样样补上：

   ① 字体
      换成楷体（Kaiti）打头的一套。手帐上的字是**手写体**，
      圆体（Yuanti）偏可爱、黑体偏印刷 ——
      楷体最接近「用笔写上去」的观感。
      回退链里保留圆体与苹方，别的系统上也拿得到像样的字形。

   ② 拟物
      · 纸不是纯白的 —— 叠一层极淡的暖色渐变 + 一点纸纹颗粒
      · 上沿受光、下沿压暗（真实纸片的厚度感）
      · 边缘略深（切纸的毛边用一道内阴影示意）
      · 投影是**扩散型**的，不是硬边方块 —— 纸片贴在台面上是柔的

   ③ 胶布
      左上角斜贴一道半透明和纸胶带。胶带要有：
         · 半透明（能看见底下的纸与纹理）
         · 两侧切边略毛（用 repeating-linear-gradient 做细竖纹）
         · 自己的投影（贴在纸面上会有一点厚度）

   ④ 手帐动效
      悬停时纸片**微微抬起并轻轻歪一点**（像被手指掀起来），
      按下时**落回去**。用带回弹的 cubic-bezier ——
      直线运动是"滑动"，回弹才是"实体"。
   ========================================================================== */

/* --------------------------------------------------------------------------
   65.1 字体 + 拟物
   -------------------------------------------------------------------------- */
#footer-wrap .main-button,
.main-button {
  position: relative;
  display: inline-block;

  padding: 18px 40px 20px !important;

  /* 字体：楷体打头 —— 手帐上是手写体 */
  font-family: "Kaiti SC", "KaiTi", "STKaiti", "楷体",
               "Yuanti SC", "Hiragino Maru Gothic ProN",
               "PingFang SC", "Microsoft YaHei", serif !important;
  font-size: 19px !important;
  font-weight: 700 !important;
  letter-spacing: .12em;

  color: #4a4237 !important;
  text-shadow: 0 1px 0 rgba(255, 255, 255, .85) !important;   /* 纸上的字被压出一点凹痕 */

  /* 纸：暖白渐变 + 极淡的横向纸纹 */
  background-color: #f4ecdc !important;
  background-image:
    repeating-linear-gradient(
      180deg,
      rgba(150, 128, 95, .035) 0px, rgba(150, 128, 95, .035) 1px,
      rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 4px
    ),
    linear-gradient(170deg, #fdfaf3 0%, #f1e8d6 62%, #e9dfc9 100%) !important;

  border: 0 !important;
  border-radius: 2px !important;

  /* 上沿受光 / 下沿压暗 / 边缘略深 —— 纸片的厚度 */
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .95),
    inset 0 -2px 0 rgba(120, 100, 70, .16),
    inset 0 0 0 1px rgba(120, 100, 70, .10),
    inset 0 0 26px rgba(150, 128, 95, .10),
    0 1px 1px rgba(0, 0, 0, .28),
    0 6px 14px -4px rgba(0, 0, 0, .55) !important;

  /* 微微歪一点 —— 贴在册子上的纸片没有摆得笔直的 */
  transform: rotate(-.6deg);
  transform-origin: 50% 80%;

  transition:
    transform .34s cubic-bezier(.34, 1.56, .64, 1),
    box-shadow .34s cubic-bezier(.34, 1.56, .64, 1),
    background-color .2s ease;
}

/* --------------------------------------------------------------------------
   65.2 胶布
   --------------------------------------------------------------------------
   左上角斜贴。用 ::before 画，压在纸面上（z-index 高于纸底、低于文字）。
   -------------------------------------------------------------------------- */
#footer-wrap .main-button::before,
.main-button::before {
  content: "" !important;
  display: block !important;

  position: absolute;
  top: -11px;
  left: -14px;

  width: 62px;
  height: 22px;

  /* 半透明的和纸胶带：底色 + 细竖纹（切边的毛感） */
  background-color: rgba(150, 205, 125, .58) !important;
  background-image: repeating-linear-gradient(
    90deg,
    rgba(255, 255, 255, .22) 0px, rgba(255, 255, 255, .22) 1px,
    rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 4px
  ) !important;

  border-left: 1px solid rgba(255, 255, 255, .35);
  border-right: 1px solid rgba(0, 0, 0, .08);

  transform: rotate(-38deg);
  transform-origin: 50% 50%;

  box-shadow:
    0 1px 2px rgba(0, 0, 0, .35),
    inset 0 1px 0 rgba(255, 255, 255, .3);

  pointer-events: none;
  z-index: 2;
}

/* 右下角再补一小道，看着更像"粘住了" */
#footer-wrap .main-button::after,
.main-button::after {
  content: "" !important;
  display: block !important;

  position: absolute;
  right: -12px;
  bottom: -9px;

  width: 48px;
  height: 18px;

  background-color: rgba(226, 209, 184, .5) !important;
  background-image: repeating-linear-gradient(
    90deg,
    rgba(255, 255, 255, .2) 0px, rgba(255, 255, 255, .2) 1px,
    rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 4px
  ) !important;

  transform: rotate(-32deg);

  box-shadow: 0 1px 2px rgba(0, 0, 0, .3);
  pointer-events: none;
  z-index: 2;
}

/* 文字要压在胶布之上 */
#footer-wrap .main-button,
.main-button {
  z-index: 1;
}

/* --------------------------------------------------------------------------
   65.3 手帐动效
   --------------------------------------------------------------------------
   悬停：纸片被掀起来 —— 抬起 + 歪得更多 + 投影拉开
   按下：落回去 —— 下沉 + 投影收拢
   都用带回弹的曲线，直线运动看着像"滑动"而不是"实体"
   -------------------------------------------------------------------------- */
#footer-wrap .main-button:hover,
.main-button:hover {
  transform: rotate(-1.6deg) translateY(-4px) scale(1.015);
  background-color: #f8f2e3 !important;

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .98),
    inset 0 -2px 0 rgba(120, 100, 70, .14),
    inset 0 0 0 1px rgba(120, 100, 70, .10),
    inset 0 0 26px rgba(150, 128, 95, .08),
    0 2px 2px rgba(0, 0, 0, .26),
    0 14px 26px -6px rgba(0, 0, 0, .62) !important;
}

#footer-wrap .main-button:active,
.main-button:active {
  transform: rotate(-.6deg) translateY(1px) scale(.994);

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .9),
    inset 0 -1px 0 rgba(120, 100, 70, .18),
    inset 0 0 0 1px rgba(120, 100, 70, .12),
    inset 0 2px 8px rgba(150, 128, 95, .16),
    0 1px 1px rgba(0, 0, 0, .3),
    0 3px 8px -3px rgba(0, 0, 0, .5) !important;
}

/* 键盘焦点：外圈虚线，不动纸片本身 */
.main-button:focus-visible {
  outline: 2px dashed rgba(90, 160, 70, .9) !important;
  outline-offset: 4px !important;
}

/* 减少动效：不倾斜、不缩放，只保留颜色变化 */
@media (prefers-reduced-motion: reduce) {
  .main-button,
  #footer-wrap .main-button {
    transform: none !important;
    transition: background-color .2s ease !important;
  }

  .main-button:hover,
  #footer-wrap .main-button:hover,
  .main-button:active,
  #footer-wrap .main-button:active {
    transform: none !important;
  }
}

/* ==========================================================================
   66 修正：纸底与纸的厚度被更高权重的规则压掉了
   --------------------------------------------------------------------------
   第 65 节写完实测：

       纸底      rgba(0, 0, 0, .22)   ← 还是那个半透明深色，不是纸 ❌
       层级阴影  1 层                 ← 纸的厚度那几层没了 ❌
       胶布      正常 ✅   字体 楷体 ✅   倾斜 ✅   悬停动效 ✅

   原因是第 28 节给「浮在大图上的按钮」写过一条：

       .hp-wrapper .main-button { background-color: rgba(0,0,0,.22); box-shadow: 3px 3px 0 … }

   权重 (0,2,0)，而第 65 节用的是 `.main-button`（0,1,0）——
   低了一档，**而且那条还在后面**，于是整块被覆盖。

   （第 28 节那条本意是让按钮在照片上「不显得悬空」；
     现在按钮是一张不透明的纸，本来就压得住，那条不必再管。）

   这里用 `#footer-wrap .main-button` 与 `.hp-wrapper .main-button` 重写 ——
   权重明确更高，两种位置（页脚那张「开始使用」、大图上那张「用户中心」）都覆盖到。
   ========================================================================== */
#footer-wrap .main-button,
.hp-wrapper .main-button {
  background-color: #f4ecdc !important;
  background-image:
    repeating-linear-gradient(
      180deg,
      rgba(150, 128, 95, .035) 0px, rgba(150, 128, 95, .035) 1px,
      rgba(0, 0, 0, 0) 1px, rgba(0, 0, 0, 0) 4px
    ),
    linear-gradient(170deg, #fdfaf3 0%, #f1e8d6 62%, #e9dfc9 100%) !important;
  background-size: auto, auto !important;

  border: 0 !important;
  border-radius: 2px !important;

  color: #4a4237 !important;
  text-shadow: 0 1px 0 rgba(255, 255, 255, .85) !important;

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .95),
    inset 0 -2px 0 rgba(120, 100, 70, .16),
    inset 0 0 0 1px rgba(120, 100, 70, .10),
    inset 0 0 26px rgba(150, 128, 95, .10),
    0 1px 1px rgba(0, 0, 0, .28),
    0 6px 14px -4px rgba(0, 0, 0, .55) !important;

  transform: rotate(-.6deg);
  transform-origin: 50% 80%;

  transition:
    transform .34s cubic-bezier(.34, 1.56, .64, 1),
    box-shadow .34s cubic-bezier(.34, 1.56, .64, 1),
    background-color .2s ease;
}

#footer-wrap .main-button:hover,
.hp-wrapper .main-button:hover {
  transform: rotate(-1.6deg) translateY(-4px) scale(1.015);

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .98),
    inset 0 -2px 0 rgba(120, 100, 70, .14),
    inset 0 0 0 1px rgba(120, 100, 70, .10),
    inset 0 0 26px rgba(150, 128, 95, .08),
    0 2px 2px rgba(0, 0, 0, .26),
    0 14px 26px -6px rgba(0, 0, 0, .62) !important;
}

#footer-wrap .main-button:active,
.hp-wrapper .main-button:active {
  transform: rotate(-.6deg) translateY(1px) scale(.994);

  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, .9),
    inset 0 -1px 0 rgba(120, 100, 70, .18),
    inset 0 0 0 1px rgba(120, 100, 70, .12),
    inset 0 2px 8px rgba(150, 128, 95, .16),
    0 1px 1px rgba(0, 0, 0, .3),
    0 3px 8px -3px rgba(0, 0, 0, .5) !important;
}

/* 胶布在两种位置都要出现 */
#footer-wrap .main-button::before,
.hp-wrapper .main-button::before {
  background-color: rgba(150, 205, 125, .58) !important;
}

#footer-wrap .main-button::after,
.hp-wrapper .main-button::after {
  background-color: rgba(226, 209, 184, .5) !important;
}

/* ==========================================================================
   67「开始使用」按钮的字体改成与「优势」一致
   --------------------------------------------------------------------------
   反馈：字体改成和这个「优势」一样。

   实测两边：

       「优势」标题   "PingFang SC", "PingFang TC", "Hiragino Sans GB", …
                     30px / 字重 800 / 字距 1.2px / 色 rgb(46, 42, 38)
       卡片标题       同一套字体 / 18px / 字重 800
       按钮（改前）   "Kaiti SC" 楷体 / 19px / 字重 700 / 色 rgb(74, 66, 55)

   第 65 节我把按钮换成了楷体，理由是「手帐上的字是手写体」——
   但**页面上其它字都是黑体**，只有这一个按钮是楷体，
   反而成了「只有它不统一」。

   字体统一的原则是：**跟着页面走，而不是跟着想象走**。
   所以改成标题那一套，并把字重提到同一档（800）、字色换成同一个墨色。

   （纸片、胶布、倾斜、动效都保留 —— 那些是「这个按钮是纸」这件事的表达；
     字体不是，字体属于整页的排版系统。）
   ========================================================================== */
#footer-wrap .main-button,
.hp-wrapper .main-button {
  font-family: "PingFang SC", "PingFang TC", "Hiragino Sans GB",
               "Microsoft YaHei", "Noto Sans", sans-serif !important;

  font-size: 20px !important;
  font-weight: 800 !important;            /* 与「优势」标题、卡片标题同档 */
  letter-spacing: 1.2px;                  /* 与「优势」标题同一个字距 */
  line-height: 1.3;

  color: rgb(46, 42, 38) !important;      /* 与标题同一个墨色，不是褐 */
  text-shadow: 0 1px 0 rgba(255, 255, 255, .85) !important;
}

/* ==========================================================================
   68 修正：首屏标题跑到大图上方了
   --------------------------------------------------------------------------
   去掉副标题与按钮之后实测：

       容器 .container   height = 0px
       .splash           top = 0px（我写的是 50%）  box = -80 ~ 80

   原因是**包含块算错了**：

   原模板里 .container 是 position: relative，.splash 是 absolute ——
   所以 .splash 的 top 是相对那个容器算的。
   而 .splash 一旦绝对定位，容器里就没别的东西了，**高度塌成 0** ——
   于是 `top: 50%` 里的 50% 是「0 的 50%」，还是 0，
   再叠上 translateY(-50%)，整块就被提到大图上方去了。

   原来内容多的时候不明显（副标题和按钮把视觉重心拉下来了），
   去掉之后就露出来了。

   改法：让容器回到静态定位 —— .splash 的包含块于是变成
   **大图本身**（.hp-wrapper 是 relative，第 50 节加的），
   top: 50% 这才真的是「大图高度的一半」，垂直居中成立。
   ========================================================================== */
.hp-wrapper > .container {
  position: static !important;
}

.hp-wrapper .splash {
  top: 50% !important;
  bottom: auto !important;
  height: auto !important;
  transform: translateY(-50%) !important;
}

/* ==========================================================================
   69 皮肤库：图标挪到文字前面
   --------------------------------------------------------------------------
   反馈：这一项的图标压在文字后面了，要放到前面。

   它和兄弟项的情况不一样 —— 「中文 / 登录」这些在核心模板里自带
     <i class="icon fas …"></i>
   所以图标天然排在文字前；而「皮肤库」这一项只有一段纯文字，没有原生图标，
   于是当初用 ::after 补了个 👕。::after 只能落在最后，自然就跑到了文字后面。

   好在 .nav-link 是 inline-flex（小绿方块那条规则就是给 flex item 用的：
   flex: 0 0 auto），所以伪元素与那段文字都是 flex item，可以直接用 order 重排：

     ::before（小绿方块）    order: -2
     ::after （👕）          order: -1
     文字（匿名 flex item）  order: 0 —— 匿名盒子不接受选择器，只能用负数压过它

   排完就是「方块 → 👕 → 皮肤库」，与兄弟项的「方块 → 图标 → 文字」对齐。
   注意别只给 ::after 一个负数：那样 👕 会插到方块前面，变成「👕 → 方块 → 文字」。

   间距也要跟着换边：原来 margin-left: 7px 表示「文字与图标之间」的距离，
   图标挪到前面之后，这段距离改由 margin-right 承担。
   ========================================================================== */

body > nav.navbar .nav-link[href*="skinlib"]::before,
.main-header.navbar .nav-link[href*="skinlib"]::before,
.hp-wrapper .navbar .nav-link[href*="skinlib"]::before {
  order: -2;
}

body > nav.navbar .nav-link[href*="skinlib"]::after,
.main-header.navbar .nav-link[href*="skinlib"]::after,
.hp-wrapper .navbar .nav-link[href*="skinlib"]::after {
  order: -1;
  margin-left: 0;
  margin-right: 6px;
}

/* ==========================================================================
   70 顶栏两处修正：图标压文字、通知项「按钮套按钮」
   --------------------------------------------------------------------------
   ① 图标压文字（语言 / 登录 / 我的衣柜 这些项）

      第 49 节把顶栏按钮的 gap 设成了 0，注释写的是
      「间距由两个伪元素自己给，好对齐」—— 那只解决了
      「绿方块 → 后面的内容」这一段，因为方块自己带着 margin-right: 8px。

      但这些项里是 <i class="fas …"> 紧跟着文字，gap 为 0 就意味着
      **图标直接贴在字上**（实测：图标右缘与文字左缘相差 0px，
      「中文 (简体)」的图标几乎压到「中」字上）。

      所以这里补的正是缺的那一段：只给 <i> 一个右外边距。

      通知项要排除 —— 那里面铃铛与「通知」二字的间距由 li 的 gap: 8px 负责，
      再叠一层就变成 15px 了。

   ② 通知项：内层 <a> 不许再长出自己的盒子

      这一项的结构是「li 做成按钮，里面被注入的 <a class="nav-link"> 必须透明」：
          li[data-notifications]        ← 按钮的底/描边/投影都在这一层
              <a class="nav-link">🔔</a>  ← 必须完全透明
              <div class="dropdown-menu"> ← 下拉，display:none
          li::before 绿方块 · li::after「通知」二字

      第 46 节把那个 <a> 清干净了，但这很脆：只要外层再来一条
      「给 .nav-link 上底 / 描边 / 投影」的规则（例如之前那份末级覆盖的
      custom_css 里的 .main-header .navbar-nav > .nav-item > .nav-link），
      内层 <a> 就会重新长出一个盒子 —— 看上去就是「一个按钮被劈成两半」，
      铃铛单独占一格。

      第 64 节只把 :focus 这一种状态钉死了，这里补齐其余状态：
      hover / active / focus-visible / 以及 Bootstrap 打开下拉时加的 .show。
      换句话说：不论什么状态，铃铛那层都不许有自己的盒子。
   ========================================================================== */

/* ① 图标与文字之间的间距（通知项里的铃铛除外） */
.main-header.navbar .nav-link > i,
.main-header.navbar .nav-link > .icon,
body > nav.navbar .nav-link > i,
body > nav.navbar .nav-link > .icon {
  margin-right: 7px;
}

.main-header.navbar li[data-notifications] .nav-link > i,
body > nav.navbar li[data-notifications] .nav-link > i {
  margin-right: 0;
}

/* ② 通知项内层 <a>：任何状态下都保持透明、无描边 */
.main-header.navbar li[data-notifications] > a,
.main-header.navbar li[data-notifications] .nav-link,
.main-header.navbar li[data-notifications] > a:hover,
.main-header.navbar li[data-notifications] > a:focus,
.main-header.navbar li[data-notifications] > a:focus-visible,
.main-header.navbar li[data-notifications] > a:active,
.main-header.navbar li[data-notifications] > a.show,
.main-header.navbar li[data-notifications] .nav-link:hover,
.main-header.navbar li[data-notifications] .nav-link.show,
body > nav.navbar li[data-notifications] > a,
body > nav.navbar li[data-notifications] > a:hover,
body > nav.navbar li[data-notifications] > a:focus,
body > nav.navbar li[data-notifications] > a:focus-visible,
body > nav.navbar li[data-notifications] > a:active,
body > nav.navbar li[data-notifications] > a.show {
  background: none !important;
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
  color: inherit !important;
}

/* ==========================================================================
   71 通知按钮：点击区铺满整项（把那层透明点击区提到最上面）
   --------------------------------------------------------------------------
   反馈：只有那一小块框里点得动，框外的按钮点了没反应。

   第 63 节其实已经给 <a> 加了一个铺满 li 的透明伪元素当点击区，
   但它当时被压在**下面**：

       <a>::after   z-index: 3   ← 点击区
       li::before   z-index: 4   ← 绿方块
       li::after    z-index: 4   ← 「通知」两个字

   那行注释写的是「不要挡住 li 上那两个字」。可它是**透明**的
   （background: none），挡不挡和层级无关 —— 结果就是方块与文字这两处
   把点击吞掉了：点在它们上面时，事件目标是 li（伪元素算在宿主元素上），
   根本不是那个带下拉开关的 <a>。

   那两处只能靠第 63 节配套的 oldtimes-notch.js 转发点击给 <a>。
   转发在「点图标」时没问题，点到别处却有个很隐蔽的副作用：
   转发出来的那次 <a> 点击确实把下拉打开了，可**原始那次点击**还在继续
   冒泡到 document，而 Bootstrap 在 document 上监听「点到菜单外面就关掉」——
   于是菜单刚开就被自己关掉，看上去就是「点了没反应」。
   （点在图标上不会这样：Bootstrap 认得出目标是开关自己，不会关。）

   所以这里把点击区提到最上面（z-index: 5），让**真实的点击**落在 <a> 上：
   Bootstrap 看到的目标就是那个 <a>，开菜单时不会再被当成「点到外面」。
   方块与文字仍在下面一层 —— 因为点击区是透明的，观感一个像素都不变。

   顺带把键盘焦点那圈虚线从内层 <a> 挪到**整颗按钮**上：
   它原来只有图标那么宽，看着就是一个莫名其妙的小框（第 64 节的遗留问题）。
   鼠标点击不显示，键盘 Tab 过来才显示，无障碍要求仍然满足。
   ========================================================================== */

/* ① 透明点击区提到最上面：整颗按钮都是有效点击 */
.main-header.navbar li[data-notifications] > a::after,
.hp-wrapper .navbar li[data-notifications] > a::after {
  z-index: 5;
}

/* ② 内层 <a> 自己不许有任何盒子 —— 任何状态都不许
   --------------------------------------------------------------------------
   注意 :not(:focus-visible) 这个写法。第 64 节为了让「鼠标点过不留绿框」
   写了一对规则，其中一条是：

       .main-header.navbar .nav-link:focus:not(:focus-visible) {
         box-shadow: inset 2px 2px 0 …, inset -2px -2px 0 …, 0 3px 0 … !important;
       }

   它的本意是「鼠标点完把按钮的斜面还回来」（对普通按钮是对的），
   但通知项里那个铃铛**本身就是 .nav-link** —— 于是这条也命中了它，
   给一个只有图标宽（约 13px）的透明 <a> 画上了整套斜面阴影。
   鼠标点完铃铛就留下那个小框：**这就是反馈里说的「点 icon 会有这个框」**。

   它的优先级是 (0,5,0)（:not() 里的选择器也算权重），
   比第 46 节清场用的 (0,4,1) 高，所以清不掉 —— 必须用同等或更高的权重压回去。
   下面这一组是 (0,6,2)，稳定压过它。 */
.main-header.navbar li[data-notifications] > a.nav-link,
.main-header.navbar li[data-notifications] > a.nav-link:hover,
.main-header.navbar li[data-notifications] > a.nav-link:focus,
.main-header.navbar li[data-notifications] > a.nav-link:focus-visible,
.main-header.navbar li[data-notifications] > a.nav-link:focus:not(:focus-visible),
.main-header.navbar li[data-notifications] > a.nav-link:active,
.main-header.navbar li[data-notifications] > a.nav-link.show,
.main-header.navbar li[data-notifications] > a:focus,
.main-header.navbar li[data-notifications] > a:focus-visible,
.main-header.navbar li[data-notifications] > a:focus:not(:focus-visible),
.main-header.navbar li[data-notifications] > a:active,
.main-header.navbar li[data-notifications] > a.show,
.hp-wrapper .navbar li[data-notifications] > a,
.hp-wrapper .navbar li[data-notifications] > a:hover,
.hp-wrapper .navbar li[data-notifications] > a:focus,
.hp-wrapper .navbar li[data-notifications] > a:focus-visible,
.hp-wrapper .navbar li[data-notifications] > a:active,
.hp-wrapper .navbar li[data-notifications] > a.show {
  background: none !important;
  background-color: transparent !important;
  background-image: none !important;
  border: 0 !important;
  box-shadow: none !important;
  outline: none !important;
  color: inherit !important;
}

/* ③ 键盘焦点改画在整颗按钮上（鼠标点击不显示） */
.main-header.navbar li[data-notifications]:has(> a:focus-visible),
.hp-wrapper .navbar li[data-notifications]:has(> a:focus-visible) {
  outline: 2px dashed rgba(134, 213, 98, .9) !important;
  outline-offset: 2px !important;
}

/* ==========================================================================
   69 对比度：三处实测不达标的文字
   --------------------------------------------------------------------------
   用 Chrome 实测每个文字节点的**实际渲染色**与逐层合成后的背景色
   （半透明背景要一层层叠到画布底色 #201e1c 上再算，否则会把
   rgba(...,.18) 这种当成实色，得出假的失败项）。
   下面三处是真的不达标，WCAG AA 正文要求 4.5:1：

     「所有用户」    #2e2a26 on #201e1c =  1.17:1  ← 纸上的墨色掉到了工作台上
     分页 ‹ ›       #2a641c on #3a4047 =  1.47:1
     选中的筛选按钮  #1d2b14 on #2e7555 =  2.69:1

   改法一律只动前景色，不动版面。
   ========================================================================== */

/* 69.1 内容页标题栏右侧那行小字（「所有用户」）。
   它是 .content-header 里一个裸 <span>，继承了纸面的墨色 --otm-ink，
   可它本身坐在深色工作台上，于是几乎隐形。给回浅色。 */
.content-header .container-fluid > span,
.content-header .container-fluid > span > i {
  color: #ded7d0 !important;   /* 11.66:1 */
}

/* 69.2 分页。AdminLTE 的 .page-link 底色是 #3a4047，
   而字色被品牌深绿 #2a641c 盖住了 —— 深绿压深灰，看不见。 */
.pagination .page-link {
  color: #ded7d0 !important;   /* 7.35:1 */
}
.pagination .page-item.disabled .page-link {
  color: rgba(222, 215, 208, .45) !important;  /* 禁用态：可辨但明显弱化 */
}
.pagination .page-item.active .page-link {
  background-color: var(--otm-grass-dark) !important;
  border-color: var(--otm-grass-dark) !important;
  color: #fff !important;
}

/* 69.3 皮肤库的排序筛选（.bg-olive）。AdminLTE 给 olive 配了深字，
   叠在它自己的深绿底上不够看。统一改白字。 */
.btn.bg-olive,
.btn.bg-olive.active,
.btn.bg-olive:hover,
.btn.bg-olive:focus {
  color: #fff !important;      /* 5.54:1 */
}

/* ==========================================================================
   70 主操作按钮：把实心绿还回来
   --------------------------------------------------------------------------
   第 04 节把九个语义变体（primary/success/info/warning/danger/secondary/
   default/outline-*）用 !important 一起压成了同一张「纸」，只靠
   .btn-primary::after 那道 8px 荧光笔区分主操作。

   两个后果：
     1. oldtimes-auth.css:143 明确要求登录按钮是实心草绿 + 白字，
        但 skin.css 在它之后加载，整条被盖掉 —— 那份规则成了死代码。
        实测登录页按钮 background 是 rgb(247,243,234)（纸），不是绿。
        结果全站唯一的主 CTA 看起来像次级按钮。
     2. 删除类操作和普通操作外观完全相同，点错了没有视觉预警。

   这里只收回两类：主操作恢复实心绿，危险操作给独立的砖红。
   warning / info / secondary / default 保持「纸」不动 —— 那几类本来就
   该低调，且改动面越小越安全。

   绿用 --otm-grass-dark 一档的 #3c8527 而不是 #52a535：
     白字 / #52a535 = 3.09:1  不达标
     白字 / #3c8527 = 4.59:1  达标
   ========================================================================== */
.btn-primary,
.btn-primary:not(:disabled):not(.disabled),
.login-card-body .btn-primary {
  background-color: #3c8527 !important;
  background-image: linear-gradient(180deg, #4e9c34 0%, #357621 100%) !important;
  border: 1px solid #214f16 !important;
  color: #fff !important;
  text-shadow: none !important;
}
.btn-primary:hover,
.btn-primary:focus,
.login-card-body .btn-primary:hover,
.login-card-body .btn-primary:focus {
  background-color: #357621 !important;
  background-image: linear-gradient(180deg, #468c2d 0%, #2d661b 100%) !important;
  border-color: #1b4212 !important;
  color: #fff !important;
}

/* 实心之后荧光笔就没用了（它本来是「纸上」才成立的手法），去掉。 */
.btn-primary::after { content: none !important; }

/* 危险操作：砖红，白字 6.56:1。取主站 --mc-redstone 一系的调子，
   不用 Bootstrap 那个刺眼的 #dc3545。 */
.btn-danger,
.btn-danger:not(:disabled):not(.disabled) {
  background-color: #a33a2f !important;
  background-image: linear-gradient(180deg, #b8463a 0%, #8d2823 100%) !important;
  border: 1px solid #6b1d19 !important;
  color: #fff !important;
  text-shadow: none !important;
}
.btn-danger:hover,
.btn-danger:focus {
  background-color: #8d2823 !important;
  background-image: linear-gradient(180deg, #a33a2f 0%, #7a211c 100%) !important;
  color: #fff !important;
}

/* ==========================================================================
   71 皮肤库：卡片等高 + 预览图挂掉时的占位
   --------------------------------------------------------------------------
   实测一行里的卡片高度：332 332 332 332 332 332 332 332 148 332
   那个 148 是预览图挂了的卡片 —— /preview/627 返回 HTTP 500，
   <img> 塌成 157x26，整张卡跟着塌，行里留一个洞。

   注意：500 是后端生成预览失败（皮肤 627 的贴图有问题），
   CSS 治不了根，只能让它**塌得体面**：给图一个最小高度和占位底纹，
   卡片之间用 stretch 拉平。根因要另外查。
   ========================================================================== */
.card-body .d-flex.flex-wrap {
  align-items: stretch !important;
}
.card-body .d-flex.flex-wrap > a.d-block {
  display: flex !important;
  align-items: stretch !important;
}
.card-body .d-flex.flex-wrap > a.d-block > .card {
  width: 100%;
  height: 100%;
}

/* 预览图：固定展示高度，挂掉也占住位置，并露出一块方格占位底纹 */
img.card-img-top {
  min-height: 150px;
  object-fit: contain;
  background-color: var(--otm-paper-deep);
  background-image:
    linear-gradient(45deg, rgba(0, 0, 0, .05) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, .05) 75%),
    linear-gradient(45deg, rgba(0, 0, 0, .05) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, .05) 75%);
  background-size: 16px 16px;
  background-position: 0 0, 8px 8px;
}

/* ==========================================================================
   72 修正：第 69 节里有两条权重不够，没压过去
   --------------------------------------------------------------------------
   第 69.2 / 69.3 写完实测仍是旧色，查出来原因是权重算错了：

   ① 分页 —— 真正在管内容区链接颜色的是第 03 节这条：

        .content-wrapper a:not(.btn):not(.nav-link):not(.navbar-brand) {
          color: var(--otm-grass-dark) !important;
        }

      :not() 括号里的选择器**也计入权重**，所以它是 (0,4,1)，
      而 69.2 写的 .pagination .page-link 只有 (0,2,0)，压不过。
      这里补到 (0,4,1) 并排在它后面 —— 同权重时后写的赢。

   ② 筛选按钮 —— 第 14 节的 .btn-group > .btn[class*="bg-"].active 是
      (0,4,0)，69.3 写的 .btn.bg-olive.active 只有 (0,3,0)。
      补到同权重。

      顺带把选中态从「荧光笔渐变 + 深字」改成实心深绿 + 白字：
      原来那层 rgba 绿叠出来的实际底色是 #2e7555，配 #1d2b14 只有
      2.69:1。改成和第 70 节主按钮同一支绿，既达标（4.59:1）
      又让「选中的筛选」和「主操作」在视觉上是同一个层级。
   ========================================================================== */

/* ① 分页：(0,4,1)，与第 03 节同权重、排在其后 */
.content-wrapper .pagination .page-item a.page-link {
  color: #ded7d0 !important;              /* 7.35:1 on #3a4047 */
  text-decoration: none !important;       /* 分页数字不该带下划线 */
}
.content-wrapper .pagination .page-item.disabled a.page-link {
  color: rgba(222, 215, 208, .45) !important;
}
.content-wrapper .pagination .page-item.active a.page-link {
  background-color: #3c8527 !important;
  background-image: linear-gradient(180deg, #4e9c34 0%, #357621 100%) !important;
  border-color: #214f16 !important;
  color: #fff !important;                 /* 4.59:1 */
}

/* ② 筛选按钮选中态：(0,4,0)，与第 14 节同权重、排在其后 */
.btn-group > .btn.bg-olive.active,
.btn-group > .btn.bg-olive:active,
.btn-group > .btn[class*="bg-"].active {
  background-color: #3c8527 !important;
  background-image: linear-gradient(180deg, #4e9c34 0%, #357621 100%) !important;
  border-color: #214f16 !important;
  color: #fff !important;                 /* 4.59:1 */
  font-weight: 800 !important;
}

/* 未选中的筛选按钮保持「纸」，只保证字够黑（纸上 12.85:1，本来就达标，
   这里只是把第 69.3 那条写错权重的白字收回来，免得纸上出现白字） */
.btn-group > .btn.bg-olive:not(.active) {
  color: var(--otm-ink) !important;
}

/* ==========================================================================
   73 修正：第 72 节把分页改过头了
   --------------------------------------------------------------------------
   72.① 给**所有**分页项都上了浅字，但分页其实有三种底，实测：

       普通项  .page-item              底 #f7f3ea（纸）     ← 第 09 节给的
       选中项  .page-item.active       底 #3c8527（绿）     ← 第 72 节给的
       禁用项  .page-item.disabled     底 #3a4047（AdminLTE 自带的深灰）

   只有**禁用项**那块深灰底上的字是真不达标（原来是深绿 #2a641c，1.47:1），
   普通项本来就是「深墨压纸」12.85:1，完全没问题 —— 是我按禁用项的底色
   一刀切，把普通项也改成浅字，于是 #ded7d0 压在纸上变成 1.29:1，更糟。

   这里分三种状态分别给色，并顺手把禁用项的底从 AdminLTE 的深灰换成
   纸色 —— 一排分页里夹一块深灰本来就和手帐纸签不是一套。
   ========================================================================== */

/* 普通项：恢复第 09 节的深墨压纸（12.85:1） */
.content-wrapper .pagination .page-item a.page-link {
  background-color: var(--otm-paper) !important;
  background-image: none !important;
  color: var(--otm-ink) !important;
  text-decoration: none !important;
}

/* 选中项：实心绿 + 白字（4.59:1），与第 70 节主按钮同一支绿 */
.content-wrapper .pagination .page-item.active a.page-link {
  background-color: #3c8527 !important;
  background-image: linear-gradient(180deg, #4e9c34 0%, #357621 100%) !important;
  border-color: #214f16 !important;
  color: #fff !important;
}

/* 禁用项：改成压深一档的纸，配灰墨（5.73:1）——
   既看得清「这里不能点」，又不在一排纸签里插一块深灰 */
.content-wrapper .pagination .page-item.disabled a.page-link {
  background-color: var(--otm-paper-deep) !important;
  background-image: none !important;
  border-color: rgba(0, 0, 0, .18) !important;
  color: #5d554e !important;
  box-shadow: none !important;
}

/* ==========================================================================
   74 修正：第 71 节的两处副作用
   --------------------------------------------------------------------------
   71 为了「卡片等高 + 破图别塌」写了两条，实测都改过头了：

   ① 给 a.d-block 强加 display:flex —— 它是 .d-flex.flex-wrap 的 flex item，
      改了 display 就改了它的基准尺寸计算，1440 视口下每行从 4 张掉到 3 张。
      等高其实不需要动 a：容器的 align-items 本来就是 stretch，
      a 会被拉到行高，只要让里面的 .card 填满 a 就够了。

   ② 给 img.card-img-top 上了方格占位底纹 —— 本意只给**加载失败**的图兜底，
      但皮肤预览全是带透明通道的 PNG，于是每一张皮肤背后都多了一层灰格子。
      CSS 没法只选中「加载失败的 img」，所以改成与纸同色的实底：
      正常图看不出区别，破图则留下一块 150px 的空白纸，卡片高度照样撑住。
   ========================================================================== */

/* ① 撤掉 a 上的 display:flex，只让 .card 填满 */
.card-body .d-flex.flex-wrap > a.d-block {
  display: block !important;
  align-self: stretch;
}
.card-body .d-flex.flex-wrap > a.d-block > .card {
  height: 100%;
  margin-bottom: 0;
}

/* ② 占位底纹换成纸色实底，去掉方格 */
img.card-img-top {
  min-height: 150px;
  object-fit: contain;
  background-color: var(--otm-paper);
  background-image: none;
}

/* ==========================================================================
   75 手机版：顶栏在窄屏下挤成三行
   --------------------------------------------------------------------------
   head.twig 里的 width=1000 已撤掉，页面改回按真实屏宽布局。
   Blessing Skin 底层是 AdminLTE / Bootstrap 4，内容区本来就响应式 ——
   实测 390 / 414 / 768 内容区无横向溢出，不用动。

   唯一坏掉的是顶栏：Bootstrap 给语言、用户两项的文字标签加了
   .d-none.d-sm-inline（<576px 只留图标），但第 34 / 35 节把右上三项改造成
   主站导航按钮时写了

       .main-header.navbar .nav-link > span { display: inline-flex !important }

   把 .d-none 盖掉了。于是 390px 下五项加起来要 510px，换行成三排，
   导航条高 155px，「皮/肤/库」「未/登/录」竖着排。

   写法说明：这段是通过 custom_css 注入的内联 <style>，而页面里还有一个
   oldtimes-skin.css 的 <link> 排在它**后面** —— 同权重时后写的赢，
   所以这里不能只靠位置，选择器权重和 !important 都要够。
   ========================================================================== */
@media screen and (max-width: 575.98px) {
  body .main-header.navbar .nav-item .nav-link > span.d-none.d-sm-inline,
  body .main-header.navbar .nav-link > span.d-none.d-sm-inline,
  body nav.navbar .nav-link > span.d-none.d-sm-inline {
    display: none !important;
  }

  body .main-header.navbar {
    flex-wrap: nowrap !important;
    padding-left: 4px !important;
    padding-right: 4px !important;
  }

  body .main-header.navbar .navbar-nav {
    flex-direction: row !important;
    flex-wrap: nowrap !important;
  }

  body .main-header.navbar .navbar-brand {
    font-size: 12px !important;
    max-width: 34vw !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
    margin-right: 2px !important;
    padding-left: 4px !important;
    padding-right: 4px !important;
  }

  body .main-header.navbar .nav-item > .nav-link {
    padding-left: 6px !important;
    padding-right: 6px !important;
    margin-left: 1px !important;
    margin-right: 1px !important;
  }

  body .main-header.navbar .nav-item > .nav-link > i {
    margin-right: 0 !important;
  }
}

/* ==========================================================================
   76 按钮统一（三站共用的组件层 · 动森·描边糖果）
   --------------------------------------------------------------------------
   与主站 mc.css 第 67/68 节、论坛 custom_less 第 101~103 节是同一套令牌，
   三处定义必须一字不差。

   改之前实测本站按钮：
       .btn.btn-default      高 38  圆角 2px  内边距 6/12   16px/24px  block
       .btn.bg-olive         高 38  圆角 2px（首尾还各切一半）
       .page-link            高 38  圆角 2px  内边距 8/12
       .nav-link             高 40  圆角 0    内边距 0/16   15px/18px
   全是 display:block，靠内边距凑垂直居中；圆角 0 与 2px 混用。

   统一为：inline-flex 居中 + line-height:1 + 高 32/40 + 圆角 14px。

   权重说明：本段通过后台 custom_css 注入内联 <style>，而页面里还有一个
   oldtimes-skin.css 的 <link> 排在它后面，且那边第 04 / 14 节用的是
   .btn[class*="bg-"]（0,2,0）和 .btn-group > .btn[class*="bg-"]（0,3,1）。
   所以这里一律加 body 前缀并保持 !important，确保压得住。
   ========================================================================== */

:root {
  --ot-btn-r: 14px;
  --ot-btn-h-sm: 32px;
  --ot-btn-h-md: 40px;
  --ot-btn-h-lg: 48px;
  --ot-btn-px-sm: 14px;
  --ot-btn-px-md: 18px;
  --ot-btn-px-lg: 24px;
  --ot-btn-fs-sm: 13px;
  --ot-btn-fs-md: 14px;
  --ot-btn-fs-lg: 15px;

  --ot-btn-primary-top: #448c2b;
  --ot-btn-primary-bottom: #2a641c;
  --ot-btn-primary-edge: #1f4d14;

  --ot-btn-second-top: #fffdf8;
  --ot-btn-second-bottom: #ece3d4;
  --ot-btn-second-edge: #b9ab92;

  --ot-btn-danger-top: #a33a2f;
  --ot-btn-danger-bottom: #7a211c;
  --ot-btn-danger-edge: #5e1a16;

  --ot-btn-dark-top: #4a4643;
  --ot-btn-dark-bottom: #35322f;
  --ot-btn-dark-edge: #201e1c;

  --ot-btn-lift: 0 7px 14px -5px rgba(0, 0, 0, .45);
  --ot-btn-lift-down: 0 3px 8px -5px rgba(0, 0, 0, .45);
  --ot-btn-gloss: inset 0 2px 0 rgba(255, 255, 255, .28);
}

/* --------------------------------------------------------------------------
   76.1 结构
   -------------------------------------------------------------------------- */
body .btn,
body .pagination .page-link,
body .main-header.navbar .nav-item > .nav-link {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 6px;
  line-height: 1 !important;              /* 关键：不靠行高凑居中 */
  white-space: nowrap;
  font-weight: 700 !important;
  letter-spacing: .02em;
  text-decoration: none !important;
  height: var(--ot-btn-h-md) !important;
  padding: 0 var(--ot-btn-px-md) !important;
  font-size: var(--ot-btn-fs-md) !important;
  border-radius: var(--ot-btn-r) !important;
  border: 2px solid var(--ot-btn-second-edge) !important;
  text-shadow: none !important;
  transition: transform .12s ease, box-shadow .12s ease, filter .12s ease !important;
}

/* 小号：分页、按钮组里的筛选 */
body .pagination .page-link,
body .btn-group > .btn,
body .btn.btn-sm {
  height: var(--ot-btn-h-sm) !important;
  padding: 0 var(--ot-btn-px-sm) !important;
  font-size: var(--ot-btn-fs-sm) !important;
}

/* 按钮组：只有首尾切圆角，中间保持直边 —— 连成一条糖果带 */
body .btn-group > .btn:not(:first-child):not(:last-child) {
  border-radius: 0 !important;
}
body .btn-group > .btn:first-child:not(:last-child) {
  border-radius: var(--ot-btn-r) 0 0 var(--ot-btn-r) !important;
}
body .btn-group > .btn:last-child:not(:first-child) {
  border-radius: 0 var(--ot-btn-r) var(--ot-btn-r) 0 !important;
}

/* --------------------------------------------------------------------------
   76.2 配色
   -------------------------------------------------------------------------- */
/* 次级：纸签（内容区默认按钮） */
body .btn,
body .btn[class*="bg-"],
body .btn-group > .btn[class*="bg-"],
body .pagination .page-item a.page-link {
  background-color: transparent !important;
  background-image: linear-gradient(180deg, var(--ot-btn-second-top), var(--ot-btn-second-bottom)) !important;
  border-color: var(--ot-btn-second-edge) !important;
  color: var(--otm-ink, #2e2a26) !important;
  box-shadow: 0 3px 0 var(--ot-btn-second-edge), var(--ot-btn-lift), var(--ot-btn-gloss) !important;
}

/* 主操作：绿 —— 登录、上传、选中的筛选 */
body .btn-primary,
body .btn.btn-primary,
body .login-card-body .btn-primary,
body .btn-group > .btn[class*="bg-"].active,
body .btn-group > .btn.bg-olive.active,
body .pagination .page-item.active a.page-link {
  background-color: transparent !important;
  background-image: linear-gradient(180deg, var(--ot-btn-primary-top), var(--ot-btn-primary-bottom)) !important;
  border-color: var(--ot-btn-primary-edge) !important;
  color: #fff !important;
  box-shadow: 0 3px 0 var(--ot-btn-primary-edge), var(--ot-btn-lift), var(--ot-btn-gloss) !important;
}

/* 危险操作：砖红 */
body .btn-danger,
body .btn.btn-danger {
  background-color: transparent !important;
  background-image: linear-gradient(180deg, var(--ot-btn-danger-top), var(--ot-btn-danger-bottom)) !important;
  border-color: var(--ot-btn-danger-edge) !important;
  color: #fff !important;
  box-shadow: 0 3px 0 var(--ot-btn-danger-edge), var(--ot-btn-lift), var(--ot-btn-gloss) !important;
}

/* 顶栏：深色面板（顶栏是深底，不能用浅纸） */
body .main-header.navbar .nav-item > .nav-link {
  background-image: linear-gradient(180deg, var(--ot-btn-dark-top), var(--ot-btn-dark-bottom)) !important;
  border-color: var(--ot-btn-dark-edge) !important;
  color: #fff !important;
  box-shadow: 0 3px 0 var(--ot-btn-dark-edge), var(--ot-btn-lift), var(--ot-btn-gloss) !important;
}

/* 禁用的分页项：压深一档的纸，仍然看得清「不能点」 */
body .pagination .page-item.disabled a.page-link {
  background-image: linear-gradient(180deg, #f0e9dc, #e3dac9) !important;
  border-color: #cfc3ab !important;
  color: #5d554e !important;
  box-shadow: 0 2px 0 #cfc3ab !important;
}

/* --------------------------------------------------------------------------
   76.3 按下 / 焦点
   -------------------------------------------------------------------------- */
body .btn:active,
body .pagination .page-link:active,
body .main-header.navbar .nav-item > .nav-link:active {
  transform: translateY(2px) !important;
  box-shadow: 0 1px 0 var(--ot-btn-second-edge), var(--ot-btn-lift-down), var(--ot-btn-gloss) !important;
}

body .btn-primary:active,
body .btn-group > .btn[class*="bg-"].active:active {
  box-shadow: 0 1px 0 var(--ot-btn-primary-edge), var(--ot-btn-lift-down), var(--ot-btn-gloss) !important;
}

body .btn-danger:active {
  box-shadow: 0 1px 0 var(--ot-btn-danger-edge), var(--ot-btn-lift-down), var(--ot-btn-gloss) !important;
}

body .main-header.navbar .nav-item > .nav-link:active {
  box-shadow: 0 1px 0 var(--ot-btn-dark-edge), var(--ot-btn-lift-down), var(--ot-btn-gloss) !important;
}

body .btn:focus-visible,
body .pagination .page-link:focus-visible,
body .main-header.navbar .nav-item > .nav-link:focus-visible {
  outline: 2px solid #86d562 !important;
  outline-offset: 2px !important;
}

/* 第 70 节那道荧光笔是「纸按钮」时代的做法，实心之后不需要了 */
body .btn-primary::after,
body .btn-success::after {
  content: none !important;
}

/* --------------------------------------------------------------------------
   76.4 窄屏：顶栏按钮跟着收（承接第 75 节）
   -------------------------------------------------------------------------- */
@media screen and (max-width: 575.98px) {
  body .main-header.navbar .nav-item > .nav-link {
    height: var(--ot-btn-h-sm) !important;
    padding: 0 10px !important;
    font-size: var(--ot-btn-fs-sm) !important;
  }
}

/* ==========================================================================
   77 输入框 / 卡片 / 标签（第二批 · 与第 76 节的按钮同一套语言）
   --------------------------------------------------------------------------
   实测改之前：
       input.form-control   高 38  圆角 2px   边框 1px   无阴影
       .card（内容纸）      高 2529 圆角 2px  阴影 12px 14px 0 rgba(0,0,0,.28)
                            —— 一块硬偏移的黑影，是「厚重」的主要来源之一
       .card.css-*（皮肤卡）圆角 2px
       .badge               高 25  圆角 2px

   口径（与论坛第 104 节同名同值）：
       输入框  高 40、圆角 14px、2px 同色描边 —— 和中号按钮严丝合缝
               「凹」感用一层很轻的顶部内阴影，不用硬斜面
       卡片    圆角 18px，比按钮大一档
               投影换成「一道实色底边 + 一层柔和外投影」，和按钮同语言
       标签    胶囊 999px，高 22

   草地顶条是 .card::before（absolute; top:-10px），在卡片上边缘之外，
   卡片加圆角不会切到它 —— 实测确认过，所以不需要 overflow:hidden
   （那样反而会把卡片内的下拉菜单裁掉）。

   权重同第 76 节：本段走后台 custom_css 的内联 <style>，而页面里还有一个
   oldtimes-skin.css 的 <link> 排在它后面，所以一律 body 前缀 + !important。
   ========================================================================== */

:root {
  --ot-field-h: 40px;
  --ot-field-r: 14px;
  --ot-field-px: 14px;
  --ot-card-r: 18px;
  --ot-tag-h: 22px;
  --ot-tag-r: 999px;
  --ot-field-well: inset 0 2px 4px rgba(87, 70, 50, .16);
}

/* --------------------------------------------------------------------------
   77.1 输入框
   -------------------------------------------------------------------------- */
body .form-control,
body input.form-control,
body textarea.form-control,
body select.form-control,
body .custom-select {
  height: var(--ot-field-h) !important;
  min-height: var(--ot-field-h) !important;
  padding: 0 var(--ot-field-px) !important;
  font-size: var(--ot-btn-fs-md, 14px) !important;
  line-height: 1 !important;
  border: 2px solid var(--ot-btn-second-edge, #b9ab92) !important;
  border-radius: var(--ot-field-r) !important;
  background-color: #fffdf8 !important;
  background-image: none !important;
  box-shadow: var(--ot-field-well) !important;
  color: var(--otm-ink, #2e2a26) !important;
  transition: border-color .14s ease-out, box-shadow .14s ease-out !important;
}

body textarea.form-control {
  height: auto !important;
  min-height: 96px !important;
  padding: 10px var(--ot-field-px) !important;
  line-height: 1.6 !important;
}

/* 聚焦：绿描边 + 外环，与按钮的 focus-visible 同一个绿 */
body .form-control:focus {
  border-color: #52a535 !important;
  box-shadow: var(--ot-field-well), 0 0 0 3px rgba(108, 195, 73, .28) !important;
  outline: none !important;
}

/* --------------------------------------------------------------------------
   77.2 输入框组：把接缝做平
   --------------------------------------------------------------------------
   搜索框右边紧挨着一颗绿色圆角按钮，输入框却是另一套圆角 —— 接缝很明显。
   这里让「输入框只圆左边、按钮只圆右边」，两者拼成一颗完整的糖果。
   -------------------------------------------------------------------------- */
body .input-group > .form-control:not(:last-child) {
  border-top-right-radius: 0 !important;
  border-bottom-right-radius: 0 !important;
  border-right-width: 0 !important;
}

body .input-group > .form-control:not(:first-child) {
  border-top-left-radius: 0 !important;
  border-bottom-left-radius: 0 !important;
}

body .input-group-append > .btn,
body .input-group-append > .input-group-text {
  height: var(--ot-field-h) !important;
  border-top-left-radius: 0 !important;
  border-bottom-left-radius: 0 !important;
  border-top-right-radius: var(--ot-field-r) !important;
  border-bottom-right-radius: var(--ot-field-r) !important;
}

body .input-group-prepend > .btn,
body .input-group-prepend > .input-group-text {
  height: var(--ot-field-h) !important;
  border-top-right-radius: 0 !important;
  border-bottom-right-radius: 0 !important;
  border-top-left-radius: var(--ot-field-r) !important;
  border-bottom-left-radius: var(--ot-field-r) !important;
}

/* 图标附加块（登录页那两个信封 / 锁）做成纸签，和输入框同高同描边 */
body .input-group-text {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  min-width: var(--ot-field-h) !important;
  padding: 0 12px !important;
  border: 2px solid var(--ot-btn-second-edge, #b9ab92) !important;
  background-image: linear-gradient(180deg, #fffdf8, #ece3d4) !important;
  color: var(--otm-ink, #2e2a26) !important;
}

/* --------------------------------------------------------------------------
   77.3 卡片
   -------------------------------------------------------------------------- */
body .card {
  border-radius: var(--ot-card-r) !important;
  border: 2px solid var(--ot-btn-second-edge, #b9ab92) !important;
  box-shadow: 0 3px 0 var(--ot-btn-second-edge, #b9ab92),
              0 14px 28px -12px rgba(0, 0, 0, .5) !important;
}

/* 皮肤库那一格一格的相片卡：同样的圆角，投影再轻一档 —— 一屏里有二十张，
   投影太重会糊成一片 */
body .card-body .d-flex.flex-wrap > a.d-block > .card {
  border-radius: var(--ot-card-r) !important;
  box-shadow: 0 2px 0 #cfc3ab, 0 8px 16px -10px rgba(0, 0, 0, .45) !important;
}

body .card-body .d-flex.flex-wrap > a.d-block > .card:hover {
  box-shadow: 0 3px 0 #cfc3ab, 0 12px 22px -10px rgba(0, 0, 0, .5) !important;
  transform: translateY(-2px);
}

/* 卡片内部的头尾跟着收圆角，否则会在圆角里顶出直角 */
body .card > .card-header:first-child {
  border-top-left-radius: 14px !important;
  border-top-right-radius: 14px !important;
}
body .card > .card-footer:last-child {
  border-bottom-left-radius: 14px !important;
  border-bottom-right-radius: 14px !important;
}

/* 预览图在卡片顶部，跟着圆角收边 */
body img.card-img-top {
  border-top-left-radius: 14px !important;
  border-top-right-radius: 14px !important;
}

/* --------------------------------------------------------------------------
   77.4 标签
   -------------------------------------------------------------------------- */
body .badge,
body .label {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  height: var(--ot-tag-h) !important;
  min-height: var(--ot-tag-h) !important;
  padding: 0 10px !important;
  border-radius: var(--ot-tag-r) !important;
  line-height: 1 !important;
  font-size: 11.5px !important;
  font-weight: 700 !important;
  border: 1px solid rgba(0, 0, 0, .18) !important;
  box-shadow: 0 2px 0 rgba(0, 0, 0, .18) !important;
}

/* ==========================================================================
   78 修正：第 77 节的输入框组判断太粗 + 补上复选框
   --------------------------------------------------------------------------
   ① 77.2 用 .form-control:not(:first-child) 来判断「左边该不该切平」，
      但 .input-group 里常常有不可见的包装元素，于是搜索框明明左边没有
      前置块，左圆角也被切掉了 —— 实测皮肤库搜索框四角全是 0。
      改成只在**真的存在** .input-group-prepend 时才切左边。

   ② 「记住我」还是浏览器原生复选框，四周全是手帐风纸签，很突兀。
      做成一颗小方糖：14px 圆角、纸面、勾选后填草绿。
   ========================================================================== */

/* ① 左圆角：只有真的有前置块时才切平 */
body .input-group > .form-control {
  border-top-left-radius: var(--ot-field-r) !important;
  border-bottom-left-radius: var(--ot-field-r) !important;
}

body .input-group > .input-group-prepend + .form-control,
body .input-group > .input-group-prepend ~ .form-control {
  border-top-left-radius: 0 !important;
  border-bottom-left-radius: 0 !important;
}

/* ② 复选框 / 单选框：做成小方糖 */
body input[type="checkbox"],
body input[type="radio"] {
  appearance: none !important;
  -webkit-appearance: none !important;
  width: 20px !important;
  height: 20px !important;
  margin: 0 8px 0 0 !important;
  vertical-align: -4px;
  border: 2px solid var(--ot-btn-second-edge, #b9ab92) !important;
  border-radius: 7px !important;
  background-image: linear-gradient(180deg, #fffdf8, #ece3d4) !important;
  box-shadow: inset 0 2px 4px rgba(87, 70, 50, .16) !important;
  cursor: pointer;
  transition: background-color .12s ease, border-color .12s ease;
}

body input[type="radio"] {
  border-radius: 999px !important;
}

body input[type="checkbox"]:checked,
body input[type="radio"]:checked {
  background-color: #3c8527 !important;
  background-image: linear-gradient(180deg, #448c2b, #2a641c) !important;
  border-color: #1f4d14 !important;
  box-shadow: inset 0 2px 0 rgba(255, 255, 255, .28) !important;
}

/* 勾 */
body input[type="checkbox"]:checked::after {
  content: "";
  display: block;
  width: 5px;
  height: 9px;
  margin: 1px auto 0;
  border: solid #fff;
  border-width: 0 2.5px 2.5px 0;
  transform: rotate(42deg);
}

body input[type="radio"]:checked::after {
  content: "";
  display: block;
  width: 6px;
  height: 6px;
  margin: 5px auto;
  border-radius: 999px;
  background: #fff;
}

body input[type="checkbox"]:focus-visible,
body input[type="radio"]:focus-visible {
  outline: 2px solid #86d562 !important;
  outline-offset: 2px !important;
}

/* ==========================================================================
   登录页可读性修复（2026-09-22）
   --------------------------------------------------------------------------
   反馈：「登录界面字看不清」。

   ① 提示条（flash）—— 最严重的一处
      assets/oldtimes-auth.css 给 .login-card-body .alert 定的是
          background: #eadca7（奶油色纸条）; color: var(--otm-ink)
      而深色模式下 custom_css 会把 .login-box .card 上的 --otm-ink 改成
      #ede5e2（浅墨）。于是「未授权的访问，请先登录」＝浅墨压在奶油底上，
      对比度约 1.1:1 —— 基本等于看不见（站长截图就是这个状态）。
      → 纸条上的字固定用深墨，并加粗；纸条底色保持原样。

   ② 输入框的占位符（Email 或角色名 / 密码）
      固定 #91887f：深色输入框（#2b2927）上只有 3.6:1，浅色输入框
      （#fffdf8）上更低。→ 按明/暗各给一档，都到 4.5:1 以上。

   ③ 卡片副标题「登录以管理您的角色与皮肤」
      深色下是 #ded7d0，压在 #3a3734 上约 7.4:1 —— 数学上够，但手机亮度
      低时仍发闷。→ 提到 #f1eae5。

   选择器为什么带 html[data-ot-theme] body.login-page .login-box：
      custom_css（后台「自定义 CSS」）是随页面 <head> 内联下发的，位置在
      这些 <link> 之后；它的规则写在 html[data-ot-theme="dark"] body .login-box
      .card 这一类选择器上，权重 (0,4,2) 且带 !important。这里把权重抬到
      (0,5,2)，源序又靠后，才压得住 —— 数据库那份暂时不动，等哪次同步把它
      并进 skin.css 时也不会反过来盖掉这一节。
   ========================================================================== */

/* ① 提示条：奶油纸条上的字一律深墨，加粗 */
html[data-ot-theme] body.login-page .login-box .login-card-body .alert,
html[data-ot-theme] body.login-page .login-box .login-card-body .alert.alert-warning,
html[data-ot-theme] body.login-page .login-box .login-card-body .alert.alert-info,
html[data-ot-theme] body.login-page .login-box .login-card-body .alert.alert-success,
html[data-ot-theme] body.login-page .login-box .login-card-body .alert.alert-danger {
  color: #3b3005 !important;
  font-weight: 700;
  text-shadow: none !important;
}

html[data-ot-theme] body.login-page .login-box .login-card-body .alert a {
  color: #2a641c !important;
  text-decoration-color: rgba(42, 100, 28, .5) !important;
}

html[data-ot-theme] body.login-page .login-box .login-card-body .alert .close,
html[data-ot-theme] body.login-page .login-box .login-card-body .alert button {
  color: #3b3005 !important;
  opacity: .75;
}

/* ② 占位符：明/暗各一档，都过 4.5:1 */
html[data-ot-theme] body.login-page .login-box .login-card-body .form-control::placeholder {
  color: #6d645b !important;
  opacity: 1;
}

html[data-ot-theme="dark"] body.login-page .login-box .login-card-body .form-control::placeholder {
  color: #b6ada4 !important;
}

/* ③ 副标题提亮 */
html[data-ot-theme="dark"] body.login-page .login-box .login-card-body .login-box-msg {
  color: #f1eae5 !important;
}

/* 输入框与右侧图标的字色也在这里确认一遍，免得以后被内联样式改回去 */
html[data-ot-theme="dark"] body.login-page .login-box .login-card-body .form-control {
  color: #f4eee9 !important;
}

html[data-ot-theme="dark"] body.login-page .login-box .login-card-body .input-group-text {
  color: #f4eee9 !important;
}

/* ==========================================================================
   86 修正：深色主题下「使用情况」卡片里的字看不见
   --------------------------------------------------------------------------
   截图（深色仪表盘）：两条 info-box 是米色纸底，里面的字却是近白色，
   对比度约 1.02:1，基本读不出来。

   根因不在 info-box 自己的规则，而在后台 custom_css 第 81 节：
       html[data-ot-theme="dark"] body .content-wrapper .card:not([class*="css-"]) {
         --otm-paper:#3a3734; --otm-paper-deep:#2e2b29;
         --otm-ink:#ede5e2;   --otm-ink-soft:#b5aca3;
         --otm-grass-dark:#86d562; ...
       }
   info-box 是那张深色 .card 的后代，于是继承了这套「深底浅字」的令牌；
   但 oldtimes-skin.css 第 17 节把 info-box 的底写死成米色纸（!important），
   结果就是「浅字压纸底」。

   做法：info-box / small-box 自己仍是纸（与浅色主题、相片卡同一套语言），
   只把那张纸配套的令牌在它身上复位 —— 正文、次文、图标绿都回到纸上的深色。
   选择器只挂 dark，浅色主题与登录页可读性补丁都不受影响。
   ========================================================================== */
html[data-ot-theme="dark"] body .info-box,
html[data-ot-theme="dark"] body .small-box {
  --otm-paper: #f7f3ea;
  --otm-paper-deep: #ebe3d4;
  --otm-ink: #2e2a26;
  --otm-ink-soft: #70675e;
  --otm-grass-dark: #2a641c;
}

/* 进度条：AdminLTE 给 info-box 默认的是「白条 + 淡灰槽」，
   白条压在纸底上完全看不见（两个主题都一样）。换成纸上的深草绿条 + 略深的槽；
   带 bg-* 语义色的进度条不动（保留语义组件）。 */
body .info-box .progress {
  background-color: rgba(120, 100, 70, .22) !important;
}

body .info-box .progress .progress-bar:not([class*="bg-"]) {
  background-color: var(--otm-grass-dark, #2a641c) !important;
}

/* ==========================================================================
   87 修正：手机顶栏五颗控件不在一行 / 中心线不齐 / 横向溢出
   --------------------------------------------------------------------------
   390px 实测（深、浅一致）：
       ☰   li 40 行盒，a 32   → a 中心 27
       主题 li 40 行盒，a 32   → a 中心 27
       通知 li 32 弹性盒       → 中心 31
       语言 li 40 行盒，a 32   → 中心 31（量 li）
       头像 li 40 行盒，a 32（头像 33.6 把基线顶下去）→ 中心 29
   三处根因：
     ① 第 59 节给 `.navbar-nav .nav-item { height:40px }`（桌面成立：a 也是 40），
        但第 76.4 节把窄屏的 a 收到 32，li 还是 40 的行盒 —— 里面的 inline-flex
        a 按**基线**摆，不是居中。
     ② custom_css 第 79.3 节把通知 li 单独做成 32px 弹性盒，和上面 40 的行盒两套。
     ③ 第 75 节只收起了语言的 `.d-none.d-sm-inline`，漏了用户名的
        `.d-none.d-sm-block`；而第 59 节 `span { display:inline-flex !important }`
        又把 Bootstrap 的 `.d-none` 盖掉 —— 320/390 下用户名一直显示，
        把五项顶出屏幕（390 实测文档宽 399）。

   做法：每一项统一成同高的弹性盒（居中，不靠基线）；手机收起用户名文字；
   名字限制宽度并省略号截断；平板 / 内嵌门户不换行，由昵称收缩吸收；
   320 再收一点内边距与项间距。
   ========================================================================== */

/* 用户名那一行：限制宽度 + 省略号，长昵称不会把控件顶出屏幕。
   text-overflow 需要块级/行内块容器，所以从 inline-flex 改成 inline-block。 */
body .main-header.navbar .nav-link > span[data-mark="nickname"],
body .main-header.navbar .nav-link > span.d-none.d-sm-block {
  display: inline-block !important;
  max-width: 22vw;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  white-space: nowrap !important;
  vertical-align: middle;
}

/* 平板 / 内嵌门户（≤991.98）：右侧收成图标档（承接内联第 83 节的本意，
   那几条写在不存在的 .navbar-custom-menu 上），并且**不允许换行** ——
   第 54 节在这里允许 wrap，长昵称会把顶栏挤成两排。
   只有用户那一项可收缩，多出来的宽度由昵称的省略号吸收。 */
@media screen and (max-width: 991.98px) {
  body .main-header.navbar .nav-item .nav-link > span.d-none.d-sm-inline {
    /* 视觉收起但保留读屏文字，语言/用户名不丢失可访问名称。 */
    display: inline-block !important;
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
  }

  body .main-header.navbar .navbar-nav {
    flex-wrap: nowrap !important;
    min-width: 0 !important;
  }

  /* 每一项都是同高的弹性盒：内容居中，不靠行盒基线 */
  body .main-header.navbar .navbar-nav > .nav-item {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    height: var(--ot-btn-h-md, 40px) !important;
    min-height: var(--ot-btn-h-md, 40px) !important;
    flex-shrink: 0 !important;
  }

  body .main-header.navbar .navbar-nav > .nav-item > .nav-link {
    height: 100% !important;
  }

  body .main-header.navbar .navbar-nav > .nav-item.user-menu,
  body .main-header.navbar .user-menu > .nav-link,
  body .main-header.navbar .user-menu > .nav-link > span[data-mark="nickname"] {
    min-width: 0 !important;
    flex-shrink: 1 !important;
  }

  body .main-header.navbar .user-menu > .nav-link > span[data-mark="nickname"] {
    flex: 1 1 auto !important;
  }

  body .main-header.navbar .user-menu > .nav-link > picture {
    flex: 0 0 auto !important;
  }
}

/* 手机（<576）：只留图标 / 头像 —— 语言与用户名文字按 Bootstrap 本意收起
   （Bootstrap 的 .d-none 被第 59 节的 span 规则盖掉了，这里补回来），
   控件收到 32px、上下边距归零，五颗中心线完全一致。 */
@media screen and (max-width: 575.98px) {
  body .main-header.navbar .nav-item .nav-link > span.d-none.d-sm-inline,
  body .main-header.navbar .nav-item .nav-link > span.d-none.d-sm-block,
  body .main-header.navbar .nav-item .nav-link > span.d-none.d-md-inline {
    /* 视觉收起但保留读屏文字，语言/用户名不丢失可访问名称。 */
    display: inline-block !important;
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
  }

  body .main-header.navbar .navbar-nav > .nav-item {
    height: var(--ot-btn-h-sm, 32px) !important;
    min-height: var(--ot-btn-h-sm, 32px) !important;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }

  body .main-header.navbar .navbar-nav > .nav-item > .nav-link {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }
}

/* 最窄一档（320 等）：内边距与项间距再收一点，五颗仍在同一行 */
@media screen and (max-width: 360px) {
  body .main-header.navbar .navbar-nav > .nav-item > .nav-link {
    padding-left: 6px !important;
    padding-right: 6px !important;
  }

  body .main-header.navbar .navbar-nav .nav-item {
    margin-left: 2px !important;
  }
}

/* ==========================================================================
   88 修正：手机顶栏的空白按钮 / 横向溢出 / 按钮尺寸不统一；皮肤库手机改双列
   --------------------------------------------------------------------------
   390px 实测（登录态，深、浅一致），改之前：

       站名 132.59                 ← 已经是省略号
       👕  40x32   x=[139.6, 179.6]   皮肤库
       ▢   40x32   x=[187.6, 227.6]   ★ 空白按钮 —— 我的衣柜
       🌙  40x32   x=[229.6, 269.6]   主题
       👕⬆ 40x32   x=[277.6, 317.6]   ★ 一颗按钮两个图标，图标偏心 8.35px
       🔔  40x40/40x36 x=[324.6, 364.6] ★ 高度和其余五颗不是一档
       AB  40x32   x=[371.6, 411.6]   ★ 越界
       头像 40x32  x=[419.6, 459.6]   ★ 越界（整条 461px，横向溢出 71px）

   四个根因，都不是「样式调不齐」，而是规则本身缺项或打偏：

   ① 空白按钮：「我的衣柜」
      第 83 节（后台 custom_css，内联 <style>）在 ≤767.98 把折叠区每一项做成
      40px 图标按钮，并把文字用 font-size: 0 收掉；而唯一给图标的是第 35 节

          .main-header.navbar .nav-link[href*="skinlib"]::after { content: "👕" }

      「皮肤库」的 href 是 …/skinlib，命中；「我的衣柜」的 href 是 …/user/closet，
      不命中 —— 文字被收掉、伪元素又是空的，于是只剩一个 40x32 的空框。

   ② 一颗按钮两个图标：把 `[href*="skinlib"]` 这条也套到了「上传新皮肤」
      （href = …/skinlib/upload）。图标档下它同时画出 👕 与 <i class="fas fa-upload">，
      图标被挤得偏心 8px。手机档里右侧那几颗只该留自己的 <i>，所以这里把
      .navbar-custom-menu 里边的 ::after 关掉（桌面端不动，保持原样）。

   ③ 横向溢出：前面几节把每一项都写成 flex-shrink: 0，站名又是 34vw 死宽，
      登录后多出「通知」「主题」「头像」三颗，390 下整条 461px。修法是让**站名**
      成为唯一可收缩的一项（min-width: 0 + 省略号），按钮各自保持正方形、不压缩。

   ④ 尺寸不统一：「通知」那颗是外层 li 在画按钮（40x40、margin-top:3px，见第 83/84 节），
      其余是 <a> 在画按钮（40x32）。这里把两处口径统一成同一个正方形。

   权重说明（很重要）：本文件排在后台 custom_css 那个内联 <style> **前面**，
   而同权重的规则后写的赢。所以要压过第 83/84 节，选择器必须**严格更高**：

       第 83 节  html body .main-header.navbar .navbar-custom-menu .nav-item > .nav-link
                  → (0,5,2)
       本节      html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link
                  → (0,6,2)   ✓ 高一级

       第 84 节  html body .main-header.navbar .navbar-custom-menu li[data-notifications]
                  → (0,4,3)
       本节      html body .main-header.navbar .navbar-custom-menu .navbar-nav > li[data-notifications]
                  → (0,5,3)   ✓ 高一级

   桌面端（>991.98）一个字都不碰：本节全部内容都在 991.98 / 767.98 / 360 三个断点里。
   ========================================================================== */

/* --------------------------------------------------------------------------
   88.1 平板 / 窄屏（≤991.98）：折叠区那两个链接也收成方形图标按钮
   --------------------------------------------------------------------------
   768 那一档原来还留着「皮肤库」「我的衣柜」的文字，加上右侧五颗，
   整条顶栏 46px 溢出 —— 这一档右侧本来就是纯图标（第 83 节），
   把折叠区一并收成图标档，两边才是一套。
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991.98px) {
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    height: 40px !important;
    min-height: 40px !important;
    margin: 0 2px !important;
    flex: 0 0 auto !important;
  }

  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link {
    width: 40px !important;
    min-width: 40px !important;
    height: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
    gap: 0 !important;
    justify-content: center !important;
    align-items: center !important;
    font-size: 0 !important;                /* 文字收掉，图标另外给字号 */
    line-height: 1 !important;
  }

  /* 第 34.2 节那颗 5px 绿方块在这个尺寸下只是噪点 */
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link::before {
    display: none !important;
  }

  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link::after {
    order: 0 !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: 1 !important;
  }

  /* 「我的衣柜」补一个图标 —— 这正是那个空白按钮的根因。
     只在这一档加，桌面端（>991.98）保持原样。 */
  html body .main-header.navbar .nav-link[href*="/user/closet"]::after {
    content: "🎒" !important;
  }

  /* 右侧那几颗只保留自己的 <i>（第 35 节的 [href*="skinlib"] 会连
     「上传新皮肤」一起命中，一颗按钮画出两个图标） */
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link::after {
    content: none !important;
    display: none !important;
  }

  /* 这一档右侧是纯图标：文字（含「上传」里那个 &nbsp;）一并收掉。
     不收的话那个 &nbsp; 会把图标顶得偏左 2~8px。 */
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link {
    font-size: 0 !important;
    line-height: 1 !important;
    gap: 0 !important;
  }

  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link > i {
    width: 16px !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: 1 !important;
    text-align: center !important;
  }

  /* 视觉收起但保留读屏文字（未读角标除外） */
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link > span:not([class*="badge"]) {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
  }
}

/* --------------------------------------------------------------------------
   88.2 手机（≤767.98）：一行放得下、按钮统一、页面不横向溢出
   -------------------------------------------------------------------------- */
@media screen and (max-width: 767.98px) {
  /* 站名是**唯一**可收缩的一项：按钮不被压缩，多出来的宽度由省略号吸收。
     这样任意屏宽都不会把整条顶栏顶出屏幕。 */
  html body .main-header.navbar .navbar-header {
    flex: 0 1 auto !important;
    min-width: 0 !important;
    margin-right: 2px !important;
  }

  html body .main-header.navbar .navbar-brand {
    display: block !important;
    min-width: 0 !important;
    max-width: none !important;
    margin: 0 !important;
    padding: 0 2px !important;
    font-size: 12px !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
  }

  /* 两块按钮区：不压缩、不换行；折叠区吃掉中间空档，把右侧推到底 */
  html body .main-header.navbar .navbar-collapse {
    flex: 0 0 auto !important;
    min-width: 0 !important;
    margin-right: auto !important;
  }

  html body .main-header.navbar .navbar-custom-menu {
    flex: 0 0 auto !important;
    min-width: 0 !important;
  }

  html body .main-header.navbar .navbar-collapse > .navbar-nav,
  html body .main-header.navbar .navbar-custom-menu > .navbar-nav {
    flex-wrap: nowrap !important;
    align-items: center !important;
  }

  /* 每一颗都是 36x36 正方形 —— 「通知」那颗原来 40x40（外层 li 在画按钮），
     其余 40x32，一行里两种高度。这里把两种画法统一成同一档。 */
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > li[data-notifications] {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 36px !important;
    min-width: 36px !important;
    height: 36px !important;
    min-height: 36px !important;
    margin: 0 2px !important;
    padding: 0 !important;
    flex: 0 0 auto !important;
  }

  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > li[data-notifications] > .nav-link {
    width: 100% !important;
    min-width: 0 !important;
    height: 100% !important;
    min-height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    gap: 0 !important;
    justify-content: center !important;
    align-items: center !important;
    font-size: 0 !important;
    line-height: 1 !important;
  }

  /* 图标：单独给字号，水平垂直都居中 */
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link > i,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link > i {
    width: 16px !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: 1 !important;
    text-align: center !important;
    order: 0 !important;
  }

  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link::after,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link::after {
    order: 0 !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: 1 !important;
  }

  /* 头像去掉 mr-2、缩到按钮里 */
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link img.bs-avatar,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link picture {
    width: 28px !important;
    height: 28px !important;
    margin: 0 !important;
    flex: 0 0 auto !important;
  }

  /* 图标档：链接里的文字全部视觉收起（保留读屏），未读角标除外 */
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link > span:not([class*="badge"]),
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link > span:not([class*="badge"]) {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
  }
}

/* 最窄一档（320 等）：按钮再收一档，七颗仍在同一行，站名保留 70px 以上 */
@media screen and (max-width: 360px) {
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > li[data-notifications] {
    width: 32px !important;
    min-width: 32px !important;
    height: 32px !important;
    min-height: 32px !important;
    margin: 0 1px !important;
  }

  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link > i,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link > i,
  html body .main-header.navbar .navbar-collapse .navbar-nav > .nav-item > .nav-link::after,
  html body .main-header.navbar .navbar-custom-menu .navbar-nav > .nav-item > .nav-link::after {
    font-size: 14px !important;
  }

  html body .main-header.navbar .navbar-brand {
    font-size: 11px !important;
  }
}

/* --------------------------------------------------------------------------
   88.3 皮肤库：手机一行两张
   --------------------------------------------------------------------------
   手机上一行一张的根因不在列表容器，而在**卡片自己的宽度**：

       .css-18dz75c { width: 245px }        ← 皮肤卡片是 React 的 CSS-in-JS，
                                              固定 245px（运行时注入的 <style>）

   包着它的 <a class="ml-3 mr-2 mb-2 d-block"> 是 flex item，宽度由内容撑开，
   于是 390 视口下容器 331px 只放得下一张。把容器改成 CSS Grid、把宽度交回网格，
   卡片才会等宽并排 —— 不用改 JS，也不用动 React 组件。

   作用域用 body.layout-top-nav 收在皮肤库这几页（skinlib/base.twig，只有
   皮肤库 / 皮肤详情 / 上传三个页面用它），用户中心（sidebar-mini）不受影响。

   权重：第 71/74/77 节那几条也都是 .card-body .d-flex.flex-wrap 前缀，
   本段一律 body.layout-top-nav + 完整层级 + !important，稳定压住。
   -------------------------------------------------------------------------- */
@media screen and (max-width: 767.98px) {
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    column-gap: 10px !important;
    row-gap: 10px !important;
    align-items: stretch !important;
  }

  /* 原来挂在 a 上的 ml-3 / mr-2 / mb-2 交给网格的 gap */
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap > a.d-block {
    display: block !important;
    width: auto !important;
    min-width: 0 !important;
    margin: 0 !important;
    align-self: stretch !important;
  }

  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap > a.d-block > .card {
    width: 100% !important;
    min-width: 0 !important;
    max-width: none !important;
    height: 100% !important;
    margin-bottom: 0 !important;
  }

  /* 两列之后卡片只有 ~160px，内边距收一档，预览图才不至于太小 */
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap > a.d-block > .card > .card-body {
    padding: 12px !important;
  }

  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap > a.d-block > .card > .card-footer {
    padding: 10px 12px !important;
  }

  /* 预览图按原图比例（430x437）给高度：既不拉伸，也不留一大片空白；
     图挂了 aspect-ratio 仍然撑住高度，不会塌成一条 */
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap img.card-img-top {
    width: 100% !important;
    height: auto !important;
    min-height: 0 !important;
    aspect-ratio: 430 / 437;
    object-fit: contain !important;
  }

  /* 卡片里的文字允许收缩，交给省略号（撑不破卡片） */
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer .badge,
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer span,
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer .d-flex {
    min-width: 0 !important;
  }

  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer .badge[class*="css-"] {
    max-width: 72px !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
    padding: 0 6px !important;
  }

  /* 收藏（♥ + 数字）：320 下原来会折成两行（♥ 与数字分开）并顶出卡片 */
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer a[tabindex="-1"],
  body.layout-top-nav .card > .card-body > .d-flex.flex-wrap .card-footer a[tabindex="-1"] > span {
    display: inline-flex !important;
    align-items: center !important;
    flex: 0 0 auto !important;
    white-space: nowrap !important;
  }
}
