/* 2026-09-25：本文件内容原为 content/partials/head.php 里的内联 <style> 块，为配合严格 CSP（内联样式会被浏览器拦截）
   与 EdgeOne /assets/* 365 天缓存而原样迁出。修改后请递增 ASSET_VERSION。*/
        /* ── 毛玻璃总开关（唯一旋钮）2026-09-20 ──────────────────────────────
           改 --glass-base 这一个数，全站所有毛玻璃面同步变透/变实：
             .20 = 很透（背景纹路明显） | .30 = 当前值 | .50 ≈ 很实（接近纯色）
           ⚠️ 两个例外 —— **不跟随 base**（2026-10-06 用户要求）：
             · 导航栏 --glass-nav = .80：吸顶 chrome，文字直接压在随机壁纸上，
               跟随 base 会明显发虚。桌面端 / 移动端 / 移动端桌面模式一律 .80。
             · 导航栏里的下拉菜单（.navbar .dropdown-menu，把 --glass-overlay 在
               导航栏作用域内也钉成 .80）：与导航栏同档，避免「实底导航 + 虚顶下拉」。
           其余面块一律 = base（2026-09-30 起取消分档），相对层次不变。
           ✅ 2026-09-24 起错误页已改为 PHP 渲染（public/403.php、public/404.php，复用本文件与
              navbar/footer 共用 partial），public/404.html、public/403.html 两个静态副本已删除 ——
              不再需要「改三处」。
              一步到位：`sudo /usr/local/bin/glass-set.sh 0.28`（改本文件 + 递增版本号 + purge CDN）。
              ⚠️ 该脚本只改 --glass-base；导航栏的 .80 是固定在 --glass-nav 上的，不受影响。
           面板式调试：任意页面 URL 加 ?glass（例 https://3z.ink/?glass）→ 右下角出现可拖滑块，
           实时预览、可保存到本机（只影响你自己的浏览器），满意了把数字告诉我就行。
           ⚠️ ?glass 滑块同样只动 --glass-base，导航栏不会跟着变（这是设计如此）。 */
        :root {
            /* 2026-10-06 用户要求：全站由 .50 下调到 **.30**（更透、背景纹路更明显）；
               导航栏与其下拉菜单单独保持 **.80**（见上方例外说明）。
               2026-09-30 起所有面（页脚 / 英雄区 / 一言卡 / 文章卡片 / 面板 / 正文区 / 目录 /
               chip / 链接卡 / 侧栏 / 回顶 / 弹窗 / 输入框）都等于 base，取消分档。
               变量名保留（规则体不必改）；?glass 滑块与 glass-set.sh 照旧可用。
               历史分档（×.55 ~ ×1.35）及其实测依据见 references/frosted-glass-2026-09-18.md 批 8~14。 */
            --glass-base: .30;
            --glass-nav: .80;                    /* 导航栏：固定 .80，不跟随 base（2026-10-06） */
            --glass-foot: var(--glass-base);     /* 页脚 */
            --glass-hero: var(--glass-base);     /* 首页英雄区 */
            --glass-hito: var(--glass-base);     /* 一言卡 */
            --glass-card: var(--glass-base);     /* 文章卡片 / 弹窗 */
            --glass-panel: var(--glass-base);    /* 分类/仓库/关于/推广/赞赏/导航容器/下拉/输入框 */
            --glass-pane: var(--glass-base);     /* 文章正文区 */
            --glass-toc: var(--glass-base);      /* 文章目录 */
            --glass-chip: var(--glass-base);     /* 标签chip/链接卡/侧栏 */
            --glass-float: var(--glass-base);    /* 回顶按钮 */
            --glass-overlay: var(--glass-base);  /* 瞬时覆盖层（下拉 / 弹窗 / 搜索建议） */
        }
        body::before {
            content: "";
            position: fixed;
            inset: 0;
            z-index: -1;
            background-image: linear-gradient(rgba(13, 17, 23, .50), rgba(13, 17, 23, .60)), var(--hero-img, none);   /* 图片 URL 由外部 JS hero-bg.js 注入（内联样式会被严格 CSP 拦）*/
            background-size: cover;
            background-position: center;
            background-repeat: no-repeat;
            pointer-events: none;
        }
        /* ── 毛玻璃（2026-09-18 用户要求，方案1：导航栏/页脚/文章卡片/一言卡）──
           原先这些元素把二次元图「画进自己的 background」再叠深蒙版；现改为：
           半透明底色 + backdrop-filter: blur()（+ -webkit- 前缀供 iOS Safari），
           于是只有 body::before 那一张固定背景图，元素背后透过来被模糊 → 真毛玻璃。
           调强度：改 blur 半径 / saturate 百分比 / rgba 的 alpha（alpha 越大越暗、文字越清晰）。 */

        .navbar {
            background: rgba(13, 17, 23, var(--glass-nav, .21)) !important;
            backdrop-filter: blur(10px) saturate(140%);
            -webkit-backdrop-filter: blur(10px) saturate(140%);
        }
        /* ⚠️ footer 标签带 Bootstrap 的 .bg-dark（工具类 !important 且类比元素选择器优先级高），
           只写 footer{} 会被它压住 → 用 footer.bg-dark 这种「类级」选择器。
           （2026-09-18 实测发现：footer 此前一直没吃到背景图，原来是纯 #212529 实色） */
        footer,
        footer.bg-dark {
            background: rgba(13, 17, 23, var(--glass-foot, .17)) !important;
            backdrop-filter: blur(10px) saturate(140%);
            -webkit-backdrop-filter: blur(10px) saturate(140%);
        }
        .article-card {
            background: rgba(13, 17, 23, var(--glass-card, .38)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
        }
        /* ── 毛玻璃补齐（2026-09-19 用户反馈：分类/标签/导航/GitHub/关于/赞赏/推广等页面的内容面还是实心色）──
           参数与文章卡片同一档（.46 + blur(8px) saturate(140%)，2026-09-19 调透后）。
           注意 GPU：一张页面里 backdrop-filter 元素太多会明显变卡（导航页 200+ 个 link-card、标签云 75 个 chip），
           所以只给「每页几个～十几个」的大面块上 blur；密集小元素沿父容器的半透明底走，不加 blur。 */
        .cat-card, .repo-card, .about-card, .promo-card, .support-option, .nav-container {
            /* 2026-09-19 用户反馈「毛玻璃太实、看不太清背景」→ 全站 alpha 下调、blur 12→8~10px；
               本组从 .68 一路降到 .46（比文章卡片 .44 略实一档，因为这些面块里次级灰字多）。
               壁纸是随机图（dmoe_random_bg_url()），若换到高亮壁纸觉得刺眼，把这一档 alpha 往上调。 */
            background: rgba(13, 17, 23, var(--glass-panel, .40)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
        }
        /* ⚠️ chip 元素同时带 Bootstrap 的 .bg-secondary（`.badge.bg-secondary` 是 0,2,0 的 !important 规则），
           只写 `.glass-chip`（0,1,0）压不住 → 必须用同优先级的 `.badge.glass-chip`，
           且在 head.php 内联块里出现得比外部样式表晚，才能赢（2026-09-19 实测：改前计算值是实色 rgb(33,38,45)）*/
        .link-card, .cat-sidebar, .glass-chip,
        .badge.glass-chip, .badge.bg-secondary.glass-chip {
            background: rgba(33, 38, 45, var(--glass-chip, .29)) !important;
        }
        /* ── 弹窗 / 下拉菜单也玻璃化（2026-09-19 用户反馈：导航栏「文章分类」弹窗没有毛玻璃）──
           .modal-content 带 Bootstrap 的 .bg-dark（#212529 实色）→ 选择器要写 .modal-content.bg-dark；
           弹窗背后的遮罩默认 opacity .5，会把页面压到近乎全黑、玻璃就看不出东西 → 降到 .38。 */
        .modal-content, .modal-content.bg-dark {
            background: rgba(13, 17, 23, var(--glass-overlay, .48)) !important;
            backdrop-filter: blur(10px) saturate(140%) !important;
            -webkit-backdrop-filter: blur(10px) saturate(140%) !important;
        }
        .modal-backdrop {
            opacity: .38 !important;
        }
        .dropdown-menu, .dropdown-menu.bg-dark {
            background: rgba(13, 17, 23, var(--glass-overlay, .48)) !important;
            backdrop-filter: blur(10px) saturate(140%) !important;
            -webkit-backdrop-filter: blur(10px) saturate(140%) !important;
            /* 悬停/按下反馈色必须**比底更深**（站内既定教训：浅色文字 + 半透明底时，
               提亮式反馈等于把可读性往外送）。原值 rgba(88,166,255,.08) 是提亮 ⇒ 改暗色。
               .active 项原为实心 #58a6ff + 白字 ≈ 2.4:1 ✗ ⇒ 改深蓝底，白字落到 ~7:1。 */
            --bs-dropdown-link-hover-bg: rgba(13, 17, 23, .32);
            --bs-dropdown-link-hover-color: #fff;
            --bs-dropdown-link-active-bg: rgba(88, 166, 255, .22);
            --bs-dropdown-link-active-color: #fff;
        }
        /* ⚠️ 导航栏里的下拉菜单（#navMoreMenu 等）与导航栏同档 .80（2026-10-06 用户要求
           「导航栏（包括下拉菜单）」）。做法是**只在导航栏作用域内重定义变量**，不重写 background ——
           规则体、blur 半径、hover/active 反馈色与原实现完全一致，只换 alpha。
           （选择器 .navbar .dropdown-menu 为 0,2,0，压得住上面的 .dropdown-menu 0,1,0，无需 !important。） */
        .navbar .dropdown-menu,
        .navbar .dropdown-menu.bg-dark {
            --glass-overlay: .80;
        }
        /* ── 搜索弹窗内的搜索框宽度（2026-09-30 用户反馈"宽度没做响应式"）──
           根因：弹窗里的输入框复用了导航栏那套 `.search-nav-form/.search-nav-input`，
           而那套是为**窄导航栏**设计的：form max-width 220px、input max-width 160px
           （那两处只在 max-width:991px 的媒体查询里放开，是给"导航栏收折成整行"用的）。
           ⇒ 宽视口（≥768px）下弹窗内容区有 466px，输入框却只有 160px，右侧空 246px。
           修法：**只在弹窗内**放开上限（ID 选择器 1,1,0 稳压 .class 0,1,0，无需 !important），
                  导航栏里那个窄搜索框的设计不受影响。 */
        #searchModal .search-nav-form {
            max-width: none;
            width: 100%;
        }
        #searchModal .search-nav-input,
        #searchModal .search-nav-input.form-control {
            max-width: none;
            min-width: 0;   /* 只放开上限；⚠️ 千万别再写 width:100% —— input-group 是 flex-wrap 容器，
                               input 占满整行会把提交按钮挤到下一行（实测确认过）。宽度交给 flex 分配。 */
        }
        /* ── 页面级内容面板（2026-09-30 用户反馈"内容直接在二次元图片上"）──
           根因：全站玻璃是**按元素逐个声明**的（类名在 --glass-* 名单里才有玻璃），
           而页面级标题/副标题/统计行/说明这类"没有自己面"的内容从未被包住 ⇒
           直接压在 body::before 那张壁纸上（该壁纸只被一个固定渐变压暗一档，与玻璃开关无关，
           所以调 base 对它们零效果）。实测全站共 19 个这样的裸文字节点，分布在 8 个页面。
           修法照站内既有模式（文章页的 main.reading-pane）：给 <main> 一层同值玻璃底。
           排除首页（有 hero/卡片自己的层次，需露出壁纸）与文章页（已有 reading-pane）。 */
        main.container.py-4:not(.reading-pane):not(:has(.hero-section)),
        /* 独立页（nav.php / github-hot.php）不用框架的 <main>，而是 <div class="container py-4">
           直接挂在 body 下（实测 `main.container.py-4` 选择器因此漏掉这两页）。 */
        body > div.container.py-4 {
            background: rgba(13, 17, 23, var(--glass-base)) !important;
            backdrop-filter: blur(10px) saturate(140%);
            -webkit-backdrop-filter: blur(10px) saturate(140%);
            border-radius: .5rem;
        }
        /* ── 列表头（2026-10-01 统一排法，六处共用）──
           结构由 render_list_header()（content/modules/helpers.php）产出：
           左边「图标 + 标题」，右边统计「第 X-Y 篇 / 共 N 篇」，整条与文章卡片同宽。
           2026-10-01 之前的形态是两者紧挨在同一个 flex 里、统计与标题同为纯白 24px/14px 基线对齐，
           读起来就是一整句「全部文章第 1-5 篇 / 共 179 篇」，且底板只有文字那么宽、像可点的筛选按钮。
           现在：统计推到最右（margin-left:auto，窄屏折行时也仍然靠右）、降为 .875rem 次要色，
           底板宽度与卡片外缘对齐（原来 padding 0 .75rem + margin-left -.75rem 会把底板左缘顶出 12px）。 */
        main.container > h4.list-header {
            background: rgba(13, 17, 23, var(--glass-base)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
            border-radius: .375rem;
            padding: .375rem .75rem;
            margin-left: 0;
        }
        /* 分类/标签/全部分类/标签云/搜索 这些页面已经有「页面级玻璃面板」（见上方那条规则），
           整页就是一块玻璃 ⇒ 列表头不再叠同色玻璃（实测叠两层会明显变暗成另一档色），
           只保留同一套排法：左右两端对齐、左边距与文章卡片文字对齐。 */
        main.container.py-4:not(.reading-pane):not(:has(.hero-section)) > h4.list-header {
            background: transparent !important;
            backdrop-filter: none;
            -webkit-backdrop-filter: none;
            padding-left: 0;
            padding-right: 0;
        }
        main.container > h4.list-header > .list-header-title {
            display: inline-flex;
            align-items: baseline;
            gap: .5rem;
        }
        /* 统计文字：h4 是 1.5rem ⇒ <small> 默认 .875em 会被放大成 21px，必须钉回 14px */
        main.container > h4.list-header > .list-header-stat {
            font-size: .875rem;
            font-weight: 400;
            color: rgba(240, 246, 252, .78);   /* 实测 6 次不同壁纸：.66 时最差仅 4.53:1（贴 AA 边缘），.78 ≈ 5.4:1 */
            margin-left: auto;      /* 推到最右；窄屏折行时也仍然是靠右 */
            white-space: nowrap;
        }
        @media (max-width: 575.98px) {
            main.container > h4.list-header > .list-header-stat { font-size: .8125rem; }
        }
        /* ── 英雄区三块统计（文章数 / 分类数 / 标签数）压成一行（2026-09-30 用户要求）──
           实测基线：三块合计需 464px，而 390px 手机可用 300px、320px 只有 230px
           ⇒ 原来 <768px 必然换行（320/360 三行、390/414/576 两行）。
           做法：窄屏收紧字号/内边距 + 容器不换行；文案同时去掉「共」以省宽度。
           ⚠️ badge 上的 fs-6/px-3/py-2 与容器的 flex-wrap/gap-2 都是 Bootstrap 的 **!important 工具类**
              ⇒ 普通覆盖无效，连内联样式也压不住，这里必须同样带 !important。
           实测（真浏览器 320/360/375/390/414/430/576/600/768/992/1280/1600 全档）：
           三块恒为 1 行、内部溢出 0、页面横向溢出 0；320px 时需 230px = 可用 230px（正好卡满，
           故下方 overflow-x 是给「文章数涨到 4 位数」留的保险：未来若超宽只内部可滚，不会撑破页面）。 */
        @media (max-width: 767.98px) {
            .hero-section .hero-stats {
                flex-wrap: nowrap !important;
                gap: .2rem !important;
                overflow-x: auto;
                scrollbar-width: none;          /* 当前不溢出 ⇒ 平时看不到滚动条 */
            }
            .hero-section .hero-stats::-webkit-scrollbar { display: none; }
            .hero-section .hero-stats .badge {
                font-size: .7rem !important;
                padding: .2rem .25rem !important;
                white-space: nowrap !important;
            }
            .hero-section .hero-stats .badge i { margin-right: .1rem !important; }
        }
        /* ── 推广页 9 条推广项（2026-09-30 用户反馈"内容直接在二次元图片上"）──
           根因：这些 .promo-item 在 .promo-card **外面**（卡片只包了标题），且自身带 Bootstrap 的
           `.bg-transparent`（background:transparent !important、0,1,0）⇒ 从来没有玻璃底，
           只是被 body::before 那个**固定渐变**压暗一档，所以调 base 对它零效果。
           修法：同形选择器 + !important（后声明的 !important 压前声明的），并入全站同值。 */
        .promo-item, .promo-item.bg-transparent {
            background: rgba(13, 17, 23, var(--glass-base)) !important;
            backdrop-filter: blur(10px) saturate(140%);
            -webkit-backdrop-filter: blur(10px) saturate(140%);
        }
        /* 搜索建议下拉：原是全站唯一的**不透明**底色 rgb(22,27,34)，与别处不一致；
           并入同一覆盖层档（实测可读性 ≥6:1）。桌面与"搜索弹窗内"两种位置都覆盖。 */
        .nav-search-dropdown {
            background: rgba(13, 17, 23, var(--glass-overlay, .48)) !important;
            backdrop-filter: blur(10px) saturate(140%) !important;
            -webkit-backdrop-filter: blur(10px) saturate(140%) !important;
        }
        .nav-search-item:hover, .nav-search-all:hover {
            background: rgba(13, 17, 23, .32) !important;
            color: #fff !important;
        }
        /* ⚠️ 光设 --bs-dropdown-link-hover-bg 不够：style.v21.css 里有一条
           `.navbar .dropdown-item:hover { background-color: rgba(88,166,255,.08) }`（0,3,0，硬编码字面量、不读变量）
           把变量方案压住了（实测计算值仍是那个提亮蓝）。必须按同形选择器直接覆盖。 */
        .navbar .dropdown-item:hover,
        .navbar .dropdown-item:focus,
        .navbar .dropdown-item.active {
            background-color: rgba(13, 17, 23, .32) !important;
            color: #fff !important;
        }
        /* ── 文章内容区也玻璃化（2026-09-19 用户要求）──
           注意选择器必须与 style.vN.css 里那条同形（`main.reading-pane`，0,1,1）：
           只写 `.reading-pane` 优先级不够，会压不住原规则（原规则是实心 #0d1117）。
           长文正文用比卡片略高的 alpha（.48），保证滚动时遇到亮色壁纸也不掉太多对比度；
           代码块 / 表格 / 行内 code 保持不透明（语法高亮配色是按深底调的，透底会掉可读性）。 */
        main.reading-pane {
            /* alpha 取 .48（2026-09-19 从 .74 连降两轮）：正文投影面积最大，用户明确要求能看清背后壁纸；
               .74 时实测与实心几乎无差（「跟纯色差不多」），.48 时壁纸纹理明显、正文对比度仍在中位 16:1 一档 */
            background: rgba(13, 17, 23, var(--glass-pane, .41)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
        }
        .toc {
            background: rgba(22, 27, 34, var(--glass-toc, .31)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
        }
        /* ── 全站字色统一亮白（2026-09-20 用户要求）────────────────────────
           正文级颜色（含次级灰/面包屑/占位符/统计小字/卡内摘要/文章目录）全部 #f0f6fc；
           style.vN.css 里已把 --text-primary/--text-secondary/--text-tertiary 与 30+ 处字面量统一，
           这里再兜住 Bootstrap 的工具类与占位符，避免个别元素仍退回灰字。
           刻意保留：链接蓝 #58a6ff（及悬停 #6ea8fe）、GitHub 星标金 #d29922、
                     代码块语法高亮配色、浅底徽章上的蓝字（.text-primary，在亮底上换白会看不见）。 */
        .text-muted, .text-body-secondary, .text-body-tertiary, .text-black-50, .text-white-50,
        .btn-outline-secondary, .btn-outline-light, .page-link.disabled,
        .form-control::placeholder, .form-control-plaintext,
        .text-light {
            color: #f0f6fc !important;
        }

        /* ── 交互态字色（2026-09-27 修：推广页「立即前往」点击后看不清）──────────
           上面那条 !important 把 .btn-outline-light/.btn-outline-secondary 的字色钉成亮白，
           而 Bootstrap 的 outline 按钮在 hover/active/focus 会**填充底色**（light 填白、secondary 填灰）
           ⇒ 白底 + 亮白字，实测对比度 1.02:1（远低于 WCAG AA 4.5:1），触摸屏 tap 后 :hover 残留，症状会一直挂着。
           修法：交互态改用 Bootstrap 自己的前景色配对（light→#000、secondary→#fff），
           底色填充保持原样——那是这些按钮唯一的交互反馈，不要一并去掉。 */
        /* 交互态（2026-09-27 第二版，按用户反馈定稿）：
           Bootstrap 的 outline 按钮在 hover/active/focus 会**填充底色**（light 填白、secondary 填灰）——
           ① 暗色主题上那块白底本身就难看；② 按钮里的图标被 page-promotion.css 钉成 #f0f6fc 亮色，
             压在**白底上直接消失**（用户反馈「后面图标还是看不见」）。
           ⇒ 定稿：交互态**不填底**，字色与图标都保持按钮本来的颜色（--bs-btn-color）；
             键盘聚焦的可见性交给 Bootstrap 的 :focus-visible box-shadow（**不要一并去掉**，
             那是 WCAG 2.4.7 的焦点可见要求）。 */
        .btn-outline-light:hover, .btn-outline-light:focus,
        .btn-outline-secondary:hover, .btn-outline-secondary:focus,
        .btn-outline-light:active, .btn-outline-light.active,
        .btn-outline-secondary:active, .btn-outline-secondary.active {
            /* 淡**暗**色底：同载入实测，淡亮色底会把浅色文字对比度平均拉低 ~3:1
               （最坏 4.09:1 → 3.35:1 ✗）；淡暗色底则把对比度升高，且悬停反馈同样明显。 */
            background-color: rgba(13, 17, 23, .28) !important;
            /* 交互态字色：用站内统一亮白 #f0f6fc（实测 --bs-btn-color=#f8f9fa 其实有值、
               两者只差 2 个色阶；写死是为了跟站内「统一亮白」政策一致，不依赖 Bootstrap 版本）。 */
            color: #f0f6fc !important;
        }
        /* 例外（2026-09-27 用户反馈「点击目录按钮后怎么有个背景」）：
           导航栏里的图标按钮（搜索 / 目录）交互态**一律不填底** —— 真机点击后 :focus/:hover 会残留，
           按钮上就留一个方块；它们的功能反馈由弹窗本身承担。推广页 CTA 按钮保持上面的淡暗底。 */
        .nav-actions .btn-outline-light:hover, .nav-actions .btn-outline-light:focus,
        .nav-actions .btn-outline-light:active,
        #tocNavBtn:hover, #tocNavBtn:focus, #tocNavBtn:active {
            background-color: transparent !important;
        }
        /* Bootstrap 变量驱动的字色（.card 等继承的是 --bs-body-color，实测是 #dee2e6 的浅灰）也一并统一 */
        /* ── 去掉全站装饰性边框（2026-09-20 用户要求）──────────────────────
           做法：把“装饰性”边框色变量置为透明（站内 --border-color 已在 CSS 里改为 transparent），
           这里再兜住 Bootstrap 侧：--bs-border-color / --bs-border-color-translucent 覆盖卡片/输入框/
           弹窗/下拉/list-group/面包屑等的描边。
           刻意保留：按钮边框（.btn-outline-* 的描边是按钮本体）、表格行线（走 --border-line）、
                     键盘焦点框（outline/box-shadow，无障碍必需）。 */
        /* ── 面包屑也玻璃化（2026-09-20 用户要求：全站统一）────────────────────
           面包屑是每页顶部的小条，尺寸与标签 chip 同档 → 挂 --glass-chip 系数。
           ⚠️ 原规则在 style.v21.css 里是 background-color: var(--bg-secondary)（实色），
              本块在它之后又带 !important，才压得住；两处值不要各写一套。 */
        .breadcrumb {
            background: rgba(13, 17, 23, var(--glass-chip, .145)) !important;
            backdrop-filter: blur(8px) saturate(140%);
            -webkit-backdrop-filter: blur(8px) saturate(140%);
        }

        hr { border-top-color: transparent !important; }
        /* 2026-09-20 用户要求“全部边框都去掉”：按钮（含 outline 系列）、回顶按钮、分页
           都去描边。用 --bs-btn-border-color 置透明可一次性覆盖 Bootstrap 全部 .btn-outline-* 变体。
           刻意保留：键盘焦点框（outline，平时不可见、无障碍必需）、加载 spinner。 */
        .btn { --bs-btn-border-color: transparent !important; border-color: transparent !important; }
        .btn-outline-primary, .btn-outline-light, .btn-outline-secondary,
        .btn-secondary, .btn-sm, .btn-primary, .btn-danger { border-color: transparent !important; }
        #backToTop, .back-top-btn, .page-link, .page-item .page-link { border-color: transparent !important; }
        /* Bootstrap 的边框工具类（.border-secondary 等，弹窗头/尾常用）同样去掉 */
        .border-secondary, .border-light, .border-dark, .border-primary, .border-info,
        .border-success, .border-warning, .border-danger, .border-white, .border-black {
            border-color: transparent !important;
        }
        :root, [data-bs-theme="dark"], [data-bs-theme="light"] {
            --bs-border-color: transparent;
            --bs-border-color-translucent: transparent;
            --bs-body-color: #f0f6fc;
            --bs-secondary-color: #f0f6fc;
            --bs-tertiary-color: #f0f6fc;
            --bs-emphasis-color: #f0f6fc;
            --bs-heading-color: #f0f6fc;
        }
        /* 文章目录：条目改亮白（用户 2026-09-20 要求），悬停时才显示链接蓝 */
        .toc a { color: #f0f6fc !important; }
        .toc a:hover { color: var(--accent-blue, #58a6ff) !important; }
        /* ── 背景粒子层（hero-particle-v1.js 创建；2026-10-19 还原）──────────────
           固定铺满视口、不参与滚动、不吃鼠标事件。z-index:-1 与 body::before 同层，
           但 canvas 是 body 的子节点、排在 ::before 之后绘制 → 粒子压在压暗渐变之上、
           正文（z-index:auto）之下。毛玻璃面板的 backdrop-filter 会把粒子一起糊掉，
           这正是「玻璃后面有粒子」的效果。开了「减少动效」的用户直接隐藏。 */
        #hero-particle {
            position: fixed;
            inset: 0;
            width: 100%;
            height: 100%;
            z-index: -1;
            pointer-events: none;
            display: block;
        }
        @media (prefers-reduced-motion: reduce) {
            #hero-particle { display: none; }
        }
