@waterwx/dsh-novel-forge 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -63,6 +63,10 @@ window.__ModuleLoader__.load({
63
63
  world: "/api/dsh-novel-forge/world",
64
64
  /** 封面:GET 读取(dataUrl)/ POST 上传或移除。 */
65
65
  cover: "/api/dsh-novel-forge/blurb/cover",
66
+ /** 剧情线管理:增删改 + 关联章节。 */
67
+ plotlines: "/api/dsh-novel-forge/plotlines",
68
+ /** 敏感词检查:全书已写章节或指定文本。 */
69
+ sensitiveCheck: "/api/dsh-novel-forge/sensitive-check",
66
70
  config: "/api/dsh-novel-forge/config",
67
71
  openFolder: "/api/dsh-novel-forge/open-folder"
68
72
  };
@@ -198,6 +202,14 @@ window.__ModuleLoader__.load({
198
202
  async biblePatch(patch) {
199
203
  return postJson(NOVEL_API.biblePatch, patch);
200
204
  }
205
+ /** 剧情线管理:增删改 + 关联章节。 */
206
+ async plotlines(req) {
207
+ return postJson(NOVEL_API.plotlines, req);
208
+ }
209
+ /** 敏感词检查:指定章节 / 任意文本 / 全书。 */
210
+ async sensitiveCheck(req) {
211
+ return postJson(NOVEL_API.sensitiveCheck, req);
212
+ }
201
213
  /** 小说简介:AI 生成/补全(partial 留空 = 全量),或手动保存。 */
202
214
  async blurb(action, text, partial) {
203
215
  return postJson(NOVEL_API.blurb, {
@@ -461,11 +473,53 @@ window.__ModuleLoader__.load({
461
473
  "foreshadow.plantedAt": "埋设于",
462
474
  "foreshadow.setPlanted": "标记已埋设",
463
475
  "foreshadow.setResolved": "标记已回收",
476
+ "tab.facts": "编年录",
477
+ "tab.plotlines": "剧情线",
478
+ "plotlines.hint": "主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。",
479
+ "plotlines.empty": "还没有剧情线——长篇小说建议先建主线与几条支线。",
480
+ "plotlines.new": "+ 新建剧情线",
481
+ "plotlines.name": "线名",
482
+ "plotlines.kind": "类型",
483
+ "plotlines.kindMain": "主线",
484
+ "plotlines.kindBranch": "支线",
485
+ "plotlines.kindCharacter": "人物线",
486
+ "plotlines.kindMystery": "悬念线",
487
+ "plotlines.goal": "目标/终点",
488
+ "plotlines.progress": "当前进度",
489
+ "plotlines.status": "状态",
490
+ "plotlines.statusActive": "推进中",
491
+ "plotlines.statusPaused": "暂停",
492
+ "plotlines.statusResolved": "已完结",
493
+ "plotlines.statusAbandoned": "已废弃",
494
+ "plotlines.save": "保存",
495
+ "plotlines.cancel": "取消",
496
+ "plotlines.edit": "编辑",
497
+ "plotlines.remove": "删除",
498
+ "plotlines.linkChapter": "关联本章",
499
+ "plotlines.chapters": "已关联",
500
+ "plotlines.workflowTitle": "剧情线进度",
501
+ "plotlines.workflowEmpty": "未建剧情线(去「剧情线」页创建)",
502
+ "sensitive.title": "敏感词检查",
503
+ "sensitive.scanAll": "🔞 全书敏感词检查",
504
+ "sensitive.hint": "内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。",
505
+ "sensitive.clean": "✅ 未命中任何违禁词(扫描 {n} 章)",
506
+ "sensitive.hits": "命中 {n} 处({chapters} 章受影响)",
507
+ "sensitive.goFix": "去修订",
508
+ "sensitive.fixPrefill": "请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。",
509
+ "facts.title": "编年录 / 时间线({n} 条)",
510
+ "facts.hint": "每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。",
511
+ "facts.backfill": "回填历史章节事实",
512
+ "facts.backfilled": "已从历史章节回填 {n} 条事实",
464
513
  "settings.title": "设置",
465
514
  "settings.outlinePath": "默认大纲路径",
466
515
  "settings.outputDir": "输出目录",
467
516
  "settings.provider": "模型提供商",
468
517
  "settings.model": "模型",
518
+ "settings.theme": "主题",
519
+ "settings.themeLiquid": "iOS 液态玻璃(绿)",
520
+ "settings.themeClassic": "经典毛玻璃(蓝)",
521
+ "settings.themeNeumorph": "新拟物(双阴影)",
522
+ "settings.themeHint": "存于浏览器本地,即时生效",
469
523
  "settings.chapterChars": "每章目标字数",
470
524
  "settings.maxTokens": "单章最大输出 tokens",
471
525
  "settings.reviewPassScore": "审稿通过分数(0-100)",
@@ -599,6 +653,11 @@ window.__ModuleLoader__.load({
599
653
  "settings.outputDir": "Output directory",
600
654
  "settings.provider": "Provider",
601
655
  "settings.model": "Model",
656
+ "settings.theme": "Theme",
657
+ "settings.themeLiquid": "iOS Liquid Glass (green)",
658
+ "settings.themeClassic": "Classic frosted (blue)",
659
+ "settings.themeNeumorph": "Neumorphism (dual-shadow)",
660
+ "settings.themeHint": "Stored in browser localStorage; applies instantly",
602
661
  "settings.chapterChars": "Chars per chapter",
603
662
  "settings.maxTokens": "Max output tokens",
604
663
  "settings.reviewPassScore": "Review pass score (0-100)",
@@ -612,6 +671,43 @@ window.__ModuleLoader__.load({
612
671
  "settings.exportTxt": "Export TXT",
613
672
  "settings.exportMd": "Export Markdown",
614
673
  "settings.exported": "Exported: {file} ({chars} chars, {chapters} chapters)",
674
+ "tab.facts": "Chronicle",
675
+ "tab.plotlines": "Plotlines",
676
+ "plotlines.hint": "Track main/branch/character/mystery arcs: unfinished arcs are injected into chapter writing so each chapter advances at least one; linked chapters record progress nodes.",
677
+ "plotlines.empty": "No plotlines yet — consider creating the main arc and a few branches.",
678
+ "plotlines.new": "+ New plotline",
679
+ "plotlines.name": "Name",
680
+ "plotlines.kind": "Type",
681
+ "plotlines.kindMain": "Main",
682
+ "plotlines.kindBranch": "Branch",
683
+ "plotlines.kindCharacter": "Character",
684
+ "plotlines.kindMystery": "Mystery",
685
+ "plotlines.goal": "Goal",
686
+ "plotlines.progress": "Current progress",
687
+ "plotlines.status": "Status",
688
+ "plotlines.statusActive": "Active",
689
+ "plotlines.statusPaused": "Paused",
690
+ "plotlines.statusResolved": "Resolved",
691
+ "plotlines.statusAbandoned": "Abandoned",
692
+ "plotlines.save": "Save",
693
+ "plotlines.cancel": "Cancel",
694
+ "plotlines.edit": "Edit",
695
+ "plotlines.remove": "Remove",
696
+ "plotlines.linkChapter": "Link chapter",
697
+ "plotlines.chapters": "Linked",
698
+ "plotlines.workflowTitle": "Plotline progress",
699
+ "plotlines.workflowEmpty": "No plotlines yet (create them in the Plotlines tab)",
700
+ "sensitive.title": "Sensitive-word check",
701
+ "sensitive.scanAll": "🔞 Scan all chapters",
702
+ "sensitive.hint": "Built-in banned-word library (politics/erotica/violence/abuse/ads/other). Run before publishing; suggestions only.",
703
+ "sensitive.clean": "✅ No banned words found ({n} chapters scanned)",
704
+ "sensitive.hits": "{n} hits across {chapters} chapters",
705
+ "sensitive.goFix": "Fix",
706
+ "sensitive.fixPrefill": "Remove or rephrase the banned expression \"{word}\" (category: {category}) with an indirect alternative.",
707
+ "facts.title": "Chronicle / timeline ({n} facts)",
708
+ "facts.hint": "Auto-extracted established facts per chapter (state/resources/relations/foreshadow landings); the latest 20 are injected into later chapters for consistency.",
709
+ "facts.backfill": "Backfill facts from historical chapters",
710
+ "facts.backfilled": "Backfilled {n} facts from historical chapters",
615
711
  "progress.generating": "Writing chapter {no} “{title}”…",
616
712
  "progress.done": "Chapter {no} done ({chars} chars) → {file}",
617
713
  "progress.reviewed": "Chapter {no} review: {score} — {verdict}",
@@ -645,7 +741,7 @@ window.__ModuleLoader__.load({
645
741
  }
646
742
  //#endregion
647
743
  //#region \0dsh-css:C:\Users\Ryan\Desktop\111\novel-forge\src\client\panel\panel.module.css.mjs
648
- const css = ".CUIYUW_entry{width:100%;color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:13px;transition:background .15s;display:flex}body[data-ds-dark-theme] .CUIYUW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.CUIYUW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.CUIYUW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.CUIYUW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.CUIYUW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.CUIYUW_view{z-index:60;color-scheme:light;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-hover:#0000000d;--nf-success:#34c759;--nf-error:#ff3b30;--nf-warn:#ff9500;--nf-info:#5856d6;--nf-shadow:0 1px 3px #0000000f, 0 12px 32px #00000014;--nf-shadow-lg:0 4px 12px #00000012, 0 20px 48px #0000001f;background:var(--nf-bg);backdrop-filter:blur(32px)saturate(180%);color:var(--nf-text);font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,SF Pro SC,PingFang SC,Segoe UI,Roboto,Helvetica Neue,sans-serif;display:none;position:absolute;inset:0;overflow:auto}body[data-ds-dark-theme] .CUIYUW_view{color-scheme:dark;--nf-bg:#000000b8;--nf-bg-raise:#1c1c1ec7;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff47;--nf-text:#f2f2f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b8;--nf-text-3:#8e8e93;--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-hover:#ffffff17;--nf-success:#30d158;--nf-error:#ff453a;--nf-warn:#ff9f0a;--nf-info:#bf5af2;--nf-shadow:0 1px 2px #00000059, 0 10px 30px #0006;--nf-shadow-lg:0 4px 12px #0006, 0 20px 48px #0000008c}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .CUIYUW_view{display:block}.CUIYUW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative}.CUIYUW_panelHeader{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);z-index:5;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 18px;display:flex;position:sticky;top:0}.CUIYUW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.CUIYUW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.CUIYUW_iconButton{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px;padding:4px 9px;font-size:16px;transition:background .15s,color .15s}.CUIYUW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.CUIYUW_tabBar{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;gap:2px;padding:8px 14px 0;display:flex;position:sticky;top:45px}.CUIYUW_tab{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px 8px 0 0;padding:7px 13px;font-size:13.5px;font-weight:500;transition:color .15s,background .15s;position:relative}.CUIYUW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_tab[data-active]{color:var(--nf-accent);font-weight:600}.CUIYUW_tab[data-active]:after{content:\"\";background:var(--nf-accent);border-radius:2px 2px 0 0;height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.CUIYUW_panelContent{flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;overflow:auto}.CUIYUW_panelBody{flex:1;min-height:0;display:flex}.CUIYUW_panelNav{border-right:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);flex-direction:column;flex:none;gap:2px;width:142px;padding:10px 8px;transition:width .18s;display:flex;overflow-y:auto}.CUIYUW_panelNavCollapsed{width:52px;padding:10px 6px}.CUIYUW_navGroup{flex-direction:column;gap:2px;display:flex}.CUIYUW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:6px 10px 2px;font-size:10.5px;font-weight:600}.CUIYUW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.CUIYUW_navSpacer{flex:1;min-height:8px}.CUIYUW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.CUIYUW_navAboutRow{cursor:pointer;color:var(--nf-text-3);text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:8px;justify-content:space-between;align-items:center;gap:4px;padding:4px 6px;font-size:11px;transition:color .15s,background .15s;display:flex}.CUIYUW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_navAboutUpdate{background:var(--nf-accent-soft);color:var(--nf-accent);cursor:pointer;text-align:left;white-space:nowrap;border:none;border-radius:8px;padding:4px 6px;font-size:10.5px;font-weight:600}.CUIYUW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.CUIYUW_panelNavCollapsed .CUIYUW_navAbout{align-items:center;padding:6px 2px 2px}.CUIYUW_panelNavCollapsed .CUIYUW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.CUIYUW_navTabBadge{background:var(--nf-accent);color:#fff;text-align:center;border-radius:999px;flex:none;min-width:18px;height:18px;margin-left:auto;padding:0 5px;font-size:10.5px;font-weight:700;line-height:18px;display:inline-block}.CUIYUW_panelNavCollapsed .CUIYUW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.CUIYUW_navTabBadgeDanger{background:var(--nf-error)}.CUIYUW_navTabBadgeWarn{background:var(--nf-warn)}.CUIYUW_navTabBadgeDone{background:var(--nf-success)}.CUIYUW_navTab{cursor:pointer;width:100%;color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:8px 10px;font-size:13px;font-weight:500;transition:color .15s,background .15s;display:flex;position:relative}.CUIYUW_panelNavCollapsed .CUIYUW_navTab{justify-content:center;padding:8px 0}.CUIYUW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_navTab[data-active]{color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.CUIYUW_navTab[data-active]:before{content:\"\";background:var(--nf-accent);border-radius:999px;width:3px;position:absolute;top:20%;bottom:20%;left:-8px}.CUIYUW_panelNavCollapsed .CUIYUW_navTab[data-active]:before{left:-6px}.CUIYUW_navTabIcon{flex:none;font-size:15px;line-height:1}.CUIYUW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.CUIYUW_headerProgress{color:var(--nf-text-2);white-space:nowrap;align-items:center;gap:6px;margin-left:4px;font-size:12px;font-weight:400;display:inline-flex}.CUIYUW_headerProgress b{color:var(--nf-accent);font-weight:700}.CUIYUW_headerProgressDot{background:var(--nf-border-strong,var(--nf-text-3));border-radius:50%;width:3px;height:3px;display:inline-block}.CUIYUW_card{border:1px solid var(--nf-border);background:var(--nf-bg-raise);box-shadow:var(--nf-shadow);backdrop-filter:blur(24px)saturate(180%);border-radius:20px;flex-direction:column;gap:10px;padding:16px 18px;transition:border-color .2s,box-shadow .2s;display:flex}.CUIYUW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.CUIYUW_button{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);cursor:pointer;white-space:nowrap;border-radius:12px;padding:6px 14px;font-size:13px;font-weight:500;transition:background .15s,border-color .15s,transform .1s,box-shadow .15s}.CUIYUW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.CUIYUW_button:active:not([disabled]){transform:scale(.96)}.CUIYUW_button[disabled]{opacity:.45;cursor:not-allowed}.CUIYUW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 88%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 2px 8px color-mix(in srgb, var(--nf-accent) 35%, transparent);border-color:#0000}.CUIYUW_buttonPrimary:hover:not([disabled]){background:linear-gradient(180deg, var(--nf-accent-hover), color-mix(in srgb, var(--nf-accent-hover) 85%, #000));border-color:#0000}.CUIYUW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.CUIYUW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.CUIYUW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.CUIYUW_field{flex-direction:column;gap:5px;display:flex}.CUIYUW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.CUIYUW_input{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;border-radius:12px;width:100%;padding:7px 11px;font-size:13px;transition:border-color .15s,box-shadow .15s}.CUIYUW_input:focus,.CUIYUW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.CUIYUW_input::placeholder,.CUIYUW_textarea::placeholder{color:var(--nf-text-3)}.CUIYUW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;resize:vertical;border-radius:12px;width:100%;min-height:200px;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.7;transition:border-color .15s,box-shadow .15s}.CUIYUW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.CUIYUW_spaceBetween{justify-content:space-between}.CUIYUW_chapterList{flex-direction:column;gap:8px;display:flex}.CUIYUW_volumeGroup{flex-direction:column;gap:6px;display:flex}.CUIYUW_volumeGroupHeader{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:13px;transition:border-color .15s;display:flex}.CUIYUW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.CUIYUW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.CUIYUW_chapter{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:10px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .15s,box-shadow .15s,transform .1s;display:flex}.CUIYUW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.CUIYUW_chapterNum{background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:28px;height:28px;color:var(--nf-text-2);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0 8px;font-size:12px;font-weight:700;display:inline-flex}.CUIYUW_chapterMain{flex:1;min-width:0}.CUIYUW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.CUIYUW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.CUIYUW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.CUIYUW_chapter:hover .CUIYUW_chapterActions{opacity:1}.CUIYUW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.CUIYUW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.CUIYUW_badgeGenerating{color:var(--nf-accent);border-color:var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 12%, transparent);animation:1.2s ease-in-out infinite CUIYUW_pulse}.CUIYUW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.CUIYUW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.CUIYUW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.CUIYUW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.CUIYUW_reviewBox{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-size:12.5px;display:flex}.CUIYUW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;margin:0;padding:10px 12px;font-family:inherit;font-size:12.5px;line-height:1.8;overflow:auto}.CUIYUW_chatScroll{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex-direction:column;flex:1;gap:10px;min-height:240px;max-height:480px;padding:14px;display:flex;overflow-y:auto}.CUIYUW_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:90%;color:var(--nf-accent-fg);border-radius:14px 14px 4px;align-self:flex-end;padding:9px 14px;font-size:13px;box-shadow:0 2px 6px #4d6bfe33}.CUIYUW_chatBubbleAssistant{background:var(--nf-bg-raise);max-width:92%;color:var(--nf-text);border:1px solid var(--nf-border);box-shadow:var(--nf-shadow);border-radius:14px 14px 14px 4px;align-self:flex-start;padding:9px 14px;font-size:13px}.CUIYUW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.CUIYUW_toolLive{background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);border-radius:8px;max-height:180px;margin-top:6px;padding:8px 10px;font-size:12px;line-height:1.7;overflow-y:auto}.CUIYUW_assistantStatus{color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:999px;flex:none;align-items:center;gap:6px;margin-top:6px;padding:6px 12px;font-size:12px;display:flex}.CUIYUW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.CUIYUW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.CUIYUW_toolStep{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:8px;padding:5px 10px;font-size:12px;display:flex}.CUIYUW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.CUIYUW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.CUIYUW_toolStepIcon{flex:none;font-size:13px}.CUIYUW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.CUIYUW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.CUIYUW_toolStepActive .CUIYUW_toolStepStatus{color:var(--nf-accent)}.CUIYUW_toolStepError .CUIYUW_toolStepStatus{color:var(--nf-error)}.CUIYUW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.CUIYUW_progress{border:1px solid var(--nf-border);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);background:var(--nf-bg-inset);border-radius:10px;padding:10px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.8;overflow:auto}.CUIYUW_progressLine{color:var(--nf-text-2);opacity:.9}.CUIYUW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.CUIYUW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.CUIYUW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.CUIYUW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.CUIYUW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.CUIYUW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.CUIYUW_bigProgressBarFill{background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));border-radius:999px;height:100%;transition:width .3s;display:block}.CUIYUW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.CUIYUW_legendOld{color:var(--nf-error);font-weight:700}.CUIYUW_legendNew{color:var(--nf-success);font-weight:700}.CUIYUW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.CUIYUW_diffList{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;gap:8px;max-height:70vh;padding:10px 12px;font-size:13px;line-height:1.7;display:flex;overflow-y:auto}.CUIYUW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.CUIYUW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.CUIYUW_diffSameBody{white-space:pre-wrap;margin-top:6px}.CUIYUW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.CUIYUW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.CUIYUW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.CUIYUW_diffTagOld,.CUIYUW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.CUIYUW_diffTagOld{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-error) 45%, transparent)}.CUIYUW_diffTagNew{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-success) 45%, transparent)}.CUIYUW_diffOld{color:var(--nf-error);white-space:pre-wrap;text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 55%, transparent)}.CUIYUW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.CUIYUW_diffDel{border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.CUIYUW_diffAdd{border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.CUIYUW_diffText{white-space:pre-wrap}.CUIYUW_diffDel .CUIYUW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.CUIYUW_diffAdd .CUIYUW_diffText{color:var(--nf-success)}.CUIYUW_wsColumns{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;display:grid}.CUIYUW_wsColumn{flex-direction:column;gap:8px;min-width:0;display:flex}.CUIYUW_wsEditor{resize:vertical;white-space:pre-wrap;flex:1;min-height:50vh;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.75}.CUIYUW_wsSelected{border:1px solid var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);border-radius:6px;max-height:120px;padding:6px 10px;overflow:auto}.CUIYUW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.CUIYUW_wsPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;gap:8px;padding:8px 10px;display:flex}.CUIYUW_wsPreviewText{white-space:pre-wrap;max-height:55vh;color:var(--nf-text);margin:0;font-size:13px;line-height:1.7;overflow:auto}.CUIYUW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.CUIYUW_assetStat{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.CUIYUW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.CUIYUW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.CUIYUW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.CUIYUW_dashHero{border:1px solid var(--nf-border);background:radial-gradient(1200px 400px at 110% -60%, color-mix(in srgb, var(--nf-accent) 16%, transparent), transparent 60%), linear-gradient(135deg, var(--nf-bg-raise), color-mix(in srgb, var(--nf-accent) 5%, var(--nf-bg-raise)));box-shadow:var(--nf-shadow);border-radius:16px;flex-direction:column;gap:14px;padding:18px 20px;display:flex}.CUIYUW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.CUIYUW_dashHeroSparkle{font-size:14px}.CUIYUW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.CUIYUW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.CUIYUW_dashHeroAction{border:1px solid var(--nf-border);background:color-mix(in srgb, var(--nf-bg-base) 65%, transparent);border-radius:12px;align-items:center;gap:12px;padding:10px 14px;display:flex}.CUIYUW_dashHeroArrow{background:var(--nf-accent);color:#fff;border-radius:50%;flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:inline-flex}.CUIYUW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.CUIYUW_dashHeroActionTitle{font-size:14px;font-weight:600}.CUIYUW_dashJourney{flex-direction:column;gap:6px;display:flex}.CUIYUW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.CUIYUW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.CUIYUW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.CUIYUW_dashStage{color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;align-items:center;gap:3px;font-size:11px;display:flex}.CUIYUW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:10px;display:inline-flex}.CUIYUW_dashStageDone{color:var(--nf-text-2)}.CUIYUW_dashStageDone .CUIYUW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.CUIYUW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.CUIYUW_dashStageCurrent .CUIYUW_dashStageDot{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 18%, transparent)}.CUIYUW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.CUIYUW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.CUIYUW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.CUIYUW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.CUIYUW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.CUIYUW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.CUIYUW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.CUIYUW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.CUIYUW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.CUIYUW_outlineReadonly{border:1px solid var(--nf-border);background:var(--nf-bg-inset);white-space:pre-wrap;user-select:text;border-radius:12px;max-height:480px;margin:0;padding:12px 14px;font-size:12.5px;line-height:1.8;overflow:auto}.CUIYUW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.CUIYUW_assistantFloat{z-index:80;border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);border-radius:16px;flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.CUIYUW_assistantFloatHeader{cursor:grab;user-select:none;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px 8px 14px;font-size:13px;font-weight:600;display:flex}.CUIYUW_assistantFloatHeader:active{cursor:grabbing}.CUIYUW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.CUIYUW_assistantFloatBody>*{flex:1;min-width:0}.CUIYUW_assistantResize{cursor:nwse-resize;background:linear-gradient(135deg, transparent 0 55%, var(--nf-border-strong) 55% 62%, transparent 62%) no-repeat 4px 4px / 12px 12px;width:20px;height:20px;position:absolute;bottom:0;right:0}.CUIYUW_coverPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex:none;justify-content:center;align-items:center;width:150px;height:200px;display:flex;overflow:hidden}.CUIYUW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.CUIYUW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.CUIYUW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.CUIYUW_shelfHeader{flex-direction:column;gap:2px;display:flex}.CUIYUW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.CUIYUW_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;border-radius:16px;flex-direction:column;gap:8px;padding:12px;transition:border-color .15s,transform .1s,box-shadow .15s;display:flex}.CUIYUW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.CUIYUW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.CUIYUW_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:12px;flex:none;justify-content:center;align-items:center;display:flex;overflow:hidden}.CUIYUW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.CUIYUW_bookCardCoverFallback{background:radial-gradient(400px 200px at 80% -20%, color-mix(in srgb, var(--nf-accent) 25%, transparent), transparent 70%), linear-gradient(155deg, var(--nf-bg-inset), color-mix(in srgb, var(--nf-accent) 10%, var(--nf-bg-inset)));flex-direction:column;justify-content:center;align-items:center;gap:6px;width:100%;height:100%;display:flex}.CUIYUW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.CUIYUW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.CUIYUW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.CUIYUW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.CUIYUW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.CUIYUW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.CUIYUW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.CUIYUW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.CUIYUW_bookAddCard:hover{color:var(--nf-accent)}.CUIYUW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.CUIYUW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.CUIYUW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.CUIYUW_createBookTop{align-items:center;display:flex}.CUIYUW_createBookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);width:min(520px,100%);box-shadow:var(--nf-shadow-lg);border-radius:20px;flex-direction:column;align-self:center;gap:12px;padding:26px 28px;display:flex}.CUIYUW_createBookIcon{font-size:34px;line-height:1}.CUIYUW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.CUIYUW_progressLineDone{color:var(--nf-success);font-weight:600}.CUIYUW_progressLineError{color:var(--nf-error);font-weight:600}.CUIYUW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.CUIYUW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.CUIYUW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.CUIYUW_panelContent::-webkit-scrollbar,.CUIYUW_chatScroll::-webkit-scrollbar,.CUIYUW_chapterPreview::-webkit-scrollbar,.CUIYUW_progress::-webkit-scrollbar,.CUIYUW_toolLive::-webkit-scrollbar{width:8px;height:8px}.CUIYUW_panelContent::-webkit-scrollbar-thumb,.CUIYUW_chatScroll::-webkit-scrollbar-thumb,.CUIYUW_chapterPreview::-webkit-scrollbar-thumb,.CUIYUW_progress::-webkit-scrollbar-thumb,.CUIYUW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.CUIYUW_panelContent::-webkit-scrollbar-thumb:hover,.CUIYUW_chatScroll::-webkit-scrollbar-thumb:hover,.CUIYUW_chapterPreview::-webkit-scrollbar-thumb:hover,.CUIYUW_progress::-webkit-scrollbar-thumb:hover,.CUIYUW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.CUIYUW_workflowList{flex-direction:column;gap:0;display:flex}.CUIYUW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.CUIYUW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.CUIYUW_workflowRow:last-child:before{display:none}.CUIYUW_workflowDot{border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);width:28px;height:28px;color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:inline-flex}.CUIYUW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.CUIYUW_workflowDotActive{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);box-shadow:0 0 0 4px var(--nf-accent-soft)}.CUIYUW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.CUIYUW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.CUIYUW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes CUIYUW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes CUIYUW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.CUIYUW_card{animation:.2s CUIYUW_fadeIn}.CUIYUW_bookshelf{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:10px;padding:8px 18px;display:flex}.CUIYUW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.CUIYUW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.CUIYUW_bookChip{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;border-radius:999px;align-items:center;gap:6px;max-width:220px;padding:4px 8px 4px 10px;font-size:12px;transition:border-color .15s,background .15s;display:flex}.CUIYUW_bookChip:hover{border-color:var(--nf-border-strong)}.CUIYUW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.CUIYUW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.CUIYUW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.CUIYUW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:0 2px;font-size:13px;line-height:1}.CUIYUW_bookChipRemove:hover{color:var(--nf-error)}.CUIYUW_bookAdd{border:1px dashed var(--nf-border-strong);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:999px;padding:4px 12px;font-size:12px;transition:border-color .15s,color .15s}.CUIYUW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.CUIYUW_bookCreateForm{align-items:center;gap:6px;display:flex}.CUIYUW_dropzone{border:2px dashed var(--nf-border-strong);text-align:center;color:var(--nf-text-2);cursor:pointer;border-radius:10px;flex-direction:column;align-items:center;gap:6px;padding:18px 14px;font-size:13px;transition:border-color .15s,background .15s;display:flex}.CUIYUW_dropzone:hover,.CUIYUW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.CUIYUW_dropzoneIcon{font-size:22px;line-height:1}";
744
+ const css = ".CUIYUW_entry{width:100%;color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:13px;transition:background .15s;display:flex}body[data-ds-dark-theme] .CUIYUW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.CUIYUW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.CUIYUW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.CUIYUW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.CUIYUW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.CUIYUW_view{z-index:60;color-scheme:light;--nf-font:-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;--nf-font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#00b85c;--nf-accent-hover:#00a04e;--nf-accent-soft:#00b85c1f;--nf-accent-fg:#fff;--nf-hover:#0000000d;--nf-success:#34c759;--nf-error:#ff3b30;--nf-warn:#ff9500;--nf-info:#00b85c;--nf-shadow:0 1px 3px #0000000f, 0 12px 32px #00000014;--nf-shadow-lg:0 4px 12px #00000012, 0 20px 48px #0000001f;--nf-card-shadow:0 2px 6px #0000000f, 0 14px 38px #00000024;--nf-card-shadow-hover:0 4px 10px #00000014, 0 22px 52px #0003;--nf-glass-face:linear-gradient(180deg, #f6f7f9 0%, #f0f2f5 26%, #e9ebef 52%, #e0e3e8 78%, #d6d9df 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff80 0%, #ffffff38 45%, #fff0 78%);--nf-glass-sheen:#ffffff8c;--nf-glass-border:#ffffffa6;--nf-glass-inset:#ffffff8c;--nf-glass-orb-a:#00b85c24;--nf-glass-orb-b:#78a0ff1a;--nf-glass-noise:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E\");background:var(--nf-bg);backdrop-filter:blur(32px)saturate(180%);color:var(--nf-text);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Roboto,Helvetica Neue,sans-serif;display:none;position:absolute;inset:0;overflow:auto}body[data-ds-dark-theme] .CUIYUW_view{color-scheme:dark;--nf-bg:#0a0b0ddb;--nf-bg-raise:#1c1c1ec7;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff47;--nf-text:#f2f2f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b8;--nf-text-3:#8e8e93;--nf-accent:#35d07a;--nf-accent-hover:#5ce695;--nf-accent-soft:#35d07a33;--nf-accent-fg:#062b18;--nf-hover:#ffffff17;--nf-success:#30d158;--nf-error:#ff453a;--nf-warn:#ff9f0a;--nf-info:#35d07a;--nf-shadow:0 1px 2px #00000059, 0 10px 30px #0006;--nf-shadow-lg:0 4px 12px #0006, 0 20px 48px #0000008c;--nf-card-shadow:0 2px 6px #00000059, 0 14px 38px #00000073;--nf-card-shadow-hover:0 4px 10px #0006, 0 22px 52px #0000008c;--nf-glass-face:linear-gradient(180deg, #70747a6b 0%, #60646a6b 26%, #52555a6b 52%, #44474c6b 78%, #383a3f6b 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff42 0%, #ffffff1a 45%, #fff0 78%);--nf-glass-sheen:#ffffff42;--nf-glass-border:#ffffff24;--nf-glass-inset:#ffffff12;--nf-glass-orb-a:#00ca5233;--nf-glass-orb-b:#bec8d712;--nf-glass-noise:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E\")}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .CUIYUW_view{display:block}.CUIYUW_panel[data-nf-theme=classic]{--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-info:#5856d6;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=classic]{--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-info:#bf5af2;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph]{--nf-bg:#e4e9f2;--nf-bg-raise:#e4e9f2;--nf-bg-inset:#d9dfe8;--nf-border:#8c9baf59;--nf-border-strong:#78879e80;--nf-text:#3a4250;--nf-text-2:#5b6472;--nf-text-2-alpha:#465060b3;--nf-text-3:#8b94a3;--nf-hover:#5a697d14;--nf-shadow:4px 4px 10px #a3b1c68c, -4px -4px 10px #ffffffd9;--nf-shadow-lg:6px 6px 14px #a3b1c699, -6px -6px 14px #ffffffe6;--nf-card-shadow:9px 9px 18px #a3b1c68c, -9px -9px 18px #ffffffd9;--nf-card-shadow-hover:12px 12px 24px #a3b1c6a6, -12px -12px 24px #fffffff2;--nf-glass-face:#e4e9f2;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#a3b1c666;--nf-glass-inset:#d9dfe8;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph]{--nf-bg:#2b2f36;--nf-bg-raise:#2b2f36;--nf-bg-inset:#25292f;--nf-border:#0a0c1080;--nf-border-strong:#080a0e99;--nf-text:#d6dae1;--nf-text-2:#a8aeb8;--nf-text-2-alpha:#a8aeb8b3;--nf-text-3:#757c88;--nf-hover:#ffffff0d;--nf-shadow:4px 4px 10px #00000080, -4px -4px 10px #6068763d;--nf-shadow-lg:6px 6px 14px #0000008c, -6px -6px 14px #60687642;--nf-card-shadow:9px 9px 18px #00000080, -9px -9px 18px #6068763d;--nf-card-shadow-hover:12px 12px 24px #0009, -12px -12px 24px #60687647;--nf-glass-face:#2b2f36;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#0c0e1273;--nf-glass-inset:#25292f;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_input,body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_input:focus,body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #a3b1c680, inset -2px -2px 6px #ffffffd9, 0 0 0 3px var(--nf-accent-soft)}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_input,body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_input:focus,body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #00000080, inset -2px -2px 6px #60687638, 0 0 0 3px var(--nf-accent-soft)}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #a3b1c68c,-5px -5px 10px #ffffffe6}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #a3b1c699,-7px -7px 14px #fffffff2}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_buttonPrimary{background:linear-gradient(#00c563,#00a952);box-shadow:5px 5px 10px #a3b1c699,-5px -5px 10px #ffffffd9}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #0000008c,-7px -7px 14px #60687642}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .CUIYUW_panel[data-nf-theme=neumorph] .CUIYUW_buttonPrimary{background:linear-gradient(#3ddc86,#27b96a);box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}.CUIYUW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative;overflow:hidden}.CUIYUW_panel:before{content:\"\";z-index:0;pointer-events:none;background:radial-gradient(46% 36% at 18% 12%, var(--nf-glass-orb-a), transparent 70%), radial-gradient(52% 42% at 88% 22%, var(--nf-glass-orb-b), transparent 72%), radial-gradient(120% 95% at 50% 42%, transparent 55%, #0202031a 100%);position:absolute;inset:0}.CUIYUW_panelHeader{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);z-index:5;border-radius:18px;flex-shrink:0;justify-content:space-between;align-items:center;margin:10px 12px 0;padding:10px 16px;display:flex;position:sticky;top:10px}.CUIYUW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.CUIYUW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.CUIYUW_iconButton{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px;padding:4px 9px;font-size:16px;transition:background .15s,color .15s}.CUIYUW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.CUIYUW_tabBar{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;gap:2px;padding:8px 14px 0;display:flex;position:sticky;top:45px}.CUIYUW_tab{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px 8px 0 0;padding:7px 13px;font-size:13.5px;font-weight:500;transition:color .15s,background .15s;position:relative}.CUIYUW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_tab[data-active]{color:var(--nf-accent);font-weight:600}.CUIYUW_tab[data-active]:after{content:\"\";background:var(--nf-accent);border-radius:2px 2px 0 0;height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.CUIYUW_panelContent{z-index:1;flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;position:relative;overflow:auto}.CUIYUW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.CUIYUW_panelNav{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);width:142px;box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);border-radius:16px;flex-direction:column;flex:none;align-self:flex-start;gap:4px;margin:10px 0 10px 12px;padding:10px 8px;transition:width .18s;display:flex;overflow-y:auto}.CUIYUW_panelNavCollapsed{width:52px;padding:10px 6px}.CUIYUW_navGroup{flex-direction:column;gap:4px;display:flex}.CUIYUW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:8px 10px 3px;font-size:10.5px;font-weight:600}.CUIYUW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.CUIYUW_navSpacer{flex:1;min-height:8px}.CUIYUW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.CUIYUW_navAboutRow{cursor:pointer;color:var(--nf-text-3);text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:8px;justify-content:space-between;align-items:center;gap:4px;padding:4px 6px;font-size:11px;transition:color .15s,background .15s;display:flex}.CUIYUW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_navAboutUpdate{background:var(--nf-accent-soft);color:var(--nf-accent);cursor:pointer;text-align:left;white-space:nowrap;border:none;border-radius:8px;padding:4px 6px;font-size:10.5px;font-weight:600}.CUIYUW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.CUIYUW_panelNavCollapsed .CUIYUW_navAbout{align-items:center;padding:6px 2px 2px}.CUIYUW_panelNavCollapsed .CUIYUW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.CUIYUW_navTabBadge{background:var(--nf-accent);color:#fff;text-align:center;border-radius:999px;flex:none;min-width:18px;height:18px;margin-left:auto;padding:0 5px;font-size:10.5px;font-weight:700;line-height:18px;display:inline-block}.CUIYUW_panelNavCollapsed .CUIYUW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.CUIYUW_navTabBadgeDanger{background:var(--nf-error)}.CUIYUW_navTabBadgeWarn{background:var(--nf-warn)}.CUIYUW_navTabBadgeDone{background:var(--nf-success)}.CUIYUW_navTab{cursor:pointer;width:100%;color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:8px 10px;font-size:13px;font-weight:500;transition:color .15s,background .15s;display:flex;position:relative}.CUIYUW_panelNavCollapsed .CUIYUW_navTab{justify-content:center;padding:8px 0}.CUIYUW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.CUIYUW_navTab[data-active]{color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.CUIYUW_navTab[data-active]:before{content:\"\";background:var(--nf-accent);border-radius:999px;width:3px;position:absolute;top:20%;bottom:20%;left:-8px}.CUIYUW_panelNavCollapsed .CUIYUW_navTab[data-active]:before{left:-6px}.CUIYUW_navTabIcon{flex:none;font-size:15px;line-height:1}.CUIYUW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.CUIYUW_panelSubtitle{color:var(--nf-text-2);white-space:nowrap;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:0 4px 2px;font-size:12px;display:flex}.CUIYUW_headerProgress{color:var(--nf-text-2);white-space:nowrap;align-items:center;gap:6px;margin-left:0;font-size:12px;font-weight:400;display:inline-flex}.CUIYUW_headerProgress b{color:var(--nf-accent);font-weight:700}.CUIYUW_headerProgressDot{background:var(--nf-border-strong,var(--nf-text-3));border-radius:50%;width:3px;height:3px;display:inline-block}.CUIYUW_card{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:10px;padding:16px 18px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.CUIYUW_card:before{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.CUIYUW_card:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.CUIYUW_card:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.CUIYUW_card>*{z-index:1;position:relative}.CUIYUW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.CUIYUW_button{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);cursor:pointer;white-space:nowrap;border-radius:12px;padding:6px 14px;font-size:13px;font-weight:500;transition:background .15s,border-color .15s,transform .1s,box-shadow .15s}.CUIYUW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.CUIYUW_button:active:not([disabled]){transform:scale(.96)}.CUIYUW_button[disabled]{opacity:.45;cursor:not-allowed}.CUIYUW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 88%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 2px 10px color-mix(in srgb, var(--nf-accent) 45%, transparent), 0 0 0 .5px color-mix(in srgb, var(--nf-accent) 30%, transparent);border-color:#0000}.CUIYUW_buttonPrimary:hover:not([disabled]){background:linear-gradient(180deg, var(--nf-accent-hover), color-mix(in srgb, var(--nf-accent-hover) 85%, #000));border-color:#0000}.CUIYUW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.CUIYUW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.CUIYUW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.CUIYUW_field{flex-direction:column;gap:5px;display:flex}.CUIYUW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.CUIYUW_input{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;border-radius:12px;width:100%;padding:7px 11px;font-size:13px;transition:border-color .15s,box-shadow .15s}.CUIYUW_input:focus,.CUIYUW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.CUIYUW_input::placeholder,.CUIYUW_textarea::placeholder{color:var(--nf-text-3)}.CUIYUW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;resize:vertical;border-radius:12px;width:100%;min-height:200px;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.7;transition:border-color .15s,box-shadow .15s}.CUIYUW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.CUIYUW_spaceBetween{justify-content:space-between}.CUIYUW_chapterList{flex-direction:column;gap:8px;display:flex}.CUIYUW_volumeGroup{flex-direction:column;gap:6px;display:flex}.CUIYUW_volumeGroupHeader{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:13px;transition:border-color .15s;display:flex}.CUIYUW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.CUIYUW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.CUIYUW_chapter{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:10px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .15s,box-shadow .15s,transform .1s;display:flex}.CUIYUW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.CUIYUW_chapterNum{background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:28px;height:28px;color:var(--nf-text-2);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0 8px;font-size:12px;font-weight:700;display:inline-flex}.CUIYUW_chapterMain{flex:1;min-width:0}.CUIYUW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.CUIYUW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.CUIYUW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.CUIYUW_chapter:hover .CUIYUW_chapterActions{opacity:1}.CUIYUW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.CUIYUW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.CUIYUW_badgeGenerating{color:var(--nf-accent);border-color:var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 12%, transparent);animation:1.2s ease-in-out infinite CUIYUW_pulse}.CUIYUW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.CUIYUW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.CUIYUW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.CUIYUW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.CUIYUW_reviewBox{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-size:12.5px;display:flex}.CUIYUW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;margin:0;padding:10px 12px;font-family:inherit;font-size:12.5px;line-height:1.8;overflow:auto}.CUIYUW_chatScroll{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex-direction:column;flex:1;gap:10px;min-height:240px;max-height:480px;padding:14px;display:flex;overflow-y:auto}.CUIYUW_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:90%;color:var(--nf-accent-fg);border-radius:14px 14px 4px;align-self:flex-end;padding:9px 14px;font-size:13px;box-shadow:0 2px 6px #4d6bfe33}.CUIYUW_chatBubbleAssistant{background:var(--nf-bg-raise);max-width:92%;color:var(--nf-text);border:1px solid var(--nf-border);box-shadow:var(--nf-shadow);border-radius:14px 14px 14px 4px;align-self:flex-start;padding:9px 14px;font-size:13px}.CUIYUW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.CUIYUW_toolLive{background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);border-radius:8px;max-height:180px;margin-top:6px;padding:8px 10px;font-size:12px;line-height:1.7;overflow-y:auto}.CUIYUW_assistantStatus{color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:999px;flex:none;align-items:center;gap:6px;margin-top:6px;padding:6px 12px;font-size:12px;display:flex}.CUIYUW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.CUIYUW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.CUIYUW_toolStep{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:8px;padding:5px 10px;font-size:12px;display:flex}.CUIYUW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.CUIYUW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.CUIYUW_toolStepIcon{flex:none;font-size:13px}.CUIYUW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.CUIYUW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.CUIYUW_toolStepActive .CUIYUW_toolStepStatus{color:var(--nf-accent)}.CUIYUW_toolStepError .CUIYUW_toolStepStatus{color:var(--nf-error)}.CUIYUW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.CUIYUW_progress{border:1px solid var(--nf-border);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);font-size:12px;font-family:var(--nf-font-mono);background:var(--nf-bg-inset);border-radius:10px;padding:10px 14px;line-height:1.8;overflow:auto}.CUIYUW_progressLine{color:var(--nf-text-2);opacity:.9}.CUIYUW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.CUIYUW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.CUIYUW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.CUIYUW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.CUIYUW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.CUIYUW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.CUIYUW_bigProgressBarFill{background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));border-radius:999px;height:100%;transition:width .3s;display:block}.CUIYUW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.CUIYUW_legendOld{color:var(--nf-error);font-weight:700}.CUIYUW_legendNew{color:var(--nf-success);font-weight:700}.CUIYUW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.CUIYUW_diffList{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;flex:1;gap:8px;min-height:0;padding:10px 12px;font-size:13px;line-height:1.7;display:flex;overflow-y:auto}.CUIYUW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.CUIYUW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.CUIYUW_diffSameBody{white-space:pre-wrap;margin-top:6px}.CUIYUW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.CUIYUW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.CUIYUW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.CUIYUW_diffTagOld,.CUIYUW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.CUIYUW_diffTagOld{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-error) 45%, transparent)}.CUIYUW_diffTagNew{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-success) 45%, transparent)}.CUIYUW_diffOld{color:var(--nf-error);white-space:pre-wrap;text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 55%, transparent)}.CUIYUW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.CUIYUW_diffDel{border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.CUIYUW_diffAdd{border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.CUIYUW_diffText{white-space:pre-wrap}.CUIYUW_diffDel .CUIYUW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.CUIYUW_diffAdd .CUIYUW_diffText{color:var(--nf-success)}.CUIYUW_wsPage{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex}.CUIYUW_wsPageHeader{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.CUIYUW_wsColumns{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;min-height:0;display:grid}.CUIYUW_wsColumn{flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex}.CUIYUW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);white-space:pre-wrap;flex:1;font-size:13px;line-height:1.75}.CUIYUW_wsSelected{border:1px solid var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);border-radius:6px;max-height:120px;padding:6px 10px;overflow:auto}.CUIYUW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.CUIYUW_wsPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;gap:8px;padding:8px 10px;display:flex}.CUIYUW_wsPreviewText{white-space:pre-wrap;min-height:0;color:var(--nf-text);flex:1;margin:0;font-size:13px;line-height:1.7;overflow:auto}.CUIYUW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.CUIYUW_assetStat{border:1px solid var(--nf-glass-border);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);border-radius:14px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.CUIYUW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.CUIYUW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.CUIYUW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.CUIYUW_dashHero{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:14px;padding:18px 20px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.CUIYUW_dashHero:before{content:\"\";border-radius:inherit;pointer-events:none;background:radial-gradient(46% 40% at 92% -10%, color-mix(in srgb, var(--nf-accent) 13%, transparent), transparent 62%), var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.CUIYUW_dashHero:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.CUIYUW_dashHero:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.CUIYUW_dashHero>*{z-index:1;position:relative}.CUIYUW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.CUIYUW_dashHeroSparkle{font-size:14px}.CUIYUW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.CUIYUW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.CUIYUW_dashHeroAction{border:1px solid var(--nf-glass-border);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);border-radius:14px;align-items:center;gap:12px;padding:10px 14px;display:flex}.CUIYUW_dashHeroArrow{background:var(--nf-accent);color:#fff;border-radius:50%;flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:inline-flex}.CUIYUW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.CUIYUW_dashHeroActionTitle{font-size:14px;font-weight:600}.CUIYUW_dashJourney{flex-direction:column;gap:6px;display:flex}.CUIYUW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.CUIYUW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.CUIYUW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.CUIYUW_dashStage{color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;align-items:center;gap:3px;font-size:11px;display:flex}.CUIYUW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:10px;display:inline-flex}.CUIYUW_dashStageDone{color:var(--nf-text-2)}.CUIYUW_dashStageDone .CUIYUW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.CUIYUW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.CUIYUW_dashStageCurrent .CUIYUW_dashStageDot{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 18%, transparent)}.CUIYUW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.CUIYUW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.CUIYUW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.CUIYUW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.CUIYUW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.CUIYUW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.CUIYUW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.CUIYUW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.CUIYUW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.CUIYUW_outlineReadonly{border:1px solid var(--nf-border);background:var(--nf-bg-inset);white-space:pre-wrap;user-select:text;border-radius:12px;max-height:480px;margin:0;padding:12px 14px;font-size:12.5px;line-height:1.8;overflow:auto}.CUIYUW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.CUIYUW_assistantFloat{z-index:80;border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);border-radius:16px;flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.CUIYUW_assistantFloatHeader{cursor:grab;user-select:none;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px 8px 14px;font-size:13px;font-weight:600;display:flex}.CUIYUW_assistantFloatHeader:active{cursor:grabbing}.CUIYUW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.CUIYUW_assistantFloatBody>*{flex:1;min-width:0}.CUIYUW_assistantResize{cursor:nwse-resize;background:linear-gradient(135deg, transparent 0 55%, var(--nf-border-strong) 55% 62%, transparent 62%) no-repeat 4px 4px / 12px 12px;width:20px;height:20px;position:absolute;bottom:0;right:0}.CUIYUW_coverPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex:none;justify-content:center;align-items:center;width:150px;height:200px;display:flex;overflow:hidden}.CUIYUW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.CUIYUW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.CUIYUW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.CUIYUW_shelfHeader{flex-direction:column;gap:2px;display:flex}.CUIYUW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.CUIYUW_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;border-radius:16px;flex-direction:column;gap:8px;padding:12px;transition:border-color .15s,transform .1s,box-shadow .15s;display:flex}.CUIYUW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.CUIYUW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.CUIYUW_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:12px;flex:none;justify-content:center;align-items:center;display:flex;overflow:hidden}.CUIYUW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.CUIYUW_bookCardCoverFallback{background:radial-gradient(400px 200px at 80% -20%, color-mix(in srgb, var(--nf-accent) 25%, transparent), transparent 70%), linear-gradient(155deg, var(--nf-bg-inset), color-mix(in srgb, var(--nf-accent) 10%, var(--nf-bg-inset)));flex-direction:column;justify-content:center;align-items:center;gap:6px;width:100%;height:100%;display:flex}.CUIYUW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.CUIYUW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.CUIYUW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.CUIYUW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.CUIYUW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.CUIYUW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.CUIYUW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.CUIYUW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.CUIYUW_bookAddCard:hover{color:var(--nf-accent)}.CUIYUW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.CUIYUW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.CUIYUW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.CUIYUW_createBookTop{align-items:center;display:flex}.CUIYUW_createBookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);width:min(520px,100%);box-shadow:var(--nf-shadow-lg);border-radius:20px;flex-direction:column;align-self:center;gap:12px;padding:26px 28px;display:flex}.CUIYUW_createBookIcon{font-size:34px;line-height:1}.CUIYUW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.CUIYUW_progressLineDone{color:var(--nf-success);font-weight:600}.CUIYUW_progressLineError{color:var(--nf-error);font-weight:600}.CUIYUW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.CUIYUW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.CUIYUW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.CUIYUW_panelContent::-webkit-scrollbar,.CUIYUW_chatScroll::-webkit-scrollbar,.CUIYUW_chapterPreview::-webkit-scrollbar,.CUIYUW_progress::-webkit-scrollbar,.CUIYUW_toolLive::-webkit-scrollbar{width:8px;height:8px}.CUIYUW_panelContent::-webkit-scrollbar-thumb,.CUIYUW_chatScroll::-webkit-scrollbar-thumb,.CUIYUW_chapterPreview::-webkit-scrollbar-thumb,.CUIYUW_progress::-webkit-scrollbar-thumb,.CUIYUW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.CUIYUW_panelContent::-webkit-scrollbar-thumb:hover,.CUIYUW_chatScroll::-webkit-scrollbar-thumb:hover,.CUIYUW_chapterPreview::-webkit-scrollbar-thumb:hover,.CUIYUW_progress::-webkit-scrollbar-thumb:hover,.CUIYUW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.CUIYUW_workflowList{flex-direction:column;gap:0;display:flex}.CUIYUW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.CUIYUW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.CUIYUW_workflowRow:last-child:before{display:none}.CUIYUW_workflowDot{border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);width:28px;height:28px;color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:inline-flex}.CUIYUW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.CUIYUW_workflowDotActive{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);box-shadow:0 0 0 4px var(--nf-accent-soft)}.CUIYUW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.CUIYUW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.CUIYUW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes CUIYUW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes CUIYUW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.CUIYUW_card{animation:.2s CUIYUW_fadeIn}.CUIYUW_bookshelf{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(26px)saturate(175%);z-index:1;border-radius:16px;flex-wrap:wrap;flex-shrink:0;align-items:center;gap:10px;margin:10px 12px 0;padding:8px 14px;display:flex;position:relative}.CUIYUW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.CUIYUW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.CUIYUW_bookChip{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;border-radius:999px;align-items:center;gap:6px;max-width:220px;padding:4px 8px 4px 10px;font-size:12px;transition:border-color .15s,background .15s;display:flex}.CUIYUW_bookChip:hover{border-color:var(--nf-border-strong)}.CUIYUW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.CUIYUW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.CUIYUW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.CUIYUW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:0 2px;font-size:13px;line-height:1}.CUIYUW_bookChipRemove:hover{color:var(--nf-error)}.CUIYUW_bookAdd{border:1px dashed var(--nf-border-strong);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:999px;padding:4px 12px;font-size:12px;transition:border-color .15s,color .15s}.CUIYUW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.CUIYUW_bookCreateForm{align-items:center;gap:6px;display:flex}.CUIYUW_dropzone{border:2px dashed var(--nf-border-strong);text-align:center;color:var(--nf-text-2);cursor:pointer;border-radius:10px;flex-direction:column;align-items:center;gap:6px;padding:18px 14px;font-size:13px;transition:border-color .15s,background .15s;display:flex}.CUIYUW_dropzone:hover,.CUIYUW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.CUIYUW_dropzoneIcon{font-size:22px;line-height:1}";
649
745
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
650
746
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
651
747
  const tag = document.createElement("style");
@@ -655,202 +751,205 @@ window.__ModuleLoader__.load({
655
751
  document.head.appendChild(tag);
656
752
  }
657
753
  var panel_module_css_default = {
658
- "diffNew": "CUIYUW_diffNew",
754
+ "onlyChanges": "CUIYUW_onlyChanges",
755
+ "bookCardCoverTitle": "CUIYUW_bookCardCoverTitle",
756
+ "bookCardTitleRow": "CUIYUW_bookCardTitleRow",
757
+ "diffList": "CUIYUW_diffList",
758
+ "fieldLabel": "CUIYUW_fieldLabel",
759
+ "workflowList": "CUIYUW_workflowList",
760
+ "bookshelf": "CUIYUW_bookshelf",
761
+ "headerProgress": "CUIYUW_headerProgress",
762
+ "progressLine": "CUIYUW_progressLine",
763
+ "navAboutUpdate": "CUIYUW_navAboutUpdate",
764
+ "buttonPrimary": "CUIYUW_buttonPrimary",
765
+ "chapterMain": "CUIYUW_chapterMain",
766
+ "badgeWritten": "CUIYUW_badgeWritten",
767
+ "toolStepIcon": "CUIYUW_toolStepIcon",
768
+ "wsColumns": "CUIYUW_wsColumns",
769
+ "bookChip": "CUIYUW_bookChip",
770
+ "chatBubbleUser": "CUIYUW_chatBubbleUser",
771
+ "navTab": "CUIYUW_navTab",
659
772
  "dashHeroArrow": "CUIYUW_dashHeroArrow",
660
- "workflowDotActive": "CUIYUW_workflowDotActive",
661
- "bookCreateForm": "CUIYUW_bookCreateForm",
662
- "progress": "CUIYUW_progress",
663
- "fileList": "CUIYUW_fileList",
664
- "toolStep": "CUIYUW_toolStep",
665
- "workflowHint": "CUIYUW_workflowHint",
666
- "panelNav": "CUIYUW_panelNav",
667
- "assistantFloat": "CUIYUW_assistantFloat",
668
- "diffColumn": "CUIYUW_diffColumn",
669
- "buttonSmall": "CUIYUW_buttonSmall",
670
- "progressLineError": "CUIYUW_progressLineError",
671
- "chapterBeats": "CUIYUW_chapterBeats",
672
773
  "bookCardName": "CUIYUW_bookCardName",
673
- "toolLive": "CUIYUW_toolLive",
674
- "dropzone": "CUIYUW_dropzone",
675
- "toolSteps": "CUIYUW_toolSteps",
676
- "chapter": "CUIYUW_chapter",
677
- "diffList": "CUIYUW_diffList",
678
- "assistantFloatHeader": "CUIYUW_assistantFloatHeader",
679
- "cardTitle": "CUIYUW_cardTitle",
680
- "dashJourneyBar": "CUIYUW_dashJourneyBar",
681
- "bookCreateCard": "CUIYUW_bookCreateCard",
682
- "assetStatLabel": "CUIYUW_assetStatLabel",
683
- "dashHeroAction": "CUIYUW_dashHeroAction",
684
- "navGroupLabel": "CUIYUW_navGroupLabel",
685
- "liveText": "CUIYUW_liveText",
774
+ "coverPlaceholder": "CUIYUW_coverPlaceholder",
775
+ "bookshelfList": "CUIYUW_bookshelfList",
776
+ "navTabBadgeWarn": "CUIYUW_navTabBadgeWarn",
777
+ "bookCreateForm": "CUIYUW_bookCreateForm",
778
+ "badgeError": "CUIYUW_badgeError",
779
+ "iconButton": "CUIYUW_iconButton",
780
+ "diffTagOld": "CUIYUW_diffTagOld",
781
+ "entryLabel": "CUIYUW_entryLabel",
782
+ "navTabLabel": "CUIYUW_navTabLabel",
686
783
  "busyRow": "CUIYUW_busyRow",
687
- "badgeRejected": "CUIYUW_badgeRejected",
784
+ "bookCardCover": "CUIYUW_bookCardCover",
688
785
  "bookCardBlurb": "CUIYUW_bookCardBlurb",
689
- "createBookView": "CUIYUW_createBookView",
690
- "dashGrid": "CUIYUW_dashGrid",
691
- "panelTitle": "CUIYUW_panelTitle",
692
- "createBookIcon": "CUIYUW_createBookIcon",
693
- "chapterMain": "CUIYUW_chapterMain",
694
- "genreDesc": "CUIYUW_genreDesc",
695
- "dashJourneyFill": "CUIYUW_dashJourneyFill",
696
- "wsColumns": "CUIYUW_wsColumns",
697
- "progressBarFill": "CUIYUW_progressBarFill",
698
- "dashHeroTitle": "CUIYUW_dashHeroTitle",
786
+ "bookCreateOutline": "CUIYUW_bookCreateOutline",
699
787
  "bookCardActive": "CUIYUW_bookCardActive",
700
- "badgePending": "CUIYUW_badgePending",
701
- "toolStepActive": "CUIYUW_toolStepActive",
702
- "toolStepIcon": "CUIYUW_toolStepIcon",
703
- "navTabBadge": "CUIYUW_navTabBadge",
704
- "workflowBody": "CUIYUW_workflowBody",
705
- "bookshelfLabel": "CUIYUW_bookshelfLabel",
706
- "assistantFloatBody": "CUIYUW_assistantFloatBody",
707
- "tabBar": "CUIYUW_tabBar",
708
- "progressLineLive": "CUIYUW_progressLineLive",
709
- "navTabBadgeDanger": "CUIYUW_navTabBadgeDanger",
710
- "dashJourney": "CUIYUW_dashJourney",
788
+ "dashStageCurrent": "CUIYUW_dashStageCurrent",
711
789
  "textarea": "CUIYUW_textarea",
712
- "dashHeroActionTitle": "CUIYUW_dashHeroActionTitle",
713
- "bookAddIcon": "CUIYUW_bookAddIcon",
714
- "todoWarning": "CUIYUW_todoWarning",
790
+ "wsSelectedText": "CUIYUW_wsSelectedText",
715
791
  "chatBubbleAssistant": "CUIYUW_chatBubbleAssistant",
716
- "navAboutUpdate": "CUIYUW_navAboutUpdate",
717
- "wsEditor": "CUIYUW_wsEditor",
718
- "navGroup": "CUIYUW_navGroup",
719
- "navGroupSep": "CUIYUW_navGroupSep",
720
- "buttonDanger": "CUIYUW_buttonDanger",
721
- "panelHeader": "CUIYUW_panelHeader",
722
- "volumeGroup": "CUIYUW_volumeGroup",
723
- "diffTagOld": "CUIYUW_diffTagOld",
724
- "wsPreviewText": "CUIYUW_wsPreviewText",
725
- "assetGrid": "CUIYUW_assetGrid",
726
- "diffSame": "CUIYUW_diffSame",
727
- "assistantStatusBusy": "CUIYUW_assistantStatusBusy",
728
- "bigProgressBarFill": "CUIYUW_bigProgressBarFill",
729
- "badgeDone": "CUIYUW_badgeDone",
730
- "entry": "CUIYUW_entry",
731
- "diffAdd": "CUIYUW_diffAdd",
732
- "dashStageCurrent": "CUIYUW_dashStageCurrent",
733
- "meta": "CUIYUW_meta",
734
- "toolStepName": "CUIYUW_toolStepName",
735
- "entryLabel": "CUIYUW_entryLabel",
736
- "dashFacts": "CUIYUW_dashFacts",
737
- "bookChipMeta": "CUIYUW_bookChipMeta",
738
- "fieldLabel": "CUIYUW_fieldLabel",
739
- "chatRole": "CUIYUW_chatRole",
740
- "diffOld": "CUIYUW_diffOld",
741
- "card": "CUIYUW_card",
742
- "dashStage": "CUIYUW_dashStage",
743
- "bookCardCoverTitle": "CUIYUW_bookCardCoverTitle",
744
- "bookshelfList": "CUIYUW_bookshelfList",
745
- "badgeWritten": "CUIYUW_badgeWritten",
746
- "toolStepStatus": "CUIYUW_toolStepStatus",
747
- "dashFact": "CUIYUW_dashFact",
748
- "workflowLabel": "CUIYUW_workflowLabel",
749
- "navTabBadgeDone": "CUIYUW_navTabBadgeDone",
750
- "badgeGenerating": "CUIYUW_badgeGenerating",
751
- "workflowDot": "CUIYUW_workflowDot",
792
+ "toolStepDetail": "CUIYUW_toolStepDetail",
752
793
  "input": "CUIYUW_input",
753
- "badge": "CUIYUW_badge",
754
- "coverPreview": "CUIYUW_coverPreview",
755
- "workflowRow": "CUIYUW_workflowRow",
756
- "chapterList": "CUIYUW_chapterList",
757
- "diffChange": "CUIYUW_diffChange",
758
- "wsPreview": "CUIYUW_wsPreview",
794
+ "panelContent": "CUIYUW_panelContent",
795
+ "badgeRejected": "CUIYUW_badgeRejected",
796
+ "toolLive": "CUIYUW_toolLive",
797
+ "dashJourneyFill": "CUIYUW_dashJourneyFill",
798
+ "pulse": "CUIYUW_pulse",
799
+ "dashHeroAction": "CUIYUW_dashHeroAction",
800
+ "diffSame": "CUIYUW_diffSame",
801
+ "todoText": "CUIYUW_todoText",
802
+ "assistantResize": "CUIYUW_assistantResize",
803
+ "bookAddIcon": "CUIYUW_bookAddIcon",
804
+ "createBookTop": "CUIYUW_createBookTop",
805
+ "navTabBadgeDanger": "CUIYUW_navTabBadgeDanger",
759
806
  "entryIcon": "CUIYUW_entryIcon",
760
- "progressBar": "CUIYUW_progressBar",
761
- "navAboutRow": "CUIYUW_navAboutRow",
762
- "wsColumn": "CUIYUW_wsColumn",
807
+ "dashJourneyStages": "CUIYUW_dashJourneyStages",
808
+ "createBookCard": "CUIYUW_createBookCard",
809
+ "diffLegend": "CUIYUW_diffLegend",
810
+ "progressBarFill": "CUIYUW_progressBarFill",
811
+ "dashGrid": "CUIYUW_dashGrid",
812
+ "dashFact": "CUIYUW_dashFact",
813
+ "createBookIcon": "CUIYUW_createBookIcon",
814
+ "progressLineError": "CUIYUW_progressLineError",
815
+ "toolStepName": "CUIYUW_toolStepName",
816
+ "wsPage": "CUIYUW_wsPage",
817
+ "assetStatLabel": "CUIYUW_assetStatLabel",
818
+ "navGroupSep": "CUIYUW_navGroupSep",
819
+ "diffAdd": "CUIYUW_diffAdd",
820
+ "dashHeroTitle": "CUIYUW_dashHeroTitle",
821
+ "chapterTitle": "CUIYUW_chapterTitle",
822
+ "dashHeroBook": "CUIYUW_dashHeroBook",
823
+ "fadeIn": "CUIYUW_fadeIn",
763
824
  "dashHero": "CUIYUW_dashHero",
764
- "iconButton": "CUIYUW_iconButton",
765
- "headerProgress": "CUIYUW_headerProgress",
766
- "chapterNum": "CUIYUW_chapterNum",
767
- "coverPlaceholder": "CUIYUW_coverPlaceholder",
768
- "bookCardCover": "CUIYUW_bookCardCover",
769
- "assetStatValue": "CUIYUW_assetStatValue",
770
- "toolStepError": "CUIYUW_toolStepError",
771
- "pulse": "CUIYUW_pulse",
772
- "diffSameBody": "CUIYUW_diffSameBody",
773
- "todoItem": "CUIYUW_todoItem",
774
- "wsSelected": "CUIYUW_wsSelected",
775
- "bookCardCoverFallback": "CUIYUW_bookCardCoverFallback",
825
+ "headerProgressDot": "CUIYUW_headerProgressDot",
826
+ "spaceBetween": "CUIYUW_spaceBetween",
827
+ "badgeGenerating": "CUIYUW_badgeGenerating",
828
+ "dashStageDot": "CUIYUW_dashStageDot",
829
+ "shelfGrid": "CUIYUW_shelfGrid",
830
+ "volumeGroupHeader": "CUIYUW_volumeGroupHeader",
831
+ "bookshelfLabel": "CUIYUW_bookshelfLabel",
832
+ "bookAdd": "CUIYUW_bookAdd",
833
+ "assetStatDetail": "CUIYUW_assetStatDetail",
834
+ "toolSteps": "CUIYUW_toolSteps",
835
+ "chatRole": "CUIYUW_chatRole",
776
836
  "navTabIcon": "CUIYUW_navTabIcon",
777
- "badgeError": "CUIYUW_badgeError",
778
- "dropzoneActive": "CUIYUW_dropzoneActive",
837
+ "wsEditor": "CUIYUW_wsEditor",
838
+ "diffText": "CUIYUW_diffText",
839
+ "todoDanger": "CUIYUW_todoDanger",
840
+ "assistantFloat": "CUIYUW_assistantFloat",
841
+ "bookCardProgressFill": "CUIYUW_bookCardProgressFill",
842
+ "bookCard": "CUIYUW_bookCard",
843
+ "bigProgressBarFill": "CUIYUW_bigProgressBarFill",
844
+ "workflowLabel": "CUIYUW_workflowLabel",
779
845
  "todoInfo": "CUIYUW_todoInfo",
780
- "headerProgressDot": "CUIYUW_headerProgressDot",
781
- "diffTagNew": "CUIYUW_diffTagNew",
782
- "createBookCard": "CUIYUW_createBookCard",
783
- "dashHeroBook": "CUIYUW_dashHeroBook",
784
- "navAbout": "CUIYUW_navAbout",
785
- "bigProgressBar": "CUIYUW_bigProgressBar",
846
+ "outlineReadonly": "CUIYUW_outlineReadonly",
786
847
  "legendOld": "CUIYUW_legendOld",
787
- "navSpacer": "CUIYUW_navSpacer",
788
- "todoDanger": "CUIYUW_todoDanger",
789
- "todoText": "CUIYUW_todoText",
790
- "assistantResize": "CUIYUW_assistantResize",
791
- "shelfGrid": "CUIYUW_shelfGrid",
792
848
  "panel": "CUIYUW_panel",
793
- "onlyChanges": "CUIYUW_onlyChanges",
794
- "createBookTop": "CUIYUW_createBookTop",
795
- "spaceBetween": "CUIYUW_spaceBetween",
796
- "dashHeroSparkle": "CUIYUW_dashHeroSparkle",
797
- "navTabBadgeWarn": "CUIYUW_navTabBadgeWarn",
798
- "navTab": "CUIYUW_navTab",
849
+ "chapter": "CUIYUW_chapter",
850
+ "diffChange": "CUIYUW_diffChange",
851
+ "bookCardProgressBar": "CUIYUW_bookCardProgressBar",
799
852
  "diffDel": "CUIYUW_diffDel",
853
+ "navTabBadgeDone": "CUIYUW_navTabBadgeDone",
854
+ "volumeGroup": "CUIYUW_volumeGroup",
855
+ "assetStatValue": "CUIYUW_assetStatValue",
856
+ "createBookTitle": "CUIYUW_createBookTitle",
857
+ "workflowBody": "CUIYUW_workflowBody",
858
+ "assistantStatusBusy": "CUIYUW_assistantStatusBusy",
859
+ "volumeGroupToggle": "CUIYUW_volumeGroupToggle",
860
+ "dashHeroActionBody": "CUIYUW_dashHeroActionBody",
861
+ "bookAddCard": "CUIYUW_bookAddCard",
862
+ "toolStep": "CUIYUW_toolStep",
863
+ "row": "CUIYUW_row",
864
+ "tabBar": "CUIYUW_tabBar",
865
+ "badge": "CUIYUW_badge",
800
866
  "bookChipName": "CUIYUW_bookChipName",
801
- "workflowList": "CUIYUW_workflowList",
802
- "buttonPrimary": "CUIYUW_buttonPrimary",
867
+ "dropzone": "CUIYUW_dropzone",
868
+ "dashJourney": "CUIYUW_dashJourney",
869
+ "assistantFloatBody": "CUIYUW_assistantFloatBody",
870
+ "wsPageHeader": "CUIYUW_wsPageHeader",
871
+ "diffTagNew": "CUIYUW_diffTagNew",
872
+ "chapterNum": "CUIYUW_chapterNum",
873
+ "assistantFloatHeader": "CUIYUW_assistantFloatHeader",
874
+ "shelfView": "CUIYUW_shelfView",
875
+ "navGroupLabel": "CUIYUW_navGroupLabel",
876
+ "navGroup": "CUIYUW_navGroup",
877
+ "cardTitle": "CUIYUW_cardTitle",
878
+ "createBookView": "CUIYUW_createBookView",
879
+ "diffOld": "CUIYUW_diffOld",
880
+ "workflowRow": "CUIYUW_workflowRow",
881
+ "dropzoneActive": "CUIYUW_dropzoneActive",
882
+ "panelBody": "CUIYUW_panelBody",
883
+ "chapterActions": "CUIYUW_chapterActions",
884
+ "dashHeroEyebrow": "CUIYUW_dashHeroEyebrow",
885
+ "chapterBeats": "CUIYUW_chapterBeats",
886
+ "progressBar": "CUIYUW_progressBar",
887
+ "wsColumn": "CUIYUW_wsColumn",
803
888
  "legendNew": "CUIYUW_legendNew",
804
- "assistantStatus": "CUIYUW_assistantStatus",
805
- "outlineReadonly": "CUIYUW_outlineReadonly",
889
+ "panelHeader": "CUIYUW_panelHeader",
890
+ "card": "CUIYUW_card",
806
891
  "reviewBox": "CUIYUW_reviewBox",
807
- "diffText": "CUIYUW_diffText",
892
+ "bookChipRemove": "CUIYUW_bookChipRemove",
893
+ "chapterPreview": "CUIYUW_chapterPreview",
894
+ "chatScroll": "CUIYUW_chatScroll",
895
+ "entry": "CUIYUW_entry",
808
896
  "dashStageDone": "CUIYUW_dashStageDone",
897
+ "panelNav": "CUIYUW_panelNav",
898
+ "assetStat": "CUIYUW_assetStat",
899
+ "dashHeroSparkle": "CUIYUW_dashHeroSparkle",
900
+ "progressLineLive": "CUIYUW_progressLineLive",
809
901
  "tab": "CUIYUW_tab",
810
- "bookAdd": "CUIYUW_bookAdd",
811
- "row": "CUIYUW_row",
812
- "button": "CUIYUW_button",
813
- "dashStageDot": "CUIYUW_dashStageDot",
814
- "assetStatDetail": "CUIYUW_assetStatDetail",
815
- "chatScroll": "CUIYUW_chatScroll",
816
- "bookChip": "CUIYUW_bookChip",
817
- "wsSelectedText": "CUIYUW_wsSelectedText",
902
+ "dashStage": "CUIYUW_dashStage",
903
+ "dashFacts": "CUIYUW_dashFacts",
904
+ "genreDesc": "CUIYUW_genreDesc",
905
+ "diffSameBody": "CUIYUW_diffSameBody",
906
+ "workflowDotDone": "CUIYUW_workflowDotDone",
907
+ "bookChipActive": "CUIYUW_bookChipActive",
908
+ "bookChipMeta": "CUIYUW_bookChipMeta",
909
+ "buttonDanger": "CUIYUW_buttonDanger",
818
910
  "field": "CUIYUW_field",
819
- "bookAddCard": "CUIYUW_bookAddCard",
820
- "bookshelf": "CUIYUW_bookshelf",
821
- "shelfView": "CUIYUW_shelfView",
822
- "progressLine": "CUIYUW_progressLine",
823
- "assetStat": "CUIYUW_assetStat",
824
- "createBookTitle": "CUIYUW_createBookTitle",
825
- "bookCreateOutline": "CUIYUW_bookCreateOutline",
826
- "bookCardProgressBar": "CUIYUW_bookCardProgressBar",
827
- "chatBubbleUser": "CUIYUW_chatBubbleUser",
828
- "diffLegend": "CUIYUW_diffLegend",
911
+ "diffNew": "CUIYUW_diffNew",
912
+ "fileList": "CUIYUW_fileList",
913
+ "navSpacer": "CUIYUW_navSpacer",
914
+ "chapterList": "CUIYUW_chapterList",
915
+ "bigProgressBar": "CUIYUW_bigProgressBar",
916
+ "shelfHeader": "CUIYUW_shelfHeader",
829
917
  "view": "CUIYUW_view",
830
918
  "panelNavCollapsed": "CUIYUW_panelNavCollapsed",
831
- "chapterTitle": "CUIYUW_chapterTitle",
832
- "chapterPreview": "CUIYUW_chapterPreview",
833
- "panelBody": "CUIYUW_panelBody",
834
- "volumeGroupToggle": "CUIYUW_volumeGroupToggle",
835
- "toolStepDetail": "CUIYUW_toolStepDetail",
836
- "bookCard": "CUIYUW_bookCard",
837
- "fadeIn": "CUIYUW_fadeIn",
838
- "bookChipActive": "CUIYUW_bookChipActive",
919
+ "todoItem": "CUIYUW_todoItem",
920
+ "coverPreview": "CUIYUW_coverPreview",
839
921
  "bookCardBody": "CUIYUW_bookCardBody",
840
- "dropzoneIcon": "CUIYUW_dropzoneIcon",
841
- "dashHeroActionBody": "CUIYUW_dashHeroActionBody",
842
- "shelfHeader": "CUIYUW_shelfHeader",
843
- "bookChipRemove": "CUIYUW_bookChipRemove",
844
- "panelContent": "CUIYUW_panelContent",
845
- "bookCardTitleRow": "CUIYUW_bookCardTitleRow",
846
- "navTabLabel": "CUIYUW_navTabLabel",
847
- "chapterActions": "CUIYUW_chapterActions",
848
- "dashHeroEyebrow": "CUIYUW_dashHeroEyebrow",
849
- "dashJourneyStages": "CUIYUW_dashJourneyStages",
850
- "bookCardProgressFill": "CUIYUW_bookCardProgressFill",
851
- "volumeGroupHeader": "CUIYUW_volumeGroupHeader",
922
+ "button": "CUIYUW_button",
923
+ "bookCreateCard": "CUIYUW_bookCreateCard",
924
+ "badgeDone": "CUIYUW_badgeDone",
925
+ "bookCardCoverFallback": "CUIYUW_bookCardCoverFallback",
926
+ "workflowDotActive": "CUIYUW_workflowDotActive",
927
+ "wsSelected": "CUIYUW_wsSelected",
928
+ "wsPreview": "CUIYUW_wsPreview",
852
929
  "progressLineDone": "CUIYUW_progressLineDone",
853
- "workflowDotDone": "CUIYUW_workflowDotDone"
930
+ "toolStepError": "CUIYUW_toolStepError",
931
+ "toolStepStatus": "CUIYUW_toolStepStatus",
932
+ "workflowDot": "CUIYUW_workflowDot",
933
+ "navAbout": "CUIYUW_navAbout",
934
+ "liveText": "CUIYUW_liveText",
935
+ "workflowHint": "CUIYUW_workflowHint",
936
+ "navAboutRow": "CUIYUW_navAboutRow",
937
+ "panelSubtitle": "CUIYUW_panelSubtitle",
938
+ "assistantStatus": "CUIYUW_assistantStatus",
939
+ "buttonSmall": "CUIYUW_buttonSmall",
940
+ "navTabBadge": "CUIYUW_navTabBadge",
941
+ "assetGrid": "CUIYUW_assetGrid",
942
+ "dropzoneIcon": "CUIYUW_dropzoneIcon",
943
+ "progress": "CUIYUW_progress",
944
+ "meta": "CUIYUW_meta",
945
+ "dashJourneyBar": "CUIYUW_dashJourneyBar",
946
+ "todoWarning": "CUIYUW_todoWarning",
947
+ "diffColumn": "CUIYUW_diffColumn",
948
+ "wsPreviewText": "CUIYUW_wsPreviewText",
949
+ "dashHeroActionTitle": "CUIYUW_dashHeroActionTitle",
950
+ "badgePending": "CUIYUW_badgePending",
951
+ "toolStepActive": "CUIYUW_toolStepActive",
952
+ "panelTitle": "CUIYUW_panelTitle"
854
953
  };
855
954
  //#endregion
856
955
  //#region src/client/panel/AssistantTab.tsx
@@ -1485,7 +1584,9 @@ window.__ModuleLoader__.load({
1485
1584
  style: {
1486
1585
  display: "flex",
1487
1586
  flexDirection: "column",
1488
- gap: 12
1587
+ gap: 12,
1588
+ flex: 1,
1589
+ minHeight: 0
1489
1590
  },
1490
1591
  children: [
1491
1592
  error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1628,6 +1729,10 @@ window.__ModuleLoader__.load({
1628
1729
  }),
1629
1730
  assetTab === "progression" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1630
1731
  className: panel_module_css_default.card,
1732
+ style: {
1733
+ flex: 1,
1734
+ minHeight: 0
1735
+ },
1631
1736
  children: [
1632
1737
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1633
1738
  className: panel_module_css_default.cardTitle,
@@ -1673,7 +1778,8 @@ window.__ModuleLoader__.load({
1673
1778
  display: "flex",
1674
1779
  flexDirection: "column",
1675
1780
  gap: 6,
1676
- maxHeight: 260,
1781
+ flex: 1,
1782
+ minHeight: 0,
1677
1783
  overflowY: "auto"
1678
1784
  },
1679
1785
  children: data.progressionLibrary.map((mode) => {
@@ -1701,6 +1807,10 @@ window.__ModuleLoader__.load({
1701
1807
  }),
1702
1808
  assetTab === "templates" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1703
1809
  className: panel_module_css_default.card,
1810
+ style: {
1811
+ flex: 1,
1812
+ minHeight: 0
1813
+ },
1704
1814
  children: [
1705
1815
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1706
1816
  className: panel_module_css_default.cardTitle,
@@ -1715,7 +1825,8 @@ window.__ModuleLoader__.load({
1715
1825
  display: "flex",
1716
1826
  flexDirection: "column",
1717
1827
  gap: 8,
1718
- maxHeight: 420,
1828
+ flex: 1,
1829
+ minHeight: 0,
1719
1830
  overflowY: "auto"
1720
1831
  },
1721
1832
  children: data.styleTemplates.map((template) => {
@@ -1783,6 +1894,10 @@ window.__ModuleLoader__.load({
1783
1894
  }),
1784
1895
  assetTab === "rules" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1785
1896
  className: panel_module_css_default.card,
1897
+ style: {
1898
+ flex: 1,
1899
+ minHeight: 0
1900
+ },
1786
1901
  children: [
1787
1902
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1788
1903
  className: panel_module_css_default.cardTitle,
@@ -1797,7 +1912,8 @@ window.__ModuleLoader__.load({
1797
1912
  display: "flex",
1798
1913
  flexDirection: "column",
1799
1914
  gap: 6,
1800
- maxHeight: 280,
1915
+ flex: 1,
1916
+ minHeight: 0,
1801
1917
  overflowY: "auto"
1802
1918
  },
1803
1919
  children: [builtinRules.map((rule) => {
@@ -3281,6 +3397,11 @@ window.__ModuleLoader__.load({
3281
3397
  id: "plan",
3282
3398
  label: tt("tab.plan"),
3283
3399
  icon: "📚"
3400
+ },
3401
+ {
3402
+ id: "plotlines",
3403
+ label: tt("tab.plotlines"),
3404
+ icon: "🧵"
3284
3405
  }
3285
3406
  ]
3286
3407
  },
@@ -3317,6 +3438,11 @@ window.__ModuleLoader__.load({
3317
3438
  label: tt("tab.foreshadow"),
3318
3439
  icon: "🔮"
3319
3440
  },
3441
+ {
3442
+ id: "facts",
3443
+ label: tt("tab.facts"),
3444
+ icon: "📜"
3445
+ },
3320
3446
  {
3321
3447
  id: "assetsGenre",
3322
3448
  label: "题材基底",
@@ -3351,7 +3477,7 @@ window.__ModuleLoader__.load({
3351
3477
  label: tt("tab.settings"),
3352
3478
  icon: "⚙️"
3353
3479
  };
3354
- const PLUGIN_VERSION = "1.1.2";
3480
+ const PLUGIN_VERSION = "1.1.3";
3355
3481
  /** GitHub 仓库地址(关于区块点击跳转)。 */
3356
3482
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
3357
3483
  /** Whether any chapter is being generated right now. */
@@ -3658,6 +3784,21 @@ window.__ModuleLoader__.load({
3658
3784
  window.localStorage.setItem("dsh-novel-forge.editor.fontSize", String(v));
3659
3785
  } catch {}
3660
3786
  };
3787
+ /** 面板主题(localStorage 记忆):'liquid'=iOS 液态玻璃(绿) / 'classic'=经典毛玻璃(蓝) / 'neumorph'=新拟物(浅色)。 */
3788
+ const [panelTheme, setPanelTheme] = (0, react.useState)(() => {
3789
+ try {
3790
+ const v = window.localStorage.getItem("dsh-novel-forge.theme");
3791
+ return v === "classic" || v === "neumorph" ? v : "liquid";
3792
+ } catch {
3793
+ return "liquid";
3794
+ }
3795
+ });
3796
+ const changePanelTheme = (next) => {
3797
+ setPanelTheme(next);
3798
+ try {
3799
+ window.localStorage.setItem("dsh-novel-forge.theme", next);
3800
+ } catch {}
3801
+ };
3661
3802
  /** 有未采纳草稿的章节号(refresh 后检测到遗留草稿时提示)。 */
3662
3803
  const [draftNo, setDraftNo] = (0, react.useState)(null);
3663
3804
  /** 大纲页「更新大纲」编辑区是否展开。 */
@@ -3678,8 +3819,25 @@ window.__ModuleLoader__.load({
3678
3819
  const coverFileRef = (0, react.useRef)(null);
3679
3820
  /** 章节列表按卷折叠(存已折叠的卷号)。 */
3680
3821
  const [collapsedVolumes, setCollapsedVolumes] = (0, react.useState)([]);
3822
+ /** 章节页当前选中的卷('all' = 全部卷显示在一起)。 */
3823
+ const [selectedVolume, setSelectedVolume] = (0, react.useState)("all");
3824
+ /** 剧情线编辑草稿(null = 未在编辑)。 */
3825
+ const [plotlineDraft, setPlotlineDraft] = (0, react.useState)(null);
3826
+ /** 角色知情度编辑草稿(角色名 → 文本,每行一条)。 */
3827
+ const [knowledgeDraft, setKnowledgeDraft] = (0, react.useState)({});
3828
+ /** 全书敏感词检查结果(null = 未运行)。 */
3829
+ const [sensHits, setSensHits] = (0, react.useState)(null);
3830
+ const [sensScanned, setSensScanned] = (0, react.useState)(0);
3681
3831
  /** npm 最新版本(更新检测;null = 未检测/检测失败)。 */
3682
3832
  const [npmLatest, setNpmLatest] = (0, react.useState)(null);
3833
+ /** 活动输出容器:自动滚动锚点(有新活动时跟随到底部)。 */
3834
+ const progressEndRef = (0, react.useRef)(null);
3835
+ (0, react.useEffect)(() => {
3836
+ progressEndRef.current?.scrollIntoView({
3837
+ behavior: "smooth",
3838
+ block: "nearest"
3839
+ });
3840
+ }, [progress]);
3683
3841
  /** 后台检测 npm 最新版本(失败静默,不打扰)。 */
3684
3842
  (0, react.useEffect)(() => {
3685
3843
  let cancelled = false;
@@ -3957,6 +4115,108 @@ window.__ModuleLoader__.load({
3957
4115
  setBusyLabel("");
3958
4116
  }
3959
4117
  };
4118
+ /** 剧情线:保存草稿(新增或更新)。 */
4119
+ const handlePlotlineSave = async () => {
4120
+ if (plotlineDraft === null) return;
4121
+ const line = {
4122
+ id: plotlineDraft.id,
4123
+ name: plotlineDraft.name.trim(),
4124
+ kind: plotlineDraft.kind,
4125
+ goal: plotlineDraft.goal.trim(),
4126
+ progress: plotlineDraft.progress.trim(),
4127
+ status: plotlineDraft.status,
4128
+ chapters: plotlineDraft.id !== "" ? project?.plotlines?.find((l) => l.id === plotlineDraft.id)?.chapters ?? [] : [],
4129
+ createdAt: plotlineDraft.id !== "" ? project?.plotlines?.find((l) => l.id === plotlineDraft.id)?.createdAt ?? (/* @__PURE__ */ new Date()).toISOString() : (/* @__PURE__ */ new Date()).toISOString()
4130
+ };
4131
+ if (line.name === "") {
4132
+ setError("剧情线名称不能为空");
4133
+ return;
4134
+ }
4135
+ setBusy(true);
4136
+ setError("");
4137
+ try {
4138
+ const result = await api.plotlines({
4139
+ op: plotlineDraft.id !== "" ? "update" : "add",
4140
+ line
4141
+ });
4142
+ setProject((prev) => prev === null ? prev : {
4143
+ ...prev,
4144
+ plotlines: result.plotlines,
4145
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
4146
+ });
4147
+ setPlotlineDraft(null);
4148
+ pushProgress(plotlineDraft.id !== "" ? `剧情线已更新:${line.name}` : `剧情线已创建:${line.name}`, "done");
4149
+ } catch (err) {
4150
+ setError(err.message);
4151
+ pushProgress(`保存剧情线失败:${err.message}`, "error");
4152
+ } finally {
4153
+ setBusy(false);
4154
+ }
4155
+ };
4156
+ /** 剧情线:删除。 */
4157
+ const handlePlotlineRemove = async (id) => {
4158
+ if (!window.confirm("确定删除这条剧情线?关联章节记录会一并移除。")) return;
4159
+ setBusy(true);
4160
+ setError("");
4161
+ try {
4162
+ const result = await api.plotlines({
4163
+ op: "remove",
4164
+ id
4165
+ });
4166
+ setProject((prev) => prev === null ? prev : {
4167
+ ...prev,
4168
+ plotlines: result.plotlines,
4169
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
4170
+ });
4171
+ pushProgress("剧情线已删除", "done");
4172
+ } catch (err) {
4173
+ setError(err.message);
4174
+ } finally {
4175
+ setBusy(false);
4176
+ }
4177
+ };
4178
+ /** 全书敏感词检查(硬匹配内置词库)。 */
4179
+ const handleSensitiveScan = async () => {
4180
+ setBusy(true);
4181
+ setBusyLabel("敏感词检查中…");
4182
+ setError("");
4183
+ try {
4184
+ const result = await api.sensitiveCheck({ all: true });
4185
+ setSensHits(result.hits);
4186
+ setSensScanned(result.scannedChapters);
4187
+ pushProgress(result.hits.length > 0 ? `敏感词检查:${result.hits.length} 处命中(${new Set(result.hits.map((h) => h.chapterNo)).size} 章受影响)` : `敏感词检查完成:扫描 ${result.scannedChapters} 章,未命中违禁词`, result.hits.length > 0 ? "error" : "done");
4188
+ } catch (err) {
4189
+ setError(err.message);
4190
+ pushProgress(`敏感词检查失败:${err.message}`, "error");
4191
+ } finally {
4192
+ setBusy(false);
4193
+ setBusyLabel("");
4194
+ }
4195
+ };
4196
+ /** 保存角色知情度(bible.characters 整体更新)。 */
4197
+ const handleKnowledgeSave = async () => {
4198
+ if (bible === void 0) return;
4199
+ const characters = bible.characters.map((card) => ({
4200
+ ...card,
4201
+ knowledge: (knowledgeDraft[card.name] ?? (card.knowledge ?? []).join("\n")).split("\n").map((l) => l.trim()).filter((l) => l !== "")
4202
+ }));
4203
+ setBusy(true);
4204
+ setError("");
4205
+ try {
4206
+ const result = await api.biblePatch({ characters });
4207
+ setProject((prev) => prev === null || prev.bible === void 0 ? prev : {
4208
+ ...prev,
4209
+ bible: result.bible,
4210
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
4211
+ });
4212
+ pushProgress("角色知情度已保存(生成/审稿都会严格遵守信息差)", "done");
4213
+ } catch (err) {
4214
+ setError(err.message);
4215
+ pushProgress(`保存知情度失败:${err.message}`, "error");
4216
+ } finally {
4217
+ setBusy(false);
4218
+ }
4219
+ };
3960
4220
  /** 保存世界观规则编辑(bible tab,每行一条)。 */
3961
4221
  const handleSaveWorldRules = async () => {
3962
4222
  if (bible === void 0) return;
@@ -4870,6 +5130,7 @@ window.__ModuleLoader__.load({
4870
5130
  })();
4871
5131
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4872
5132
  className: panel_module_css_default.panel,
5133
+ "data-nf-theme": panelTheme,
4873
5134
  children: [viewMode === "shelf" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShelfView, {
4874
5135
  api,
4875
5136
  shelf: shelf ?? {
@@ -4927,10 +5188,16 @@ window.__ModuleLoader__.load({
4927
5188
  }
4928
5189
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4929
5190
  className: panel_module_css_default.panelHeader,
4930
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
4931
- className: panel_module_css_default.panelTitle,
4932
- children: [
4933
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5191
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5192
+ style: {
5193
+ display: "flex",
5194
+ flexDirection: "column",
5195
+ gap: 2,
5196
+ minWidth: 0
5197
+ },
5198
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
5199
+ className: panel_module_css_default.panelTitle,
5200
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4934
5201
  type: "button",
4935
5202
  className: panel_module_css_default.iconButton,
4936
5203
  title: "返回书架",
@@ -4939,18 +5206,10 @@ window.__ModuleLoader__.load({
4939
5206
  setViewMode("shelf");
4940
5207
  },
4941
5208
  children: "←"
4942
- }),
4943
- tt("panel.title"),
4944
- project?.bookName !== "" && project?.bookName !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4945
- className: panel_module_css_default.badge,
4946
- style: {
4947
- borderColor: "var(--nf-accent)",
4948
- color: "var(--nf-accent)",
4949
- fontSize: 11
4950
- },
4951
- children: project.bookName
4952
- }),
4953
- chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5209
+ }), tt("panel.title")]
5210
+ }), project?.bookName !== "" && project?.bookName !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5211
+ className: panel_module_css_default.panelSubtitle,
5212
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["📖 ", project.bookName] }), chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4954
5213
  className: panel_module_css_default.headerProgress,
4955
5214
  children: [
4956
5215
  "已完成 ",
@@ -4962,8 +5221,8 @@ window.__ModuleLoader__.load({
4962
5221
  "通过 ",
4963
5222
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: chapters.filter((c) => c.status === "approved").length })
4964
5223
  ]
4965
- })
4966
- ]
5224
+ })]
5225
+ })]
4967
5226
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4968
5227
  style: {
4969
5228
  display: "flex",
@@ -5169,14 +5428,9 @@ window.__ModuleLoader__.load({
5169
5428
  })
5170
5429
  }),
5171
5430
  workspace !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5172
- className: panel_module_css_default.card,
5173
- style: { borderColor: "var(--nf-accent)" },
5431
+ className: panel_module_css_default.wsPage,
5174
5432
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5175
- className: panel_module_css_default.busyRow,
5176
- style: {
5177
- flexWrap: "wrap",
5178
- gap: 8
5179
- },
5433
+ className: panel_module_css_default.wsPageHeader,
5180
5434
  children: [
5181
5435
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5182
5436
  type: "button",
@@ -5453,6 +5707,10 @@ window.__ModuleLoader__.load({
5453
5707
  }),
5454
5708
  workspace.draft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5455
5709
  className: panel_module_css_default.wsPreview,
5710
+ style: {
5711
+ flex: 1,
5712
+ minHeight: 0
5713
+ },
5456
5714
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5457
5715
  className: panel_module_css_default.busyRow,
5458
5716
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -5639,6 +5897,118 @@ window.__ModuleLoader__.load({
5639
5897
  })
5640
5898
  ]
5641
5899
  }),
5900
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5901
+ className: panel_module_css_default.card,
5902
+ style: {
5903
+ flexDirection: "row",
5904
+ alignItems: "center",
5905
+ justifyContent: "space-between",
5906
+ flexWrap: "wrap",
5907
+ gap: 8
5908
+ },
5909
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5910
+ className: panel_module_css_default.meta,
5911
+ style: { fontWeight: 600 },
5912
+ children: [
5913
+ "📊 全书进度:已完成 ",
5914
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
5915
+ style: { color: "var(--nf-accent)" },
5916
+ children: doneCount
5917
+ }),
5918
+ "/",
5919
+ chapters.length,
5920
+ " 章(",
5921
+ chapters.length > 0 ? Math.round(doneCount / chapters.length * 100) : 0,
5922
+ "%)"
5923
+ ]
5924
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5925
+ className: panel_module_css_default.meta,
5926
+ children: [
5927
+ "待生成 ",
5928
+ pendingCount,
5929
+ " · 待审稿 ",
5930
+ reviewPendingCount,
5931
+ " · 通过 ",
5932
+ approvedCount
5933
+ ]
5934
+ })]
5935
+ }),
5936
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5937
+ className: panel_module_css_default.card,
5938
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5939
+ className: panel_module_css_default.cardTitle,
5940
+ children: ["🧵 ", tt("plotlines.workflowTitle")]
5941
+ }), (project?.plotlines ?? []).filter((l) => l.status === "active" || l.status === "paused").length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5942
+ className: panel_module_css_default.meta,
5943
+ children: tt("plotlines.workflowEmpty")
5944
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5945
+ style: {
5946
+ display: "flex",
5947
+ flexDirection: "column",
5948
+ gap: 6
5949
+ },
5950
+ children: (project?.plotlines ?? []).filter((l) => l.status === "active" || l.status === "paused").map((line) => {
5951
+ const kindLabel = {
5952
+ main: tt("plotlines.kindMain"),
5953
+ branch: tt("plotlines.kindBranch"),
5954
+ character: tt("plotlines.kindCharacter"),
5955
+ mystery: tt("plotlines.kindMystery")
5956
+ }[line.kind];
5957
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5958
+ style: {
5959
+ border: "1px solid var(--nf-border)",
5960
+ borderRadius: 8,
5961
+ padding: "6px 10px",
5962
+ fontSize: 12
5963
+ },
5964
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5965
+ className: panel_module_css_default.row,
5966
+ style: {
5967
+ justifyContent: "space-between",
5968
+ flexWrap: "wrap"
5969
+ },
5970
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5971
+ style: {
5972
+ display: "flex",
5973
+ alignItems: "center",
5974
+ gap: 6
5975
+ },
5976
+ children: [
5977
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: line.name }),
5978
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5979
+ className: panel_module_css_default.badge,
5980
+ style: {
5981
+ borderColor: "var(--nf-accent)",
5982
+ color: "var(--nf-accent)"
5983
+ },
5984
+ children: kindLabel
5985
+ }),
5986
+ line.status === "paused" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5987
+ className: panel_module_css_default.badge,
5988
+ style: {
5989
+ borderColor: "var(--nf-warn)",
5990
+ color: "var(--nf-warn)"
5991
+ },
5992
+ children: tt("plotlines.statusPaused")
5993
+ })
5994
+ ]
5995
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5996
+ className: panel_module_css_default.meta,
5997
+ children: [
5998
+ tt("plotlines.chapters"),
5999
+ " ",
6000
+ line.chapters.length,
6001
+ " 章"
6002
+ ]
6003
+ })]
6004
+ }), line.progress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6005
+ className: panel_module_css_default.meta,
6006
+ children: line.progress
6007
+ })]
6008
+ }, line.id);
6009
+ })
6010
+ })]
6011
+ }),
5642
6012
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5643
6013
  className: panel_module_css_default.assetGrid,
