@waterwx/dsh-novel-forge 1.4.0 → 1.5.0

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.
Files changed (49) hide show
  1. package/assets/styles/arcane-thick-3d.webp +0 -0
  2. package/assets/styles/chinese-ink.webp +0 -0
  3. package/assets/styles/clay-stopmotion-3d.webp +0 -0
  4. package/assets/styles/dark-ghibli.webp +0 -0
  5. package/assets/styles/dark-gothic-3d.webp +0 -0
  6. package/assets/styles/film-photo.webp +0 -0
  7. package/assets/styles/guofeng-heavy.webp +0 -0
  8. package/assets/styles/horror-game-3d.webp +0 -0
  9. package/assets/styles/japan-cel-dark.webp +0 -0
  10. package/assets/styles/korean-webtoon.webp +0 -0
  11. package/assets/styles/low-cyberpunk-3d.webp +0 -0
  12. package/assets/styles/nextgen-cg.webp +0 -0
  13. package/assets/styles/noir-film.webp +0 -0
  14. package/assets/styles/openworld-survival.webp +0 -0
  15. package/assets/styles/paper-cut-3d.webp +0 -0
  16. package/assets/styles/pixar-adult-3d.webp +0 -0
  17. package/assets/styles/pop-marvel-2d.webp +0 -0
  18. package/assets/styles/shinkai-anime.webp +0 -0
  19. package/assets/styles/tactical-stealth.webp +0 -0
  20. package/assets/styles/vaporwave-3d.webp +0 -0
  21. package/assets/styles/vhs90.webp +0 -0
  22. package/lib/client.js +2073 -658
  23. package/lib/client.js.map +1 -1
  24. package/lib/index.js +919 -64
  25. package/lib/index.js.map +1 -1
  26. package/lib/types/client/api.d.ts +15 -1
  27. package/lib/types/client/locales.d.ts +4 -2
  28. package/lib/types/client/panel/MangaWorkspace.d.ts +9 -0
  29. package/lib/types/client/panel/NovelPanel.d.ts +1 -1
  30. package/lib/types/client/panel/StoryboardTab.d.ts +13 -0
  31. package/lib/types/client/panel/StyleGallery.d.ts +1 -0
  32. package/lib/types/engine.d.ts +46 -4
  33. package/lib/types/index.d.ts +2 -0
  34. package/lib/types/protocol.d.ts +194 -3
  35. package/lib/types/style-library.d.ts +33 -0
  36. package/package.json +2 -1
  37. package/src/client/api.ts +36 -1
  38. package/src/client/locales.ts +7 -3
  39. package/src/client/panel/ImportModal.tsx +123 -21
  40. package/src/client/panel/MangaWorkspace.tsx +185 -0
  41. package/src/client/panel/NovelPanel.tsx +239 -150
  42. package/src/client/panel/StoryboardTab.tsx +287 -0
  43. package/src/client/panel/StyleGallery.tsx +109 -0
  44. package/src/client/panel/panel.module.css +77 -0
  45. package/src/engine.ts +457 -39
  46. package/src/index.ts +6 -0
  47. package/src/protocol.ts +200 -3
  48. package/src/routes.ts +280 -13
  49. package/src/style-library.ts +78 -0
