/* ============================================================
   CSS 变量定义 - 集中管理所有颜色和尺寸
   ============================================================ */
:root {
    /* Minecraft 核心配色（按钮等保留元素） */
    --mc-dirt-brown: #79553D;
    --mc-dirt-dark: #5A3D2B;
    --mc-grass-green: #5B8C3E;
    --mc-grass-light: #7CB342;
    --mc-stone-gray: #7D7D7D;
    --mc-stone-light: #A0A0A0;
    --mc-stone-dark: #4A4A4A;
    --mc-button-bg: #6B6B6B;
    --mc-button-hover: #8B8B8B;
    --mc-button-border-light: #A8A8A8;
    --mc-button-border-dark: #3F3F3F;
    --mc-accent-gold: #FFAA00;

    /* 新UI颜色变量（文字改为黑色） */
    --bg-image: url('../assets/images/backgrounds/bg1.webp'); /* 调整路径 */
    --blur-amount: 4px;
    --overlay-bg: rgba(255, 255, 255, 0.2);
    --panel-bg: rgba(255, 255, 255, 0.75);
    --panel-bg-hover: rgba(255, 255, 255, 0.85);
    --panel-border: rgba(255, 255, 255, 0.5);
    --text-primary: #222222;
    --text-secondary: #333333;
    --text-muted: #555555;
    --accent-green: #2E7D32;
    --color-black: rgb(0, 0, 0);

    /* 尺寸变量 */
    --header-height: 64px;
    --content-max-width: 1100px;
    --card-border-radius: 6px;
    --pixel-border: 3px;
    --category-gap: 16px;
    --sidebar-width: 220px;
    --sidebar-gap: 20px;
    --sidebar-left: 20px;
    --sidebar-toggle-width: 40px;
    --sidebar-header-gap: 4px;
}

/* ============================================================
   全局样式重置
   ============================================================ */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html {
    scroll-behavior: smooth;
    scrollbar-gutter: stable;
    /* 手机端：阻止整页被"橡皮筋"过卷到页脚下方；并禁掉 iOS 横屏自动放大字号 */
    overscroll-behavior-y: none;
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
}

body {
    font-family: 'Press Start 2P', 'Courier New', 'Microsoft YaHei', 'PingFang SC', sans-serif;
    background-color: #ffffff;
    color: var(--text-primary);
    /* 整页改成纵向 flex：页脚用 margin-top:auto 永远跟在内容之后，
       内容不足一屏时也不会浮在半空；配合 100dvh 解决手机端可滚到页脚下面 */
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    min-height: 100dvh;
    line-height: 1.6;
    -webkit-font-smoothing: none;
    font-smooth: never;
    position: relative;
    overflow-x: hidden;
    overflow-y: scroll;

    background: var(--bg-image) no-repeat center center fixed;
    background-size: cover;
}

/* 背景模糊层 */
body::before {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: var(--bg-image) no-repeat center center fixed;
    background-size: cover;
    filter: blur(var(--blur-amount));
    z-index: -1;
}

body::after {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: var(--overlay-bg);
    z-index: -1;
    pointer-events: none;
}

.mc-header, .mc-main, .mc-footer {
    position: relative;
    z-index: 1;
}

/* 自定义滚动条 */
::-webkit-scrollbar {
    width: 10px;
    height: 10px;
}
::-webkit-scrollbar-track {
    background: rgba(0, 0, 0, 0.1);
    border: 2px solid rgba(0, 0, 0, 0.2);
}
::-webkit-scrollbar-thumb {
    background: rgba(0, 0, 0, 0.3);
    border: 2px solid rgba(0, 0, 0, 0.4);
}
::-webkit-scrollbar-thumb:hover {
    background: rgba(0, 0, 0, 0.5);
}

/* 顶部导航栏 */
.mc-header {
    position: sticky;
    top: 0;
    z-index: 100;
    background: rgba(255, 255, 255, 0.7);
    backdrop-filter: blur(8px);
    border-bottom: 1px solid rgba(255, 255, 255, 0.5);
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
    height: var(--header-height);
    display: flex;
    align-items: center;
    /* 原来是 space-between；多了 .mc-header-textnav 这一层之后，
       三个孩子会被"中间居中"，所以改成左对齐 + 右组 margin-left:auto 顶到右边 */
    justify-content: flex-start;
    gap: 16px;
    padding: 0 24px;
}

.mc-header-left {
    display: flex;
    align-items: center;
    gap: 12px;
    cursor: pointer;
    user-select: none;
}

.mc-logo-img {
    width: 38px;
    height: 38px;
    border-radius: 4px;
    border: 1px solid rgba(0, 0, 0, 0.2);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
    background: rgba(255, 255, 255, 0.5);
    object-fit: cover;
    image-rendering: pixelated;
}

.mc-header-title {
    font-size: 1.1rem;
    color: var(--text-primary);
    text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.6);
    letter-spacing: 1px;
}
.mc-header-title span {
    color: var(--accent-green);
}

.mc-header-right {
    display: flex;
    align-items: center;
    /* 桌面端：图标组顶到最右，文字导航跟在它后面（视觉顺序与改造前一致） */
    margin-left: auto;
    gap: 16px;
    position: relative;  
}

/* 文字导航组：桌面端与图标按钮同排、间距一致；手机端整行换到第二行 */
.mc-header-textnav {
    display: flex;
    align-items: center;
    gap: 16px;
}

.mc-nav-btn {
    background: var(--mc-button-bg);
    color: #FFFFFF;
    border: 2px solid;
    border-color: var(--mc-button-border-light) var(--mc-button-border-dark) var(--mc-button-border-dark) var(--mc-button-border-light);
    padding: 8px 16px;
    font-family: inherit;
    font-size: 0.7rem;
    cursor: pointer;
    text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
    transition: background 0.1s ease, border-color 0.1s ease;
    letter-spacing: 0.5px;
}
.mc-nav-btn:hover {
    background: var(--mc-button-hover);
    border-color: #C0C0C0 var(--mc-button-border-dark) var(--mc-button-border-dark) #C0C0C0;
}
.mc-nav-btn:active {
    border-color: var(--mc-button-border-dark) var(--mc-button-border-light) var(--mc-button-border-light) var(--mc-button-border-dark);
    transform: translateY(1px);
    box-shadow: inset 2px 2px 4px rgba(0, 0, 0, 0.3);
}

/* ==================== 游客模式标识 ==================== */
/* 顶栏小徽章，让未登录的访客一眼看清自己只能浏览。
   用 CSS 类控制显隐，不用内联 style —— 内联样式一旦写上，
   后续用 classList 切换会失效（之前"编辑我的文章"入口消失就是这个原因）。 */
