/* 墨韵 · 样式分片 3/4（源：moyun.single.html，勿手改） */
/* ═══════════════════════════════════════════════
   输入控件
   ═══════════════════════════════════════════════ */
.input-field{
  width:100%;background:var(--bg-inset);
  border:1px solid var(--bd);border-radius:10px;
  padding:9px 12px;font-size:13px;color:var(--tx);
  outline:none;transition:border-color .15s,box-shadow .15s,background .15s;
}
.input-field:hover{border-color:var(--bd2)}
.input-field:focus{background:var(--bg-card);border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.input-field::placeholder{color:var(--tx3)!important;opacity:1!important}

.textarea-field{
  width:100%;background:var(--bg-inset);
  border:1px solid var(--bd);border-radius:10px;
  padding:9px 12px;font-size:13px;color:var(--tx);
  outline:none;resize:vertical;line-height:1.6;
  transition:border-color .15s,box-shadow .15s,background .15s;
}
.textarea-field:hover{border-color:var(--bd2)}
.textarea-field:focus{background:var(--bg-card);border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.textarea-field::placeholder{color:var(--tx3)!important;opacity:1!important}
input::placeholder,textarea::placeholder{color:var(--tx3)!important;opacity:1!important}

.infinite-mode-wrap{min-height:60vh;position:relative;z-index:2}
.infinite-mode-card{box-shadow:var(--sh2)}
.infinite-editor{
  min-height:52vh;font-size:17px;line-height:1.9;
  padding:18px 20px;background:var(--bg-card);
  border-radius:14px;white-space:pre-wrap;
}
.infinite-editor::placeholder{line-height:1.8}
.infinite-control-bar{
  position:sticky;bottom:0;z-index:12;
  padding:10px;border-radius:16px;
  background:var(--bg-inset);
  border:1px solid var(--bd);
  box-shadow:var(--sh2);
}
@media(min-width:768px){.infinite-control-bar{bottom:12px}}
@media(max-width:767px){
  .infinite-mode-wrap{padding-bottom:150px}
  .infinite-editor{min-height:58vh;font-size:16px;padding:14px;line-height:1.8}
  .infinite-control-bar{position:sticky;bottom:max(8px, env(safe-area-inset-bottom));margin-left:-4px;margin-right:-4px;max-height:58vh;overflow-y:auto;overscroll-behavior:contain}
  .infinite-control-bar .rounded-2xl{border-radius:14px;padding:10px!important}
  .infinite-control-bar textarea{max-height:120px}
  .infinite-control-bar button{min-height:36px}
  .moyun-soft-bottom-composer{
    bottom:var(--moyun-mobile-browser-bottom, 0px)!important;
    margin-top:auto;
    padding-bottom:max(6px, env(safe-area-inset-bottom, 0px))!important;
  }
  .moyun-soft-bottom-composer>div,
  .moyun-soft-bottom-composer .moyun-composer-card{
    border-radius:16px 16px 10px 10px;
    backdrop-filter:blur(16px);
    box-shadow:0 10px 28px rgba(15,23,42,.14)!important;
    gap:8px!important;
    padding:8px!important;
  }
  .moyun-soft-bottom-composer textarea{
    min-height:40px!important;
    max-height:min(32vh, 168px)!important;
    font-size:16px!important;
    line-height:1.4!important;
    padding:8px 10px!important;
    border-radius:10px!important;
    resize:none!important;
  }
  .moyun-composer-reuse-hint{display:none}
  .moyun-composer-reuse-full,.moyun-composer-metric-label{display:none}
  .moyun-composer-reuse-short,.moyun-composer-metric-short{display:inline}
  .moyun-composer-controls{
    display:flex;
    flex-wrap:nowrap;
    align-items:center;
    gap:6px;
  }
  .moyun-composer-metrics{
    display:flex;
    align-items:center;
    gap:6px;
    flex:1 1 auto;
    min-width:0;
  }
  .moyun-composer-reuse{min-height:32px;font-size:11px;font-weight:800}
  .moyun-composer-metric{display:inline-flex;align-items:center;gap:3px;font-size:11px}
  .moyun-composer-metric select{
    min-height:32px!important;
    height:32px;
    padding:2px 4px;
    font-size:12px;
    border-radius:8px;
  }
  .moyun-composer-icon-row{gap:8px}
  .moyun-soft-bottom-composer .moyun-composer-icon-btn{
    width:32px;
    height:32px;
    min-width:32px!important;
    min-height:32px!important;
    padding:0;
    border-radius:999px;
    flex:0 0 32px;
  }
  .moyun-soft-bottom-composer .moyun-composer-toolbar{
    display:flex;
    flex-wrap:nowrap;
    align-items:center;
    gap:6px;
    margin-left:auto;
  }
  .moyun-soft-bottom-composer .moyun-composer-toolbar .btn-primary{
    flex:1 1 auto;
    min-width:72px!important;
    min-height:36px!important;
    height:36px;
    padding:0 10px;
    border-radius:10px;
    font-size:13px;
    order:unset;
  }
  .moyun-keyboard-open .moyun-soft-bottom-composer{
    position:fixed;
    left:0;
    right:0;
    bottom:var(--moyun-keyboard-inset, 0px)!important;
    z-index:35;
    padding-bottom:6px!important;
    margin:0;
  }
  .moyun-keyboard-open .theme-fab{display:none}
}


.select-field{
  background:var(--bg-inset);border:1px solid var(--bd);
  border-radius:10px;padding:6px 10px;font-size:13px;
  color:var(--tx);outline:none;cursor:pointer;
  transition:border-color .15s,box-shadow .15s,background .15s;
}
.select-field:hover{border-color:var(--bd2)}
.select-field:focus{background:var(--bg-card);border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}

.label{
  display:block;font-size:11px;font-weight:700;
  color:var(--tx3);text-transform:uppercase;
  letter-spacing:.04em;margin-bottom:6px;
}

/* ═══════════════════════════════════════════════
   笔尖动画（生成中）
   ═══════════════════════════════════════════════ */
.quill-svg{width:80px;height:80px;overflow:visible}
.quill-group{transform-origin:50% 90%;animation:quill-write 3s ease-in-out infinite}
.quill-feather{fill:var(--tx)}
.quill-stem{stroke:rgba(255,255,255,.15);stroke-width:1.5;stroke-linecap:round;fill:none}
@keyframes quill-write{
  0%{transform:rotate(-10deg) translateY(0)}
  15%{transform:rotate(5deg) translateY(-4px)}
  25%{transform:rotate(-15deg) translateY(0)}
  45%{transform:rotate(-20deg) translateY(0)}
  75%{transform:rotate(2deg) translateY(-6px) scale(1.05)}
  90%{transform:rotate(2deg) translateY(-6px) scale(1.05)}
  100%{transform:rotate(-10deg) translateY(0)}
}
.ink-splash{fill:var(--tx);opacity:0;animation:ink-splash 3s infinite}
@keyframes ink-splash{
  0%,70%{transform:translate(50px,90px) scale(0);opacity:0}
  75%{opacity:.6}
  85%{transform:translate(50px,110px) scale(1.2);opacity:0}
  100%{transform:translate(50px,110px) scale(1.2);opacity:0}
}

@keyframes snowwing-memory-toggle-on{
  0%{transform:translateY(0) scale(.985);filter:saturate(.96)}
  58%{transform:translateY(-1px) scale(1.012);filter:saturate(1.08)}
  100%{transform:translateY(0) scale(1);filter:saturate(1)}
}
@keyframes snowwing-memory-toggle-off{
  0%{transform:translateY(-1px) scale(1.008)}
  100%{transform:translateY(0) scale(1)}
}
@keyframes snowwing-memory-toggle-glow{
  0%{box-shadow:0 0 0 0 rgba(37,99,235,.24),0 10px 22px rgba(29,78,216,.18),inset 0 1px 0 rgba(255,255,255,.30)}
  100%{box-shadow:0 0 0 7px rgba(37,99,235,0),0 10px 22px rgba(29,78,216,.18),inset 0 1px 0 rgba(255,255,255,.30)}
}
.snowwing-memory-preset-panel{
  font-family:'Microsoft YaHei UI','PingFang SC','Segoe UI',Arial,sans-serif;
  color:#1e293b;
  border:1px solid rgba(14,116,144,.22);
  background:linear-gradient(135deg,rgba(248,252,255,.98),rgba(239,246,255,.94) 48%,rgba(236,253,245,.88));
  border-radius:12px;
  padding:12px;
  box-shadow:0 14px 30px rgba(15,118,160,.12),inset 0 1px 0 rgba(255,255,255,.86);
}
.snowwing-memory-preset-select{
  width:100%;
  min-height:38px;
  border-radius:10px;
  border:1px solid rgba(14,116,144,.24);
  background:rgba(255,255,255,.9);
  color:#0f172a;
  font-size:12px;
  font-weight:700;
  outline:none;
  padding:0 10px;
}
.snowwing-memory-preset-metric{
  border:1px solid rgba(148,163,184,.22);
  background:rgba(255,255,255,.76);
  border-radius:8px;
  padding:8px;
  min-width:0;
}
.snowwing-memory-preset-input{
  min-height:34px;
  border-radius:9px;
  border:1px solid rgba(148,163,184,.30);
  background:rgba(255,255,255,.82);
  color:#0f172a;
  font-size:12px;
  outline:none;
  padding:0 10px;
}
.snowwing-import-confirm{
  font-family:'Microsoft YaHei UI','PingFang SC','Segoe UI',Arial,sans-serif;
  color:#1e293b;
}
.moyun-confirm-scroll-body{
  flex:1 1 auto;
  min-height:0;
  overflow-y:auto;
  overscroll-behavior:contain;
  padding-right:2px;
}
.moyun-confirm-footer{
  flex:0 0 auto;
  padding-top:12px;
  margin-top:12px;
  border-top:1px solid rgba(148,163,184,.22);
  background:linear-gradient(180deg,rgba(255,255,255,.72),rgba(255,255,255,.92));
}
.moyun-confirm-modal--standard .moyun-confirm-footer{
  border-top-color:var(--bd);
  background:var(--bg-card);
}
.snowwing-import-hero{
  border:1px solid rgba(125,211,252,.34);
  background:linear-gradient(135deg,#0f172a,#0e7490 58%,#38bdf8);
  color:#f8fafc;
  border-radius:16px;
  padding:16px;
  box-shadow:0 18px 42px rgba(14,116,144,.22),inset 0 1px 0 rgba(255,255,255,.22);
}
.snowwing-import-grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:8px;
}
.snowwing-import-cell{
  border:1px solid rgba(148,163,184,.22);
  background:rgba(248,252,255,.88);
  border-radius:10px;
  padding:9px;
  min-width:0;
}
.snowwing-import-section{
  border:1px solid rgba(14,116,144,.16);
  background:linear-gradient(135deg,rgba(236,253,245,.72),rgba(239,246,255,.82));
  border-radius:10px;
  padding:10px;
}
.snowwing-delete-confirm{
  font-family:'Microsoft YaHei UI','PingFang SC','Segoe UI',Arial,sans-serif;
  color:#0f172a;
  flex:1 1 auto;
  min-height:0;
  overflow-y:auto;
  overscroll-behavior:contain;
  padding-right:2px;
}
.snowwing-delete-hero{
  position:relative;
  overflow:hidden;
  border:1px solid rgba(248,113,113,.38);
  background:
    radial-gradient(circle at 88% 0%, rgba(248,113,113,.28), transparent 34%),
    linear-gradient(135deg,#0f172a 0%,#1e293b 46%,#7f1d1d 100%);
  color:#fff7ed;
  border-radius:18px;
  padding:16px;
  box-shadow:0 20px 46px rgba(127,29,29,.24),inset 0 1px 0 rgba(255,255,255,.18);
}
.snowwing-delete-grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:8px;
}
.snowwing-delete-cell{
  border:1px solid rgba(148,163,184,.22);
  background:rgba(248,250,252,.92);
  border-radius:12px;
  padding:9px;
  min-width:0;
}
.snowwing-delete-scope{
  border:1px solid rgba(14,116,144,.18);
  background:linear-gradient(135deg,rgba(236,253,245,.76),rgba(239,246,255,.86));
  border-radius:12px;
  padding:10px;
}
@media(max-width:640px){
  .snowwing-import-grid{grid-template-columns:1fr}
  .snowwing-delete-grid{grid-template-columns:1fr}
  .moyun-confirm-footer{padding-bottom:max(2px, env(safe-area-inset-bottom))}
}

/* ═══════════════════════════════════════════════
   响应式
   ═══════════════════════════════════════════════ */
@media(max-width:767px){
  .desktop-only{display:none!important}
  .mobile-visible{opacity:.86!important}
  .mobile-visible:active{opacity:1!important}
}
@media(min-width:768px){
  .mobile-only{display:none!important}
}

/* ═══════════════════════════════════════════════
   NSFW 编辑器折叠
   ═══════════════════════════════════════════════ */
.nsfw-section{
  border:1px solid var(--err);border-radius:10px;overflow:hidden;
}
.nsfw-header{
  padding:10px 12px;background:var(--err-soft);
  display:flex;justify-content:space-between;align-items:center;
  cursor:pointer;user-select:none;
}
.nsfw-module-label{
  font-size:11px;font-weight:700;margin-bottom:3px;display:block;
}

/* ═══════════════════════════════════════════════
   杂项
   ═══════════════════════════════════════════════ */
.divider{height:1px;background:var(--bd);margin:12px 0}
.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.line-clamp-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.line-clamp-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

/* 浮动主题切换按钮（移动端） */
.theme-fab{
  position:fixed;bottom:calc(108px + env(safe-area-inset-bottom,0px) + var(--moyun-mobile-browser-bottom, 0px));right:16px;z-index:50;
  width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;
  background:var(--bg-card);border:1px solid var(--bd2);
  box-shadow:var(--sh2);display:flex;align-items:center;
  justify-content:center;color:var(--accent);cursor:pointer;
  transition:transform .2s;
}
.theme-fab:hover{transform:scale(1.1)}
.theme-fab:active{transform:scale(.95)}
@media(min-width:768px){.theme-fab{display:none}}
@media(max-width:767px){
  .sidebar-tab-shell [data-sidebar-tab]{min-width:44px;min-height:44px}
  [role="tablist"][aria-label="设置分类"] > button{min-height:44px}
  [data-moyun-modal="connection-profile-editor"] button,
  [id^="settings-panel-"] button,
  .moyun-workbench button{min-width:44px;min-height:46px}
  .moyun-workbench .moyun-wb-back-writing{min-width:0;min-height:36px;width:auto}
  .moyun-soft-bottom-composer button{min-width:36px;min-height:36px}
  .moyun-soft-bottom-composer .btn-primary{min-height:36px}
  .moyun-workbench .moyun-wb-operation button{min-height:32px}
  .moyun-workbench .moyun-wb-mode-tabs button{min-width:0;min-height:28px}
  .moyun-workbench .moyun-action-status button{min-height:32px}
  .moyun-workbench .moyun-wb-ai-compact,
  .moyun-workbench .moyun-do-footer .moyun-wb-ai-compact{
    min-width:0!important;min-height:32px!important;height:32px;width:auto!important;
  }
  [id^="settings-panel-"] a[href],
  [data-moyun-modal="web-update-announcement"] button,
  [data-moyun-modal="web-update-announcement"] a[href]{min-width:46px;min-height:46px}
  button[aria-label^="滚动到本章"],
  button[aria-label="手动修改章节标题"]{min-width:44px;min-height:44px}
  /* 侧栏各功能页（设定/角色/大纲/目录/总结/查找/预设）此前从未纳入触控目标规则，
     实测仍有 18–36px 的按钮与下拉：模板库 19、AI 一键补全 23、生成总结 24、人称切换 27、
     下拉 28、展开摘要 36、预设排序 ↑↓ 18。这里按侧栏 region 统一兜底。 */
  [data-moyun-region="sidebar"] button,
  [data-moyun-region="sidebar"] select{min-height:44px}
  /* 底栏的「本章目标字数」「生成章节数」是写正文前最常改的两个下拉，此前只有 28px。 */
  [data-moyun-region="composer"] select{min-height:32px;height:32px}
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-stack{display:flex;flex-direction:column;gap:10px}
[data-moyun-modal="web-update-announcement"] .moyun-announce-lead{
  margin:0;padding:12px 14px;border-radius:12px;background:var(--accent-soft);
  color:var(--tx2);font-size:13px;line-height:1.7;font-weight:600
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-group{
  display:flex;flex-direction:column;gap:4px;margin:6px 0 2px;padding-top:12px;border-top:1px solid var(--bd)
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-group:first-of-type{padding-top:2px;border-top:0}
[data-moyun-modal="web-update-announcement"] .moyun-announce-group-title{
  margin:0;font-size:11px;font-weight:900;letter-spacing:.18em;color:var(--accent)
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-group-desc{
  margin:0;font-size:12px;line-height:1.65;color:var(--tx3)
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item{
  margin:0;padding:12px 14px;border:1px solid var(--bd);border-radius:12px;background:var(--bg)
}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item[data-announce-tone="extra"]{border-left:3px solid var(--warn)}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item[data-announce-tone="new"]{border-left:3px solid var(--accent)}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item[data-announce-tone="fix"]{border-left:3px solid var(--ok)}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item h4{margin:0;font-size:13px;line-height:1.45;font-weight:800;color:var(--tx)}
[data-moyun-modal="web-update-announcement"] .moyun-announce-item p{margin:6px 0 0;font-size:13px;line-height:1.7;color:var(--tx2)}
/* 只放一个窄符号的按钮（✕ 删除示例台词/角色关系/MOD 条目、角色卡展开收起、白鸟浮窗关闭）
   宽度完全由字宽决定，实测移动端只有 8px；桌面保留紧凑尺寸，移动端统一抬到 44px。 */
.moyun-char-card-toggle{min-width:36px;min-height:36px}
.moyun-compact-tap{min-width:26px}
@media(max-width:767px){
  .moyun-char-card-toggle,
  .moyun-compact-tap{min-width:44px;min-height:44px}
  .snowwing-floating-close{width:44px;height:44px;min-width:44px;min-height:44px}
}

/* 插入章节分隔线 */
.insert-line{
  display:flex;align-items:center;justify-content:center;
  padding:10px 0;cursor:pointer;opacity:.55;transition:opacity .2s;
}
.insert-line:hover,.insert-line:active{opacity:1}
.insert-line-bar{flex:1;height:1px;background:var(--bd)}
.insert-line-btn{
  padding:6px 16px;font-size:12px;font-weight:600;color:var(--tx2);
  background:var(--bg);border:1px solid var(--tx4);
  border-radius:999px;white-space:nowrap;
}
.insert-line:hover .insert-line-btn,.insert-line:active .insert-line-btn{
  color:var(--accent);border-color:var(--accent);
}