package/lib/client.js CHANGED
@@ -49,6 +49,16 @@ window.__ModuleLoader__.load({
49
49
  bookshelfImportDir: "/api/dsh-novel-forge/bookshelf/import-dir",
50
50
  /** 导入 txt/md 全本:拆章建项目并登记书架。 */
51
51
  bookshelfImportText: "/api/dsh-novel-forge/bookshelf/import-text",
52
+ /** 导入 txt/md 全本:拆章预览(不落盘)。 */
53
+ bookshelfImportTextPreview: "/api/dsh-novel-forge/bookshelf/import-text/preview",
54
+ /** 漫剧方案管理:create/remove/activate。 */
55
+ manhuaPlans: "/api/dsh-novel-forge/manhua/plans",
56
+ /** 分镜·编剧级:单章 → 剧情骨架(节拍链)。 */
57
+ storyboardSkeleton: "/api/dsh-novel-forge/storyboard/skeleton",
58
+ /** 分镜·导演级:骨架 → 分镜表(镜头级)。 */
59
+ storyboardTable: "/api/dsh-novel-forge/storyboard/table",
60
+ /** 分镜·提示词级:分镜表 → 即梦可粘贴视频提示词。 */
61
+ storyboardPrompts: "/api/dsh-novel-forge/storyboard/prompts",
52
62
  /** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */
53
63
  reset: "/api/dsh-novel-forge/reset",
54
64
  /** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */
@@ -83,6 +93,8 @@ window.__ModuleLoader__.load({
83
93
  sensitiveCheck: "/api/dsh-novel-forge/sensitive-check",
84
94
  /** 开书想法 → AI 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */
85
95
  outlineSuggest: "/api/dsh-novel-forge/outline/suggest",
96
+ /** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
97
+ outlineReverse: "/api/dsh-novel-forge/outline/reverse",
86
98
  /** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */
87
99
  breakdown: "/api/dsh-novel-forge/breakdown",
88
100
  /** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */
@@ -144,6 +156,36 @@ window.__ModuleLoader__.load({
144
156
  async saveOutline(text) {
145
157
  return postJson(NOVEL_API.saveOutline, { text });
146
158
  }
159
+ /** 反推大纲:从已写章节正文反向生成全书总纲(NDJSON 流)。 */
160
+ async outlineReverse(onFrame) {
161
+ await this.streamJob(NOVEL_API.outlineReverse, {}, onFrame);
162
+ }
163
+ /** 分镜·导演级:骨架 → 分镜表(镜头级)。 */
164
+ async storyboardTable(chapterNo, skeleton, styleId, filterId) {
165
+ return postJson(NOVEL_API.storyboardTable, {
166
+ chapterNo,
167
+ skeleton,
168
+ styleId,
169
+ filterId
170
+ });
171
+ }
172
+ /** 漫剧方案管理:create / remove / activate。 */
173
+ async manhuaPlans(req) {
174
+ return postJson(NOVEL_API.manhuaPlans, req);
175
+ }
176
+ /** 分镜·提示词级:分镜表 → 即梦可粘贴视频提示词。 */
177
+ async storyboardPrompts(chapterNo, table, styleId, filterId) {
178
+ return postJson(NOVEL_API.storyboardPrompts, {
179
+ chapterNo,
180
+ table,
181
+ styleId,
182
+ filterId
183
+ });
184
+ }
185
+ /** 分镜·编剧级:单章 → 剧情骨架(节拍链)。 */
186
+ async storyboardSkeleton(chapterNo) {
187
+ return postJson(NOVEL_API.storyboardSkeleton, { chapterNo });
188
+ }
147
189
  /** 开书想法 → AI 大纲:生成 count 个方案(换批时传 exclude 避开已暂留方向)。 */
148
190
  async outlineSuggest(idea, count, exclude) {
149
191
  return postJson(NOVEL_API.outlineSuggest, {
@@ -325,13 +367,28 @@ window.__ModuleLoader__.load({
325
367
  async bookImportDir(outputDir) {
326
368
  return postJson(NOVEL_API.bookshelfImportDir, { outputDir });
327
369
  }
328
- /** 导入 txt/md 全本(Mode B):拆章建项目并登记书架。 */
370
+ /** 导入 txt/md 全本(Mode B):服务器本地文件路径模式。 */
329
371
  async bookImportText(filePath, outputDir) {
330
372
  return postJson(NOVEL_API.bookshelfImportText, {
331
373
  filePath,
332
374
  outputDir
333
375
  });
334
376
  }
377
+ /** 拆章预览(浏览器上传全文,不落盘):返回识别到的章节与跳过清单。 */
378
+ async bookImportTextPreview(text, fileName) {
379
+ return postJson(NOVEL_API.bookshelfImportTextPreview, {
380
+ text,
381
+ fileName
382
+ });
383
+ }
384
+ /** 导入 txt/md 全本(Mode B):浏览器上传全文内容模式。 */
385
+ async bookImportTextContent(text, fileName, outputDir) {
386
+ return postJson(NOVEL_API.bookshelfImportText, {
387
+ text,
388
+ fileName,
389
+ outputDir
390
+ });
391
+ }
335
392
  /** 生产单:启动批量生产(区间或新增 N 章;计划不足自动补)。 */
336
393
  async runStart(req) {
337
394
  return postJson(NOVEL_API.runStart, req);
@@ -624,12 +681,14 @@ window.__ModuleLoader__.load({
624
681
  "settings.model": "模型",
625
682
  "settings.modelCustom": "自定义…",
626
683
  "settings.modelCustomPlaceholder": "输入任意模型 id",
627
- "settings.reasoningEffort": "思考强度 (reasoningEffort)",
684
+ "settings.reasoningEffort": "写作类任务思考强度 (reasoningEffort)",
685
+ "settings.reasoningHint": "章节生成/润色/重写/审稿等写作任务使用;关掉更省更快。",
686
+ "settings.analysisReasoning": "分析类任务思考强度(提炼/拆书/反推大纲)",
687
+ "settings.analysisReasoningHint": "角色/场景/道藏提炼、拆书、反推大纲等一次性分析任务默认 low,保证质量,不受上面写作档位影响。",
628
688
  "settings.reasoning.off": "off · 关闭思考(推荐日常写文)",
629
689
  "settings.reasoning.low": "low · 低思考",
630
690
  "settings.reasoning.high": "high · 高思考",
631
691
  "settings.reasoning.max": "max · 最高思考(质检/推演)",
632
- "settings.reasoningHint": "off 最快最省;high/max 更慢更贵但推理更强",
633
692
  "settings.theme": "主题",
634
693
  "settings.themeLiquid": "iOS 液态玻璃(绿)",
635
694
  "settings.themeClassic": "经典毛玻璃(蓝)",
@@ -774,7 +833,9 @@ window.__ModuleLoader__.load({
774
833
  "settings.model": "Model",
775
834
  "settings.modelCustom": "Custom…",
776
835
  "settings.modelCustomPlaceholder": "Type any model id",
777
- "settings.reasoningEffort": "Reasoning effort",
836
+ "settings.reasoningEffort": "Writing-task reasoning effort",
837
+ "settings.analysisReasoning": "Analysis-task reasoning (extract / breakdown / reverse outline)",
838
+ "settings.analysisReasoningHint": "One-off analysis tasks (roles/scenes/bible extract, breakdown, reverse outline) default to low; not affected by the writing-level switch.",
778
839
  "settings.reasoning.off": "off · no thinking (recommended)",
779
840
  "settings.reasoning.low": "low",
780
841
  "settings.reasoning.high": "high",
@@ -915,7 +976,7 @@ window.__ModuleLoader__.load({
915
976
  }
916
977
  //#endregion
917
978
  //#region \0dsh-css:D:\ryan work\harness\plugins\novel-forge\src\client\panel\panel.module.css.mjs
918
- 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}";
979
+ 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}";
919
980
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
920
981
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
921
982
  const tag = document.createElement("style");
@@ -925,282 +986,288 @@ window.__ModuleLoader__.load({
925
986
  document.head.appendChild(tag);
926
987
  }
927
988
  var panel_module_css_default = {
928
- "statRowD": "zE6uZW_statRowD",
929
- "legendOld": "zE6uZW_legendOld",
930
- "progressBarFill": "zE6uZW_progressBarFill",
931
- "card": "zE6uZW_card",
989
+ "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
990
+ "entryIcon": "zE6uZW_entryIcon",
932
991
  "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
933
- "bookCreateOutline": "zE6uZW_bookCreateOutline",
934
- "chapter": "zE6uZW_chapter",
935
- "todoInfo": "zE6uZW_todoInfo",
936
- "workflowRow": "zE6uZW_workflowRow",
937
- "readerBody": "zE6uZW_readerBody",
938
- "shelfView": "zE6uZW_shelfView",
992
+ "navBadgePulse": "zE6uZW_navBadgePulse",
993
+ "toolStepStatus": "zE6uZW_toolStepStatus",
994
+ "dashFact": "zE6uZW_dashFact",
995
+ "bookChipRemove": "zE6uZW_bookChipRemove",
996
+ "row": "zE6uZW_row",
997
+ "readerItemNo": "zE6uZW_readerItemNo",
939
998
  "readerSegActive": "zE6uZW_readerSegActive",
940
- "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
941
- "readerItem": "zE6uZW_readerItem",
942
- "dashFacts": "zE6uZW_dashFacts",
943
- "readerPara": "zE6uZW_readerPara",
944
- "panelNav": "zE6uZW_panelNav",
945
- "assistantStatus": "zE6uZW_assistantStatus",
946
- "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
947
- "legendNew": "zE6uZW_legendNew",
948
- "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
999
+ "input": "zE6uZW_input",
1000
+ "statCardD": "zE6uZW_statCardD",
1001
+ "statCardDDown": "zE6uZW_statCardDDown",
1002
+ "tlSegLabel": "zE6uZW_tlSegLabel",
1003
+ "bookCardCover": "zE6uZW_bookCardCover",
1004
+ "workflowRow": "zE6uZW_workflowRow",
1005
+ "progressLineError": "zE6uZW_progressLineError",
1006
+ "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
949
1007
  "chapterActions": "zE6uZW_chapterActions",
950
- "navActionBtn": "zE6uZW_navActionBtn",
951
- "dashStageCurrent": "zE6uZW_dashStageCurrent",
952
- "navSpacer": "zE6uZW_navSpacer",
1008
+ "tlSegDone": "zE6uZW_tlSegDone",
1009
+ "panel": "zE6uZW_panel",
1010
+ "legendOld": "zE6uZW_legendOld",
1011
+ "chapter": "zE6uZW_chapter",
1012
+ "toolStepDetail": "zE6uZW_toolStepDetail",
1013
+ "bookshelf": "zE6uZW_bookshelf",
1014
+ "navAbout": "zE6uZW_navAbout",
1015
+ "progressLineLive": "zE6uZW_progressLineLive",
1016
+ "dashJourneyStages": "zE6uZW_dashJourneyStages",
1017
+ "bookCardBlurb": "zE6uZW_bookCardBlurb",
1018
+ "navTitleBook": "zE6uZW_navTitleBook",
1019
+ "chapterBeats": "zE6uZW_chapterBeats",
1020
+ "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
1021
+ "chapterMain": "zE6uZW_chapterMain",
1022
+ "wsPreview": "zE6uZW_wsPreview",
1023
+ "workflowHint": "zE6uZW_workflowHint",
1024
+ "diffText": "zE6uZW_diffText",
1025
+ "progressLine": "zE6uZW_progressLine",
1026
+ "createBookIcon": "zE6uZW_createBookIcon",
1027
+ "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
1028
+ "diffDel": "zE6uZW_diffDel",
953
1029
  "panelBody": "zE6uZW_panelBody",
954
- "toolLive": "zE6uZW_toolLive",
955
- "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
956
- "ideaCard": "zE6uZW_ideaCard",
957
- "cardTitle": "zE6uZW_cardTitle",
1030
+ "navActions": "zE6uZW_navActions",
1031
+ "dashStageCurrent": "zE6uZW_dashStageCurrent",
1032
+ "fadeIn": "zE6uZW_fadeIn",
958
1033
  "view": "zE6uZW_view",
1034
+ "diffTagOld": "zE6uZW_diffTagOld",
1035
+ "navAboutRow": "zE6uZW_navAboutRow",
1036
+ "helpTip": "zE6uZW_helpTip",
1037
+ "tlSegCurrent": "zE6uZW_tlSegCurrent",
1038
+ "bookCreateForm": "zE6uZW_bookCreateForm",
1039
+ "button": "zE6uZW_button",
959
1040
  "toolStep": "zE6uZW_toolStep",
960
- "navTabBadge": "zE6uZW_navTabBadge",
961
- "statCardDIconRed": "zE6uZW_statCardDIconRed",
962
- "chapterFocus": "zE6uZW_chapterFocus",
963
- "navGroupSep": "zE6uZW_navGroupSep",
964
- "bookshelfLabel": "zE6uZW_bookshelfLabel",
1041
+ "importError": "zE6uZW_importError",
1042
+ "wsColumns": "zE6uZW_wsColumns",
1043
+ "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
1044
+ "statRowD": "zE6uZW_statRowD",
1045
+ "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
1046
+ "badgeError": "zE6uZW_badgeError",
1047
+ "meta": "zE6uZW_meta",
1048
+ "readerItem": "zE6uZW_readerItem",
1049
+ "fileList": "zE6uZW_fileList",
965
1050
  "dropzone": "zE6uZW_dropzone",
966
- "bookChip": "zE6uZW_bookChip",
1051
+ "workflowLabel": "zE6uZW_workflowLabel",
1052
+ "bookAddCard": "zE6uZW_bookAddCard",
1053
+ "settingsCard": "zE6uZW_settingsCard",
1054
+ "dashFacts": "zE6uZW_dashFacts",
1055
+ "wsPageHeader": "zE6uZW_wsPageHeader",
1056
+ "dashHeroTitle": "zE6uZW_dashHeroTitle",
1057
+ "chatRole": "zE6uZW_chatRole",
1058
+ "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
1059
+ "ideaCard": "zE6uZW_ideaCard",
1060
+ "readerChapterMeta": "zE6uZW_readerChapterMeta",
1061
+ "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
1062
+ "badgeGenerating": "zE6uZW_badgeGenerating",
1063
+ "tlSegTodo": "zE6uZW_tlSegTodo",
1064
+ "textarea": "zE6uZW_textarea",
1065
+ "field": "zE6uZW_field",
1066
+ "spaceBetween": "zE6uZW_spaceBetween",
1067
+ "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
1068
+ "buttonPrimary": "zE6uZW_buttonPrimary",
1069
+ "bookCard": "zE6uZW_bookCard",
1070
+ "importPreview": "zE6uZW_importPreview",
1071
+ "wsSelectedText": "zE6uZW_wsSelectedText",
1072
+ "bookCardActions": "zE6uZW_bookCardActions",
1073
+ "readerItemActive": "zE6uZW_readerItemActive",
1074
+ "todoDanger": "zE6uZW_todoDanger",
1075
+ "buttonDanger": "zE6uZW_buttonDanger",
1076
+ "legendNew": "zE6uZW_legendNew",
1077
+ "readerView": "zE6uZW_readerView",
1078
+ "bookChipMeta": "zE6uZW_bookChipMeta",
1079
+ "importModalActions": "zE6uZW_importModalActions",
1080
+ "bookSwitchName": "zE6uZW_bookSwitchName",
1081
+ "outlineReadonly": "zE6uZW_outlineReadonly",
1082
+ "diffList": "zE6uZW_diffList",
1083
+ "badgeRejected": "zE6uZW_badgeRejected",
1084
+ "navGroup": "zE6uZW_navGroup",
1085
+ "wsColumn": "zE6uZW_wsColumn",
1086
+ "panelTitle": "zE6uZW_panelTitle",
1087
+ "shelfFilters": "zE6uZW_shelfFilters",
1088
+ "chapterFocus": "zE6uZW_chapterFocus",
1089
+ "assetGrid": "zE6uZW_assetGrid",
1090
+ "helpTipText": "zE6uZW_helpTipText",
1091
+ "assetStatDetail": "zE6uZW_assetStatDetail",
1092
+ "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
1093
+ "diffSame": "zE6uZW_diffSame",
1094
+ "importModalTabs": "zE6uZW_importModalTabs",
1095
+ "progressBarFill": "zE6uZW_progressBarFill",
1096
+ "navTitleName": "zE6uZW_navTitleName",
1097
+ "workflowDotActive": "zE6uZW_workflowDotActive",
1098
+ "readerTitle": "zE6uZW_readerTitle",
1099
+ "diffNew": "zE6uZW_diffNew",
1100
+ "iconButton": "zE6uZW_iconButton",
1101
+ "bookCardName": "zE6uZW_bookCardName",
1102
+ "ideaToggle": "zE6uZW_ideaToggle",
1103
+ "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
1104
+ "dashHeroAction": "zE6uZW_dashHeroAction",
1105
+ "navTabBadge": "zE6uZW_navTabBadge",
1106
+ "wsSelected": "zE6uZW_wsSelected",
1107
+ "readerItemBadge": "zE6uZW_readerItemBadge",
1108
+ "readerChapterTitle": "zE6uZW_readerChapterTitle",
1109
+ "importFileInfo": "zE6uZW_importFileInfo",
1110
+ "importResult": "zE6uZW_importResult",
1111
+ "readerGroupCount": "zE6uZW_readerGroupCount",
1112
+ "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
1113
+ "shelfView": "zE6uZW_shelfView",
1114
+ "bookAdd": "zE6uZW_bookAdd",
1115
+ "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
1116
+ "tlBar": "zE6uZW_tlBar",
1117
+ "tlSeg": "zE6uZW_tlSeg",
1118
+ "navAboutUpdate": "zE6uZW_navAboutUpdate",
1119
+ "toolStepName": "zE6uZW_toolStepName",
1120
+ "bookAddIcon": "zE6uZW_bookAddIcon",
1121
+ "importModal": "zE6uZW_importModal",
1122
+ "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
1123
+ "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
1124
+ "navGroupLabel": "zE6uZW_navGroupLabel",
1125
+ "importField": "zE6uZW_importField",
1126
+ "navActionBtn": "zE6uZW_navActionBtn",
1127
+ "dashStageDone": "zE6uZW_dashStageDone",
1128
+ "toolStepError": "zE6uZW_toolStepError",
1129
+ "navTitleLogo": "zE6uZW_navTitleLogo",
1130
+ "diffOld": "zE6uZW_diffOld",
967
1131
  "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
968
- "wsPreviewText": "zE6uZW_wsPreviewText",
1132
+ "readerBody": "zE6uZW_readerBody",
969
1133
  "tlSegFill": "zE6uZW_tlSegFill",
1134
+ "reviewBox": "zE6uZW_reviewBox",
970
1135
  "diffChange": "zE6uZW_diffChange",
971
- "navBadgePulse": "zE6uZW_navBadgePulse",
972
- "badgeGenerating": "zE6uZW_badgeGenerating",
973
- "bookCardBody": "zE6uZW_bookCardBody",
974
1136
  "diffTagNew": "zE6uZW_diffTagNew",
975
- "createBookView": "zE6uZW_createBookView",
976
1137
  "entry": "zE6uZW_entry",
977
- "shelfFilters": "zE6uZW_shelfFilters",
978
- "chatRole": "zE6uZW_chatRole",
979
- "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
980
- "createBookCard": "zE6uZW_createBookCard",
981
- "diffColumn": "zE6uZW_diffColumn",
982
- "importError": "zE6uZW_importError",
983
- "statCardD": "zE6uZW_statCardD",
984
- "tlBar": "zE6uZW_tlBar",
985
- "reviewBox": "zE6uZW_reviewBox",
986
1138
  "assetStat": "zE6uZW_assetStat",
987
- "shelfTitleRow": "zE6uZW_shelfTitleRow",
988
- "tlSeg": "zE6uZW_tlSeg",
989
- "dashStageDot": "zE6uZW_dashStageDot",
990
- "panel": "zE6uZW_panel",
991
- "statCardDIcon": "zE6uZW_statCardDIcon",
992
- "progressLineLive": "zE6uZW_progressLineLive",
993
- "createBookTop": "zE6uZW_createBookTop",
994
- "importHint": "zE6uZW_importHint",
995
- "wsPageHeader": "zE6uZW_wsPageHeader",
996
- "bookChipRemove": "zE6uZW_bookChipRemove",
997
- "importModalHead": "zE6uZW_importModalHead",
998
- "progressLine": "zE6uZW_progressLine",
999
- "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
1000
- "progress": "zE6uZW_progress",
1001
- "readerError": "zE6uZW_readerError",
1002
- "workflowLabel": "zE6uZW_workflowLabel",
1139
+ "bookSwitchCover": "zE6uZW_bookSwitchCover",
1140
+ "readerHeader": "zE6uZW_readerHeader",
1141
+ "chapterNum": "zE6uZW_chapterNum",
1142
+ "todoText": "zE6uZW_todoText",
1003
1143
  "toolStepIcon": "zE6uZW_toolStepIcon",
1004
- "pulse": "zE6uZW_pulse",
1005
- "bookCreateCard": "zE6uZW_bookCreateCard",
1006
- "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
1007
- "workflowList": "zE6uZW_workflowList",
1008
- "diffText": "zE6uZW_diffText",
1009
- "navGroup": "zE6uZW_navGroup",
1010
- "bookCreateForm": "zE6uZW_bookCreateForm",
1011
- "importModalTabs": "zE6uZW_importModalTabs",
1012
- "tlSegDone": "zE6uZW_tlSegDone",
1013
- "wsColumns": "zE6uZW_wsColumns",
1014
- "importField": "zE6uZW_importField",
1144
+ "shelfHeader": "zE6uZW_shelfHeader",
1145
+ "entryLabel": "zE6uZW_entryLabel",
1146
+ "shelfGrid": "zE6uZW_shelfGrid",
1147
+ "statCardDIconRed": "zE6uZW_statCardDIconRed",
1148
+ "diffLegend": "zE6uZW_diffLegend",
1149
+ "dropzoneActive": "zE6uZW_dropzoneActive",
1150
+ "toolSteps": "zE6uZW_toolSteps",
1151
+ "chapterPreview": "zE6uZW_chapterPreview",
1152
+ "shelfTitleRow": "zE6uZW_shelfTitleRow",
1153
+ "chatScroll": "zE6uZW_chatScroll",
1154
+ "dashJourneyFill": "zE6uZW_dashJourneyFill",
1155
+ "ideaCandidate": "zE6uZW_ideaCandidate",
1156
+ "dashHeroArrow": "zE6uZW_dashHeroArrow",
1157
+ "navTab": "zE6uZW_navTab",
1158
+ "bookCreateOutline": "zE6uZW_bookCreateOutline",
1159
+ "statCardDUnit": "zE6uZW_statCardDUnit",
1160
+ "progressLineDone": "zE6uZW_progressLineDone",
1161
+ "workflowDot": "zE6uZW_workflowDot",
1162
+ "bookChipActive": "zE6uZW_bookChipActive",
1163
+ "importModalBody": "zE6uZW_importModalBody",
1164
+ "createBookTitle": "zE6uZW_createBookTitle",
1165
+ "statCardDLabel": "zE6uZW_statCardDLabel",
1166
+ "wsPreviewText": "zE6uZW_wsPreviewText",
1015
1167
  "todoItem": "zE6uZW_todoItem",
1168
+ "assistantFloat": "zE6uZW_assistantFloat",
1169
+ "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
1170
+ "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
1171
+ "diffAdd": "zE6uZW_diffAdd",
1172
+ "toolStepActive": "zE6uZW_toolStepActive",
1016
1173
  "fieldLabel": "zE6uZW_fieldLabel",
1017
- "todoWarning": "zE6uZW_todoWarning",
1018
- "dashHeroAction": "zE6uZW_dashHeroAction",
1019
- "bookshelf": "zE6uZW_bookshelf",
1020
- "outlineReadonly": "zE6uZW_outlineReadonly",
1174
+ "cardTitle": "zE6uZW_cardTitle",
1175
+ "navTabLabel": "zE6uZW_navTabLabel",
1176
+ "dashGrid": "zE6uZW_dashGrid",
1177
+ "bookCardActive": "zE6uZW_bookCardActive",
1021
1178
  "bigProgressBar": "zE6uZW_bigProgressBar",
1022
- "tlSegLabel": "zE6uZW_tlSegLabel",
1023
- "liveText": "zE6uZW_liveText",
1024
- "spaceBetween": "zE6uZW_spaceBetween",
1025
- "buttonSmall": "zE6uZW_buttonSmall",
1026
- "toolStepStatus": "zE6uZW_toolStepStatus",
1027
- "diffDel": "zE6uZW_diffDel",
1028
- "chapterTitle": "zE6uZW_chapterTitle",
1029
- "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
1030
- "diffOld": "zE6uZW_diffOld",
1031
- "bookCardName": "zE6uZW_bookCardName",
1032
- "dashHero": "zE6uZW_dashHero",
1033
- "bookshelfList": "zE6uZW_bookshelfList",
1034
- "toolStepName": "zE6uZW_toolStepName",
1035
- "diffSameBody": "zE6uZW_diffSameBody",
1179
+ "shelfSearch": "zE6uZW_shelfSearch",
1180
+ "navTabIcon": "zE6uZW_navTabIcon",
1181
+ "navSpacer": "zE6uZW_navSpacer",
1182
+ "todoInfo": "zE6uZW_todoInfo",
1183
+ "readerArticle": "zE6uZW_readerArticle",
1184
+ "assetStatLabel": "zE6uZW_assetStatLabel",
1185
+ "workflowDotDone": "zE6uZW_workflowDotDone",
1186
+ "bookshelfLabel": "zE6uZW_bookshelfLabel",
1036
1187
  "navTitle": "zE6uZW_navTitle",
1037
- "bookCardActive": "zE6uZW_bookCardActive",
1038
- "wsPage": "zE6uZW_wsPage",
1039
- "readerItemTitle": "zE6uZW_readerItemTitle",
1040
- "dashFact": "zE6uZW_dashFact",
1041
- "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
1042
- "readerGroup": "zE6uZW_readerGroup",
1043
- "assetStatDetail": "zE6uZW_assetStatDetail",
1044
- "shelfToolbar": "zE6uZW_shelfToolbar",
1045
- "shelfGrid": "zE6uZW_shelfGrid",
1046
- "toolStepError": "zE6uZW_toolStepError",
1047
- "assistantFloatBody": "zE6uZW_assistantFloatBody",
1048
- "chapterNum": "zE6uZW_chapterNum",
1049
- "bookChipActive": "zE6uZW_bookChipActive",
1050
- "bookSwitch": "zE6uZW_bookSwitch",
1051
- "diffList": "zE6uZW_diffList",
1052
- "fileList": "zE6uZW_fileList",
1053
- "statCardDDown": "zE6uZW_statCardDDown",
1054
- "badge": "zE6uZW_badge",
1188
+ "coverPreview": "zE6uZW_coverPreview",
1055
1189
  "assetStatValue": "zE6uZW_assetStatValue",
1056
- "wsPreview": "zE6uZW_wsPreview",
1057
- "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
1058
- "dashJourneyFill": "zE6uZW_dashJourneyFill",
1059
- "tlSegTodo": "zE6uZW_tlSegTodo",
1190
+ "bookSwitch": "zE6uZW_bookSwitch",
1191
+ "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
1192
+ "wsPage": "zE6uZW_wsPage",
1193
+ "readerText": "zE6uZW_readerText",
1194
+ "dashHeroBook": "zE6uZW_dashHeroBook",
1195
+ "progress": "zE6uZW_progress",
1196
+ "readerSeg": "zE6uZW_readerSeg",
1197
+ "readerPara": "zE6uZW_readerPara",
1060
1198
  "tabBar": "zE6uZW_tabBar",
1061
- "panelTitle": "zE6uZW_panelTitle",
1062
- "wsEditor": "zE6uZW_wsEditor",
1063
- "ideaToggle": "zE6uZW_ideaToggle",
1064
- "statCardDUnit": "zE6uZW_statCardDUnit",
1065
- "input": "zE6uZW_input",
1066
- "bookSwitchName": "zE6uZW_bookSwitchName",
1067
- "diffNew": "zE6uZW_diffNew",
1068
- "progressLineError": "zE6uZW_progressLineError",
1069
- "readerSidebar": "zE6uZW_readerSidebar",
1070
- "statCardDDetail": "zE6uZW_statCardDDetail",
1071
- "buttonDanger": "zE6uZW_buttonDanger",
1072
- "badgePending": "zE6uZW_badgePending",
1199
+ "panelContent": "zE6uZW_panelContent",
1200
+ "shelfToolbar": "zE6uZW_shelfToolbar",
1201
+ "card": "zE6uZW_card",
1202
+ "pulse": "zE6uZW_pulse",
1203
+ "statCardDIcon": "zE6uZW_statCardDIcon",
1204
+ "toolLive": "zE6uZW_toolLive",
1205
+ "assistantStatus": "zE6uZW_assistantStatus",
1206
+ "genreDesc": "zE6uZW_genreDesc",
1207
+ "buttonSmall": "zE6uZW_buttonSmall",
1073
1208
  "readerGroupArrow": "zE6uZW_readerGroupArrow",
1074
- "busyRow": "zE6uZW_busyRow",
1209
+ "navGroupSep": "zE6uZW_navGroupSep",
1210
+ "createBookView": "zE6uZW_createBookView",
1211
+ "badgePending": "zE6uZW_badgePending",
1212
+ "onlyChanges": "zE6uZW_onlyChanges",
1213
+ "bookshelfList": "zE6uZW_bookshelfList",
1214
+ "panelNav": "zE6uZW_panelNav",
1215
+ "dashJourneyBar": "zE6uZW_dashJourneyBar",
1216
+ "dropzoneIcon": "zE6uZW_dropzoneIcon",
1217
+ "workflowList": "zE6uZW_workflowList",
1218
+ "bookCardBody": "zE6uZW_bookCardBody",
1219
+ "readerSidebar": "zE6uZW_readerSidebar",
1220
+ "chatBubbleUser": "zE6uZW_chatBubbleUser",
1075
1221
  "statCardDValue": "zE6uZW_statCardDValue",
1222
+ "progressBar": "zE6uZW_progressBar",
1223
+ "chapterList": "zE6uZW_chapterList",
1224
+ "createBookTop": "zE6uZW_createBookTop",
1225
+ "volumeGroup": "zE6uZW_volumeGroup",
1226
+ "bookChip": "zE6uZW_bookChip",
1227
+ "todoWarning": "zE6uZW_todoWarning",
1076
1228
  "coverPlaceholder": "zE6uZW_coverPlaceholder",
1077
- "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
1078
- "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
1079
- "dashGrid": "zE6uZW_dashGrid",
1080
- "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
1081
- "navTitleLogo": "zE6uZW_navTitleLogo",
1082
- "toolSteps": "zE6uZW_toolSteps",
1083
- "workflowDot": "zE6uZW_workflowDot",
1084
- "bookAddIcon": "zE6uZW_bookAddIcon",
1085
- "workflowHint": "zE6uZW_workflowHint",
1086
- "readerFoot": "zE6uZW_readerFoot",
1087
- "readerText": "zE6uZW_readerText",
1088
- "panelContent": "zE6uZW_panelContent",
1089
- "badgeWritten": "zE6uZW_badgeWritten",
1090
- "bookCardBlurb": "zE6uZW_bookCardBlurb",
1091
- "bookCardCover": "zE6uZW_bookCardCover",
1092
- "readerItemBadge": "zE6uZW_readerItemBadge",
1093
- "chatScroll": "zE6uZW_chatScroll",
1094
- "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
1095
- "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
1096
- "assistantFloat": "zE6uZW_assistantFloat",
1097
- "badgeDone": "zE6uZW_badgeDone",
1098
- "readerItemActive": "zE6uZW_readerItemActive",
1099
- "wsSelectedText": "zE6uZW_wsSelectedText",
1100
- "diffAdd": "zE6uZW_diffAdd",
1101
- "chatBubbleUser": "zE6uZW_chatBubbleUser",
1102
- "bookSwitchCover": "zE6uZW_bookSwitchCover",
1103
- "toolStepDetail": "zE6uZW_toolStepDetail",
1104
- "dropzoneActive": "zE6uZW_dropzoneActive",
1105
- "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
1106
- "readerGroupTitle": "zE6uZW_readerGroupTitle",
1107
- "dropzoneIcon": "zE6uZW_dropzoneIcon",
1229
+ "readerSegBtn": "zE6uZW_readerSegBtn",
1230
+ "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
1231
+ "workflowBody": "zE6uZW_workflowBody",
1108
1232
  "tab": "zE6uZW_tab",
1109
- "navGroupLabel": "zE6uZW_navGroupLabel",
1110
- "readerItemNo": "zE6uZW_readerItemNo",
1111
- "statCardDLabel": "zE6uZW_statCardDLabel",
1112
- "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
1113
- "onlyChanges": "zE6uZW_onlyChanges",
1114
- "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
1115
- "buttonPrimary": "zE6uZW_buttonPrimary",
1116
- "chapterBeats": "zE6uZW_chapterBeats",
1117
- "dashStageDone": "zE6uZW_dashStageDone",
1118
- "workflowDotDone": "zE6uZW_workflowDotDone",
1119
- "entryLabel": "zE6uZW_entryLabel",
1120
- "workflowDotActive": "zE6uZW_workflowDotActive",
1121
- "bookAdd": "zE6uZW_bookAdd",
1122
- "shelfEmpty": "zE6uZW_shelfEmpty",
1123
- "todoText": "zE6uZW_todoText",
1124
- "importModalBody": "zE6uZW_importModalBody",
1125
- "field": "zE6uZW_field",
1233
+ "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
1234
+ "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
1235
+ "dashStageDot": "zE6uZW_dashStageDot",
1236
+ "busyRow": "zE6uZW_busyRow",
1237
+ "bookCreateCard": "zE6uZW_bookCreateCard",
1238
+ "wsEditor": "zE6uZW_wsEditor",
1239
+ "dashHero": "zE6uZW_dashHero",
1240
+ "readerGroupTitle": "zE6uZW_readerGroupTitle",
1126
1241
  "importModalOverlay": "zE6uZW_importModalOverlay",
1127
- "bookChipMeta": "zE6uZW_bookChipMeta",
1128
- "readerView": "zE6uZW_readerView",
1129
- "badgeRejected": "zE6uZW_badgeRejected",
1130
- "readerArticle": "zE6uZW_readerArticle",
1131
- "ideaCandidate": "zE6uZW_ideaCandidate",
1132
- "fadeIn": "zE6uZW_fadeIn",
1133
- "wsSelected": "zE6uZW_wsSelected",
1134
- "readerSegBtn": "zE6uZW_readerSegBtn",
1135
- "entryIcon": "zE6uZW_entryIcon",
1136
- "bookAddCard": "zE6uZW_bookAddCard",
1137
- "createBookTitle": "zE6uZW_createBookTitle",
1138
- "diffSame": "zE6uZW_diffSame",
1139
- "genreDesc": "zE6uZW_genreDesc",
1140
- "readerChapterMeta": "zE6uZW_readerChapterMeta",
1141
- "navTabIcon": "zE6uZW_navTabIcon",
1142
- "toolStepActive": "zE6uZW_toolStepActive",
1143
- "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
1144
- "importResult": "zE6uZW_importResult",
1242
+ "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
1243
+ "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
1244
+ "badgeWritten": "zE6uZW_badgeWritten",
1245
+ "assistantFloatBody": "zE6uZW_assistantFloatBody",
1246
+ "tlSegTrack": "zE6uZW_tlSegTrack",
1247
+ "readerItemTitle": "zE6uZW_readerItemTitle",
1248
+ "importModalHead": "zE6uZW_importModalHead",
1249
+ "badge": "zE6uZW_badge",
1250
+ "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
1145
1251
  "dashJourney": "zE6uZW_dashJourney",
1146
- "readerSeg": "zE6uZW_readerSeg",
1147
- "readerGroupCount": "zE6uZW_readerGroupCount",
1252
+ "statCardDDetail": "zE6uZW_statCardDDetail",
1253
+ "readerFoot": "zE6uZW_readerFoot",
1254
+ "createBookCard": "zE6uZW_createBookCard",
1148
1255
  "bookChipName": "zE6uZW_bookChipName",
1149
- "readerHeader": "zE6uZW_readerHeader",
1150
- "shelfHeader": "zE6uZW_shelfHeader",
1151
- "diffTagOld": "zE6uZW_diffTagOld",
1152
- "chapterMain": "zE6uZW_chapterMain",
1153
- "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
1154
- "navTitleName": "zE6uZW_navTitleName",
1155
- "readerTitle": "zE6uZW_readerTitle",
1156
- "tlSegTrack": "zE6uZW_tlSegTrack",
1157
- "navTitleBook": "zE6uZW_navTitleBook",
1158
- "navTab": "zE6uZW_navTab",
1159
- "navAboutRow": "zE6uZW_navAboutRow",
1160
- "navAbout": "zE6uZW_navAbout",
1161
- "navActions": "zE6uZW_navActions",
1162
- "dashHeroTitle": "zE6uZW_dashHeroTitle",
1163
- "dashHeroArrow": "zE6uZW_dashHeroArrow",
1164
- "navTabLabel": "zE6uZW_navTabLabel",
1165
- "assetStatLabel": "zE6uZW_assetStatLabel",
1166
- "createBookIcon": "zE6uZW_createBookIcon",
1167
- "diffLegend": "zE6uZW_diffLegend",
1168
- "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
1169
- "bookCard": "zE6uZW_bookCard",
1170
- "progressLineDone": "zE6uZW_progressLineDone",
1171
- "dashJourneyStages": "zE6uZW_dashJourneyStages",
1172
- "navAboutUpdate": "zE6uZW_navAboutUpdate",
1173
- "dashStage": "zE6uZW_dashStage",
1174
- "readerChapterTitle": "zE6uZW_readerChapterTitle",
1175
- "progressBar": "zE6uZW_progressBar",
1176
- "textarea": "zE6uZW_textarea",
1177
- "todoDanger": "zE6uZW_todoDanger",
1178
- "dashHeroBook": "zE6uZW_dashHeroBook",
1179
- "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
1180
- "meta": "zE6uZW_meta",
1181
- "coverPreview": "zE6uZW_coverPreview",
1182
- "chapterList": "zE6uZW_chapterList",
1183
- "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
1184
- "dashJourneyBar": "zE6uZW_dashJourneyBar",
1185
- "volumeGroup": "zE6uZW_volumeGroup",
1186
- "button": "zE6uZW_button",
1187
- "shelfSearch": "zE6uZW_shelfSearch",
1188
- "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
1189
- "workflowBody": "zE6uZW_workflowBody",
1190
- "badgeError": "zE6uZW_badgeError",
1191
- "importModalActions": "zE6uZW_importModalActions",
1192
- "iconButton": "zE6uZW_iconButton",
1193
- "assetGrid": "zE6uZW_assetGrid",
1194
- "wsColumn": "zE6uZW_wsColumn",
1195
1256
  "readerLoading": "zE6uZW_readerLoading",
1196
- "bookCardActions": "zE6uZW_bookCardActions",
1257
+ "diffSameBody": "zE6uZW_diffSameBody",
1258
+ "dashStage": "zE6uZW_dashStage",
1259
+ "shelfEmpty": "zE6uZW_shelfEmpty",
1260
+ "diffColumn": "zE6uZW_diffColumn",
1197
1261
  "assistantResize": "zE6uZW_assistantResize",
1198
- "chapterPreview": "zE6uZW_chapterPreview",
1262
+ "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
1263
+ "badgeDone": "zE6uZW_badgeDone",
1264
+ "liveText": "zE6uZW_liveText",
1265
+ "chapterTitle": "zE6uZW_chapterTitle",
1266
+ "readerGroup": "zE6uZW_readerGroup",
1199
1267
  "readerMain": "zE6uZW_readerMain",
1200
- "row": "zE6uZW_row",
1201
- "tlSegCurrent": "zE6uZW_tlSegCurrent",
1202
- "importModal": "zE6uZW_importModal",
1203
- "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow"
1268
+ "readerError": "zE6uZW_readerError",
1269
+ "importPreviewList": "zE6uZW_importPreviewList",
1270
+ "importHint": "zE6uZW_importHint"
1204
1271
  };
1205
1272
  //#endregion
1206
1273
  //#region src/client/panel/AssistantTab.tsx
@@ -4613,25 +4680,50 @@ window.__ModuleLoader__.load({
4613
4680
  //#region src/client/panel/ImportModal.tsx
4614
4681
  /**
4615
4682
  * 导入小说弹窗:两种模式 ——
4616
- * A) 已有项目目录(含 novel-project.json)→ 登记/激活书架;
4617
- * B) txt/md 全本 → 服务器拆章建项目后登记书架。
4618
- * 浏览器无法直接浏览宿主机目录,故两种模式均输入绝对路径(粘贴或手输)。
4683
+ * A) 已有项目目录(含 novel-project.json)→ 登记/激活书架(粘贴服务器本地路径);
4684
+ * B) txt/md 全本 → 点击选择文件,浏览器读取内容 → 服务器拆章预览 → 确认后导入。
4685
+ * Mode B 也保留「服务器本地路径」高级选项(大文件或服务器端已有文件时用)。
4619
4686
  */
4620
4687
  function ImportModal({ api, onClose, onImported }) {
4621
4688
  const [mode, setMode] = (0, react.useState)("dir");
4622
4689
  const [dir, setDir] = (0, react.useState)("");
4690
+ const fileInputRef = (0, react.useRef)(null);
4691
+ const [fileName, setFileName] = (0, react.useState)("");
4692
+ const [fileText, setFileText] = (0, react.useState)(null);
4693
+ const [previewing, setPreviewing] = (0, react.useState)(false);
4694
+ const [preview, setPreview] = (0, react.useState)(null);
4695
+ const [showPath, setShowPath] = (0, react.useState)(false);
4623
4696
  const [filePath, setFilePath] = (0, react.useState)("");
4624
4697
  const [outDir, setOutDir] = (0, react.useState)("");
4625
4698
  const [busy, setBusy] = (0, react.useState)(false);
4626
4699
  const [error, setError] = (0, react.useState)("");
4627
4700
  const [result, setResult] = (0, react.useState)(null);
4628
- const runImport = async () => {
4701
+ /** 选择文件 → 读取内容 → 调服务器预览拆章。 */
4702
+ const onPickFile = async (file) => {
4703
+ if (file === void 0) return;
4629
4704
  setError("");
4630
4705
  setResult(null);
4631
- if (mode === "dir") {
4632
- const d = dir.trim();
4633
- if (d === "") {
4634
- setError("请输入项目目录(含 novel-project.json 的文件夹)");
4706
+ setPreview(null);
4707
+ setFileName(file.name);
4708
+ setPreviewing(true);
4709
+ try {
4710
+ const text = await file.text();
4711
+ setFileText(text);
4712
+ const p = await api.bookImportTextPreview(text, file.name);
4713
+ setPreview(p);
4714
+ } catch (err) {
4715
+ setError(err.message);
4716
+ } finally {
4717
+ setPreviewing(false);
4718
+ }
4719
+ };
4720
+ const runImport = async () => {
4721
+ setError("");
4722
+ setResult(null);
4723
+ if (mode === "dir") {
4724
+ const d = dir.trim();
4725
+ if (d === "") {
4726
+ setError("请输入项目目录(含 novel-project.json 的文件夹)");
4635
4727
  return;
4636
4728
  }
4637
4729
  setBusy(true);
@@ -4648,16 +4740,13 @@ window.__ModuleLoader__.load({
4648
4740
  } finally {
4649
4741
  setBusy(false);
4650
4742
  }
4651
- } else {
4652
- const f = filePath.trim();
4653
- if (f === "") {
4654
- setError("请输入 txt/md 文件路径");
4655
- return;
4656
- }
4743
+ return;
4744
+ }
4745
+ if (fileText !== null && fileText.length > 0) {
4657
4746
  setBusy(true);
4658
4747
  try {
4659
4748
  const o = outDir.trim();
4660
- const r = await api.bookImportText(f, o !== "" ? o : void 0);
4749
+ const r = await api.bookImportTextContent(fileText, fileName, o !== "" ? o : void 0);
4661
4750
  setResult({
4662
4751
  kind: "text",
4663
4752
  bookName: r.bookName,
@@ -4670,7 +4759,35 @@ window.__ModuleLoader__.load({
4670
4759
  } finally {
4671
4760
  setBusy(false);
4672
4761
  }
4762
+ return;
4763
+ }
4764
+ const f = filePath.trim();
4765
+ if (f === "") {
4766
+ setError("请先选择文件,或输入服务器本地文件路径");
4767
+ return;
4673
4768
  }
4769
+ setBusy(true);
4770
+ try {
4771
+ const o = outDir.trim();
4772
+ const r = await api.bookImportText(f, o !== "" ? o : void 0);
4773
+ setResult({
4774
+ kind: "text",
4775
+ bookName: r.bookName,
4776
+ chapters: r.chapters,
4777
+ skipped: r.skipped
4778
+ });
4779
+ await onImported();
4780
+ } catch (err) {
4781
+ setError(err.message);
4782
+ } finally {
4783
+ setBusy(false);
4784
+ }
4785
+ };
4786
+ const switchMode = (m) => {
4787
+ setMode(m);
4788
+ setError("");
4789
+ setResult(null);
4790
+ setPreview(null);
4674
4791
  };
4675
4792
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4676
4793
  className: panel_module_css_default.importModalOverlay,
@@ -4703,9 +4820,7 @@ window.__ModuleLoader__.load({
4703
4820
  "aria-selected": mode === "dir",
4704
4821
  className: `${panel_module_css_default.button} ${mode === "dir" ? panel_module_css_default.buttonPrimary : ""}`,
4705
4822
  onClick: () => {
4706
- setMode("dir");
4707
- setError("");
4708
- setResult(null);
4823
+ switchMode("dir");
4709
4824
  },
4710
4825
  children: "📂 A · 已有项目目录"
4711
4826
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -4714,9 +4829,7 @@ window.__ModuleLoader__.load({
4714
4829
  "aria-selected": mode === "text",
4715
4830
  className: `${panel_module_css_default.button} ${mode === "text" ? panel_module_css_default.buttonPrimary : ""}`,
4716
4831
  onClick: () => {
4717
- setMode("text");
4718
- setError("");
4719
- setResult(null);
4832
+ switchMode("text");
4720
4833
  },
4721
4834
  children: "📄 B · txt/md 全本"
4722
4835
  })]
@@ -4739,18 +4852,75 @@ window.__ModuleLoader__.load({
4739
4852
  className: panel_module_css_default.importHint,
4740
4853
  children: "目录需含 novel-project.json。已在书架中的目录会直接切换激活,不会重复登记。"
4741
4854
  })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4742
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4855
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4856
+ ref: fileInputRef,
4857
+ type: "file",
4858
+ accept: ".txt,.md,text/plain,text/markdown",
4859
+ style: { display: "none" },
4860
+ onChange: (e) => {
4861
+ onPickFile(e.target.files?.[0]);
4862
+ e.target.value = "";
4863
+ }
4864
+ }),
4865
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4743
4866
  className: panel_module_css_default.importField,
4744
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "全本文本文件(绝对路径,txt / md)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4745
- className: panel_module_css_default.input,
4746
- type: "text",
4747
- placeholder: "例如 D:\\novels\\全本.txt",
4748
- value: filePath,
4749
- onChange: (e) => {
4750
- setFilePath(e.target.value);
4751
- }
4867
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "全本文本文件(txt / md)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4868
+ type: "button",
4869
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
4870
+ onClick: () => {
4871
+ fileInputRef.current?.click();
4872
+ },
4873
+ children: "📄 选择文件"
4752
4874
  })]
4753
4875
  }),
4876
+ fileName !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4877
+ className: panel_module_css_default.importFileInfo,
4878
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["已选择:", fileName] }), previewing && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4879
+ className: panel_module_css_default.meta,
4880
+ children: "正在拆章预览…"
4881
+ })]
4882
+ }),
4883
+ preview !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4884
+ className: panel_module_css_default.importPreview,
4885
+ children: [
4886
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
4887
+ "📖 《",
4888
+ preview.bookName,
4889
+ "》 · 识别到 ",
4890
+ preview.chapters.length,
4891
+ " 章"
4892
+ ] }),
4893
+ preview.chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
4894
+ className: panel_module_css_default.importPreviewList,
4895
+ children: [preview.chapters.slice(0, 5).map((c) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", { children: [
4896
+ "第",
4897
+ c.no,
4898
+ "章 ",
4899
+ c.title,
4900
+ "(",
4901
+ c.chars,
4902
+ " 字)"
4903
+ ] }, c.no)), preview.chapters.length > 5 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
4904
+ className: panel_module_css_default.meta,
4905
+ children: [
4906
+ "… 共 ",
4907
+ preview.chapters.length,
4908
+ " 章"
4909
+ ]
4910
+ })]
4911
+ }),
4912
+ preview.skipped.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4913
+ className: panel_module_css_default.meta,
4914
+ children: [
4915
+ "跳过 ",
4916
+ preview.skipped.length,
4917
+ " 个过短章节:",
4918
+ preview.skipped.slice(0, 5).join("、"),
4919
+ preview.skipped.length > 5 ? " 等" : ""
4920
+ ]
4921
+ })
4922
+ ]
4923
+ }),
4754
4924
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4755
4925
  className: panel_module_css_default.importField,