5644
6014
  children: [
@@ -5894,6 +6264,60 @@ window.__ModuleLoader__.load({
5894
6264
  })]
5895
6265
  }, i))
5896
6266
  })]
6267
+ }),
6268
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6269
+ className: panel_module_css_default.card,
6270
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6271
+ className: panel_module_css_default.row,
6272
+ style: {
6273
+ justifyContent: "space-between",
6274
+ flexWrap: "wrap"
6275
+ },
6276
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6277
+ className: panel_module_css_default.cardTitle,
6278
+ children: [
6279
+ "📟 活动输出(",
6280
+ progress.length,
6281
+ ")"
6282
+ ]
6283
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6284
+ className: panel_module_css_default.row,
6285
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6286
+ className: panel_module_css_default.meta,
6287
+ children: "生成/审稿/润色/质检等所有操作都会记录在这里"
6288
+ }), progress.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6289
+ type: "button",
6290
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6291
+ onClick: () => {
6292
+ setProgress([]);
6293
+ },
6294
+ children: "清空"
6295
+ })]
6296
+ })]
6297
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6298
+ className: panel_module_css_default.progress,
6299
+ style: {
6300
+ maxHeight: 260,
6301
+ overflowY: "auto"
6302
+ },
6303
+ children: [
6304
+ progress.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6305
+ className: panel_module_css_default.meta,
6306
+ children: tt("progress.empty")
6307
+ }),
6308
+ progress.map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6309
+ className: line.kind === "done" ? panel_module_css_default.progressLineDone : line.kind === "error" ? panel_module_css_default.progressLineError : line.live === true ? panel_module_css_default.progressLineLive : panel_module_css_default.progressLine,
6310
+ children: [line.live === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6311
+ className: panel_module_css_default.progressBar,
6312
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6313
+ className: panel_module_css_default.progressBarFill,
6314
+ style: { width: `${Math.round((line.ratio ?? 0) * 100)}%` }
6315
+ })
6316
+ }), line.text]
6317
+ }, line.id)),
6318
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { ref: progressEndRef })
6319
+ ]
6320
+ })]
5897
6321
  })
