@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 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
- "dashHeroTitle": "zE6uZW_dashHeroTitle",
906
- "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
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
- "bookCreateCard": "zE6uZW_bookCreateCard",
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
- "navTabLabel": "zE6uZW_navTabLabel",
930
- "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
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
- "iconButton": "zE6uZW_iconButton",
961
- "wsSelectedText": "zE6uZW_wsSelectedText",
962
- "navSpacer": "zE6uZW_navSpacer",
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
- "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
965
- "readerView": "zE6uZW_readerView",
966
- "fadeIn": "zE6uZW_fadeIn",
967
- "createBookTop": "zE6uZW_createBookTop",
952
+ "fileList": "zE6uZW_fileList",
953
+ "wsSelected": "zE6uZW_wsSelected",
968
954
  "dashFact": "zE6uZW_dashFact",
969
- "volumeGroup": "zE6uZW_volumeGroup",
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
- "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
972
- "assistantStatus": "zE6uZW_assistantStatus",
973
- "panelContent": "zE6uZW_panelContent",
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
- "assistantFloatBody": "zE6uZW_assistantFloatBody",
979
- "bookAddCard": "zE6uZW_bookAddCard",
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
- "shelfEmpty": "zE6uZW_shelfEmpty",
986
- "ideaCandidate": "zE6uZW_ideaCandidate",
987
- "dashJourneyStages": "zE6uZW_dashJourneyStages",
988
- "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
989
- "shelfHeader": "zE6uZW_shelfHeader",
990
- "headerProgress": "zE6uZW_headerProgress",
991
- "onlyChanges": "zE6uZW_onlyChanges",
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
- "bookChipRemove": "zE6uZW_bookChipRemove",
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
- "panelTitle": "zE6uZW_panelTitle",
1006
- "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
1007
- "workflowLabel": "zE6uZW_workflowLabel",
1008
- "navGroup": "zE6uZW_navGroup",
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
- "entryIcon": "zE6uZW_entryIcon",
1038
- "readerLoading": "zE6uZW_readerLoading",
1039
- "entryLabel": "zE6uZW_entryLabel",
1040
- "readerSegBtn": "zE6uZW_readerSegBtn",
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
- "progressLineError": "zE6uZW_progressLineError",
1043
- "wsColumn": "zE6uZW_wsColumn",
1044
- "workflowRow": "zE6uZW_workflowRow",
1045
- "bookshelfList": "zE6uZW_bookshelfList",
1046
- "chapterList": "zE6uZW_chapterList",
1047
- "progressBarFill": "zE6uZW_progressBarFill",
1048
- "chapterBeats": "zE6uZW_chapterBeats",
1049
- "buttonPrimary": "zE6uZW_buttonPrimary",
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
- "bookCardName": "zE6uZW_bookCardName",
1052
- "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
1053
- "dropzoneIcon": "zE6uZW_dropzoneIcon",
1054
- "readerMain": "zE6uZW_readerMain",
1055
- "badge": "zE6uZW_badge",
1056
- "chapterNum": "zE6uZW_chapterNum",
1057
- "spaceBetween": "zE6uZW_spaceBetween",
1058
- "bookCardBlurb": "zE6uZW_bookCardBlurb",
1059
- "buttonDanger": "zE6uZW_buttonDanger",
1060
- "bookCardBody": "zE6uZW_bookCardBody",
1061
- "readerGroup": "zE6uZW_readerGroup",
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
- "navAboutRow": "zE6uZW_navAboutRow",
1085
- "coverPreview": "zE6uZW_coverPreview",
1086
- "bookChipActive": "zE6uZW_bookChipActive",
1087
- "badgeDone": "zE6uZW_badgeDone",
1088
- "shelfTitleRow": "zE6uZW_shelfTitleRow",
1089
- "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
1090
- "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
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
- "tabBar": "zE6uZW_tabBar",
1093
- "dropzone": "zE6uZW_dropzone",
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
- "pulse": "zE6uZW_pulse",
1110
- "badgePending": "zE6uZW_badgePending",
1066
+ "readerSidebar": "zE6uZW_readerSidebar",
1111
1067
  "readerItemBadge": "zE6uZW_readerItemBadge",