4756
4926
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "输出目录(可选,默认 ~/.dsh/novels/书名)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
@@ -4763,9 +4933,29 @@ window.__ModuleLoader__.load({
4763
4933
  }
4764
4934
  })]
4765
4935
  }),
4936
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4937
+ type: "button",
4938
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
4939
+ onClick: () => {
4940
+ setShowPath(!showPath);
4941
+ },
4942
+ children: showPath ? "▾ 收起高级选项" : "▸ 高级:使用服务器本地文件路径"
4943
+ }),
4944
+ showPath && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
4945
+ className: panel_module_css_default.importField,
4946
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "服务器本地文件绝对路径(大文件或服务器端已有文件时用)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4947
+ className: panel_module_css_default.input,
4948
+ type: "text",
4949
+ placeholder: "例如 D:\\novels\\全本.txt",
4950
+ value: filePath,
4951
+ onChange: (e) => {
4952
+ setFilePath(e.target.value);
4953
+ }
4954
+ })]
4955
+ }),
4766
4956
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4767
4957
  className: panel_module_css_default.importHint,
4768
- children: "服务器按「第X章 / 第X回 / 第X节 / 第X卷」(可带 # 前缀)拆章;正文过短(<50 字)的章节会跳过并列出。"
4958
+ children: "服务器按「第X章/第X回/第X节/第X卷」、中文数字章节(一、二、三…)、序章/楔子/尾声、英文 Chapter N 拆章;正文过短(<50 字)的章节会跳过并列出。"
4769
4959
  })
