      *,
      *::before,
      *::after {
        box-sizing: border-box;
        margin: 0;
        padding: 0;
        -webkit-tap-highlight-color: transparent;
      }
      html {
        scroll-behavior: smooth;
        /* 全响应式根字号：照搬 3Dmarket/prototype 公式（clamp(12px,3.72vw,20px)），
           地板提至 14px 保证移动端可读。地板/天花板用 px/vw 表达，不引用 rem，
           根字号不随浏览器/微信内“字体大小”设置缩放（微信 WebView 改的是默认字号基准，
           对 px/vw 无效）→ 全站 rem 体系在微信内保持稳定 */
        /* 老内核（微信 X5/荣耀 WebView）不认 clamp → 整条丢弃；必须先写无 clamp 兜底行 */
        font-size: calc(100vw * 0.0372093); /* 老内核可解析：纯 vw 曲线（无地板/天花板，比例保持） */
        font-size: clamp(14px, calc(100vw * 0.0372093), 20px);
        /* 防御 iOS Safari Font Boosting / 部分安卓 WebView 自动放大个别文本块 */
        -webkit-text-size-adjust: 100%;
        text-size-adjust: 100%;
      }
      /* ⑥ 移动端双指缩放已放开（视觉视口缩放，布局定死不变，见 index.html viewport meta）。
         双击放大的误触防护只加在交互控件上（button/a），**文档根保持 auto**：
         根上写 touch-action 会收窄整页手势权限，双指放大后的“双指拖动平移”就没了。 */
      button,
      a,
      [role="button"] {
        touch-action: manipulation; /* = 平移 + 捏合缩放，禁双击缩放与 300ms 点击延迟 */
      }
      html,
      body {
        height: 100%;
      }
      body {
        font-family:
          "Noto Sans SC", /* 自托管思源黑体（覆盖系统字体设置，统一所有手机渲染；未加载完时 font-display:swap 先用系统字体） */
          system-ui,
          -apple-system,
          BlinkMacSystemFont,
          "HarmonyOS Sans SC",
          "HarmonyOS Sans",
          "PingFang SC",
          "Noto Sans CJK SC",
          "Microsoft YaHei",
          "Segoe UI",
          sans-serif;
        background: var(--bg-light);
        color: #0f172a;
        line-height: 1.5;
        -webkit-font-smoothing: antialiased;
        height: 100vh;
        height: 100dvh;
        overflow: hidden;
        display: flex;
        flex-direction: column;
      }
      main {
        flex: 1;
        min-height: 0;
        overflow: hidden;
        display: flex;
        -webkit-overflow-scrolling: touch;
      }
      main > .container {
        width: 100%;
        min-height: 0;
        display: flex;
        flex-direction: column;
      }
      /* 键盘弹出（keyboard.js 在 <html> 加 .kb-open）：
         - body 钉为原始高度，抵消平台对布局视口的压缩（footer 不再被顶起的前提）
         - main 高度钉为视觉视口剩余高（#主体卡片跟随键盘压缩，可滚动区完整可见）
         - 压缩式（微信/安卓）：footer 转 fixed 下沉键盘高，钉回原始屏幕底部被键盘盖住；
         - 覆盖式（iOS/现代 Chrome）：footer 保持文档流原位，天然被键盘遮罩 */
      html.kb-open body {
        height: var(--kbd-page-h, 100dvh);
      }
      html.kb-open main {
        flex: none;
        height: var(--kbd-main-h, auto);
      }
      html.kb-open.kb-compressed footer {
        position: fixed;
        left: 0;
        right: 0;
        bottom: calc(-1 * var(--kbd-inset, 0px));
        z-index: 300;
      }
      :root {
        --accent: #2563eb;
        --dark: #0f172a;
        --body: #475569;
        --muted: #94a3b8;
        --border: #e2e8f0;
        --bg-light: #f0f7ff;
      }
      .container {
        max-width: 62rem;
        margin: 0 auto;
        padding: 0 clamp(0.6rem, 2.5vw, 1rem);
      }
      .top-bar {
        height: 0.2rem;
        background: var(--accent);
      }

      /* Nav */
      nav {
        border-bottom: 1px solid var(--border);
        background: #fff;
        position: sticky;
        top: 0;
        z-index: 100;
        box-shadow: 0 1px 0.15rem rgba(0, 0, 0, 0.04);
      }
      nav .container {
        display: flex;
        align-items: center;
        height: 2.4rem;
        flex-wrap: nowrap;
      }
      .logo {
        color: var(--dark);
        text-decoration: none;
        display: flex;
        align-items: center;
        gap: 0.15rem;
        flex-shrink: 0;
      }
      .logo-text {
        display: flex;
        flex-direction: column;
        align-items: center; /* 副标题与主标题中心对齐（原 flex-start 在副标题满宽时向左排开） */
        line-height: 1.1;
        max-height: 999999px; /* 老内核 Text Autosizer 豁免 hack：显式大上限防“长句只放文本”自动放大 */
        width: 6.6rem; /* 定宽掩码：title/sub 均 100% 居中于同一容器 → 数学强制同轴（不依赖任何内核/字体度量） */
      }
      .logo-title {
        font-size: calc(7.5px + 0.9vw); /* 老内核兑底（px+vw 无 clamp，7 字始终 ≤ 掩码） */
        font-size: clamp(9.5px, calc(6.5px + 0.9vw), 18px); /* 7 字×字号 ≤ 掩码（窄屏 5rem：9.5~10px×7≈70px 恰收下）——防文字溢出掩码导致“视觉左对齐” */
        font-weight: 700;
        line-height: 1.2;
        letter-spacing: clamp(0.2px, calc(0.12px + 0.02vw), 0.5px);
        white-space: nowrap;
        text-align: center; /* 居中于掩码（原 justify 满宽摊开 → 与副标题形成“两套对齐”错位感）；掩码 width 仍保留布局占位 */
        width: 100%; /* 填满 .logo-text 定宽掩码（掩码移至 logo-text），与副标题同容器同中心 */
        -webkit-text-size-adjust: none; /* 元素级禁 Font Boosting（老国产 WebView 忽略 html 级） */
        text-size-adjust: none;
      }
      .logo-sub {
        font-size: calc(4.4px + 0.5vw); /* 老内核兑底 */
        font-size: clamp(4.6px, calc(3.4px + 0.5vw), 9px); /* 原 桌面0.45/窄屏0.34rem 断点双值：改 px+vw 曲线，恒 ≈ 主标题一半（4.6~9 vs 10~18） */
        font-weight: 400;
        color: #334155;
        line-height: 1.2;
        margin-top: 0.1rem;
        white-space: nowrap;
        text-align: center;
        width: max-content; /* 内容宽密排（主标题已不再溢出掩码 → 文字中心=盒中心，居中即成立）；抬升场景由 JS 释放 width 以便 zoom */
        max-width: 100%;
        -webkit-text-size-adjust: none;
        text-size-adjust: none;
      }
      .logo-img {
        height: clamp(1.5rem, calc(1.4rem + 0.4vw), 1.7rem); /* 原 桌面1.7/移动1.5 断点双值 → 连续 */
        width: auto;
        flex-shrink: 0;
      }
      .nav-links {
        display: flex;
        gap: 1rem; /* 老内核兑底（X5 不支持 flex gap） */
        gap: clamp(0.6rem, 3.2vw, 2rem);
        margin-left: auto;
        flex-wrap: nowrap;
        min-width: 0;
      }
      .nav-links a {
        font-size: calc(0.55rem + 0.5vw); /* 老内核兜底（rem+vw，微信字体已由 JS 层锁定） */
        font-size: clamp(0.6rem, calc(0.55rem + 0.5vw), 0.75rem); /* 原 桌面0.75/移动0.6 断点双值 → 连续 */
        font-weight: 500;
        color: #64748b;
        text-decoration: none;
        position: relative;
        padding-bottom: 0.2rem;
        transition: color 0.2s;
        white-space: nowrap;
        cursor: pointer;
        display: inline-block;
      }
      .nav-links a:hover,
      .nav-links a.active {
        color: var(--dark);
      }
      @keyframes navClick {
        0% {
          transform: scale(1);
        }
        40% {
          transform: scale(0.8);
        }
        75% {
          transform: scale(1.3);
        }
        100% {
          transform: scale(1);
        }
      }
      .nav-links a.clicking {
        animation: navClick 0.45s ease;
      }
      .tab-btn.clicking .tab-label {
        display: inline-block;
        animation: navClick 0.45s ease;
      }
      .nav-links {
        position: relative;
      }
      .nav-indicator {
        position: absolute;
        bottom: -0.2rem;
        height: 0.15rem;
        background: var(--accent);
        border-radius: 0.1rem;
        transition:
          left 0.35s cubic-bezier(0.4, 0, 0.2, 1),
          width 0.35s cubic-bezier(0.4, 0, 0.2, 1);
        pointer-events: none;
      }

      /* View switching (SPA) */
      .views-wrapper {
        position: relative;
        overflow: hidden;
        flex: 1;
        min-height: 0;
        display: flex;
      }
      .view {
        display: none;
      }
      .view.active {
        display: flex;
        flex-direction: column;
        flex: 1;
        min-height: 0;
      }

      /* Page layout：固定高度主体的 flex 链路（main → container → wrapper → view → page → content） */
      .page {
        flex: 1;
        min-height: 0;
        display: flex;
        flex-direction: column;
        padding: clamp(0.4rem, calc(0.3rem + 0.4vw), 0.65rem) 0; /* 原 桌面0.65/移动0.4 断点双值 → 连续 */
      }

      /* Secondary nav (tabs attached to content top) */
      .tabs {
        display: flex;
        flex-wrap: wrap; /* 二级标签多（生态组织4个）时放不下自动换行，避免标签/添加按钮被挤压 */
        row-gap: 0;
        margin: 0;
        position: sticky;
        top: 0;
        z-index: 40;
        background: var(--bg-light);
        padding-top: 0.2rem;
        flex-shrink: 0;
      }
      .tab-btn {
        display: block;
        flex-shrink: 0; /* 标签自身不被压缩：宽度不足时整体换行而非挤窄 */
        padding: clamp(0.275rem, 1.5vw, 0.475rem) clamp(0.4rem, 2vw, 1.2rem);
        font-size: 2.5vw; /* 老内核兜底（纯 vw，不随根） */
        font-size: clamp(0.6rem, 2.5vw, 0.75rem);
        font-weight: 500;
        color: var(--body);
        background: #eef2f7;
        border: none;
        border-bottom: 1px solid var(--border);
        text-align: left;
        white-space: nowrap;
        cursor: pointer;
        font-family: inherit;
      }
      .tab-btn .tab-label {
        display: inline-block;
        transition: transform 0.2s;
      }
      .tab-btn.active {
        color: var(--accent);
        font-weight: 600;
        background: #fff;
        border: 1px solid var(--border);
        border-bottom: none;
        border-radius: 0.4rem 0.4rem 0 0;
        margin-top: -0.2rem;
        padding-top: calc(clamp(0.275rem, 1.5vw, 0.475rem) + 0.2rem);
        position: relative;
        z-index: 2;
      }
      .tab-btn.active .tab-label {
        transform: scale(1.1);
      }
      .tabs .tab-btn.active:first-child {
        border-left: none;
      }
      .tabs .tab-btn.active:last-child {
        border-right: none;
      }

      .content {
        background: #fff;
        border-radius: 0 0 0.4rem 0.4rem;
        border-bottom: 1px solid var(--border);
        padding: 0; /* 水平 padding 下沉到每行，选中高亮可横贯整卡 */
        overflow: hidden;
        flex: 1;
        min-height: 0;
        display: flex;
        flex-direction: column;
        position: relative; /* 阅读/编辑浮动按钮的定位锚点 */
      }
      .tab-content {
        display: none;
      }
      .tab-content.active {
        display: block;
        flex: 1;
        min-height: 0;
        overflow-y: auto;
        overflow-x: hidden; /* 选中行负 margin 横贯全宽时也不产生横向滚动条 */
        -webkit-overflow-scrolling: touch;
        padding: 0.45rem 0; /* 列表区上下 padding 一致 */
      }

      .list-item {
        display: flex;
        align-items: center;
        /* 标题字号基准上提到行级：行高恒定两行（2×1.35em），一行/两行标题卡片高度恒等，
           不随内容高度跳变（管理员操作组此前恰好把行高顶到接近两行，掩盖了差异） */
        font-size: calc(0.715rem + 1.17vw); /* 老内核兑底（rem+vw） */
        font-size: clamp(0.94rem, 0.715rem + 1.17vw, 1.1rem); /* 与原 .title 公式一致，title 改用 inherit 联动同一公式 */
        height: calc(2.7em + 0.265rem + 1px); /* 恒两行卡高：2 行标题(2×1.35em) + 上下 padding(0.1325×2=0.265rem) + 分隔线(1px)，与 .title 行高 1.35 耦合 */
        padding: 0.1325rem 1.2rem 0.1325rem 0.6rem; /* 上下 0.265→0.1325（再缩 1/2，本轮需求）；左右两侧为历史存量（dot 贴左/右侧日期呼吸），不改 */
        border-bottom: 1px solid #f1f5f9;
        text-decoration: none;
      }
      .list-item:last-child {
        border-bottom: none;
      }
      .list-item.selected {
        background: #f5f7fa;
      }
      .list-item .title {
        /* 字号继承 .list-item 的 clamp 基准（单一公式，行高/卡高/标题联动） */
        color: var(--body);
        flex: 1;
        min-width: 0;
        /* 最多两行：放得下换行，超出第二行省略号；无论何时都不挤出卡片 */
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
        text-overflow: ellipsis;
        line-height: 1.35;
        white-space: normal;
      }
      .list-item .date {
        font-size: 0.6rem;
        color: var(--muted);
        flex-shrink: 0;
        margin-left: 0.8rem;
      }
      /* 容器整体从底部升起（切换二级标签 / 阅读 / 编辑） */
      /* 滚筒拉入：从卡片底部整条拉上来（无透明度，纯位移） */
      @keyframes riseFromBottom {
        from {
          transform: translateY(100%);
        }
        to {
          transform: translateY(0);
        }
      }
      .rise-from-bottom {
        animation: riseFromBottom 0.34s cubic-bezier(0.22, 0.61, 0.36, 1) both;
      }
      .roller-up {
        animation: riseFromBottom 0.34s cubic-bezier(0.22, 0.61, 0.36, 1) both;
      }
      /* 滚筒拉下：整条从卡片底部拉下去（返回/放弃/切换标签用） */
      @keyframes rollerDown {
        from {
          transform: translateY(0);
        }
        to {
          transform: translateY(100%);
        }
      }
      .roller-down {
        animation: rollerDown 0.3s cubic-bezier(0.55, 0, 0.55, 0.2) both;
      }

      /* ---- 卡片覆盖层（阅读/编辑复用主体卡片列表区） ---- */
      .card-overlay {
        /* 覆盖模型：列表全程保持渲染不隐藏，卡片绝对定位盖在列表上方（top 由 JS 按 tabs 高校准）；
           不透明白底遮挡列表；overscroll-behavior:contain 防触底串滚到下层
           ④ 内边距上下左右一致 1.2rem；但卡片自身不滚（下方由内层滚动容器承担），
           所以顶部这 1.2rem 是“钉住”的：文字上滚时在离二级标签 1.2rem 处消失。 */
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: 5;
        background: #fff;
        display: flex;
        flex-direction: column;
        overflow: hidden;
        padding: 1.2rem 1.2rem 0; /* 下边距交给内层滚动的 padding-bottom（需给浮动按钮让位） */
      }
      /* 卡片内层滚动容器（阅读页）：底部 3.6rem 避开「分享/返回」悬浮按钮 */
      .reader-scroll {
        flex: 1;
        min-height: 0;
        overflow-y: auto;
        overflow-x: hidden; /* 旋转盒宽高过渡期间可能瞬时比容器宽 1-2px，禁掉横向滚动条 */
        -webkit-overflow-scrolling: touch;
        overscroll-behavior: contain;
        padding-bottom: 3.6rem;
        /* 隐藏纵向滚动条，但保留滚动能力（滚动条会压住正文右侧的文字与图片）。
           两套写法缺一不可：Firefox 用 scrollbar-width，WebKit/Chromium（含微信 X5/WKWebView）用 ::-webkit-scrollbar。
           注意不能把 overflow-y 改成 hidden —— 那会直接失去滚动，这里是"隐藏滚动条"而非"禁止滚动"。 */
        scrollbar-width: none; /* Firefox */
        -ms-overflow-style: none; /* 旧 Edge/IE */
      }
      .reader-scroll::-webkit-scrollbar {
        width: 0;
        height: 0;
        display: none; /* WebKit/Chromium：连同轨道一起消失，不占宽度 */
      }
      /* 浮动按钮层：锚定卡片右下角，不随覆盖层滚动 */
      .card-fab {
        position: absolute;
        right: 0.9rem;
        bottom: 0.9rem;
        z-index: 20;
        display: flex;
        gap: 0.55rem;
      }
      .fab-btn {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 0.12rem;
        width: 2.9rem;
        height: 2.9rem;
        border-radius: 0.5rem;
        /* 与引导条按钮同款：白底浅描边，无彩色背景 */
        border: 1px solid #e2e8f0;
        background: #fff;
        color: #475569;
        cursor: pointer;
        font-family: inherit;
        transition: all 0.15s;
      }
      /* 返回箭头实心粗 → 视觉本来就大，缩小；发布/放弃/分享放大补足，整体大小接近 */
      .fab-btn .icon {
        width: 1.35rem; /* 返回：缩小（图形轮廓 ≈18px） */
        height: 1.35rem;
      }
      .fab-btn .icon[data-ic="ic-publish"] {
        width: 1.72rem; /* 发布：放大，box 更方 */
        height: 1.5rem;
      }
      .fab-btn .icon[data-ic="ic-discard"] {
        width: 1.6rem; /* 放弃：放大、正方形 box */
        height: 1.6rem;
      }
      .fab-btn .icon[data-ic="ic-share"] {
        width: 1.72rem; /* 分享：放大 */
        height: 1.5rem;
      }
      .fab-btn .lbl {
        font-size: 0.62rem; /* 文本放大 */
        line-height: 1;
      }
      /* 发布/放弃的颜色与其余按钮统一（与 .fab-btn 相同） */
      .fab-btn:hover {
        border-color: #2563eb;
        color: #2563eb;
        background: #eff6ff;
      }
      .fab-btn:active {
        transform: scale(0.94);
      }

      /* Footer */
      footer {
        margin-top: auto;
        border-top: 1px solid var(--border);
        background: #fff;
        flex-shrink: 0;
        -webkit-text-size-adjust: none; /* 元素级禁 Font Boosting：备案/累计访问微字号，国产 WebView 会放大长句 */
        text-size-adjust: none;
      }
      footer .container {
        padding: clamp(0.3rem, calc(0.25rem + 0.2vw), 0.4rem) clamp(0.4rem, calc(0.2rem + 1.2vw), 1rem); /* 原 桌面0.4/移动0.3 双值 → 连续 */
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 0.6rem;
        position: relative;
      }
      .footer-icp {
        font-size: calc(5px + 0.9vw); /* 老内核兑底 */
        font-size: clamp(7px, calc(5px + 0.9vw), 10px); /* 原 0.52rem：改 px+vw 曲线，脱离根字号（微信/国产 WebView 内联覆盖根 → rem 污染） */
        color: var(--muted);
        display: flex;
        align-items: center;
        gap: 0.3rem; /* 老内核兑底（X5 不支持 flex gap） */
        gap: clamp(0.2rem, calc(0.15rem + 0.3vw), 0.4rem); /* 原 桌面0.4/移动0.2 断点双值 → 连续 */
        flex-wrap: nowrap;
        white-space: nowrap;
        min-width: 0;
      }
      .footer-icp a {
        color: var(--muted);
        text-decoration: none;
        transition: color 0.2s;
      }
      .footer-icp a:hover {
        color: var(--accent);
      }
      .footer-icp .police-icon {
        width: clamp(0.7rem, calc(0.65rem + 0.2vw), 0.8rem); /* 原 桌面0.8/移动0.7 → 连续 */
        height: clamp(0.7rem, calc(0.65rem + 0.2vw), 0.8rem);
        vertical-align: middle;
        margin-right: 0.2rem;
        margin-top: -0.1rem; /* 补偿 vertical-align:middle 对中文基线的 +2px 偏差，令图标与文本上下中心对齐 */
      }
      .footer-icp .sep {
        color: var(--border);
      }

      /* Visitor counter */
      .visitor-count {
        flex-shrink: 0;
        text-align: right;
        white-space: nowrap;
        min-width: 0;
      }
      .visitor-count .label {
        font-size: calc(2.7px + 0.56vw); /* 老内核兑底 */
        font-size: clamp(4.4px, calc(2.7px + 0.56vw), 6.3px); /* 原 0.325rem：px+vw 曲线，全宽度恒 ≈ 备案 ×0.6（约一半） */
        color: var(--muted);
        letter-spacing: 0.4px;
        line-height: 1.3;
      }
      .visitor-count .num {
        font-size: calc(2.7px + 0.56vw); /* 老内核兑底 */
        font-size: clamp(4.4px, calc(2.7px + 0.56vw), 6.3px); /* 同上：字重 400 保持（粗体在微字号下视觉膨胀） */
        font-weight: 400;
        color: var(--muted);
        font-variant-numeric: tabular-nums;
        letter-spacing: 0.25px;
        line-height: 1.3;
      }

      @media (max-width: 768px) {
        /* 布局断点（3Dmarket 口径：布局类断点合法，字号/间距断点禁止）——
           此处只保留布局规则；字号/间距已全部迁为基础态的连续 clamp */
        .tab-btn {
          flex: 1 0 auto;
          min-width: 0;
          text-align: center;
          white-space: nowrap;
        }
        .nav-links {
          flex-wrap: nowrap;
        }
        /* 标题掩码宽度布局（justify 铺满目标宽）：窄屏 5rem、宽屏 6.6rem */
        .logo-text {
          width: 5rem; /* 掩码从 .logo-title 移至容器：title/sub 100% 居中，窄屏同样强制同轴 */
        }
        /* 原 .logo-sub 字号断点覆盖 0.34rem 已删：改为基础态 px+vw 连续曲线（见基础规则），
           不再依赖 rem → 防微信/国产 WebView 根字号污染 */
      }

      /* ---------- ⑥ 放开双指缩放后的表单聚焦放大防御 ----------
         iOS 对 font-size < 16px 的 input/textarea/select 聚焦时会自动放大整页。
         以前被 viewport 的 maximum-scale=1 压住，放开视觉缩放后该行为回归。
         只对 iOS（-webkit-touch-callout 支持探测）抬高表单控件字号下限，
         不触碰正文 rem 体系（正文是 contenteditable，iOS 不会聚焦放大）。 */
      @supports (-webkit-touch-callout: none) {
        input:not([type="file"]),
        textarea,
        select {
          font-size: max(16px, 0.9rem);
        }
      }
