@waterwx/dsh-novel-forge 1.3.3 → 1.4.1

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
@@ -45,6 +45,12 @@ window.__ModuleLoader__.load({
45
45
  /** 清空助手对话记录。 */
46
46
  assistantClear: "/api/dsh-novel-forge/assistant/clear",
47
47
  bookshelf: "/api/dsh-novel-forge/bookshelf",
48
+ /** 导入已有项目目录(含 novel-project.json)到书架。 */
49
+ bookshelfImportDir: "/api/dsh-novel-forge/bookshelf/import-dir",
50
+ /** 导入 txt/md 全本:拆章建项目并登记书架。 */
51
+ bookshelfImportText: "/api/dsh-novel-forge/bookshelf/import-text",
52
+ /** 导入 txt/md 全本:拆章预览(不落盘)。 */
53
+ bookshelfImportTextPreview: "/api/dsh-novel-forge/bookshelf/import-text/preview",
48
54
  /** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */
49
55
  reset: "/api/dsh-novel-forge/reset",
50
56
  /** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */
@@ -79,6 +85,8 @@ window.__ModuleLoader__.load({
79
85
  sensitiveCheck: "/api/dsh-novel-forge/sensitive-check",
80
86
  /** 开书想法 → AI 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */
81
87
  outlineSuggest: "/api/dsh-novel-forge/outline/suggest",
88
+ /** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
89
+ outlineReverse: "/api/dsh-novel-forge/outline/reverse",
82
90
  /** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */
83
91
  breakdown: "/api/dsh-novel-forge/breakdown",
84
92
  /** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */
@@ -140,6 +148,10 @@ window.__ModuleLoader__.load({
140
148
  async saveOutline(text) {
141
149
  return postJson(NOVEL_API.saveOutline, { text });
142
150
  }
151
+ /** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
152
+ async outlineReverse(onFrame) {
153
+ await this.streamJob(NOVEL_API.outlineReverse, {}, onFrame);
154
+ }
143
155
  /** 开书想法 → AI 大纲:生成 count 个方案(换批时传 exclude 避开已暂留方向)。 */
144
156
  async outlineSuggest(idea, count, exclude) {
145
157
  return postJson(NOVEL_API.outlineSuggest, {
@@ -317,6 +329,32 @@ window.__ModuleLoader__.load({
317
329
  async bookRemove(id) {
318
330
  return postJson("/api/dsh-novel-forge/bookshelf/remove", { id });
319
331
  }
332
+ /** 导入已有项目目录(Mode A):校验 novel-project.json,登记/激活书架。 */
333
+ async bookImportDir(outputDir) {
334
+ return postJson(NOVEL_API.bookshelfImportDir, { outputDir });
335
+ }
336
+ /** 导入 txt/md 全本(Mode B):服务器本地文件路径模式。 */
337
+ async bookImportText(filePath, outputDir) {
338
+ return postJson(NOVEL_API.bookshelfImportText, {
339
+ filePath,
340
+ outputDir
341
+ });
342
+ }
343
+ /** 拆章预览(浏览器上传全文,不落盘):返回识别到的章节与跳过清单。 */
344
+ async bookImportTextPreview(text, fileName) {
345
+ return postJson(NOVEL_API.bookshelfImportTextPreview, {
346
+ text,
347
+ fileName
348
+ });
349
+ }
350
+ /** 导入 txt/md 全本(Mode B):浏览器上传全文内容模式。 */
351
+ async bookImportTextContent(text, fileName, outputDir) {
352
+ return postJson(NOVEL_API.bookshelfImportText, {
353
+ text,
354
+ fileName,
355
+ outputDir
356
+ });
357
+ }
320
358
  /** 生产单:启动批量生产(区间或新增 N 章;计划不足自动补)。 */
321
359
  async runStart(req) {
322
360
  return postJson(NOVEL_API.runStart, req);
@@ -609,12 +647,14 @@ window.__ModuleLoader__.load({
609
647
  "settings.model": "模型",
610
648
  "settings.modelCustom": "自定义…",
611
649
  "settings.modelCustomPlaceholder": "输入任意模型 id",
612
- "settings.reasoningEffort": "思考强度 (reasoningEffort)",
650
+ "settings.reasoningEffort": "写作类任务思考强度 (reasoningEffort)",
651
+ "settings.reasoningHint": "章节生成/润色/重写/审稿等写作任务使用;关掉更省更快。",
652
+ "settings.analysisReasoning": "分析类任务思考强度(提炼/拆书/反推大纲)",
653
+ "settings.analysisReasoningHint": "角色/场景/道藏提炼、拆书、反推大纲等一次性分析任务默认 low,保证质量,不受上面写作档位影响。",
613
654
  "settings.reasoning.off": "off · 关闭思考(推荐日常写文)",
614
655
  "settings.reasoning.low": "low · 低思考",
615
656
  "settings.reasoning.high": "high · 高思考",
616
657
  "settings.reasoning.max": "max · 最高思考(质检/推演)",
617
- "settings.reasoningHint": "off 最快最省;high/max 更慢更贵但推理更强",
618
658
  "settings.theme": "主题",
619
659
  "settings.themeLiquid": "iOS 液态玻璃(绿)",
620
660
  "settings.themeClassic": "经典毛玻璃(蓝)",
@@ -759,7 +799,9 @@ window.__ModuleLoader__.load({
759
799
  "settings.model": "Model",
760
800
  "settings.modelCustom": "Custom…",
761
801
  "settings.modelCustomPlaceholder": "Type any model id",
762
- "settings.reasoningEffort": "Reasoning effort",
802
+ "settings.reasoningEffort": "Writing-task reasoning effort",
803
+ "settings.analysisReasoning": "Analysis-task reasoning (extract / breakdown / reverse outline)",
804
+ "settings.analysisReasoningHint": "One-off analysis tasks (roles/scenes/bible extract, breakdown, reverse outline) default to low; not affected by the writing-level switch.",
763
805
  "settings.reasoning.off": "off · no thinking (recommended)",
764
806
  "settings.reasoning.low": "low",
765
807
  "settings.reasoning.high": "high",
@@ -900,7 +942,7 @@ window.__ModuleLoader__.load({
900
942
  }
901
943
  //#endregion
902
944
  //#region \0dsh-css:D:\ryan work\harness\plugins\novel-forge\src\client\panel\panel.module.css.mjs
903
- const css = ".zE6uZW_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] .zE6uZW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.zE6uZW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.zE6uZW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.zE6uZW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.zE6uZW_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:#00b85c2e;--nf-glass-orb-b:#78a0ff21;--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] .zE6uZW_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:#00ca5247;--nf-glass-orb-b:#bec8d71a;--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]) .zE6uZW_view{display:block}.zE6uZW_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] .zE6uZW_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]) .zE6uZW_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] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#00c563,#00a952);box-shadow:5px 5px 10px #a3b1c699,-5px -5px 10px #ffffffd9}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#3ddc86,#27b96a);box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}.zE6uZW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_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}.zE6uZW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.zE6uZW_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}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_tab[data-active]{color:var(--nf-accent);font-weight:600}.zE6uZW_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}.zE6uZW_panelContent{z-index:1;flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);width:200px;box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);border-radius:18px;flex-direction:column;flex:none;align-self:stretch;gap:4px;margin:10px 0 10px 12px;padding:14px 10px 12px;transition:width .18s;display:flex;overflow-y:auto}.zE6uZW_panelNavCollapsed{width:52px;padding:10px 6px}.zE6uZW_navGroup{flex-direction:column;gap:4px;display:flex}.zE6uZW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:10px 10px 4px;font-size:10.5px;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.zE6uZW_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}.zE6uZW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_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}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{align-items:center;padding:6px 2px 2px}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.zE6uZW_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}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.zE6uZW_navTabBadgeDanger{background:var(--nf-error)}.zE6uZW_navTabBadgeWarn{background:var(--nf-warn)}.zE6uZW_navTabBadgeDone{background:var(--nf-success)}.zE6uZW_navTabBadgeLive{background:var(--nf-success);animation:1.2s ease-in-out infinite zE6uZW_navBadgePulse}@keyframes zE6uZW_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.zE6uZW_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:1px solid #0000;border-radius:10px;align-items:center;gap:8px;padding:9px 10px;font-size:13px;font-weight:500;transition:color .15s,background .15s,border-color .15s,box-shadow .15s;display:flex;position:relative}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{justify-content:center;padding:8px 0}.zE6uZW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navTab[data-active]{color:var(--nf-accent);background:color-mix(in srgb, var(--nf-text) 8%, transparent);border-color:color-mix(in srgb, var(--nf-text) 16%, transparent);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--nf-text) 6%, transparent);font-weight:600}.zE6uZW_navTab[data-active] .zE6uZW_navTabIcon{color:var(--nf-accent)}.zE6uZW_navTabIcon{text-align:center;flex:none;width:20px;font-size:16px;line-height:1}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitle{border-bottom:1px solid var(--nf-border);flex:none;align-items:center;gap:10px;min-width:0;margin-bottom:6px;padding:2px 6px 12px;display:flex}.zE6uZW_navTitleLogo{background:linear-gradient(145deg, var(--nf-accent), var(--nf-accent-hover));width:34px;height:34px;color:var(--nf-accent-fg);box-shadow:0 6px 16px var(--nf-accent-soft);border-radius:10px;flex:none;justify-content:center;align-items:center;font-size:15px;font-weight:800;display:flex}.zE6uZW_navTitleName{letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;overflow:hidden}.zE6uZW_navTitleBook{color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.zE6uZW_panelNavCollapsed .zE6uZW_navTitle{justify-content:center;padding:2px 0 10px}.zE6uZW_panelNavCollapsed .zE6uZW_navTitleLogo{width:32px;height:32px}.zE6uZW_navActions{border-top:1px solid var(--nf-border);flex:none;gap:6px;margin-top:8px;padding-top:8px;display:flex}.zE6uZW_navActionBtn{border:1px solid var(--nf-border);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:10px;flex:1;justify-content:center;align-items:center;height:32px;font-size:14px;line-height:1;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.zE6uZW_navActionBtn:hover{background:var(--nf-hover);color:var(--nf-text);border-color:var(--nf-border-strong)}.zE6uZW_panelNavCollapsed .zE6uZW_navActions{flex-direction:column;align-items:stretch}.zE6uZW_bookSwitch{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;text-align:left;font:inherit;color:var(--nf-text);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:0;margin-top:4px;padding:9px;transition:background .15s,border-color .15s;display:flex}.zE6uZW_bookSwitch:hover{background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_bookSwitchCover{background:linear-gradient(160deg, var(--nf-accent), color-mix(in srgb, var(--nf-accent) 45%, #000));width:26px;height:34px;color:var(--nf-accent-fg);border-radius:5px;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex}.zE6uZW_bookSwitchName{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;overflow:hidden}.zE6uZW_bookSwitchMeta{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_bookSwitchArrow{color:var(--nf-text-3);flex:none;margin-left:auto;font-size:12px}.zE6uZW_statRowD{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.zE6uZW_statCardD{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:16px;justify-content:space-between;align-items:flex-start;gap:10px;min-width:0;padding:14px 16px;display:flex}.zE6uZW_statCardDLabel{color:var(--nf-text-3);font-size:12px}.zE6uZW_statCardDValue{color:var(--nf-text);margin-top:2px;font-size:22px;font-weight:700}.zE6uZW_statCardDUnit{color:var(--nf-text-3);font-size:12px;font-weight:400}.zE6uZW_statCardDDetail{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11.5px;overflow:hidden}.zE6uZW_statCardDDown{color:var(--nf-error)}.zE6uZW_statCardDIcon{background:var(--nf-accent-soft);border-radius:12px;flex:none;justify-content:center;align-items:center;width:38px;height:38px;font-size:18px;display:flex}.zE6uZW_statCardDIconRed{background:color-mix(in srgb, var(--nf-error) 13%, transparent)}.zE6uZW_tlBar{gap:6px;margin-top:8px;display:flex}.zE6uZW_tlSeg{cursor:pointer;min-width:0;font:inherit;background:0 0;border:none;flex-direction:column;flex:1;gap:4px;padding:0;display:flex}.zE6uZW_tlSegTrack{background:var(--nf-hover);border:1px solid var(--nf-border);border-radius:999px;height:8px;overflow:hidden}.zE6uZW_tlSegFill{background:var(--nf-accent);border-radius:999px;width:100%;height:100%;display:block}.zE6uZW_tlSegTodo .zE6uZW_tlSegFill{opacity:0}.zE6uZW_tlSegTodo .zE6uZW_tlSegTrack{background:0 0}.zE6uZW_tlSegCurrent .zE6uZW_tlSegTrack{border-color:var(--nf-accent);box-shadow:0 0 0 2px var(--nf-accent-soft)}.zE6uZW_tlSegCurrent .zE6uZW_tlSegFill{opacity:.45}.zE6uZW_tlSegLabel{color:var(--nf-text-3);text-align:center;white-space:nowrap;text-overflow:ellipsis;font-size:10.5px;overflow:hidden}.zE6uZW_tlSegDone .zE6uZW_tlSegLabel{color:var(--nf-accent);font-weight:600}.zE6uZW_tlSeg:hover .zE6uZW_tlSegTrack{border-color:var(--nf-border-strong)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_card:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_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)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.zE6uZW_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}.zE6uZW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_button:active:not([disabled]){transform:scale(.96)}.zE6uZW_button[disabled]{opacity:.45;cursor:not-allowed}.zE6uZW_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}.zE6uZW_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}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.zE6uZW_field{flex-direction:column;gap:5px;display:flex}.zE6uZW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.zE6uZW_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}.zE6uZW_input:focus,.zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.zE6uZW_input::placeholder,.zE6uZW_textarea::placeholder{color:var(--nf-text-3)}.zE6uZW_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}.zE6uZW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{flex-direction:column;gap:8px;display:flex}.zE6uZW_volumeGroup{flex-direction:column;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_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}.zE6uZW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.zE6uZW_chapterFocus{animation:.9s ease-in-out 3 zE6uZW_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes zE6uZW_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.zE6uZW_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}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.zE6uZW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.zE6uZW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.zE6uZW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.zE6uZW_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 zE6uZW_pulse}.zE6uZW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.zE6uZW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.zE6uZW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.zE6uZW_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}.zE6uZW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.zE6uZW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_toolStepIcon{flex:none;font-size:13px}.zE6uZW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.zE6uZW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.zE6uZW_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}.zE6uZW_progressLine{color:var(--nf-text-2);opacity:.9}.zE6uZW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.zE6uZW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.zE6uZW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.zE6uZW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.zE6uZW_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}.zE6uZW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.zE6uZW_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}.zE6uZW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.zE6uZW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.zE6uZW_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)}.zE6uZW_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)}.zE6uZW_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)}.zE6uZW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.zE6uZW_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}.zE6uZW_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}.zE6uZW_diffText{white-space:pre-wrap}.zE6uZW_diffDel .zE6uZW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.zE6uZW_diffAdd .zE6uZW_diffText{color:var(--nf-success)}.zE6uZW_wsPage{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex}.zE6uZW_wsPageHeader{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.zE6uZW_wsAppliedBanner{border:1px solid var(--nf-success);background:color-mix(in srgb, var(--nf-success) 8%, transparent);border-radius:10px;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.zE6uZW_wsColumns{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;min-height:0;display:grid}.zE6uZW_wsColumn{flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);white-space:pre-wrap;flex:1;font-size:13px;line-height:1.75}.zE6uZW_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}.zE6uZW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(30px)saturate(180%);border-radius:14px;flex-direction:column;gap:4px;padding:10px 12px;transition:transform .22s,box-shadow .22s;display:flex}.zE6uZW_assetStat:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1px 0 var(--nf-glass-sheen);transform:translateY(-3px)}.zE6uZW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.zE6uZW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashHero:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_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)}.zE6uZW_dashHero>*{z-index:1;position:relative}.zE6uZW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:14px}.zE6uZW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.zE6uZW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:14px;font-weight:600}.zE6uZW_dashJourney{flex-direction:column;gap:6px;display:flex}.zE6uZW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashStageDone{color:var(--nf-text-2)}.zE6uZW_dashStageDone .zE6uZW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.zE6uZW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.zE6uZW_dashStageCurrent .zE6uZW_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)}.zE6uZW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.zE6uZW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.zE6uZW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.zE6uZW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.zE6uZW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.zE6uZW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.zE6uZW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.zE6uZW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_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}.zE6uZW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.zE6uZW_assistantFloatBody>*{flex:1;min-width:0}.zE6uZW_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}.zE6uZW_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}.zE6uZW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.zE6uZW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.zE6uZW_shelfHeader{flex-direction:column;gap:10px;display:flex}.zE6uZW_shelfTitleRow{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.zE6uZW_shelfToolbar{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfFilters{flex-wrap:wrap;gap:6px;display:flex}.zE6uZW_shelfEmpty{border:1px dashed var(--nf-border-strong);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;border-radius:16px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;padding:40px 20px;display:flex}.zE6uZW_shelfEmptyIcon{font-size:42px}.zE6uZW_shelfEmptyTitle{font-size:16px;font-weight:700}.zE6uZW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.zE6uZW_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}.zE6uZW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.zE6uZW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_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}.zE6uZW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_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}.zE6uZW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.zE6uZW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.zE6uZW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.zE6uZW_bookAddCard:hover{color:var(--nf-accent)}.zE6uZW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_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}.zE6uZW_createBookIcon{font-size:34px;line-height:1}.zE6uZW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.zE6uZW_ideaCard{border:1px dashed var(--nf-border-strong);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.zE6uZW_ideaToggle{color:var(--nf-accent);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:0;font-size:13px;font-weight:700;display:flex}.zE6uZW_ideaCandidate{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.zE6uZW_panelContent::-webkit-scrollbar,.zE6uZW_chatScroll::-webkit-scrollbar,.zE6uZW_chapterPreview::-webkit-scrollbar,.zE6uZW_progress::-webkit-scrollbar,.zE6uZW_toolLive::-webkit-scrollbar{width:8px;height:8px}.zE6uZW_panelContent::-webkit-scrollbar-thumb,.zE6uZW_chatScroll::-webkit-scrollbar-thumb,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb,.zE6uZW_progress::-webkit-scrollbar-thumb,.zE6uZW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.zE6uZW_panelContent::-webkit-scrollbar-thumb:hover,.zE6uZW_chatScroll::-webkit-scrollbar-thumb:hover,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb:hover,.zE6uZW_progress::-webkit-scrollbar-thumb:hover,.zE6uZW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.zE6uZW_workflowList{flex-direction:column;gap:0;display:flex}.zE6uZW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.zE6uZW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.zE6uZW_workflowRow:last-child:before{display:none}.zE6uZW_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}.zE6uZW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.zE6uZW_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)}.zE6uZW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.zE6uZW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.zE6uZW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes zE6uZW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes zE6uZW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.zE6uZW_card{animation:.2s zE6uZW_fadeIn}.zE6uZW_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}.zE6uZW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.zE6uZW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.zE6uZW_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}.zE6uZW_bookChip:hover{border-color:var(--nf-border-strong)}.zE6uZW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.zE6uZW_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}.zE6uZW_bookChipRemove:hover{color:var(--nf-error)}.zE6uZW_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}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_dropzone:hover,.zE6uZW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_dropzoneIcon{font-size:22px;line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:6px;margin-top:2px;display:flex}.zE6uZW_bookCardActions .zE6uZW_button{flex:1;justify-content:center}.zE6uZW_readerView{flex-direction:column;transition:background .2s,color .2s;display:flex;position:absolute;inset:0;overflow:hidden}.zE6uZW_readerHeader{border-bottom:1px solid;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;display:flex}.zE6uZW_readerTitle{font-size:14px;font-weight:700}.zE6uZW_readerSeg{border-radius:8px;align-items:center;gap:2px;display:flex;overflow:hidden}.zE6uZW_readerSegBtn{cursor:pointer;opacity:.75;background:0 0;border:none;border-radius:6px;padding:3px 8px;font-size:12px}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{scrollbar-width:thin;border-right:1px solid;flex-direction:column;flex:none;gap:10px;width:220px;min-width:220px;padding:8px 6px 24px;display:flex;overflow-y:auto}.zE6uZW_readerGroup{flex-direction:column;gap:1px;display:flex}.zE6uZW_readerGroupTitle{opacity:.9;cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px 4px;font-size:12px;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{text-align:center;flex:none;width:12px;font-size:10px}.zE6uZW_readerGroupCount{opacity:.6;flex:none;margin-left:auto;padding-right:2px;font-size:11px;font-weight:400}.zE6uZW_readerItem{text-align:left;cursor:pointer;opacity:.8;background:0 0;border:1px solid;border-radius:8px;align-items:center;gap:6px;min-width:0;padding:4px 8px;font-size:12px;transition:opacity .15s,background .15s;display:flex}.zE6uZW_readerItem:hover{opacity:1}.zE6uZW_readerItemActive{opacity:1;font-weight:700}.zE6uZW_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.zE6uZW_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.zE6uZW_readerItemBadge{flex:none;font-size:11px}.zE6uZW_readerMain{scrollbar-width:thin;flex:1;justify-content:center;min-height:0;padding:20px 16px 48px;display:flex;overflow-y:auto}.zE6uZW_readerArticle{flex-direction:column;gap:12px;width:100%;display:flex}.zE6uZW_readerChapterTitle{letter-spacing:1px;margin:0;font-size:24px;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:8px;font-size:12px;display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{border-top:1px dashed;justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{opacity:.7;align-self:center;padding:32px 0;font-size:13px}.zE6uZW_readerError{color:var(--nf-error)}";
945
+ const css = ".zE6uZW_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] .zE6uZW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.zE6uZW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.zE6uZW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.zE6uZW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.zE6uZW_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:#00b85c2e;--nf-glass-orb-b:#78a0ff21;--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] .zE6uZW_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:#00ca5247;--nf-glass-orb-b:#bec8d71a;--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]) .zE6uZW_view{display:block}.zE6uZW_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] .zE6uZW_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]) .zE6uZW_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] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#00c563,#00a952);box-shadow:5px 5px 10px #a3b1c699,-5px -5px 10px #ffffffd9}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_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] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#3ddc86,#27b96a);box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}.zE6uZW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_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}.zE6uZW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.zE6uZW_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}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_tab[data-active]{color:var(--nf-accent);font-weight:600}.zE6uZW_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}.zE6uZW_panelContent{z-index:1;flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);width:200px;box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);border-radius:18px;flex-direction:column;flex:none;align-self:stretch;gap:4px;margin:10px 0 10px 12px;padding:14px 10px 12px;transition:width .18s;display:flex;overflow-y:auto}.zE6uZW_panelNavCollapsed{width:52px;padding:10px 6px}.zE6uZW_navGroup{flex-direction:column;gap:4px;display:flex}.zE6uZW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:10px 10px 4px;font-size:10.5px;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.zE6uZW_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}.zE6uZW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_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}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{align-items:center;padding:6px 2px 2px}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.zE6uZW_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}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.zE6uZW_navTabBadgeDanger{background:var(--nf-error)}.zE6uZW_navTabBadgeWarn{background:var(--nf-warn)}.zE6uZW_navTabBadgeDone{background:var(--nf-success)}.zE6uZW_navTabBadgeLive{background:var(--nf-success);animation:1.2s ease-in-out infinite zE6uZW_navBadgePulse}@keyframes zE6uZW_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.zE6uZW_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:1px solid #0000;border-radius:10px;align-items:center;gap:8px;padding:9px 10px;font-size:13px;font-weight:500;transition:color .15s,background .15s,border-color .15s,box-shadow .15s;display:flex;position:relative}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{justify-content:center;padding:8px 0}.zE6uZW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navTab[data-active]{color:var(--nf-accent);background:color-mix(in srgb, var(--nf-text) 8%, transparent);border-color:color-mix(in srgb, var(--nf-text) 16%, transparent);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--nf-text) 6%, transparent);font-weight:600}.zE6uZW_navTab[data-active] .zE6uZW_navTabIcon{color:var(--nf-accent)}.zE6uZW_navTabIcon{text-align:center;flex:none;width:20px;font-size:16px;line-height:1}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitle{border-bottom:1px solid var(--nf-border);flex:none;align-items:center;gap:10px;min-width:0;margin-bottom:6px;padding:2px 6px 12px;display:flex}.zE6uZW_navTitleLogo{background:linear-gradient(145deg, var(--nf-accent), var(--nf-accent-hover));width:34px;height:34px;color:var(--nf-accent-fg);box-shadow:0 6px 16px var(--nf-accent-soft);border-radius:10px;flex:none;justify-content:center;align-items:center;font-size:15px;font-weight:800;display:flex}.zE6uZW_navTitleName{letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;overflow:hidden}.zE6uZW_navTitleBook{color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.zE6uZW_panelNavCollapsed .zE6uZW_navTitle{justify-content:center;padding:2px 0 10px}.zE6uZW_panelNavCollapsed .zE6uZW_navTitleLogo{width:32px;height:32px}.zE6uZW_navActions{border-top:1px solid var(--nf-border);flex:none;gap:6px;margin-top:8px;padding-top:8px;display:flex}.zE6uZW_navActionBtn{border:1px solid var(--nf-border);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:10px;flex:1;justify-content:center;align-items:center;height:32px;font-size:14px;line-height:1;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.zE6uZW_navActionBtn:hover{background:var(--nf-hover);color:var(--nf-text);border-color:var(--nf-border-strong)}.zE6uZW_panelNavCollapsed .zE6uZW_navActions{flex-direction:column;align-items:stretch}.zE6uZW_bookSwitch{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;text-align:left;font:inherit;color:var(--nf-text);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:0;margin-top:4px;padding:9px;transition:background .15s,border-color .15s;display:flex}.zE6uZW_bookSwitch:hover{background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_bookSwitchCover{background:linear-gradient(160deg, var(--nf-accent), color-mix(in srgb, var(--nf-accent) 45%, #000));width:26px;height:34px;color:var(--nf-accent-fg);border-radius:5px;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex}.zE6uZW_bookSwitchName{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;overflow:hidden}.zE6uZW_bookSwitchMeta{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_bookSwitchArrow{color:var(--nf-text-3);flex:none;margin-left:auto;font-size:12px}.zE6uZW_statRowD{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.zE6uZW_statCardD{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:16px;justify-content:space-between;align-items:flex-start;gap:10px;min-width:0;padding:14px 16px;display:flex}.zE6uZW_statCardDLabel{color:var(--nf-text-3);font-size:12px}.zE6uZW_statCardDValue{color:var(--nf-text);margin-top:2px;font-size:22px;font-weight:700}.zE6uZW_statCardDUnit{color:var(--nf-text-3);font-size:12px;font-weight:400}.zE6uZW_statCardDDetail{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11.5px;overflow:hidden}.zE6uZW_statCardDDown{color:var(--nf-error)}.zE6uZW_statCardDIcon{background:var(--nf-accent-soft);border-radius:12px;flex:none;justify-content:center;align-items:center;width:38px;height:38px;font-size:18px;display:flex}.zE6uZW_statCardDIconRed{background:color-mix(in srgb, var(--nf-error) 13%, transparent)}.zE6uZW_tlBar{gap:6px;margin-top:8px;display:flex}.zE6uZW_tlSeg{cursor:pointer;min-width:0;font:inherit;background:0 0;border:none;flex-direction:column;flex:1;gap:4px;padding:0;display:flex}.zE6uZW_tlSegTrack{background:var(--nf-hover);border:1px solid var(--nf-border);border-radius:999px;height:8px;overflow:hidden}.zE6uZW_tlSegFill{background:var(--nf-accent);border-radius:999px;width:100%;height:100%;display:block}.zE6uZW_tlSegTodo .zE6uZW_tlSegFill{opacity:0}.zE6uZW_tlSegTodo .zE6uZW_tlSegTrack{background:0 0}.zE6uZW_tlSegCurrent .zE6uZW_tlSegTrack{border-color:var(--nf-accent);box-shadow:0 0 0 2px var(--nf-accent-soft)}.zE6uZW_tlSegCurrent .zE6uZW_tlSegFill{opacity:.45}.zE6uZW_tlSegLabel{color:var(--nf-text-3);text-align:center;white-space:nowrap;text-overflow:ellipsis;font-size:10.5px;overflow:hidden}.zE6uZW_tlSegDone .zE6uZW_tlSegLabel{color:var(--nf-accent);font-weight:600}.zE6uZW_tlSeg:hover .zE6uZW_tlSegTrack{border-color:var(--nf-border-strong)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_card:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_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)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.zE6uZW_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}.zE6uZW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_button:active:not([disabled]){transform:scale(.96)}.zE6uZW_button[disabled]{opacity:.45;cursor:not-allowed}.zE6uZW_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}.zE6uZW_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}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.zE6uZW_field{flex-direction:column;gap:5px;display:flex}.zE6uZW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.zE6uZW_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}.zE6uZW_input:focus,.zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.zE6uZW_input::placeholder,.zE6uZW_textarea::placeholder{color:var(--nf-text-3)}.zE6uZW_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}.zE6uZW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{flex-direction:column;gap:8px;display:flex}.zE6uZW_volumeGroup{flex-direction:column;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_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}.zE6uZW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.zE6uZW_chapterFocus{animation:.9s ease-in-out 3 zE6uZW_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes zE6uZW_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.zE6uZW_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}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.zE6uZW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.zE6uZW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.zE6uZW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.zE6uZW_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 zE6uZW_pulse}.zE6uZW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.zE6uZW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.zE6uZW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_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}.zE6uZW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.zE6uZW_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}.zE6uZW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.zE6uZW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_toolStepIcon{flex:none;font-size:13px}.zE6uZW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.zE6uZW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.zE6uZW_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}.zE6uZW_progressLine{color:var(--nf-text-2);opacity:.9}.zE6uZW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.zE6uZW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.zE6uZW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.zE6uZW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.zE6uZW_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}.zE6uZW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.zE6uZW_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}.zE6uZW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.zE6uZW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.zE6uZW_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)}.zE6uZW_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)}.zE6uZW_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)}.zE6uZW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.zE6uZW_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}.zE6uZW_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}.zE6uZW_diffText{white-space:pre-wrap}.zE6uZW_diffDel .zE6uZW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.zE6uZW_diffAdd .zE6uZW_diffText{color:var(--nf-success)}.zE6uZW_wsPage{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex}.zE6uZW_wsPageHeader{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.zE6uZW_wsAppliedBanner{border:1px solid var(--nf-success);background:color-mix(in srgb, var(--nf-success) 8%, transparent);border-radius:10px;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.zE6uZW_wsColumns{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;min-height:0;display:grid}.zE6uZW_wsColumn{flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);white-space:pre-wrap;flex:1;font-size:13px;line-height:1.75}.zE6uZW_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}.zE6uZW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(30px)saturate(180%);border-radius:14px;flex-direction:column;gap:4px;padding:10px 12px;transition:transform .22s,box-shadow .22s;display:flex}.zE6uZW_assetStat:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1px 0 var(--nf-glass-sheen);transform:translateY(-3px)}.zE6uZW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.zE6uZW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashHero:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_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)}.zE6uZW_dashHero>*{z-index:1;position:relative}.zE6uZW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:14px}.zE6uZW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.zE6uZW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:14px;font-weight:600}.zE6uZW_dashJourney{flex-direction:column;gap:6px;display:flex}.zE6uZW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.zE6uZW_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}.zE6uZW_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}.zE6uZW_dashStageDone{color:var(--nf-text-2)}.zE6uZW_dashStageDone .zE6uZW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.zE6uZW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.zE6uZW_dashStageCurrent .zE6uZW_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)}.zE6uZW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.zE6uZW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.zE6uZW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.zE6uZW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.zE6uZW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.zE6uZW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.zE6uZW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.zE6uZW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_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}.zE6uZW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_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}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.zE6uZW_assistantFloatBody>*{flex:1;min-width:0}.zE6uZW_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}.zE6uZW_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}.zE6uZW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.zE6uZW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.zE6uZW_shelfHeader{flex-direction:column;gap:10px;display:flex}.zE6uZW_shelfTitleRow{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.zE6uZW_shelfToolbar{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfFilters{flex-wrap:wrap;gap:6px;display:flex}.zE6uZW_shelfEmpty{border:1px dashed var(--nf-border-strong);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;border-radius:16px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;padding:40px 20px;display:flex}.zE6uZW_shelfEmptyIcon{font-size:42px}.zE6uZW_shelfEmptyTitle{font-size:16px;font-weight:700}.zE6uZW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.zE6uZW_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}.zE6uZW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.zE6uZW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_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}.zE6uZW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_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}.zE6uZW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.zE6uZW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.zE6uZW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.zE6uZW_bookAddCard:hover{color:var(--nf-accent)}.zE6uZW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_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}.zE6uZW_createBookIcon{font-size:34px;line-height:1}.zE6uZW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.zE6uZW_ideaCard{border:1px dashed var(--nf-border-strong);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.zE6uZW_ideaToggle{color:var(--nf-accent);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:0;font-size:13px;font-weight:700;display:flex}.zE6uZW_ideaCandidate{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.zE6uZW_panelContent::-webkit-scrollbar,.zE6uZW_chatScroll::-webkit-scrollbar,.zE6uZW_chapterPreview::-webkit-scrollbar,.zE6uZW_progress::-webkit-scrollbar,.zE6uZW_toolLive::-webkit-scrollbar{width:8px;height:8px}.zE6uZW_panelContent::-webkit-scrollbar-thumb,.zE6uZW_chatScroll::-webkit-scrollbar-thumb,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb,.zE6uZW_progress::-webkit-scrollbar-thumb,.zE6uZW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.zE6uZW_panelContent::-webkit-scrollbar-thumb:hover,.zE6uZW_chatScroll::-webkit-scrollbar-thumb:hover,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb:hover,.zE6uZW_progress::-webkit-scrollbar-thumb:hover,.zE6uZW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.zE6uZW_workflowList{flex-direction:column;gap:0;display:flex}.zE6uZW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.zE6uZW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.zE6uZW_workflowRow:last-child:before{display:none}.zE6uZW_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}.zE6uZW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.zE6uZW_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)}.zE6uZW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.zE6uZW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.zE6uZW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes zE6uZW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes zE6uZW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.zE6uZW_card{animation:.2s zE6uZW_fadeIn}.zE6uZW_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}.zE6uZW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.zE6uZW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.zE6uZW_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}.zE6uZW_bookChip:hover{border-color:var(--nf-border-strong)}.zE6uZW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.zE6uZW_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}.zE6uZW_bookChipRemove:hover{color:var(--nf-error)}.zE6uZW_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}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:6px;display:flex}.zE6uZW_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}.zE6uZW_dropzone:hover,.zE6uZW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_dropzoneIcon{font-size:22px;line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:6px;margin-top:2px;display:flex}.zE6uZW_bookCardActions .zE6uZW_button{flex:1;justify-content:center}.zE6uZW_readerView{flex-direction:column;transition:background .2s,color .2s;display:flex;position:absolute;inset:0;overflow:hidden}.zE6uZW_readerHeader{border-bottom:1px solid;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;display:flex}.zE6uZW_readerTitle{font-size:14px;font-weight:700}.zE6uZW_readerSeg{border-radius:8px;align-items:center;gap:2px;display:flex;overflow:hidden}.zE6uZW_readerSegBtn{cursor:pointer;opacity:.75;background:0 0;border:none;border-radius:6px;padding:3px 8px;font-size:12px}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{scrollbar-width:thin;border-right:1px solid;flex-direction:column;flex:none;gap:10px;width:220px;min-width:220px;padding:8px 6px 24px;display:flex;overflow-y:auto}.zE6uZW_readerGroup{flex-direction:column;gap:1px;display:flex}.zE6uZW_readerGroupTitle{opacity:.9;cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px 4px;font-size:12px;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{text-align:center;flex:none;width:12px;font-size:10px}.zE6uZW_readerGroupCount{opacity:.6;flex:none;margin-left:auto;padding-right:2px;font-size:11px;font-weight:400}.zE6uZW_readerItem{text-align:left;cursor:pointer;opacity:.8;background:0 0;border:1px solid;border-radius:8px;align-items:center;gap:6px;min-width:0;padding:4px 8px;font-size:12px;transition:opacity .15s,background .15s;display:flex}.zE6uZW_readerItem:hover{opacity:1}.zE6uZW_readerItemActive{opacity:1;font-weight:700}.zE6uZW_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.zE6uZW_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.zE6uZW_readerItemBadge{flex:none;font-size:11px}.zE6uZW_readerMain{scrollbar-width:thin;flex:1;justify-content:center;min-height:0;padding:20px 16px 48px;display:flex;overflow-y:auto}.zE6uZW_readerArticle{flex-direction:column;gap:12px;width:100%;display:flex}.zE6uZW_readerChapterTitle{letter-spacing:1px;margin:0;font-size:24px;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:8px;font-size:12px;display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{border-top:1px dashed;justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{opacity:.7;align-self:center;padding:32px 0;font-size:13px}.zE6uZW_readerError{color:var(--nf-error)}.zE6uZW_importModalOverlay{z-index:1000;backdrop-filter:blur(4px);background:#00000073;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.zE6uZW_importModal{border:1px solid var(--nf-border-strong);background:var(--nf-bg-raise);backdrop-filter:blur(28px)saturate(180%);width:min(520px,100%);max-height:85vh;box-shadow:var(--nf-shadow-lg);border-radius:16px;flex-direction:column;gap:12px;padding:16px;display:flex;overflow:auto}.zE6uZW_importModalHead{justify-content:space-between;align-items:center;gap:10px;display:flex}.zE6uZW_importModalTabs{gap:8px;display:flex}.zE6uZW_importModalTabs .zE6uZW_button{flex:1}.zE6uZW_importModalBody{flex-direction:column;gap:10px;display:flex}.zE6uZW_importField{color:var(--nf-text-2);flex-direction:column;gap:5px;font-size:13px;display:flex}.zE6uZW_importHint{color:var(--nf-text-3);font-size:12px;line-height:1.5}.zE6uZW_importError{border:1px solid color-mix(in srgb, var(--nf-danger,#e5484d) 55%, transparent);color:var(--nf-danger,#e5484d);background:color-mix(in srgb, var(--nf-danger,#e5484d) 10%, transparent);white-space:pre-wrap;word-break:break-all;border-radius:10px;padding:8px 10px;font-size:12.5px}.zE6uZW_importResult{border:1px solid color-mix(in srgb, var(--nf-ok,#46a758) 45%, transparent);background:color-mix(in srgb, var(--nf-ok,#46a758) 9%, transparent);word-break:break-all;border-radius:10px;flex-direction:column;gap:4px;padding:10px 12px;font-size:13px;display:flex}.zE6uZW_importModalActions{justify-content:flex-end;gap:8px;display:flex}.zE6uZW_importFileInfo{color:var(--nf-text-1);flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.zE6uZW_importPreview{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:4px;padding:10px 12px;font-size:13px;display:flex}.zE6uZW_importPreviewList{color:var(--nf-text-2);flex-direction:column;gap:2px;max-height:140px;margin:0;padding-left:18px;font-size:12.5px;display:flex;overflow:auto}.zE6uZW_settingsCard .zE6uZW_fieldLabel{white-space:nowrap;text-overflow:ellipsis;max-width:100%;min-height:18px;line-height:18px;overflow:hidden}.zE6uZW_settingsCard .zE6uZW_row{align-items:flex-start}.zE6uZW_helpTipText{background:var(--nf-bg-raise);border:1px solid var(--nf-border-strong);width:280px;max-width:70vw;box-shadow:var(--nf-shadow-lg);color:var(--nf-text-2);white-space:normal;z-index:20;text-align:left;pointer-events:none;border-radius:10px;padding:10px 12px;font-size:12px;font-weight:400;line-height:1.7;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.zE6uZW_helpTip:hover .zE6uZW_helpTipText,.zE6uZW_helpTip:focus .zE6uZW_helpTipText,.zE6uZW_helpTip:focus-within .zE6uZW_helpTipText{display:block}";
904
946
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
905
947
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
906
948
  const tag = document.createElement("style");
@@ -910,271 +952,287 @@ window.__ModuleLoader__.load({
910
952
  document.head.appendChild(tag);
911
953
  }
912
954
  var panel_module_css_default = {
913
- "dashStageDone": "zE6uZW_dashStageDone",
914
- "bookCreateOutline": "zE6uZW_bookCreateOutline",
915
- "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
916
- "ideaToggle": "zE6uZW_ideaToggle",
917
- "input": "zE6uZW_input",
918
- "wsPage": "zE6uZW_wsPage",
919
- "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
920
- "dashHeroBook": "zE6uZW_dashHeroBook",
921
- "createBookTop": "zE6uZW_createBookTop",
922
- "progressBar": "zE6uZW_progressBar",
923
- "tlSegTodo": "zE6uZW_tlSegTodo",
924
- "wsEditor": "zE6uZW_wsEditor",
925
- "shelfHeader": "zE6uZW_shelfHeader",
926
- "toolLive": "zE6uZW_toolLive",
927
- "panelTitle": "zE6uZW_panelTitle",
928
- "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
929
- "dashHeroTitle": "zE6uZW_dashHeroTitle",
930
- "todoInfo": "zE6uZW_todoInfo",
931
- "chapterPreview": "zE6uZW_chapterPreview",
932
- "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
933
- "navAboutRow": "zE6uZW_navAboutRow",
955
+ "navTitleLogo": "zE6uZW_navTitleLogo",
956
+ "assistantStatus": "zE6uZW_assistantStatus",
957
+ "button": "zE6uZW_button",
958
+ "statCardDDetail": "zE6uZW_statCardDDetail",
959
+ "badgeWritten": "zE6uZW_badgeWritten",
934
960
  "chatScroll": "zE6uZW_chatScroll",
935
- "wsPreviewText": "zE6uZW_wsPreviewText",
936
- "workflowDotActive": "zE6uZW_workflowDotActive",
937
- "busyRow": "zE6uZW_busyRow",
938
- "workflowBody": "zE6uZW_workflowBody",
939
- "readerSegBtn": "zE6uZW_readerSegBtn",
940
- "readerGroupCount": "zE6uZW_readerGroupCount",
941
- "workflowDot": "zE6uZW_workflowDot",
942
- "workflowHint": "zE6uZW_workflowHint",
961
+ "readerSeg": "zE6uZW_readerSeg",
962
+ "tlSeg": "zE6uZW_tlSeg",
963
+ "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
964
+ "assetStat": "zE6uZW_assetStat",
965
+ "importResult": "zE6uZW_importResult",
966
+ "assetStatDetail": "zE6uZW_assetStatDetail",
967
+ "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
943
968
  "dropzoneActive": "zE6uZW_dropzoneActive",
944
- "statRowD": "zE6uZW_statRowD",
945
- "readerPara": "zE6uZW_readerPara",
946
- "navActionBtn": "zE6uZW_navActionBtn",
969
+ "badgeError": "zE6uZW_badgeError",
970
+ "createBookView": "zE6uZW_createBookView",
971
+ "toolStepError": "zE6uZW_toolStepError",
972
+ "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
973
+ "readerItemNo": "zE6uZW_readerItemNo",
947
974
  "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
948
- "toolStepName": "zE6uZW_toolStepName",
949
- "fadeIn": "zE6uZW_fadeIn",
950
- "badgeRejected": "zE6uZW_badgeRejected",
951
- "diffTagOld": "zE6uZW_diffTagOld",
952
- "assetStatDetail": "zE6uZW_assetStatDetail",
953
- "navTitleBook": "zE6uZW_navTitleBook",
954
- "chatRole": "zE6uZW_chatRole",
955
- "dashHeroArrow": "zE6uZW_dashHeroArrow",
956
- "bookshelfLabel": "zE6uZW_bookshelfLabel",
957
- "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
958
- "workflowRow": "zE6uZW_workflowRow",
959
- "wsColumns": "zE6uZW_wsColumns",
960
- "bookshelf": "zE6uZW_bookshelf",
961
- "badgeWritten": "zE6uZW_badgeWritten",
962
- "card": "zE6uZW_card",
963
- "bookCardActive": "zE6uZW_bookCardActive",
964
- "ideaCandidate": "zE6uZW_ideaCandidate",
965
- "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
966
- "navBadgePulse": "zE6uZW_navBadgePulse",
967
- "chapterFocus": "zE6uZW_chapterFocus",
968
- "workflowLabel": "zE6uZW_workflowLabel",
969
- "bookshelfList": "zE6uZW_bookshelfList",
970
- "bigProgressBar": "zE6uZW_bigProgressBar",
971
- "statCardDValue": "zE6uZW_statCardDValue",
972
- "diffLegend": "zE6uZW_diffLegend",
973
- "readerBody": "zE6uZW_readerBody",
974
- "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
975
- "readerItem": "zE6uZW_readerItem",
976
- "panelContent": "zE6uZW_panelContent",
977
- "readerGroup": "zE6uZW_readerGroup",
975
+ "statCardDIconRed": "zE6uZW_statCardDIconRed",
978
976
  "progressBarFill": "zE6uZW_progressBarFill",
979
- "readerFoot": "zE6uZW_readerFoot",
980
- "row": "zE6uZW_row",
981
- "outlineReadonly": "zE6uZW_outlineReadonly",
982
- "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
983
- "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
984
- "bookAddIcon": "zE6uZW_bookAddIcon",
985
- "readerChapterMeta": "zE6uZW_readerChapterMeta",
986
- "todoItem": "zE6uZW_todoItem",
987
- "tab": "zE6uZW_tab",
988
- "bookCreateForm": "zE6uZW_bookCreateForm",
989
- "readerHeader": "zE6uZW_readerHeader",
990
- "readerItemNo": "zE6uZW_readerItemNo",
991
- "readerItemBadge": "zE6uZW_readerItemBadge",
992
- "bookSwitchName": "zE6uZW_bookSwitchName",
977
+ "ideaCandidate": "zE6uZW_ideaCandidate",
993
978
  "readerGroupArrow": "zE6uZW_readerGroupArrow",
994
- "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
995
- "wsSelected": "zE6uZW_wsSelected",
996
- "entry": "zE6uZW_entry",
979
+ "iconButton": "zE6uZW_iconButton",
980
+ "shelfView": "zE6uZW_shelfView",
981
+ "chapterActions": "zE6uZW_chapterActions",
982
+ "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
983
+ "workflowLabel": "zE6uZW_workflowLabel",
984
+ "assetStatValue": "zE6uZW_assetStatValue",
985
+ "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
986
+ "readerItemTitle": "zE6uZW_readerItemTitle",
987
+ "todoInfo": "zE6uZW_todoInfo",
988
+ "bookChipActive": "zE6uZW_bookChipActive",
989
+ "chatBubbleUser": "zE6uZW_chatBubbleUser",
990
+ "settingsCard": "zE6uZW_settingsCard",
991
+ "legendNew": "zE6uZW_legendNew",
992
+ "panelBody": "zE6uZW_panelBody",
997
993
  "dashStageDot": "zE6uZW_dashStageDot",
998
- "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
999
- "readerMain": "zE6uZW_readerMain",
1000
- "navActions": "zE6uZW_navActions",
1001
- "shelfFilters": "zE6uZW_shelfFilters",
1002
- "cardTitle": "zE6uZW_cardTitle",
1003
- "tlSegFill": "zE6uZW_tlSegFill",
1004
- "dashHero": "zE6uZW_dashHero",
1005
- "panelNav": "zE6uZW_panelNav",
1006
- "dropzone": "zE6uZW_dropzone",
1007
- "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
1008
- "toolStep": "zE6uZW_toolStep",
1009
- "wsPageHeader": "zE6uZW_wsPageHeader",
994
+ "shelfTitleRow": "zE6uZW_shelfTitleRow",
995
+ "readerLoading": "zE6uZW_readerLoading",
996
+ "toolSteps": "zE6uZW_toolSteps",
997
+ "readerGroupTitle": "zE6uZW_readerGroupTitle",
998
+ "statCardDIcon": "zE6uZW_statCardDIcon",
999
+ "readerTitle": "zE6uZW_readerTitle",
1000
+ "dashJourneyStages": "zE6uZW_dashJourneyStages",
1010
1001
  "readerError": "zE6uZW_readerError",
1011
- "dashFacts": "zE6uZW_dashFacts",
1012
- "diffSameBody": "zE6uZW_diffSameBody",
1013
- "tlSeg": "zE6uZW_tlSeg",
1014
- "button": "zE6uZW_button",
1015
- "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
1016
- "bookAddCard": "zE6uZW_bookAddCard",
1017
- "volumeGroup": "zE6uZW_volumeGroup",
1018
- "bookChipActive": "zE6uZW_bookChipActive",
1019
- "textarea": "zE6uZW_textarea",
1020
- "progressLineLive": "zE6uZW_progressLineLive",
1021
- "wsColumn": "zE6uZW_wsColumn",
1002
+ "statCardDUnit": "zE6uZW_statCardDUnit",
1003
+ "helpTip": "zE6uZW_helpTip",
1004
+ "readerGroup": "zE6uZW_readerGroup",
1005
+ "readerSidebar": "zE6uZW_readerSidebar",
1006
+ "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
1007
+ "dashHeroAction": "zE6uZW_dashHeroAction",
1008
+ "createBookTop": "zE6uZW_createBookTop",
1022
1009
  "workflowDotDone": "zE6uZW_workflowDotDone",
1023
- "tlBar": "zE6uZW_tlBar",
1024
- "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
1025
- "buttonPrimary": "zE6uZW_buttonPrimary",
1026
- "readerArticle": "zE6uZW_readerArticle",
1027
- "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
1028
- "iconButton": "zE6uZW_iconButton",
1029
- "bookChipRemove": "zE6uZW_bookChipRemove",
1030
- "navTitleLogo": "zE6uZW_navTitleLogo",
1031
- "pulse": "zE6uZW_pulse",
1032
- "createBookView": "zE6uZW_createBookView",
1033
- "badgeError": "zE6uZW_badgeError",
1034
- "liveText": "zE6uZW_liveText",
1035
- "chapterBeats": "zE6uZW_chapterBeats",
1036
- "coverPreview": "zE6uZW_coverPreview",
1037
- "statCardDIcon": "zE6uZW_statCardDIcon",
1010
+ "toolStepStatus": "zE6uZW_toolStepStatus",
1011
+ "navActionBtn": "zE6uZW_navActionBtn",
1038
1012
  "diffText": "zE6uZW_diffText",
1039
- "panelBody": "zE6uZW_panelBody",
1040
- "badgeGenerating": "zE6uZW_badgeGenerating",
1041
- "diffSame": "zE6uZW_diffSame",
1042
- "assetGrid": "zE6uZW_assetGrid",
1043
- "chapterActions": "zE6uZW_chapterActions",
1013
+ "statCardD": "zE6uZW_statCardD",
1014
+ "navGroupSep": "zE6uZW_navGroupSep",
1015
+ "dropzone": "zE6uZW_dropzone",
1016
+ "assetStatLabel": "zE6uZW_assetStatLabel",
1017
+ "chapterPreview": "zE6uZW_chapterPreview",
1018
+ "workflowDotActive": "zE6uZW_workflowDotActive",
1019
+ "shelfEmpty": "zE6uZW_shelfEmpty",
1020
+ "statCardDValue": "zE6uZW_statCardDValue",
1021
+ "dashGrid": "zE6uZW_dashGrid",
1022
+ "toolStepActive": "zE6uZW_toolStepActive",
1023
+ "importModalOverlay": "zE6uZW_importModalOverlay",
1024
+ "tlSegTodo": "zE6uZW_tlSegTodo",
1025
+ "row": "zE6uZW_row",
1026
+ "chapterBeats": "zE6uZW_chapterBeats",
1027
+ "progressLineLive": "zE6uZW_progressLineLive",
1044
1028
  "meta": "zE6uZW_meta",
1045
- "bookCardCover": "zE6uZW_bookCardCover",
1046
- "readerSegActive": "zE6uZW_readerSegActive",
1047
- "diffList": "zE6uZW_diffList",
1029
+ "dashJourneyBar": "zE6uZW_dashJourneyBar",
1048
1030
  "wsSelectedText": "zE6uZW_wsSelectedText",
1049
- "bookSwitch": "zE6uZW_bookSwitch",
1050
- "assetStatValue": "zE6uZW_assetStatValue",
1051
- "diffDel": "zE6uZW_diffDel",
1052
- "panel": "zE6uZW_panel",
1053
- "shelfGrid": "zE6uZW_shelfGrid",
1054
- "spaceBetween": "zE6uZW_spaceBetween",
1031
+ "panelContent": "zE6uZW_panelContent",
1032
+ "workflowDot": "zE6uZW_workflowDot",
1033
+ "bookSwitchCover": "zE6uZW_bookSwitchCover",
1034
+ "navTabIcon": "zE6uZW_navTabIcon",
1035
+ "dashHeroTitle": "zE6uZW_dashHeroTitle",
1036
+ "bookAddCard": "zE6uZW_bookAddCard",
1037
+ "dropzoneIcon": "zE6uZW_dropzoneIcon",
1038
+ "liveText": "zE6uZW_liveText",
1039
+ "todoItem": "zE6uZW_todoItem",
1040
+ "toolStepName": "zE6uZW_toolStepName",
1041
+ "ideaCard": "zE6uZW_ideaCard",
1042
+ "bookshelfList": "zE6uZW_bookshelfList",
1043
+ "statCardDLabel": "zE6uZW_statCardDLabel",
1055
1044
  "field": "zE6uZW_field",
1056
- "coverPlaceholder": "zE6uZW_coverPlaceholder",
1057
- "toolStepActive": "zE6uZW_toolStepActive",
1058
- "legendOld": "zE6uZW_legendOld",
1045
+ "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
1046
+ "workflowHint": "zE6uZW_workflowHint",
1047
+ "panelNav": "zE6uZW_panelNav",
1048
+ "badgeGenerating": "zE6uZW_badgeGenerating",
1049
+ "progressLineDone": "zE6uZW_progressLineDone",
1050
+ "bookshelfLabel": "zE6uZW_bookshelfLabel",
1051
+ "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
1052
+ "toolLive": "zE6uZW_toolLive",
1053
+ "assistantFloatBody": "zE6uZW_assistantFloatBody",
1054
+ "navTitleName": "zE6uZW_navTitleName",
1055
+ "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
1056
+ "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
1057
+ "wsPage": "zE6uZW_wsPage",
1059
1058
  "dashStage": "zE6uZW_dashStage",
1060
- "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
1059
+ "bookCard": "zE6uZW_bookCard",
1060
+ "importModalActions": "zE6uZW_importModalActions",
1061
+ "importHint": "zE6uZW_importHint",
1062
+ "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
1063
+ "onlyChanges": "zE6uZW_onlyChanges",
1064
+ "wsEditor": "zE6uZW_wsEditor",
1061
1065
  "fileList": "zE6uZW_fileList",
1062
- "readerChapterTitle": "zE6uZW_readerChapterTitle",
1063
- "statCardDDetail": "zE6uZW_statCardDDetail",
1064
- "tlSegDone": "zE6uZW_tlSegDone",
1066
+ "importPreview": "zE6uZW_importPreview",
1065
1067
  "dashFact": "zE6uZW_dashFact",
1066
- "chapterList": "zE6uZW_chapterList",
1067
- "toolStepStatus": "zE6uZW_toolStepStatus",
1068
- "createBookIcon": "zE6uZW_createBookIcon",
1069
- "progressLineError": "zE6uZW_progressLineError",
1068
+ "genreDesc": "zE6uZW_genreDesc",
1069
+ "assistantResize": "zE6uZW_assistantResize",
1070
+ "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
1071
+ "readerFoot": "zE6uZW_readerFoot",
1072
+ "textarea": "zE6uZW_textarea",
1070
1073
  "assistantFloat": "zE6uZW_assistantFloat",
1074
+ "input": "zE6uZW_input",
1075
+ "bookCreateOutline": "zE6uZW_bookCreateOutline",
1076
+ "dashFacts": "zE6uZW_dashFacts",
1077
+ "bigProgressBar": "zE6uZW_bigProgressBar",
1078
+ "createBookCard": "zE6uZW_createBookCard",
1079
+ "tabBar": "zE6uZW_tabBar",
1080
+ "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
1081
+ "toolStepDetail": "zE6uZW_toolStepDetail",
1071
1082
  "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
1072
- "ideaCard": "zE6uZW_ideaCard",
1073
- "progressLineDone": "zE6uZW_progressLineDone",
1074
- "chapterNum": "zE6uZW_chapterNum",
1075
- "wsPreview": "zE6uZW_wsPreview",
1083
+ "readerChapterTitle": "zE6uZW_readerChapterTitle",
1084
+ "dashStageDone": "zE6uZW_dashStageDone",
1085
+ "navAboutRow": "zE6uZW_navAboutRow",
1076
1086
  "navAboutUpdate": "zE6uZW_navAboutUpdate",
1077
- "entryLabel": "zE6uZW_entryLabel",
1078
- "readerSeg": "zE6uZW_readerSeg",
1079
- "dashJourneyBar": "zE6uZW_dashJourneyBar",
1080
- "genreDesc": "zE6uZW_genreDesc",
1087
+ "dashJourneyFill": "zE6uZW_dashJourneyFill",
1088
+ "bookChip": "zE6uZW_bookChip",
1089
+ "navAbout": "zE6uZW_navAbout",
1090
+ "importModalBody": "zE6uZW_importModalBody",
1091
+ "buttonSmall": "zE6uZW_buttonSmall",
1081
1092
  "readerText": "zE6uZW_readerText",
1082
- "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
1083
- "onlyChanges": "zE6uZW_onlyChanges",
1084
- "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
1085
- "entryIcon": "zE6uZW_entryIcon",
1086
- "readerTitle": "zE6uZW_readerTitle",
1087
- "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
1088
- "dashStageCurrent": "zE6uZW_dashStageCurrent",
1089
- "statCardDLabel": "zE6uZW_statCardDLabel",
1090
- "navGroup": "zE6uZW_navGroup",
1091
- "bookCardName": "zE6uZW_bookCardName",
1092
- "todoDanger": "zE6uZW_todoDanger",
1093
- "readerItemTitle": "zE6uZW_readerItemTitle",
1093
+ "importPreviewList": "zE6uZW_importPreviewList",
1094
+ "tlSegDone": "zE6uZW_tlSegDone",
1095
+ "assetGrid": "zE6uZW_assetGrid",
1096
+ "progress": "zE6uZW_progress",
1097
+ "readerChapterMeta": "zE6uZW_readerChapterMeta",
1098
+ "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
1099
+ "workflowList": "zE6uZW_workflowList",
1100
+ "coverPlaceholder": "zE6uZW_coverPlaceholder",
1101
+ "diffDel": "zE6uZW_diffDel",
1102
+ "diffLegend": "zE6uZW_diffLegend",
1103
+ "outlineReadonly": "zE6uZW_outlineReadonly",
1104
+ "statCardDDown": "zE6uZW_statCardDDown",
1105
+ "tlSegFill": "zE6uZW_tlSegFill",
1106
+ "tab": "zE6uZW_tab",
1107
+ "navTitleBook": "zE6uZW_navTitleBook",
1108
+ "chapterMain": "zE6uZW_chapterMain",
1109
+ "dashHeroBook": "zE6uZW_dashHeroBook",
1110
+ "readerMain": "zE6uZW_readerMain",
1111
+ "wsSelected": "zE6uZW_wsSelected",
1112
+ "panelTitle": "zE6uZW_panelTitle",
1113
+ "pulse": "zE6uZW_pulse",
1114
+ "dashHeroArrow": "zE6uZW_dashHeroArrow",
1094
1115
  "navTabBadge": "zE6uZW_navTabBadge",
1095
- "diffChange": "zE6uZW_diffChange",
1096
- "createBookCard": "zE6uZW_createBookCard",
1097
- "legendNew": "zE6uZW_legendNew",
1098
- "todoWarning": "zE6uZW_todoWarning",
1099
- "navAbout": "zE6uZW_navAbout",
1100
- "tlSegCurrent": "zE6uZW_tlSegCurrent",
1101
- "navTabIcon": "zE6uZW_navTabIcon",
1102
- "dashHeroAction": "zE6uZW_dashHeroAction",
1103
- "tabBar": "zE6uZW_tabBar",
1104
- "bookCreateCard": "zE6uZW_bookCreateCard",
1105
- "readerLoading": "zE6uZW_readerLoading",
1106
- "navTab": "zE6uZW_navTab",
1107
- "navGroupLabel": "zE6uZW_navGroupLabel",
1108
- "chapterTitle": "zE6uZW_chapterTitle",
1116
+ "tlSegTrack": "zE6uZW_tlSegTrack",
1117
+ "badgeRejected": "zE6uZW_badgeRejected",
1118
+ "toolStep": "zE6uZW_toolStep",
1119
+ "navBadgePulse": "zE6uZW_navBadgePulse",
1120
+ "panel": "zE6uZW_panel",
1121
+ "card": "zE6uZW_card",
1109
1122
  "diffOld": "zE6uZW_diffOld",
1110
- "toolStepIcon": "zE6uZW_toolStepIcon",
1111
- "toolStepDetail": "zE6uZW_toolStepDetail",
1112
- "badgePending": "zE6uZW_badgePending",
1113
- "assistantFloatBody": "zE6uZW_assistantFloatBody",
1114
- "shelfView": "zE6uZW_shelfView",
1115
- "bookSwitchCover": "zE6uZW_bookSwitchCover",
1116
- "shelfTitleRow": "zE6uZW_shelfTitleRow",
1123
+ "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
1124
+ "readerGroupCount": "zE6uZW_readerGroupCount",
1125
+ "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
1117
1126
  "shelfToolbar": "zE6uZW_shelfToolbar",
1118
- "dashJourney": "zE6uZW_dashJourney",
1119
- "chapterMain": "zE6uZW_chapterMain",
1120
- "statCardDDown": "zE6uZW_statCardDDown",
1121
- "dashJourneyStages": "zE6uZW_dashJourneyStages",
1122
- "progress": "zE6uZW_progress",
1123
- "bookChipName": "zE6uZW_bookChipName",
1124
- "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
1125
- "toolStepError": "zE6uZW_toolStepError",
1126
- "tlSegTrack": "zE6uZW_tlSegTrack",
1127
- "navTitleName": "zE6uZW_navTitleName",
1128
- "assistantResize": "zE6uZW_assistantResize",
1129
- "badgeDone": "zE6uZW_badgeDone",
1130
- "statCardD": "zE6uZW_statCardD",
1127
+ "progressBar": "zE6uZW_progressBar",
1128
+ "buttonPrimary": "zE6uZW_buttonPrimary",
1129
+ "navGroupLabel": "zE6uZW_navGroupLabel",
1130
+ "importModal": "zE6uZW_importModal",
1131
+ "bookChipMeta": "zE6uZW_bookChipMeta",
1132
+ "badgePending": "zE6uZW_badgePending",
1133
+ "chapterTitle": "zE6uZW_chapterTitle",
1131
1134
  "todoText": "zE6uZW_todoText",
1135
+ "readerItemActive": "zE6uZW_readerItemActive",
1136
+ "todoWarning": "zE6uZW_todoWarning",
1137
+ "ideaToggle": "zE6uZW_ideaToggle",
1138
+ "todoDanger": "zE6uZW_todoDanger",
1139
+ "bookCardActive": "zE6uZW_bookCardActive",
1140
+ "readerItem": "zE6uZW_readerItem",
1141
+ "chapter": "zE6uZW_chapter",
1142
+ "dashStageCurrent": "zE6uZW_dashStageCurrent",
1143
+ "entry": "zE6uZW_entry",
1144
+ "chatRole": "zE6uZW_chatRole",
1145
+ "diffSame": "zE6uZW_diffSame",
1146
+ "diffList": "zE6uZW_diffList",
1147
+ "tlSegLabel": "zE6uZW_tlSegLabel",
1148
+ "shelfHeader": "zE6uZW_shelfHeader",
1149
+ "navActions": "zE6uZW_navActions",
1150
+ "wsPreview": "zE6uZW_wsPreview",
1151
+ "bookCreateForm": "zE6uZW_bookCreateForm",
1152
+ "readerSegBtn": "zE6uZW_readerSegBtn",
1153
+ "navTab": "zE6uZW_navTab",
1154
+ "navTabLabel": "zE6uZW_navTabLabel",
1155
+ "readerArticle": "zE6uZW_readerArticle",
1156
+ "busyRow": "zE6uZW_busyRow",
1157
+ "bookChipName": "zE6uZW_bookChipName",
1132
1158
  "reviewBox": "zE6uZW_reviewBox",
1133
- "dashGrid": "zE6uZW_dashGrid",
1134
- "bookChip": "zE6uZW_bookChip",
1159
+ "bookChipRemove": "zE6uZW_bookChipRemove",
1160
+ "statRowD": "zE6uZW_statRowD",
1161
+ "badgeDone": "zE6uZW_badgeDone",
1162
+ "readerHeader": "zE6uZW_readerHeader",
1163
+ "wsColumn": "zE6uZW_wsColumn",
1164
+ "bookCardName": "zE6uZW_bookCardName",
1165
+ "tlSegCurrent": "zE6uZW_tlSegCurrent",
1166
+ "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
1167
+ "entryLabel": "zE6uZW_entryLabel",
1168
+ "progressLine": "zE6uZW_progressLine",
1169
+ "readerPara": "zE6uZW_readerPara",
1170
+ "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
1171
+ "toolStepIcon": "zE6uZW_toolStepIcon",
1172
+ "diffTagOld": "zE6uZW_diffTagOld",
1173
+ "volumeGroup": "zE6uZW_volumeGroup",
1174
+ "readerView": "zE6uZW_readerView",
1175
+ "dashJourney": "zE6uZW_dashJourney",
1176
+ "chapterList": "zE6uZW_chapterList",
1177
+ "readerItemBadge": "zE6uZW_readerItemBadge",
1178
+ "bookSwitch": "zE6uZW_bookSwitch",
1179
+ "wsPageHeader": "zE6uZW_wsPageHeader",
1180
+ "shelfGrid": "zE6uZW_shelfGrid",
1181
+ "view": "zE6uZW_view",
1182
+ "diffAdd": "zE6uZW_diffAdd",
1183
+ "workflowRow": "zE6uZW_workflowRow",
1184
+ "bookshelf": "zE6uZW_bookshelf",
1185
+ "coverPreview": "zE6uZW_coverPreview",
1135
1186
  "bookCardActions": "zE6uZW_bookCardActions",
1136
- "assetStat": "zE6uZW_assetStat",
1137
- "shelfEmpty": "zE6uZW_shelfEmpty",
1138
- "statCardDUnit": "zE6uZW_statCardDUnit",
1139
- "statCardDIconRed": "zE6uZW_statCardDIconRed",
1140
- "readerSidebar": "zE6uZW_readerSidebar",
1187
+ "diffSameBody": "zE6uZW_diffSameBody",
1188
+ "readerSegActive": "zE6uZW_readerSegActive",
1189
+ "spaceBetween": "zE6uZW_spaceBetween",
1190
+ "bookCardCover": "zE6uZW_bookCardCover",
1191
+ "badge": "zE6uZW_badge",
1192
+ "bookSwitchName": "zE6uZW_bookSwitchName",
1193
+ "dashHero": "zE6uZW_dashHero",
1194
+ "cardTitle": "zE6uZW_cardTitle",
1195
+ "bookCreateCard": "zE6uZW_bookCreateCard",
1196
+ "readerBody": "zE6uZW_readerBody",
1197
+ "importFileInfo": "zE6uZW_importFileInfo",
1198
+ "wsPreviewText": "zE6uZW_wsPreviewText",
1199
+ "importModalHead": "zE6uZW_importModalHead",
1200
+ "progressLineError": "zE6uZW_progressLineError",
1201
+ "bookCardBody": "zE6uZW_bookCardBody",
1202
+ "wsColumns": "zE6uZW_wsColumns",
1203
+ "entryIcon": "zE6uZW_entryIcon",
1204
+ "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
1205
+ "navGroup": "zE6uZW_navGroup",
1206
+ "diffChange": "zE6uZW_diffChange",
1207
+ "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
1208
+ "fadeIn": "zE6uZW_fadeIn",
1209
+ "fieldLabel": "zE6uZW_fieldLabel",
1210
+ "importField": "zE6uZW_importField",
1211
+ "chapterNum": "zE6uZW_chapterNum",
1212
+ "navSpacer": "zE6uZW_navSpacer",
1213
+ "shelfFilters": "zE6uZW_shelfFilters",
1141
1214
  "navTitle": "zE6uZW_navTitle",
1142
- "badge": "zE6uZW_badge",
1143
- "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
1144
- "tlSegLabel": "zE6uZW_tlSegLabel",
1215
+ "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
1216
+ "importError": "zE6uZW_importError",
1217
+ "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
1218
+ "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
1219
+ "bookAdd": "zE6uZW_bookAdd",
1220
+ "legendOld": "zE6uZW_legendOld",
1221
+ "tlBar": "zE6uZW_tlBar",
1222
+ "importModalTabs": "zE6uZW_importModalTabs",
1223
+ "chapterFocus": "zE6uZW_chapterFocus",
1145
1224
  "diffColumn": "zE6uZW_diffColumn",
1146
- "dropzoneIcon": "zE6uZW_dropzoneIcon",
1147
- "assetStatLabel": "zE6uZW_assetStatLabel",
1148
- "progressLine": "zE6uZW_progressLine",
1149
- "chapter": "zE6uZW_chapter",
1150
- "bookChipMeta": "zE6uZW_bookChipMeta",
1151
- "buttonSmall": "zE6uZW_buttonSmall",
1152
- "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
1153
- "view": "zE6uZW_view",
1154
- "bookCard": "zE6uZW_bookCard",
1155
- "workflowList": "zE6uZW_workflowList",
1156
- "navSpacer": "zE6uZW_navSpacer",
1157
- "fieldLabel": "zE6uZW_fieldLabel",
1158
- "readerView": "zE6uZW_readerView",
1159
- "readerGroupTitle": "zE6uZW_readerGroupTitle",
1160
1225
  "createBookTitle": "zE6uZW_createBookTitle",
1161
- "buttonDanger": "zE6uZW_buttonDanger",
1162
- "chatBubbleUser": "zE6uZW_chatBubbleUser",
1163
- "diffNew": "zE6uZW_diffNew",
1164
- "readerItemActive": "zE6uZW_readerItemActive",
1165
- "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
1166
- "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
1167
- "bookAdd": "zE6uZW_bookAdd",
1168
- "diffAdd": "zE6uZW_diffAdd",
1169
- "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
1170
1226
  "bookCardBlurb": "zE6uZW_bookCardBlurb",
1171
- "navGroupSep": "zE6uZW_navGroupSep",
1172
- "toolSteps": "zE6uZW_toolSteps",
1173
- "dashJourneyFill": "zE6uZW_dashJourneyFill",
1174
- "assistantStatus": "zE6uZW_assistantStatus",
1227
+ "createBookIcon": "zE6uZW_createBookIcon",
1228
+ "helpTipText": "zE6uZW_helpTipText",
1229
+ "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
1230
+ "diffNew": "zE6uZW_diffNew",
1175
1231
  "shelfSearch": "zE6uZW_shelfSearch",
1176
- "bookCardBody": "zE6uZW_bookCardBody",
1177
- "navTabLabel": "zE6uZW_navTabLabel",
1232
+ "bookAddIcon": "zE6uZW_bookAddIcon",
1233
+ "workflowBody": "zE6uZW_workflowBody",
1234
+ "buttonDanger": "zE6uZW_buttonDanger",
1235
+ "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
1178
1236
  "diffTagNew": "zE6uZW_diffTagNew"
1179
1237
  };
1180
1238
  //#endregion
@@ -2577,7 +2635,7 @@ window.__ModuleLoader__.load({
2577
2635
  });
2578
2636
  }
2579
2637
  /** 书架首页。 */
2580
- function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook }) {
2638
+ function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook }) {
2581
2639
  const [query, setQuery] = (0, react.useState)("");
2582
2640
  /** 筛选:all=全部 / active=进行中 / done=已完结 / none=未开书。 */
2583
2641
  const [filter, setFilter] = (0, react.useState)("all");
@@ -2707,6 +2765,12 @@ window.__ModuleLoader__.load({
2707
2765
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
2708
2766
  onClick: onAddBook,
2709
2767
  children: "+ 开第一本书"
2768
+ }),
2769
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2770
+ type: "button",
2771
+ className: `${panel_module_css_default.button}`,
2772
+ onClick: onImportBook,
2773
+ children: "📥 导入已有小说"
2710
2774
  })
2711
2775
  ]
2712
2776
  }) : visible.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -2728,31 +2792,49 @@ window.__ModuleLoader__.load({
2728
2792
  ]
2729
2793
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2730
2794
  className: panel_module_css_default.shelfGrid,
2731
- children: [visible.map((book) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BookCard, {
2732
- api,
2733
- book,
2734
- active: book.id === shelf.activeBookId,
2735
- onOpen: () => {
2736
- onOpenBook(book.id);
2737
- },
2738
- onRead: () => {
2739
- onReadBook(book.id);
2740
- }
2741
- }, book.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2742
- className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
2743
- onClick: onAddBook,
2744
- children: [
2745
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2746
- className: panel_module_css_default.bookAddIcon,
2747
- children: ""
2748
- }),
2749
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "开一本新书" }),
2750
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2751
- className: panel_module_css_default.meta,
2752
- children: "书名 + 大纲,开书即建项目"
2753
- })
2754
- ]
2755
- })]
2795
+ children: [
2796
+ visible.map((book) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BookCard, {
2797
+ api,
2798
+ book,
2799
+ active: book.id === shelf.activeBookId,
2800
+ onOpen: () => {
2801
+ onOpenBook(book.id);
2802
+ },
2803
+ onRead: () => {
2804
+ onReadBook(book.id);
2805
+ }
2806
+ }, book.id)),
2807
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2808
+ className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
2809
+ onClick: onAddBook,
2810
+ children: [
2811
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2812
+ className: panel_module_css_default.bookAddIcon,
2813
+ children: ""
2814
+ }),
2815
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "开一本新书" }),
2816
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2817
+ className: panel_module_css_default.meta,
2818
+ children: "书名 + 大纲,开书即建项目"
2819
+ })
2820
+ ]
2821
+ }),
2822
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2823
+ className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
2824
+ onClick: onImportBook,
2825
+ children: [
2826
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2827
+ className: panel_module_css_default.bookAddIcon,
2828
+ children: "📥"
2829
+ }),
2830
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "导入已有小说" }),
2831
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2832
+ className: panel_module_css_default.meta,
2833
+ children: "项目目录或 txt/md 全本"
2834
+ })
2835
+ ]
2836
+ })
2837
+ ]
2756
2838
  })]
