/* ============================================================
   图谱工作区共享骨架样式（角色图谱 / 世界观设定 复用）
   三栏结构：左栏列表 · 中栏画布 · 右栏详情

   类名前缀说明：
     .gp-*  三栏布局容器（main / notice / body / left / canvas / right）
     .rl-*  左栏列表（rail list）——列表项、分组、工具
     .rc-*  中栏画布（rail canvas）——图例、缩放、连线、节点、标签
     .rs-*  右栏详情（rail side）——详情区块、键值行、关系项、建议卡
   ============================================================ */

.gp-main{overflow:hidden}

/* 表单字段内嵌 AI 按钮（如：条目名称 → AI 起名）
   高度随输入框自适应（align-items:stretch） */
.fm-ctrl{display:flex;gap:8px;align-items:stretch}
.fm-ctrl-main{flex:1;min-width:0}
.fm-ctrl-main>input,
.fm-ctrl-main>select,
.fm-ctrl-main>textarea{width:100%}
.fm-ctrl>.fm-ai-inline{flex-shrink:0;white-space:nowrap;padding:0 12px;font-size:12px;border-radius:9px}
.fm-ai-inline.loading{opacity:.6;pointer-events:none}

@keyframes gpFadeIn{from{opacity:0;transform:translateX(-50%) translateY(-8px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}

/* ---------- 顶部提示条 ---------- */
.gp-notice{
  display:flex;align-items:center;gap:10px;flex-shrink:0;
  padding:9px 22px;font-size:11.5px;color:var(--text-mute);
  border-bottom:1px solid var(--border);
  background:linear-gradient(90deg,var(--accent-soft),transparent 70%);
}
.gp-notice .gp-notice-ico{font-size:15px;flex-shrink:0}

/* ---------- 三栏容器 ---------- */
.gp-body{
  flex:1;min-height:0;
  display:grid;grid-template-columns:246px minmax(0,1fr) 258px;
  overflow:hidden;
}

/* ============ 左栏骨架 ============ */
.gp-left{
  background:var(--sidebar);border-right:1px solid var(--border);
  display:flex;flex-direction:column;overflow-y:auto;
  transition:background .25s var(--ease),border-color .25s var(--ease);
}
/* 顶部固定区（作品选择 / 搜索 / 计数） */
.rl-top{
  position:sticky;top:0;z-index:3;
  background:var(--sidebar);border-bottom:1px solid var(--border);
}
.rl-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:12px 16px;font-size:12.5px;font-weight:700;color:var(--text-dim);
}
.rl-count{
  font-size:10.5px;font-weight:600;padding:1px 8px;border-radius:999px;
  background:var(--accent-soft);color:var(--accent2);
}
.rl-list{display:flex;flex-direction:column;gap:8px;padding:12px 12px 4px}

/* 作品选择器 */
.rl-book{padding:14px 14px 12px}
.rl-book label{
  display:block;font-size:10.5px;font-weight:700;letter-spacing:.08em;
  color:var(--text-mute);margin-bottom:7px;
}
.rl-book select{
  width:100%;height:38px;border-radius:10px;cursor:pointer;
  background-color:var(--card);border:1px solid var(--border);color:var(--text);
  font-size:12.5px;font-family:inherit;padding:0 32px 0 12px;outline:none;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23a08a5f' d='M6 8.5L1.5 4h9z'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center;
  transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.rl-book select:hover{border-color:var(--accent)}
.rl-book select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.rl-book-meta{
  margin-top:8px;font-size:10.5px;color:var(--text-mute);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

/* 列表卡片 */
.rl-card{
  display:flex;gap:10px;padding:10px;
  border:1px solid var(--border);border-radius:12px;background:var(--card);
  cursor:pointer;
  transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease),
             box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease);
}
.rl-card:hover{border-color:var(--accent);background:var(--card-hover);transform:translateX(2px)}
.rl-card.on{
  border-color:var(--accent);background:var(--accent-soft);
  box-shadow:0 0 0 1px var(--accent),0 4px 16px var(--accent-glow);
}
.rl-card.dim{opacity:.45}
.rl-avatar{
  width:38px;height:38px;border-radius:50%;flex-shrink:0;
  display:grid;place-items:center;font-size:18px;
  background:var(--accent-soft);border:1px solid var(--border-strong);
}
.rl-info{min-width:0;flex:1}
.rl-name{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rl-sub{font-size:10.5px;color:var(--text-mute);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rl-tag{
  display:inline-block;margin-top:6px;font-size:9.5px;padding:1px 7px;border-radius:999px;
  background:var(--accent-soft);color:var(--accent2);border:1px solid var(--border);
}
.rl-tag.foe{background:color-mix(in srgb,var(--rel-foe) 16%,transparent);color:var(--rel-foe);border-color:color-mix(in srgb,var(--rel-foe) 40%,transparent)}
.rl-tag.ally{background:color-mix(in srgb,var(--rel-ally) 16%,transparent);color:var(--rel-ally);border-color:color-mix(in srgb,var(--rel-ally) 40%,transparent)}

/* 分组与工具 */
.rl-sec{border-top:1px solid var(--border);margin-top:12px;padding:14px 16px 4px}
.rl-sec-title{font-size:10.5px;font-weight:700;letter-spacing:.08em;color:var(--text-mute);margin-bottom:10px}
.rl-group{
  display:flex;align-items:center;justify-content:space-between;
  font-size:11.5px;color:var(--text-dim);padding:5px 0;cursor:pointer;
  transition:color var(--dur) var(--ease);
}
.rl-group:hover{color:var(--accent)}
.rl-group .n{font-size:10.5px;color:var(--text-mute)}
.rl-tools{display:flex;flex-direction:column;gap:4px;padding-bottom:12px}
.rl-tool{
  display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:9px;
  font-size:11.5px;color:var(--text-dim);cursor:pointer;
  border:1px solid transparent;transition:all var(--dur) var(--ease);
}
.rl-tool:hover{background:var(--card);border-color:var(--border);color:var(--accent)}
.rl-tool .ti{font-size:13px;flex-shrink:0}

/* ============ 中栏画布 ============ */
.gp-canvas{
  position:relative;overflow:auto;background:var(--bg);
  transition:background .25s var(--ease);
}
.rc-grid{
  position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:radial-gradient(circle,var(--border) 1px,transparent 1px);
  background-size:26px 26px;
}
.rc-legend{
  position:absolute;left:16px;top:16px;z-index:6;
  background:var(--card);border:1px solid var(--border);border-radius:11px;
  padding:11px 13px;display:flex;flex-direction:column;gap:8px;
  font-size:11px;color:var(--text-dim);box-shadow:var(--shadow-sm);
}
.rc-legend .lg{display:flex;align-items:center;gap:8px;white-space:nowrap}
.rc-legend .lg i{width:18px;height:0;border-top:2px solid currentColor;border-radius:2px;flex-shrink:0}
.rc-legend .lg.dash i{border-top-style:dashed}
.rc-zoom{position:absolute;right:16px;top:16px;z-index:6;display:flex;flex-direction:column;gap:6px}
.rc-zoom-btn{
  width:32px;height:32px;border-radius:9px;cursor:pointer;
  background:var(--card);border:1px solid var(--border);color:var(--text-dim);
  font-size:15px;display:grid;place-items:center;
  transition:all var(--dur) var(--ease);
}
.rc-zoom-btn:hover{border-color:var(--accent);color:var(--accent)}

/* 连线层 */
.rc-edges{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1;pointer-events:none;overflow:visible}
.rc-edges path{
  fill:none;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;   /* 端点与转折更柔和 */
  vector-effect:non-scaling-stroke;
}
/* 角色关系线 */
.rc-edges path.e-blood{stroke:var(--rel-blood)}
.rc-edges path.e-love{stroke:var(--rel-love)}
.rc-edges path.e-ally{stroke:var(--rel-ally);stroke-dasharray:7 6}
.rc-edges path.e-foe{stroke:var(--rel-foe)}
/* 世界观层级线 */
.rc-edges path.e-core{stroke:var(--rel-core)}
.rc-edges path.e-faction{stroke:var(--rel-faction)}
.rc-edges path.e-system{stroke:var(--rel-system)}
.rc-edges path.e-causal{stroke:var(--accent)}
.rc-edges path.e-contain{stroke:var(--text-mute);stroke-dasharray:6 6}

/* 节点层 */
.rc-nodes{position:absolute;left:0;top:0;width:100%;height:100%;z-index:2}
.rc-node{
  position:absolute;transform:translate(-50%,-50%);
  width:118px;padding:11px 9px 10px;border-radius:13px;
  background:var(--card);border:1px solid var(--border);
  text-align:center;cursor:grab;
  user-select:none;-webkit-user-select:none;
  box-shadow:var(--shadow-sm);
  transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),
             transform var(--dur) var(--ease),opacity var(--dur) var(--ease);
}
.rc-node:hover{border-color:var(--accent);transform:translate(-50%,-50%) scale(1.03)}
.rc-node.on{
  border-color:var(--accent);
  box-shadow:0 0 0 2px var(--accent-glow),var(--shadow-md);
}
.rc-node.dim{opacity:.32}
/* 拖动中：抬到最上层，避免被相邻卡片遮挡 */
.rc-node.dragging{
  cursor:grabbing;z-index:5;
  border-color:var(--accent);
  box-shadow:0 0 0 2px var(--accent),var(--shadow-lg);
  transition:none;
}
/* 中心主节点加宽 */
.rc-node.lg{width:150px}
.rc-node .rn-avatar{
  width:34px;height:34px;border-radius:50%;margin:0 auto 7px;
  display:grid;place-items:center;font-size:16px;
  background:var(--accent-soft);border:1px solid var(--border-strong);
}
.rc-node.lg .rn-avatar{width:40px;height:40px;font-size:19px}
.rc-node .rn-name{font-size:12.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc-node.lg .rn-name{font-size:14px}
/* 双击改名时的就地输入框 */
.rc-node .rn-name-input{
  display:block;width:100%;height:24px;box-sizing:border-box;
  padding:0 4px;border-radius:6px;outline:none;text-align:center;
  font-family:inherit;font-size:12.5px;font-weight:700;
  color:var(--text);background:var(--bg-soft);border:1px solid var(--accent);
  box-shadow:0 0 0 3px var(--accent-soft);
}
.rc-node.lg .rn-name-input{font-size:14px}
.rc-node .rn-role{font-size:10px;color:var(--text-mute);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc-node .rn-tags{display:flex;gap:4px;justify-content:center;flex-wrap:wrap;margin-top:7px}
.rc-node .rn-tag{
  font-size:9px;padding:1px 6px;border-radius:999px;
  background:var(--bg-soft);color:var(--text-mute);border:1px solid var(--border);
}

/* 连线标签（DOM 顺序在节点之前，故节点覆盖于其上） */
.rc-label{
  position:absolute;transform:translate(-50%,-50%);
  font-size:10px;padding:2px 8px;border-radius:999px;white-space:nowrap;
  background:var(--card);border:1px solid var(--border);
  color:var(--text-mute);pointer-events:none;
}

/* 底部章节时间轴 */
.rc-timeline{
  position:absolute;left:50%;transform:translateX(-50%);bottom:16px;z-index:6;
  display:flex;align-items:center;gap:14px;
  width:min(620px,calc(100% - 190px));
  padding:9px 18px;border-radius:999px;white-space:nowrap;
  background:var(--card);border:1px solid var(--border);
  box-shadow:var(--shadow-md);font-size:11px;color:var(--text-mute);
}
.rc-timeline b{color:var(--accent2)}
.rt-range{flex:1;min-width:80px;accent-color:var(--accent);cursor:pointer}

/* 悬浮操作按钮 */
.rc-fab{
  position:absolute;right:20px;bottom:20px;z-index:7;
  height:42px;padding:0 22px;border-radius:999px;border:none;cursor:pointer;
  font-size:13px;font-weight:600;font-family:inherit;
  background:linear-gradient(135deg,var(--accent),var(--accent2));
  color:var(--on-accent);box-shadow:0 6px 22px var(--accent-glow);
  transition:all var(--dur) var(--ease);
}
.rc-fab:hover{filter:brightness(1.08);transform:translateY(-1px)}

/* ============ 右栏详情 ============ */
.gp-right{
  background:var(--sidebar);border-left:1px solid var(--border);
  overflow-y:auto;padding:18px 16px 28px;
  transition:background .25s var(--ease),border-color .25s var(--ease);
}
/* ---------- 头部 ---------- */
.rs-hero{
  display:flex;gap:12px;align-items:flex-start;
  padding:14px;margin-bottom:16px;
  border:1px solid var(--border);border-radius:14px;
  background:linear-gradient(135deg,var(--accent-soft),transparent 78%),var(--card);
}
.rs-hero .rs-avatar{
  width:46px;height:46px;border-radius:50%;flex-shrink:0;
  display:grid;place-items:center;font-size:22px;
  background:linear-gradient(135deg,var(--accent-deep),var(--accent));
  color:var(--on-accent);box-shadow:0 4px 14px var(--accent-glow);
}
.rs-hbox{flex:1;min-width:0}
.rs-hero .rs-name{
  font-size:15px;font-weight:800;color:var(--text);line-height:1.5;
  display:flex;align-items:center;gap:7px;flex-wrap:wrap;
}
.rs-hero .rs-sub{
  font-size:11px;color:var(--text-mute);margin-top:5px;line-height:1.65;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.rs-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.rs-chip{
  font-size:10.5px;line-height:1.7;padding:0 7px;border-radius:6px;
  background:var(--muted-soft);color:var(--text-dim);white-space:nowrap;
}

/* ---------- 分区 ---------- */
.rs-sec{margin-bottom:20px}
.rs-sec-title{
  font-size:10.5px;font-weight:700;letter-spacing:.08em;color:var(--text-mute);
  margin-bottom:10px;display:flex;align-items:center;gap:8px;
}
.rs-sec-title::after{content:"";flex:1;height:1px;background:var(--border)}
.rs-hint{font-size:10px;font-weight:400;letter-spacing:0;color:var(--text-mute);opacity:.8}
.rs-num{
  font-size:10px;font-weight:700;line-height:1.7;padding:0 6px;border-radius:6px;
  background:var(--accent-soft2);color:var(--accent2);letter-spacing:0;
}

/* 基础行样式（世界页直接散用，角色页包在 .rs-kvs 卡片里） */
.rs-kv{display:flex;gap:9px;font-size:11.5px;margin-bottom:8px;line-height:1.5}
.rs-kv .k{color:var(--text-mute);flex-shrink:0;width:56px}
.rs-kv .v{color:var(--text-dim);flex:1;min-width:0}

/* ---------- 基础设定：一张卡片，行与行之间虚线分隔 ---------- */
.rs-kvs{
  border:1px solid var(--border);border-radius:12px;
  background:var(--card);overflow:hidden;
}
.rs-kvs .rs-kv{
  align-items:flex-start;
  padding:8px 11px 8px 12px;margin-bottom:0;
  border-bottom:1px dashed var(--border);
  font-size:11.5px;line-height:1.75;
  transition:background var(--dur) var(--ease);
}
.rs-kvs .rs-kv:last-child{border-bottom:none}
.rs-kvs .rs-kv:hover{background:var(--card-hover)}
.rs-kvs .rs-kv .k{width:58px;padding-top:1px}
.rs-kvs .rs-kv .v{
  padding:1px 6px;border-radius:6px;outline:none;cursor:text;
  white-space:pre-wrap;word-break:break-word;
  transition:background var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.rs-kvs .rs-kv .v:hover{background:var(--accent-soft)}
.rs-kvs .rs-kv .v:focus{background:var(--accent-soft);box-shadow:0 0 0 3px var(--accent-soft2)}
.rs-kvs .rs-kv .v:empty::before{content:"—";color:var(--text-mute);opacity:.5}
/* 长文本字段：标签独占一行，正文铺满整行 */
.rs-kvs .rs-kv.full{flex-direction:column;gap:3px}
.rs-kvs .rs-kv.full .k{width:auto;padding-top:0}
.rs-kvs .rs-kv.full .v{width:100%}

.rs-progress{display:flex;gap:3px;margin-top:4px}
.rs-progress i{flex:1;height:6px;border-radius:3px;background:var(--border)}
.rs-progress i.done{background:var(--accent-deep)}
.rs-progress i.cur{background:var(--accent);box-shadow:0 0 8px var(--accent-glow)}
.rs-legendline{display:flex;gap:14px;margin-top:8px;font-size:10px;color:var(--text-mute)}

/* ---------- 关系行 ---------- */
.rs-rel{
  display:flex;align-items:center;gap:9px;
  padding:8px 10px;margin-bottom:7px;
  border:1px solid var(--border);border-radius:10px;background:var(--card);
  font-size:11.5px;cursor:pointer;
  transition:all var(--dur) var(--ease);
}
.rs-rel:hover{border-color:var(--accent);transform:translateX(2px)}
.rs-rel .rdot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.rs-rel .nm{font-weight:600;color:var(--text);white-space:nowrap}
.rs-rel .rl{
  color:var(--text-mute);margin-left:auto;font-size:10.5px;white-space:nowrap;
  padding:1px 6px;border-radius:6px;outline:none;
  transition:background var(--dur) var(--ease);
}
.rs-rel .rl:hover,.rs-rel .rl:focus{background:var(--accent-soft);color:var(--text-dim)}

/* 删除按钮：平时收起，鼠标移到卡片上才出现，避免满屏小叉 */
.rs-del{
  flex-shrink:0;width:20px;height:20px;padding:0;border-radius:6px;cursor:pointer;
  font-family:inherit;font-size:10px;line-height:1;
  background:transparent;border:1px solid transparent;color:var(--text-mute);
  opacity:0;transition:all var(--dur) var(--ease);
}
.rs-mini:hover .rs-del,.rs-kv:hover .rs-del,.rs-rel:hover .rs-del{opacity:1}
.rs-del:hover{color:var(--pink);border-color:color-mix(in srgb,var(--pink) 45%,transparent)}

/* 右栏里可双击编辑的块（角色页头部、世界观各项） */
.rs-edit{cursor:pointer}
.rs-edit:hover .rs-del{opacity:1}
.rs-kv.rs-edit:hover{background:var(--card-hover)}
/* 行内的次要信息（关联说明、标注说明等） */
.rs-kv .v.sub{
  flex:0 1 auto;margin-left:auto;text-align:right;
  color:var(--text-mute);font-size:10.5px;
}
/* 时间线里嵌套的事件 / 地图里嵌套的标注 */
.rs-ev-wrap{margin-top:9px;padding-top:9px;border-top:1px dashed var(--border)}
.rs-ev-wrap:empty{display:none}

/* 右栏内嵌子卡片（世界页的法则条目 / 时间线节点等也用这套） */
.rs-mini{
  padding:10px 11px;border-radius:10px;margin-bottom:9px;
  border:1px solid var(--border);background:var(--card);
  transition:border-color var(--dur) var(--ease);
}
.rs-mini:hover{border-color:var(--border-strong)}
.rs-mini h6{
  font-size:11.5px;font-weight:700;margin:0 0 5px;color:var(--text);
  display:flex;align-items:center;gap:6px;
}
.rs-mini p{font-size:11px;color:var(--text-mute);line-height:1.65;margin:0}

/* ---------- 弧线卡片（角色页：带阶段标签、可就地编辑） ---------- */
.rs-mini-head{display:flex;align-items:center;gap:7px;margin-bottom:4px}
.rs-mini-head h6{flex:1;min-width:0;margin:0;padding:1px 5px;border-radius:6px;outline:none;cursor:text}
.rs-mini-head h6:hover,.rs-mini-head h6:focus{background:var(--accent-soft)}
.rs-stage{
  flex-shrink:0;font-size:10px;font-weight:700;line-height:1.7;padding:0 7px;border-radius:6px;
  background:var(--accent-soft2);color:var(--accent2);
}
.rs-arc-body{
  padding:1px 5px;border-radius:6px;outline:none;cursor:text;
  white-space:pre-wrap;word-break:break-word;
  transition:background var(--dur) var(--ease);
}
.rs-arc-body:hover,.rs-arc-body:focus{background:var(--accent-soft);color:var(--text-dim)}

/* ---------- 空状态 ---------- */
.rs-empty{
  padding:16px 12px;border:1px dashed var(--border);border-radius:11px;
  text-align:center;font-size:11.5px;line-height:1.8;color:var(--text-mute);
}

.rs-tip{
  padding:11px 12px;border-radius:11px;margin-bottom:9px;
  border:1px solid var(--border);background:var(--card);
}
.rs-tip h5{
  font-size:11.5px;font-weight:700;margin:0 0 6px;
  display:flex;align-items:center;gap:7px;
}
.rs-tip p{font-size:11px;color:var(--text-mute);line-height:1.65;margin:0}
.rs-tip.warn{border-color:color-mix(in srgb,var(--orange) 45%,transparent)}
.rs-tip.warn h5{color:var(--orange)}
.rs-tip.idea{border-color:var(--accent-glow)}
.rs-tip.idea h5{color:var(--accent2)}
.rs-tip.link h5{color:var(--blue)}

/* ============ 响应式 ============ */
@media (max-width:1320px){
  .gp-body{grid-template-columns:220px minmax(0,1fr) 240px}
}
@media (max-width:1140px){
  /* 空间不足时收起右栏详情 */
  .gp-body{grid-template-columns:220px minmax(0,1fr)}
  .gp-right{display:none}
}
@media (max-width:860px){
  .gp-body{grid-template-columns:minmax(0,1fr)}
  .gp-left{display:none}
  .gp-notice{display:none}
}

/* ============================================================
   通用表单弹窗（角色图谱 / 世界观设定 共用）
   用来替代原生 prompt，样式与站内卡片保持一致
   ============================================================ */
.fm-mask{
  position:fixed;inset:0;z-index:90;background:var(--mask-bg);
  backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
  opacity:0;pointer-events:none;transition:opacity var(--dur) var(--ease);
}
.fm-mask.on{opacity:1;pointer-events:auto}

.fm-modal{
  position:fixed;top:50%;left:50%;z-index:91;
  width:min(620px,94vw);max-height:88vh;display:flex;flex-direction:column;
  overflow:hidden;box-sizing:border-box;
  background:var(--card);border:1px solid var(--border-strong);border-radius:18px;
  box-shadow:var(--shadow-lg);
  opacity:0;pointer-events:none;transform:translate(-50%,-46%) scale(.97);
  transition:opacity .2s var(--ease),transform .2s var(--ease);
}
.fm-modal.on{opacity:1;pointer-events:auto;transform:translate(-50%,-50%) scale(1)}
/* 顶部一条金线，和站内卡片同一语言 */
.fm-modal::before{
  content:"";position:absolute;top:0;left:14%;right:14%;height:1px;
  background:linear-gradient(90deg,transparent,var(--accent),transparent);
  opacity:.65;
}

/* ---------- 头部 ---------- */
.fm-head{
  display:flex;align-items:flex-start;gap:12px;flex-shrink:0;
  padding:17px 20px 15px;border-bottom:1px solid var(--border);
  background:linear-gradient(90deg,var(--accent-soft),transparent 76%);
}
.fm-ico{
  width:38px;height:38px;flex-shrink:0;border-radius:12px;
  display:flex;align-items:center;justify-content:center;font-size:18px;line-height:1;
  background:var(--accent-soft2);border:1px solid var(--accent-soft2);
}
.fm-htext{flex:1;min-width:0}
.fm-title{font-size:14.5px;font-weight:700;color:var(--text);letter-spacing:.3px}
.fm-sub{font-size:11px;color:var(--text-mute);line-height:1.65;margin-top:4px}
.fm-close{
  width:30px;height:30px;flex-shrink:0;border-radius:9px;cursor:pointer;
  font-family:inherit;font-size:12px;line-height:1;
  background:var(--card-hover);border:1px solid var(--border);color:var(--text-mute);
  transition:all var(--dur) var(--ease);
}
.fm-close:hover{border-color:var(--pink);color:var(--pink)}

/* ---------- 表单体 ---------- */
.fm-body{flex:1;min-height:0;overflow-y:auto;padding:18px 20px 6px}
.fm-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px 14px}
.fm-fld{display:flex;flex-direction:column;gap:6px;min-width:0}
.fm-fld.full{grid-column:1/-1}
.fm-fld > label{
  display:flex;align-items:center;gap:6px;
  font-size:11.5px;font-weight:600;color:var(--text-dim);
}
.fm-req,.fm-opt{
  font-style:normal;font-size:9.5px;font-weight:600;
  padding:1px 5px;border-radius:5px;line-height:1.5;
}
.fm-req{color:var(--pink);background:rgba(217,112,127,.15)}
.fm-opt{color:var(--text-mute);background:var(--muted-soft)}

.fm-fld input,.fm-fld select,.fm-fld textarea{
  width:100%;box-sizing:border-box;font-family:inherit;font-size:12.5px;
  background:var(--bg-soft);border:1px solid var(--border);color:var(--text);
  border-radius:10px;padding:9px 11px;outline:none;
  transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease);
}
.fm-fld textarea{resize:vertical;line-height:1.75;min-height:70px}
.fm-fld select{cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--text-mute) 50%),
                   linear-gradient(135deg,var(--text-mute) 50%,transparent 50%);
  background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;
  padding-right:30px;
}
.fm-fld input::placeholder,.fm-fld textarea::placeholder{color:var(--text-mute);opacity:.72}
.fm-fld input:focus,.fm-fld select:focus,.fm-fld textarea:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);
}
.fm-fld.err input,.fm-fld.err select,.fm-fld.err textarea{border-color:var(--pink)}
.fm-hint{font-size:10px;color:var(--text-mute);line-height:1.6}
.fm-fld.err .fm-hint{color:var(--pink)}