5898
6322
  ] }),
5899
6323
  activeTab === "overview" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -6229,16 +6653,20 @@ window.__ModuleLoader__.load({
6229
6653
  ]
6230
6654
  }),
6231
6655
  activeTab === "plan" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
6232
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6656
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6233
6657
  className: panel_module_css_default.card,
6234
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6658
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6235
6659
  className: panel_module_css_default.row,
6236
- style: { justifyContent: "space-between" },
6660
+ style: {
6661
+ justifyContent: "space-between",
6662
+ flexWrap: "wrap"
6663
+ },
6237
6664
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6238
6665
  className: panel_module_css_default.cardTitle,
6239
6666
  children: tt("tab.plan")
6240
6667
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6241
6668
  className: panel_module_css_default.row,
6669
+ style: { flexWrap: "wrap" },
6242
6670
  children: [
6243
6671
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6244
6672
  className: panel_module_css_default.meta,
@@ -6268,45 +6696,149 @@ window.__ModuleLoader__.load({
6268
6696
  handlePlan();
6269
6697
  },
6270
6698
  children: tt("plan.generate")
6699
+ }),
6700
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6701
+ type: "button",
6702
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6703
+ disabled: busy || doneCount === 0,
6704
+ onClick: () => {
6705
+ handleSensitiveScan();
6706
+ },
6707
+ title: tt("sensitive.hint"),
6708
+ children: ["🔞 ", tt("sensitive.scanAll")]
6271
6709
  })