2757
2839
  });
2758
2840
  }
@@ -4561,6 +4643,348 @@ window.__ModuleLoader__.load({
4561
4643
  });
4562
4644
  }
4563
4645
  //#endregion
4646
+ //#region src/client/panel/ImportModal.tsx
4647
+ /**
4648
+ * 导入小说弹窗:两种模式 ——
4649
+ * A) 已有项目目录(含 novel-project.json)→ 登记/激活书架(粘贴服务器本地路径);
4650
+ * B) txt/md 全本 → 点击选择文件,浏览器读取内容 → 服务器拆章预览 → 确认后导入。
4651
+ * Mode B 也保留「服务器本地路径」高级选项(大文件或服务器端已有文件时用)。
4652
+ */
4653
+ function ImportModal({ api, onClose, onImported }) {
4654
+ const [mode, setMode] = (0, react.useState)("dir");
4655
+ const [dir, setDir] = (0, react.useState)("");
4656
+ const fileInputRef = (0, react.useRef)(null);
4657
+ const [fileName, setFileName] = (0, react.useState)("");
4658
+ const [fileText, setFileText] = (0, react.useState)(null);
4659
+ const [previewing, setPreviewing] = (0, react.useState)(false);
4660
+ const [preview, setPreview] = (0, react.useState)(null);
4661
+ const [showPath, setShowPath] = (0, react.useState)(false);
4662
+ const [filePath, setFilePath] = (0, react.useState)("");
4663
+ const [outDir, setOutDir] = (0, react.useState)("");
4664
+ const [busy, setBusy] = (0, react.useState)(false);
4665
+ const [error, setError] = (0, react.useState)("");
4666
+ const [result, setResult] = (0, react.useState)(null);
4667
+ /** 选择文件 → 读取内容 → 调服务器预览拆章。 */
4668
+ const onPickFile = async (file) => {
4669
+ if (file === void 0) return;
4670
+ setError("");
4671
+ setResult(null);
4672
+ setPreview(null);
4673
+ setFileName(file.name);
4674
+ setPreviewing(true);
4675
+ try {
4676
+ const text = await file.text();
4677
+ setFileText(text);
4678
+ const p = await api.bookImportTextPreview(text, file.name);
4679
+ setPreview(p);
4680
+ } catch (err) {
4681
+ setError(err.message);
4682
+ } finally {
4683
+ setPreviewing(false);
4684
+ }
4685
+ };
4686
+ const runImport = async () => {
4687
+ setError("");
4688
+ setResult(null);
4689
+ if (mode === "dir") {
4690
+ const d = dir.trim();
4691
+ if (d === "") {
4692
+ setError("请输入项目目录(含 novel-project.json 的文件夹)");
4693
+ return;
4694
+ }
4695
+ setBusy(true);
4696
+ try {
4697
+ const r = await api.bookImportDir(d);
4698
+ setResult({
4699
+ kind: "dir",
4700
+ bookName: r.book.bookName,
4701
+ existed: r.existed
4702
+ });
4703
+ await onImported();
4704
+ } catch (err) {
4705
+ setError(err.message);
4706
+ } finally {
4707
+ setBusy(false);
4708
+ }
4709
+ return;
4710
+ }
4711
+ if (fileText !== null && fileText.length > 0) {
4712
+ setBusy(true);
4713
+ try {
4714
+ const o = outDir.trim();
4715
+ const r = await api.bookImportTextContent(fileText, fileName, o !== "" ? o : void 0);
4716
+ setResult({
4717
+ kind: "text",
4718
+ bookName: r.bookName,
4719
+ chapters: r.chapters,
4720
+ skipped: r.skipped
4721
+ });
4722
+ await onImported();
4723
+ } catch (err) {
4724
+ setError(err.message);
4725
+ } finally {
4726
+ setBusy(false);
4727
+ }
4728
+ return;
4729
+ }
4730
+ const f = filePath.trim();
4731
+ if (f === "") {
4732
+ setError("请先选择文件,或输入服务器本地文件路径");
4733
+ return;
4734
+ }
4735
+ setBusy(true);
4736
+ try {
4737
+ const o = outDir.trim();
4738
+ const r = await api.bookImportText(f, o !== "" ? o : void 0);
4739
+ setResult({
4740
+ kind: "text",
4741
+ bookName: r.bookName,
4742
+ chapters: r.chapters,
4743
+ skipped: r.skipped
4744
+ });
4745
+ await onImported();
4746
+ } catch (err) {
4747
+ setError(err.message);
4748
+ } finally {
4749
+ setBusy(false);
4750
+ }
4751
+ };
4752
+ const switchMode = (m) => {
4753
+ setMode(m);
4754
+ setError("");
4755
+ setResult(null);
4756
+ setPreview(null);
4757
+ };
4758
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4759
+ className: panel_module_css_default.importModalOverlay,
4760
+ onClick: (e) => {
4761
+ if (e.target === e.currentTarget) onClose();
4762
+ },
4763
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4764
+ className: panel_module_css_default.importModal,
4765
+ children: [
4766
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4767
+ className: panel_module_css_default.importModalHead,
4768
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4769
+ className: panel_module_css_default.panelTitle,
4770
+ style: { margin: 0 },
4771
+ children: "📥 导入小说"
4772
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4773
+ type: "button",
4774
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
4775
+ onClick: onClose,
4776
+ title: "关闭",
4777
+ children: "✕"
4778
+ })]
4779
+ }),
4780
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4781
+ className: panel_module_css_default.importModalTabs,
4782
+ role: "tablist",
4783
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4784
+ type: "button",
4785
+ role: "tab",
4786
+ "aria-selected": mode === "dir",
4787
+ className: `${panel_module_css_default.button} ${mode === "dir" ? panel_module_css_default.buttonPrimary : ""}`,
4788
+ onClick: () => {
4789
+ switchMode("dir");
4790
+ },
4791
+ children: "📂 A · 已有项目目录"
4792
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4793
+ type: "button",
4794
+ role: "tab",
4795
+ "aria-selected": mode === "text",
4796
+ className: `${panel_module_css_default.button} ${mode === "text" ? panel_module_css_default.buttonPrimary : ""}`,
4797
+ onClick: () => {
4798
+ switchMode("text");
4799
+ },
4800
+ children: "📄 B · txt/md 全本"
4801
+ })]
4802
+ }),
4803
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4804
+ className: panel_module_css_default.importModalBody,
4805
+ children: [
4806
+ mode === "dir" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4807
+ className: panel_module_css_default.importField,
4808
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "项目目录(绝对路径)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4809
+ className: panel_module_css_default.input,
4810
+ type: "text",
4811
+ placeholder: "例如 D:\\novels\\我的小说",
4812
+ value: dir,
4813
+ onChange: (e) => {
4814
+ setDir(e.target.value);
4815
+ }
4816
+ })]
4817
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4818
+ className: panel_module_css_default.importHint,
4819
+ children: "目录需含 novel-project.json。已在书架中的目录会直接切换激活,不会重复登记。"
4820
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4821
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4822
+ ref: fileInputRef,
4823
+ type: "file",
4824
+ accept: ".txt,.md,text/plain,text/markdown",
4825
+ style: { display: "none" },
4826
+ onChange: (e) => {
4827
+ onPickFile(e.target.files?.[0]);
4828
+ e.target.value = "";
4829
+ }
4830
+ }),
4831
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4832
+ className: panel_module_css_default.importField,
4833
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "全本文本文件(txt / md)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4834
+ type: "button",
4835
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
4836
+ onClick: () => {
4837
+ fileInputRef.current?.click();
4838
+ },
4839
+ children: "📄 选择文件"
4840
+ })]
4841
+ }),
4842
+ fileName !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4843
+ className: panel_module_css_default.importFileInfo,
4844
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["已选择:", fileName] }), previewing && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4845
+ className: panel_module_css_default.meta,
4846
+ children: "正在拆章预览…"
4847
+ })]
4848
+ }),
4849
+ preview !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4850
+ className: panel_module_css_default.importPreview,
4851
+ children: [
4852
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
4853
+ "📖 《",
4854
+ preview.bookName,
4855
+ "》 · 识别到 ",
4856
+ preview.chapters.length,
4857
+ " 章"
4858
+ ] }),
4859
+ preview.chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
4860
+ className: panel_module_css_default.importPreviewList,
4861
+ children: [preview.chapters.slice(0, 5).map((c) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [
4862
+ "第",
4863
+ c.no,
4864
+ "章 ",
4865
+ c.title,
4866
+ "(",
4867
+ c.chars,
4868
+ " 字)"
4869
+ ] }, c.no)), preview.chapters.length > 5 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
4870
+ className: panel_module_css_default.meta,
4871
+ children: [
4872
+ "… 共 ",
4873
+ preview.chapters.length,
4874
+ " 章"
4875
+ ]
4876
+ })]
4877
+ }),
4878
+ preview.skipped.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4879
+ className: panel_module_css_default.meta,
4880
+ children: [
4881
+ "跳过 ",
4882
+ preview.skipped.length,
4883
+ " 个过短章节:",
4884
+ preview.skipped.slice(0, 5).join("、"),
4885
+ preview.skipped.length > 5 ? " 等" : ""
4886
+ ]
4887
+ })
4888
+ ]
4889
+ }),
4890
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4891
+ className: panel_module_css_default.importField,
4892
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "输出目录(可选,默认 ~/.dsh/novels/书名)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4893
+ className: panel_module_css_default.input,
4894
+ type: "text",
4895
+ placeholder: "留空使用默认目录",
4896
+ value: outDir,
4897
+ onChange: (e) => {
4898
+ setOutDir(e.target.value);
4899
+ }
4900
+ })]
4901
+ }),
4902
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4903
+ type: "button",
4904
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
4905
+ onClick: () => {
4906
+ setShowPath(!showPath);
4907
+ },
4908
+ children: showPath ? "▾ 收起高级选项" : "▸ 高级:使用服务器本地文件路径"
4909
+ }),
4910
+ showPath && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4911
+ className: panel_module_css_default.importField,
4912
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "服务器本地文件绝对路径(大文件或服务器端已有文件时用)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4913
+ className: panel_module_css_default.input,
4914
+ type: "text",
4915
+ placeholder: "例如 D:\\novels\\全本.txt",
4916
+ value: filePath,
4917
+ onChange: (e) => {
4918
+ setFilePath(e.target.value);
4919
+ }
4920
+ })]
4921
+ }),
4922
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4923
+ className: panel_module_css_default.importHint,
4924
+ children: "服务器按「第X章/第X回/第X节/第X卷」、中文数字章节(一、二、三…)、序章/楔子/尾声、英文 Chapter N 拆章;正文过短(<50 字)的章节会跳过并列出。"
4925
+ })
4926
+ ] }),
4927
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4928
+ className: panel_module_css_default.importError,
4929
+ children: error
4930
+ }),
4931
+ result !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4932
+ className: panel_module_css_default.importResult,
4933
+ children: result.kind === "dir" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
4934
+ "✅ 已",
4935
+ result.existed === true ? "重新激活" : "登记",
4936
+ "《",
4937
+ result.bookName,
4938
+ "》"
4939
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4940
+ className: panel_module_css_default.meta,
4941
+ children: result.existed === true ? "该目录已在书架中,现已切换为当前书;工作台数据按该书目录加载。" : "已加入书架并设为当前书,进入工作台即可看到全部模块。"
4942
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4943
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
4944
+ "✅ 《",
4945
+ result.bookName,
4946
+ "》导入完成:",
4947
+ result.chapters,
4948
+ " 章"
4949
+ ] }),
4950
+ (result.skipped ?? []).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4951
+ className: panel_module_css_default.meta,
4952
+ children: [
4953
+ "跳过 ",
4954
+ result.skipped.length,
4955
+ " 个过短章节:",
4956
+ result.skipped.slice(0, 8).join("、"),
4957
+ result.skipped.length > 8 ? ` 等 ${result.skipped.length} 个` : ""
4958
+ ]
4959
+ }),
4960
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4961
+ className: panel_module_css_default.meta,
4962
+ children: "章节已按「written」登记,进入工作台后逐章审稿/补设定即可。"
4963
+ })
4964
+ ] })
4965
+ })
4966
+ ]
4967
+ }),
4968
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4969
+ className: panel_module_css_default.importModalActions,
4970
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4971
+ type: "button",
4972
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
4973
+ onClick: onClose,
4974
+ children: "关闭"
4975
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4976
+ type: "button",
4977
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
4978
+ disabled: busy,
4979
+ onClick: runImport,
4980
+ children: busy ? "导入中…" : "开始导入"
4981
+ })]
4982
+ })
4983
+ ]
4984
+ })
4985
+ });
4986
+ }
4987
+ //#endregion
4564
4988
  //#region src/client/panel/WorldTab.tsx
