/* ════════════════════════════════════════════════════════════════
   ldg-notepad.css — 记事本独立工具样式（配套 static/js/ldg-notepad.js，2026-09-21）
   ════════════════════════════════════════════════════════════════
   结构（由 ldg-notepad.js 动态生成，任何页面引入即用）：

     .ldg-np
       .ldg-np-header        ← 固定标题栏（标题 + 复制当页/上一页/下一页/跳转页[+✕]）
       .ldg-np-card          ← 卡片本体（翻页时整张滑走；目录/正文共用一个 body）
         .ldg-np-body        ← 正文 textarea 或目录列表（二选一显示）
         .ldg-np-pageinfo    ← 右下角：目录按钮 + 页码
     .ldg-np-menu            ← 右键菜单（挂 body）
     .ldg-np-float           ← 浮窗定位壳（window.LdgNotepad.open）

   口径来源：原 static/css/lingdu.css 的 .ai-notepad-* 一套（2026-09-21 原样迁出，
   只有"目录"这部分是新增）。目录条目样式**照抄"待办事项"那套 pill 样式**（用户要求风格统一；
   那套 .ai-todo-* 已于 2026-09-21 随聊天页待办功能删除，本文件里的样式是自带的、不依赖它）。
   ════════════════════════════════════════════════════════════════ */