6272
6710
  ]
6273
6711
  })]
6274
- }), volumes !== void 0 && volumes.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6275
- className: panel_module_css_default.row,
6276
- children: volumes.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6277
- className: panel_module_css_default.badge,
6712
+ })
6713
+ }),
6714
+ sensHits !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6715
+ className: panel_module_css_default.card,
6716
+ style: { borderColor: sensHits.length > 0 ? "var(--nf-warn)" : "var(--nf-success)" },
6717
+ children: [
6718
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6719
+ className: panel_module_css_default.row,
6278
6720
  style: {
6279
- borderColor: "var(--nf-accent)",
6280
- color: "var(--nf-accent)"
6721
+ justifyContent: "space-between",
6722
+ flexWrap: "wrap"
6281
6723
  },
6282
- children: [
6283
- v.no,
6284
- ". ",
6285
- v.title,
6286
- "(",
6287
- v.chapterStart,
6288
- "-",
6289
- v.chapterEnd,
6290
- ")"
6291
- ]
6292
- }, v.no))
6293
- })]
6724
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6725
+ className: panel_module_css_default.cardTitle,
6726
+ children: sensHits.length === 0 ? tt("sensitive.clean", { n: sensScanned }) : tt("sensitive.hits", {
6727
+ n: sensHits.length,
6728
+ chapters: new Set(sensHits.map((h) => h.chapterNo)).size
6729
+ })
6730
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6731
+ type: "button",
6732
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6733
+ onClick: () => {
6734
+ setSensHits(null);
6735
+ },
6736
+ children: "收起"
6737
+ })]
6738
+ }),
6739
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6740
+ className: panel_module_css_default.meta,
6741
+ children: tt("sensitive.hint")
6742
+ }),
6743
+ sensHits.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6744
+ style: {
6745
+ display: "flex",
6746
+ flexDirection: "column",
6747
+ gap: 4,
6748
+ maxHeight: 300,
6749
+ overflowY: "auto",
6750
+ fontSize: 12
6751
+ },
6752
+ children: sensHits.map((hit, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6753
+ style: {
6754
+ display: "flex",
6755
+ gap: 8,
6756
+ alignItems: "flex-start",
6757
+ border: "1px solid var(--nf-border)",
6758
+ borderRadius: 6,
6759
+ padding: "4px 8px"
6760
+ },
6761
+ children: [
6762
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6763
+ className: panel_module_css_default.badge,
6764
+ style: {
6765
+ borderColor: "var(--nf-warn)",
6766
+ color: "var(--nf-warn)",
6767
+ flex: "none"
6768
+ },
6769
+ children: hit.chapterNo > 0 ? `第${hit.chapterNo}章` : "文本"
6770
+ }),
6771
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6772
+ className: panel_module_css_default.meta,
6773
+ style: { flex: 1 },
6774
+ children: [
6775
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
6776
+ style: { color: "var(--nf-error)" },
6777
+ children: hit.word
6778
+ }),
6779
+ " ×",
6780
+ hit.count,
6781
+ " · [",
6782
+ hit.category,
6783
+ "]"
6784
+ ]
6785
+ }),
6786
+ hit.chapterNo > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6787
+ type: "button",
6788
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6789
+ disabled: busy,
6790
+ onClick: () => {
6791
+ openWorkspace(hit.chapterNo, tt("sensitive.fixPrefill", {
6792
+ word: hit.word,
6793
+ category: hit.category
6794
+ }));
6795
+ },
6796
+ children: tt("sensitive.goFix")
6797
+ })
6798
+ ]
6799
+ }, i))
6800
+ })
6801
+ ]
6294
6802
  }),