4565
4989
  /**
4566
4990
  * 大世界页签:境界体系 / 地理区域 / 势力分布 的结构化编辑 + AI 提炼。
@@ -5604,7 +6028,7 @@ window.__ModuleLoader__.load({
5604
6028
  "high",
5605
6029
  "max"
5606
6030
  ];
5607
- const PLUGIN_VERSION = "1.3.3";
6031
+ const PLUGIN_VERSION = "1.4.1";
5608
6032
  /** GitHub 仓库地址(关于区块点击跳转)。 */
5609
6033
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
5610
6034
  /** Whether any chapter is being generated right now. */
@@ -6205,6 +6629,7 @@ window.__ModuleLoader__.load({
6205
6629
  });
6206
6630
  /** 视图:shelf = 书架首页;create = 开书向导;workspace = 当前书工作台。 */
6207
6631
  const [viewMode, setViewMode] = (0, react.useState)("shelf");
6632
+ const [showImport, setShowImport] = (0, react.useState)(false);
6208
6633
  /** Refresh bookshelf. */
6209
6634
  const refreshShelf = (0, react.useCallback)(async () => {
6210
6635
  try {
@@ -6348,6 +6773,28 @@ window.__ModuleLoader__.load({
6348
6773
  setBusy(false);
6349
6774
  }
6350
6775
  };
6776
+ /** 反推大纲:从已写章节正文反向生成全书总纲(流式进度)。 */
6777
+ const handleReverseOutline = async () => {
6778
+ if (project === null) return;
6779
+ if (!window.confirm("将从已写章节正文反推出全书总纲(覆盖当前大纲文本,不影响章节/设定/进度)。确定继续?")) return;
6780
+ setBusy(true);
6781
+ setError("");
6782
+ try {
6783
+ await api.outlineReverse((frame) => {
6784
+ if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
6785
+ else if (frame.type === "outline-done") {
6786
+ setOutlineText(frame.outline);
6787
+ pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
6788
+ }
6789
+ });
6790
+ await refresh(false);
6791
+ } catch (err) {
6792
+ setError(err.message);
6793
+ pushProgress(`反推大纲失败:${err.message}`, "error");
6794
+ } finally {
6795
+ setBusy(false);
6796
+ }
6797
+ };
6351
6798
  /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */
6352
6799
  const handleToggleUpdateOutline = () => {
6353
6800
  if (!updatingOutline && project !== null) setOutlineText(project.outline);
@@ -8017,6 +8464,9 @@ window.__ModuleLoader__.load({
8017
8464
  },
8018
8465
  onAddBook: () => {
8019
8466
  setViewMode("create");
8467
+ },
8468
+ onImportBook: () => {
8469
+ setShowImport(true);
8020
8470
  }
8021
8471
  }) : viewMode === "create" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CreateBookView, {
8022
8472
  api,
@@ -9204,26 +9654,39 @@ window.__ModuleLoader__.load({
9204
9654
  children: tt("tab.overview")
9205
9655
  }), project !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9206
9656
  className: panel_module_css_default.row,
9207
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9208
- className: panel_module_css_default.meta,
9209
- children: [
9210
- tt("overview.bookName"),
9211
- ": ",
9212
- project.bookName,
9213
- " · ",
9214
- project.outline.length,
9215
- " 字",
9216
- project.outlinePath !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [" · ", project.outlinePath] })
9217
- ]
9218
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
9219
- type: "button",
9220
- className: panel_module_css_default.button,
9221
- disabled: busy,
9222
- onClick: () => {
9223
- handleToggleUpdateOutline();
9224
- },
9225
- children: updatingOutline ? "收起" : "更新大纲"
9226
- })]
9657
+ children: [
9658
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9659
+ className: panel_module_css_default.meta,
9660
+ children: [
9661
+ tt("overview.bookName"),
9662
+ ": ",
9663
+ project.bookName,
9664
+ " · ",
9665
+ project.outline.length,
9666
+ " ",
9667
+ project.outlinePath !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [" · ", project.outlinePath] })
9668
+ ]
9669
+ }),
9670
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
9671
+ type: "button",
9672
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
9673
+ disabled: busy || !(project.chapters ?? []).some((c) => c.status === "written" || c.status === "approved" || c.status === "rejected"),
9674
+ onClick: () => {
9675
+ handleReverseOutline();
9676
+ },
9677
+ title: "从已写章节正文反向生成全书总纲(覆盖当前大纲文本)",
9678
+ children: "🔄 反推大纲"
9679
+ }),
9680
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
9681
+ type: "button",
9682
+ className: panel_module_css_default.button,
9683
+ disabled: busy,
9684
+ onClick: () => {
9685
+ handleToggleUpdateOutline();
9686
+ },
9687
+ children: updatingOutline ? "收起" : "更新大纲"
9688
+ })
9689
+ ]
9227
9690
  })]