.guest-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 5px 10px;
    font-size: 0.62rem;
    letter-spacing: 0.5px;
    color: #FFFFFF;
    background: var(--accent-green, #2E7D32);
    border: 2px solid;
    border-color: rgba(255, 255, 255, 0.45) rgba(0, 0, 0, 0.35) rgba(0, 0, 0, 0.35) rgba(255, 255, 255, 0.45);
    text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);
    white-space: nowrap;
    user-select: none;
}
/* 游客徽章的短文案：桌面端隐藏，手机端由媒体查询切换显示 */
.guest-badge .badge-short { display: none; }

/* 主内容区域 */
.mc-main {
    max-width: var(--content-max-width);
    margin: 0 auto;
    padding: 32px 20px 60px;
    /* 撑满剩余高度，配合页脚的 margin-top:auto 让它永远贴底。
       width:100% 不能省：flex 子项只要带了 cross 轴的 auto margin 就不再被
       stretch，会缩成 fit-content —— 那会把桌面端 1100px 的版心弄坏。 */
    flex: 1 0 auto;
    width: 100%;
    transition: max-width 0.2s ease;
}

body.detail-mode .mc-main {
    max-width: none;
    padding: 32px 40px 60px;
}

/* 页面切换动画 */
.page-container {
    display: none;
}
.page-container.active {
    display: block;
}

@keyframes mcFadeIn {
    from { opacity: 0; transform: translateY(12px); }
    to { opacity: 1; transform: translateY(0); }
}

/* 首页分类盒子 */
.category-box {
    background: var(--panel-bg);
    backdrop-filter: blur(4px);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    margin-bottom: var(--category-gap);
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
    transition: background 0.2s ease, box-shadow 0.2s ease;
    overflow: hidden;
    cursor: pointer;
}
.category-box:hover {
    background: var(--panel-bg-hover);
    box-shadow: 0 6px 25px rgba(0, 0, 0, 0.15);
}

.category-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 20px;
    user-select: none;
    font-weight: normal;
    -webkit-tap-highlight-color: transparent;
}
.category-icon {
    font-size: 1.5rem;
    filter: drop-shadow(0 2px 3px rgba(0,0,0,0.2));
}
.category-name {
    font-size: 0.9rem;
    color: var(--text-primary);
    letter-spacing: 0.5px;
    flex: 1;
}
.category-arrow {
    font-size: 1.2rem;
    color: var(--text-primary);
}

/* 分类列表页 */
.category-page {
    max-width: var(--content-max-width);
    margin: 0 auto;
}
.category-top-bar {
    display: flex;
    align-items: center;
    gap: 16px;
    margin-bottom: 24px;
    flex-wrap: wrap;
}
.category-title-big {
    font-size: 1.2rem;
    color: var(--text-primary);
    letter-spacing: 1px;
}
.category-items-panel {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 14px;
}

/* 内容卡片 */
.content-card {
    background: rgba(255, 255, 255, 0.6);
    backdrop-filter: blur(2px);
    border: 1px solid rgba(255, 255, 255, 0.7);
    border-radius: 4px;
    padding: 14px 16px;
    cursor: pointer;
    transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.content-card:hover {
    background: rgba(255, 255, 255, 0.8);
    transform: translateY(-2px);
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.12);
}
.content-card:active {
    transform: translateY(2px) scale(0.97);
    background: rgba(255, 255, 255, 0.75);
}
.content-card-title {
    font-size: 0.9rem;
    color: var(--text-primary);
    line-height: 1.4;
}
.content-card-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    margin-top: auto;
}
.content-tag {
    font-size: 0.65rem;
    padding: 3px 8px;
    background: rgba(0, 0, 0, 0.1);
    color: var(--text-primary);
    border: 1px solid rgba(0, 0, 0, 0.15);
    border-radius: 2px;
}
.content-tag.highlight {
    background: var(--mc-accent-gold);
    color: #1A1A1A;
    border-color: #B8860B;
}

/* ==================== 特殊标签徽章（置顶 / 仅正式成员） ====================
   这两个是"保留标签"：只要在文章的标签框里写上这几个字就生效
   （规则见后端 utils/articleTags.js）。
   它们不做成普通标签块，而是单独渲染成徽章，所以有自己的样式。 */
.special-badge {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: 0.65rem;
    line-height: 1.4;
    padding: 3px 8px;
    border-radius: 2px;
    font-weight: 600;
    white-space: nowrap;
    border: 1px solid transparent;
}
.badge-pin {
    background: var(--mc-accent-gold);
    color: #1A1A1A;
    border-color: #B8860B;
}
.badge-members {
    background: rgba(59, 130, 246, 0.18);
    color: #60A5FA;
    border-color: rgba(96, 165, 250, 0.5);
}
/* 卡片上的徽章：**压在封面左上角**，不占正文的流式高度。
   卡片是固定 140px 高 + overflow:hidden，如果在文字区里加一行徽章，
   摘要就有被裁掉的风险 —— 浮层则完全不影响原有排版。 */
.card-badges {
    position: absolute;
    top: 8px;
    left: 8px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
    z-index: 2;
    pointer-events: none;      /* 点徽章等同于点卡片 */
}
.card-badges .special-badge {
    padding: 2px 6px;
    font-size: 0.6rem;
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
}
/* .detail-tags 本来就是 flex + gap，这里不用再加外边距 */

/* 详情页 meta 行里各项的文字（CSS 用类名匹配，不依赖标签，
   所以即使不是 span 也能命中） */
.detail-meta .label {
    color: var(--text-muted);
    margin-right: 2px;
}

/* 详情页布局 */
.detail-page {
    max-width: none;
    margin: 0;
    padding: 0 40px;
}
.detail-top-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 24px;
    flex-wrap: wrap;
    margin-left: calc(var(--sidebar-left) + var(--sidebar-width) + var(--sidebar-gap));
}

.mc-back-btn {
    background: var(--mc-button-bg);
    color: #FFFFFF;
    border: 3px solid;
    border-color: var(--mc-button-border-light) var(--mc-button-border-dark) var(--mc-button-border-dark) var(--mc-button-border-light);
    padding: 10px 20px;
    font-family: inherit;
    font-size: 0.7rem;
    cursor: pointer;
    text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
    transition: background 0.1s ease, border-color 0.1s ease, transform 0.1s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    letter-spacing: 0.5px;
}
.mc-back-btn:hover {
    background: var(--mc-button-hover);
    border-color: #C0C0C0 var(--mc-button-border-dark) var(--mc-button-border-dark) #C0C0C0;
}
.mc-back-btn:active {
    border-color: var(--mc-button-border-dark) var(--mc-button-border-light) var(--mc-button-border-light) var(--mc-button-border-dark);
    transform: translateY(2px) scale(0.95);
}
.mc-back-btn .arrow-icon {
    font-size: 1rem;
}