6295
6803
  chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6296
6804
  className: panel_module_css_default.card,
6297
6805
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6298
6806
  className: panel_module_css_default.row,
6299
- style: { justifyContent: "space-between" },
6300
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6301
- className: panel_module_css_default.meta,
6302
- children: [
6303
- "共 ",
6304
- chapters.length,
6305
- " 章 · 已完成 ",
6306
- doneCount,
6307
- " · 待生成 ",
6308
- pendingCount
6309
- ]
6807
+ style: {
6808
+ justifyContent: "space-between",
6809
+ flexWrap: "wrap"
6810
+ },
6811
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6812
+ className: panel_module_css_default.row,
6813
+ style: {
6814
+ flexWrap: "wrap",
6815
+ gap: 6
6816
+ },
6817
+ children: volumes !== void 0 && volumes.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6818
+ type: "button",
6819
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${selectedVolume === "all" ? panel_module_css_default.buttonPrimary : ""}`,
6820
+ onClick: () => {
6821
+ setSelectedVolume("all");
6822
+ },
6823
+ children: "全部卷"
6824
+ }), volumes.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6825
+ type: "button",
6826
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${selectedVolume === v.no ? panel_module_css_default.buttonPrimary : ""}`,
6827
+ onClick: () => {
6828
+ setSelectedVolume(v.no);
6829
+ },
6830
+ title: `第${v.no}卷 · ${v.chapterStart}-${v.chapterEnd} 章`,
6831
+ children: [
6832
+ v.no,
6833
+ ". ",
6834
+ v.title,
6835
+ "(",
6836
+ v.chapterStart,
6837
+ "-",
6838
+ v.chapterEnd,
6839
+ ")"
6840
+ ]
6841
+ }, v.no))] })
6310
6842
  }), pendingCount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6311
