:root{
  --blue:#2f6fed; --blue-d:#2458c4; --bg:#eef2f9; --card:#ffffff;
  --line:#dfe6f0; --txt:#1f2937; --mut:#7a8699; --red:#d93026;
  --green:#0a8f5c; --amber:#b7791f; --warn:#9a5b0e;
  /* =====  全站间距节奏(想整体再紧一点/松一点,只改这四个数就行) =====
   * 之前各页面框架间隙从 10px 到 16px 不等、个别页面甚至 118px,看起来忽松忽紧。
   * 现在统一:上下两个框之间 14px(不散也不挤),左右并排的框之间 12px,
   * 主区上留白 18px / 下留白 30px(原来下留白 40px,底部空一大截)。 */
  --gap-frame:6px;    /* (用户需求:全站所有卡片空隙去除,不要留太多空白):14→6px,上下相邻卡片几乎贴住 */
  --gap-col:12px;     /* 左右并排框架之间的空隙 */
  --pad-main-t:10px;  /* :主内容区顶部留白 18→10px */
  --pad-main-b:16px;  /* :主内容区底部留白 30→16px */
}
*{box-sizing:border-box; -webkit-tap-highlight-color:transparent;}
.hidden{display:none !important;}
html,body{margin:0;padding:0;}
/* (网页跳一下/点了没反应):永远占住纵向滚动条的槽位 ——
   页面刚画出来时文档矮、没有滚动条,等列表异步填充后文档变高、滚动条冒出来,
   可视宽度一下少十几像素 → 整页内容被横向挤 ~7px。预留槽位后,滚动条出不出现都不影响布局。 */
html{scrollbar-gutter:stable;}
body{
  background:var(--bg); color:var(--txt);
  font:14px/1.6 "Microsoft YaHei","PingFang SC","Segoe UI","Segoe UI Emoji","Segoe UI Symbol",system-ui,sans-serif;
  user-select:text; -webkit-user-select:text; -moz-user-select:text;  /* :原为 none(全站禁止选中),用户要求「都可以复制」→ 放开正文选中 */
}
input,textarea,button{font-family:inherit;font-size:14px;user-select:text;-webkit-user-select:text;}
.wrap{max-width:960px;margin:0 auto;padding:0 16px;}
/* ---------- 顶栏 ---------- */
/* 2026-09-14(层级修复):顶栏提到 1000 —— 站点内「页面级全屏/浮层」的 z-index 只允许
 * 在 1000 以下(如文件浏览页 VS Code 工作台 #vscApp 的 900),否则会把顶栏与
 * 用户账号下拉菜单整片盖住(现象:文件浏览页点账号,菜单弹不出来/被工作台压住)。
 * 需要盖住顶栏的只有「模态弹窗/右键菜单」,它们统一用 1200 以上(见 toasts/pj-ov 等)。 */