.detail-breadcrumb {
    font-size: 0.8rem;
    color: var(--color-black);
    letter-spacing: 0.5px;
}
.detail-breadcrumb a {
    color: var(--color-black);
    text-decoration: none;
    cursor: pointer;
}
.detail-breadcrumb a:hover {
    text-decoration: underline;
}
/* 面包屑里"分类"那一小段可点击文字（与 .detail-breadcrumb a 同款，单独成类
   是因为它是由 JS 动态插入的，不带 a 标签的选择器也需命中） */
.breadcrumb-link {
    color: var(--color-black);
    text-decoration: none;
    cursor: pointer;
}
.breadcrumb-link:hover {
    text-decoration: underline;
}

/* 侧边栏固定到屏幕左侧 */
.detail-layout {
    display: block;
}
.detail-sidebar {
    position: fixed;
    left: var(--sidebar-left);
    top: calc(var(--header-height) + 20px);
    width: var(--sidebar-width);
    bottom: 20px;
    background: var(--panel-bg);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    padding: 16px;
    overflow-y: auto;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
    z-index: 10;
    transition: none;
}
.detail-main-content {
    margin-left: calc(var(--sidebar-left) + var(--sidebar-width) + var(--sidebar-gap));
    min-width: 0;
}
/* 搜索按钮基础样式继承 mc-nav-btn，无需额外定义 */

/* 搜索面板容器 - 默认收起 */
.search-panel {
    position: absolute;
    top: calc(100% + 8px);      /* 位于 header 下方 8px */
    right: 0;                    /* 与图标组右边缘对齐（文字导航已移出 .mc-header-right） */
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid var(--panel-border);
    border-radius: 4px;
    padding: 4px;
    display: flex;
    gap: 8px;
    max-height: 0;
    opacity: 0;
    overflow: hidden;
    transition: max-height 0.3s ease, opacity 0.3s ease;
    z-index: 1000;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}

/* 展开状态 */
.search-panel.open {
    max-height: 80px;            /* 足够容纳一行输入框和按钮 */
    opacity: 1;
}

/* 搜索输入框 */
.search-panel input {
    flex: 1;
    min-width: 120px;
    padding: 6px 10px;
    font-family: inherit;
    font-size: 0.9rem;
    border: 1px solid rgba(0, 0, 0, 0.2);
    border-radius: 3px;
}

/* 搜索按钮 */
.search-panel button {
    background: var(--mc-button-bg);
    color: #FFFFFF;
    border: 2px solid;
    border-color: var(--mc-button-border-light) var(--mc-button-border-dark) var(--mc-button-border-dark) var(--mc-button-border-light);
    padding: 6px 12px;
    font-family: inherit;
    font-size: 0.7rem;
    cursor: pointer;
    text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);
    transition: background 0.1s ease;
}
.search-panel button:hover {
    background: var(--mc-button-hover);
}
/* 搜索按钮 - 透明背景，仅显示图片，悬停弹跳 */
.search-btn {
    background: transparent;      /* 透明背景 */
    border: none;                 /* 无边框 */
    padding: 0;                   /* 移除内边距 */
    width: 38px;                  /* 固定宽高，与 logo 一致 */
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: transform 0.2s ease;  /* 平滑过渡 */
    -webkit-tap-highlight-color: transparent;
}

/* 悬停时向上跳起 */
.search-btn:hover {
    transform: translateY(-4px);
}

/* 点击时恢复原位 */
.search-btn:active {
    transform: translateY(0);
}

/* 确保图片不超出按钮范围 */
.search-btn img {
    width: 100%;
    height: 100%;
    object-fit: contain;          /* 保持图片比例，完整显示 */
    pointer-events: none;         /* 防止图片拦截点击 */
}

.sidebar-title {
    font-size: 1.0rem;
    color: var(--text-primary);
    margin-bottom: 12px;
}
.sidebar-list {
    list-style: none;
    padding: 0;
    margin: 0;
}
.sidebar-list li {
    margin-bottom: 8px;
}
.sidebar-link {
    display: block;
    font-size: 1.0rem;
    color: var(--text-secondary);
    text-decoration: none;
    padding: 4px 8px;
    border-radius: 3px;
    transition: background 0.2s;
}
.sidebar-link:hover {
    background: rgba(255, 255, 255, 0.4);
    color: var(--text-primary);
}

/* 侧边栏目录折叠动画 */
.sidebar-parent-item {
    margin-bottom: 2px !important;
}
.sidebar-parent-header {
    display: flex;
    align-items: center;
    gap: 4px;
    cursor: pointer;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
    min-height: 36px;
}
.sidebar-toggle-icon {
    font-size: 0.6rem;
    color: var(--text-secondary);
    transition: transform 0.3s ease;
    display: inline-block;
    min-width: 16px;
    padding: 8px 4px;
    margin: -4px 0;
    text-align: center;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}
.sidebar-toggle-icon.placeholder {
    visibility: hidden;
}
.sidebar-parent-item.open .sidebar-toggle-icon {
    transform: rotate(90deg);
}
.sidebar-parent-link {
    flex: 1;
    padding: 4px 4px;
    border-radius: 3px;
}
.sidebar-parent-link:hover {
    background: rgba(255, 255, 255, 0.4);
    color: var(--text-primary);
}

/* 子链接列表 */
.sidebar-children {
    list-style: none;
    padding: 0;
    margin: 0;
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.3s ease;
}
.sidebar-parent-item.open .sidebar-children {
    max-height: 500px;
}
.sidebar-children .sidebar-link {
    padding-left: calc(var(--sidebar-toggle-width) + var(--sidebar-header-gap));
    font-size: 0.85rem;
    color: var(--text-muted);
}
.sidebar-children .sidebar-link:hover {
    background: rgba(255, 255, 255, 0.3);
    color: var(--text-primary);
}
/* 搜索结果页样式 */
.search-page {
    max-width: var(--content-max-width);
    margin: 0 auto;
}
.search-top-bar {
    display: flex;
    align-items: center;
    gap: 16px;
    margin-bottom: 24px;
    flex-wrap: wrap;
}
.search-title {
    font-size: 1.2rem;
    color: var(--text-primary);
    letter-spacing: 1px;
}
.search-results-panel {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 14px;
}
.toolbox-wrapper {
    position: relative;
    display: inline-flex;
    align-items: center;
}