6843
  type: "button",
6312
6844
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
@@ -6323,7 +6855,7 @@ window.__ModuleLoader__.load({
6323
6855
  })]
6324
6856
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6325
6857
  className: panel_module_css_default.chapterList,
6326
- children: chapterGroups.map((group) => {
6858
+ children: chapterGroups.filter((g) => selectedVolume === "all" || g.no === selectedVolume).map((group) => {
6327
6859
  const collapsed = group.no !== 0 && collapsedVolumes.includes(group.no);
6328
6860
  const groupDone = group.chapters.filter((c) => c.status === "approved" || c.status === "written" || c.status === "rejected").length;
6329
6861
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -6576,28 +7108,6 @@ window.__ModuleLoader__.load({
6576
7108
  }, group.no);
6577
7109
  })
6578
7110
  })]
6579
- }),
6580
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6581
- className: panel_module_css_default.card,
6582
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6583
- className: panel_module_css_default.cardTitle,
6584
- children: tt("plan.progress")
6585
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6586
- className: panel_module_css_default.progress,
6587
- children: [progress.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6588
- className: panel_module_css_default.meta,
6589
- children: tt("progress.empty")
6590
- }), progress.map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6591
- className: line.kind === "done" ? panel_module_css_default.progressLineDone : line.kind === "error" ? panel_module_css_default.progressLineError : line.live === true ? panel_module_css_default.progressLineLive : panel_module_css_default.progressLine,
6592
- children: [line.live === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6593
- className: panel_module_css_default.progressBar,
6594
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6595
- className: panel_module_css_default.progressBarFill,
6596
- style: { width: `${Math.round((line.ratio ?? 0) * 100)}%` }
6597
- })
6598
- }), line.text]
6599
- }, line.id))]
6600
- })]
6601
7111
  })
