@waterwx/dsh-novel-forge 1.7.3 → 1.8.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
@@ -109,7 +109,25 @@ window.__ModuleLoader__.load({
109
109
  /** 生产单状态(含进度统计与日志)。 */
110
110
  runStatus: "/api/dsh-novel-forge/run/status",
111
111
  config: "/api/dsh-novel-forge/config",
112
- openFolder: "/api/dsh-novel-forge/open-folder"
112
+ openFolder: "/api/dsh-novel-forge/open-folder",
113
+ /** 作者资产库/总数据:读取个人跨书资产(笔法/红线/套路/角色模板/世界观模板)。 */
114
+ authorAssets: "/api/dsh-novel-forge/author-assets",
115
+ /** 作者资产库:新增/更新一条资产(upsert by id)。 */
116
+ authorAssetsUpsert: "/api/dsh-novel-forge/author-assets/upsert",
117
+ /** 作者资产库:删除一条资产。 */
118
+ authorAssetsRemove: "/api/dsh-novel-forge/author-assets/remove",
119
+ /** 作者资产库:导入默认(书架书的写作资产/角色 + 内置全局库)批量沉淀。 */
120
+ authorAssetsImportDefault: "/api/dsh-novel-forge/author-assets/import-default",
121
+ /** 改编模式:上传全文 → 分析 → 原文设定卡片/可改范围矩阵。 */
122
+ adaptAnalyze: "/api/dsh-novel-forge/adapt/analyze",
123
+ /** 改编模式:确认要改的维度 → 生成映射表/改编规则/联动影响清单。 */
124
+ adaptPropose: "/api/dsh-novel-forge/adapt/propose",
125
+ /** 改编模式:执行术语替换(全局替换 + 命中统计 + 改编文本预览)。 */
126
+ adaptExecute: "/api/dsh-novel-forge/adapt/execute",
127
+ /** 主题自定义背景:上传图片(POST,存盘并返回服务端 URL)。 */
128
+ themeBackgroundUpload: "/api/dsh-novel-forge/theme/background",
129
+ /** 主题自定义背景:读取已上传文件(GET prefix,/theme/background/<name>)。 */
130
+ themeBackgroundGet: "/api/dsh-novel-forge/theme/background"
113
131
  };
114
132
  //#endregion
115
133
  //#region src/client/api.ts
@@ -542,6 +560,41 @@ window.__ModuleLoader__.load({
542
560
  async assistantClear() {
543
561
  return postJson(NOVEL_API.assistantClear, {});
544
562
  }
563
+ /** 作者资产库/总数据:读取跨书可复用资产。 */
564
+ async authorAssets() {
565
+ return readJson(await fetch(NOVEL_API.authorAssets));
566
+ }
567
+ /** 作者资产库:新增/更新一条资产(upsert by id)。 */
568
+ async authorAssetsUpsert(asset) {
569
+ return postJson(NOVEL_API.authorAssetsUpsert, { asset });
570
+ }
571
+ /** 作者资产库:删除一条资产。 */
572
+ async authorAssetsRemove(id) {
573
+ return postJson(NOVEL_API.authorAssetsRemove, { id });
574
+ }
575
+ /** 作者资产库:导入默认(书架书的写作资产/角色 + 内置全局库)批量沉淀。 */
576
+ async authorAssetsImportDefault() {
577
+ return postJson(NOVEL_API.authorAssetsImportDefault, {});
578
+ }
579
+ /** 改编模式 P0:上传全文 → 原文设定卡片 / 可改范围矩阵。 */
580
+ async adaptAnalyze(text, filePath) {
581
+ return postJson(NOVEL_API.adaptAnalyze, {
582
+ text,
583
+ filePath
584
+ });
585
+ }
586
+ /** 改编模式 P1:确认要改的维度 → 生成映射表/改编规则/联动影响清单。 */
587
+ async adaptPropose(req) {
588
+ return postJson(NOVEL_API.adaptPropose, req);
589
+ }
590
+ /** 改编模式 P2:执行术语替换(全局替换 + 命中统计 + 改编文本预览)。 */
591
+ async adaptExecute(req) {
592
+ return postJson(NOVEL_API.adaptExecute, req);
593
+ }
594
+ /** 主题自定义背景:上传图片,服务端存盘并返回可访问 URL。 */
595
+ async themeBackgroundUpload(dataUrl) {
596
+ return postJson(NOVEL_API.themeBackgroundUpload, { dataUrl });
597
+ }
545
598
  };
546
599
  //#endregion
547
600
  //#region src/client/locales.ts
@@ -5202,7 +5255,7 @@ window.__ModuleLoader__.load({
5202
5255
  key: "d0xqtd"
5203
5256
  }]
5204
5257
  ]);