.toolbox-btn {
    background: transparent;
    border: none;
    padding: 0;
    width: 38px;                /* 与搜索按钮一致 */
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: transform 0.2s ease;
    -webkit-tap-highlight-color: transparent;
}

.toolbox-btn:hover {
    transform: translateY(-4px); /* 悬停弹跳 */
}

.toolbox-btn:active {
    transform: translateY(0);
}

.toolbox-btn img {
    width: 100%;
    height: 100%;
    object-fit: contain;         /* 图片不超出按钮 */
    pointer-events: none;
}

/* ========== 工具箱预览下拉面板 ========== */
.toolbox-preview {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;                     /* 对齐按钮左侧 */
    min-width: 280px;            /* 预览面板宽度，可调整 */
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid var(--panel-border);
    border-radius: 4px;
    padding: 10px;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-8px); /* 初始上移隐藏 */
    transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s;
    z-index: 1000;
}

/* 鼠标悬停在工具箱包装容器上时显示预览 */
.toolbox-wrapper:hover .toolbox-preview {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
}

/* 预览面板内部的卡片项 */
.toolbox-preview-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px;
    border-radius: 4px;
    color: var(--text-primary);
    text-decoration: none;
    transition: background 0.2s;
}

.toolbox-preview-item:hover {
    background: rgba(255, 255, 255, 0.5);
}

.toolbox-preview-item img {
    width: 40px;
    height: 40px;
    object-fit: cover;
    border-radius: 4px;
}

.toolbox-preview-item .toolbox-preview-title {
    font-size: 0.9rem;
    line-height: 1.4;
}

/* ========== 服务器状态页面（点击标题栏图标进入） ==========
   视觉参考 Minecraft 的多人游戏服务器列表：
   一行一台服务器 —— 左侧图标、中间名称/MOTD/地址、右侧信号格与人数。
   操作方式沿用它：点整行展开玩家名单。 */

/* 标题栏的服务器按钮：透明背景 + 图片图标，悬停弹跳（与音效按钮一致） */
.server-btn {
    background: transparent;
    border: none;
    padding: 0;
    width: 38px;
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: transform 0.2s ease;
    -webkit-tap-highlight-color: transparent;
}
.server-btn:hover { transform: translateY(-4px); }
.server-btn:active { transform: translateY(0); }
.server-btn img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    pointer-events: none;
}

/* 页面容器 */
.servers-page {
    max-width: 900px;
    margin: 0 auto;
    animation: mcFadeIn 0.3s ease;
}
.servers-top-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 16px;
    flex-wrap: wrap;
}
.servers-title {
    font-size: 0.9rem;
    color: var(--text-primary);
    letter-spacing: 1px;
}

#serverListPanel {
    background: var(--panel-bg);
    backdrop-filter: blur(8px);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    padding: 20px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
}

/* ---- 单台服务器：外层卡片 + 服务器主行 + 下方玩家下拉 ---- ----
   交互参考 VS Code 的资源管理器：点一行，内容在**它的下方**展开，
   这一行本身（名称/版本/MOTD/人数）保持可见、位置不动。
   所以拆成三层：
     .srv-card           外层卡片（承载展开状态与整体底色）
       .srv-row          服务器主行（始终可见）
       .srv-players-panel 玩家下拉面板（高度动画） */
.srv-card {
    margin-bottom: 8px;
    border-radius: 4px;
    /* 参考游戏内服务器条目的深色底 */
    background: rgba(0, 0, 0, 0.62);
    border: 1px solid rgba(255, 255, 255, 0.12);
    overflow: hidden;
    transition: background 0.15s ease, border-color 0.15s ease;
}
.srv-card:last-of-type { margin-bottom: 0; }
.srv-card-offline { background: rgba(0, 0, 0, 0.45); }
.srv-card-offline .srv-icon { opacity: 0.45; }

/* 服务器主行 */
.srv-row {
    position: relative;
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 12px;
    transition: background 0.15s ease;
}
.srv-row-clickable { cursor: pointer; }
/* 悬停高亮只作用在主行上（不会盖住下方展开的玩家名单），
   半透明白色叠在卡片深色底上，明暗层次和之前一致。 */
.srv-row-clickable:hover {
    background: rgba(255, 255, 255, 0.07);
}
/* 已展开的卡片给一点持续的高亮，和 VS Code 选中项的感觉一致 */
.srv-card.open {
    border-color: rgba(255, 255, 255, 0.28);
}

/* 展开箭头：收起时指向右，展开时转向下。
   用 transform 旋转做过渡，和 VS Code 的文件夹箭头一致。 */
.srv-chevron {
    flex-shrink: 0;
    margin-left: 2px;
    font-size: 0.6rem;
    color: #AAAAAA;
    line-height: 1;
    transition: transform 0.25s ease, color 0.15s ease;
}
.srv-card.open .srv-chevron {
    transform: rotate(90deg);
    color: #FFFFFF;
}

/* ---- 玩家下拉面板：高度动画 ----
   用 grid-template-rows 从 0fr 过渡到 1fr —— 这是目前唯一
   不需要预先知道内容高度的纯 CSS 展开动画方案
   （max-height 方案要么写死数值、要么会有延迟感）。
   外层 overflow:hidden 负责裁剪，内层 min-height:0 是
   grid 子项能收缩到 0 的必要条件。 */
.srv-players-panel {
    display: grid;
    grid-template-rows: 0fr;
    overflow: hidden;
    transition: grid-template-rows 0.28s ease;
}
.srv-card.open .srv-players-panel {
    grid-template-rows: 1fr;
}
.srv-players-inner {
    min-height: 0;
    /* 内容跟着做一个轻微的淡入上移，动画更有层次
     （和 VS Code 展开文件夹的观感接近） */
    opacity: 0;
    transform: translateY(-4px);
    transition: opacity 0.22s ease, transform 0.25s ease;
}
.srv-card.open .srv-players-inner {
    opacity: 1;
    transform: translateY(0);
}

/* 左侧图标（服务器自带 favicon，否则用默认图标） */
.srv-icon {
    width: 52px;
    height: 52px;
    flex-shrink: 0;
    border-radius: 3px;
    overflow: hidden;
    border: 1px solid rgba(255, 255, 255, 0.18);
    background: rgba(255, 255, 255, 0.06);
    display: flex;
    align-items: center;
    justify-content: center;
}
.srv-icon img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* 服务器图标是 64x64 像素画，放大时保持硬边 */
    image-rendering: pixelated;
}

