@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.
- package/assets/styles/arcane-thick-3d.webp +0 -0
- package/assets/styles/chinese-ink.webp +0 -0
- package/assets/styles/clay-stopmotion-3d.webp +0 -0
- package/assets/styles/dark-ghibli.webp +0 -0
- package/assets/styles/dark-gothic-3d.webp +0 -0
- package/assets/styles/film-photo.webp +0 -0
- package/assets/styles/guofeng-heavy.webp +0 -0
- package/assets/styles/horror-game-3d.webp +0 -0
- package/assets/styles/japan-cel-dark.webp +0 -0
- package/assets/styles/korean-webtoon.webp +0 -0
- package/assets/styles/low-cyberpunk-3d.webp +0 -0
- package/assets/styles/nextgen-cg.webp +0 -0
- package/assets/styles/noir-film.webp +0 -0
- package/assets/styles/openworld-survival.webp +0 -0
- package/assets/styles/paper-cut-3d.webp +0 -0
- package/assets/styles/pixar-adult-3d.webp +0 -0
- package/assets/styles/pop-marvel-2d.webp +0 -0
- package/assets/styles/shinkai-anime.webp +0 -0
- package/assets/styles/tactical-stealth.webp +0 -0
- package/assets/styles/vaporwave-3d.webp +0 -0
- package/assets/styles/vhs90.webp +0 -0
- package/lib/client.js +2073 -658
- package/lib/client.js.map +1 -1
- package/lib/index.js +919 -64
- package/lib/index.js.map +1 -1
- package/lib/types/client/api.d.ts +15 -1
- package/lib/types/client/locales.d.ts +4 -2
- package/lib/types/client/panel/MangaWorkspace.d.ts +9 -0
- package/lib/types/client/panel/NovelPanel.d.ts +1 -1
- package/lib/types/client/panel/StoryboardTab.d.ts +13 -0
- package/lib/types/client/panel/StyleGallery.d.ts +1 -0
- package/lib/types/engine.d.ts +46 -4
- package/lib/types/index.d.ts +2 -0
- package/lib/types/protocol.d.ts +194 -3
- package/lib/types/style-library.d.ts +33 -0
- package/package.json +2 -1
- package/src/client/api.ts +36 -1
- package/src/client/locales.ts +7 -3
- package/src/client/panel/ImportModal.tsx +123 -21
- package/src/client/panel/MangaWorkspace.tsx +185 -0
- package/src/client/panel/NovelPanel.tsx +239 -150
- package/src/client/panel/StoryboardTab.tsx +287 -0
- package/src/client/panel/StyleGallery.tsx +109 -0
- package/src/client/panel/panel.module.css +77 -0
- package/src/engine.ts +457 -39
- package/src/index.ts +6 -0
- package/src/protocol.ts +200 -3
- package/src/routes.ts +280 -13
- 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": "
|
|
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": "
|
|
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
|
-
"
|
|
929
|
-
"
|
|
930
|
-
"progressBarFill": "zE6uZW_progressBarFill",
|
|
931
|
-
"card": "zE6uZW_card",
|
|
989
|
+
"navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
|
|
990
|
+
"entryIcon": "zE6uZW_entryIcon",
|
|
932
991
|
"panelNavCollapsed": "zE6uZW_panelNavCollapsed",
|
|
933
|
-
"
|
|
934
|
-
"
|
|
935
|
-
"
|
|
936
|
-
"
|
|
937
|
-
"
|
|
938
|
-
"
|
|
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
|
-
"
|
|
941
|
-
"
|
|
942
|
-
"
|
|
943
|
-
"
|
|
944
|
-
"
|
|
945
|
-
"
|
|
946
|
-
"
|
|
947
|
-
"
|
|
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
|
-
"
|
|
951
|
-
"
|
|
952
|
-
"
|
|
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
|
-
"
|
|
955
|
-
"
|
|
956
|
-
"
|
|
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
|
-
"
|
|
961
|
-
"
|
|
962
|
-
"
|
|
963
|
-
"
|
|
964
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
988
|
-
"
|
|
989
|
-
"
|
|
990
|
-
"
|
|
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
|
-
"
|
|
1005
|
-
"
|
|
1006
|
-
"
|
|
1007
|
-
"
|
|
1008
|
-
"
|
|
1009
|
-
"
|
|
1010
|
-
"
|
|
1011
|
-
"
|
|
1012
|
-
"
|
|
1013
|
-
"
|
|
1014
|
-
"
|
|
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
|
-
"
|
|
1018
|
-
"
|
|
1019
|
-
"
|
|
1020
|
-
"
|
|
1174
|
+
"cardTitle": "zE6uZW_cardTitle",
|
|
1175
|
+
"navTabLabel": "zE6uZW_navTabLabel",
|
|
1176
|
+
"dashGrid": "zE6uZW_dashGrid",
|
|
1177
|
+
"bookCardActive": "zE6uZW_bookCardActive",
|
|
1021
1178
|
"bigProgressBar": "zE6uZW_bigProgressBar",
|
|
1022
|
-
"
|
|
1023
|
-
"
|
|
1024
|
-
"
|
|
1025
|
-
"
|
|
1026
|
-
"
|
|
1027
|
-
"
|
|
1028
|
-
"
|
|
1029
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1057
|
-
"
|
|
1058
|
-
"
|
|
1059
|
-
"
|
|
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
|
-
"
|
|
1062
|
-
"
|
|
1063
|
-
"
|
|
1064
|
-
"
|
|
1065
|
-
"
|
|
1066
|
-
"
|
|
1067
|
-
"
|
|
1068
|
-
"
|
|
1069
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1078
|
-
"
|
|
1079
|
-
"
|
|
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
|
-
"
|
|
1110
|
-
"
|
|
1111
|
-
"
|
|
1112
|
-
"
|
|
1113
|
-
"
|
|
1114
|
-
"
|
|
1115
|
-
"
|
|
1116
|
-
"
|
|
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
|
-
"
|
|
1128
|
-
"
|
|
1129
|
-
"
|
|
1130
|
-
"
|
|
1131
|
-
"
|
|
1132
|
-
"
|
|
1133
|
-
"
|
|
1134
|
-
"
|
|
1135
|
-
"
|
|
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
|
-
"
|
|
1147
|
-
"
|
|
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
|
-
"
|
|
1257
|
+
"diffSameBody": "zE6uZW_diffSameBody",
|
|
1258
|
+
"dashStage": "zE6uZW_dashStage",
|
|
1259
|
+
"shelfEmpty": "zE6uZW_shelfEmpty",
|
|
1260
|
+
"diffColumn": "zE6uZW_diffColumn",
|
|
1197
1261
|
"assistantResize": "zE6uZW_assistantResize",
|
|
1198
|
-
"
|
|
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
|
-
"
|
|
1201
|
-
"
|
|
1202
|
-
"
|
|
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
|
-
|
|
4701
|
+
/** 选择文件 → 读取内容 → 调服务器预览拆章。 */
|
|
4702
|
+
const onPickFile = async (file) => {
|
|
4703
|
+
if (file === void 0) return;
|
|
4629
4704
|
setError("");
|
|
4630
4705
|
setResult(null);
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
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
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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: "
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
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
|
|
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.
|
|
6081
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
|
|
6082
|
+
disabled: busy,
|
|
5110
6083
|
onClick: () => {
|
|
5111
|
-
|
|
5112
|
-
name: "",
|
|
5113
|
-
kind: "宗门",
|
|
5114
|
-
description: ""
|
|
5115
|
-
}]);
|
|
6084
|
+
setShowCreate(!showCreate);
|
|
5116
6085
|
},
|
|
5117
|
-
children: "+
|
|
6086
|
+
children: showCreate ? "收起" : "+ 新建方案"
|
|
5118
6087
|
})]
|
|
5119
|
-
}),
|
|
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:
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
5133
|
-
|
|
5134
|
-
|
|
5135
|
-
|
|
5136
|
-
|
|
5137
|
-
|
|
5138
|
-
|
|
5139
|
-
|
|
5140
|
-
|
|
5141
|
-
|
|
5142
|
-
|
|
5143
|
-
|
|
5144
|
-
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
|
|
5148
|
-
|
|
5149
|
-
|
|
5150
|
-
|
|
5151
|
-
|
|
5152
|
-
|
|
5153
|
-
|
|
5154
|
-
|
|
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.
|
|
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: [
|
|
9480
|
-
|
|
9481
|
-
|
|
9482
|
-
|
|
9483
|
-
|
|
9484
|
-
|
|
9485
|
-
|
|
9486
|
-
|
|
9487
|
-
|
|
9488
|
-
|
|
9489
|
-
|
|
9490
|
-
|
|
9491
|
-
|
|
9492
|
-
|
|
9493
|
-
|
|
9494
|
-
|
|
9495
|
-
|
|
9496
|
-
|
|
9497
|
-
|
|
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)("
|
|
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)(
|
|
10882
|
-
|
|
10883
|
-
|
|
10884
|
-
|
|
10885
|
-
|
|
10886
|
-
|
|
10887
|
-
|
|
10888
|
-
|
|
10889
|
-
|
|
10890
|
-
|
|
10891
|
-
|
|
10892
|
-
|
|
10893
|
-
|
|
10894
|
-
|
|
10895
|
-
|
|
10896
|
-
|
|
10897
|
-
|
|
10898
|
-
|
|
10899
|
-
|
|
10900
|
-
|
|
10901
|
-
|
|
10902
|
-
|
|
10903
|
-
|
|
10904
|
-
|
|
10905
|
-
|
|
10906
|
-
|
|
10907
|
-
|
|
10908
|
-
|
|
10909
|
-
|
|
10910
|
-
|
|
10911
|
-
|
|
10912
|
-
|
|
10913
|
-
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
|
|
10923
|
-
|
|
10924
|
-
|
|
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
|
-
|
|
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.
|
|
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:
|
|
12384
|
+
value: configDraft.analysisReasoning ?? "low",
|
|
11164
12385
|
onChange: (e) => {
|
|
11165
|
-
|
|
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:
|
|
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.
|
|
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:
|
|
11194
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
12437
|
+
children: "豆包生图模型"
|
|
12438
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
11195
12439
|
className: panel_module_css_default.input,
|
|
11196
|
-
|
|
12440
|
+
placeholder: "doubao-seedream-5-0-pro-260628",
|
|
12441
|
+
value: configDraft.imageApiModel ?? "",
|
|
11197
12442
|
onChange: (e) => {
|
|
11198
12443
|
setConfigDraft({
|
|
11199
12444
|
...configDraft,
|
|
11200
|
-
|
|
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:
|
|
12456
|
+
children: "启用豆包生图"
|
|
11219
12457
|
}),
|
|
11220
12458
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11221
12459
|
className: panel_module_css_default.input,
|
|
11222
|
-
value: configDraft.
|
|
12460
|
+
value: configDraft.imageApiEnabled ? "1" : "0",
|
|
11223
12461
|
onChange: (e) => {
|
|
11224
12462
|
setConfigDraft({
|
|
11225
12463
|
...configDraft,
|
|
11226
|
-
|
|
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:
|
|
12477
|
+
children: "开启后角色详情显示「豆包生成」参考图按钮"
|
|
11240
12478
|
})
|
|
11241
12479
|
]
|
|
11242
|
-
})
|
|
11243
|
-
|
|
11244
|
-
|
|
11245
|
-
|
|
11246
|
-
|
|
11247
|
-
|
|
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.
|
|
11250
|
-
}),
|
|
11251
|
-
|
|
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.
|
|
12609
|
+
value: configDraft.autoReview ? "1" : "0",
|
|
11254
12610
|
onChange: (e) => {
|
|
11255
12611
|
setConfigDraft({
|
|
11256
12612
|
...configDraft,
|
|
11257
|
-
|
|
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
|
-
|
|
11269
|
-
|
|
11270
|
-
|
|
11271
|
-
}
|
|
11272
|
-
|
|
11273
|
-
|
|
11274
|
-
|
|
11275
|
-
|
|
11276
|
-
|
|
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
|
-
|
|
11280
|
-
|
|
11281
|
-
|
|
11282
|
-
|
|
11283
|
-
|
|
11284
|
-
|
|
11285
|
-
|
|
11286
|
-
|
|
11287
|
-
|
|
11288
|
-
|
|
11289
|
-
|
|
11290
|
-
|
|
11291
|
-
|
|
11292
|
-
|
|
11293
|
-
|
|
11294
|
-
|
|
11295
|
-
|
|
11296
|
-
|
|
11297
|
-
|
|
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");
|