5205
- createLucideIcon("boxes", [
5258
+ const Boxes = createLucideIcon("boxes", [
5206
5259
  ["path", {
5207
5260
  d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",
5208
5261
  key: "lc1i9w"
@@ -5739,7 +5792,7 @@ window.__ModuleLoader__.load({
5739
5792
  key: "s3unb"
5740
5793
  }]
5741
5794
  ]);
5742
- createLucideIcon("brush", [
5795
+ const Brush = createLucideIcon("brush", [
5743
5796
  ["path", {
5744
5797
  d: "m11 10 3 3",
5745
5798
  key: "fzmg1i"
@@ -17618,7 +17671,7 @@ window.__ModuleLoader__.load({
17618
17671
  key: "af1f0g"
17619
17672
  }]
17620
17673
  ]);
17621
- createLucideIcon("image", [
17674
+ const Image = createLucideIcon("image", [
17622
17675
  ["rect", {
17623
17676
  width: "18",
17624
17677
  height: "18",
@@ -17749,7 +17802,7 @@ window.__ModuleLoader__.load({
17749
17802
  d: "M6 16c5 0 7-8 12-8a4 4 0 0 1 0 8c-5 0-7-8-12-8a4 4 0 1 0 0 8",
17750
17803
  key: "18ogeb"
17751
17804
  }]]);
17752
- createLucideIcon("info", [
17805
+ const Info = createLucideIcon("info", [
17753
17806
  ["circle", {
17754
17807
  cx: "12",
17755
17808
  cy: "12",
@@ -18908,7 +18961,7 @@ window.__ModuleLoader__.load({
18908
18961
  key: "1szwhi"
18909
18962
  }]
18910
18963
  ]);
18911
- createLucideIcon("list-checks", [
18964
+ const ListChecks = createLucideIcon("list-checks", [
18912
18965
  ["path", {
18913
18966
  d: "M13 5h8",
18914
18967
  key: "a7qcls"
@@ -23663,7 +23716,7 @@ window.__ModuleLoader__.load({
23663
23716
  key: "165o2o"
23664
23717
  }]
23665
23718
  ]);
23666
- createLucideIcon("pencil", [["path", {
23719
+ const Pencil = createLucideIcon("pencil", [["path", {
23667
23720
  d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
23668
23721
  key: "1a8usu"
23669
23722
  }], ["path", {
@@ -24114,7 +24167,7 @@ window.__ModuleLoader__.load({
24114
24167
  key: "1ooewy"
24115
24168
  }]
24116
24169
  ]);
24117
- createLucideIcon("play", [["path", {
24170
+ const Play = createLucideIcon("play", [["path", {
24118
24171
  d: "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",
24119
24172
  key: "10ikf1"
24120
24173
  }]]);
@@ -25137,7 +25190,7 @@ window.__ModuleLoader__.load({
25137
25190
  key: "1r8tn9"
25138
25191
  }]
25139
25192
  ]);
25140
- createLucideIcon("refresh-cw", [
25193
+ const RefreshCw = createLucideIcon("refresh-cw", [
25141
25194
  ["path", {
25142
25195
  d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",
25143
25196
  key: "v9h5vc"
@@ -32359,7 +32412,7 @@ window.__ModuleLoader__.load({
32359
32412
  d: "M12 19v3",
32360
32413
  key: "npa21l"
32361
32414
  }]]);
32362
- createLucideIcon("trash-2", [
32415
+ const Trash2 = createLucideIcon("trash-2", [
32363
32416
  ["path", {
32364
32417
  d: "M10 11v6",
32365
32418
  key: "nco0om"
@@ -32975,7 +33028,7 @@ window.__ModuleLoader__.load({
32975
33028
  key: "1snsnr"
32976
33029
  }]
32977
33030
  ]);
32978
- createLucideIcon("upload", [
33031
+ const Upload = createLucideIcon("upload", [
32979
33032
  ["path", {
32980
33033
  d: "M12 3v12",
32981
33034
  key: "1x0j5s"
@@ -34149,7 +34202,7 @@ window.__ModuleLoader__.load({
34149
34202
  key: "x3v2xh"
34150
34203
  }]
34151
34204
  ]);
34152
- createLucideIcon("wand-sparkles", [
34205
+ const WandSparkles = createLucideIcon("wand-sparkles", [
34153
34206
  ["path", {
34154
34207
  d: "m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72",
34155
34208
  key: "ul74o6"
@@ -34953,7 +35006,7 @@ window.__ModuleLoader__.load({
34953
35006
  key: "qb1veh"
34954
35007
  }]
34955
35008
  ]);
34956
- createLucideIcon("x", [["path", {
35009
+ const X = createLucideIcon("x", [["path", {
34957
35010
  d: "M18 6 6 18",
34958
35011
  key: "1bl5f8"
34959
35012
  }], ["path", {
@@ -35202,26 +35255,38 @@ window.__ModuleLoader__.load({
35202
35255
  exports.BarChart3 = ChartColumn;
35203
35256
  exports.BookMarked = BookMarked;
35204
35257
  exports.BookOpen = BookOpen;
35258
+ exports.Boxes = Boxes;
35205
35259
  exports.Brain = Brain;
35260
+ exports.Brush = Brush;
35206
35261
  exports.Clapperboard = Clapperboard;
35207
35262
  exports.Download = Download;
35208
35263
  exports.Factory = Factory;
35209
35264
  exports.FileText = FileText;
35210
35265
  exports.Folder = Folder;
35266
+ exports.Image = Image;
35267
+ exports.Info = Info;
35211
35268
  exports.Library = Library;
35269
+ exports.ListChecks = ListChecks;
35212
35270
  exports.MessageSquare = MessageSquare;
35213
35271
  exports.Palette = Palette;
35214
35272
  exports.PenLine = PenLine;
35273
+ exports.Pencil = Pencil;
35274
+ exports.Play = Play;
35215
35275
  exports.PlugZap = PlugZap;
35216
35276
  exports.Plus = Plus;
35277
+ exports.RefreshCw = RefreshCw;
35217
35278
  exports.RotateCcw = RotateCcw;
35218
35279
  exports.ScrollText = ScrollText;
35219
35280
  exports.Search = Search;
35220
35281
  exports.Settings = Settings;
35221
35282
  exports.Sparkles = Sparkles;
35283
+ exports.Trash2 = Trash2;
35284
+ exports.Upload = Upload;
35285
+ exports.Wand2 = WandSparkles;
35222
35286
  exports.Wrench = Wrench;
35287
+ exports.X = X;
35223
35288
  })))();
35224
- const css = ".zE6uZW_entry{align-items:center;gap:var(--nf-space-8,8px);width:100%;padding:var(--nf-space-8,8px) var(--nf-space-12,12px);color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;border-radius:var(--nf-radius-6,6px);background:0 0;border:none;font-size:14px;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, #fff6 0%, #ffffff4d 26%, #ffffff3d 52%, #fff3 78%, #ffffff2e 100%);--nf-glass-core:radial-gradient(60% 40% at 30% 0%, #fff9 0%, #fff3 42%, #fff0 78%);--nf-glass-sheen:#ffffff8c;--nf-glass-border:#ffffff80;--nf-glass-inset:#fff6;--nf-glass-orb-a:#00b85c3d;--nf-glass-orb-b:#78a0ff33;--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\");--nf-card-radius:20px;--nf-card-blur:26px;--nf-card-saturate:170%;--nf-card-brightness:1.04;--nf-card-sheen:#ffffff80;--nf-card-border:1px solid #ffffff59;--nf-ctrl-radius:14px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffffb3;--nf-ctrl-sheen:#ffffff80;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='110'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='300' cy='180' r='420' fill='%2335d07a' fill-opacity='0.62'/%3E%3Ccircle cx='1240' cy='260' r='470' fill='%233aa7ff' fill-opacity='0.58'/%3E%3Ccircle cx='900' cy='860' r='470' fill='%2340cfc0' fill-opacity='0.5'/%3E%3Ccircle cx='1500' cy='820' r='330' fill='%23ff9fb0' fill-opacity='0.4'/%3E%3Ccircle cx='600' cy='620' r='260' fill='%23b06ef0' fill-opacity='0.42'/%3E%3Ccircle cx='180' cy='600' r='220' fill='%23ffd166' fill-opacity='0.36'/%3E%3C/g%3E%3C/svg%3E\");background:var(--nf-bg);backdrop-filter:blur(30px)saturate(170%)brightness(1.04);color:var(--nf-text);--nf-fs-10:10px;--nf-fs-12:12px;--nf-fs-14:14px;--nf-fs-16:16px;--nf-fs-18:18px;--nf-fs-20:20px;--nf-fs-22:22px;--nf-fs-24:24px;--nf-fs-34:34px;--nf-fs-42:42px;--nf-icon-s:14px;--nf-icon-m:16px;--nf-icon-l:18px;--nf-icon-xl:22px;--nf-space-2:2px;--nf-space-4:4px;--nf-space-6:6px;--nf-space-8:8px;--nf-space-10:10px;--nf-space-12:12px;--nf-space-14:14px;--nf-space-16:16px;--nf-space-18:18px;--nf-space-20:20px;--nf-space-24:24px;--nf-space-28:28px;--nf-space-32:32px;--nf-radius-2:2px;--nf-radius-4:4px;--nf-radius-6:6px;--nf-radius-8:8px;--nf-radius-10:10px;--nf-radius-12:12px;--nf-radius-14:14px;--nf-radius-16:16px;--nf-radius-20:20px;--nf-radius-22:22px;--nf-radius-999:999px;--nf-ctrl-s:28px;--nf-ctrl-m:32px;--nf-ctrl-l:38px;--nf-container-pad:20px 22px;--nf-container-gap:var(--nf-space-14,14px);--nf-card-pad:20px 22px;--nf-nav-pad:16px 12px 14px;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}.zE6uZW_panel[data-nf-mode=dark],body[data-ds-dark-theme] .zE6uZW_panel:not([data-nf-mode]),.zE6uZW_view:has(>.zE6uZW_panel[data-nf-mode=dark]),body[data-ds-dark-theme] .zE6uZW_view:not(:has(>.zE6uZW_panel[data-nf-mode=light])){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, #3e424a85 0%, #363a4275 26%, #30343c66 52%, #2a2e365c 78%, #262a3257 100%);--nf-glass-core:radial-gradient(60% 40% at 30% 0%, #ffffff38 0%, #ffffff14 42%, #fff0 78%);--nf-glass-sheen:#ffffff3d;--nf-glass-border:#ffffff24;--nf-glass-inset:#ffffff14;--nf-glass-orb-a:#00ca525c;--nf-glass-orb-b:#78a0ff47;--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\");--nf-card-radius:20px;--nf-card-blur:28px;--nf-card-saturate:165%;--nf-card-brightness:1;--nf-card-border:1px solid #ffffff24;--nf-card-sheen:#ffffff38;--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='110'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='300' cy='180' r='420' fill='%231a9f4d' fill-opacity='0.44'/%3E%3Ccircle cx='1240' cy='260' r='470' fill='%23268bd6' fill-opacity='0.40'/%3E%3Ccircle cx='900' cy='860' r='470' fill='%232a9e94' fill-opacity='0.36'/%3E%3Ccircle cx='1500' cy='820' r='330' fill='%23e07a94' fill-opacity='0.30'/%3E%3Ccircle cx='600' cy='620' r='260' fill='%238c5bd6' fill-opacity='0.32'/%3E%3C/g%3E%3C/svg%3E\");--nf-ctrl-radius:14px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffff2e;--nf-ctrl-sheen:#fff3;--nf-ctrl-caret:var(--nf-accent)}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .zE6uZW_view{display:block}.zE6uZW_panel[data-nf-theme=macos],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-mode=light][data-nf-theme=macos]{--nf-bg:#f5f6f8eb;--nf-bg-raise:#ffffffc7;--nf-bg-inset:#7676801a;--nf-border:#3c3c4324;--nf-border-strong:#3c3c434d;--nf-text:#1d1d1f;--nf-text-2:#3a3a3c;--nf-text-2-alpha:#3a3a3cb3;--nf-text-3:#86868b;--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-hover:#0000000a;--nf-info:#5856d6;--nf-shadow:0 1px 3px #0000000d, 0 10px 28px #00000012;--nf-shadow-lg:0 4px 12px #0000000f, 0 18px 44px #0000001c;--nf-card-shadow:0 2px 6px #0000000d, 0 12px 34px #00000017;--nf-card-shadow-hover:0 4px 10px #00000012, 0 20px 48px #00000024;--nf-glass-face:#ffffffb3;--nf-glass-core:transparent;--nf-glass-sheen:#fffc;--nf-glass-border:#ffffffe6;--nf-glass-inset:#fff9;--nf-glass-orb-a:#007aff14;--nf-glass-orb-b:#5856d612;--nf-glass-noise:none;--nf-card-radius:12px;--nf-card-blur:42px;--nf-card-saturate:150%;--nf-card-border:1px solid var(--nf-border);--nf-card-sheen:#ffffff59;--nf-ctrl-radius:8px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid var(--nf-border-strong);--nf-ctrl-sheen:#ffffff59;--nf-ctrl-caret:var(--nf-accent)}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=macos],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=macos]:not([data-nf-mode]){--nf-bg:#1c1c1ee6;--nf-bg-raise:#2c2c2ed1;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff42;--nf-text:#f5f5f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b3;--nf-text-3:#98989d;--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-hover:#ffffff0f;--nf-info:#bf5af2;--nf-shadow:0 1px 2px #0006, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 18px 44px #0009;--nf-card-shadow:0 2px 6px #0006, 0 14px 38px #00000080;--nf-card-shadow-hover:0 4px 10px #00000073, 0 22px 52px #0009;--nf-glass-face:#2c2c2ed9;--nf-glass-core:transparent;--nf-glass-sheen:#fff3;--nf-glass-border:#ffffff2e;--nf-glass-inset:#ffffff0f;--nf-glass-orb-a:#0a84ff29;--nf-glass-orb-b:#bf5af214;--nf-glass-noise:none}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_button{border:1px solid var(--nf-border-strong);background:color-mix(in srgb, var(--nf-bg-raise) 82%, #fff);box-shadow:0 1px 1px #0000000a,inset 0 1px #fff9}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 90%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 1px 3px color-mix(in srgb, var(--nf-accent) 45%, transparent), inset 0 1px 0 #ffffff59;border-color:#0000}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_input,.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-raise)}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_input:focus,.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_panel[data-nf-theme=neumorph]{--nf-card-radius:20px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-border:none;--nf-card-sheen:#fff0;--nf-ctrl-radius:10px;--nf-ctrl-bg:var(--nf-bg-inset);--nf-ctrl-border:none;--nf-ctrl-sheen:#fff0;--nf-ctrl-caret:var(--nf-text-3);--nf-glass-bg-image: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}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=neumorph],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph]:not([data-nf-mode]){--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}.zE6uZW_panel[data-nf-theme=clay]{--nf-card-radius:28px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-border:1px solid #fff9;--nf-card-sheen:#ffffffd9;--nf-ctrl-radius:16px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffff8c;--nf-ctrl-sheen:#ffffffb3;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay],.zE6uZW_panel[data-nf-mode=light][data-nf-theme=clay]{--nf-bg:#f2eae0;--nf-bg-raise:#efe4d6;--nf-bg-inset:#e6d8c6;--nf-border:#78604829;--nf-border-strong:#78604847;--nf-text:#3a3330;--nf-text-2:#5a4f48;--nf-text-2-alpha:#5a4f48b3;--nf-text-3:#9a8c80;--nf-accent:#e08a5c;--nf-accent-hover:#d67a4a;--nf-accent-soft:#e08a5c29;--nf-accent-fg:#fff;--nf-hover:#78604814;--nf-success:#7fae6a;--nf-error:#c96b63;--nf-warn:#d9a660;--nf-info:#e08a5c;--nf-shadow:0 8px 16px -6px #5a463247, inset 0 6px 10px #ffffff8c, inset 0 -6px 10px #7860481f;--nf-shadow-lg:0 16px 28px -10px #5a463257, inset 0 6px 10px #ffffff8c, inset 0 -6px 10px #78604824;--nf-card-shadow:0 16px 28px -10px #5a463257, inset 0 -8px 12px #78604824, inset 0 8px 12px #fff9;--nf-card-shadow-hover:0 22px 36px -12px #5a463261, inset 0 -8px 12px #78604829, inset 0 8px 12px #ffffffb3;--nf-glass-face:#efe4d6;--nf-glass-core:transparent;--nf-glass-sheen:#ffffffd9;--nf-glass-border:#fff9;--nf-glass-inset:#e6d8c6;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]){--nf-bg:#2a2522;--nf-bg-raise:#37302b;--nf-bg-inset:#2f2925;--nf-border:#ffffff14;--nf-border-strong:#ffffff2e;--nf-text:#efe9e3;--nf-text-2:#c7beb5;--nf-text-2-alpha:#c7beb5b3;--nf-text-3:#8a8078;--nf-accent:#e69a6c;--nf-accent-hover:#f0ac82;--nf-accent-soft:#e69a6c33;--nf-accent-fg:#241b16;--nf-hover:#ffffff0f;--nf-success:#9cba82;--nf-error:#d98f86;--nf-warn:#d9a660;--nf-info:#e69a6c;--nf-shadow:0 8px 16px -6px #0000008c, inset 0 6px 10px #ffffff1f, inset 0 -6px 10px #00000059;--nf-shadow-lg:0 16px 28px -10px #0000009e, inset 0 6px 10px #ffffff1f, inset 0 -6px 10px #0006;--nf-card-shadow:0 16px 28px -10px #0000009e, inset 0 -8px 12px #0006, inset 0 8px 12px #ffffff24;--nf-card-shadow-hover:0 22px 36px -12px #000000ad, inset 0 -8px 12px #00000070, inset 0 8px 12px #ffffff2e;--nf-glass-face:#37302b;--nf-glass-core:transparent;--nf-glass-sheen:#ffffff29;--nf-glass-border:#ffffff29;--nf-glass-inset:#2f2925;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}.zE6uZW_panel[data-nf-theme=clay] .zE6uZW_input,.zE6uZW_panel[data-nf-theme=clay] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:var(--nf-border-strong);box-shadow:inset 3px 3px 7px #78604824,inset -3px -3px 7px #ffffff80}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_button{background:linear-gradient(#f6ecdf,#eee0cf);border-color:#fff9;box-shadow:0 8px 16px -6px #5a463259,inset 0 3px 4px #fffc,inset 0 -3px 5px #78604833}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_button:hover:not([disabled]){box-shadow:0 12px 22px -8px #5a46326b,inset 0 3px 4px #ffffffd9,inset 0 -3px 5px #78604838}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_buttonPrimary{color:var(--nf-accent-fg);background:linear-gradient(#eda178,#e08a5c);border-color:#0000;box-shadow:0 8px 16px -6px #e08a5c8c,inset 0 3px 4px #ffffff80,inset 0 -3px 5px #9646284d}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_button,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_button{background:linear-gradient(#403731,#332c27);border-color:#ffffff29;box-shadow:0 8px 16px -6px #0000008c,inset 0 3px 4px #ffffff24,inset 0 -3px 5px #0006}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_button:hover:not([disabled]),body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_button:hover:not([disabled]){box-shadow:0 12px 22px -8px #0009,inset 0 3px 4px #ffffff29,inset 0 -3px 5px #00000070}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_buttonPrimary,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_buttonPrimary{color:var(--nf-accent-fg);background:linear-gradient(#f0ac82,#d67a4a);border-color:#0000;box-shadow:0 8px 16px -6px #e69a6c80,inset 0 3px 4px #fff6,inset 0 -3px 5px #7832144d}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_input,.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_textarea,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_textarea{box-shadow:inset 3px 3px 7px #00000073,inset -3px -3px 7px #ffffff14}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{min-width:0;height:100%;font-size:var(--nf-fs-14,14px);flex-direction:column;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_panel:before{content:\"\";z-index:0;pointer-events:none;background:var(--nf-glass-bg-image,none) center / cover no-repeat, 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_panel[data-nf-theme=macos]{--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='140'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='320' cy='220' r='320' fill='%230a84ff' fill-opacity='0.34'/%3E%3Ccircle cx='1180' cy='320' r='360' fill='%237f5af0' fill-opacity='0.30'/%3E%3Ccircle cx='920' cy='820' r='380' fill='%2340cfc0' fill-opacity='0.26'/%3E%3Ccircle cx='1460' cy='820' r='260' fill='%23ff9fb0' fill-opacity='0.18'/%3E%3C/g%3E%3C/svg%3E\")}.zE6uZW_panelTitle{font-size:var(--nf-fs-16,16px);letter-spacing:.2px;align-items:center;gap:var(--nf-space-8,8px);margin:0;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";border-radius:var(--nf-radius-2,2px);background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));width:4px;height:16px}.zE6uZW_iconButton{cursor:pointer;font-size:var(--nf-fs-16,16px);color:var(--nf-text-2);padding:var(--nf-space-4,4px) var(--nf-space-10,9px);border-radius:var(--nf-radius-10,9px);background:0 0;border:none;transition:background .15s,color .15s,transform .1s}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text);transform:translateY(-1px)}.zE6uZW_tabBar{gap:var(--nf-space-2,2px);padding:var(--nf-space-8,8px) var(--nf-space-14,14px) 0;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;display:flex;position:sticky;top:45px}.zE6uZW_tab{padding:var(--nf-space-8,7px) var(--nf-space-14,13px);cursor:pointer;border-radius:var(--nf-radius-8,8px) var(--nf-radius-8,8px) 0 0;font-size:var(--nf-fs-14,13.5px);color:var(--nf-text-2);background:0 0;border:none;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:\"\";border-radius:var(--nf-radius-2,2px) var(--nf-radius-2,2px) 0 0;background:var(--nf-accent);height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.zE6uZW_panelContent{padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);z-index:1;flex-direction:column;flex:1;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{align-self:stretch;gap:var(--nf-space-6,6px);width:216px;padding:var(--nf-nav-pad,16px 12px 14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-16,18px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);flex-direction:column;flex:none;margin:10px 0 10px 12px;transition:width .18s;display:flex;overflow-y:auto}.zE6uZW_panelNavCollapsed{width:52px;padding:var(--nf-space-10,10px) var(--nf-space-6,6px)}.zE6uZW_navGroup{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_navGroupLabel{font-size:var(--nf-fs-12,12px);letter-spacing:.8px;text-transform:uppercase;color:var(--nf-text-3);padding:var(--nf-space-12,12px) var(--nf-space-10,10px) var(--nf-space-6,6px);user-select:none;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{gap:var(--nf-space-4,4px);padding:var(--nf-space-8,8px) var(--nf-space-6,6px) var(--nf-space-4,4px);border-top:1px solid var(--nf-border);flex-direction:column;flex:none;margin-top:4px;display:flex}.zE6uZW_navAboutRow{justify-content:space-between;align-items:center;gap:var(--nf-space-4,4px);cursor:pointer;font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);padding:var(--nf-space-4,4px) var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);text-align:left;white-space:nowrap;background:0 0;border:none;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;font-size:var(--nf-fs-12,10.5px);padding:var(--nf-space-4,4px) var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);text-align:left;white-space:nowrap;border:none;font-weight:600}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{padding:var(--nf-space-6,6px) var(--nf-space-2,2px) var(--nf-space-2,2px);align-items:center}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{padding:var(--nf-space-4,4px) 0;justify-content:center;width:100%}.zE6uZW_navTabBadge{min-width:18px;height:18px;padding:0 var(--nf-space-6,5px);border-radius:var(--nf-radius-999,999px);background:var(--nf-accent);color:#fff;font-size:var(--nf-fs-12,10.5px);text-align:center;flex:none;margin-left:auto;font-weight:700;line-height:18px;display:inline-block}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:18px;height:18px;line-height:18px;font-size:var(--nf-fs-12,9px);padding:0 var(--nf-space-6,5px);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{align-items:center;gap:var(--nf-space-10,10px);cursor:pointer;border-radius:var(--nf-radius-10,10px);width:100%;padding:var(--nf-space-12,11px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,14px);color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border:1px solid #0000;font-weight:500;transition:color .15s,background .15s,border-color .15s,box-shadow .15s;display:flex;position:relative}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{padding:var(--nf-space-8,8px) 0;justify-content:center}.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;width:22px;font-size:var(--nf-fs-16,17px);flex:none;line-height:1}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitle{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-2,2px) var(--nf-space-6,6px) var(--nf-space-12,12px);border-bottom:1px solid var(--nf-border);flex:none;min-width:0;margin-bottom:6px;display:flex}.zE6uZW_navTitleLogo{border-radius:var(--nf-radius-10,10px);background:linear-gradient(145deg, var(--nf-accent), var(--nf-accent-hover));width:34px;height:34px;color:var(--nf-accent-fg);font-weight:800;font-size:var(--nf-fs-14,15px);box-shadow:0 6px 16px var(--nf-accent-soft);flex:none;justify-content:center;align-items:center;display:flex}.zE6uZW_navTitleName{font-weight:700;font-size:var(--nf-fs-14,15px);letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitleBook{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_panelNavCollapsed .zE6uZW_navTitle{padding:var(--nf-space-2,2px) 0 var(--nf-space-10,10px);justify-content:center}.zE6uZW_panelNavCollapsed .zE6uZW_navTitleLogo{width:32px;height:var(--nf-ctrl-m,32px)}.zE6uZW_navActions{gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);border-top:1px solid var(--nf-border);flex:none;margin-top:8px;display:flex}.zE6uZW_navActionBtn{border:1px solid var(--nf-border);color:var(--nf-text-2);cursor:pointer;border-radius:var(--nf-radius-10,10px);height:var(--nf-ctrl-m,32px);font-size:var(--nf-fs-14,14px);background:0 0;flex:1;justify-content:center;align-items:center;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{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-10,9px);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;text-align:left;font:inherit;color:var(--nf-text);flex:none;min-width:0;margin-top:4px;transition:background .15s,border-color .15s;display:flex}.zE6uZW_bookSwitch:hover{background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_bookSwitchCover{border-radius:var(--nf-radius-6,5px);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);font-size:var(--nf-fs-12,11px);flex:none;justify-content:center;align-items:center;font-weight:700;display:flex}.zE6uZW_bookSwitchName{font-size:var(--nf-fs-12,12.5px);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookSwitchMeta{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_bookSwitchArrow{color:var(--nf-text-3);font-size:var(--nf-fs-12,12px);flex:none;margin-left:auto}.zE6uZW_statRowD{gap:var(--nf-space-12,12px);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));display:grid}.zE6uZW_statCardD{justify-content:space-between;align-items:flex-start;gap:var(--nf-space-10,10px);padding:var(--nf-space-14,14px) var(--nf-space-16,16px);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:0;display:flex}.zE6uZW_statCardDLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.zE6uZW_statCardDValue{font-size:var(--nf-fs-22,22px);color:var(--nf-text);margin-top:2px;font-weight:700}.zE6uZW_statCardDUnit{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);font-weight:400}.zE6uZW_statCardDDetail{font-size:var(--nf-fs-12,11.5px);color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;overflow:hidden}.zE6uZW_statCardDDown{color:var(--nf-error)}.zE6uZW_statCardDIcon{width:38px;height:var(--nf-ctrl-l,38px);border-radius:var(--nf-radius-12,12px);font-size:var(--nf-fs-18,18px);background:var(--nf-accent-soft);flex:none;justify-content:center;align-items:center;display:flex}.zE6uZW_statCardDIconRed{background:color-mix(in srgb, var(--nf-error) 13%, transparent)}.zE6uZW_tlBar{gap:var(--nf-space-6,6px);margin-top:8px;display:flex}.zE6uZW_tlSeg{gap:var(--nf-space-4,4px);cursor:pointer;min-width:0;font:inherit;background:0 0;border:none;flex-direction:column;flex:1;padding:0;display:flex}.zE6uZW_tlSegTrack{border-radius:var(--nf-radius-999,999px);background:var(--nf-hover);border:1px solid var(--nf-border);height:8px;overflow:hidden}.zE6uZW_tlSegFill{border-radius:var(--nf-radius-999,999px);background:var(--nf-accent);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{font-size:var(--nf-fs-12,10.5px);color:var(--nf-text-3);text-align:center;white-space:nowrap;text-overflow:ellipsis;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:var(--nf-card-border,1px solid var(--nf-glass-border));border-radius:var(--nf-card-radius,22px);padding:var(--nf-card-pad,20px 22px);gap:var(--nf-space-10,10px);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-card-sheen,var(--nf-glass-sheen)), inset 0 -1px 0 #ffffff1a;backdrop-filter:blur(var(--nf-card-blur,30px)) saturate(var(--nf-card-saturate,180%)) brightness(var(--nf-card-brightness,1.06));flex-direction:column;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-card-sheen,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-card-sheen,var(--nf-glass-sheen)), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);align-items:center;gap:var(--nf-space-8,8px);margin:0;font-weight:650;display:flex}.zE6uZW_button{border:1px solid var(--nf-ctrl-border,var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);padding:var(--nf-space-8,7px) var(--nf-space-16,15px);border-radius:var(--nf-ctrl-radius,10px);cursor:pointer;font-size:var(--nf-fs-14,13px);box-shadow:inset 0 1px 0 var(--nf-ctrl-sheen,#ffffff17);white-space:nowrap;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);transform:translateY(-1px)}.zE6uZW_button:active:not([disabled]){transform:translateY(0)scale(.97)}.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);border-radius:var(--nf-radius-10,10px);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), inset 0 1px 0 #ffffff73;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));box-shadow:0 12px 30px color-mix(in srgb, var(--nf-accent) 50%, transparent), 0 0 0 .5px color-mix(in srgb, var(--nf-accent) 30%, transparent), inset 0 1px 0 #ffffff73;border-color:#0000;transform:translateY(-1px)}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{padding:var(--nf-space-4,4px) var(--nf-space-10,10px);font-size:var(--nf-fs-12,12px);border-radius:var(--nf-ctrl-radius,8px)}.zE6uZW_field{gap:var(--nf-space-6,5px);flex-direction:column;display:flex}.zE6uZW_fieldLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);font-weight:500}.zE6uZW_input{border:var(--nf-ctrl-border,1px solid var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);color-scheme:light;border-radius:var(--nf-ctrl-radius,12px);padding:var(--nf-space-8,7px) var(--nf-space-12,11px);font-size:var(--nf-fs-14,13px);box-sizing:border-box;width:100%;box-shadow:inset 0 1px 0 var(--nf-ctrl-sheen,#ffffff17);transition:border-color .15s,box-shadow .15s}body[data-ds-dark-theme] .zE6uZW_input,.zE6uZW_panel[data-nf-mode=dark] .zE6uZW_input{color-scheme:dark}.zE6uZW_panel[data-nf-mode=light] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input{color-scheme:light}select.zE6uZW_input{cursor:pointer;-webkit-appearance:none;appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--nf-ctrl-caret,var(--nf-text-3)) 50%), linear-gradient(135deg, var(--nf-ctrl-caret,var(--nf-text-3)) 50%, transparent 50%);background-position:calc(100% - 18px),calc(100% - 12px);background-repeat:no-repeat;background-size:6px 6px,6px 6px;padding-right:30px}.zE6uZW_input option{color:var(--nf-text);background:var(--nf-bg-raise);font-size:var(--nf-fs-14,15px)}.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:var(--nf-ctrl-border,1px solid var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);border-radius:var(--nf-ctrl-radius,12px);padding:var(--nf-space-10,9px) var(--nf-space-12,11px);font-size:var(--nf-fs-14,13px);box-sizing:border-box;resize:vertical;width:100%;min-height:200px;font-family:inherit;line-height:1.7;transition:border-color .15s,box-shadow .15s}.zE6uZW_row{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{gap:var(--nf-space-8,8px);flex-direction:column;display:flex}.zE6uZW_volumeGroup{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_volumeGroupHeader{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;font-size:var(--nf-fs-14,13px);transition:border-color .15s;display:flex}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);flex:none}.zE6uZW_chapter{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-10,9px) var(--nf-space-12,12px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg);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{min-width:28px;height:var(--nf-ctrl-s,28px);padding:0 var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);flex-shrink:0;justify-content:center;align-items:center;font-weight:700;display:inline-flex}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{font-weight:600;font-size:var(--nf-fs-14,13px);align-items:center;gap:var(--nf-space-8,8px);color:var(--nf-text);display:flex}.zE6uZW_chapterBeats{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_chapterActions{gap:var(--nf-space-4,4px);opacity:.85;flex-shrink:0;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{font-size:var(--nf-fs-12,11px);padding:var(--nf-space-2,2px) var(--nf-space-10,9px);border-radius:var(--nf-radius-999,999px);white-space:nowrap;letter-spacing:.2px;border:1px solid;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);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg-inset);gap:var(--nf-space-6,6px);font-size:var(--nf-fs-12,12.5px);flex-direction:column;display:flex}.zE6uZW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;font-size:var(--nf-fs-12,12.5px);color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);margin:0;font-family:inherit;line-height:1.8;overflow:auto}.zE6uZW_chatScroll{gap:var(--nf-space-10,10px);min-height:240px;max-height:480px;padding:var(--nf-space-14,14px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);flex-direction:column;flex:1;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:var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-4,4px) var(--nf-radius-14,14px);padding:var(--nf-space-10,9px) var(--nf-space-14,14px);font-size:var(--nf-fs-14,13px);align-self:flex-end;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);border-radius:var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-4,4px);padding:var(--nf-space-10,9px) var(--nf-space-14,14px);font-size:var(--nf-fs-14,13px);box-shadow:var(--nf-shadow);align-self:flex-start}.zE6uZW_chatRole{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);margin-bottom:3px;font-weight:600}.zE6uZW_toolLive{padding:var(--nf-space-8,8px) var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);font-size:var(--nf-fs-12,12px);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);max-height:180px;margin-top:6px;line-height:1.7;overflow-y:auto}.zE6uZW_assistantStatus{padding:var(--nf-space-6,6px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);align-items:center;gap:var(--nf-space-6,6px);flex:none;margin-top:6px;display:flex}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{gap:var(--nf-space-4,4px);flex-direction:column;margin-top:6px;display:flex}.zE6uZW_toolStep{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,5px) var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);font-size:var(--nf-fs-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);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{font-size:var(--nf-fs-14,13px);flex:none}.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);font-size:var(--nf-fs-12,11px);flex:none}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);font-size:var(--nf-fs-12,11px);word-break:break-all}.zE6uZW_progress{border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);font-size:var(--nf-fs-12,12px);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);font-family:var(--nf-font-mono);background:var(--nf-bg-inset);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:var(--nf-space-8,8px);font-weight:600;display:flex}.zE6uZW_progressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{border-radius:var(--nf-radius-4,3px);background:var(--nf-accent);height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{justify-content:space-between;align-items:center;gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.zE6uZW_liveText{font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;color:var(--nf-text-2)}.zE6uZW_bigProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:8px;margin-top:10px;overflow:hidden}.zE6uZW_bigProgressBarFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));height:100%;transition:width .3s;display:block}.zE6uZW_diffLegend{align-items:center;gap:var(--nf-space-14,14px);font-size:var(--nf-fs-12,12px);flex-wrap:wrap;margin:6px 0 8px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{align-items:center;gap:var(--nf-space-4,4px);color:var(--nf-text-2);cursor:pointer;margin-left:auto;display:inline-flex}.zE6uZW_diffList{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);min-height:0;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-8,8px);font-size:var(--nf-fs-14,13px);flex-direction:column;flex:1;line-height:1.7;display:flex;overflow-y:auto}.zE6uZW_diffSame{border:1px dashed var(--nf-border);border-radius:var(--nf-radius-6,6px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);color:var(--nf-text-2);opacity:.85}.zE6uZW_diffSame summary{cursor:pointer;font-size:var(--nf-fs-12,12px);user-select:none}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{gap:var(--nf-space-6,6px);min-width:0;padding:var(--nf-space-8,8px) var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{font-size:var(--nf-fs-12,11px);border-radius:var(--nf-radius-4,4px);padding:var(--nf-space-2,1px) var(--nf-space-8,7px);letter-spacing:.5px;flex:none;align-self:flex-start;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{gap:var(--nf-space-4,4px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-6,6px);border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);flex-direction:column;display:flex}.zE6uZW_diffAdd{gap:var(--nf-space-4,4px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-6,6px);border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);flex-direction:column;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{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex}.zE6uZW_wsPageHeader{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;flex:none;display:flex}.zE6uZW_wsAppliedBanner{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border:1px solid var(--nf-success);border-radius:var(--nf-radius-10,10px);background:color-mix(in srgb, var(--nf-success) 8%, transparent);font-size:var(--nf-fs-12,12px);flex-wrap:wrap;flex:none;font-weight:600;display:flex}.zE6uZW_wsColumns{gap:var(--nf-space-14,14px);flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.zE6uZW_wsColumn{gap:var(--nf-space-8,8px);flex-direction:column;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);font-size:var(--nf-fs-14,13px);white-space:pre-wrap;flex:1;line-height:1.75}.zE6uZW_wsSelected{border:1px solid var(--nf-accent);border-radius:var(--nf-radius-6,6px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);max-height:120px;overflow:auto}.zE6uZW_wsSelectedText{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px}.zE6uZW_wsPreview{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px);gap:var(--nf-space-8,8px);background:var(--nf-bg-inset);flex-direction:column;display:flex}.zE6uZW_wsPreviewText{min-height:0;font-size:var(--nf-fs-14,13px);white-space:pre-wrap;color:var(--nf-text);flex:1;margin:0;line-height:1.7;overflow:auto}.zE6uZW_assetGrid{gap:var(--nf-space-10,10px);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));display:grid}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-4,4px);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%);flex-direction:column;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{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);opacity:.9}.zE6uZW_assetStatValue{font-size:var(--nf-fs-14,15px);color:var(--nf-text);font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_dashHero{border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-22,22px);padding:var(--nf-card-pad,20px 22px);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%);gap:var(--nf-space-14,14px);flex-direction:column;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{align-items:center;gap:var(--nf-space-6,6px);font-size:var(--nf-fs-14,13px);color:var(--nf-accent);font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:var(--nf-fs-14,14px)}.zE6uZW_dashHeroTitle{gap:var(--nf-space-2,2px);flex-direction:column;display:flex}.zE6uZW_dashHeroBook{font-size:var(--nf-fs-24,24px);letter-spacing:-.3px;margin:0;font-weight:700;line-height:1.25}.zE6uZW_dashHeroAction{align-items:center;gap:var(--nf-space-12,12px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);display:flex}.zE6uZW_dashHeroArrow{width:28px;height:var(--nf-ctrl-s,28px);background:var(--nf-accent);color:#fff;font-size:var(--nf-fs-14,14px);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_dashHeroActionBody{gap:var(--nf-space-2,2px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:var(--nf-fs-14,14px);font-weight:600}.zE6uZW_dashJourney{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_dashJourneyBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{gap:var(--nf-space-4,4px);grid-template-columns:repeat(6,minmax(0,1fr));display:grid}.zE6uZW_dashStage{align-items:center;gap:var(--nf-space-4,3px);font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;display:flex}.zE6uZW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));width:18px;height:18px;font-size:var(--nf-fs-12,10px);background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;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{gap:var(--nf-space-8,8px);border-top:1px solid var(--nf-border);padding-top:var(--nf-space-12,12px);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.zE6uZW_dashFact{gap:var(--nf-space-2,2px);flex-direction:column;min-width:0;display:flex}.zE6uZW_dashFact b{font-size:var(--nf-fs-14,13px);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_dashGrid{gap:var(--nf-space-14,14px);grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;display:grid}.zE6uZW_todoItem{align-items:center;gap:var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);font-size:var(--nf-fs-12,12.5px);border:1px solid var(--nf-border);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{gap:var(--nf-space-2,2px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_outlineReadonly{padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);font-size:var(--nf-fs-12,12.5px);white-space:pre-wrap;user-select:text;max-height:480px;margin:0;line-height:1.8;overflow:auto}.zE6uZW_bookCreateOutline{gap:var(--nf-space-6,6px);flex-direction:column;align-items:flex-start;display:flex}.zE6uZW_assistantFloat{z-index:80;border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.zE6uZW_assistantFloatHeader{justify-content:space-between;align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px) var(--nf-space-8,8px) var(--nf-space-14,14px);cursor:grab;user-select:none;font-size:var(--nf-fs-14,13px);border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;font-weight:600;display:flex}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{min-height:0;padding:var(--nf-space-10,10px);flex:1;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);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);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{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.zE6uZW_shelfView{min-height:0;padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);flex-direction:column;flex:1;display:flex;overflow:auto}.zE6uZW_shelfHeader{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_shelfHero{gap:var(--nf-space-14,14px);padding:var(--nf-card-pad,20px 22px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-22,22px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1.5px 0 var(--nf-glass-sheen);flex-direction:column;display:flex}.zE6uZW_shelfHero .zE6uZW_panelTitle{font-size:var(--nf-fs-22,22px);letter-spacing:.3px}.zE6uZW_shelfTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}.zE6uZW_shelfToolbar{align-items:center;gap:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfStats{gap:var(--nf-space-10,10px);grid-template-columns:repeat(auto-fit,minmax(120px,1fr));display:grid}.zE6uZW_shelfStat{justify-content:space-between;align-items:baseline;gap:var(--nf-space-8,8px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);cursor:pointer;user-select:none;transition:border-color .15s,background .15s,box-shadow .15s,transform .1s;display:flex}.zE6uZW_shelfStat:hover{border-color:var(--nf-accent);transform:translateY(-1px)}.zE6uZW_shelfStatActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);box-shadow:0 0 0 2px var(--nf-accent-soft), var(--nf-shadow)}.zE6uZW_shelfStat b{font-size:var(--nf-fs-20,20px);color:var(--nf-accent);font-weight:800}.zE6uZW_shelfStat span{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2)}.zE6uZW_shelfFilters{gap:var(--nf-space-2,2px);padding:var(--nf-space-4,3px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-999,999px);background:var(--nf-bg-inset);display:inline-flex}.zE6uZW_shelfFilter{color:var(--nf-text-2);font-size:var(--nf-fs-12,12.5px);padding:var(--nf-space-6,5px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);cursor:pointer;align-items:center;gap:var(--nf-space-6,5px);white-space:nowrap;background:0 0;border:none;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.zE6uZW_shelfFilter:hover{color:var(--nf-text)}.zE6uZW_shelfFilterActive{background:linear-gradient(135deg, var(--nf-accent), var(--nf-accent-hover));color:var(--nf-accent-fg);box-shadow:0 3px 12px color-mix(in srgb, var(--nf-accent) 40%, transparent)}.zE6uZW_shelfFilterCount{font-size:var(--nf-fs-12,10.5px);opacity:.8;background:color-mix(in srgb, currentColor 14%, transparent);border-radius:var(--nf-radius-999,999px);padding:0 var(--nf-space-6,6px)}.zE6uZW_shelfEmpty{justify-content:center;align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-40,40px) var(--nf-space-20,20px);border:1px dashed var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;flex-direction:column;flex:1;display:flex}.zE6uZW_shelfEmptyIcon{font-size:var(--nf-fs-42,42px)}.zE6uZW_shelfEmptyTitle{font-size:var(--nf-fs-16,16px);font-weight:700}.zE6uZW_shelfGrid{gap:var(--nf-container-gap,14px);grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;display:grid}.zE6uZW_panel{--nf-container-pad:20px 22px;--nf-container-gap:var(--nf-space-14,14px);--nf-card-pad:20px 22px;--nf-nav-pad:16px 12px 14px}.zE6uZW_panel[data-nf-density=compact]{--nf-container-pad:12px 14px;--nf-container-gap:var(--nf-space-8,8px);--nf-card-pad:12px 14px;--nf-nav-pad:8px 8px}.zE6uZW_panel[data-nf-density=spacious]{--nf-container-pad:24px 28px;--nf-container-gap:var(--nf-space-18,18px);--nf-card-pad:22px 26px;--nf-nav-pad:18px 14px}.zE6uZW_panel[data-nf-mode=light]{color-scheme:light;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#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}.zE6uZW_panel[data-nf-mode=dark]{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}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=macos]{--nf-bg:#1c1c1ee6;--nf-bg-raise:#2c2c2ed1;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff42;--nf-text:#f5f5f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b3;--nf-text-3:#98989d;--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-hover:#ffffff0f;--nf-info:#bf5af2;--nf-shadow:0 1px 2px #0006, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 18px 44px #0009;--nf-card-shadow:0 2px 6px #0006, 0 14px 38px #00000080;--nf-card-shadow-hover:0 4px 10px #00000073, 0 22px 52px #0009;--nf-glass-face:#2c2c2ed9;--nf-glass-core:transparent;--nf-glass-sheen:#fff3;--nf-glass-border:#ffffff2e;--nf-glass-inset:#ffffff0f;--nf-glass-orb-a:#0a84ff29;--nf-glass-orb-b:#bf5af214;--nf-glass-noise:none}.zE6uZW_panel[data-nf-mode=dark][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}.zE6uZW_panel[data-nf-mode=light][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}.zE6uZW_bookCard{gap:var(--nf-space-8,8px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);padding:var(--nf-space-12,12px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;flex-direction:column;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;border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);flex:none;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.zE6uZW_bookCardCover img{object-fit:cover;width:100%;height:100%;transition:transform .35s;display:block}.zE6uZW_bookCard:hover .zE6uZW_bookCardCover img{transform:scale(1.06)}.zE6uZW_bookCardCover:after{content:\"\";border-radius:inherit;pointer-events:none;opacity:0;background:linear-gradient(#0000 55%,#00000047);transition:opacity .25s;position:absolute;inset:0}.zE6uZW_bookCard:hover .zE6uZW_bookCardCover:after{opacity:1}.zE6uZW_bookCardCoverFallback{justify-content:center;align-items:center;gap:var(--nf-space-6,6px);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;width:100%;height:100%;display:flex}.zE6uZW_bookCardCoverTitle{font-size:var(--nf-fs-22,22px);color:var(--nf-accent);letter-spacing:2px;font-weight:800}.zE6uZW_bookCardBody{gap:var(--nf-space-6,5px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);display:flex}.zE6uZW_bookCardName{font-weight:700;font-size:var(--nf-fs-14,13.5px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;display:flex}.zE6uZW_bookCardProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000001f}.zE6uZW_bookCardProgressFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{justify-content:center;align-items:center;gap:var(--nf-space-8,8px);text-align:center;color:var(--nf-text-2);border-style:dashed;min-height:260px;transition:border-color .15s,color .15s,background .15s,transform .15s}.zE6uZW_bookAddCard:hover{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent);transform:translateY(-2px)}.zE6uZW_bookAddIcon{font-size:var(--nf-fs-34,34px);color:var(--nf-accent);line-height:1;transition:transform .15s}.zE6uZW_bookAddCard:hover .zE6uZW_bookAddIcon{transform:scale(1.12)}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{min-height:0;padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);flex-direction:column;flex:1;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_createBookCard{align-self:center;gap:var(--nf-space-12,12px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-20,20px);width:min(520px,100%);padding:var(--nf-card-pad,20px 22px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex}.zE6uZW_createBookIcon{font-size:var(--nf-fs-34,34px);line-height:1}.zE6uZW_createBookTitle{font-size:var(--nf-fs-22,22px);letter-spacing:-.3px;margin:0;font-weight:800}.zE6uZW_ideaCard{gap:var(--nf-space-8,8px);border:1px dashed var(--nf-border-strong);border-radius:var(--nf-radius-14,14px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);flex-direction:column;display:flex}.zE6uZW_ideaToggle{align-items:center;gap:var(--nf-space-6,6px);color:var(--nf-accent);font-size:var(--nf-fs-14,13px);cursor:pointer;text-align:left;background:0 0;border:none;padding:0;font-weight:700;display:flex}.zE6uZW_ideaCandidate{gap:var(--nf-space-6,6px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg);flex-direction:column;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{gap:var(--nf-space-4,3px);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;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:var(--nf-radius-4,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:var(--nf-space-12,12px);padding:var(--nf-space-8,8px) var(--nf-space-4,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{width:28px;height:var(--nf-ctrl-s,28px);font-size:var(--nf-fs-12,12px);border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;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{gap:var(--nf-space-4,4px);min-width:0;padding-top:var(--nf-space-2,2px);flex-direction:column;flex:1;display:flex}.zE6uZW_workflowLabel{font-size:var(--nf-fs-14,13px);color:var(--nf-text);font-weight:600}.zE6uZW_workflowHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2)}@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{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-16,16px);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;flex-wrap:wrap;flex-shrink:0;margin:10px 12px 0;display:flex;position:relative}.zE6uZW_bookshelfLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-weight:700}.zE6uZW_bookshelfList{align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;flex:1;min-width:0;display:flex}.zE6uZW_bookChip{align-items:center;gap:var(--nf-space-6,6px);padding:var(--nf-space-4,4px) var(--nf-space-8,8px) var(--nf-space-4,4px) var(--nf-space-10,10px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-999,999px);background:var(--nf-bg-inset);cursor:pointer;font-size:var(--nf-fs-12,12px);max-width:220px;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{font-size:var(--nf-fs-12,11px);opacity:.7;white-space:nowrap}.zE6uZW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;font-size:var(--nf-fs-14,13px);padding:0 var(--nf-space-2,2px);border-radius:var(--nf-radius-4,4px);background:0 0;border:none;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;font-size:var(--nf-fs-12,12px);padding:var(--nf-space-4,4px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);background:0 0;transition:border-color .15s,color .15s}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:var(--nf-space-6,6px);display:flex}.zE6uZW_dropzone{border:2px dashed var(--nf-border-strong);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-18,18px) var(--nf-space-14,14px);text-align:center;font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);cursor:pointer;align-items:center;gap:var(--nf-space-6,6px);flex-direction:column;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:var(--nf-fs-22,22px);line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);margin-top:auto;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{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border-bottom:1px solid;flex-wrap:wrap;flex:none;display:flex}.zE6uZW_readerTitle{font-weight:700;font-size:var(--nf-fs-14,14px)}.zE6uZW_readerSeg{align-items:center;gap:var(--nf-space-2,2px);border-radius:var(--nf-radius-8,8px);display:flex;overflow:hidden}.zE6uZW_readerSegBtn{font-size:var(--nf-fs-12,12px);padding:var(--nf-space-4,3px) var(--nf-space-8,8px);border-radius:var(--nf-radius-6,6px);cursor:pointer;opacity:.75;background:0 0;border:none}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{width:220px;min-width:220px;padding:var(--nf-space-8,8px) var(--nf-space-6,6px) var(--nf-space-24,24px);scrollbar-width:thin;gap:var(--nf-space-10,10px);border-right:1px solid;flex-direction:column;flex:none;display:flex;overflow-y:auto}.zE6uZW_readerGroup{gap:var(--nf-space-2,1px);flex-direction:column;display:flex}.zE6uZW_readerGroupTitle{align-items:center;gap:var(--nf-space-6,6px);width:100%;font-size:var(--nf-fs-12,12px);padding:var(--nf-space-6,6px) var(--nf-space-8,8px) var(--nf-space-4,4px);opacity:.9;cursor:pointer;text-align:left;border-radius:var(--nf-radius-6,6px);background:0 0;border:none;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{font-size:var(--nf-fs-12,10px);text-align:center;flex:none;width:12px}.zE6uZW_readerGroupCount{font-size:var(--nf-fs-12,11px);opacity:.6;padding-right:var(--nf-space-2,2px);flex:none;margin-left:auto;font-weight:400}.zE6uZW_readerItem{align-items:center;gap:var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);font-size:var(--nf-fs-12,12px);text-align:left;padding:var(--nf-space-4,4px) var(--nf-space-8,8px);cursor:pointer;opacity:.8;background:0 0;border:1px solid;min-width:0;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{font-size:var(--nf-fs-12,11px);flex:none}.zE6uZW_readerMain{min-height:0;padding:var(--nf-space-20,20px) var(--nf-space-16,16px) var(--nf-space-48,48px);scrollbar-width:thin;flex:1;justify-content:center;display:flex;overflow-y:auto}.zE6uZW_readerArticle{gap:var(--nf-space-12,12px);flex-direction:column;width:100%;display:flex}.zE6uZW_readerChapterTitle{font-size:var(--nf-fs-24,24px);letter-spacing:1px;margin:0;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-12,12px);display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{justify-content:space-between;align-items:center;gap:var(--nf-space-8,8px);padding-top:var(--nf-space-12,12px);border-top:1px dashed;margin-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{padding:var(--nf-space-32,32px) 0;font-size:var(--nf-fs-14,13px);opacity:.7;align-self:center}.zE6uZW_readerError{color:var(--nf-error)}.zE6uZW_importModalOverlay{z-index:1000;backdrop-filter:blur(4px);padding:var(--nf-space-24,24px);background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.zE6uZW_importModal{gap:var(--nf-space-12,12px);border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);width:min(520px,100%);max-height:85vh;padding:var(--nf-card-pad,20px 22px);background:var(--nf-bg-raise);backdrop-filter:blur(28px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex;overflow:auto}.zE6uZW_importModalHead{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);display:flex}.zE6uZW_importModalTabs{gap:var(--nf-space-8,8px);display:flex}.zE6uZW_importModalTabs .zE6uZW_button{flex:1}.zE6uZW_importModalBody{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_importField{gap:var(--nf-space-6,5px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);flex-direction:column;display:flex}.zE6uZW_importHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);line-height:1.5}.zE6uZW_importError{border:1px solid color-mix(in srgb, var(--nf-danger,#e5484d) 55%, transparent);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-danger,#e5484d);background:color-mix(in srgb, var(--nf-danger,#e5484d) 10%, transparent);white-space:pre-wrap;word-break:break-all}.zE6uZW_importResult{gap:var(--nf-space-4,4px);border:1px solid color-mix(in srgb, var(--nf-ok,#46a758) 45%, transparent);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,13px);background:color-mix(in srgb, var(--nf-ok,#46a758) 9%, transparent);word-break:break-all;flex-direction:column;display:flex}.zE6uZW_importModalActions{justify-content:flex-end;gap:var(--nf-space-8,8px);display:flex}.zE6uZW_importFileInfo{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-1);flex-wrap:wrap;display:flex}.zE6uZW_importPreview{gap:var(--nf-space-4,4px);border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,13px);background:var(--nf-bg-inset);flex-direction:column;display:flex}.zE6uZW_importPreviewList{padding-left:var(--nf-space-18,18px);gap:var(--nf-space-2,2px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-text-2);flex-direction:column;max-height:140px;margin:0;display:flex;overflow:auto}.zE6uZW_settingsCard .zE6uZW_fieldLabel{white-space:nowrap;text-overflow:ellipsis;max-width:100%;min-height:18px;line-height:18px;overflow:hidden}.zE6uZW_settingsCard .zE6uZW_row{align-items:flex-start}.zE6uZW_helpTipText{width:280px;max-width:70vw;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-raise);border:1px solid var(--nf-border-strong);box-shadow:var(--nf-shadow-lg);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:normal;z-index:20;text-align:left;pointer-events:none;font-weight:400;line-height:1.7;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.zE6uZW_helpTip:hover .zE6uZW_helpTipText,.zE6uZW_helpTip:focus .zE6uZW_helpTipText,.zE6uZW_helpTip:focus-within .zE6uZW_helpTipText{display:block}.zE6uZW_settingsCard+.zE6uZW_settingsCard{flex:1;min-height:0}.zE6uZW_switch{border-radius:var(--nf-radius-999,999px);border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);cursor:pointer;flex:none;width:42px;height:24px;padding:0;transition:background .18s,border-color .18s;position:relative}.zE6uZW_switchKnob{background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .18s;position:absolute;top:3px;left:3px;box-shadow:0 1px 3px #0000004d}.zE6uZW_switchOn{background:var(--nf-accent);border-color:var(--nf-accent)}.zE6uZW_switchOn .zE6uZW_switchKnob{transform:translate(18px)}";
35289
+ const css = ".zE6uZW_entry{align-items:center;gap:var(--nf-space-8,8px);width:100%;padding:var(--nf-space-8,8px) var(--nf-space-12,12px);color:var(--dsw-alias-label-primary,#1f1f23);cursor:pointer;text-align:left;border-radius:var(--nf-radius-6,6px);background:0 0;border:none;font-size:14px;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;width:20px;height:20px;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, #fff6 0%, #ffffff4d 26%, #ffffff3d 52%, #fff3 78%, #ffffff2e 100%);--nf-glass-core:radial-gradient(60% 40% at 30% 0%, #fff9 0%, #fff3 42%, #fff0 78%);--nf-glass-sheen:#ffffff8c;--nf-glass-border:#ffffff80;--nf-glass-inset:#fff6;--nf-glass-orb-a:#00b85c3d;--nf-glass-orb-b:#78a0ff33;--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\");--nf-card-radius:20px;--nf-card-blur:26px;--nf-card-saturate:170%;--nf-card-brightness:1.04;--nf-card-sheen:#ffffff80;--nf-card-border:1px solid #ffffff59;--nf-ctrl-radius:14px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffffb3;--nf-ctrl-sheen:#ffffff80;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='110'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='300' cy='180' r='420' fill='%2335d07a' fill-opacity='0.62'/%3E%3Ccircle cx='1240' cy='260' r='470' fill='%233aa7ff' fill-opacity='0.58'/%3E%3Ccircle cx='900' cy='860' r='470' fill='%2340cfc0' fill-opacity='0.5'/%3E%3Ccircle cx='1500' cy='820' r='330' fill='%23ff9fb0' fill-opacity='0.4'/%3E%3Ccircle cx='600' cy='620' r='260' fill='%23b06ef0' fill-opacity='0.42'/%3E%3Ccircle cx='180' cy='600' r='220' fill='%23ffd166' fill-opacity='0.36'/%3E%3C/g%3E%3C/svg%3E\");background:var(--nf-bg);backdrop-filter:blur(30px)saturate(170%)brightness(1.04);color:var(--nf-text);--nf-fs-10:10px;--nf-fs-12:12px;--nf-fs-14:14px;--nf-fs-16:16px;--nf-fs-18:18px;--nf-fs-20:20px;--nf-fs-22:22px;--nf-fs-24:24px;--nf-fs-34:34px;--nf-fs-42:42px;--nf-icon-s:14px;--nf-icon-m:16px;--nf-icon-l:18px;--nf-icon-xl:22px;--nf-space-2:2px;--nf-space-4:4px;--nf-space-6:6px;--nf-space-8:8px;--nf-space-10:10px;--nf-space-12:12px;--nf-space-14:14px;--nf-space-16:16px;--nf-space-18:18px;--nf-space-20:20px;--nf-space-24:24px;--nf-space-28:28px;--nf-space-32:32px;--nf-radius-2:2px;--nf-radius-4:4px;--nf-radius-6:6px;--nf-radius-8:8px;--nf-radius-10:10px;--nf-radius-12:12px;--nf-radius-14:14px;--nf-radius-16:16px;--nf-radius-20:20px;--nf-radius-22:22px;--nf-radius-999:999px;--nf-ctrl-s:28px;--nf-ctrl-m:32px;--nf-ctrl-l:38px;--nf-container-pad:20px 22px;--nf-container-gap:var(--nf-space-14,14px);--nf-card-pad:20px 22px;--nf-nav-pad:16px 12px 14px;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}.zE6uZW_panel[data-nf-mode=dark],body[data-ds-dark-theme] .zE6uZW_panel:not([data-nf-mode]),.zE6uZW_view:has(>.zE6uZW_panel[data-nf-mode=dark]),body[data-ds-dark-theme] .zE6uZW_view:not(:has(>.zE6uZW_panel[data-nf-mode=light])){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, #3e424a85 0%, #363a4275 26%, #30343c66 52%, #2a2e365c 78%, #262a3257 100%);--nf-glass-core:radial-gradient(60% 40% at 30% 0%, #ffffff38 0%, #ffffff14 42%, #fff0 78%);--nf-glass-sheen:#ffffff3d;--nf-glass-border:#ffffff24;--nf-glass-inset:#ffffff14;--nf-glass-orb-a:#00ca525c;--nf-glass-orb-b:#78a0ff47;--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\");--nf-card-radius:20px;--nf-card-blur:28px;--nf-card-saturate:165%;--nf-card-brightness:1;--nf-card-border:1px solid #ffffff24;--nf-card-sheen:#ffffff38;--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='110'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='300' cy='180' r='420' fill='%231a9f4d' fill-opacity='0.44'/%3E%3Ccircle cx='1240' cy='260' r='470' fill='%23268bd6' fill-opacity='0.40'/%3E%3Ccircle cx='900' cy='860' r='470' fill='%232a9e94' fill-opacity='0.36'/%3E%3Ccircle cx='1500' cy='820' r='330' fill='%23e07a94' fill-opacity='0.30'/%3E%3Ccircle cx='600' cy='620' r='260' fill='%238c5bd6' fill-opacity='0.32'/%3E%3C/g%3E%3C/svg%3E\");--nf-ctrl-radius:14px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffff2e;--nf-ctrl-sheen:#fff3;--nf-ctrl-caret:var(--nf-accent)}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .zE6uZW_view{display:block}.zE6uZW_panel[data-nf-theme=macos],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-mode=light][data-nf-theme=macos]{--nf-bg:#f5f6f8eb;--nf-bg-raise:#ffffffc7;--nf-bg-inset:#7676801a;--nf-border:#3c3c4324;--nf-border-strong:#3c3c434d;--nf-text:#1d1d1f;--nf-text-2:#3a3a3c;--nf-text-2-alpha:#3a3a3cb3;--nf-text-3:#86868b;--nf-accent:#007aff;--nf-accent-hover:#0071e3;--nf-accent-soft:#007aff1f;--nf-accent-fg:#fff;--nf-hover:#0000000a;--nf-info:#5856d6;--nf-shadow:0 1px 3px #0000000d, 0 10px 28px #00000012;--nf-shadow-lg:0 4px 12px #0000000f, 0 18px 44px #0000001c;--nf-card-shadow:0 2px 6px #0000000d, 0 12px 34px #00000017;--nf-card-shadow-hover:0 4px 10px #00000012, 0 20px 48px #00000024;--nf-glass-face:#ffffffb3;--nf-glass-core:transparent;--nf-glass-sheen:#fffc;--nf-glass-border:#ffffffe6;--nf-glass-inset:#fff9;--nf-glass-orb-a:#007aff14;--nf-glass-orb-b:#5856d612;--nf-glass-noise:none;--nf-card-radius:12px;--nf-card-blur:42px;--nf-card-saturate:150%;--nf-card-border:1px solid var(--nf-border);--nf-card-sheen:#ffffff59;--nf-ctrl-radius:8px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid var(--nf-border-strong);--nf-ctrl-sheen:#ffffff59;--nf-ctrl-caret:var(--nf-accent)}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=macos],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=macos]:not([data-nf-mode]){--nf-bg:#1c1c1ee6;--nf-bg-raise:#2c2c2ed1;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff42;--nf-text:#f5f5f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b3;--nf-text-3:#98989d;--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-hover:#ffffff0f;--nf-info:#bf5af2;--nf-shadow:0 1px 2px #0006, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 18px 44px #0009;--nf-card-shadow:0 2px 6px #0006, 0 14px 38px #00000080;--nf-card-shadow-hover:0 4px 10px #00000073, 0 22px 52px #0009;--nf-glass-face:#2c2c2ed9;--nf-glass-core:transparent;--nf-glass-sheen:#fff3;--nf-glass-border:#ffffff2e;--nf-glass-inset:#ffffff0f;--nf-glass-orb-a:#0a84ff29;--nf-glass-orb-b:#bf5af214;--nf-glass-noise:none}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_button{border:1px solid var(--nf-border-strong);background:color-mix(in srgb, var(--nf-bg-raise) 82%, #fff);box-shadow:0 1px 1px #0000000a,inset 0 1px #fff9}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_buttonPrimary{background:linear-gradient(180deg, color-mix(in srgb, var(--nf-accent) 90%, #fff), var(--nf-accent));color:var(--nf-accent-fg);box-shadow:0 1px 3px color-mix(in srgb, var(--nf-accent) 45%, transparent), inset 0 1px 0 #ffffff59;border-color:#0000}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_input,.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_textarea{border:1px solid var(--nf-border-strong);background:var(--nf-bg-raise)}.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_input:focus,.zE6uZW_panel[data-nf-theme=macos] .zE6uZW_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.zE6uZW_panel[data-nf-theme=neumorph]{--nf-card-radius:20px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-border:none;--nf-card-sheen:#fff0;--nf-ctrl-radius:10px;--nf-ctrl-bg:var(--nf-bg-inset);--nf-ctrl-border:none;--nf-ctrl-sheen:#fff0;--nf-ctrl-caret:var(--nf-text-3);--nf-glass-bg-image: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}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=neumorph],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph]:not([data-nf-mode]){--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}.zE6uZW_panel[data-nf-theme=clay]{--nf-card-radius:28px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-border:1px solid #fff9;--nf-card-sheen:#ffffffd9;--nf-ctrl-radius:16px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #ffffff8c;--nf-ctrl-sheen:#ffffffb3;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:none}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay],.zE6uZW_panel[data-nf-mode=light][data-nf-theme=clay]{--nf-bg:#f2eae0;--nf-bg-raise:#efe4d6;--nf-bg-inset:#e6d8c6;--nf-border:#78604829;--nf-border-strong:#78604847;--nf-text:#3a3330;--nf-text-2:#5a4f48;--nf-text-2-alpha:#5a4f48b3;--nf-text-3:#9a8c80;--nf-accent:#e08a5c;--nf-accent-hover:#d67a4a;--nf-accent-soft:#e08a5c29;--nf-accent-fg:#fff;--nf-hover:#78604814;--nf-success:#7fae6a;--nf-error:#c96b63;--nf-warn:#d9a660;--nf-info:#e08a5c;--nf-shadow:0 8px 16px -6px #5a463247, inset 0 6px 10px #ffffff8c, inset 0 -6px 10px #7860481f;--nf-shadow-lg:0 16px 28px -10px #5a463257, inset 0 6px 10px #ffffff8c, inset 0 -6px 10px #78604824;--nf-card-shadow:0 16px 28px -10px #5a463257, inset 0 -8px 12px #78604824, inset 0 8px 12px #fff9;--nf-card-shadow-hover:0 22px 36px -12px #5a463261, inset 0 -8px 12px #78604829, inset 0 8px 12px #ffffffb3;--nf-glass-face:#efe4d6;--nf-glass-core:transparent;--nf-glass-sheen:#ffffffd9;--nf-glass-border:#fff9;--nf-glass-inset:#e6d8c6;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]){--nf-bg:#2a2522;--nf-bg-raise:#37302b;--nf-bg-inset:#2f2925;--nf-border:#ffffff14;--nf-border-strong:#ffffff2e;--nf-text:#efe9e3;--nf-text-2:#c7beb5;--nf-text-2-alpha:#c7beb5b3;--nf-text-3:#8a8078;--nf-accent:#e69a6c;--nf-accent-hover:#f0ac82;--nf-accent-soft:#e69a6c33;--nf-accent-fg:#241b16;--nf-hover:#ffffff0f;--nf-success:#9cba82;--nf-error:#d98f86;--nf-warn:#d9a660;--nf-info:#e69a6c;--nf-shadow:0 8px 16px -6px #0000008c, inset 0 6px 10px #ffffff1f, inset 0 -6px 10px #00000059;--nf-shadow-lg:0 16px 28px -10px #0000009e, inset 0 6px 10px #ffffff1f, inset 0 -6px 10px #0006;--nf-card-shadow:0 16px 28px -10px #0000009e, inset 0 -8px 12px #0006, inset 0 8px 12px #ffffff24;--nf-card-shadow-hover:0 22px 36px -12px #000000ad, inset 0 -8px 12px #00000070, inset 0 8px 12px #ffffff2e;--nf-glass-face:#37302b;--nf-glass-core:transparent;--nf-glass-sheen:#ffffff29;--nf-glass-border:#ffffff29;--nf-glass-inset:#2f2925;--nf-glass-orb-a:transparent;--nf-glass-orb-b:transparent;--nf-glass-noise:none}.zE6uZW_panel[data-nf-theme=clay] .zE6uZW_input,.zE6uZW_panel[data-nf-theme=clay] .zE6uZW_textarea{background:var(--nf-bg-inset);border-color:var(--nf-border-strong);box-shadow:inset 3px 3px 7px #78604824,inset -3px -3px 7px #ffffff80}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_button{background:linear-gradient(#f6ecdf,#eee0cf);border-color:#fff9;box-shadow:0 8px 16px -6px #5a463259,inset 0 3px 4px #fffc,inset 0 -3px 5px #78604833}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_button:hover:not([disabled]){box-shadow:0 12px 22px -8px #5a46326b,inset 0 3px 4px #ffffffd9,inset 0 -3px 5px #78604838}body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay] .zE6uZW_buttonPrimary{color:var(--nf-accent-fg);background:linear-gradient(#eda178,#e08a5c);border-color:#0000;box-shadow:0 8px 16px -6px #e08a5c8c,inset 0 3px 4px #ffffff80,inset 0 -3px 5px #9646284d}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_button,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_button{background:linear-gradient(#403731,#332c27);border-color:#ffffff29;box-shadow:0 8px 16px -6px #0000008c,inset 0 3px 4px #ffffff24,inset 0 -3px 5px #0006}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_button:hover:not([disabled]),body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_button:hover:not([disabled]){box-shadow:0 12px 22px -8px #0009,inset 0 3px 4px #ffffff29,inset 0 -3px 5px #00000070}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_buttonPrimary,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_buttonPrimary{color:var(--nf-accent-fg);background:linear-gradient(#f0ac82,#d67a4a);border-color:#0000;box-shadow:0 8px 16px -6px #e69a6c80,inset 0 3px 4px #fff6,inset 0 -3px 5px #7832144d}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_input,.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay] .zE6uZW_textarea,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_input,body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]) .zE6uZW_textarea{box-shadow:inset 3px 3px 7px #00000073,inset -3px -3px 7px #ffffff14}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{min-width:0;height:100%;font-size:var(--nf-fs-14,14px);flex-direction:column;line-height:1.6;display:flex;position:relative;overflow:hidden}.zE6uZW_panel:before{content:\"\";z-index:0;pointer-events:none;background:linear-gradient(rgba(0, 0, 0, calc(var(--nf-glass-bg-dim,0) / 100)), rgba(0, 0, 0, calc(var(--nf-glass-bg-dim,0) / 100))), var(--nf-glass-bg-image,none) center / cover no-repeat, 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_panel[data-nf-theme=macos]{--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='1000'%3E%3Cdefs%3E%3Cfilter id='b' x='-20%25' y='-20%25' width='140%25' height='140%25'%3E%3CfeGaussianBlur stdDeviation='140'/%3E%3C/filter%3E%3C/defs%3E%3Cg filter='url(%23b)'%3E%3Ccircle cx='320' cy='220' r='320' fill='%230a84ff' fill-opacity='0.34'/%3E%3Ccircle cx='1180' cy='320' r='360' fill='%237f5af0' fill-opacity='0.30'/%3E%3Ccircle cx='920' cy='820' r='380' fill='%2340cfc0' fill-opacity='0.26'/%3E%3Ccircle cx='1460' cy='820' r='260' fill='%23ff9fb0' fill-opacity='0.18'/%3E%3C/g%3E%3C/svg%3E\")}.zE6uZW_panelTitle{font-size:var(--nf-fs-16,16px);letter-spacing:.2px;align-items:center;gap:var(--nf-space-8,8px);margin:0;font-weight:700;display:flex}.zE6uZW_panelTitle:before{content:\"\";border-radius:var(--nf-radius-2,2px);background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));width:4px;height:16px}.zE6uZW_iconButton{cursor:pointer;font-size:var(--nf-fs-16,16px);color:var(--nf-text-2);padding:var(--nf-space-4,4px) var(--nf-space-10,9px);border-radius:var(--nf-radius-10,9px);background:0 0;border:none;transition:background .15s,color .15s,transform .1s}.zE6uZW_iconButton:hover{background:var(--nf-hover);color:var(--nf-text);transform:translateY(-1px)}.zE6uZW_tabBar{gap:var(--nf-space-2,2px);padding:var(--nf-space-8,8px) var(--nf-space-14,14px) 0;border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);z-index:4;flex-shrink:0;display:flex;position:sticky;top:45px}.zE6uZW_tab{padding:var(--nf-space-8,7px) var(--nf-space-14,13px);cursor:pointer;border-radius:var(--nf-radius-8,8px) var(--nf-radius-8,8px) 0 0;font-size:var(--nf-fs-14,13.5px);color:var(--nf-text-2);background:0 0;border:none;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:\"\";border-radius:var(--nf-radius-2,2px) var(--nf-radius-2,2px) 0 0;background:var(--nf-accent);height:2.5px;position:absolute;bottom:-1px;left:10px;right:10px}.zE6uZW_panelContent{padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);z-index:1;flex-direction:column;flex:1;display:flex;position:relative;overflow:auto}.zE6uZW_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.zE6uZW_panelNav{align-self:stretch;gap:var(--nf-space-6,6px);width:216px;padding:var(--nf-nav-pad,16px 12px 14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-16,18px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);backdrop-filter:blur(28px)saturate(175%);flex-direction:column;flex:none;margin:10px 0 10px 12px;transition:width .18s;display:flex;overflow-y:auto}.zE6uZW_panelNavCollapsed{width:52px;padding:var(--nf-space-10,10px) var(--nf-space-6,6px)}.zE6uZW_navGroup{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_navGroupLabel{font-size:var(--nf-fs-12,12px);letter-spacing:.8px;text-transform:uppercase;color:var(--nf-text-3);padding:var(--nf-space-12,12px) var(--nf-space-10,10px) var(--nf-space-6,6px);user-select:none;font-weight:600}.zE6uZW_navGroupSep{background:var(--nf-border);height:1px;margin:6px 8px 4px}.zE6uZW_navSpacer{flex:1;min-height:8px}.zE6uZW_navAbout{gap:var(--nf-space-4,4px);padding:var(--nf-space-8,8px) var(--nf-space-6,6px) var(--nf-space-4,4px);border-top:1px solid var(--nf-border);flex-direction:column;flex:none;margin-top:4px;display:flex}.zE6uZW_navAboutRow{justify-content:space-between;align-items:center;gap:var(--nf-space-4,4px);cursor:pointer;font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);padding:var(--nf-space-4,4px) var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);text-align:left;white-space:nowrap;background:0 0;border:none;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;font-size:var(--nf-fs-12,10.5px);padding:var(--nf-space-4,4px) var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);text-align:left;white-space:nowrap;border:none;font-weight:600}.zE6uZW_navAboutUpdate:hover{color:var(--nf-accent-hover)}.zE6uZW_panelNavCollapsed .zE6uZW_navAbout{padding:var(--nf-space-6,6px) var(--nf-space-2,2px) var(--nf-space-2,2px);align-items:center}.zE6uZW_panelNavCollapsed .zE6uZW_navAboutRow{padding:var(--nf-space-4,4px) 0;justify-content:center;width:100%}.zE6uZW_navTabBadge{min-width:18px;height:18px;padding:0 var(--nf-space-6,5px);border-radius:var(--nf-radius-999,999px);background:var(--nf-accent);color:#fff;font-size:var(--nf-fs-12,10.5px);text-align:center;flex:none;margin-left:auto;font-weight:700;line-height:18px;display:inline-block}.zE6uZW_panelNavCollapsed .zE6uZW_navTabBadge{min-width:18px;height:18px;line-height:18px;font-size:var(--nf-fs-12,9px);padding:0 var(--nf-space-6,5px);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{align-items:center;gap:var(--nf-space-10,10px);cursor:pointer;border-radius:var(--nf-radius-10,10px);width:100%;padding:var(--nf-space-12,11px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,14px);color:var(--nf-text-2-alpha,var(--nf-text-2));text-align:left;white-space:nowrap;background:0 0;border:1px solid #0000;font-weight:500;transition:color .15s,background .15s,border-color .15s,box-shadow .15s;display:flex;position:relative}.zE6uZW_panelNavCollapsed .zE6uZW_navTab{padding:var(--nf-space-8,8px) 0;justify-content:center}.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;width:22px;height:22px;font-size:var(--nf-fs-16,17px);flex:none;justify-content:center;align-items:center;line-height:1;display:inline-flex}.zE6uZW_navTabLabel{text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitle{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-2,2px) var(--nf-space-6,6px) var(--nf-space-12,12px);border-bottom:1px solid var(--nf-border);flex:none;min-width:0;margin-bottom:6px;display:flex}.zE6uZW_navTitleLogo{border-radius:var(--nf-radius-10,10px);background:linear-gradient(145deg, var(--nf-accent), var(--nf-accent-hover));width:34px;height:34px;color:var(--nf-accent-fg);font-weight:800;font-size:var(--nf-fs-14,15px);box-shadow:0 6px 16px var(--nf-accent-soft);flex:none;justify-content:center;align-items:center;display:flex}.zE6uZW_navTitleName{font-weight:700;font-size:var(--nf-fs-14,15px);letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_navTitleBook{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_panelNavCollapsed .zE6uZW_navTitle{padding:var(--nf-space-2,2px) 0 var(--nf-space-10,10px);justify-content:center}.zE6uZW_panelNavCollapsed .zE6uZW_navTitleLogo{width:32px;height:var(--nf-ctrl-m,32px)}.zE6uZW_navActions{gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);border-top:1px solid var(--nf-border);flex:none;margin-top:8px;display:flex}.zE6uZW_navActionBtn{border:1px solid var(--nf-border);color:var(--nf-text-2);cursor:pointer;border-radius:var(--nf-radius-10,10px);height:var(--nf-ctrl-m,32px);font-size:var(--nf-fs-14,14px);background:0 0;flex:1;justify-content:center;align-items:center;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{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-10,9px);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;text-align:left;font:inherit;color:var(--nf-text);flex:none;min-width:0;margin-top:4px;transition:background .15s,border-color .15s;display:flex}.zE6uZW_bookSwitch:hover{background:var(--nf-hover);border-color:var(--nf-border-strong)}.zE6uZW_bookSwitchCover{border-radius:var(--nf-radius-6,5px);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);font-size:var(--nf-fs-12,11px);flex:none;justify-content:center;align-items:center;font-weight:700;display:flex}.zE6uZW_bookSwitchName{font-size:var(--nf-fs-12,12.5px);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.zE6uZW_bookSwitchMeta{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_bookSwitchArrow{color:var(--nf-text-3);font-size:var(--nf-fs-12,12px);flex:none;margin-left:auto}.zE6uZW_statRowD{gap:var(--nf-space-12,12px);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));display:grid}.zE6uZW_statCardD{justify-content:space-between;align-items:flex-start;gap:var(--nf-space-10,10px);padding:var(--nf-space-14,14px) var(--nf-space-16,16px);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);min-width:0;display:flex}.zE6uZW_statCardDLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.zE6uZW_statCardDValue{font-size:var(--nf-fs-22,22px);color:var(--nf-text);margin-top:2px;font-weight:700}.zE6uZW_statCardDUnit{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);font-weight:400}.zE6uZW_statCardDDetail{font-size:var(--nf-fs-12,11.5px);color:var(--nf-text-3);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;overflow:hidden}.zE6uZW_statCardDDown{color:var(--nf-error)}.zE6uZW_statCardDIcon{width:38px;height:var(--nf-ctrl-l,38px);border-radius:var(--nf-radius-12,12px);font-size:var(--nf-fs-18,18px);background:var(--nf-accent-soft);flex:none;justify-content:center;align-items:center;display:flex}.zE6uZW_statCardDIconRed{background:color-mix(in srgb, var(--nf-error) 13%, transparent)}.zE6uZW_tlBar{gap:var(--nf-space-6,6px);margin-top:8px;display:flex}.zE6uZW_tlSeg{gap:var(--nf-space-4,4px);cursor:pointer;min-width:0;font:inherit;background:0 0;border:none;flex-direction:column;flex:1;padding:0;display:flex}.zE6uZW_tlSegTrack{border-radius:var(--nf-radius-999,999px);background:var(--nf-hover);border:1px solid var(--nf-border);height:8px;overflow:hidden}.zE6uZW_tlSegFill{border-radius:var(--nf-radius-999,999px);background:var(--nf-accent);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{font-size:var(--nf-fs-12,10.5px);color:var(--nf-text-3);text-align:center;white-space:nowrap;text-overflow:ellipsis;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:var(--nf-card-border,1px solid var(--nf-glass-border));border-radius:var(--nf-card-radius,22px);padding:var(--nf-card-pad,20px 22px);gap:var(--nf-space-10,10px);background:var(--nf-glass-face);box-shadow:var(--nf-card-shadow), inset 0 1.5px 0 var(--nf-card-sheen,var(--nf-glass-sheen)), inset 0 -1px 0 #ffffff1a;backdrop-filter:blur(var(--nf-card-blur,30px)) saturate(var(--nf-card-saturate,180%)) brightness(var(--nf-card-brightness,1.06));flex-direction:column;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-card-sheen,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-card-sheen,var(--nf-glass-sheen)), inset 0 -1px 0 #ffffff40;transform:translateY(-3px)}.zE6uZW_card>*{z-index:1;position:relative}.zE6uZW_cardTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);align-items:center;gap:var(--nf-space-8,8px);margin:0;font-weight:650;display:flex}.zE6uZW_button{border:1px solid var(--nf-ctrl-border,var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);padding:var(--nf-space-8,7px) var(--nf-space-16,15px);border-radius:var(--nf-ctrl-radius,10px);cursor:pointer;font-size:var(--nf-fs-14,13px);box-shadow:inset 0 1px 0 var(--nf-ctrl-sheen,#ffffff17);white-space:nowrap;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);transform:translateY(-1px)}.zE6uZW_button:active:not([disabled]){transform:translateY(0)scale(.97)}.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);border-radius:var(--nf-radius-10,10px);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), inset 0 1px 0 #ffffff73;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));box-shadow:0 12px 30px color-mix(in srgb, var(--nf-accent) 50%, transparent), 0 0 0 .5px color-mix(in srgb, var(--nf-accent) 30%, transparent), inset 0 1px 0 #ffffff73;border-color:#0000;transform:translateY(-1px)}.zE6uZW_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.zE6uZW_buttonDanger:hover:not([disabled]){background:#ff3b301a}.zE6uZW_buttonSmall{padding:var(--nf-space-4,4px) var(--nf-space-10,10px);font-size:var(--nf-fs-12,12px);border-radius:var(--nf-ctrl-radius,8px)}.zE6uZW_field{gap:var(--nf-space-6,5px);flex-direction:column;display:flex}.zE6uZW_fieldLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);font-weight:500}.zE6uZW_input{border:var(--nf-ctrl-border,1px solid var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);color-scheme:light;border-radius:var(--nf-ctrl-radius,12px);padding:var(--nf-space-8,7px) var(--nf-space-12,11px);font-size:var(--nf-fs-14,13px);box-sizing:border-box;width:100%;box-shadow:inset 0 1px 0 var(--nf-ctrl-sheen,#ffffff17);transition:border-color .15s,box-shadow .15s}body[data-ds-dark-theme] .zE6uZW_input,.zE6uZW_panel[data-nf-mode=dark] .zE6uZW_input{color-scheme:dark}.zE6uZW_panel[data-nf-mode=light] .zE6uZW_input,body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph] .zE6uZW_input{color-scheme:light}select.zE6uZW_input{cursor:pointer;-webkit-appearance:none;appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--nf-ctrl-caret,var(--nf-text-3)) 50%), linear-gradient(135deg, var(--nf-ctrl-caret,var(--nf-text-3)) 50%, transparent 50%);background-position:calc(100% - 18px),calc(100% - 12px);background-repeat:no-repeat;background-size:6px 6px,6px 6px;padding-right:30px}.zE6uZW_input option{color:var(--nf-text);background:var(--nf-bg-raise);font-size:var(--nf-fs-14,15px)}.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:var(--nf-ctrl-border,1px solid var(--nf-border-strong));background:var(--nf-ctrl-bg,var(--nf-bg-inset));color:var(--nf-text);border-radius:var(--nf-ctrl-radius,12px);padding:var(--nf-space-10,9px) var(--nf-space-12,11px);font-size:var(--nf-fs-14,13px);box-sizing:border-box;resize:vertical;width:100%;min-height:200px;font-family:inherit;line-height:1.7;transition:border-color .15s,box-shadow .15s}.zE6uZW_row{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.zE6uZW_spaceBetween{justify-content:space-between}.zE6uZW_chapterList{gap:var(--nf-space-8,8px);flex-direction:column;display:flex}.zE6uZW_volumeGroup{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_volumeGroupHeader{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);cursor:pointer;user-select:none;font-size:var(--nf-fs-14,13px);transition:border-color .15s;display:flex}.zE6uZW_volumeGroupHeader:hover{border-color:var(--nf-accent)}.zE6uZW_volumeGroupToggle{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);flex:none}.zE6uZW_chapter{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-10,9px) var(--nf-space-12,12px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg);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{min-width:28px;height:var(--nf-ctrl-s,28px);padding:0 var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);flex-shrink:0;justify-content:center;align-items:center;font-weight:700;display:inline-flex}.zE6uZW_chapterMain{flex:1;min-width:0}.zE6uZW_chapterTitle{font-weight:600;font-size:var(--nf-fs-14,13px);align-items:center;gap:var(--nf-space-8,8px);color:var(--nf-text);display:flex}.zE6uZW_chapterBeats{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_chapterActions{gap:var(--nf-space-4,4px);opacity:.85;flex-shrink:0;transition:opacity .15s;display:flex}.zE6uZW_chapter:hover .zE6uZW_chapterActions{opacity:1}.zE6uZW_badge{font-size:var(--nf-fs-12,11px);padding:var(--nf-space-2,2px) var(--nf-space-10,9px);border-radius:var(--nf-radius-999,999px);white-space:nowrap;letter-spacing:.2px;border:1px solid;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);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg-inset);gap:var(--nf-space-6,6px);font-size:var(--nf-fs-12,12.5px);flex-direction:column;display:flex}.zE6uZW_chapterPreview{white-space:pre-wrap;word-break:break-all;max-height:320px;font-size:var(--nf-fs-12,12.5px);color:var(--nf-text);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);margin:0;font-family:inherit;line-height:1.8;overflow:auto}.zE6uZW_chatScroll{gap:var(--nf-space-10,10px);min-height:240px;max-height:480px;padding:var(--nf-space-14,14px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);flex-direction:column;flex:1;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:var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-4,4px) var(--nf-radius-14,14px);padding:var(--nf-space-10,9px) var(--nf-space-14,14px);font-size:var(--nf-fs-14,13px);align-self:flex-end;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);border-radius:var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-14,14px) var(--nf-radius-4,4px);padding:var(--nf-space-10,9px) var(--nf-space-14,14px);font-size:var(--nf-fs-14,13px);box-shadow:var(--nf-shadow);align-self:flex-start}.zE6uZW_chatRole{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);margin-bottom:3px;font-weight:600}.zE6uZW_toolLive{padding:var(--nf-space-8,8px) var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);border:1px dashed var(--nf-border-strong);font-size:var(--nf-fs-12,12px);white-space:pre-wrap;word-break:break-all;color:var(--nf-text-2);max-height:180px;margin-top:6px;line-height:1.7;overflow-y:auto}.zE6uZW_assistantStatus{padding:var(--nf-space-6,6px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);background:var(--nf-bg-inset);border:1px solid var(--nf-border);align-items:center;gap:var(--nf-space-6,6px);flex:none;margin-top:6px;display:flex}.zE6uZW_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.zE6uZW_toolSteps{gap:var(--nf-space-4,4px);flex-direction:column;margin-top:6px;display:flex}.zE6uZW_toolStep{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,5px) var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);font-size:var(--nf-fs-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);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{font-size:var(--nf-fs-14,13px);flex:none}.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);font-size:var(--nf-fs-12,11px);flex:none}.zE6uZW_toolStepActive .zE6uZW_toolStepStatus{color:var(--nf-accent)}.zE6uZW_toolStepError .zE6uZW_toolStepStatus{color:var(--nf-error)}.zE6uZW_toolStepDetail{width:100%;color:var(--nf-error);font-size:var(--nf-fs-12,11px);word-break:break-all}.zE6uZW_progress{border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);font-size:var(--nf-fs-12,12px);white-space:pre-wrap;word-break:break-all;min-height:60px;max-height:220px;color:var(--nf-text-2);font-family:var(--nf-font-mono);background:var(--nf-bg-inset);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:var(--nf-space-8,8px);font-weight:600;display:flex}.zE6uZW_progressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.zE6uZW_progressBarFill{border-radius:var(--nf-radius-4,3px);background:var(--nf-accent);height:100%;transition:width .3s;display:block}.zE6uZW_busyRow{justify-content:space-between;align-items:center;gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.zE6uZW_liveText{font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;color:var(--nf-text-2)}.zE6uZW_bigProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:8px;margin-top:10px;overflow:hidden}.zE6uZW_bigProgressBarFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-accent), var(--nf-accent-2,var(--nf-accent)));height:100%;transition:width .3s;display:block}.zE6uZW_diffLegend{align-items:center;gap:var(--nf-space-14,14px);font-size:var(--nf-fs-12,12px);flex-wrap:wrap;margin:6px 0 8px;display:flex}.zE6uZW_legendOld{color:var(--nf-error);font-weight:700}.zE6uZW_legendNew{color:var(--nf-success);font-weight:700}.zE6uZW_onlyChanges{align-items:center;gap:var(--nf-space-4,4px);color:var(--nf-text-2);cursor:pointer;margin-left:auto;display:inline-flex}.zE6uZW_diffList{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);background:var(--nf-bg-inset);min-height:0;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-8,8px);font-size:var(--nf-fs-14,13px);flex-direction:column;flex:1;line-height:1.7;display:flex;overflow-y:auto}.zE6uZW_diffSame{border:1px dashed var(--nf-border);border-radius:var(--nf-radius-6,6px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);color:var(--nf-text-2);opacity:.85}.zE6uZW_diffSame summary{cursor:pointer;font-size:var(--nf-fs-12,12px);user-select:none}.zE6uZW_diffSameBody{white-space:pre-wrap;margin-top:6px}.zE6uZW_diffChange{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.zE6uZW_diffColumn{gap:var(--nf-space-6,6px);min-width:0;padding:var(--nf-space-8,8px) var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_diffColumn:first-child{border-right:1px solid var(--nf-border)}.zE6uZW_diffTagOld,.zE6uZW_diffTagNew{font-size:var(--nf-fs-12,11px);border-radius:var(--nf-radius-4,4px);padding:var(--nf-space-2,1px) var(--nf-space-8,7px);letter-spacing:.5px;flex:none;align-self:flex-start;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{gap:var(--nf-space-4,4px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-6,6px);border:1px solid color-mix(in srgb, var(--nf-error) 35%, transparent);background:color-mix(in srgb, var(--nf-error) 7%, transparent);flex-direction:column;display:flex}.zE6uZW_diffAdd{gap:var(--nf-space-4,4px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);border-radius:var(--nf-radius-6,6px);border:1px solid color-mix(in srgb, var(--nf-success) 35%, transparent);background:color-mix(in srgb, var(--nf-success) 7%, transparent);flex-direction:column;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{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex}.zE6uZW_wsPageHeader{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;flex:none;display:flex}.zE6uZW_wsAppliedBanner{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border:1px solid var(--nf-success);border-radius:var(--nf-radius-10,10px);background:color-mix(in srgb, var(--nf-success) 8%, transparent);font-size:var(--nf-fs-12,12px);flex-wrap:wrap;flex:none;font-weight:600;display:flex}.zE6uZW_wsColumns{gap:var(--nf-space-14,14px);flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.zE6uZW_wsColumn{gap:var(--nf-space-8,8px);flex-direction:column;min-width:0;min-height:0;display:flex}.zE6uZW_wsEditor{resize:vertical;min-height:0;font-family:var(--nf-font);font-size:var(--nf-fs-14,13px);white-space:pre-wrap;flex:1;line-height:1.75}.zE6uZW_wsSelected{border:1px solid var(--nf-accent);border-radius:var(--nf-radius-6,6px);padding:var(--nf-space-6,6px) var(--nf-space-10,10px);background:color-mix(in srgb, var(--nf-accent) 8%, transparent);max-height:120px;overflow:auto}.zE6uZW_wsSelectedText{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px}.zE6uZW_wsPreview{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px);gap:var(--nf-space-8,8px);background:var(--nf-bg-inset);flex-direction:column;display:flex}.zE6uZW_wsPreviewText{min-height:0;font-size:var(--nf-fs-14,13px);white-space:pre-wrap;color:var(--nf-text);flex:1;margin:0;line-height:1.7;overflow:auto}.zE6uZW_assetGrid{gap:var(--nf-space-10,10px);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));display:grid}.zE6uZW_assetGroups{gap:var(--nf-space-14,14px);flex-direction:column;display:flex}.zE6uZW_assetGroup{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_assetGroupHeader{color:var(--nf-accent);border-bottom:1px solid var(--nf-glass-border);align-items:center;gap:8px;padding-bottom:2px;font-size:14px;font-weight:600;display:flex}.zE6uZW_assetStat{border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-4,4px);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%);flex-direction:column;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{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);opacity:.9}.zE6uZW_assetStatValue{font-size:var(--nf-fs-14,15px);color:var(--nf-text);font-weight:700;line-height:1.2}.zE6uZW_assetStatDetail{font-size:var(--nf-fs-12,11px);color:var(--nf-text-2);opacity:.85;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_dashHero{border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-22,22px);padding:var(--nf-card-pad,20px 22px);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%);gap:var(--nf-space-14,14px);flex-direction:column;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{align-items:center;gap:var(--nf-space-6,6px);font-size:var(--nf-fs-14,13px);color:var(--nf-accent);font-weight:600;display:inline-flex}.zE6uZW_dashHeroSparkle{font-size:var(--nf-fs-14,14px)}.zE6uZW_dashHeroTitle{gap:var(--nf-space-2,2px);flex-direction:column;display:flex}.zE6uZW_dashHeroBook{font-size:var(--nf-fs-24,24px);letter-spacing:-.3px;margin:0;font-weight:700;line-height:1.25}.zE6uZW_dashHeroAction{align-items:center;gap:var(--nf-space-12,12px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-inset);box-shadow:inset 0 1px 0 var(--nf-glass-sheen);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);display:flex}.zE6uZW_dashHeroArrow{width:28px;height:var(--nf-ctrl-s,28px);background:var(--nf-accent);color:#fff;font-size:var(--nf-fs-14,14px);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}.zE6uZW_dashHeroActionBody{gap:var(--nf-space-2,2px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_dashHeroActionTitle{font-size:var(--nf-fs-14,14px);font-weight:600}.zE6uZW_dashJourney{gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.zE6uZW_dashJourneyBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden}.zE6uZW_dashJourneyFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width .4s;display:block}.zE6uZW_dashJourneyStages{gap:var(--nf-space-4,4px);grid-template-columns:repeat(6,minmax(0,1fr));display:grid}.zE6uZW_dashStage{align-items:center;gap:var(--nf-space-4,3px);font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);text-align:center;white-space:nowrap;flex-direction:column;display:flex}.zE6uZW_dashStageDot{border:1px solid var(--nf-border-strong,var(--nf-text-3));width:18px;height:18px;font-size:var(--nf-fs-12,10px);background:var(--nf-bg-base);border-radius:50%;justify-content:center;align-items:center;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{gap:var(--nf-space-8,8px);border-top:1px solid var(--nf-border);padding-top:var(--nf-space-12,12px);grid-template-columns:repeat(4,minmax(0,1fr));display:grid}.zE6uZW_dashFact{gap:var(--nf-space-2,2px);flex-direction:column;min-width:0;display:flex}.zE6uZW_dashFact b{font-size:var(--nf-fs-14,13px);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.zE6uZW_dashGrid{gap:var(--nf-space-14,14px);grid-template-columns:minmax(0,3fr) minmax(0,2fr);align-items:start;display:grid}.zE6uZW_todoItem{align-items:center;gap:var(--nf-space-10,10px);border-radius:var(--nf-radius-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);font-size:var(--nf-fs-12,12.5px);border:1px solid var(--nf-border);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{gap:var(--nf-space-2,2px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_outlineReadonly{padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);font-size:var(--nf-fs-12,12.5px);white-space:pre-wrap;user-select:text;max-height:480px;margin:0;line-height:1.8;overflow:auto}.zE6uZW_bookCreateOutline{gap:var(--nf-space-6,6px);flex-direction:column;align-items:flex-start;display:flex}.zE6uZW_assistantFloat{z-index:80;border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.zE6uZW_assistantFloatHeader{justify-content:space-between;align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px) var(--nf-space-8,8px) var(--nf-space-14,14px);cursor:grab;user-select:none;font-size:var(--nf-fs-14,13px);border-bottom:1px solid var(--nf-border);background:var(--nf-bg-inset);flex:none;font-weight:600;display:flex}.zE6uZW_assistantFloatHeader:active{cursor:grabbing}.zE6uZW_assistantFloatBody{min-height:0;padding:var(--nf-space-10,10px);flex:1;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);border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);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{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.zE6uZW_shelfView{min-height:0;padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);flex-direction:column;flex:1;display:flex;overflow:auto}.zE6uZW_authorHome{z-index:1;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.zE6uZW_authorRail{border-right:1px solid var(--nf-glass-border);background:var(--nf-glass-face);flex-direction:column;flex-shrink:0;gap:4px;width:180px;padding:14px 10px;display:flex}.zE6uZW_authorRailTitle{color:var(--nf-accent);align-items:center;gap:8px;padding:4px 8px 12px;font-weight:600;display:flex}.zE6uZW_authorRailBtn{color:var(--nf-text);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:10px;align-items:center;gap:10px;width:100%;padding:8px 12px;font-size:14px;display:flex}.zE6uZW_authorRailBtn:hover{background:color-mix(in srgb, var(--nf-accent) 12%, transparent);color:var(--nf-text)}.zE6uZW_authorRailBtnActive{background:color-mix(in srgb, var(--nf-accent) 16%, var(--nf-glass-face));border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:inset 0 0 0 1px var(--nf-accent);font-weight:600}.zE6uZW_authorRailAbout{padding:8px 12px}.zE6uZW_authorContent{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.zE6uZW_authorPageBody{padding:var(--nf-container-pad,20px 22px);flex-direction:column;flex:1;gap:14px;min-height:0;display:flex;overflow:auto}.zE6uZW_authorPageHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:14px;display:flex}.zE6uZW_authorPageHero{gap:var(--nf-space-12,12px);padding:var(--nf-card-pad,20px 22px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-22,22px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1.5px 0 var(--nf-glass-sheen);backdrop-filter:blur(26px)saturate(175%);flex-direction:column;display:flex}.zE6uZW_noticeError{background:color-mix(in srgb, var(--nf-error) 14%, transparent);color:var(--nf-error);border:1px solid var(--nf-error);border-radius:10px;padding:10px 14px}.zE6uZW_rowEnd{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_assetFilterBar{flex-wrap:wrap;gap:8px;display:flex}.zE6uZW_assetFilterChip{border:1px solid var(--nf-glass-border);color:var(--nf-text);cursor:pointer;background:0 0;border-radius:999px;padding:4px 10px}.zE6uZW_assetFilterChipActive{background:var(--nf-accent);color:#fff;border-color:#0000}.zE6uZW_assetEditor{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:14px;flex-direction:column;gap:12px;padding:16px;display:flex}.zE6uZW_assetEditorRow{flex-wrap:wrap;gap:12px;display:flex}.zE6uZW_assetLabel{color:var(--nf-muted);flex-direction:column;flex:1;gap:4px;min-width:180px;font-size:12px;display:flex}.zE6uZW_assetTextarea{resize:vertical;min-height:160px;font-family:inherit}.zE6uZW_assetGrid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;display:grid}.zE6uZW_assetCard{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);border-radius:14px;flex-direction:column;gap:8px;padding:14px;display:flex}.zE6uZW_assetCardTop{justify-content:space-between;align-items:center;gap:8px;display:flex}.zE6uZW_assetKind{font-size:12px;font-weight:600}.zE6uZW_assetCardName{font-weight:600}.zE6uZW_assetCardContent{white-space:pre-wrap;color:var(--nf-text);max-height:150px;font-size:13px;overflow:auto}.zE6uZW_assetCardFooter{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.zE6uZW_iconBtn{color:var(--nf-text);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;justify-content:center;align-items:center;padding:4px;display:inline-flex}.zE6uZW_iconBtn:hover{background:#0000000f}.zE6uZW_adaptInputCard{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:14px;flex-direction:column;gap:12px;padding:16px;display:flex}.zE6uZW_adaptTextarea{resize:vertical;min-height:220px}.zE6uZW_adaptResult{flex-direction:column;gap:14px;display:flex}.zE6uZW_adaptOutline{background:var(--nf-glass-face);border:1px solid var(--nf-glass-border);border-radius:12px;padding:10px 14px}.zE6uZW_adaptMatrix{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;display:grid}.zE6uZW_dimCard{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:14px;flex-direction:column;gap:8px;padding:14px;display:flex}.zE6uZW_dimCardHead{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_dimTitle{font-weight:600}.zE6uZW_dimCurrent{white-space:pre-wrap;font-size:13px}.zE6uZW_dimCardSelected{border-color:var(--nf-accent);box-shadow:0 0 0 1px var(--nf-accent)}.zE6uZW_dimEdit{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.zE6uZW_adaptOutlinePre{white-space:pre-wrap;max-height:260px;margin:0;font-family:inherit;font-size:13px;overflow:auto}.zE6uZW_adaptProposal{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:14px;flex-direction:column;gap:8px;padding:14px;display:flex}.zE6uZW_adaptTable{border-collapse:collapse;width:100%;font-size:13px}.zE6uZW_adaptTable th,.zE6uZW_adaptTable td{border:1px solid var(--nf-glass-border);text-align:left;padding:6px 8px}.zE6uZW_adaptImpacts{flex-direction:column;gap:4px;display:flex}.zE6uZW_adaptImpact{font-size:13px}.zE6uZW_progressOverview{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;display:grid}.zE6uZW_progressOverviewCard{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);border-radius:14px;flex-direction:column;gap:4px;padding:14px;display:flex}.zE6uZW_progressOverviewNum{color:var(--nf-accent);font-size:24px;font-weight:700}.zE6uZW_progressTotalBar{background:var(--nf-glass-face);border:1px solid var(--nf-glass-border);border-radius:999px;height:14px;position:relative;overflow:hidden}.zE6uZW_progressTotalFill{background:linear-gradient(90deg, var(--nf-accent), var(--nf-info));border-radius:999px;height:100%;position:absolute;inset:0 auto 0 0}.zE6uZW_progressTotalBar .zE6uZW_meta{color:var(--nf-text);justify-content:center;align-items:center;font-size:11px;font-weight:600;display:flex;position:absolute;inset:0}.zE6uZW_progressBookList{flex-direction:column;gap:12px;display:flex}.zE6uZW_progressBook{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:14px;flex-direction:column;gap:8px;padding:14px;display:flex}.zE6uZW_progressBookActive{border-color:var(--nf-accent);box-shadow:0 0 0 1px var(--nf-accent)}.zE6uZW_progressBookHead{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.zE6uZW_progressBookName{font-weight:600}.zE6uZW_progressLive{color:var(--nf-accent);font-weight:600}.zE6uZW_progressBookBar{background:var(--nf-glass-face-hover,#0000000d);border-radius:999px;height:8px;overflow:hidden}.zE6uZW_progressBookFill{background:var(--nf-accent);border-radius:999px;height:100%}.zE6uZW_shelfHeader{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_shelfHero{gap:var(--nf-space-14,14px);padding:var(--nf-card-pad,20px 22px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-22,22px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1.5px 0 var(--nf-glass-sheen);flex-direction:column;display:flex}.zE6uZW_shelfHero .zE6uZW_panelTitle{font-size:var(--nf-fs-22,22px);letter-spacing:.3px}.zE6uZW_shelfTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}.zE6uZW_shelfToolbar{align-items:center;gap:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}.zE6uZW_shelfSearch{flex:1;min-width:180px;max-width:320px}.zE6uZW_shelfStats{gap:var(--nf-space-10,10px);grid-template-columns:repeat(auto-fit,minmax(120px,1fr));display:grid}.zE6uZW_shelfStat{justify-content:space-between;align-items:baseline;gap:var(--nf-space-8,8px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);box-shadow:var(--nf-shadow), inset 0 1px 0 var(--nf-glass-sheen);cursor:pointer;user-select:none;transition:border-color .15s,background .15s,box-shadow .15s,transform .1s;display:flex}.zE6uZW_shelfStat:hover{border-color:var(--nf-accent);transform:translateY(-1px)}.zE6uZW_shelfStatActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);box-shadow:0 0 0 2px var(--nf-accent-soft), var(--nf-shadow)}.zE6uZW_shelfStat b{font-size:var(--nf-fs-20,20px);color:var(--nf-accent);font-weight:800}.zE6uZW_shelfStat span{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2)}.zE6uZW_shelfFilters{gap:var(--nf-space-2,2px);padding:var(--nf-space-4,3px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-999,999px);background:var(--nf-bg-inset);display:inline-flex}.zE6uZW_shelfFilter{color:var(--nf-text-2);font-size:var(--nf-fs-12,12.5px);padding:var(--nf-space-6,5px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);cursor:pointer;align-items:center;gap:var(--nf-space-6,5px);white-space:nowrap;background:0 0;border:none;font-weight:600;transition:background .15s,color .15s,box-shadow .15s;display:inline-flex}.zE6uZW_shelfFilter:hover{color:var(--nf-text)}.zE6uZW_shelfFilterActive{background:linear-gradient(135deg, var(--nf-accent), var(--nf-accent-hover));color:var(--nf-accent-fg);box-shadow:0 3px 12px color-mix(in srgb, var(--nf-accent) 40%, transparent)}.zE6uZW_shelfFilterCount{font-size:var(--nf-fs-12,10.5px);opacity:.8;background:color-mix(in srgb, currentColor 14%, transparent);border-radius:var(--nf-radius-999,999px);padding:0 var(--nf-space-6,6px)}.zE6uZW_shelfEmpty{justify-content:center;align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-40,40px) var(--nf-space-20,20px);border:1px dashed var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);text-align:center;flex-direction:column;flex:1;display:flex}.zE6uZW_shelfEmptyIcon{font-size:var(--nf-fs-42,42px)}.zE6uZW_shelfEmptyTitle{font-size:var(--nf-fs-16,16px);font-weight:700}.zE6uZW_shelfGrid{gap:var(--nf-container-gap,14px);grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;display:grid}.zE6uZW_panel{--nf-container-pad:20px 22px;--nf-container-gap:var(--nf-space-14,14px);--nf-card-pad:20px 22px;--nf-nav-pad:16px 12px 14px}.zE6uZW_panel[data-nf-density=compact]{--nf-container-pad:12px 14px;--nf-container-gap:var(--nf-space-8,8px);--nf-card-pad:12px 14px;--nf-nav-pad:8px 8px}.zE6uZW_panel[data-nf-density=spacious]{--nf-container-pad:24px 28px;--nf-container-gap:var(--nf-space-18,18px);--nf-card-pad:22px 26px;--nf-nav-pad:18px 14px}.zE6uZW_panel[data-nf-mode=light]{color-scheme:light;--nf-bg:#f2f2f7db;--nf-bg-raise:#ffffffb8;--nf-bg-inset:#7676801f;--nf-border:#3c3c4329;--nf-border-strong:#3c3c4352;--nf-text:#1c1c1e;--nf-text-2:#3c3c43;--nf-text-2-alpha:#3c3c43ad;--nf-text-3:#8e8e93;--nf-accent:#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}.zE6uZW_panel[data-nf-mode=dark]{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}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=macos]{--nf-bg:#1c1c1ee6;--nf-bg-raise:#2c2c2ed1;--nf-bg-inset:#7676802e;--nf-border:#ffffff1f;--nf-border-strong:#ffffff42;--nf-text:#f5f5f7;--nf-text-2:#d1d1d6;--nf-text-2-alpha:#d1d1d6b3;--nf-text-3:#98989d;--nf-accent:#0a84ff;--nf-accent-hover:#3a9bff;--nf-accent-soft:#0a84ff33;--nf-accent-fg:#fff;--nf-hover:#ffffff0f;--nf-info:#bf5af2;--nf-shadow:0 1px 2px #0006, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 18px 44px #0009;--nf-card-shadow:0 2px 6px #0006, 0 14px 38px #00000080;--nf-card-shadow-hover:0 4px 10px #00000073, 0 22px 52px #0009;--nf-glass-face:#2c2c2ed9;--nf-glass-core:transparent;--nf-glass-sheen:#fff3;--nf-glass-border:#ffffff2e;--nf-glass-inset:#ffffff0f;--nf-glass-orb-a:#0a84ff29;--nf-glass-orb-b:#bf5af214;--nf-glass-noise:none}.zE6uZW_panel[data-nf-mode=dark][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}.zE6uZW_panel[data-nf-mode=light][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}.zE6uZW_bookCard{gap:var(--nf-space-8,8px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);padding:var(--nf-space-12,12px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow);cursor:pointer;flex-direction:column;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;border-radius:var(--nf-radius-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);flex:none;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.zE6uZW_bookCardCover img{object-fit:cover;width:100%;height:100%;transition:transform .35s;display:block}.zE6uZW_bookCard:hover .zE6uZW_bookCardCover img{transform:scale(1.06)}.zE6uZW_bookCardCover:after{content:\"\";border-radius:inherit;pointer-events:none;opacity:0;background:linear-gradient(#0000 55%,#00000047);transition:opacity .25s;position:absolute;inset:0}.zE6uZW_bookCard:hover .zE6uZW_bookCardCover:after{opacity:1}.zE6uZW_bookCardCoverFallback{justify-content:center;align-items:center;gap:var(--nf-space-6,6px);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;width:100%;height:100%;display:flex}.zE6uZW_bookCardCoverTitle{font-size:var(--nf-fs-22,22px);color:var(--nf-accent);letter-spacing:2px;font-weight:800}.zE6uZW_bookCardBody{gap:var(--nf-space-6,5px);flex-direction:column;flex:1;min-width:0;display:flex}.zE6uZW_bookCardTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);display:flex}.zE6uZW_bookCardName{font-weight:700;font-size:var(--nf-fs-14,13.5px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.zE6uZW_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.zE6uZW_bookCardMetaRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;display:flex}.zE6uZW_bookCardProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000001f}.zE6uZW_bookCardProgressFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width .3s;display:block}.zE6uZW_bookAddCard{justify-content:center;align-items:center;gap:var(--nf-space-8,8px);text-align:center;color:var(--nf-text-2);border-style:dashed;min-height:260px;transition:border-color .15s,color .15s,background .15s,transform .15s}.zE6uZW_bookAddCard:hover{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent);transform:translateY(-2px)}.zE6uZW_bookAddIcon{font-size:var(--nf-fs-34,34px);color:var(--nf-accent);line-height:1;transition:transform .15s}.zE6uZW_bookAddCard:hover .zE6uZW_bookAddIcon{transform:scale(1.12)}.zE6uZW_bookCreateCard{border-color:var(--nf-accent);min-height:260px}.zE6uZW_createBookView{min-height:0;padding:var(--nf-container-pad,20px 22px);gap:var(--nf-container-gap,14px);flex-direction:column;flex:1;display:flex;overflow:auto}.zE6uZW_createBookTop{align-items:center;display:flex}.zE6uZW_createBookCard{align-self:center;gap:var(--nf-space-12,12px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-20,20px);width:min(520px,100%);padding:var(--nf-card-pad,20px 22px);background:var(--nf-bg-raise);backdrop-filter:blur(24px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex}.zE6uZW_createBookIcon{font-size:var(--nf-fs-34,34px);line-height:1}.zE6uZW_createBookTitle{font-size:var(--nf-fs-22,22px);letter-spacing:-.3px;margin:0;font-weight:800}.zE6uZW_ideaCard{gap:var(--nf-space-8,8px);border:1px dashed var(--nf-border-strong);border-radius:var(--nf-radius-14,14px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:color-mix(in srgb, var(--nf-accent) 3%, transparent);flex-direction:column;display:flex}.zE6uZW_ideaToggle{align-items:center;gap:var(--nf-space-6,6px);color:var(--nf-accent);font-size:var(--nf-fs-14,13px);cursor:pointer;text-align:left;background:0 0;border:none;padding:0;font-weight:700;display:flex}.zE6uZW_ideaCandidate{gap:var(--nf-space-6,6px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12,12px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg);flex-direction:column;display:flex}.zE6uZW_progressLineDone{color:var(--nf-success);font-weight:600}.zE6uZW_progressLineError{color:var(--nf-error);font-weight:600}.zE6uZW_meta{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9}.zE6uZW_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.zE6uZW_fileList{gap:var(--nf-space-4,3px);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9;word-break:break-all;flex-direction:column;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:var(--nf-radius-4,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:var(--nf-space-12,12px);padding:var(--nf-space-8,8px) var(--nf-space-4,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{width:28px;height:var(--nf-ctrl-s,28px);font-size:var(--nf-fs-12,12px);border:2px solid var(--nf-border-strong);background:var(--nf-bg-raise);color:var(--nf-text-2);z-index:1;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;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{gap:var(--nf-space-4,4px);min-width:0;padding-top:var(--nf-space-2,2px);flex-direction:column;flex:1;display:flex}.zE6uZW_workflowLabel{font-size:var(--nf-fs-14,13px);color:var(--nf-text);font-weight:600}.zE6uZW_workflowHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2)}@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{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-16,16px);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;flex-wrap:wrap;flex-shrink:0;margin:10px 12px 0;display:flex;position:relative}.zE6uZW_bookshelfLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);letter-spacing:1px;flex-shrink:0;font-weight:700}.zE6uZW_bookshelfList{align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;flex:1;min-width:0;display:flex}.zE6uZW_bookChip{align-items:center;gap:var(--nf-space-6,6px);padding:var(--nf-space-4,4px) var(--nf-space-8,8px) var(--nf-space-4,4px) var(--nf-space-10,10px);border:1px solid var(--nf-border);border-radius:var(--nf-radius-999,999px);background:var(--nf-bg-inset);cursor:pointer;font-size:var(--nf-fs-12,12px);max-width:220px;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{font-size:var(--nf-fs-12,11px);opacity:.7;white-space:nowrap}.zE6uZW_bookChipRemove{color:var(--nf-text-3);cursor:pointer;font-size:var(--nf-fs-14,13px);padding:0 var(--nf-space-2,2px);border-radius:var(--nf-radius-4,4px);background:0 0;border:none;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;font-size:var(--nf-fs-12,12px);padding:var(--nf-space-4,4px) var(--nf-space-12,12px);border-radius:var(--nf-radius-999,999px);background:0 0;transition:border-color .15s,color .15s}.zE6uZW_bookAdd:hover{border-color:var(--nf-accent);color:var(--nf-accent)}.zE6uZW_bookCreateForm{align-items:center;gap:var(--nf-space-6,6px);display:flex}.zE6uZW_dropzone{border:2px dashed var(--nf-border-strong);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-18,18px) var(--nf-space-14,14px);text-align:center;font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);cursor:pointer;align-items:center;gap:var(--nf-space-6,6px);flex-direction:column;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:var(--nf-fs-22,22px);line-height:1}.zE6uZW_bookCardActions{align-items:center;gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);margin-top:auto;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{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border-bottom:1px solid;flex-wrap:wrap;flex:none;display:flex}.zE6uZW_readerTitle{font-weight:700;font-size:var(--nf-fs-14,14px)}.zE6uZW_readerSeg{align-items:center;gap:var(--nf-space-2,2px);border-radius:var(--nf-radius-8,8px);display:flex;overflow:hidden}.zE6uZW_readerSegBtn{font-size:var(--nf-fs-12,12px);padding:var(--nf-space-4,3px) var(--nf-space-8,8px);border-radius:var(--nf-radius-6,6px);cursor:pointer;opacity:.75;background:0 0;border:none}.zE6uZW_readerSegBtn:hover,.zE6uZW_readerSegActive{opacity:1}.zE6uZW_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.zE6uZW_readerSidebar{width:220px;min-width:220px;padding:var(--nf-space-8,8px) var(--nf-space-6,6px) var(--nf-space-24,24px);scrollbar-width:thin;gap:var(--nf-space-10,10px);border-right:1px solid;flex-direction:column;flex:none;display:flex;overflow-y:auto}.zE6uZW_readerGroup{gap:var(--nf-space-2,1px);flex-direction:column;display:flex}.zE6uZW_readerGroupTitle{align-items:center;gap:var(--nf-space-6,6px);width:100%;font-size:var(--nf-fs-12,12px);padding:var(--nf-space-6,6px) var(--nf-space-8,8px) var(--nf-space-4,4px);opacity:.9;cursor:pointer;text-align:left;border-radius:var(--nf-radius-6,6px);background:0 0;border:none;font-weight:700;display:flex}.zE6uZW_readerGroupTitle:hover{opacity:1;background:#8080801f}.zE6uZW_readerGroupArrow{font-size:var(--nf-fs-12,10px);text-align:center;flex:none;width:12px}.zE6uZW_readerGroupCount{font-size:var(--nf-fs-12,11px);opacity:.6;padding-right:var(--nf-space-2,2px);flex:none;margin-left:auto;font-weight:400}.zE6uZW_readerItem{align-items:center;gap:var(--nf-space-6,6px);border-radius:var(--nf-radius-8,8px);font-size:var(--nf-fs-12,12px);text-align:left;padding:var(--nf-space-4,4px) var(--nf-space-8,8px);cursor:pointer;opacity:.8;background:0 0;border:1px solid;min-width:0;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{font-size:var(--nf-fs-12,11px);flex:none}.zE6uZW_readerMain{min-height:0;padding:var(--nf-space-20,20px) var(--nf-space-16,16px) var(--nf-space-48,48px);scrollbar-width:thin;flex:1;justify-content:center;display:flex;overflow-y:auto}.zE6uZW_readerArticle{gap:var(--nf-space-12,12px);flex-direction:column;width:100%;display:flex}.zE6uZW_readerChapterTitle{font-size:var(--nf-fs-24,24px);letter-spacing:1px;margin:0;font-weight:800}.zE6uZW_readerChapterMeta{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-12,12px);display:flex}.zE6uZW_readerText{text-align:justify;letter-spacing:.02em}.zE6uZW_readerPara{text-indent:2em;margin:0 0 .85em}.zE6uZW_readerFoot{justify-content:space-between;align-items:center;gap:var(--nf-space-8,8px);padding-top:var(--nf-space-12,12px);border-top:1px dashed;margin-top:12px;display:flex}.zE6uZW_readerLoading,.zE6uZW_readerError{padding:var(--nf-space-32,32px) 0;font-size:var(--nf-fs-14,13px);opacity:.7;align-self:center}.zE6uZW_readerError{color:var(--nf-error)}.zE6uZW_importModalOverlay{z-index:1000;backdrop-filter:blur(4px);padding:var(--nf-space-24,24px);background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.zE6uZW_importModal{gap:var(--nf-space-12,12px);border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);width:min(520px,100%);max-height:85vh;padding:var(--nf-card-pad,20px 22px);background:var(--nf-bg-raise);backdrop-filter:blur(28px)saturate(180%);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex;overflow:auto}.zE6uZW_importModalHead{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);display:flex}.zE6uZW_importModalTabs{gap:var(--nf-space-8,8px);display:flex}.zE6uZW_importModalTabs .zE6uZW_button{flex:1}.zE6uZW_importModalBody{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.zE6uZW_importField{gap:var(--nf-space-6,5px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);flex-direction:column;display:flex}.zE6uZW_importHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);line-height:1.5}.zE6uZW_importError{border:1px solid color-mix(in srgb, var(--nf-danger,#e5484d) 55%, transparent);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-danger,#e5484d);background:color-mix(in srgb, var(--nf-danger,#e5484d) 10%, transparent);white-space:pre-wrap;word-break:break-all}.zE6uZW_importResult{gap:var(--nf-space-4,4px);border:1px solid color-mix(in srgb, var(--nf-ok,#46a758) 45%, transparent);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,13px);background:color-mix(in srgb, var(--nf-ok,#46a758) 9%, transparent);word-break:break-all;flex-direction:column;display:flex}.zE6uZW_importModalActions{justify-content:flex-end;gap:var(--nf-space-8,8px);display:flex}.zE6uZW_importFileInfo{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-1);flex-wrap:wrap;display:flex}.zE6uZW_importPreview{gap:var(--nf-space-4,4px);border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,13px);background:var(--nf-bg-inset);flex-direction:column;display:flex}.zE6uZW_importPreviewList{padding-left:var(--nf-space-18,18px);gap:var(--nf-space-2,2px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-text-2);flex-direction:column;max-height:140px;margin:0;display:flex;overflow:auto}.zE6uZW_settingsCard .zE6uZW_fieldLabel{white-space:nowrap;text-overflow:ellipsis;max-width:100%;min-height:18px;line-height:18px;overflow:hidden}.zE6uZW_settingsCard .zE6uZW_row{align-items:flex-start}.zE6uZW_helpTipText{width:280px;max-width:70vw;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-raise);border:1px solid var(--nf-border-strong);box-shadow:var(--nf-shadow-lg);font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:normal;z-index:20;text-align:left;pointer-events:none;font-weight:400;line-height:1.7;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%)}.zE6uZW_helpTip:hover .zE6uZW_helpTipText,.zE6uZW_helpTip:focus .zE6uZW_helpTipText,.zE6uZW_helpTip:focus-within .zE6uZW_helpTipText{display:block}.zE6uZW_settingsCard+.zE6uZW_settingsCard{flex:1;min-height:0}.zE6uZW_switch{border-radius:var(--nf-radius-999,999px);border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);cursor:pointer;flex:none;width:42px;height:24px;padding:0;transition:background .18s,border-color .18s;position:relative}.zE6uZW_switchKnob{background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .18s;position:absolute;top:3px;left:3px;box-shadow:0 1px 3px #0000004d}.zE6uZW_switchOn{background:var(--nf-accent);border-color:var(--nf-accent)}.zE6uZW_switchOn .zE6uZW_switchKnob{transform:translate(18px)}.zE6uZW_panel[data-nf-theme=neumorph]:not([data-nf-mode=dark]),body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=neumorph][data-nf-mode=light]{--nf-glass-face:color-mix(in srgb, #e4e9f2, transparent calc(100% - var(--nf-glass-opacity,100%)));--nf-bg-raise:color-mix(in srgb, #e4e9f2, transparent calc(100% - var(--nf-glass-opacity,100%)))}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=neumorph],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=neumorph]:not([data-nf-mode]){--nf-glass-face:color-mix(in srgb, #2b2f36, transparent calc(100% - var(--nf-glass-opacity,100%)));--nf-bg-raise:color-mix(in srgb, #2b2f36, transparent calc(100% - var(--nf-glass-opacity,100%)))}.zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode=dark]),body:not([data-ds-dark-theme]) .zE6uZW_panel[data-nf-theme=clay][data-nf-mode=light]{--nf-glass-face:color-mix(in srgb, #efe4d6, transparent calc(100% - var(--nf-glass-opacity,100%)));--nf-bg-raise:color-mix(in srgb, #efe4d6, transparent calc(100% - var(--nf-glass-opacity,100%)))}.zE6uZW_panel[data-nf-mode=dark][data-nf-theme=clay],body[data-ds-dark-theme] .zE6uZW_panel[data-nf-theme=clay]:not([data-nf-mode]){--nf-glass-face:color-mix(in srgb, #37302b, transparent calc(100% - var(--nf-glass-opacity,100%)));--nf-bg-raise:color-mix(in srgb, #37302b, transparent calc(100% - var(--nf-glass-opacity,100%)))}";
35225
35290
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
35226
35291
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
35227
35292
  const tag = document.createElement("style");
@@ -35231,315 +35296,373 @@ window.__ModuleLoader__.load({
35231
35296
  document.head.appendChild(tag);
35232
35297
  }
35233
35298
  var panel_module_css_default = {
35234
- "helpTipText": "zE6uZW_helpTipText",
35235
- "dropzone": "zE6uZW_dropzone",
35236
- "workflowDotDone": "zE6uZW_workflowDotDone",
35237
- "statCardDIconRed": "zE6uZW_statCardDIconRed",
35238
- "navTitleLogo": "zE6uZW_navTitleLogo",
35239
- "badgePending": "zE6uZW_badgePending",
35240
- "toolStep": "zE6uZW_toolStep",
35241
- "importHint": "zE6uZW_importHint",
35242
- "bookAddIcon": "zE6uZW_bookAddIcon",
35243
- "statCardDUnit": "zE6uZW_statCardDUnit",
35244
- "wsPageHeader": "zE6uZW_wsPageHeader",
35245
- "navTitle": "zE6uZW_navTitle",
35246
- "todoText": "zE6uZW_todoText",
35247
- "readerItemBadge": "zE6uZW_readerItemBadge",
35248
- "assetGrid": "zE6uZW_assetGrid",
35249
- "coverPreview": "zE6uZW_coverPreview",
35250
- "bookAdd": "zE6uZW_bookAdd",
35251
- "chapterBeats": "zE6uZW_chapterBeats",
35252
- "readerMain": "zE6uZW_readerMain",
35253
- "meta": "zE6uZW_meta",
35254
- "readerLoading": "zE6uZW_readerLoading",
35299
+ "navAboutUpdate": "zE6uZW_navAboutUpdate",
35300
+ "assetStat": "zE6uZW_assetStat",
35301
+ "wsColumns": "zE6uZW_wsColumns",
35302
+ "authorRail": "zE6uZW_authorRail",
35303
+ "spaceBetween": "zE6uZW_spaceBetween",
35304
+ "dashHeroArrow": "zE6uZW_dashHeroArrow",
35305
+ "diffSameBody": "zE6uZW_diffSameBody",
35306
+ "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
35307
+ "shelfHero": "zE6uZW_shelfHero",
35308
+ "importModalHead": "zE6uZW_importModalHead",
35309
+ "bookChip": "zE6uZW_bookChip",
35310
+ "diffLegend": "zE6uZW_diffLegend",
35311
+ "shelfStatActive": "zE6uZW_shelfStatActive",
35312
+ "panelBody": "zE6uZW_panelBody",
35313
+ "panelNav": "zE6uZW_panelNav",
35314
+ "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
35315
+ "tlSeg": "zE6uZW_tlSeg",
35316
+ "todoWarning": "zE6uZW_todoWarning",
35317
+ "dimCard": "zE6uZW_dimCard",
35255
35318
  "view": "zE6uZW_view",
35256
- "createBookTitle": "zE6uZW_createBookTitle",
35257
- "readerTitle": "zE6uZW_readerTitle",
35258
- "dashFact": "zE6uZW_dashFact",
35259
- "wsPreview": "zE6uZW_wsPreview",
35260
- "bookshelfList": "zE6uZW_bookshelfList",
35261
- "readerItemActive": "zE6uZW_readerItemActive",
35262
- "chapterFocus": "zE6uZW_chapterFocus",
35263
- "fieldLabel": "zE6uZW_fieldLabel",
35264
- "bookCardActions": "zE6uZW_bookCardActions",
35265
- "shelfStat": "zE6uZW_shelfStat",
35266
- "buttonDanger": "zE6uZW_buttonDanger",
35267
- "badgeWritten": "zE6uZW_badgeWritten",
35268
- "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
35269
- "toolStepIcon": "zE6uZW_toolStepIcon",
35270
- "dashFacts": "zE6uZW_dashFacts",
35271
- "outlineReadonly": "zE6uZW_outlineReadonly",
35272
- "assetStatDetail": "zE6uZW_assetStatDetail",
35273
- "readerItemNo": "zE6uZW_readerItemNo",
35274
- "readerGroupArrow": "zE6uZW_readerGroupArrow",
35319
+ "progressTotalBar": "zE6uZW_progressTotalBar",
35320
+ "workflowLabel": "zE6uZW_workflowLabel",
35321
+ "navBadgePulse": "zE6uZW_navBadgePulse",
35322
+ "dimTitle": "zE6uZW_dimTitle",
35323
+ "navTabLabel": "zE6uZW_navTabLabel",
35324
+ "progressBookActive": "zE6uZW_progressBookActive",
35325
+ "readerItem": "zE6uZW_readerItem",
35326
+ "importPreviewList": "zE6uZW_importPreviewList",
35327
+ "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
35328
+ "diffAdd": "zE6uZW_diffAdd",
35275
35329
  "entry": "zE6uZW_entry",
35276
- "navTab": "zE6uZW_navTab",
35330
+ "dimCurrent": "zE6uZW_dimCurrent",
35331
+ "outlineReadonly": "zE6uZW_outlineReadonly",
35277
35332
  "bookCreateCard": "zE6uZW_bookCreateCard",
35278
- "chapterNum": "zE6uZW_chapterNum",
35279
- "reviewBox": "zE6uZW_reviewBox",
35280
- "bookCardName": "zE6uZW_bookCardName",
35281
- "bookSwitchName": "zE6uZW_bookSwitchName",
35282
- "chapterList": "zE6uZW_chapterList",
35333
+ "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
35334
+ "assetGrid": "zE6uZW_assetGrid",
35335
+ "workflowDotActive": "zE6uZW_workflowDotActive",
35336
+ "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
35337
+ "dashStageCurrent": "zE6uZW_dashStageCurrent",
35338
+ "bookAddCard": "zE6uZW_bookAddCard",
35339
+ "readerItemBadge": "zE6uZW_readerItemBadge",
35340
+ "navAbout": "zE6uZW_navAbout",
35341
+ "toolSteps": "zE6uZW_toolSteps",
35342
+ "diffList": "zE6uZW_diffList",
35343
+ "assistantFloatBody": "zE6uZW_assistantFloatBody",
35283
35344
  "toolStepError": "zE6uZW_toolStepError",
35284
- "dashJourney": "zE6uZW_dashJourney",
35285
- "busyRow": "zE6uZW_busyRow",
35286
- "navTabBadge": "zE6uZW_navTabBadge",
35287
- "tlBar": "zE6uZW_tlBar",
35288
- "tlSegDone": "zE6uZW_tlSegDone",
35289
- "todoDanger": "zE6uZW_todoDanger",
35290
- "navActions": "zE6uZW_navActions",
35291
- "toolStepDetail": "zE6uZW_toolStepDetail",
35292
- "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
35293
- "panelNav": "zE6uZW_panelNav",
35294
- "onlyChanges": "zE6uZW_onlyChanges",
35345
+ "dashJourneyBar": "zE6uZW_dashJourneyBar",
35295
35346
  "card": "zE6uZW_card",
35296
- "dashJourneyFill": "zE6uZW_dashJourneyFill",
35297
- "navAboutUpdate": "zE6uZW_navAboutUpdate",
35298
- "wsSelectedText": "zE6uZW_wsSelectedText",
35299
- "wsPreviewText": "zE6uZW_wsPreviewText",
35300
- "progressLineDone": "zE6uZW_progressLineDone",
35301
- "iconButton": "zE6uZW_iconButton",
35302
- "readerFoot": "zE6uZW_readerFoot",
35303
- "importModalActions": "zE6uZW_importModalActions",
35304
- "badgeRejected": "zE6uZW_badgeRejected",
35305
- "chatRole": "zE6uZW_chatRole",
35306
- "navAbout": "zE6uZW_navAbout",
35307
- "navTabLabel": "zE6uZW_navTabLabel",
35308
- "dropzoneActive": "zE6uZW_dropzoneActive",
35309
- "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
35310
- "importModalOverlay": "zE6uZW_importModalOverlay",
35311
- "spaceBetween": "zE6uZW_spaceBetween",
35312
- "volumeGroup": "zE6uZW_volumeGroup",
35313
- "bookChipActive": "zE6uZW_bookChipActive",
35314
- "workflowDotActive": "zE6uZW_workflowDotActive",
35315
- "importError": "zE6uZW_importError",
35316
- "ideaCard": "zE6uZW_ideaCard",
35317
- "statCardDDown": "zE6uZW_statCardDDown",
35318
- "shelfToolbar": "zE6uZW_shelfToolbar",
35319
- "bookChip": "zE6uZW_bookChip",
35320
- "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
35321
- "readerArticle": "zE6uZW_readerArticle",
35322
- "importModal": "zE6uZW_importModal",
35323
- "badgeDone": "zE6uZW_badgeDone",
35324
- "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
35347
+ "authorPageBody": "zE6uZW_authorPageBody",
35348
+ "dashJourney": "zE6uZW_dashJourney",
35325
35349
  "diffSame": "zE6uZW_diffSame",
35326
- "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
35327
- "bookCardBody": "zE6uZW_bookCardBody",
35328
- "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
35329
- "input": "zE6uZW_input",
35330
- "workflowDot": "zE6uZW_workflowDot",
35331
- "workflowBody": "zE6uZW_workflowBody",
35332
- "navBadgePulse": "zE6uZW_navBadgePulse",
35333
- "importResult": "zE6uZW_importResult",
35334
- "bookAddCard": "zE6uZW_bookAddCard",
35335
- "dashGrid": "zE6uZW_dashGrid",
35336
- "assistantResize": "zE6uZW_assistantResize",
35337
- "diffText": "zE6uZW_diffText",
35338
- "bookCard": "zE6uZW_bookCard",
35339
- "progressLineLive": "zE6uZW_progressLineLive",
35340
- "readerError": "zE6uZW_readerError",
35341
- "diffColumn": "zE6uZW_diffColumn",
35342
- "shelfSearch": "zE6uZW_shelfSearch",
35343
- "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
35344
- "readerSidebar": "zE6uZW_readerSidebar",
35345
- "statCardDValue": "zE6uZW_statCardDValue",
35346
- "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
35350
+ "importModalBody": "zE6uZW_importModalBody",
35351
+ "chapter": "zE6uZW_chapter",
35352
+ "readerMain": "zE6uZW_readerMain",
35353
+ "wsPreviewText": "zE6uZW_wsPreviewText",
35354
+ "readerGroupCount": "zE6uZW_readerGroupCount",
35355
+ "bookshelfLabel": "zE6uZW_bookshelfLabel",
35356
+ "navTitle": "zE6uZW_navTitle",
35357
+ "badgePending": "zE6uZW_badgePending",
35358
+ "navTitleBook": "zE6uZW_navTitleBook",
35359
+ "statCardD": "zE6uZW_statCardD",
35347
35360
  "progress": "zE6uZW_progress",
35348
- "switchOn": "zE6uZW_switchOn",
35361
+ "bookCardActive": "zE6uZW_bookCardActive",
35362
+ "bookChipName": "zE6uZW_bookChipName",
35363
+ "progressBarFill": "zE6uZW_progressBarFill",
35364
+ "chatScroll": "zE6uZW_chatScroll",
35365
+ "assetFilterChip": "zE6uZW_assetFilterChip",
35366
+ "buttonSmall": "zE6uZW_buttonSmall",
35349
35367
  "chapterPreview": "zE6uZW_chapterPreview",
35350
- "cardTitle": "zE6uZW_cardTitle",
35351
- "badgeError": "zE6uZW_badgeError",
35352
- "tabBar": "zE6uZW_tabBar",
35353
- "dashHero": "zE6uZW_dashHero",
35354
- "dropzoneIcon": "zE6uZW_dropzoneIcon",
35355
- "importModalHead": "zE6uZW_importModalHead",
35356
- "wsSelected": "zE6uZW_wsSelected",
35357
- "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
35358
- "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
35359
- "coverPlaceholder": "zE6uZW_coverPlaceholder",
35360
35368
  "dashHeroAction": "zE6uZW_dashHeroAction",
35361
- "chapterFocusPulse": "zE6uZW_chapterFocusPulse",
35362
- "wsEditor": "zE6uZW_wsEditor",
35363
- "diffList": "zE6uZW_diffList",
35364
- "workflowLabel": "zE6uZW_workflowLabel",
35365
- "workflowHint": "zE6uZW_workflowHint",
35366
- "field": "zE6uZW_field",
35367
- "panelContent": "zE6uZW_panelContent",
35368
- "navGroupLabel": "zE6uZW_navGroupLabel",
35369
- "shelfHeader": "zE6uZW_shelfHeader",
35370
- "readerPara": "zE6uZW_readerPara",
35371
- "assistantStatus": "zE6uZW_assistantStatus",
35372
- "bookSwitchCover": "zE6uZW_bookSwitchCover",
35373
- "bookChipRemove": "zE6uZW_bookChipRemove",
35374
35369
  "shelfEmpty": "zE6uZW_shelfEmpty",
35375
- "chapter": "zE6uZW_chapter",
35376
- "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
35377
- "dashStageDone": "zE6uZW_dashStageDone",
35378
- "legendOld": "zE6uZW_legendOld",
35379
- "progressBar": "zE6uZW_progressBar",
35380
- "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
35381
- "diffTagNew": "zE6uZW_diffTagNew",
35382
- "bookSwitch": "zE6uZW_bookSwitch",
35383
- "readerGroup": "zE6uZW_readerGroup",
35384
- "bookCardActive": "zE6uZW_bookCardActive",
35385
- "volumeGroupHeader": "zE6uZW_volumeGroupHeader",
35370
+ "authorRailTitle": "zE6uZW_authorRailTitle",
35386
35371
  "toolStepName": "zE6uZW_toolStepName",
35387
- "tab": "zE6uZW_tab",
35388
- "shelfView": "zE6uZW_shelfView",
35389
- "genreDesc": "zE6uZW_genreDesc",
35390
- "readerText": "zE6uZW_readerText",
35391
- "helpTip": "zE6uZW_helpTip",
35392
- "switchKnob": "zE6uZW_switchKnob",
35393
- "wsPage": "zE6uZW_wsPage",
35394
- "diffTagOld": "zE6uZW_diffTagOld",
35395
- "statRowD": "zE6uZW_statRowD",
35396
- "navActionBtn": "zE6uZW_navActionBtn",
35372
+ "assetGroupHeader": "zE6uZW_assetGroupHeader",
35373
+ "bookCardBody": "zE6uZW_bookCardBody",
35374
+ "dashStageDone": "zE6uZW_dashStageDone",
35375
+ "progressBookFill": "zE6uZW_progressBookFill",
35376
+ "bookCard": "zE6uZW_bookCard",
35377
+ "ideaCard": "zE6uZW_ideaCard",
35378
+ "dropzoneActive": "zE6uZW_dropzoneActive",
35379
+ "statCardDValue": "zE6uZW_statCardDValue",
35380
+ "badge": "zE6uZW_badge",
35381
+ "bookCardProgressBar": "zE6uZW_bookCardProgressBar",
35382
+ "shelfSearch": "zE6uZW_shelfSearch",
35383
+ "bookChipRemove": "zE6uZW_bookChipRemove",
35384
+ "input": "zE6uZW_input",
35385
+ "bookChipMeta": "zE6uZW_bookChipMeta",
35386
+ "navTabBadge": "zE6uZW_navTabBadge",
35387
+ "assetStatValue": "zE6uZW_assetStatValue",
35388
+ "dashHeroBook": "zE6uZW_dashHeroBook",
35389
+ "adaptTable": "zE6uZW_adaptTable",
35390
+ "workflowHint": "zE6uZW_workflowHint",
35391
+ "navGroupSep": "zE6uZW_navGroupSep",
35392
+ "diffColumn": "zE6uZW_diffColumn",
35393
+ "importModal": "zE6uZW_importModal",
35394
+ "adaptOutlinePre": "zE6uZW_adaptOutlinePre",
35395
+ "chatBubbleAssistant": "zE6uZW_chatBubbleAssistant",
35396
+ "importResult": "zE6uZW_importResult",
35397
+ "readerView": "zE6uZW_readerView",
35398
+ "tlSegTrack": "zE6uZW_tlSegTrack",
35399
+ "panelNavCollapsed": "zE6uZW_panelNavCollapsed",
35397
35400
  "progressLine": "zE6uZW_progressLine",
35398
- "navTitleBook": "zE6uZW_navTitleBook",
35401
+ "buttonPrimary": "zE6uZW_buttonPrimary",
35402
+ "tab": "zE6uZW_tab",
35403
+ "navTabBadgeWarn": "zE6uZW_navTabBadgeWarn",
35404
+ "workflowDotDone": "zE6uZW_workflowDotDone",
35399
35405
  "navGroup": "zE6uZW_navGroup",
35400
- "todoWarning": "zE6uZW_todoWarning",
35401
- "readerChapterTitle": "zE6uZW_readerChapterTitle",
35402
- "importPreviewList": "zE6uZW_importPreviewList",
35403
- "row": "zE6uZW_row",
35404
- "bookCardCover": "zE6uZW_bookCardCover",
35405
- "assetStatValue": "zE6uZW_assetStatValue",
35406
- "bookChipName": "zE6uZW_bookChipName",
35407
- "toolStepStatus": "zE6uZW_toolStepStatus",
35408
- "diffDel": "zE6uZW_diffDel",
35409
- "workflowRow": "zE6uZW_workflowRow",
35410
- "buttonSmall": "zE6uZW_buttonSmall",
35411
- "diffAdd": "zE6uZW_diffAdd",
35412
- "assetStat": "zE6uZW_assetStat",
35413
- "todoItem": "zE6uZW_todoItem",
35414
- "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
35415
- "importField": "zE6uZW_importField",
35416
- "settingsCard": "zE6uZW_settingsCard",
35406
+ "badgeGenerating": "zE6uZW_badgeGenerating",
35407
+ "assetFilterBar": "zE6uZW_assetFilterBar",
35408
+ "shelfEmptyTitle": "zE6uZW_shelfEmptyTitle",
35409
+ "textarea": "zE6uZW_textarea",
35410
+ "readerError": "zE6uZW_readerError",
35411
+ "shelfStat": "zE6uZW_shelfStat",
35412
+ "authorPageHero": "zE6uZW_authorPageHero",
35413
+ "fileList": "zE6uZW_fileList",
35414
+ "readerSidebar": "zE6uZW_readerSidebar",
35415
+ "importModalOverlay": "zE6uZW_importModalOverlay",
35416
+ "navActionBtn": "zE6uZW_navActionBtn",
35417
+ "statCardDIconRed": "zE6uZW_statCardDIconRed",
35418
+ "assetCardName": "zE6uZW_assetCardName",
35419
+ "navTitleName": "zE6uZW_navTitleName",
35420
+ "assistantFloat": "zE6uZW_assistantFloat",
35417
35421
  "entryIcon": "zE6uZW_entryIcon",
35418
- "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
35419
- "bookshelfLabel": "zE6uZW_bookshelfLabel",
35420
- "chatScroll": "zE6uZW_chatScroll",
35422
+ "chapterNum": "zE6uZW_chapterNum",
35423
+ "readerGroupArrow": "zE6uZW_readerGroupArrow",
35424
+ "assetTextarea": "zE6uZW_assetTextarea",
35425
+ "createBookTop": "zE6uZW_createBookTop",
35426
+ "switch": "zE6uZW_switch",
35427
+ "tlSegFill": "zE6uZW_tlSegFill",
35421
35428
  "dashStage": "zE6uZW_dashStage",
35429
+ "busyRow": "zE6uZW_busyRow",
35430
+ "dashFact": "zE6uZW_dashFact",
35431
+ "diffDel": "zE6uZW_diffDel",
35432
+ "readerSegBtn": "zE6uZW_readerSegBtn",
35433
+ "button": "zE6uZW_button",
35434
+ "chapterMain": "zE6uZW_chapterMain",
35435
+ "dashHero": "zE6uZW_dashHero",
35436
+ "assetCardFooter": "zE6uZW_assetCardFooter",
35422
35437
  "shelfFilters": "zE6uZW_shelfFilters",
35423
- "bookCreateForm": "zE6uZW_bookCreateForm",
35424
- "progressLineError": "zE6uZW_progressLineError",
35425
- "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
35426
- "chapterActions": "zE6uZW_chapterActions",
35427
- "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
35428
- "dashHeroEyebrow": "zE6uZW_dashHeroEyebrow",
35429
- "shelfTitleRow": "zE6uZW_shelfTitleRow",
35430
- "pulse": "zE6uZW_pulse",
35431
- "bigProgressBar": "zE6uZW_bigProgressBar",
35432
- "progressBarFill": "zE6uZW_progressBarFill",
35433
- "readerSeg": "zE6uZW_readerSeg",
35434
- "diffSameBody": "zE6uZW_diffSameBody",
35435
- "statCardD": "zE6uZW_statCardD",
35436
- "bookshelf": "zE6uZW_bookshelf",
35437
- "diffOld": "zE6uZW_diffOld",
35438
- "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
35438
+ "dimCardHead": "zE6uZW_dimCardHead",
35439
+ "navSpacer": "zE6uZW_navSpacer",
35440
+ "wsSelected": "zE6uZW_wsSelected",
35441
+ "toolStepStatus": "zE6uZW_toolStepStatus",
35442
+ "rowEnd": "zE6uZW_rowEnd",
35443
+ "dimCardSelected": "zE6uZW_dimCardSelected",
35444
+ "createBookIcon": "zE6uZW_createBookIcon",
35445
+ "readerChapterMeta": "zE6uZW_readerChapterMeta",
35446
+ "bookCardBlurb": "zE6uZW_bookCardBlurb",
35447
+ "helpTipText": "zE6uZW_helpTipText",
35448
+ "bookAddIcon": "zE6uZW_bookAddIcon",
35449
+ "tlSegCurrent": "zE6uZW_tlSegCurrent",
35439
35450
  "readerSegActive": "zE6uZW_readerSegActive",
35440
- "readerHeader": "zE6uZW_readerHeader",
35441
- "todoInfo": "zE6uZW_todoInfo",
35442
- "button": "zE6uZW_button",
35443
- "liveText": "zE6uZW_liveText",
35444
- "panelTitle": "zE6uZW_panelTitle",
35445
- "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
35446
- "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
35447
- "shelfHero": "zE6uZW_shelfHero",
35448
- "navTabIcon": "zE6uZW_navTabIcon",
35451
+ "createBookView": "zE6uZW_createBookView",
35452
+ "dashHeroTitle": "zE6uZW_dashHeroTitle",
35453
+ "navAboutRow": "zE6uZW_navAboutRow",
35454
+ "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
35455
+ "coverPreview": "zE6uZW_coverPreview",
35456
+ "panelContent": "zE6uZW_panelContent",
35457
+ "onlyChanges": "zE6uZW_onlyChanges",
35458
+ "adaptProposal": "zE6uZW_adaptProposal",
35459
+ "wsEditor": "zE6uZW_wsEditor",
35449
35460
  "fadeIn": "zE6uZW_fadeIn",
35461
+ "dashStageDot": "zE6uZW_dashStageDot",
35462
+ "assetGroup": "zE6uZW_assetGroup",
35463
+ "adaptImpact": "zE6uZW_adaptImpact",
35464
+ "dropzone": "zE6uZW_dropzone",
35465
+ "importError": "zE6uZW_importError",
35466
+ "navTabIcon": "zE6uZW_navTabIcon",
35467
+ "wsSelectedText": "zE6uZW_wsSelectedText",
35468
+ "bookSwitchCover": "zE6uZW_bookSwitchCover",
35450
35469
  "tlSegTodo": "zE6uZW_tlSegTodo",
35451
- "tlSegTrack": "zE6uZW_tlSegTrack",
35452
- "dashHeroBook": "zE6uZW_dashHeroBook",
35453
- "readerItemTitle": "zE6uZW_readerItemTitle",
35470
+ "workflowList": "zE6uZW_workflowList",
35471
+ "adaptImpacts": "zE6uZW_adaptImpacts",
35472
+ "volumeGroup": "zE6uZW_volumeGroup",
35473
+ "shelfStats": "zE6uZW_shelfStats",
35474
+ "ideaCandidate": "zE6uZW_ideaCandidate",
35475
+ "chatBubbleUser": "zE6uZW_chatBubbleUser",
35476
+ "readerItemNo": "zE6uZW_readerItemNo",
35477
+ "bookCardCover": "zE6uZW_bookCardCover",
35478
+ "bookshelfList": "zE6uZW_bookshelfList",
35479
+ "row": "zE6uZW_row",
35480
+ "dashFacts": "zE6uZW_dashFacts",
35481
+ "chapterFocus": "zE6uZW_chapterFocus",
35482
+ "diffChange": "zE6uZW_diffChange",
35483
+ "todoDanger": "zE6uZW_todoDanger",
35484
+ "panel": "zE6uZW_panel",
35485
+ "bookSwitch": "zE6uZW_bookSwitch",
35486
+ "badgeError": "zE6uZW_badgeError",
35487
+ "wsPageHeader": "zE6uZW_wsPageHeader",
35488
+ "assistantResize": "zE6uZW_assistantResize",
35489
+ "coverPlaceholder": "zE6uZW_coverPlaceholder",
35490
+ "readerGroup": "zE6uZW_readerGroup",
35491
+ "readerGroupTitle": "zE6uZW_readerGroupTitle",
35492
+ "readerFoot": "zE6uZW_readerFoot",
35493
+ "readerLoading": "zE6uZW_readerLoading",
35454
35494
  "shelfFilter": "zE6uZW_shelfFilter",
35455
- "navAboutRow": "zE6uZW_navAboutRow",
35456
- "fileList": "zE6uZW_fileList",
35457
- "volumeGroupToggle": "zE6uZW_volumeGroupToggle",
35458
- "dashStageCurrent": "zE6uZW_dashStageCurrent",
35459
- "createBookCard": "zE6uZW_createBookCard",
35460
- "readerView": "zE6uZW_readerView",
35461
- "buttonPrimary": "zE6uZW_buttonPrimary",
35462
- "tlSegFill": "zE6uZW_tlSegFill",
35495
+ "authorRailBtn": "zE6uZW_authorRailBtn",
35496
+ "assetFilterChipActive": "zE6uZW_assetFilterChipActive",
35497
+ "assetCardContent": "zE6uZW_assetCardContent",
35498
+ "toolStepDetail": "zE6uZW_toolStepDetail",
35499
+ "progressOverviewNum": "zE6uZW_progressOverviewNum",
35500
+ "bookCardName": "zE6uZW_bookCardName",
35501
+ "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
35502
+ "todoItem": "zE6uZW_todoItem",
35503
+ "panelTitle": "zE6uZW_panelTitle",
35504
+ "legendOld": "zE6uZW_legendOld",
35505
+ "dashHeroActionTitle": "zE6uZW_dashHeroActionTitle",
35506
+ "tlSegDone": "zE6uZW_tlSegDone",
35507
+ "dimEdit": "zE6uZW_dimEdit",
35508
+ "shelfGrid": "zE6uZW_shelfGrid",
35509
+ "assetCardTop": "zE6uZW_assetCardTop",
35510
+ "authorRailBtnActive": "zE6uZW_authorRailBtnActive",
35511
+ "iconBtn": "zE6uZW_iconBtn",
35512
+ "iconButton": "zE6uZW_iconButton",
35513
+ "workflowDot": "zE6uZW_workflowDot",
35514
+ "bookCardCoverTitle": "zE6uZW_bookCardCoverTitle",
35515
+ "readerSeg": "zE6uZW_readerSeg",
35516
+ "diffTagNew": "zE6uZW_diffTagNew",
35517
+ "importHint": "zE6uZW_importHint",
35518
+ "switchOn": "zE6uZW_switchOn",
35519
+ "bookAdd": "zE6uZW_bookAdd",
35520
+ "progressLive": "zE6uZW_progressLive",
35521
+ "workflowRow": "zE6uZW_workflowRow",
35522
+ "progressBookBar": "zE6uZW_progressBookBar",
35523
+ "readerItemActive": "zE6uZW_readerItemActive",
35524
+ "readerPara": "zE6uZW_readerPara",
35525
+ "workflowBody": "zE6uZW_workflowBody",
35526
+ "dashJourneyFill": "zE6uZW_dashJourneyFill",
35527
+ "reviewBox": "zE6uZW_reviewBox",
35528
+ "meta": "zE6uZW_meta",
35529
+ "authorPageHeader": "zE6uZW_authorPageHeader",
35530
+ "bookCardProgressFill": "zE6uZW_bookCardProgressFill",
35463
35531
  "importPreview": "zE6uZW_importPreview",
35464
- "dashHeroArrow": "zE6uZW_dashHeroArrow",
35465
- "textarea": "zE6uZW_textarea",
35466
- "diffNew": "zE6uZW_diffNew",
35467
- "bookCardBlurb": "zE6uZW_bookCardBlurb",
35468
- "toolStepActive": "zE6uZW_toolStepActive",
35469
- "chatBubbleUser": "zE6uZW_chatBubbleUser",
35470
- "switch": "zE6uZW_switch",
35471
- "chapterMain": "zE6uZW_chapterMain",
35472
- "readerChapterMeta": "zE6uZW_readerChapterMeta",
35473
- "shelfFilterCount": "zE6uZW_shelfFilterCount",
35474
- "navTitleName": "zE6uZW_navTitleName",
35475
- "assistantFloatBody": "zE6uZW_assistantFloatBody",
35476
- "navGroupSep": "zE6uZW_navGroupSep",
35477
- "ideaToggle": "zE6uZW_ideaToggle",
35478
- "entryLabel": "zE6uZW_entryLabel",
35532
+ "bookCardMetaRow": "zE6uZW_bookCardMetaRow",
35479
35533
  "statCardDDetail": "zE6uZW_statCardDDetail",
35480
- "toolLive": "zE6uZW_toolLive",
35481
- "wsColumns": "zE6uZW_wsColumns",
35482
- "tlSeg": "zE6uZW_tlSeg",
35483
- "importFileInfo": "zE6uZW_importFileInfo",
35484
- "shelfStatActive": "zE6uZW_shelfStatActive",
35485
- "badgeGenerating": "zE6uZW_badgeGenerating",
35486
- "bigProgressBarFill": "zE6uZW_bigProgressBarFill",
35534
+ "progressBookHead": "zE6uZW_progressBookHead",
35535
+ "assetKind": "zE6uZW_assetKind",
35536
+ "importModalTabs": "zE6uZW_importModalTabs",
35537
+ "statCardDUnit": "zE6uZW_statCardDUnit",
35538
+ "navTitleLogo": "zE6uZW_navTitleLogo",
35487
35539
  "bookCreateOutline": "zE6uZW_bookCreateOutline",
35488
- "shelfStats": "zE6uZW_shelfStats",
35489
- "workflowList": "zE6uZW_workflowList",
35490
- "legendNew": "zE6uZW_legendNew",
35540
+ "progressOverview": "zE6uZW_progressOverview",
35541
+ "shelfView": "zE6uZW_shelfView",
35542
+ "readerArticle": "zE6uZW_readerArticle",
35543
+ "field": "zE6uZW_field",
35544
+ "progressBookName": "zE6uZW_progressBookName",
35545
+ "chapterActions": "zE6uZW_chapterActions",
35546
+ "shelfEmptyIcon": "zE6uZW_shelfEmptyIcon",
35547
+ "importModalActions": "zE6uZW_importModalActions",
35548
+ "badgeRejected": "zE6uZW_badgeRejected",
35549
+ "createBookTitle": "zE6uZW_createBookTitle",
35550
+ "adaptOutline": "zE6uZW_adaptOutline",
35551
+ "liveText": "zE6uZW_liveText",
35552
+ "bookshelf": "zE6uZW_bookshelf",
35553
+ "navActions": "zE6uZW_navActions",
35554
+ "createBookCard": "zE6uZW_createBookCard",
35555
+ "readerItemTitle": "zE6uZW_readerItemTitle",
35556
+ "buttonDanger": "zE6uZW_buttonDanger",
35557
+ "badgeWritten": "zE6uZW_badgeWritten",
35558
+ "todoText": "zE6uZW_todoText",
35559
+ "adaptInputCard": "zE6uZW_adaptInputCard",
35560
+ "dashGrid": "zE6uZW_dashGrid",
35561
+ "wsPreview": "zE6uZW_wsPreview",
35562
+ "progressBar": "zE6uZW_progressBar",
35491
35563
  "readerBody": "zE6uZW_readerBody",
35492
- "readerGroupTitle": "zE6uZW_readerGroupTitle",
35493
- "dashJourneyStages": "zE6uZW_dashJourneyStages",
35494
- "panel": "zE6uZW_panel",
35495
- "wsColumn": "zE6uZW_wsColumn",
35496
- "tlSegLabel": "zE6uZW_tlSegLabel",
35497
- "shelfGrid": "zE6uZW_shelfGrid",
35498
- "navSpacer": "zE6uZW_navSpacer",
35564
+ "switchKnob": "zE6uZW_switchKnob",
35565
+ "navTabBadgeDanger": "zE6uZW_navTabBadgeDanger",
35566
+ "dashHeroActionBody": "zE6uZW_dashHeroActionBody",
35567
+ "bookSwitchName": "zE6uZW_bookSwitchName",
35568
+ "statRowD": "zE6uZW_statRowD",
35569
+ "diffTagOld": "zE6uZW_diffTagOld",
35570
+ "bookSwitchMeta": "zE6uZW_bookSwitchMeta",
35499
35571
  "chapterTitle": "zE6uZW_chapterTitle",
35500
- "ideaCandidate": "zE6uZW_ideaCandidate",
35501
- "readerGroupCount": "zE6uZW_readerGroupCount",
35502
- "readerSegBtn": "zE6uZW_readerSegBtn",
35503
- "importModalTabs": "zE6uZW_importModalTabs",
35504
- "importModalBody": "zE6uZW_importModalBody",
35505
- "statCardDLabel": "zE6uZW_statCardDLabel",
35506
- "bookChipMeta": "zE6uZW_bookChipMeta",
35572
+ "toolStep": "zE6uZW_toolStep",
35507
35573
  "assetStatLabel": "zE6uZW_assetStatLabel",
35508
- "dashJourneyBar": "zE6uZW_dashJourneyBar",
35509
- "readerItem": "zE6uZW_readerItem",
35510
- "toolSteps": "zE6uZW_toolSteps",
35511
- "dashHeroSparkle": "zE6uZW_dashHeroSparkle",
35512
- "assistantFloatHeader": "zE6uZW_assistantFloatHeader",
35513
- "diffLegend": "zE6uZW_diffLegend",
35514
- "diffChange": "zE6uZW_diffChange",
35515
- "createBookView": "zE6uZW_createBookView",
35516
- "badge": "zE6uZW_badge",
35574
+ "bigProgressBar": "zE6uZW_bigProgressBar",
35575
+ "assetGroups": "zE6uZW_assetGroups",
35576
+ "entryLabel": "zE6uZW_entryLabel",
35577
+ "authorHome": "zE6uZW_authorHome",
35578
+ "adaptResult": "zE6uZW_adaptResult",
35579
+ "progressTotalFill": "zE6uZW_progressTotalFill",
35580
+ "helpTip": "zE6uZW_helpTip",
35581
+ "ideaToggle": "zE6uZW_ideaToggle",
35582
+ "toolStepIcon": "zE6uZW_toolStepIcon",
35517
35583
  "shelfFilterActive": "zE6uZW_shelfFilterActive",
35518
- "createBookTop": "zE6uZW_createBookTop",
35519
- "panelBody": "zE6uZW_panelBody",
35520
- "tlSegCurrent": "zE6uZW_tlSegCurrent",
35521
- "dashStageDot": "zE6uZW_dashStageDot",
35584
+ "authorRailAbout": "zE6uZW_authorRailAbout",
35585
+ "settingsCard": "zE6uZW_settingsCard",
35586
+ "navTab": "zE6uZW_navTab",
35587
+ "assetEditor": "zE6uZW_assetEditor",
35588
+ "assetEditorRow": "zE6uZW_assetEditorRow",
35589
+ "diffText": "zE6uZW_diffText",
35590
+ "navTabBadgeDone": "zE6uZW_navTabBadgeDone",
35591
+ "progressOverviewCard": "zE6uZW_progressOverviewCard",
35592
+ "genreDesc": "zE6uZW_genreDesc",
35593
+ "wsPage": "zE6uZW_wsPage",
35594
+ "todoInfo": "zE6uZW_todoInfo",
35595
+ "readerChapterTitle": "zE6uZW_readerChapterTitle",
35596
+ "importFileInfo": "zE6uZW_importFileInfo",
35597
+ "tlBar": "zE6uZW_tlBar",
35598
+ "assistantStatusBusy": "zE6uZW_assistantStatusBusy",
35599
+ "tlSegLabel": "zE6uZW_tlSegLabel",
35522
35600
  "statCardDIcon": "zE6uZW_statCardDIcon",
35523
- "assistantFloat": "zE6uZW_assistantFloat",
35524
- "createBookIcon": "zE6uZW_createBookIcon",
35525
- "dashHeroTitle": "zE6uZW_dashHeroTitle"
35526
- };
35527
- //#endregion
35528
- //#region src/client/panel/AssistantTab.tsx
35529
- /**
35530
- * AI 助手(编辑老师):与 AI 编辑对话讨论剧情,助手通过动作指令直接修改
35531
- * 大纲 / 设定圣经 / 章节。流式渲染回复;工具调用显示为步骤卡片(中文名 +
35532
- * 状态 + 耗时),顶部状态条展示当前在做什么;支持清空对话记录。
35533
- */
35534
- /** 工具中文名 + 图标映射(作者看得懂)。 */
35535
- const TOOL_LABELS = {
35536
- book_overview: {
35537
- icon: "📖",
35538
- label: "读取全书上下文"
35539
- },
35540
- impact_analysis: {
35541
- icon: "🔗",
35542
- label: "影响分析"
35601
+ "chatRole": "zE6uZW_chatRole",
35602
+ "toolLive": "zE6uZW_toolLive",
35603
+ "dropzoneIcon": "zE6uZW_dropzoneIcon",
35604
+ "progressBook": "zE6uZW_progressBook",
35605
+ "bookSwitchArrow": "zE6uZW_bookSwitchArrow",
35606
+ "readerText": "zE6uZW_readerText",
35607
+ "readerHeader": "zE6uZW_readerHeader",
35608
+ "adaptMatrix": "zE6uZW_adaptMatrix",
35609
+ "badgeDone": "zE6uZW_badgeDone",
35610
+ "fieldLabel": "zE6uZW_fieldLabel",
35611
+ "toolStepActive": "zE6uZW_toolStepActive",
35612
+ "legendNew": "zE6uZW_legendNew",
35613
+ "assetLabel": "zE6uZW_assetLabel",
35614
+ "cardTitle": "zE6uZW_cardTitle",
35615
+ "shelfToolbar": "zE6uZW_shelfToolbar",
35616
+ "bookCardCoverFallback": "zE6uZW_bookCardCoverFallback",
35617
+ "bookCardTitleRow": "zE6uZW_bookCardTitleRow",
35618
+ "progressLineDone": "zE6uZW_progressLineDone",
35619
+ "importField": "zE6uZW_importField",
35620
+ "adaptTextarea": "zE6uZW_adaptTextarea",
35621
+ "statCardDDown": "zE6uZW_statCardDDown",
35622
+ "assetCard": "zE6uZW_assetCard",
35623
+ "readerTitle": "zE6uZW_readerTitle",
35624
+ "shelfFilterCount": "zE6uZW_shelfFilterCount",
35625
+ "assistantStatus": "zE6uZW_assistantStatus",
35626
+ "shelfTitleRow": "zE6uZW_shelfTitleRow",
35627
+ "progressLineLive": "zE6uZW_progressLineLive",
35628
+ "dashJourneyStages": "zE6uZW_dashJourneyStages",
35629
+ "statCardDLabel": "zE6uZW_statCardDLabel",
35630
+ "bookChipActive": "zE6uZW_bookChipActive",
35631
+ "chapterBeats": "zE6uZW_chapterBeats",
35632
+ "assetStatDetail": "zE6uZW_assetStatDetail",
35633
+ "pulse": "zE6uZW_pulse",
35634
+ "navTabBadgeLive": "zE6uZW_navTabBadgeLive",
35635
+ "shelfHeader": "zE6uZW_shelfHeader",
35636
+ "bookCreateForm": "zE6uZW_bookCreateForm",
35637
+ "bookCardActions": "zE6uZW_bookCardActions",
35638
+ "progressLineError": "zE6uZW_progressLineError",
35639
+ "noticeError": "zE6uZW_noticeError",
35640
+ "tabBar": "zE6uZW_tabBar",
35641
+ "diffNew": "zE6uZW_diffNew",
35642
+ "progressBookList": "zE6uZW_progressBookList",
35643
+ "navGroupLabel": "zE6uZW_navGroupLabel",
35644
+ "chapterList": "zE6uZW_chapterList",
35645
+ "authorContent": "zE6uZW_authorContent",
35646
+ "diffOld": "zE6uZW_diffOld",
35647
+ "wsAppliedBanner": "zE6uZW_wsAppliedBanner",
35648
+ "wsColumn": "zE6uZW_wsColumn"
35649
+ };
35650
+ //#endregion
35651
+ //#region src/client/panel/AssistantTab.tsx
35652
+ /**
35653
+ * AI 助手(编辑老师):与 AI 编辑对话讨论剧情,助手通过动作指令直接修改
35654
+ * 大纲 / 设定圣经 / 章节。流式渲染回复;工具调用显示为步骤卡片(中文名 +
35655
+ * 状态 + 耗时),顶部状态条展示当前在做什么;支持清空对话记录。
35656
+ */
35657
+ /** 工具中文名 + 图标映射(作者看得懂)。 */
35658
+ const TOOL_LABELS = {
35659
+ book_overview: {
35660
+ icon: "📖",
35661
+ label: "读取全书上下文"
35662
+ },
35663
+ impact_analysis: {
35664
+ icon: "🔗",
35665
+ label: "影响分析"
35543
35666
  },
35544
35667
  outline_text: {
35545
35668
  icon: "📄",
@@ -36716,410 +36839,2803 @@ window.__ModuleLoader__.load({
36716
36839
  }, `${rule.name}-${index}`))]
36717
36840
  }),
36718
36841
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36719
- className: panel_module_css_default.row,
36720
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36842
+ className: panel_module_css_default.row,
36843
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36844
+ className: panel_module_css_default.input,
36845
+ style: { flex: 1 },
36846
+ placeholder: "新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)",
36847
+ value: newRule,
36848
+ onChange: (e) => {
36849
+ setNewRule(e.target.value);
36850
+ }
36851
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36852
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
36853
+ disabled: busy || newRule.trim() === "",
36854
+ onClick: () => {
36855
+ handleAddRule();
36856
+ },
36857
+ children: "+ 添加"
36858
+ })]
36859
+ })
36860
+ ]
36861
+ }),
36862
+ assetTab === "style" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36863
+ className: panel_module_css_default.card,
36864
+ children: [
36865
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36866
+ className: panel_module_css_default.cardTitle,
36867
+ children: "心法"
36868
+ }),
36869
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36870
+ className: panel_module_css_default.meta,
36871
+ children: "粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。"
36872
+ }),
36873
+ assets.styleAssets.map((style) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36874
+ style: {
36875
+ border: "1px solid var(--nf-border)",
36876
+ borderRadius: "var(--nf-radius-6)",
36877
+ padding: "var(--nf-space-6) var(--nf-space-10)",
36878
+ fontSize: "var(--nf-fs-12)"
36879
+ },
36880
+ children: [
36881
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: style.name }),
36882
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36883
+ className: panel_module_css_default.meta,
36884
+ children: ["叙述:", style.proseRules.slice(0, 3).join(";")]
36885
+ }),
36886
+ style.dialogueRules.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36887
+ className: panel_module_css_default.meta,
36888
+ children: ["台词:", style.dialogueRules.slice(0, 2).join(";")]
36889
+ })
36890
+ ]
36891
+ }, style.name)),
36892
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
36893
+ className: panel_module_css_default.textarea,
36894
+ style: { minHeight: 90 },
36895
+ placeholder: "粘贴样本文本(一段能代表目标风格的文字,50 字以上)…",
36896
+ value: sampleText,
36897
+ onChange: (e) => {
36898
+ setSampleText(e.target.value);
36899
+ }
36900
+ }),
36901
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36902
+ className: panel_module_css_default.row,
36903
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36904
+ className: panel_module_css_default.input,
36905
+ style: { flex: 1 },
36906
+ placeholder: "写法资产名(可选)",
36907
+ value: styleName,
36908
+ onChange: (e) => {
36909
+ setStyleName(e.target.value);
36910
+ }
36911
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36912
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
36913
+ disabled: busy || sampleText.trim().length < 50,
36914
+ onClick: () => {
36915
+ handleExtractStyle();
36916
+ },
36917
+ children: "提取并绑定"
36918
+ })]
36919
+ })
36920
+ ]
36921
+ })
36922
+ ]
36923
+ });
36924
+ }
36925
+ //#endregion
36926
+ //#region src/client/panel/ShelfView.tsx
36927
+ /**
36928
+ * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。
36929
+ * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。
36930
+ */
36931
+ /** 相对时间(人性化:刚刚 / N 分钟前 / N 小时前 / N 天前 / 日期)。 */
36932
+ function relativeTime$1(iso) {
36933
+ const t = new Date(iso).getTime();
36934
+ if (!Number.isFinite(t)) return "—";
36935
+ const diff = Date.now() - t;
36936
+ if (diff < 6e4) return "刚刚";
36937
+ if (diff < 36e5) return `${Math.floor(diff / 6e4)} 分钟前`;
36938
+ if (diff < 864e5) return `${Math.floor(diff / 36e5)} 小时前`;
36939
+ if (diff < 7 * 864e5) return `${Math.floor(diff / 864e5)} 天前`;
36940
+ return new Date(t).toLocaleDateString("zh-CN", {
36941
+ month: "numeric",
36942
+ day: "numeric"
36943
+ });
36944
+ }
36945
+ /** 一本书的状态标签。 */
36946
+ function bookStatus$1(book) {
36947
+ if (!book.hasProject) return "none";
36948
+ return book.total > 0 && book.done >= book.total ? "done" : "active";
36949
+ }
36950
+ /** 一张书卡(封面懒加载)。 */
36951
+ function BookCard({ api, book, active, onOpen, onRead }) {
36952
+ const [cover, setCover] = (0, react.useState)(null);
36953
+ (0, react.useEffect)(() => {
36954
+ if (!book.hasCover) return;
36955
+ let cancelled = false;
36956
+ api.coverGet(book.outputDir).then((result) => {
36957
+ if (!cancelled) setCover(result.dataUrl);
36958
+ }).catch(() => {});
36959
+ return () => {
36960
+ cancelled = true;
36961
+ };
36962
+ }, [
36963
+ api,
36964
+ book.hasCover,
36965
+ book.outputDir
36966
+ ]);
36967
+ const ratio = book.total > 0 ? Math.min(book.done / book.total, 1) : 0;
36968
+ const status = bookStatus$1(book);
36969
+ const statusLabel = status === "none" ? "未开书" : status === "done" ? "已完结" : "进行中";
36970
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36971
+ className: `${panel_module_css_default.bookCard} ${active ? panel_module_css_default.bookCardActive : ""}`,
36972
+ onClick: onOpen,
36973
+ title: `打开《${book.bookName}》`,
36974
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36975
+ className: panel_module_css_default.bookCardCover,
36976
+ children: cover !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
36977
+ src: cover,
36978
+ alt: `《${book.bookName}》封面`
36979
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36980
+ className: panel_module_css_default.bookCardCoverFallback,
36981
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36982
+ className: panel_module_css_default.bookCardCoverTitle,
36983
+ children: book.bookName.slice(0, 4)
36984
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36985
+ className: panel_module_css_default.meta,
36986
+ children: "暂无封面"
36987
+ })]
36988
+ })
36989
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36990
+ className: panel_module_css_default.bookCardBody,
36991
+ children: [
36992
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36993
+ className: panel_module_css_default.bookCardTitleRow,
36994
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36995
+ className: panel_module_css_default.bookCardName,
36996
+ children: book.bookName
36997
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36998
+ className: `${panel_module_css_default.badge} ${status === "none" ? panel_module_css_default.badgePending : status === "done" ? panel_module_css_default.badgeDone : panel_module_css_default.badgeWritten}`,
36999
+ children: statusLabel
37000
+ })]
37001
+ }),
37002
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37003
+ className: `${panel_module_css_default.meta} ${panel_module_css_default.bookCardBlurb}`,
37004
+ title: book.blurb ?? "",
37005
+ children: book.blurb !== void 0 && book.blurb !== "" ? book.blurb : "暂无简介"
37006
+ }),
37007
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37008
+ className: panel_module_css_default.bookCardProgressBar,
37009
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37010
+ className: panel_module_css_default.bookCardProgressFill,
37011
+ style: { width: `${Math.round(ratio * 100)}%` }
37012
+ })
37013
+ }),
37014
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37015
+ className: panel_module_css_default.bookCardMetaRow,
37016
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37017
+ className: panel_module_css_default.meta,
37018
+ children: book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : "尚未规划章节"
37019
+ }), book.hasProject && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37020
+ className: panel_module_css_default.meta,
37021
+ title: "最近活动时间",
37022
+ children: ["更新于 ", relativeTime$1(book.updatedAt)]
37023
+ })]
37024
+ }),
37025
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37026
+ className: panel_module_css_default.bookCardActions,
37027
+ onClick: (e) => {
37028
+ e.stopPropagation();
37029
+ },
37030
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37031
+ type: "button",
37032
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
37033
+ onClick: onOpen,
37034
+ title: "进入创作工作台(大纲/章节/审稿/设定)",
37035
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PenLine, {
37036
+ size: 13,
37037
+ style: { verticalAlign: -2 }
37038
+ }), " 进入工作台"]
37039
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37040
+ type: "button",
37041
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
37042
+ disabled: !book.hasProject || book.done === 0,
37043
+ onClick: onRead,
37044
+ title: book.hasProject && book.done > 0 ? "沉浸式阅读已写章节" : "尚无已写章节,先去工作台创作",
37045
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, {
37046
+ size: 13,
37047
+ style: { verticalAlign: -2 }
37048
+ }), " 阅读"]
37049
+ })]
37050
+ })
37051
+ ]
37052
+ })]
37053
+ });
37054
+ }
37055
+ /** 书架首页。 */
37056
+ function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook }) {
37057
+ const [query, setQuery] = (0, react.useState)("");
37058
+ /** 筛选:all=全部 / active=进行中 / done=已完结 / none=未开书。 */
37059
+ const [filter, setFilter] = (0, react.useState)("all");
37060
+ const stats = (0, react.useMemo)(() => {
37061
+ let active = 0, done = 0, none = 0;
37062
+ for (const b of shelf.books) {
37063
+ const s = bookStatus$1(b);
37064
+ if (s === "none") none++;
37065
+ else if (s === "done") done++;
37066
+ else active++;
37067
+ }
37068
+ return {
37069
+ active,
37070
+ done,
37071
+ none
37072
+ };
37073
+ }, [shelf.books]);
37074
+ const visible = (0, react.useMemo)(() => {
37075
+ const q = query.trim().toLowerCase();
37076
+ return shelf.books.filter((b) => {
37077
+ if (filter !== "all" && bookStatus$1(b) !== filter) return false;
37078
+ if (q === "") return true;
37079
+ return b.bookName.toLowerCase().includes(q) || (b.blurb ?? "").toLowerCase().includes(q);
37080
+ });
37081
+ }, [
37082
+ shelf.books,
37083
+ query,
37084
+ filter
37085
+ ]);
37086
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37087
+ className: panel_module_css_default.shelfView,
37088
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37089
+ className: panel_module_css_default.shelfHero,
37090
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37091
+ className: panel_module_css_default.shelfTitleRow,
37092
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
37093
+ className: panel_module_css_default.panelTitle,
37094
+ style: { margin: 0 },
37095
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, {
37096
+ size: 20,
37097
+ style: { verticalAlign: -3 }
37098
+ }), " AI小说工坊 · 书架"]
37099
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
37100
+ className: `${panel_module_css_default.input} ${panel_module_css_default.shelfSearch}`,
37101
+ type: "search",
37102
+ placeholder: "🔍 搜索书名 / 简介…",
37103
+ value: query,
37104
+ onChange: (e) => {
37105
+ setQuery(e.target.value);
37106
+ }
37107
+ })]
37108
+ }), shelf.books.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37109
+ className: panel_module_css_default.shelfStats,
37110
+ children: [
37111
+ {
37112
+ id: "all",
37113
+ label: "总书数",
37114
+ value: shelf.books.length
37115
+ },
37116
+ {
37117
+ id: "active",
37118
+ label: "进行中",
37119
+ value: stats.active
37120
+ },
37121
+ {
37122
+ id: "done",
37123
+ label: "已完结",
37124
+ value: stats.done
37125
+ },
37126
+ {
37127
+ id: "none",
37128
+ label: "未开书",
37129
+ value: stats.none
37130
+ }
37131
+ ].map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37132
+ className: `${panel_module_css_default.shelfStat} ${filter === s.id ? panel_module_css_default.shelfStatActive : ""}`,
37133
+ title: s.id === "all" ? "显示全部书籍" : `只看「${s.label}」的书(再点一次取消筛选)`,
37134
+ onClick: () => {
37135
+ setFilter((prev) => prev === s.id ? "all" : s.id);
37136
+ },
37137
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: s.value }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: s.label })]
37138
+ }, s.id))
37139
+ })]
37140
+ }), shelf.books.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37141
+ className: panel_module_css_default.shelfEmpty,
37142
+ children: [
37143
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37144
+ className: panel_module_css_default.shelfEmptyIcon,
37145
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 34 })
37146
+ }),
37147
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37148
+ className: panel_module_css_default.shelfEmptyTitle,
37149
+ children: "你的创作从这里开始"
37150
+ }),
37151
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37152
+ className: panel_module_css_default.meta,
37153
+ children: "开一本书:粘贴大纲或导入 docx,书名自动识别,开书即建项目"
37154
+ }),
37155
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
37156
+ type: "button",
37157
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
37158
+ onClick: onAddBook,
37159
+ children: "+ 开第一本书"
37160
+ }),
37161
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
37162
+ type: "button",
37163
+ className: `${panel_module_css_default.button}`,
37164
+ onClick: onImportBook,
37165
+ children: "📥 导入已有小说"
37166
+ })
37167
+ ]
37168
+ }) : visible.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37169
+ className: panel_module_css_default.shelfEmpty,
37170
+ style: { minHeight: 160 },
37171
+ children: [
37172
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37173
+ className: panel_module_css_default.shelfEmptyIcon,
37174
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Search, { size: 34 })
37175
+ }),
37176
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37177
+ className: panel_module_css_default.shelfEmptyTitle,
37178
+ children: "没有符合条件的书"
37179
+ }),
37180
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37181
+ className: panel_module_css_default.meta,
37182
+ children: "换个关键词或筛选条件试试"
37183
+ })
37184
+ ]
37185
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37186
+ className: panel_module_css_default.shelfGrid,
37187
+ children: [
37188
+ visible.map((book) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BookCard, {
37189
+ api,
37190
+ book,
37191
+ active: book.id === shelf.activeBookId,
37192
+ onOpen: () => {
37193
+ onOpenBook(book.id);
37194
+ },
37195
+ onRead: () => {
37196
+ onReadBook(book.id);
37197
+ }
37198
+ }, book.id)),
37199
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37200
+ className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
37201
+ onClick: onAddBook,
37202
+ role: "button",
37203
+ tabIndex: 0,
37204
+ "aria-label": "开一本新书",
37205
+ onKeyDown: (e) => {
37206
+ if (e.key === "Enter" || e.key === " ") {
37207
+ e.preventDefault();
37208
+ onAddBook();
37209
+ }
37210
+ },
37211
+ children: [
37212
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37213
+ className: panel_module_css_default.bookAddIcon,
37214
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, { size: 28 })
37215
+ }),
37216
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "开一本新书" }),
37217
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37218
+ className: panel_module_css_default.meta,
37219
+ children: "书名 + 大纲,开书即建项目"
37220
+ })
37221
+ ]
37222
+ }),
37223
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37224
+ className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
37225
+ onClick: onImportBook,
37226
+ role: "button",
37227
+ tabIndex: 0,
37228
+ "aria-label": "导入已有小说",
37229
+ onKeyDown: (e) => {
37230
+ if (e.key === "Enter" || e.key === " ") {
37231
+ e.preventDefault();
37232
+ onImportBook();
37233
+ }
37234
+ },
37235
+ children: [
37236
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37237
+ className: panel_module_css_default.bookAddIcon,
37238
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Download, { size: 28 })
37239
+ }),
37240
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "导入已有小说" }),
37241
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37242
+ className: panel_module_css_default.meta,
37243
+ children: "项目目录或 txt/md 全本"
37244
+ })
37245
+ ]
37246
+ })
37247
+ ]
37248
+ })]
37249
+ });
37250
+ }
37251
+ //#endregion
37252
+ //#region src/client/text.ts
37253
+ /**
37254
+ * 客户端文件文本智能解码:兼容 UTF-8 BOM / UTF-16 / UTF-8 / GB18030(GBK)。
37255
+ * 浏览器 File.text() 固定按 UTF-8 解码,GBK 中文网文 txt 会乱码,这里兜底。
37256
+ */
37257
+ /**
37258
+ * 读取一个 File 的文本,按编码探测兜底解码。
37259
+ * @returns 解码后的文本。
37260
+ */
37261
+ async function readFileTextSmart(file) {
37262
+ const buf = await file.arrayBuffer();
37263
+ const u8 = new Uint8Array(buf);
37264
+ if (u8.length >= 3 && u8[0] === 239 && u8[1] === 187 && u8[2] === 191) return new TextDecoder("utf-8").decode(u8.subarray(3));
37265
+ if (u8.length >= 2 && u8[0] === 255 && u8[1] === 254) return new TextDecoder("utf-16le").decode(u8.subarray(2));
37266
+ if (u8.length >= 2 && u8[0] === 254 && u8[1] === 255) return new TextDecoder("utf-16be").decode(u8.subarray(2));
37267
+ const utf8 = new TextDecoder("utf-8", { fatal: false }).decode(u8);
37268
+ if (!utf8.includes("�")) return utf8;
37269
+ try {
37270
+ return new TextDecoder("gb18030").decode(u8);
37271
+ } catch {
37272
+ return utf8;
37273
+ }
37274
+ }
37275
+ //#endregion
37276
+ //#region src/client/panel/AdaptModeView.tsx
37277
+ /**
37278
+ * 改编模式:P0 分析 → P1 改编方案(勾选/填新值→映射表/规则/影响) → P2 术语替换执行。
37279
+ */
37280
+ const MUTABILITY_LABEL = {
37281
+ locked: "🔒 建议保留",
37282
+ big: "🟡 可改影响大",
37283
+ small: "🟢 可改影响小",
37284
+ free: "🟣 可自由改",
37285
+ visual: "📦 仅视觉包装"
37286
+ };
37287
+ const MUTABILITY_CLS = {
37288
+ locked: "var(--nf-muted)",
37289
+ big: "var(--nf-warn)",
37290
+ small: "var(--nf-info)",
37291
+ free: "var(--nf-accent)",
37292
+ visual: "var(--nf-muted)"
37293
+ };
37294
+ const RISK_LABEL = {
37295
+ high: "高风险",
37296
+ medium: "中风险",
37297
+ low: "低风险"
37298
+ };
37299
+ function AdaptModeView({ api }) {
37300
+ const [text, setText] = (0, react.useState)("");
37301
+ const [result, setResult] = (0, react.useState)(null);
37302
+ const [edits, setEdits] = (0, react.useState)({});
37303
+ const [proposal, setProposal] = (0, react.useState)(null);
37304
+ const [executed, setExecuted] = (0, react.useState)(null);
37305
+ const [busy, setBusy] = (0, react.useState)(false);
37306
+ const [busyLabel, setBusyLabel] = (0, react.useState)("");
37307
+ const [error, setError] = (0, react.useState)("");
37308
+ const fileRef = (0, react.useRef)(null);
37309
+ const onFile = async (e) => {
37310
+ const file = e.target.files?.[0];
37311
+ if (file === void 0) return;
37312
+ try {
37313
+ setText(await readFileTextSmart(file));
37314
+ } catch (err) {
37315
+ setError(err.message);
37316
+ }
37317
+ e.target.value = "";
37318
+ };
37319
+ const analyze = async () => {
37320
+ if (text.trim().length < 200) {
37321
+ setError("请粘贴或上传完整小说全文(至少 200 字符)");
37322
+ return;
37323
+ }
37324
+ setBusy(true);
37325
+ setBusyLabel("分析中…");
37326
+ setError("");
37327
+ setProposal(null);
37328
+ setExecuted(null);
37329
+ try {
37330
+ const res = await api.adaptAnalyze(text);
37331
+ setResult(res);
37332
+ const next = {};
37333
+ for (const d of res.dimensions) next[d.key] = {
37334
+ enabled: d.mutability !== "locked",
37335
+ target: d.candidates?.[0] ?? ""
37336
+ };
37337
+ setEdits(next);
37338
+ } catch (err) {
37339
+ setError(err.message);
37340
+ } finally {
37341
+ setBusy(false);
37342
+ setBusyLabel("");
37343
+ }
37344
+ };
37345
+ const setEdit = (key, patch) => {
37346
+ setEdits((prev) => ({
37347
+ ...prev,
37348
+ [key]: {
37349
+ ...prev[key],
37350
+ ...patch
37351
+ }
37352
+ }));
37353
+ };
37354
+ const selectedDims = result === null ? [] : result.dimensions.filter((d) => {
37355
+ const e = edits[d.key];
37356
+ return e?.enabled === true && (e.target ?? "").trim() !== "";
37357
+ });
37358
+ const buildSelections = () => selectedDims.map((d) => ({
37359
+ key: d.key,
37360
+ title: d.title,
37361
+ current: d.current,
37362
+ target: (edits[d.key]?.target ?? "").trim(),
37363
+ mutability: d.mutability
37364
+ }));
37365
+ const propose = async () => {
37366
+ if (result === null || text.trim().length < 200) {
37367
+ setError("请先分析");
37368
+ return;
37369
+ }
37370
+ const selections = buildSelections();
37371
+ if (selections.length === 0) {
37372
+ setError("请至少选择一条要改的维度并填写新值");
37373
+ return;
37374
+ }
37375
+ setBusy(true);
37376
+ setBusyLabel("生成改编方案…");
37377
+ setError("");
37378
+ setExecuted(null);
37379
+ try {
37380
+ const res = await api.adaptPropose({
37381
+ text,
37382
+ selections,
37383
+ dimensions: result.dimensions
37384
+ });
37385
+ setProposal(res.proposal);
37386
+ } catch (err) {
37387
+ setError(err.message);
37388
+ } finally {
37389
+ setBusy(false);
37390
+ setBusyLabel("");
37391
+ }
37392
+ };
37393
+ const execute = async () => {
37394
+ if (proposal === null || proposal.mappings.length === 0) {
37395
+ setError("请先生成改编方案");
37396
+ return;
37397
+ }
37398
+ setBusy(true);
37399
+ setBusyLabel("执行术语替换…");
37400
+ setError("");
37401
+ try {
37402
+ const res = await api.adaptExecute({
37403
+ text,
37404
+ mappings: proposal.mappings,
37405
+ mode: "replace"
37406
+ });
37407
+ setExecuted(res);
37408
+ } catch (err) {
37409
+ setError(err.message);
37410
+ } finally {
37411
+ setBusy(false);
37412
+ setBusyLabel("");
37413
+ }
37414
+ };
37415
+ const downloadAdapted = () => {
37416
+ if (executed === null) return;
37417
+ const blob = new Blob([executed.adaptedText], { type: "text/markdown;charset=utf-8" });
37418
+ const url = URL.createObjectURL(blob);
37419
+ const a = document.createElement("a");
37420
+ a.href = url;
37421
+ a.download = result?.bookName !== void 0 && result.bookName !== "" ? result.bookName + "·改编版.md" : "改编版.md";
37422
+ a.click();
37423
+ URL.revokeObjectURL(url);
37424
+ };
37425
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37426
+ className: panel_module_css_default.authorPageBody,
37427
+ children: [
37428
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37429
+ className: panel_module_css_default.authorPageHeader,
37430
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
37431
+ className: panel_module_css_default.panelTitle,
37432
+ style: { margin: 0 },
37433
+ children: "🎬 改编模式"
37434
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37435
+ className: panel_module_css_default.meta,
37436
+ children: "上传全文 → 分析可改范围 → 勾选/填新值 → 生成映射表 → 术语替换执行。"
37437
+ })] })
37438
+ }),
37439
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37440
+ className: panel_module_css_default.adaptInputCard,
37441
+ children: [
37442
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37443
+ className: panel_module_css_default.rowEnd,
37444
+ style: { justifyContent: "space-between" },
37445
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37446
+ className: panel_module_css_default.meta,
37447
+ children: "粘贴全文,或上传 txt/md 文件"
37448
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37449
+ type: "button",
37450
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
37451
+ onClick: () => fileRef.current?.click(),
37452
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Upload, {
37453
+ size: 13,
37454
+ style: { verticalAlign: -2 }
37455
+ }), " 上传文件"]
37456
+ })]
37457
+ }),
37458
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
37459
+ ref: fileRef,
37460
+ type: "file",
37461
+ accept: ".txt,.md,text/plain,text/markdown",
37462
+ style: { display: "none" },
37463
+ onChange: (e) => {
37464
+ onFile(e);
37465
+ }
37466
+ }),
37467
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
37468
+ className: panel_module_css_default.input + " " + panel_module_css_default.adaptTextarea,
37469
+ value: text,
37470
+ onChange: (e) => setText(e.target.value),
37471
+ placeholder: "粘贴小说全文(含章节标题/分卷更好)…"
37472
+ }),
37473
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37474
+ className: panel_module_css_default.rowEnd,
37475
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37476
+ className: panel_module_css_default.meta,
37477
+ children: [
37478
+ "已输入 ",
37479
+ text.length,
37480
+ " 字"
37481
+ ]
37482
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37483
+ type: "button",
37484
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
37485
+ onClick: () => {
37486
+ analyze();
37487
+ },
37488
+ disabled: busy,
37489
+ children: [
37490
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wand2, {
37491
+ size: 14,
37492
+ style: { verticalAlign: -2 }
37493
+ }),
37494
+ " ",
37495
+ busy && busyLabel === "分析中…" ? "分析中…" : "开始分析"
37496
+ ]
37497
+ })]
37498
+ })
37499
+ ]
37500
+ }),
37501
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37502
+ className: panel_module_css_default.noticeError,
37503
+ children: error
37504
+ }),
37505
+ result === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37506
+ className: panel_module_css_default.shelfEmpty,
37507
+ style: { minHeight: 160 },
37508
+ children: [
37509
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37510
+ className: panel_module_css_default.shelfEmptyIcon,
37511
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 30 })
37512
+ }),
37513
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37514
+ className: panel_module_css_default.shelfEmptyTitle,
37515
+ children: "等待分析"
37516
+ }),
37517
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37518
+ className: panel_module_css_default.meta,
37519
+ children: "分析会读取全文并提炼「原文设定卡片」与「可改范围矩阵」。"
37520
+ })
37521
+ ]
37522
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37523
+ className: panel_module_css_default.adaptResult,
37524
+ children: [
37525
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37526
+ className: panel_module_css_default.authorPageHeader,
37527
+ style: { alignItems: "center" },
37528
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", {
37529
+ style: { margin: 0 },
37530
+ children: [
37531
+ "《",
37532
+ result.bookName,
37533
+ "》 · ",
37534
+ result.chapters,
37535
+ " 章"
37536
+ ]
37537
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37538
+ className: panel_module_css_default.meta,
37539
+ children: result.note
37540
+ })]
37541
+ }),
37542
+ result.outline !== void 0 && result.outline !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
37543
+ className: panel_module_css_default.adaptOutline,
37544
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", { children: "反推大纲(点击展开)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
37545
+ className: panel_module_css_default.adaptOutlinePre,
37546
+ children: result.outline
37547
+ })]
37548
+ }),
37549
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37550
+ className: panel_module_css_default.authorPageHeader,
37551
+ style: { alignItems: "center" },
37552
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "可改范围矩阵(勾选要改 + 填新值)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37553
+ type: "button",
37554
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
37555
+ onClick: () => {
37556
+ propose();
37557
+ },
37558
+ disabled: busy,
37559
+ children: [
37560
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ListChecks, {
37561
+ size: 13,
37562
+ style: { verticalAlign: -2 }
37563
+ }),
37564
+ " ",
37565
+ busy && busyLabel === "生成改编方案…" ? "生成中…" : "生成改编方案",
37566
+ " (",
37567
+ selectedDims.length,
37568
+ ")"
37569
+ ]
37570
+ })]
37571
+ }),
37572
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37573
+ className: panel_module_css_default.adaptMatrix,
37574
+ children: result.dimensions.map((d, i) => {
37575
+ const e = edits[d.key];
37576
+ const enabled = e?.enabled === true;
37577
+ const target = e?.target ?? "";
37578
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37579
+ className: panel_module_css_default.dimCard + (enabled ? " " + panel_module_css_default.dimCardSelected : ""),
37580
+ children: [
37581
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37582
+ className: panel_module_css_default.dimCardHead,
37583
+ children: [
37584
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37585
+ className: panel_module_css_default.dimTitle,
37586
+ children: d.title
37587
+ }),
37588
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37589
+ className: panel_module_css_default.badge,
37590
+ style: { color: MUTABILITY_CLS[d.mutability] ?? "var(--nf-muted)" },
37591
+ children: MUTABILITY_LABEL[d.mutability] ?? d.mutability
37592
+ }),
37593
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37594
+ className: panel_module_css_default.meta,
37595
+ children: ["风险:", RISK_LABEL[d.risk] ?? d.risk]
37596
+ })
37597
+ ]
37598
+ }),
37599
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37600
+ className: panel_module_css_default.dimCurrent,
37601
+ children: [
37602
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "当前值" }),
37603
+ ":",
37604
+ d.current
37605
+ ]
37606
+ }),
37607
+ d.mutability !== "locked" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37608
+ className: panel_module_css_default.dimEdit,
37609
+ children: [
37610
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
37611
+ type: "checkbox",
37612
+ checked: enabled,
37613
+ onChange: (e2) => setEdit(d.key, { enabled: e2.target.checked })
37614
+ }),
37615
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
37616
+ className: panel_module_css_default.input,
37617
+ value: target,
37618
+ disabled: !enabled,
37619
+ placeholder: "改为什么?",
37620
+ onChange: (e2) => setEdit(d.key, { target: e2.target.value })
37621
+ }),
37622
+ (d.candidates ?? []).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
37623
+ className: panel_module_css_default.meta,
37624
+ children: ["候选:", (d.candidates ?? []).join(" / ")]
37625
+ })
37626
+ ]
37627
+ }),
37628
+ d.evidence !== void 0 && d.evidence !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37629
+ className: panel_module_css_default.meta,
37630
+ children: ["证据:", d.evidence]
37631
+ }),
37632
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37633
+ className: panel_module_css_default.meta,
37634
+ children: ["影响:", d.impact]
37635
+ })
37636
+ ]
37637
+ }, d.key + "-" + i);
37638
+ })
37639
+ }),
37640
+ proposal !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37641
+ className: panel_module_css_default.adaptProposal,
37642
+ children: [
37643
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37644
+ className: panel_module_css_default.authorPageHeader,
37645
+ style: { alignItems: "center" },
37646
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "改编方案" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37647
+ type: "button",
37648
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
37649
+ onClick: () => {
37650
+ execute();
37651
+ },
37652
+ disabled: busy,
37653
+ children: [
37654
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Play, {
37655
+ size: 13,
37656
+ style: { verticalAlign: -2 }
37657
+ }),
37658
+ " ",
37659
+ busy && busyLabel === "执行术语替换…" ? "执行中…" : "执行改编(术语替换)"
37660
+ ]
37661
+ })]
37662
+ }),
37663
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
37664
+ style: { margin: "10px 0 4px" },
37665
+ children: "映射表"
37666
+ }),
37667
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
37668
+ className: panel_module_css_default.adaptTable,
37669
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
37670
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "原值" }),
37671
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "新值" }),
37672
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "范围" })
37673
+ ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: proposal.mappings.map((m, i2) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
37674
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: m.source }),
37675
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: m.target }),
37676
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: m.scope })
37677
+ ] }, i2)) })]
37678
+ }),
37679
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
37680
+ style: { margin: "10px 0 4px" },
37681
+ children: "改编规则"
37682
+ }),
37683
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37684
+ className: panel_module_css_default.meta,
37685
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "保留:" }), proposal.rules.preserve.join(";") || "—"]
37686
+ }),
37687
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37688
+ className: panel_module_css_default.meta,
37689
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "允许变:" }), proposal.rules.change.join(";") || "—"]
37690
+ }),
37691
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37692
+ className: panel_module_css_default.meta,
37693
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "红线:" }), proposal.rules.constraints.join(";") || "—"]
37694
+ }),
37695
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
37696
+ style: { margin: "10px 0 4px" },
37697
+ children: "联动影响"
37698
+ }),
37699
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37700
+ className: panel_module_css_default.adaptImpacts,
37701
+ children: proposal.impacts.map((im, i3) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37702
+ className: panel_module_css_default.adaptImpact,
37703
+ children: [
37704
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
37705
+ style: { color: im.risk === "high" ? "var(--nf-error)" : im.risk === "medium" ? "var(--nf-warn)" : "var(--nf-info)" },
37706
+ children: [
37707
+ "[",
37708
+ RISK_LABEL[im.risk] ?? im.risk,
37709
+ "]"
37710
+ ]
37711
+ }),
37712
+ " ",
37713
+ im.item,
37714
+ ":",
37715
+ im.detail,
37716
+ im.chapters !== void 0 && im.chapters.length > 0 ? `(章:${im.chapters.join(",")})` : ""
37717
+ ]
37718
+ }, i3))
37719
+ })
37720
+ ]
37721
+ }),
37722
+ executed !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37723
+ className: panel_module_css_default.adaptProposal,
37724
+ children: [
37725
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37726
+ className: panel_module_css_default.authorPageHeader,
37727
+ style: { alignItems: "center" },
37728
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "改编结果(术语替换)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37729
+ type: "button",
37730
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
37731
+ onClick: downloadAdapted,
37732
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Download, {
37733
+ size: 13,
37734
+ style: { verticalAlign: -2 }
37735
+ }), " 下载改编版"]
37736
+ })]
37737
+ }),
37738
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37739
+ className: panel_module_css_default.meta,
37740
+ children: ["命中:", executed.hits.filter((h) => h.count > 0).map((h) => h.source + "→" + h.target + "×" + h.count).join(",") || "无命中"]
37741
+ }),
37742
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
37743
+ className: panel_module_css_default.adaptOutline,
37744
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", { children: "改编正文预览(点击展开)" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
37745
+ className: panel_module_css_default.adaptOutlinePre,
37746
+ children: executed.adaptedText.slice(0, 8e3)
37747
+ })]
37748
+ })
37749
+ ]
37750
+ })
37751
+ ]
37752
+ })
37753
+ ]
37754
+ });
37755
+ }
37756
+ //#endregion
37757
+ //#region src/client/panel/AuthorAssetsView.tsx
37758
+ /**
37759
+ * 作者资产库/总数据页:跨书可复用的笔法/红线/套路/角色模板/世界观模板。
37760
+ * 支持 新增 / 编辑 / 删除;数据持久化到 ~/.dsh/dsh-novel-forge-author-assets.json。
37761
+ */
37762
+ const KIND_LABELS = {
37763
+ style: "笔法",
37764
+ antiAi: "红线/反AI",
37765
+ progression: "推进模式",
37766
+ genre: "题材",
37767
+ roleTemplate: "角色模板",
37768
+ worldTemplate: "世界观模板",
37769
+ custom: "自定义"
37770
+ };
37771
+ const KIND_OPTIONS = Object.keys(KIND_LABELS);
37772
+ const KIND_COLORS = {
37773
+ style: "var(--nf-info)",
37774
+ antiAi: "var(--nf-warn)",
37775
+ progression: "var(--nf-accent)",
37776
+ genre: "var(--nf-info)",
37777
+ roleTemplate: "var(--nf-accent)",
37778
+ worldTemplate: "var(--nf-warn)",
37779
+ custom: "var(--nf-muted)"
37780
+ };
37781
+ /** 计算资产的分组(分类):题材按顶层题材名('/' 之前),其余按类型。 */
37782
+ function assetCategory(a) {
37783
+ if (a.kind === "genre") {
37784
+ const top = a.name.split("/")[0]?.trim();
37785
+ return top !== void 0 && top !== "" ? top : "题材";
37786
+ }
37787
+ return KIND_LABELS[a.kind] ?? "其他";
37788
+ }
37789
+ function emptyEditor() {
37790
+ return {
37791
+ name: "",
37792
+ kind: "style",
37793
+ summary: "",
37794
+ content: "",
37795
+ tags: "",
37796
+ sourceBooks: ""
37797
+ };
37798
+ }
37799
+ function AuthorAssetsView({ api }) {
37800
+ const [assets, setAssets] = (0, react.useState)([]);
37801
+ const [editing, setEditing] = (0, react.useState)(null);
37802
+ const [error, setError] = (0, react.useState)("");
37803
+ const [busy, setBusy] = (0, react.useState)(false);
37804
+ const [kindFilter, setKindFilter] = (0, react.useState)("all");
37805
+ const load = async () => {
37806
+ try {
37807
+ const res = await api.authorAssets();
37808
+ setAssets(res.assets.items);
37809
+ } catch (err) {
37810
+ setError(err.message);
37811
+ }
37812
+ };
37813
+ /** 导入默认:把书架书的写作资产/角色 + 内置全局库批量沉淀到作者资产库。 */
37814
+ const importDefaults = async () => {
37815
+ setBusy(true);
37816
+ setError("");
37817
+ try {
37818
+ const res = await api.authorAssetsImportDefault();
37819
+ setAssets(res.assets.items);
37820
+ } catch (err) {
37821
+ setError(err.message);
37822
+ } finally {
37823
+ setBusy(false);
37824
+ }
37825
+ };
37826
+ (0, react.useEffect)(() => {
37827
+ let cancelled = false;
37828
+ (async () => {
37829
+ try {
37830
+ const res = await api.authorAssets();
37831
+ if (cancelled) return;
37832
+ if (res.assets.items.length === 0) {
37833
+ const imp = await api.authorAssetsImportDefault();
37834
+ if (!cancelled) setAssets(imp.assets.items);
37835
+ } else setAssets(res.assets.items);
37836
+ } catch (err) {
37837
+ if (!cancelled) setError(err.message);
37838
+ }
37839
+ })();
37840
+ return () => {
37841
+ cancelled = true;
37842
+ };
37843
+ }, [api]);
37844
+ const startNew = () => {
37845
+ setEditing(emptyEditor());
37846
+ setError("");
37847
+ };
37848
+ const startEdit = (a) => {
37849
+ setEditing({
37850
+ id: a.id,
37851
+ name: a.name,
37852
+ kind: a.kind,
37853
+ summary: a.summary,
37854
+ content: a.content,
37855
+ tags: a.tags.join("、"),
37856
+ sourceBooks: a.sourceBooks.join("、")
37857
+ });
37858
+ setError("");
37859
+ };
37860
+ const save = async () => {
37861
+ if (editing === null) return;
37862
+ if (editing.name.trim() === "") {
37863
+ setError("请填写资产名");
37864
+ return;
37865
+ }
37866
+ setBusy(true);
37867
+ setError("");
37868
+ try {
37869
+ const asset = {
37870
+ id: editing.id ?? "",
37871
+ name: editing.name.trim(),
37872
+ kind: editing.kind,
37873
+ summary: editing.summary.trim(),
37874
+ content: editing.content.trim(),
37875
+ sourceBooks: editing.sourceBooks.split(/[、,,\s]+/).map((s) => s.trim()).filter(Boolean),
37876
+ tags: editing.tags.split(/[、,,\s]+/).map((s) => s.trim()).filter(Boolean),
37877
+ createdAt: "",
37878
+ updatedAt: ""
37879
+ };
37880
+ await api.authorAssetsUpsert(asset);
37881
+ setEditing(null);
37882
+ await load();
37883
+ } catch (err) {
37884
+ setError(err.message);
37885
+ } finally {
37886
+ setBusy(false);
37887
+ }
37888
+ };
37889
+ const del = async (id) => {
37890
+ setBusy(true);
37891
+ setError("");
37892
+ try {
37893
+ await api.authorAssetsRemove(id);
37894
+ await load();
37895
+ } catch (err) {
37896
+ setError(err.message);
37897
+ } finally {
37898
+ setBusy(false);
37899
+ }
37900
+ };
37901
+ const visible = (0, react.useMemo)(() => kindFilter === "all" ? assets : assets.filter((a) => a.kind === kindFilter), [assets, kindFilter]);
37902
+ /** 按分类分组展示(题材按顶层题材名,其余按类型)。 */
37903
+ const grouped = (0, react.useMemo)(() => {
37904
+ const map = /* @__PURE__ */ new Map();
37905
+ for (const a of visible) {
37906
+ const cat = assetCategory(a);
37907
+ const arr = map.get(cat) ?? [];
37908
+ arr.push(a);
37909
+ map.set(cat, arr);
37910
+ }
37911
+ return Array.from(map.entries()).sort((x, y) => x[0].localeCompare(y[0], "zh"));
37912
+ }, [visible]);
37913
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37914
+ className: panel_module_css_default.authorPageBody,
37915
+ children: [
37916
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37917
+ className: panel_module_css_default.authorPageHero,
37918
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37919
+ className: panel_module_css_default.authorPageHeader,
37920
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
37921
+ className: panel_module_css_default.panelTitle,
37922
+ style: { margin: 0 },
37923
+ children: "🧬 作者资产库 · 总数据"
37924
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37925
+ className: panel_module_css_default.meta,
37926
+ children: "跨书可复用的笔法/红线/套路/角色模板/世界观模板。任意新书与改编都能调用。"
37927
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37928
+ className: panel_module_css_default.rowEnd,
37929
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
37930
+ type: "button",
37931
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
37932
+ onClick: () => {
37933
+ importDefaults();
37934
+ },
37935
+ disabled: busy,
37936
+ title: "把书架里所有书的写作资产/角色 + 内置题材/反AI/风格模板/推进模式批量导入",
37937
+ children: "导入默认资产"
37938
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37939
+ type: "button",
37940
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
37941
+ onClick: startNew,
37942
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
37943
+ size: 14,
37944
+ style: { verticalAlign: -2 }
37945
+ }), " 新增资产"]
37946
+ })]
37947
+ })]
37948
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37949
+ className: panel_module_css_default.assetFilterBar,
37950
+ children: KIND_OPTIONS.map((k) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
37951
+ type: "button",
37952
+ className: panel_module_css_default.assetFilterChip + (kindFilter === k ? " " + panel_module_css_default.assetFilterChipActive : ""),
37953
+ onClick: () => setKindFilter(kindFilter === k ? "all" : k),
37954
+ children: [
37955
+ KIND_LABELS[k],
37956
+ " ",
37957
+ assets.filter((a) => a.kind === k).length
37958
+ ]
37959
+ }, k))
37960
+ })]
37961
+ }),
37962
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37963
+ className: panel_module_css_default.noticeError,
37964
+ children: error
37965
+ }),
37966
+ editing !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37967
+ className: panel_module_css_default.assetEditor,
37968
+ children: [
37969
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
37970
+ style: { margin: 0 },
37971
+ children: editing.id !== "" && editing.id !== void 0 ? "编辑资产" : "新增资产"
37972
+ }),
37973
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37974
+ className: panel_module_css_default.assetEditorRow,
37975
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
37976
+ className: panel_module_css_default.assetLabel,
37977
+ children: ["资产名 ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
37978
+ className: panel_module_css_default.input,
37979
+ value: editing.name,
37980
+ onChange: (e) => setEditing({
37981
+ ...editing,
37982
+ name: e.target.value
37983
+ }),
37984
+ placeholder: "如:短句快节奏爽文风"
37985
+ })]
37986
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
37987
+ className: panel_module_css_default.assetLabel,
37988
+ children: ["类型 ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
37989
+ className: panel_module_css_default.input,
37990
+ value: editing.kind,
37991
+ onChange: (e) => setEditing({
37992
+ ...editing,
37993
+ kind: e.target.value
37994
+ }),
37995
+ children: KIND_OPTIONS.map((k) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
37996
+ value: k,
37997
+ children: KIND_LABELS[k]
37998
+ }, k))
37999
+ })]
38000
+ })]
38001
+ }),
38002
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38003
+ className: panel_module_css_default.assetLabel,
38004
+ children: ["一句话摘要 ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38005
+ className: panel_module_css_default.input,
38006
+ value: editing.summary,
38007
+ onChange: (e) => setEditing({
38008
+ ...editing,
38009
+ summary: e.target.value
38010
+ }),
38011
+ placeholder: "这个资产解决什么问题 / 有什么特点"
38012
+ })]
38013
+ }),
38014
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38015
+ className: panel_module_css_default.assetLabel,
38016
+ children: ["内容(按类型约定的描述 / 规则 / 结构化文本)", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
38017
+ className: `${panel_module_css_default.input} ${panel_module_css_default.assetTextarea}`,
38018
+ value: editing.content,
38019
+ onChange: (e) => setEditing({
38020
+ ...editing,
38021
+ content: e.target.value
38022
+ }),
38023
+ placeholder: "角色模板示例:\n姓名:林越\n定位:痞坏型主角\n口头禅:\"有点意思\"\n性格:表面懒散、内里狠辣\n成长弧线:从底层游街到一方枭雄"
38024
+ })]
38025
+ }),
38026
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38027
+ className: panel_module_css_default.assetEditorRow,
38028
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38029
+ className: panel_module_css_default.assetLabel,
38030
+ children: ["标签(顿号分隔) ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38031
+ className: panel_module_css_default.input,
38032
+ value: editing.tags,
38033
+ onChange: (e) => setEditing({
38034
+ ...editing,
38035
+ tags: e.target.value
38036
+ }),
38037
+ placeholder: "扮猪吃虎、快节奏、冷面"
38038
+ })]
38039
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38040
+ className: panel_module_css_default.assetLabel,
38041
+ children: ["来源书(顿号分隔) ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38042
+ className: panel_module_css_default.input,
38043
+ value: editing.sourceBooks,
38044
+ onChange: (e) => setEditing({
38045
+ ...editing,
38046
+ sourceBooks: e.target.value
38047
+ }),
38048
+ placeholder: "《某某传》《某某录》"
38049
+ })]
38050
+ })]
38051
+ }),
38052
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38053
+ className: panel_module_css_default.rowEnd,
38054
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38055
+ type: "button",
38056
+ className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
38057
+ onClick: save,
38058
+ disabled: busy,
38059
+ children: busy ? "保存中…" : "保存"
38060
+ }), editing.id !== "" && editing.id !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38061
+ type: "button",
38062
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
38063
+ onClick: () => setEditing(null),
38064
+ children: "取消"
38065
+ })]
38066
+ })
38067
+ ]
38068
+ }) : null,
38069
+ visible.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38070
+ className: panel_module_css_default.shelfEmpty,
38071
+ style: { minHeight: 160 },
38072
+ children: [
38073
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38074
+ className: panel_module_css_default.shelfEmptyIcon,
38075
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, { size: 30 })
38076
+ }),
38077
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38078
+ className: panel_module_css_default.shelfEmptyTitle,
38079
+ children: "还没有资产"
38080
+ }),
38081
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38082
+ className: panel_module_css_default.meta,
38083
+ children: "点「新增资产」收藏你的笔法/角色模板/套路,跨书调用。"
38084
+ })
38085
+ ]
38086
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38087
+ className: panel_module_css_default.assetGroups,
38088
+ children: grouped.map(([cat, items]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38089
+ className: panel_module_css_default.assetGroup,
38090
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38091
+ className: panel_module_css_default.assetGroupHeader,
38092
+ children: [
38093
+ cat,
38094
+ " ",
38095
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38096
+ className: panel_module_css_default.meta,
38097
+ children: items.length
38098
+ })
38099
+ ]
38100
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38101
+ className: panel_module_css_default.assetGrid,
38102
+ children: items.map((a) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38103
+ className: panel_module_css_default.assetCard,
38104
+ children: [
38105
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38106
+ className: panel_module_css_default.assetCardTop,
38107
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38108
+ className: panel_module_css_default.assetKind,
38109
+ style: { color: KIND_COLORS[a.kind] },
38110
+ children: KIND_LABELS[a.kind]
38111
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38112
+ className: panel_module_css_default.rowEnd,
38113
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38114
+ type: "button",
38115
+ className: panel_module_css_default.iconBtn,
38116
+ title: "编辑",
38117
+ onClick: () => startEdit(a),
38118
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Pencil, { size: 13 })
38119
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38120
+ type: "button",
38121
+ className: panel_module_css_default.iconBtn,
38122
+ title: "删除",
38123
+ onClick: () => {
38124
+ del(a.id);
38125
+ },
38126
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Trash2, { size: 13 })
38127
+ })]
38128
+ })]
38129
+ }),
38130
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38131
+ className: panel_module_css_default.assetCardName,
38132
+ children: a.name
38133
+ }),
38134
+ a.summary !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38135
+ className: panel_module_css_default.meta,
38136
+ children: a.summary
38137
+ }),
38138
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38139
+ className: panel_module_css_default.assetCardContent,
38140
+ children: a.content
38141
+ }),
38142
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38143
+ className: panel_module_css_default.assetCardFooter,
38144
+ children: [a.tags.map((t) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38145
+ className: panel_module_css_default.badge,
38146
+ children: t
38147
+ }, t)), a.sourceBooks.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38148
+ className: panel_module_css_default.meta,
38149
+ children: ["来源:", a.sourceBooks.join(" / ")]
38150
+ })]
38151
+ })
38152
+ ]
38153
+ }, a.id))
38154
+ })]
38155
+ }, cat))
38156
+ })
38157
+ ]
38158
+ });
38159
+ }
38160
+ //#endregion
38161
+ //#region src/client/panel/ProgressHomeView.tsx
38162
+ /**
38163
+ * 首页 AI 进度视图:书架级聚合进度——总览 + 每本书进度条 + 进行中高亮。
38164
+ * 读取 BookshelfSnapshot,不依赖打开某本书。
38165
+ */
38166
+ function relativeTime(iso) {
38167
+ const t = new Date(iso).getTime();
38168
+ if (!Number.isFinite(t)) return "—";
38169
+ const diff = Date.now() - t;
38170
+ if (diff < 6e4) return "刚刚";
38171
+ if (diff < 36e5) return Math.floor(diff / 6e4) + " 分钟前";
38172
+ if (diff < 864e5) return Math.floor(diff / 36e5) + " 小时前";
38173
+ if (diff < 7 * 864e5) return Math.floor(diff / 864e5) + " 天前";
38174
+ return new Date(t).toLocaleDateString("zh-CN", {
38175
+ month: "numeric",
38176
+ day: "numeric"
38177
+ });
38178
+ }
38179
+ function bookStatus(book) {
38180
+ if (!book.hasProject) return "none";
38181
+ return book.total > 0 && book.done >= book.total ? "done" : "active";
38182
+ }
38183
+ function ProgressHomeView({ shelf, onOpenBook }) {
38184
+ const stats = (0, react.useMemo)(() => {
38185
+ let active = 0, done = 0, none = 0, chapters = 0, written = 0;
38186
+ for (const b of shelf.books) {
38187
+ const s = bookStatus(b);
38188
+ if (s === "none") none++;
38189
+ else if (s === "done") done++;
38190
+ else active++;
38191
+ chapters += b.total;
38192
+ written += b.done;
38193
+ }
38194
+ return {
38195
+ active,
38196
+ done,
38197
+ none,
38198
+ chapters,
38199
+ written
38200
+ };
38201
+ }, [shelf.books]);
38202
+ const progressPct = stats.chapters > 0 ? Math.round(stats.written / stats.chapters * 100) : 0;
38203
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38204
+ className: panel_module_css_default.authorPageBody,
38205
+ children: [
38206
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38207
+ className: panel_module_css_default.authorPageHeader,
38208
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
38209
+ className: panel_module_css_default.panelTitle,
38210
+ style: { margin: 0 },
38211
+ children: "📊 AI 进度"
38212
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38213
+ className: panel_module_css_default.meta,
38214
+ children: "跨书架聚合进度与最近活动"
38215
+ })]
38216
+ }),
38217
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38218
+ className: panel_module_css_default.progressOverview,
38219
+ children: [
38220
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38221
+ className: panel_module_css_default.progressOverviewCard,
38222
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38223
+ className: panel_module_css_default.progressOverviewNum,
38224
+ children: shelf.books.length
38225
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38226
+ className: panel_module_css_default.meta,
38227
+ children: "总书数"
38228
+ })]
38229
+ }),
38230
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38231
+ className: panel_module_css_default.progressOverviewCard,
38232
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38233
+ className: panel_module_css_default.progressOverviewNum,
38234
+ children: stats.active
38235
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38236
+ className: panel_module_css_default.meta,
38237
+ children: "进行中"
38238
+ })]
38239
+ }),
38240
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38241
+ className: panel_module_css_default.progressOverviewCard,
38242
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38243
+ className: panel_module_css_default.progressOverviewNum,
38244
+ children: stats.done
38245
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38246
+ className: panel_module_css_default.meta,
38247
+ children: "已完结"
38248
+ })]
38249
+ }),
38250
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38251
+ className: panel_module_css_default.progressOverviewCard,
38252
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38253
+ className: panel_module_css_default.progressOverviewNum,
38254
+ children: [
38255
+ stats.written,
38256
+ "/",
38257
+ stats.chapters
38258
+ ]
38259
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38260
+ className: panel_module_css_default.meta,
38261
+ children: "已完成章节"
38262
+ })]
38263
+ })
38264
+ ]
38265
+ }),
38266
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38267
+ className: panel_module_css_default.progressTotalBar,
38268
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38269
+ className: panel_module_css_default.progressTotalFill,
38270
+ style: { width: progressPct + "%" }
38271
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38272
+ className: panel_module_css_default.meta,
38273
+ children: [
38274
+ "全书架整体进度 ",
38275
+ progressPct,
38276
+ "%"
38277
+ ]
38278
+ })]
38279
+ }),
38280
+ shelf.books.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38281
+ className: panel_module_css_default.shelfEmpty,
38282
+ style: { minHeight: 160 },
38283
+ children: [
38284
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38285
+ className: panel_module_css_default.shelfEmptyIcon,
38286
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BarChart3, { size: 30 })
38287
+ }),
38288
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38289
+ className: panel_module_css_default.shelfEmptyTitle,
38290
+ children: "还没有书"
38291
+ }),
38292
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38293
+ className: panel_module_css_default.meta,
38294
+ children: "去书架开一本书或导入全文后,这里会显示进度。"
38295
+ })
38296
+ ]
38297
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38298
+ className: panel_module_css_default.progressBookList,
38299
+ children: shelf.books.map((book) => {
38300
+ const s = bookStatus(book);
38301
+ const ratio = book.total > 0 ? Math.min(book.done / book.total, 1) : 0;
38302
+ const statusLabel = s === "none" ? "未开书" : s === "done" ? "已完结" : "进行中";
38303
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38304
+ className: panel_module_css_default.progressBook + (s === "active" ? " " + panel_module_css_default.progressBookActive : ""),
38305
+ children: [
38306
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38307
+ className: panel_module_css_default.progressBookHead,
38308
+ children: [
38309
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38310
+ className: panel_module_css_default.progressBookName,
38311
+ title: book.bookName,
38312
+ children: book.bookName
38313
+ }),
38314
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38315
+ className: panel_module_css_default.badge + (s === "done" ? " " + panel_module_css_default.badgeDone : s === "active" ? " " + panel_module_css_default.badgeWritten : " " + panel_module_css_default.badgePending),
38316
+ children: statusLabel
38317
+ }),
38318
+ s === "active" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38319
+ className: panel_module_css_default.meta + " " + panel_module_css_default.progressLive,
38320
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RefreshCw, {
38321
+ size: 12,
38322
+ style: { verticalAlign: -2 }
38323
+ }), " 创作中"]
38324
+ })
38325
+ ]
38326
+ }),
38327
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38328
+ className: panel_module_css_default.progressBookBar,
38329
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38330
+ className: panel_module_css_default.progressBookFill,
38331
+ style: { width: Math.round(ratio * 100) + "%" }
38332
+ })
38333
+ }),
38334
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38335
+ className: panel_module_css_default.rowEnd,
38336
+ style: { justifyContent: "space-between" },
38337
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38338
+ className: panel_module_css_default.meta,
38339
+ children: [
38340
+ book.total > 0 ? "已完成 " + book.done + " / " + book.total + " 章" : "尚未规划章节",
38341
+ " · 更新于 ",
38342
+ relativeTime(book.updatedAt)
38343
+ ]
38344
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
38345
+ type: "button",
38346
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
38347
+ onClick: () => onOpenBook(book.id),
38348
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PenLine, {
38349
+ size: 12,
38350
+ style: { verticalAlign: -2 }
38351
+ }), " 进入"]
38352
+ })]
38353
+ })
38354
+ ]
38355
+ }, book.id);
38356
+ })
38357
+ })
38358
+ ]
38359
+ });
38360
+ }
38361
+ //#endregion
38362
+ //#region src/client/panel/SettingsView.tsx
38363
+ /**
38364
+ * 共享设置页(作者首页「设置」与书内「设置」同入口)。
38365
+ * 自给自足:挂载时通过 api.status() 拉取全局配置,支持 model/writing/image/files/appearance 五组,
38366
+ * 保存走 api.patchConfig。不与某个书绑定,因此新装用户无书也能用。
38367
+ */
38368
+ const MODEL_PRESETS$1 = [
38369
+ "deepseek-v4-flash",
38370
+ "deepseek-v4-pro",
38371
+ "deepseek-chat",
38372
+ "deepseek-reasoner"
38373
+ ];
38374
+ const REASONING_OPTIONS$1 = [
38375
+ "off",
38376
+ "low",
38377
+ "high",
38378
+ "max"
38379
+ ];
38380
+ const REASONING_LABEL = {
38381
+ off: tt("settings.reasoning.off"),
38382
+ low: tt("settings.reasoning.low"),
38383
+ high: tt("settings.reasoning.high"),
38384
+ max: tt("settings.reasoning.max")
38385
+ };
38386
+ const SETTINGS_SECTIONS$1 = [
38387
+ {
38388
+ id: "model",
38389
+ label: "模型与推理",
38390
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Brain, { size: 16 })
38391
+ },
38392
+ {
38393
+ id: "writing",
38394
+ label: "写作与审稿",
38395
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PenLine, { size: 16 })
38396
+ },
38397
+ {
38398
+ id: "image",
38399
+ label: "生图模型",
38400
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Palette, { size: 16 })
38401
+ },
38402
+ {
38403
+ id: "files",
38404
+ label: "路径与文件",
38405
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Folder, { size: 16 })
38406
+ },
38407
+ {
38408
+ id: "appearance",
38409
+ label: "外观与主题",
38410
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Sparkles, { size: 16 })
38411
+ },
38412
+ {
38413
+ id: "background",
38414
+ label: "自定义背景",
38415
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Image, { size: 16 })
38416
+ }
38417
+ ];
38418
+ function readLS(key, fallback, allowed) {
38419
+ try {
38420
+ const v = window.localStorage.getItem(key);
38421
+ return v !== null && allowed.includes(v) ? v : fallback;
38422
+ } catch {
38423
+ return fallback;
38424
+ }
38425
+ }
38426
+ function SettingsView({ api, onTheme, onSettingsTab, onEditorFontSize, onBackground, onOpacity }) {
38427
+ const [config, setConfig] = (0, react.useState)(null);
38428
+ const [configDraft, setConfigDraft] = (0, react.useState)(null);
38429
+ const [busy, setBusy] = (0, react.useState)(false);
38430
+ const [error, setError] = (0, react.useState)("");
38431
+ const [notice, setNotice] = (0, react.useState)("");
38432
+ const [modelCustomMode, setModelCustomMode] = (0, react.useState)(false);
38433
+ const [settingsTab, setSettingsTabState] = (0, react.useState)(() => readLS("dsh-novel-forge.settings.tab", "model", [
38434
+ "model",
38435
+ "writing",
38436
+ "image",
38437
+ "files",
38438
+ "appearance",
38439
+ "background"
38440
+ ]));
38441
+ const [imageTestState, setImageTestState] = (0, react.useState)({});
38442
+ const [editorFontSize, setEditorFontSize] = (0, react.useState)(() => {
38443
+ try {
38444
+ const v = Number(window.localStorage.getItem("dsh-novel-forge.editor.fontSize"));
38445
+ return v >= 12 && v <= 24 ? v : 14;
38446
+ } catch {
38447
+ return 14;
38448
+ }
38449
+ });
38450
+ const [panelTheme, setPanelTheme] = (0, react.useState)(() => readLS("dsh-novel-forge.theme", "liquid", [
38451
+ "liquid",
38452
+ "neumorph",
38453
+ "macos",
38454
+ "clay"
38455
+ ]));
38456
+ const [themeMode, setThemeMode] = (0, react.useState)(() => readLS("dsh-novel-forge.theme.mode", "system", [
38457
+ "system",
38458
+ "light",
38459
+ "dark"
38460
+ ]));
38461
+ const [themeDensity, setThemeDensity] = (0, react.useState)(() => readLS("dsh-novel-forge.theme.density", "comfort", [
38462
+ "comfort",
38463
+ "compact",
38464
+ "spacious"
38465
+ ]));
38466
+ const loadConfig = async () => {
38467
+ try {
38468
+ const res = await api.status();
38469
+ setConfig(res.config);
38470
+ setConfigDraft(res.config);
38471
+ } catch (err) {
38472
+ setError(err.message);
38473
+ }
38474
+ };
38475
+ (0, react.useEffect)(() => {
38476
+ loadConfig();
38477
+ }, []);
38478
+ (0, react.useEffect)(() => {
38479
+ try {
38480
+ window.localStorage.setItem("dsh-novel-forge.settings.tab", settingsTab);
38481
+ } catch {}
38482
+ }, [settingsTab]);
38483
+ const changeSettingsTab = (next) => {
38484
+ setSettingsTabState(next);
38485
+ onSettingsTab?.(next);
38486
+ };
38487
+ const save = async () => {
38488
+ if (configDraft === null) return;
38489
+ setBusy(true);
38490
+ setError("");
38491
+ setNotice("");
38492
+ try {
38493
+ const result = await api.patchConfig({
38494
+ outlinePath: configDraft.outlinePath,
38495
+ outputDir: configDraft.outputDir,
38496
+ provider: configDraft.provider,
38497
+ model: configDraft.model,
38498
+ reasoningEffort: configDraft.reasoningEffort ?? "off",
38499
+ chapterChars: configDraft.chapterChars,
38500
+ maxTokens: configDraft.maxTokens,
38501
+ reviewPassScore: configDraft.reviewPassScore,
38502
+ autoReview: configDraft.autoReview,
38503
+ autoAuthorReview: configDraft.autoAuthorReview,
38504
+ autoReviewAfterRevise: configDraft.autoReviewAfterRevise,
38505
+ imageApiKey: configDraft.imageApiKey,
38506
+ imageApiModel: configDraft.imageApiModel,
38507
+ imageApiEnabled: configDraft.imageApiEnabled ?? false,
38508
+ themeBackground: configDraft.themeBackground ?? "",
38509
+ themeBackgroundBlur: configDraft.themeBackgroundBlur ?? 0,
38510
+ themeOpacity: configDraft.themeOpacity ?? 100,
38511
+ imageModels: configDraft.imageModels ?? []
38512
+ });
38513
+ setConfig(result.config);
38514
+ setConfigDraft(result.config);
38515
+ setNotice(tt("settings.saved"));
38516
+ } catch (err) {
38517
+ setError(err.message);
38518
+ } finally {
38519
+ setBusy(false);
38520
+ }
38521
+ };
38522
+ const patchImageModel = (id, patch) => {
38523
+ setConfigDraft((prev) => prev === null ? prev : {
38524
+ ...prev,
38525
+ imageModels: (prev.imageModels ?? []).map((m) => m.id === id ? {
38526
+ ...m,
38527
+ ...patch
38528
+ } : m)
38529
+ });
38530
+ };
38531
+ const addImageModel = () => {
38532
+ setConfigDraft((prev) => prev === null ? prev : {
38533
+ ...prev,
38534
+ imageModels: [...prev.imageModels ?? [], {
38535
+ id: "img-" + Date.now().toString(36),
38536
+ name: "",
38537
+ baseURL: "",
38538
+ apiKey: "",
38539
+ model: "",
38540
+ enabled: (prev.imageModels ?? []).length === 0
38541
+ }]
38542
+ });
38543
+ };
38544
+ const removeImageModel = (id) => {
38545
+ setConfigDraft((prev) => prev === null ? prev : {
38546
+ ...prev,
38547
+ imageModels: (prev.imageModels ?? []).filter((m) => m.id !== id)
38548
+ });
38549
+ };
38550
+ const enableImageModel = (id) => {
38551
+ setConfigDraft((prev) => prev === null ? prev : {
38552
+ ...prev,
38553
+ imageModels: (prev.imageModels ?? []).map((m) => ({
38554
+ ...m,
38555
+ enabled: m.id === id
38556
+ }))
38557
+ });
38558
+ };
38559
+ const testImageModel = async (m) => {
38560
+ if (m.baseURL.trim() === "" || m.apiKey.trim() === "") {
38561
+ setImageTestState((prev) => ({
38562
+ ...prev,
38563
+ [m.id]: {
38564
+ testing: false,
38565
+ ok: false,
38566
+ message: "请先填写接口地址和 API Key"
38567
+ }
38568
+ }));
38569
+ return;
38570
+ }
38571
+ setImageTestState((prev) => ({
38572
+ ...prev,
38573
+ [m.id]: { testing: true }
38574
+ }));
38575
+ try {
38576
+ const r = await api.imageTest({
38577
+ baseURL: m.baseURL,
38578
+ apiKey: m.apiKey,
38579
+ model: m.model
38580
+ });
38581
+ setImageTestState((prev) => ({
38582
+ ...prev,
38583
+ [m.id]: {
38584
+ testing: false,
38585
+ ok: r.ok,
38586
+ ms: r.ms,
38587
+ message: r.message
38588
+ }
38589
+ }));
38590
+ } catch (err) {
38591
+ setImageTestState((prev) => ({
38592
+ ...prev,
38593
+ [m.id]: {
38594
+ testing: false,
38595
+ ok: false,
38596
+ message: err.message
38597
+ }
38598
+ }));
38599
+ }
38600
+ };
38601
+ const changeTheme = (theme, mode, density) => {
38602
+ setPanelTheme(theme);
38603
+ setThemeMode(mode);
38604
+ setThemeDensity(density);
38605
+ try {
38606
+ window.localStorage.setItem("dsh-novel-forge.theme", theme);
38607
+ window.localStorage.setItem("dsh-novel-forge.theme.mode", mode);
38608
+ window.localStorage.setItem("dsh-novel-forge.theme.density", density);
38609
+ } catch {}
38610
+ onTheme?.(theme, mode, density);
38611
+ };
38612
+ const changeEditorFont = (n) => {
38613
+ const v = Math.min(24, Math.max(12, n));
38614
+ setEditorFontSize(v);
38615
+ try {
38616
+ window.localStorage.setItem("dsh-novel-forge.editor.fontSize", String(v));
38617
+ } catch {}
38618
+ onEditorFontSize?.(v);
38619
+ };
38620
+ const bgFileRef = (0, react.useRef)(null);
38621
+ const applyBackground = (bg) => {
38622
+ setConfigDraft((prev) => prev === null ? prev : {
38623
+ ...prev,
38624
+ themeBackground: bg ?? ""
38625
+ });
38626
+ onBackground?.(bg ?? void 0, configDraft?.themeBackgroundBlur ?? 0);
38627
+ };
38628
+ const applyBlur = (blur) => {
38629
+ setConfigDraft((prev) => prev === null ? prev : {
38630
+ ...prev,
38631
+ themeBackgroundBlur: blur
38632
+ });
38633
+ onBackground?.(configDraft?.themeBackground ?? void 0, blur);
38634
+ };
38635
+ const applyOpacity = (n) => {
38636
+ setConfigDraft((prev) => prev === null ? prev : {
38637
+ ...prev,
38638
+ themeOpacity: n
38639
+ });
38640
+ onOpacity?.(n);
38641
+ };
38642
+ const onBgFile = async (file) => {
38643
+ if (file === void 0) return;
38644
+ const dataUrl = await new Promise((resolve, reject) => {
38645
+ const fr = new FileReader();
38646
+ fr.onload = () => resolve(fr.result);
38647
+ fr.onerror = () => reject(fr.error ?? /* @__PURE__ */ new Error("读取失败"));
38648
+ fr.readAsDataURL(file);
38649
+ });
38650
+ try {
38651
+ const res = await api.themeBackgroundUpload(dataUrl);
38652
+ applyBackground(res.url);
38653
+ } catch (err) {
38654
+ setError(err.message);
38655
+ }
38656
+ };
38657
+ const resetTheme = () => {
38658
+ try {
38659
+ window.localStorage.removeItem("dsh-novel-forge.theme");
38660
+ window.localStorage.removeItem("dsh-novel-forge.theme.mode");
38661
+ window.localStorage.removeItem("dsh-novel-forge.theme.density");
38662
+ } catch {}
38663
+ changeTheme("liquid", "system", "comfort");
38664
+ };
38665
+ if (configDraft === null) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38666
+ className: panel_module_css_default.authorPageBody,
38667
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38668
+ className: panel_module_css_default.meta,
38669
+ children: "正在加载设置…"
38670
+ }), error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38671
+ className: panel_module_css_default.noticeError,
38672
+ children: error
38673
+ })]
38674
+ });
38675
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38676
+ className: panel_module_css_default.authorPageBody,
38677
+ "data-nf-theme": panelTheme,
38678
+ "data-nf-mode": themeMode === "system" ? void 0 : themeMode,
38679
+ "data-nf-density": themeDensity,
38680
+ children: [
38681
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38682
+ className: panel_module_css_default.authorPageHeader,
38683
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
38684
+ className: panel_module_css_default.panelTitle,
38685
+ style: { margin: 0 },
38686
+ children: "⚙️ 设置"
38687
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38688
+ className: panel_module_css_default.meta,
38689
+ children: [
38690
+ "当前:",
38691
+ config?.provider,
38692
+ " / ",
38693
+ config?.model,
38694
+ " · ",
38695
+ config?.outputDir
38696
+ ]
38697
+ })] })
38698
+ }),
38699
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38700
+ className: panel_module_css_default.row,
38701
+ style: {
38702
+ gap: "var(--nf-space-8)",
38703
+ flexWrap: "wrap"
38704
+ },
38705
+ children: SETTINGS_SECTIONS$1.map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
38706
+ type: "button",
38707
+ className: panel_module_css_default.button + (settingsTab === s.id ? " " + panel_module_css_default.buttonPrimary : ""),
38708
+ style: {
38709
+ flex: 1,
38710
+ minWidth: 104,
38711
+ justifyContent: "center"
38712
+ },
38713
+ onClick: () => changeSettingsTab(s.id),
38714
+ children: [
38715
+ s.icon,
38716
+ " ",
38717
+ s.label
38718
+ ]
38719
+ }, s.id))
38720
+ }),
38721
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38722
+ className: panel_module_css_default.noticeError,
38723
+ children: error
38724
+ }),
38725
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38726
+ className: panel_module_css_default.meta,
38727
+ children: notice
38728
+ }),
38729
+ settingsTab === "model" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38730
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
38731
+ style: { gap: "var(--nf-space-24)" },
38732
+ children: [
38733
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38734
+ className: panel_module_css_default.cardTitle,
38735
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Brain, {
38736
+ size: 18,
38737
+ style: { verticalAlign: -3 }
38738
+ }), " 模型与推理"]
38739
+ }),
38740
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38741
+ className: panel_module_css_default.field,
38742
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38743
+ className: panel_module_css_default.fieldLabel,
38744
+ children: tt("settings.provider")
38745
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38746
+ className: panel_module_css_default.input,
38747
+ value: configDraft.provider,
38748
+ onChange: (e) => setConfigDraft({
38749
+ ...configDraft,
38750
+ provider: e.target.value
38751
+ })
38752
+ })]
38753
+ }),
38754
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38755
+ className: panel_module_css_default.field,
38756
+ children: [
38757
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38758
+ className: panel_module_css_default.fieldLabel,
38759
+ children: tt("settings.model")
38760
+ }),
38761
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
38762
+ className: panel_module_css_default.input,
38763
+ value: modelCustomMode ? "__custom__" : configDraft.model,
38764
+ onChange: (e) => {
38765
+ const v = e.target.value;
38766
+ if (v === "__custom__") setModelCustomMode(true);
38767
+ else {
38768
+ setModelCustomMode(false);
38769
+ setConfigDraft({
38770
+ ...configDraft,
38771
+ model: v
38772
+ });
38773
+ }
38774
+ },
38775
+ children: [MODEL_PRESETS$1.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38776
+ value: m,
38777
+ children: m
38778
+ }, m)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38779
+ value: "__custom__",
38780
+ children: tt("settings.modelCustom")
38781
+ })]
38782
+ }),
38783
+ modelCustomMode && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38784
+ className: panel_module_css_default.input,
38785
+ value: configDraft.model,
38786
+ placeholder: tt("settings.modelCustomPlaceholder"),
38787
+ onChange: (e) => setConfigDraft({
38788
+ ...configDraft,
38789
+ model: e.target.value
38790
+ })
38791
+ })
38792
+ ]
38793
+ }),
38794
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38795
+ className: panel_module_css_default.field,
38796
+ children: [
38797
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38798
+ className: panel_module_css_default.fieldLabel,
38799
+ children: tt("settings.reasoningEffort")
38800
+ }),
38801
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
38802
+ className: panel_module_css_default.input,
38803
+ value: configDraft.reasoningEffort ?? "off",
38804
+ onChange: (e) => setConfigDraft({
38805
+ ...configDraft,
38806
+ reasoningEffort: e.target.value
38807
+ }),
38808
+ children: REASONING_OPTIONS$1.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38809
+ value: v,
38810
+ children: REASONING_LABEL[v]
38811
+ }, v))
38812
+ }),
38813
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38814
+ className: panel_module_css_default.meta,
38815
+ children: tt("settings.reasoningHint")
38816
+ })
38817
+ ]
38818
+ }),
38819
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38820
+ className: panel_module_css_default.field,
38821
+ children: [
38822
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38823
+ className: panel_module_css_default.fieldLabel,
38824
+ children: tt("settings.analysisReasoning")
38825
+ }),
38826
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
38827
+ className: panel_module_css_default.input,
38828
+ value: configDraft.analysisReasoning ?? "low",
38829
+ onChange: (e) => setConfigDraft({
38830
+ ...configDraft,
38831
+ analysisReasoning: e.target.value
38832
+ }),
38833
+ children: REASONING_OPTIONS$1.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38834
+ value: v,
38835
+ children: REASONING_LABEL[v]
38836
+ }, v))
38837
+ }),
38838
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38839
+ className: panel_module_css_default.meta,
38840
+ children: tt("settings.analysisReasoningHint")
38841
+ })
38842
+ ]
38843
+ })
38844
+ ]
38845
+ }),
38846
+ settingsTab === "writing" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38847
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
38848
+ style: { gap: "var(--nf-space-24)" },
38849
+ children: [
38850
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38851
+ className: panel_module_css_default.cardTitle,
38852
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PenLine, {
38853
+ size: 18,
38854
+ style: { verticalAlign: -3 }
38855
+ }), " 写作与审稿"]
38856
+ }),
38857
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38858
+ className: panel_module_css_default.field,
38859
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38860
+ className: panel_module_css_default.fieldLabel,
38861
+ children: tt("settings.chapterChars")
38862
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38863
+ className: panel_module_css_default.input,
38864
+ type: "number",
38865
+ min: 1e3,
38866
+ max: 2e4,
38867
+ value: configDraft.chapterChars,
38868
+ onChange: (e) => setConfigDraft({
38869
+ ...configDraft,
38870
+ chapterChars: Number(e.target.value)
38871
+ })
38872
+ })]
38873
+ }),
38874
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38875
+ className: panel_module_css_default.field,
38876
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38877
+ className: panel_module_css_default.fieldLabel,
38878
+ children: tt("settings.maxTokens")
38879
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38880
+ className: panel_module_css_default.input,
38881
+ type: "number",
38882
+ min: 2e3,
38883
+ max: 64e3,
38884
+ value: configDraft.maxTokens,
38885
+ onChange: (e) => setConfigDraft({
38886
+ ...configDraft,
38887
+ maxTokens: Number(e.target.value)
38888
+ })
38889
+ })]
38890
+ }),
38891
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38892
+ className: panel_module_css_default.field,
38893
+ children: [
38894
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38895
+ className: panel_module_css_default.fieldLabel,
38896
+ children: tt("settings.reviewPassScore")
38897
+ }),
38898
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38899
+ className: panel_module_css_default.input,
38900
+ type: "number",
38901
+ min: 0,
38902
+ max: 100,
38903
+ value: configDraft.reviewPassScore,
38904
+ onChange: (e) => setConfigDraft({
38905
+ ...configDraft,
38906
+ reviewPassScore: Number(e.target.value)
38907
+ })
38908
+ }),
38909
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38910
+ className: panel_module_css_default.meta,
38911
+ children: "通过判定:综合评分 ≥ 此分数(默认 70),或无 high 级问题且评分 ≥ 60;建议设 60-80。"
38912
+ })
38913
+ ]
38914
+ }),
38915
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38916
+ className: panel_module_css_default.field,
38917
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38918
+ className: panel_module_css_default.fieldLabel,
38919
+ children: tt("settings.autoReview")
38920
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
38921
+ className: panel_module_css_default.input,
38922
+ value: configDraft.autoReview ? "1" : "0",
38923
+ onChange: (e) => setConfigDraft({
38924
+ ...configDraft,
38925
+ autoReview: e.target.value === "1"
38926
+ }),
38927
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38928
+ value: "1",
38929
+ children: "✓ 是"
38930
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38931
+ value: "0",
38932
+ children: "✗ 否"
38933
+ })]
38934
+ })]
38935
+ }),
38936
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38937
+ className: panel_module_css_default.field,
38938
+ children: [
38939
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38940
+ className: panel_module_css_default.fieldLabel,
38941
+ children: tt("settings.autoAuthorReview")
38942
+ }),
38943
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
38944
+ className: panel_module_css_default.input,
38945
+ value: configDraft.autoAuthorReview ? "1" : "0",
38946
+ onChange: (e) => setConfigDraft({
38947
+ ...configDraft,
38948
+ autoAuthorReview: e.target.value === "1"
38949
+ }),
38950
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38951
+ value: "1",
38952
+ children: "✓ 是"
38953
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38954
+ value: "0",
38955
+ children: "✗ 否"
38956
+ })]
38957
+ }),
38958
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38959
+ className: panel_module_css_default.meta,
38960
+ children: tt("settings.autoAuthorReviewHint")
38961
+ })
38962
+ ]
38963
+ }),
38964
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38965
+ className: panel_module_css_default.field,
38966
+ children: [
38967
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38968
+ className: panel_module_css_default.fieldLabel,
38969
+ children: tt("settings.autoReviewAfterRevise")
38970
+ }),
38971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
38972
+ className: panel_module_css_default.input,
38973
+ value: configDraft.autoReviewAfterRevise ? "1" : "0",
38974
+ onChange: (e) => setConfigDraft({
38975
+ ...configDraft,
38976
+ autoReviewAfterRevise: e.target.value === "1"
38977
+ }),
38978
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38979
+ value: "1",
38980
+ children: "✓ 是"
38981
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
38982
+ value: "0",
38983
+ children: "✗ 否"
38984
+ })]
38985
+ }),
38986
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38987
+ className: panel_module_css_default.meta,
38988
+ children: tt("settings.autoReviewAfterReviseHint")
38989
+ })
38990
+ ]
38991
+ }),
38992
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38993
+ className: panel_module_css_default.field,
38994
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
38995
+ className: panel_module_css_default.fieldLabel,
38996
+ children: "编辑器字号(正文编辑 / 工作区)"
38997
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
38998
+ className: panel_module_css_default.input,
38999
+ value: editorFontSize,
39000
+ onChange: (e) => changeEditorFont(Number(e.target.value)),
39001
+ children: [
39002
+ 12,
39003
+ 13,
39004
+ 14,
39005
+ 15,
39006
+ 16,
39007
+ 18,
39008
+ 20,
39009
+ 22,
39010
+ 24
39011
+ ].map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("option", {
39012
+ value: v,
39013
+ children: [v, "px"]
39014
+ }, v))
39015
+ })]
39016
+ })
39017
+ ]
39018
+ }),
39019
+ settingsTab === "image" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39020
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
39021
+ style: { gap: "var(--nf-space-24)" },
39022
+ children: [
39023
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39024
+ className: panel_module_css_default.row,
39025
+ style: {
39026
+ justifyContent: "space-between",
39027
+ flexWrap: "wrap",
39028
+ alignItems: "center"
39029
+ },
39030
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39031
+ className: panel_module_css_default.cardTitle,
39032
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Palette, {
39033
+ size: 18,
39034
+ style: { verticalAlign: -3 }
39035
+ }), " 生图模型"]
39036
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39037
+ className: panel_module_css_default.meta,
39038
+ children: "启用生图功能"
39039
+ })]
39040
+ }),
39041
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39042
+ className: panel_module_css_default.meta,
39043
+ children: "支持多套 OpenAI 兼容生图接口(豆包 / 即梦 / 其他平台);启用一条作为生成模型。"
39044
+ }),
39045
+ (configDraft.imageModels ?? []).map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39046
+ style: {
39047
+ border: m.enabled ? "1px solid var(--nf-accent)" : "1px solid var(--nf-border)",
39048
+ borderRadius: "var(--nf-radius-12)",
39049
+ padding: "var(--nf-space-14)",
39050
+ display: "flex",
39051
+ flexDirection: "column",
39052
+ gap: "var(--nf-space-12)",
39053
+ background: m.enabled ? "var(--nf-accent-soft)" : "transparent"
39054
+ },
39055
+ children: [
39056
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39057
+ className: panel_module_css_default.row,
39058
+ style: {
39059
+ alignItems: "flex-end",
39060
+ flexWrap: "wrap"
39061
+ },
39062
+ children: [
39063
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39064
+ className: panel_module_css_default.field,
39065
+ style: {
39066
+ flex: 1,
39067
+ minWidth: 160
39068
+ },
39069
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39070
+ className: panel_module_css_default.fieldLabel,
39071
+ children: "名称"
39072
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39073
+ className: panel_module_css_default.input,
39074
+ value: m.name,
39075
+ onChange: (e) => patchImageModel(m.id, { name: e.target.value })
39076
+ })]
39077
+ }),
39078
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39079
+ className: panel_module_css_default.field,
39080
+ style: {
39081
+ flex: 1,
39082
+ minWidth: 150
39083
+ },
39084
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39085
+ className: panel_module_css_default.fieldLabel,
39086
+ children: "模型 id"
39087
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39088
+ className: panel_module_css_default.input,
39089
+ value: m.model,
39090
+ onChange: (e) => patchImageModel(m.id, { model: e.target.value })
39091
+ })]
39092
+ }),
39093
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39094
+ className: panel_module_css_default.field,
39095
+ style: {
39096
+ flex: 1,
39097
+ minWidth: 200
39098
+ },
39099
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39100
+ className: panel_module_css_default.fieldLabel,
39101
+ children: "接口地址"
39102
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39103
+ className: panel_module_css_default.input,
39104
+ value: m.baseURL,
39105
+ onChange: (e) => patchImageModel(m.id, { baseURL: e.target.value })
39106
+ })]
39107
+ })
39108
+ ]
39109
+ }),
39110
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39111
+ className: panel_module_css_default.field,
39112
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39113
+ className: panel_module_css_default.fieldLabel,
39114
+ children: "API Key"
39115
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39116
+ className: panel_module_css_default.input,
39117
+ type: "password",
39118
+ value: m.apiKey,
39119
+ onChange: (e) => patchImageModel(m.id, { apiKey: e.target.value })
39120
+ })]
39121
+ }),
39122
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39123
+ className: panel_module_css_default.row,
39124
+ style: {
39125
+ gap: "var(--nf-space-8)",
39126
+ flexWrap: "wrap",
39127
+ alignItems: "center"
39128
+ },
39129
+ children: [
39130
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
39131
+ type: "button",
39132
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + (m.enabled ? " " + panel_module_css_default.buttonPrimary : ""),
39133
+ onClick: () => enableImageModel(m.id),
39134
+ children: m.enabled ? "✓ 已启用" : "设为启用"
39135
+ }),
39136
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39137
+ type: "button",
39138
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
39139
+ disabled: imageTestState[m.id]?.testing === true,
39140
+ onClick: () => {
39141
+ testImageModel(m);
39142
+ },
39143
+ children: [
39144
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PlugZap, {
39145
+ size: 13,
39146
+ style: { verticalAlign: -2 }
39147
+ }),
39148
+ " ",
39149
+ imageTestState[m.id]?.testing === true ? "测试中…" : "测试"
39150
+ ]
39151
+ }),
39152
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39153
+ type: "button",
39154
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
39155
+ onClick: () => removeImageModel(m.id),
39156
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Trash2, {
39157
+ size: 13,
39158
+ style: { verticalAlign: -2 }
39159
+ }), " 删除"]
39160
+ })
39161
+ ]
39162
+ })
39163
+ ]
39164
+ }, m.id)),
39165
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39166
+ className: panel_module_css_default.row,
39167
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39168
+ type: "button",
39169
+ className: panel_module_css_default.button,
39170
+ onClick: addImageModel,
39171
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
39172
+ size: 13,
39173
+ style: { verticalAlign: -2 }
39174
+ }), " 添加生图模型"]
39175
+ })
39176
+ })
39177
+ ]
39178
+ }),
39179
+ settingsTab === "files" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39180
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
39181
+ style: { gap: "var(--nf-space-24)" },
39182
+ children: [
39183
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39184
+ className: panel_module_css_default.cardTitle,
39185
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Folder, {
39186
+ size: 18,
39187
+ style: { verticalAlign: -3 }
39188
+ }), " 路径与文件"]
39189
+ }),
39190
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39191
+ className: panel_module_css_default.field,
39192
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39193
+ className: panel_module_css_default.fieldLabel,
39194
+ children: tt("settings.outlinePath")
39195
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39196
+ className: panel_module_css_default.input,
39197
+ value: configDraft.outlinePath,
39198
+ onChange: (e) => setConfigDraft({
39199
+ ...configDraft,
39200
+ outlinePath: e.target.value
39201
+ })
39202
+ })]
39203
+ }),
39204
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39205
+ className: panel_module_css_default.field,
39206
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39207
+ className: panel_module_css_default.fieldLabel,
39208
+ children: tt("settings.outputDir")
39209
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36721
39210
  className: panel_module_css_default.input,