9228
9691
  }), project === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
9229
9692
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -9343,10 +9806,14 @@ window.__ModuleLoader__.load({
9343
9806
  })
9344
9807
  ]
9345
9808
  })
9346
- ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
9809
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9810
+ className: panel_module_css_default.meta,
9811
+ style: { marginBottom: 6 },
9812
+ children: "大纲是本书的「出生证明」;已写章节可点右上角「🔄 反推大纲」从正文反推,或「更新大纲」手动修订。"
9813
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
9347
9814
  className: panel_module_css_default.outlineReadonly,
9348
9815
  children: project.outline
9349
- })]
9816
+ })] })]
9350
9817
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9351
9818
  className: panel_module_css_default.card,
9352
9819
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -10606,50 +11073,70 @@ window.__ModuleLoader__.load({
10606
11073
  ]
10607
11074
  }),
10608
11075
  activeTab === "assets" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, { api }),
10609
- activeTab === "settings" && configDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10610
- className: panel_module_css_default.card,
10611
- children: [
10612
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10613
- className: panel_module_css_default.cardTitle,
10614
- children: tt("settings.title")
10615
- }),
10616
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10617
- className: panel_module_css_default.field,
10618
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10619
- className: panel_module_css_default.fieldLabel,
10620
- children: tt("settings.outlinePath")
10621
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10622
- className: panel_module_css_default.input,
10623
- value: configDraft.outlinePath,
10624
- onChange: (e) => {
10625
- setConfigDraft({
10626
- ...configDraft,
10627
- outlinePath: e.target.value
10628
- });
10629
- }
10630
- })]
10631
- }),
10632
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10633
- className: panel_module_css_default.field,
10634
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10635
- className: panel_module_css_default.fieldLabel,
10636
- children: tt("settings.outputDir")
10637
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10638
- className: panel_module_css_default.input,
10639
- value: configDraft.outputDir,
10640
- onChange: (e) => {
10641
- setConfigDraft({
10642
- ...configDraft,
10643
- outputDir: e.target.value
10644
- });
10645
- }
10646
- })]
10647
- }),
10648
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10649
- className: panel_module_css_default.row,
10650
- style: { alignItems: "flex-start" },
10651
- children: [
10652
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11076
+ activeTab === "settings" && configDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
11077
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11078
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11079
+ children: [
11080
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11081
+ className: panel_module_css_default.cardTitle,
11082
+ children: "📁 路径与输出"
11083
+ }),
11084
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11085
+ className: panel_module_css_default.field,
11086
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11087
+ className: panel_module_css_default.fieldLabel,
11088
+ children: tt("settings.outlinePath")
11089
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11090
+ className: panel_module_css_default.input,
11091
+ value: configDraft.outlinePath,
11092
+ onChange: (e) => {
11093
+ setConfigDraft({
11094
+ ...configDraft,
11095
+ outlinePath: e.target.value
11096
+ });
11097
+ }
11098
+ })]
11099
+ }),
11100
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11101
+ className: panel_module_css_default.field,
11102
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11103
+ className: panel_module_css_default.fieldLabel,
11104
+ children: tt("settings.outputDir")
11105
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11106
+ className: panel_module_css_default.input,
11107
+ value: configDraft.outputDir,
11108
+ onChange: (e) => {
11109
+ setConfigDraft({
11110
+ ...configDraft,
11111
+ outputDir: e.target.value
11112
+ });
11113
+ }
11114
+ })]
11115
+ }),
11116
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11117
+ className: panel_module_css_default.row,
11118
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11119
+ type: "button",
11120
+ className: panel_module_css_default.button,
11121
+ onClick: () => {
11122
+ api.openFolder();
11123
+ },
11124
+ children: tt("settings.openFolder")
11125
+ })
11126
+ })
11127
+ ]
11128
+ }),
11129
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11130
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11131
+ children: [
11132
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11133
+ className: panel_module_css_default.cardTitle,
11134
+ children: "🤖 模型与推理"
11135
+ }),
11136
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11137
+ className: panel_module_css_default.row,
11138
+ style: { alignItems: "flex-start" },
11139
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10653
11140
  className: panel_module_css_default.field,