4770
4960
  ] }),
4771
4961
  error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -5099,60 +5289,1157 @@ window.__ModuleLoader__.load({
5099
5289
  style: { justifyContent: "space-between" },
5100
5290
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5101
5291
  className: panel_module_css_default.cardTitle,
5102
- children: [
5103
- "势力分布(",
5104
- draft.factions.length,
5105
- ")"
5106
- ]
5292
+ children: [
5293
+ "势力分布(",
5294
+ draft.factions.length,
5295
+ ")"
5296
+ ]
5297
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5298
+ type: "button",
5299
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
5300
+ onClick: () => {
5301
+ setFactions([...draft.factions, {
5302
+ name: "",
5303
+ kind: "宗门",
5304
+ description: ""
5305
+ }]);
5306
+ },
5307
+ children: "+ 新增势力"
5308
+ })]
5309
+ }), draft.factions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5310
+ className: panel_module_css_default.meta,
5311
+ children: "暂无势力 — 宗门 / 家族 / 王朝 / 组织…"
5312
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5313
+ style: {
5314
+ display: "flex",
5315
+ flexDirection: "column",
5316
+ gap: 6
5317
+ },
5318
+ children: draft.factions.map((faction, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EditableRow, {
5319
+ name: `${faction.name}(${faction.kind})`,
5320
+ detail: faction.description,
5321
+ onName: (v) => {
5322
+ const next = [...draft.factions];
5323
+ const match = /^(.*)((.*))$/.exec(v);
5324
+ next[i] = {
5325
+ ...next[i],
5326
+ name: (match?.[1] ?? v).trim(),
5327
+ kind: (match?.[2] ?? next[i].kind).trim() || "宗门"
5328
+ };
5329
+ setFactions(next);
5330
+ },
5331
+ onDetail: (v) => {
5332
+ const next = [...draft.factions];
5333
+ next[i] = {
5334
+ ...next[i],
5335
+ description: v
5336
+ };
5337
+ setFactions(next);
5338
+ },
5339
+ onRemove: () => {
5340
+ setFactions(draft.factions.filter((_, idx) => idx !== i));
5341
+ },
5342
+ namePlaceholder: "势力名(类型)如:青云宗(宗门)",
5343
+ detailPlaceholder: "描述…"
5344
+ }, i))
5345
+ })]
5346
+ })
5347
+ ]
5348
+ });
5349
+ }
5350
+ //#endregion
5351
+ //#region src/style-library.ts
5352
+ const STYLE_CATEGORIES = [
5353
+ {
5354
+ id: "3d",
5355
+ label: "3D 类",
5356
+ icon: "🧊",
5357
+ desc: "人物稳定性最好,视频不易崩脸"
5358
+ },
5359
+ {
5360
+ id: "game",
5361
+ label: "游戏 3D",
5362
+ icon: "🎮",
5363
+ desc: "游戏渲染质感与镜头语言(生存/恐怖/潜行)"
5364
+ },
5365
+ {
5366
+ id: "2d",
5367
+ label: "2D 二次元绘画",
5368
+ icon: "✏️",
5369
+ desc: "手绘感,人物一致性略弱"
5370
+ },
5371
+ {
5372
+ id: "film",
5373
+ label: "影视实验质感",
5374
+ icon: "🎞️",
5375
+ desc: "滤镜/影像体系,可叠加在 3D/2D 之上"
5376
+ },
5377
+ {
5378
+ id: "craft",
5379
+ label: "国风/特殊工艺",
5380
+ icon: "🏮",
5381
+ desc: "国风与传统工艺质感"
5382
+ }
5383
+ ];
5384
+ /** 内置风格模板(18 个)。 */
5385
+ const STYLE_LIBRARY = [
5386
+ {
5387
+ id: "pixar-adult-3d",
5388
+ name: "成人向皮克斯 3D",
5389
+ category: "3d",
5390
+ traits: "CG 三维渲染,材质细腻,微表情表现力强;需压制 Q 版可爱感",
5391
+ keywords: "3D皮克斯动画,成人写实CGI,电影光影,拒绝Q版",
5392
+ weight: 1
5393
+ },
5394
+ {
5395
+ id: "arcane-thick-3d",
5396
+ name: "双城之战美漫厚涂 3D",
5397
+ category: "3d",
5398
+ traits: "粗重轮廓线,高对比硬阴影,材质粗粝,悲剧、压抑、科幻题材适配高",
5399
+ keywords: "双城之战美术,3D美漫厚涂,强轮廓光影,暗调粗粝渲染",
5400
+ weight: .95
5401
+ },
5402
+ {
5403
+ id: "nextgen-cg",
5404
+ name: "次世代游戏 CG",
5405
+ category: "3d",
5406
+ traits: "接近真人的三维渲染,照片级布料、皮肤材质,冷峻写实",
5407
+ keywords: "次世代游戏CG渲染,超写实3D,真实物理材质,电影布光",
5408
+ weight: .9
5409
+ },
5410
+ {
5411
+ id: "low-cyberpunk-3d",
5412
+ name: "底层赛博朋克 3D",
5413
+ category: "3d",
5414
+ traits: "锈蚀工业、破碎霓虹、屏幕噪点;避开华丽高楼,偏向破败底层",
5415
+ keywords: "底层赛博朋克3D,废土工业,破碎霓虹,画面噪点色散",
5416
+ weight: .85
5417
+ },
5418
+ {
5419
+ id: "vaporwave-3d",
5420
+ name: "复古蒸汽波 3D",
5421
+ category: "3d",
5422
+ traits: "粉-蓝-紫霓虹轮廓、90 年代复古网格、胶片色散颗粒,颓废疏离",
5423
+ keywords: "3D复古蒸汽波,90年代三维渲染,霓虹轮廓光,胶片颗粒",
5424
+ weight: .8
5425
+ },
5426
+ {
5427
+ id: "dark-gothic-3d",
5428
+ name: "暗黑哥特 3D",
5429
+ category: "3d",
5430
+ traits: "大面积阴影、冷青色调、衰败破败质感,适合幽暗密闭空间",
5431
+ keywords: "3D暗黑哥特,冷青暗光,衰败质感,大面积阴影",
5432
+ weight: .8
5433
+ },
5434
+ {
5435
+ id: "clay-stopmotion-3d",
5436
+ name: "黏土 / 定格 3D",
5437
+ category: "3d",
5438
+ traits: "捏塑颗粒肌理,手工定格质感;可做压抑向,不局限可爱风",
5439
+ keywords: "3D黏土定格渲染,泥塑肌理,电影打光",
5440
+ weight: .7
5441
+ },
5442
+ {
5443
+ id: "openworld-survival",
5444
+ name: "开放世界生存游戏风",
5445
+ category: "game",
5446
+ traits: "场景破败感强,货架、仓库、管线、灰尘、锈蚀明显;人物带一点“生存者”气质;适合探索感、逃亡感、世界观展示",
5447
+ keywords: "开放世界生存游戏风格,废土场景,破败仓库,锈蚀金属货架,灰尘粒子,冷色写实光影",
5448
+ weight: .8
5449
+ },
5450
+ {
5451
+ id: "horror-game-3d",
5452
+ name: "恐怖游戏 3D",
5453
+ category: "game",
5454
+ traits: "大面积阴影,荧光灯频闪,空间压抑;适合悬疑、压迫、精神异常段落",
5455
+ keywords: "恐怖游戏 3D 风格,昏暗仓库,老旧荧光灯,硬阴影,压迫空间,冷灰蓝调,低饱和",
5456
+ weight: .75
5457
+ },
5458
+ {
5459
+ id: "tactical-stealth",
5460
+ name: "战术潜行游戏风",
5461
+ category: "game",
5462
+ traits: "低视角、第三人称镜头感;人物在货架之间移动,光影克制;适合紧张剧情",
5463
+ keywords: "战术潜行游戏视角,第三人称镜头,货架通道,冷色暗光,真实3D渲染,紧张压迫氛围",
5464
+ weight: .7
5465
+ },
5466
+ {
5467
+ id: "korean-webtoon",
5468
+ name: "韩漫条漫风",
5469
+ category: "2d",
5470
+ traits: "修长人物,低饱和高级灰,氛围感强,都市向漫剧爆款画风",
5471
+ keywords: "韩漫2D绘画,精致人物,低饱和灰调,氛围感插画",
5472
+ weight: 1
5473
+ },
5474
+ {
5475
+ id: "japan-cel-dark",
5476
+ name: "日系赛璐璐动画",
5477
+ category: "2d",
5478
+ traits: "干净勾线,硬阴影;分明亮版、暗调悲剧版(边缘行者质感)",
5479
+ keywords: "日系赛璐璐动画,清晰轮廓线,硬阴影,暗调都市动画",
5480
+ weight: .9
5481
+ },
5482
+ {
5483
+ id: "shinkai-anime",
5484
+ name: "新海诚动画风",
5485
+ category: "2d",
5486
+ traits: "极致环境光影、丁达尔、空气中尘埃粒子,擅长雨夜、夜景外景",
5487
+ keywords: "新海诚动画渲染,细腻环境光,漂浮尘埃粒子",
5488
+ weight: .85
5489
+ },
5490
+ {
5491
+ id: "pop-marvel-2d",
5492
+ name: "波普美漫",
5493
+ category: "2d",
5494
+ traits: "网点半调、强撞色,线条张扬,节奏冲击力强",
5495
+ keywords: "平行宇宙波普美漫,网点半调,漫画粗线条",
5496
+ weight: .8
5497
+ },
5498
+ {
5499
+ id: "dark-ghibli",
5500
+ name: "暗黑吉卜力手绘",
5501
+ category: "2d",
5502
+ traits: "手绘水彩肌理;强制关闭温暖治愈,做残酷冷调版本",
5503
+ keywords: "吉卜力手绘动画,暗黑写实,水彩肌理,拒绝暖光治愈",
5504
+ weight: .75
5505
+ },
5506
+ {
5507
+ id: "noir-film",
5508
+ name: "黑色电影 Noir",
5509
+ category: "film",
5510
+ traits: "高反差黑白,只保留少量色彩作为视觉锚点,张力极强",
5511
+ keywords: "黑色电影,大部分黑白,局部保留色彩,硬侧光,胶片颗粒",
5512
+ stackable: true,
5513
+ weight: 1
5514
+ },
5515
+ {
5516
+ id: "vhs90",
5517
+ name: "VHS 90 录像带复古",
5518
+ category: "film",
5519
+ traits: "扫描线、色彩偏移、磁带噪点,模拟老旧档案录像",
5520
+ keywords: "VHS录像带质感,扫描线,色彩偏移,磁带噪点",
5521
+ stackable: true,
5522
+ weight: .9
5523
+ },
5524
+ {
5525
+ id: "film-photo",
5526
+ name: "胶片电影写真",
5527
+ category: "film",
5528
+ traits: "电影机拍摄质感,轻微颗粒,景深虚化,无夸张特效",
5529
+ keywords: "电影写真质感,35mm胶片,胶片颗粒,浅景深",
5530
+ stackable: true,
5531
+ weight: .85
5532
+ },
5533
+ {
5534
+ id: "chinese-ink",
5535
+ name: "新中式水墨动画",
5536
+ category: "craft",
5537
+ traits: "水墨晕染,留白写意",
5538
+ keywords: "水墨动画渲染,写意晕染,国风2D",
5539
+ weight: 1
5540
+ },
5541
+ {
5542
+ id: "paper-cut-3d",
5543
+ name: "纸雕定格",
5544
+ category: "craft",
5545
+ traits: "多层纸张镂空叠层,光影穿透纸面",
5546
+ keywords: "立体纸雕定格,纸张肌理,层叠镂空光影",
5547
+ weight: .9
5548
+ },
5549
+ {
5550
+ id: "guofeng-heavy",
5551
+ name: "工笔重彩国风",
5552
+ category: "craft",
5553
+ traits: "精细线条,矿物颜料质感,古典华美",
5554
+ keywords: "工笔重彩,国风2D绘画,矿物颜料质感,精细勾线",
5555
+ weight: .8
5556
+ }
5557
+ ];
5558
+ /** 按分类取风格。 */
5559
+ function stylesByCategory(category) {
5560
+ return STYLE_LIBRARY.filter((s) => s.category === category);
5561
+ }
5562
+ /** 取单个风格(未找到返回 undefined)。 */
5563
+ function findStyle(id) {
5564
+ return STYLE_LIBRARY.find((s) => s.id === id);
5565
+ }
5566
+ //#endregion
5567
+ //#region src/client/panel/StoryboardTab.tsx
5568
+ /**
5569
+ * 分镜工作台:① 编剧级剧情骨架 → ② 导演级分镜表(镜头级)→ ③ 视频提示词(后续版本)。
5570
+ * 定位:辅助人工——每级可重新生成、可复制,产出可导出。
5571
+ */
5572
+ function StoryboardTab({ api, project, chapters, onProjectChanged, styleId, filterId }) {
5573
+ const written = (0, react.useMemo)(() => chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.status !== "error").sort((a, b) => a.no - b.no), [chapters]);
5574
+ const [chapterNo, setChapterNo] = (0, react.useState)(written[0]?.no ?? null);
5575
+ const [busy, setBusy] = (0, react.useState)(false);
5576
+ const [error, setError] = (0, react.useState)("");
5577
+ const [skeleton, setSkeleton] = (0, react.useState)(null);
5578
+ const [table, setTable] = (0, react.useState)(null);
5579
+ const [tableBusy, setTableBusy] = (0, react.useState)(false);
5580
+ const [prompts, setPrompts] = (0, react.useState)(null);
5581
+ const [promptsBusy, setPromptsBusy] = (0, react.useState)(false);
5582
+ const [copied, setCopied] = (0, react.useState)("");
5583
+ (0, react.useEffect)(() => {
5584
+ if (chapterNo === null || !written.some((c) => c.no === chapterNo)) {
5585
+ setChapterNo(written[0]?.no ?? null);
5586
+ setSkeleton(null);
5587
+ setTable(null);
5588
+ setPrompts(null);
5589
+ }
5590
+ }, [written, chapterNo]);
5591
+ (0, react.useEffect)(() => {
5592
+ if (chapterNo === null) return;
5593
+ const entry = (project?.storyboards ?? []).find((e) => e.chapterNo === chapterNo);
5594
+ setSkeleton((prev) => prev ?? entry?.skeleton ?? null);
5595
+ setTable((prev) => prev ?? entry?.table ?? null);
5596
+ setPrompts((prev) => prev ?? entry?.prompts ?? null);
5597
+ }, [chapterNo, project?.storyboards]);
5598
+ const generate = async () => {
5599
+ if (chapterNo === null) return;
5600
+ setBusy(true);
5601
+ setError("");
5602
+ setSkeleton(null);
5603
+ setTable(null);
5604
+ setPrompts(null);
5605
+ try {
5606
+ const result = await api.storyboardSkeleton(chapterNo);
5607
+ setSkeleton(result.skeleton);
5608
+ onProjectChanged?.();
5609
+ } catch (err) {
5610
+ setError(err.message);
5611
+ } finally {
5612
+ setBusy(false);
5613
+ }
5614
+ };
5615
+ /** ② 生成分镜表(骨架 → 镜头级)。 */
5616
+ const generateTable = async () => {
5617
+ if (chapterNo === null || skeleton === null) return;
5618
+ setTableBusy(true);
5619
+ setError("");
5620
+ setTable(null);
5621
+ try {
5622
+ const result = await api.storyboardTable(chapterNo, skeleton, styleId, filterId);
5623
+ setTable(result.table);
5624
+ onProjectChanged?.();
5625
+ } catch (err) {
5626
+ setError(err.message);
5627
+ } finally {
5628
+ setTableBusy(false);
5629
+ }
5630
+ };
5631
+ /** ③ 生成视频提示词(分镜表 → 即梦可粘贴)。 */
5632
+ const generatePrompts = async () => {
5633
+ if (chapterNo === null || table === null) return;
5634
+ setPromptsBusy(true);
5635
+ setError("");
5636
+ setPrompts(null);
5637
+ try {
5638
+ const result = await api.storyboardPrompts(chapterNo, table, styleId, filterId);
5639
+ setPrompts(result.prompts);
5640
+ onProjectChanged?.();
5641
+ } catch (err) {
5642
+ setError(err.message);
5643
+ } finally {
5644
+ setPromptsBusy(false);
5645
+ }
5646
+ };
5647
+ if (project === null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5648
+ className: panel_module_css_default.card,
5649
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5650
+ className: panel_module_css_default.meta,
5651
+ children: "请先开书或选择一本书,再进入分镜工作台。"
5652
+ })
5653
+ });
5654
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5655
+ className: panel_module_css_default.card,
5656
+ children: [
5657
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5658
+ className: panel_module_css_default.row,
5659
+ style: {
5660
+ justifyContent: "space-between",
5661
+ flexWrap: "wrap"
5662
+ },
5663
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5664
+ className: panel_module_css_default.cardTitle,
5665
+ children: "🎬 分镜工作台"
5666
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5667
+ className: panel_module_css_default.meta,
5668
+ children: "① 剧情骨架 → ② 分镜表(本节)→ ③ 视频提示词(后续版本)"
5669
+ })]
5670
+ }),
5671
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5672
+ className: panel_module_css_default.row,
5673
+ style: {
5674
+ alignItems: "flex-end",
5675
+ flexWrap: "wrap"
5676
+ },
5677
+ children: [
5678
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5679
+ className: panel_module_css_default.field,
5680
+ style: {
5681
+ flex: 1,
5682
+ minWidth: 200
5683
+ },
5684
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
5685
+ className: panel_module_css_default.fieldLabel,
5686
+ children: "选择章节"
5687
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
5688
+ className: panel_module_css_default.input,
5689
+ value: chapterNo ?? "",
5690
+ onChange: (e) => {
5691
+ setChapterNo(Number(e.target.value));
5692
+ setError("");
5693
+ },
5694
+ children: [written.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5695
+ value: "",
5696
+ children: "(没有已写章节)"
5697
+ }), written.map((c) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
5698
+ value: c.no,
5699
+ children: [
5700
+ "第",
5701
+ c.no,
5702
+ "章 ",
5703
+ c.title
5704
+ ]
5705
+ }, c.no))]
5706
+ })]
5707
+ }),
5708
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5709
+ type: "button",
5710
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
5711
+ disabled: busy || chapterNo === null,
5712
+ onClick: () => {
5713
+ generate();
5714
+ },
5715
+ children: busy ? "编剧分析中…" : "✍️ 生成剧情骨架"
5716
+ }),
5717
+ skeleton !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5718
+ type: "button",
5719
+ className: panel_module_css_default.button,
5720
+ disabled: busy,
5721
+ onClick: () => {
5722
+ generate();
5723
+ },
5724
+ children: "🔄 重新生成"
5725
+ })
5726
+ ]
5727
+ }),
5728
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5729
+ className: panel_module_css_default.importError,
5730
+ children: error
5731
+ }),
5732
+ skeleton === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5733
+ className: panel_module_css_default.meta,
5734
+ style: { marginTop: 8 },
5735
+ children: "生成后这里显示本章剧情骨架:弧线 + 节拍链(事件 / 情绪走向 / 叙事功能 / 因果)。 骨架是「完整剧情」的根——确认骨架没问题后,后续版本再展开为分镜表与视频提示词。"
5736
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5737
+ style: {
5738
+ display: "flex",
5739
+ flexDirection: "column",
5740
+ gap: 8,
5741
+ marginTop: 8
5742
+ },
5743
+ children: [
5744
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5745
+ className: panel_module_css_default.importPreview,
5746
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["📖 本章弧线:", skeleton.arc] })
5747
+ }),
5748
+ skeleton.beats.map((b, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5749
+ style: {
5750
+ display: "flex",
5751
+ flexDirection: "column",
5752
+ gap: 3,
5753
+ border: "1px solid var(--nf-border)",
5754
+ borderRadius: 10,
5755
+ padding: "8px 10px"
5756
+ },
5757
+ children: [
5758
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5759
+ className: panel_module_css_default.row,
5760
+ style: { flexWrap: "wrap" },
5761
+ children: [
5762
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: ["节拍 ", i + 1] }),
5763
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5764
+ className: `${panel_module_css_default.badge} ${b.function === "高潮" ? panel_module_css_default.badgeDone : b.function === "转折" ? panel_module_css_default.badgeWritten : panel_module_css_default.badgePending}`,
5765
+ children: b.function
5766
+ }),
5767
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5768
+ className: panel_module_css_default.meta,
5769
+ children: b.emotion
5770
+ })
5771
+ ]
5772
+ }),
5773
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: b.event }),
5774
+ b.cause !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5775
+ className: panel_module_css_default.meta,
5776
+ children: ["承接:", b.cause]
5777
+ })
5778
+ ]
5779
+ }, b.id)),
5780
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5781
+ className: panel_module_css_default.row,
5782
+ children: [
5783
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5784
+ type: "button",
5785
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
5786
+ onClick: () => {
5787
+ const text = `第${skeleton.chapterNo}章 弧线:${skeleton.arc}\n\n` + skeleton.beats.map((b, i) => `${i + 1}. [${b.function}] ${b.event}(情绪:${b.emotion})${b.cause !== void 0 ? `[承接:${b.cause}]` : ""}`).join("\n");
5788
+ navigator.clipboard?.writeText(text);
5789
+ },
5790
+ children: "📋 复制骨架"
5791
+ }),
5792
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5793
+ type: "button",
5794
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
5795
+ disabled: tableBusy,
5796
+ onClick: () => {
5797
+ generateTable();
5798
+ },
5799
+ children: tableBusy ? "导演分镜中…" : "🎬 ② 生成分镜表"
5800
+ }),
5801
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5802
+ className: panel_module_css_default.meta,
5803
+ children: [
5804
+ "共 ",
5805
+ skeleton.beats.length,
5806
+ " 个节拍 · 骨架可重新生成(后续版本支持直接编辑)"
5807
+ ]
5808
+ })
5809
+ ]
5810
+ })
5811
+ ]
5812
+ }),
5813
+ table !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5814
+ style: {
5815
+ display: "flex",
5816
+ flexDirection: "column",
5817
+ gap: 10,
5818
+ marginTop: 10
5819
+ },
5820
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5821
+ className: panel_module_css_default.row,
5822
+ style: {
5823
+ justifyContent: "space-between",
5824
+ flexWrap: "wrap"
5825
+ },
5826
+ children: [
5827
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
5828
+ "🎬 分镜表(",
5829
+ table.shots.length,
5830
+ " 个镜头)"
5831
+ ] }),
5832
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5833
+ type: "button",
5834
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
5835
+ onClick: () => {
5836
+ const text = table.shots.map((s) => {
5837
+ const beat = skeleton?.beats.find((b) => b.id === s.beatId);
5838
+ return `镜头 ${s.id}(节拍 ${beat?.id ?? s.beatId} · ${s.shot} · ${s.camera} · ${s.duration}s)\n画面:${s.visual}\n台词:${s.line !== "" ? s.line : "(无)"}\n音效:${s.sound !== "" ? s.sound : "(无)"}\n光效:${s.light !== "" ? s.light : "(无)"}\n承接:${s.prevState} → ${s.nextState}`;
5839
+ }).join("\n\n");
5840
+ navigator.clipboard?.writeText(`第${table.chapterNo}章分镜表\n\n` + text);
5841
+ },
5842
+ children: "📋 复制分镜表"
5843
+ }),
5844
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5845
+ className: panel_module_css_default.meta,
5846
+ children: "按骨架节拍展开 · 镜头间状态连续"
5847
+ }),
5848
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5849
+ type: "button",
5850
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
5851
+ disabled: promptsBusy,
5852
+ onClick: () => {
5853
+ generatePrompts();
5854
+ },
5855
+ children: promptsBusy ? "提示词生成中…" : "🎬 ③ 生成视频提示词"
5856
+ })
5857
+ ]
5858
+ }), table.shots.map((s) => {
5859
+ const beat = skeleton?.beats.find((b) => b.id === s.beatId);
5860
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5861
+ style: {
5862
+ display: "flex",
5863
+ flexDirection: "column",
5864
+ gap: 3,
5865
+ border: "1px solid var(--nf-border)",
5866
+ borderRadius: 10,
5867
+ padding: "8px 10px"
5868
+ },
5869
+ children: [
5870
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5871
+ className: panel_module_css_default.row,
5872
+ style: { flexWrap: "wrap" },
5873
+ children: [
5874
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: ["镜头 ", s.id] }),
5875
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5876
+ className: panel_module_css_default.badge,
5877
+ children: s.shot
5878
+ }),
5879
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5880
+ className: panel_module_css_default.meta,
5881
+ children: [
5882
+ s.camera,
5883
+ " · ",
5884
+ s.duration,
5885
+ "s"
5886
+ ]
5887
+ }),
5888
+ beat !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5889
+ className: panel_module_css_default.meta,
5890
+ children: [
5891
+ "节拍 ",
5892
+ beat.id,
5893
+ "「",
5894
+ beat.function,
5895
+ "」"
5896
+ ]
5897
+ })
5898
+ ]
5899
+ }),
5900
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["🎞️ ", s.visual] }),
5901
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5902
+ className: panel_module_css_default.row,
5903
+ style: { flexWrap: "wrap" },
5904
+ children: [
5905
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5906
+ className: panel_module_css_default.meta,
5907
+ children: ["💬 ", s.line !== "" ? s.line : "(无台词)"]
5908
+ }),
5909
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5910
+ className: panel_module_css_default.meta,
5911
+ children: ["🔊 ", s.sound !== "" ? s.sound : "(无音效)"]
5912
+ }),
5913
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5914
+ className: panel_module_css_default.meta,
5915
+ children: ["💡 ", s.light !== "" ? s.light : "(无光效)"]
5916
+ })
5917
+ ]
5918
+ }),
5919
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5920
+ className: panel_module_css_default.meta,
5921
+ children: [
5922
+ "承接:",
5923
+ s.prevState,
5924
+ " → ",
5925
+ s.nextState
5926
+ ]
5927
+ })
5928
+ ]
5929
+ }, s.id);
5930
+ })]
5931
+ }),
5932
+ prompts !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5933
+ style: {
5934
+ display: "flex",
5935
+ flexDirection: "column",
5936
+ gap: 8,
5937
+ marginTop: 10
5938
+ },
5939
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5940
+ className: panel_module_css_default.row,
5941
+ style: {
5942
+ justifyContent: "space-between",
5943
+ flexWrap: "wrap"
5944
+ },
5945
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
5946
+ "🎬 视频提示词(",
5947
+ prompts.length,
5948
+ " 个镜头)"
5949
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5950
+ type: "button",
5951
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
5952
+ onClick: () => {
5953
+ const text = prompts.map((x) => `【镜头 ${x.shotId}】${x.text}`).join("\n\n");
5954
+ navigator.clipboard?.writeText(`第${table?.chapterNo ?? ""}章视频提示词\n\n` + text);
5955
+ },
5956
+ children: "📋 复制全部(即梦可逐条粘贴)"
5957
+ })]
5958
+ }), prompts.map((x) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5959
+ style: {
5960
+ display: "flex",
5961
+ flexDirection: "column",
5962
+ gap: 3,
5963
+ border: "1px solid var(--nf-accent)",
5964
+ borderRadius: 10,
5965
+ padding: "8px 10px"
5966
+ },
5967
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5968
+ className: panel_module_css_default.row,
5969
+ style: { flexWrap: "wrap" },
5970
+ children: [
5971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: ["镜头 ", x.shotId] }),
5972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5973
+ className: panel_module_css_default.meta,
5974
+ children: "即梦/Seedance 提示词"
5975
+ }),
5976
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: { flex: 1 } }),
5977
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5978
+ type: "button",
5979
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
5980
+ onClick: () => {
5981
+ navigator.clipboard?.writeText(x.text);
5982
+ setCopied(x.shotId);
5983
+ setTimeout(() => {
5984
+ setCopied("");
5985
+ }, 1500);
5986
+ },
5987
+ children: copied === x.shotId ? "✅ 已复制" : "📋 复制"
5988
+ })
5989
+ ]
5990
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5991
+ style: {
5992
+ fontSize: 13,
5993
+ lineHeight: 1.7
5994
+ },
5995
+ children: x.text
5996
+ })]
5997
+ }, x.shotId))]
5998
+ })
5999
+ ]
6000
+ });
6001
+ }
6002
+ //#endregion
6003
+ //#region src/client/panel/MangaWorkspace.tsx
6004
+ /**
6005
+ * 漫剧工作台:方案管理(基底风格 + 可选滤镜)→ 分镜(骨架/分镜表,按方案风格生成)。
6006
+ * 骨架为故事层(所有方案共享);分镜表画面措辞随方案风格。
6007
+ */
6008
+ function MangaWorkspace({ api, project, chapters, onProjectChanged }) {
6009
+ const plans = (0, react.useMemo)(() => project?.mangaPlans ?? [], [project?.mangaPlans]);
6010
+ const activePlan = plans.find((p) => p.active) ?? null;
6011
+ const [showCreate, setShowCreate] = (0, react.useState)(false);
6012
+ const [name, setName] = (0, react.useState)("");
6013
+ const [styleId, setStyleId] = (0, react.useState)("");
6014
+ const [filterId, setFilterId] = (0, react.useState)("");
6015
+ const [busy, setBusy] = (0, react.useState)(false);
6016
+ const [error, setError] = (0, react.useState)("");
6017
+ const baseStyles = (0, react.useMemo)(() => STYLE_LIBRARY.filter((s) => s.stackable !== true).sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0)), []);
6018
+ const filterStyles = (0, react.useMemo)(() => STYLE_LIBRARY.filter((s) => s.stackable === true), []);
6019
+ const mutate = async (req) => {
6020
+ setBusy(true);
6021
+ setError("");
6022
+ try {
6023
+ await api.manhuaPlans(req);
6024
+ return true;
6025
+ } catch (err) {
6026
+ setError(err.message);
6027
+ return false;
6028
+ } finally {
6029
+ setBusy(false);
6030
+ }
6031
+ };
6032
+ const createPlan = async () => {
6033
+ const n = name.trim();
6034
+ if (n === "" || styleId === "") {
6035
+ setError("请填写方案名并选择基底风格");
6036
+ return;
6037
+ }
6038
+ if (await mutate({
6039
+ op: "create",
6040
+ name: n,
6041
+ styleId,
6042
+ filterId: filterId !== "" ? filterId : void 0
6043
+ })) {
6044
+ setShowCreate(false);
6045
+ setName("");
6046
+ setStyleId("");
6047
+ setFilterId("");
6048
+ await refreshProject();
6049
+ }
6050
+ };
6051
+ const refreshProject = async () => {
6052
+ await onProjectChanged?.();
6053
+ };
6054
+ if (project === null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6055
+ className: panel_module_css_default.card,
6056
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6057
+ className: panel_module_css_default.meta,
6058
+ children: "请先开书或选择一本书,再进入漫剧工作台。"
6059
+ })
6060
+ });
6061
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6062
+ style: {
6063
+ display: "flex",
6064
+ flexDirection: "column",
6065
+ gap: 10
6066
+ },
6067
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6068
+ className: panel_module_css_default.card,
6069
+ children: [
6070
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6071
+ className: panel_module_css_default.row,
6072
+ style: {
6073
+ justifyContent: "space-between",
6074
+ flexWrap: "wrap"
6075
+ },
6076
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6077
+ className: panel_module_css_default.cardTitle,
6078
+ children: "🎬 漫剧方案"
5107
6079
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5108
6080
  type: "button",
5109
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6081
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
6082
+ disabled: busy,
5110
6083
  onClick: () => {
5111
- setFactions([...draft.factions, {
5112
- name: "",
5113
- kind: "宗门",
5114
- description: ""
5115
- }]);
6084
+ setShowCreate(!showCreate);
5116
6085
  },
5117
- children: "+ 新增势力"
6086
+ children: showCreate ? "收起" : "+ 新建方案"
5118
6087
  })]