36722
- style: { flex: 1 },
36723
- placeholder: "新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)",
36724
- value: newRule,
36725
- onChange: (e) => {
36726
- setNewRule(e.target.value);
36727
- }
36728
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36729
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
36730
- disabled: busy || newRule.trim() === "",
39211
+ value: configDraft.outputDir,
39212
+ onChange: (e) => setConfigDraft({
39213
+ ...configDraft,
39214
+ outputDir: e.target.value
39215
+ })
39216
+ })]
39217
+ }),
39218
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39219
+ className: panel_module_css_default.row,
39220
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
39221
+ type: "button",
39222
+ className: panel_module_css_default.button,
36731
39223
  onClick: () => {
36732
- handleAddRule();
39224
+ api.openFolder();
36733
39225
  },
36734
- children: "+ 添加"
39226
+ children: tt("settings.openFolder")
39227
+ })
39228
+ })
39229
+ ]
39230
+ }),
39231
+ settingsTab === "appearance" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39232
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
39233
+ children: [
39234
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39235
+ className: panel_module_css_default.cardTitle,
39236
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Sparkles, {
39237
+ size: 18,
39238
+ style: { verticalAlign: -3 }
39239
+ }), " 外观与主题"]
39240
+ }),
39241
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39242
+ className: panel_module_css_default.field,
39243
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39244
+ className: panel_module_css_default.fieldLabel,
39245
+ children: "显示模式"
39246
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
39247
+ className: panel_module_css_default.input,
39248
+ value: themeMode,
39249
+ onChange: (e) => changeTheme(panelTheme, e.target.value, themeDensity),
39250
+ children: [
39251
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39252
+ value: "system",
39253
+ children: "跟随系统"
39254
+ }),
39255
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39256
+ value: "light",
39257
+ children: "浅色"
39258
+ }),
39259
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39260
+ value: "dark",
39261
+ children: "深色"
39262
+ })
39263
+ ]
39264
+ })]
39265
+ }),
39266
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39267
+ className: panel_module_css_default.field,
39268
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39269
+ className: panel_module_css_default.fieldLabel,
39270
+ children: "主题风格"
39271
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
39272
+ className: panel_module_css_default.input,
39273
+ value: panelTheme,
39274
+ onChange: (e) => changeTheme(e.target.value, themeMode, themeDensity),
39275
+ children: [
39276
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39277
+ value: "liquid",
39278
+ children: "液态玻璃 · 清新绿(默认)"
39279
+ }),
39280
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39281
+ value: "neumorph",
39282
+ children: "新拟物 · 柔和浅色"
39283
+ }),
39284
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39285
+ value: "macos",
39286
+ children: "macOS · 玻璃(蓝,随外观浅/深)"
39287
+ }),
39288
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39289
+ value: "clay",
39290
+ children: "粘土拟态 · 柔和黏土"
39291
+ })
39292
+ ]
39293
+ })]
39294
+ }),
39295
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39296
+ className: panel_module_css_default.field,
39297
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39298
+ className: panel_module_css_default.fieldLabel,
39299
+ children: "界面密度"
39300
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
39301
+ className: panel_module_css_default.input,
39302
+ value: themeDensity,
39303
+ onChange: (e) => changeTheme(panelTheme, themeMode, e.target.value),
39304
+ children: [
39305
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39306
+ value: "comfort",
39307
+ children: "舒适(默认)"
39308
+ }),
39309
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39310
+ value: "compact",
39311
+ children: "紧凑"
39312
+ }),
39313
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
39314
+ value: "spacious",
39315
+ children: "宽松"
39316
+ })
39317
+ ]
36735
39318
  })]