10654
11141
  style: { flex: 1 },
10655
11142
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
@@ -10665,8 +11152,7 @@ window.__ModuleLoader__.load({
10665
11152
  });
10666
11153
  }
10667
11154
  })]
10668
- }),
10669
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11155
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10670
11156
  className: panel_module_css_default.field,
10671
11157
  style: { flex: 1.4 },
10672
11158
  children: [
@@ -10709,8 +11195,12 @@ window.__ModuleLoader__.load({
10709
11195
  }
10710
11196
  })
10711
11197
  ]
10712
- }),
10713
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11198
+ })]
11199
+ }),
11200
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11201
+ className: panel_module_css_default.row,
11202
+ style: { alignItems: "flex-start" },
11203
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10714
11204
  className: panel_module_css_default.field,
10715
11205
  style: { flex: 1 },
10716
11206
  children: [
@@ -10724,217 +11214,93 @@ window.__ModuleLoader__.load({
10724
11214
  onChange: (e) => {
10725
11215
  setConfigDraft({
10726
11216
  ...configDraft,
10727
- reasoningEffort: e.target.value
10728
- });
10729
- },
10730
- children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10731
- value: v,
10732
- children: tt(`settings.reasoning.${v}`)
10733
- }, v))
10734
- }),
10735
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10736
- className: panel_module_css_default.meta,
10737
- children: tt("settings.reasoningHint")
10738
- })
10739
- ]
10740
- })
10741
- ]
10742
- }),
10743
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10744
- className: panel_module_css_default.row,
10745
- children: [
10746
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10747
- className: panel_module_css_default.field,
10748
- style: { flex: 1 },
10749
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10750
- className: panel_module_css_default.fieldLabel,
10751
- children: "豆包 API Key(生图)"
10752
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10753
- className: panel_module_css_default.input,
10754
- type: "password",
10755
- placeholder: "ark-...",
10756
- value: configDraft.imageApiKey ?? "",
10757
- onChange: (e) => {
10758
- setConfigDraft({
10759
- ...configDraft,
10760
- imageApiKey: e.target.value
10761
- });
10762
- }
10763
- })]
10764
- }),
10765
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10766
- className: panel_module_css_default.field,
10767
- style: { flex: 1 },
10768
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10769
- className: panel_module_css_default.fieldLabel,
10770
- children: "豆包生图模型"
10771
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10772
- className: panel_module_css_default.input,
10773
- placeholder: "doubao-seedream-5-0-pro-260628",
10774
- value: configDraft.imageApiModel ?? "",
10775
- onChange: (e) => {
10776
- setConfigDraft({
10777
- ...configDraft,
10778
- imageApiModel: e.target.value
10779
- });
10780
- }
10781
- })]
10782
- }),
10783
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10784
- className: panel_module_css_default.field,
10785
- style: { flex: 1 },
10786
- children: [
10787
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10788
- className: panel_module_css_default.fieldLabel,
10789
- children: "启用豆包生图"
10790
- }),
10791
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
10792
- className: panel_module_css_default.input,
10793
- value: configDraft.imageApiEnabled ? "1" : "0",
10794
- onChange: (e) => {
10795
- setConfigDraft({
10796
- ...configDraft,
10797
- imageApiEnabled: e.target.value === "1"
10798
- });
10799
- },
10800
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10801
- value: "0",
10802
- children: "关(默认)"
10803
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10804
- value: "1",
10805
- children: "开"
10806
- })]
10807
- }),
10808
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10809
- className: panel_module_css_default.meta,
10810
- children: "开启后角色详情显示「豆包生成」参考图按钮"
10811
- })
10812
- ]
10813
- })
10814
- ]
10815
- }),
10816
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10817
- className: panel_module_css_default.row,
10818
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10819
- className: panel_module_css_default.field,
10820
- style: { flex: 1 },
10821
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10822
- className: panel_module_css_default.fieldLabel,
10823
- children: tt("settings.chapterChars")
10824
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10825
- className: panel_module_css_default.input,
10826
- type: "number",
10827
- min: 1e3,
10828
- max: 2e4,
10829
- value: configDraft.chapterChars,
10830
- onChange: (e) => {
10831
- setConfigDraft({
10832
- ...configDraft,
10833
- chapterChars: Number(e.target.value)
10834
- });
10835
- }
10836
- })]
10837
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10838
- className: panel_module_css_default.field,
10839
- style: { flex: 1 },
10840
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10841
- className: panel_module_css_default.fieldLabel,
10842
- children: tt("settings.maxTokens")
10843
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10844
- className: panel_module_css_default.input,
10845
- type: "number",
10846
- min: 2e3,
10847
- max: 64e3,
10848
- value: configDraft.maxTokens,
10849
- onChange: (e) => {
10850
- setConfigDraft({
10851
- ...configDraft,
10852
- maxTokens: Number(e.target.value)
10853
- });
10854
- }
10855
- })]
10856
- })]
10857
- }),
10858
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10859
- className: panel_module_css_default.row,
10860
- children: [
10861
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10862
- className: panel_module_css_default.field,
10863
- style: { flex: 1 },
10864
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10865
- className: panel_module_css_default.fieldLabel,
10866
- children: tt("settings.reviewPassScore")
10867
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10868
- className: panel_module_css_default.input,
10869
- type: "number",
10870
- min: 0,
10871
- max: 100,
10872
- value: configDraft.reviewPassScore,
10873
- onChange: (e) => {
10874
- setConfigDraft({
10875
- ...configDraft,
10876
- reviewPassScore: Number(e.target.value)
10877
- });
10878
- }
10879
- })]
10880
- }),
10881
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11217
+ reasoningEffort: e.target.value
11218
+ });
11219
+ },
11220
+ children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11221
+ value: v,
11222
+ children: tt(`settings.reasoning.${v}`)
11223
+ }, v))
11224
+ }),
11225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11226
+ className: panel_module_css_default.meta,
11227
+ children: tt("settings.reasoningHint")
11228
+ })
11229
+ ]
11230
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10882
11231
  className: panel_module_css_default.field,
