@waterwx/dsh-novel-forge 1.1.9 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +1874 -1267
- package/lib/client.js.map +1 -1
- package/lib/index.js +59 -8
- package/lib/index.js.map +1 -1
- package/lib/types/client/locales.d.ts +8 -0
- package/lib/types/client/panel/NovelPanel.d.ts +1 -1
- package/lib/types/engine.d.ts +1 -1
- package/lib/types/index.d.ts +2 -0
- package/lib/types/protocol.d.ts +25 -0
- package/package.json +1 -1
- package/src/client/locales.ts +16 -0
- package/src/client/panel/AssetsTab.tsx +19 -0
- package/src/client/panel/NovelPanel.tsx +522 -225
- package/src/client/panel/ShelfView.tsx +13 -12
- package/src/client/panel/panel.module.css +192 -68
- package/src/engine.ts +9 -1
- package/src/index.ts +6 -0
- package/src/protocol.ts +26 -0
- package/src/routes.ts +31 -4
package/lib/client.js
CHANGED
|
@@ -615,6 +615,14 @@ window.__ModuleLoader__.load({
|
|
|
615
615
|
"settings.outputDir": "输出目录",
|
|
616
616
|
"settings.provider": "模型提供商",
|
|
617
617
|
"settings.model": "模型",
|
|
618
|
+
"settings.modelCustom": "自定义…",
|
|
619
|
+
"settings.modelCustomPlaceholder": "输入任意模型 id",
|
|
620
|
+
"settings.reasoningEffort": "思考强度 (reasoningEffort)",
|
|
621
|
+
"settings.reasoning.off": "off · 关闭思考(推荐日常写文)",
|
|
622
|
+
"settings.reasoning.low": "low · 低思考",
|
|
623
|
+
"settings.reasoning.high": "high · 高思考",
|
|
624
|
+
"settings.reasoning.max": "max · 最高思考(质检/推演)",
|
|
625
|
+
"settings.reasoningHint": "off 最快最省;high/max 更慢更贵但推理更强",
|
|
618
626
|
"settings.theme": "主题",
|
|
619
627
|
"settings.themeLiquid": "iOS 液态玻璃(绿)",
|
|
620
628
|
"settings.themeClassic": "经典毛玻璃(蓝)",
|
|
@@ -757,6 +765,14 @@ window.__ModuleLoader__.load({
|
|
|
757
765
|
"settings.outputDir": "Output directory",
|
|
758
766
|
"settings.provider": "Provider",
|
|
759
767
|
"settings.model": "Model",
|
|
768
|
+
"settings.modelCustom": "Custom…",
|
|
769
|
+
"settings.modelCustomPlaceholder": "Type any model id",
|
|
770
|
+
"settings.reasoningEffort": "Reasoning effort",
|
|
771
|
+
"settings.reasoning.off": "off · no thinking (recommended)",
|
|
772
|
+
"settings.reasoning.low": "low",
|
|
773
|
+
"settings.reasoning.high": "high",
|
|
774
|
+
"settings.reasoning.max": "max (audit/reasoning)",
|
|
775
|
+
"settings.reasoningHint": "off is fastest/cheapest; high/max are slower and stronger",
|
|
760
776
|
"settings.theme": "Theme",
|
|
761
777
|
"settings.themeLiquid": "iOS Liquid Glass (green)",
|
|
762
778
|
"settings.themeClassic": "Classic frosted (blue)",
|
|
@@ -892,7 +908,7 @@ window.__ModuleLoader__.load({
|
|
|
892
908
|
}
|
|
893
909
|
//#endregion
|
|
894
910
|
//#region \0dsh-css:D:\ryan work\harness\plugins\novel-forge\src\client\panel\panel.module.css.mjs
|
|
895
|
-
const css = ".zE6uZW_entry{width:100%;color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:13px;transition:background .15s;display:flex}body[data-ds-dark-theme] .zE6uZW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.zE6uZW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.zE6uZW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.zE6uZW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.zE6uZW_view{z-index:60;color-scheme:light;--nf-font:-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;--nf-font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#00b85c;--nf-accent-hover:#00a04e;--nf-accent-soft:#00b85c1f;--nf-accent-fg:#fff;--nf-hover:#0000000d;--nf-success:#34c759;--nf-error:#ff3b30;--nf-warn:#ff9500;--nf-info:#00b85c;--nf-shadow:0 1px 3px #0000000f, 0 12px 32px #00000014;--nf-shadow-lg:0 4px 12px #00000012, 0 20px 48px #0000001f;--nf-card-shadow:0 2px 6px #0000000f, 0 14px 38px #00000024;--nf-card-shadow-hover:0 4px 10px #00000014, 0 22px 52px #0003;--nf-glass-face:linear-gradient(180deg, #f6f7f9 0%, #f0f2f5 26%, #e9ebef 52%, #e0e3e8 78%, #d6d9df 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff80 0%, #ffffff38 45%, #fff0 78%);--nf-glass-sheen:#ffffff8c;--nf-glass-border:#ffffffa6;--nf-glass-inset:#ffffff8c;--nf-glass-orb-a:#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] .zE6uZW_view{color-scheme:dark;--nf-bg:#0a0b0ddb;--nf-bg-raise:#1c1c1ec7;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff47;--nf-text:#f2f2f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b8;--nf-text-3:#8e8e93;--nf-accent:#35d07a;--nf-accent-hover:#5ce695;--nf-accent-soft:#35d07a33;--nf-accent-fg:#062b18;--nf-hover:#ffffff17;--nf-success:#30d158;--nf-error:#ff453a;--nf-warn:#ff9f0a;--nf-info:#35d07a;--nf-shadow:0 1px 2px #00000059, 0 10px 30px #0006;--nf-shadow-lg:0 4px 12px #0006, 0 20px 48px #0000008c;--nf-card-shadow:0 2px 6px #00000059, 0 14px 38px #00000073;--nf-card-shadow-hover:0 4px 10px #0006, 0 22px 52px #0000008c;--nf-glass-face:linear-gradient(180deg, #70747a6b 0%, #60646a6b 26%, #52555a6b 52%, #44474c6b 78%, #383a3f6b 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff42 0%, #ffffff1a 45%, #fff0 78%);--nf-glass-sheen:#ffffff42;--nf-glass-border:#ffffff24;--nf-glass-inset:#ffffff12;--nf-glass-orb-a:#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]) .zE6uZW_view{display:block}.zE6uZW_panel[data-nf-theme=classic]{--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-info:#5856d6;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=classic]{--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-info:#bf5af2;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph]{--nf-bg:#e4e9f2;--nf-bg-raise:#e4e9f2;--nf-bg-inset:#d9dfe8;--nf-border:#8c9baf59;--nf-border-strong:#78879e80;--nf-text:#3a4250;--nf-text-2:#5b6472;--nf-text-2-alpha:#465060b3;--nf-text-3:#8b94a3;--nf-hover:#5a697d14;--nf-shadow:4px 4px 10px #a3b1c68c, -4px -4px 10px #ffffffd9;--nf-shadow-lg:6px 6px 14px #a3b1c699, -6px -6px 14px #ffffffe6;--nf-card-shadow:9px 9px 18px #a3b1c68c, -9px -9px 18px #ffffffd9;--nf-card-shadow-hover:12px 12px 24px #a3b1c6a6, -12px -12px 24px #fffffff2;--nf-glass-face:#e4e9f2;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#a3b1c666;--nf-glass-inset:#d9dfe8;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph]{--nf-bg:#2b2f36;--nf-bg-raise:#2b2f36;--nf-bg-inset:#25292f;--nf-border:#0a0c1080;--nf-border-strong:#080a0e99;--nf-text:#d6dae1;--nf-text-2:#a8aeb8;--nf-text-2-alpha:#a8aeb8b3;--nf-text-3:#757c88;--nf-hover:#ffffff0d;--nf-shadow:4px 4px 10px #00000080, -4px -4px 10px #6068763d;--nf-shadow-lg:6px 6px 14px #0000008c, -6px -6px 14px #60687642;--nf-card-shadow:9px 9px 18px #00000080, -9px -9px 18px #6068763d;--nf-card-shadow-hover:12px 12px 24px #0009, -12px -12px 24px #60687647;--nf-glass-face:#2b2f36;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#0c0e1273;--nf-glass-inset:#25292f;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #a3b1c680, inset -2px -2px 6px #ffffffd9, 0 0 0 3px var(--nf-accent-soft)}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #00000080, inset -2px -2px 6px #60687638, 0 0 0 3px var(--nf-accent-soft)}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #a3b1c68c,-5px -5px 10px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #a3b1c699,-7px -7px 14px #fffffff2}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#00c563,#00a952);box-shadow:5px 5px 10px #a3b1c699,-5px -5px 10px #ffffffd9}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #0000008c,-7px -7px 14px #60687642}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#3ddc86,#27b96a);box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}.zE6uZW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_panel:before{content:\"\";z-index:0;pointer-events:none;background:radial-gradient(46% 36% at 18% 12%, var(--nf-glass-orb-a), transparent 70%), radial-gradient(52% 42% at 88% 22%, var(--nf-glass-orb-b), transparent 72%), radial-gradient(120% 95% at 50% 42%, transparent 55%, #0202031a 100%);position:absolute;inset:0}.zE6uZW_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%);border-radius:18px;flex-shrink:0;justify-content:space-between;align-items:center;margin:10px 12px 0;padding:10px 16px;display:flex}.zE6uZW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.zE6uZW_iconButton{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px;padding:4px 9px;font-size:16px;transition:background .15s,color .15s}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.zE6uZW_tabBar{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;gap:2px;padding:8px 14px 0;display:flex;position:sticky;top:45px}.zE6uZW_tab{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px 8px 0 0;padding:7px 13px;font-size:13.5px;font-weight:500;transition:color .15s,background .15s;position:relative}.zE6uZW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_tab[data-active]{color:var(--nf-accent);font-weight:600}.zE6uZW_tab[data-active]:after{content:\"\";background:var(--nf-accent);border-radius:2px 2px 0 0;height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.zE6uZW_panelContent{z-index:1;flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);width: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}.zE6uZW_panelNavCollapsed{width:52px;padding:10px 6px}.zE6uZW_navGroup{flex-direction:column;gap:4px;display:flex}.zE6uZW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:8px 10px 3px;font-size:10.5px;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.zE6uZW_navAboutRow{cursor:pointer;color:var(--nf-text-3);text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:8px;justify-content:space-between;align-items:center;gap:4px;padding:4px 6px;font-size:11px;transition:color .15s,background .15s;display:flex}.zE6uZW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navAboutUpdate{background:var(--nf-accent-soft);color:var(--nf-accent);cursor:pointer;text-align:left;white-space:nowrap;border:none;border-radius:8px;padding:4px 6px;font-size:10.5px;font-weight:600}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{align-items:center;padding:6px 2px 2px}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.zE6uZW_navTabBadge{background:var(--nf-accent);color:#fff;text-align:center;border-radius:999px;flex:none;min-width:18px;height:18px;margin-left:auto;padding:0 5px;font-size:10.5px;font-weight:700;line-height:18px;display:inline-block}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.zE6uZW_navTabBadgeDanger{background:var(--nf-error)}.zE6uZW_navTabBadgeWarn{background:var(--nf-warn)}.zE6uZW_navTabBadgeDone{background:var(--nf-success)}.zE6uZW_navTabBadgeLive{background:var(--nf-success);animation:1.2s ease-in-out infinite zE6uZW_navBadgePulse}@keyframes zE6uZW_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.zE6uZW_navTab{cursor:pointer;width:100%;color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border: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}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{justify-content:center;padding:8px 0}.zE6uZW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navTab[data-active]{color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_navTab[data-active]:before{content:\"\";background:var(--nf-accent);border-radius:999px;width:3px;position:absolute;top:20%;bottom:20%;left:-8px}.zE6uZW_panelNavCollapsed .zE6uZW_navTab[data-active]:before{left:-6px}.zE6uZW_navTabIcon{flex:none;font-size:15px;line-height:1}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_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}.zE6uZW_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}.zE6uZW_headerProgress b{color:var(--nf-accent);font-weight:700}.zE6uZW_headerProgressDot{background:var(--nf-border-strong,var(--nf-text-3));border-radius:50%;width:3px;height:3px;display:inline-block}.zE6uZW_card{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:10px;padding:16px 18px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.zE6uZW_card:before{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.zE6uZW_card:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_card:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.zE6uZW_button{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);cursor:pointer;white-space:nowrap;border-radius:12px;padding:6px 14px;font-size:13px;font-weight:500;transition:background .15s,border-color .15s,transform .1s,box-shadow .15s}.zE6uZW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_button:active:not([disabled]){transform:scale(.96)}.zE6uZW_button[disabled]{opacity:.45;cursor:not-allowed}.zE6uZW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 88%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 2px 10px color-mix(in srgb, var(--nf-accent) 45%, transparent), 0 0 0 .5px color-mix(in srgb, var(--nf-accent) 30%, transparent);border-color:#0000}.zE6uZW_buttonPrimary:hover:not([disabled]){background:linear-gradient(180deg, var(--nf-accent-hover), color-mix(in srgb, var(--nf-accent-hover) 85%, #000));border-color:#0000}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.zE6uZW_field{flex-direction:column;gap:5px;display:flex}.zE6uZW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.zE6uZW_input{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;border-radius:12px;width:100%;padding:7px 11px;font-size:13px;transition:border-color .15s,box-shadow .15s}.zE6uZW_input:focus,.zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.zE6uZW_input::placeholder,.zE6uZW_textarea::placeholder{color:var(--nf-text-3)}.zE6uZW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;resize:vertical;border-radius:12px;width:100%;min-height:200px;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.7;transition:border-color .15s,box-shadow .15s}.zE6uZW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{flex-direction:column;gap:8px;display:flex}.zE6uZW_volumeGroup{flex-direction:column;gap:6px;display:flex}.zE6uZW_volumeGroupHeader{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:13px;transition:border-color .15s;display:flex}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_chapter{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:10px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .15s,box-shadow .15s,transform .1s;display:flex}.zE6uZW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.zE6uZW_chapterFocus{animation:.9s ease-in-out 3 zE6uZW_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes zE6uZW_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.zE6uZW_chapterNum{background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:28px;height:28px;color:var(--nf-text-2);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0 8px;font-size:12px;font-weight:700;display:inline-flex}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.zE6uZW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.zE6uZW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.zE6uZW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.zE6uZW_badgeGenerating{color:var(--nf-accent);border-color:var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 12%, transparent);animation:1.2s ease-in-out infinite zE6uZW_pulse}.zE6uZW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.zE6uZW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.zE6uZW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_reviewBox{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-size:12.5px;display:flex}.zE6uZW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;margin:0;padding:10px 12px;font-family:inherit;font-size:12.5px;line-height:1.8;overflow:auto}.zE6uZW_chatScroll{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex-direction:column;flex:1;gap:10px;min-height:240px;max-height:480px;padding:14px;display:flex;overflow-y:auto}.zE6uZW_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:90%;color:var(--nf-accent-fg);border-radius:14px 14px 4px;align-self:flex-end;padding:9px 14px;font-size:13px;box-shadow:0 2px 6px #4d6bfe33}.zE6uZW_chatBubbleAssistant{background:var(--nf-bg-raise);max-width:92%;color:var(--nf-text);border:1px solid var(--nf-border);box-shadow:var(--nf-shadow);border-radius:14px 14px 14px 4px;align-self:flex-start;padding:9px 14px;font-size:13px}.zE6uZW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.zE6uZW_toolLive{background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);border-radius:8px;max-height:180px;margin-top:6px;padding:8px 10px;font-size:12px;line-height:1.7;overflow-y:auto}.zE6uZW_assistantStatus{color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:999px;flex:none;align-items:center;gap:6px;margin-top:6px;padding:6px 12px;font-size:12px;display:flex}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.zE6uZW_toolStep{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:8px;padding:5px 10px;font-size:12px;display:flex}.zE6uZW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.zE6uZW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_toolStepIcon{flex:none;font-size:13px}.zE6uZW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.zE6uZW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.zE6uZW_progress{border:1px solid var(--nf-border);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);font-size:12px;font-family:var(--nf-font-mono);background:var(--nf-bg-inset);border-radius:10px;padding:10px 14px;line-height:1.8;overflow:auto}.zE6uZW_progressLine{color:var(--nf-text-2);opacity:.9}.zE6uZW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.zE6uZW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.zE6uZW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.zE6uZW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.zE6uZW_bigProgressBarFill{background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.zE6uZW_diffList{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;flex:1;gap:8px;min-height:0;padding:10px 12px;font-size:13px;line-height:1.7;display:flex;overflow-y:auto}.zE6uZW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.zE6uZW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.zE6uZW_diffTagOld{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-error) 45%, transparent)}.zE6uZW_diffTagNew{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-success) 45%, transparent)}.zE6uZW_diffOld{color:var(--nf-error);white-space:pre-wrap;text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 55%, transparent)}.zE6uZW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.zE6uZW_diffDel{border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.zE6uZW_diffAdd{border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.zE6uZW_diffText{white-space:pre-wrap}.zE6uZW_diffDel .zE6uZW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.zE6uZW_diffAdd .zE6uZW_diffText{color:var(--nf-success)}.zE6uZW_wsPage{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex}.zE6uZW_wsPageHeader{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.zE6uZW_wsAppliedBanner{border:1px solid var(--nf-success);background:color-mix(in srgb, var(--nf-success) 8%, transparent);border-radius:10px;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.zE6uZW_wsColumns{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;min-height:0;display:grid}.zE6uZW_wsColumn{flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);white-space:pre-wrap;flex:1;font-size:13px;line-height:1.75}.zE6uZW_wsSelected{border:1px solid var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);border-radius:6px;max-height:120px;padding:6px 10px;overflow:auto}.zE6uZW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.zE6uZW_wsPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;gap:8px;padding:8px 10px;display:flex}.zE6uZW_wsPreviewText{white-space:pre-wrap;min-height:0;color:var(--nf-text);flex:1;margin:0;font-size:13px;line-height:1.7;overflow:auto}.zE6uZW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);border-radius:14px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.zE6uZW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.zE6uZW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_dashHero{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:14px;padding:18px 20px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.zE6uZW_dashHero:before{content:\"\";border-radius:inherit;pointer-events:none;background:radial-gradient(46% 40% at 92% -10%, color-mix(in srgb, var(--nf-accent) 13%, transparent), transparent 62%), var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.zE6uZW_dashHero:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_dashHero:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_dashHero>*{z-index:1;position:relative}.zE6uZW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:14px}.zE6uZW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.zE6uZW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.zE6uZW_dashHeroAction{border:1px solid var(--nf-glass-border);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);border-radius:14px;align-items:center;gap:12px;padding:10px 14px;display:flex}.zE6uZW_dashHeroArrow{background:var(--nf-accent);color:#fff;border-radius:50%;flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:inline-flex}.zE6uZW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:14px;font-weight:600}.zE6uZW_dashJourney{flex-direction:column;gap:6px;display:flex}.zE6uZW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.zE6uZW_dashStage{color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;align-items:center;gap:3px;font-size:11px;display:flex}.zE6uZW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:10px;display:inline-flex}.zE6uZW_dashStageDone{color:var(--nf-text-2)}.zE6uZW_dashStageDone .zE6uZW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.zE6uZW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.zE6uZW_dashStageCurrent .zE6uZW_dashStageDot{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 18%, transparent)}.zE6uZW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.zE6uZW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.zE6uZW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.zE6uZW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.zE6uZW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.zE6uZW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.zE6uZW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.zE6uZW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_outlineReadonly{border:1px solid var(--nf-border);background:var(--nf-bg-inset);white-space:pre-wrap;user-select:text;border-radius:12px;max-height:480px;margin:0;padding:12px 14px;font-size:12.5px;line-height:1.8;overflow:auto}.zE6uZW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.zE6uZW_assistantFloat{z-index:80;border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);border-radius:16px;flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.zE6uZW_assistantFloatHeader{cursor:grab;user-select:none;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px 8px 14px;font-size:13px;font-weight:600;display:flex}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.zE6uZW_assistantFloatBody>*{flex:1;min-width:0}.zE6uZW_assistantResize{cursor:nwse-resize;background:linear-gradient(135deg, transparent 0 55%, var(--nf-border-strong) 55% 62%, transparent 62%) no-repeat 4px 4px / 12px 12px;width:20px;height:20px;position:absolute;bottom:0;right:0}.zE6uZW_coverPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex:none;justify-content:center;align-items:center;width:150px;height:200px;display:flex;overflow:hidden}.zE6uZW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.zE6uZW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.zE6uZW_shelfHeader{flex-direction:column;gap:10px;display:flex}.zE6uZW_shelfTitleRow{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.zE6uZW_shelfToolbar{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfFilters{flex-wrap:wrap;gap:6px;display:flex}.zE6uZW_shelfEmpty{border:1px dashed var(--nf-border-strong);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;border-radius:16px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;padding:40px 20px;display:flex}.zE6uZW_shelfEmptyIcon{font-size:42px}.zE6uZW_shelfEmptyTitle{font-size:16px;font-weight:700}.zE6uZW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.zE6uZW_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;border-radius:16px;flex-direction:column;gap:8px;padding:12px;transition:border-color .15s,transform .1s,box-shadow .15s;display:flex}.zE6uZW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.zE6uZW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:12px;flex:none;justify-content:center;align-items:center;display:flex;overflow:hidden}.zE6uZW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_bookCardCoverFallback{background:radial-gradient(400px 200px at 80% -20%, color-mix(in srgb, var(--nf-accent) 25%, transparent), transparent 70%), linear-gradient(155deg, var(--nf-bg-inset), color-mix(in srgb, var(--nf-accent) 10%, var(--nf-bg-inset)));flex-direction:column;justify-content:center;align-items:center;gap:6px;width:100%;height:100%;display:flex}.zE6uZW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.zE6uZW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.zE6uZW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.zE6uZW_bookAddCard:hover{color:var(--nf-accent)}.zE6uZW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_createBookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);width:min(520px,100%);box-shadow:var(--nf-shadow-lg);border-radius:20px;flex-direction:column;align-self:center;gap:12px;padding:26px 28px;display:flex}.zE6uZW_createBookIcon{font-size:34px;line-height:1}.zE6uZW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.zE6uZW_ideaCard{border:1px dashed var(--nf-border-strong);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.zE6uZW_ideaToggle{color:var(--nf-accent);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:0;font-size:13px;font-weight:700;display:flex}.zE6uZW_ideaCandidate{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.zE6uZW_panelContent::-webkit-scrollbar,.zE6uZW_chatScroll::-webkit-scrollbar,.zE6uZW_chapterPreview::-webkit-scrollbar,.zE6uZW_progress::-webkit-scrollbar,.zE6uZW_toolLive::-webkit-scrollbar{width:8px;height:8px}.zE6uZW_panelContent::-webkit-scrollbar-thumb,.zE6uZW_chatScroll::-webkit-scrollbar-thumb,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb,.zE6uZW_progress::-webkit-scrollbar-thumb,.zE6uZW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.zE6uZW_panelContent::-webkit-scrollbar-thumb:hover,.zE6uZW_chatScroll::-webkit-scrollbar-thumb:hover,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb:hover,.zE6uZW_progress::-webkit-scrollbar-thumb:hover,.zE6uZW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.zE6uZW_workflowList{flex-direction:column;gap:0;display:flex}.zE6uZW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.zE6uZW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.zE6uZW_workflowRow:last-child:before{display:none}.zE6uZW_workflowDot{border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);width:28px;height:28px;color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:inline-flex}.zE6uZW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.zE6uZW_workflowDotActive{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);box-shadow:0 0 0 4px var(--nf-accent-soft)}.zE6uZW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.zE6uZW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.zE6uZW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes zE6uZW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes zE6uZW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.zE6uZW_card{animation:.2s zE6uZW_fadeIn}.zE6uZW_bookshelf{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(26px)saturate(175%);z-index:1;border-radius:16px;flex-wrap:wrap;flex-shrink:0;align-items:center;gap:10px;margin:10px 12px 0;padding:8px 14px;display:flex;position:relative}.zE6uZW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.zE6uZW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.zE6uZW_bookChip{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;border-radius:999px;align-items:center;gap:6px;max-width:220px;padding:4px 8px 4px 10px;font-size:12px;transition:border-color .15s,background .15s;display:flex}.zE6uZW_bookChip:hover{border-color:var(--nf-border-strong)}.zE6uZW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.zE6uZW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:0 2px;font-size:13px;line-height:1}.zE6uZW_bookChipRemove:hover{color:var(--nf-error)}.zE6uZW_bookAdd{border:1px dashed var(--nf-border-strong);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:999px;padding:4px 12px;font-size:12px;transition:border-color .15s,color .15s}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:6px;display:flex}.zE6uZW_dropzone{border:2px dashed var(--nf-border-strong);text-align:center;color:var(--nf-text-2);cursor:pointer;border-radius:10px;flex-direction:column;align-items:center;gap:6px;padding:18px 14px;font-size:13px;transition:border-color .15s,background .15s;display:flex}.zE6uZW_dropzone:hover,.zE6uZW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_dropzoneIcon{font-size:22px;line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:6px;margin-top:2px;display:flex}.zE6uZW_bookCardActions .zE6uZW_button{flex:1;justify-content:center}.zE6uZW_readerView{flex-direction:column;transition:background .2s,color .2s;display:flex;position:absolute;inset:0;overflow:hidden}.zE6uZW_readerHeader{border-bottom:1px solid;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;display:flex}.zE6uZW_readerTitle{font-size:14px;font-weight:700}.zE6uZW_readerSeg{border-radius:8px;align-items:center;gap:2px;display:flex;overflow:hidden}.zE6uZW_readerSegBtn{cursor:pointer;opacity:.75;background:0 0;border:none;border-radius:6px;padding:3px 8px;font-size:12px}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{scrollbar-width:thin;border-right:1px solid;flex-direction:column;flex:none;gap:10px;width:220px;min-width:220px;padding:8px 6px 24px;display:flex;overflow-y:auto}.zE6uZW_readerGroup{flex-direction:column;gap:1px;display:flex}.zE6uZW_readerGroupTitle{opacity:.9;cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px 4px;font-size:12px;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{text-align:center;flex:none;width:12px;font-size:10px}.zE6uZW_readerGroupCount{opacity:.6;flex:none;margin-left:auto;padding-right:2px;font-size:11px;font-weight:400}.zE6uZW_readerItem{text-align:left;cursor:pointer;opacity:.8;background:0 0;border:1px solid;border-radius:8px;align-items:center;gap:6px;min-width:0;padding:4px 8px;font-size:12px;transition:opacity .15s,background .15s;display:flex}.zE6uZW_readerItem:hover{opacity:1}.zE6uZW_readerItemActive{opacity:1;font-weight:700}.zE6uZW_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.zE6uZW_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.zE6uZW_readerItemBadge{flex:none;font-size:11px}.zE6uZW_readerMain{scrollbar-width:thin;flex:1;justify-content:center;min-height:0;padding:20px 16px 48px;display:flex;overflow-y:auto}.zE6uZW_readerArticle{flex-direction:column;gap:12px;width:100%;display:flex}.zE6uZW_readerChapterTitle{letter-spacing:1px;margin:0;font-size:24px;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:8px;font-size:12px;display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{border-top:1px dashed;justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{opacity:.7;align-self:center;padding:32px 0;font-size:13px}.zE6uZW_readerError{color:var(--nf-error)}";
|
|
911
|
+
const css = ".zE6uZW_entry{width:100%;color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;padding:8px 12px;font-size:13px;transition:background .15s;display:flex}body[data-ds-dark-theme] .zE6uZW_entry{color:var(--dsw-alias-label-primary,#ececf1)}.zE6uZW_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.zE6uZW_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.zE6uZW_entryIcon{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation]{position:relative}.zE6uZW_view{z-index:60;color-scheme:light;--nf-font:-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"SF Pro Text\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", \"Segoe UI\", Roboto, \"Helvetica Neue\", sans-serif;--nf-font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#00b85c;--nf-accent-hover:#00a04e;--nf-accent-soft:#00b85c1f;--nf-accent-fg:#fff;--nf-hover:#0000000d;--nf-success:#34c759;--nf-error:#ff3b30;--nf-warn:#ff9500;--nf-info:#00b85c;--nf-shadow:0 1px 3px #0000000f, 0 12px 32px #00000014;--nf-shadow-lg:0 4px 12px #00000012, 0 20px 48px #0000001f;--nf-card-shadow:0 2px 6px #0000000f, 0 14px 38px #00000024;--nf-card-shadow-hover:0 4px 10px #00000014, 0 22px 52px #0003;--nf-glass-face:linear-gradient(180deg, #f6f7f9 0%, #f0f2f5 26%, #e9ebef 52%, #e0e3e8 78%, #d6d9df 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff80 0%, #ffffff38 45%, #fff0 78%);--nf-glass-sheen:#ffffff8c;--nf-glass-border:#ffffffa6;--nf-glass-inset:#ffffff8c;--nf-glass-orb-a:#00b85c2e;--nf-glass-orb-b:#78a0ff21;--nf-glass-noise:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E\");background:var(--nf-bg);backdrop-filter:blur(32px)saturate(180%);color:var(--nf-text);font-family:-apple-system,BlinkMacSystemFont,SF Pro Display,SF Pro Text,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Segoe UI,Roboto,Helvetica Neue,sans-serif;display:none;position:absolute;inset:0;overflow:auto}body[data-ds-dark-theme] .zE6uZW_view{color-scheme:dark;--nf-bg:#0a0b0ddb;--nf-bg-raise:#1c1c1ec7;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff47;--nf-text:#f2f2f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b8;--nf-text-3:#8e8e93;--nf-accent:#35d07a;--nf-accent-hover:#5ce695;--nf-accent-soft:#35d07a33;--nf-accent-fg:#062b18;--nf-hover:#ffffff17;--nf-success:#30d158;--nf-error:#ff453a;--nf-warn:#ff9f0a;--nf-info:#35d07a;--nf-shadow:0 1px 2px #00000059, 0 10px 30px #0006;--nf-shadow-lg:0 4px 12px #0006, 0 20px 48px #0000008c;--nf-card-shadow:0 2px 6px #00000059, 0 14px 38px #00000073;--nf-card-shadow-hover:0 4px 10px #0006, 0 22px 52px #0000008c;--nf-glass-face:linear-gradient(180deg, #70747a6b 0%, #60646a6b 26%, #52555a6b 52%, #44474c6b 78%, #383a3f6b 100%);--nf-glass-core:radial-gradient(30% 24% at 36% 28%, #ffffff42 0%, #ffffff1a 45%, #fff0 78%);--nf-glass-sheen:#ffffff42;--nf-glass-border:#ffffff24;--nf-glass-inset:#ffffff12;--nf-glass-orb-a:#00ca5247;--nf-glass-orb-b:#bec8d71a;--nf-glass-noise:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E\")}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .zE6uZW_view{display:block}.zE6uZW_panel[data-nf-theme=classic]{--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-info:#5856d6;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=classic]{--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-info:#bf5af2;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:var(--nf-border);--nf-glass-inset:var(--nf-bg-inset);--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph]{--nf-bg:#e4e9f2;--nf-bg-raise:#e4e9f2;--nf-bg-inset:#d9dfe8;--nf-border:#8c9baf59;--nf-border-strong:#78879e80;--nf-text:#3a4250;--nf-text-2:#5b6472;--nf-text-2-alpha:#465060b3;--nf-text-3:#8b94a3;--nf-hover:#5a697d14;--nf-shadow:4px 4px 10px #a3b1c68c, -4px -4px 10px #ffffffd9;--nf-shadow-lg:6px 6px 14px #a3b1c699, -6px -6px 14px #ffffffe6;--nf-card-shadow:9px 9px 18px #a3b1c68c, -9px -9px 18px #ffffffd9;--nf-card-shadow-hover:12px 12px 24px #a3b1c6a6, -12px -12px 24px #fffffff2;--nf-glass-face:#e4e9f2;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#a3b1c666;--nf-glass-inset:#d9dfe8;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph]{--nf-bg:#2b2f36;--nf-bg-raise:#2b2f36;--nf-bg-inset:#25292f;--nf-border:#0a0c1080;--nf-border-strong:#080a0e99;--nf-text:#d6dae1;--nf-text-2:#a8aeb8;--nf-text-2-alpha:#a8aeb8b3;--nf-text-3:#757c88;--nf-hover:#ffffff0d;--nf-shadow:4px 4px 10px #00000080, -4px -4px 10px #6068763d;--nf-shadow-lg:6px 6px 14px #0000008c, -6px -6px 14px #60687642;--nf-card-shadow:9px 9px 18px #00000080, -9px -9px 18px #6068763d;--nf-card-shadow-hover:12px 12px 24px #0009, -12px -12px 24px #60687647;--nf-glass-face:#2b2f36;--nf-glass-core:transparent;--nf-glass-sheen:#fff0;--nf-glass-border:#0c0e1273;--nf-glass-inset:#25292f;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #a3b1c680, inset -2px -2px 6px #ffffffd9, 0 0 0 3px var(--nf-accent-soft)}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:#0000;box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input:focus,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:inset 2px 2px 6px #00000080, inset -2px -2px 6px #60687638, 0 0 0 3px var(--nf-accent-soft)}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #a3b1c68c,-5px -5px 10px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #a3b1c699,-7px -7px 14px #fffffff2}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #a3b1c68c,inset -3px -3px 7px #ffffffe6}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#00c563,#00a952);box-shadow:5px 5px 10px #a3b1c699,-5px -5px 10px #ffffffd9}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button{background:var(--nf-bg-raise);border-color:#0000;box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:hover:not([disabled]){background:var(--nf-bg-raise);border-color:#0000;box-shadow:7px 7px 14px #0000008c,-7px -7px 14px #60687642}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_button:active:not([disabled]){box-shadow:inset 3px 3px 7px #0000008c,inset -3px -3px 7px #6068763d}body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_buttonPrimary{background:linear-gradient(#3ddc86,#27b96a);box-shadow:5px 5px 10px #00000080,-5px -5px 10px #6068763d}.zE6uZW_panel{flex-direction:column;min-width:0;height:100%;font-size:14px;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_panel:before{content:\"\";z-index:0;pointer-events:none;background:radial-gradient(46% 36% at 18% 12%, var(--nf-glass-orb-a), transparent 70%), radial-gradient(52% 42% at 88% 22%, var(--nf-glass-orb-b), transparent 72%), radial-gradient(120% 95% at 50% 42%, transparent 55%, #0202031a 100%);position:absolute;inset:0}.zE6uZW_panelTitle{letter-spacing:.2px;align-items:center;gap:8px;margin:0;font-size:16px;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));border-radius:2px;width:4px;height:16px}.zE6uZW_iconButton{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px;padding:4px 9px;font-size:16px;transition:background .15s,color .15s}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text)}.zE6uZW_tabBar{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;gap:2px;padding:8px 14px 0;display:flex;position:sticky;top:45px}.zE6uZW_tab{cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:8px 8px 0 0;padding:7px 13px;font-size:13.5px;font-weight:500;transition:color .15s,background .15s;position:relative}.zE6uZW_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_tab[data-active]{color:var(--nf-accent);font-weight:600}.zE6uZW_tab[data-active]:after{content:\"\";background:var(--nf-accent);border-radius:2px 2px 0 0;height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.zE6uZW_panelContent{z-index:1;flex-direction:column;flex:1;gap:14px;padding:16px 18px 20px;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);width:200px;box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);border-radius:18px;flex-direction:column;flex:none;align-self:stretch;gap:4px;margin:10px 0 10px 12px;padding:14px 10px 12px;transition:width .18s;display:flex;overflow-y:auto}.zE6uZW_panelNavCollapsed{width:52px;padding:10px 6px}.zE6uZW_navGroup{flex-direction:column;gap:4px;display:flex}.zE6uZW_navGroupLabel{letter-spacing:.6px;text-transform:uppercase;color:var(--nf-text-3);user-select:none;padding:10px 10px 4px;font-size:10.5px;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{border-top:1px solid var(--nf-border);flex-direction:column;flex:none;gap:4px;margin-top:4px;padding:8px 6px 4px;display:flex}.zE6uZW_navAboutRow{cursor:pointer;color:var(--nf-text-3);text-align:left;white-space:nowrap;background:0 0;border:none;border-radius:8px;justify-content:space-between;align-items:center;gap:4px;padding:4px 6px;font-size:11px;transition:color .15s,background .15s;display:flex}.zE6uZW_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navAboutUpdate{background:var(--nf-accent-soft);color:var(--nf-accent);cursor:pointer;text-align:left;white-space:nowrap;border:none;border-radius:8px;padding:4px 6px;font-size:10.5px;font-weight:600}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{align-items:center;padding:6px 2px 2px}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{justify-content:center;width:100%;padding:4px 0}.zE6uZW_navTabBadge{background:var(--nf-accent);color:#fff;text-align:center;border-radius:999px;flex:none;min-width:18px;height:18px;margin-left:auto;padding:0 5px;font-size:10.5px;font-weight:700;line-height:18px;display:inline-block}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:14px;height:14px;padding:0 3px;font-size:9px;line-height:14px;position:absolute;top:2px;right:2px}.zE6uZW_navTabBadgeDanger{background:var(--nf-error)}.zE6uZW_navTabBadgeWarn{background:var(--nf-warn)}.zE6uZW_navTabBadgeDone{background:var(--nf-success)}.zE6uZW_navTabBadgeLive{background:var(--nf-success);animation:1.2s ease-in-out infinite zE6uZW_navBadgePulse}@keyframes zE6uZW_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.zE6uZW_navTab{cursor:pointer;width:100%;color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border:1px solid #0000;border-radius:10px;align-items:center;gap:8px;padding:9px 10px;font-size:13px;font-weight:500;transition:color .15s,background .15s,border-color .15s,box-shadow .15s;display:flex;position:relative}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{justify-content:center;padding:8px 0}.zE6uZW_navTab:hover{color:var(--nf-text);background:var(--nf-hover)}.zE6uZW_navTab[data-active]{color:var(--nf-accent);background:color-mix(in srgb, var(--nf-text) 8%, transparent);border-color:color-mix(in srgb, var(--nf-text) 16%, transparent);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--nf-text) 6%, transparent);font-weight:600}.zE6uZW_navTab[data-active] .zE6uZW_navTabIcon{color:var(--nf-accent)}.zE6uZW_navTabIcon{text-align:center;flex:none;width:20px;font-size:16px;line-height:1}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitle{border-bottom:1px solid var(--nf-border);flex:none;align-items:center;gap:10px;min-width:0;margin-bottom:6px;padding:2px 6px 12px;display:flex}.zE6uZW_navTitleLogo{background:linear-gradient(145deg, var(--nf-accent), var(--nf-accent-hover));width:34px;height:34px;color:var(--nf-accent-fg);box-shadow:0 6px 16px var(--nf-accent-soft);border-radius:10px;flex:none;justify-content:center;align-items:center;font-size:15px;font-weight:800;display:flex}.zE6uZW_navTitleName{letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;overflow:hidden}.zE6uZW_navTitleBook{color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.zE6uZW_panelNavCollapsed .zE6uZW_navTitle{justify-content:center;padding:2px 0 10px}.zE6uZW_panelNavCollapsed .zE6uZW_navTitleLogo{width:32px;height:32px}.zE6uZW_navActions{border-top:1px solid var(--nf-border);flex:none;gap:6px;margin-top:8px;padding-top:8px;display:flex}.zE6uZW_navActionBtn{border:1px solid var(--nf-border);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:10px;flex:1;justify-content:center;align-items:center;height:32px;font-size:14px;line-height:1;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.zE6uZW_navActionBtn:hover{background:var(--nf-hover);color:var(--nf-text);border-color:var(--nf-border-strong)}.zE6uZW_panelNavCollapsed .zE6uZW_navActions{flex-direction:column;align-items:stretch}.zE6uZW_bookSwitch{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;text-align:left;font:inherit;color:var(--nf-text);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:0;margin-top:4px;padding:9px;transition:background .15s,border-color .15s;display:flex}.zE6uZW_bookSwitch:hover{background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_bookSwitchCover{background:linear-gradient(160deg, var(--nf-accent), color-mix(in srgb, var(--nf-accent) 45%, #000));width:26px;height:34px;color:var(--nf-accent-fg);border-radius:5px;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex}.zE6uZW_bookSwitchName{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;overflow:hidden}.zE6uZW_bookSwitchMeta{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_bookSwitchArrow{color:var(--nf-text-3);flex:none;margin-left:auto;font-size:12px}.zE6uZW_statRowD{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.zE6uZW_statCardD{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:16px;justify-content:space-between;align-items:flex-start;gap:10px;min-width:0;padding:14px 16px;display:flex}.zE6uZW_statCardDLabel{color:var(--nf-text-3);font-size:12px}.zE6uZW_statCardDValue{color:var(--nf-text);margin-top:2px;font-size:22px;font-weight:700}.zE6uZW_statCardDUnit{color:var(--nf-text-3);font-size:12px;font-weight:400}.zE6uZW_statCardDDetail{color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11.5px;overflow:hidden}.zE6uZW_statCardDDown{color:var(--nf-error)}.zE6uZW_statCardDIcon{background:var(--nf-accent-soft);border-radius:12px;flex:none;justify-content:center;align-items:center;width:38px;height:38px;font-size:18px;display:flex}.zE6uZW_statCardDIconRed{background:color-mix(in srgb, var(--nf-error) 13%, transparent)}.zE6uZW_tlBar{gap:6px;margin-top:8px;display:flex}.zE6uZW_tlSeg{cursor:pointer;min-width:0;font:inherit;background:0 0;border:none;flex-direction:column;flex:1;gap:4px;padding:0;display:flex}.zE6uZW_tlSegTrack{background:var(--nf-hover);border:1px solid var(--nf-border);border-radius:999px;height:8px;overflow:hidden}.zE6uZW_tlSegFill{background:var(--nf-accent);border-radius:999px;width:100%;height:100%;display:block}.zE6uZW_tlSegTodo .zE6uZW_tlSegFill{opacity:0}.zE6uZW_tlSegTodo .zE6uZW_tlSegTrack{background:0 0}.zE6uZW_tlSegCurrent .zE6uZW_tlSegTrack{border-color:var(--nf-accent);box-shadow:0 0 0 2px var(--nf-accent-soft)}.zE6uZW_tlSegCurrent .zE6uZW_tlSegFill{opacity:.45}.zE6uZW_tlSegLabel{color:var(--nf-text-3);text-align:center;white-space:nowrap;text-overflow:ellipsis;font-size:10.5px;overflow:hidden}.zE6uZW_tlSegDone .zE6uZW_tlSegLabel{color:var(--nf-accent);font-weight:600}.zE6uZW_tlSeg:hover .zE6uZW_tlSegTrack{border-color:var(--nf-border-strong)}.zE6uZW_card{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:10px;padding:16px 18px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.zE6uZW_card:before{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.zE6uZW_card:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_card:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{color:var(--nf-text);align-items:center;gap:8px;margin:0;font-size:14px;font-weight:650;display:flex}.zE6uZW_button{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);cursor:pointer;white-space:nowrap;border-radius:12px;padding:6px 14px;font-size:13px;font-weight:500;transition:background .15s,border-color .15s,transform .1s,box-shadow .15s}.zE6uZW_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_button:active:not([disabled]){transform:scale(.96)}.zE6uZW_button[disabled]{opacity:.45;cursor:not-allowed}.zE6uZW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 88%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 2px 10px color-mix(in srgb, var(--nf-accent) 45%, transparent), 0 0 0 .5px color-mix(in srgb, var(--nf-accent) 30%, transparent);border-color:#0000}.zE6uZW_buttonPrimary:hover:not([disabled]){background:linear-gradient(180deg, var(--nf-accent-hover), color-mix(in srgb, var(--nf-accent-hover) 85%, #000));border-color:#0000}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{border-radius:9px;padding:3px 10px;font-size:12px}.zE6uZW_field{flex-direction:column;gap:5px;display:flex}.zE6uZW_fieldLabel{color:var(--nf-text-2);font-size:12px;font-weight:500}.zE6uZW_input{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;border-radius:12px;width:100%;padding:7px 11px;font-size:13px;transition:border-color .15s,box-shadow .15s}.zE6uZW_input:focus,.zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.zE6uZW_input::placeholder,.zE6uZW_textarea::placeholder{color:var(--nf-text-3)}.zE6uZW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text);box-sizing:border-box;resize:vertical;border-radius:12px;width:100%;min-height:200px;padding:9px 11px;font-family:inherit;font-size:13px;line-height:1.7;transition:border-color .15s,box-shadow .15s}.zE6uZW_row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{flex-direction:column;gap:8px;display:flex}.zE6uZW_volumeGroup{flex-direction:column;gap:6px;display:flex}.zE6uZW_volumeGroupHeader{background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;border-radius:10px;align-items:center;gap:8px;padding:6px 10px;font-size:13px;transition:border-color .15s;display:flex}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_chapter{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:10px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .15s,box-shadow .15s,transform .1s;display:flex}.zE6uZW_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.zE6uZW_chapterFocus{animation:.9s ease-in-out 3 zE6uZW_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes zE6uZW_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.zE6uZW_chapterNum{background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:28px;height:28px;color:var(--nf-text-2);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0 8px;font-size:12px;font-weight:700;display:inline-flex}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{color:var(--nf-text);align-items:center;gap:8px;font-size:13px;font-weight:600;display:flex}.zE6uZW_chapterBeats{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.zE6uZW_chapterActions{opacity:.85;flex-shrink:0;gap:4px;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{white-space:nowrap;letter-spacing:.2px;border:1px solid;border-radius:999px;padding:2px 9px;font-size:11px;font-weight:600}.zE6uZW_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.zE6uZW_badgeGenerating{color:var(--nf-accent);border-color:var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 12%, transparent);animation:1.2s ease-in-out infinite zE6uZW_pulse}.zE6uZW_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.zE6uZW_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.zE6uZW_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.zE6uZW_reviewBox{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;font-size:12.5px;display:flex}.zE6uZW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;margin:0;padding:10px 12px;font-family:inherit;font-size:12.5px;line-height:1.8;overflow:auto}.zE6uZW_chatScroll{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex-direction:column;flex:1;gap:10px;min-height:240px;max-height:480px;padding:14px;display:flex;overflow-y:auto}.zE6uZW_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:90%;color:var(--nf-accent-fg);border-radius:14px 14px 4px;align-self:flex-end;padding:9px 14px;font-size:13px;box-shadow:0 2px 6px #4d6bfe33}.zE6uZW_chatBubbleAssistant{background:var(--nf-bg-raise);max-width:92%;color:var(--nf-text);border:1px solid var(--nf-border);box-shadow:var(--nf-shadow);border-radius:14px 14px 14px 4px;align-self:flex-start;padding:9px 14px;font-size:13px}.zE6uZW_chatRole{color:var(--nf-text-3);margin-bottom:3px;font-size:11px;font-weight:600}.zE6uZW_toolLive{background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);border-radius:8px;max-height:180px;margin-top:6px;padding:8px 10px;font-size:12px;line-height:1.7;overflow-y:auto}.zE6uZW_assistantStatus{color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:999px;flex:none;align-items:center;gap:6px;margin-top:6px;padding:6px 12px;font-size:12px;display:flex}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{flex-direction:column;gap:4px;margin-top:6px;display:flex}.zE6uZW_toolStep{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:8px;padding:5px 10px;font-size:12px;display:flex}.zE6uZW_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.zE6uZW_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_toolStepIcon{flex:none;font-size:13px}.zE6uZW_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.zE6uZW_toolStepStatus{color:var(--nf-text-2);flex:none;font-size:11px}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);word-break:break-all;font-size:11px}.zE6uZW_progress{border:1px solid var(--nf-border);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);font-size:12px;font-family:var(--nf-font-mono);background:var(--nf-bg-inset);border-radius:10px;padding:10px 14px;line-height:1.8;overflow:auto}.zE6uZW_progressLine{color:var(--nf-text-2);opacity:.9}.zE6uZW_progressLineLive{color:var(--nf-accent);align-items:center;gap:8px;font-weight:600;display:flex}.zE6uZW_progressBar{background:var(--nf-border);border-radius:999px;flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{background:var(--nf-accent);border-radius:3px;height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.zE6uZW_liveText{font-variant-numeric:tabular-nums;color:var(--nf-text-2);font-size:12px}.zE6uZW_bigProgressBar{background:var(--nf-border);border-radius:999px;height:8px;margin-top:10px;overflow:hidden}.zE6uZW_bigProgressBarFill{background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_diffLegend{flex-wrap:wrap;align-items:center;gap:14px;margin:6px 0 8px;font-size:12px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{color:var(--nf-text-2);cursor:pointer;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.zE6uZW_diffList{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;flex:1;gap:8px;min-height:0;padding:10px 12px;font-size:13px;line-height:1.7;display:flex;overflow-y:auto}.zE6uZW_diffSame{border:1px dashed var(--nf-border);color:var(--nf-text-2);opacity:.85;border-radius:6px;padding:6px 10px}.zE6uZW_diffSame summary{cursor:pointer;user-select:none;font-size:12px}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:8px;grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{flex-direction:column;gap:6px;min-width:0;padding:8px 10px;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{letter-spacing:.5px;border-radius:4px;flex:none;align-self:flex-start;padding:1px 7px;font-size:11px;font-weight:700}.zE6uZW_diffTagOld{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-error) 45%, transparent)}.zE6uZW_diffTagNew{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent);border:1px solid color-mix(in srgb, var(--nf-success) 45%, transparent)}.zE6uZW_diffOld{color:var(--nf-error);white-space:pre-wrap;text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 55%, transparent)}.zE6uZW_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.zE6uZW_diffDel{border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.zE6uZW_diffAdd{border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);border-radius:6px;flex-direction:column;gap:4px;padding:6px 10px;display:flex}.zE6uZW_diffText{white-space:pre-wrap}.zE6uZW_diffDel .zE6uZW_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.zE6uZW_diffAdd .zE6uZW_diffText{color:var(--nf-success)}.zE6uZW_wsPage{flex-direction:column;flex:1;gap:10px;min-height:0;display:flex}.zE6uZW_wsPageHeader{flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.zE6uZW_wsAppliedBanner{border:1px solid var(--nf-success);background:color-mix(in srgb, var(--nf-success) 8%, transparent);border-radius:10px;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.zE6uZW_wsColumns{flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;min-height:0;display:grid}.zE6uZW_wsColumn{flex-direction:column;gap:8px;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);white-space:pre-wrap;flex:1;font-size:13px;line-height:1.75}.zE6uZW_wsSelected{border:1px solid var(--nf-accent);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);border-radius:6px;max-height:120px;padding:6px 10px;overflow:auto}.zE6uZW_wsSelectedText{color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px;font-size:12px}.zE6uZW_wsPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:8px;flex-direction:column;gap:8px;padding:8px 10px;display:flex}.zE6uZW_wsPreviewText{white-space:pre-wrap;min-height:0;color:var(--nf-text);flex:1;margin:0;font-size:13px;line-height:1.7;overflow:auto}.zE6uZW_assetGrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;display:grid}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(30px)saturate(180%);border-radius:14px;flex-direction:column;gap:4px;padding:10px 12px;transition:transform .22s,box-shadow .22s;display:flex}.zE6uZW_assetStat:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1px 0 var(--nf-glass-sheen);transform:translateY(-3px)}.zE6uZW_assetStatLabel{color:var(--nf-text-2);opacity:.9;font-size:11px}.zE6uZW_assetStatValue{color:var(--nf-text);font-size:15px;font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.zE6uZW_dashHero{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;backdrop-filter:blur(30px)saturate(180%);border-radius:22px;flex-direction:column;gap:14px;padding:18px 20px;transition:transform .22s,box-shadow .22s;display:flex;position:relative}.zE6uZW_dashHero:before{content:\"\";border-radius:inherit;pointer-events:none;background:radial-gradient(46% 40% at 92% -10%, color-mix(in srgb, var(--nf-accent) 13%, transparent), transparent 62%), var(--nf-glass-core), linear-gradient(90deg, transparent, var(--nf-glass-sheen), transparent) no-repeat 10% 0 / 80% 1px, linear-gradient(156deg, #ffffff42 0%, #fff0 55%);z-index:0;position:absolute;inset:0}.zE6uZW_dashHero:after{content:\"\";border-radius:inherit;pointer-events:none;background:var(--nf-glass-noise);opacity:.06;z-index:0;position:absolute;inset:0}.zE6uZW_dashHero:hover{box-shadow:var(--nf-card-shadow-hover), inset 0 1.5px 0 var(--nf-glass-sheen), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_dashHero>*{z-index:1;position:relative}.zE6uZW_dashHeroEyebrow{color:var(--nf-accent);align-items:center;gap:6px;font-size:13px;font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:14px}.zE6uZW_dashHeroTitle{flex-direction:column;gap:2px;display:flex}.zE6uZW_dashHeroBook{letter-spacing:-.3px;margin:0;font-size:24px;font-weight:700;line-height:1.25}.zE6uZW_dashHeroAction{border:1px solid var(--nf-glass-border);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);border-radius:14px;align-items:center;gap:12px;padding:10px 14px;display:flex}.zE6uZW_dashHeroArrow{background:var(--nf-accent);color:#fff;border-radius:50%;flex:none;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:inline-flex}.zE6uZW_dashHeroActionBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:14px;font-weight:600}.zE6uZW_dashJourney{flex-direction:column;gap:6px;display:flex}.zE6uZW_dashJourneyBar{background:var(--nf-border);border-radius:999px;height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{grid-template-columns:repeat(6,minmax(0,1fr));gap:4px;display:grid}.zE6uZW_dashStage{color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;align-items:center;gap:3px;font-size:11px;display:flex}.zE6uZW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;width:18px;height:18px;font-size:10px;display:inline-flex}.zE6uZW_dashStageDone{color:var(--nf-text-2)}.zE6uZW_dashStageDone .zE6uZW_dashStageDot{background:var(--nf-success);border-color:var(--nf-success);color:#fff}.zE6uZW_dashStageCurrent{color:var(--nf-accent);font-weight:600}.zE6uZW_dashStageCurrent .zE6uZW_dashStageDot{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 18%, transparent)}.zE6uZW_dashFacts{border-top:1px solid var(--nf-border);grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;padding-top:12px;display:grid}.zE6uZW_dashFact{flex-direction:column;gap:2px;min-width:0;display:flex}.zE6uZW_dashFact b{white-space:nowrap;text-overflow:ellipsis;font-size:13px;overflow:hidden}.zE6uZW_dashGrid{grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;gap:14px;display:grid}.zE6uZW_todoItem{border:1px solid var(--nf-border);border-radius:8px;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;display:flex}.zE6uZW_todoDanger{border-color:color-mix(in srgb, var(--nf-error) 40%, transparent);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.zE6uZW_todoWarning{border-color:color-mix(in srgb, var(--nf-warn) 40%, transparent);background:color-mix(in srgb, var(--nf-warn) 8%, transparent)}.zE6uZW_todoInfo{border-color:color-mix(in srgb, var(--nf-info) 40%, transparent);background:color-mix(in srgb, var(--nf-info) 7%, transparent)}.zE6uZW_todoText{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.zE6uZW_outlineReadonly{border:1px solid var(--nf-border);background:var(--nf-bg-inset);white-space:pre-wrap;user-select:text;border-radius:12px;max-height:480px;margin:0;padding:12px 14px;font-size:12.5px;line-height:1.8;overflow:auto}.zE6uZW_bookCreateOutline{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.zE6uZW_assistantFloat{z-index:80;border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);border-radius:16px;flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.zE6uZW_assistantFloatHeader{cursor:grab;user-select:none;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px 8px 14px;font-size:13px;font-weight:600;display:flex}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{flex:1;min-height:0;padding:10px;display:flex;overflow:hidden}.zE6uZW_assistantFloatBody>*{flex:1;min-width:0}.zE6uZW_assistantResize{cursor:nwse-resize;background:linear-gradient(135deg, transparent 0 55%, var(--nf-border-strong) 55% 62%, transparent 62%) no-repeat 4px 4px / 12px 12px;width:20px;height:20px;position:absolute;bottom:0;right:0}.zE6uZW_coverPreview{border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:12px;flex:none;justify-content:center;align-items:center;width:150px;height:200px;display:flex;overflow:hidden}.zE6uZW_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_coverPlaceholder{color:var(--nf-text-3);font-size:12px}.zE6uZW_shelfView{flex-direction:column;flex:1;gap:16px;min-height:0;padding:18px;display:flex;overflow:auto}.zE6uZW_shelfHeader{flex-direction:column;gap:10px;display:flex}.zE6uZW_shelfTitleRow{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.zE6uZW_shelfToolbar{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfFilters{flex-wrap:wrap;gap:6px;display:flex}.zE6uZW_shelfEmpty{border:1px dashed var(--nf-border-strong);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;border-radius:16px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:10px;padding:40px 20px;display:flex}.zE6uZW_shelfEmptyIcon{font-size:42px}.zE6uZW_shelfEmptyTitle{font-size:16px;font-weight:700}.zE6uZW_shelfGrid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;gap:14px;display:grid}.zE6uZW_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;border-radius:16px;flex-direction:column;gap:8px;padding:12px;transition:border-color .15s,transform .1s,box-shadow .15s;display:flex}.zE6uZW_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.zE6uZW_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:12px;flex:none;justify-content:center;align-items:center;display:flex;overflow:hidden}.zE6uZW_bookCardCover img{object-fit:contain;width:100%;height:100%;display:block}.zE6uZW_bookCardCoverFallback{background:radial-gradient(400px 200px at 80% -20%, color-mix(in srgb, var(--nf-accent) 25%, transparent), transparent 70%), linear-gradient(155deg, var(--nf-bg-inset), color-mix(in srgb, var(--nf-accent) 10%, var(--nf-bg-inset)));flex-direction:column;justify-content:center;align-items:center;gap:6px;width:100%;height:100%;display:flex}.zE6uZW_bookCardCoverTitle{color:var(--nf-accent);letter-spacing:2px;font-size:22px;font-weight:800}.zE6uZW_bookCardBody{flex-direction:column;gap:5px;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardName{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;font-weight:700;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px;display:flex}.zE6uZW_bookCardProgressBar{background:var(--nf-border);border-radius:999px;height:5px;overflow:hidden}.zE6uZW_bookCardProgressFill{background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));border-radius:999px;height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{text-align:center;color:var(--nf-text-2);border-style:dashed;justify-content:center;align-items:center;gap:8px;min-height:260px}.zE6uZW_bookAddCard:hover{color:var(--nf-accent)}.zE6uZW_bookAddIcon{color:var(--nf-accent);font-size:34px;line-height:1}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{flex-direction:column;flex:1;gap:14px;min-height:0;padding:14px 18px 24px;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_createBookCard{border:1px solid var(--nf-border);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);width:min(520px,100%);box-shadow:var(--nf-shadow-lg);border-radius:20px;flex-direction:column;align-self:center;gap:12px;padding:26px 28px;display:flex}.zE6uZW_createBookIcon{font-size:34px;line-height:1}.zE6uZW_createBookTitle{letter-spacing:-.3px;margin:0;font-size:22px;font-weight:800}.zE6uZW_ideaCard{border:1px dashed var(--nf-border-strong);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.zE6uZW_ideaToggle{color:var(--nf-accent);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:0;font-size:13px;font-weight:700;display:flex}.zE6uZW_ideaCandidate{border:1px solid var(--nf-border);background:var(--nf-bg);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{color:var(--nf-text-2);opacity:.9;font-size:12px}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;gap:3px;font-size:12px;display:flex}.zE6uZW_panelContent::-webkit-scrollbar,.zE6uZW_chatScroll::-webkit-scrollbar,.zE6uZW_chapterPreview::-webkit-scrollbar,.zE6uZW_progress::-webkit-scrollbar,.zE6uZW_toolLive::-webkit-scrollbar{width:8px;height:8px}.zE6uZW_panelContent::-webkit-scrollbar-thumb,.zE6uZW_chatScroll::-webkit-scrollbar-thumb,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb,.zE6uZW_progress::-webkit-scrollbar-thumb,.zE6uZW_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:4px}.zE6uZW_panelContent::-webkit-scrollbar-thumb:hover,.zE6uZW_chatScroll::-webkit-scrollbar-thumb:hover,.zE6uZW_chapterPreview::-webkit-scrollbar-thumb:hover,.zE6uZW_progress::-webkit-scrollbar-thumb:hover,.zE6uZW_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}.zE6uZW_workflowList{flex-direction:column;gap:0;display:flex}.zE6uZW_workflowRow{align-items:flex-start;gap:12px;padding:8px 4px;display:flex;position:relative}.zE6uZW_workflowRow:before{content:\"\";background:var(--nf-border);width:2px;position:absolute;top:34px;bottom:-8px;left:13px}.zE6uZW_workflowRow:last-child:before{display:none}.zE6uZW_workflowDot{border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);width:28px;height:28px;color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:inline-flex}.zE6uZW_workflowDotDone{border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 15%, var(--nf-bg-raise));color:var(--nf-success)}.zE6uZW_workflowDotActive{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);box-shadow:0 0 0 4px var(--nf-accent-soft)}.zE6uZW_workflowBody{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.zE6uZW_workflowLabel{color:var(--nf-text);font-size:13px;font-weight:600}.zE6uZW_workflowHint{color:var(--nf-text-2);font-size:12px}@keyframes zE6uZW_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes zE6uZW_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.zE6uZW_card{animation:.2s zE6uZW_fadeIn}.zE6uZW_bookshelf{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(26px)saturate(175%);z-index:1;border-radius:16px;flex-wrap:wrap;flex-shrink:0;align-items:center;gap:10px;margin:10px 12px 0;padding:8px 14px;display:flex;position:relative}.zE6uZW_bookshelfLabel{color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-size:12px;font-weight:700}.zE6uZW_bookshelfList{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.zE6uZW_bookChip{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;border-radius:999px;align-items:center;gap:6px;max-width:220px;padding:4px 8px 4px 10px;font-size:12px;transition:border-color .15s,background .15s;display:flex}.zE6uZW_bookChip:hover{border-color:var(--nf-border-strong)}.zE6uZW_bookChipActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_bookChipName{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookChipMeta{opacity:.7;white-space:nowrap;font-size:11px}.zE6uZW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:0 2px;font-size:13px;line-height:1}.zE6uZW_bookChipRemove:hover{color:var(--nf-error)}.zE6uZW_bookAdd{border:1px dashed var(--nf-border-strong);color:var(--nf-text-2);cursor:pointer;background:0 0;border-radius:999px;padding:4px 12px;font-size:12px;transition:border-color .15s,color .15s}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:6px;display:flex}.zE6uZW_dropzone{border:2px dashed var(--nf-border-strong);text-align:center;color:var(--nf-text-2);cursor:pointer;border-radius:10px;flex-direction:column;align-items:center;gap:6px;padding:18px 14px;font-size:13px;transition:border-color .15s,background .15s;display:flex}.zE6uZW_dropzone:hover,.zE6uZW_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.zE6uZW_dropzoneIcon{font-size:22px;line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:6px;margin-top:2px;display:flex}.zE6uZW_bookCardActions .zE6uZW_button{flex:1;justify-content:center}.zE6uZW_readerView{flex-direction:column;transition:background .2s,color .2s;display:flex;position:absolute;inset:0;overflow:hidden}.zE6uZW_readerHeader{border-bottom:1px solid;flex-wrap:wrap;flex:none;align-items:center;gap:8px;padding:8px 12px;display:flex}.zE6uZW_readerTitle{font-size:14px;font-weight:700}.zE6uZW_readerSeg{border-radius:8px;align-items:center;gap:2px;display:flex;overflow:hidden}.zE6uZW_readerSegBtn{cursor:pointer;opacity:.75;background:0 0;border:none;border-radius:6px;padding:3px 8px;font-size:12px}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{scrollbar-width:thin;border-right:1px solid;flex-direction:column;flex:none;gap:10px;width:220px;min-width:220px;padding:8px 6px 24px;display:flex;overflow-y:auto}.zE6uZW_readerGroup{flex-direction:column;gap:1px;display:flex}.zE6uZW_readerGroupTitle{opacity:.9;cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px 4px;font-size:12px;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{text-align:center;flex:none;width:12px;font-size:10px}.zE6uZW_readerGroupCount{opacity:.6;flex:none;margin-left:auto;padding-right:2px;font-size:11px;font-weight:400}.zE6uZW_readerItem{text-align:left;cursor:pointer;opacity:.8;background:0 0;border:1px solid;border-radius:8px;align-items:center;gap:6px;min-width:0;padding:4px 8px;font-size:12px;transition:opacity .15s,background .15s;display:flex}.zE6uZW_readerItem:hover{opacity:1}.zE6uZW_readerItemActive{opacity:1;font-weight:700}.zE6uZW_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.zE6uZW_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.zE6uZW_readerItemBadge{flex:none;font-size:11px}.zE6uZW_readerMain{scrollbar-width:thin;flex:1;justify-content:center;min-height:0;padding:20px 16px 48px;display:flex;overflow-y:auto}.zE6uZW_readerArticle{flex-direction:column;gap:12px;width:100%;display:flex}.zE6uZW_readerChapterTitle{letter-spacing:1px;margin:0;font-size:24px;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:8px;font-size:12px;display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{border-top:1px dashed;justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{opacity:.7;align-self:center;padding:32px 0;font-size:13px}.zE6uZW_readerError{color:var(--nf-error)}";
|
|
896
912
|
const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
|
|
897
913
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
898
914
|
const tag = document.createElement("style");
|
|
@@ -902,248 +918,272 @@ window.__ModuleLoader__.load({
|
|
|
902
918
|
document.head.appendChild(tag);
|
|
903
919
|
}
|
|
904
920
|
var panel_module_css_default = {
|
|
905
|
-
"
|
|
906
|
-
"
|
|
907
|
-
"textarea": "zE6uZW_textarea",
|
|
908
|
-
"diffOld": "zE6uZW_diffOld",
|
|
909
|
-
"readerArticle": "zE6uZW_readerArticle",
|
|
910
|
-
"diffTagOld": "zE6uZW_diffTagOld",
|
|
911
|
-
"toolStepActive": "zE6uZW_toolStepActive",
|
|
912
|
-
"buttonSmall": "zE6uZW_buttonSmall",
|
|
913
|
-
"workflowDotDone": "zE6uZW_workflowDotDone",
|
|
914
|
-
"chapterMain": "zE6uZW_chapterMain",
|
|
915
|
-
"createBookIcon": "zE6uZW_createBookIcon",
|
|
916
|
-
"bookCard": "zE6uZW_bookCard",
|
|
917
|
-
"readerItem": "zE6uZW_readerItem",
|
|
918
|
-
"ideaCard": "zE6uZW_ideaCard",
|
|
919
|
-
"wsPageHeader": "zE6uZW_wsPageHeader",
|
|
920
|
-
"workflowBody": "zE6uZW_workflowBody",
|
|
921
|
-
"view": "zE6uZW_view",
|
|
922
|
-
"bookAddIcon": "zE6uZW_bookAddIcon",
|
|
923
|
-
"readerChapterTitle": "zE6uZW_readerChapterTitle",
|
|
924
|
-
"assistantResize": "zE6uZW_assistantResize",
|
|
925
|
-
"bookChipName": "zE6uZW_bookChipName",
|
|
921
|
+
"toolSteps": "zE6uZW_toolSteps",
|
|
922
|
+
"readerItemActive": "zE6uZW_readerItemActive",
|
|
926
923
|
"bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
|
|
927
|
-
"
|
|
924
|
+
"readerPara": "zE6uZW_readerPara",
|
|
925
|
+
"navTitleName": "zE6uZW_navTitleName",
|
|
926
|
+
"entryLabel": "zE6uZW_entryLabel",
|
|
927
|
+
"progress": "zE6uZW_progress",
|
|
928
|
+
"navGroup": "zE6uZW_navGroup",
|
|
928
929
|
"outlineReadonly": "zE6uZW_outlineReadonly",
|
|
929
|
-
"
|
|
930
|
-
"
|
|
931
|
-
"wsPreview": "zE6uZW_wsPreview",
|
|
932
|
-
"readerGroupCount": "zE6uZW_readerGroupCount",
|
|
933
|
-
"chapterFocusPulse": "zE6uZW_chapterFocusPulse",
|
|
934
|
-
"dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
|
|
935
|
-
"bookCreateOutline": "zE6uZW_bookCreateOutline",
|
|
936
|
-
"diffList": "zE6uZW_diffList",
|
|
930
|
+
"coverPreview": "zE6uZW_coverPreview",
|
|
931
|
+
"createBookTop": "zE6uZW_createBookTop",
|
|
937
932
|
"createBookCard": "zE6uZW_createBookCard",
|
|
938
|
-
"workflowList": "zE6uZW_workflowList",
|
|
939
|
-
"shelfGrid": "zE6uZW_shelfGrid",
|
|
940
|
-
"todoItem": "zE6uZW_todoItem",
|
|
941
|
-
"readerSeg": "zE6uZW_readerSeg",
|
|
942
|
-
"dashFacts": "zE6uZW_dashFacts",
|
|
943
|
-
"readerBody": "zE6uZW_readerBody",
|
|
944
|
-
"panelSubtitle": "zE6uZW_panelSubtitle",
|
|
945
|
-
"dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
|
|
946
|
-
"genreDesc": "zE6uZW_genreDesc",
|
|
947
|
-
"readerItemTitle": "zE6uZW_readerItemTitle",
|
|
948
|
-
"assistantFloat": "zE6uZW_assistantFloat",
|
|
949
|
-
"coverPlaceholder": "zE6uZW_coverPlaceholder",
|
|
950
|
-
"progressBar": "zE6uZW_progressBar",
|
|
951
|
-
"panelHeader": "zE6uZW_panelHeader",
|
|
952
|
-
"assetStatValue": "zE6uZW_assetStatValue",
|
|
953
|
-
"navGroupLabel": "zE6uZW_navGroupLabel",
|
|
954
|
-
"assetStat": "zE6uZW_assetStat",
|
|
955
|
-
"dashStageDot": "zE6uZW_dashStageDot",
|
|
956
|
-
"progress": "zE6uZW_progress",
|
|
957
|
-
"bookChip": "zE6uZW_bookChip",
|
|
958
|
-
"todoText": "zE6uZW_todoText",
|
|
959
933
|
"dropzoneActive": "zE6uZW_dropzoneActive",
|
|
960
|
-
"
|
|
961
|
-
"
|
|
962
|
-
"
|
|
934
|
+
"navTabBadgeLive": "zE6uZW_navTabBadgeLive",
|
|
935
|
+
"navTabIcon": "zE6uZW_navTabIcon",
|
|
936
|
+
"statRowD": "zE6uZW_statRowD",
|
|
937
|
+
"bookCardProgressBar": "zE6uZW_bookCardProgressBar",
|
|
938
|
+
"readerGroupArrow": "zE6uZW_readerGroupArrow",
|
|
939
|
+
"progressBar": "zE6uZW_progressBar",
|
|
940
|
+
"bookCreateForm": "zE6uZW_bookCreateForm",
|
|
941
|
+
"panelContent": "zE6uZW_panelContent",
|
|
942
|
+
"bookshelfLabel": "zE6uZW_bookshelfLabel",
|
|
943
|
+
"toolStepDetail": "zE6uZW_toolStepDetail",
|
|
944
|
+
"progressLineLive": "zE6uZW_progressLineLive",
|
|
945
|
+
"bookCreateOutline": "zE6uZW_bookCreateOutline",
|
|
946
|
+
"bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
|
|
947
|
+
"buttonSmall": "zE6uZW_buttonSmall",
|
|
948
|
+
"tab": "zE6uZW_tab",
|
|
949
|
+
"toolStepError": "zE6uZW_toolStepError",
|
|
950
|
+
"shelfEmpty": "zE6uZW_shelfEmpty",
|
|
963
951
|
"toolStep": "zE6uZW_toolStep",
|
|
964
|
-
"
|
|
965
|
-
"
|
|
966
|
-
"fadeIn": "zE6uZW_fadeIn",
|
|
967
|
-
"createBookTop": "zE6uZW_createBookTop",
|
|
952
|
+
"fileList": "zE6uZW_fileList",
|
|
953
|
+
"wsSelected": "zE6uZW_wsSelected",
|
|
968
954
|
"dashFact": "zE6uZW_dashFact",
|
|
969
|
-
"
|
|
955
|
+
"chapterBeats": "zE6uZW_chapterBeats",
|
|
956
|
+
"dropzoneIcon": "zE6uZW_dropzoneIcon",
|
|
957
|
+
"iconButton": "zE6uZW_iconButton",
|
|
958
|
+
"readerTitle": "zE6uZW_readerTitle",
|
|
959
|
+
"view": "zE6uZW_view",
|
|
960
|
+
"volumeGroupToggle": "zE6uZW_volumeGroupToggle",
|
|
961
|
+
"bookCardProgressFill": "zE6uZW_bookCardProgressFill",
|
|
962
|
+
"volumeGroupHeader": "zE6uZW_volumeGroupHeader",
|
|
963
|
+
"badgeWritten": "zE6uZW_badgeWritten",
|
|
964
|
+
"chatRole": "zE6uZW_chatRole",
|
|
965
|
+
"bigProgressBarFill": "zE6uZW_bigProgressBarFill",
|
|
966
|
+
"toolLive": "zE6uZW_toolLive",
|
|
967
|
+
"statCardDLabel": "zE6uZW_statCardDLabel",
|
|
968
|
+
"readerGroupTitle": "zE6uZW_readerGroupTitle",
|
|
969
|
+
"readerSegBtn": "zE6uZW_readerSegBtn",
|
|
970
|
+
"assetStatLabel": "zE6uZW_assetStatLabel",
|
|
971
|
+
"toolStepIcon": "zE6uZW_toolStepIcon",
|
|
972
|
+
"dropzone": "zE6uZW_dropzone",
|
|
973
|
+
"navSpacer": "zE6uZW_navSpacer",
|
|
974
|
+
"dashHero": "zE6uZW_dashHero",
|
|
970
975
|
"bookChipMeta": "zE6uZW_bookChipMeta",
|
|
971
|
-
"
|
|
972
|
-
"
|
|
973
|
-
"
|
|
974
|
-
"bookCreateForm": "zE6uZW_bookCreateForm",
|
|
975
|
-
"shelfToolbar": "zE6uZW_shelfToolbar",
|
|
976
|
-
"readerFoot": "zE6uZW_readerFoot",
|
|
976
|
+
"bookshelf": "zE6uZW_bookshelf",
|
|
977
|
+
"chapterPreview": "zE6uZW_chapterPreview",
|
|
978
|
+
"chapterActions": "zE6uZW_chapterActions",
|
|
977
979
|
"readerError": "zE6uZW_readerError",
|
|
978
|
-
"
|
|
979
|
-
"
|
|
980
|
-
"bigProgressBar": "zE6uZW_bigProgressBar",
|
|
981
|
-
"bookCardActive": "zE6uZW_bookCardActive",
|
|
982
|
-
"cardTitle": "zE6uZW_cardTitle",
|
|
983
|
-
"dashJourneyBar": "zE6uZW_dashJourneyBar",
|
|
980
|
+
"diffTagOld": "zE6uZW_diffTagOld",
|
|
981
|
+
"statCardDDown": "zE6uZW_statCardDDown",
|
|
984
982
|
"workflowDot": "zE6uZW_workflowDot",
|
|
985
|
-
"
|
|
986
|
-
"
|
|
987
|
-
"
|
|
988
|
-
"
|
|
989
|
-
"
|
|
990
|
-
"
|
|
991
|
-
"
|
|
992
|
-
"readerItemNo": "zE6uZW_readerItemNo",
|
|
993
|
-
"dashJourneyFill": "zE6uZW_dashJourneyFill",
|
|
994
|
-
"chatBubbleUser": "zE6uZW_chatBubbleUser",
|
|
995
|
-
"progressLineDone": "zE6uZW_progressLineDone",
|
|
996
|
-
"card": "zE6uZW_card",
|
|
997
|
-
"diffLegend": "zE6uZW_diffLegend",
|
|
998
|
-
"legendOld": "zE6uZW_legendOld",
|
|
999
|
-
"diffSameBody": "zE6uZW_diffSameBody",
|
|
1000
|
-
"diffColumn": "zE6uZW_diffColumn",
|
|
1001
|
-
"diffDel": "zE6uZW_diffDel",
|
|
983
|
+
"readerItem": "zE6uZW_readerItem",
|
|
984
|
+
"navGroupSep": "zE6uZW_navGroupSep",
|
|
985
|
+
"buttonDanger": "zE6uZW_buttonDanger",
|
|
986
|
+
"dashJourney": "zE6uZW_dashJourney",
|
|
987
|
+
"createBookView": "zE6uZW_createBookView",
|
|
988
|
+
"navActionBtn": "zE6uZW_navActionBtn",
|
|
989
|
+
"dashHeroActionBody": "zE6uZW_dashHeroActionBody",
|
|
1002
990
|
"workflowDotActive": "zE6uZW_workflowDotActive",
|
|
1003
|
-
"
|
|
991
|
+
"progressLineError": "zE6uZW_progressLineError",
|
|
992
|
+
"card": "zE6uZW_card",
|
|
993
|
+
"todoDanger": "zE6uZW_todoDanger",
|
|
994
|
+
"dashHeroAction": "zE6uZW_dashHeroAction",
|
|
995
|
+
"cardTitle": "zE6uZW_cardTitle",
|
|
1004
996
|
"wsEditor": "zE6uZW_wsEditor",
|
|
1005
|
-
"
|
|
1006
|
-
"
|
|
1007
|
-
"
|
|
1008
|
-
"
|
|
1009
|
-
"entry": "zE6uZW_entry",
|
|
1010
|
-
"navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
|
|
1011
|
-
"diffAdd": "zE6uZW_diffAdd",
|
|
1012
|
-
"progressLineLive": "zE6uZW_progressLineLive",
|
|
1013
|
-
"assetStatLabel": "zE6uZW_assetStatLabel",
|
|
1014
|
-
"reviewBox": "zE6uZW_reviewBox",
|
|
1015
|
-
"badgeWritten": "zE6uZW_badgeWritten",
|
|
1016
|
-
"readerChapterMeta": "zE6uZW_readerChapterMeta",
|
|
1017
|
-
"badgeError": "zE6uZW_badgeError",
|
|
1018
|
-
"volumeGroupToggle": "zE6uZW_volumeGroupToggle",
|
|
1019
|
-
"badgeGenerating": "zE6uZW_badgeGenerating",
|
|
1020
|
-
"shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
|
|
1021
|
-
"todoWarning": "zE6uZW_todoWarning",
|
|
1022
|
-
"readerItemActive": "zE6uZW_readerItemActive",
|
|
1023
|
-
"wsColumns": "zE6uZW_wsColumns",
|
|
1024
|
-
"navTabBadgeDone": "zE6uZW_navTabBadgeDone",
|
|
1025
|
-
"dashJourney": "zE6uZW_dashJourney",
|
|
1026
|
-
"workflowHint": "zE6uZW_workflowHint",
|
|
1027
|
-
"todoInfo": "zE6uZW_todoInfo",
|
|
1028
|
-
"ideaToggle": "zE6uZW_ideaToggle",
|
|
1029
|
-
"navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
|
|
1030
|
-
"tab": "zE6uZW_tab",
|
|
1031
|
-
"wsPage": "zE6uZW_wsPage",
|
|
1032
|
-
"badgeRejected": "zE6uZW_badgeRejected",
|
|
1033
|
-
"progressLine": "zE6uZW_progressLine",
|
|
1034
|
-
"bookCardActions": "zE6uZW_bookCardActions",
|
|
1035
|
-
"navTabBadgeLive": "zE6uZW_navTabBadgeLive",
|
|
997
|
+
"ideaCard": "zE6uZW_ideaCard",
|
|
998
|
+
"wsPreviewText": "zE6uZW_wsPreviewText",
|
|
999
|
+
"bookAddIcon": "zE6uZW_bookAddIcon",
|
|
1000
|
+
"shelfGrid": "zE6uZW_shelfGrid",
|
|
1036
1001
|
"row": "zE6uZW_row",
|
|
1037
|
-
"
|
|
1038
|
-
"
|
|
1039
|
-
"
|
|
1040
|
-
"
|
|
1002
|
+
"busyRow": "zE6uZW_busyRow",
|
|
1003
|
+
"assistantStatus": "zE6uZW_assistantStatus",
|
|
1004
|
+
"statCardD": "zE6uZW_statCardD",
|
|
1005
|
+
"bookChipName": "zE6uZW_bookChipName",
|
|
1006
|
+
"fadeIn": "zE6uZW_fadeIn",
|
|
1007
|
+
"chapter": "zE6uZW_chapter",
|
|
1008
|
+
"readerChapterTitle": "zE6uZW_readerChapterTitle",
|
|
1009
|
+
"readerGroup": "zE6uZW_readerGroup",
|
|
1010
|
+
"readerItemNo": "zE6uZW_readerItemNo",
|
|
1011
|
+
"toolStepName": "zE6uZW_toolStepName",
|
|
1012
|
+
"bookChipRemove": "zE6uZW_bookChipRemove",
|
|
1013
|
+
"badgeRejected": "zE6uZW_badgeRejected",
|
|
1014
|
+
"button": "zE6uZW_button",
|
|
1015
|
+
"diffLegend": "zE6uZW_diffLegend",
|
|
1041
1016
|
"navBadgePulse": "zE6uZW_navBadgePulse",
|
|
1042
|
-
"
|
|
1043
|
-
"
|
|
1044
|
-
"
|
|
1045
|
-
"
|
|
1046
|
-
"
|
|
1047
|
-
"
|
|
1048
|
-
"
|
|
1049
|
-
"
|
|
1017
|
+
"assetStatValue": "zE6uZW_assetStatValue",
|
|
1018
|
+
"shelfTitleRow": "zE6uZW_shelfTitleRow",
|
|
1019
|
+
"tlSegLabel": "zE6uZW_tlSegLabel",
|
|
1020
|
+
"dashJourneyStages": "zE6uZW_dashJourneyStages",
|
|
1021
|
+
"ideaCandidate": "zE6uZW_ideaCandidate",
|
|
1022
|
+
"workflowList": "zE6uZW_workflowList",
|
|
1023
|
+
"readerBody": "zE6uZW_readerBody",
|
|
1024
|
+
"workflowBody": "zE6uZW_workflowBody",
|
|
1025
|
+
"ideaToggle": "zE6uZW_ideaToggle",
|
|
1026
|
+
"wsPage": "zE6uZW_wsPage",
|
|
1027
|
+
"todoText": "zE6uZW_todoText",
|
|
1050
1028
|
"bookAdd": "zE6uZW_bookAdd",
|
|
1051
|
-
"
|
|
1052
|
-
"
|
|
1053
|
-
"
|
|
1054
|
-
"
|
|
1055
|
-
"
|
|
1056
|
-
"
|
|
1057
|
-
"
|
|
1058
|
-
"
|
|
1059
|
-
"
|
|
1060
|
-
"
|
|
1061
|
-
"
|
|
1062
|
-
"navTabIcon": "zE6uZW_navTabIcon",
|
|
1063
|
-
"chapterPreview": "zE6uZW_chapterPreview",
|
|
1064
|
-
"dashStageDone": "zE6uZW_dashStageDone",
|
|
1065
|
-
"bookshelfLabel": "zE6uZW_bookshelfLabel",
|
|
1066
|
-
"readerSidebar": "zE6uZW_readerSidebar",
|
|
1067
|
-
"wsPreviewText": "zE6uZW_wsPreviewText",
|
|
1068
|
-
"diffNew": "zE6uZW_diffNew",
|
|
1069
|
-
"bookCardProgressFill": "zE6uZW_bookCardProgressFill",
|
|
1070
|
-
"readerGroupArrow": "zE6uZW_readerGroupArrow",
|
|
1071
|
-
"createBookView": "zE6uZW_createBookView",
|
|
1072
|
-
"readerTitle": "zE6uZW_readerTitle",
|
|
1073
|
-
"chapter": "zE6uZW_chapter",
|
|
1074
|
-
"panel": "zE6uZW_panel",
|
|
1075
|
-
"wsSelected": "zE6uZW_wsSelected",
|
|
1076
|
-
"dashGrid": "zE6uZW_dashGrid",
|
|
1077
|
-
"dashHeroBook": "zE6uZW_dashHeroBook",
|
|
1078
|
-
"readerPara": "zE6uZW_readerPara",
|
|
1079
|
-
"navTab": "zE6uZW_navTab",
|
|
1080
|
-
"chatScroll": "zE6uZW_chatScroll",
|
|
1081
|
-
"toolSteps": "zE6uZW_toolSteps",
|
|
1082
|
-
"liveText": "zE6uZW_liveText",
|
|
1029
|
+
"chapterList": "zE6uZW_chapterList",
|
|
1030
|
+
"bookSwitchMeta": "zE6uZW_bookSwitchMeta",
|
|
1031
|
+
"reviewBox": "zE6uZW_reviewBox",
|
|
1032
|
+
"assetGrid": "zE6uZW_assetGrid",
|
|
1033
|
+
"entryIcon": "zE6uZW_entryIcon",
|
|
1034
|
+
"readerItemTitle": "zE6uZW_readerItemTitle",
|
|
1035
|
+
"panelNavCollapsed": "zE6uZW_panelNavCollapsed",
|
|
1036
|
+
"navGroupLabel": "zE6uZW_navGroupLabel",
|
|
1037
|
+
"wsSelectedText": "zE6uZW_wsSelectedText",
|
|
1038
|
+
"navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
|
|
1039
|
+
"chapterMain": "zE6uZW_chapterMain",
|
|
1083
1040
|
"assetStatDetail": "zE6uZW_assetStatDetail",
|
|
1084
|
-
"
|
|
1085
|
-
"
|
|
1086
|
-
"
|
|
1087
|
-
"
|
|
1088
|
-
"
|
|
1089
|
-
"
|
|
1090
|
-
"
|
|
1041
|
+
"workflowLabel": "zE6uZW_workflowLabel",
|
|
1042
|
+
"bookCard": "zE6uZW_bookCard",
|
|
1043
|
+
"diffText": "zE6uZW_diffText",
|
|
1044
|
+
"workflowHint": "zE6uZW_workflowHint",
|
|
1045
|
+
"tlSeg": "zE6uZW_tlSeg",
|
|
1046
|
+
"assistantResize": "zE6uZW_assistantResize",
|
|
1047
|
+
"readerHeader": "zE6uZW_readerHeader",
|
|
1048
|
+
"diffTagNew": "zE6uZW_diffTagNew",
|
|
1049
|
+
"pulse": "zE6uZW_pulse",
|
|
1050
|
+
"assistantFloat": "zE6uZW_assistantFloat",
|
|
1051
|
+
"tlSegCurrent": "zE6uZW_tlSegCurrent",
|
|
1052
|
+
"volumeGroup": "zE6uZW_volumeGroup",
|
|
1053
|
+
"assistantFloatBody": "zE6uZW_assistantFloatBody",
|
|
1054
|
+
"bookAddCard": "zE6uZW_bookAddCard",
|
|
1055
|
+
"shelfView": "zE6uZW_shelfView",
|
|
1056
|
+
"assetStat": "zE6uZW_assetStat",
|
|
1057
|
+
"dashHeroSparkle": "zE6uZW_dashHeroSparkle",
|
|
1058
|
+
"dashGrid": "zE6uZW_dashGrid",
|
|
1059
|
+
"bookCardCover": "zE6uZW_bookCardCover",
|
|
1060
|
+
"navTabBadgeDone": "zE6uZW_navTabBadgeDone",
|
|
1091
1061
|
"navAbout": "zE6uZW_navAbout",
|
|
1092
|
-
"
|
|
1093
|
-
"
|
|
1094
|
-
"meta": "zE6uZW_meta",
|
|
1095
|
-
"navGroupSep": "zE6uZW_navGroupSep",
|
|
1096
|
-
"shelfSearch": "zE6uZW_shelfSearch",
|
|
1097
|
-
"toolStepName": "zE6uZW_toolStepName",
|
|
1098
|
-
"toolStepDetail": "zE6uZW_toolStepDetail",
|
|
1099
|
-
"chatRole": "zE6uZW_chatRole",
|
|
1100
|
-
"fieldLabel": "zE6uZW_fieldLabel",
|
|
1101
|
-
"readerText": "zE6uZW_readerText",
|
|
1102
|
-
"button": "zE6uZW_button",
|
|
1103
|
-
"chapterFocus": "zE6uZW_chapterFocus",
|
|
1062
|
+
"shelfToolbar": "zE6uZW_shelfToolbar",
|
|
1063
|
+
"navTitleBook": "zE6uZW_navTitleBook",
|
|
1104
1064
|
"navTabBadge": "zE6uZW_navTabBadge",
|
|
1105
|
-
"assetGrid": "zE6uZW_assetGrid",
|
|
1106
|
-
"todoDanger": "zE6uZW_todoDanger",
|
|
1107
|
-
"toolLive": "zE6uZW_toolLive",
|
|
1108
1065
|
"dashStageCurrent": "zE6uZW_dashStageCurrent",
|
|
1109
|
-
"
|
|
1110
|
-
"badgePending": "zE6uZW_badgePending",
|
|
1066
|
+
"readerSidebar": "zE6uZW_readerSidebar",
|
|
1111
1067
|
"readerItemBadge": "zE6uZW_readerItemBadge",
|
|
1112
|
-
"
|
|
1113
|
-
"
|
|
1114
|
-
"
|
|
1115
|
-
"
|
|
1068
|
+
"panelBody": "zE6uZW_panelBody",
|
|
1069
|
+
"navAboutUpdate": "zE6uZW_navAboutUpdate",
|
|
1070
|
+
"shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
|
|
1071
|
+
"bigProgressBar": "zE6uZW_bigProgressBar",
|
|
1072
|
+
"dashJourneyBar": "zE6uZW_dashJourneyBar",
|
|
1073
|
+
"diffColumn": "zE6uZW_diffColumn",
|
|
1074
|
+
"diffAdd": "zE6uZW_diffAdd",
|
|
1075
|
+
"tlSegTrack": "zE6uZW_tlSegTrack",
|
|
1076
|
+
"tlSegTodo": "zE6uZW_tlSegTodo",
|
|
1077
|
+
"readerFoot": "zE6uZW_readerFoot",
|
|
1078
|
+
"coverPlaceholder": "zE6uZW_coverPlaceholder",
|
|
1079
|
+
"textarea": "zE6uZW_textarea",
|
|
1080
|
+
"dashStageDone": "zE6uZW_dashStageDone",
|
|
1081
|
+
"liveText": "zE6uZW_liveText",
|
|
1082
|
+
"bookSwitchName": "zE6uZW_bookSwitchName",
|
|
1083
|
+
"shelfFilters": "zE6uZW_shelfFilters",
|
|
1084
|
+
"bookCardBlurb": "zE6uZW_bookCardBlurb",
|
|
1116
1085
|
"toolStepStatus": "zE6uZW_toolStepStatus",
|
|
1117
|
-
"
|
|
1118
|
-
"
|
|
1119
|
-
"
|
|
1120
|
-
"
|
|
1121
|
-
"
|
|
1086
|
+
"wsColumn": "zE6uZW_wsColumn",
|
|
1087
|
+
"todoInfo": "zE6uZW_todoInfo",
|
|
1088
|
+
"bookCardMetaRow": "zE6uZW_bookCardMetaRow",
|
|
1089
|
+
"workflowDotDone": "zE6uZW_workflowDotDone",
|
|
1090
|
+
"input": "zE6uZW_input",
|
|
1091
|
+
"legendOld": "zE6uZW_legendOld",
|
|
1122
1092
|
"dashHeroArrow": "zE6uZW_dashHeroArrow",
|
|
1123
|
-
"
|
|
1124
|
-
"
|
|
1125
|
-
"
|
|
1126
|
-
"
|
|
1127
|
-
"
|
|
1128
|
-
"
|
|
1129
|
-
"
|
|
1130
|
-
"bigProgressBarFill": "zE6uZW_bigProgressBarFill",
|
|
1093
|
+
"bookCardTitleRow": "zE6uZW_bookCardTitleRow",
|
|
1094
|
+
"shelfSearch": "zE6uZW_shelfSearch",
|
|
1095
|
+
"wsColumns": "zE6uZW_wsColumns",
|
|
1096
|
+
"readerArticle": "zE6uZW_readerArticle",
|
|
1097
|
+
"badgeGenerating": "zE6uZW_badgeGenerating",
|
|
1098
|
+
"panelTitle": "zE6uZW_panelTitle",
|
|
1099
|
+
"fieldLabel": "zE6uZW_fieldLabel",
|
|
1131
1100
|
"readerSegActive": "zE6uZW_readerSegActive",
|
|
1132
|
-
"
|
|
1133
|
-
"
|
|
1134
|
-
"
|
|
1135
|
-
"
|
|
1136
|
-
"
|
|
1137
|
-
"
|
|
1138
|
-
"
|
|
1139
|
-
"readerGroupTitle": "zE6uZW_readerGroupTitle",
|
|
1140
|
-
"shelfView": "zE6uZW_shelfView",
|
|
1141
|
-
"chapterTitle": "zE6uZW_chapterTitle",
|
|
1142
|
-
"toolStepError": "zE6uZW_toolStepError",
|
|
1101
|
+
"diffDel": "zE6uZW_diffDel",
|
|
1102
|
+
"bookCreateCard": "zE6uZW_bookCreateCard",
|
|
1103
|
+
"readerMain": "zE6uZW_readerMain",
|
|
1104
|
+
"dashFacts": "zE6uZW_dashFacts",
|
|
1105
|
+
"todoWarning": "zE6uZW_todoWarning",
|
|
1106
|
+
"shelfHeader": "zE6uZW_shelfHeader",
|
|
1107
|
+
"tlSegFill": "zE6uZW_tlSegFill",
|
|
1143
1108
|
"createBookTitle": "zE6uZW_createBookTitle",
|
|
1144
|
-
"
|
|
1109
|
+
"bookSwitchArrow": "zE6uZW_bookSwitchArrow",
|
|
1110
|
+
"bookSwitchCover": "zE6uZW_bookSwitchCover",
|
|
1111
|
+
"dashHeroBook": "zE6uZW_dashHeroBook",
|
|
1112
|
+
"progressLine": "zE6uZW_progressLine",
|
|
1113
|
+
"tlBar": "zE6uZW_tlBar",
|
|
1114
|
+
"dashStageDot": "zE6uZW_dashStageDot",
|
|
1115
|
+
"toolStepActive": "zE6uZW_toolStepActive",
|
|
1116
|
+
"statCardDIcon": "zE6uZW_statCardDIcon",
|
|
1117
|
+
"diffList": "zE6uZW_diffList",
|
|
1118
|
+
"dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
|
|
1119
|
+
"navActions": "zE6uZW_navActions",
|
|
1120
|
+
"assistantFloatHeader": "zE6uZW_assistantFloatHeader",
|
|
1121
|
+
"workflowRow": "zE6uZW_workflowRow",
|
|
1122
|
+
"navTab": "zE6uZW_navTab",
|
|
1123
|
+
"todoItem": "zE6uZW_todoItem",
|
|
1124
|
+
"statCardDUnit": "zE6uZW_statCardDUnit",
|
|
1125
|
+
"tabBar": "zE6uZW_tabBar",
|
|
1126
|
+
"badgePending": "zE6uZW_badgePending",
|
|
1127
|
+
"badgeDone": "zE6uZW_badgeDone",
|
|
1128
|
+
"diffSameBody": "zE6uZW_diffSameBody",
|
|
1129
|
+
"meta": "zE6uZW_meta",
|
|
1130
|
+
"navTabLabel": "zE6uZW_navTabLabel",
|
|
1131
|
+
"bookCardName": "zE6uZW_bookCardName",
|
|
1132
|
+
"diffChange": "zE6uZW_diffChange",
|
|
1133
|
+
"wsPreview": "zE6uZW_wsPreview",
|
|
1134
|
+
"navTitle": "zE6uZW_navTitle",
|
|
1135
|
+
"statCardDValue": "zE6uZW_statCardDValue",
|
|
1136
|
+
"chapterNum": "zE6uZW_chapterNum",
|
|
1137
|
+
"bookshelfList": "zE6uZW_bookshelfList",
|
|
1138
|
+
"readerChapterMeta": "zE6uZW_readerChapterMeta",
|
|
1139
|
+
"dashStage": "zE6uZW_dashStage",
|
|
1140
|
+
"bookChipActive": "zE6uZW_bookChipActive",
|
|
1141
|
+
"buttonPrimary": "zE6uZW_buttonPrimary",
|
|
1142
|
+
"chapterTitle": "zE6uZW_chapterTitle",
|
|
1143
|
+
"navAboutRow": "zE6uZW_navAboutRow",
|
|
1144
|
+
"wsAppliedBanner": "zE6uZW_wsAppliedBanner",
|
|
1145
|
+
"bookCardActive": "zE6uZW_bookCardActive",
|
|
1146
|
+
"statCardDDetail": "zE6uZW_statCardDDetail",
|
|
1147
|
+
"badge": "zE6uZW_badge",
|
|
1148
|
+
"genreDesc": "zE6uZW_genreDesc",
|
|
1149
|
+
"statCardDIconRed": "zE6uZW_statCardDIconRed",
|
|
1150
|
+
"progressLineDone": "zE6uZW_progressLineDone",
|
|
1151
|
+
"readerLoading": "zE6uZW_readerLoading",
|
|
1152
|
+
"assistantStatusBusy": "zE6uZW_assistantStatusBusy",
|
|
1153
|
+
"legendNew": "zE6uZW_legendNew",
|
|
1154
|
+
"bookCardBody": "zE6uZW_bookCardBody",
|
|
1155
|
+
"chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
|
|
1156
|
+
"navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
|
|
1157
|
+
"wsPageHeader": "zE6uZW_wsPageHeader",
|
|
1158
|
+
"bookChip": "zE6uZW_bookChip",
|
|
1159
|
+
"bookCardActions": "zE6uZW_bookCardActions",
|
|
1160
|
+
"readerGroupCount": "zE6uZW_readerGroupCount",
|
|
1161
|
+
"diffNew": "zE6uZW_diffNew",
|
|
1162
|
+
"bookSwitch": "zE6uZW_bookSwitch",
|
|
1163
|
+
"chatBubbleUser": "zE6uZW_chatBubbleUser",
|
|
1164
|
+
"tlSegDone": "zE6uZW_tlSegDone",
|
|
1165
|
+
"chapterFocusPulse": "zE6uZW_chapterFocusPulse",
|
|
1166
|
+
"dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
|
|
1167
|
+
"chapterFocus": "zE6uZW_chapterFocus",
|
|
1168
|
+
"chatScroll": "zE6uZW_chatScroll",
|
|
1169
|
+
"badgeError": "zE6uZW_badgeError",
|
|
1170
|
+
"shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
|
|
1171
|
+
"readerView": "zE6uZW_readerView",
|
|
1172
|
+
"navTitleLogo": "zE6uZW_navTitleLogo",
|
|
1173
|
+
"dashHeroTitle": "zE6uZW_dashHeroTitle",
|
|
1174
|
+
"onlyChanges": "zE6uZW_onlyChanges",
|
|
1175
|
+
"panelNav": "zE6uZW_panelNav",
|
|
1145
1176
|
"field": "zE6uZW_field",
|
|
1146
|
-
"
|
|
1177
|
+
"entry": "zE6uZW_entry",
|
|
1178
|
+
"diffSame": "zE6uZW_diffSame",
|
|
1179
|
+
"diffOld": "zE6uZW_diffOld",
|
|
1180
|
+
"dashJourneyFill": "zE6uZW_dashJourneyFill",
|
|
1181
|
+
"spaceBetween": "zE6uZW_spaceBetween",
|
|
1182
|
+
"readerText": "zE6uZW_readerText",
|
|
1183
|
+
"readerSeg": "zE6uZW_readerSeg",
|
|
1184
|
+
"panel": "zE6uZW_panel",
|
|
1185
|
+
"progressBarFill": "zE6uZW_progressBarFill",
|
|
1186
|
+
"createBookIcon": "zE6uZW_createBookIcon"
|
|
1147
1187
|
};
|
|
1148
1188
|
//#endregion
|
|
1149
1189
|
//#region src/client/panel/AssistantTab.tsx
|
|
@@ -1607,6 +1647,29 @@ window.__ModuleLoader__.load({
|
|
|
1607
1647
|
}, child.name))
|
|
1608
1648
|
})] });
|
|
1609
1649
|
}
|
|
1650
|
+
/** 子页签定义。 */
|
|
1651
|
+
const SUB_TABS = [
|
|
1652
|
+
{
|
|
1653
|
+
id: "genre",
|
|
1654
|
+
label: "题材基底"
|
|
1655
|
+
},
|
|
1656
|
+
{
|
|
1657
|
+
id: "progression",
|
|
1658
|
+
label: "推进模式"
|
|
1659
|
+
},
|
|
1660
|
+
{
|
|
1661
|
+
id: "templates",
|
|
1662
|
+
label: "笔法帖"
|
|
1663
|
+
},
|
|
1664
|
+
{
|
|
1665
|
+
id: "rules",
|
|
1666
|
+
label: "文戒"
|
|
1667
|
+
},
|
|
1668
|
+
{
|
|
1669
|
+
id: "style",
|
|
1670
|
+
label: "心法"
|
|
1671
|
+
}
|
|
1672
|
+
];
|
|
1610
1673
|
/** 写作资产页签。 */
|
|
1611
1674
|
function AssetsTab({ api, initialTab = "genre" }) {
|
|
1612
1675
|
const [assetTab, setAssetTab] = (0, react.useState)(initialTab);
|
|
@@ -1783,6 +1846,24 @@ window.__ModuleLoader__.load({
|
|
|
1783
1846
|
minHeight: 0
|
|
1784
1847
|
},
|
|
1785
1848
|
children: [
|
|
1849
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1850
|
+
className: panel_module_css_default.row,
|
|
1851
|
+
style: {
|
|
1852
|
+
justifyContent: "space-between",
|
|
1853
|
+
flexWrap: "wrap"
|
|
1854
|
+
},
|
|
1855
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1856
|
+
className: panel_module_css_default.cardTitle,
|
|
1857
|
+
style: {
|
|
1858
|
+
fontSize: 17,
|
|
1859
|
+
fontWeight: 700
|
|
1860
|
+
},
|
|
1861
|
+
children: "🧰 创作资产"
|
|
1862
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1863
|
+
className: panel_module_css_default.meta,
|
|
1864
|
+
children: "题材基底 / 推进模式 / 笔法帖 / 文戒 / 心法"
|
|
1865
|
+
})]
|
|
1866
|
+
}),
|
|
1786
1867
|
error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1787
1868
|
className: panel_module_css_default.card,
|
|
1788
1869
|
style: { borderColor: "var(--nf-error)" },
|
|
@@ -1883,6 +1964,25 @@ window.__ModuleLoader__.load({
|
|
|
1883
1964
|
})
|
|
1884
1965
|
]
|
|
1885
1966
|
}),
|
|
1967
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1968
|
+
className: panel_module_css_default.row,
|
|
1969
|
+
style: {
|
|
1970
|
+
flexWrap: "wrap",
|
|
1971
|
+
gap: 6
|
|
1972
|
+
},
|
|
1973
|
+
children: SUB_TABS.map((t) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
1974
|
+
type: "button",
|
|
1975
|
+
className: `${panel_module_css_default.button} ${assetTab === t.id ? panel_module_css_default.buttonPrimary : ""}`,
|
|
1976
|
+
style: {
|
|
1977
|
+
fontSize: 14,
|
|
1978
|
+
flex: 1
|
|
1979
|
+
},
|
|
1980
|
+
onClick: () => {
|
|
1981
|
+
setAssetTab(t.id);
|
|
1982
|
+
},
|
|
1983
|
+
children: t.label
|
|
1984
|
+
}, t.id))
|
|
1985
|
+
}),
|
|
1886
1986
|
assetTab === "genre" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1887
1987
|
className: panel_module_css_default.card,
|
|
1888
1988
|
children: [
|
|
@@ -2541,47 +2641,60 @@ window.__ModuleLoader__.load({
|
|
|
2541
2641
|
className: panel_module_css_default.shelfView,
|
|
2542
2642
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2543
2643
|
className: panel_module_css_default.shelfHeader,
|
|
2544
|
-
children: [
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
className:
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2644
|
+
children: [
|
|
2645
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2646
|
+
className: panel_module_css_default.shelfTitleRow,
|
|
2647
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
|
|
2648
|
+
className: panel_module_css_default.panelTitle,
|
|
2649
|
+
style: { margin: 0 },
|
|
2650
|
+
children: "📚 书架"
|
|
2651
|
+
}), shelf.books.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
2652
|
+
className: panel_module_css_default.meta,
|
|
2653
|
+
children: [
|
|
2654
|
+
shelf.books.length,
|
|
2655
|
+
" 本书 · ",
|
|
2656
|
+
stats.active,
|
|
2657
|
+
" 进行中 · ",
|
|
2658
|
+
stats.done,
|
|
2659
|
+
" 已完结 · ",
|
|
2660
|
+
stats.none,
|
|
2661
|
+
" 未开书"
|
|
2662
|
+
]
|
|
2663
|
+
})]
|
|
2664
|
+
}),
|
|
2665
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
2666
|
+
className: panel_module_css_default.shelfToolbar,
|
|
2667
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
2668
|
+
className: `${panel_module_css_default.input} ${panel_module_css_default.shelfSearch}`,
|
|
2669
|
+
type: "search",
|
|
2670
|
+
placeholder: "🔍 搜索书名 / 简介…",
|
|
2671
|
+
value: query,
|
|
2672
|
+
onChange: (e) => {
|
|
2673
|
+
setQuery(e.target.value);
|
|
2674
|
+
}
|
|
2675
|
+
})
|
|
2676
|
+
}),
|
|
2677
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
2574
2678
|
className: panel_module_css_default.shelfFilters,
|
|
2679
|
+
style: {
|
|
2680
|
+
display: "flex",
|
|
2681
|
+
gap: 6,
|
|
2682
|
+
flexWrap: "wrap"
|
|
2683
|
+
},
|
|
2575
2684
|
children: filters.map((f) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
2576
2685
|
type: "button",
|
|
2577
|
-
className: `${panel_module_css_default.button} ${
|
|
2686
|
+
className: `${panel_module_css_default.button} ${filter === f.id ? panel_module_css_default.buttonPrimary : ""}`,
|
|
2687
|
+
style: {
|
|
2688
|
+
fontSize: 14,
|
|
2689
|
+
flex: 1
|
|
2690
|
+
},
|
|
2578
2691
|
onClick: () => {
|
|
2579
2692
|
setFilter(f.id);
|
|
2580
2693
|
},
|
|
2581
2694
|
children: [f.label, f.count > 0 ? `(${f.count})` : ""]
|
|
2582
2695
|
}, f.id))
|
|
2583
|
-
})
|
|
2584
|
-
|
|
2696
|
+
})
|
|
2697
|
+
]
|
|
2585
2698
|
}), shelf.books.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2586
2699
|
className: panel_module_css_default.shelfEmpty,
|
|
2587
2700
|
children: [
|
|
@@ -5414,7 +5527,7 @@ window.__ModuleLoader__.load({
|
|
|
5414
5527
|
},
|
|
5415
5528
|
{
|
|
5416
5529
|
id: "blurb",
|
|
5417
|
-
label: "
|
|
5530
|
+
label: "简介 / 封面",
|
|
5418
5531
|
icon: "📖"
|
|
5419
5532
|
},
|
|
5420
5533
|
{
|
|
@@ -5424,13 +5537,13 @@ window.__ModuleLoader__.load({
|
|
|
5424
5537
|
},
|
|
5425
5538
|
{
|
|
5426
5539
|
id: "plotlines",
|
|
5427
|
-
label:
|
|
5428
|
-
icon: "
|
|
5540
|
+
label: "长线管理",
|
|
5541
|
+
icon: "📜"
|
|
5429
5542
|
},
|
|
5430
5543
|
{
|
|
5431
|
-
id: "
|
|
5432
|
-
label: "
|
|
5433
|
-
icon: "
|
|
5544
|
+
id: "book",
|
|
5545
|
+
label: "本书设定",
|
|
5546
|
+
icon: "📚"
|
|
5434
5547
|
}
|
|
5435
5548
|
]
|
|
5436
5549
|
},
|
|
@@ -5457,69 +5570,22 @@ window.__ModuleLoader__.load({
|
|
|
5457
5570
|
id: "storyboard",
|
|
5458
5571
|
label: "漫剧工坊",
|
|
5459
5572
|
icon: "🎬"
|
|
5460
|
-
}
|
|
5461
|
-
]
|
|
5462
|
-
},
|
|
5463
|
-
{
|
|
5464
|
-
id: "db",
|
|
5465
|
-
label: "数据库",
|
|
5466
|
-
items: [
|
|
5467
|
-
{
|
|
5468
|
-
id: "bible",
|
|
5469
|
-
label: tt("tab.bible"),
|
|
5470
|
-
icon: "📖"
|
|
5471
|
-
},
|
|
5472
|
-
{
|
|
5473
|
-
id: "world",
|
|
5474
|
-
label: "大世界",
|
|
5475
|
-
icon: "🌍"
|
|
5476
|
-
},
|
|
5477
|
-
{
|
|
5478
|
-
id: "roles",
|
|
5479
|
-
label: "角色库",
|
|
5480
|
-
icon: "👥"
|
|
5481
|
-
},
|
|
5482
|
-
{
|
|
5483
|
-
id: "foreshadow",
|
|
5484
|
-
label: tt("tab.foreshadow"),
|
|
5485
|
-
icon: "🔮"
|
|
5486
|
-
},
|
|
5487
|
-
{
|
|
5488
|
-
id: "facts",
|
|
5489
|
-
label: tt("tab.facts"),
|
|
5490
|
-
icon: "📜"
|
|
5491
|
-
},
|
|
5492
|
-
{
|
|
5493
|
-
id: "reviews",
|
|
5494
|
-
label: "复盘记录",
|
|
5495
|
-
icon: "📋"
|
|
5496
|
-
},
|
|
5497
|
-
{
|
|
5498
|
-
id: "assetsGenre",
|
|
5499
|
-
label: "题材基底",
|
|
5500
|
-
icon: "🏷️"
|
|
5501
5573
|
},
|
|
5502
5574
|
{
|
|
5503
|
-
id: "
|
|
5504
|
-
label: "
|
|
5505
|
-
icon: "
|
|
5506
|
-
},
|
|
5507
|
-
{
|
|
5508
|
-
id: "assetsTemplates",
|
|
5509
|
-
label: "笔法帖",
|
|
5510
|
-
icon: "🖋️"
|
|
5511
|
-
},
|
|
5512
|
-
{
|
|
5513
|
-
id: "assetsRules",
|
|
5514
|
-
label: "文戒",
|
|
5515
|
-
icon: "🚫"
|
|
5516
|
-
},
|
|
5517
|
-
{
|
|
5518
|
-
id: "assetsStyle",
|
|
5519
|
-
label: "心法",
|
|
5520
|
-
icon: "🎨"
|
|
5575
|
+
id: "run",
|
|
5576
|
+
label: "生产单",
|
|
5577
|
+
icon: "🏭"
|
|
5521
5578
|
}
|
|
5522
5579
|
]
|
|
5580
|
+
},
|
|
5581
|
+
{
|
|
5582
|
+
id: "assets",
|
|
5583
|
+
label: "资产",
|
|
5584
|
+
items: [{
|
|
5585
|
+
id: "assets",
|
|
5586
|
+
label: "创作资产",
|
|
5587
|
+
icon: "🧰"
|
|
5588
|
+
}]
|
|
5523
5589
|
}
|
|
5524
5590
|
];
|
|
5525
5591
|
/** Settings tab — pinned to the bottom of the nav rail. */
|
|
@@ -5528,7 +5594,20 @@ window.__ModuleLoader__.load({
|
|
|
5528
5594
|
label: tt("tab.settings"),
|
|
5529
5595
|
icon: "⚙️"
|
|
5530
5596
|
};
|
|
5531
|
-
|
|
5597
|
+
/** Common DeepSeek model presets shown in settings; users can also type any model id. */
|
|
5598
|
+
const MODEL_PRESETS = [
|
|
5599
|
+
"deepseek-v4-flash",
|
|
5600
|
+
"deepseek-v4-pro",
|
|
5601
|
+
"deepseek-chat",
|
|
5602
|
+
"deepseek-reasoner"
|
|
5603
|
+
];
|
|
5604
|
+
const REASONING_OPTIONS = [
|
|
5605
|
+
"off",
|
|
5606
|
+
"low",
|
|
5607
|
+
"high",
|
|
5608
|
+
"max"
|
|
5609
|
+
];
|
|
5610
|
+
const PLUGIN_VERSION = "1.2.0";
|
|
5532
5611
|
/** GitHub 仓库地址(关于区块点击跳转)。 */
|
|
5533
5612
|
const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
|
|
5534
5613
|
/** Whether any chapter is being generated right now. */
|
|
@@ -5794,9 +5873,12 @@ window.__ModuleLoader__.load({
|
|
|
5794
5873
|
const [notice, setNotice] = (0, react.useState)("");
|
|
5795
5874
|
const [progress, setProgress] = (0, react.useState)([]);
|
|
5796
5875
|
const [configDraft, setConfigDraft] = (0, react.useState)(null);
|
|
5876
|
+
const [modelCustomMode, setModelCustomMode] = (0, react.useState)(false);
|
|
5797
5877
|
const [expandedChapter, setExpandedChapter] = (0, react.useState)(null);
|
|
5798
5878
|
/** 复盘记录页:当前展开的章节号。 */
|
|
5799
5879
|
const [expandedReviewChapter, setExpandedReviewChapter] = (0, react.useState)(null);
|
|
5880
|
+
/** 复盘记录页:按卷折叠,卷号 → 是否展开(默认全部收起)。 */
|
|
5881
|
+
const [expandedVolumes, setExpandedVolumes] = (0, react.useState)({});
|
|
5800
5882
|
const [chapterText, setChapterText] = (0, react.useState)("");
|
|
5801
5883
|
const progressId = (0, react.useRef)(0);
|
|
5802
5884
|
/** id of the single live progress row (generation counter), if any. */
|
|
@@ -5860,6 +5942,8 @@ window.__ModuleLoader__.load({
|
|
|
5860
5942
|
const [updatingOutline, setUpdatingOutline] = (0, react.useState)(false);
|
|
5861
5943
|
/** 全书质检结果(null = 未运行)。 */
|
|
5862
5944
|
const [auditIssues, setAuditIssues] = (0, react.useState)(null);
|
|
5945
|
+
/** 全书质检实时状态(来自 /status,用于显示进度)。 */
|
|
5946
|
+
const [auditStatus, setAuditStatus] = (0, react.useState)(null);
|
|
5863
5947
|
/** 角色卡(从事实库聚合)。 */
|
|
5864
5948
|
const [charCards, setCharCards] = (0, react.useState)(null);
|
|
5865
5949
|
/** 世界观规则编辑草稿(bible tab,每行一条)。 */
|
|
@@ -5880,6 +5964,49 @@ window.__ModuleLoader__.load({
|
|
|
5880
5964
|
const [focusNo, setFocusNo] = (0, react.useState)(null);
|
|
5881
5965
|
/** 剧情线编辑草稿(null = 未在编辑)。 */
|
|
5882
5966
|
const [plotlineDraft, setPlotlineDraft] = (0, react.useState)(null);
|
|
5967
|
+
/** 长线管理页:子页签(剧情线 / 伏笔),localStorage 记忆。 */
|
|
5968
|
+
const [longlineTab, setLonglineTab] = (0, react.useState)(() => {
|
|
5969
|
+
try {
|
|
5970
|
+
return window.localStorage.getItem("dsh-novel-forge.longline.tab") === "foreshadow" ? "foreshadow" : "plotlines";
|
|
5971
|
+
} catch {
|
|
5972
|
+
return "plotlines";
|
|
5973
|
+
}
|
|
5974
|
+
});
|
|
5975
|
+
const changeLonglineTab = (next) => {
|
|
5976
|
+
setLonglineTab(next);
|
|
5977
|
+
try {
|
|
5978
|
+
window.localStorage.setItem("dsh-novel-forge.longline.tab", next);
|
|
5979
|
+
} catch {}
|
|
5980
|
+
};
|
|
5981
|
+
/** 编年 / 复盘页:子页签(编年录 / 复盘记录),localStorage 记忆。 */
|
|
5982
|
+
const [archiveTab, setArchiveTab] = (0, react.useState)(() => {
|
|
5983
|
+
try {
|
|
5984
|
+
return window.localStorage.getItem("dsh-novel-forge.archive.tab") === "reviews" ? "reviews" : "facts";
|
|
5985
|
+
} catch {
|
|
5986
|
+
return "facts";
|
|
5987
|
+
}
|
|
5988
|
+
});
|
|
5989
|
+
const changeArchiveTab = (next) => {
|
|
5990
|
+
setArchiveTab(next);
|
|
5991
|
+
try {
|
|
5992
|
+
window.localStorage.setItem("dsh-novel-forge.archive.tab", next);
|
|
5993
|
+
} catch {}
|
|
5994
|
+
};
|
|
5995
|
+
/** 本书设定页:子页签(设定库 / 大世界 / 角色库 / 编年·复盘),localStorage 记忆。 */
|
|
5996
|
+
const [bookTab, setBookTab] = (0, react.useState)(() => {
|
|
5997
|
+
try {
|
|
5998
|
+
const v = window.localStorage.getItem("dsh-novel-forge.book.tab");
|
|
5999
|
+
return v === "world" || v === "roles" || v === "facts" ? v : "bible";
|
|
6000
|
+
} catch {
|
|
6001
|
+
return "bible";
|
|
6002
|
+
}
|
|
6003
|
+
});
|
|
6004
|
+
const changeBookTab = (next) => {
|
|
6005
|
+
setBookTab(next);
|
|
6006
|
+
try {
|
|
6007
|
+
window.localStorage.setItem("dsh-novel-forge.book.tab", next);
|
|
6008
|
+
} catch {}
|
|
6009
|
+
};
|
|
5883
6010
|
/** 角色知情度编辑草稿(角色名 → 文本,每行一条)。 */
|
|
5884
6011
|
const [knowledgeDraft, setKnowledgeDraft] = (0, react.useState)({});
|
|
5885
6012
|
/** 角色库:AI 提炼候选(null = 未运行;localStorage 持久化,刷新不丢)。 */
|
|
@@ -6121,6 +6248,8 @@ window.__ModuleLoader__.load({
|
|
|
6121
6248
|
const status = await api.status();
|
|
6122
6249
|
setConfig(status.config);
|
|
6123
6250
|
setConfigDraft(status.config);
|
|
6251
|
+
setModelCustomMode(!MODEL_PRESETS.includes(status.config.model));
|
|
6252
|
+
setAuditStatus(status.audit ?? null);
|
|
6124
6253
|
setProject(status.project ?? null);
|
|
6125
6254
|
if (status.project?.roleStatus !== void 0) setCharCards(status.project.roleStatus);
|
|
6126
6255
|
else setCharCards(null);
|
|
@@ -6244,16 +6373,34 @@ window.__ModuleLoader__.load({
|
|
|
6244
6373
|
setBusy(true);
|
|
6245
6374
|
setBusyLabel("全书一致性质检中…");
|
|
6246
6375
|
setError("");
|
|
6376
|
+
setAuditStatus({
|
|
6377
|
+
status: "running",
|
|
6378
|
+
totalBatches: 0,
|
|
6379
|
+
completedBatches: 0
|
|
6380
|
+
});
|
|
6381
|
+
let stopped = false;
|
|
6382
|
+
const poll = window.setInterval(async () => {
|
|
6383
|
+
if (stopped) return;
|
|
6384
|
+
try {
|
|
6385
|
+
const s = await api.status();
|
|
6386
|
+
if (s.audit !== void 0) setAuditStatus(s.audit);
|
|
6387
|
+
} catch {}
|
|
6388
|
+
}, 1e3);
|
|
6247
6389
|
try {
|
|
6248
6390
|
const result = await api.audit();
|
|
6391
|
+
if (stopped) return;
|
|
6249
6392
|
setAuditIssues(result.issues);
|
|
6250
6393
|
pushProgress(result.issues.length === 0 ? `全书质检完成:${result.auditedChapters} 章未发现矛盾 🎉` : `全书质检完成:发现 ${result.issues.length} 处疑似矛盾`, result.issues.length === 0 ? "done" : "error");
|
|
6251
6394
|
} catch (err) {
|
|
6395
|
+
if (stopped) return;
|
|
6252
6396
|
setError(err.message);
|
|
6253
6397
|
pushProgress(`全书质检失败:${err.message}`, "error");
|
|
6254
6398
|
} finally {
|
|
6399
|
+
stopped = true;
|
|
6400
|
+
window.clearInterval(poll);
|
|
6255
6401
|
setBusy(false);
|
|
6256
6402
|
setBusyLabel("");
|
|
6403
|
+
await refresh(false);
|
|
6257
6404
|
}
|
|
6258
6405
|
};
|
|
6259
6406
|
/** 角色卡刷新。 */
|
|
@@ -6601,7 +6748,7 @@ window.__ModuleLoader__.load({
|
|
|
6601
6748
|
};
|
|
6602
6749
|
/** 作者复盘补跑:全书缺失章节(流式)。 */
|
|
6603
6750
|
const handleAuthorBackfillAll = async () => {
|
|
6604
|
-
const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.authorReview === void 0).length;
|
|
6751
|
+
const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.status !== "error" && c.authorReview === void 0).length;
|
|
6605
6752
|
setBusy(true);
|
|
6606
6753
|
setBusyLabel(`补齐历史章节作者复盘(${missing} 章)…`);
|
|
6607
6754
|
setError("");
|
|
@@ -7478,6 +7625,7 @@ window.__ModuleLoader__.load({
|
|
|
7478
7625
|
outputDir: configDraft.outputDir,
|
|
7479
7626
|
provider: configDraft.provider,
|
|
7480
7627
|
model: configDraft.model,
|
|
7628
|
+
reasoningEffort: configDraft.reasoningEffort ?? "off",
|
|
7481
7629
|
chapterChars: configDraft.chapterChars,
|
|
7482
7630
|
maxTokens: configDraft.maxTokens,
|
|
7483
7631
|
reviewPassScore: configDraft.reviewPassScore,
|
|
@@ -7584,6 +7732,7 @@ window.__ModuleLoader__.load({
|
|
|
7584
7732
|
}, [chapters, volumes]);
|
|
7585
7733
|
const approvedCount = chapters.filter((c) => c.status === "approved").length;
|
|
7586
7734
|
const reviewPendingCount = chapters.filter((c) => c.status === "written" || c.status === "rejected").length;
|
|
7735
|
+
const writingNow = chapters.find((c) => c.status === "generating" || c.status === "reviewing");
|
|
7587
7736
|
const totalChars = chapters.reduce((sum, c) => sum + (c.chars ?? 0), 0);
|
|
7588
7737
|
const firstChapter = chapters[0];
|
|
7589
7738
|
const currentVolumeName = (() => {
|
|
@@ -7633,6 +7782,33 @@ window.__ModuleLoader__.load({
|
|
|
7633
7782
|
const journeyDoneCount = journeyStages.filter((s) => s.done).length;
|
|
7634
7783
|
const journeyPercent = Math.round(journeyDoneCount / journeyStages.length * 100);
|
|
7635
7784
|
const currentStageId = journeyStages.find((s) => !s.done)?.id;
|
|
7785
|
+
/** 创作时间线阶段点击 → 跳转对应 tab。 */
|
|
7786
|
+
const jumpToStage = (id) => {
|
|
7787
|
+
switch (id) {
|
|
7788
|
+
case "outline":
|
|
7789
|
+
setActiveTab("overview");
|
|
7790
|
+
break;
|
|
7791
|
+
case "bible":
|
|
7792
|
+
setActiveTab("book");
|
|
7793
|
+
changeBookTab("bible");
|
|
7794
|
+
break;
|
|
7795
|
+
case "volumes":
|
|
7796
|
+
case "plan":
|
|
7797
|
+
case "write":
|
|
7798
|
+
setActiveTab("plan");
|
|
7799
|
+
break;
|
|
7800
|
+
case "review":
|
|
7801
|
+
setActiveTab("book");
|
|
7802
|
+
changeBookTab("facts");
|
|
7803
|
+
changeArchiveTab("reviews");
|
|
7804
|
+
break;
|
|
7805
|
+
}
|
|
7806
|
+
};
|
|
7807
|
+
/** 侧栏当前书卡(demo 风格):书架激活书 → 封面首字 / 书名 / 进度。 */
|
|
7808
|
+
const activeBook = shelf?.books.find((b) => b.id === shelf?.activeBookId) ?? null;
|
|
7809
|
+
const activeBookName = activeBook?.bookName ?? project?.bookName ?? "未选书";
|
|
7810
|
+
const activeBookMeta = activeBook !== null ? `${activeBook.done}/${activeBook.total} 章 · 点按打开书架` : "点按打开书架";
|
|
7811
|
+
const activeBookLetter = activeBookName.trim().charAt(0) || "书";
|
|
7636
7812
|
/** 主行动卡片:推荐下一步(AI-Novel-Writing-Assistant 首页主卡模式)。 */
|
|
7637
7813
|
const nextAction = (0, react.useMemo)(() => {
|
|
7638
7814
|
if (project === null) return {
|
|
@@ -7840,82 +8016,30 @@ window.__ModuleLoader__.load({
|
|
|
7840
8016
|
onOpenWorkspace: () => {
|
|
7841
8017
|
setViewMode("workspace");
|
|
7842
8018
|
}
|
|
7843
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.
|
|
7844
|
-
className: panel_module_css_default.panelHeader,
|
|
7845
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7846
|
-
style: {
|
|
7847
|
-
display: "flex",
|
|
7848
|
-
flexDirection: "column",
|
|
7849
|
-
gap: 2,
|
|
7850
|
-
minWidth: 0
|
|
7851
|
-
},
|
|
7852
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
|
|
7853
|
-
className: panel_module_css_default.panelTitle,
|
|
7854
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
7855
|
-
type: "button",
|
|
7856
|
-
className: panel_module_css_default.iconButton,
|
|
7857
|
-
title: "返回书架",
|
|
7858
|
-
"aria-label": "返回书架",
|
|
7859
|
-
onClick: () => {
|
|
7860
|
-
setViewMode("shelf");
|
|
7861
|
-
},
|
|
7862
|
-
children: "←"
|
|
7863
|
-
}), tt("panel.title")]
|
|
7864
|
-
}), project?.bookName !== "" && project?.bookName !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7865
|
-
className: panel_module_css_default.panelSubtitle,
|
|
7866
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["📖 ", project.bookName] }), chapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
7867
|
-
className: panel_module_css_default.headerProgress,
|
|
7868
|
-
children: [
|
|
7869
|
-
"已完成 ",
|
|
7870
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: doneCount }),
|
|
7871
|
-
"/",
|
|
7872
|
-
chapters.length,
|
|
7873
|
-
" 章",
|
|
7874
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.headerProgressDot }),
|
|
7875
|
-
"通过 ",
|
|
7876
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: chapters.filter((c) => c.status === "approved").length })
|
|
7877
|
-
]
|
|
7878
|
-
})]
|
|
7879
|
-
})]
|
|
7880
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7881
|
-
style: {
|
|
7882
|
-
display: "flex",
|
|
7883
|
-
alignItems: "center",
|
|
7884
|
-
gap: 2
|
|
7885
|
-
},
|
|
7886
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
7887
|
-
type: "button",
|
|
7888
|
-
className: panel_module_css_default.iconButton,
|
|
7889
|
-
title: navCollapsed ? "展开导航栏" : "收起导航栏",
|
|
7890
|
-
"aria-label": navCollapsed ? "展开导航栏" : "收起导航栏",
|
|
7891
|
-
onClick: () => {
|
|
7892
|
-
setNavCollapsed((prev) => {
|
|
7893
|
-
const next = !prev;
|
|
7894
|
-
try {
|
|
7895
|
-
window.localStorage.setItem("dsh-novel-forge.nav.collapsed", String(next));
|
|
7896
|
-
} catch {}
|
|
7897
|
-
return next;
|
|
7898
|
-
});
|
|
7899
|
-
},
|
|
7900
|
-
children: navCollapsed ? "▸" : "◂"
|
|
7901
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
7902
|
-
type: "button",
|
|
7903
|
-
className: panel_module_css_default.iconButton,
|
|
7904
|
-
title: tt("common.close"),
|
|
7905
|
-
"aria-label": tt("common.close"),
|
|
7906
|
-
onClick: () => {
|
|
7907
|
-
controller.close();
|
|
7908
|
-
},
|
|
7909
|
-
children: "×"
|
|
7910
|
-
})]
|
|
7911
|
-
})]
|
|
7912
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8019
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7913
8020
|
className: panel_module_css_default.panelBody,
|
|
7914
8021
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("nav", {
|
|
7915
8022
|
className: `${panel_module_css_default.panelNav} ${navCollapsed ? panel_module_css_default.panelNavCollapsed : ""}`,
|
|
7916
8023
|
role: "tablist",
|
|
7917
8024
|
"aria-label": "工作台导航",
|
|
7918
8025
|
children: [
|
|
8026
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8027
|
+
className: panel_module_css_default.navTitle,
|
|
8028
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8029
|
+
className: panel_module_css_default.navTitleLogo,
|
|
8030
|
+
children: "书"
|
|
8031
|
+
}), !navCollapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8032
|
+
style: { minWidth: 0 },
|
|
8033
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8034
|
+
className: panel_module_css_default.navTitleName,
|
|
8035
|
+
children: "小说工坊"
|
|
8036
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8037
|
+
className: panel_module_css_default.navTitleBook,
|
|
8038
|
+
title: project?.bookName ?? "",
|
|
8039
|
+
children: project?.bookName !== void 0 && project.bookName !== "" ? `📖 ${project.bookName}` : "未选书"
|
|
8040
|
+
})]
|
|
8041
|
+
})]
|
|
8042
|
+
}),
|
|
7919
8043
|
NAV_GROUPS.map((group) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7920
8044
|
className: panel_module_css_default.navGroup,
|
|
7921
8045
|
children: [
|
|
@@ -7948,7 +8072,7 @@ window.__ModuleLoader__.load({
|
|
|
7948
8072
|
className: `${panel_module_css_default.navTabBadge} ${chapters.some((c) => c.status === "error") ? panel_module_css_default.navTabBadgeDanger : panel_module_css_default.navTabBadgeWarn}`,
|
|
7949
8073
|
children: chapters.some((c) => c.status === "error") ? `!${pendingCount + reviewPendingCount}` : pendingCount + reviewPendingCount
|
|
7950
8074
|
}),
|
|
7951
|
-
tab.id === "
|
|
8075
|
+
tab.id === "plotlines" && foreshadows.some((f) => f.status === "planned") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7952
8076
|
className: panel_module_css_default.navTabBadge,
|
|
7953
8077
|
children: foreshadows.filter((f) => f.status === "planned").length
|
|
7954
8078
|
}),
|
|
@@ -7985,6 +8109,38 @@ window.__ModuleLoader__.load({
|
|
|
7985
8109
|
children: SETTINGS_TAB.label
|
|
7986
8110
|
})]
|
|
7987
8111
|
}),
|
|
8112
|
+
!navCollapsed && shelf !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
8113
|
+
type: "button",
|
|
8114
|
+
className: panel_module_css_default.bookSwitch,
|
|
8115
|
+
title: activeBook !== null ? `当前书:${activeBook.bookName}(${activeBook.outputDir})· 点击打开书架` : "打开书架",
|
|
8116
|
+
onClick: () => {
|
|
8117
|
+
setViewMode("shelf");
|
|
8118
|
+
},
|
|
8119
|
+
children: [
|
|
8120
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8121
|
+
className: panel_module_css_default.bookSwitchCover,
|
|
8122
|
+
children: activeBookLetter
|
|
8123
|
+
}),
|
|
8124
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8125
|
+
style: {
|
|
8126
|
+
minWidth: 0,
|
|
8127
|
+
display: "flex",
|
|
8128
|
+
flexDirection: "column"
|
|
8129
|
+
},
|
|
8130
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8131
|
+
className: panel_module_css_default.bookSwitchName,
|
|
8132
|
+
children: activeBookName
|
|
8133
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8134
|
+
className: panel_module_css_default.bookSwitchMeta,
|
|
8135
|
+
children: activeBookMeta
|
|
8136
|
+
})]
|
|
8137
|
+
}),
|
|
8138
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8139
|
+
className: panel_module_css_default.bookSwitchArrow,
|
|
8140
|
+
children: "⌄"
|
|
8141
|
+
})
|
|
8142
|
+
]
|
|
8143
|
+
}),
|
|
7988
8144
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7989
8145
|
className: panel_module_css_default.navAbout,
|
|
7990
8146
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
@@ -8007,6 +8163,34 @@ window.__ModuleLoader__.load({
|
|
|
8007
8163
|
},
|
|
8008
8164
|
children: ["📦 有新版本 v", npmLatest]
|
|
8009
8165
|
})]
|
|
8166
|
+
}),
|
|
8167
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8168
|
+
className: panel_module_css_default.navActions,
|
|
8169
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8170
|
+
type: "button",
|
|
8171
|
+
className: panel_module_css_default.navActionBtn,
|
|
8172
|
+
title: navCollapsed ? "展开导航栏" : "收起导航栏",
|
|
8173
|
+
"aria-label": navCollapsed ? "展开导航栏" : "收起导航栏",
|
|
8174
|
+
onClick: () => {
|
|
8175
|
+
setNavCollapsed((prev) => {
|
|
8176
|
+
const next = !prev;
|
|
8177
|
+
try {
|
|
8178
|
+
window.localStorage.setItem("dsh-novel-forge.nav.collapsed", String(next));
|
|
8179
|
+
} catch {}
|
|
8180
|
+
return next;
|
|
8181
|
+
});
|
|
8182
|
+
},
|
|
8183
|
+
children: navCollapsed ? "▸" : "◂"
|
|
8184
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8185
|
+
type: "button",
|
|
8186
|
+
className: panel_module_css_default.navActionBtn,
|
|
8187
|
+
title: tt("common.close"),
|
|
8188
|
+
"aria-label": tt("common.close"),
|
|
8189
|
+
onClick: () => {
|
|
8190
|
+
controller.close();
|
|
8191
|
+
},
|
|
8192
|
+
children: "×"
|
|
8193
|
+
})]
|
|
8010
8194
|
})
|
|
8011
8195
|
]
|
|
8012
8196
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -8514,73 +8698,172 @@ window.__ModuleLoader__.load({
|
|
|
8514
8698
|
}),
|
|
8515
8699
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8516
8700
|
className: panel_module_css_default.dashJourney,
|
|
8517
|
-
children: [
|
|
8518
|
-
|
|
8519
|
-
|
|
8701
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8702
|
+
className: panel_module_css_default.busyRow,
|
|
8703
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8704
|
+
className: panel_module_css_default.meta,
|
|
8705
|
+
style: { fontWeight: 600 },
|
|
8706
|
+
children: "创作旅程"
|
|
8707
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8708
|
+
className: panel_module_css_default.meta,
|
|
8709
|
+
children: [
|
|
8710
|
+
journeyPercent,
|
|
8711
|
+
"% · 已完成 ",
|
|
8712
|
+
journeyDoneCount,
|
|
8713
|
+
"/",
|
|
8714
|
+
journeyStages.length,
|
|
8715
|
+
" 步"
|
|
8716
|
+
]
|
|
8717
|
+
})]
|
|
8718
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8719
|
+
className: panel_module_css_default.tlBar,
|
|
8720
|
+
children: journeyStages.map((stage) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
8721
|
+
type: "button",
|
|
8722
|
+
className: `${panel_module_css_default.tlSeg} ${stage.done ? panel_module_css_default.tlSegDone : stage.id === currentStageId ? panel_module_css_default.tlSegCurrent : panel_module_css_default.tlSegTodo}`,
|
|
8723
|
+
title: `${stage.label}${stage.done ? " · 已完成" : stage.id === currentStageId ? " · 进行中" : " · 未开始"}(点击跳转)`,
|
|
8724
|
+
onClick: () => {
|
|
8725
|
+
jumpToStage(stage.id);
|
|
8726
|
+
},
|
|
8520
8727
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8521
|
-
className: panel_module_css_default.
|
|
8522
|
-
|
|
8523
|
-
children: "创作旅程"
|
|
8728
|
+
className: panel_module_css_default.tlSegTrack,
|
|
8729
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.tlSegFill })
|
|
8524
8730
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8525
|
-
className: panel_module_css_default.
|
|
8526
|
-
children: [
|
|
8527
|
-
journeyPercent,
|
|
8528
|
-
"% · 已完成 ",
|
|
8529
|
-
journeyDoneCount,
|
|
8530
|
-
"/",
|
|
8531
|
-
journeyStages.length,
|
|
8532
|
-
" 步"
|
|
8533
|
-
]
|
|
8731
|
+
className: panel_module_css_default.tlSegLabel,
|
|
8732
|
+
children: [stage.done ? "✓ " : "", stage.label]
|
|
8534
8733
|
})]
|
|
8535
|
-
})
|
|
8536
|
-
|
|
8537
|
-
className: panel_module_css_default.dashJourneyBar,
|
|
8538
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8539
|
-
className: panel_module_css_default.dashJourneyFill,
|
|
8540
|
-
style: { width: `${journeyPercent}%` }
|
|
8541
|
-
})
|
|
8542
|
-
}),
|
|
8543
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8544
|
-
className: panel_module_css_default.dashJourneyStages,
|
|
8545
|
-
children: journeyStages.map((stage) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8546
|
-
className: `${panel_module_css_default.dashStage} ${stage.done ? panel_module_css_default.dashStageDone : stage.id === currentStageId ? panel_module_css_default.dashStageCurrent : ""}`,
|
|
8547
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8548
|
-
className: panel_module_css_default.dashStageDot,
|
|
8549
|
-
children: stage.done ? "✓" : stage.id === currentStageId ? "●" : "○"
|
|
8550
|
-
}), stage.label]
|
|
8551
|
-
}, stage.id))
|
|
8552
|
-
})
|
|
8553
|
-
]
|
|
8734
|
+
}, stage.id))
|
|
8735
|
+
})]
|
|
8554
8736
|
})
|
|
8555
8737
|
]
|
|
8556
8738
|
}),
|
|
8557
8739
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8558
|
-
className: panel_module_css_default.
|
|
8740
|
+
className: panel_module_css_default.statRowD,
|
|
8559
8741
|
children: [
|
|
8560
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
8561
|
-
|
|
8562
|
-
|
|
8563
|
-
|
|
8564
|
-
|
|
8565
|
-
|
|
8566
|
-
|
|
8567
|
-
|
|
8568
|
-
|
|
8569
|
-
|
|
8570
|
-
|
|
8742
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8743
|
+
className: panel_module_css_default.statCardD,
|
|
8744
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8745
|
+
style: { minWidth: 0 },
|
|
8746
|
+
children: [
|
|
8747
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8748
|
+
className: panel_module_css_default.statCardDLabel,
|
|
8749
|
+
children: "今日待写"
|
|
8750
|
+
}),
|
|
8751
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8752
|
+
className: panel_module_css_default.statCardDValue,
|
|
8753
|
+
children: [
|
|
8754
|
+
pendingCount,
|
|
8755
|
+
" ",
|
|
8756
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8757
|
+
className: panel_module_css_default.statCardDUnit,
|
|
8758
|
+
children: "章"
|
|
8759
|
+
})
|
|
8760
|
+
]
|
|
8761
|
+
}),
|
|
8762
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8763
|
+
className: panel_module_css_default.statCardDDetail,
|
|
8764
|
+
children: chapters.some((c) => c.status === "error") ? `含 error ${chapters.filter((c) => c.status === "error").length} 章` : "待生成队列"
|
|
8765
|
+
})
|
|
8766
|
+
]
|
|
8767
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8768
|
+
className: panel_module_css_default.statCardDIcon,
|
|
8769
|
+
children: "📝"
|
|
8770
|
+
})]
|
|
8571
8771
|
}),
|
|
8572
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
8573
|
-
|
|
8574
|
-
|
|
8575
|
-
|
|
8576
|
-
|
|
8772
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8773
|
+
className: panel_module_css_default.statCardD,
|
|
8774
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8775
|
+
style: { minWidth: 0 },
|
|
8776
|
+
children: [
|
|
8777
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8778
|
+
className: panel_module_css_default.statCardDLabel,
|
|
8779
|
+
children: "写作中"
|
|
8780
|
+
}),
|
|
8781
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8782
|
+
className: panel_module_css_default.statCardDValue,
|
|
8783
|
+
children: [
|
|
8784
|
+
chapters.filter((c) => c.status === "generating" || c.status === "reviewing").length,
|
|
8785
|
+
" ",
|
|
8786
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8787
|
+
className: panel_module_css_default.statCardDUnit,
|
|
8788
|
+
children: "章"
|
|
8789
|
+
})
|
|
8790
|
+
]
|
|
8791
|
+
}),
|
|
8792
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8793
|
+
className: panel_module_css_default.statCardDDetail,
|
|
8794
|
+
children: writingNow !== void 0 ? `第 ${writingNow.no} 章 · ${writingNow.title}` : "无进行中任务"
|
|
8795
|
+
})
|
|
8796
|
+
]
|
|
8797
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8798
|
+
className: panel_module_css_default.statCardDIcon,
|
|
8799
|
+
children: "✍️"
|
|
8800
|
+
})]
|
|
8577
8801
|
}),
|
|
8578
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
8579
|
-
|
|
8580
|
-
|
|
8581
|
-
|
|
8582
|
-
|
|
8802
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8803
|
+
className: panel_module_css_default.statCardD,
|
|
8804
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8805
|
+
style: { minWidth: 0 },
|
|
8806
|
+
children: [
|
|
8807
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8808
|
+
className: panel_module_css_default.statCardDLabel,
|
|
8809
|
+
children: "已通过"
|
|
8810
|
+
}),
|
|
8811
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8812
|
+
className: panel_module_css_default.statCardDValue,
|
|
8813
|
+
children: [
|
|
8814
|
+
approvedCount,
|
|
8815
|
+
" ",
|
|
8816
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8817
|
+
className: panel_module_css_default.statCardDUnit,
|
|
8818
|
+
children: "章"
|
|
8819
|
+
})
|
|
8820
|
+
]
|
|
8821
|
+
}),
|
|
8822
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8823
|
+
className: panel_module_css_default.statCardDDetail,
|
|
8824
|
+
children: chapters.length > 0 ? `占全书 ${Math.round(approvedCount / chapters.length * 100)}%` : "尚无已通过章节"
|
|
8825
|
+
})
|
|
8826
|
+
]
|
|
8827
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8828
|
+
className: panel_module_css_default.statCardDIcon,
|
|
8829
|
+
children: "✅"
|
|
8830
|
+
})]
|
|
8583
8831
|
}),
|
|
8832
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8833
|
+
className: panel_module_css_default.statCardD,
|
|
8834
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8835
|
+
style: { minWidth: 0 },
|
|
8836
|
+
children: [
|
|
8837
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8838
|
+
className: panel_module_css_default.statCardDLabel,
|
|
8839
|
+
children: "待审稿"
|
|
8840
|
+
}),
|
|
8841
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8842
|
+
className: panel_module_css_default.statCardDValue,
|
|
8843
|
+
children: [
|
|
8844
|
+
reviewPendingCount,
|
|
8845
|
+
" ",
|
|
8846
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8847
|
+
className: panel_module_css_default.statCardDUnit,
|
|
8848
|
+
children: "章"
|
|
8849
|
+
})
|
|
8850
|
+
]
|
|
8851
|
+
}),
|
|
8852
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8853
|
+
className: `${panel_module_css_default.statCardDDetail} ${reviewPendingCount > 0 ? panel_module_css_default.statCardDDown : ""}`,
|
|
8854
|
+
children: `written ${chapters.filter((c) => c.status === "written").length} · rejected ${chapters.filter((c) => c.status === "rejected").length}`
|
|
8855
|
+
})
|
|
8856
|
+
]
|
|
8857
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8858
|
+
className: `${panel_module_css_default.statCardDIcon} ${panel_module_css_default.statCardDIconRed}`,
|
|
8859
|
+
children: "⚠️"
|
|
8860
|
+
})]
|
|
8861
|
+
})
|
|
8862
|
+
]
|
|
8863
|
+
}),
|
|
8864
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8865
|
+
className: panel_module_css_default.assetGrid,
|
|
8866
|
+
children: [
|
|
8584
8867
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
|
|
8585
8868
|
label: "总字数",
|
|
8586
8869
|
value: String(totalChars),
|
|
@@ -8602,52 +8885,82 @@ window.__ModuleLoader__.load({
|
|
|
8602
8885
|
}),
|
|
8603
8886
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8604
8887
|
className: panel_module_css_default.card,
|
|
8605
|
-
children: [
|
|
8606
|
-
|
|
8607
|
-
|
|
8608
|
-
|
|
8609
|
-
|
|
8610
|
-
|
|
8611
|
-
|
|
8612
|
-
|
|
8613
|
-
|
|
8614
|
-
|
|
8615
|
-
|
|
8616
|
-
|
|
8888
|
+
children: [
|
|
8889
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8890
|
+
className: panel_module_css_default.row,
|
|
8891
|
+
style: { justifyContent: "space-between" },
|
|
8892
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8893
|
+
className: panel_module_css_default.cardTitle,
|
|
8894
|
+
children: "资产健康"
|
|
8895
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8896
|
+
type: "button",
|
|
8897
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
8898
|
+
disabled: busy || doneCount === 0,
|
|
8899
|
+
onClick: () => {
|
|
8900
|
+
handleAudit();
|
|
8901
|
+
},
|
|
8902
|
+
title: "LLM 扫描全本已生成章节,检查人名/境界/资源/时间线矛盾",
|
|
8903
|
+
children: "🔍 全书质检"
|
|
8904
|
+
})]
|
|
8905
|
+
}),
|
|
8906
|
+
auditStatus?.status === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8907
|
+
className: panel_module_css_default.meta,
|
|
8908
|
+
style: { marginTop: 8 },
|
|
8909
|
+
children: [
|
|
8910
|
+
"🔍 全书质检中:",
|
|
8911
|
+
auditStatus.completedBatches,
|
|
8912
|
+
"/",
|
|
8913
|
+
auditStatus.totalBatches > 0 ? auditStatus.totalBatches : "…",
|
|
8914
|
+
" 批",
|
|
8915
|
+
auditStatus.totalBatches > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8916
|
+
className: panel_module_css_default.dashJourneyBar,
|
|
8917
|
+
style: { marginTop: 4 },
|
|
8918
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8919
|
+
className: panel_module_css_default.dashJourneyFill,
|
|
8920
|
+
style: { width: `${Math.round(auditStatus.completedBatches / auditStatus.totalBatches * 100)}%` }
|
|
8921
|
+
})
|
|
8922
|
+
})
|
|
8923
|
+
]
|
|
8924
|
+
}),
|
|
8925
|
+
auditStatus?.status === "error" && auditStatus.error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8926
|
+
className: panel_module_css_default.meta,
|
|
8927
|
+
style: {
|
|
8928
|
+
color: "var(--nf-error)",
|
|
8929
|
+
marginTop: 8
|
|
8617
8930
|
},
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
8621
|
-
|
|
8622
|
-
|
|
8623
|
-
|
|
8624
|
-
|
|
8625
|
-
|
|
8626
|
-
|
|
8627
|
-
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
|
|
8631
|
-
|
|
8632
|
-
|
|
8633
|
-
|
|
8634
|
-
|
|
8635
|
-
|
|
8636
|
-
|
|
8637
|
-
|
|
8638
|
-
|
|
8639
|
-
|
|
8640
|
-
|
|
8641
|
-
|
|
8642
|
-
|
|
8643
|
-
|
|
8644
|
-
|
|
8645
|
-
|
|
8646
|
-
|
|
8647
|
-
|
|
8648
|
-
|
|
8649
|
-
|
|
8650
|
-
|
|
8931
|
+
children: ["全书质检失败:", auditStatus.error]
|
|
8932
|
+
}),
|
|
8933
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8934
|
+
className: panel_module_css_default.assetGrid,
|
|
8935
|
+
children: [
|
|
8936
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
|
|
8937
|
+
label: "道藏",
|
|
8938
|
+
value: bible !== void 0 ? `✓ ${bible.worldRules.length} 条规则` : "未生成",
|
|
8939
|
+
valueColor: bible !== void 0 ? "var(--nf-success)" : "var(--nf-text-3)",
|
|
8940
|
+
detail: bible !== void 0 ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : "提炼人设 / 世界观 / 金手指"
|
|
8941
|
+
}),
|
|
8942
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
|
|
8943
|
+
label: "卷计划",
|
|
8944
|
+
value: volumes !== void 0 ? `${volumes.length} 卷` : "未生成",
|
|
8945
|
+
valueColor: volumes !== void 0 ? "var(--nf-success)" : "var(--nf-text-3)",
|
|
8946
|
+
detail: volumes !== void 0 ? volumes.map((v) => v.title).join(" / ") : "按剧情弧线划分全书",
|
|
8947
|
+
detailTitle: volumes?.map((v) => v.title).join(" / ")
|
|
8948
|
+
}),
|
|
8949
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
|
|
8950
|
+
label: "写作资产",
|
|
8951
|
+
value: `${assetCount} 项`,
|
|
8952
|
+
valueColor: assetCount > 0 ? "var(--nf-success)" : "var(--nf-text-3)",
|
|
8953
|
+
detail: assetSummary,
|
|
8954
|
+
detailTitle: assetSummary
|
|
8955
|
+
}),
|
|
8956
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
|
|
8957
|
+
label: "伏笔",
|
|
8958
|
+
value: `${foreshadows.length} 条`,
|
|
8959
|
+
detail: `${foreshadows.filter((f) => f.status === "planned").length} 待埋 · ${foreshadows.filter((f) => f.status === "resolved").length} 已回收`
|
|
8960
|
+
})
|
|
8961
|
+
]
|
|
8962
|
+
})
|
|
8963
|
+
]
|
|
8651
8964
|
}),
|
|
8652
8965
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8653
8966
|
style: {
|
|
@@ -8731,7 +9044,7 @@ window.__ModuleLoader__.load({
|
|
|
8731
9044
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8732
9045
|
className: panel_module_css_default.row,
|
|
8733
9046
|
children: [(() => {
|
|
8734
|
-
const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.authorReview === void 0).length;
|
|
9047
|
+
const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.status !== "error" && c.authorReview === void 0).length;
|
|
8735
9048
|
return missing > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
8736
9049
|
type: "button",
|
|
8737
9050
|
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
@@ -8750,7 +9063,9 @@ window.__ModuleLoader__.load({
|
|
|
8750
9063
|
type: "button",
|
|
8751
9064
|
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
8752
9065
|
onClick: () => {
|
|
8753
|
-
setActiveTab("
|
|
9066
|
+
setActiveTab("book");
|
|
9067
|
+
changeBookTab("facts");
|
|
9068
|
+
changeArchiveTab("reviews");
|
|
8754
9069
|
},
|
|
8755
9070
|
title: "查看按卷分组的全部复盘记录",
|
|
8756
9071
|
children: "查看全部 →"
|
|
@@ -9012,7 +9327,7 @@ window.__ModuleLoader__.load({
|
|
|
9012
9327
|
style: { justifyContent: "space-between" },
|
|
9013
9328
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9014
9329
|
className: panel_module_css_default.cardTitle,
|
|
9015
|
-
children: "
|
|
9330
|
+
children: "📖 简介 / 封面"
|
|
9016
9331
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9017
9332
|
className: panel_module_css_default.row,
|
|
9018
9333
|
children: [
|
|
@@ -9513,7 +9828,7 @@ window.__ModuleLoader__.load({
|
|
|
9513
9828
|
})
|
|
9514
9829
|
]
|
|
9515
9830
|
}),
|
|
9516
|
-
chapter.authorReview === void 0 && chapter.status !== "pending" && chapter.status !== "generating" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9831
|
+
chapter.authorReview === void 0 && chapter.status !== "pending" && chapter.status !== "generating" && chapter.status !== "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9517
9832
|
className: panel_module_css_default.row,
|
|
9518
9833
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9519
9834
|
type: "button",
|
|
@@ -9687,199 +10002,93 @@ window.__ModuleLoader__.load({
|
|
|
9687
10002
|
})]
|
|
9688
10003
|
})
|
|
9689
10004
|
] }),
|
|
9690
|
-
activeTab === "
|
|
10005
|
+
activeTab === "book" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9691
10006
|
className: panel_module_css_default.card,
|
|
9692
|
-
style: {
|
|
9693
|
-
|
|
9694
|
-
|
|
9695
|
-
|
|
9696
|
-
|
|
9697
|
-
|
|
9698
|
-
|
|
10007
|
+
style: { gap: 12 },
|
|
10008
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10009
|
+
className: panel_module_css_default.row,
|
|
10010
|
+
style: {
|
|
10011
|
+
justifyContent: "space-between",
|
|
10012
|
+
flexWrap: "wrap"
|
|
10013
|
+
},
|
|
10014
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10015
|
+
className: panel_module_css_default.cardTitle,
|
|
9699
10016
|
style: {
|
|
9700
|
-
|
|
9701
|
-
|
|
10017
|
+
fontSize: 17,
|
|
10018
|
+
fontWeight: 700
|
|
9702
10019
|
},
|
|
9703
|
-
children:
|
|
9704
|
-
|
|
9705
|
-
|
|
9706
|
-
|
|
9707
|
-
|
|
9708
|
-
|
|
9709
|
-
|
|
9710
|
-
|
|
9711
|
-
|
|
9712
|
-
|
|
9713
|
-
|
|
9714
|
-
|
|
9715
|
-
|
|
9716
|
-
|
|
9717
|
-
|
|
9718
|
-
|
|
9719
|
-
|
|
9720
|
-
|
|
9721
|
-
|
|
9722
|
-
|
|
9723
|
-
|
|
9724
|
-
|
|
9725
|
-
|
|
9726
|
-
|
|
9727
|
-
|
|
9728
|
-
|
|
9729
|
-
|
|
9730
|
-
|
|
9731
|
-
|
|
9732
|
-
|
|
9733
|
-
|
|
9734
|
-
|
|
9735
|
-
|
|
9736
|
-
|
|
9737
|
-
|
|
9738
|
-
|
|
9739
|
-
|
|
9740
|
-
|
|
9741
|
-
|
|
10020
|
+
children: "📚 本书设定"
|
|
10021
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10022
|
+
className: panel_module_css_default.meta,
|
|
10023
|
+
children: "当前书的知识与资料(参考 AI-Novel-Writing-Assistant:世界观/角色准备收进书内)"
|
|
10024
|
+
})]
|
|
10025
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10026
|
+
className: panel_module_css_default.row,
|
|
10027
|
+
style: {
|
|
10028
|
+
flexWrap: "wrap",
|
|
10029
|
+
gap: 6
|
|
10030
|
+
},
|
|
10031
|
+
children: [
|
|
10032
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10033
|
+
type: "button",
|
|
10034
|
+
className: `${panel_module_css_default.button} ${bookTab === "bible" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10035
|
+
style: {
|
|
10036
|
+
fontSize: 14,
|
|
10037
|
+
flex: 1
|
|
10038
|
+
},
|
|
10039
|
+
onClick: () => {
|
|
10040
|
+
changeBookTab("bible");
|
|
10041
|
+
},
|
|
10042
|
+
title: "设定库:题材 / 世界观规则 / 人物摘要 / 红线 / 文风",
|
|
10043
|
+
children: "📖 设定库"
|
|
10044
|
+
}),
|
|
10045
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10046
|
+
type: "button",
|
|
10047
|
+
className: `${panel_module_css_default.button} ${bookTab === "world" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10048
|
+
style: {
|
|
10049
|
+
fontSize: 14,
|
|
10050
|
+
flex: 1
|
|
10051
|
+
},
|
|
10052
|
+
onClick: () => {
|
|
10053
|
+
changeBookTab("world");
|
|
10054
|
+
},
|
|
10055
|
+
title: "大世界:境界体系 / 地理区域 / 势力分布(注入生成与审稿提示词)",
|
|
10056
|
+
children: "🌍 大世界"
|
|
10057
|
+
}),
|
|
10058
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10059
|
+
type: "button",
|
|
10060
|
+
className: `${panel_module_css_default.button} ${bookTab === "roles" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10061
|
+
style: {
|
|
10062
|
+
fontSize: 14,
|
|
10063
|
+
flex: 1
|
|
10064
|
+
},
|
|
10065
|
+
onClick: () => {
|
|
10066
|
+
changeBookTab("roles");
|
|
10067
|
+
},
|
|
10068
|
+
title: "角色库:全书角色主表(定位 / 关系网 / 成长线 / 知情度)",
|
|
9742
10069
|
children: [
|
|
9743
|
-
"
|
|
9744
|
-
|
|
9745
|
-
"
|
|
9746
|
-
reviewed.length,
|
|
9747
|
-
" · 结尾钩子均分 ",
|
|
9748
|
-
avg,
|
|
9749
|
-
"/10"
|
|
10070
|
+
"👥 角色库(",
|
|
10071
|
+
project?.roles?.length ?? 0,
|
|
10072
|
+
")"
|
|
9750
10073
|
]
|
|
9751
|
-
})
|
|
9752
|
-
|
|
9753
|
-
|
|
9754
|
-
|
|
9755
|
-
|
|
9756
|
-
|
|
9757
|
-
|
|
9758
|
-
|
|
9759
|
-
|
|
9760
|
-
|
|
9761
|
-
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
if (groupReviewed.length === 0) return null;
|
|
9765
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9766
|
-
style: {
|
|
9767
|
-
display: "flex",
|
|
9768
|
-
flexDirection: "column",
|
|
9769
|
-
gap: 4
|
|
9770
|
-
},
|
|
9771
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9772
|
-
className: panel_module_css_default.row,
|
|
9773
|
-
style: {
|
|
9774
|
-
alignItems: "center",
|
|
9775
|
-
gap: 8
|
|
9776
|
-
},
|
|
9777
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
|
|
9778
|
-
style: { fontSize: 13 },
|
|
9779
|
-
children: group.title
|
|
9780
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9781
|
-
className: panel_module_css_default.meta,
|
|
9782
|
-
children: [
|
|
9783
|
-
"已复盘 ",
|
|
9784
|
-
groupReviewed.length,
|
|
9785
|
-
"/",
|
|
9786
|
-
group.chapters.length,
|
|
9787
|
-
" 章"
|
|
9788
|
-
]
|
|
9789
|
-
})]
|
|
9790
|
-
}), [...groupReviewed].reverse().map((c) => {
|
|
9791
|
-
const ar = c.authorReview;
|
|
9792
|
-
const expanded = expandedReviewChapter === c.no;
|
|
9793
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9794
|
-
style: {
|
|
9795
|
-
border: "1px solid var(--nf-border)",
|
|
9796
|
-
borderRadius: 8,
|
|
9797
|
-
overflow: "hidden"
|
|
9798
|
-
},
|
|
9799
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
9800
|
-
type: "button",
|
|
9801
|
-
style: {
|
|
9802
|
-
width: "100%",
|
|
9803
|
-
textAlign: "left",
|
|
9804
|
-
border: "none",
|
|
9805
|
-
background: "transparent",
|
|
9806
|
-
cursor: "pointer",
|
|
9807
|
-
padding: "6px 10px",
|
|
9808
|
-
fontSize: 12,
|
|
9809
|
-
display: "flex",
|
|
9810
|
-
alignItems: "center",
|
|
9811
|
-
gap: 6,
|
|
9812
|
-
flexWrap: "wrap"
|
|
9813
|
-
},
|
|
9814
|
-
onClick: () => {
|
|
9815
|
-
setExpandedReviewChapter(expanded ? null : c.no);
|
|
9816
|
-
},
|
|
9817
|
-
children: [
|
|
9818
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9819
|
-
style: { color: "var(--nf-text-3)" },
|
|
9820
|
-
children: expanded ? "▾" : "▸"
|
|
9821
|
-
}),
|
|
9822
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
|
|
9823
|
-
"第",
|
|
9824
|
-
c.no,
|
|
9825
|
-
"章《",
|
|
9826
|
-
c.title,
|
|
9827
|
-
"》"
|
|
9828
|
-
] }),
|
|
9829
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9830
|
-
style: { color: ar.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
|
|
9831
|
-
children: ["钩子", ar.hookHonored ? "✓" : "✗"]
|
|
9832
|
-
}),
|
|
9833
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9834
|
-
style: { color: ar.endingHook >= 6 ? "var(--nf-success)" : "var(--nf-error)" },
|
|
9835
|
-
children: [
|
|
9836
|
-
"结尾钩子 ",
|
|
9837
|
-
ar.endingHook,
|
|
9838
|
-
"/10"
|
|
9839
|
-
]
|
|
9840
|
-
}),
|
|
9841
|
-
ar.plotlineProgress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9842
|
-
className: panel_module_css_default.meta,
|
|
9843
|
-
style: { marginLeft: 4 },
|
|
9844
|
-
children: [ar.plotlineProgress.slice(0, 40), ar.plotlineProgress.length > 40 ? "…" : ""]
|
|
9845
|
-
})
|
|
9846
|
-
]
|
|
9847
|
-
}), expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9848
|
-
style: {
|
|
9849
|
-
padding: "4px 10px 8px",
|
|
9850
|
-
fontSize: 12,
|
|
9851
|
-
display: "flex",
|
|
9852
|
-
flexDirection: "column",
|
|
9853
|
-
gap: 3,
|
|
9854
|
-
borderTop: "1px solid var(--nf-border)"
|
|
9855
|
-
},
|
|
9856
|
-
children: [
|
|
9857
|
-
ar.hookNote !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9858
|
-
className: panel_module_css_default.meta,
|
|
9859
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "钩子:" }), ar.hookNote]
|
|
9860
|
-
}),
|
|
9861
|
-
ar.plotlineProgress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9862
|
-
className: panel_module_css_default.meta,
|
|
9863
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "推进:" }), ar.plotlineProgress]
|
|
9864
|
-
}),
|
|
9865
|
-
ar.continuity !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9866
|
-
className: panel_module_css_default.meta,
|
|
9867
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "衔接:" }), ar.continuity]
|
|
9868
|
-
}),
|
|
9869
|
-
ar.trend !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9870
|
-
className: panel_module_css_default.meta,
|
|
9871
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "趋势:" }), ar.trend]
|
|
9872
|
-
})
|
|
9873
|
-
]
|
|
9874
|
-
})]
|
|
9875
|
-
}, c.no);
|
|
9876
|
-
})]
|
|
9877
|
-
}, group.no);
|
|
10074
|
+
}),
|
|
10075
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10076
|
+
type: "button",
|
|
10077
|
+
className: `${panel_module_css_default.button} ${bookTab === "facts" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10078
|
+
style: {
|
|
10079
|
+
fontSize: 14,
|
|
10080
|
+
flex: 1
|
|
10081
|
+
},
|
|
10082
|
+
onClick: () => {
|
|
10083
|
+
changeBookTab("facts");
|
|
10084
|
+
},
|
|
10085
|
+
title: "编年录与复盘记录",
|
|
10086
|
+
children: "📚 编年 / 复盘"
|
|
9878
10087
|
})
|
|
9879
|
-
|
|
9880
|
-
]
|
|
10088
|
+
]
|
|
10089
|
+
})]
|
|
9881
10090
|
}),
|
|
9882
|
-
activeTab === "bible" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10091
|
+
activeTab === "book" && bookTab === "bible" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9883
10092
|
className: panel_module_css_default.card,
|
|
9884
10093
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9885
10094
|
className: panel_module_css_default.row,
|
|
@@ -10045,7 +10254,7 @@ window.__ModuleLoader__.load({
|
|
|
10045
10254
|
]
|
|
10046
10255
|
})]
|
|
10047
10256
|
}) }),
|
|
10048
|
-
activeTab === "world" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WorldTab, {
|
|
10257
|
+
activeTab === "book" && bookTab === "world" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WorldTab, {
|
|
10049
10258
|
api,
|
|
10050
10259
|
world: project?.world,
|
|
10051
10260
|
onChanged: (w) => {
|
|
@@ -10057,12 +10266,8 @@ window.__ModuleLoader__.load({
|
|
|
10057
10266
|
pushProgress(`大世界已保存:${w.realms.length} 境界 · ${w.regions.length} 区域 · ${w.factions.length} 势力`, "done");
|
|
10058
10267
|
}
|
|
10059
10268
|
}),
|
|
10060
|
-
activeTab === "roles" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10269
|
+
activeTab === "book" && bookTab === "roles" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10061
10270
|
className: panel_module_css_default.card,
|
|
10062
|
-
style: {
|
|
10063
|
-
flex: 1,
|
|
10064
|
-
minHeight: 0
|
|
10065
|
-
},
|
|
10066
10271
|
children: [
|
|
10067
10272
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10068
10273
|
className: panel_module_css_default.row,
|
|
@@ -10357,141 +10562,7 @@ window.__ModuleLoader__.load({
|
|
|
10357
10562
|
})
|
|
10358
10563
|
]
|
|
10359
10564
|
}),
|
|
10360
|
-
activeTab === "
|
|
10361
|
-
api,
|
|
10362
|
-
initialTab: "genre"
|
|
10363
|
-
}),
|
|
10364
|
-
activeTab === "assetsProgression" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
|
|
10365
|
-
api,
|
|
10366
|
-
initialTab: "progression"
|
|
10367
|
-
}),
|
|
10368
|
-
activeTab === "assetsTemplates" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
|
|
10369
|
-
api,
|
|
10370
|
-
initialTab: "templates"
|
|
10371
|
-
}),
|
|
10372
|
-
activeTab === "assetsRules" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
|
|
10373
|
-
api,
|
|
10374
|
-
initialTab: "rules"
|
|
10375
|
-
}),
|
|
10376
|
-
activeTab === "assetsStyle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
|
|
10377
|
-
api,
|
|
10378
|
-
initialTab: "style"
|
|
10379
|
-
}),
|
|
10380
|
-
activeTab === "foreshadow" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10381
|
-
className: panel_module_css_default.card,
|
|
10382
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10383
|
-
className: panel_module_css_default.row,
|
|
10384
|
-
style: { justifyContent: "space-between" },
|
|
10385
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
10386
|
-
className: panel_module_css_default.cardTitle,
|
|
10387
|
-
children: [
|
|
10388
|
-
tt("foreshadow.title"),
|
|
10389
|
-
"(",
|
|
10390
|
-
foreshadows.length,
|
|
10391
|
-
")"
|
|
10392
|
-
]
|
|
10393
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10394
|
-
type: "button",
|
|
10395
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
|
|
10396
|
-
disabled: busy,
|
|
10397
|
-
onClick: () => {
|
|
10398
|
-
handleSuggestForeshadows();
|
|
10399
|
-
},
|
|
10400
|
-
children: tt("foreshadow.suggest")
|
|
10401
|
-
})]
|
|
10402
|
-
}), foreshadows.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10403
|
-
className: panel_module_css_default.meta,
|
|
10404
|
-
children: tt("foreshadow.none")
|
|
10405
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10406
|
-
className: panel_module_css_default.chapterList,
|
|
10407
|
-
children: foreshadows.map((f) => {
|
|
10408
|
-
const statusLabel = {
|
|
10409
|
-
planned: tt("foreshadow.planned"),
|
|
10410
|
-
planted: tt("foreshadow.planted"),
|
|
10411
|
-
progressing: tt("foreshadow.progressing"),
|
|
10412
|
-
resolved: tt("foreshadow.resolved"),
|
|
10413
|
-
abandoned: tt("foreshadow.abandoned")
|
|
10414
|
-
}[f.status];
|
|
10415
|
-
const statusColor = f.status === "resolved" ? "var(--nf-success)" : f.status === "planted" || f.status === "progressing" ? "var(--nf-accent)" : f.status === "abandoned" ? "var(--nf-text-3)" : "var(--nf-info)";
|
|
10416
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10417
|
-
className: panel_module_css_default.chapter,
|
|
10418
|
-
children: [
|
|
10419
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10420
|
-
className: panel_module_css_default.chapterMain,
|
|
10421
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10422
|
-
className: panel_module_css_default.chapterTitle,
|
|
10423
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: f.description })
|
|
10424
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10425
|
-
className: panel_module_css_default.meta,
|
|
10426
|
-
children: [
|
|
10427
|
-
f.plantedChapter !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
10428
|
-
tt("foreshadow.plantedAt"),
|
|
10429
|
-
" 第",
|
|
10430
|
-
f.plantedChapter,
|
|
10431
|
-
"章 · "
|
|
10432
|
-
] }),
|
|
10433
|
-
f.targetChapter !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
10434
|
-
tt("foreshadow.target"),
|
|
10435
|
-
" 第",
|
|
10436
|
-
f.targetChapter,
|
|
10437
|
-
"章 · "
|
|
10438
|
-
] }),
|
|
10439
|
-
f.resolvedNote !== void 0 && f.resolvedNote !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
10440
|
-
"回收:",
|
|
10441
|
-
f.resolvedNote,
|
|
10442
|
-
" · "
|
|
10443
|
-
] })
|
|
10444
|
-
]
|
|
10445
|
-
})]
|
|
10446
|
-
}),
|
|
10447
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10448
|
-
className: panel_module_css_default.badge,
|
|
10449
|
-
style: {
|
|
10450
|
-
borderColor: statusColor,
|
|
10451
|
-
color: statusColor
|
|
10452
|
-
},
|
|
10453
|
-
children: statusLabel
|
|
10454
|
-
}),
|
|
10455
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10456
|
-
className: panel_module_css_default.row,
|
|
10457
|
-
style: { gap: 4 },
|
|
10458
|
-
children: [f.status === "planned" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10459
|
-
type: "button",
|
|
10460
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10461
|
-
disabled: busy,
|
|
10462
|
-
onClick: () => {
|
|
10463
|
-
api.foreshadow({
|
|
10464
|
-
id: f.id,
|
|
10465
|
-
status: "planted",
|
|
10466
|
-
plantedChapter: doneCount + 1
|
|
10467
|
-
}).then((r) => setProject((prev) => prev === null ? prev : {
|
|
10468
|
-
...prev,
|
|
10469
|
-
foreshadows: r.foreshadows
|
|
10470
|
-
}));
|
|
10471
|
-
},
|
|
10472
|
-
children: tt("foreshadow.setPlanted")
|
|
10473
|
-
}), (f.status === "planted" || f.status === "progressing") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10474
|
-
type: "button",
|
|
10475
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10476
|
-
disabled: busy,
|
|
10477
|
-
onClick: () => {
|
|
10478
|
-
api.foreshadow({
|
|
10479
|
-
id: f.id,
|
|
10480
|
-
status: "resolved",
|
|
10481
|
-
resolvedNote: `第${doneCount}章回收`
|
|
10482
|
-
}).then((r) => setProject((prev) => prev === null ? prev : {
|
|
10483
|
-
...prev,
|
|
10484
|
-
foreshadows: r.foreshadows
|
|
10485
|
-
}));
|
|
10486
|
-
},
|
|
10487
|
-
children: tt("foreshadow.setResolved")
|
|
10488
|
-
})]
|
|
10489
|
-
})
|
|
10490
|
-
]
|
|
10491
|
-
}, f.id);
|
|
10492
|
-
})
|
|
10493
|
-
})]
|
|
10494
|
-
}),
|
|
10565
|
+
activeTab === "assets" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, { api }),
|
|
10495
10566
|
activeTab === "settings" && configDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10496
10567
|
className: panel_module_css_default.card,
|
|
10497
10568
|
children: [
|
|
@@ -10533,39 +10604,98 @@ window.__ModuleLoader__.load({
|
|
|
10533
10604
|
}),
|
|
10534
10605
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10535
10606
|
className: panel_module_css_default.row,
|
|
10536
|
-
|
|
10537
|
-
|
|
10538
|
-
|
|
10539
|
-
|
|
10540
|
-
|
|
10541
|
-
children:
|
|
10542
|
-
|
|
10543
|
-
|
|
10544
|
-
|
|
10545
|
-
|
|
10546
|
-
|
|
10547
|
-
|
|
10548
|
-
|
|
10549
|
-
|
|
10550
|
-
|
|
10551
|
-
|
|
10552
|
-
|
|
10553
|
-
|
|
10554
|
-
|
|
10555
|
-
|
|
10556
|
-
className: panel_module_css_default.
|
|
10557
|
-
|
|
10558
|
-
|
|
10559
|
-
|
|
10560
|
-
|
|
10561
|
-
|
|
10562
|
-
|
|
10563
|
-
|
|
10564
|
-
|
|
10565
|
-
|
|
10566
|
-
|
|
10567
|
-
|
|
10568
|
-
|
|
10607
|
+
style: { alignItems: "flex-start" },
|
|
10608
|
+
children: [
|
|
10609
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10610
|
+
className: panel_module_css_default.field,
|
|
10611
|
+
style: { flex: 1 },
|
|
10612
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
10613
|
+
className: panel_module_css_default.fieldLabel,
|
|
10614
|
+
children: tt("settings.provider")
|
|
10615
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
10616
|
+
className: panel_module_css_default.input,
|
|
10617
|
+
value: configDraft.provider,
|
|
10618
|
+
onChange: (e) => {
|
|
10619
|
+
setConfigDraft({
|
|
10620
|
+
...configDraft,
|
|
10621
|
+
provider: e.target.value
|
|
10622
|
+
});
|
|
10623
|
+
}
|
|
10624
|
+
})]
|
|
10625
|
+
}),
|
|
10626
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10627
|
+
className: panel_module_css_default.field,
|
|
10628
|
+
style: { flex: 1.4 },
|
|
10629
|
+
children: [
|
|
10630
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
10631
|
+
className: panel_module_css_default.fieldLabel,
|
|
10632
|
+
children: tt("settings.model")
|
|
10633
|
+
}),
|
|
10634
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
10635
|
+
className: panel_module_css_default.input,
|
|
10636
|
+
value: modelCustomMode ? "__custom__" : configDraft.model,
|
|
10637
|
+
onChange: (e) => {
|
|
10638
|
+
const v = e.target.value;
|
|
10639
|
+
if (v === "__custom__") setModelCustomMode(true);
|
|
10640
|
+
else {
|
|
10641
|
+
setModelCustomMode(false);
|
|
10642
|
+
setConfigDraft({
|
|
10643
|
+
...configDraft,
|
|
10644
|
+
model: v
|
|
10645
|
+
});
|
|
10646
|
+
}
|
|
10647
|
+
},
|
|
10648
|
+
children: [MODEL_PRESETS.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
10649
|
+
value: m,
|
|
10650
|
+
children: m
|
|
10651
|
+
}, m)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
10652
|
+
value: "__custom__",
|
|
10653
|
+
children: tt("settings.modelCustom")
|
|
10654
|
+
})]
|
|
10655
|
+
}),
|
|
10656
|
+
modelCustomMode && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
10657
|
+
className: panel_module_css_default.input,
|
|
10658
|
+
style: { marginTop: 6 },
|
|
10659
|
+
value: configDraft.model,
|
|
10660
|
+
placeholder: tt("settings.modelCustomPlaceholder"),
|
|
10661
|
+
onChange: (e) => {
|
|
10662
|
+
setConfigDraft({
|
|
10663
|
+
...configDraft,
|
|
10664
|
+
model: e.target.value
|
|
10665
|
+
});
|
|
10666
|
+
}
|
|
10667
|
+
})
|
|
10668
|
+
]
|
|
10669
|
+
}),
|
|
10670
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10671
|
+
className: panel_module_css_default.field,
|
|
10672
|
+
style: { flex: 1 },
|
|
10673
|
+
children: [
|
|
10674
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
10675
|
+
className: panel_module_css_default.fieldLabel,
|
|
10676
|
+
children: tt("settings.reasoningEffort")
|
|
10677
|
+
}),
|
|
10678
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
|
|
10679
|
+
className: panel_module_css_default.input,
|
|
10680
|
+
value: configDraft.reasoningEffort ?? "off",
|
|
10681
|
+
onChange: (e) => {
|
|
10682
|
+
setConfigDraft({
|
|
10683
|
+
...configDraft,
|
|
10684
|
+
reasoningEffort: e.target.value
|
|
10685
|
+
});
|
|
10686
|
+
},
|
|
10687
|
+
children: REASONING_OPTIONS.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
10688
|
+
value: v,
|
|
10689
|
+
children: tt(`settings.reasoning.${v}`)
|
|
10690
|
+
}, v))
|
|
10691
|
+
}),
|
|
10692
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10693
|
+
className: panel_module_css_default.meta,
|
|
10694
|
+
children: tt("settings.reasoningHint")
|
|
10695
|
+
})
|
|
10696
|
+
]
|
|
10697
|
+
})
|
|
10698
|
+
]
|
|
10569
10699
|
}),
|
|
10570
10700
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10571
10701
|
className: panel_module_css_default.row,
|
|
@@ -10793,442 +10923,906 @@ window.__ModuleLoader__.load({
|
|
|
10793
10923
|
children: [
|
|
10794
10924
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10795
10925
|
className: panel_module_css_default.cardTitle,
|
|
10796
|
-
children: tt("settings.export")
|
|
10797
|
-
}),
|
|
10798
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10799
|
-
type: "button",
|
|
10800
|
-
className: panel_module_css_default.button,
|
|
10801
|
-
disabled: busy || chapters.length === 0,
|
|
10802
|
-
onClick: () => {
|
|
10803
|
-
handleExport("txt");
|
|
10804
|
-
},
|
|
10805
|
-
children: tt("settings.exportTxt")
|
|
10806
|
-
}),
|
|
10807
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10926
|
+
children: tt("settings.export")
|
|
10927
|
+
}),
|
|
10928
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10929
|
+
type: "button",
|
|
10930
|
+
className: panel_module_css_default.button,
|
|
10931
|
+
disabled: busy || chapters.length === 0,
|
|
10932
|
+
onClick: () => {
|
|
10933
|
+
handleExport("txt");
|
|
10934
|
+
},
|
|
10935
|
+
children: tt("settings.exportTxt")
|
|
10936
|
+
}),
|
|
10937
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10938
|
+
type: "button",
|
|
10939
|
+
className: panel_module_css_default.button,
|
|
10940
|
+
disabled: busy || chapters.length === 0,
|
|
10941
|
+
onClick: () => {
|
|
10942
|
+
handleExport("md");
|
|
10943
|
+
},
|
|
10944
|
+
children: tt("settings.exportMd")
|
|
10945
|
+
})
|
|
10946
|
+
]
|
|
10947
|
+
})
|
|
10948
|
+
]
|
|
10949
|
+
}),
|
|
10950
|
+
activeTab === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10951
|
+
className: panel_module_css_default.card,
|
|
10952
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10953
|
+
className: panel_module_css_default.cardTitle,
|
|
10954
|
+
children: tt("settings.theme")
|
|
10955
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10956
|
+
className: panel_module_css_default.row,
|
|
10957
|
+
style: {
|
|
10958
|
+
gap: 8,
|
|
10959
|
+
flexWrap: "wrap"
|
|
10960
|
+
},
|
|
10961
|
+
children: [
|
|
10962
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10963
|
+
type: "button",
|
|
10964
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "liquid" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10965
|
+
onClick: () => {
|
|
10966
|
+
changePanelTheme("liquid");
|
|
10967
|
+
},
|
|
10968
|
+
title: "iOS 液态玻璃质感 · 绿色强调(当前默认)",
|
|
10969
|
+
children: ["🧊 ", tt("settings.themeLiquid")]
|
|
10970
|
+
}),
|
|
10971
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10972
|
+
type: "button",
|
|
10973
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "classic" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10974
|
+
onClick: () => {
|
|
10975
|
+
changePanelTheme("classic");
|
|
10976
|
+
},
|
|
10977
|
+
title: "经典 iOS 毛玻璃 · 蓝色强调",
|
|
10978
|
+
children: ["💠 ", tt("settings.themeClassic")]
|
|
10979
|
+
}),
|
|
10980
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10981
|
+
type: "button",
|
|
10982
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "neumorph" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10983
|
+
onClick: () => {
|
|
10984
|
+
changePanelTheme("neumorph");
|
|
10985
|
+
},
|
|
10986
|
+
title: "新拟物派 · 双阴影立体(仅浅色;深色下自动回退液态)",
|
|
10987
|
+
children: ["🔘 ", tt("settings.themeNeumorph")]
|
|
10988
|
+
}),
|
|
10989
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10990
|
+
className: panel_module_css_default.meta,
|
|
10991
|
+
children: tt("settings.themeHint")
|
|
10992
|
+
})
|
|
10993
|
+
]
|
|
10994
|
+
})]
|
|
10995
|
+
}),
|
|
10996
|
+
activeTab === "book" && bookTab === "facts" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10997
|
+
className: panel_module_css_default.card,
|
|
10998
|
+
children: [
|
|
10999
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11000
|
+
className: panel_module_css_default.row,
|
|
11001
|
+
style: {
|
|
11002
|
+
justifyContent: "space-between",
|
|
11003
|
+
flexWrap: "wrap"
|
|
11004
|
+
},
|
|
11005
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11006
|
+
className: panel_module_css_default.cardTitle,
|
|
11007
|
+
style: {
|
|
11008
|
+
fontSize: 17,
|
|
11009
|
+
fontWeight: 700
|
|
11010
|
+
},
|
|
11011
|
+
children: "📚 编年 / 复盘"
|
|
11012
|
+
})
|
|
11013
|
+
}),
|
|
11014
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11015
|
+
className: panel_module_css_default.row,
|
|
11016
|
+
style: {
|
|
11017
|
+
flexWrap: "wrap",
|
|
11018
|
+
gap: 6
|
|
11019
|
+
},
|
|
11020
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11021
|
+
type: "button",
|
|
11022
|
+
className: `${panel_module_css_default.button} ${archiveTab === "facts" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
11023
|
+
style: {
|
|
11024
|
+
fontSize: 14,
|
|
11025
|
+
flex: 1
|
|
11026
|
+
},
|
|
11027
|
+
onClick: () => {
|
|
11028
|
+
changeArchiveTab("facts");
|
|
11029
|
+
},
|
|
11030
|
+
title: "编年录:客观事实流水(第 N 章 · 事件),生成/审稿查证用",
|
|
11031
|
+
children: [
|
|
11032
|
+
"📜 编年录(",
|
|
11033
|
+
(project?.facts ?? []).length,
|
|
11034
|
+
")"
|
|
11035
|
+
]
|
|
11036
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11037
|
+
type: "button",
|
|
11038
|
+
className: `${panel_module_css_default.button} ${archiveTab === "reviews" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
11039
|
+
style: {
|
|
11040
|
+
fontSize: 14,
|
|
11041
|
+
flex: 1
|
|
11042
|
+
},
|
|
11043
|
+
onClick: () => {
|
|
11044
|
+
changeArchiveTab("reviews");
|
|
11045
|
+
},
|
|
11046
|
+
title: "复盘记录:每章作者复盘(钩子 / 推进 / 衔接 / 趋势)",
|
|
11047
|
+
children: [
|
|
11048
|
+
"📋 复盘记录(",
|
|
11049
|
+
chapters.filter((c) => c.authorReview !== void 0).length,
|
|
11050
|
+
" 章)"
|
|
11051
|
+
]
|
|
11052
|
+
})]
|
|
11053
|
+
}),
|
|
11054
|
+
archiveTab === "reviews" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11055
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11056
|
+
className: panel_module_css_default.row,
|
|
11057
|
+
style: {
|
|
11058
|
+
justifyContent: "space-between",
|
|
11059
|
+
flexWrap: "wrap"
|
|
11060
|
+
},
|
|
11061
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11062
|
+
className: panel_module_css_default.cardTitle,
|
|
11063
|
+
children: [
|
|
11064
|
+
"📋 复盘记录(",
|
|
11065
|
+
chapters.filter((c) => c.authorReview !== void 0).length,
|
|
11066
|
+
" 章已复盘)"
|
|
11067
|
+
]
|
|
11068
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11069
|
+
className: panel_module_css_default.row,
|
|
11070
|
+
children: (() => {
|
|
11071
|
+
const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.status !== "error" && c.authorReview === void 0).length;
|
|
11072
|
+
return missing > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11073
|
+
type: "button",
|
|
11074
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
|
|
11075
|
+
disabled: busy,
|
|
11076
|
+
onClick: () => {
|
|
11077
|
+
handleAuthorBackfillAll();
|
|
11078
|
+
},
|
|
11079
|
+
title: "对历史已写章节逐章补跑作者复盘",
|
|
11080
|
+
children: [
|
|
11081
|
+
"↻ 补齐缺失复盘(",
|
|
11082
|
+
missing,
|
|
11083
|
+
")"
|
|
11084
|
+
]
|
|
11085
|
+
});
|
|
11086
|
+
})()
|
|
11087
|
+
})]
|
|
11088
|
+
}),
|
|
11089
|
+
(() => {
|
|
11090
|
+
const reviewed = chapters.filter((c) => c.authorReview !== void 0);
|
|
11091
|
+
if (reviewed.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11092
|
+
className: panel_module_css_default.meta,
|
|
11093
|
+
children: "尚无作者复盘——生成/审稿后自动生成,或点「补齐缺失复盘」为已写章节补跑。"
|
|
11094
|
+
});
|
|
11095
|
+
const honored = reviewed.filter((c) => c.authorReview.hookHonored).length;
|
|
11096
|
+
const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview.endingHook, 0) / reviewed.length * 10) / 10;
|
|
11097
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11098
|
+
className: panel_module_css_default.meta,
|
|
11099
|
+
style: { fontWeight: 600 },
|
|
11100
|
+
children: [
|
|
11101
|
+
"钩子兑现 ",
|
|
11102
|
+
honored,
|
|
11103
|
+
"/",
|
|
11104
|
+
reviewed.length,
|
|
11105
|
+
" · 结尾钩子均分 ",
|
|
11106
|
+
avg,
|
|
11107
|
+
"/10"
|
|
11108
|
+
]
|
|
11109
|
+
});
|
|
11110
|
+
})(),
|
|
11111
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11112
|
+
style: {
|
|
11113
|
+
display: "flex",
|
|
11114
|
+
flexDirection: "column",
|
|
11115
|
+
gap: 10,
|
|
11116
|
+
overflowY: "auto",
|
|
11117
|
+
flex: 1,
|
|
11118
|
+
minHeight: 0
|
|
11119
|
+
},
|
|
11120
|
+
children: [(() => {
|
|
11121
|
+
const groupsWithReviews = chapterGroups.filter((group) => group.chapters.some((c) => c.authorReview !== void 0));
|
|
11122
|
+
if (groupsWithReviews.length === 0) return null;
|
|
11123
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11124
|
+
className: panel_module_css_default.row,
|
|
11125
|
+
style: {
|
|
11126
|
+
justifyContent: "flex-end",
|
|
11127
|
+
gap: 6
|
|
11128
|
+
},
|
|
11129
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11130
|
+
type: "button",
|
|
11131
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11132
|
+
onClick: () => {
|
|
11133
|
+
setExpandedVolumes(Object.fromEntries(groupsWithReviews.map((g) => [g.no, true])));
|
|
11134
|
+
},
|
|
11135
|
+
children: "全部展开"
|
|
11136
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11137
|
+
type: "button",
|
|
11138
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11139
|
+
onClick: () => {
|
|
11140
|
+
setExpandedVolumes({});
|
|
11141
|
+
},
|
|
11142
|
+
children: "全部折叠"
|
|
11143
|
+
})]
|
|
11144
|
+
});
|
|
11145
|
+
})(), chapterGroups.map((group) => {
|
|
11146
|
+
const groupReviewed = group.chapters.filter((c) => c.authorReview !== void 0);
|
|
11147
|
+
if (groupReviewed.length === 0) return null;
|
|
11148
|
+
const volumeExpanded = expandedVolumes[group.no] === true;
|
|
11149
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11150
|
+
style: {
|
|
11151
|
+
border: "1px solid var(--nf-border)",
|
|
11152
|
+
borderRadius: 10,
|
|
11153
|
+
overflow: "hidden"
|
|
11154
|
+
},
|
|
11155
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11156
|
+
type: "button",
|
|
11157
|
+
style: {
|
|
11158
|
+
width: "100%",
|
|
11159
|
+
textAlign: "left",
|
|
11160
|
+
border: "none",
|
|
11161
|
+
background: "transparent",
|
|
11162
|
+
cursor: "pointer",
|
|
11163
|
+
padding: "8px 12px",
|
|
11164
|
+
fontSize: 13,
|
|
11165
|
+
display: "flex",
|
|
11166
|
+
alignItems: "center",
|
|
11167
|
+
gap: 8,
|
|
11168
|
+
flexWrap: "wrap"
|
|
11169
|
+
},
|
|
11170
|
+
onClick: () => {
|
|
11171
|
+
setExpandedVolumes((prev) => ({
|
|
11172
|
+
...prev,
|
|
11173
|
+
[group.no]: !volumeExpanded
|
|
11174
|
+
}));
|
|
11175
|
+
},
|
|
11176
|
+
children: [
|
|
11177
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11178
|
+
style: { color: "var(--nf-text-3)" },
|
|
11179
|
+
children: volumeExpanded ? "▾" : "▸"
|
|
11180
|
+
}),
|
|
11181
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: group.title }),
|
|
11182
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11183
|
+
className: panel_module_css_default.meta,
|
|
11184
|
+
children: [
|
|
11185
|
+
"已复盘 ",
|
|
11186
|
+
groupReviewed.length,
|
|
11187
|
+
"/",
|
|
11188
|
+
group.chapters.length,
|
|
11189
|
+
" 章"
|
|
11190
|
+
]
|
|
11191
|
+
})
|
|
11192
|
+
]
|
|
11193
|
+
}), volumeExpanded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11194
|
+
style: {
|
|
11195
|
+
display: "flex",
|
|
11196
|
+
flexDirection: "column",
|
|
11197
|
+
gap: 4,
|
|
11198
|
+
padding: "4px 8px 8px",
|
|
11199
|
+
borderTop: "1px solid var(--nf-border)"
|
|
11200
|
+
},
|
|
11201
|
+
children: [...groupReviewed].reverse().map((c) => {
|
|
11202
|
+
const ar = c.authorReview;
|
|
11203
|
+
const expanded = expandedReviewChapter === c.no;
|
|
11204
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11205
|
+
style: {
|
|
11206
|
+
border: "1px solid var(--nf-border)",
|
|
11207
|
+
borderRadius: 8,
|
|
11208
|
+
overflow: "hidden"
|
|
11209
|
+
},
|
|
11210
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11211
|
+
type: "button",
|
|
11212
|
+
style: {
|
|
11213
|
+
width: "100%",
|
|
11214
|
+
textAlign: "left",
|
|
11215
|
+
border: "none",
|
|
11216
|
+
background: "transparent",
|
|
11217
|
+
cursor: "pointer",
|
|
11218
|
+
padding: "6px 10px",
|
|
11219
|
+
fontSize: 12,
|
|
11220
|
+
display: "flex",
|
|
11221
|
+
alignItems: "center",
|
|
11222
|
+
gap: 6,
|
|
11223
|
+
flexWrap: "wrap"
|
|
11224
|
+
},
|
|
11225
|
+
onClick: () => {
|
|
11226
|
+
setExpandedReviewChapter(expanded ? null : c.no);
|
|
11227
|
+
},
|
|
11228
|
+
children: [
|
|
11229
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11230
|
+
style: { color: "var(--nf-text-3)" },
|
|
11231
|
+
children: expanded ? "▾" : "▸"
|
|
11232
|
+
}),
|
|
11233
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
|
|
11234
|
+
"第",
|
|
11235
|
+
c.no,
|
|
11236
|
+
"章《",
|
|
11237
|
+
c.title,
|
|
11238
|
+
"》"
|
|
11239
|
+
] }),
|
|
11240
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11241
|
+
style: { color: ar.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
|
|
11242
|
+
children: ["钩子", ar.hookHonored ? "✓" : "✗"]
|
|
11243
|
+
}),
|
|
11244
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11245
|
+
style: { color: ar.endingHook >= 6 ? "var(--nf-success)" : "var(--nf-error)" },
|
|
11246
|
+
children: [
|
|
11247
|
+
"结尾钩子 ",
|
|
11248
|
+
ar.endingHook,
|
|
11249
|
+
"/10"
|
|
11250
|
+
]
|
|
11251
|
+
}),
|
|
11252
|
+
ar.plotlineProgress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11253
|
+
className: panel_module_css_default.meta,
|
|
11254
|
+
style: { marginLeft: 4 },
|
|
11255
|
+
children: [ar.plotlineProgress.slice(0, 40), ar.plotlineProgress.length > 40 ? "…" : ""]
|
|
11256
|
+
})
|
|
11257
|
+
]
|
|
11258
|
+
}), expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11259
|
+
style: {
|
|
11260
|
+
padding: "4px 10px 8px",
|
|
11261
|
+
fontSize: 12,
|
|
11262
|
+
display: "flex",
|
|
11263
|
+
flexDirection: "column",
|
|
11264
|
+
gap: 3,
|
|
11265
|
+
borderTop: "1px solid var(--nf-border)"
|
|
11266
|
+
},
|
|
11267
|
+
children: [
|
|
11268
|
+
ar.hookNote !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11269
|
+
className: panel_module_css_default.meta,
|
|
11270
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "钩子:" }), ar.hookNote]
|
|
11271
|
+
}),
|
|
11272
|
+
ar.plotlineProgress !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11273
|
+
className: panel_module_css_default.meta,
|
|
11274
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "推进:" }), ar.plotlineProgress]
|
|
11275
|
+
}),
|
|
11276
|
+
ar.continuity !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11277
|
+
className: panel_module_css_default.meta,
|
|
11278
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "衔接:" }), ar.continuity]
|
|
11279
|
+
}),
|
|
11280
|
+
ar.trend !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11281
|
+
className: panel_module_css_default.meta,
|
|
11282
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "趋势:" }), ar.trend]
|
|
11283
|
+
})
|
|
11284
|
+
]
|
|
11285
|
+
})]
|
|
11286
|
+
}, c.no);
|
|
11287
|
+
})
|
|
11288
|
+
})]
|
|
11289
|
+
}, group.no);
|
|
11290
|
+
})]
|
|
11291
|
+
})
|
|
11292
|
+
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11293
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11294
|
+
className: panel_module_css_default.busyRow,
|
|
11295
|
+
style: { flexWrap: "wrap" },
|
|
11296
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11297
|
+
className: panel_module_css_default.cardTitle,
|
|
11298
|
+
children: tt("facts.title", { n: (project?.facts ?? []).length })
|
|
11299
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10808
11300
|
type: "button",
|
|
10809
|
-
className: panel_module_css_default.button
|
|
11301
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10810
11302
|
disabled: busy || chapters.length === 0,
|
|
10811
11303
|
onClick: () => {
|
|
10812
|
-
|
|
11304
|
+
handleFactsBackfill();
|
|
10813
11305
|
},
|
|
10814
|
-
|
|
10815
|
-
|
|
10816
|
-
|
|
10817
|
-
})
|
|
10818
|
-
]
|
|
10819
|
-
}),
|
|
10820
|
-
activeTab === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10821
|
-
className: panel_module_css_default.card,
|
|
10822
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10823
|
-
className: panel_module_css_default.cardTitle,
|
|
10824
|
-
children: tt("settings.theme")
|
|
10825
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10826
|
-
className: panel_module_css_default.row,
|
|
10827
|
-
style: {
|
|
10828
|
-
gap: 8,
|
|
10829
|
-
flexWrap: "wrap"
|
|
10830
|
-
},
|
|
10831
|
-
children: [
|
|
10832
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10833
|
-
type: "button",
|
|
10834
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "liquid" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10835
|
-
onClick: () => {
|
|
10836
|
-
changePanelTheme("liquid");
|
|
10837
|
-
},
|
|
10838
|
-
title: "iOS 液态玻璃质感 · 绿色强调(当前默认)",
|
|
10839
|
-
children: ["🧊 ", tt("settings.themeLiquid")]
|
|
10840
|
-
}),
|
|
10841
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10842
|
-
type: "button",
|
|
10843
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "classic" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10844
|
-
onClick: () => {
|
|
10845
|
-
changePanelTheme("classic");
|
|
10846
|
-
},
|
|
10847
|
-
title: "经典 iOS 毛玻璃 · 蓝色强调",
|
|
10848
|
-
children: ["💠 ", tt("settings.themeClassic")]
|
|
10849
|
-
}),
|
|
10850
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10851
|
-
type: "button",
|
|
10852
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panelTheme === "neumorph" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
10853
|
-
onClick: () => {
|
|
10854
|
-
changePanelTheme("neumorph");
|
|
10855
|
-
},
|
|
10856
|
-
title: "新拟物派 · 双阴影立体(仅浅色;深色下自动回退液态)",
|
|
10857
|
-
children: ["🔘 ", tt("settings.themeNeumorph")]
|
|
11306
|
+
title: "用 LLM 从历史章节正文重新抽取事实,补齐缺失的编年录条目",
|
|
11307
|
+
children: ["📥 ", tt("facts.backfill")]
|
|
11308
|
+
})]
|
|
10858
11309
|
}),
|
|
10859
11310
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10860
11311
|
className: panel_module_css_default.meta,
|
|
10861
|
-
children: tt("
|
|
10862
|
-
})
|
|
10863
|
-
|
|
10864
|
-
})]
|
|
10865
|
-
}),
|
|
10866
|
-
activeTab === "facts" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10867
|
-
className: panel_module_css_default.card,
|
|
10868
|
-
children: [
|
|
10869
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10870
|
-
className: panel_module_css_default.busyRow,
|
|
10871
|
-
style: { flexWrap: "wrap" },
|
|
10872
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10873
|
-
className: panel_module_css_default.cardTitle,
|
|
10874
|
-
children: tt("facts.title", { n: (project?.facts ?? []).length })
|
|
10875
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
10876
|
-
type: "button",
|
|
10877
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10878
|
-
disabled: busy || chapters.length === 0,
|
|
10879
|
-
onClick: () => {
|
|
10880
|
-
handleFactsBackfill();
|
|
10881
|
-
},
|
|
10882
|
-
title: "用 LLM 从历史章节正文重新抽取事实,补齐缺失的编年录条目",
|
|
10883
|
-
children: ["📥 ", tt("facts.backfill")]
|
|
10884
|
-
})]
|
|
10885
|
-
}),
|
|
10886
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10887
|
-
className: panel_module_css_default.meta,
|
|
10888
|
-
children: tt("facts.hint")
|
|
10889
|
-
}),
|
|
10890
|
-
(project?.facts ?? []).length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10891
|
-
style: {
|
|
10892
|
-
display: "flex",
|
|
10893
|
-
flexDirection: "column",
|
|
10894
|
-
gap: 4,
|
|
10895
|
-
maxHeight: "60vh",
|
|
10896
|
-
overflowY: "auto",
|
|
10897
|
-
fontSize: 12
|
|
10898
|
-
},
|
|
10899
|
-
children: [...project?.facts ?? []].reverse().map((fact, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11312
|
+
children: tt("facts.hint")
|
|
11313
|
+
}),
|
|
11314
|
+
(project?.facts ?? []).length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10900
11315
|
style: {
|
|
10901
11316
|
display: "flex",
|
|
10902
|
-
|
|
10903
|
-
|
|
11317
|
+
flexDirection: "column",
|
|
11318
|
+
gap: 4,
|
|
11319
|
+
maxHeight: "60vh",
|
|
11320
|
+
overflowY: "auto",
|
|
11321
|
+
fontSize: 12
|
|
10904
11322
|
},
|
|
10905
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("
|
|
10906
|
-
className: panel_module_css_default.badge,
|
|
11323
|
+
children: [...project?.facts ?? []].reverse().map((fact, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10907
11324
|
style: {
|
|
10908
|
-
|
|
10909
|
-
|
|
10910
|
-
|
|
10911
|
-
marginTop: 1
|
|
11325
|
+
display: "flex",
|
|
11326
|
+
gap: 8,
|
|
11327
|
+
alignItems: "flex-start"
|
|
10912
11328
|
},
|
|
10913
|
-
children: [
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
|
|
10923
|
-
|
|
10924
|
-
|
|
10925
|
-
|
|
10926
|
-
|
|
11329
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11330
|
+
className: panel_module_css_default.badge,
|
|
11331
|
+
style: {
|
|
11332
|
+
borderColor: "var(--nf-text-3)",
|
|
11333
|
+
color: "var(--nf-text-3)",
|
|
11334
|
+
flex: "none",
|
|
11335
|
+
marginTop: 1
|
|
11336
|
+
},
|
|
11337
|
+
children: [
|
|
11338
|
+
"第 ",
|
|
11339
|
+
fact.chapterNo,
|
|
11340
|
+
" 章"
|
|
11341
|
+
]
|
|
11342
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11343
|
+
className: panel_module_css_default.meta,
|
|
11344
|
+
children: fact.text
|
|
11345
|
+
})]
|
|
11346
|
+
}, i))
|
|
11347
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11348
|
+
className: panel_module_css_default.meta,
|
|
11349
|
+
children: "暂无事实条目——写一章后会自动生成,或点击上方「回填」。"
|
|
11350
|
+
})
|
|
11351
|
+
] })
|
|
10927
11352
|
]
|
|
10928
11353
|
}),
|
|
10929
11354
|
activeTab === "plotlines" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
10930
11355
|
className: panel_module_css_default.card,
|
|
10931
|
-
style: {
|
|
10932
|
-
flex: 1,
|
|
10933
|
-
minHeight: 0
|
|
10934
|
-
},
|
|
10935
11356
|
children: [
|
|
10936
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
11357
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10937
11358
|
className: panel_module_css_default.row,
|
|
10938
11359
|
style: {
|
|
10939
11360
|
justifyContent: "space-between",
|
|
10940
11361
|
flexWrap: "wrap"
|
|
10941
11362
|
},
|
|
10942
|
-
children:
|
|
11363
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10943
11364
|
className: panel_module_css_default.cardTitle,
|
|
11365
|
+
style: {
|
|
11366
|
+
fontSize: 17,
|
|
11367
|
+
fontWeight: 700
|
|
11368
|
+
},
|
|
11369
|
+
children: "📜 长线管理"
|
|
11370
|
+
})
|
|
11371
|
+
}),
|
|
11372
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11373
|
+
className: panel_module_css_default.row,
|
|
11374
|
+
style: {
|
|
11375
|
+
flexWrap: "wrap",
|
|
11376
|
+
gap: 6
|
|
11377
|
+
},
|
|
11378
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11379
|
+
type: "button",
|
|
11380
|
+
className: `${panel_module_css_default.button} ${longlineTab === "plotlines" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
11381
|
+
style: {
|
|
11382
|
+
fontSize: 14,
|
|
11383
|
+
flex: 1
|
|
11384
|
+
},
|
|
11385
|
+
onClick: () => {
|
|
11386
|
+
changeLonglineTab("plotlines");
|
|
11387
|
+
},
|
|
11388
|
+
title: "剧情线:故事明线(主线 / 支线 / 人物 / 悬念)",
|
|
10944
11389
|
children: [
|
|
10945
|
-
|
|
10946
|
-
"(",
|
|
11390
|
+
"🧵 剧情线(",
|
|
10947
11391
|
project?.plotlines?.length ?? 0,
|
|
10948
11392
|
")"
|
|
10949
11393
|
]
|
|
10950
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("
|
|
10951
|
-
|
|
10952
|
-
|
|
11394
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11395
|
+
type: "button",
|
|
11396
|
+
className: `${panel_module_css_default.button} ${longlineTab === "foreshadow" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
11397
|
+
style: {
|
|
11398
|
+
fontSize: 14,
|
|
11399
|
+
flex: 1
|
|
11400
|
+
},
|
|
11401
|
+
onClick: () => {
|
|
11402
|
+
changeLonglineTab("foreshadow");
|
|
11403
|
+
},
|
|
11404
|
+
title: "伏笔:道具 / 事件级暗线(埋设 → 回收)",
|
|
10953
11405
|
children: [
|
|
10954
|
-
|
|
10955
|
-
|
|
10956
|
-
|
|
10957
|
-
disabled: busy || outlineText.length < 50,
|
|
10958
|
-
onClick: () => {
|
|
10959
|
-
handlePlotlineHealth();
|
|
10960
|
-
},
|
|
10961
|
-
title: "根据已写章节数与各线推进情况,判断是否需要新增剧情线、建议多少章后添加",
|
|
10962
|
-
children: "🩺 剧情健康检查"
|
|
10963
|
-
}),
|
|
10964
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10965
|
-
type: "button",
|
|
10966
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10967
|
-
disabled: busy || outlineText.length < 50,
|
|
10968
|
-
onClick: () => {
|
|
10969
|
-
handlePlotlinePlan();
|
|
10970
|
-
},
|
|
10971
|
-
title: "AI 设计下一阶段剧情方案:未来 5-10 章方向 + 2-3 条建议新线",
|
|
10972
|
-
children: "✨ 设计剧情方案"
|
|
10973
|
-
}),
|
|
10974
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10975
|
-
type: "button",
|
|
10976
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
10977
|
-
disabled: busy || outlineText.length < 50,
|
|
10978
|
-
onClick: () => {
|
|
10979
|
-
handlePlotlineSuggest();
|
|
10980
|
-
},
|
|
10981
|
-
title: "AI 根据大纲/卷计划/已写章节/编年录,提炼候选剧情线",
|
|
10982
|
-
children: "✨ AI 建议剧情线"
|
|
10983
|
-
}),
|
|
10984
|
-
plotlineDraft === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
10985
|
-
type: "button",
|
|
10986
|
-
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
|
|
10987
|
-
onClick: () => {
|
|
10988
|
-
setPlotlineDraft({
|
|
10989
|
-
id: "",
|
|
10990
|
-
name: "",
|
|
10991
|
-
kind: "main",
|
|
10992
|
-
goal: "",
|
|
10993
|
-
progress: "",
|
|
10994
|
-
status: "active"
|
|
10995
|
-
});
|
|
10996
|
-
},
|
|
10997
|
-
children: tt("plotlines.new")
|
|
10998
|
-
})
|
|
11406
|
+
"🔮 伏笔(",
|
|
11407
|
+
foreshadows.length,
|
|
11408
|
+
")"
|
|
10999
11409
|
]
|
|
11000
11410
|
})]
|
|
11001
11411
|
}),
|
|
11002
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
11003
|
-
className: panel_module_css_default.
|
|
11004
|
-
children: tt("plotlines.hint")
|
|
11005
|
-
}),
|
|
11006
|
-
plotlineHealth !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineHealthPanel, {
|
|
11007
|
-
report: plotlineHealth,
|
|
11008
|
-
disabled: busy,
|
|
11009
|
-
onPlan: () => {
|
|
11010
|
-
handlePlotlinePlan();
|
|
11011
|
-
},
|
|
11012
|
-
onClose: () => {
|
|
11013
|
-
setPlotlineHealth(null);
|
|
11014
|
-
}
|
|
11015
|
-
}),
|
|
11016
|
-
plotlinePlan !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlinePlanPanel, {
|
|
11017
|
-
plan: plotlinePlan,
|
|
11018
|
-
disabled: busy,
|
|
11019
|
-
onAdopt: (s) => {
|
|
11020
|
-
handlePlanAdopt(s);
|
|
11021
|
-
},
|
|
11022
|
-
onClose: () => {
|
|
11023
|
-
setPlotlinePlan(null);
|
|
11024
|
-
}
|
|
11025
|
-
}),
|
|
11026
|
-
plotlineSuggestions !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineSuggestionPanel, {
|
|
11027
|
-
suggestions: plotlineSuggestions,
|
|
11028
|
-
disabled: busy,
|
|
11029
|
-
onAdopt: (s) => {
|
|
11030
|
-
handlePlotlineAdopt(s);
|
|
11031
|
-
},
|
|
11032
|
-
onClose: () => {
|
|
11033
|
-
setPlotlineSuggestions(null);
|
|
11034
|
-
}
|
|
11035
|
-
}),
|
|
11036
|
-
plotlineDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11412
|
+
longlineTab === "foreshadow" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11413
|
+
className: panel_module_css_default.row,
|
|
11037
11414
|
style: {
|
|
11038
|
-
|
|
11039
|
-
|
|
11040
|
-
gap: 8,
|
|
11041
|
-
border: "1px solid var(--nf-accent)",
|
|
11042
|
-
borderRadius: 12,
|
|
11043
|
-
padding: 10
|
|
11415
|
+
justifyContent: "space-between",
|
|
11416
|
+
flexWrap: "wrap"
|
|
11044
11417
|
},
|
|
11045
|
-
children: [
|
|
11046
|
-
|
|
11047
|
-
|
|
11048
|
-
|
|
11418
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11419
|
+
className: panel_module_css_default.cardTitle,
|
|
11420
|
+
children: [
|
|
11421
|
+
"🔮 ",
|
|
11422
|
+
tt("foreshadow.title"),
|
|
11423
|
+
"(",
|
|
11424
|
+
foreshadows.length,
|
|
11425
|
+
")"
|
|
11426
|
+
]
|
|
11427
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11428
|
+
type: "button",
|
|
11429
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
|
|
11430
|
+
disabled: busy,
|
|
11431
|
+
onClick: () => {
|
|
11432
|
+
handleSuggestForeshadows();
|
|
11433
|
+
},
|
|
11434
|
+
children: tt("foreshadow.suggest")
|
|
11435
|
+
})]
|
|
11436
|
+
}), foreshadows.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11437
|
+
className: panel_module_css_default.meta,
|
|
11438
|
+
children: tt("foreshadow.none")
|
|
11439
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11440
|
+
className: panel_module_css_default.chapterList,
|
|
11441
|
+
children: foreshadows.map((f) => {
|
|
11442
|
+
const statusLabel = {
|
|
11443
|
+
planned: tt("foreshadow.planned"),
|
|
11444
|
+
planted: tt("foreshadow.planted"),
|
|
11445
|
+
progressing: tt("foreshadow.progressing"),
|
|
11446
|
+
resolved: tt("foreshadow.resolved"),
|
|
11447
|
+
abandoned: tt("foreshadow.abandoned")
|
|
11448
|
+
}[f.status];
|
|
11449
|
+
const statusColor = f.status === "resolved" ? "var(--nf-success)" : f.status === "planted" || f.status === "progressing" ? "var(--nf-accent)" : f.status === "abandoned" ? "var(--nf-text-3)" : "var(--nf-info)";
|
|
11450
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11451
|
+
className: panel_module_css_default.chapter,
|
|
11049
11452
|
children: [
|
|
11050
11453
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11051
|
-
className: panel_module_css_default.
|
|
11052
|
-
|
|
11053
|
-
|
|
11054
|
-
|
|
11055
|
-
},
|
|
11056
|
-
|
|
11057
|
-
className: panel_module_css_default.fieldLabel,
|
|
11058
|
-
children: tt("plotlines.name")
|
|
11059
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
11060
|
-
className: panel_module_css_default.input,
|
|
11061
|
-
value: plotlineDraft.name,
|
|
11062
|
-
onChange: (e) => {
|
|
11063
|
-
setPlotlineDraft({
|
|
11064
|
-
...plotlineDraft,
|
|
11065
|
-
name: e.target.value
|
|
11066
|
-
});
|
|
11067
|
-
},
|
|
11068
|
-
placeholder: "如:集齐古玉残片"
|
|
11069
|
-
})]
|
|
11070
|
-
}),
|
|
11071
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11072
|
-
className: panel_module_css_default.field,
|
|
11073
|
-
style: { flex: 1 },
|
|
11074
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11075
|
-
className: panel_module_css_default.fieldLabel,
|
|
11076
|
-
children: tt("plotlines.kind")
|
|
11077
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11078
|
-
className: panel_module_css_default.input,
|
|
11079
|
-
value: plotlineDraft.kind,
|
|
11080
|
-
onChange: (e) => {
|
|
11081
|
-
setPlotlineDraft({
|
|
11082
|
-
...plotlineDraft,
|
|
11083
|
-
kind: e.target.value
|
|
11084
|
-
});
|
|
11085
|
-
},
|
|
11454
|
+
className: panel_module_css_default.chapterMain,
|
|
11455
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11456
|
+
className: panel_module_css_default.chapterTitle,
|
|
11457
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: f.description })
|
|
11458
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11459
|
+
className: panel_module_css_default.meta,
|
|
11086
11460
|
children: [
|
|
11087
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
11088
|
-
|
|
11089
|
-
|
|
11090
|
-
|
|
11091
|
-
|
|
11092
|
-
|
|
11093
|
-
|
|
11094
|
-
|
|
11095
|
-
|
|
11096
|
-
|
|
11097
|
-
|
|
11098
|
-
}),
|
|
11099
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
11100
|
-
|
|
11101
|
-
|
|
11102
|
-
|
|
11461
|
+
f.plantedChapter !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
11462
|
+
tt("foreshadow.plantedAt"),
|
|
11463
|
+
" 第",
|
|
11464
|
+
f.plantedChapter,
|
|
11465
|
+
"章 · "
|
|
11466
|
+
] }),
|
|
11467
|
+
f.targetChapter !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
11468
|
+
tt("foreshadow.target"),
|
|
11469
|
+
" 第",
|
|
11470
|
+
f.targetChapter,
|
|
11471
|
+
"章 · "
|
|
11472
|
+
] }),
|
|
11473
|
+
f.resolvedNote !== void 0 && f.resolvedNote !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
|
|
11474
|
+
"回收:",
|
|
11475
|
+
f.resolvedNote,
|
|
11476
|
+
" · "
|
|
11477
|
+
] })
|
|
11103
11478
|
]
|
|
11104
11479
|
})]
|
|
11105
11480
|
}),
|
|
11481
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11482
|
+
className: panel_module_css_default.badge,
|
|
11483
|
+
style: {
|
|
11484
|
+
borderColor: statusColor,
|
|
11485
|
+
color: statusColor
|
|
11486
|
+
},
|
|
11487
|
+
children: statusLabel
|
|
11488
|
+
}),
|
|
11106
11489
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11107
|
-
className: panel_module_css_default.
|
|
11108
|
-
style: {
|
|
11109
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("
|
|
11110
|
-
|
|
11111
|
-
|
|
11112
|
-
|
|
11113
|
-
|
|
11114
|
-
|
|
11115
|
-
|
|
11116
|
-
|
|
11117
|
-
|
|
11118
|
-
|
|
11119
|
-
|
|
11490
|
+
className: panel_module_css_default.row,
|
|
11491
|
+
style: { gap: 4 },
|
|
11492
|
+
children: [f.status === "planned" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11493
|
+
type: "button",
|
|
11494
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11495
|
+
disabled: busy,
|
|
11496
|
+
onClick: () => {
|
|
11497
|
+
api.foreshadow({
|
|
11498
|
+
id: f.id,
|
|
11499
|
+
status: "planted",
|
|
11500
|
+
plantedChapter: doneCount + 1
|
|
11501
|
+
}).then((r) => setProject((prev) => prev === null ? prev : {
|
|
11502
|
+
...prev,
|
|
11503
|
+
foreshadows: r.foreshadows
|
|
11504
|
+
}));
|
|
11120
11505
|
},
|
|
11121
|
-
children:
|
|
11122
|
-
|
|
11123
|
-
|
|
11124
|
-
|
|
11125
|
-
|
|
11126
|
-
|
|
11127
|
-
|
|
11128
|
-
|
|
11129
|
-
|
|
11130
|
-
|
|
11131
|
-
|
|
11132
|
-
|
|
11133
|
-
|
|
11134
|
-
|
|
11135
|
-
|
|
11136
|
-
|
|
11137
|
-
})
|
|
11138
|
-
]
|
|
11506
|
+
children: tt("foreshadow.setPlanted")
|
|
11507
|
+
}), (f.status === "planted" || f.status === "progressing") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11508
|
+
type: "button",
|
|
11509
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11510
|
+
disabled: busy,
|
|
11511
|
+
onClick: () => {
|
|
11512
|
+
api.foreshadow({
|
|
11513
|
+
id: f.id,
|
|
11514
|
+
status: "resolved",
|
|
11515
|
+
resolvedNote: `第${doneCount}章回收`
|
|
11516
|
+
}).then((r) => setProject((prev) => prev === null ? prev : {
|
|
11517
|
+
...prev,
|
|
11518
|
+
foreshadows: r.foreshadows
|
|
11519
|
+
}));
|
|
11520
|
+
},
|
|
11521
|
+
children: tt("foreshadow.setResolved")
|
|
11139
11522
|
})]
|
|
11140
11523
|
})
|
|
11141
11524
|
]
|
|
11142
|
-
})
|
|
11143
|
-
|
|
11144
|
-
|
|
11145
|
-
|
|
11146
|
-
|
|
11147
|
-
|
|
11148
|
-
|
|
11149
|
-
|
|
11150
|
-
|
|
11151
|
-
|
|
11152
|
-
|
|
11153
|
-
|
|
11154
|
-
|
|
11155
|
-
|
|
11156
|
-
|
|
11157
|
-
|
|
11158
|
-
|
|
11159
|
-
|
|
11160
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11161
|
-
className: panel_module_css_default.field,
|
|
11162
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11163
|
-
className: panel_module_css_default.fieldLabel,
|
|
11164
|
-
children: tt("plotlines.progress")
|
|
11165
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
|
|
11166
|
-
className: panel_module_css_default.textarea,
|
|
11167
|
-
style: { minHeight: 40 },
|
|
11168
|
-
value: plotlineDraft.progress,
|
|
11169
|
-
onChange: (e) => {
|
|
11170
|
-
setPlotlineDraft({
|
|
11171
|
-
...plotlineDraft,
|
|
11172
|
-
progress: e.target.value
|
|
11173
|
-
});
|
|
11174
|
-
},
|
|
11175
|
-
placeholder: "如:已取得第二枚残片,正追踪第三枚线索"
|
|
11176
|
-
})]
|
|
11177
|
-
}),
|
|
11178
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11525
|
+
}, f.id);
|
|
11526
|
+
})
|
|
11527
|
+
})] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11528
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11529
|
+
className: panel_module_css_default.row,
|
|
11530
|
+
style: {
|
|
11531
|
+
justifyContent: "space-between",
|
|
11532
|
+
flexWrap: "wrap"
|
|
11533
|
+
},
|
|
11534
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
11535
|
+
className: panel_module_css_default.cardTitle,
|
|
11536
|
+
children: [
|
|
11537
|
+
"🧵 ",
|
|
11538
|
+
tt("tab.plotlines"),
|
|
11539
|
+
"(",
|
|
11540
|
+
project?.plotlines?.length ?? 0,
|
|
11541
|
+
")"
|
|
11542
|
+
]
|
|
11543
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11179
11544
|
className: panel_module_css_default.row,
|
|
11180
|
-
|
|
11181
|
-
|
|
11182
|
-
|
|
11183
|
-
|
|
11184
|
-
|
|
11185
|
-
|
|
11186
|
-
|
|
11187
|
-
|
|
11188
|
-
|
|
11189
|
-
|
|
11190
|
-
|
|
11191
|
-
|
|
11192
|
-
|
|
11193
|
-
|
|
11194
|
-
|
|
11195
|
-
|
|
11196
|
-
|
|
11197
|
-
|
|
11198
|
-
|
|
11199
|
-
|
|
11200
|
-
|
|
11201
|
-
|
|
11202
|
-
|
|
11203
|
-
|
|
11204
|
-
|
|
11205
|
-
|
|
11206
|
-
|
|
11207
|
-
|
|
11208
|
-
|
|
11209
|
-
|
|
11210
|
-
|
|
11211
|
-
|
|
11212
|
-
|
|
11545
|
+
style: { flexWrap: "wrap" },
|
|
11546
|
+
children: [
|
|
11547
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11548
|
+
type: "button",
|
|
11549
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11550
|
+
disabled: busy || outlineText.length < 50,
|
|
11551
|
+
onClick: () => {
|
|
11552
|
+
handlePlotlineHealth();
|
|
11553
|
+
},
|
|
11554
|
+
title: "根据已写章节数与各线推进情况,判断是否需要新增剧情线、建议多少章后添加",
|
|
11555
|
+
children: "🩺 剧情健康检查"
|
|
11556
|
+
}),
|
|
11557
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11558
|
+
type: "button",
|
|
11559
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11560
|
+
disabled: busy || outlineText.length < 50,
|
|
11561
|
+
onClick: () => {
|
|
11562
|
+
handlePlotlinePlan();
|
|
11563
|
+
},
|
|
11564
|
+
title: "AI 设计下一阶段剧情方案:未来 5-10 章方向 + 2-3 条建议新线",
|
|
11565
|
+
children: "✨ 设计剧情方案"
|
|
11566
|
+
}),
|
|
11567
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11568
|
+
type: "button",
|
|
11569
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11570
|
+
disabled: busy || outlineText.length < 50,
|
|
11571
|
+
onClick: () => {
|
|
11572
|
+
handlePlotlineSuggest();
|
|
11573
|
+
},
|
|
11574
|
+
title: "AI 根据大纲/卷计划/已写章节/编年录,提炼候选剧情线",
|
|
11575
|
+
children: "✨ AI 建议剧情线"
|
|
11576
|
+
}),
|
|
11577
|
+
plotlineDraft === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11578
|
+
type: "button",
|
|
11579
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
|
|
11580
|
+
onClick: () => {
|
|
11581
|
+
setPlotlineDraft({
|
|
11582
|
+
id: "",
|
|
11583
|
+
name: "",
|
|
11584
|
+
kind: "main",
|
|
11585
|
+
goal: "",
|
|
11586
|
+
progress: "",
|
|
11587
|
+
status: "active"
|
|
11588
|
+
});
|
|
11589
|
+
},
|
|
11590
|
+
children: tt("plotlines.new")
|
|
11591
|
+
})
|
|
11592
|
+
]
|
|
11593
|
+
})]
|
|
11594
|
+
}),
|
|
11595
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11596
|
+
className: panel_module_css_default.meta,
|
|
11597
|
+
children: tt("plotlines.hint")
|
|
11598
|
+
}),
|
|
11599
|
+
plotlineHealth !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineHealthPanel, {
|
|
11600
|
+
report: plotlineHealth,
|
|
11213
11601
|
disabled: busy,
|
|
11214
|
-
|
|
11215
|
-
|
|
11602
|
+
onPlan: () => {
|
|
11603
|
+
handlePlotlinePlan();
|
|
11216
11604
|
},
|
|
11217
|
-
|
|
11218
|
-
|
|
11219
|
-
|
|
11220
|
-
|
|
11221
|
-
|
|
11222
|
-
|
|
11223
|
-
|
|
11224
|
-
|
|
11225
|
-
|
|
11605
|
+
onClose: () => {
|
|
11606
|
+
setPlotlineHealth(null);
|
|
11607
|
+
}
|
|
11608
|
+
}),
|
|
11609
|
+
plotlinePlan !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlinePlanPanel, {
|
|
11610
|
+
plan: plotlinePlan,
|
|
11611
|
+
disabled: busy,
|
|
11612
|
+
onAdopt: (s) => {
|
|
11613
|
+
handlePlanAdopt(s);
|
|
11226
11614
|
},
|
|
11227
|
-
|
|
11228
|
-
|
|
11615
|
+
onClose: () => {
|
|
11616
|
+
setPlotlinePlan(null);
|
|
11229
11617
|
}
|
|
11230
|
-
},
|
|
11231
|
-
|
|
11618
|
+
}),
|
|
11619
|
+
plotlineSuggestions !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineSuggestionPanel, {
|
|
11620
|
+
suggestions: plotlineSuggestions,
|
|
11621
|
+
disabled: busy,
|
|
11622
|
+
onAdopt: (s) => {
|
|
11623
|
+
handlePlotlineAdopt(s);
|
|
11624
|
+
},
|
|
11625
|
+
onClose: () => {
|
|
11626
|
+
setPlotlineSuggestions(null);
|
|
11627
|
+
}
|
|
11628
|
+
}),
|
|
11629
|
+
plotlineDraft !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11630
|
+
style: {
|
|
11631
|
+
display: "flex",
|
|
11632
|
+
flexDirection: "column",
|
|
11633
|
+
gap: 8,
|
|
11634
|
+
border: "1px solid var(--nf-accent)",
|
|
11635
|
+
borderRadius: 12,
|
|
11636
|
+
padding: 10
|
|
11637
|
+
},
|
|
11638
|
+
children: [
|
|
11639
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11640
|
+
className: panel_module_css_default.row,
|
|
11641
|
+
style: { flexWrap: "wrap" },
|
|
11642
|
+
children: [
|
|
11643
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11644
|
+
className: panel_module_css_default.field,
|
|
11645
|
+
style: {
|
|
11646
|
+
flex: 2,
|
|
11647
|
+
minWidth: 160
|
|
11648
|
+
},
|
|
11649
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11650
|
+
className: panel_module_css_default.fieldLabel,
|
|
11651
|
+
children: tt("plotlines.name")
|
|
11652
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
11653
|
+
className: panel_module_css_default.input,
|
|
11654
|
+
value: plotlineDraft.name,
|
|
11655
|
+
onChange: (e) => {
|
|
11656
|
+
setPlotlineDraft({
|
|
11657
|
+
...plotlineDraft,
|
|
11658
|
+
name: e.target.value
|
|
11659
|
+
});
|
|
11660
|
+
},
|
|
11661
|
+
placeholder: "如:集齐古玉残片"
|
|
11662
|
+
})]
|
|
11663
|
+
}),
|
|
11664
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11665
|
+
className: panel_module_css_default.field,
|
|
11666
|
+
style: { flex: 1 },
|
|
11667
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11668
|
+
className: panel_module_css_default.fieldLabel,
|
|
11669
|
+
children: tt("plotlines.kind")
|
|
11670
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11671
|
+
className: panel_module_css_default.input,
|
|
11672
|
+
value: plotlineDraft.kind,
|
|
11673
|
+
onChange: (e) => {
|
|
11674
|
+
setPlotlineDraft({
|
|
11675
|
+
...plotlineDraft,
|
|
11676
|
+
kind: e.target.value
|
|
11677
|
+
});
|
|
11678
|
+
},
|
|
11679
|
+
children: [
|
|
11680
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11681
|
+
value: "main",
|
|
11682
|
+
children: tt("plotlines.kindMain")
|
|
11683
|
+
}),
|
|
11684
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11685
|
+
value: "branch",
|
|
11686
|
+
children: tt("plotlines.kindBranch")
|
|
11687
|
+
}),
|
|
11688
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11689
|
+
value: "character",
|
|
11690
|
+
children: tt("plotlines.kindCharacter")
|
|
11691
|
+
}),
|
|
11692
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11693
|
+
value: "mystery",
|
|
11694
|
+
children: tt("plotlines.kindMystery")
|
|
11695
|
+
})
|
|
11696
|
+
]
|
|
11697
|
+
})]
|
|
11698
|
+
}),
|
|
11699
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11700
|
+
className: panel_module_css_default.field,
|
|
11701
|
+
style: { flex: 1 },
|
|
11702
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11703
|
+
className: panel_module_css_default.fieldLabel,
|
|
11704
|
+
children: tt("plotlines.status")
|
|
11705
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11706
|
+
className: panel_module_css_default.input,
|
|
11707
|
+
value: plotlineDraft.status,
|
|
11708
|
+
onChange: (e) => {
|
|
11709
|
+
setPlotlineDraft({
|
|
11710
|
+
...plotlineDraft,
|
|
11711
|
+
status: e.target.value
|
|
11712
|
+
});
|
|
11713
|
+
},
|
|
11714
|
+
children: [
|
|
11715
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11716
|
+
value: "active",
|
|
11717
|
+
children: tt("plotlines.statusActive")
|
|
11718
|
+
}),
|
|
11719
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11720
|
+
value: "paused",
|
|
11721
|
+
children: tt("plotlines.statusPaused")
|
|
11722
|
+
}),
|
|
11723
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11724
|
+
value: "resolved",
|
|
11725
|
+
children: tt("plotlines.statusResolved")
|
|
11726
|
+
}),
|
|
11727
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11728
|
+
value: "abandoned",
|
|
11729
|
+
children: tt("plotlines.statusAbandoned")
|
|
11730
|
+
})
|
|
11731
|
+
]
|
|
11732
|
+
})]
|
|
11733
|
+
})
|
|
11734
|
+
]
|
|
11735
|
+
}),
|
|
11736
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11737
|
+
className: panel_module_css_default.field,
|
|
11738
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11739
|
+
className: panel_module_css_default.fieldLabel,
|
|
11740
|
+
children: tt("plotlines.goal")
|
|
11741
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
|
|
11742
|
+
className: panel_module_css_default.textarea,
|
|
11743
|
+
style: { minHeight: 48 },
|
|
11744
|
+
value: plotlineDraft.goal,
|
|
11745
|
+
onChange: (e) => {
|
|
11746
|
+
setPlotlineDraft({
|
|
11747
|
+
...plotlineDraft,
|
|
11748
|
+
goal: e.target.value
|
|
11749
|
+
});
|
|
11750
|
+
}
|
|
11751
|
+
})]
|
|
11752
|
+
}),
|
|
11753
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11754
|
+
className: panel_module_css_default.field,
|
|
11755
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
|
|
11756
|
+
className: panel_module_css_default.fieldLabel,
|
|
11757
|
+
children: tt("plotlines.progress")
|
|
11758
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
|
|
11759
|
+
className: panel_module_css_default.textarea,
|
|
11760
|
+
style: { minHeight: 40 },
|
|
11761
|
+
value: plotlineDraft.progress,
|
|
11762
|
+
onChange: (e) => {
|
|
11763
|
+
setPlotlineDraft({
|
|
11764
|
+
...plotlineDraft,
|
|
11765
|
+
progress: e.target.value
|
|
11766
|
+
});
|
|
11767
|
+
},
|
|
11768
|
+
placeholder: "如:已取得第二枚残片,正追踪第三枚线索"
|
|
11769
|
+
})]
|
|
11770
|
+
}),
|
|
11771
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11772
|
+
className: panel_module_css_default.row,
|
|
11773
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11774
|
+
type: "button",
|
|
11775
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
|
|
11776
|
+
disabled: busy,
|
|
11777
|
+
onClick: () => {
|
|
11778
|
+
handlePlotlineSave();
|
|
11779
|
+
},
|
|
11780
|
+
children: tt("plotlines.save")
|
|
11781
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
11782
|
+
type: "button",
|
|
11783
|
+
className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
|
|
11784
|
+
onClick: () => {
|
|
11785
|
+
setPlotlineDraft(null);
|
|
11786
|
+
},
|
|
11787
|
+
children: tt("plotlines.cancel")
|
|
11788
|
+
})]
|
|
11789
|
+
})
|
|
11790
|
+
]
|
|
11791
|
+
}),
|
|
11792
|
+
(project?.plotlines ?? []).length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11793
|
+
className: panel_module_css_default.meta,
|
|
11794
|
+
children: tt("plotlines.empty")
|
|
11795
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11796
|
+
style: {
|
|
11797
|
+
display: "flex",
|
|
11798
|
+
flexDirection: "column",
|
|
11799
|
+
gap: 8,
|
|
11800
|
+
overflowY: "auto",
|
|
11801
|
+
flex: 1,
|
|
11802
|
+
minHeight: 0
|
|
11803
|
+
},
|
|
11804
|
+
children: (project?.plotlines ?? []).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineCard, {
|
|
11805
|
+
line,
|
|
11806
|
+
disabled: busy,
|
|
11807
|
+
onRefresh: () => {
|
|
11808
|
+
handlePlotlineRefresh(line.id);
|
|
11809
|
+
},
|
|
11810
|
+
onEdit: () => {
|
|
11811
|
+
setPlotlineDraft({
|
|
11812
|
+
id: line.id,
|
|
11813
|
+
name: line.name,
|
|
11814
|
+
kind: line.kind,
|
|
11815
|
+
goal: line.goal,
|
|
11816
|
+
progress: line.progress,
|
|
11817
|
+
status: line.status
|
|
11818
|
+
});
|
|
11819
|
+
},
|
|
11820
|
+
onRemove: () => {
|
|
11821
|
+
handlePlotlineRemove(line.id);
|
|
11822
|
+
}
|
|
11823
|
+
}, line.id))
|
|
11824
|
+
})
|
|
11825
|
+
] })
|
|
11232
11826
|
]
|
|
11233
11827
|
}),
|
|
11234
11828
|
activeTab === "run" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RunPanel, {
|
|
@@ -11253,7 +11847,7 @@ window.__ModuleLoader__.load({
|
|
|
11253
11847
|
children: [
|
|
11254
11848
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11255
11849
|
className: panel_module_css_default.input,
|
|
11256
|
-
style: { width:
|
|
11850
|
+
style: { width: 160 },
|
|
11257
11851
|
value: breakdownScope,
|
|
11258
11852
|
onChange: (e) => {
|
|
11259
11853
|
setBreakdownScope(e.target.value);
|
|
@@ -11280,7 +11874,7 @@ window.__ModuleLoader__.load({
|
|
|
11280
11874
|
}),
|
|
11281
11875
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
11282
11876
|
className: panel_module_css_default.input,
|
|
11283
|
-
style: { width:
|
|
11877
|
+
style: { width: 150 },
|
|
11284
11878
|
value: breakdownPreset,
|
|
11285
11879
|
onChange: (e) => {
|
|
11286
11880
|
setBreakdownPreset(e.target.value);
|
|
@@ -11291,7 +11885,7 @@ window.__ModuleLoader__.load({
|
|
|
11291
11885
|
children: "快速(4 维)"
|
|
11292
11886
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
11293
11887
|
value: "standard",
|
|
11294
|
-
children: "
|
|
11888
|
+
children: "标准+卖点"
|
|
11295
11889
|
})]
|
|
11296
11890
|
}),
|
|
11297
11891
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -11385,36 +11979,49 @@ window.__ModuleLoader__.load({
|
|
|
11385
11979
|
activeTab === "storyboard" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11386
11980
|
className: panel_module_css_default.card,
|
|
11387
11981
|
children: [
|
|
11388
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
11982
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
11389
11983
|
className: panel_module_css_default.row,
|
|
11390
11984
|
style: {
|
|
11391
11985
|
justifyContent: "space-between",
|
|
11392
11986
|
flexWrap: "wrap"
|
|
11393
11987
|
},
|
|
11394
|
-
children:
|
|
11988
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11395
11989
|
className: panel_module_css_default.cardTitle,
|
|
11990
|
+
style: {
|
|
11991
|
+
fontSize: 17,
|
|
11992
|
+
fontWeight: 700
|
|
11993
|
+
},
|
|
11396
11994
|
children: "🎬 漫剧工坊"
|
|
11397
|
-
})
|
|
11398
|
-
|
|
11995
|
+
})
|
|
11996
|
+
}),
|
|
11997
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11998
|
+
className: panel_module_css_default.row,
|
|
11999
|
+
style: {
|
|
12000
|
+
flexWrap: "wrap",
|
|
12001
|
+
gap: 6
|
|
12002
|
+
},
|
|
12003
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
12004
|
+
type: "button",
|
|
12005
|
+
className: `${panel_module_css_default.button} ${storyboardView === "single" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
11399
12006
|
style: {
|
|
11400
|
-
|
|
11401
|
-
|
|
12007
|
+
fontSize: 14,
|
|
12008
|
+
flex: 1
|
|
11402
12009
|
},
|
|
11403
|
-
|
|
11404
|
-
|
|
11405
|
-
|
|
11406
|
-
|
|
11407
|
-
|
|
11408
|
-
|
|
11409
|
-
|
|
11410
|
-
|
|
11411
|
-
|
|
11412
|
-
|
|
11413
|
-
|
|
11414
|
-
|
|
11415
|
-
|
|
11416
|
-
|
|
11417
|
-
|
|
12010
|
+
onClick: () => {
|
|
12011
|
+
setStoryboardView("single");
|
|
12012
|
+
},
|
|
12013
|
+
children: "🎞️ 单集分镜"
|
|
12014
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
12015
|
+
type: "button",
|
|
12016
|
+
className: `${panel_module_css_default.button} ${storyboardView === "plan" ? panel_module_css_default.buttonPrimary : ""}`,
|
|
12017
|
+
style: {
|
|
12018
|
+
fontSize: 14,
|
|
12019
|
+
flex: 1
|
|
12020
|
+
},
|
|
12021
|
+
onClick: () => {
|
|
12022
|
+
setStoryboardView("plan");
|
|
12023
|
+
},
|
|
12024
|
+
children: "📺 按卷规划"
|
|
11418
12025
|
})]
|
|
11419
12026
|
}),
|
|
11420
12027
|
storyboardView === "plan" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -11800,7 +12407,7 @@ window.__ModuleLoader__.load({
|
|
|
11800
12407
|
] })
|
|
11801
12408
|
]
|
|
11802
12409
|
})]
|
|
11803
|
-
})
|
|
12410
|
+
}) }),
|
|
11804
12411
|
assistantOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11805
12412
|
className: panel_module_css_default.assistantFloat,
|
|
11806
12413
|
style: {
|