1112
- "chapterActions": "zE6uZW_chapterActions",
1113
- "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
1114
- "dashHero": "zE6uZW_dashHero",
1115
- "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
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
- "busyRow": "zE6uZW_busyRow",
1118
- "headerProgressDot": "zE6uZW_headerProgressDot",
1119
- "dashHeroAction": "zE6uZW_dashHeroAction",
1120
- "legendNew": "zE6uZW_legendNew",
1121
- "diffChange": "zE6uZW_diffChange",
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
- "shelfFilters": "zE6uZW_shelfFilters",
1124
- "bookCardCover": "zE6uZW_bookCardCover",
1125
- "diffTagNew": "zE6uZW_diffTagNew",
1126
- "panelNav": "zE6uZW_panelNav",
1127
- "dashStage": "zE6uZW_dashStage",
1128
- "bookshelf": "zE6uZW_bookshelf",
1129
- "toolStepIcon": "zE6uZW_toolStepIcon",
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
- "readerHeader": "zE6uZW_readerHeader",
1133
- "diffSame": "zE6uZW_diffSame",
1134
- "input": "zE6uZW_input",
1135
- "diffText": "zE6uZW_diffText",
1136
- "fileList": "zE6uZW_fileList",
1137
- "navAboutUpdate": "zE6uZW_navAboutUpdate",
1138
- "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
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
- "panelBody": "zE6uZW_panelBody",
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
- "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle"
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: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2545
- className: panel_module_css_default.shelfTitleRow,
2546
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
2547
- className: panel_module_css_default.panelTitle,
2548
- style: { margin: 0 },
2549
- children: "📚 书架"
2550
- }), shelf.books.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
2551
- className: panel_module_css_default.meta,
2552
- children: [
2553
- shelf.books.length,
2554
- " 本书 · ",
2555
- stats.active,
2556
- " 进行中 · ",
2557
- stats.done,
2558
- " 已完结 · ",
2559
- stats.none,
2560
- " 未开书"
2561
- ]
2562
- })]
2563
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2564
- className: panel_module_css_default.shelfToolbar,
2565
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
2566
- className: `${panel_module_css_default.input} ${panel_module_css_default.shelfSearch}`,
2567
- type: "search",
2568
- placeholder: "🔍 搜索书名 / 简介…",
2569
- value: query,
2570
- onChange: (e) => {
2571
- setQuery(e.target.value);
2572
- }
2573
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
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} ${panel_module_css_default.buttonSmall} ${filter === f.id ? panel_module_css_default.buttonPrimary : ""}`,
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: tt("tab.plotlines"),
5428
- icon: "🧵"
5540
+ label: "长线管理",
5541
+ icon: "📜"
5429
5542
  },
5430
5543
  {
5431
- id: "run",
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: "assetsProgression",
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
- const PLUGIN_VERSION = "1.1.9";
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.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
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 === "foreshadow" && foreshadows.some((f) => f.status === "planned") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8519
- className: panel_module_css_default.busyRow,
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.meta,
8522
- style: { fontWeight: 600 },
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.meta,
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
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.assetGrid,
8740
+ className: panel_module_css_default.statRowD,
8559
8741
  children: [
8560
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8561
- label: "全书进度",
8562
- value: `${doneCount}/${chapters.length} 章`,
8563
- valueColor: "var(--nf-accent)",
8564
- detail: `${chapters.length > 0 ? Math.round(doneCount / chapters.length * 100) : 0}%`
8565
- }),
8566
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8567
- label: "已通过审稿",
8568
- value: String(approvedCount),
8569
- valueColor: approvedCount > 0 ? "var(--nf-success)" : void 0,
8570
- detail: "章节已 approved"
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.jsx)(StatCell, {
8573
- label: "待生成",
8574
- value: String(pendingCount),
8575
- valueColor: pendingCount > 0 ? "var(--nf-warn)" : void 0,
8576
- detail: "pending + error"
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.jsx)(StatCell, {
8579
- label: "待审稿",
8580
- value: String(reviewPendingCount),
8581
- valueColor: reviewPendingCount > 0 ? "var(--nf-info)" : void 0,
8582
- detail: "written + rejected"
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: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8606
- className: panel_module_css_default.row,
8607
- style: { justifyContent: "space-between" },
8608
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8609
- className: panel_module_css_default.cardTitle,
8610
- children: "资产健康"
8611
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8612
- type: "button",
8613
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
8614
- disabled: busy || doneCount === 0,
8615
- onClick: () => {
8616
- handleAudit();
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
- title: "LLM 扫描全本已生成章节,检查人名/境界/资源/时间线矛盾",
8619
- children: "🔍 全书质检"
8620
- })]
8621
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8622
- className: panel_module_css_default.assetGrid,
8623
- children: [
8624
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8625
- label: "道藏",
8626
- value: bible !== void 0 ? `✓ ${bible.worldRules.length} 条规则` : "未生成",
8627
- valueColor: bible !== void 0 ? "var(--nf-success)" : "var(--nf-text-3)",
8628
- detail: bible !== void 0 ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : "提炼人设 / 世界观 / 金手指"
8629
- }),
8630
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8631
- label: "卷计划",
8632
- value: volumes !== void 0 ? `${volumes.length} 卷` : "未生成",
8633
- valueColor: volumes !== void 0 ? "var(--nf-success)" : "var(--nf-text-3)",
8634
- detail: volumes !== void 0 ? volumes.map((v) => v.title).join(" / ") : "按剧情弧线划分全书",
8635
- detailTitle: volumes?.map((v) => v.title).join(" / ")
8636
- }),
8637
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8638
- label: "写作资产",
8639
- value: `${assetCount} 项`,
8640
- valueColor: assetCount > 0 ? "var(--nf-success)" : "var(--nf-text-3)",
8641
- detail: assetSummary,
8642
- detailTitle: assetSummary
8643
- }),
8644
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatCell, {
8645
- label: "伏笔",
8646
- value: `${foreshadows.length} 条`,
8647
- detail: `${foreshadows.filter((f) => f.status === "planned").length} 待埋 · ${foreshadows.filter((f) => f.status === "resolved").length} 已回收`
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("reviews");
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 === "reviews" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10005
+ activeTab === "book" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9691
10006
  className: panel_module_css_default.card,
9692
- style: {
9693
- flex: 1,
9694
- minHeight: 0
9695
- },
9696
- children: [
9697
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9698
- className: panel_module_css_default.row,
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
- justifyContent: "space-between",
9701
- flexWrap: "wrap"
10017
+ fontSize: 17,
10018
+ fontWeight: 700
9702
10019
  },
9703
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9704
- className: panel_module_css_default.cardTitle,
9705
- children: [
9706
- "📋 复盘记录(",
9707
- chapters.filter((c) => c.authorReview !== void 0).length,
9708
- " 章已复盘)"
9709
- ]
9710
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9711
- className: panel_module_css_default.row,
9712
- children: (() => {
9713
- const missing = chapters.filter((c) => c.status !== "pending" && c.status !== "generating" && c.authorReview === void 0).length;
9714
- return missing > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
9715
- type: "button",
9716
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
9717
- disabled: busy,
9718
- onClick: () => {
9719
- handleAuthorBackfillAll();
9720
- },
9721
- title: "对历史已写章节逐章补跑作者复盘",
9722
- children: [
9723
- "↻ 补齐缺失复盘(",
9724
- missing,
9725
- ""
9726
- ]
9727
- });
9728
- })()
9729
- })]
9730
- }),
9731
- (() => {
9732
- const reviewed = chapters.filter((c) => c.authorReview !== void 0);
9733
- if (reviewed.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9734
- className: panel_module_css_default.meta,
9735
- children: "尚无作者复盘——生成/审稿后自动生成,或点「补齐缺失复盘」为已写章节补跑。"
9736
- });
9737
- const honored = reviewed.filter((c) => c.authorReview.hookHonored).length;
9738
- const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview.endingHook, 0) / reviewed.length * 10) / 10;
9739
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
9740
- className: panel_module_css_default.meta,
9741
- style: { fontWeight: 600 },
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
- honored,
9745
- "/",
9746
- reviewed.length,
9747
- " · 结尾钩子均分 ",
9748
- avg,
9749
- "/10"
10070
+ "👥 角色库(",
10071
+ project?.roles?.length ?? 0,
10072
+ ""
9750
10073
  ]
9751
- });
9752
- })(),
9753
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
9754
- style: {
9755
- display: "flex",
9756
- flexDirection: "column",
9757
- gap: 10,
9758
- overflowY: "auto",
9759
- flex: 1,
9760
- minHeight: 0
9761
- },
9762
- children: chapterGroups.map((group) => {
9763
- const groupReviewed = group.chapters.filter((c) => c.authorReview !== void 0);
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 === "assetsGenre" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AssetsTab, {
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
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10537
- className: panel_module_css_default.field,
10538
- style: { flex: 1 },
10539
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10540
- className: panel_module_css_default.fieldLabel,
10541
- children: tt("settings.provider")
10542
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10543
- className: panel_module_css_default.input,
10544
- value: configDraft.provider,
10545
- onChange: (e) => {
10546
- setConfigDraft({
10547
- ...configDraft,
10548
- provider: e.target.value
10549
- });
10550
- }
10551
- })]
10552
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10553
- className: panel_module_css_default.field,
10554
- style: { flex: 1 },
10555
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
10556
- className: panel_module_css_default.fieldLabel,
10557
- children: tt("settings.model")
10558
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
10559
- className: panel_module_css_default.input,
10560
- value: configDraft.model,
10561
- onChange: (e) => {
10562
- setConfigDraft({
10563
- ...configDraft,
10564
- model: e.target.value
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
- handleExport("md");
11304
+ handleFactsBackfill();
10813
11305
  },
10814
- children: tt("settings.exportMd")
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("settings.themeHint")
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
- gap: 8,
10903
- alignItems: "flex-start"
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)("span", {
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
- borderColor: "var(--nf-text-3)",
10909
- color: "var(--nf-text-3)",
10910
- flex: "none",
10911
- marginTop: 1
11325
+ display: "flex",
11326
+ gap: 8,
11327
+ alignItems: "flex-start"
10912
11328
  },
10913
- children: [
10914
- "第 ",
10915
- fact.chapterNo,
10916
- " "
10917
- ]
10918
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10919
- className: panel_module_css_default.meta,
10920
- children: fact.text
10921
- })]
10922
- }, i))
10923
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10924
- className: panel_module_css_default.meta,
10925
- children: "暂无事实条目——写一章后会自动生成,或点击上方「回填」。"
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.jsxs)("div", {
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: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
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
- tt("tab.plotlines"),
10946
- "(",
11390
+ "🧵 剧情线(",
10947
11391
  project?.plotlines?.length ?? 0,
10948
11392
  ")"
10949
11393
  ]
10950
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10951
- className: panel_module_css_default.row,
10952
- style: { flexWrap: "wrap" },
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10955
- type: "button",
10956
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
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.jsx)("span", {
11003
- className: panel_module_css_default.meta,
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
- display: "flex",
11039
- flexDirection: "column",
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11047
- className: panel_module_css_default.row,
11048
- style: { flexWrap: "wrap" },
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.field,
11052
- style: {
11053
- flex: 2,
11054
- minWidth: 160
11055
- },
11056
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
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.jsx)("option", {
11088
- value: "main",
11089
- children: tt("plotlines.kindMain")
11090
- }),
11091
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11092
- value: "branch",
11093
- children: tt("plotlines.kindBranch")
11094
- }),
11095
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11096
- value: "character",
11097
- children: tt("plotlines.kindCharacter")
11098
- }),
11099
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11100
- value: "mystery",
11101
- children: tt("plotlines.kindMystery")
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.field,
11108
- style: { flex: 1 },
11109
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11110
- className: panel_module_css_default.fieldLabel,
11111
- children: tt("plotlines.status")
11112
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
11113
- className: panel_module_css_default.input,
11114
- value: plotlineDraft.status,
11115
- onChange: (e) => {
11116
- setPlotlineDraft({
11117
- ...plotlineDraft,
11118
- status: e.target.value
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11123
- value: "active",
11124
- children: tt("plotlines.statusActive")
11125
- }),
11126
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11127
- value: "paused",
11128
- children: tt("plotlines.statusPaused")
11129
- }),
11130
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11131
- value: "resolved",
11132
- children: tt("plotlines.statusResolved")
11133
- }),
11134
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
11135
- value: "abandoned",
11136
- children: tt("plotlines.statusAbandoned")
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11144
- className: panel_module_css_default.field,
11145
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
11146
- className: panel_module_css_default.fieldLabel,
11147
- children: tt("plotlines.goal")
11148
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
11149
- className: panel_module_css_default.textarea,
11150
- style: { minHeight: 48 },
11151
- value: plotlineDraft.goal,
11152
- onChange: (e) => {
11153
- setPlotlineDraft({
11154
- ...plotlineDraft,
11155
- goal: e.target.value
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
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11181
- type: "button",
11182
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
11183
- disabled: busy,
11184
- onClick: () => {
11185
- handlePlotlineSave();
11186
- },
11187
- children: tt("plotlines.save")
11188
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11189
- type: "button",
11190
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
11191
- onClick: () => {
11192
- setPlotlineDraft(null);
11193
- },
11194
- children: tt("plotlines.cancel")
11195
- })]
11196
- })
11197
- ]
11198
- }),
11199
- (project?.plotlines ?? []).length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11200
- className: panel_module_css_default.meta,
11201
- children: tt("plotlines.empty")
11202
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11203
- style: {
11204
- display: "flex",
11205
- flexDirection: "column",
11206
- gap: 8,
11207
- overflowY: "auto",
11208
- flex: 1,
11209
- minHeight: 0
11210
- },
11211
- children: (project?.plotlines ?? []).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlotlineCard, {
11212
- line,
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
- onRefresh: () => {
11215
- handlePlotlineRefresh(line.id);
11602
+ onPlan: () => {
11603
+ handlePlotlinePlan();
11216
11604
  },
11217
- onEdit: () => {
11218
- setPlotlineDraft({
11219
- id: line.id,
11220
- name: line.name,
11221
- kind: line.kind,
11222
- goal: line.goal,
11223
- progress: line.progress,
11224
- status: line.status
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
- onRemove: () => {
11228
- handlePlotlineRemove(line.id);
11615
+ onClose: () => {
11616
+ setPlotlinePlan(null);
11229
11617
  }
11230
- }, line.id))
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: 130 },
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: 100 },
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.jsxs)("div", {
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: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
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
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11398
- className: panel_module_css_default.row,
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
- flexWrap: "wrap",
11401
- gap: 6
12007
+ fontSize: 14,
12008
+ flex: 1
11402
12009
  },
11403
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11404
- type: "button",
11405
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${storyboardView === "single" ? panel_module_css_default.buttonPrimary : ""}`,
11406
- onClick: () => {
11407
- setStoryboardView("single");
11408
- },
11409
- children: "🎞️ 单集分镜"
11410
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11411
- type: "button",
11412
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${storyboardView === "plan" ? panel_module_css_default.buttonPrimary : ""}`,
11413
- onClick: () => {
11414
- setStoryboardView("plan");
11415
- },
11416
- children: "📺 按卷规划"
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: {