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