/* 中间信息区 */
.srv-info {
    flex: 1;
    min-width: 0;
}
.srv-name {
    font-size: 0.85rem;
    color: #FFFFFF;
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex-wrap: wrap;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* 版本号靠右的灰色小字，和游戏里一致 */
.srv-mc-version {
    font-size: 0.5rem;
    color: #AAAAAA;
    font-weight: normal;
}
.srv-motd {
    font-size: 0.65rem;
    color: #AAAAAA;
    margin-top: 3px;
    line-height: 1.45;
    word-break: break-word;
    max-height: 2.9em;
    overflow: hidden;
}
.srv-dim { color: #888888; }
.srv-offline-msg { color: #FF5555; }
.srv-addr {
    font-size: 0.5rem;
    color: #7A7A7A;
    margin-top: 3px;
    word-break: break-all;
}

/* 右侧：信号格 + 人数 */
.srv-right {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 5px;
    flex-shrink: 0;
}
.srv-bars {
    display: flex;
    align-items: flex-end;
    gap: 2px;
    height: 16px;
}
.srv-bar {
    width: 3px;
    background: rgba(255, 255, 255, 0.22);
    border-radius: 1px;
}
.srv-bar.on { background: #55FF55; }
.srv-card-offline .srv-bar.on { background: rgba(255, 255, 255, 0.22); }
.srv-count {
    font-size: 0.7rem;
    color: #FFFFFF;
    letter-spacing: 0.5px;
    white-space: nowrap;
}

/* 展开后的玩家名单：位于服务器主行下方。
   左缩进对齐到"名称"文字处（图标 52px + 间距 12px + 行内边距 12px），
   视觉上表示这是这台服务器的子内容 —— 和 VS Code 展开文件夹后
   子项缩进的感觉一致。 */
.srv-players {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin: 0 12px 10px 76px;
    padding: 8px 0 0;
    border-top: 1px dashed rgba(255, 255, 255, 0.18);
}
.srv-player {
    font-size: 0.55rem;
    padding: 2px 7px;
    border-radius: 3px;
    background: rgba(255, 255, 255, 0.12);
    color: #DDDDDD;
    word-break: break-all;
}
/* 没有名单可显示时的提示（服务器隐藏了名单 / 正在加载） */
.srv-players-empty {
    margin: 0 12px 10px 76px;
    padding-top: 8px;
    border-top: 1px dashed rgba(255, 255, 255, 0.18);
    font-size: 0.55rem;
    color: #888888;
}

/* 状态徽标：管理面板的服务器监控列表使用。
   （原先它和悬浮面板的样式写在一起，改成独立页面后需要单独保留） */
.mc-state {
    display: inline-block;
    font-size: 0.55rem;
    padding: 2px 6px;
    border-radius: 3px;
    letter-spacing: 0.5px;
    white-space: nowrap;
}
.mc-state.online { background: rgba(46, 125, 50, 0.18); color: #2E7D32; }
.mc-state.offline { background: rgba(198, 40, 40, 0.15); color: #C62828; }
.mc-state.pending { background: rgba(0, 0, 0, 0.08); color: var(--text-muted); }

/* 占位与页脚 */
.srv-empty {
    padding: 24px;
    text-align: center;
    font-size: 0.7rem;
    color: var(--text-muted);
}
.srv-foot {
    margin-top: 12px;
    padding-top: 8px;
    border-top: 1px solid rgba(0, 0, 0, 0.1);
    font-size: 0.5rem;
    color: var(--text-muted);
    text-align: right;
}

/* 窄屏服务器列表的适配统一放在文件末尾的移动端媒体查询里（见「响应式」一节） */

/* ========== 工具箱页面 ========== */
#page-tools {
    padding: 20px 0;
}

.tools-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
}

/* 工具卡片（尺寸比分类卡片大，可通过修改 width/height 或 grid 列宽调节） */
.tool-card {
    background: var(--panel-bg);
    backdrop-filter: blur(4px);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
    text-decoration: none;
    color: var(--text-primary);
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
    /* 控制卡片高度：可固定 height，或由内容撑开，这里不固定 */
}

.tool-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 6px 25px rgba(0, 0, 0, 0.15);
}

.tool-card img {
    /*width: 100%;
    height: 160px;              /* 图片高度可调整 */
    /*object-fit: cover;*/
    
    width: 100%;
    height: auto;        /* 高度自适应 */
    min-height: 200px;
    /*max-height: 200px;   /* 可选，限制最高高度 */
    object-fit: contain; /* 完整显示图片 */
    display: block;
    background: rgba(0,0,0,0.05); /* 可选，图片加载前占位背景 */

}

.tool-card-body {
    padding: 16px;
    flex: 1;
}

.tool-card-title {
    font-size: 1.0rem;
    margin-bottom: 8px;
    color: var(--text-primary);
}

.tool-card-desc {
    font-size: 0.7rem;
    color: var(--text-secondary);
    line-height: 1.6;
}

/* 工具箱页面返回按钮样式复用 .mc-back-btn */
/* 详情面板 */
.detail-panel {
    background: var(--panel-bg);
    backdrop-filter: blur(8px);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    padding: 24px 28px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
}

/* 详情标题。
   这里的间距值即为**原始值**（问题修复后已还原）：
   margin-bottom 与 line-height 共同决定"标题 → 分类/作者/日期栏"的距离。
   注：line-height 采用继承值（body 的 1.6），与原始排版一致。 */
.detail-title {
    font-size: 1.3rem;
    color: var(--text-primary);
    margin-bottom: 16px;
    letter-spacing: 1px;
}
/* 分类 / 作者 / 日期栏。
   margin-bottom + padding-bottom 决定它与下方正文之间的距离。 */
.detail-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-bottom: 24px;
    padding-bottom: 16px;
    border-bottom: 1px solid rgba(0, 0, 0, 0.15);
    font-size: 1.0rem;
    color: var(--text-muted);
}
.detail-meta-item {
    display: flex;
    align-items: center;
    gap: 5px;
}

/* 正文内容样式 */
.detail-content {
    font-size: 1.2rem;
    color: var(--text-secondary);
    /* ★ 行高必须大于 1。这里原先是 line-height: 0.9（比字号还小）：
       font-size 1.2rem = 19.2px，而行盒只有 0.9 × 19.2 ≈ 17.3px，
       同一段落里折行后的相邻两行会在竖直方向重叠 —— 这就是
       "第 2 排和第 3 排文字黏在一起"的原因。
       这里不写死数值，直接继承 body 的 1.6（19.2 × 1.6 ≈ 30.7px），
       与 .detail-title / .detail-meta 保持一致（见上方 1114 行的说明）。 */
    letter-spacing: 0.3px;

    
    word-wrap: break-word;
    overflow-wrap: break-word;
    word-break: break-word;

}
/* 段落间距（原始值：16px） */
.detail-content p {
    margin-bottom: 16px;
}

/* ==================== 空格与缩进保留 ====================
   浏览器默认 white-space: normal，会把连续空白"折叠"成一个，
   并且会完全丢弃行首空白 —— 所以在正文里输入的空格/Tab 缩进
   到这一步就全没了（数据其实还在，只是没被渲染出来）。
   这里用 pre-wrap：保留空白和换行，同时仍然自动换行，
   不会像 pre 那样把长行撑出横向滚动条。

   ★ 作用范围必须严格限定在"正文内容元素"上，这里踩过两个坑：

     坑一：不能用 .detail-content（或更宽的 .page-detail）。
       关于页等静态 HTML 也用了 .detail-content 类，而那些标签是
       人为换行、缩进写的，一旦按 pre-wrap 渲染，源码里的换行和
       前导空格就会被当成正文显示出来，排版直接错乱。

     坑二：★ 绝对不能把 #detailPanel 自身写进选择器
       （曾经写成 `#detailPanel, #detailPanel *`，有害）。
       renderDetailPage 是用模板字符串写 innerHTML 的——
           detailPanel.innerHTML = `
               <h1 class="detail-title">…</h1>
               <div class="detail-meta">…
       模板里的换行 + 缩进会成为 #detailPanel 的**纯空白文本节点**。
       面板自身是 normal 时它们被折叠、完全不占高度；一旦面板自身
       也拿到 pre-wrap，这些空白就变成"真实换行 + 十二个空格"，
       每处顶出约一整行（实测 18px）。面板内共 3 处、合计约 54px，
       表现为标题上下、meta 上下凭空多出大段空白。

   正文里可包含 <p>/<div>/<li>/<td>/<h1>… 等块级子元素，
   所以把这些内容元素都列进来，而不只是 p。 */
#detailPanel p,
#detailPanel div,
#detailPanel li,
#detailPanel td, #detailPanel th,
#detailPanel h1, #detailPanel h2, #detailPanel h3,
#detailPanel h4, #detailPanel h5, #detailPanel h6,
#detailPanel blockquote {
    white-space: pre-wrap;
}
/* pre/code 本来就是保留空白，维持其等宽源码块的展示 */
#detailPanel pre,
#detailPanel pre * {
    white-space: pre;
}
.detail-content h1 {
    font-size: 1.3rem;
    color: var(--text-primary);
    margin: 24px 0 12px;
}
.detail-content h2 {
    font-size: 1.2rem;
    color: var(--text-primary);
    margin: 20px 0 10px;
}
.detail-content h3, .detail-content h4 {
    font-size: 1.15rem;
    color: var(--text-primary);
    margin: 18px 0 8px;
}
/* 正文第一个元素不要上外边距，避免标题紧贴 meta 下方却多出 24px */
.detail-content > :first-child {
    margin-top: 0;
}
.detail-content ul,
.detail-content ol {
    margin-left: 20px;
    margin-bottom: 16px;
}
.detail-content li {
    margin-bottom: 6px;
}
.detail-content blockquote {
    border-left: 4px solid var(--accent-green);
    padding-left: 16px;
    margin: 16px 0;
    color: var(--text-muted);
    font-style: italic;
    background: rgba(255, 255, 255, 0.3);
}
.detail-content img {
    max-width: 100%;
    height: auto;
    border-radius: 4px;
    margin: 10px 0;
}