10883
11232
  style: { flex: 1 },
10884
11233
  children: [
10885
11234
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10886
11235
  className: panel_module_css_default.fieldLabel,
10887
- children: tt("settings.editorFontSize")
11236
+ children: tt("settings.analysisReasoning")
10888
11237
  }),
10889
11238
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
10890
11239
  className: panel_module_css_default.input,
10891
- value: editorFontSize,
11240
+ value: configDraft.analysisReasoning ?? "low",
10892
11241
  onChange: (e) => {
10893
- changeEditorFontSize(Number(e.target.value));
11242
+ setConfigDraft({
11243
+ ...configDraft,
11244
+ analysisReasoning: e.target.value
11245
+ });
10894
11246
  },
10895
- children: [
10896
- 12,
10897
- 13,
10898
- 14,
10899
- 15,
10900
- 16,
10901
- 18,
10902
- 20,
10903
- 22,
10904
- 24
10905
- ].map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
11247
+ children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10906
11248
  value: v,
10907
- children: [v, "px"]
11249
+ children: tt(`settings.reasoning.${v}`)
10908
11250
  }, v))
10909
11251
  }),
10910
11252
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10911
11253
  className: panel_module_css_default.meta,
10912
- children: tt("settings.editorFontSizeHint")
11254
+ children: tt("settings.analysisReasoningHint")
10913
11255
  })