39319
+ }),
39320
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39321
+ className: panel_module_css_default.field,
39322
+ children: [
39323
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39324
+ className: panel_module_css_default.fieldLabel,
39325
+ children: "玻璃透明度(0-100)"
39326
+ }),
39327
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39328
+ className: panel_module_css_default.input,
39329
+ type: "range",
39330
+ min: 0,
39331
+ max: 100,
39332
+ value: configDraft.themeOpacity ?? 100,
39333
+ onChange: (e) => applyOpacity(Number(e.target.value))
39334
+ }),
39335
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39336
+ className: panel_module_css_default.meta,
39337
+ children: "100=当前主题原样;调低会让玻璃/卡片变透,新拟态、黏土等实色主题能透出背景图。"
39338
+ })
39339
+ ]
39340
+ }),
39341
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39342
+ className: panel_module_css_default.row,
39343
+ style: { justifyContent: "flex-end" },
39344
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39345
+ type: "button",
39346
+ className: panel_module_css_default.button,
39347
+ onClick: resetTheme,
39348
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RotateCcw, {
39349
+ size: 14,
39350
+ style: { verticalAlign: -2 }
39351
+ }), " 恢复默认主题"]
39352
+ })
36736
39353
  })
36737
39354
  ]
36738
39355
  }),