6602
7112
  ] }),
6603
7113
  activeTab === "bible" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -6854,6 +7364,74 @@ window.__ModuleLoader__.load({
6854
7364
  })
6855
7365
  ]
6856
7366
  }),
7367
+ activeTab === "characters" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7368
+ className: panel_module_css_default.card,
7369
+ children: [
7370
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7371
+ className: panel_module_css_default.row,
7372
+ style: {
7373
+ justifyContent: "space-between",
7374
+ flexWrap: "wrap"
7375
+ },
7376
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7377
+ className: panel_module_css_default.cardTitle,
7378
+ children: "角色知情度(信息差管理)"
7379
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7380
+ type: "button",
7381
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
7382
+ disabled: busy || (bible?.characters ?? []).length === 0,
7383
+ onClick: () => {
7384
+ handleKnowledgeSave();
7385
+ },
7386
+ children: "💾 保存知情度"
7387
+ })]
7388
+ }),
7389
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7390
+ className: panel_module_css_default.meta,
7391
+ children: "填写每个角色「已经知道」的事实/秘密(每行一条)。生成与审稿会严格遵守:未列出的信息该角色一律不知道——避免\"不该知道的人知道了\"。"
7392
+ }),
7393
+ (bible?.characters ?? []).length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7394
+ className: panel_module_css_default.meta,
7395
+ children: "暂无角色卡——先在「道藏」提炼设定。"
7396
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7397
+ style: {
7398
+ display: "flex",
7399
+ flexDirection: "column",
7400
+ gap: 8
7401
+ },
7402
+ children: bible.characters.map((card) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7403
+ style: {
7404
+ border: "1px solid var(--nf-border)",
7405
+ borderRadius: 10,
7406
+ padding: "8px 10px",
7407
+ fontSize: 12
7408
+ },
7409
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7410
+ className: panel_module_css_default.row,
7411
+ style: { justifyContent: "space-between" },
7412
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: card.name }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7413
+ className: panel_module_css_default.meta,
7414
+ children: card.role === "protagonist" ? "主角" : card.role === "supporting" ? "配角" : card.role === "antagonist" ? "反派" : "其他"
7415
+ })]
7416
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
7417
+ className: panel_module_css_default.textarea,
7418
+ style: {
7419
+ minHeight: 52,
7420
+ fontSize: 12
7421
+ },
7422
+ placeholder: "每行一条该角色知道的信息,例如:林越的真实身份 / 古玉残片的秘密…",
7423
+ value: knowledgeDraft[card.name] ?? (card.knowledge ?? []).join("\n"),
7424
+ onChange: (e) => {
7425
+ setKnowledgeDraft((prev) => ({
7426
+ ...prev,
7427
+ [card.name]: e.target.value
7428
+ }));
7429
+ }
7430
+ })]
7431
+ }, card.name))
7432
+ })
7433
+ ]
7434
+ }),
6857
7435
  activeTab === "assetsGenre" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