/* ── 外壳 / 标题栏（原 .ai-notepad-wrapper + .ai-notepad-header-fixed） ── */
.ldg-np {
  position: relative;
  margin-top: 10px;
}
.ldg-np-header {
  position: absolute;
  top: 0; left: 0; right: 0;
  padding: 18px 18px 0 18px;
  z-index: 5;
  pointer-events: auto;
}
.ldg-np-headrow {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.ldg-np-title {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  color: var(--text);
  flex-shrink: 0;
  /* 点击即可改名（2026-09-21 用户："左上角标题 记事本 三个字 要可以修改"）。
     ⚠ 面板形态下这一行同时是拖把手 ⇒ 由下面 `.ldg-np-panel .ldg-np-title { cursor: grab }` 覆盖回 grab
       （光标说"能拖"，点击照样能改名；两件事靠"位移 ≤5px 算点击"区分，见 ldg-notepad.js 的 _onTitleUp）。 */
  cursor: text;
}
/* 置顶记事本（2026-09-22 用户："设置了置顶的，左上角的文字变蓝色"）——
   状态标记挂在**面板外壳**上（`.ldg-np-pinned`），标题文字变主色。
   ⚠ 面板壳可能被搬到 body（置顶要能跨页面看见），所以这条**不能用 `.ldg-np-panel` 做前缀限定**。 */
.ldg-np-pinned .ldg-np-title { color: var(--primary); }
/* 改名编辑态：标题元素被**原位换成**这个 input（手法同组浮层的 `.ldg-grp-rename`，不是 contenteditable） */
.ldg-np-rename {
  width: 180px;
  max-width: 60%;
  padding: 1px 6px;
  font-size: 18px;
  font-weight: 700;
  font-family: inherit;
  color: var(--text);
  background: transparent;
  border: 1px solid var(--primary);
  border-radius: 6px;
  outline: none;
  box-sizing: border-box;
}
.ldg-np-pager {
  display: flex;
  align-items: center;
  gap: 6px;
}

/* ── 卡片本体（原 .ai-notepad-card） ──
   默认高度 = 智慧管理 · AI 中心右列那个记事本的高度；内嵌到别处时按需覆盖。 */
.ldg-np-card {
  display: flex;
  flex-direction: column;
  flex: 0 0 auto;
  height: 430px;
  padding: 18px;
  padding-top: 58px;             /* 给固定标题栏让位 */
  border: 1px solid var(--line);
  border-radius: 20px;
  background: var(--card-gradient, var(--panel));
  min-height: 0;
  overflow: hidden;
  box-sizing: border-box;
  transition: transform 0.8s cubic-bezier(.4,.2,.2,1), opacity 0.8s cubic-bezier(.4,.2,.2,1);
  /* ⚠ 2026-09-21 修「打字留残影」：`will-change` **不得挂在常驻卡片上** ——
     它会把这层永久升为合成层，而里面的 textarea 在"内容换行 / 自身滚动"时 Chrome 会漏重绘 ⇒
     旧像素留在原位（用户实测："文字只有一行，第一行回车换行，文字会留下残影，滚动一下就没了"；
     "滚动一下就好"正是"强制重绘"的特征）。真正需要预热的是**翻页那张克隆**（见下 `.ldg-np-card-clone`）。 */
}
@media (max-height: 1200px) {
  .ldg-np-card { height: 320px; }
}
/* 翻页"整卡滑走"：位移/淡出由 JS 按卡片实际宽度现算（内联样式），
   CSS 只负责时长与曲线（原来这里写死 translateX(±500px)：面板拉宽后滑不完、拉窄了又滑过头） */
.ldg-np-card-clone {
  pointer-events: none;
  /* 全站只有它在做 transform/opacity 动画（滑走那 0.8s）⇒ will-change 只给它；
     它是临时节点，动画完就被移除 ⇒ 合成层不会长期挂在活着的卡片上（见上面 .ldg-np-card 的注释）。 */
  will-change: transform, opacity;
}

/* ── 正文 / 目录容器（原 .ai-notepad-wrap） ── */
.ldg-np-body {
  flex: 1;
  min-height: 0;
  display: flex;
  position: relative;             /* 标准竖滚动条的定位宿主 */
}
/* 标准竖滚动条：组件默认 `right: 2px`，记事本这两条**整体右移 10px**（2026-09-21 用户两次："可以向右移动 5px 么"
   → 再"滚动条再向右5px"）⇒ `right: -8px`（条 11px 宽，右缘落在卡片 18px 内边距里，不会被裁）。
   ⚠ 只动记事本的这两条（正文 / 目录），不动全站其它 `.ldg-vscroll`（AI 聊天、审核面板…）——
      选择器用 `.ldg-np-* > .ldg-vscroll` 提特异性。
   ⚠ 正文与目录**必须一起移**：否则翻到目录页时滚动条会"跳回 10px"。 */
.ldg-np-body > .ldg-vscroll,
.ldg-np-tocwrap > .ldg-vscroll { right: -8px; }
.ldg-np-text {
  flex: 1;
  /* 同 `.ldg-np-tocwrap`（2026-09-22）：`textarea` 的固有宽（默认 cols=20 ≈168px）也会顶住
     flex 项的自动最小尺寸 ⇒ 记事本比它窄时正文一样会溢出被裁。同一类缺陷，一起解。 */
  min-width: 0;
  min-height: 0;
  width: 100%;
  /* 2026-09-21 两处调整：
     ① 右侧留出**标准竖滚动条**的位置（轨道 11px + right 2px，口径同 .ldg-np-toc 的 16px）；
     ② 底部多留一行 —— `calc(1.5em + 5px)` = 一行行高 + 原来的 5px：textarea 的滚动上限 = 内容高 + 上下 padding，
        底 padding 只有 5px 时光标到末行就**贴死在底边**、再回车也看不出往下走（用户："到底部了就不继续向下，
        不给我留白"）。给足一行之后，末行之下永远空一行，光标始终能再往下走一格（＝编辑器里的打字机留白）。
        ⚠ 这里用 `em` 而不是写死 px：字号是**可变**的（见下面 font-size），写死就跟不上字号了。 */
  padding: 5px 16px calc(1.5em + 5px) 12px;
  border: none;
  border-radius: 10px;
  background: transparent;
  color: var(--text);
  /* 正文字号（2026-09-21 用户）：默认 **20px**，且**每本记事本可单独改**（右键「改字体大小」，范围 17–50）——
     这里只是基准值；被改过的某一本，由 JS 把字号写在它自己 textarea 的行内样式上（互不影响）。
     行高 `1.5`（20px → 30px）与上面底留白的 `em` 都跟着字号走 ⇒ 改字号**不需要**再改第二处。 */
  font-size: 20px;
  line-height: 1.5;
  resize: none;
  outline: none;
  box-sizing: border-box;
}
.ldg-np-text::placeholder { color: var(--muted); }
/* 标准竖滚动条（window.ldgAttachVScroll）接管后隐藏原生滚动条（同 .ldg-np-toc-vs 口径） */
.ldg-np-text.ldg-np-text-vs { scrollbar-width: none; }
.ldg-np-text.ldg-np-text-vs::-webkit-scrollbar { width: 0; height: 0; display: none; }

/* ── 目录页容器：搜索行固定在列表上方（2026-09-21 用户：目录第 1 个标签 = 搜索框） ── */
.ldg-np-tocwrap {
  flex: 1;
  /* 2026-09-22 用户："目录页面的搜索和目录标签的右边当记事本宽度窄的时候会被裁剪，应该是标签宽度
     没有适应记事本宽" —— 真凶就是这一行缺失：
     `.ldg-np-body` 是**横向** flex 容器，flex 项的自动最小尺寸 = min-content；
     而本容器（竖排）的 min-content 被里面搜索框的**固有宽度**（`<input>` 默认 size=20 ≈168px）撑住
     ⇒ 记事本比它窄时这一整块（搜索行 + 目录列表）**拒绝收缩**、整体溢出卡片右侧，被
     `.ldg-np-card { overflow: hidden }` 裁掉。实测：面板 180px 宽时卡片横向溢出 34px。
     `min-width: 0` 解掉自动最小宽 → 里面的搜索框（自己已 `min-width: 0`）与目录条目就会跟着缩。 */
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
  position: relative;             /* 标准竖滚动条的定位宿主 */
}
.ldg-np-searchrow {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 16px 8px 2px;
}
/* 同页码框：写死盒子尺寸 + 去掉 UA 控件外观，手机/平板的 zoom 下才不会相对变大。
   底色清空（透出窗体一体背景）+ 只留边框 —— 同弹窗标准第 ⑥ 条。
   2026-09-22 用户："目录页面的搜索框高度要和目录标签高度一样文字大小也要一样" ——
   高度/字号**按目录条目（.ldg-np-toc-item）实测值写**：条目 = 上内边距 7 + 下内边距 7 + 行盒 ≈20
   + 上下边框 2 ≈ **36px**、字号 **15px**（改条目那三项中的任何一个，这里都要跟着改）。
   `line-height` 保持写死的 22px（< 内容盒 34px，输入框会把这一行垂直居中，不会裁字）。 */
.ldg-np .ldg-np-search {
  flex: 1;
  min-width: 0;
  height: 36px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: transparent;
  color: var(--text);
  font-family: inherit;
  font-size: 15px;
  line-height: 22px;
  box-sizing: border-box;
  outline: none;
  -webkit-appearance: none;
  appearance: none;
}
.ldg-np-search:focus { border-color: var(--primary); }
.ldg-np-search::placeholder { color: var(--muted); }
/* 命中数（「命中 N 处」）：文字不许换行，但**要允许被压缩并打省略号** ——
   上面 tocwrap 能收缩之后，极窄时若不收它，nowrap 这段会重新把行撑破（同一条"适应记事本宽"口径）。 */
.ldg-np-searchhits {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--muted);
  font-size: 12px;
  white-space: nowrap;
}
/* 搜索命中的关键词高亮（目录条目摘要里） */
.ldg-np-toc-hit { color: var(--primary); font-weight: 700; }