36739
- assetTab === "style" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36740
- className: panel_module_css_default.card,
39356
+ settingsTab === "background" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39357
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
39358
+ style: { gap: "var(--nf-space-12)" },
36741
39359
  children: [
36742
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39360
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
36743
39361
  className: panel_module_css_default.cardTitle,
36744
- children: "心法"
39362
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Image, {
39363
+ size: 18,
39364
+ style: { verticalAlign: -3 }
39365
+ }), " 自定义背景"]
36745
39366
  }),
36746
39367
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36747
39368
  className: panel_module_css_default.meta,
36748
- children: "粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。"
39369
+ children: "填图片 URL 或上传图片作为小说工坊背景(首页 + 书内)。留空 = 使用主题默认背景。"
36749
39370
  }),
36750
- assets.styleAssets.map((style) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39371
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39372
+ className: panel_module_css_default.row,
36751
39373
  style: {
36752
- border: "1px solid var(--nf-border)",
36753
- borderRadius: "var(--nf-radius-6)",
36754
- padding: "var(--nf-space-6) var(--nf-space-10)",
36755
- fontSize: "var(--nf-fs-12)"
39374
+ gap: "var(--nf-space-8)",
39375
+ flexWrap: "wrap"
36756
39376
  },
36757
39377
  children: [
36758
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: style.name }),
36759
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36760
- className: panel_module_css_default.meta,
36761
- children: ["叙述:", style.proseRules.slice(0, 3).join(";")]
39378
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39379
+ className: panel_module_css_default.input,
39380
+ style: {
39381
+ flex: 1,
39382
+ minWidth: 220
39383
+ },
39384
+ placeholder: "https://… 图片地址",
39385
+ value: (configDraft.themeBackground ?? "").startsWith("data:") ? "" : configDraft.themeBackground ?? "",
39386
+ onChange: (e) => applyBackground(e.target.value.trim() !== "" ? e.target.value.trim() : void 0)
36762
39387
  }),