6858
7436
  api,
6859
7437
  initialTab: "genre"
@@ -7249,57 +7827,441 @@ window.__ModuleLoader__.load({
7249
7827
  children: tt("settings.exportMd")
7250
7828
  })
7251
7829
  ]
7830
+ })
7831
+ ]
7832
+ }),
7833
+ activeTab === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7834
+ className: panel_module_css_default.card,
7835
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7836
+ className: panel_module_css_default.cardTitle,
7837
+ children: tt("settings.theme")
7838
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7839
+ className: panel_module_css_default.row,
7840
+ style: {
7841
+ gap: 8,
7842
+ flexWrap: "wrap"
7843
+ },
7844
+ children: [
7845
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7846
+ type: "button",
7847
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "liquid" ? panel_module_css_default.buttonPrimary : ""}`,
7848
+ onClick: () => {
7849
+ changePanelTheme("liquid");
7850
+ },
7851
+ title: "iOS 液态玻璃质感 · 绿色强调(当前默认)",
7852
+ children: ["🧊 ", tt("settings.themeLiquid")]
7853
+ }),
7854
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7855
+ type: "button",
7856
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "classic" ? panel_module_css_default.buttonPrimary : ""}`,
7857
+ onClick: () => {
7858
+ changePanelTheme("classic");
7859
+ },
7860
+ title: "经典 iOS 毛玻璃 · 蓝色强调",
7861
+ children: ["💠 ", tt("settings.themeClassic")]
7862
+ }),
7863
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7864
+ type: "button",
7865
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "neumorph" ? panel_module_css_default.buttonPrimary : ""}`,
7866
+ onClick: () => {
7867
+ changePanelTheme("neumorph");
7868
+ },
7869
+ title: "新拟物派 · 双阴影立体(仅浅色;深色下自动回退液态)",
7870
+ children: ["🔘 ", tt("settings.themeNeumorph")]
7871
+ }),
7872
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7873
+ className: panel_module_css_default.meta,
7874
+ children: tt("settings.themeHint")
7875
+ })
7876
+ ]
7877
+ })]
7878
+ }),
7879
+ activeTab === "facts" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7880
+ className: panel_module_css_default.card,
7881
+ children: [
7882
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7883
+ className: panel_module_css_default.busyRow,
7884
+ style: { flexWrap: "wrap" },
7885
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7886
+ className: panel_module_css_default.cardTitle,
7887
+ children: tt("facts.title", { n: (project?.facts ?? []).length })
7888
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7889
+ type: "button",
7890
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
7891
+ disabled: busy || chapters.length === 0,
7892
+ onClick: () => {
7893
+ handleFactsBackfill();
7894
+ },
7895
+ title: "用 LLM 从历史章节正文重新抽取事实,补齐缺失的编年录条目",
7896
+ children: ["📥 ", tt("facts.backfill")]
7897
+ })]
7252
7898
  }),
7253
- (project?.facts ?? []).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7254
- className: panel_module_css_default.card,
7899
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7900
+ className: panel_module_css_default.meta,
7901
+ children: tt("facts.hint")
7902
+ }),
7903
+ (project?.facts ?? []).length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7904
+ style: {
7905
+ display: "flex",
7906
+ flexDirection: "column",
7907
+ gap: 4,
7908
+ maxHeight: "60vh",
7909
+ overflowY: "auto",
7910
+ fontSize: 12
7911
+ },
7912
+ children: [...project?.facts ?? []].reverse().map((fact, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7913
+ style: {
7914
+ display: "flex",
7915
+ gap: 8,
7916
+ alignItems: "flex-start"
7917
+ },
7918
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7919
+ className: panel_module_css_default.badge,
7920
+ style: {
7921
+ borderColor: "var(--nf-text-3)",
7922
+ color: "var(--nf-text-3)",
7923
+ flex: "none",
7924
+ marginTop: 1
7925
+ },
7926
+ children: [
7927
+ "第 ",
7928
+ fact.chapterNo,
7929
+ " 章"
7930
+ ]
7931
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7932
+ className: panel_module_css_default.meta,
7933
+ children: fact.text
7934
+ })]
7935
+ }, i))
7936
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7937
+ className: panel_module_css_default.meta,
7938
+ children: "暂无事实条目——写一章后会自动生成,或点击上方「回填」。"
7939
+ })
7940
+ ]
7941
+ }),
7942
+ activeTab === "plotlines" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7943
+ className: panel_module_css_default.card,
7944
+ style: {
7945
+ flex: 1,
7946
+ minHeight: 0
7947
+ },
7948
+ children: [
7949
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7950
+ className: panel_module_css_default.row,
7951
+ style: {
7952
+ justifyContent: "space-between",
7953
+ flexWrap: "wrap"
7954
+ },
7955
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7956
+ className: panel_module_css_default.cardTitle,
7957
+ children: [
7958
+ tt("tab.plotlines"),
7959
+ "(",
7960
+ project?.plotlines?.length ?? 0,
7961
+ ")"
7962
+ ]
7963
+ }), plotlineDraft === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7964
+ type: "button",
7965
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
7966
+ onClick: () => {
7967
+ setPlotlineDraft({
7968
+ id: "",
7969
+ name: "",
7970
+ kind: "main",
7971
+ goal: "",
7972
+ progress: "",
7973
+ status: "active"
7974
+ });
7975
+ },
7976
+ children: tt("plotlines.new")
7977
+ })]
7978
+ }),
7979
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7980
+ className: panel_module_css_default.meta,
7981
+ children: tt("plotlines.hint")
7982
+ }),
7983
+ plotlineDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7984
+ style: {
7985
+ display: "flex",
7986
+ flexDirection: "column",
7987
+ gap: 8,
7988
+ border: "1px solid var(--nf-accent)",
7989
+ borderRadius: 12,
7990
+ padding: 10
7991
+ },
7255
7992
  children: [
7256
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7257
- className: panel_module_css_default.cardTitle,
7993
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7994
+ className: panel_module_css_default.row,
7995
+ style: { flexWrap: "wrap" },
7258
7996
  children: [
7259
- "编年录 / 时间线(",
7260
- (project?.facts ?? []).length,
7261
- " 条)"
7997
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7998
+ className: panel_module_css_default.field,
7999
+ style: {
8000
+ flex: 2,
8001
+ minWidth: 160
8002
+ },
8003
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8004
+ className: panel_module_css_default.fieldLabel,
8005
+ children: tt("plotlines.name")
8006
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
8007
+ className: panel_module_css_default.input,
8008
+ value: plotlineDraft.name,
8009
+ onChange: (e) => {
8010
+ setPlotlineDraft({
8011
+ ...plotlineDraft,
8012
+ name: e.target.value
8013
+ });
8014
+ },
8015
+ placeholder: "如:集齐古玉残片"
8016
+ })]
8017
+ }),
8018
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8019
+ className: panel_module_css_default.field,
8020
+ style: { flex: 1 },
8021
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8022
+ className: panel_module_css_default.fieldLabel,
8023
+ children: tt("plotlines.kind")
8024
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
8025
+ className: panel_module_css_default.input,
8026
+ value: plotlineDraft.kind,
8027
+ onChange: (e) => {
8028
+ setPlotlineDraft({
8029
+ ...plotlineDraft,
8030
+ kind: e.target.value
8031
+ });
8032
+ },
8033
+ children: [
8034
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8035
+ value: "main",
8036
+ children: tt("plotlines.kindMain")
8037
+ }),
8038
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8039
+ value: "branch",
8040
+ children: tt("plotlines.kindBranch")
8041
+ }),
8042
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8043
+ value: "character",
8044
+ children: tt("plotlines.kindCharacter")
8045
+ }),
8046
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8047
+ value: "mystery",
8048
+ children: tt("plotlines.kindMystery")
8049
+ })
8050
+ ]
8051
+ })]
8052
+ }),
8053
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8054
+ className: panel_module_css_default.field,
8055
+ style: { flex: 1 },
8056
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8057
+ className: panel_module_css_default.fieldLabel,
8058
+ children: tt("plotlines.status")
8059
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
8060
+ className: panel_module_css_default.input,
8061
+ value: plotlineDraft.status,
8062
+ onChange: (e) => {
8063
+ setPlotlineDraft({
8064
+ ...plotlineDraft,
8065
+ status: e.target.value
8066
+ });
8067
+ },
8068
+ children: [
8069
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8070
+ value: "active",
8071
+ children: tt("plotlines.statusActive")
8072
+ }),
8073
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8074
+ value: "paused",
8075
+ children: tt("plotlines.statusPaused")
8076
+ }),
8077
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8078
+ value: "resolved",
8079
+ children: tt("plotlines.statusResolved")
8080
+ }),
8081
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
8082
+ value: "abandoned",
8083
+ children: tt("plotlines.statusAbandoned")
8084
+ })
8085
+ ]
8086
+ })]
8087
+ })
7262
8088
  ]
7263
8089
  }),
7264
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7265
- className: panel_module_css_default.meta,
7266
- children: "每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。"
8090
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8091
+ className: panel_module_css_default.field,
8092
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8093
+ className: panel_module_css_default.fieldLabel,
8094
+ children: tt("plotlines.goal")
8095
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
8096
+ className: panel_module_css_default.textarea,
8097
+ style: { minHeight: 48 },
8098
+ value: plotlineDraft.goal,
8099
+ onChange: (e) => {
8100
+ setPlotlineDraft({
8101
+ ...plotlineDraft,
8102
+ goal: e.target.value
8103
+ });
8104
+ }
8105
+ })]
8106
+ }),
8107
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8108
+ className: panel_module_css_default.field,
8109
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
8110
+ className: panel_module_css_default.fieldLabel,
8111
+ children: tt("plotlines.progress")
8112
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
8113
+ className: panel_module_css_default.textarea,
8114
+ style: { minHeight: 40 },
8115
+ value: plotlineDraft.progress,
8116
+ onChange: (e) => {
8117
+ setPlotlineDraft({
8118
+ ...plotlineDraft,
8119
+ progress: e.target.value
8120
+ });
8121
+ },
8122
+ placeholder: "如:已取得第二枚残片,正追踪第三枚线索"
8123
+ })]
7267
8124
  }),
7268
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8125
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8126
+ className: panel_module_css_default.row,
8127
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8128
+ type: "button",
8129
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
8130
+ disabled: busy,
8131
+ onClick: () => {
8132
+ handlePlotlineSave();
8133
+ },
8134
+ children: tt("plotlines.save")
8135
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8136
+ type: "button",
8137
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
8138
+ onClick: () => {
8139
+ setPlotlineDraft(null);
8140
+ },
8141
+ children: tt("plotlines.cancel")
8142
+ })]
8143
+ })
8144
+ ]
8145
+ }),
8146
+ (project?.plotlines ?? []).length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8147
+ className: panel_module_css_default.meta,
8148
+ children: tt("plotlines.empty")
8149
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8150
+ style: {
8151
+ display: "flex",
8152
+ flexDirection: "column",
8153
+ gap: 8,
8154
+ overflowY: "auto",
8155
+ flex: 1,
8156
+ minHeight: 0
8157
+ },
8158
+ children: (project?.plotlines ?? []).map((line) => {
8159
+ const kindLabel = {
8160
+ main: tt("plotlines.kindMain"),
8161
+ branch: tt("plotlines.kindBranch"),
8162
+ character: tt("plotlines.kindCharacter"),
8163
+ mystery: tt("plotlines.kindMystery")
8164
+ }[line.kind];
8165
+ const statusLabel = {
8166
+ active: tt("plotlines.statusActive"),
8167
+ paused: tt("plotlines.statusPaused"),
8168
+ resolved: tt("plotlines.statusResolved"),
8169
+ abandoned: tt("plotlines.statusAbandoned")
8170
+ }[line.status];
8171
+ const statusColor = line.status === "resolved" ? "var(--nf-success)" : line.status === "abandoned" ? "var(--nf-text-3)" : line.status === "paused" ? "var(--nf-warn)" : "var(--nf-accent)";
8172
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7269
8173
  style: {
8174
+ border: "1px solid var(--nf-border)",
8175
+ borderRadius: 10,
8176
+ padding: "8px 12px",
8177
+ fontSize: 12,
7270
8178
  display: "flex",
7271
8179
  flexDirection: "column",
7272
- gap: 4,
7273
- maxHeight: 300,
7274
- overflowY: "auto",
7275
- fontSize: 12
8180
+ gap: 4
7276
8181
  },
7277
- children: [...project?.facts ?? []].reverse().slice(0, 60).map((fact, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7278
- style: {
7279
- display: "flex",
7280
- gap: 8,
7281
- alignItems: "flex-start"
7282
- },
7283
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7284
- className: panel_module_css_default.badge,
8182
+ children: [
8183
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8184
+ className: panel_module_css_default.row,
7285
8185
  style: {
7286
- borderColor: "var(--nf-text-3)",
7287
- color: "var(--nf-text-3)",
7288
- flex: "none",
7289
- marginTop: 1
8186
+ justifyContent: "space-between",
8187
+ flexWrap: "wrap"
7290
8188
  },
8189
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8190
+ style: {
8191
+ display: "flex",
8192
+ alignItems: "center",
8193
+ gap: 6,
8194
+ flexWrap: "wrap"
8195
+ },
8196
+ children: [
8197
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: line.name }),
8198
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8199
+ className: panel_module_css_default.badge,
8200
+ style: {
8201
+ borderColor: "var(--nf-accent)",
8202
+ color: "var(--nf-accent)"
8203
+ },
8204
+ children: kindLabel
8205
+ }),
8206
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8207
+ className: panel_module_css_default.badge,
8208
+ style: {
8209
+ borderColor: statusColor,
8210
+ color: statusColor
8211
+ },
8212
+ children: statusLabel
8213
+ })
8214
+ ]
8215
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8216
+ style: {
8217
+ display: "flex",
8218
+ gap: 6
8219
+ },
8220
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8221
+ type: "button",
8222
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
8223
+ disabled: busy,
8224
+ onClick: () => {
8225
+ setPlotlineDraft({
8226
+ id: line.id,
8227
+ name: line.name,
8228
+ kind: line.kind,
8229
+ goal: line.goal,
8230
+ progress: line.progress,
8231
+ status: line.status
8232
+ });
8233
+ },
8234
+ children: tt("plotlines.edit")
8235
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8236
+ type: "button",
8237
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
8238
+ disabled: busy,
8239
+ onClick: () => {
8240
+ handlePlotlineRemove(line.id);
8241
+ },
8242
+ children: tt("plotlines.remove")
8243
+ })]
8244
+ })]
8245
+ }),
8246
+ line.goal !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8247
+ className: panel_module_css_default.meta,
8248
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [tt("plotlines.goal"), ":"] }), line.goal]
8249
+ }),
8250
+ line.progress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8251
+ className: panel_module_css_default.meta,
8252
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [tt("plotlines.progress"), ":"] }), line.progress]
8253
+ }),
8254
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8255
+ className: panel_module_css_default.meta,
7291
8256
  children: [
7292
- "第 ",
7293
- fact.chapterNo,
7294
- " 章"
8257
+ tt("plotlines.chapters"),
8258
+ ":",
8259
+ line.chapters.length > 0 ? line.chapters.map((n) => `第${n}章`).join("、") : "—"
7295
8260
  ]
7296
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7297
- className: panel_module_css_default.meta,
7298
- children: fact.text
7299
- })]
7300
- }, i))
7301
- })
7302
- ]
8261
+ })
8262
+ ]
8263
+ }, line.id);
8264
+ })
7303
8265
  })
7304
8266
  ]
7305
8267
  })