/* 正文末尾的标签栏。
   ★ 注意：这段在 #detailPanel 内部、位于正文之后。
     文章没有标签时 .detail-tags 是个空容器，但它照样会吃掉
     margin-top + padding-top 共 40px，还会画出一条突兀的分隔线，
     在正文下方凭空多出一大块空白。
     解决：加 :empty 规则，空的时候完全不占空间（也去掉那条线）；
     同时把有标签时的间距从 24/16 收到 16/10，更紧凑。 */
.detail-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 16px;
    padding-top: 10px;
    border-top: 1px solid rgba(0, 0, 0, 0.15);
}
.detail-tags:empty {
    display: none;
    margin: 0;
    padding: 0;
    border: none;
}

/* 页脚：固定两行 —— 第 1 行标语（居中），第 2 行署名（左）+ 备案号（右下角）。
   高度按"正好两行"算：行高 1.5 + 上下内边距各 10px，不再留 20px 大内边距
   和原来 3 行之间 4px / 8px 的额外段间距（那套加起来有 107px 高）。 */
.mc-footer {
    /* margin-top:auto：内容不满一屏时把页脚推到视口底部。
       之前是靠给 .mc-main 写死 min-height:calc(100vh - 顶栏 - 80px) 估出来的，
       手机端顶栏换行后高度变了，估算失效，才会"能把页面划到页脚下面"。 */
    margin-top: auto;
    padding: 10px 16px;
    /* 底部安全区：iPhone 的小白条不压页脚文字（需要 viewport-fit=cover） */
    padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
    background: rgba(255, 255, 255, 0.6);
    backdrop-filter: blur(5px);
    border-top: 1px solid rgba(255, 255, 255, 0.5);
    font-size: 0.65rem;
    line-height: 1.5;
    color: var(--text-muted);
    letter-spacing: 0.5px;
    position: relative;
    z-index: 1;
}
/* 两行都要贴紧，所以清掉全局 p 的下边距 */
.mc-footer p { margin: 0; }
/* 第 1 行标语与第 2 行的「Made by …」左对齐到同一条竖线上，两行都从最左侧开始 */
.mc-footer .footer-line1 { text-align: left; }
/* 第 2 行：左右两端对齐 → 备案号自然落在右下角 */
.mc-footer .footer-line2 {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
}
.mc-footer .footer-icp {
    color: var(--text-muted);
    white-space: nowrap;      /* 备案号绝不折行，否则页脚会变第 3 行 */
}
.mc-footer a {
    color: var(--accent-green);
    text-decoration: none;
}
.mc-footer a:hover {
    text-decoration: underline;
}
.tools-top-bar {
    margin-bottom: 24px;
}
/* 内容区域动画 */
#homeContent {
    animation: mcFadeIn 0.3s ease;
}
.category-page {
    animation: mcFadeIn 0.3s ease;
}
.detail-main-content {
    animation: mcFadeIn 0.3s ease;
}
#page-about .detail-panel {
    animation: mcFadeIn 0.3s ease;
}
/* ==================== 音效按钮 ==================== */
.sound-wrapper {
    position: relative;
    display: inline-flex;
    align-items: center;
}

.sound-btn {
    background: transparent;
    border: none;
    padding: 0;
    width: 38px;
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: transform 0.2s ease;
    -webkit-tap-highlight-color: transparent;
}

.sound-btn:hover { transform: translateY(-4px); }
.sound-btn:active { transform: translateY(0); }