10914
11256
  ]
11257
+ })]
11258
+ })
11259
+ ]
11260
+ }),
11261
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11262
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11263
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11264
+ className: panel_module_css_default.cardTitle,
11265
+ children: "🎨 生图(豆包)"
11266
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11267
+ className: panel_module_css_default.row,
11268
+ children: [
11269
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11270
+ className: panel_module_css_default.field,
11271
+ style: { flex: 1 },
11272
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11273
+ className: panel_module_css_default.fieldLabel,
11274
+ children: "豆包 API Key(生图)"
11275
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11276
+ className: panel_module_css_default.input,
11277
+ type: "password",
11278
+ placeholder: "ark-...",
11279
+ value: configDraft.imageApiKey ?? "",
11280
+ onChange: (e) => {
11281
+ setConfigDraft({
11282
+ ...configDraft,
11283
+ imageApiKey: e.target.value
11284
+ });
11285
+ }
11286
+ })]
10915
11287
  }),
10916
11288
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10917
11289
  className: panel_module_css_default.field,
10918
11290
  style: { flex: 1 },
10919
11291
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10920
11292
  className: panel_module_css_default.fieldLabel,
10921
- children: tt("settings.autoReview")
10922
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11293
+ children: "豆包生图模型"
11294
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10923
11295
  className: panel_module_css_default.input,