.topbar{background:linear-gradient(90deg,#1d4ed8,#2f6fed);color:#fff;
  box-shadow:0 2px 10px rgba(30,60,140,.18); position:sticky;top:0;z-index:1000;}
/* ════════════════════════════════════════════════════════════════════════════
 * (用户@图需求「登录后网站优化按照图片排版」)—— 顶栏改成**三排**网格
 *
 * 用户图上写得很清楚:
 *   第一排  正中间 = 时间 + 日期 + 一直到现在(所在地区)   最右侧 = 账号昵称 + 网站语言
 *   第三排  最左边 = 网站内部路径(面包屑)                正中间 = 我的主页/时光贴吧/时光广场/共享时光/时光云服务
 *
 * 改之前的实际排版(CDP 实测 1600×1000):
 *   第1排: 时光智库 | 时钟(10:12:24 10月23日 农历 巳时 宜 定位中…) | 石上少年 | 中文
 *   第2排: 时光智库 › 个人分类 › 时光贴吧(发帖/回帖)   |   我的主页 时光贴吧 时光广场 时光云服务 共享时光
 *   ⇒ 只有两排;时钟不在正中间(被品牌挤到右侧),路径与导航挤在同一排。
 *
 * 改法:DOM 结构不动(仍由 server.js 的 layout() 输出同一批 id/class),
 *       纯 CSS 把 .topbar-in 从「flex + order 混排」改成 **grid 三行三列**:
 *         第1行: [空] [时钟] [账号昵称 + 语言]      ← 时钟落在正中列,账号+语言在右列
 *         第2行: [品牌 时光智库]                      ← 单独一排(原本挤在第1排最左)
 *         第3行: [面包屑路径] [五个导航]              ← 路径在最左列,导航在正中列
 *       ⚠ 为什么把品牌挪到第2排:第1排正中间要留给时钟,
 *         而品牌(时光智库)不占正中列时会跟时钟抢位置 —— 挪到第2排独占一行,
 *         正好凑成用户图上的「三排」,且第一排左端空出来给汉堡按钮。
 *       ⚠ 面包屑槽位(.top-path-slot)原来在 .topbar 外面(与 .topbar-in 并列的 flex 格),
 *         这次把它挪进 .topbar-in 内部才能进 grid 的第3行第1列。
 *         ⇒ server.js 那边要同步改(见 layout() 的 topbar 输出)。
 * ════════════════════════════════════════════════════════════════════════════ */
/* :面包屑(顶栏路径)原本单独占 .topbar 的一个 flex 格(宽=侧栏宽,靠屏幕左缘);
    起它进了 .topbar-in 内部(与导航同行),.topbar 不再是两格 flex 布局。
   ⚠ display:block 是必要的(原来是 display:flex + align-items:stretch);
      position:sticky 保留在上面第 33 行那条里,sticky 元素自身就是绝对定位的 containing block。 */
/* 三行网格:第1行(时钟居中/账号右)、第2行(品牌)、第3行(路径左/导航中)
   ⚠ (用户@图「品牌不要加」):品牌块已从 HTML 删除 ⇒ 网格只剩**两行**:
         第1行 = 时钟(正中) + 账号昵称/语言(最右)
         第2行 = 面包屑路径(最左) + 五个导航(正中)
      行模板从 auto auto auto 减成 auto auto —— 留三个 auto 会多出一条空行,
      顶栏凭空高出一截(内容不多但空一格,用户看着别扭)。
   ⚠ 列模板仍是 3 列:第1行整行由 .topbar-r1 独占(它内部自己 grid 居中),
   第2行的导航也整行横跨 ⇒ 1fr auto 1fr 这个「正中列」只服务于 .nav 内部。
   ⚠⚠⚠ (用户@图「最左侧(路径)空出30px / 最右侧(账号昵称+语言)空出30px」):
     内容区**撑满顶栏宽**(见下面 .topbar .wrap 的 max-width:none),左右各留 30px 内边距 ——
     ⇒ 路径贴内容区左缘 = 离屏幕左缘 30px;
       右区贴内容区右缘 = 离屏幕右缘 30px;
     ⇒ 两侧留白只跟 padding 有关,与视口宽/滚动条无关 ⇒ 任何宽度都精确 30px;
     ⇒ 因为是对称内缩,内容区正中仍是视口正中 ⇒ 时钟/导航的居中**完全不受影响**。
   ⚠⚠⚠ 为什么不用「负 margin 把元素拉出去 + 减 30」那套:
     那是  的做法(路径/右区用 margin-left/right 负值拉到屏幕边)。
     本单要「留 30px」,若继续用负 margin 微调,会掉进 4px 偏差循环 ——
     因为 CSS 里 100vw **含滚动条宽**(实测 innerWidth=1584 / clientWidth=1569,差 15px),
     而 .topbar-in 的居中偏移是按 clientWidth 算的 ⇒ (100vw-1360)/2 与真实偏移恒差 7.5px,
     怎么调系数都对不齐。
     ⇒ 改用「撑满 + 对称内缩」:数学上只跟 padding 有关,任何宽度都精确 30px。 */
.topbar-in{display:grid;
  grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  grid-template-rows:auto auto;                             /* :品牌删除后剩两行 */
  align-items:center;
  column-gap:10px;
  row-gap:2px;
  min-height:54px;
  padding:2px 30px 4px;}                                    /* :左右各留 30px 空白 */
/* ⚠ 这里**不能**加 position:relative —— 它会成为面包屑绝对定位的基准,
   而 .topbar-in 是 .wrap(max-width:1360,居中),基准在它身上 = 路径钉在内容区左缘(x=105),
   不是屏幕最左缘。基准要用 .topbar(见下面 .topbar{position:sticky})。 */
/* ---- 第1排:时钟正中 + 账号昵称/语言最右 ----
   ⚠ 这里用**独立的一行 flex 容器**(.topbar-r1,HTML 里新加的包裹层)而不是 grid 列:
   grid 的 auto 列居中于「剩余空间」,而剩余空间被左(汉堡)和右(账号/语言)挤过 ——
   实测时钟中心 733 vs 顶栏中心 785,偏左 52px。
   .topbar-r1 内部自己 flex:[弹性空隙][时钟][弹性空隙][账号+语言],
   用 margin:auto 让时钟在**整个顶栏宽度**上严格居中,账号/语言被推到最右。 */
.topbar-r1{grid-row:1;grid-column:1 / -1;justify-self:stretch;
  display:flex;align-items:center;width:100%;min-width:0;position:relative;}
/* ⚠⚠ 时钟居中的关键:margin:auto 只在**两侧都还有弹性空间**时才对称。
   账号昵称是普通 flex 项,会吃掉右侧空间 ⇒ auto 分配不对称,时钟偏左(实测偏 96px)。
   ⇒ 账号昵称用 margin-left:auto 把它推到最右区(不占时钟的 auto 空间),
     语言下拉绝对定位钉在 right:0(账号的右边),
     这样时钟的 margin:auto 在整宽里对称居中。
   ⚠ 语言下拉的宽度不固定(多语言列表),所以不能硬编码 right 的数值 ——
     改成让「账号 + 语言」一起进一个右对齐的绝对定位容器?那要改 HTML。
     这里改用:账号 margin-left:auto 推到最右,语言紧跟其后(flex 顺序),
     两者的总宽度由 flex 自然决定,时钟仍然居中于「容器宽度 - 右侧两者总宽」的中点 ——
     ⚠ 那样时钟又不是整宽居中了。
     ⇒ 真正的解法:容器改 grid,三列 [1fr] [auto 时钟] [1fr],
        账号+语言进第3列靠右 ⇒ 时钟在第2列,而两侧 1fr 等宽 ⇒ 严格居中。
        ⇒ 所以 .topbar-r1 用 grid 不用 flex,账号+语言用一个右对齐包装。
        这里不新增 HTML,而是让 .topbar-r1 自身 grid:
        .topbar-r1{display:grid;grid-template-columns:1fr auto 1fr}
        clock→第2列,top-user→第3列靠右,lang→第3列(靠右但在 top-user 右边)
        ⚠ top-user 与 lang 又要在同一格子里排两行… 用 grid-column:3 两次会重叠。
        ⇒ 给 lang 单独第4列:[1fr auto 1fr auto] —— 第3、4列不等宽,时钟不居中。
        ⇒ 干脆:lang 也绝对定位钉最右,top-user 绝对定位在 lang 左侧?
        ⚠ 宽度不定,还是硬编码。
        ⇒★ 最稳妥:把账号+语言用一个 flex 容器包起来(改 HTML 一行),
           .topbar-r1{display:grid;grid-template-columns:1fr auto 1fr}
           clock→列2,右容器→列3(justify-self:end)
           两侧 1fr 等宽 ⇒ 时钟严格居中于整条顶栏。→ 改 HTML。 */
.topbar-r1{grid-row:1;grid-column:1 / -1;justify-self:stretch;
  display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  align-items:center;width:100%;min-width:0;column-gap:10px;}
/* 时钟:正中列(两侧 1fr 等宽 ⇒ 严格居中于整条顶栏)
   ⚠ :order 统一为 2(右区是 3)—— 基础层原来写 order:0,与窄屏媒体查询的 order:2 冲突,
     窄屏下渲染顺序会乱。基础层与媒体查询保持同一套 order 值,顺序就永远一致。 */
.topbar-r1 .top-clock{grid-column:2;justify-self:center;order:2;}
/* ⚠⚠ (窄屏重叠修复):时钟本体是 flex:0 0 auto + white-space:nowrap(server.js 内联样式),
   整条时钟宽 616px(时间+日期+农历+时辰+宜+完整地址),在网格的 auto 列里**不收缩**。
   网格第3列是 1fr,装不下 200px 的右区时**内容溢出**、直接压到第2列的时钟上 ——
   视口 900px 实测「宿松县」糊在昵称上。
   算一下临界:内容区宽 = min(视口,1360) - 8;左右两列各 1fr = (内容区 - 616)/2,
   要 ≥ 右区 200px ⇒ 内容区 ≥ 1016px ⇒ 视口 ≥ 1024px。
   ⇒ 所以在 ≤1180px 改用 flex 兜底(与既有 ≤760px 断点同款思路):
     时钟 flex:1 1 auto(可收缩、可换行)、右区 flex:0 0 auto(不被压)。
   ⚠ ≥1180px 行为完全不变(时钟 616px 放得下),只窄屏才切。 */
@media(max-width:1180px){
  .topbar-r1{display:flex !important;align-items:center;width:100%;min-width:0;}
  /* ⚠⚠⚠ **时钟不能 flex-grow** —— 这是「auto margin 失效」的根因,踩了三次才找到:
   *   flex 分配空间时先按 flex-grow 分,clock 若是 flex:1 1 auto(grow=1)就把**全部剩余空间**
   *   吃光(w=867,实测);此时 top-right 的 margin-left:auto 已经**没有空间可分配**
   *   ⇒ auto 解析成 0,右区被顶到最左边(rt.x=4,离顶栏右缘 881px)。
   *   ⇒ 窄屏下时钟 flex:0 1 auto(**只收缩、不增长**),剩余空间全留给 auto margin,
   *     右区才真的贴到最右端。窄屏本来就该「时钟靠左 + 账号靠右」,不追求时钟居中。 */
  .topbar-r1 .top-clock{order:2 !important;flex:0 1 auto;min-width:0;flex-wrap:wrap;white-space:normal;row-gap:2px;margin:0;}
  /* 右区整体 margin-left:auto 贴右端,昵称自己不再 auto(否则只把昵称推到右区中间) */
  /* ⚠⚠⚠ order 也必须 !important —— 基础规则(.topbar-r1 .top-right,order:0)在本块**之后**,
     同特异度后写者赢 ⇒ 右区 order 被改回 0,渲染顺序变成「右区→时钟」反了
     (CDP 实测视口 1100:rt.x=255、ck.x=465,右区在时钟左边)。 */
  .topbar-r1 .top-right{order:3 !important;flex:0 0 auto;display:flex;align-items:center;gap:8px;
    margin-left:auto !important;margin-right:0 !important;}
  .topbar-r1 .top-user{order:0 !important;margin-left:0 !important;}
  .topbar-r1 #wbLangSel{order:0 !important;margin-left:0 !important;}
  /* ⚠⚠ 汉堡按钮在宽屏是 position:absolute(left:0,top:0)浮在顶栏上,
     窄屏切 flex 后若不复位,就会**压在时钟上面**(实测 900px:「菜单」糊在「08:48」上)。
     ⇒ 这里把它复位成正常流(flex 项,靠左)。 */
  .topbar-in .burger{position:static !important;left:auto !important;top:auto !important;
    order:0;flex:0 0 auto;align-self:center;margin-right:8px;}
}
/* 右区(账号昵称 + 语言):第3列靠右
   ⚠ :order 必须是 3(排在时钟 2 之后)。原来这里写 order:0,
     而窄屏媒体查询在**本行之前**、又没 !important ⇒ 同特异度「后写的赢」,
     窄屏下右区被排到时钟**前面**(CDP 实测 rt.x=255 / ck.x=465,顺序反了)。
     现在基础层就给 3,窄屏媒体查询同样 3,两边一致,不再靠 !important 硬压。 */
.topbar-r1 .top-right{grid-column:3;justify-self:end;display:flex;align-items:center;gap:10px;order:3;}
/* ⚠⚠ :内容区已左右**对称内缩 30px**(见 .topbar-in 的 padding:2px 30px 4px),
   右区贴内容区右缘 = 离屏幕右缘正好 30px ⇒ **不需要再往屏幕边拉**。
    那条负 margin(把右区拉到屏幕最右)必须撤掉,否则会抵消内缩、又贴回屏幕边。
   ⚠ 保留 margin-right:0 明写,防后面的窄屏基础规则干扰。 */
.topbar-r1 .top-right{margin-right:0;}
.topbar-r1 .top-user{order:0;flex:0 0 auto;margin-left:0;}
.topbar-r1 #wbLangSel{order:0;flex:0 0 auto;margin-left:0;}
/* 汉堡按钮:绝对定位到顶栏最左(有侧栏时才渲染)。
   ⚠ 它与横跨全列的 .topbar-r1 在同一格 ⇒ 绝对定位不占格子,不影响时钟居中计算。
      基准 = .topbar(position:sticky,自身即 containing block)。 */
.topbar-in .burger{position:absolute;left:0;top:0;grid-row:auto;grid-column:auto;z-index:2;}
/* 品牌:第2排独占一行(居中)
   ⚠⚠ (用户@图「品牌不要加」):顶栏里的品牌块(时光智库)**已从 HTML 里整块删掉**。
      ⇒ 第2排不再有内容,若还留着 grid-row:2 的占位,顶栏会多出一条空行(高度浪费、
         视觉上顶栏比内容空一截)。所以导航这一行从 grid-row:3 **上移到 grid-row:2**,
         「第三排」的内容紧跟在第一排下面 —— 排版仍是用户图要求的:
             第1排 = 时钟(正中) + 账号昵称/语言(最右)
             第2排 = 面包屑路径(最左) + 五个导航(正中)
      ⇒ 网格行模板也相应减成两行(grid-template-rows: auto auto)。
   ⚠ 下面这条 .brand 规则保留(不删):品牌已不在 HTML 里,但 .brand 类可能被别处复用
      (如管理后台卡片、页脚),留着无害;真要清干净,得先 grep 全站 .brand 使用者。
      只把 grid-row:2 的占位去掉,免得留一条指向空行的规则。 */
.topbar-in .brand{grid-row:auto;grid-column:auto;justify-self:auto;order:0;}
/* ---- 第3排:路径最左 + 五个导航正中 ---- */
/* ⚠⚠⚠ 这段改了三轮才对,根因值得钉住:
 *   ① 路径槽位与导航必须落在**同一 grid 行**。
 *      .nav 原本 grid-column:1/-1(横跨四列)、.top-path-slot 也是 grid-column:1 ——
 *      两者区域重叠,grid 只能把它们拆到第3行、第4行(实测导航 y=59、路径 y=78,差一整行)。
 *   ② 路径占第1列后,.nav 只剩第2~4列 —— .nav 内部再套 1fr auto 1fr,
 *      它的"中间列"是**剩余空间的正中**,不是整条顶栏的正中
 *      (实测 nav-links 中心 971,顶栏中心 785,偏右 186px)。
 *   ③ 试过「路径绝对定位」:脱离 grid 流量后,路径被钉在 .topbar-in 的 bottom,
 *      跟导航差了整整一行(y=83 vs y=59)—— 绝对定位解决不了「同行」问题。
 *   ④ 试过「路径作为 .topbar-in 的独立 grid 项」:它和 .nav 都要第3行,
 *      而 .nav 横跨全部列(grid-column:1/-1)⇒ 路径被挤到第4行(实测 y=78 vs 导航 y=59)。
 *   ⑤ ⇒ 最终结构:**路径回到 .nav 内部**,由 .nav 自己的三列网格分配:
 *        第1列 = 面包屑路径(最左)  第2列 = 五个导航(正中)  第3列 = 空(对称占位)
 *      .nav 整行横跨 .topbar-in ⇒ 第2列 auto + 两侧 1fr 等宽 ⇒ 链接严格居中于整条顶栏。
 *      这样路径与导航天然同一行,又各自贴边(路径右缘 < 链接组左缘,不会重叠)。
 */
/* 导航:第2行整行横跨,内部三列 = [路径 | 链接 | 空] */
.topbar-in .nav{grid-row:2;grid-column:1 / -1;order:0;width:100%;
  padding:2px 0 0;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;}
/* 导航链接组:在 .nav 的中间列(= 顶栏正中) */
.topbar-in .nav .nav-links{grid-column:2;display:flex;gap:4px;align-items:center;flex-wrap:wrap;justify-content:center;min-width:0;}
/* 面包屑路径:第3排最左。
/* 面包屑路径:第3排最左(用户@图:「第三排 最左边 = 网站内部路径」)。
   ⚠⚠⚠ 这块改了好几轮,根因钉在这里 —— 「贴屏幕最左」与「与导航同行」两个要求会互相打架:
   【1】路径作为 .topbar-in 的独立 grid 项 → 与 .nav 抢第3行,而 .nav 横跨全部列
        (grid-column:1/-1)⇒ 路径被挤到第4行(实测 y=77 vs 导航 y=59)。
   【2】路径绝对定位到 .topbar(屏幕最左)→ 水平对了,但**垂直用 bottom 不可靠**:
        顶栏高度随页面内容变(/legend 那页多一行,顶栏高 126),固定 bottom 会把路径
        甩到第4排(实测 y=87 vs 导航 y=58)。
   【3】⇒ 正确解:**基准用 .nav**(它只有第3排那一行高)
        ⇒ 路径 position:absolute; bottom:0,垂直**永远**与导航同行,顶栏几行高都不怕;
        水平:基准是 .nav ⇒ 左缘 = 内容区左缘(视口 1569 时 x=105),不是屏幕最左 —
        用 margin-left 再往左拉「内容区居中偏移量」=(100vw-1360px)/2,窄屏时为 0(max() 是标准函数)。
        ⇒ 净效果:宽屏路径贴屏幕最左、窄屏贴内容区左缘,且永远与导航同行。
   ⚠ 链接组仍严格居中:.nav 保持 1fr auto 1fr,路径绝对定位不占格子 ⇒ 列模板不变。 */
.topbar-in .nav{position:relative;}   /* 路径绝对定位的基准(只有第3排高 ⇒ bottom 永远对) */
/* ⚠⚠ (用户@图「第三排 最左边(网站内部路径) 空出30px」):
   内容区已左右**对称内缩 30px**(见 .topbar-in 的 padding:2px 30px 4px)——
   ⇒ 路径只要贴住内容区左缘,离屏幕左缘就正好 30px,不需要再往屏幕外拉。
   ⇒ 撤掉  那条负 margin(margin-left:calc(0 - max(0,(100vw-1360)/2))),
     它会把路径拉到屏幕最左(=留白 0px),与本单要求相反。
   ⚠⚠⚠ 为什么不用「负 margin 减 30」那套:
     CSS 里 100vw **含滚动条宽**(实测 innerWidth=1584 / clientWidth=1569,差 15px),
     而 .topbar-in 的居中偏移按 clientWidth 算 ⇒ (100vw-1360)/2 与真实偏移恒差 7.5px,
     怎么调系数都对不齐(会陷入 4px 偏差循环)。
     ⇒ 改用「对称内缩」:只跟 padding 有关,与视口宽/滚动条无关,任何宽度都精确 30px。
     ⇒ 顺便:对称内缩后内容区正中仍是视口正中 ⇒ 时钟/导航居中完全不受影响。 */
.topbar-in .nav .top-path{position:absolute;left:0;bottom:0;
  margin-left:0;
  grid-column:auto;justify-self:auto;align-self:auto;
  min-width:0;max-width:34vw;}

/* ⚠⚠⚠ **关键坑**:topPathSpanHtml() 返回的是
 *      '<span class="top-path">…</span>' + '<script>window.WB_TOPPATH=…</script>'
 *   —— 那个 <script> 是 .nav 的**直接子元素**!在 grid 里,script 也是一个网格项,
 *   它占了第3列(auto),把真正的路径挤到第4行(实测:链接 y=59、路径 y=77,差一整行)。
 *   ⇒ 让 script 脱离 grid 流量:position:absolute(脚本照样执行,只是不占格子)。
 *   ⚠ 不能用 display:none —— 那样脚本不会执行,window.WB_TOPPATH 没了,面包屑不显示。
 *   ⚠ 也不能用 display:contents —— script 没有盒子,content 会被浏览器忽略。
 */
.topbar-in .nav > script{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;}
/* 品牌在第2排独占一行,可以稍大一点(它现在是独立一行的主标题) */
.topbar-in .brand{font-size:18px;padding-right:0;letter-spacing:1px;}
.brand{color:#fff;text-decoration:none;font-size:17px;font-weight:700;letter-spacing:.5px;white-space:nowrap;flex:none;padding-right:4px;}
/* :min-width:max-content + 横向滚动 改为 flex-wrap:wrap —— 放不下的导航项自动换到第二排 */
.nav{display:flex;gap:4px;flex:1 1 auto;min-width:0;align-items:center;flex-wrap:wrap;row-gap:3px;padding:2px 0;}
/* (用户@图需求):顶栏路径改成与电脑系统(资源管理器)一致 —— 面包屑分段
   「此电脑 ❯ 本地磁盘 (D:) ❯ …」,段可点(复制该层路径);仍排在导航最左边 */
/* (用户@图需求):白色框去掉 —— 面包屑只留文字(去掉半透明白底+白边框+圆角);
   点段复制成功时仍临时显示绿色底作反馈(.is-copied 规则保留) */
.top-path{flex:0 0 auto;margin-right:0;min-width:0;display:inline-flex;align-items:center;gap:1px;
  font-size:12.5px;color:#dbe6ff;background:none;border:none;
  padding:4px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  max-width:56vw;user-select:none;transition:.15s;}
.top-path .tp-seg{padding:2px 5px;border-radius:5px;cursor:pointer;transition:.15s;}
.top-path .tp-seg:hover{background:rgba(255,255,255,.22);color:#fff;}
.top-path .tp-dots{padding:2px 4px;color:rgba(255,255,255,.6);}
/* (用户@图需求):面包屑段与段之间显示「❯」箭头 —— tp-sep 这个 span 原来是空的
   ( 注释里写了「此电脑 ❯ 本地磁盘」,但字形一直没画出来,所以「时光智库 管理后台」中间是空格),
   补 ::before 把箭头画出来;颜色沿用原 .tp-sep 的半透明白 */
.top-path .tp-sep::before{content:'❯';}
.top-path .tp-sep{color:rgba(255,255,255,.55);font-size:10.5px;flex:none;}
.top-path.is-copied{background:#16a34a;border-color:#16a34a;color:#fff;}
.top-path.is-copied .tp-sep{color:rgba(255,255,255,.8);}
/* :导航改为可换行(分类/路径放不下时自动换到下一排,顶栏高度自适应)
   ⚠ :这条旧规则已由上面第 147 行的新版取代(新版带 grid-row:3 / grid-column:1/-1 /
   order:0),留在这里会用 order:10 + 旧 padding 覆盖掉它 —— 删掉,只保留下面的链接组规则。 */
/* :链接组 = 网格第 2 列(auto) → 永远处于顶栏水平正中央;左右两个 1fr 轨道等宽 */
.nav a{color:#e7eeff;text-decoration:none;padding:6px 10px;border-radius:8px;font-size:13.5px;transition:.15s;white-space:nowrap;flex:none;}
.nav a:hover{background:rgba(255,255,255,.14);color:#fff;}
.nav a.on{background:rgba(255,255,255,.22);color:#fff;font-weight:600;box-shadow:inset 0 -2px 0 rgba(255,255,255,.5);}
/* 顶栏单独放宽一点(主导航条目多:帖子/时光/传奇/文件树/隐藏/后台) */
/* :顶栏内容区从 1180 放宽到 1320 —— 顶栏要放「品牌 + 导航 + 时钟(时间/阳历/农历/时辰/宜/地址) + 账号」,
   1180 装不下,时钟会把导航挤出横向滚动条(现象:「共享时光」被切掉半截)。 */
/* (用户@图需求「红框区域应该靠最左边」—— 病根:这一格只写了 max-width:1360px,
   而 .wrap 的 margin:0 auto 仍然生效。顶栏从  起是 flex 两格布局:
   [ .top-path-slot(宽=侧栏宽) ][ .topbar-in(.wrap) ]。
   视口窄于 1360 时 auto 居中算出来是 0,看起来一切正常;一旦视口 ≥1360(实测 1920 宽),
   auto 就把 topbar-in 往右推 —— CDP 实测 margin 算出 0 128.562px,
   槽位(0~328)与内容(457~)之间凭空多出 129px 空隙,面包屑被甩到中间偏右,
   正是用户截图里"时光智库 ❯ 共享时光"飘在中间的原因。
   修:顶栏这一格取消水平居中(margin:0),内容紧贴面包屑槽位右缘。
   max-width:1360 保留 —— 它是"内容再宽也不超过 1360、右侧留白"的意图,只是不该再居中。 */
/* ⚠ :面包屑槽位已挪进 .topbar-in 内部(grid 第3行第1列),
   顶栏不再是「槽位 + 内容」两格,内容区要**恢复水平居中** ——
   否则宽屏下整块内容贴左,「正中间」的时钟与导航会偏到左边去(与用户@图要求相反)。
 * ⚠⚠⚠ (用户@图「最右侧(账号昵称+网站语言)空出30px / 最左边(网站内部路径)空出30px」):
   max-width:1360 **必须去掉**。原因:顶栏通栏、内容区居中时,宽屏下内容区左右
   本来就有 (视口-1360)/2 的空隙(实测视口 1569 时左右各 104px)——
   也就是说「离屏幕边」最少就是 104px,**永远不可能是 30px**。
   ⇒ 改成内容区**撑满顶栏宽**(max-width:none;margin:0),左右各留 30px 内边距:
       路径贴内容区左缘 = 离屏幕左缘 30px;右区贴内容区右缘 = 离屏幕右缘 30px。
   ⇒ 撑满后**对称**内缩 ⇒ 内容区正中仍是视口正中
     ⇒ .topbar-r1 的 grid(1fr auto 1fr)让时钟居中于视口
     ⇒ .nav 的 grid(1fr auto 1fr)让五个导航居中于视口
     两者都严格居中,不受影响。 */
.topbar .wrap{max-width:none;margin-left:0;margin-right:0;}
/* :导航不再被裁之后,窄屏(≤1024)一排实在装不下「品牌+导航+时钟+账号+返回后台」,
   这时让导航退回可压缩 + 横向滚动(与老行为一致),绝不把顶栏撑出横向滚动条 */
@media(max-width:1024px){.nav{min-width:0}}
/* ---------- 顶栏「用户账号」下拉菜单 ---------- */
.top-user{position:relative;}
.top-caret{font-size:14px;opacity:.85;margin-left:2px;transition:transform .15s;} /* :三角形全站统一放大(下同) */
.top-user.menu-open .top-caret{transform:rotate(180deg);}
button.top-user-link{border:none;background:transparent;cursor:pointer;font-family:inherit;}
.user-menu{position:absolute;top:calc(100% + 10px);right:0;min-width:176px;
  background:#fff;border:1px solid var(--line);border-radius:12px;padding:6px;
  box-shadow:0 12px 30px rgba(20,40,90,.20);display:flex;flex-direction:column;z-index:120;}
.user-menu[hidden]{display:none;}
.user-menu::before{content:"";position:absolute;top:-6px;right:18px;width:10px;height:10px;
  background:#fff;border-left:1px solid var(--line);border-top:1px solid var(--line);transform:rotate(45deg);}
.um-item{display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:8px;
  color:#33415c;text-decoration:none;font-size:13.5px;white-space:nowrap;transition:.12s;}
.um-item:hover{background:#f0f5ff;color:var(--blue);}
.um-item.um-logout{color:#c0392b;margin-top:4px;padding-top:10px;border-top:1px solid var(--line);border-radius:0 0 8px 8px;}
.um-item.um-logout:hover{background:#fdeceb;color:#a3261d;}
/* ---------- 主区 ---------- */
main.wrap{padding-top:var(--pad-main-t,18px);padding-bottom:var(--pad-main-b,30px);}   /* :上 22→18 / 下 40→30,整页不再头重脚轻 */
/* (全站间距统一):框架与框架之间统一 14px —— 比原来的 16 略收(不显散),
 * 又比个别页面的 10px 略放(不显挤),全站一个节奏。水平并排的框架用 12px(见 .plan-main 等)。 */
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:18px 20px;margin-bottom:var(--gap-frame,14px);
  box-shadow:0 1px 3px rgba(20,40,90,.05);}
.card h2{margin:0 0 12px;font-size:18px;}
.card h3{margin:0 0 10px;font-size:15px;}
.sub{color:var(--mut);font-size:12.5px;margin:0 0 12px;}
/* (用户@图需求「同一排文字要整整齐齐,字体字号大小一样」,全站规则):
 * 病根(真机 CDP 审计 /admin 实锤 22 处):①h2/h3 里的 .sub 说明(12.5px)跟标题(15/18px)同排,字号不一;
 *   ②横向 flex 行里的 .sub 自带 margin-bottom:12px,在 align-items:center 下把文字顶偏 ~6px
 *   (系统分站标题 -6px、一键禁止/恢复按钮行、QQ检测/APP遥控 label 行全中招);
 * 修法:标题里的 .sub 字号跟随标题(flex/inline 通吃,inline 下 margin 本来就不生效,一并清掉);
 *   横向 flex 容器的 .sub 直接子元素清边距+字号随容器(与按钮/输入框/label 的 14px 一致)。
 * 纵向 flex(column)与普通块级段落 .sub 不受影响,间距照旧。 */
h2 .sub,h3 .sub{font-size:inherit;margin:0;}
[style*="display:flex"]>.sub,[style*="display: flex"]>.sub,
[style*="display:inline-flex"]>.sub,[style*="display: inline-flex"]>.sub{margin:0;font-size:inherit;}
/* 横幅消息 */
.banner{padding:10px 14px;border-radius:10px;margin-bottom:14px;font-size:13.5px;}
.banner.ok{background:#e6f6ee;color:#0a6b44;border:1px solid #bce8d0;}
.banner.err{background:#fdeceb;color:#a3261d;border:1px solid #f5c6c2;}
/* 按钮 */
.btn{display:inline-block;border:none;cursor:pointer;border-radius:8px;padding:8px 16px;
  background:#e8edf6;color:#334;text-decoration:none;font-size:13.5px;transition:.15s;line-height:1.4;}
.btn:hover{filter:brightness(.96);}
.btn.primary{background:var(--blue);color:#fff;}
.btn.primary:hover{background:var(--blue-d);}
.btn.red{background:#fdeceb;color:#a3261d;}
.btn.red:hover{background:#f8d7d4;}
.btn.green{background:#e6f6ee;color:#0a6b44;}
.btn.amber{background:#fdf3e3;color:#8a5a10;}
.btn.ghost{background:transparent;border:1px solid var(--line);color:#5a6b85;}
.btn.sm{padding:4px 10px;font-size:12.5px;border-radius:7px;}
.btn.block{width:100%;text-align:center;}
.btn:disabled{opacity:.55;cursor:not-allowed;}
/* 表单 */
label.fl{display:block;margin:12px 0 5px;font-size:13px;color:#3c4a5e;font-weight:600;}
input.txt,textarea.txt{width:100%;border:1px solid #ccd6e4;border-radius:9px;padding:9px 12px;outline:none;
  background:#fbfcfe;transition:.15s;}
input.txt:focus,textarea.txt:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(47,111,237,.12);background:#fff;}
textarea.txt{resize:vertical;min-height:88px;}
.ferr{color:var(--red);font-size:13px;margin:8px 0 0;min-height:0;display:none;}
.ferr.show{display:block;}
.hint{font-size:12px;color:var(--mut);margin-top:4px;}
/* 登录 / 注册 卡片 */
.auth-wrap{max-width:420px;margin:26px auto 0;}
.auth-head{text-align:center;margin-bottom:6px;}
.auth-head .t{font-size:20px;font-weight:700;}
.auth-head .s{color:var(--mut);font-size:12.5px;margin-top:2px;}
.auth-foot{text-align:center;margin-top:14px;font-size:13px;color:var(--mut);}
.auth-foot a{color:var(--blue);text-decoration:none;}
/* 注册页:服务器已登录QQ状态条 */
.qq-srv{margin:10px 0 2px;font-size:12.5px;background:#eef7f4;border:1px solid #bfe6d0;color:#1c5c46;
  border-radius:10px;padding:8px 12px;line-height:1.5;}
.qq-srv.warn{background:#fff6e6;border-color:#f2d49b;color:#7a5a10;}
/* 快速登录记录 */
.rec-box{margin-top:14px;border-top:1px dashed var(--line);padding-top:12px;}
.rec-title{font-size:12px;color:var(--mut);margin-bottom:8px;}
.rec{display:block;width:100%;text-align:left;border:1px solid var(--line);background:#f6f9fe;
  border-radius:9px;padding:8px 12px;margin-bottom:8px;cursor:pointer;transition:.15s;color:var(--txt);}
.rec:hover{border-color:var(--blue);background:#eef4ff;}
.rec b{color:var(--blue-d);}
.rec .dot{color:var(--mut);font-family:monospace;}
.req{color:var(--red);}
/* QQ登录区 */
.qq-sec{margin-top:14px;border-top:1px dashed var(--line);padding-top:12px;}
.qq-title{font-size:13px;color:#1f2937;font-weight:600;margin-bottom:8px;}
.qq-title .hint{font-weight:400;color:var(--mut);}
.qq-list{display:flex;flex-direction:column;gap:6px;margin-bottom:8px;}
.qq-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:1px solid var(--line);
  background:#f6f9fe;border-radius:9px;padding:7px 12px;cursor:pointer;transition:.15s;color:var(--txt);}
.qq-item:hover{border-color:#12b7f5;background:#eef9ff;}
.qq-item img{width:34px;height:34px;border-radius:50%;object-fit:cover;background:#dde7f5;flex:none;}
.qq-item .qq-name{font-weight:600;color:var(--blue-d);}
.qq-item .qq-num{color:var(--mut);font-size:12px;margin-left:auto;}
.qq-item .go{margin-left:auto;color:#2f6fed;font-size:12px;}
.qq-item .del{margin-left:8px;color:#aab8c6;font-size:12px;line-height:1;padding:4px 6px;border-radius:6px;cursor:pointer;flex:none;transition:.15s;}
.qq-item .del:hover{color:#fff;background:#e05b4c;}
.qq-none{font-size:12.5px;color:var(--mut);padding:2px 0 8px;}
.qq-type{margin-top:2px;}
.qq-type-row{display:flex;gap:8px;align-items:center;}
.qq-type-row .txt{flex:1;min-width:0;}
.qq-title2{font-size:12px;color:var(--mut);margin:2px 0 6px;}
.qq-title2 .hint{font-weight:400;}
.qq-st{font-size:11px;font-weight:600;padding:1px 8px;border-radius:999px;background:#fdf3e3;color:#8a5a10;white-space:nowrap;}
.qq-st.ban{background:#fdeaea;color:#c0392b;}
.qq-item[disabled]{opacity:.62;cursor:not-allowed;}
.qq-item[disabled]:hover{border-color:var(--line);background:#f6f9fe;}
/* 发帖 */
.post-form textarea{min-height:110px;}
/* 帖子卡片 */
.p-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 18px;margin-bottom:12px;}
.p-content{white-space:pre-wrap;word-break:break-word;font-size:14px;margin:0 0 10px;}
.p-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;color:var(--mut);
  border-top:1px dashed var(--line);padding-top:9px;}
.p-meta .who{color:var(--blue-d);font-weight:600;}
.p-actions{margin-left:auto;display:flex;gap:6px;align-items:center;}
.chip{display:inline-block;font-size:11px;padding:1px 8px;border-radius:20px;background:#eef1f6;color:#6b7a93;}
.chip.hid{background:#fdf3e3;color:#8a5a10;}
.chip.ed{background:#e8f0ff;color:#2458c4;}
.chip.admin{background:#ffe9e6;color:#b03a2e;}
.chip.pending{background:#fdf3e3;color:#8a5a10;}
.chip.banned{background:#fdeceb;color:#a3261d;}
.chip.normal{background:#e6f6ee;color:#0a6b44;}
.chip.qqchip{background:#eefaff;color:#0a86c4;}
.chip.qqchip.none{background:#f2f4f8;color:#9aa7ba;}
a.chip.qqchip.link{text-decoration:none;cursor:pointer;}
a.chip.qqchip.link:hover{background:#d9f0ff;color:#046a9c;box-shadow:0 0 0 1px #8fd0f5;transform:translateY(-1px);}
a.chip.qqchip.link:active{transform:translateY(0);}
/* 行内编辑框 */
.in-edit{display:none;margin-top:10px;background:#f7fafd;border:1px dashed #b9c8e2;border-radius:9px;padding:10px;}
.in-edit.show{display:block;}
.in-edit textarea.txt{min-height:340px;max-height:70vh;}
/* 50 行 textarea 在长帖编辑时让用户一眼能看完整篇;超过 70vh 时内部滚动,避免撑爆页面 */
.in-edit .edit-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px;}
.in-edit .edit-hint{font-size:12px;color:var(--mut);line-height:1.6;flex:1;min-width:0;}
.in-edit .btns{display:flex;gap:8px;margin-top:8px;justify-content:flex-end;}
/* 空状态 */
.empty{text-align:center;color:var(--mut);padding:34px 10px;font-size:13.5px;}
.empty .big{font-size:34px;display:block;margin-bottom:8px;}
/* ===== 20261004:编辑器查找/替换输入框靠左 =====
 * 病根:Monaco 编辑器会给「空的输入框」动态加 .empty 类(查找条/替换条/快速打开都有),
 * 撞车了本站空状态样式 .empty{text-align:center},导致查找/替换框一空、占位文字就居中显示。
 * 修法:Monaco 输入框内的输入框一律靠左(text-align 可继承,直接钉死 start),只影响编辑器
 * 内部的输入框,网站其它地方的 .empty 空状态提示不受影响(它们不在 .monaco-inputbox 里)。 */
.monaco-inputbox .input.empty{text-align:left !important;}
.monaco-inputbox .input{text-align:left;}
/* 各自研编辑器的查找/替换输入框(文档编辑器/CodeMirror 面板/时光文本小查找条)统一靠左兜底 */
.doc-findbar input,.lte-find,.lte-rep,.lt-ed-find input{text-align:left;}
/* 首页 hero */
.hero{text-align:center;padding:46px 10px 8px;}
.hero h1{font-size:26px;margin:0 0 6px;}
.hero p{color:var(--mut);margin:4px 0 22px;font-size:14px;}
.hero .btns{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;}
.hero .btn{min-width:150px;padding:12px 18px;font-size:15px;border-radius:10px;}
.hero .btn.reg{background:#fff;color:var(--blue);border:1.5px solid var(--blue);}
.hero .btn.reg:hover{background:#eef4ff;}
.feats{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px;margin-top:34px;}
.feat{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px;font-size:13px;color:#43526b;}
.feat b{color:var(--blue-d);}
/* 统计条 */
.stats{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:14px;}
.stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:8px 16px;font-size:13px;}
.stat b{font-size:18px;color:var(--blue-d);display:inline-block;margin-right:4px;}
/* 表格横向滚动容器(小屏可滑) */
.tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:8px;}
.tbl-scroll::-webkit-scrollbar{height:6px;}
.tbl-scroll::-webkit-scrollbar-thumb{background:#c6d2e4;border-radius:3px;}
/* 表格 */
table.tbl{width:100%;border-collapse:collapse;font-size:13px;}
.tbl th{text-align:left;background:#f3f6fb;color:#44536b;font-weight:600;padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap;}
.tbl td{padding:9px 10px;border-bottom:1px solid #eef1f7;vertical-align:middle;word-break:break-all;}
.tbl tr:last-child td{border-bottom:none;}
.tbl .ops{display:flex;gap:6px;flex-wrap:wrap;}
.tbl .who{font-weight:600;color:var(--txt);}
/* 页脚 */
.foot{color:#98a5ba;font-size:12px;text-align:center;padding:18px 0 30px;}
/* toast */
#toasts{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:1200;display:flex;flex-direction:column;gap:8px;align-items:center;width:max-content;max-width:90vw;pointer-events:none;}
.toast{background:rgba(30,40,60,.92);color:#fff;padding:9px 18px;border-radius:22px;font-size:13px;
  box-shadow:0 6px 18px rgba(0,0,0,.18);animation:tp .25s ease;}
@keyframes tp{from{opacity:0;transform:translateY(-8px);}to{opacity:1;transform:none;}}
/* 自定义弹窗(替代原生 confirm/prompt,兼容内嵌预览等受限环境) */
.dlg-mask{position:fixed;inset:0;background:rgba(18,28,48,.46);display:flex;align-items:center;justify-content:center;
  z-index:1200;opacity:0;pointer-events:none;transition:opacity .18s ease;}
.dlg-mask.open{opacity:1;pointer-events:auto;}
.dlg{background:#fff;border-radius:14px;box-shadow:0 18px 50px rgba(10,25,60,.28);width:min(430px,92vw);
  padding:20px 22px;transform:translateY(10px) scale(.98);transition:transform .18s ease;max-height:86vh;overflow:auto;}
.dlg-mask.open .dlg{transform:none;}
.dlg-title{font-size:16px;font-weight:700;margin:0 0 10px;color:var(--txt);}
.dlg-msg{margin:4px 0 14px;color:#3c4a5e;font-size:14px;line-height:1.7;word-break:break-word;white-space:pre-line;max-height:46vh;overflow:auto;}
.dlg-body .txt{display:block;margin-bottom:10px;}
.dlg-body .fl{font-size:12.5px;margin:8px 0 4px;}
.dlg-body .fl:first-of-type{margin-top:0;}
.dlg-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:16px;}
.dlg-danger{background:var(--red);}
/* ================= 移动端(手机/平板 响应式适配) ================= */
@media(max-width:760px){
  .wrap{padding:0 12px;}
  main.wrap{padding-top:12px;padding-bottom:20px;}   /* :窄屏同比收(14/26 → 12/20) */
  /* 顶栏:第一行 品牌 + 用户;导航放不下换行成多排(:不再横向滚动藏起来)
     ⚠ :padding 左右 8→30,窄屏也保证左右各留 30px 空白 */
  .topbar-in{flex-wrap:wrap;height:auto;padding:8px 30px 6px;row-gap:6px;}
  .burger{order:0;}
  .brand{order:1;font-size:16px;padding-right:0;}
  .top-user{order:3;}
  .nav{order:4;width:100%;flex-wrap:wrap;gap:5px;padding:0 2px 3px;row-gap:5px;justify-content:center;}
  .nav a{padding:7px 13px;font-size:14px;flex:none;}
  /* :窄屏回退 flex 居中 —— 网格在手机上没必要,面包屑与链接换行居中即可 */
  .topbar-in .nav{display:flex;flex-wrap:wrap;justify-content:center;}
  .topbar-in .nav .nav-links{display:contents;}
  .card{padding:14px 13px;border-radius:11px;}
  .p-card{padding:12px 13px;}
  .p-actions{width:100%;margin-left:0;margin-top:6px;}
  .btn{padding:9px 16px;}          /* 主按钮加大,便于手指点击 */
  .btn.sm{padding:5px 12px;font-size:13px;}
  .btn.block{padding:11px 16px;}
  /* iOS 聚焦时不自动放大页面 */
  input.txt,textarea.txt,input[type=text],input[type=password],input[type=number]{font-size:16px;}
  /* 可点条目与头像加大 */
  .rec{padding:10px 13px;}
  .qq-item{padding:8px 13px;}
  .qq-item img{width:38px;height:38px;}
  .qq-list{gap:7px;}
  .auth-wrap{margin-top:14px;}
  .hero{padding-top:28px;}
  .hero h1{font-size:23px;}
  .hero .btn{min-width:132px;padding:11px 14px;font-size:14.5px;}
  .feats{grid-template-columns:1fr;}
  /* 弹窗:按钮整行平分,单手好点 */
  .dlg-foot .btn{flex:1;text-align:center;}
  /* 管理后台用户表:容器内横向滑动,操作列完整可见 */
  .tbl-scroll table.tbl{min-width:620px;}
  .stat{padding:7px 13px;}
}
@media(max-width:400px){
  .nav a{padding:7px 10px;font-size:13px;}
  .hero .btns{gap:10px;}
  .hero .btn{min-width:118px;}
  .rec .dot{display:block;}
}
/* ──────────────────────────────────────────────────────────────────────────
 * :窄屏(≤700px)的三排降级
 * 上面的  窄屏规则把 .topbar-in 改回 flex 排版,但那是**两排时代**的写法:
 * 品牌 order:1 / 导航 order:4 —— 在现在的三排网格里,order 对 grid 无效,
 * 会让窄屏下顶栏乱掉(时钟与账号挤一行、路径与导航串位)。
 * 这里显式给窄屏定一套:仍然保持三排语义,只是每排内部改为 flex 居中/靠边,
 * 路径与导航各自独占一行(手机屏幕窄,挤在一行会看不清)。
 * ⚠ 断点必须与上面  那条**完全一致(760px)** ——
 *   写 700px 会出现 700~760 这段"两套规则同时生效"的夹缝:
 *   旧规则把 .topbar-in 改回 flex + 品牌 order:1,新规则没覆盖到 → 顶栏排版错乱。
 *   同断点 = 新规则完整覆盖旧规则,不会有夹缝。
 * ────────────────────────────────────────────────────────────────────────── */
@media(max-width:760px){
  .topbar-in{display:flex;flex-direction:column;align-items:stretch;
    min-height:0;padding:6px 30px 4px;row-gap:4px;height:auto;}   /* :左右各留 30px 空白 */
  /* 第1排:汉堡 + 时钟 + 账号/语言。
     ⚠ .topbar-r1 是宽屏用的 grid(时钟正中),窄屏这里改回 flex:
       时钟 flex:1(占据剩余宽度)、账号与语言靠右。 */
  .topbar-r1{display:flex;align-items:center;width:100%;min-width:0;order:1;}
  /* ⚠⚠⚠ 时钟不能 flex-grow(同 ≤1180px 断点):grow 会吃光剩余空间,
     auto margin 就分不到空间,右区被顶到左边(实测离右缘 881px)。 */
  .topbar-r1 .top-clock{order:2 !important;flex:0 1 auto;min-width:0;flex-wrap:wrap;white-space:normal;row-gap:2px;margin:0;}
  /* :同 ≤1180px 断点 —— 右区整体贴右端,昵称自己不再 auto;
     同样要 !important(基础规则 .topbar-r1 .top-right 在本块**之后**,同特异度后写者赢)。 */
  /* ⚠⚠⚠ order 也必须 !important —— 基础规则(.topbar-r1 .top-right,order:0)在本块**之后**,
     同特异度后写者赢 ⇒ 右区 order 被改回 0,渲染顺序变成「右区→时钟」反了
     (CDP 实测视口 1100:rt.x=255、ck.x=465,右区在时钟左边)。 */
  .topbar-r1 .top-right{order:3 !important;flex:0 0 auto;display:flex;align-items:center;gap:8px;
    margin-left:auto !important;margin-right:0 !important;}
  .topbar-r1 .top-user{order:0 !important;margin-left:0 !important;}
  .topbar-r1 #wbLangSel{order:0 !important;margin-left:0 !important;}
  .topbar-in .burger{position:static;order:0;align-self:flex-start;margin-right:6px;}
  /* 第2排:品牌( 已从 HTML 删除品牌块,这条规则不再有作用,留着无害) */
  .topbar-in .brand{order:5;text-align:center;font-size:16px;padding-right:0;width:100%;}
  /* 第3排:路径一行 + 导航一行。
     ⚠ 路径是 .nav 的子元素(不是 .top-path-slot),窄屏下要让它**脱离绝对定位**回到正常流,
        否则 position:absolute; bottom:0 会把它钉在 .nav 底(=导航那行下面),顺序就反了。
        做法:窄屏改成 position:static; order:-1; width:100% ⇒ 路径排在导航前面、独占一行。 */
  .topbar-in .nav{order:6;width:100%;display:flex;flex-wrap:wrap;justify-content:center;padding:0;row-gap:4px;position:static;}
  .topbar-in .nav .nav-links{display:contents;}
  .topbar-in .nav .top-path{position:static;order:-1;width:100%;max-width:100%;margin:0 0 2px;
    justify-content:flex-start;white-space:normal;}
}
/* ================= 全站左侧边栏(登录用户) ================= */
/* 顶部右侧:用户头像 + 账号 + 管理员徽章(整体 push 到顶栏最右) */
.top-user{display:flex;align-items:center;gap:8px;flex:none;margin-left:auto;padding-right:4px;}
.top-user-link{display:inline-flex;align-items:center;gap:6px;color:#dfe9ff;text-decoration:none;font-size:13px;white-space:nowrap;padding:4px 8px;border-radius:8px;transition:.15s;}
.top-user-link:hover{background:rgba(255,255,255,.14);color:#fff;}
.top-un{font-weight:600;letter-spacing:.3px;}
.top-user .chip{font-size:11px;}
.burger{display:none;background:none;border:none;color:#fff;font-size:19px;cursor:pointer;padding:3px 10px;border-radius:8px;}
.burger:hover{background:rgba(255,255,255,.15);}
/* 顶栏「↩ 上一步」返回按钮:半透明白底,hover 高亮(与导航条目同风格) */
.nav-back{background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.25);color:#e7eeff;
  font-size:12.5px;cursor:pointer;padding:4px 10px;border-radius:8px;white-space:nowrap;flex:none;transition:.15s;}
.nav-back:hover{background:rgba(255,255,255,.22);color:#fff;border-color:rgba(255,255,255,.45);}
.nav-back:active{transform:translateX(-1px);}
.page{width:100%;max-width:none;margin:0;display:flex;align-items:stretch;
  min-height:calc(100vh - var(--topbar-h,54px)); /* 高度拉满:减去顶栏实际高度(:两排时自动跟随) */}
.page.wide{max-width:none;} /* 宽布局:创新项目组 50×50 大表格等宽表页面使用 — 已不再居中,直接占满全宽 */
/* ================== 左侧边栏:登录后的"我的项目组"专属美化 ================== */
.side{
  width:var(--side-w,228px);flex:none;position:sticky;top:var(--topbar-h,54px);
  height:calc(100vh - var(--topbar-h,54px)); /* 高度拉满,贴底边(:顶栏两排时自动跟随) */
  max-height:none;overflow-y:auto;
  padding:14px 8px 22px;scrollbar-width:thin;
  background:linear-gradient(180deg,#fbfcff 0%, #f5f8ff 100%);
  /* 贴边:去掉外框/阴影/圆角,只保留右边的细分割线作视觉分隔 */
  border:none;
  border-right:1px solid #e1e9f7;
  border-radius:0;
  box-shadow:none;
  margin:0;
}
/* 2026-09-12(侧栏拖宽):右缘分割手柄 —— 按住左右拖动可调侧栏宽度,双击恢复默认 */
#sideDrag{position:fixed;width:12px;cursor:col-resize;z-index:80;touch-action:none;}
#sideDrag::after{content:'';position:absolute;top:0;bottom:0;left:4.5px;width:2px;background:transparent;transition:background .15s;}
#sideDrag:hover::after,body.side-dragging #sideDrag::after{background:#7aa5f8;}
body.side-dragging{cursor:col-resize;user-select:none;-webkit-user-select:none;}
body.side-dragging iframe{pointer-events:none;} /* 拖动时冻结页面内嵌框,防吞事件 */
.side::-webkit-scrollbar{width:6px;}
.side::-webkit-scrollbar-thumb{background:#c9d5e8;border-radius:3px;}
/* 顶部 section 标题(大写感+柔和阴影) */
/* :大类标题(免费/会员/我的项目组)放大+上色,与 12.5px 的分类条目一眼区分开 */
/* :所有大类标题统一用「会员」行的金橙配色(用户需求:红框「会员」行的颜色全站大类通用),悬停不再变色 */
.side-sec-t{font-size:15px;font-weight:800;color:#d97706;
  display:flex;justify-content:space-between;align-items:center;
  margin:0 4px 12px;padding:0 6px;
  letter-spacing:.8px;text-transform:uppercase;
  position:relative;
  text-shadow:0 1px 0 rgba(217,119,6,.12);
}
/*  旧分色(免费=绿/会员=金橙/我的项目组=蓝)已被  统一为金橙,以下三行保留占位防旧缓存 diff */
.side-sec-t[data-fold=catfree]{color:#d97706;}
.side-sec-t[data-fold=catvip]{color:#d97706;}
.side-sec-t[data-fold=pj]{color:#d97706;}
.side-sec-t::before{content:'';position:absolute;left:6px;right:6px;bottom:-5px;
  height:2px;background:linear-gradient(90deg,#d97706,transparent);border-radius:2px;}
.side-add{color:var(--blue);text-decoration:none;font-size:18px;font-weight:700;line-height:1;padding:2px 8px;border-radius:7px;transition:.15s;background:#eaf1ff;}
.side-add:hover{background:#dbe7fb;color:var(--blue-d);}
/* :侧栏分类区(免费/会员) —— 管理后台「🗂 功能组」里每个分类卡片右侧勾选后,
 * 勾中的分类按「🆓 免费」「👑 会员」两区列在「📂 我的项目组」上面,条目可直接点开;一条没勾整块不出现 */
.side-cat-sec{margin:0 0 14px;}
.side-cat-sec .side-sec-t{margin-bottom:8px;}
.side-cat-list{display:flex;flex-direction:column;gap:2px;margin:0 2px 8px;}
.side-cat-a{display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:7px;
  font-size:12.5px;color:#33415c;text-decoration:none;transition:background .12s,color .12s;}
.side-cat-a:hover{background:#eef4ff;color:#2f6fed;}
.side-cat-ic{flex:none;width:18px;text-align:center;}
/* :侧栏折叠 —— 「🆓 免费」「👑 会员」「📂 我的项目组」三块标题点一下折叠/展开(箭头 ▾/▸),
 * 折叠状态记 localStorage(wbSideFold),刷新与切页都保持(逻辑在 public/app.js) */
.side-sec-t[data-fold]{cursor:pointer;user-select:none;-webkit-user-select:none;}
/* :悬停不再变色(原 :hover 变蓝已删,用户要求鼠标放上去不变色) */
.side-sec-t[data-fold]::after{content:'▾';flex:none;font-size:14px;line-height:1;color:#8a94a8;margin-left:6px;} /* :10px→14px */
.folded > .side-sec-t[data-fold]::after{content:'▸';}
.folded > *:not(.side-sec-t){display:none!important;} /* 折叠=内容整块收起,只留标题行 */
.folded > .side-sec-t{margin-bottom:0;}
.side-cat-blk{margin:0 0 8px;}
.side-cat-blk:last-child{margin-bottom:12px;}
.pj-side-app.folded{height:auto!important;flex:0 0 auto!important;}
/* 2026-09-12(侧栏合并):/projects 页侧栏即交互式文件树(原 pj-left 面板已删除,不再重复显示两个树) */
.page.wide .side{width:var(--side-w,262px);}
.pj-side-app .pj-search{margin:0 4px 6px;}
.pj-side-app .pj-btns{margin:0 4px 8px;}
.pj-side-app .pj-groups{max-height:none;min-height:120px;margin:0 2px;}
/* 2026-09-15(用户需求):树形下面的中间分割线(可拖动,上下内容自动适应)+ 分割线下方功能区(「正规则」按钮)。
 * 侧栏整列改 flex 纵排:文件树占默认剩余高度,拖动后改为固定 basis,下方 .pj-side-foot 自动吃掉剩余高度。 */
.pj-side-app{display:flex;flex-direction:column;height:100%;box-sizing:border-box;}
.pj-side-app .pj-groups{flex:1 1 auto;min-height:90px;overflow:auto;}
.pj-side-app .pj-groups.dragged{flex:0 0 auto;}
.pj-side-split{flex:0 0 auto;height:12px;margin:6px 4px 2px;cursor:row-resize;user-select:none;position:relative;border-top:2px dashed #c4d4f0;transition:border-color .15s,background .15s;}
.pj-side-split:hover,.pj-side-split.on{border-top-color:#2f6fed;background:linear-gradient(180deg,rgba(47,111,237,.08),rgba(47,111,237,0));}
.pj-side-split .pj-side-split-grip{position:absolute;left:50%;top:1px;transform:translateX(-50%);width:34px;height:6px;border-radius:4px;background:repeating-linear-gradient(90deg,#b9c9e8 0 3px,transparent 3px 6px);pointer-events:none;}
.pj-side-split:hover .pj-side-split-grip,.pj-side-split.on .pj-side-split-grip{background:repeating-linear-gradient(90deg,#2f6fed 0 3px,transparent 3px 6px);}

/* ================= :全站通用「可拖分隔条」(wbsplit.js) =================
 * 用户需求:网站里所有树形面板的竖线 / 横线都能拖,拖完记住位置(刷新/换浏览器都还在)。
 * 用法:给分隔元素加 class="wb-split wb-split-v|wb-split-h" + data-wbsplit="v|h"
 * 外观:平时一条很淡的线(2px,悬停才变蓝),鼠标按住时整条高亮 —— 不抢视觉但一找就找到。 */
.wb-split{flex:none;position:relative;background:transparent;z-index:6;touch-action:none;}
.wb-split-v{width:9px;cursor:col-resize;align-self:stretch;}
.wb-split-h{height:9px;cursor:row-resize;width:100%;}
.wb-split::before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;margin:auto;border-radius:3px;background:#dbe4f2;transition:background .15s,box-shadow .15s;}
.wb-split-v::before{width:3px;height:100%;}
.wb-split-h::before{width:100%;height:3px;}
.wb-split:hover::before,.wb-split.on::before{background:#2f6fed;box-shadow:0 0 0 3px rgba(47,111,237,.16);}
.wb-split.on{background:rgba(47,111,237,.06);}
body.wb-split-v-drag{cursor:col-resize!important;user-select:none!important;-webkit-user-select:none!important;}
body.wb-split-h-drag{cursor:row-resize!important;user-select:none!important;-webkit-user-select:none!important;}
body.wb-split-v-drag *{cursor:col-resize!important;}
body.wb-split-h-drag *{cursor:row-resize!important;}
/* 网格布局里的分隔条:CSS Grid 的列宽由 grid-template-columns 决定,插不进额外元素 ——
   就把分隔条绝对定位贴在某个网格面板的右边缘(父面板需 position:relative),拖动时改的是整张网格的列宽 */
.wb-split-abs-r{position:absolute;right:-5px;top:0;bottom:0;height:auto;width:9px;z-index:7;}
.wb-split-abs-b{position:absolute;left:0;right:0;bottom:-5px;width:auto;height:9px;z-index:7;}
@media (max-width:700px){.wb-split-v{display:none;}}
/* (用户需求):底部按钮换行后行距收紧 —— 容器被拉伸时默认 align-content:stretch 会把两行按钮撑开大空隙,改为顶对齐,行距只留 6px gap */
.pj-side-foot{flex:0 0 auto;margin:2px 4px 0;padding:7px 0 4px;display:flex;gap:6px;flex-wrap:wrap;align-items:flex-start;align-content:flex-start;}
.pj-side-foot .btn{padding:4px 10px;font-size:12px;}
.pj-side-foot .rx-ic{display:inline-block;font-family:Consolas,monospace;font-weight:700;color:#2f6fed;background:#eaf1ff;border:1px solid #c9d9f5;border-radius:4px;padding:0 4px;margin-right:2px;font-size:11px;line-height:16px;}
/* (用户需求):「📂 时光文本 / 🖼 时光图片 / 📊 时光表格」从顶部导航搬到项目组树形下面 ——
   这三个独占一行(树形下方最上面),下面一条虚线与「时光编程 / 本地搜索」那排功能按钮分开;当前所在页高亮。 */
.pj-side-nav{flex:0 0 auto;width:100%;display:flex;gap:6px;flex-wrap:wrap;margin:0 0 2px;padding-bottom:7px;border-bottom:1px dashed #d3e0f7;}
.pj-side-nav .btn{text-decoration:none;}
.pj-side-nav .btn.on{background:#e8f0ff;border-color:#b6cdfb;color:#1d4ed8;font-weight:700;}
.pj-side-nav .btn:hover{border-color:#b6cdfb;color:#1d4ed8;}
/* 项目组(卡片化) */
.s-group{margin-bottom:9px;background:#fff;border:1px solid #e9eef7;border-radius:10px;padding:5px 0;transition:.15s;}
.s-group:hover{border-color:#cad9f1;box-shadow:0 1px 6px rgba(47,111,237,.08);}
.s-gname{display:flex;align-items:center;gap:4px;padding:7px 10px;border-radius:7px;color:#2c3a55;text-decoration:none;font-size:13.2px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.s-gname:hover{background:#eaf1ff;color:var(--blue-d);}
.s-gname.on{background:linear-gradient(90deg,#e3ecff,#dde8ff);color:var(--blue-d);font-weight:700;}
/* 项目组内的表(树形缩进,带左侧引导线) */
.s-tabs{padding:3px 0 6px 14px;margin-top:1px;border-left:2px solid #e1e9f7;margin-left:14px;}
.s-tab{display:block;padding:4px 10px;border-radius:6px;color:#5a6b85;text-decoration:none;font-size:12.5px;
  margin-bottom:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.13s;}
.s-tab:hover{color:var(--blue-d);background:#f0f5fd;}
.s-tab.on{color:var(--blue-d);font-weight:600;background:#e3ecff;}
/* 文章(略缩进,带文档小图标) */
.s-docs{margin-top:4px;padding-left:6px;}
.s-doc{display:block;padding:3px 10px;border-radius:6px;color:#6a7891;text-decoration:none;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.13s;}
.s-doc:hover{color:var(--blue-d);background:#f0f5fd;}
/* 空态/提示信息 */
.s-none{font-size:12.5px;color:#7a8699;padding:14px 12px;line-height:1.85;background:#fff;border:1px dashed #cdd9ec;border-radius:10px;text-align:center;}
.s-none2{font-size:11.5px;color:#aab6c8;padding:5px 12px;}
.s-go{display:inline-block;margin-top:6px;padding:3px 10px;color:var(--blue);text-decoration:none;font-weight:600;border-radius:7px;border:1px solid #c9d9f0;background:#eaf1ff;font-size:12px;}
.s-go:hover{background:#dbe7fb;color:var(--blue-d);}
main.wrap.main{flex:1;min-width:0;width:auto;max-width:none;
  padding:var(--pad-main-t,10px) 24px var(--pad-main-b,16px);        /* :顶部 18→var(--pad-main-t)=10、底部 30→var(--pad-main-b)=16(与全站留白同源) */
  min-height:calc(100vh - var(--topbar-h,54px)); /* 高度拉满:至少跟视口一样高(:跟随顶栏实际高度) */
  box-sizing:border-box;}
/* 移动端:侧栏变为抽屉 */
@media(max-width:900px){
  .burger{display:inline-flex;}
  .page{display:block;}
  #sideDrag{display:none;} /* 移动端抽屉固定宽,不出拖宽手柄 */
  .side{position:fixed;top:0;left:0;bottom:0;width:252px;z-index:1100;margin:0;background:#f3f6fc;
    border-right:1px solid var(--line);box-shadow:6px 0 26px rgba(20,40,90,.2);
    padding:18px 12px 28px;transform:translateX(-106%);transition:transform .22s ease;
    max-height:none;overflow-y:auto;}
  body.sb-open .side{transform:none;}
  .side-mask{position:fixed;inset:0;background:rgba(18,28,48,.42);z-index:1050;opacity:0;
    pointer-events:none;transition:opacity .2s;}
  body.sb-open .side-mask{opacity:1;pointer-events:auto;}
  main.wrap.main{padding:14px 12px 30px;}
}
/* ================= 发帖编辑器:工具栏/拖拽/附件 ================= */
.ed-bar{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap;}
.ed-hint{color:var(--mut);font-size:11.5px;}
.ed-foot{display:flex;align-items:center;gap:12px;justify-content:flex-end;margin-top:10px;}
.ed-note{color:var(--blue-d);font-size:12px;margin-right:auto;}
.drop-hint{display:none;border:1.6px dashed var(--blue);background:#eef4ff;color:var(--blue-d);
  text-align:center;border-radius:10px;padding:12px;font-size:13px;margin-bottom:8px;font-weight:600;}
.drop-hint.show{display:block;}
.att-list{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.att-pend{display:flex;align-items:center;gap:8px;border:1px solid var(--line);background:#f7faff;
  border-radius:8px;padding:5px 10px;font-size:12.5px;}
.att-pend img{width:38px;height:38px;object-fit:cover;border-radius:6px;border:1px solid var(--line);}
.att-pn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2c3a52;}
.att-ps{color:#8b98ab;font-size:11.5px;flex:none;}
.att-pd{cursor:pointer;color:#a8b4c4;font-size:13px;padding:2px 7px;border-radius:6px;flex:none;}
.att-pd:hover{color:#fff;background:#e05b4c;}
/* ================= 帖子正文渲染(代码段/附件) ================= */
.p-content{margin:0 0 10px;font-size:14px;word-break:break-word;
  user-select:text; -webkit-user-select:text; cursor:text;}
.p-content .t-line{margin:0 0 5px;white-space:pre-wrap;
  user-select:text; -webkit-user-select:text;}
.p-content pre.code{background:#1e293b;color:#e2e8f0;padding:12px 14px;border-radius:8px;overflow:auto;
  margin:10px 0;font:12.5px/1.6 Consolas,"Courier New",monospace;word-break:break-word;
  box-shadow:0 2px 10px rgba(30,41,59,.18),inset 0 0 0 1px rgba(255,255,255,.04);
  user-select:text; -webkit-user-select:text; cursor:text;}
/* Lua 代码段通用样式:任何容器下的 <pre class="code"> 都按温和的"代码块背景"风格显示
 * (传奇板块顶部黄色区域 / 帖子 / 隐藏专区等所有位置统一显示)
 * 设计要点:
 *  - 取消边框,改用柔和的双层阴影(外阴影 + 内高光)让代码块"立体但不刺眼"
 *  - 背景用深蓝灰 #2d3447,比纯黑温和,适合长时间阅读
 *  - 默认字色浅白带蓝调 #e8edf3,token 高亮仍走 VSCode Dark+ 配色但降低饱和度 */
pre.code{background:#1e293b;color:#e2e8f0;padding:12px 14px;border-radius:8px;overflow:auto;
  margin:10px 0;font:12.5px/1.6 Consolas,"Courier New",monospace;word-break:break-word;
  box-shadow:0 2px 10px rgba(30,41,59,.18),inset 0 0 0 1px rgba(255,255,255,.04);
  user-select:text; -webkit-user-select:text; cursor:text;}
pre.code code{font:inherit;color:inherit;}
/* ============ 代码段容器:用于放复制按钮 ============ */
.code-wrap{position:relative;margin:10px 0;}
/* 复制按钮:绝对定位在右上角,默认浅灰半透明玻璃感,鼠标悬停时变清晰
 * "复制"文字在深色代码块上始终可见(用户能直接看出这里是可点击的) */
.code-copy{position:absolute;top:6px;right:6px;background:rgba(255,255,255,.10);color:#e8edf3;
  border:1px solid rgba(255,255,255,.22);border-radius:6px;font-size:12px;padding:4px 12px;
  cursor:pointer;opacity:.85;transition:.18s;backdrop-filter:blur(4px);
  -webkit-backdrop-filter:blur(4px);font-family:inherit;user-select:none;
  -webkit-user-select:none;letter-spacing:1px;}
.code-copy:hover{background:rgba(255,255,255,.22);border-color:rgba(255,255,255,.40);opacity:1;}
.code-copy:active{background:rgba(255,255,255,.32);}
.code-copy.ok{background:#22c55e;border-color:#22c55e;color:#fff;opacity:1;letter-spacing:1px;}
/* Lua 语法高亮配色(温和版 — 在 #2d3447 背景上饱和度稍降,看着不刺眼) */
pre.code .tk-k{color:#7eb6f0;}   /* 关键字 function/local/if/end… */
pre.code .tk-c{color:#8fb27e;}   /* 注释 -- … */
pre.code .tk-s{color:#e8a587;}   /* 字符串 '…' "…" [[…]] */
pre.code .tk-n{color:#b8d4b0;}   /* 数字 */
pre.code .tk-v{color:#a8d8e8;}   /* 变量/标识符 */
pre.code .tk-f{color:#e8dfa0;}   /* 函数调用名 print( … */
.att-block{margin:8px 0 2px;border-top:1px dashed var(--line);padding-top:9px;}
.att-imgs{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;}
.att-img img{width:100%;height:112px;object-fit:cover;border-radius:8px;border:1px solid var(--line);background:#fff;cursor:zoom-in;transition:transform .15s ease,box-shadow .15s ease;}
.att-img img:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,0,0,0.12);border-color:var(--blue);}
.att-files{display:flex;flex-direction:column;gap:5px;margin-top:9px;}
.att-file{display:flex;align-items:center;gap:8px;border:1px solid var(--line);background:#f7faff;
  border-radius:8px;padding:6px 10px;text-decoration:none;color:#2c3a52;font-size:12.5px;}
.att-file:hover{border-color:#9db9ea;background:#eef4ff;}
.att-ico{font-size:15px;}
.att-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.att-sz{color:#8b98ab;font-size:11.5px;flex:none;}
.att-dl{color:var(--blue);font-size:11.5px;flex:none;}
/* ================= 创新项目组 /projects ================= */
.pj-app{display:flex;gap:14px;align-items:flex-start;}
.pj-left{width:280px;flex:none;margin-bottom:0;padding:8px;background:#fff;border:1px solid var(--line);border-radius:8px;}
.pj-right{flex:1;min-width:0;}
/* 2026-09-12 一键清理:/projects 右侧卡片顶部操作条 */
.pj-head{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--card);border:1px solid var(--line);border-radius:10px;margin-bottom:10px;}
.pj-head-t{font-size:13.5px;font-weight:600;color:#2b3a55;flex:none;}
.pj-head-tip{font-size:12px;color:var(--mut);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-wipe-btn{flex:none;background:#fdecea;color:var(--red);border:1px solid #f3c2bd;}
.pj-wipe-btn:hover{background:var(--red);color:#fff;border-color:var(--red);}
.pj-h{font-size:14px;font-weight:600;margin:0 0 8px;color:#222;display:flex;align-items:center;gap:4px;}
.pj-search{display:flex;align-items:center;gap:4px;margin-bottom:6px;}
.pj-search input{flex:1;min-width:0;padding:3px 6px;font-size:12px;border:1px solid var(--line);border-radius:3px;background:#fff;outline:none;color:#222;}
.pj-search input:focus{border-color:#0078d7;}
.pj-search .pj-search-clr{background:transparent;border:none;color:#888;font-size:14px;cursor:pointer;padding:0 4px;line-height:1;}
.pj-search .pj-search-clr:hover{color:#222;}
.pj-btns{margin-bottom:6px;display:flex;gap:4px;flex-wrap:wrap;}
.pj-btns .btn{padding:3px 7px;font-size:11.5px;border-radius:3px;}
.pj-btns .btn.ghost{background:transparent;border:1px solid var(--line);color:#444;}
.pj-btns .btn.ghost:hover{background:#e5f1fb;color:#222;border-color:#c3d4f2;}
.pj-btns .btn.primary{background:#0078d7;color:#fff;border:1px solid #0078d7;}
.pj-btns .btn.primary:hover{background:#106ebe;border-color:#106ebe;}
.pj-groups{display:flex;flex-direction:column;gap:0;min-height:200px;max-height:calc(100vh - 230px);overflow:auto;}
.pj-none{font-size:12.5px;color:#8b98ab;padding:8px 2px;line-height:1.8;}
.pj-gcard{border:1px solid var(--line);border-radius:10px;margin-bottom:8px;overflow:hidden;background:#fff;}
.pj-gcard.on{border-color:#a5bdec;box-shadow:0 0 0 1px #c3d4f2;}
.pj-grow{display:flex;align-items:center;gap:4px;padding:7px 9px;}
.pj-gnm{flex:1;min-width:0;font-weight:600;font-size:13.5px;color:#2b3a55;text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;}
.pj-gnm:hover{color:var(--blue);}
.pj-gops{display:flex;gap:1px;flex:none;}
.pj-op{background:none;border:none;color:#8b98ab;cursor:pointer;padding:2px 5px;border-radius:6px;font-size:12px;}
.pj-op:hover{background:#e7eefb;color:var(--blue-d);}
.pj-gtabs{display:flex;flex-direction:column;border-top:1px dashed var(--line);background:#fbfcff;}
.pj-gtab{padding:4px 12px;font-size:12.5px;color:#5a6b85;text-decoration:none;border-left:2px solid transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab;}
.pj-gtab:hover{background:#eef4ff;color:var(--blue);}
.pj-gtab.on{border-left-color:var(--blue);background:#e8f1ff;color:var(--blue-d);font-weight:600;}
.pj-gtab:active{cursor:grabbing;background:#e0ebff;}
.pj-gdoc{padding:3px 12px 3px 24px;font-size:12.5px;color:#4a5b75;text-decoration:none;border-left:2px solid transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:grab;display:block;}
.pj-gdoc:hover{background:#eef4ff;color:var(--blue-d);}
.pj-gdoc:active{cursor:grabbing;background:#e0ebff;}
/* 拖放中:目标项目组卡片高亮(强调「这里可放」) */
.pj-gcard.drag-over{border-color:var(--blue);box-shadow:0 0 0 2px rgba(47,111,237,.35);background:#f1f6ff;}
.pj-gcard.drag-over .pj-gnm{color:var(--blue-d);}
/* 项目组文章区 */
.pj-gdocs{padding:6px 0 8px;border-top:1px dashed var(--line);background:#f7f9fd;}
.pj-gdlbl{font-size:11.5px;color:var(--mut);padding:3px 12px;letter-spacing:.3px;}
/* ========== 自定义右键菜单(避开全局 contextmenu 屏蔽) ========== */
.pj-ctx-menu{position:fixed;z-index:1200;background:#fff;border:1px solid var(--line);border-radius:10px;
  box-shadow:0 10px 30px rgba(20,40,90,.22);padding:6px;min-width:170px;animation:ctxfade .12s ease;}
@keyframes ctxfade{from{opacity:0;transform:translateY(-4px);}to{opacity:1;transform:none;}}
.pj-ctx-i{padding:7px 12px;border-radius:7px;cursor:pointer;font-size:13px;color:#1f2937;transition:.12s;line-height:1.4;}
.pj-ctx-i:hover{background:#eef4ff;color:var(--blue-d);}
.pj-ctx-i.danger{color:#a3261d;}
.pj-ctx-i.danger:hover{background:#fdecea;color:#7a1a13;}
.pj-ctx-sep{height:1px;background:var(--line);margin:4px 6px;}
/* ==========  项目组文件右键「 共享文件…」小组选择器 ==========
   不用 pj-ctx-menu(那是一次性菜单,关闭就没了);共享要"先选小组 → 再看结果",
   得是能停留、可点外面才关的浮层。 */
.pj-share-pick{position:fixed;z-index:1250;background:#fff;border:1px solid var(--line);border-radius:12px;
  box-shadow:0 14px 40px rgba(20,40,90,.24);padding:10px;min-width:250px;max-width:340px;
  display:flex;flex-direction:column;gap:5px;animation:ctxfade .12s ease;}
.pj-sp-h{font-size:13px;color:var(--txt);font-weight:600;padding:3px 6px 7px;line-height:1.5;
  border-bottom:1px solid var(--line);margin-bottom:3px;}
/*  加载中占位:state 接口实测 10~408ms 波动,不给占位用户会以为没点上 */
.pj-sp-loading{font-size:12.5px;color:var(--mut);padding:12px 8px;text-align:center;line-height:1.6;}
.pj-sp-g{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;
  text-align:left;cursor:pointer;border:1px solid var(--line);background:#fbfcfe;border-radius:9px;
  padding:8px 11px;transition:.14s;color:var(--txt);font-size:13px;font-family:inherit;line-height:1.4;}
.pj-sp-g:hover:not(:disabled){border-color:var(--blue);background:#eef4ff;color:var(--blue-d);}
.pj-sp-g:disabled{opacity:.55;cursor:wait;}
.pj-sp-m{flex:none;font-size:11.5px;color:var(--mut);background:#eef2f8;border-radius:20px;padding:1px 8px;}
.pj-sp-g:hover:not(:disabled) .pj-sp-m{background:#dbe7fb;color:var(--blue-d);}
.pj-sp-x{margin-top:3px;cursor:pointer;border:1px solid transparent;background:none;border-radius:9px;
  padding:7px;text-align:center;font-size:12.5px;color:var(--mut);font-family:inherit;}
.pj-sp-x:hover{background:#f3f5f9;color:var(--txt);}
/* 共享时光页:项目组实体共享项显示「表格/文章/相册/画板」打开按钮(取代下载) */
.tm-dl.tm-open{background:#eef4ff;color:var(--blue-d);border-color:#cfe0ff;text-decoration:none;}
/* ========== 「移动到…」选择器(沿用 dlg-mask) ========== */
.pj-mv-ctt{font-size:12.5px;color:var(--mut);margin:0 0 10px;line-height:1.6;}
.pj-mv-list{display:flex;flex-direction:column;gap:7px;max-height:50vh;overflow:auto;padding:2px;}
.pj-mv-item{display:flex;align-items:center;gap:9px;width:100%;text-align:left;cursor:pointer;border:1px solid var(--line);background:#fbfcfe;border-radius:10px;padding:9px 12px;transition:.15s;color:var(--txt);}
.pj-mv-item:hover{border-color:var(--blue);background:#eef4ff;box-shadow:0 1px 6px rgba(47,111,237,.15);}
.pj-mv-item.busy{opacity:.6;cursor:wait;}
.pj-mv-ic{font-size:18px;flex:none;}
.pj-mv-nm{flex:1;min-width:0;font-weight:600;color:#2b3a55;}
.pj-mv-cnt{font-size:11.5px;color:var(--mut);background:#eef2f9;padding:2px 8px;border-radius:999px;flex:none;}
.pj-mv-go{font-size:12px;color:var(--blue);font-weight:600;flex:none;}
.pj-gnone{font-size:11.5px;color:#aab6c8;padding:5px 12px;}
/* ---------- 项目组相册:QQ空间九宫格 ---------- */
.pj-galbs{padding:6px 8px 8px;border-top:1px dashed var(--line);background:#fbfcff;}
.pj-galbs .pj-gdlbl{display:flex;justify-content:space-between;align-items:center;}
.pj-galbs-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px;padding:0 4px 4px;}
.pj-galb-cell{position:relative;display:block;aspect-ratio:1/1;border-radius:6px;overflow:hidden;
  background:#e8eef8;border:1px solid #d9e2f1;cursor:grab;transition:.15s;}
.pj-galb-cell:hover{border-color:var(--blue);transform:translateY(-1px);box-shadow:0 4px 12px rgba(35,80,180,.18);}
.pj-galb-cell:active{cursor:grabbing;}
.pj-galb-thumb{display:block;width:100%;height:100%;object-fit:cover;}
.pj-galb-thumb.ph{display:flex;align-items:center;justify-content:center;font-size:24px;color:#9aabd0;background:linear-gradient(135deg,#e6efff,#d8e4f7);}
.pj-galb-ov{position:absolute;left:0;right:0;bottom:0;display:flex;justify-content:space-between;align-items:center;gap:4px;
  padding:3px 6px;font-size:10.5px;color:#fff;background:linear-gradient(transparent,rgba(0,0,0,.6));}
.pj-galb-nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;}
.pj-galb-ct{flex:none;background:rgba(255,255,255,.18);border-radius:8px;padding:0 5px;font-size:10px;}
.pj-empty{text-align:center;color:var(--mut);padding:56px 16px;font-size:14px;line-height:2.1;}
.pj-empty .big{font-size:44px;display:block;margin-bottom:6px;}
.pj-empty b{color:var(--blue-d);}
.pj-tabs{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:10px;}
.pj-tab-lbl{font-size:12.5px;color:var(--mut);}
.pj-tab{padding:4px 13px;border:1px solid var(--line);border-radius:16px;font-size:12.5px;text-decoration:none;
  color:#4a5a74;background:#f7faff;}
.pj-tab:hover{border-color:#a5bdec;}
.pj-tab.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600;}
.pj-tab-add{background:#fff;border:1px dashed #9db9ea;color:var(--blue);font-size:15px;font-weight:700;
  cursor:pointer;border-radius:16px;padding:1px 10px;line-height:1.5;}
.pj-tab-add:hover{background:#eef4ff;}
.pj-tbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px;
  border-top:1px solid var(--line);padding-top:10px;}
.pj-tname{font-size:15px;font-weight:700;color:#223}
.pj-dim{font-size:11.5px;font-weight:600;color:#1d3a6e;background:#e6effc;padding:2px 9px;border-radius:12px;flex:none;}
.pj-save-st{font-size:11.5px;font-weight:600;padding:1px 8px;border-radius:14px;}
.pj-save-st.ok{background:#e6f6ee;color:#0a6b44;}
.pj-save-st.busy{background:#fdf3e3;color:#8a5a10;}
.pj-save-st.err{background:#fdeceb;color:#a3261d;}
.pj-t-ops{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap;}
.pj-shortcut-hint{font-size:11.5px;color:#6c7a92;display:inline-flex;align-items:center;gap:4px;background:#f3f6fb;border:1px dashed #ccd9eb;border-radius:14px;padding:2px 9px;white-space:nowrap;}
.pj-shortcut-hint kbd{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10.5px;background:#fff;border:1px solid #c5d0e1;border-bottom-width:2px;border-radius:4px;padding:0 5px;color:#3a4a63;line-height:1.5;}
.pj-scroll{overflow:auto;max-height:calc(62vh - 40px);border:1px solid var(--line);border-radius:10px;background:#fff;
  -webkit-overflow-scrolling:touch;}   /* 2026-09-15:高度减 40px 给底部「工作表标签栏」留位,使标签栏与表格同屏可见(总体高度仍≈62vh) */
.pj-scroll::-webkit-scrollbar{width:9px;height:9px;}
.pj-scroll::-webkit-scrollbar-thumb{background:#c2cfE2;border-radius:5px;}
.btn:disabled{opacity:.45;cursor:not-allowed;}
/* ============ 项目组大表格(div 网格 + 行窗口虚拟渲染) ============
 * .pj-scroll(唯一滚动容器) > .pj-grid:
 *   .pj-chead 表头(sticky top;内: .g-corner 角格 + .g-col×N 列头)
 *   .pj-body 总高容器(relative;内部 .pj-row 按 top=(r-1)*31px absolute 定位)
 *   .pj-row 一行(sticky left 的 .g-row 行号 + .g-cellbox×N 格子)
 * 滚动:列头随横向走、行号钉在左侧、角格双向钉住(Excel 观感) */
.pj-grid{min-width:100%;}
.pj-grid:focus{outline:none;}
/* 2026-09-12:网格表头改名 pj-chead —— 原名 .pj-head 与"项目组工作区标题栏"(style.css 411 行)同名,
 * 那条规则的 padding:8px 12px/gap:10px/四边 border 会一并命中网格表头:表头整体右移 13px,
 * 且每个列头之间多出 10px 间隙 → 列头分隔线与正文竖线逐列越偏越多(表头"歪")。 */
/* —— 正版 Excel 观感:浅灰表头带 + Excel 网格线灰 + 活动格绿色边框(#217346) —— */
.pj-chead{position:sticky;top:0;z-index:5;display:flex;background:#f5f5f5;
  border-bottom:1px solid #b7b7b7;}
.g-corner{width:40px;min-width:40px;height:30px;position:sticky;left:0;z-index:6;background:#f5f5f5;
  border-right:1px solid #c9c9c9;cursor:pointer;-webkit-user-select:none;user-select:none;}
.g-corner:hover{background:#e8e8e8;}
.g-col{width:var(--cw,88px);min-width:var(--cw,88px);max-width:var(--cw,88px);height:30px;
  display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:#f5f5f5;
  color:#5f6368;font-weight:600;font-size:11.5px;border-right:1px solid #d9d9d9;
  cursor:pointer;-webkit-user-select:none;user-select:none;flex:none;}
.g-col:hover{background:#eaeaea;}
.g-col.hl{background:#e2e2e2;color:#1a1a1a;}          /* 选中列的列头高亮 */
.pj-body{position:relative;width:100%;}
.pj-row{position:absolute;left:0;top:0;display:flex;height:31px;box-sizing:border-box;}
.g-row{width:40px;min-width:40px;height:31px;position:sticky;left:0;z-index:3;background:#f5f5f5;
  border-right:1px solid #c9c9c9;border-bottom:1px solid #d9d9d9;display:flex;align-items:center;
  justify-content:center;color:#5f6368;font-size:11.5px;flex:none;
  cursor:pointer;-webkit-user-select:none;user-select:none;box-sizing:border-box;}
.g-row:hover{background:#eaeaea;}
.g-row.hl{background:#e2e2e2;color:#1a1a1a;font-weight:700;}   /* 选中行的行号高亮 */
/* 活动的行号/列头:Excel 式绿色指示条 */
.g-row.act{background:#e2e2e2;color:#1a1a1a;font-weight:700;box-shadow:inset -2px 0 0 #217346;}
.g-col.act{background:#e2e2e2;color:#1a1a1a;box-shadow:inset 0 -2px 0 #217346;}
.g-cellbox{width:var(--cw,88px);min-width:var(--cw,88px);max-width:var(--cw,88px);height:31px;
  flex:none;box-sizing:border-box;border-right:1px solid #e1e1e1;border-bottom:1px solid #e1e1e1;background:#fff;}
.g-cellbox.sel{background:#e9f1ec;}                                    /* 选区内格子:Excel 淡绿灰 */
.g-cellbox.act{box-shadow:inset 0 0 0 2px #217346;}                     /* 当前活动单元格:Excel 绿边框 */
.g-cellbox.act .g-cell{background:#fff;}                                /* 活动格输入区白底 */
.g-cellbox.act.sel{background:#e9f1ec;box-shadow:inset 0 0 0 2px #217346;} /* 既是活动格又在选区内:叠加 */
.g-cell{width:100%;height:100%;border:none;outline:none;padding:3px 6px;background:transparent;
  font-size:12.5px;color:#1a1a1a;box-sizing:border-box;}
.g-cell:focus{background:#fff;box-shadow:inset 0 0 0 1.5px #217346;}
.g-cellbox.sel .g-cell:focus{background:#fff;}
/* 图片格:格内缩略图 + 透明输入框(聚焦后才显示文字输入),未聚焦时文本隐藏不挡图 */
.g-cellbox.img{position:relative;background:#e9f1ff;box-shadow:inset 0 0 0 1px #b9d4ff;}
.g-cellbox.img.sel{background:#cfe2ff;}
.g-cellbox.img .g-cell-img{position:absolute;left:3px;top:2px;height:26px;max-width:calc(100% - 6px);
  object-fit:contain;border-radius:3px;background:#fff;pointer-events:none;z-index:1;}
.g-cellbox.img .g-cell{position:relative;z-index:2;background:transparent;color:transparent;
  caret-color:#1d3a6e;padding-left:4px;padding-right:4px;}
.g-cellbox.img .g-cell::selection{color:transparent;}
.g-cellbox.img .g-cell:focus{background:#fff;color:#22303f;}
.g-cellbox.img .g-cell:focus::selection{color:#fff;background:#3f83f8;}
/* 图片大图查看浮层 */
.pj-ov{position:fixed;inset:0;background:rgba(15,23,42,.55);z-index:1200;display:flex;
  align-items:center;justify-content:center;padding:20px;}
.pj-ov-card{background:#fff;border-radius:12px;max-width:min(92vw,880px);max-height:90vh;
  display:flex;flex-direction:column;overflow:hidden;box-shadow:0 12px 40px rgba(15,23,42,.35);}
.pj-ov-h{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;
  border-bottom:1px solid var(--line);font-size:14px;}
.pj-ov-x{cursor:pointer;color:var(--mut);font-size:16px;padding:0 4px;}
.pj-ov-x:hover{color:#a3261d;}
.pj-ov-img{max-width:100%;max-height:60vh;object-fit:contain;background:#f6f8fb;padding:8px;box-sizing:border-box;}
.pj-ov-f{color:var(--mut);font-size:12px;padding:6px 14px;word-break:break-all;}
.pj-ov-b{display:flex;gap:8px;padding:10px 14px;border-top:1px solid var(--line);justify-content:flex-end;}
.pj-hint{color:var(--mut);font-size:11.5px;margin-top:8px;}
/* ==================== 底部工作表标签栏(2026-09-15,仿 WPS/Excel) ====================
 * 一个表格 = 一个工作簿:标签显示每个工作表名,点标签切换、双击改名、右键更多、拖动调顺序;
 * 右端固定操作区(新工作表 / 插入工作表… / 导入覆盖 / 导出 Excel)常显不随标签滚动 */
.pj-sheetbar{display:flex;align-items:center;gap:8px;margin-top:6px;padding:4px 6px;border:1px solid var(--line);border-radius:10px;background:#f7f9fc;}
.pj-sheets{display:flex;align-items:center;gap:4px;flex:1;min-width:0;overflow-x:auto;overflow-y:hidden;padding-bottom:2px;}
.pj-sheets::-webkit-scrollbar{height:7px;}
.pj-sheets::-webkit-scrollbar-thumb{background:#c2cfE2;border-radius:4px;}
.pj-sheet{flex:0 0 auto;position:relative;border:1px solid #cfd6e0;border-bottom:none;background:#fff;color:#4b5563;font-size:12.5px;padding:4px 12px;border-radius:7px 7px 0 0;cursor:pointer;max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:none;}
.pj-sheet:hover{background:#eef4ff;border-color:#9dbdf0;color:#1565c0;}
.pj-sheet.on{background:#1565c0;border-color:#1565c0;color:#fff;font-weight:700;}
.pj-sheet.on:hover{background:#0d4fa0;color:#fff;}
.pj-sheet.locked{font-style:italic;}
.pj-sheet.dragging{opacity:.45;}
.pj-sheet.drop-l::before,.pj-sheet.drop-r::after{content:'';position:absolute;top:1px;bottom:1px;width:3px;background:#1565c0;border-radius:2px;}
.pj-sheet.drop-l::before{left:-2px;}
.pj-sheet.drop-r::after{right:-2px;}
.pj-sheet-add{flex:0 0 auto;width:24px;height:24px;line-height:20px;text-align:center;border:1px solid #cfd6e0;border-radius:6px;background:#fff;color:#1565c0;font-size:15px;font-weight:700;cursor:pointer;}
.pj-sheet-add:hover{background:#eef4ff;border-color:#1565c0;}
.pj-sheet-ops{flex:0 0 auto;display:flex;align-items:center;gap:4px;border-left:1px solid var(--line);padding-left:8px;}
.pj-sheet-ops .btn.sm{padding:3px 8px;font-size:12px;}
@media(max-width:900px){
  .pj-app{flex-direction:column;}
  .pj-left{width:100%;}
  .pj-t-ops{margin-left:0;}
}

/* ==================== 时光广场 / 个人主页(朋友圈式) ==================== */
a.top-user{text-decoration:none;color:#dfe9ff;}
a.top-user:hover{color:#fff;text-decoration:underline;}
/* —— 时光卡 —— */
.m-card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:13px 15px;margin-bottom:11px;}
.m-card[data-goto]{cursor:pointer;transition:box-shadow .15s,border-color .15s;}
.m-card[data-goto]:hover{border-color:#9db9ea;box-shadow:0 3px 10px rgba(47,111,237,.10);}
.m-top{display:flex;align-items:flex-start;gap:10px;}
.m-ava{width:38px;height:38px;border-radius:50%;background:linear-gradient(135deg,#2f6fed,#6a9bf5);color:#fff;
  font-weight:700;font-size:16px;display:flex;align-items:center;justify-content:center;flex:none;user-select:none;}
.m-tt{flex:1;min-width:0;margin-top:1px;}
.m-who{font-weight:600;color:#2b3a55;font-size:14px;}
.m-time{font-size:11.5px;color:var(--mut);margin-top:2px;}
.m-ops{flex:none;}
.m-txt{font-size:13.5px;color:#22303f;line-height:1.75;margin-top:9px;overflow-wrap:break-word;word-break:break-word;
  white-space:pre-line;user-select:text;-webkit-user-select:text;cursor:text;}
.m-txt.full{white-space:normal;user-select:text;-webkit-user-select:text;cursor:text;}
.m-foot{margin-top:9px;font-size:11.5px;color:var(--blue);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.m-thumbs{display:flex;gap:6px;margin-top:9px;flex-wrap:wrap;}
.m-thumb{width:88px;height:88px;object-fit:cover;border-radius:8px;border:1px solid var(--line);background:#fff;cursor:zoom-in;transition:transform .15s ease,box-shadow .15s ease;}
.m-thumb:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.12);border-color:var(--blue);}
.m-more{width:88px;height:88px;border-radius:8px;background:#eef2f9;color:#5a6b85;display:flex;align-items:center;justify-content:center;
  font-size:15px;font-weight:700;border:1px solid var(--line);}
.m-vthumb{width:170px;height:88px;border-radius:8px;background:linear-gradient(135deg,#1c2333,#32415f);color:#fff;
  display:flex;align-items:center;justify-content:center;gap:8px;font-size:12.5px;}
.m-vthumb.m-vthumb-broken{background:linear-gradient(135deg,#3a3a3a,#5a5a5a);opacity:.85;}
.m-vplay{width:28px;height:28px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;font-size:11px;}
.m-card .att-imgs{margin-top:9px;}
/* —— 视频文件已失效占位(SSR 时检测到 mediaFileExists=false 用这个代替 <video>) —— */
.mo-vid.mo-vid-broken{
  width:240px;height:140px;border-radius:10px;
  background:linear-gradient(135deg,#3a3a3a 0%,#525252 60%,#6b6b6b 100%);
  color:#e8e8e8;display:flex;align-items:center;justify-content:center;
  position:relative;overflow:hidden;
  border:1px dashed rgba(255,255,255,.18);
}
.mo-vid.mo-vid-broken::before{
  content:"";position:absolute;inset:0;
  background:repeating-linear-gradient(135deg,transparent 0,transparent 14px,rgba(255,255,255,.04) 14px,rgba(255,255,255,.04) 28px);
}
.mo-vid-broken-inner{position:relative;text-align:center;padding:0 16px;}
.mo-vid-broken-ico{font-size:34px;line-height:1;margin-bottom:8px;opacity:.9;}
.mo-vid-broken-text{font-size:13.5px;font-weight:600;letter-spacing:.5px;color:#fff;margin-bottom:4px;}
.mo-vid-broken-name{font-size:11px;color:rgba(255,255,255,.55);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mo-vname-broken-tag{font-size:10.5px;color:#ffb4b4;background:rgba(255,90,90,.18);padding:1px 6px;border-radius:4px;margin-left:6px;}
/* —— 图片失效占位 —— */
.att-img-broken{
  display:flex;align-items:center;gap:10px;
  padding:10px 12px;border:1px dashed var(--line);border-radius:8px;
  background:#fafbfc;color:#5a6b85;font-size:13px;
  min-height:54px;
}
.att-broken-ico{font-size:22px;opacity:.6;}
.att-broken-nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3a4a66;font-weight:500;}
.att-broken-tag{font-size:10.5px;color:#b00;background:#fee;border:1px solid #fcc;padding:1px 6px;border-radius:4px;}
/* —— 失效态不影响视频三态机(active / user-played)的逻辑:占位永远保持缩略图大小,不参与放大 —— */
.mo-vid.mo-vid-broken.active video,
.mo-vid.mo-vid-broken{ /* 失效视频永远保持缩略图,不放大 */ }
.m-card .att-imgs img{height:120px;}
.m-vid{margin-top:10px;}
.m-vid video{width:100%;max-width:600px;max-height:430px;background:#000;border-radius:10px;display:block;}
/* —— 时光视频(广场 + 个人主页统一):默认 240x140 缩略图,点视频放大,点视频以外区域缩回 —— */
/* 默认态:缩略图尺寸 + 一层 ▶ 点击层(点击层只在缩略图态显示,放大后让位给原生 controls) */
.mo-vid{margin-top:10px;display:flex;flex-direction:column;align-items:flex-start;gap:4px;transition:width .3s ease;}
.mo-vid-box{position:relative;line-height:0;display:block;}
.mo-vid video{
  display:block;background:#000;border-radius:10px;
  width:240px;height:140px;max-width:240px;max-height:140px;
  object-fit:contain;box-shadow:0 2px 8px rgba(0,0,0,.18);
  transition:width .3s ease,height .3s ease,max-width .3s ease,max-height .3s ease,
    border-radius .3s ease,box-shadow .3s ease;
}
.mo-vid-hit{
  position:absolute;inset:0;border-radius:10px;
  display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.10);cursor:zoom-in;transition:background .2s ease;
}
.mo-vid-hit:hover{background:rgba(0,0,0,.30);}
.mo-vid-play{
  width:44px;height:44px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:17px;padding-left:4px;
  box-shadow:0 4px 16px rgba(0,0,0,.4);pointer-events:none;
}
/* 放大态:视频铺到卡片可用宽度(上限 860px / 高度 60vh),点击层收起,交给原生 controls */
.mo-vid.active .mo-vid-hit{display:none;}
.mo-vid.active video{
  width:min(86vw,860px);height:min(60vh,484px);
  max-width:min(86vw,860px);max-height:min(60vh,484px);
  border-radius:14px;box-shadow:0 12px 40px rgba(0,0,0,.35);
}
.mo-vid .mo-vname{font-size:11.5px;color:var(--mut);word-break:break-all;}
/* 放大态卡片禁止跳转(否则点卡片跳走视频就停了) */
.m-card.in-active[data-goto]{cursor:default;pointer-events:auto;}
.m-card.in-active[data-goto]:hover{border-color:var(--line);box-shadow:none;}
.m-card.in-active[data-goto] .m-top,
.m-card.in-active[data-goto] .m-txt,
.m-card.in-active[data-goto] .mo-vid video{cursor:text;}
/* 小屏适配:浏览器窗口 < 720 时,缩小默认/放大态尺寸 */
@media (max-width:720px){
  .mo-vid video{width:170px;height:100px;max-width:170px;max-height:100px;}
  .mo-vid.active video{width:94vw;height:52vw;max-width:94vw;max-height:52vw;}
}

.m-vname{font-size:11.5px;color:var(--mut);margin-top:4px;word-break:break-all;}
.m-card .att-files{margin-top:9px;}
.more-box{text-align:center;padding:4px 0 2px;}
/* —— 个人主页头部 —— */
.u-head{display:flex;gap:14px;align-items:flex-start;}
.u-ava{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#2f6fed,#6a9bf5);color:#fff;
  font-weight:700;font-size:27px;display:flex;align-items:center;justify-content:center;flex:none;user-select:none;}
.u-info{flex:1;min-width:0;}
.u-name{font-size:18px;font-weight:700;color:#22303f;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.u-meta{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12.5px;color:var(--mut);margin-top:9px;}
.u-stat b{font-size:16px;color:var(--blue-d);margin-right:3px;font-weight:700;}
.chip.lock{background:#fdeceb;color:#a3261d;}
/* —— 主页「我的项目组」概览 —— */
.mg-wrap{display:flex;flex-direction:column;gap:14px;}
.mg-grp{border:1px solid var(--line);border-radius:11px;padding:12px 15px;background:#fafcff;}
.mg-gname{font-weight:700;color:var(--blue-d);margin-bottom:10px;font-size:14.5px;}
.mg-tbl{margin:0 0 14px 0;padding-left:14px;border-left:3px solid #dbe7fb;}
.mg-tbl:last-child{margin-bottom:0;}
.mg-tname{display:flex;align-items:center;gap:8px;font-weight:600;color:#2b3a55;font-size:13.5px;flex-wrap:wrap;}
.mg-tmeta{color:var(--mut);font-size:11.5px;margin:4px 0 7px;}
.pc-tbl{border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:8px;overflow:hidden;
  min-width:230px;font-size:12px;}
.pc-tbl td{padding:3px 11px;border-bottom:1px solid #eef2f9;color:#22303f;}
.pc-tbl tr:last-child td{border-bottom:none;}
.pc-rc{color:var(--blue-d);font-weight:600;white-space:nowrap;background:#f2f6fd;width:1%;}
.pc-v{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* —— 用户头像(个人主页/时光卡/顶栏/侧栏) —— */
.u-ava-col{display:flex;flex-direction:column;align-items:center;flex:none;}
.u-ava-col .btn{margin-top:9px;}
.u-ava.av-img,.m-ava.av-img{overflow:hidden;background:#eef2f9;padding:0;}
.u-ava.av-img img,.m-ava.av-img img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%;}
a.top-user{display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#dfe9ff;}
a.top-user:hover{color:#fff;text-decoration:underline;}
a.top-user .top-un{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mini-ava{width:20px;height:20px;border-radius:50%;object-fit:cover;flex:none;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;background:#3a4a63;color:#cfe0ff;}
.top-user .mini-ava{background:rgba(255,255,255,.18);color:#dbe7fb;}
@media(max-width:640px){
  .u-head{flex-direction:column;}
  .u-ava{width:56px;height:56px;font-size:23px;}
  .m-thumb{width:74px;height:74px;}
  .m-vthumb{width:150px;height:74px;}
}
/* ================= Excel 工具栏 / 公式格式 / 行列/排序 ================= */
.pj-ftool{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:7px 0 4px;
  border-top:1px dashed var(--line);margin-bottom:8px;font-size:12px;}
.pj-ft-lbl{color:var(--mut);font-size:11.5px;font-weight:600;}
.pj-fbtn{min-width:30px;padding:1px 7px;font-size:12.5px;}
.pj-fbtn.on{background:#cfe0ff;color:#0b3d91;border-color:#8fb2f0;box-shadow:inset 0 0 0 1px #8fb2f0;}
.pj-ft-c{display:inline-flex;align-items:center;gap:3px;color:var(--mut);font-size:11.5px;line-height:1;}
.pj-ft-c input[type=color]{width:22px;height:20px;border:1px solid var(--line);border-radius:4px;padding:0;
  background:none;cursor:pointer;vertical-align:middle;}
.pj-ft-nf{font-size:12px;border:1px solid var(--line);border-radius:6px;padding:2px 4px;color:#33415a;background:#fff;}
.pj-ft-sep{width:1px;height:16px;background:var(--line);margin:0 2px;align-self:center;}
.g-cellbox.err input{color:#d93025;font-weight:700;}
/* 项目组卡内文章区 */
.pj-gdocs{border-top:1px dashed var(--line);background:#fbfcff;padding-bottom:6px;}
.pj-gdlbl{font-size:11px;color:#8b98ab;padding:5px 12px 2px;}
.pj-gdoc{display:block;padding:3px 12px 3px 20px;font-size:12.5px;color:#5a6b85;text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-gdoc:hover{background:#eef4ff;color:var(--blue);}
/* 全站左侧边栏:组内文章 */
.s-docs{margin:0 0 6px;}
.s-doc{display:block;padding:3px 10px 3px 22px;font-size:12px;color:#8aa0c4;text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.s-doc:hover{background:#eef4ff;color:var(--blue);}
/* ================= 文章(Word 骨架):阅读页 / 编辑页 ================= */
.doc-crumb{font-size:12.5px;color:var(--mut);margin-bottom:8px;}
.doc-crumb a{color:var(--blue);text-decoration:none;}
.doc-crumb a:hover{text-decoration:underline;}
.doc-title{margin:6px 0 6px;font-size:24px;line-height:1.4;}
.doc-meta{color:var(--mut);font-size:12.5px;margin-bottom:16px;}
.doc-body{font-size:15px;line-height:2.05;color:#26334a;user-select:text;-webkit-user-select:text;cursor:text;} /* ws64:阅读页正文恢复可选(全局 none 会禁掉选中复制) */
.doc-body p{margin:0 0 8px;}
/* 文章正文用统一正文渲染(renderBody)后,普通行是 .t-line:补一个与原 <p> 接近的行距 */
.doc-body .t-line{margin:0 0 10px;font-size:15px;line-height:1.9;color:#26334a;}
.doc-body pre.code{font-size:12.5px;line-height:1.6;}
/* 时光卡片里的代码段:同游戏文件查看页风格,宽度撑满卡片 */
.m-txt pre.code{margin:8px 0;}
.m-txt .t-line{margin:0;}
.doc-foot{margin-top:20px;padding-top:14px;border-top:1px dashed var(--line);
  display:flex;gap:8px;flex-wrap:wrap;}
.doc-edit h2{margin:2px 0 16px;font-size:19px;}
.doc-edit .hint-inline{color:var(--mut);font-weight:400;font-size:12px;}
textarea.doc-ta{font-family:inherit;line-height:1.9;min-height:320px;resize:vertical;}
/* 个人主页项目组概览:文章列表 */
.mg-dlbl{font-size:12px;font-weight:700;color:var(--mut);padding:10px 0 4px;}
.mg-docs{display:flex;flex-direction:column;gap:2px;padding-bottom:4px;}
.mg-doc{display:flex;align-items:center;gap:8px;padding:3px 8px;border-radius:6px;}
.mg-doc:hover{background:#eef4ff;}
.mg-doc-t{color:var(--blue-d);text-decoration:none;font-size:13px;flex:1;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mg-doc-t:hover{text-decoration:underline;}
@media(max-width:900px){
  .pj-ftool{gap:5px;}
  .doc-body{font-size:14px;}
  .album-grid{grid-template-columns:repeat(2,1fr)!important;}
}

/* ====================== 相册详情页(/album/:id)样式 ====================== */
.album-page .album-hd{margin-bottom:14px;}
.album-page .album-hd h2{font-size:20px;margin:0 0 4px;color:var(--blue-d);}
.album-page .album-sub{font-size:12.5px;color:var(--mut);}
.album-page .album-desc{margin-top:6px;font-size:13px;color:#3a4a63;line-height:1.7;background:#f3f7ff;padding:6px 12px;border-radius:6px;border-left:3px solid var(--blue);}
.album-tbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px;padding-bottom:10px;border-bottom:1px dashed var(--line);}
.album-tbar label.btn{cursor:pointer;}
.album-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;}
.album-empty{grid-column:1/-1;text-align:center;color:var(--mut);padding:46px 16px;font-size:14px;line-height:2.0;background:#f8faff;border:1px dashed #c8d6ee;border-radius:8px;}
.alb-cell{position:relative;aspect-ratio:1/1;border-radius:8px;overflow:hidden;background:#e8eef8;cursor:zoom-in;border:1px solid #d9e2f1;transition:.15s;}
.alb-cell:hover{border-color:var(--blue);transform:translateY(-2px);box-shadow:0 6px 18px rgba(35,80,180,.22);}
.alb-cell.is-vid .alb-vid-tag{position:absolute;top:6px;right:6px;background:rgba(0,0,0,.6);color:#fff;padding:1px 7px;border-radius:10px;font-size:11px;z-index:1;}
.alb-cell .alb-thumb{display:block;width:100%;height:100%;object-fit:cover;}
.alb-cell .alb-cap{position:absolute;left:0;right:0;bottom:0;padding:4px 8px;font-size:11.5px;color:#fff;background:linear-gradient(transparent,rgba(0,0,0,.6));overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* 上传进度面板 */
.album-up-pane{margin-top:14px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:#f8faff;}
.album-up-hd{font-size:13px;font-weight:600;margin-bottom:6px;color:var(--blue-d);}
.album-up-list{display:flex;flex-direction:column;gap:4px;max-height:200px;overflow:auto;}
.album-up-row{display:flex;justify-content:space-between;font-size:12.5px;padding:3px 6px;border-radius:5px;background:#fff;border:1px solid var(--line);}
.album-up-row.ok{background:#f0faf3;border-color:#bbe5cc;}
.album-up-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60%;}
.album-up-st{flex:none;color:var(--mut);}
.album-up-row.ok .album-up-st{color:#1f9a45;}

/* 拖拽上传全局视觉 */
body.album-drag::after{content:"📥 松开鼠标即可上传图片/视频";position:fixed;inset:0;background:rgba(35,90,200,.18);color:#fff;font-size:18px;font-weight:600;
  display:flex;align-items:center;justify-content:center;z-index:9999;pointer-events:none;letter-spacing:2px;text-shadow:0 2px 8px rgba(0,0,0,.3);}

/* 大图浏览 */
.alb-viewer{position:fixed;inset:0;background:rgba(8,16,32,.92);z-index:10000;display:flex;align-items:center;justify-content:center;
  flex-direction:row;animation:albFade .2s;}
@keyframes albFade{from{opacity:0;}to{opacity:1;}}
.alb-stage{flex:1;display:flex;align-items:center;justify-content:center;min-width:0;height:100%;padding:24px 80px;}
.alb-stage img,.alb-stage video{max-width:100%;max-height:100%;object-fit:contain;border-radius:6px;box-shadow:0 12px 40px rgba(0,0,0,.5);}
.alb-info{position:absolute;left:24px;bottom:24px;background:rgba(0,0,0,.55);color:#fff;padding:12px 16px;border-radius:10px;
  max-width:320px;font-size:13px;line-height:1.7;backdrop-filter:blur(6px);}
.alb-info-h{font-weight:600;font-size:14px;margin-bottom:4px;word-break:break-all;}
.alb-info-m{font-size:11.5px;opacity:.85;}
.alb-cap-row{margin-top:8px;display:flex;gap:6px;}
.alb-cap-row .txt{flex:1;font-size:12px;padding:5px 8px;background:rgba(255,255,255,.15);color:#fff;border:1px solid rgba(255,255,255,.25);border-radius:5px;}
.alb-cap-row .txt:focus{background:rgba(255,255,255,.95);color:var(--txt);}
.alb-cap-row .btn{padding:5px 10px;font-size:12px;}
.alb-info-foot{margin-top:10px;display:flex;justify-content:space-between;align-items:center;gap:8px;}
.alb-idx{font-size:11px;opacity:.85;}
.alb-x,.alb-prev,.alb-next{position:absolute;background:rgba(0,0,0,.45);color:#fff;border:0;cursor:pointer;border-radius:50%;
  width:46px;height:46px;font-size:22px;font-weight:700;display:flex;align-items:center;justify-content:center;
  transition:.15s;line-height:1;}
.alb-x:hover,.alb-prev:hover,.alb-next:hover{background:rgba(35,80,180,.85);transform:scale(1.1);}
.alb-x{top:18px;right:18px;}
.alb-prev{left:18px;top:50%;transform:translateY(-50%);}
.alb-next{right:18px;top:50%;transform:translateY(-50%);}
.alb-prev:hover{transform:translateY(-50%) scale(1.1);}
.alb-next:hover{transform:translateY(-50%) scale(1.1);}

/* ====================== 画板详情页(/board/:id)样式 ====================== */
.board-page .board-hd{margin-bottom:12px;}
.board-page .board-hd h2{font-size:20px;margin:0 0 4px;color:var(--blue-d);}
.board-page .board-sub{font-size:12.5px;color:var(--mut);}
.board-page .board-desc{margin-top:6px;font-size:13px;color:#3a4a63;line-height:1.7;background:#f3f7ff;padding:6px 12px;border-radius:6px;border-left:3px solid var(--blue);}
/* 顶部工具栏:三段式分段控件;20260916 改单行不折行(超宽横向滚动)+固定行高(选中段显隐不改行高,画布不上下移,ws75 坑根除) */
.board-tbar{display:flex;gap:8px;flex-wrap:nowrap;align-items:center;height:66px;margin-bottom:10px;padding:8px 10px;background:#f5f8fd;border:1px solid var(--line);border-radius:10px;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;}
.board-tb-seg{display:inline-flex;align-items:center;gap:5px;flex-wrap:nowrap;white-space:nowrap;flex-shrink:0;background:#fff;border:1px solid var(--line);border-radius:8px;padding:4px 8px;}
.board-tb-seg.board-tb-right{margin-left:auto;background:transparent;border:0;padding:0;}
.board-tb-lbl{font-size:11.5px;color:var(--mut);font-weight:600;margin-right:2px;}
.board-tb-sep{width:1px;height:22px;background:var(--line);align-self:center;margin:0 2px;}
.board-tb-btn{display:inline-block;padding:4px 10px;font-size:12.5px;color:#2b3a55;background:#fbfcfe;border:1px solid var(--line);border-radius:6px;cursor:pointer;transition:.12s;line-height:1.4;text-decoration:none;}
.board-tb-btn:hover{background:#eef4ff;border-color:var(--blue);color:var(--blue-d);}
.board-tb-btn.active{background:#cfe0ff;border-color:#8fb2f0;color:#0b3d91;box-shadow:inset 0 0 0 1px #8fb2f0;}
.board-tb-btn.danger{color:#a3261d;border-color:#f4c8c4;}
.board-tb-btn.danger:hover{background:#fdecea;color:#7a1a13;border-color:#e09893;}
.board-tb-btn:disabled{opacity:.5;cursor:not-allowed;}
.board-tb-color,.board-tb-size{display:inline-flex;align-items:center;gap:3px;font-size:11.5px;color:var(--mut);padding:2px 4px;}
.board-tb-color input[type=color]{width:24px;height:22px;border:1px solid var(--line);border-radius:4px;padding:0;background:none;cursor:pointer;}
.board-tb-size input[type=number]{width:50px;font-size:12px;padding:2px 4px;border:1px solid var(--line);border-radius:4px;}
.board-tb-save{font-size:12px;color:var(--mut);margin-right:4px;}
.board-tb-save.dirty{color:#e69500;font-weight:600;}
.board-tb-save.ok{color:#1f9a45;font-weight:600;}
/* 画布:可滚动容器,内部 SVG 居中显示 */
/* 20260916ws79:必须有 position:relative —— 双击编辑的透明输入框用绝对定位盖住图形,
 * 容器不定位的话包含块会跑到页面更上层,输入框整体偏移(用户反馈「光标不在图形里」) */
.board-canvas-wrap{position:relative;margin-top:8px;padding:0 14px;background:#e9eef5;border:1px solid var(--line);border-radius:10px;overflow:auto;overscroll-behavior:contain;max-height:78vh;text-align:center;} /* 20260916:overscroll-behavior 让滚到画布边界时不再把整页带着滚;20260917:上下内边距 14→0(画布高 530 要在控制台 530 内刚好放下、纵向滚动条不出现),左右 14 保留 */
/* 20260917:控制台宽度与上方工具栏一致(用户需求:控制台与上面的框的宽度改成一致)——去掉  的固定 1560px,块级自动占满 .board-main(与 .board-tbar 同宽同左缘);高度仍 660,画布 1600×1000 超出部分框内滚动 */
/* 20260917:控制台宽度改回自动占满 + 高度减档(用户需求:控制台中心点往上移动/减少高度、右侧滚动条与高度刚好、下面的滚动条也刚好、控制台宽度与上面的框架宽度一致)——
 * ①宽:块级 width:auto 占满 .board-main,与上面 .board-tbar 框架同宽同左缘( 固定 1600 在宽屏下比框架窄,作废);
 * ②高:CSS 兜底 560(比  的 600 减一档,框中心随变矮上移),实际高度由 app.js boardFitHeights 按窗口底沿动态精确适配,保证整页右侧滚动条与窗口高度刚好;
 * ③横向:server.js 里 SVG 内联改 width:100%,内容宽永远=框内容宽,底部滚动条不再出现(刚好);SVG 高度随宽等比,纵向滚动行程即真实内容高度。 */
/* 20260917:控制台高度 560→530(用户需求),宽 auto/滚动条逻辑沿用  不变 */
.board-canvas-wrap{width:auto;height:530px;}
.board-canvas-wrap.mm-embed{height:600px;max-height:600px;} /* 思维导图页内嵌画板维持 600 不受  影响 */
.board-svg{display:inline-block;background:#fff;border:1px solid #bcc8e0;border-radius:4px;box-shadow:0 4px 16px rgba(0,0,0,.08);user-select:none;}
/* SVG 形状交互样式 */
.board-shape{cursor:move;transition:filter .15s;}
.board-shape:hover{filter:drop-shadow(0 0 3px rgba(35,80,180,.4));}
.board-shape.selected{outline:2px dashed #2f6fed;outline-offset:2px;}
.board-shape.selected text{font-weight:700;}
/* 形状内文字 */
.board-shape text{user-select:none;pointer-events:none;}
/* 形状编辑 textarea(覆盖在 SVG 上方) */
/* 20260916ws67:双击图形=原地编辑 —— 透明无边框,光标直接落在图形里打字(对照视频 1.mp4) */
.board-text-edit{position:absolute;border:none;background:transparent;font-family:inherit;resize:none;padding:0;border-radius:0;box-shadow:none;z-index:10;outline:none;box-sizing:border-box;overflow:hidden;}
/* 编辑中的图形:隐藏 SVG 原文字(避免与输入框重影),提交后由 render 重画 */
.board-shape.editing text{visibility:hidden;}
.board-shape.editing text.board-ctext{visibility:visible;} /* ws90:方格类逐格文字 —— 只藏正在编辑的格子,其余格子照常显示 */
.board-shape.editing text.board-ctext.editing-cell{visibility:hidden;} /* :正在编辑的那一格原文字藏掉(重影修复:原文字+输入框两份文字坐标稍偏即双影) */
.board-slot{fill:none;stroke:#2f6fed;stroke-width:1;stroke-dasharray:5,4;opacity:.5;pointer-events:none;} /* ws91:编辑中该图形有几处文字位 */
.board-slot.on{stroke:#f59e0b;stroke-width:1.4;opacity:.95;}
.board-slot-no{font-size:11px;font-weight:700;fill:#2f6fed;opacity:.8;pointer-events:none;font-family:inherit;}
/* 使用提示 */
.board-hint{font-size:12.5px;color:#3a4a63;background:#f3f7ff;padding:7px 12px;border-radius:8px;margin-bottom:8px;line-height:1.7;border:1px solid #dbe7fb;}
.board-hint kbd{display:inline-block;font-size:11px;padding:1px 6px;background:#fff;border:1px solid #bcc8e0;border-radius:4px;font-family:Menlo,Consolas,monospace;color:#2b3a55;box-shadow:inset 0 -1px 0 #bcc8e0;margin:0 1px;}
/* 20260915ws47:图形库面板(页签 + 图标 + 图形名网格,对照用户视频素材库) */
/* 20260915ws53:取消分类页签(82 种图形全部放在同一个网格里,不分页签),网格加高方便浏览 */
/* 20260916:图形库移到画布左侧竖栏(board-body 左右分栏),带标题计数与搜索框;窄屏回落为上方横排 */
.board-body{display:flex;gap:10px;align-items:stretch;}
.board-main{flex:1;min-width:0;position:relative;} /* 20260918:relative = 右下角视图缩放条的定位锚(不随控制台滚动) */
/* 20260918:画板页右下角「− 100% ＋ ⛶」视图缩放条(样式复用思维导图页 .mm-zoombar,只调位置避开滚动条与保存状态) */
.board-zoombar{right:24px;bottom:20px;}
/* 20260917:左栏高度与右侧「工具栏66+间距10+可视框660」对齐(原来 78vh+30px 会比 660 框高出一截) */
.board-picker{width:192px;flex:none;margin-bottom:0;display:flex;flex-direction:column;max-height:740px;background:#f5f8fd;border:1px solid var(--line);border-radius:10px;padding:7px 9px;}
.board-pk-hd{font-size:12.5px;font-weight:700;color:#2b3a55;padding:1px 2px 6px;display:flex;align-items:center;gap:6px;flex:none;}
.board-pk-hd span{font-weight:500;font-size:11.5px;color:#5a6b87;}
.board-pk-search{width:100%;flex:none;box-sizing:border-box;margin:0 0 7px;padding:5px 8px;font-size:12px;border:1px solid var(--line);border-radius:7px;background:#fff;color:#2b3a55;outline:none;}
.board-pk-search:focus{border-color:var(--blue);box-shadow:0 0 0 2px rgba(47,111,237,.12);}
.board-pk-empty{grid-column:1/-1;text-align:center;color:#7a88a3;font-size:11.5px;padding:14px 4px;}
.board-pk-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:5px;flex:1;min-height:0;overflow-y:auto;padding:2px 2px 4px;}
.board-pk-grid::-webkit-scrollbar{width:8px;}
.board-pk-grid::-webkit-scrollbar-thumb{background:#c6d4ec;border-radius:4px;}
.board-pk-item{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 2px 4px;background:#fff;border:1px solid var(--line);border-radius:8px;cursor:pointer;transition:.12s;}
.board-pk-item:hover{border-color:var(--blue);background:#eef4ff;transform:translateY(-1px);box-shadow:0 3px 8px rgba(35,80,180,.15);}
.board-pk-item:active{transform:translateY(0);}
.board-pk-ic{height:24px;display:flex;align-items:center;justify-content:center;}
.board-pk-ic svg{width:42px;height:23px;display:block;}
.board-pk-nm{font-size:11px;color:#3a4a63;line-height:1.25;white-space:nowrap;max-width:64px;overflow:hidden;text-overflow:ellipsis;}
/* 20260915ws47:选中图形的四角缩放手柄 */
.board-handle{fill:#fff;stroke:#2f6fed;stroke-width:1.6;cursor:nwse-resize;}
.board-handle[data-h="ne"],.board-handle[data-h="sw"]{cursor:nesw-resize;}
/* ★ :旋转手柄 —— 选中框上方的圆点,按住拖动绕图形中心旋转 */
.board-rothandle{fill:#fff;stroke:#2f6fed;stroke-width:1.8;cursor:grab;}
.board-rothandle:active{cursor:grabbing;}
.board-rotline{stroke:#2f6fed;stroke-width:1.2;stroke-dasharray:3 3;opacity:.7;}
/* 20260915ws53:多选时的整体包围框(蓝色虚线)与空白处拖出的框选选框(半透明蓝);都不吃鼠标事件,免得挡住拖动 */
.board-selbox{fill:none;stroke:#2f6fed;stroke-width:1.5;stroke-dasharray:6,4;pointer-events:none;}
.board-marquee{fill:rgba(47,111,237,.12);stroke:#2f6fed;stroke-width:1.2;stroke-dasharray:5,3;pointer-events:none;}
/* 20260916ws95:节点线(可连接任意图形的连线) —— 透明加粗命中线 + 两端可拖圆点 */
.board-hitline{stroke:transparent;stroke-width:16;fill:none;pointer-events:stroke;cursor:move;}
.board-ep{fill:#fff;stroke:#2f6fed;stroke-width:1.8;pointer-events:all;cursor:crosshair;}
.board-ep.on{fill:#2f6fed;}   /* 这一头已经吸在某个图形上 */
.board-ep:hover{fill:#2f6fed;stroke:#1d4ed8;}
.board-linetext{pointer-events:none;}
/* 项目组卡片内的画板区(类似相册九宫格的简化版:每行 3 列,显示"画板名+图形数") */
.pj-bdbs{padding:6px 8px 8px;border-top:1px dashed var(--line);background:#fbfcff;}
.pj-bdbs .pj-gdlbl{display:flex;justify-content:space-between;align-items:center;}
.pj-bdbs-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px;padding:0 4px 4px;}
.pj-bdb-cell{position:relative;display:flex;flex-direction:column;justify-content:flex-start;aspect-ratio:1/1;border-radius:6px;overflow:hidden;
  border:1px solid var(--line);background:linear-gradient(135deg,#fbfcff,#f0f4fc);text-decoration:none;color:var(--txt);transition:.15s;padding:6px 6px 4px;}
.pj-bdb-cell:hover{border-color:var(--blue);transform:translateY(-1px);box-shadow:0 4px 12px rgba(35,80,180,.18);}
.pj-bdb-cell:active{cursor:grabbing;}
.pj-bdb-icon{font-size:20px;line-height:1;margin-bottom:2px;}
.pj-bdb-nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--blue-d);font-weight:600;}
.pj-bdb-ct{font-size:10.5px;color:var(--mut);background:#eef2f9;padding:1px 5px;border-radius:8px;align-self:flex-start;}
@media(max-width:740px){
  .board-tbar{gap:4px;}
  .board-tb-seg{padding:3px 6px;}
  .board-canvas-wrap{padding:8px;}
}

/* ====================== 思维导图详情页(/mindmap/:id)样式 ====================== */
/* 整体页面:浅色卡片背景,带左侧项目组卡片同款圆角和阴影 */
.mm-page{position:relative;}
.mm-hd{margin-bottom:12px;}
.mm-hd h2{margin:0 0 4px;font-size:20px;color:var(--blue-d);}
.mm-sub{font-size:12px;color:var(--mut);}
.mm-desc{margin-top:6px;padding:6px 10px;background:#f4f7fd;border-radius:6px;color:#475569;font-size:13px;line-height:1.5;}
/* 工具栏:与画板类似,分段布局 + 右侧"已保存/改名/删除" */
.mm-tbar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;background:#f4f7fd;border-radius:10px;padding:6px 10px;margin-bottom:10px;border:1px solid #e1e8f3;}
.mm-tb-seg{display:flex;align-items:center;gap:4px;background:#fff;border-radius:8px;padding:3px 6px;border:1px solid #e1e8f3;}
.mm-tb-sep{width:1px;height:22px;background:#d6deeb;margin:0 2px;}
.mm-tb-seg.mm-tb-right{margin-left:auto;}
.mm-tb-lbl{font-size:11.5px;color:var(--mut);padding-right:4px;}
.mm-tb-btn{background:#fff;border:1px solid #d6deeb;border-radius:6px;padding:4px 10px;font-size:12.5px;color:var(--blue-d);cursor:pointer;transition:.12s;font-family:inherit;}
.mm-tb-btn:hover{background:#eaf1fc;border-color:#7ea2ec;}
.mm-tb-btn.danger{color:#c0392b;border-color:#f0c5be;}
.mm-tb-btn.danger:hover{background:#fde9e5;}
.mm-tb-btn.active{background:var(--blue);color:#fff;border-color:var(--blue-d);}
.mm-tb-sel{background:#fff;border:1px solid #d6deeb;border-radius:6px;padding:3px 6px;font-size:12px;color:var(--blue-d);font-family:inherit;cursor:pointer;}
.mm-tb-color{display:inline-flex;align-items:center;gap:3px;font-size:11px;color:var(--mut);}
.mm-tb-color input[type=color]{width:24px;height:22px;padding:0;border:1px solid #d6deeb;border-radius:4px;background:none;cursor:pointer;}
.mm-tb-size{display:inline-flex;align-items:center;gap:3px;font-size:11px;color:var(--mut);}
.mm-tb-size input[type=number]{width:50px;padding:2px 4px;border:1px solid #d6deeb;border-radius:4px;font-size:12px;color:var(--blue-d);}
.mm-tb-save{font-size:12px;color:#22a06b;padding:2px 8px;}
.mm-tb-save.dirty{color:#e8a23a;}
.mm-tb-save.saving{color:#3b6ee0;}
.mm-tb-swatches{display:inline-flex;gap:3px;margin-left:4px;}
.mm-tb-swatch{width:18px;height:18px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #d6deeb;cursor:pointer;transition:.12s;}
.mm-tb-swatch:hover{transform:scale(1.15);}
.mm-tb-swatch.on{box-shadow:0 0 0 2px var(--blue);}
/* 提示带 */
.mm-hint{padding:8px 12px;background:#fff8e1;border-left:3px solid #e8a23a;border-radius:6px;font-size:12.5px;color:#7a5b16;margin-bottom:10px;line-height:1.7;}
.mm-hint kbd{display:inline-block;padding:1px 6px;background:#fff;border:1px solid #c8a23c;border-radius:4px;font-family:inherit;font-size:11px;color:#7a5b16;}
/* 画布:无限 SVG,固定尺寸,鼠标可拖拽 */
.mm-canvas-wrap{background:#f4f7fd;border-radius:10px;padding:12px;border:1px solid #e1e8f3;overflow:auto;max-height:75vh;overflow-anchor:none;}
.mm-svg{display:block;background:#fff;border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.04);user-select:none;}
/* 节点:圆角矩形为主,默认有阴影;选中加深 + 加粗边 */
.mm-node{cursor:move;transition:filter .15s;}
.mm-node:hover{filter:brightness(1.05);}
.mm-node.selected rect,.mm-node.selected ellipse{stroke-width:3;}
.mm-node text{user-select:none;pointer-events:none;}
/* 折叠图标:右下角小三角,hover 变蓝 */
.mm-collapse-mark{position:absolute;cursor:pointer;font-size:11px;fill:#fff;opacity:.85;}
.mm-collapse-mark:hover{opacity:1;}
/* 编辑文字输入框:绝对定位到画布上 */
.mm-edit{position:absolute;background:#fff;border:2px solid var(--blue);border-radius:6px;padding:6px 10px;font-size:14px;color:var(--blue-d);outline:none;resize:none;font-family:inherit;box-shadow:0 4px 12px rgba(0,0,0,.15);z-index:100;min-width:80px;text-align:center;}
/* 节点右键菜单:跟项目组右键菜单复用 */
.mm-node.selected text{font-weight:600;}
/* 连接线:贝塞尔曲线,默认颜色由主题提供 */
.mm-edge{fill:none;stroke-width:2;transition:stroke .15s;}
/* 20260916ws67:连线可编辑 —— 透明宽命中线(双击/右键好点) + 连线文字(背景色描边垫底) */
.mm-edge-hit{fill:none;stroke:transparent;stroke-width:16;cursor:text;pointer-events:stroke;}
.mm-edge-label{font-size:13px;font-weight:600;stroke-width:5px;paint-order:stroke;stroke-linejoin:round;pointer-events:none;}
.mm-edge-edit{text-align:center;resize:none;overflow:hidden;padding:0 4px;font-size:13px;font-weight:600;}
/* 主题:夜空深 */
.mm-page[data-theme=dark] .mm-canvas-wrap{background:#1c2438;border-color:#334063;}
.mm-page[data-theme=dark] .mm-svg{background:#0f172a;}
.mm-page[data-theme=dark] .mm-tbar{background:#1c2438;border-color:#334063;}
.mm-page[data-theme=dark] .mm-tb-seg{background:#0f172a;border-color:#334063;}
.mm-page[data-theme=dark] .mm-tb-btn{background:#1c2438;border-color:#334063;color:#cbd5e1;}
.mm-page[data-theme=dark] .mm-tb-btn:hover{background:#334063;}
.mm-page[data-theme=dark] .mm-tb-lbl,.mm-page[data-theme=dark] .mm-tb-color,.mm-page[data-theme=dark] .mm-tb-size{color:#94a3b8;}
.mm-page[data-theme=dark] .mm-tb-sel{background:#0f172a;border-color:#334063;color:#cbd5e1;}
.mm-page[data-theme=dark] .mm-sub,.mm-page[data-theme=dark] .mm-desc{color:#94a3b8;}
.mm-page[data-theme=dark] .mm-hd h2{color:#e8eef8;}
.mm-page[data-theme=dark] .mm-desc{background:#1c2438;color:#cbd5e1;}
.mm-page[data-theme=dark] .mm-hint{background:#2c2c1a;color:#e8d490;border-color:#e8a23a;}
/* 项目组卡片上的思维导图 section:跟画板一样横向排列 */
.pj-mmaps{display:flex;flex-direction:column;gap:8px;padding:8px 10px;border-top:1px dashed #e1e8f3;background:#f9fbff;}
.pj-mmaps-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;}
.pj-mmap-cell{position:relative;display:flex;flex-direction:column;padding:8px 10px;border-radius:8px;background:#fff;border:1px solid #e1e8f3;transition:.15s;color:inherit;text-decoration:none;}
.pj-mmap-cell:hover{border-color:#7ea2ec;box-shadow:0 2px 6px rgba(59,110,224,.1);}
.pj-mmap-cell .pj-mmap-icon{font-size:18px;color:#22a06b;margin-bottom:2px;}
.pj-mmap-cell .pj-mmap-nm{font-size:13px;color:var(--blue-d);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-mmap-cell .pj-mmap-rt{font-size:11px;color:#7ea2ec;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-mmap-cell .pj-mmap-ct{font-size:10.5px;color:var(--mut);background:#eef2f9;padding:1px 5px;border-radius:8px;align-self:flex-start;margin-top:4px;}
.pj-gnone-sm{font-size:12px;color:#94a3b8;padding:8px 4px;}
@media(max-width:740px){
  .mm-tbar{gap:4px;}
  .mm-tb-seg{padding:3px 6px;}
  .mm-canvas-wrap{padding:8px;}
  .pj-mmaps-grid{grid-template-columns:repeat(auto-fill,minmax(110px,1fr));}
}

/* ====================== 独立视频播放页(/v/:upload_id)样式 ====================== */
.vp-page{display:flex;flex-direction:column;gap:14px;padding:14px 16px 18px;max-width:1200px;margin:0 auto;}
.vp-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.vp-back{padding:4px 12px;border-radius:6px;background:#eef2f9;color:var(--blue-d);font-size:13px;text-decoration:none;transition:.15s;}
.vp-back:hover{background:#dde6f4;}
.vp-title{font-size:18px;font-weight:600;color:#1f2933;}
.vp-meta{font-size:12px;color:#7a8a9b;}

/* 播放器主舞台 */
.vp-stage{position:relative;width:100%;background:#000;border-radius:12px;overflow:hidden;aspect-ratio:16/9;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 24px rgba(0,0,0,0.18);}
.vp-stage video{width:100%;height:100%;display:block;background:#000;object-fit:contain;}
/* 点击中心区切换播放:加 cursor + 显式隐式 hint */
.vp-stage{cursor:pointer;}

/* 控制条:绝对定位覆盖在视频底部 */
.vp-ctrls{position:absolute;left:0;right:0;bottom:0;padding:0 14px 8px;background:linear-gradient(to top,rgba(0,0,0,.78) 0%,rgba(0,0,0,0) 100%);color:#fff;display:flex;flex-direction:column;gap:6px;transition:opacity .25s ease;z-index:5;cursor:default;}
.vp-ctrl-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.vp-ctrl-top{padding-top:18px;}
.vp-ctrl-bot{padding-bottom:4px;}

/* 按钮 */
.vp-btn{min-width:34px;height:34px;padding:0 8px;border:none;background:transparent;color:inherit;font-size:15px;cursor:pointer;border-radius:6px;transition:.12s;display:inline-flex;align-items:center;justify-content:center;line-height:1;}
.vp-btn:hover{background:rgba(255,255,255,0.13);}
.vp-btn:active{background:rgba(255,255,255,0.22);}
.vp-btn[disabled]{opacity:.4;cursor:not-allowed;}
.vp-btn-lg{font-size:20px;background:rgba(255,255,255,0.16);}
.vp-btn-lg:hover{background:rgba(255,255,255,0.28);}

/* 时间码 */
.vp-time{font-size:12.5px;font-variant-numeric:tabular-nums;font-feature-settings:'tnum';min-width:96px;}

/* 间隔 */
.vp-spacer{flex:1 1 auto;}

/* 音量条:很细 */
.vp-vol{appearance:none;-webkit-appearance:none;width:90px;height:4px;border-radius:3px;background:rgba(255,255,255,0.3);cursor:pointer;outline:none;}
.vp-vol::-webkit-slider-thumb{appearance:none;-webkit-appearance:none;width:13px;height:13px;border-radius:50%;background:#fff;cursor:pointer;border:none;}
.vp-vol::-moz-range-thumb{width:13px;height:13px;border-radius:50%;background:#fff;cursor:pointer;border:none;}

/* 进度条 */
.vp-progress{position:relative;flex:1 1 100%;height:18px;cursor:pointer;display:flex;align-items:center;}
.vp-progress::before{content:'';position:absolute;left:0;right:0;top:7px;height:4px;background:rgba(255,255,255,0.22);border-radius:2px;}
.vp-progress-buffered{position:absolute;left:0;top:7px;height:4px;background:rgba(255,255,255,0.34);border-radius:2px;width:0;pointer-events:none;}
.vp-progress-played{position:absolute;left:0;top:7px;height:4px;background:linear-gradient(to right,#5fa8ff,#3b6ee0);border-radius:2px;width:0;pointer-events:none;}
.vp-progress-thumb{position:absolute;top:3px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 0 4px rgba(0,0,0,0.4);transform:translateX(-50%);left:0;pointer-events:none;display:none;}
.vp-progress:hover .vp-progress-thumb{display:block;}
.vp-progress:hover::before{top:6px;height:6px;}

/* 底部 */
.vp-foot{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
.vp-foot-left,.vp-foot-right{background:#fff;border:1px solid #e1e8f3;border-radius:10px;padding:12px 14px;}
.vp-foot-lbl{font-size:13px;color:#475569;font-weight:600;margin-bottom:8px;}

/* 播放列表 */
.vp-playlist{display:flex;flex-direction:column;max-height:300px;overflow-y:auto;gap:4px;}
.vp-pl-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:8px;text-decoration:none;color:#475569;transition:.12s;font-size:13px;}
.vp-pl-item:hover{background:#eef2f9;color:var(--blue-d);}
.vp-pl-item.on{background:linear-gradient(to right,#e8f0ff,#dde6f4);color:var(--blue-d);font-weight:600;}
.vp-pl-i{font-size:11px;width:14px;text-align:center;}
.vp-pl-n{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.vp-pl-empty{font-size:12.5px;color:#94a3b8;text-align:center;padding:18px 0;}

/* 投屏说明 */
.vp-cast-info{font-size:12.5px;color:#475569;line-height:1.95;}
.vp-cast-info b{color:#1f2933;}
.vp-cast-info code{background:#eef2f9;color:#1f2933;padding:1px 6px;border-radius:4px;font-size:11.5px;word-break:break-all;}
.vp-host-box{margin-top:8px;padding:8px 10px;background:#f5f8fd;border-radius:8px;border:1px dashed #c8d2e8;}

/* ====================== 通用媒体 lightbox(图片/视频) ====================== */
.mlb-mask{position:fixed;inset:0;background:rgba(8,12,28,0.93);display:flex;align-items:center;justify-content:center;flex-direction:column;padding:0;z-index:9999;opacity:0;transition:opacity .2s ease;}
.mlb-mask.open{opacity:1;}
.mlb-stage{position:relative;max-width:96vw;max-height:88vh;display:flex;align-items:center;justify-content:center;}
.mlb-img{max-width:96vw;max-height:88vh;object-fit:contain;border-radius:6px;box-shadow:0 12px 36px rgba(0,0,0,0.5);}
.mlb-vp{display:flex;flex-direction:column;align-items:stretch;gap:8px;max-width:96vw;max-height:88vh;}
.mlb-vp video{max-width:96vw;max-height:78vh;border-radius:6px;background:#000;}
.mlb-v-hint{font-size:12px;color:#cbd5e1;background:rgba(0,0,0,0.5);padding:6px 12px;border-radius:6px;line-height:1.7;text-align:center;}
.mlb-v-hint a{color:#7cc6ff;text-decoration:underline;}
.mlb-v-hint kbd{background:rgba(255,255,255,0.16);padding:0 5px;border-radius:3px;font-family:inherit;font-size:11px;}
/* —— 图片查看器(用户主页点开放大):外框跟着图片一起缩放 ——
 * 需求(2026-09-11):放大图片不要带黑色背景框 → 遮罩改为全透明(页面保持原样),
 *          图片靠大阴影和页面区分;stage/img 不再垫黑底(避免黑边/黑框)。
 * 设计要点:scale 通过 stage 实际 width/height 实现(非 transform),
 *          这样 stage 的 DOM 尺寸会跟着图片变化,而非图片溢出被裁剪。
 *          stage 受 max-width:96vw/max-height:92vh 兜底,不会超出屏幕。
 *          transition 让尺寸变化有平滑反馈 */
.img-viewer-mask{position:fixed;inset:0;background:transparent;display:flex;align-items:center;
  justify-content:center;z-index:9999;opacity:0;transition:opacity .2s ease;}
.img-viewer-mask.open{opacity:1;}
.img-viewer-stage{position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;
  border-radius:14px;background:transparent;box-shadow:0 18px 64px rgba(0,0,0,0.55);
  /* JS 加载完成前的占位尺寸;onload 后由 JS 按图片比例重算 */
  width:50vw;height:50vh;
  /* 防止外框超出屏幕 */
  max-width:96vw;max-height:92vh;
  /* 平滑过渡:让外框跟着图片变化时有视觉反馈,而不是瞬变 */
  transition:width .22s ease,height .22s ease;}
@media (max-width:720px){
  .img-viewer-stage{width:96vw;height:42vh;max-width:96vw;max-height:42vh;}
}
.img-viewer-img{display:block;width:100%;height:100%;max-width:100%;max-height:100%;
  object-fit:contain;border-radius:8px;cursor:grab;
  /* 仅保留 translate(拖动用),不再需要 scale,scale 已交给外框尺寸实现 */
  transition:transform .15s ease;user-select:none;-webkit-user-select:none;background:transparent;}
.img-viewer-img.dragging{cursor:grabbing;transition:none;}
.img-viewer-x{position:fixed;top:14px;right:18px;width:38px;height:38px;background:rgba(0,0,0,0.6);
  color:#fff;border:1px solid rgba(255,255,255,0.18);border-radius:50%;font-size:18px;cursor:pointer;
  line-height:38px;text-align:center;transition:.15s;z-index:11;}
.img-viewer-x:hover{background:rgba(255,255,255,0.2);}
.img-viewer-cap{position:fixed;left:50%;transform:translateX(-50%);bottom:14px;max-width:90vw;
  text-align:center;font-size:13px;color:#3a4a66;background:rgba(255,255,255,.94);
  border:1px solid var(--line);padding:6px 16px;border-radius:20px;z-index:11;pointer-events:none;
  box-shadow:0 4px 14px rgba(0,0,0,.14);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.img-viewer-tip{position:fixed;left:14px;bottom:14px;font-size:12px;color:#5a6b85;
  background:rgba(255,255,255,.94);border:1px solid var(--line);padding:5px 11px;border-radius:6px;
  z-index:11;pointer-events:none;line-height:1.6;box-shadow:0 4px 14px rgba(0,0,0,.12);}
.img-viewer-tip kbd{background:#eef2f9;color:#3a4a66;padding:0 5px;border-radius:3px;font-family:inherit;font-size:11px;}
/* ---- 图片查看器顶部工具栏:两种缩放模式切换 ---- */
.img-viewer-toolbar{position:fixed;top:14px;left:50%;transform:translateX(-50%);
  display:flex;gap:6px;background:rgba(0,0,0,.55);border:1px solid rgba(255,255,255,.18);
  border-radius:24px;padding:5px 8px;z-index:11;backdrop-filter:blur(6px);
  -webkit-backdrop-filter:blur(6px);box-shadow:0 4px 16px rgba(0,0,0,.4);}
.img-viewer-mbtn{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;
  background:transparent;border:none;border-radius:18px;color:#cdd6e0;
  font-size:13px;font-family:inherit;cursor:pointer;transition:.15s;
  white-space:nowrap;user-select:none;-webkit-user-select:none;}
.img-viewer-mbtn:hover{background:rgba(255,255,255,.12);color:#fff;}
.img-viewer-mbtn.on{background:linear-gradient(135deg,#2f6fed,#5a8af3);color:#fff;
  box-shadow:0 2px 8px rgba(47,111,237,.5);}
.img-viewer-mbtn:active{transform:scale(.97);}
/* 工具栏中的图标(用 unicode 字符,避免依赖 emoji 字体) */
.img-viewer-mbtn .iv-ic{font-size:14px;line-height:1;opacity:.95;}
/* tip 区里的当前模式徽章 */
.img-viewer-tip .iv-mode-tag{display:inline-block;background:#2f6fed;
  border-radius:3px;padding:0 6px;margin:0 3px;font-size:11px;color:#fff;}
/* 整体放大模式下,鼠标不显示 grab(因为不再以鼠标位置为缩放原点) */
.img-viewer-img.mode-full{cursor:default;}
.mlb-x{position:fixed;top:14px;right:18px;width:38px;height:38px;background:rgba(0,0,0,0.6);color:#fff;border:1px solid rgba(255,255,255,0.18);border-radius:50%;font-size:18px;cursor:pointer;line-height:38px;text-align:center;transition:.15s;z-index:11;}
.mlb-x:hover{background:rgba(255,255,255,0.2);}
.mlb-cap{position:fixed;left:0;right:0;bottom:14px;text-align:center;font-size:13px;color:#cdd6e0;background:rgba(0,0,0,0.5);padding:6px 16px;z-index:11;}

/* ====================== 视频播放器响应式:桌面/平板/手机 ====================== */
/* 平板 */
@media (max-width: 1024px){
  .vp-foot{grid-template-columns:1fr;}
  .vp-page{padding:12px 12px 16px;}
  .vp-title{font-size:16px;}
}
/* 手机 */
@media (max-width: 740px){
  .vp-ctrl-row{gap:5px;}
  .vp-ctrl-top{padding-top:8px;flex-wrap:wrap;}
  .vp-btn{min-width:30px;height:30px;font-size:13px;}
  .vp-btn-lg{font-size:16px;}
  .vp-time{font-size:11px;min-width:76px;}
  .vp-vol{width:60px;}
  .vp-spacer{display:none;}      /* 手机上不需要 spacers */
  .vp-foot-lbl{font-size:12px;}
  .vp-pl-item{font-size:12px;padding:5px 8px;}
  /* 默认显示控制条 (不自动隐藏) */
  .vp-ctrls{opacity:1 !important;}
  .vp-cast-info{font-size:11.5px;}
}
/* 横屏小高度(很多电视/横屏手机浏览器) */
@media (max-height: 460px) and (orientation: landscape){
  .vp-page{padding:8px 10px;}
  .vp-foot{display:none;}        /* 极端低高度时底部信息省掉,把舞台撑大 */
  .vp-stage{aspect-ratio:16/9;border-radius:8px;}
}


/* ============================ 项目组文件树样式 ============================
 * 三级结构:项目组(.pj-gtree) → 分组(.pj-stree) → 文件(.pj-file)
 * 与原有 .pj-gcard/.pj-gnm/.pj-gtabs 等旧样式共存(老样式保留对向后兼容,新 UI 走 .pj-gtree/.pj-stree/.pj-file) */
.pj-h-tip{margin-left:6px;font-size:11px;color:#8b98ab;font-weight:normal;}
.pj-btns .btn.ghost{padding:3px 8px;font-size:11.5px;}
/* ---- 文件树整体(经典 Windows 资源管理器风格:白底 / 1px 边框 / 三角箭头 / 纯文字) ---- */
.pj-gtree,
.pj-stree{border:none;border-radius:0;margin:0;padding:0;background:transparent;box-shadow:none;}
.pj-gtree.on{border:none;box-shadow:none;background:transparent;}
.pj-gtree.drag-over{background:#eaf3ff;box-shadow:inset 0 0 0 1px var(--blue);}
/* 2026-09-12(项目组树与文件浏览树统一):图标/缩进/悬停/选中样式与 legend-tree 日期文件夹树一致;
 * 2026-09-12(补充):折叠开关由旋转三角箭头改为 +/− 小按钮(展开显示 −=点击收缩,折叠显示 +=点击展开) */
.pj-tree-arr{flex:none;display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;color:#5a6b85;text-decoration:none;cursor:pointer;background:#fff;border:1px solid #c3cfe3;border-radius:3px;padding:0;line-height:1;font-size:12px;font-weight:700;font-family:Consolas,'Courier New',monospace;user-select:none;box-sizing:border-box;transition:color .12s,border-color .12s,background .12s;}
.pj-tree-arr:hover{color:var(--blue);border-color:var(--blue);background:#eef4ff;}
.pj-tree-arr.empty{visibility:hidden;}
.pj-tree-ic{flex:none;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:#5a6b85;}
.pj-tree-ic svg{width:15px;height:15px;display:block;}
/* 行:项目组/分组(与文件浏览树一致:每行 = 箭头 + 文件夹图标 + 名称) */
.pj-gtree-row,
.pj-stree-row{display:flex;align-items:center;gap:4px;padding:3px 6px;font-size:12.5px;line-height:20px;color:#222;background:transparent;border:none;border-radius:5px;white-space:nowrap;cursor:default;user-select:none;}
.pj-gtree-row:hover,
.pj-stree-row:hover{background:#eaf0fa;}
.pj-gtree-row.on,
.pj-stree-row.on,
.pj-gtree.on > .pj-gtree-row,
.pj-stree.on > .pj-stree-row{background:#d7e5ff;box-shadow:inset 2px 0 0 #2f6fed;color:#222;}
.pj-gtree-row.on .pj-tree-arr,
.pj-stree-row.on .pj-tree-arr,
.pj-gtree-row.on .pj-tree-ic,
.pj-stree-row.on .pj-tree-ic{color:#5b7bc0;}
.pj-tree-name{flex:1;min-width:0;font-weight:400;font-size:12.5px;color:inherit;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:default;background:transparent;border:none;padding:0 2px;}
.pj-tree-name:hover{color:inherit;text-decoration:none;}
/* 操作按钮区(默认隐藏,鼠标悬停项目组/分组时浮现;避免左侧密密麻麻) */
.pj-tree-ops{flex:none;display:none;gap:0;align-items:center;}
.pj-gtree-row:hover .pj-tree-ops,.pj-stree-row:hover .pj-tree-ops{display:flex;}
.pj-gtree-row.on .pj-tree-ops,.pj-stree-row.on .pj-tree-ops{display:flex;}
.pj-op{background:transparent;border:none;color:#666;cursor:pointer;padding:0 4px;border-radius:0;font-size:11px;line-height:18px;transition:background .12s;}
.pj-op:hover{background:rgba(0,0,0,.08);color:#111;}
/* 分组和文件区:每级缩进 13px(与文件浏览树一致) */
.pj-gtree-body{padding:0 0 0 13px;background:transparent;border:none;}
.pj-stree-body{padding:0 0 0 13px;display:flex;flex-direction:column;gap:0;background:transparent;}
/* 文件节点(悬停/选中同样对齐文件浏览树) */
.pj-file{display:flex;align-items:center;gap:4px;padding:3px 6px;font-size:12.5px;line-height:20px;color:#222;text-decoration:none;border:none;border-radius:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:default;background:transparent;}
.pj-file:hover{background:#eaf0fa;color:#222;}
.pj-file.on{background:#d7e5ff;color:#222;font-weight:400;box-shadow:inset 2px 0 0 #2f6fed;}
.pj-file-ic{flex:none;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;color:#5a6b85;font-family:'Segoe UI Symbol','Lucida Sans Unicode',sans-serif;}
.pj-file.on .pj-file-ic{color:#5a6b85;}
.pj-file-thumb{display:none;}             /* 资源管理器风格不显示缩略图,只显示纯文字图标 */
.pj-file-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;}
/* 空分组提示 */
.pj-snone{padding:2px 6px 2px 33px;font-size:11.5px;color:#999;font-style:italic;line-height:20px;}
/* 未分组虚拟分组 */
.pj-stree-un .pj-tree-name{color:#666;font-weight:400;font-style:italic;}
/* ---- 移动选择器里的分组层级展示(独立) ---- */
.pj-mv-grp-h{padding:6px 12px 4px 8px;font-size:12px;color:#5a6b85;font-weight:600;background:#f4f7fd;border-radius:6px;margin:6px 0 2px;}
.pj-mv-grp-h:first-child{margin-top:2px;}
.pj-mv-item.pj-mv-sub{padding-left:18px;}
.pj-mv-item.pj-mv-sub .pj-mv-ic{font-size:11px;}

/* ==== 侧栏「资源管理器风格」文件树(2026-09-09) ====
 * 复用 .pj-gtree / .pj-stree / .pj-file / .pj-tree-arr 等现成样式(继承 1014-1062 行),
 * 这里只加侧栏特有的两点:1) 紧凑尺寸适配侧栏宽度 2) 默认折叠态 JS 可控。 */
.pj-side-tree{padding:0 4px 4px 0;}
.pj-side-tree .pj-tree-name{font-size:12px;}
.pj-side-tree .pj-file{font-size:12px;padding:2px 6px;}
/* JS 加 .collapsed 时隐藏 body(默认全展开);箭头用 .open 类旋转(SVG 箭头,与文件浏览树一致) */
.pj-gtree.collapsed > .pj-gtree-body{display:none;}
.pj-stree.collapsed > .pj-stree-body{display:none;}
/* 侧栏文件树永远不显示操作按钮(侧栏是导航,不在侧栏上建分组/表/文档 — 那些操作集中在 /projects 页) */
.pj-side-tree .pj-tree-ops{display:none !important;}

/* ---------- 管理后台:用户「📊 统计」展开行(2026-09-12) ---------- */
.usr-stat-row > td{background:#f8fafc;border-top:1px dashed #dfe6ee;padding:10px 14px;}
.us-grid{display:flex;flex-wrap:wrap;gap:8px;}
.us-it{background:#fff;border:1px solid #e3e9f1;border-radius:8px;padding:6px 12px;min-width:150px;}
.us-it b{display:block;font-size:12px;color:#5b6b80;margin-bottom:2px;font-weight:600;}
.us-it span{font-size:13px;color:#1f2937;}
.us-total{border-color:#bcd4f6;background:#f2f7ff;}

/* ==================== 2026-09-12:论坛式回复弹窗(帖子/时光通用) ==================== */
.rp-dlg{width:min(620px,94vw);display:flex;flex-direction:column;max-height:min(78vh,680px);}
.rp-body{overflow-y:auto;min-height:120px;padding:0 18px 10px;}
.rp-target{background:#f4f8ff;border:1px solid #dfe9f8;border-radius:10px;padding:10px 12px;margin-bottom:12px;}
.rp-target.rp-loading{color:#7b8aa0;text-align:center;padding:18px 12px;}
.rp-tgt-meta{font-size:12px;color:#6b7a90;margin-bottom:6px;}
.rp-tgt-meta b{color:#1f2937;font-size:13px;}
.rp-tgt-content{font-size:13.5px;line-height:1.65;color:#1f2937;word-break:break-word;}
.rp-tgt-content .code-wrap{margin:6px 0;}
.rp-tgt-media{margin-top:8px;font-size:12px;color:#8a97a9;}
.rp-tgt-err{color:#c0392b;font-size:13px;}
.rp-mute{color:#9aa7b8;font-size:12.5px;}
.rp-list{display:flex;flex-direction:column;gap:8px;}
.rp-none{color:#9aa7b8;font-size:12.5px;text-align:center;padding:14px 0;}
.rp-item{display:flex;gap:10px;background:#fff;border:1px solid #e7edf5;border-radius:10px;padding:9px 12px;}
.rp-ava{flex:none;width:32px;height:32px;border-radius:50%;background:#dbe6f5;color:#4a6b85;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;overflow:hidden;}
.rp-ava.ph{color:#5a6b85;}
.rp-ava img{width:100%;height:100%;object-fit:cover;}
.rp-item-main{flex:1;min-width:0;}
.rp-item-meta{display:flex;gap:8px;align-items:baseline;font-size:12px;color:#8a97a9;margin-bottom:3px;}
.rp-item-meta b{color:#2b3a4e;font-size:12.5px;}
.rp-item-txt{font-size:13.5px;line-height:1.6;color:#1f2937;word-break:break-word;white-space:pre-wrap;}
.rp-foot{border-top:1px solid #e7edf5;padding:10px 18px 14px;}
.rp-ta{width:100%;resize:vertical;min-height:64px;font-size:13.5px;}
.rp-foot-bar{display:flex;align-items:center;gap:10px;margin-top:8px;}
.rp-err{flex:1;color:#c0392b;font-size:12.5px;font-weight:600;}
.rp-err:empty{display:none;}
.rp-hint{flex:1;text-align:right;color:#9aa7b8;font-size:11.5px;}

/* ============================ 分组「＋新建 / ⬆导入」浮动菜单(2026-09-12) ============================ */
.pj-fmenu{position:fixed;z-index:9999;min-width:230px;max-width:320px;background:#1e293b;border:1px solid #334155;border-radius:10px;box-shadow:0 12px 32px rgba(0,0,0,.45);padding:6px;animation:pjFmenuIn .12s ease-out;}
@keyframes pjFmenuIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.pj-fmenu-hint{font-size:10.5px;color:#8fa3bf;padding:2px 8px 6px;border-bottom:1px solid #334155;margin-bottom:4px;user-select:none;}
.pj-fmenu-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:transparent;border:0;border-radius:7px;padding:7px 8px;cursor:pointer;color:#e2e8f0;font-size:13px;font-family:inherit;}
.pj-fmenu-item .pj-fmenu-ic{width:20px;text-align:center;flex:none;}
.pj-fmenu-item .pj-fmenu-tx{display:flex;flex-direction:column;line-height:1.25;}
.pj-fmenu-item .pj-fmenu-tx em{font-style:normal;font-size:10.5px;color:#94a3b8;}
.pj-fmenu-item.on,.pj-fmenu-item:hover{background:#3b82f6;color:#fff;}
.pj-fmenu-item.on .pj-fmenu-tx em,.pj-fmenu-item:hover .pj-fmenu-tx em{color:rgba(255,255,255,.85);}

/* ==================== 2026-09-12:卡片下方内嵌最新回复(最多3条,更多折叠) ==================== */
.rp-inline{margin:8px 0 4px;padding:7px 12px;background:#f7fafd;border:1px solid #e7eef7;border-radius:9px;}
.p-card .rp-inline{margin:10px 0 2px;}
.rp-line{display:flex;gap:6px;align-items:baseline;line-height:1.75;min-width:0;font-size:12.8px;}
.rp-line-a{flex:none;color:#4a6b85;font-weight:600;}
.rp-line-t{flex:1;min-width:0;color:#4a5568;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rp-more{display:block;margin:4px 0 1px;background:none;border:none;padding:2px 0;color:#3a6ea5;font-size:12.5px;cursor:pointer;font-weight:600;font-family:inherit;}
.rp-more:hover{text-decoration:underline;}
.m-card .rp-inline{margin:8px 0 0;}

/* ==================== 2026-09-12:顶栏✉回复提示 + 主页帖子/时光分类 + 未读标绿 ==================== */
.rp-badge{display:inline-flex;align-items:center;gap:3px;margin-left:6px;padding:2px 9px;border-radius:999px;background:#e8f6ee;border:1px solid #b7e2c6;color:#1a7f37;font-size:12px;font-weight:600;text-decoration:none;line-height:1.5;}
.rp-badge:hover{background:#d6efdf;}
.rp-badge[hidden]{display:none;}
.rp-badge b{font-size:12.5px;}
.u-tabs{display:flex;align-items:center;gap:8px;margin-bottom:14px;flex-wrap:wrap;}
.u-tab{border:1px solid #d7e1ee;background:#f6f9fc;border-radius:999px;padding:6px 18px;font-size:13px;font-weight:600;color:#4a5b70;cursor:pointer;font-family:inherit;}
.u-tab:hover{background:#eef4fb;}
.u-tab.on{background:#2f6fb3;border-color:#2f6fb3;color:#fff;}
.u-tab .u-tab-n{display:inline-block;min-width:18px;padding:0 5px;border-radius:999px;background:#e5484d;color:#fff;font-size:11.5px;text-align:center;}
.u-tab.on .u-tab-n{background:#fff;color:#c92f34;}
.u-tabs-hint{font-size:11.5px;color:#9aa7b8;}
.u-pane.hide{display:none;}
/* 有新回复的卡片:置顶由服务端排序完成;标题/作者行标绿,左侧绿条,看完回复(打开回复列表)后前端摘掉 has-unread */
.p-card.has-unread,.m-card.has-unread{border-left:3px solid #2eaf64;}
.p-title{font-size:13.5px;font-weight:600;color:#2b3a4e;margin-bottom:5px;word-break:break-word;}
.p-card.has-unread .p-title{color:#1a7f37;}
.m-card.has-unread .m-who,.m-card.has-unread .m-who .who-link{color:#1a7f37;}

/* ==================== 2026-09-12:指定用户回复(@提及) + 全站 Ctrl+Enter 快捷键提示 ==================== */
/* 快捷键说明小字 */
.kb-hint{color:#8a97a8;font-size:12px;margin-right:8px;}
.edit-hint{margin-left:10px;color:#8a97a8;font-size:12px;}
/* 回复内容中的 @某人 提及(抖音式定向回复) */
.rp-mention{color:#2f6fb3;font-weight:600;}
.rp-line .rp-mention{font-weight:600;}
/* 回复弹窗:每条回复的「回复」小按钮(点击=指定该用户回复) */
.rp-reply-to{align-self:flex-start;margin-top:3px;background:none;border:none;padding:0;color:#3a6ea5;font-size:12px;font-weight:600;cursor:pointer;font-family:inherit;}
.rp-reply-to:hover{text-decoration:underline;}
/* 输入框上方「回复 @某人」标签 */
.rp-to{display:flex;align-items:center;gap:6px;margin-bottom:5px;}
.rp-to[hidden]{display:none;}
.rp-to-txt{background:#e8f1fb;border:1px solid #c6dcf2;color:#2f6fb3;border-radius:999px;padding:2px 10px;font-size:12.5px;font-weight:600;}
.rp-to-x{background:none;border:none;color:#7d8da0;font-size:15px;line-height:1;cursor:pointer;padding:2px 4px;}
.rp-to-x:hover{color:#c92f34;}

/* ==================== 2026-09-12:项目组/分组页面(创建与导入集中于此) ==================== */
.pj-pane{padding:6px 2px;}
.pj-pane-head{display:flex;align-items:center;gap:8px;margin-bottom:14px;flex-wrap:wrap;}
.pj-pane-crumb{color:#3a6ea5;font-weight:600;text-decoration:none;font-size:14px;}
.pj-pane-crumb:hover{text-decoration:underline;}
.pj-pane-sep{color:#9aa7b8;}
.pj-pane-title{font-size:17px;font-weight:700;color:#2b3a4e;}
.pj-pane-sub{color:#9aa7b8;font-size:12.5px;}
.pj-pane-sec{margin-bottom:16px;}
.pj-pane-sec-t{font-size:13px;font-weight:700;color:#4a5b70;margin-bottom:8px;}
.pj-pane-btns{display:flex;flex-wrap:wrap;gap:8px;}
.pj-pane-btn{font-size:13px;padding:7px 14px;}
.pj-pane-files{display:flex;flex-direction:column;gap:2px;}
.pj-pane-file{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:8px;text-decoration:none;color:#2b3a4e;font-size:13.5px;}
.pj-pane-file:hover{background:#f0f6fc;}
.pj-pane-file .pj-file-ic{width:18px;text-align:center;}
.pj-pane-file .pj-file-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-pane-file.is-sub{font-weight:600;}
/* 键盘导航选中项(2026-09-13):↑↓ 选择、Enter 打开、Delete 删除 */
.pj-pane-file.pj-kb-sel{background:#e3f0fb;outline:2px solid #4a9eff;outline-offset:-2px;}
.pj-pane-cnt{color:#9aa7b8;font-size:12px;flex:none;}
.pj-pane-none{color:#9aa7b8;font-size:13px;padding:6px 2px;}
.pj-pane-tip{color:#9aa7b8;font-size:12.5px;margin-top:10px;border-top:1px dashed #e7eef7;padding-top:10px;}

/* ================= 2026-09-13 表格 Excel 功能区(插入/公式/数据/审阅/视图/工具/安全) ================= */
/* 菜单栏 */
.pj-ribbon{display:flex;gap:2px;align-items:center;padding:4px 0 2px;border-bottom:1px solid #e1e1e1;flex-wrap:wrap;position:relative;}
.pj-rmenu{position:relative;}
.pj-rbtn{border:1px solid transparent;background:none;cursor:pointer;font-size:12.5px;padding:4px 9px;border-radius:5px;color:#22303f;}
.pj-rbtn:hover{background:#eef3f0;border-color:#d7e2dc;}
.pj-rmenu.open .pj-rbtn{background:#e2ede7;border-color:#bfd4c9;}
.pj-rdrop{display:none;position:absolute;top:100%;left:0;z-index:60;background:#fff;border:1px solid #d0d7de;border-radius:7px;box-shadow:0 8px 24px rgba(0,0,0,.16);padding:4px;min-width:210px;}
.pj-rmenu.open .pj-rdrop{display:block;}
.pj-ritem{display:block;width:100%;text-align:left;padding:6px 12px;border:none;background:none;cursor:pointer;font-size:12.5px;white-space:nowrap;border-radius:4px;color:#22303f;}
.pj-ritem:hover{background:#eef3f0;}
.pj-rsep{height:1px;background:#e5e7eb;margin:4px 6px;}
.pj-rlock{margin-left:6px;}
/* 缩放:行高/表头高/字号 走 CSS 变量(applyZoomVars 写入) */
.pj-row{height:var(--rh,31px);}
.g-row{height:var(--rh,31px);}
.g-cellbox{height:var(--rh,31px);}
.g-corner{height:var(--chh,30px);}
.g-col{height:var(--chh,30px);}
.g-cell{font-size:var(--pjfs,12.5px);}
/* 冻结首列:A 列与行号在横向滚动时钉住;底色走 --frzbg(默认浅红,可用格式工具栏「冻结色」换色) */
.g-cellbox.g-frz{position:sticky;left:40px;z-index:2;background:var(--frzbg,#fdf1ee);box-shadow:inset -1px 0 0 #d9d9d9;}
/* 冻结窗格(视图菜单 2026-09-13):前 N 行的 sticky 容器,钉在表头(+1px 边线)下方;
 * 冻结列格子用 inline style(left=行号40px+列宽×(c-1))钉在行号右侧,这里只出兜底样式;底色同上 */
.pj-frzbody{position:sticky;top:calc(var(--chh,30px) + 1px);z-index:4;background:var(--frzbg,#fdf1ee);}
/* 阅读模式(聚光灯):当前格整行+整列的十字高亮条,盖在格子上方、不挡点击 */
/* 聚光灯条颜色走 CSS 变量(--readbg 条底/--readbd 条边,格式工具栏「聚光灯色」写入 .pj-grid 行内变量;空=默认绿 2026-09-17) */
.pj-read-bar{position:absolute;pointer-events:none;z-index:4;background:var(--readbg,rgba(33,115,70,.13));
  box-shadow:inset 0 0 0 1px var(--readbd,rgba(33,115,70,.28));}
/* 护眼模式(视图菜单):浅绿底色 */
.pj-grid.eye .g-cellbox{background:#eaf3df;}
.pj-grid.eye .g-cellbox.sel{background:#dcEBc8;}
.pj-grid.eye .g-cellbox.act{background:#eaf3df;}
.pj-grid.eye .pj-chead,.pj-grid.eye .g-corner,.pj-grid.eye .g-row{background:#dfecd0;}
.pj-grid.eye .g-frz{background:var(--frzbg-ey,#eaf3df);}
/* 行号列标隐藏(视图菜单):行号列与表头整体收起;冻结行容器吸附到顶部 */
.pj-grid.no-hdr .pj-chead{display:none;}
.pj-grid.no-hdr .g-row{display:none;}
.pj-grid.no-hdr .pj-frzbody{top:0;}
.g-cellbox.g-frz.sel{background:#e9f1ec;}
/* 网格线开关 */
.pj-grid.no-grid .g-cellbox{border-color:transparent !important;}
.pj-grid.no-grid .pj-body{background-image:none !important;}
/* 批注角标(右上红三角)+ 超链接样式 + 筛选列头标记 */
.g-cellbox{position:relative;}
.g-cellbox.cmt::after{content:'';position:absolute;right:0;top:0;width:0;height:0;border-style:solid;border-width:0 8px 8px 0;border-color:transparent #d93025 transparent transparent;z-index:3;pointer-events:none;}
.g-cellbox.linky .g-cell{color:#1155cc;text-decoration:underline;}
.g-col.filter{color:#1565c0;box-shadow:inset 0 -3px 0 #1565c0;}
/* 保护态格子 */
.g-cell[readonly]{cursor:not-allowed;background:#fafafa;}

/* ============ 2026-09-13 填充柄下拉(仿 Excel fill handle) ============ */
/* 选区右下角小绿块 */
.g-fillh{position:absolute;width:8px;height:8px;background:#217346;border:1px solid #fff;border-radius:1px;z-index:6;cursor:crosshair;box-shadow:0 0 0 1px rgba(33,115,70,.4);}
/* 拖动时的目标区虚线预览 */
.pj-fillprev{position:absolute;border:1.5px dashed #217346;background:rgba(33,115,70,.08);z-index:4;pointer-events:none;display:none;}
/* 拖动时的数值提示气泡(像 Excel 的 A5→5) */
.pj-filltip{position:absolute;z-index:7;display:none;background:#fffdf5;border:1px solid #d9c97a;color:#333;font-size:12px;padding:2px 8px;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.18);pointer-events:none;white-space:nowrap;}
/* 填充完成后的「自动填充选项」按钮 + 菜单 */
.pj-fillopt{position:absolute;z-index:7;width:16px;height:16px;background:#fff;border:1px solid #8fa39a;border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:11px;cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.22);color:#217346;font-weight:bold;line-height:1;}
.pj-fillopt:hover{background:#eef3f0;}
.pj-fillopt-menu{position:fixed;z-index:1200;background:#fff;border:1px solid #d0d7de;border-radius:7px;box-shadow:0 8px 24px rgba(0,0,0,.16);padding:4px;min-width:180px;}
/* —— 冻结窗格聚光灯(2026-09-13):被冻结的行/列铺底色,一眼看出哪些行列被钉住(柔和不刺眼) ——
 * 颜色走 CSS 变量(格式工具栏「冻结色」选色 → app.js 写到 .pj-grid 的行内变量):
 * --frzbg=冻结格底色  --frzhdr=行号/列头(略深一档,app.js 自动由 frzbg 算出);
 * 未自定义时回落默认浅红;变量名带 -ey 的是护眼模式回落浅绿用的同一变量(自定义色时与普通模式同色)。
 * 优先级说明:写在文件末尾压过同权重的 .g-cellbox/.g-row 默认底色,但用 :not() 给
 * 选中(.sel/.hl)、活动(.act)、悬停、图片格让路;护眼模式(.eye)单独回落绿色。 */
.pj-frzbody .g-cellbox{background:var(--frzbg,#fdf1ee);}
.pj-frzbody .g-cellbox.sel{background:#e9f1ec;}
.pj-frzbody .g-cellbox.img{background:#e9f1ff;}
.pj-frzbody .g-cellbox.img.sel{background:#cfe2ff;}
.pj-frzbody .g-row:not(.act):not(.hl):not(:hover){background:var(--frzhdr,#f9e4e0);}
.g-col.g-frz:not(.hl):not(.act):not(:hover){background:var(--frzhdr,#f9e4e0);}
/* 护眼模式:未自定义时冻结区跟随浅绿,不掺红;选了「冻结色」则两种模式都用自定义色 */
.pj-grid.eye .pj-frzbody .g-cellbox{background:var(--frzbg-ey,#eaf3df);}
.pj-grid.eye .pj-frzbody .g-cellbox.sel{background:#dcEBc8;}
.pj-grid.eye .pj-frzbody .g-cellbox.img{background:var(--frzbg-ey,#eaf3df);}
.pj-grid.eye .pj-frzbody .g-row{background:var(--frzhdr-ey,#dfecd0);}
.pj-grid.eye .g-col.g-frz{background:var(--frzhdr-ey,#dfecd0);}

/* ============ 2026-09-14 右键菜单行列操作 + 列头筛选面板(仿 WPS) ============ */
/* 列头 ▾ 筛选箭头:筛选模式开启后每列右下角出现,点了弹筛选面板 */
.g-col{position:relative;}
.g-colname{pointer-events:none;}
.g-fbtn{position:absolute;right:1px;bottom:1px;width:20px;height:24px;line-height:22px;padding:0;
  border:1px solid #c9c9c9;border-radius:4px;background:#fff;color:#5f6368;font-size:14px;font-weight:700; /* :11px→14px,框随大 */
  cursor:pointer;text-align:center;box-sizing:border-box;}
.g-fbtn:hover{background:#e8f0fe;color:#1565c0;border-color:#1565c0;}
.g-fbtn.on{background:#e8f0fe;color:#1565c0;border-color:#1565c0;}
/* 筛选面板:绝对定位弹层(内容筛选/数字筛选/字符串筛选 三个 tab) */
.pj-fpanel{position:fixed;z-index:1250;width:270px;background:#fff;border:1px solid var(--line,#d9d9d9);
  border-radius:10px;box-shadow:0 10px 32px rgba(0,0,0,.16);font-size:12.5px;color:#1f2937;overflow:hidden;}
.pj-fp-tabs{display:flex;border-bottom:1px solid var(--line,#d9d9d9);background:#f7f7f7;}
.pj-fp-tabs button{flex:1;padding:7px 2px;border:none;background:transparent;cursor:pointer;font-size:12px;color:#5f6368;font-weight:600;}
.pj-fp-tabs button.on{background:#fff;color:#1565c0;box-shadow:inset 0 -2px 0 #1565c0;}
.pj-fp-body{padding:8px 10px 4px;}
.pj-fp-search input{width:100%;box-sizing:border-box;padding:5px 8px;border:1px solid #c9c9c9;border-radius:6px;font-size:12.5px;outline:none;}
.pj-fp-search input:focus{border-color:#1565c0;}
.pj-fp-all{display:flex;align-items:center;gap:6px;padding:6px 2px;font-weight:600;color:#374151;cursor:pointer;}
.pj-fp-list{max-height:210px;overflow:auto;border:1px solid #e5e7eb;border-radius:7px;margin-bottom:6px;}
.pj-fp-item{display:flex;align-items:center;gap:6px;padding:4px 8px;cursor:pointer;border-bottom:1px solid #f1f1f1;}
.pj-fp-item:last-child{border-bottom:none;}
.pj-fp-item:hover{background:#eef4ff;}
.pj-fp-item input{flex:none;}
.pj-fp-item .pj-fp-v{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pj-fp-item em{font-style:normal;color:#9ca3af;font-size:11px;}
.pj-fp-empty{padding:10px;color:#9ca3af;text-align:center;}
.pj-fp-topn{display:block;width:100%;margin:2px 0 6px;padding:5px;border:1px solid #d1d5db;border-radius:7px;
  background:#fafafa;cursor:pointer;font-size:12px;color:#374151;}
.pj-fp-topn:hover{background:#eef4ff;border-color:#1565c0;color:#1565c0;}
.pj-fp-cond{display:flex;flex-direction:column;gap:6px;padding:4px 0 8px;}
.pj-fp-cond label{font-size:11.5px;color:#6b7280;font-weight:600;}
.pj-fp-cond select,.pj-fp-cond input{width:100%;box-sizing:border-box;padding:5px 8px;border:1px solid #c9c9c9;border-radius:6px;font-size:12.5px;outline:none;}
.pj-fp-cond select:focus,.pj-fp-cond input:focus{border-color:#1565c0;}
.pj-fp-tip{color:#9ca3af;font-size:11.5px;padding:0 0 8px;}
.pj-fp-foot{display:flex;align-items:center;gap:5px;padding:7px 10px;border-top:1px solid var(--line,#d9d9d9);background:#f7f7f7;}
.pj-fp-foot button{padding:4px 9px;border:1px solid #d1d5db;border-radius:6px;background:#fff;cursor:pointer;font-size:12px;color:#374151;}
.pj-fp-foot button:hover{background:#eef4ff;border-color:#1565c0;color:#1565c0;}
.pj-fp-foot .pj-fp-ok{background:#1565c0;border-color:#1565c0;color:#fff;font-weight:700;}
.pj-fp-foot .pj-fp-ok:hover{background:#0d4fa0;}
.pj-fp-foot .pj-fp-gap{flex:1;}

/* ========== 表格格式工具栏扩容(2026-09-15ws11):U/S 按钮、字号/字体下拉、边框下拉菜单 ========== */
.pj-fbtn u{text-decoration:underline;}
.pj-fbtn s{text-decoration:line-through;}
.pj-bd-wrap{position:relative;display:inline-flex;}
.pj-bd-menu{display:none;position:absolute;top:calc(100% + 4px);left:0;z-index:1200;width:352px;
  background:#fff;border:1px solid #d5d5d5;border-radius:10px;box-shadow:0 12px 32px rgba(0,0,0,.18);padding:10px;}
.pj-bd-wrap.open .pj-bd-menu{display:block;}
.pj-bd-presets{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;margin-bottom:8px;}
.pj-bd-presets button{display:flex;flex-direction:column;align-items:center;gap:3px;padding:7px 2px 5px;
  border:1px solid transparent;border-radius:8px;background:none;cursor:pointer;font-size:11px;color:#33414f;line-height:1;}
.pj-bd-presets button:hover{background:#eef4f0;border-color:#bfd8ca;}
.pj-bd-presets button span{pointer-events:none;}
.pj-bd-row{display:flex;align-items:center;gap:6px;padding:6px 2px 0;border-top:1px dashed #e4e4e4;flex-wrap:wrap;}
.pj-bd-lbl{font-size:11.5px;color:#6b7280;font-weight:600;flex:none;}
.pj-bd-styles{display:flex;gap:3px;flex-wrap:wrap;}
.pj-bd-styles button{display:inline-flex;flex-direction:column;align-items:center;gap:2px;padding:4px 6px 3px;
  border:1px solid #e0e0e0;border-radius:6px;background:#fff;cursor:pointer;font-size:10.5px;color:#555;line-height:1;}
.pj-bd-styles button:hover{border-color:#9db8aa;background:#f2f7f4;}
.pj-bd-styles button.on{border-color:#217346;background:#e8f3ec;box-shadow:inset 0 0 0 1px #217346;}
.pj-bd-line{display:block;width:34px;height:0;}
.pj-bd-swatches{display:inline-flex;gap:3px;}
.pj-bd-swatches button{width:18px;height:18px;border:1px solid #c9c9c9;border-radius:4px;cursor:pointer;padding:0;}
.pj-bd-swatches button:hover{border-color:#555;}
.pj-bd-cur{margin-left:auto;font-size:11px;color:#8a94a3;}
#pjBdColor{width:26px;height:22px;padding:0;border:1px solid #c9c9c9;border-radius:4px;background:#fff;cursor:pointer;}

/* 字号手输入框(2026-09-15ws17):可下拉选也可直接键入,A⁺/A⁻ 步进按钮复用 .pj-fbtn */
.pj-fs-in{width:54px;text-align:center;}
.pj-fs-in::placeholder{color:#98a2b3;}

/* ====================== 思维导图 语雀式增强(2026-09-15) ====================== */
/* 画布容器成为浮动层的定位基准;平移中变抓手 */
.mm-canvas-wrap{position:relative;}
.mm-canvas-wrap.panning{cursor:grabbing;}
.mm-canvas-wrap.panning .mm-svg{cursor:grabbing;}
/* 节点「＋」把手:默认透明,悬停节点/把手时出现 */
.mm-hdl{opacity:0;cursor:pointer;transition:opacity .12s;}
.mm-hdl circle{fill:#2f7cf6;stroke:#fff;stroke-width:2;}
.mm-hdl text{fill:#fff;font-size:13px;pointer-events:none;user-select:none;}
.mm-node:hover .mm-hdl,.mm-hdl:hover{opacity:1;}
/* 右下角缩放条 */
.mm-zoombar{position:absolute;right:18px;bottom:14px;display:flex;gap:4px;align-items:center;background:#1f2937ee;border:1px solid #374151;border-radius:8px;padding:4px 6px;box-shadow:0 4px 14px rgba(0,0,0,.25);z-index:30;backdrop-filter:blur(4px);}
.mm-zb-btn{background:transparent;border:none;color:#e5e7eb;font-size:15px;width:28px;height:26px;border-radius:6px;cursor:pointer;font-family:inherit;line-height:1;}
.mm-zb-btn:hover{background:#374151;}
.mm-zb-pct{width:auto;min-width:46px;font-size:12px;color:#c7d2fe;}
/* 选中节点的浮动工具栏(语雀式黑胶囊) */
.mm-ftool{position:absolute;display:flex;gap:2px;align-items:center;background:#1f2937ee;border:1px solid #374151;border-radius:10px;padding:4px 6px;box-shadow:0 6px 18px rgba(0,0,0,.3);z-index:40;backdrop-filter:blur(4px);}
.mm-ft-btn{background:transparent;border:none;color:#e5e7eb;font-size:14px;min-width:30px;height:28px;border-radius:6px;cursor:pointer;font-family:inherit;padding:0 6px;line-height:1;}
.mm-ft-btn:hover{background:#374151;}
.mm-ft-btn.danger{color:#fca5a5;}
.mm-ft-btn.danger:hover{background:#7f1d1d55;}
/* 色板弹层 */
.mm-pal{position:absolute;background:#1f2937f2;border:1px solid #374151;border-radius:10px;padding:10px;z-index:50;box-shadow:0 8px 22px rgba(0,0,0,.35);width:180px;backdrop-filter:blur(4px);}
.mm-pal-lab{font-size:11.5px;color:#9ca3af;margin-bottom:6px;}
.mm-pal-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;}
.mm-pal-c{width:26px;height:26px;border-radius:50%;border:2px solid #4b5563;cursor:pointer;padding:0;}
.mm-pal-c:hover{transform:scale(1.15);border-color:#fff;}
.mm-pal-row{display:flex;gap:8px;align-items:center;margin-top:8px;}
.mm-pal-custom{width:30px;height:26px;border:none;background:none;cursor:pointer;padding:0;}
.mm-pal-reset{flex:1;background:#374151;border:none;color:#e5e7eb;font-size:11.5px;border-radius:6px;padding:4px 8px;cursor:pointer;font-family:inherit;}
.mm-pal-reset:hover{background:#4b5563;}
/* 右键菜单 */
.mm-ctx{position:absolute;background:#1f2937f2;border:1px solid #374151;border-radius:10px;padding:5px;z-index:60;box-shadow:0 8px 22px rgba(0,0,0,.35);min-width:180px;backdrop-filter:blur(4px);}
.mm-ctx-it{display:flex;justify-content:space-between;align-items:center;gap:14px;width:100%;background:transparent;border:none;color:#e5e7eb;font-size:12.5px;padding:7px 10px;border-radius:6px;cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;}
.mm-ctx-it:hover{background:#374151;}
.mm-ctx-it.danger{color:#fca5a5;}
.mm-ctx-it.danger:hover{background:#7f1d1d55;}
.mm-ctx-key{font-size:10.5px;color:#9ca3af;}
/* 深色主题下微调 */
.mm-page[data-theme=dark] .mm-zoombar,.mm-page[data-theme=dark] .mm-ftool,.mm-page[data-theme=dark] .mm-pal,.mm-page[data-theme=dark] .mm-ctx{background:#0b1222ee;}
/* 自由文字节点:无底色,仅文字 */
.mm-node.mm-free text{cursor:text;}
/* 摄像机模型:svg 铺满视口,viewBox 负责平移缩放,容器不滚动 */
.mm-canvas-wrap .mm-svg{position:absolute;left:0;top:0;width:100%;height:100%;max-width:none;box-shadow:none;border-radius:0;}
.mm-canvas-wrap{overflow:hidden;padding:0;}
.mm-page[data-theme=dark] .mm-canvas-wrap .mm-svg{background:#0f172a;}
/* 摄像机模型下 wrap 需要确定高度(svg 已绝对定位,不再撑高) */
.mm-canvas-wrap{height:72vh;min-height:420px;}

/* 思维导图:节点样式插入菜单(彩色胶囊/白底卡片/图标节点/概要便签) 20260915ws53 */
.mm-pal-item{display:flex;align-items:center;gap:7px;width:100%;background:none;border:none;color:#e5e7eb;font-size:13px;font-family:inherit;padding:6px 8px;border-radius:7px;cursor:pointer;text-align:left;}
.mm-pal-item:hover{background:#374151;color:#fff;}
.mm-pal-ic{font-size:15px;width:20px;text-align:center;}

/* ====================== 20260915ws56:画板合并进思维导图 + 图形库排版整齐 ====================== */
/* 图形库图标缩小(能看清名字即可),网格更紧凑整齐 */
/* 20260916:左栏布局下不再覆盖列数/高度(由上方 .board-pk-grid 主样式控制),窄屏媒体查询里回落 */
.board-pk-grid{gap:4px;}
.board-pk-item{padding:4px 2px 3px;gap:1px;}
.board-pk-ic{height:17px;}
.board-pk-ic svg{width:30px;height:17px;}
.board-pk-nm{font-size:10.5px;max-width:56px;}
.board-pk-item.wt{background:linear-gradient(135deg,#eef4ff,#e0ebff);border-color:#9db9ec;}
.board-pk-item.wt:hover{background:#dbe8ff;}
.board-pk-item.wt .board-pk-nm{color:var(--blue-d);font-weight:700;}
/* 导图页内嵌画板区:与上方导图用虚线分隔,标题行整齐 */
.mm-board-sec{margin-top:16px;border-top:1px dashed var(--line);padding-top:10px;}
.mm-board-hd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.mm-board-tt{font-size:15px;font-weight:700;color:var(--blue-d);}
.mm-board-sub{font-size:12px;color:var(--mut);line-height:1.6;}
.board-canvas-wrap.mm-embed{max-height:600px;}

/* 20260916ws98:回复作者名可点 → 用户主页 */
a.rp-author-link, a.rp-item-author{color:#3a6ea5;text-decoration:none;cursor:pointer;}

/* 20260916:画板图形库左栏的窄屏回落(≤900px 恢复为画布上方横排网格) */
@media (max-width:900px){
  .board-body{display:block;}
  .board-picker{width:auto;max-height:none;margin-bottom:10px;}
  .board-pk-grid{max-height:200px;grid-template-columns:repeat(auto-fill,minmax(60px,1fr));}
}
a.rp-author-link:hover, a.rp-item-author:hover{text-decoration:underline;color:#2c568c;}
.rp-item-meta a.rp-item-author{color:#2b3a4e;font-size:12.5px;font-weight:700;}
.rp-line a.rp-line-a{flex:none;}

/* ===== 20260927:全站文字统一(卡片标题除外) =====
 * 用户需求:所有文字同一字体、大小一致(卡片标题除外),同一排按钮高度一致、文字整齐一排。
 * 做法:元素级归一 —— 只有「没写自己样式的裸元素」被统一成 14px;
 *      带类名的小字(时间戳/徽标/快捷键 kbd/代码区)保持原设计,卡片标题(h1~h4)不在此列不受影响。 */
body,input,textarea,select,button{
  font-family:"Microsoft YaHei","PingFang SC","Segoe UI","Segoe UI Emoji","Segoe UI Symbol",system-ui,sans-serif;
}
p,li,td,th,dd,dt,label,figcaption,blockquote,summary,
input,textarea,select,
button,.btn,a.btn,input[type=button],input[type=submit],input[type=reset]{
  font-size:14px;
}
button,.btn,a.btn,input[type=button],input[type=submit],input[type=reset]{
  line-height:1.4;vertical-align:middle;
}
button{padding:6px 12px;}

/* ===== 20260927 补充:顶部栏文字字号统一 =====
 * 顶栏所有文字(品牌/导航/时钟农历宜忌/账号/徽章/语言下拉)统一 14px,
 * 品牌靠加粗+字距保持醒目;特异性高于各处原字号与手机块媒体查询。 */
.topbar .brand,.topbar .nav a,.topbar .top-clock,.topbar .top-clock *,
.topbar .top-user,.topbar .top-user a,.topbar .top-user button,
.topbar .top-user .chip,.topbar #wbLangSel{
  font-size:14px;
}

/* ===== 20260928:顶栏字号统一补漏 =====
 * 首轮覆盖后仍残留:语言下拉展开的 option(12px)/汉堡☰(19px)/头像👤(11px)/▾箭头(10px)/计数徽标(12.5px),一并归一 14px。 */
.topbar .burger,.topbar .mini-ava,.topbar .top-caret,
.topbar .top-user b,.topbar .topbar-user b,.topbar #wbLangSel option{
  font-size:14px;
}

/* ==================== :项目组页面「分组」时光文本同款树形展示 ====================
 * 节点行(▶ 箭头 + 📁 + 名称 + 文件数)/ 箭头旋转展开态 / 子级缩进虚线 / 悬停高亮
 * 配色取自 legend-tree 的 .lt-node(悬停 #eaf0fa),视觉与时光文本树一致 */
.pj-ptree{margin-top:6px}
.pj-ptree-row{display:flex;align-items:center;gap:5px;padding:4px 8px;border-radius:6px;cursor:pointer;
  user-select:none;font-size:13px;color:#1f2937;white-space:nowrap;overflow:hidden}
.pj-ptree-row:hover{background:#eaf0fa}
.pj-ptree-tw{width:16px;height:16px;flex:none;display:flex;align-items:center;justify-content:center;
  color:#8a97a9;transition:transform .12s;font-size:14px;line-height:1} /* :10px→14px,框 14→16 */
.pj-ptree-tw.open{transform:rotate(90deg)}
.pj-ptree-ic{flex:none;width:18px;text-align:center}
.pj-ptree-cnt{margin-left:auto;color:#8a97a9;font-size:11.5px;flex:none;padding-left:8px}
.pj-ptree-kids{margin:2px 0 6px;padding:2px 0 2px 10px;margin-left:14px;border-left:1px dashed #dbe3ee}
.pj-ptree-file{display:flex;align-items:center;gap:6px;padding:3px 8px;border-radius:5px;color:#1f2937;
  text-decoration:none;font-size:12.5px;white-space:nowrap;overflow:hidden}
.pj-ptree-file:hover{background:#eef4ff;color:#1b4bb8}
.pj-ptree-file .pj-ptree-ic{width:16px;font-size:12px}

/* ===== (用户需求「改成都可以复制」):全站解除文本选中/复制限制 =====
 * 以往:body{user-select:none} 让鼠标拖选整页失效,只靠 app.js 的 selectstart/copy 白名单
 * 放行少数容器 —— 用户要求「改成都可以复制」,现在整站默认都能选中与复制(含按钮、顶栏路径、
 * 卡片标题等装饰元素),app.js 里那两个拦截监听已同步移除。
 * 两类刻意保留的例外(不影响复制正文内容):
 *   ① 正在拖动分割条 / 调整尺寸的瞬时态 —— 否则拖动时会顺手选中一整片文字;
 *   ② 单机游戏舞台 .g-stage(含内部) —— 触屏长按会弹系统菜单、影响游戏操作。
 * 注:必须带 !important —— 单个类选择器(如 .top-path{user-select:none})的特异性
 *     (0,1,0) 天生高于 body *(0,0,1),不加 !important 压不住散落各处的禁选规则。 */
body, body *{ -webkit-user-select:text !important; -moz-user-select:text !important; user-select:text !important; }
body.side-dragging, body.side-dragging *,
body.wb-split-v-drag, body.wb-split-v-drag *,
body.wb-split-h-drag, body.wb-split-h-drag *,
body.colresizing, body.colresizing *,
body.vsc-col-resize, body.vsc-col-resize *,
body.lt-col-resizing, body.lt-col-resizing *,
body.lt-row-resizing, body.lt-row-resizing *,
.g-stage, .g-stage *{ -webkit-user-select:none !important; -moz-user-select:none !important; user-select:none !important; }

/* :全站统一腾讯QQ默认蓝企鹅图标(替换🐧黑企鹅emoji,em 级跟随字号) */
img.qqdef{width:1em;height:1em;vertical-align:-0.14em;display:inline-block}