.sound-btn img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    pointer-events: none;
}

/* 音效预览面板 */
.sound-preview {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    min-width: 180px;
    background: rgba(255, 255, 255, 0.95);
    border: 1px solid var(--panel-border);
    border-radius: 4px;
    padding: 8px;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-8px);
    transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s;
    z-index: 1000;
}

.sound-wrapper:hover .sound-preview {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
}

.sound-preview-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 10px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.7rem;
    color: var(--text-primary);
    transition: background 0.2s;
}

.sound-preview-item:hover {
    background: rgba(0, 0, 0, 0.06);
}

.sound-preview-item.active {
    background: rgba(46, 125, 50, 0.15);
    color: var(--accent-green);
    font-weight: bold;
}

.sound-icon {
    font-size: 1rem;
    min-width: 20px;
    text-align: center;
}
/* 音效名称文字（与 .sound-icon 同属一个条目的两段） */
.sound-name {
    font-size: 0.7rem;
    color: var(--text-primary);
}
.sound-preview-item.active .sound-name {
    color: var(--accent-green);
    font-weight: bold;
}
/* ==================== 分页 ==================== */
.pagination {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 8px;
    margin: 30px 0 20px;
    flex-wrap: wrap;
}

.pagination button,
.pagination .page-info {
    background: var(--panel-bg);
    border: 1px solid var(--panel-border);
    border-radius: 4px;
    padding: 6px 12px;
    font-family: inherit;
    font-size: 0.75rem;
    color: var(--text-primary);
    cursor: pointer;
    transition: background 0.2s;
}

.pagination button:hover:not(:disabled) {
    background: var(--panel-bg-hover);
}

.pagination button:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

.pagination button.active {
    background: #a7aba894;
    color: #fff;
    border-color: #a7aba894;
}