/* ── 目录列表 ──
   条目样式 = 原"待办事项"那套 pill 的外观（padding / 圆角 / 边框 / 底 / 悬停全部对齐；
   源样式 .ai-todo-* 已于 2026-09-21 删除，这里自带、不依赖它）。 */
.ldg-np-toc {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 10px;                      /* 同 .ai-todo-list */
  padding: 5px 16px 5px 2px;      /* 右侧留出标准滚动条的位置 */
  box-sizing: border-box;
}
/* 标准竖滚动条（window.ldgAttachVScroll）接管后隐藏原生滚动条 */
.ldg-np-toc.ldg-np-toc-vs { scrollbar-width: none; }
.ldg-np-toc.ldg-np-toc-vs::-webkit-scrollbar { width: 0; height: 0; display: none; }

.ldg-np-toc-item {
  padding: 7px 15px;
  border-radius: 12px;
  border: 1px solid var(--line);
  background: var(--panel-soft);
  color: var(--text);
  font-size: 15px;
  transition: background .15s, border-color .15s;
  cursor: pointer;
  user-select: none;
  display: flex;
  align-items: baseline;
  gap: 8px;
}
.ldg-np-toc-item:hover {
  background: var(--primary-soft);
  border-color: var(--primary);
}
/* 当前页：同原"待办事项"选中项的口径（inset 左侧高亮条） */
.ldg-np-toc-item.ldg-np-toc-cur {
  background: var(--primary-soft, #e8f0fe);
  box-shadow: inset 3px 0 0 var(--primary);
}
.ldg-np-toc-no {
  flex: 0 0 auto;
  color: var(--muted);
}
.ldg-np-toc-item.ldg-np-toc-cur .ldg-np-toc-no { color: var(--primary); }
.ldg-np-toc-text {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ldg-np-toc-empty {
  padding: 8px 4px;
  color: var(--muted);
  font-size: 13px;
  line-height: 1.6;
}

/* ── 页码行（2026-09-21 用户微调：左＝「复制当页」，右＝「目录」+ 页码） ── */
.ldg-np-pageinfo {
  margin-top: 8px;
  display: flex;
  align-items: center;
  justify-content: space-between;   /* 复制当页贴左，目录 + 页码贴右 */
  gap: 8px;
  font-size: 12px;
  color: var(--muted);
  user-select: none;
}
.ldg-np-pageright {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
  white-space: nowrap;            /* 底部一排不折行：放不下由 JS 收敛文案（见 applyPageDensity） */
}
/* 页码文案同样不折行（不折行才能用 scrollWidth 量出"完整文案需要多宽"） */
.ldg-np-pagetext { white-space: nowrap; }
/* 小胶囊按钮：「复制当页」与「目录」共用一套长相（.ldg-np-tocbtn 只保留"目录态高亮"）。
   ⚠ 与同排的页码输入框**必须同一套尺寸口径**（2026-09-21 用户：手机上输入框比按钮还大）：
   本站是全站 `html zoom` 等比缩放，而 `<button>`/`<input>` 的 UA 控件外观那套"平台固有尺寸"
   不按 zoom 等比走 —— 电脑（zoom≈1）看不出来，手机/平板（zoom 很小）就会大小不一。
   所以这一排一律：去掉控件外观 + 写死 height/line-height/font-size（20px / 18px / 12px）。 */
.ldg-np .ldg-np-chip {
  height: 20px;
  padding: 0 8px;
  box-sizing: border-box;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: transparent;
  color: var(--muted);
  font-family: inherit;
  font-size: 12px;
  line-height: 18px;
  cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
  -webkit-appearance: none;
  appearance: none;
}
.ldg-np .ldg-np-chip:hover {
  background: var(--primary-soft);
  border-color: var(--primary);
  color: var(--primary);
}
.ldg-np .ldg-np-chip.ldg-np-tocbtn-on {
  background: var(--primary-soft);
  border-color: var(--primary);
  color: var(--primary);
}
/* 页码本身就是输入框（常驻）：回车 / 点外面 = 确认。
   长相**完全对齐同排的「目录」按钮**（2026-09-21 用户：目录按钮没问题，做成目录按钮的样式）——
   同一套 边框/圆角/底/字号/高度，只是它是可输入的；聚焦或悬停时才亮主色，表示"这里能改"。
   ⚠ 尺寸/字号必须**写死 + 去掉 UA 表单控件外观**（2026-09-21 用户：手机/平板上它比旁边的按钮还大）：
   本站是全站 `html zoom` 等比缩放，而 `<input>` 的"平台固有尺寸"（appearance 那套）不随 zoom 缩 ——
   电脑上 zoom≈1 看不出来，手机/平板 zoom 很小 → 输入框相对被放大。 */
.ldg-np .ldg-np-pageinput {
  width: 42px;                       /* 与「目录」按钮同宽 */
  height: 20px;
  padding: 0 4px;
  box-sizing: border-box;
  border: 1px solid var(--line);     /* 同 .ldg-np-chip */
  border-radius: 6px;
  background: transparent;
  color: var(--muted);
  font-family: inherit;
  font-size: 12px;
  line-height: 18px;
  text-align: center;
  vertical-align: middle;
  outline: none;
  -webkit-appearance: none;
  appearance: none;
}
.ldg-np .ldg-np-pageinput:hover,
.ldg-np .ldg-np-pageinput:focus {
  border-color: var(--primary);
  color: var(--primary);
}

/* ── 标题栏按钮（原 .ai-notepad-pagebtn）
   底色清空（透出窗体一体背景）+ 只留自己一圈边框 —— 同弹窗标准第 ⑥ 条"内层不加底色"。
   ⚠ 与右边那个 ✕ 必须**同高**（2026-09-21 用户："这个关闭按钮的高度做成和左边下一页的按钮一样高"）：
   只靠 padding + font-size 凑高度会被字体度量/UA 控件外观带偏（✕ 是 line-height:1 的符号、下一页是中文），
   所以两边一律写死 `height + line-height + box-sizing`（口径同 .ldg-np-chip），永远等高。 */
.ldg-np-btn {
  height: 26px;
  box-sizing: border-box;
  line-height: 18px;
  padding: 3px 8px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: transparent;
  color: var(--text);
  font-size: 15px;
  cursor: pointer;
  transition: background .15s, border-color .15s;
  white-space: nowrap;
}
.ldg-np-btn:hover { background: var(--primary-soft); border-color: var(--primary); }
.ldg-np-btn:disabled { opacity: .4; cursor: not-allowed; }

/* ── 右键菜单（原 .ai-notepad-ctx-menu：宽度随内容自适应） ── */
.ldg-np-menu {
  width: auto;
  min-width: 160px;
}
.ldg-np-menu-danger { color: #ef4444; }
/* 右键菜单里的分隔线（fb-context-menu 本身没有分隔线样式） */
.ldg-np-menu-sep {
  height: 1px;
  margin: 4px 8px;
  background: var(--line);
}
/* 右键菜单里「移动到其它桌面…」展开后的小标题（只展示、不可点）
   ⚠ 字号必须跟 .fb-ctx-item 一致（右键菜单全站统一 **16px**，2026-09-24 由 14px 提上来），
   否则标题比下面的桌面条目小一号（2026-09-21 用户） */
.ldg-np-menu-title {
  padding: 6px 14px 6px;
  font-size: 16px;
  color: var(--muted);
  white-space: nowrap;
}
.ldg-np-menu-confirm-msg {
  padding: 4px 14px 8px;
  font-size: 16px;   /* 右键菜单里的文字全站统一 16px（2026-09-24；原 12） */
  color: var(--muted);
  white-space: nowrap;
}
/* 「改字体大小」的内联字号表（2026-09-21 用户：范围 17–50、默认 20px、**只对当前这本生效**）——
   用 4 列网格把 34 个字号排成 9 行，比单列矮一大截，因此**不需要**给菜单挂滚动条；
   当前值用菜单自己的 hover 底色高亮（不另造配色），数字用等宽数字体，竖着一列列对齐。 */
.ldg-np-fsgrid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 2px 4px;
  padding: 2px 10px 6px;
}
.ldg-np-fsgrid .ldg-np-fsitem {
  padding: 5px 0;
  text-align: center;
  font-variant-numeric: tabular-nums;
  font-size: 16px;   /* 菜单里的字号表也是菜单文字 ⇒ 统一 16px（2026-09-24；原来靠继承、口径不明） */
}
.ldg-np-fsgrid .ldg-np-fsitem.is-cur {
  background: var(--sidebar-hover);
  font-weight: 600;
}

/* ════════ 挂靠式面板（window.LdgNotepad.attach / newOnDesk / open）════════
   2026-09-21 用户：记事本不做顶层悬浮 —— 它挂在"新建它的那个页面/桌面"里（桌面1 新建的只在桌面1）。
   壳 `.ldg-np-panel` 自己定 位置(px，标准件 LdgFloatPanel 管) + 长宽(px，四角把手管)；
   拖动 / 位置记忆 / 出边兜底由 window.LdgFloatPanel 管，四角调大小由 ldg-notepad.js 自己管。
   `-fixed` 变体 = 挂 body 的老写法（open()），相对视口定位。 */
.ldg-np-panel {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  z-index: 60;
  pointer-events: auto;
}
.ldg-np-panel-fixed {
  position: fixed;
  z-index: 1200;
}
/* 面板里的记事本本体撑满壳；卡片高度改由"壳的高度"说了算（内嵌版仍是固定 430/320） */
.ldg-np-inpanel {
  width: 100%;
  height: 100%;
  margin-top: 0;
  display: flex;
  flex-direction: column;
}
.ldg-np-inpanel > .ldg-np-card {
  flex: 1 1 auto;
  height: auto;
  min-height: 0;
}
/* 面板本体外观按《开发要求》弹窗标准第 ⑥ 条：底色 var(--panel) + 圆角 12px + **无外圈阴影**。
   （内层一律不加底色：下面 .ldg-np-btn / .ldg-np-search 都已清空底色、只留边框。
     ⚠ 例外：目录条目的 `.ldg-np-toc-item` 保留 --panel-soft 底 —— 那是用户 2026-09-21 明确要求的
     "目录标签样式照抄待办事项那套 pill"，比通用外观口径优先。） */
.ldg-np-panel .ldg-np-card {
  border-radius: 12px;
  background: var(--panel);
  box-shadow: none;
}
.ldg-np-panel .ldg-np-title { cursor: grab; }
.ldg-np-panel .ldg-np-headrow { cursor: grab; }

/* 拖动调整大小：**四条边 + 四个角**都能拖（2026-09-21 用户：边也要能拖；把手里不要小方格点）。
   把手一律**透明不可见**，靠光标形状提示（贴边 → 上下/左右箭头，贴角 → 斜向箭头）；
   边比角低一层、两端各让开 10px，角压住边的末端 → 光标与命中都"角优先"。 */
.ldg-np-rs {
  position: absolute;
  z-index: 8;
  background: transparent;
  /* 触屏：把手上的拖动不许被浏览器当成"滚页面"（2026-09-23，与文件预览的 .fp-resize 同一口径）。
     少了它，手机上拖把手只会滚动、尺寸一点不变。 */
  touch-action: none;
}
/* 四条边（厚 12px，跨在边界上：各 5px 在外、7px 在内，好抓） */
.ldg-np-rs-n { left: 10px; right: 10px; top: -5px; height: 12px; cursor: ns-resize; }
.ldg-np-rs-s { left: 10px; right: 10px; bottom: -5px; height: 12px; cursor: ns-resize; }
.ldg-np-rs-w { top: 10px; bottom: 10px; left: -5px; width: 12px; cursor: ew-resize; }
.ldg-np-rs-e { top: 10px; bottom: 10px; right: -5px; width: 12px; cursor: ew-resize; }
/* 四个角（20×20，各 7px 挑在角外面）—— z-index 压过边，角优先 */
.ldg-np-rs-nw, .ldg-np-rs-ne, .ldg-np-rs-sw, .ldg-np-rs-se {
  width: 20px;
  height: 20px;
  z-index: 9;
}
.ldg-np-rs-nw { left: -7px; top: -7px; cursor: nwse-resize; }
.ldg-np-rs-ne { right: -7px; top: -7px; cursor: nesw-resize; }
.ldg-np-rs-sw { left: -7px; bottom: -7px; cursor: nesw-resize; }
.ldg-np-rs-se { right: -7px; bottom: -7px; cursor: nwse-resize; }
/* ✕（＝删除记事本）。尺寸口径见上面 .ldg-np-btn 的注释：**必须与之同高**，故同样写死盒子。 */
.ldg-np-close {
  height: 26px;
  box-sizing: border-box;
  line-height: 18px;
  padding: 3px 8px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: transparent;
  color: var(--muted);
  font-size: 14px;
  cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
}
.ldg-np-close:hover { background: var(--primary-soft); border-color: var(--primary); color: var(--primary); }
/* 锁定位置（2026-09-21 用户：记事本右键「锁定/解锁位置」）：把调尺寸把手藏掉 ——
   锁着还显示把手 = 明摆着"能拉"，用户会以为锁没生效（拖动那一半由光标 + 标准件拦）。
   ⚠ 用 display:none 让把手**既不显示也不吃事件**（只靠 cursor 变默认是不够的）。 */
.ldg-np-panel.ldg-np-locked .ldg-np-rs { display: none; }