36763
- style.dialogueRules.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36764
- className: panel_module_css_default.meta,
36765
- children: ["台词:", style.dialogueRules.slice(0, 2).join(";")]
39388
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39389
+ type: "button",
39390
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
39391
+ onClick: () => bgFileRef.current?.click(),
39392
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Upload, {
39393
+ size: 13,
39394
+ style: { verticalAlign: -2 }
39395
+ }), " 上传图片"]
39396
+ }),
39397
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39398
+ type: "button",
39399
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
39400
+ onClick: () => applyBackground(void 0),
39401
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.X, {
39402
+ size: 13,
39403
+ style: { verticalAlign: -2 }
39404
+ }), " 清除"]
36766
39405
  })
36767
39406
  ]
36768
- }, style.name)),
36769
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
36770
- className: panel_module_css_default.textarea,
36771
- style: { minHeight: 90 },
36772
- placeholder: "粘贴样本文本(一段能代表目标风格的文字,50 字以上)…",
36773
- value: sampleText,
39407
+ }),
39408
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39409
+ ref: bgFileRef,
39410
+ type: "file",
39411
+ accept: "image/*",
39412
+ style: { display: "none" },
36774
39413
  onChange: (e) => {
36775
- setSampleText(e.target.value);
39414
+ onBgFile(e.target.files?.[0]);
39415
+ e.target.value = "";
36776
39416
  }