.pagination .page-info {
    cursor: default;
    background: transparent;
    border: none;
}
/* ==================== 长条文章卡片 ==================== */
.category-items-panel,
.search-results-panel {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.article-card {
    display: flex;
    position: relative;               /* 卡片徽章浮层的定位基准 */
    background: var(--panel-bg);
    backdrop-filter: blur(4px);
    border: 1px solid var(--panel-border);
    border-radius: var(--card-border-radius);
    overflow: hidden;
    cursor: pointer;
    transition: background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
    height: 140px;                /* 高度不变 */
    max-width: 100%;                /* ★ 宽度缩小 1/3 */
    width: 100%;
    padding: 4px;                    /* ★ 内边距，让图片和内容不贴边 */
    gap: 8px;                        /* ★ 图片与文字之间的间距 */
    box-sizing: border-box;           /* 保证 padding 不增加总宽高 */
}

.article-card:hover {
    background: var(--panel-bg-hover);
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
    transform: translateY(-2px);
}

.article-card:active {
    transform: translateY(0);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}

/* 置顶的文章在列表里给一圈金色描边，让"为什么它在最前面"一眼可见 */
.article-card.is-pinned {
    border-color: #B8860B;
    box-shadow: 0 2px 10px rgba(184, 134, 11, 0.35);
}

/* 封面区域：固定宽度，高度撑满卡片内部 */
.article-card-cover {
    flex: 0 0 180px;                  /* 封面宽度 */
    align-self: stretch;              /* 高度撑满父容器 */
    overflow: hidden;
    background: rgba(0, 0, 0, 0.05);
    border-radius: 4px;               /* ★ 图片圆角，视觉更柔和 */
    display: flex;
    align-items: center;
    justify-content: center;
}

.article-card-cover img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* 右侧文字区：占满剩余宽度，纵向排列标题/摘要/作者日期。
   min-width:0 是必需的 —— 否则长标题会把 flex 子项撑破，省略号失效。 */
.article-card-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    padding: 8px 10px 8px 4px;
}
.article-card-title {
    font-size: 0.9rem;
    color: var(--text-primary);
    line-height: 1.4;
    margin: 0 0 6px 0;
    /* 标题最多两行，超出省略，避免长短不一把卡片撑变形 */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.article-card-excerpt {
    font-size: 0.65rem;
    color: var(--text-muted);
    line-height: 1.5;
    margin: 0;
    /* 摘要最多三行 */
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
/* 作者与日期：推到卡片底部，中间用细线分隔 */
.article-card-meta {
    margin-top: auto;
    padding-top: 6px;
    border-top: 1px solid rgba(0, 0, 0, 0.08);
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 8px;
    font-size: 0.6rem;
    color: var(--text-muted);
}
.article-card-author {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.article-card-date {
    flex-shrink: 0;
    white-space: nowrap;
}

/* 空状态提示（分类无文章、搜索无结果等） */
.empty-state {
    padding: 40px 20px;
    text-align: center;
    font-size: 0.75rem;
    color: var(--text-muted);
}

/* ============================================================
   响应式：手机端（<= 768px）
   ------------------------------------------------------------
   设计原则：
   · 首页（分类列表）＝ 桌面版的等比例缩小，DOM 结构完全不动，
     只收字号/内边距，保持"缩小版电脑端"的观感；
   · 顶栏改成两行（第 1 行品牌+图标按钮，第 2 行四个文字按钮），
     彻底解决窄屏下导航被 overflow-x:hidden 裁掉的问题；
   · 分类页/搜索/详情/工具箱/服务器等内页按窄屏单列重新排布。
   ============================================================ */
@media (max-width: 768px) {
    :root {
        --header-height: 56px;
        --sidebar-width: 180px;
        --sidebar-left: 10px;
        --sidebar-gap: 10px;
        --category-gap: 10px;
    }

    /* ---------- 顶栏：高度自适应 + 允许换行 ----------
       375px 实测：品牌(≈160px) + 图标组(≈120px) + 4 个文字按钮(≈240px)
       一行绝对放不下，而 body 又是 overflow-x:hidden，多余部分直接被裁掉。 */
    .mc-header {
        height: auto;
        min-height: 52px;
        flex-wrap: wrap;
        align-content: center;
        /* 行间距/左右内边距各压一档，给第 1 行再挤出约 10px。
           实测 375px：不压的话"左组 160 + 间距 8 + 右组 192 + 内边距 20 = 380 > 375"，
           右组被挤到第 2 行，加上第 2 行的文字导航 → 整条顶栏变成 3 行（112px 高）。 */
        gap: 6px;
        padding: 6px 8px;
    }
    /* flex:0 1 auto + min-width:0 允许左组被压缩；但决定"换不换行"的是
       每个 flex 项的首选宽度（hypothetical main size），所以标题还得靠 max-width 收窄 */
    .mc-header-left { gap: 6px; flex: 0 1 auto; min-width: 0; }
    .mc-logo-img { width: 28px; height: 28px; }
    .mc-header-title {
        font-size: 0.68rem;
        letter-spacing: 0;
        line-height: 1.3;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        max-width: 8em;          /* 站名过长时省略号截断，保证第 1 行放得下 */
    }
    .mc-header-right {
        gap: 5px;
        flex-wrap: wrap;
        justify-content: flex-end;
        position: static;        /* 让三个下拉面板改为相对 .mc-header 定位 */
    }
    /* 第二行：四个文字按钮整行居中 */
    .mc-header-textnav {
        flex: 1 0 100%;
        flex-wrap: wrap;
        justify-content: center;
        gap: 8px;
    }
    .mc-nav-btn {
        padding: 7px 9px;
        font-size: 0.52rem;
        letter-spacing: 0;
    }
    .sound-btn, .toolbox-btn, .server-btn, .search-btn { width: 28px; height: 28px; }
    .guest-badge { padding: 4px 6px; font-size: 0.5rem; letter-spacing: 0; }
    .guest-badge .badge-full { display: none; }      /* 长文案换短文案，给图标腾地方 */
    .guest-badge .badge-short { display: inline; }

    /* ---------- 三个下拉面板改成"贴在顶栏下方的整宽面板" ----------
       原来 left:0 + min-width:280px，在 375px 屏上必然向右溢出屏幕。 */
    .sound-wrapper, .toolbox-wrapper { position: static; }
    .sound-preview, .toolbox-preview, .search-panel {
        left: 0;
        right: 0;
        min-width: 0;
        top: calc(100% + 6px);
    }
    .sound-preview, .toolbox-preview { max-height: 60vh; overflow-y: auto; }

    /* ---------- 主体与页脚 ---------- */
    .mc-main { padding: 18px 12px 32px; }
    body.detail-mode .mc-main { padding: 18px 10px 32px; }
    .mc-footer {
        padding: 9px 12px calc(9px + env(safe-area-inset-bottom, 0px));
        font-size: 0.58rem;
        letter-spacing: 0.2px;
    }

    /* ---------- 首页：桌面版的缩小版，结构不动 ---------- */
    .category-box { margin-bottom: 10px; }
    .category-header { padding: 11px 14px; gap: 10px; }
    .category-icon { font-size: 1.3rem; }
    .category-name { font-size: 0.75rem; }
    .category-arrow { font-size: 1rem; }

    /* ---------- 分类页 / 搜索结果：横向紧凑卡片 ---------- */
    .category-top-bar, .search-top-bar, .tools-top-bar { gap: 10px; margin-bottom: 14px; }
    .category-title-big, .search-title { font-size: 0.95rem; }
    .mc-back-btn { padding: 6px 10px; font-size: 0.6rem; }
    .category-items-panel, .search-results-panel { gap: 10px; }
    .article-card { height: 106px; gap: 6px; }
    .article-card-cover { flex: 0 0 96px; }
    .article-card-body { padding: 6px 8px 6px 2px; }
    .article-card-title { font-size: 0.72rem; }
    .article-card-excerpt { font-size: 0.56rem; line-height: 1.45; -webkit-line-clamp: 2; }
    .article-card-meta { font-size: 0.5rem; padding-top: 4px; gap: 6px; }
    .card-badges { top: 6px; left: 6px; }
    .special-badge { font-size: 0.5rem; padding: 2px 5px; }

    /* ---------- 文章详情 ---------- */
    .detail-page { padding: 0; }
    .detail-top-bar { margin-left: 0; margin-bottom: 12px; }
    .detail-sidebar { display: none; }
    .detail-main-content { margin-left: 0; }
    .detail-panel { padding: 16px 14px; }
    .detail-title { font-size: 0.92rem; line-height: 1.5; }
    .detail-meta {
        flex-wrap: wrap;
        gap: 6px 12px;
        margin: 14px 0;
        padding-bottom: 12px;
        font-size: 0.56rem;
    }
    .detail-content { font-size: 0.75rem; }
    .detail-content p { margin-bottom: 12px; }
    .detail-content h1 { font-size: 0.95rem; margin: 18px 0 10px; }
    .detail-content h2 { font-size: 0.88rem; margin: 16px 0 8px; }
    .detail-content h3, .detail-content h4 { font-size: 0.8rem; margin: 14px 0 6px; }
    .detail-content ul, .detail-content ol { padding-left: 1.25em; margin-bottom: 12px; }
    .detail-content img { max-width: 100%; height: auto; }
    .detail-tags { margin-top: 14px; padding-top: 10px; gap: 6px; }

    /* ---------- 工具箱 ---------- */
    .tools-grid { grid-template-columns: 1fr; gap: 14px; }
    .tool-card img { min-height: 150px; }
    .tool-card-body { padding: 12px; }
    .tool-card-title { font-size: 0.85rem; }
    .tool-card-desc { font-size: 0.62rem; }

    /* ---------- 服务器列表 ---------- */
    #serverListPanel { padding: 10px; }
    .srv-row { gap: 8px; padding: 8px; }
    .srv-icon { width: 40px; height: 40px; }
    .srv-name { font-size: 0.7rem; }
    .srv-motd { font-size: 0.55rem; }
    .srv-addr, .srv-mc-version { font-size: 0.5rem; }
    .srv-count { font-size: 0.55rem; }
    .srv-players-inner { padding: 6px 8px; }
    .srv-player { font-size: 0.55rem; }
    .srv-empty { font-size: 0.7rem; }

    /* ---------- 分页 / 空状态 ---------- */
    .pagination { gap: 5px; margin: 20px 0 12px; }
    .pagination button, .pagination .page-info { padding: 5px 9px; font-size: 0.6rem; }
    .empty-state { padding: 28px 14px; font-size: 0.68rem; }
}

/* 超窄屏（<= 360px，如 iPhone SE 竖屏）：把第 1 行的每一项再收一档，
   保证"图标组"不换到第 2 行（否则整条顶栏会变成 3 行）。 */
@media (max-width: 360px) {
    .mc-header { gap: 4px; padding: 6px 6px; }
    .mc-header-left { gap: 4px; }
    .mc-header-right { gap: 4px; }
    .mc-header-title { font-size: 0.58rem; max-width: 6em; }
    .mc-nav-btn { padding: 5px 6px; font-size: 0.48rem; }
    .mc-header-textnav { gap: 6px; }
    .guest-badge { padding: 3px 5px; }
}
/* 关闭背景模糊/遮罩 */
body.no-blur::before {
    filter: none !important;
    -webkit-filter: none !important;
}
body.no-blur::after {
    background: transparent !important;
}