5119
- }), draft.factions.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6088
+ }),
6089
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5120
6090
  className: panel_module_css_default.meta,
5121
- children: "暂无势力 — 宗门 / 家族 / 王朝 / 组织…"
6091
+ children: "同一本书可建多套视觉演绎(基底风格 + 可选滤镜);分镜画面措辞随激活方案。"
6092
+ }),
6093
+ showCreate && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6094
+ style: {
6095
+ display: "flex",
6096
+ flexDirection: "column",
6097
+ gap: 8,
6098
+ border: "1px solid var(--nf-info)",
6099
+ borderRadius: 12,
6100
+ padding: 10,
6101
+ marginTop: 8
6102
+ },
6103
+ children: [
6104
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6105
+ className: panel_module_css_default.field,
6106
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
6107
+ className: panel_module_css_default.fieldLabel,
6108
+ children: "方案名"
6109
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6110
+ className: panel_module_css_default.input,
6111
+ value: name,
6112
+ placeholder: "例如:《保质期》3D 皮克斯版",
6113
+ onChange: (e) => {
6114
+ setName(e.target.value);
6115
+ }
6116
+ })]
6117
+ }),
6118
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6119
+ className: panel_module_css_default.field,
6120
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
6121
+ className: panel_module_css_default.fieldLabel,
6122
+ children: "基底风格(按推荐度排序)"
6123
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6124
+ style: {
6125
+ display: "flex",
6126
+ flexWrap: "wrap",
6127
+ gap: 6
6128
+ },
6129
+ children: baseStyles.map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6130
+ type: "button",
6131
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${styleId === s.id ? panel_module_css_default.buttonPrimary : ""}`,
6132
+ title: s.traits,
6133
+ onClick: () => {
6134
+ setStyleId(s.id);
6135
+ },
6136
+ children: s.name
6137
+ }, s.id))
6138
+ })]
6139
+ }),
6140
+ filterStyles.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6141
+ className: panel_module_css_default.field,
6142
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
6143
+ className: panel_module_css_default.fieldLabel,
6144
+ children: "叠加滤镜(可选)"
6145
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6146
+ style: {
6147
+ display: "flex",
6148
+ flexWrap: "wrap",
6149
+ gap: 6
6150
+ },
6151
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6152
+ type: "button",
6153
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${filterId === "" ? panel_module_css_default.buttonPrimary : ""}`,
6154
+ onClick: () => {
6155
+ setFilterId("");
6156
+ },
6157
+ children: "无"
6158
+ }), filterStyles.map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6159
+ type: "button",
6160
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${filterId === s.id ? panel_module_css_default.buttonPrimary : ""}`,
6161
+ title: s.traits,
6162
+ onClick: () => {
6163
+ setFilterId(s.id);
6164
+ },
6165
+ children: s.name
6166
+ }, s.id))]
6167
+ })]
6168
+ }),
6169
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6170
+ className: panel_module_css_default.importError,
6171
+ children: error
6172
+ }),
6173
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6174
+ className: panel_module_css_default.row,
6175
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6176
+ type: "button",
6177
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
6178
+ disabled: busy || name.trim() === "" || styleId === "",
6179
+ onClick: () => {
6180
+ createPlan();
6181
+ },
6182
+ children: "创建方案"
6183
+ })
6184
+ })
6185
+ ]
6186
+ }),
6187
+ plans.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6188
+ className: panel_module_css_default.meta,
6189
+ style: { marginTop: 8 },
6190
+ children: "尚无漫剧方案——新建一个方案,选择基底风格开始。"
5122
6191
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5123
6192
  style: {
5124
6193
  display: "flex",
5125
6194
  flexDirection: "column",
5126
- gap: 6
6195
+ gap: 6,
6196
+ marginTop: 8
5127
6197
  },
5128
- children: draft.factions.map((faction, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EditableRow, {
5129
- name: `${faction.name}(${faction.kind})`,
5130
- detail: faction.description,
5131
- onName: (v) => {
5132
- const next = [...draft.factions];
5133
- const match = /^(.*)((.*))$/.exec(v);
5134
- next[i] = {
5135
- ...next[i],
5136
- name: (match?.[1] ?? v).trim(),
5137
- kind: (match?.[2] ?? next[i].kind).trim() || "宗门"
5138
- };
5139
- setFactions(next);
5140
- },
5141
- onDetail: (v) => {
5142
- const next = [...draft.factions];
5143
- next[i] = {
5144
- ...next[i],
5145
- description: v
5146
- };
5147
- setFactions(next);
5148
- },
5149
- onRemove: () => {
5150
- setFactions(draft.factions.filter((_, idx) => idx !== i));
5151
- },
5152
- namePlaceholder: "势力名(类型)如:青云宗(宗门)",
5153
- detailPlaceholder: "描述…"
5154
- }, i))
6198
+ children: plans.map((p) => {
6199
+ const style = findStyle(p.styleId);
6200
+ const filter = p.filterId !== void 0 ? findStyle(p.filterId) : void 0;
6201
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6202
+ style: {
6203
+ display: "flex",
6204
+ alignItems: "center",
6205
+ gap: 8,
6206
+ flexWrap: "wrap",
6207
+ border: `1px solid ${p.active ? "var(--nf-accent)" : "var(--nf-border)"}`,
6208
+ borderRadius: 10,
6209
+ padding: "8px 10px"
6210
+ },
6211
+ children: [
6212
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: p.name }),
6213
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6214
+ className: panel_module_css_default.badge,
6215
+ children: style?.name ?? p.styleId
6216
+ }),
6217
+ filter !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6218
+ className: panel_module_css_default.badge,
6219
+ children: ["+", filter.name]
6220
+ }),
6221
+ p.active && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6222
+ className: `${panel_module_css_default.badge} ${panel_module_css_default.badgeDone}`,
6223
+ children: "激活中"
6224
+ }),
6225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: { flex: 1 } }),
6226
+ !p.active && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6227
+ type: "button",
6228
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6229
+ disabled: busy,
6230
+ onClick: async () => {
6231
+ if (await mutate({
6232
+ op: "activate",
6233
+ id: p.id
6234
+ })) await refreshProject();
6235
+ },
6236
+ children: "激活"
6237
+ }),
6238
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6239
+ type: "button",
6240
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
6241
+ disabled: busy,
6242
+ onClick: async () => {
6243
+ if (await mutate({
6244
+ op: "remove",
6245
+ id: p.id
6246
+ })) await refreshProject();
6247
+ },
6248
+ children: "删除"
6249
+ })
6250
+ ]
6251
+ }, p.id);
6252
+ })
6253
+ })
6254
+ ]
6255
+ }), plans.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StoryboardTab, {
6256
+ api,
6257
+ project,
6258
+ chapters,
6259
+ onProjectChanged,
6260
+ styleId: activePlan?.styleId,
6261
+ filterId: activePlan?.filterId
6262
+ })]
6263
+ });
6264
+ }
6265
+ //#endregion
6266
+ //#region src/client/panel/StyleGallery.tsx
6267
+ /**
6268
+ * 风格库页面:4 个分类标签 + 风格卡片网格。
6269
+ * 卡片预留:风格效果图占位 + 特点说明 + 关键词(一键复制)。
6270
+ * 后续:新建漫剧方案时从这里选风格(基底 + 滤镜)。
6271
+ */
6272
+ function StyleGallery() {
6273
+ const [active, setActive] = (0, react.useState)("3d");
6274
+ const [copied, setCopied] = (0, react.useState)("");
6275
+ const copyKeywords = async (id, keywords) => {
6276
+ try {
6277
+ await navigator.clipboard.writeText(keywords);
6278
+ setCopied(id);
6279
+ setTimeout(() => {
6280
+ setCopied("");
6281
+ }, 1500);
6282
+ } catch {}
6283
+ };
6284
+ const list = stylesByCategory(active);
6285
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6286
+ className: panel_module_css_default.card,
6287
+ children: [
6288
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6289
+ className: panel_module_css_default.row,
6290
+ style: {
6291
+ justifyContent: "space-between",
6292
+ flexWrap: "wrap"
6293
+ },
6294
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6295
+ className: panel_module_css_default.cardTitle,
6296
+ children: "🎨 风格库"
6297
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6298
+ className: panel_module_css_default.meta,
6299
+ children: [
6300
+ "共 ",
6301
+ STYLE_LIBRARY.length,
6302
+ " 个内置模板 · 新建漫剧方案时选择(影视类可作滤镜叠加)"
6303
+ ]
5155
6304
  })]
6305
+ }),
6306
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6307
+ className: panel_module_css_default.row,
6308
+ style: {
6309
+ gap: 8,
6310
+ flexWrap: "wrap"
6311
+ },
6312
+ children: STYLE_CATEGORIES.map((cat) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6313
+ type: "button",
6314
+ className: `${panel_module_css_default.button} ${active === cat.id ? panel_module_css_default.buttonPrimary : ""}`,
6315
+ style: {
6316
+ flex: 1,
6317
+ minWidth: 140
6318
+ },
6319
+ onClick: () => {
6320
+ setActive(cat.id);
6321
+ },
6322
+ children: [
6323
+ cat.icon,
6324
+ " ",
6325
+ cat.label,
6326
+ "(",
6327
+ stylesByCategory(cat.id).length,
6328
+ ")"
6329
+ ]
6330
+ }, cat.id))
6331
+ }),
6332
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6333
+ className: panel_module_css_default.meta,
6334
+ children: STYLE_CATEGORIES.find((c) => c.id === active)?.desc
6335
+ }),
6336
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6337
+ style: {
6338
+ display: "grid",
6339
+ gridTemplateColumns: "repeat(auto-fill, minmax(240px, 1fr))",
6340
+ gap: 12,
6341
+ marginTop: 6
6342
+ },
6343
+ children: list.map((style) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6344
+ style: {
6345
+ display: "flex",
6346
+ flexDirection: "column",
6347
+ gap: 6,
6348
+ border: "1px solid var(--nf-border)",
6349
+ borderRadius: 14,
6350
+ padding: 10,
6351
+ background: "var(--nf-bg-raise)"
6352
+ },
6353
+ children: [
6354
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6355
+ style: {
6356
+ aspectRatio: "3 / 4",
6357
+ borderRadius: 10,
6358
+ position: "relative",
6359
+ overflow: "hidden",
6360
+ display: "flex",
6361
+ alignItems: "center",
6362
+ justifyContent: "center",
6363
+ background: "linear-gradient(145deg, var(--nf-bg-inset), color-mix(in srgb, var(--nf-accent) 12%, var(--nf-bg-inset)))",
6364
+ border: "1px solid var(--nf-border)",
6365
+ color: "var(--nf-text-3)",
6366
+ fontSize: 12,
6367
+ textAlign: "center"
6368
+ },
6369
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
6370
+ src: `/api/dsh-novel-forge/styles/image?id=${style.id}`,
6371
+ alt: style.name,
6372
+ loading: "lazy",
6373
+ style: {
6374
+ position: "absolute",
6375
+ inset: 0,
6376
+ width: "100%",
6377
+ height: "100%",
6378
+ objectFit: "cover"
6379
+ },
6380
+ onError: (e) => {
6381
+ e.currentTarget.style.display = "none";
6382
+ }
6383
+ }), "🖼️ 效果图待生成"]
6384
+ }),
6385
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6386
+ className: panel_module_css_default.row,
6387
+ style: { flexWrap: "wrap" },
6388
+ children: [
6389
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: style.name }),
6390
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6391
+ className: panel_module_css_default.badge,
6392
+ children: [
6393
+ STYLE_CATEGORIES.find((c) => c.id === style.category)?.icon,
6394
+ " ",
6395
+ style.category.toUpperCase()
6396
+ ]
6397
+ }),
6398
+ style.stackable === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6399
+ className: panel_module_css_default.badge,
6400
+ children: "叠加滤镜"
6401
+ })
6402
+ ]
6403
+ }),
6404
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6405
+ className: panel_module_css_default.meta,
6406
+ style: {
6407
+ fontSize: 12,
6408
+ lineHeight: 1.6
6409
+ },
6410
+ children: style.traits
6411
+ }),
6412
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6413
+ style: {
6414
+ fontSize: 11.5,
6415
+ lineHeight: 1.5,
6416
+ color: "var(--nf-text-2)",
6417
+ borderTop: "1px solid var(--nf-border)",
6418
+ paddingTop: 6,
6419
+ display: "-webkit-box",
6420
+ WebkitLineClamp: 3,
6421
+ WebkitBoxOrient: "vertical",
6422
+ overflow: "hidden",
6423
+ cursor: "pointer"
6424
+ },
6425
+ title: "点击复制关键词",
6426
+ onClick: () => {
6427
+ copyKeywords(style.id, style.keywords);
6428
+ },
6429
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6430
+ className: panel_module_css_default.meta,
6431
+ children: "关键词:"
6432
+ }), style.keywords]
6433
+ }),
6434
+ copied === style.id && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6435
+ style: {
6436
+ color: "var(--nf-ok, #46a758)",
6437
+ fontSize: 12
6438
+ },
6439
+ children: "✅ 已复制"
6440
+ })
6441
+ ]
6442
+ }, style.id))
5156
6443
  })
5157
6444
  ]
5158
6445
  });
@@ -5836,6 +7123,16 @@ window.__ModuleLoader__.load({
5836
7123
  label: "场景库",
5837
7124
  icon: "🏞️"
5838
7125
  },
7126
+ {
7127
+ id: "styleLib",
7128
+ label: "风格库",
7129
+ icon: "🎨"
7130
+ },
7131
+ {
7132
+ id: "manhua",
7133
+ label: "漫剧",
7134
+ icon: "🎬"
7135
+ },
5839
7136
  {
5840
7137
  id: "run",
5841
7138
  label: "生产单",
@@ -5872,7 +7169,7 @@ window.__ModuleLoader__.load({
5872
7169
  "high",
5873
7170
  "max"
5874
7171
  ];
5875
- const PLUGIN_VERSION = "1.4.0";
7172
+ const PLUGIN_VERSION = "1.5.0";
5876
7173
  /** GitHub 仓库地址(关于区块点击跳转)。 */
5877
7174
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
5878
7175
  /** Whether any chapter is being generated right now. */
@@ -6617,6 +7914,28 @@ window.__ModuleLoader__.load({
6617
7914
  setBusy(false);
6618
7915
  }
6619
7916
  };
7917
+ /** 反推大纲:从已写章节正文反向生成全书总纲(流式进度)。 */
7918
+ const handleReverseOutline = async () => {
7919
+ if (project === null) return;
7920
+ if (!window.confirm("将从已写章节正文反推出全书总纲(覆盖当前大纲文本,不影响章节/设定/进度)。确定继续?")) return;
7921
+ setBusy(true);
7922
+ setError("");
7923
+ try {
7924
+ await api.outlineReverse((frame) => {
7925
+ if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
7926
+ else if (frame.type === "outline-done") {
7927
+ setOutlineText(frame.outline);
7928
+ pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
7929
+ }
7930
+ });
7931
+ await refresh(false);
7932
+ } catch (err) {
7933
+ setError(err.message);
7934
+ pushProgress(`反推大纲失败:${err.message}`, "error");
7935
+ } finally {
7936
+ setBusy(false);
7937
+ }
7938
+ };
6620
7939
  /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */
6621
7940
  const handleToggleUpdateOutline = () => {
6622
7941
  if (!updatingOutline && project !== null) setOutlineText(project.outline);
@@ -6991,9 +8310,12 @@ window.__ModuleLoader__.load({
6991
8310
  setBusyLabel(`生成「${name}」形象锚点…`);
6992
8311
  setError("");
6993
8312
  try {
8313
+ const activePlan = (project?.mangaPlans ?? []).find((pl) => pl.active);
6994
8314
  await api.roles({
6995
8315
  op: "visual",
6996
- name
8316
+ name,
8317
+ styleId: activePlan?.styleId,
8318
+ filterId: activePlan?.filterId
6997
8319
  });
6998
8320
  await refresh(false);
6999
8321
  pushProgress(`已生成「${name}」形象锚点`, "done");
@@ -9465,37 +10787,50 @@ window.__ModuleLoader__.load({
9465
10787
  onAction: todo.onClick
9466
10788
  }, i))]
9467
10789
  })
9468
- ] }),
9469
- activeTab === "overview" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9470
- className: panel_module_css_default.card,
9471
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9472
- className: panel_module_css_default.row,
9473
- style: { justifyContent: "space-between" },
9474
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9475
- className: panel_module_css_default.cardTitle,
9476
- children: tt("tab.overview")
9477
- }), project !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9478
- className: panel_module_css_default.row,
9479
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9480
- className: panel_module_css_default.meta,
9481
- children: [
9482
- tt("overview.bookName"),
9483
- ": ",
9484
- project.bookName,
9485
- " · ",
9486
- project.outline.length,
9487
- " 字",
9488
- project.outlinePath !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [" · ", project.outlinePath] })
9489
- ]
9490
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
9491
- type: "button",
9492
- className: panel_module_css_default.button,
9493
- disabled: busy,
9494
- onClick: () => {
9495
- handleToggleUpdateOutline();
9496
- },
9497
- children: updatingOutline ? "收起" : "更新大纲"
9498
- })]
10790
+ ] }),
10791
+ activeTab === "overview" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10792
+ className: panel_module_css_default.card,
10793
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10794
+ className: panel_module_css_default.row,
10795
+ style: { justifyContent: "space-between" },
10796
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10797
+ className: panel_module_css_default.cardTitle,
10798
+ children: tt("tab.overview")
10799
+ }), project !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10800
+ className: panel_module_css_default.row,
10801
+ children: [
10802
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
10803
+ className: panel_module_css_default.meta,
10804
+ children: [
10805
+ tt("overview.bookName"),
10806
+ ": ",
10807
+ project.bookName,
10808
+ " · ",
10809
+ project.outline.length,
10810
+ " 字",
10811
+ project.outlinePath !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [" · ", project.outlinePath] })
10812
+ ]
10813
+ }),
10814
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10815
+ type: "button",
10816
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
10817
+ disabled: busy || !(project.chapters ?? []).some((c) => c.status === "written" || c.status === "approved" || c.status === "rejected"),
10818
+ onClick: () => {
10819
+ handleReverseOutline();
10820
+ },
10821
+ title: "从已写章节正文反向生成全书总纲(覆盖当前大纲文本)",
10822
+ children: "🔄 反推大纲"
10823
+ }),
10824
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10825
+ type: "button",
10826
+ className: panel_module_css_default.button,
10827
+ disabled: busy,
10828
+ onClick: () => {
10829
+ handleToggleUpdateOutline();
10830
+ },
10831
+ children: updatingOutline ? "收起" : "更新大纲"
10832
+ })
10833
+ ]
9499
10834
  })]
9500
10835
  }), project === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
9501
10836
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -9615,10 +10950,14 @@ window.__ModuleLoader__.load({
9615
10950
  })
9616
10951
  ]
9617
10952
  })
9618
- ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
10953
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
10954
+ className: panel_module_css_default.meta,
10955
+ style: { marginBottom: 6 },
10956
+ children: "大纲是本书的「出生证明」;已写章节可点右上角「🔄 反推大纲」从正文反推,或「更新大纲」手动修订。"
10957
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
9619
10958
  className: panel_module_css_default.outlineReadonly,
9620
10959
  children: project.outline
9621
- })]
10960
+ })] })]
9622
10961
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9623
10962
  className: panel_module_css_default.card,
9624
10963
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -10878,50 +12217,70 @@ window.__ModuleLoader__.load({
10878
12217
  ]
10879
12218
  }),
10880
12219
  activeTab === "assets" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, { api }),
10881
- activeTab === "settings" && configDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10882
- className: panel_module_css_default.card,
10883
- children: [
10884
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10885
- className: panel_module_css_default.cardTitle,
10886
- children: tt("settings.title")
10887
- }),
10888
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10889
- className: panel_module_css_default.field,
10890
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10891
- className: panel_module_css_default.fieldLabel,
10892
- children: tt("settings.outlinePath")
10893
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10894
- className: panel_module_css_default.input,
10895
- value: configDraft.outlinePath,
10896
- onChange: (e) => {
10897
- setConfigDraft({
10898
- ...configDraft,
10899
- outlinePath: e.target.value
10900
- });
10901
- }
10902
- })]
10903
- }),
10904
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10905
- className: panel_module_css_default.field,
10906
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10907
- className: panel_module_css_default.fieldLabel,
10908
- children: tt("settings.outputDir")
10909
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10910
- className: panel_module_css_default.input,
10911
- value: configDraft.outputDir,
10912
- onChange: (e) => {
10913
- setConfigDraft({
10914
- ...configDraft,
10915
- outputDir: e.target.value
10916
- });
10917
- }
10918
- })]
10919
- }),
10920
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10921
- className: panel_module_css_default.row,
10922
- style: { alignItems: "flex-start" },
10923
- children: [
10924
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12220
+ activeTab === "settings" && configDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
12221
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12222
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
12223
+ children: [
12224
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12225
+ className: panel_module_css_default.cardTitle,
12226
+ children: "📁 路径与输出"
12227
+ }),
12228
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12229
+ className: panel_module_css_default.field,
12230
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12231
+ className: panel_module_css_default.fieldLabel,
12232
+ children: tt("settings.outlinePath")
12233
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12234
+ className: panel_module_css_default.input,
12235
+ value: configDraft.outlinePath,
12236
+ onChange: (e) => {
12237
+ setConfigDraft({
12238
+ ...configDraft,
12239
+ outlinePath: e.target.value
12240
+ });
12241
+ }
12242
+ })]
12243
+ }),
12244
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12245
+ className: panel_module_css_default.field,
12246
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12247
+ className: panel_module_css_default.fieldLabel,
12248
+ children: tt("settings.outputDir")
12249
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12250
+ className: panel_module_css_default.input,
12251
+ value: configDraft.outputDir,
12252
+ onChange: (e) => {
12253
+ setConfigDraft({
12254
+ ...configDraft,
12255
+ outputDir: e.target.value
12256
+ });
12257
+ }
12258
+ })]
12259
+ }),
12260
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12261
+ className: panel_module_css_default.row,
12262
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12263
+ type: "button",
12264
+ className: panel_module_css_default.button,
12265
+ onClick: () => {
12266
+ api.openFolder();
12267
+ },
12268
+ children: tt("settings.openFolder")
12269
+ })
12270
+ })
12271
+ ]
12272
+ }),
12273
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12274
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
12275
+ children: [
12276
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12277
+ className: panel_module_css_default.cardTitle,
12278
+ children: "🤖 模型与推理"
12279
+ }),
12280
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12281
+ className: panel_module_css_default.row,
12282
+ style: { alignItems: "flex-start" },
12283
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10925
12284
  className: panel_module_css_default.field,
10926
12285
  style: { flex: 1 },
10927
12286
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
@@ -10937,8 +12296,7 @@ window.__ModuleLoader__.load({
10937
12296
  });
10938
12297
  }
10939
12298
  })]
10940
- }),
10941
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12299
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10942
12300
  className: panel_module_css_default.field,
10943
12301
  style: { flex: 1.4 },
10944
12302
  children: [
@@ -10981,8 +12339,12 @@ window.__ModuleLoader__.load({
10981
12339
  }
10982
12340
  })
10983
12341
  ]
10984
- }),
10985
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12342
+ })]
12343
+ }),
12344
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12345
+ className: panel_module_css_default.row,
12346
+ style: { alignItems: "flex-start" },
12347
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10986
12348
  className: panel_module_css_default.field,
10987
12349
  style: { flex: 1 },
10988
12350
  children: [
@@ -10994,219 +12356,95 @@ window.__ModuleLoader__.load({
10994
12356
  className: panel_module_css_default.input,
10995
12357
  value: configDraft.reasoningEffort ?? "off",
10996
12358
  onChange: (e) => {
10997
- setConfigDraft({
10998
- ...configDraft,
10999
- reasoningEffort: e.target.value
11000
- });
11001
- },
11002
- children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11003
- value: v,
11004
- children: tt(`settings.reasoning.${v}`)
11005
- }, v))
11006
- }),
11007
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11008
- className: panel_module_css_default.meta,
11009
- children: tt("settings.reasoningHint")
11010
- })
11011
- ]
11012
- })
11013
- ]
11014
- }),
11015
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11016
- className: panel_module_css_default.row,
11017
- children: [
11018
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11019
- className: panel_module_css_default.field,
11020
- style: { flex: 1 },
11021
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11022
- className: panel_module_css_default.fieldLabel,
11023
- children: "豆包 API Key(生图)"
11024
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11025
- className: panel_module_css_default.input,
11026
- type: "password",
11027
- placeholder: "ark-...",
11028
- value: configDraft.imageApiKey ?? "",
11029
- onChange: (e) => {
11030
- setConfigDraft({
11031
- ...configDraft,
11032
- imageApiKey: e.target.value
11033
- });
11034
- }
11035
- })]
11036
- }),
11037
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11038
- className: panel_module_css_default.field,
11039
- style: { flex: 1 },
11040
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11041
- className: panel_module_css_default.fieldLabel,
11042
- children: "豆包生图模型"
11043
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11044
- className: panel_module_css_default.input,
11045
- placeholder: "doubao-seedream-5-0-pro-260628",
11046
- value: configDraft.imageApiModel ?? "",
11047
- onChange: (e) => {
11048
- setConfigDraft({
11049
- ...configDraft,
11050
- imageApiModel: e.target.value
11051
- });
11052
- }
11053
- })]
11054
- }),
11055
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11056
- className: panel_module_css_default.field,
11057
- style: { flex: 1 },
11058
- children: [
11059
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11060
- className: panel_module_css_default.fieldLabel,
11061
- children: "启用豆包生图"
11062
- }),
11063
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11064
- className: panel_module_css_default.input,
11065
- value: configDraft.imageApiEnabled ? "1" : "0",
11066
- onChange: (e) => {
11067
- setConfigDraft({
11068
- ...configDraft,
11069
- imageApiEnabled: e.target.value === "1"
11070
- });
11071
- },
11072
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11073
- value: "0",
11074
- children: "关(默认)"
11075
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11076
- value: "1",
11077
- children: "开"
11078
- })]
11079
- }),
11080
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11081
- className: panel_module_css_default.meta,
11082
- children: "开启后角色详情显示「豆包生成」参考图按钮"
11083
- })
11084
- ]
11085
- })
11086
- ]
11087
- }),
11088
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11089
- className: panel_module_css_default.row,
11090
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11091
- className: panel_module_css_default.field,
11092
- style: { flex: 1 },
11093
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11094
- className: panel_module_css_default.fieldLabel,
11095
- children: tt("settings.chapterChars")
11096
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11097
- className: panel_module_css_default.input,
11098
- type: "number",
11099
- min: 1e3,
11100
- max: 2e4,
11101
- value: configDraft.chapterChars,
11102
- onChange: (e) => {
11103
- setConfigDraft({
11104
- ...configDraft,
11105
- chapterChars: Number(e.target.value)
11106
- });
11107
- }
11108
- })]
11109
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11110
- className: panel_module_css_default.field,
11111
- style: { flex: 1 },
11112
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11113
- className: panel_module_css_default.fieldLabel,
11114
- children: tt("settings.maxTokens")
11115
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11116
- className: panel_module_css_default.input,
11117
- type: "number",
11118
- min: 2e3,
11119
- max: 64e3,
11120
- value: configDraft.maxTokens,
11121
- onChange: (e) => {
11122
- setConfigDraft({
11123
- ...configDraft,
11124
- maxTokens: Number(e.target.value)
11125
- });
11126
- }
11127
- })]
11128
- })]
11129
- }),
11130
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11131
- className: panel_module_css_default.row,
11132
- children: [
11133
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11134
- className: panel_module_css_default.field,
11135
- style: { flex: 1 },
11136
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11137
- className: panel_module_css_default.fieldLabel,
11138
- children: tt("settings.reviewPassScore")
11139
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11140
- className: panel_module_css_default.input,
11141
- type: "number",
11142
- min: 0,
11143
- max: 100,
11144
- value: configDraft.reviewPassScore,
11145
- onChange: (e) => {
11146
- setConfigDraft({
11147
- ...configDraft,
11148
- reviewPassScore: Number(e.target.value)
11149
- });
11150
- }
11151
- })]
11152
- }),
11153
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12359
+ setConfigDraft({
12360
+ ...configDraft,
12361
+ reasoningEffort: e.target.value
12362
+ });
12363
+ },
12364
+ children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12365
+ value: v,
12366
+ children: tt(`settings.reasoning.${v}`)
12367
+ }, v))
12368
+ }),
12369
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12370
+ className: panel_module_css_default.meta,
12371
+ children: tt("settings.reasoningHint")
12372
+ })
12373
+ ]
12374
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11154
12375
  className: panel_module_css_default.field,
11155
12376
  style: { flex: 1 },
11156
12377
  children: [
11157
12378
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11158
12379
  className: panel_module_css_default.fieldLabel,
11159
- children: tt("settings.editorFontSize")
12380
+ children: tt("settings.analysisReasoning")
11160
12381
  }),
11161
12382
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
11162
12383
  className: panel_module_css_default.input,
11163
- value: editorFontSize,
12384
+ value: configDraft.analysisReasoning ?? "low",
11164
12385
  onChange: (e) => {
11165
- changeEditorFontSize(Number(e.target.value));
12386
+ setConfigDraft({
12387
+ ...configDraft,
12388
+ analysisReasoning: e.target.value
12389
+ });
11166
12390
  },
11167
- children: [
11168
- 12,
11169
- 13,
11170
- 14,
11171
- 15,
11172
- 16,
11173
- 18,
11174
- 20,
11175
- 22,
11176
- 24
11177
- ].map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
12391
+ children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11178
12392
  value: v,
11179
- children: [v, "px"]
12393
+ children: tt(`settings.reasoning.${v}`)
11180
12394
  }, v))
11181
12395
  }),
11182
12396
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11183
12397
  className: panel_module_css_default.meta,
11184
- children: tt("settings.editorFontSizeHint")
12398
+ children: tt("settings.analysisReasoningHint")
11185
12399
  })
11186
12400
  ]
12401
+ })]
12402
+ })
12403
+ ]
12404
+ }),
12405
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12406
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
12407
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12408
+ className: panel_module_css_default.cardTitle,
12409
+ children: "🎨 生图(豆包)"
12410
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12411
+ className: panel_module_css_default.row,
12412
+ children: [
12413
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12414
+ className: panel_module_css_default.field,
12415
+ style: { flex: 1 },
12416
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12417
+ className: panel_module_css_default.fieldLabel,
12418
+ children: "豆包 API Key(生图)"
12419
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12420
+ className: panel_module_css_default.input,
12421
+ type: "password",
12422
+ placeholder: "ark-...",
12423
+ value: configDraft.imageApiKey ?? "",
12424
+ onChange: (e) => {
12425
+ setConfigDraft({
12426
+ ...configDraft,
12427
+ imageApiKey: e.target.value
12428
+ });
12429
+ }
12430
+ })]
11187
12431
  }),
11188
12432
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11189
12433
  className: panel_module_css_default.field,
11190
12434
  style: { flex: 1 },
11191
12435
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11192
12436
  className: panel_module_css_default.fieldLabel,
11193
- children: tt("settings.autoReview")
11194
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
12437
+ children: "豆包生图模型"
12438
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
11195
12439
  className: panel_module_css_default.input,
11196
- value: configDraft.autoReview ? "1" : "0",
12440
+ placeholder: "doubao-seedream-5-0-pro-260628",
12441
+ value: configDraft.imageApiModel ?? "",
11197
12442
  onChange: (e) => {
11198
12443
  setConfigDraft({
11199
12444
  ...configDraft,
11200
- autoReview: e.target.value === "1"
12445
+ imageApiModel: e.target.value
11201
12446
  });
11202
- },
11203
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11204
- value: "1",
11205
- children: "✓ 是"
11206
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11207
- value: "0",
11208
- children: "✗ 否"
11209
- })]
12447
+ }
11210
12448
  })]
11211
12449
  }),
11212
12450
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -11215,46 +12453,164 @@ window.__ModuleLoader__.load({
11215
12453
  children: [
11216
12454
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11217
12455
  className: panel_module_css_default.fieldLabel,
11218
- children: tt("settings.autoAuthorReview")
12456
+ children: "启用豆包生图"
11219
12457
  }),
11220
12458
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11221
12459
  className: panel_module_css_default.input,
11222
- value: configDraft.autoAuthorReview ? "1" : "0",
12460
+ value: configDraft.imageApiEnabled ? "1" : "0",
11223
12461
  onChange: (e) => {
11224
12462
  setConfigDraft({
11225
12463
  ...configDraft,
11226
- autoAuthorReview: e.target.value === "1"
12464
+ imageApiEnabled: e.target.value === "1"
11227
12465
  });
11228
12466
  },
11229
12467
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11230
- value: "1",
11231
- children: "✓ 是"
11232
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11233
12468
  value: "0",
11234
- children: "✗ 否"
12469
+ children: "关(默认)"
12470
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12471
+ value: "1",
12472
+ children: "开"
11235
12473
  })]
11236
12474
  }),
11237
12475
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11238
12476
  className: panel_module_css_default.meta,
11239
- children: tt("settings.autoAuthorReviewHint")
12477
+ children: "开启后角色详情显示「豆包生成」参考图按钮"
11240
12478
  })
11241
12479
  ]
11242
- }),
11243
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11244
- className: panel_module_css_default.field,
11245
- style: { flex: 1 },
11246
- children: [
11247
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12480
+ })
12481
+ ]
12482
+ })]
12483
+ }),
12484
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12485
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
12486
+ children: [
12487
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12488
+ className: panel_module_css_default.cardTitle,
12489
+ children: "✍️ 写作与审稿参数"
12490
+ }),
12491
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12492
+ className: panel_module_css_default.row,
12493
+ children: [
12494
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12495
+ className: panel_module_css_default.field,
12496
+ style: { flex: 1 },
12497
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11248
12498
  className: panel_module_css_default.fieldLabel,
11249
- children: tt("settings.autoReviewAfterRevise")
11250
- }),
11251
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
12499
+ children: tt("settings.chapterChars")
12500
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12501
+ className: panel_module_css_default.input,
12502
+ type: "number",
12503
+ min: 1e3,
12504
+ max: 2e4,
12505
+ value: configDraft.chapterChars,
12506
+ onChange: (e) => {
12507
+ setConfigDraft({
12508
+ ...configDraft,
12509
+ chapterChars: Number(e.target.value)
12510
+ });
12511
+ }
12512
+ })]
12513
+ }),
12514
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12515
+ className: panel_module_css_default.field,
12516
+ style: { flex: 1 },
12517
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12518
+ className: panel_module_css_default.fieldLabel,
12519
+ children: tt("settings.maxTokens")
12520
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12521
+ className: panel_module_css_default.input,
12522
+ type: "number",
12523
+ min: 2e3,
12524
+ max: 64e3,
12525
+ value: configDraft.maxTokens,
12526
+ onChange: (e) => {
12527
+ setConfigDraft({
12528
+ ...configDraft,
12529
+ maxTokens: Number(e.target.value)
12530
+ });
12531
+ }
12532
+ })]
12533
+ }),
12534
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12535
+ className: panel_module_css_default.field,
12536
+ style: { flex: 1 },
12537
+ children: [
12538
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12539
+ className: panel_module_css_default.fieldLabel,
12540
+ children: tt("settings.editorFontSize")
12541
+ }),
12542
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
12543
+ className: panel_module_css_default.input,
12544
+ value: editorFontSize,
12545
+ onChange: (e) => {
12546
+ changeEditorFontSize(Number(e.target.value));
12547
+ },
12548
+ children: [
12549
+ 12,
12550
+ 13,
12551
+ 14,
12552
+ 15,
12553
+ 16,
12554
+ 18,
12555
+ 20,
12556
+ 22,
12557
+ 24
12558
+ ].map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
12559
+ value: v,
12560
+ children: [v, "px"]
12561
+ }, v))
12562
+ }),
12563
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12564
+ className: panel_module_css_default.meta,
12565
+ children: tt("settings.editorFontSizeHint")
12566
+ })
12567
+ ]
12568
+ })
12569
+ ]
12570
+ }),
12571
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12572
+ className: panel_module_css_default.row,
12573
+ children: [
12574
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12575
+ className: panel_module_css_default.field,
12576
+ style: { flex: 1 },
12577
+ children: [
12578
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12579
+ className: panel_module_css_default.fieldLabel,
12580
+ children: tt("settings.reviewPassScore")
12581
+ }),
12582
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
12583
+ className: panel_module_css_default.input,
12584
+ type: "number",
12585
+ min: 0,
12586
+ max: 100,
12587
+ value: configDraft.reviewPassScore,
12588
+ onChange: (e) => {
12589
+ setConfigDraft({
12590
+ ...configDraft,
12591
+ reviewPassScore: Number(e.target.value)
12592
+ });
12593
+ }
12594
+ }),
12595
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12596
+ className: panel_module_css_default.meta,
12597
+ children: "通过判定:综合评分 ≥ 此分数(默认 70),或无 high 级问题且评分 ≥ 60;建议设 60-80。"
12598
+ })
12599
+ ]
12600
+ }),
12601
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12602
+ className: panel_module_css_default.field,
12603
+ style: { flex: 1 },
12604
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12605
+ className: panel_module_css_default.fieldLabel,
12606
+ children: tt("settings.autoReview")
12607
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11252
12608
  className: panel_module_css_default.input,
11253
- value: configDraft.autoReviewAfterRevise ? "1" : "0",
12609
+ value: configDraft.autoReview ? "1" : "0",
11254
12610
  onChange: (e) => {
11255
12611
  setConfigDraft({
11256
12612
  ...configDraft,
11257
- autoReviewAfterRevise: e.target.value === "1"
12613
+ autoReview: e.target.value === "1"
11258
12614
  });
11259
12615
  },
11260
12616
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
@@ -11264,49 +12620,98 @@ window.__ModuleLoader__.load({
11264
12620
  value: "0",
11265
12621
  children: "✗ 否"
11266
12622
  })]
11267
- }),
11268
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11269
- className: panel_module_css_default.meta,
11270
- children: tt("settings.autoReviewAfterReviseHint")
11271
- })
11272
- ]
11273
- })
11274
- ]
11275
- }),
11276
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12623
+ })]
12624
+ }),
12625
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12626
+ className: panel_module_css_default.field,
12627
+ style: { flex: 1 },
12628
+ children: [
12629
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12630
+ className: panel_module_css_default.fieldLabel,
12631
+ children: tt("settings.autoAuthorReview")
12632
+ }),
12633
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
12634
+ className: panel_module_css_default.input,
12635
+ value: configDraft.autoAuthorReview ? "1" : "0",
12636
+ onChange: (e) => {
12637
+ setConfigDraft({
12638
+ ...configDraft,
12639
+ autoAuthorReview: e.target.value === "1"
12640
+ });
12641
+ },
12642
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12643
+ value: "1",
12644
+ children: "✓ 是"
12645
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12646
+ value: "0",
12647
+ children: "✗ 否"
12648
+ })]
12649
+ }),
12650
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12651
+ className: panel_module_css_default.meta,
12652
+ children: tt("settings.autoAuthorReviewHint")
12653
+ })
12654
+ ]
12655
+ }),
12656
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12657
+ className: panel_module_css_default.field,
12658
+ style: { flex: 1 },
12659
+ children: [
12660
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
12661
+ className: panel_module_css_default.fieldLabel,
12662
+ children: tt("settings.autoReviewAfterRevise")
12663
+ }),
12664
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
12665
+ className: panel_module_css_default.input,
12666
+ value: configDraft.autoReviewAfterRevise ? "1" : "0",
12667
+ onChange: (e) => {
12668
+ setConfigDraft({
12669
+ ...configDraft,
12670
+ autoReviewAfterRevise: e.target.value === "1"
12671
+ });
12672
+ },
12673
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12674
+ value: "1",
12675
+ children: "✓ 是"
12676
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
12677
+ value: "0",
12678
+ children: "✗ 否"
12679
+ })]
12680
+ }),
12681
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12682
+ className: panel_module_css_default.meta,
12683
+ children: tt("settings.autoReviewAfterReviseHint")
12684
+ })
12685
+ ]
12686
+ })
12687
+ ]
12688
+ })
12689
+ ]
12690
+ }),
12691
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12692
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
12693
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11277
12694
  className: panel_module_css_default.row,
11278
- children: [
11279
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11280
- type: "button",
11281
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
11282
- disabled: busy,
11283
- onClick: () => {
11284
- handleSaveConfig();
11285
- },
11286
- children: tt("settings.save")
11287
- }),
11288
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11289
- type: "button",
11290
- className: panel_module_css_default.button,
11291
- onClick: () => {
11292
- api.openFolder();
11293
- },
11294
- children: tt("settings.openFolder")
11295
- }),
11296
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
11297
- className: panel_module_css_default.meta,
11298
- children: [
11299
- "当前:",
11300
- config?.provider,
11301
- " / ",
11302
- config?.model,
11303
- " · ",
11304
- config?.outputDir
11305
- ]
11306
- })
11307
- ]
11308
- }),
11309
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12695
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12696
+ type: "button",
12697
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
12698
+ disabled: busy,
12699
+ onClick: () => {
12700
+ handleSaveConfig();
12701
+ },
12702
+ children: tt("settings.save")
12703
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
12704
+ className: panel_module_css_default.meta,
12705
+ children: [
12706
+ "当前:",
12707
+ config?.provider,
12708
+ " / ",
12709
+ config?.model,
12710
+ " · ",
12711
+ config?.outputDir
12712
+ ]
12713
+ })]
12714
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11310
12715
  className: panel_module_css_default.row,
11311
12716
  children: [
11312
12717
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -11332,11 +12737,11 @@ window.__ModuleLoader__.load({
11332
12737
  children: tt("settings.exportMd")
11333
12738
  })
11334
12739
  ]
11335
- })
11336
- ]
11337
- }),
12740
+ })]
12741
+ })
12742
+ ] }),
11338
12743
  activeTab === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11339
- className: panel_module_css_default.card,
12744
+ className: `${panel_module_css_default.card} ${panel_module_css_default.settingsCard}`,
11340
12745
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11341
12746
  className: panel_module_css_default.cardTitle,
11342
12747
  children: tt("settings.theme")
@@ -12217,6 +13622,13 @@ window.__ModuleLoader__.load({
12217
13622
  api,
12218
13623
  totalChapters: chapters.length
12219
13624
  }),
13625
+ activeTab === "styleLib" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyleGallery, {}),
13626
+ activeTab === "manhua" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MangaWorkspace, {
13627
+ api,
13628
+ project,
13629
+ chapters,
13630
+ onProjectChanged: () => refresh(false)
13631
+ }),
12220
13632
  activeTab === "breakdown" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12221
13633
  className: panel_module_css_default.card,
12222
13634
  children: [
@@ -13025,9 +14437,12 @@ window.__ModuleLoader__.load({
13025
14437
  setBusyLabel(`精修「${detailRole.name}」提示词…`);
13026
14438
  setError("");
13027
14439
  try {
14440
+ const activePlan = (project?.mangaPlans ?? []).find((pl) => pl.active);
13028
14441
  await api.roles({
13029
14442
  op: "promptKit",
13030
- name: detailRole.name
14443
+ name: detailRole.name,
14444
+ styleId: activePlan?.styleId,
14445
+ filterId: activePlan?.filterId
13031
14446
  });
13032
14447
  await refresh(false);
13033
14448
  pushProgress(`已生成「${detailRole.name}」四类精修提示词`, "done");