36777
39417
  }),
36778
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36779
- className: panel_module_css_default.row,
36780
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36781
- className: panel_module_css_default.input,
36782
- style: { flex: 1 },
36783
- placeholder: "写法资产名(可选)",
36784
- value: styleName,
36785
- onChange: (e) => {
36786
- setStyleName(e.target.value);
36787
- }
36788
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
36789
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
36790
- disabled: busy || sampleText.trim().length < 50,
36791
- onClick: () => {
36792
- handleExtractStyle();
36793
- },
36794
- children: "提取并绑定"
39418
+ (configDraft.themeBackground ?? "") !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39419
+ className: panel_module_css_default.adaptInputCard,
39420
+ style: { padding: 8 },
39421
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { style: {
39422
+ width: 180,
39423
+ height: 100,
39424
+ borderRadius: 10,
39425
+ backgroundImage: "url(" + configDraft.themeBackground + ")",
39426
+ backgroundSize: "cover",
39427
+ backgroundPosition: "center"
39428
+ } }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39429
+ className: panel_module_css_default.meta,
39430
+ children: "已设置背景(预览)"
36795
39431
  })]
39432
+ }),
39433
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39434
+ className: panel_module_css_default.field,
39435
+ children: [
39436
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
39437
+ className: panel_module_css_default.fieldLabel,
39438
+ children: "遮罩 / 模糊强度(0-80)"
39439
+ }),
39440
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
39441
+ className: panel_module_css_default.input,
39442
+ type: "range",
39443
+ min: 0,
39444
+ max: 80,
39445
+ value: configDraft.themeBackgroundBlur ?? 0,
39446
+ onChange: (e) => applyBlur(Number(e.target.value))
39447
+ }),
39448
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39449
+ className: panel_module_css_default.meta,
39450
+ children: "越大背景越暗,保证文字可读(图很花时调高)。"
39451
+ })
39452
+ ]
36796
39453
  })