/* ---------- 底部操作 ---------- */
.fm-foot{
  display:flex;align-items:center;justify-content:space-between;gap:12px;flex-shrink:0;
  padding:14px 20px 16px;border-top:1px solid var(--border);background:var(--bg-soft);
}
.fm-tip{font-size:10.5px;color:var(--text-mute)}
.fm-btns{display:flex;gap:9px}
.fm-btn{
  font-family:inherit;font-size:12.5px;font-weight:600;cursor:pointer;white-space:nowrap;
  padding:9px 20px;border-radius:10px;
  background:var(--card-hover);border:1px solid var(--border);color:var(--text-dim);
  transition:all var(--dur) var(--ease);
}
.fm-btn:hover{border-color:var(--border-strong);color:var(--text)}
.fm-btn.primary{
  border-color:transparent;color:var(--on-accent);
  background:linear-gradient(135deg,var(--accent),var(--accent2));
  box-shadow:0 6px 18px var(--accent-glow);
}
.fm-btn.primary:hover{filter:brightness(1.06)}
.fm-btn:disabled{opacity:.6;cursor:not-allowed;filter:none}
/* AI 生成：金色描边，和主按钮区分开 */
.fm-btn.ai{color:var(--accent2);background:var(--accent-soft);border-color:var(--accent-soft2)}
.fm-btn.ai:hover{border-color:var(--accent);background:var(--accent-soft2);color:var(--accent2)}
.fm-btn.ai:disabled{opacity:.75}