10924
- value: configDraft.autoReview ? "1" : "0",
11296
+ placeholder: "doubao-seedream-5-0-pro-260628",
11297
+ value: configDraft.imageApiModel ?? "",
10925
11298
  onChange: (e) => {
10926
11299
  setConfigDraft({
10927
11300
  ...configDraft,
10928
- autoReview: e.target.value === "1"
11301
+ imageApiModel: e.target.value
10929
11302
  });
10930
- },
10931
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10932
- value: "1",
10933
- children: "✓ 是"
10934
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10935
- value: "0",
10936
- children: "✗ 否"
10937
- })]
11303
+ }
10938
11304
  })]
10939
11305
  }),
10940
11306
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -10943,46 +11309,164 @@ window.__ModuleLoader__.load({
10943
11309
  children: [
10944
11310
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10945
11311
  className: panel_module_css_default.fieldLabel,
10946
- children: tt("settings.autoAuthorReview")
11312
+ children: "启用豆包生图"
10947
11313
  }),
10948
11314
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
10949
11315
  className: panel_module_css_default.input,
10950
- value: configDraft.autoAuthorReview ? "1" : "0",
11316
+ value: configDraft.imageApiEnabled ? "1" : "0",
10951
11317
  onChange: (e) => {
10952
11318
  setConfigDraft({
10953
11319
  ...configDraft,
10954
- autoAuthorReview: e.target.value === "1"
11320
+ imageApiEnabled: e.target.value === "1"
10955
11321
  });
10956
11322
  },
10957
11323
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10958
- value: "1",
10959
- children: "✓ 是"
10960
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
10961
11324
  value: "0",
10962
- children: "✗ 否"
11325
+ children: "关(默认)"
11326
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11327
+ value: "1",
11328
+ children: "开"
10963
11329
  })]
10964
11330
  }),
10965
11331
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10966
11332
  className: panel_module_css_default.meta,
10967
- children: tt("settings.autoAuthorReviewHint")
11333
+ children: "开启后角色详情显示「豆包生成」参考图按钮"
10968
11334
  })
10969
11335
  ]
10970
- }),
10971
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10972
- className: panel_module_css_default.field,
10973
- style: { flex: 1 },
10974
- children: [
10975
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11336
+ })
11337
+ ]
11338
+ })]
11339
+ }),
11340
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11341
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11342
+ children: [
11343
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11344
+ className: panel_module_css_default.cardTitle,
11345
+ children: "✍️ 写作与审稿参数"
11346
+ }),
11347
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11348
+ className: panel_module_css_default.row,
11349
+ children: [
11350
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11351
+ className: panel_module_css_default.field,
11352
+ style: { flex: 1 },
11353
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10976
11354
  className: panel_module_css_default.fieldLabel,
10977
- children: tt("settings.autoReviewAfterRevise")
10978
- }),
10979
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11355
+ children: tt("settings.chapterChars")
11356
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11357
+ className: panel_module_css_default.input,
11358
+ type: "number",
11359
+ min: 1e3,
11360
+ max: 2e4,
11361
+ value: configDraft.chapterChars,
11362
+ onChange: (e) => {
11363
+ setConfigDraft({
11364
+ ...configDraft,
11365
+ chapterChars: Number(e.target.value)
11366
+ });
11367
+ }
11368
+ })]
11369
+ }),
11370
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11371
+ className: panel_module_css_default.field,
11372
+ style: { flex: 1 },
11373
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11374
+ className: panel_module_css_default.fieldLabel,
11375
+ children: tt("settings.maxTokens")
11376
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11377
+ className: panel_module_css_default.input,
11378
+ type: "number",
11379
+ min: 2e3,
11380
+ max: 64e3,
11381
+ value: configDraft.maxTokens,
11382
+ onChange: (e) => {
11383
+ setConfigDraft({
11384
+ ...configDraft,
11385
+ maxTokens: Number(e.target.value)
11386
+ });
11387
+ }
11388
+ })]
11389
+ }),
11390
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11391
+ className: panel_module_css_default.field,
11392
+ style: { flex: 1 },
11393
+ children: [
11394
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11395
+ className: panel_module_css_default.fieldLabel,
11396
+ children: tt("settings.editorFontSize")
11397
+ }),
11398
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
11399
+ className: panel_module_css_default.input,
11400
+ value: editorFontSize,
11401
+ onChange: (e) => {
11402
+ changeEditorFontSize(Number(e.target.value));
11403
+ },
11404
+ children: [
11405
+ 12,
11406
+ 13,
11407
+ 14,
11408
+ 15,
11409
+ 16,
11410
+ 18,
11411
+ 20,
11412
+ 22,
11413
+ 24
11414
+ ].map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
11415
+ value: v,
11416
+ children: [v, "px"]
11417
+ }, v))
11418
+ }),
11419
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11420
+ className: panel_module_css_default.meta,
11421
+ children: tt("settings.editorFontSizeHint")
11422
+ })
11423
+ ]
11424
+ })
11425
+ ]
11426
+ }),
11427
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11428
+ className: panel_module_css_default.row,
11429
+ children: [
11430
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11431
+ className: panel_module_css_default.field,
11432
+ style: { flex: 1 },
11433
+ children: [
11434
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11435
+ className: panel_module_css_default.fieldLabel,
11436
+ children: tt("settings.reviewPassScore")
11437
+ }),
11438
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11439
+ className: panel_module_css_default.input,
11440
+ type: "number",
11441
+ min: 0,
11442
+ max: 100,
11443
+ value: configDraft.reviewPassScore,
11444
+ onChange: (e) => {
11445
+ setConfigDraft({
11446
+ ...configDraft,
11447
+ reviewPassScore: Number(e.target.value)
11448
+ });
11449
+ }
11450
+ }),
11451
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11452
+ className: panel_module_css_default.meta,
11453
+ children: "通过判定:综合评分 ≥ 此分数(默认 70),或无 high 级问题且评分 ≥ 60;建议设 60-80。"
11454
+ })
11455
+ ]
11456
+ }),
11457
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11458
+ className: panel_module_css_default.field,
11459
+ style: { flex: 1 },
11460
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11461
+ className: panel_module_css_default.fieldLabel,
11462
+ children: tt("settings.autoReview")
11463
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
10980
11464
  className: panel_module_css_default.input,
10981
- value: configDraft.autoReviewAfterRevise ? "1" : "0",
11465
+ value: configDraft.autoReview ? "1" : "0",
10982
11466
  onChange: (e) => {
10983
11467
  setConfigDraft({
10984
11468
  ...configDraft,
10985
- autoReviewAfterRevise: e.target.value === "1"
11469
+ autoReview: e.target.value === "1"
10986
11470
  });
10987
11471
  },
10988
11472
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
@@ -10992,49 +11476,98 @@ window.__ModuleLoader__.load({
10992
11476
  value: "0",
10993
11477
  children: "✗ 否"
10994
11478
  })]
10995
- }),
10996
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10997
- className: panel_module_css_default.meta,
10998
- children: tt("settings.autoReviewAfterReviseHint")
10999
- })
11000
- ]
11001
- })
11002
- ]
11003
- }),
11004
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11479
+ })]
11480
+ }),
11481
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11482
+ className: panel_module_css_default.field,
11483
+ style: { flex: 1 },
11484
+ children: [
11485
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11486
+ className: panel_module_css_default.fieldLabel,
11487
+ children: tt("settings.autoAuthorReview")
11488
+ }),
11489
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11490
+ className: panel_module_css_default.input,
11491
+ value: configDraft.autoAuthorReview ? "1" : "0",
11492
+ onChange: (e) => {
11493
+ setConfigDraft({
11494
+ ...configDraft,
11495
+ autoAuthorReview: e.target.value === "1"
11496
+ });
11497
+ },
11498
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11499
+ value: "1",
11500
+ children: "✓ 是"
11501
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11502
+ value: "0",
11503
+ children: "✗ 否"
11504
+ })]
11505
+ }),
11506
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11507
+ className: panel_module_css_default.meta,
11508
+ children: tt("settings.autoAuthorReviewHint")
11509
+ })
11510
+ ]
11511
+ }),
11512
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11513
+ className: panel_module_css_default.field,
11514
+ style: { flex: 1 },
11515
+ children: [
11516
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11517
+ className: panel_module_css_default.fieldLabel,
11518
+ children: tt("settings.autoReviewAfterRevise")
11519
+ }),
11520
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11521
+ className: panel_module_css_default.input,
11522
+ value: configDraft.autoReviewAfterRevise ? "1" : "0",
11523
+ onChange: (e) => {
11524
+ setConfigDraft({
11525
+ ...configDraft,
11526
+ autoReviewAfterRevise: e.target.value === "1"
11527
+ });
11528
+ },
11529
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11530
+ value: "1",
11531
+ children: "✓ 是"
11532
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11533
+ value: "0",
11534
+ children: "✗ 否"
11535
+ })]
11536
+ }),
11537
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11538
+ className: panel_module_css_default.meta,
11539
+ children: tt("settings.autoReviewAfterReviseHint")
11540
+ })
11541
+ ]
11542
+ })
11543
+ ]
11544
+ })
11545
+ ]
11546
+ }),
11547
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11548
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11549
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11005
11550
  className: panel_module_css_default.row,
11006
- children: [
11007
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11008
- type: "button",
11009
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
11010
- disabled: busy,
11011
- onClick: () => {
11012
- handleSaveConfig();
11013
- },
11014
- children: tt("settings.save")
11015
- }),
11016
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11017
- type: "button",
11018
- className: panel_module_css_default.button,
11019
- onClick: () => {
11020
- api.openFolder();
11021
- },
11022
- children: tt("settings.openFolder")
11023
- }),
11024
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
11025
- className: panel_module_css_default.meta,
11026
- children: [
11027
- "当前:",
11028
- config?.provider,
11029
- " / ",
11030
- config?.model,
11031
- " · ",
11032
- config?.outputDir
11033
- ]
11034
- })
11035
- ]
11036
- }),
11037
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11551
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11552
+ type: "button",
11553
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
11554
+ disabled: busy,
11555
+ onClick: () => {
11556
+ handleSaveConfig();
11557
+ },
11558
+ children: tt("settings.save")
11559
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
11560
+ className: panel_module_css_default.meta,
11561
+ children: [
11562
+ "当前:",
11563
+ config?.provider,
11564
+ " / ",
11565
+ config?.model,
11566
+ " · ",
11567
+ config?.outputDir
11568
+ ]
11569
+ })]
11570
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11038
11571
  className: panel_module_css_default.row,
11039
11572
  children: [
11040
11573
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -11060,11 +11593,11 @@ window.__ModuleLoader__.load({
11060
11593
  children: tt("settings.exportMd")
11061
11594
  })
11062
11595
  ]
11063
- })
11064
- ]
11065
- }),
11596
+ })]
11597
+ })
11598
+ ] }),
11066
11599
  activeTab === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11067
- className: panel_module_css_default.card,
11600
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11068
11601
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11069
11602
  className: panel_module_css_default.cardTitle,
11070
11603
  children: tt("settings.theme")
@@ -14035,6 +14568,15 @@ window.__ModuleLoader__.load({
14035
14568
  }
14036
14569
  })
14037
14570
  ]
14571
+ }),
14572
+ showImport && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ImportModal, {
14573
+ api,
14574
+ onClose: () => {
14575
+ setShowImport(false);
14576
+ },
14577
+ onImported: async () => {
14578
+ await refreshShelf();
14579
+ }
14038
14580
  })
14039
14581
  ]
14040
14582
  });