36797
39454
  ]
39455
+ }),
39456
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39457
+ className: panel_module_css_default.row,
39458
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
39459
+ type: "button",
39460
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
39461
+ disabled: busy,
39462
+ onClick: () => {
39463
+ save();
39464
+ },
39465
+ children: busy ? "保存中…" : tt("settings.save")
39466
+ })
36798
39467
  })
36799
39468
  ]
36800
39469
  });
36801
39470
  }
36802
39471
  //#endregion
36803
- //#region src/client/panel/ShelfView.tsx
39472
+ //#region src/client/panel/AuthorHome.tsx
36804
39473
  /**
36805
- * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。
36806
- * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。
39474
+ * 作者级首页容器:书架页左侧导航 + 内容区。
39475
+ * 导航复用工作区 .panelNav 玻璃卡片样式(同款),导航项为作者级:书架/改编/资产库/全局资产库/AI 进度/设置。
36807
39476
  */
36808
- /** 相对时间(人性化:刚刚 / N 分钟前 / N 小时前 / N 天前 / 日期)。 */
36809
- function relativeTime(iso) {
36810
- const t = new Date(iso).getTime();
36811
- if (!Number.isFinite(t)) return "";
36812
- const diff = Date.now() - t;
36813
- if (diff < 6e4) return "刚刚";
36814
- if (diff < 36e5) return `${Math.floor(diff / 6e4)} 分钟前`;
36815
- if (diff < 864e5) return `${Math.floor(diff / 36e5)} 小时前`;
36816
- if (diff < 7 * 864e5) return `${Math.floor(diff / 864e5)} 天前`;
36817
- return new Date(t).toLocaleDateString("zh-CN", {
36818
- month: "numeric",
36819
- day: "numeric"
36820
- });
36821
- }
36822
- /** 一本书的状态标签。 */
36823
- function bookStatus(book) {
36824
- if (!book.hasProject) return "none";
36825
- return book.total > 0 && book.done >= book.total ? "done" : "active";
36826
- }
36827
- /** 一张书卡(封面懒加载)。 */
36828
- function BookCard({ api, book, active, onOpen, onRead }) {
36829
- const [cover, setCover] = (0, react.useState)(null);
36830
- (0, react.useEffect)(() => {
36831
- if (!book.hasCover) return;
36832
- let cancelled = false;
36833
- api.coverGet(book.outputDir).then((result) => {
36834
- if (!cancelled) setCover(result.dataUrl);
36835
- }).catch(() => {});
36836
- return () => {
36837
- cancelled = true;
36838
- };
36839
- }, [
36840
- api,
36841
- book.hasCover,
36842
- book.outputDir
36843
- ]);
36844
- const ratio = book.total > 0 ? Math.min(book.done / book.total, 1) : 0;
36845
- const status = bookStatus(book);
36846
- const statusLabel = status === "none" ? "未开书" : status === "done" ? "已完结" : "进行中";
36847
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36848
- className: `${panel_module_css_default.bookCard} ${active ? panel_module_css_default.bookCardActive : ""}`,
36849
- onClick: onOpen,
36850
- title: `打开《${book.bookName}》`,
36851
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36852
- className: panel_module_css_default.bookCardCover,
36853
- children: cover !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
36854
- src: cover,
36855
- alt: `《${book.bookName}》封面`
36856
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36857
- className: panel_module_css_default.bookCardCoverFallback,
36858
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36859
- className: panel_module_css_default.bookCardCoverTitle,
36860
- children: book.bookName.slice(0, 4)
36861
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36862
- className: panel_module_css_default.meta,
36863
- children: "暂无封面"
36864
- })]
36865
- })
36866
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36867
- className: panel_module_css_default.bookCardBody,
36868
- children: [
36869
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36870
- className: panel_module_css_default.bookCardTitleRow,
36871
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36872
- className: panel_module_css_default.bookCardName,
36873
- children: book.bookName
36874
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36875
- className: `${panel_module_css_default.badge} ${status === "none" ? panel_module_css_default.badgePending : status === "done" ? panel_module_css_default.badgeDone : panel_module_css_default.badgeWritten}`,
36876
- children: statusLabel
36877
- })]
36878
- }),
36879
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36880
- className: `${panel_module_css_default.meta} ${panel_module_css_default.bookCardBlurb}`,
36881
- title: book.blurb ?? "",
36882
- children: book.blurb !== void 0 && book.blurb !== "" ? book.blurb : "暂无简介"
36883
- }),
36884
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36885
- className: panel_module_css_default.bookCardProgressBar,
36886
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36887
- className: panel_module_css_default.bookCardProgressFill,
36888
- style: { width: `${Math.round(ratio * 100)}%` }
36889
- })
36890
- }),
36891
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36892
- className: panel_module_css_default.bookCardMetaRow,
36893
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
36894
- className: panel_module_css_default.meta,
36895
- children: book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : "尚未规划章节"
36896
- }), book.hasProject && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
36897
- className: panel_module_css_default.meta,
36898
- title: "最近活动时间",
36899
- children: ["更新于 ", relativeTime(book.updatedAt)]
36900
- })]
36901
- }),
36902
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36903
- className: panel_module_css_default.bookCardActions,
36904
- onClick: (e) => {
36905
- e.stopPropagation();
36906
- },
36907
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
36908
- type: "button",
36909
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
36910
- onClick: onOpen,
36911
- title: "进入创作工作台(大纲/章节/审稿/设定)",
36912
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PenLine, {
36913
- size: 13,
36914
- style: { verticalAlign: -2 }
36915
- }), " 进入工作台"]
36916
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
36917
- type: "button",
36918
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
36919
- disabled: !book.hasProject || book.done === 0,
36920
- onClick: onRead,
36921
- title: book.hasProject && book.done > 0 ? "沉浸式阅读已写章节" : "尚无已写章节,先去工作台创作",
36922
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, {
36923
- size: 13,
36924
- style: { verticalAlign: -2 }
36925
- }), " 阅读"]
36926
- })]
36927
- })
36928
- ]
36929
- })]
36930
- });
36931
- }
36932
- /** 书架首页。 */
36933
- function ShelfView({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook }) {
36934
- const [query, setQuery] = (0, react.useState)("");
36935
- /** 筛选:all=全部 / active=进行中 / done=已完结 / none=未开书。 */
36936
- const [filter, setFilter] = (0, react.useState)("all");
36937
- const stats = (0, react.useMemo)(() => {
36938
- let active = 0, done = 0, none = 0;
36939
- for (const b of shelf.books) {
36940
- const s = bookStatus(b);
36941
- if (s === "none") none++;
36942
- else if (s === "done") done++;
36943
- else active++;
36944
- }
36945
- return {
36946
- active,
36947
- done,
36948
- none
36949
- };
36950
- }, [shelf.books]);
36951
- const visible = (0, react.useMemo)(() => {
36952
- const q = query.trim().toLowerCase();
36953
- return shelf.books.filter((b) => {
36954
- if (filter !== "all" && bookStatus(b) !== filter) return false;
36955
- if (q === "") return true;
36956
- return b.bookName.toLowerCase().includes(q) || (b.blurb ?? "").toLowerCase().includes(q);
36957
- });
36958
- }, [
36959
- shelf.books,
36960
- query,
36961
- filter
36962
- ]);
39477
+ const NAV_ITEMS = [
39478
+ {
39479
+ id: "shelf",
39480
+ label: "书架",
39481
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, { size: 18 }),
39482
+ hint: "我的书"
39483
+ },
39484
+ {
39485
+ id: "adapt",
39486
+ label: "改编模式",
39487
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wand2, { size: 18 }),
39488
+ hint: "上传全文→可改范围"
39489
+ },
39490
+ {
39491
+ id: "assets",
39492
+ label: "作者资产库",
39493
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Boxes, { size: 18 }),
39494
+ hint: "跨书总数据"
39495
+ },
39496
+ {
39497
+ id: "library",
39498
+ label: "全局写作资产库",
39499
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Brush, { size: 18 }),
39500
+ hint: "内置题材/规则/模板"
39501
+ },
39502
+ {
39503
+ id: "progress",
39504
+ label: "AI 进度",
39505
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BarChart3, { size: 18 }),
39506
+ hint: "书架级聚合进度"
39507
+ }
39508
+ ];
39509
+ function Placeholder({ title, hint }) {
36963
39510
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36964
- className: panel_module_css_default.shelfView,
39511
+ className: panel_module_css_default.authorPageBody,
36965
39512
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36966
- className: panel_module_css_default.shelfHero,
36967
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36968
- className: panel_module_css_default.shelfTitleRow,
36969
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
36970
- className: panel_module_css_default.panelTitle,
36971
- style: { margin: 0 },
36972
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, {
36973
- size: 20,
36974
- style: { verticalAlign: -3 }
36975
- }), " AI小说工坊 · 书架"]
36976
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
36977
- className: `${panel_module_css_default.input} ${panel_module_css_default.shelfSearch}`,
36978
- type: "search",
36979
- placeholder: "🔍 搜索书名 / 简介…",
36980
- value: query,
36981
- onChange: (e) => {
36982
- setQuery(e.target.value);
36983
- }
36984
- })]
36985
- }), shelf.books.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
36986
- className: panel_module_css_default.shelfStats,
36987
- children: [
36988
- {
36989
- id: "all",
36990
- label: "总书数",
36991
- value: shelf.books.length
36992
- },
36993
- {
36994
- id: "active",
36995
- label: "进行中",
36996
- value: stats.active
36997
- },
36998
- {
36999
- id: "done",
37000
- label: "已完结",
37001
- value: stats.done
37002
- },
37003
- {
37004
- id: "none",
37005
- label: "未开书",
37006
- value: stats.none
37007
- }
37008
- ].map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37009
- className: `${panel_module_css_default.shelfStat} ${filter === s.id ? panel_module_css_default.shelfStatActive : ""}`,
37010
- title: s.id === "all" ? "显示全部书籍" : `只看「${s.label}」的书(再点一次取消筛选)`,
37011
- onClick: () => {
37012
- setFilter((prev) => prev === s.id ? "all" : s.id);
37013
- },
37014
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: s.value }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: s.label })]
37015
- }, s.id))
39513
+ className: panel_module_css_default.authorPageHeader,
39514
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
39515
+ className: panel_module_css_default.panelTitle,
39516
+ style: { margin: 0 },
39517
+ children: title
39518
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39519
+ className: panel_module_css_default.meta,
39520
+ children: hint
37016
39521
  })]
37017
- }), shelf.books.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39522
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37018
39523
  className: panel_module_css_default.shelfEmpty,
39524
+ style: { minHeight: 160 },
37019
39525
  children: [
37020
39526
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37021
39527
  className: panel_module_css_default.shelfEmptyIcon,
37022
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 34 })
39528
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Info, { size: 30 })
37023
39529
  }),
37024
39530
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37025
39531
  className: panel_module_css_default.shelfEmptyTitle,
37026
- children: "你的创作从这里开始"
39532
+ children: "此入口为占位"
37027
39533
  }),
37028
39534
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37029
39535
  className: panel_module_css_default.meta,
37030
- children: "开一本书:粘贴大纲或导入 docx,书名自动识别,开书即建项目"
37031
- }),
37032
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
37033
- type: "button",
37034
- className: `${panel_module_css_default.button} ${panel_module_css_default.buttonPrimary}`,
37035
- onClick: onAddBook,
37036
- children: "+ 开第一本书"
37037
- }),
37038
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
37039
- type: "button",
37040
- className: `${panel_module_css_default.button}`,
37041
- onClick: onImportBook,
37042
- children: "📥 导入已有小说"
39536
+ children: "后续版本实现。当前「全局写作资产库」可进入某本书「创作资产」页查看内置题材库/反AI规则库/风格模板;「设置」为独立设置页。"
37043
39537
  })
37044
39538
  ]
37045
- }) : visible.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37046
- className: panel_module_css_default.shelfEmpty,
37047
- style: { minHeight: 160 },
39539
+ })]
39540
+ });
39541
+ }
39542
+ function AuthorHome({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onOpenSettings, onTheme, onBackground, onOpacity, adaptEnabled }) {
39543
+ const [nav, setNav] = (0, react.useState)("shelf");
39544
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39545
+ className: panel_module_css_default.authorHome,
39546
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("nav", {
39547
+ className: panel_module_css_default.panelNav,
39548
+ "aria-label": "作者级导航",
37048
39549
  children: [
37049
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37050
- className: panel_module_css_default.shelfEmptyIcon,
37051
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Search, { size: 34 })
39550
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39551
+ className: panel_module_css_default.navTitle,
39552
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39553
+ className: panel_module_css_default.navTitleLogo,
39554
+ children: "书"
39555
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39556
+ style: { minWidth: 0 },
39557
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39558
+ className: panel_module_css_default.navTitleName,
39559
+ children: "小说工坊"
39560
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39561
+ className: panel_module_css_default.navTitleBook,
39562
+ children: "作者级 · 跨书"
39563
+ })]
39564
+ })]
37052
39565
  }),
37053
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37054
- className: panel_module_css_default.shelfEmptyTitle,
37055
- children: "没有符合条件的书"
39566
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39567
+ className: panel_module_css_default.navGroup,
39568
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39569
+ className: panel_module_css_default.navGroupLabel,
39570
+ children: "作者"
39571
+ }), NAV_ITEMS.filter((item) => item.id !== "adapt" || adaptEnabled).map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39572
+ type: "button",
39573
+ role: "tab",
39574
+ "aria-selected": nav === item.id,
39575
+ "data-active": nav === item.id ? "" : void 0,
39576
+ className: panel_module_css_default.navTab,
39577
+ title: item.hint,
39578
+ onClick: () => setNav(item.id),
39579
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39580
+ className: panel_module_css_default.navTabIcon,
39581
+ children: item.icon
39582
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39583
+ className: panel_module_css_default.navTabLabel,
39584
+ children: item.label
39585
+ })]
39586
+ }, item.id))]
37056
39587
  }),
37057
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37058
- className: panel_module_css_default.meta,
37059
- children: "换个关键词或筛选条件试试"
39588
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: panel_module_css_default.navSpacer }),
39589
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
39590
+ type: "button",
39591
+ role: "tab",
39592
+ "aria-selected": nav === "settings",
39593
+ "data-active": nav === "settings" ? "" : void 0,
39594
+ className: panel_module_css_default.navTab,
39595
+ title: "设置",
39596
+ onClick: () => setNav("settings"),
39597
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39598
+ className: panel_module_css_default.navTabIcon,
39599
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 18 })
39600
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39601
+ className: panel_module_css_default.navTabLabel,
39602
+ children: "设置"
39603
+ })]
39604
+ }),
39605
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39606
+ className: panel_module_css_default.navAbout,
39607
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39608
+ className: panel_module_css_default.navAboutRow,
39609
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "ℹ️ v1.7.3 · 改编/资产库" })
39610
+ })
37060
39611
  })
37061
39612
  ]
37062
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37063
- className: panel_module_css_default.shelfGrid,
39613
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39614
+ className: panel_module_css_default.authorContent,
37064
39615
  children: [
37065
- visible.map((book) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BookCard, {
39616
+ nav === "shelf" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShelfView, {
37066
39617
  api,
37067
- book,
37068
- active: book.id === shelf.activeBookId,
37069
- onOpen: () => {
37070
- onOpenBook(book.id);
37071
- },
37072
- onRead: () => {
37073
- onReadBook(book.id);
37074
- }
37075
- }, book.id)),
37076
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37077
- className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
37078
- onClick: onAddBook,
37079
- role: "button",
37080
- tabIndex: 0,
37081
- "aria-label": "开一本新书",
37082
- onKeyDown: (e) => {
37083
- if (e.key === "Enter" || e.key === " ") {
37084
- e.preventDefault();
37085
- onAddBook();
37086
- }
37087
- },
37088
- children: [
37089
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37090
- className: panel_module_css_default.bookAddIcon,
37091
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, { size: 28 })
37092
- }),
37093
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "开一本新书" }),
37094
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37095
- className: panel_module_css_default.meta,
37096
- children: "书名 + 大纲,开书即建项目"
37097
- })
37098
- ]
39618
+ shelf,
39619
+ onOpenBook,
39620
+ onReadBook,
39621
+ onAddBook,
39622
+ onImportBook
37099
39623
  }),
37100
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
37101
- className: `${panel_module_css_default.bookCard} ${panel_module_css_default.bookAddCard}`,
37102
- onClick: onImportBook,
37103
- role: "button",
37104
- tabIndex: 0,
37105
- "aria-label": "导入已有小说",
37106
- onKeyDown: (e) => {
37107
- if (e.key === "Enter" || e.key === " ") {
37108
- e.preventDefault();
37109
- onImportBook();
37110
- }
37111
- },
37112
- children: [
37113
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37114
- className: panel_module_css_default.bookAddIcon,
37115
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Download, { size: 28 })
37116
- }),
37117
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "导入已有小说" }),
37118
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
37119
- className: panel_module_css_default.meta,
37120
- children: "项目目录或 txt/md 全本"
37121
- })
37122
- ]
39624
+ nav === "adapt" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AdaptModeView, { api }),
39625
+ nav === "assets" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthorAssetsView, { api }),
39626
+ nav === "library" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Placeholder, {
39627
+ title: "🎨 全局写作资产库",
39628
+ hint: "内置题材基底库 / 反AI规则库 / 风格模板 / 推进模式(跨书)"
39629
+ }),
39630
+ nav === "progress" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProgressHomeView, {
39631
+ shelf,
39632
+ onOpenBook
39633
+ }),
39634
+ nav === "settings" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SettingsView, {
39635
+ api,
39636
+ onTheme,
39637
+ onBackground,
39638
+ onOpacity
37123
39639
  })
37124
39640
  ]
37125
39641
  })]
@@ -38969,7 +41485,7 @@ window.__ModuleLoader__.load({
38969
41485
  setFileName(file.name);
38970
41486
  setPreviewing(true);
38971
41487
  try {
38972
- const text = await file.text();
41488
+ const text = await readFileTextSmart(file);
38973
41489
  setFileText(text);
38974
41490
  const p = await api.bookImportTextPreview(text, file.name);
38975
41491
  setPreview(p);
@@ -44927,32 +47443,32 @@ window.__ModuleLoader__.load({
44927
47443
  {
44928
47444
  id: "workflow",
44929
47445
  label: tt("tab.workflow"),
44930
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wrench, { size: 16 })
47446
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wrench, { size: 18 })
44931
47447
  },
44932
47448
  {
44933
47449
  id: "overview",
44934
47450
  label: tt("tab.overview"),
44935
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 16 })
47451
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 18 })
44936
47452
  },
44937
47453
  {
44938
47454
  id: "blurb",
44939
47455
  label: "简介 / 封面",
44940
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 16 })
47456
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 18 })
44941
47457
  },
44942
47458
  {
44943
47459
  id: "plan",
44944
47460
  label: tt("tab.plan"),
44945
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookMarked, { size: 16 })
47461
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookMarked, { size: 18 })
44946
47462
  },
44947
47463
  {
44948
47464
  id: "plotlines",
44949
47465
  label: "长线管理",
44950
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ScrollText, { size: 16 })
47466
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ScrollText, { size: 18 })
44951
47467
  },
44952
47468
  {
44953
47469
  id: "book",
44954
47470
  label: "本书设定",
44955
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, { size: 16 })
47471
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, { size: 18 })
44956
47472
  }
44957
47473
  ]
44958
47474
  },
@@ -44963,27 +47479,27 @@ window.__ModuleLoader__.load({
44963
47479
  {
44964
47480
  id: "assistant",
44965
47481
  label: tt("tab.assistant"),
44966
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.MessageSquare, { size: 16 })
47482
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.MessageSquare, { size: 18 })
44967
47483
  },
44968
47484
  {
44969
47485
  id: "progress",
44970
47486
  label: "AI 进度",
44971
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BarChart3, { size: 16 })
47487
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BarChart3, { size: 18 })
44972
47488
  },
44973
47489
  {
44974
47490
  id: "breakdown",
44975
47491
  label: "拆书分析",
44976
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Search, { size: 16 })
47492
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Search, { size: 18 })
44977
47493
  },
44978
47494
  {
44979
47495
  id: "manhua",
44980
47496
  label: "漫剧工作台",
44981
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Clapperboard, { size: 16 })
47497
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Clapperboard, { size: 18 })
44982
47498
  },
44983
47499
  {
44984
47500
  id: "run",
44985
47501
  label: "生产单",
44986
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Factory, { size: 16 })
47502
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Factory, { size: 18 })
44987
47503
  }
44988
47504
  ]
44989
47505
  },
@@ -44993,7 +47509,7 @@ window.__ModuleLoader__.load({
44993
47509
  items: [{
44994
47510
  id: "assets",
44995
47511
  label: "创作资产",
44996
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wrench, { size: 16 })
47512
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Wrench, { size: 18 })
44997
47513
  }]
44998
47514
  }
44999
47515
  ];
@@ -45001,7 +47517,7 @@ window.__ModuleLoader__.load({
45001
47517
  const SETTINGS_TAB = {
45002
47518
  id: "settings",
45003
47519
  label: tt("tab.settings"),
45004
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 16 })
47520
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 18 })
45005
47521
  };
45006
47522
  /** Common DeepSeek model presets shown in settings; users can also type any model id. */
45007
47523
  const MODEL_PRESETS = [
@@ -45044,7 +47560,7 @@ window.__ModuleLoader__.load({
45044
47560
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Sparkles, { size: 16 })
45045
47561
  }
45046
47562
  ];
45047
- const PLUGIN_VERSION = "1.7.3";
47563
+ const PLUGIN_VERSION = "1.8.0";
45048
47564
  /** GitHub 仓库地址(关于区块点击跳转)。 */
45049
47565
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
45050
47566
  /** Whether any chapter is being generated right now. */
@@ -45300,6 +47816,12 @@ window.__ModuleLoader__.load({
45300
47816
  function NovelPanel({ controller, api }) {
45301
47817
  const [activeTab, setActiveTab] = (0, react.useState)("workflow");
45302
47818
  const [config, setConfig] = (0, react.useState)(null);
47819
+ /** 自定义背景(URL / dataURL),覆盖主题默认背景。 */
47820
+ const [themeBg, setThemeBg] = (0, react.useState)(void 0);
47821
+ /** 自定义背景遮罩/模糊强度 0-80。 */
47822
+ const [themeBgBlur, setThemeBgBlur] = (0, react.useState)(0);
47823
+ /** 玻璃透明度 0-100(100=主题原样)。 */
47824
+ const [themeOpacity, setThemeOpacity] = (0, react.useState)(100);
45303
47825
  const [project, setProject] = (0, react.useState)(null);
45304
47826
  const [generatedFiles, setGeneratedFiles] = (0, react.useState)([]);
45305
47827
  const [outlineText, setOutlineText] = (0, react.useState)("");
@@ -45777,6 +48299,16 @@ window.__ModuleLoader__.load({
45777
48299
  refresh,
45778
48300
  refreshShelf
45779
48301
  ]);
48302
+ /** 首页「设置」与书内设置同入口:激活当前/首选书并跳到设置页。 */
48303
+ const openSettingsFromHome = async () => {
48304
+ const targetId = shelf?.activeBookId ?? shelf?.books[0]?.id ?? null;
48305
+ if (targetId === null || targetId === void 0) {
48306
+ setError("请先在书架开一本书;设置页以书籍工作台为入口");
48307
+ return;
48308
+ }
48309
+ await activateBook(targetId, "workspace");
48310
+ setActiveTab("settings");
48311
+ };
45780
48312
  /** Handle a docx file (pick or drag): parse locally, save outline. */
45781
48313
  const handleDocxFile = (0, react.useCallback)(async (file) => {
45782
48314
  setBusy(true);
@@ -47523,13 +50055,22 @@ window.__ModuleLoader__.load({
47523
50055
  n += assets?.antiAiRules?.length ?? 0;
47524
50056
  return n;
47525
50057
  })();
50058
+ /** 自定义背景:优先用户显式选择(themeBg),否则用 config 里的持久化值。 */
50059
+ const effectiveBg = themeBg !== void 0 && themeBg !== "" ? themeBg : config?.themeBackground ?? "";
50060
+ const effectiveBgBlur = themeBgBlur > 0 ? themeBgBlur : config?.themeBackgroundBlur ?? 0;
50061
+ const effectiveOpacity = themeOpacity > 0 ? themeOpacity : config?.themeOpacity ?? 100;
50062
+ const panelBgStyle = {};
50063
+ if (effectiveBg !== "") panelBgStyle["--nf-glass-bg-image"] = "url(" + effectiveBg + ")";
50064
+ if (effectiveBgBlur > 0) panelBgStyle["--nf-glass-bg-dim"] = String(effectiveBgBlur);
50065
+ panelBgStyle["--nf-glass-opacity"] = String(effectiveOpacity) + "%";
47526
50066
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47527
50067
  className: panel_module_css_default.panel,
47528
50068
  "data-nf-theme": panelTheme,
47529
50069
  "data-nf-mode": themeMode === "system" ? void 0 : themeMode,
47530
50070
  "data-nf-density": themeDensity,
50071
+ style: panelBgStyle,
47531
50072
  children: [
47532
- viewMode === "shelf" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShelfView, {
50073
+ viewMode === "shelf" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthorHome, {
47533
50074
  api,
47534
50075
  shelf: shelf ?? {
47535
50076
  books: [],
@@ -47546,7 +50087,23 @@ window.__ModuleLoader__.load({
47546
50087
  },
47547
50088
  onImportBook: () => {
47548
50089
  setShowImport(true);
47549
- }
50090
+ },
50091
+ onOpenSettings: () => {
50092
+ openSettingsFromHome();
50093
+ },
50094
+ onTheme: (t, m, d) => {
50095
+ changePanelTheme(t);
50096
+ changeThemeMode(m);
50097
+ changeThemeDensity(d);
50098
+ },
50099
+ onBackground: (bg, blur) => {
50100
+ setThemeBg(bg);
50101
+ setThemeBgBlur(blur);
50102
+ },
50103
+ onOpacity: (n) => {
50104
+ setThemeOpacity(n);
50105
+ },
50106
+ adaptEnabled: config?.enableAdaptMode === true
47550
50107
  }) : viewMode === "create" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CreateBookView, {
47551
50108
  api,
47552
50109
  onBack: () => {
@@ -52406,7 +54963,7 @@ window.__ModuleLoader__.load({
52406
54963
  entry.className = panel_module_css_default.entry;
52407
54964
  entry.setAttribute("aria-label", tt("entry.label"));
52408
54965
  entry.setAttribute("title", tt("entry.tooltip"));
52409
- entry.innerHTML = "<span class=\"" + panel_module_css_default.entryIcon + "\"><svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 3.5h4a2 2 0 0 1 2 2v7a2 2 0 0 0-2-2h-4z\"/><path d=\"M13.5 3.5h-4a2 2 0 0 0-2 2v7a2 2 0 0 1 2-2h4z\"/><path d=\"M8 5.5v7\"/></svg></span><span class=\"" + panel_module_css_default.entryLabel + "\">" + tt("entry.label") + "</span>";
54966
+ entry.innerHTML = "<span class=\"" + panel_module_css_default.entryIcon + "\"><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12.67 19a2 2 0 0 0 1.416-.588l6.154-6.172a6 6 0 0 0-8.49-8.49L5.586 9.914A2 2 0 0 0 5 11.328V18a1 1 0 0 0 1 1z\"/><path d=\"M16 8 2 22\"/><path d=\"M17.5 15H9\"/></svg></span><span class=\"" + panel_module_css_default.entryLabel + "\">" + tt("entry.label") + "</span>";
52410
54967
  entry.addEventListener("click", () => {
52411
54968
  controller.toggle();
52412
54969
  });