/* AI 刚填好的字段闪一下，让用户看清改了哪些 */
.fm-fld.ai-fill input,.fm-fld.ai-fill select,.fm-fld.ai-fill textarea{
  animation:fmFilled 1.5s var(--ease);
}
@keyframes fmFilled{
  0%{background:var(--accent-soft2);border-color:var(--accent)}
  100%{background:var(--bg-soft);border-color:var(--border)}
}

/* ============================================================
   AI 一致性检测报告（角色图谱页，弹窗外壳复用上面的 .fm-* ）
   ============================================================ */
.ci-sum{
  margin-bottom:14px;padding:11px 13px;border-radius:10px;
  background:var(--accent-soft);border:1px solid var(--accent-soft2);
  font-size:12.5px;line-height:1.85;color:var(--text-dim);
}
.ci-empty{
  padding:26px 12px;text-align:center;
  font-size:12.5px;line-height:1.9;color:var(--text-mute);
}
.ci-empty.ok{color:var(--green)}
.ci-item{
  position:relative;margin-bottom:11px;padding:12px 14px 12px 15px;
  border-radius:11px;background:var(--bg-soft);border:1px solid var(--border);
}
.ci-item::before{
  content:"";position:absolute;left:0;top:11px;bottom:11px;width:3px;border-radius:3px;
  background:var(--text-mute);
}
.ci-item.lv-hi::before{background:var(--pink)}
.ci-item.lv-mid::before{background:var(--accent)}
.ci-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:7px}
.ci-lv{
  flex-shrink:0;font-size:10px;font-weight:700;line-height:1.6;
  padding:1px 7px;border-radius:6px;
  background:var(--muted-soft);color:var(--text-mute);
}
.ci-item.lv-hi .ci-lv{background:rgba(217,112,127,.18);color:var(--pink)}
.ci-item.lv-mid .ci-lv{background:var(--accent-soft2);color:var(--accent2)}
.ci-type{font-size:12.5px;font-weight:700;color:var(--text)}
.ci-chars{font-size:11px;color:var(--text-mute);margin-left:auto}
.ci-desc{margin:0;font-size:12.5px;line-height:1.85;color:var(--text-dim)}
.ci-fix{
  margin:7px 0 0;padding-top:7px;border-top:1px dashed var(--border);
  font-size:11.5px;line-height:1.8;color:var(--text-mute);
}

.rc-fab:disabled{cursor:default;opacity:.72;filter:none;transform:none}

@media (max-width:560px){
  .fm-grid{grid-template-columns:1fr}
  .fm-head{padding:14px 16px 12px}
  .fm-body{padding:14px 16px 6px}
  .fm-foot{padding:12px 16px 14px;flex-direction:column;align-items:stretch}
  .fm-btns{justify-content:flex-end}
  .fm-tip{text-align:center}
}
