@waterwx/dsh-novel-forge 2.1.3 → 2.1.5

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
@@ -46,6 +46,7 @@ window.__ModuleLoader__.load({
46
46
  revisionPlan: "/api/dsh-novel-forge/revision/plan",
47
47
  /** 张力曲线(GET 数据 / POST 设置)。 */
48
48
  tension: "/api/dsh-novel-forge/tension",
49
+ styleHistory: "/api/dsh-novel-forge/style-history",
49
50
  /** 提示词槽位(GET 列表 / POST 写入)。 */
50
51
  promptSlots: "/api/dsh-novel-forge/prompt-slots",
51
52
  /** 故事时间线(GET 列表 / POST 操作)。 */
@@ -801,6 +802,10 @@ window.__ModuleLoader__.load({
801
802
  async tension() {
802
803
  return readJson(await fetch(withBookId(NOVEL_API.tension)));
803
804
  }
805
+ /** 风格漂移曲线:逐章指标 + 参照基线(与审稿同源)。 */
806
+ async styleHistory() {
807
+ return readJson(await fetch(withBookId(NOVEL_API.styleHistory)));
808
+ }
804
809
  /** 设置张力曲线预设。 */
805
810
  async tensionPreset(preset) {
806
811
  await postJson(NOVEL_API.tension, {
@@ -1344,7 +1349,7 @@ window.__ModuleLoader__.load({
1344
1349
  }
1345
1350
  //#endregion
1346
1351
  //#region \0dsh-css:src/client/panel/panel.module.css.mjs
1347
- const css = ":root{--nf-font:-apple-system, BlinkMacSystemFont, \"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-font-display:Georgia, \"Times New Roman\", \"Noto Serif SC\", \"Source Han Serif SC\", \"Songti SC\", SimSun, serif;--nf-measure:720px;--nf-space-section:48px;--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-fs-display:24px;--nf-fs-title:16px;--nf-r:12px;--nf-r-sm:8px;--nf-r-lg:16px;--nf-space:16px;--nf-space-lg:24px;--nf-fs-body:13px;--nf-fs-meta:12px;--nf-fs-caption:11px;--nf-lh-body:1.65;--nf-lh-title:1.3;--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;--nf-focus-w:2px;--nf-focus-offset:2px;--nf-focus-radius:var(--nf-radius-6,6px);--nf-z-panel:60;--nf-z-float:80;--nf-z-modal:100;--nf-z-chip:2147480000;--nf-dur-fast:.12s;--nf-dur-base:.15s;--nf-dur-slow:.28s;--nf-ease-out:cubic-bezier(.32, .72, 0, 1)}.jbF1yq_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);transition:background var(--nf-dur-base,.15s) ease;background:0 0;border:none;font-size:14px;display:flex}body[data-ds-dark-theme] .jbF1yq_entry{color:var(--dsw-alias-label-primary,#ececf1)}.jbF1yq_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.jbF1yq_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.jbF1yq_entryIcon{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.jbF1yq_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation],[class*=centerCol]{position:relative}.jbF1yq_view{z-index:var(--nf-z-panel,60);color-scheme:light;font-family:var(--nf-font);--nf-bg:#f6f3ec;--nf-bg-raise:#fcfaf6;--nf-bg-inset:#efe9dc;--nf-bg-deep:#e9e2d4;--nf-line:#26221b24;--nf-line-2:#26221b0f;--nf-border:#26221b24;--nf-border-strong:#26221b4d;--nf-text:#26221b;--nf-text-2:#6f665a;--nf-text-2-alpha:#6f665ab3;--nf-text-3:#8f8679;--nf-accent:#a63e2a;--nf-accent-hover:#8c3321;--nf-accent-soft:#a63e2a1f;--nf-accent-fg:#fdf3ee;--nf-seal:#a63e2a;--nf-seal-soft:#a63e2a1f;--nf-ai-soft:#c07c2221;--nf-human-soft:#2f6fa31f;--nf-ok:#5f9656;--nf-warn:#ff9500;--nf-bad:#b94a41;--nf-hover:#26221b0d;--nf-success:#34c759;--nf-error:#ff3b30;--nf-info:#4a6fa5;--nf-ai:#c07c22;--nf-human:#2f6fa3;--nf-idle:#cfc6b5;--nf-paper-grid:#26221b0d;--nf-shadow:0 1px 3px #1f1e1c0d, 0 12px 32px #1f1e1c12;--nf-shadow-lg:0 4px 12px #1f1e1c0f, 0 20px 48px #1f1e1c1c;--nf-card-shadow:0 2px 6px #1f1e1c0d, 0 14px 38px #1f1e1c1a;--nf-card-shadow-hover:0 4px 10px #1f1e1c12, 0 22px 52px #1f1e1c26;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#a0917d47;--nf-glass-inset:#fff6;--nf-glass-noise:none;--nf-card-radius:16px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-sheen:transparent;--nf-card-border:1px solid #a0917d4d;--nf-ctrl-radius:12px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #d6cbbad9;--nf-ctrl-sheen:#fffcf473;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.72 0 0 0 0 0.66 0 0 0 0 0.56 0 0 0 0.06 0'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23p)'/%3E%3C/svg%3E\");background:var(--nf-bg);color:var(--nf-text);display:none;position:absolute;inset:0;overflow:auto;container:jbF1yq_nfpanel/inline-size}.jbF1yq_panel[data-nf-mode=dark],body[data-ds-dark-theme] .jbF1yq_panel:not([data-nf-mode]),.jbF1yq_view:has(>.jbF1yq_panel[data-nf-mode=dark]),body[data-ds-dark-theme] .jbF1yq_view:not(:has(>.jbF1yq_panel[data-nf-mode=light])){color-scheme:dark;--nf-bg:#17140f;--nf-bg-raise:#201c16;--nf-bg-inset:#2a241c;--nf-bg-deep:#100e0a;--nf-line:#f2e9dc1f;--nf-line-2:#f2e9dc0d;--nf-border:#f2e9dc1f;--nf-border-strong:#f2e9dc3d;--nf-text:#eee7da;--nf-text-2:#b3a78f;--nf-text-2-alpha:#b3a78fb3;--nf-text-3:#8a7f6c;--nf-accent:#c0492d;--nf-accent-hover:#d95a3a;--nf-accent-soft:#c14a2e24;--nf-accent-fg:#fdf3ee;--nf-seal:#c0492d;--nf-seal-soft:#c14a2e24;--nf-ai-soft:#d98a2b1f;--nf-human-soft:#4aa3d91f;--nf-ok:#79b372;--nf-warn:#e3a52e;--nf-bad:#d95753;--nf-hover:#f2e9dc0f;--nf-success:#79b372;--nf-error:#d95753;--nf-info:#6b8fc7;--nf-ai:#d98a2b;--nf-human:#4aa3d9;--nf-idle:#5c5344;--nf-paper-grid:#f2e9dc0d;--nf-shadow:0 1px 2px #00000073, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 20px 48px #0000008c;--nf-card-shadow:0 2px 6px #0000006b, 0 14px 38px #0000007a;--nf-card-shadow-hover:0 4px 10px #00000070, 0 22px 52px #00000094;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#f2e9dc24;--nf-glass-inset:#ffffff0f;--nf-glass-noise:none;--nf-card-radius:16px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-border:1px solid #f2e9dc1f;--nf-card-sheen:transparent;--nf-glass-bg-image:none;--nf-ctrl-radius:12px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #f2e9dc29;--nf-ctrl-sheen:#ffffff2e;--nf-ctrl-caret:var(--nf-accent)}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .jbF1yq_view{display:block}.jbF1yq_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}.jbF1yq_panelTop{flex-direction:column;flex:none;gap:12px;padding:16px 22px 0;display:flex}.jbF1yq_panelHead,.jbF1yq_topNav{border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r-lg,16px);flex-wrap:wrap;align-items:center;padding:13px 16px;display:flex}.jbF1yq_panelHead{background:color-mix(in srgb, var(--nf-bg-deep,var(--nf-bg)) 92%, transparent);backdrop-filter:blur(12px);box-shadow:var(--nf-shadow,none);gap:12px}.jbF1yq_topNav{background:var(--nf-bg-raise);gap:16px}.jbF1yq_brand{cursor:pointer;user-select:none;align-items:center;gap:10px;min-width:0;display:flex}.jbF1yq_brandLogo{background:var(--nf-bg-inset,var(--nf-bg));border:1px solid var(--nf-line,var(--nf-border));width:32px;height:32px;font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-weight:700;font-size:var(--nf-fs-16,16px);color:var(--nf-accent);border-radius:9px;flex:none;place-items:center;display:grid}.jbF1yq_brandText{flex-direction:column;min-width:0;display:flex}.jbF1yq_brandName{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);letter-spacing:0;color:var(--nf-text);white-space:nowrap;font-size:17px;font-weight:400;line-height:1.3}.jbF1yq_brandSub{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;text-overflow:ellipsis;max-width:340px;overflow:hidden}.jbF1yq_headSpacer{flex:1}.jbF1yq_headChip{width:26px;height:26px;font-size:var(--nf-fs-12,12px);color:var(--nf-text-2,var(--nf-text));border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r,12px);cursor:pointer;background:0 0;flex:none;place-items:center;display:grid}.jbF1yq_headChip:hover{background:var(--nf-bg-inset,var(--nf-bg-raise));color:var(--nf-text)}.jbF1yq_topNavLabel{font-size:var(--nf-fs-caption,11px);letter-spacing:.14em;text-transform:uppercase;color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;margin:0 8px 0 2px}.jbF1yq_topNavBtn{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;padding:5px 10px;transition:background .12s,color .12s,border-color .12s;display:inline-flex}.jbF1yq_topNavBtn:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_topNavBtn.jbF1yq_active,.jbF1yq_topNavActive{background:var(--nf-ai-soft);border-color:color-mix(in srgb, var(--nf-ai) 40%, transparent);color:var(--nf-ai)}.jbF1yq_topNavNi{font-size:var(--nf-fs-12,12px);opacity:.85}.jbF1yq_topNavBadge{font-family:var(--nf-mono,monospace);font-size:var(--nf-fs-10,10px);background:var(--nf-bg-inset,var(--nf-bg-raise));border:1px solid var(--nf-border-2,var(--nf-border));color:var(--nf-text-2,var(--nf-text));border-radius:99px;padding:0 5px}.jbF1yq_topNavActive .jbF1yq_topNavBadge,.jbF1yq_topNavBtn.jbF1yq_active .jbF1yq_topNavBadge{background:color-mix(in srgb, var(--nf-ai) 14%, transparent);color:var(--nf-ai);border-color:#0000}.jbF1yq_topNavSpacer{flex:1}.jbF1yq_drawerScrim{z-index:60;background:#0f0a0673;animation:.18s jbF1yq_nfFadeIn;position:absolute;inset:0}@keyframes jbF1yq_nfFadeIn{0%{opacity:0}to{opacity:1}}.jbF1yq_contentDrawer{background:var(--nf-bg-raise,var(--nf-bg));border-left:1px solid var(--nf-border-strong,var(--nf-border));z-index:62;flex-direction:column;width:min(760px,92vw);animation:.22s jbF1yq_nfDrawerIn;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-18px 0 40px #0f0a062e}.jbF1yq_contentDrawer.jbF1yq_drawerMax{width:100%}.jbF1yq_contentDrawerBody{flex:1;min-height:0;padding:14px 16px;overflow-y:auto}@keyframes jbF1yq_nfDrawerIn{0%{opacity:0;transform:translate(28px)}to{opacity:1;transform:none}}.jbF1yq_wbIndexRow{align-items:center;gap:var(--nf-space-8);width:100%;padding:var(--nf-space-8) var(--nf-space-10);margin-bottom:var(--nf-space-4);border:1px solid var(--nf-border);border-radius:var(--nf-radius-6);background:var(--nf-bg);cursor:pointer;text-align:left;font-size:var(--nf-fs-14);color:var(--nf-text);display:flex}.jbF1yq_wbIndexRow:hover{border-color:var(--nf-border-strong,var(--nf-border));background:var(--nf-bg-inset,var(--nf-bg-raise))}.jbF1yq_wbIndexTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_wbIndexVol{font-size:var(--nf-fs-12);letter-spacing:.06em;color:var(--nf-text-3,var(--nf-text-2));margin:var(--nf-space-10) 0 var(--nf-space-4);font-weight:600}.jbF1yq_drawerHead{background:var(--nf-bg-deep,var(--nf-bg));border-bottom:1px solid var(--nf-border-strong,var(--nf-border));flex:none;align-items:center;gap:8px;padding:10px 12px 10px 18px;display:flex}.jbF1yq_drawerTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.jbF1yq_drawerSpacer{flex:1}.jbF1yq_drawerHeadBtn{width:26px;height:26px;font-size:var(--nf-fs-12,12px);color:var(--nf-text-2,var(--nf-text));border:1px solid var(--nf-border-2,var(--nf-border));border-radius:var(--nf-radius-sm,8px);cursor:pointer;background:0 0;flex:none;place-items:center;display:grid}.jbF1yq_drawerHeadBtn:hover{background:var(--nf-bg-inset,var(--nf-bg-raise));color:var(--nf-text)}.jbF1yq_brandEn{font-size:var(--nf-fs-caption,11px);letter-spacing:.08em;color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;font-weight:400}.jbF1yq_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;position:absolute;inset:0}.jbF1yq_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}.jbF1yq_panelTitle:before{content:\"\";border-radius:var(--nf-radius-2,2px);background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));width:4px;height:16px}.jbF1yq_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);transition:background var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease;background:0 0;border:none}.jbF1yq_iconButton:hover{background:var(--nf-hover);color:var(--nf-text);transform:translateY(-1px)}.jbF1yq_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);transition:color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;background:0 0;border:none;font-weight:500;position:relative}.jbF1yq_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.jbF1yq_tab[data-active]{color:var(--nf-accent);font-weight:600}.jbF1yq_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}.jbF1yq_panelContent{min-width:0;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}.jbF1yq_panelContent>*{flex-shrink:0}.jbF1yq_pageHeader{justify-content:space-between;align-items:center;gap:var(--nf-space-14,14px);border-bottom:1px solid var(--nf-line-2,var(--nf-border));background:var(--nf-bg-deep);border-radius:var(--nf-r,12px) var(--nf-r,12px) 0 0;flex-wrap:wrap;margin:0;padding:14px 18px;display:flex}.jbF1yq_pageHeaderMain{min-width:0}.jbF1yq_pageHeaderEyebrow{font-size:var(--nf-fs-caption,11px);letter-spacing:.14em;text-transform:uppercase;color:var(--nf-text-3);align-items:center;gap:var(--nf-space-6);display:flex}.jbF1yq_pageHeaderTitle{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-size:var(--nf-fs-display,22px);line-height:var(--nf-lh-title,1.3);color:var(--nf-text);align-items:center;gap:var(--nf-space-8);font-weight:700;display:flex}.jbF1yq_pageHeaderSub{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);max-width:var(--nf-measure,720px);line-height:var(--nf-lh-body,1.65);margin-top:var(--nf-space-2)}.jbF1yq_pageHeaderActions{gap:var(--nf-space-8);flex-wrap:wrap;align-items:center;display:flex}.jbF1yq_numSerif{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";font-weight:700}.jbF1yq_tabular{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}.jbF1yq_docsSurface{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-blend-mode:normal;background-color:#0000;background-size:100% 28px}.jbF1yq_aiTag{font-family:var(--nf-font-mono,ui-monospace, monospace);letter-spacing:.08em;color:var(--nf-ai,var(--nf-accent));border:1px solid color-mix(in srgb, var(--nf-ai,var(--nf-accent)) 38%, transparent);vertical-align:middle;background:color-mix(in srgb, var(--nf-ai,var(--nf-accent)) 9%, transparent);border-radius:4px;align-items:center;margin-left:6px;padding:0 4px;font-size:9px;line-height:1.4;display:inline-flex}.jbF1yq_panelContent[data-tab=overview]>*,.jbF1yq_panelContent[data-tab=blurb]>*,.jbF1yq_panelContent[data-tab=settings]>*,.jbF1yq_panelContent[data-tab=director]>*,.jbF1yq_panelContent[data-tab=breakdown]>*,.jbF1yq_panelContent[data-tab=plotlines]>*{width:100%;max-width:calc(var(--nf-measure,720px) + 48px);margin-inline:auto}.jbF1yq_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.jbF1yq_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);transition:width var(--nf-dur-base,.15s) ease;flex-direction:column;flex:none;margin:10px 0 10px 12px;display:flex;overflow-y:auto}.jbF1yq_navSpacer{flex:1;min-height:8px}.jbF1yq_navAbout{align-items:center;gap:var(--nf-space-8,8px);flex-direction:row;flex:none;display:flex}.jbF1yq_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);transition:color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;text-align:left;white-space:nowrap;background:0 0;border:none;display:flex}.jbF1yq_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.jbF1yq_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}.jbF1yq_navAboutUpdate:hover{color:var(--nf-accent-hover)}@keyframes jbF1yq_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.jbF1yq_navTitle{cursor:pointer;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}.jbF1yq_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}.jbF1yq_navTitleName{font-weight:700;font-size:var(--nf-fs-14,15px);letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.jbF1yq_navTitleBook{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.jbF1yq_panelNavCollapsed .jbF1yq_navTitle{padding:var(--nf-space-2,2px) 0 var(--nf-space-10,10px);justify-content:center}.jbF1yq_panelNavCollapsed .jbF1yq_navTitleLogo{width:32px;height:var(--nf-ctrl-m,32px)}.jbF1yq_card{border:1px solid var(--nf-border);gap:var(--nf-space-10,10px);background:var(--nf-bg-deep);min-width:0;transition:border-color var(--nf-dur-base,.15s) ease;border-radius:12px;flex-direction:column;padding:13px 14px;display:flex;position:relative}.jbF1yq_card:hover{border-color:var(--nf-border-strong)}.jbF1yq_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}.jbF1yq_cardTitleLg{font-size:var(--nf-fs-16,16px);font-weight:650}.jbF1yq_button{align-items:center;gap:var(--nf-space-6,6px);border:1px solid var(--nf-line,var(--nf-border));background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:var(--nf-r-sm,8px);cursor:pointer;font-size:var(--nf-fs-meta,12px);transition:background var(--nf-dur-base,.15s) ease, border-color var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease;white-space:nowrap;padding:5px 11px;font-weight:500;display:inline-flex}.jbF1yq_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong);transform:translateY(-1px)}.jbF1yq_button:active:not([disabled]){transform:translateY(0)scale(.97)}.jbF1yq_button[disabled]{opacity:.45;cursor:not-allowed}.jbF1yq_buttonPrimary{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);border-radius:var(--nf-r-sm,8px);font-weight:700}.jbF1yq_buttonPrimary:hover:not([disabled]){background:var(--nf-accent-hover);border-color:var(--nf-accent-hover)}.jbF1yq_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.jbF1yq_buttonDanger:hover:not([disabled]){background:#ff3b301a}.jbF1yq_buttonSmall{font-size:var(--nf-fs-caption,11px);border-radius:var(--nf-r-sm,8px);padding:3px 9px}.jbF1yq_field{gap:var(--nf-space-6,5px);flex-direction:column;display:flex}.jbF1yq_fieldLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);font-weight:500}.jbF1yq_input{border:1px solid var(--nf-line,var(--nf-border));background:var(--nf-bg-inset);color:var(--nf-text);color-scheme:light;border-radius:var(--nf-r-sm,8px);font-size:var(--nf-fs-meta,12px);box-sizing:border-box;width:100%;transition:border-color var(--nf-dur-base,.15s) ease;padding:7px 10px}body[data-ds-dark-theme] .jbF1yq_input,.jbF1yq_panel[data-nf-mode=dark] .jbF1yq_input{color-scheme:dark}.jbF1yq_panel[data-nf-mode=light] .jbF1yq_input{color-scheme:light}select.jbF1yq_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}.jbF1yq_input option{color:var(--nf-text);background:var(--nf-bg-raise);font-size:var(--nf-fs-14,15px)}.jbF1yq_input:focus,.jbF1yq_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.jbF1yq_input::placeholder,.jbF1yq_textarea::placeholder{color:var(--nf-text-3)}.jbF1yq_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;transition:border-color var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease;font-family:inherit;line-height:1.7}.jbF1yq_row{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_chapterList{gap:var(--nf-space-8,8px);flex-direction:column;display:flex}.jbF1yq_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 var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease;display:flex}.jbF1yq_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.jbF1yq_chapterFocus{animation:.9s ease-in-out 3 jbF1yq_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes jbF1yq_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.jbF1yq_chapterMain{flex:1;min-width:0}.jbF1yq_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}.jbF1yq_chapter:hover .jbF1yq_chapterActions{opacity:1}.jbF1yq_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}.jbF1yq_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.jbF1yq_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 jbF1yq_pulse}.jbF1yq_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.jbF1yq_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.jbF1yq_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.jbF1yq_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.jbF1yq_reviewBox{border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-12);padding:var(--nf-space-14) var(--nf-space-16);background:var(--nf-bg-inset);gap:var(--nf-space-10);font-size:var(--nf-fs-14);flex-direction:column;line-height:1.7;display:flex}.jbF1yq_chapterPreview{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-color:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);padding:var(--nf-space-20) var(--nf-space-24);font-family:var(--nf-font-display);color:var(--nf-text);white-space:pre-wrap;word-wrap:break-word;max-height:600px;margin:0;font-size:15px;line-height:2;overflow:auto}.jbF1yq_chatScroll{gap:var(--nf-space-10,10px);min-height:0;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}.jbF1yq_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:72%;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);box-shadow:0 2px 6px color-mix(in srgb, var(--nf-accent) 32%, transparent);align-self:flex-end}.jbF1yq_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}.jbF1yq_chatRole{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);margin-bottom:3px;font-weight:600}.jbF1yq_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}.jbF1yq_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}.jbF1yq_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.jbF1yq_toolSteps{gap:var(--nf-space-4,4px);flex-direction:column;margin-top:6px;display:flex}.jbF1yq_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}.jbF1yq_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.jbF1yq_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.jbF1yq_toolStepIcon{font-size:var(--nf-fs-14,13px);flex:none}.jbF1yq_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.jbF1yq_toolStepStatus{color:var(--nf-text-2);font-size:var(--nf-fs-12,11px);flex:none}.jbF1yq_toolStepActive .jbF1yq_toolStepStatus{color:var(--nf-accent)}.jbF1yq_toolStepError .jbF1yq_toolStepStatus{color:var(--nf-error)}.jbF1yq_toolStepDetail{width:100%;color:var(--nf-error);font-size:var(--nf-fs-12,11px);word-break:break-all}.jbF1yq_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}.jbF1yq_progressLine{color:var(--nf-text-2);opacity:.9}.jbF1yq_progressLineLive{color:var(--nf-accent);align-items:center;gap:var(--nf-space-8,8px);font-weight:600;display:flex}.jbF1yq_progressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.jbF1yq_progressBarFill{border-radius:var(--nf-radius-4,3px);background:var(--nf-accent);height:100%;transition:width var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_busyRow{justify-content:space-between;align-items:center;gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.jbF1yq_liveText{font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;color:var(--nf-text-2)}.jbF1yq_bigProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:8px;margin-top:10px;overflow:hidden}.jbF1yq_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 var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_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}.jbF1yq_legendOld{color:var(--nf-error);font-weight:700}.jbF1yq_legendNew{color:var(--nf-success);font-weight:700}.jbF1yq_onlyChanges{align-items:center;gap:var(--nf-space-4,4px);color:var(--nf-text-2);cursor:pointer;margin-left:auto;display:inline-flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_diffSame summary{cursor:pointer;font-size:var(--nf-fs-12,12px);user-select:none}.jbF1yq_diffSameBody{white-space:pre-wrap;margin-top:6px}.jbF1yq_diffChange{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.jbF1yq_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}.jbF1yq_diffColumn:first-child{border-right:1px solid var(--nf-border)}.jbF1yq_diffTagOld,.jbF1yq_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}.jbF1yq_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)}.jbF1yq_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)}.jbF1yq_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)}.jbF1yq_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.jbF1yq_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}.jbF1yq_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}.jbF1yq_diffText{white-space:pre-wrap}.jbF1yq_diffDel .jbF1yq_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.jbF1yq_diffAdd .jbF1yq_diffText{color:var(--nf-success)}.jbF1yq_wsPage{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex}.jbF1yq_wsPageHeader{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;flex:none;display:flex}.jbF1yq_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}.jbF1yq_wsColumns{gap:var(--nf-space-14,14px);flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.jbF1yq_wsColumn{gap:var(--nf-space-8,8px);flex-direction:column;min-width:0;min-height:0;display:flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_wsSelectedText{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px}.jbF1yq_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}.jbF1yq_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}.jbF1yq_assetGroups{gap:var(--nf-space-14,14px);flex-direction:column;display:flex}.jbF1yq_assetGroup{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.jbF1yq_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}.jbF1yq_outlineDocWrap{gap:var(--nf-space-12,12px);flex-direction:column;display:flex}.jbF1yq_outlineToc{padding:var(--nf-space-8) var(--nf-space-10);border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-wrap:wrap;gap:4px 8px;display:flex}.jbF1yq_outlineTocItem{font:inherit;cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:6px;padding:2px 6px;font-size:12.5px}.jbF1yq_outlineTocItem:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_outlineTocL1{color:var(--nf-text);font-weight:700}.jbF1yq_outlineTocL2{padding-left:8px}.jbF1yq_outlineTocL3{padding-left:16px;font-size:12px}.jbF1yq_outlineDoc{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-color:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);padding:var(--nf-space-20) var(--nf-space-24);font-family:var(--nf-font-display);color:var(--nf-text);user-select:text;max-height:640px;font-size:15px;line-height:28px;overflow:auto}.jbF1yq_outlineH{font-family:var(--nf-font-display);margin:var(--nf-space-16,16px) 0 var(--nf-space-6,6px);scroll-margin-top:var(--nf-space-14,14px);line-height:1.3}.jbF1yq_outlineH1{font-size:22px;font-weight:700}.jbF1yq_outlineH2{font-size:18px;font-weight:700}.jbF1yq_outlineH3{font-size:15px;font-weight:600}.jbF1yq_outlineH4{color:var(--nf-text-2);font-size:14px;font-weight:600}.jbF1yq_outlineP{margin:0 0 var(--nf-space-10,10px);white-space:pre-wrap;text-indent:2em}.jbF1yq_outlineHr{border:none;border-top:1px solid var(--nf-border-strong);margin:var(--nf-space-14,14px) 0}.jbF1yq_outlineList{margin:0 0 var(--nf-space-10,10px);padding-left:1.6em;list-style-position:outside}.jbF1yq_outlineList .jbF1yq_outlineList{margin:var(--nf-space-4,4px) 0 0}.jbF1yq_outlineLi{margin:0 0 var(--nf-space-4,4px);text-indent:0}.jbF1yq_outlineLi::marker{color:var(--nf-text-2)}.jbF1yq_outlineQuote{margin:0 0 var(--nf-space-10,10px);padding:var(--nf-space-6,6px) var(--nf-space-12,12px);border-left:3px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:0 var(--nf-radius-8,8px) var(--nf-radius-8,8px) 0}.jbF1yq_outlineCodeBlock{margin:0 0 var(--nf-space-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);font-family:var(--nf-font-mono,ui-monospace, monospace);font-size:12.5px;line-height:1.6;position:relative;overflow-x:auto}.jbF1yq_outlineCodeLang{letter-spacing:.06em;text-transform:uppercase;color:var(--nf-text-2);font-size:10px;position:absolute;top:4px;right:8px}.jbF1yq_outlineCode{font-family:var(--nf-font-mono,ui-monospace, monospace);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:4px;padding:1px 5px;font-size:.92em}.jbF1yq_outlineTableWrap{margin:0 0 var(--nf-space-10,10px);overflow-x:auto}.jbF1yq_outlineTable{border-collapse:collapse;width:100%;font-size:13px}.jbF1yq_outlineTable th,.jbF1yq_outlineTable td{border:1px solid var(--nf-border);padding:var(--nf-space-6,6px) var(--nf-space-8,8px);text-align:left;vertical-align:top}.jbF1yq_outlineTable th{background:var(--nf-bg-inset);color:var(--nf-text);font-weight:600}.jbF1yq_outlineVol{border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);overflow:hidden}.jbF1yq_outlineVolSummary{cursor:pointer;padding:var(--nf-space-10,10px) var(--nf-space-16,16px);font-weight:700;font-family:var(--nf-font-display);background:var(--nf-bg-inset);color:var(--nf-text)}.jbF1yq_outlineEdit{min-height:240px}.jbF1yq_card>summary{cursor:pointer;list-style:none}.jbF1yq_card>summary::-webkit-details-marker{display:none}.jbF1yq_card>summary:before{content:\"▸ \";color:var(--nf-text-3)}.jbF1yq_card[open]>summary:before{content:\"▾ \"}.jbF1yq_assistantFloat{z-index:80;border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);box-shadow:var(--nf-shadow-lg);flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.jbF1yq_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}.jbF1yq_assistantFloatHeader:active{cursor:grabbing}.jbF1yq_assistantFloatBody{min-height:0;padding:var(--nf-space-10,10px);flex:1;display:flex;overflow:hidden}.jbF1yq_assistantFloatBody>*{flex:1;min-width:0}.jbF1yq_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}.jbF1yq_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}.jbF1yq_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.jbF1yq_coverPlaceholder{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.jbF1yq_subPage{background:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:16px;flex-direction:column;flex:1;min-height:0;margin:16px 22px 22px;display:flex;overflow:hidden}.jbF1yq_subPageHead{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-deep,var(--nf-bg));flex-wrap:wrap;flex:none;align-items:center;gap:14px;padding:14px 18px;display:flex}.jbF1yq_subPageBack{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-3);border:1px solid var(--nf-border);white-space:nowrap;cursor:pointer;border-radius:7px;padding:3px 10px}.jbF1yq_subPageTitle{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-size:var(--nf-fs-display,22px);font-weight:700;line-height:1.2}.jbF1yq_subPageMeta{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);line-height:1.4}.jbF1yq_subPageActions{flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto;display:flex}.jbF1yq_subPageBody{flex-direction:column;flex:1;gap:14px;min-height:0;padding:16px 18px;display:flex;overflow:auto}.jbF1yq_shelfToolbar{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;display:flex}.jbF1yq_shelfToolbar .jbF1yq_input{max-width:260px}.jbF1yq_shelfToolbarExtra{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;margin-left:auto;display:flex}.jbF1yq_shelfStatGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;display:grid}.jbF1yq_shelfStatCard[data-active=\"\"]{background:color-mix(in srgb, var(--nf-ai) 14%, transparent);border-color:color-mix(in srgb, var(--nf-ai) 42%, transparent)}.jbF1yq_shelfStatCard[data-active=\"\"] span,.jbF1yq_shelfStatCard[data-active=\"\"] b{color:var(--nf-ai)}.jbF1yq_shelfStatCard{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);cursor:pointer;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:8px 10px;display:flex}.jbF1yq_shelfStatCard span{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-2);white-space:nowrap}.jbF1yq_shelfStatCard b{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);color:var(--nf-text);font-variant-numeric:tabular-nums;font-size:18px;font-weight:700}.jbF1yq_shelfStatCard[data-active=\"\"]{border-color:var(--nf-ai);background:color-mix(in srgb, var(--nf-ai) 12%, transparent)}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_shelfStatGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}.jbF1yq_authorHome{z-index:1;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.jbF1yq_authorTopNav{align-items:center;gap:var(--nf-space-16,16px);border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r-lg,16px);background:var(--nf-bg-raise);flex-wrap:wrap;flex:none;margin:16px 22px 0;padding:13px 16px;display:flex}.jbF1yq_authorTopNav .jbF1yq_navTitle{align-items:center;gap:var(--nf-space-10,10px);border-bottom:none;flex:none;min-width:0;margin:0;padding:0;display:flex}.jbF1yq_authorTopNav .jbF1yq_navTitleLogo{background:var(--nf-bg-inset);border:1px solid var(--nf-line,var(--nf-border));width:32px;height:32px;font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-weight:700;font-size:var(--nf-fs-16,16px);color:var(--nf-accent);border-radius:9px}.jbF1yq_authorTopNav .jbF1yq_navTitleName{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);letter-spacing:0;font-size:17px;font-weight:400}.jbF1yq_authorTopNav .jbF1yq_navTitleBook{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3)}.jbF1yq_authorTopNav .jbF1yq_navGroup{align-items:center;gap:var(--nf-space-4,4px);display:flex}.jbF1yq_authorTopNav .jbF1yq_navGroupLabel{padding:0 var(--nf-space-6,6px);font-size:var(--nf-fs-12,12px);letter-spacing:.12em}.jbF1yq_authorTopNav .jbF1yq_navTab{width:auto;padding:var(--nf-space-8,8px) var(--nf-space-10,10px)}.jbF1yq_authorTopNav .jbF1yq_navSpacer{flex:1}.jbF1yq_authorTopNav .jbF1yq_navAbout{border-left:1px solid var(--nf-border);padding-left:var(--nf-space-12,12px);margin:0}.jbF1yq_authorTopNav .jbF1yq_navAboutRow{align-items:center;gap:var(--nf-space-6,6px);display:inline-flex}.jbF1yq_authorContent{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.jbF1yq_authorNav{background:var(--nf-bg-raise);border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r,12px);flex-wrap:wrap;flex:none;align-items:center;gap:4px;margin:14px 22px 0;padding:8px 10px;display:flex}.jbF1yq_authorTopTabs{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:flex}.jbF1yq_authorNavBtn{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 10px;transition:background .12s,color .12s,border-color .12s}.jbF1yq_authorNavBtn:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_authorNavBtn[data-active]{background:var(--nf-ai-soft);border-color:color-mix(in srgb, var(--nf-ai) 40%, transparent);color:var(--nf-ai)}.jbF1yq_authorPageBodyFlow{gap:var(--nf-space-20,20px);flex-direction:column;flex:1;min-height:0;padding:0;display:flex;overflow:visible}.jbF1yq_authorPageHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:14px;display:flex}.jbF1yq_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}.jbF1yq_noticeSuccess{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);color:var(--nf-accent);border:1px solid var(--nf-accent);border-radius:10px;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 14px;display:flex}.jbF1yq_rowEnd{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.jbF1yq_assetFilterChip{border:1px solid var(--nf-glass-border);color:var(--nf-text);cursor:pointer;background:0 0;border-radius:999px;padding:4px 10px}.jbF1yq_assetFilterChipActive{background:var(--nf-accent);color:var(--nf-accent-fg);border-color:#0000}.jbF1yq_assetEditor{gap:var(--nf-space-12,12px);padding:var(--nf-space-16,16px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;display:flex}.jbF1yq_assetEditorRow{gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.jbF1yq_assetLabel{color:var(--nf-muted,var(--nf-text-2));flex-direction:column;flex:1;gap:4px;min-width:180px;font-size:12.5px;display:flex}.jbF1yq_assetTextarea{resize:vertical;min-height:160px;font-family:inherit}.jbF1yq_assetGrid{gap:var(--nf-space-14,14px);grid-template-columns:repeat(auto-fill,minmax(300px,1fr));display:grid}.jbF1yq_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}.jbF1yq_assetCardTop{justify-content:space-between;align-items:center;gap:8px;display:flex}.jbF1yq_assetKind{font-size:12.5px;font-weight:600}.jbF1yq_assetCardName{font-weight:600}.jbF1yq_assetCardContent{white-space:pre-wrap;color:var(--nf-text);max-height:150px;font-size:13.5px;overflow:auto}.jbF1yq_assetCardFooter{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.jbF1yq_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}.jbF1yq_iconBtn:hover{background:#0000000f}.jbF1yq_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}.jbF1yq_adaptTextarea{resize:vertical;min-height:220px}.jbF1yq_adaptResult{flex-direction:column;gap:14px;display:flex}.jbF1yq_adaptOutline{background:var(--nf-glass-face);border:1px solid var(--nf-glass-border);border-radius:12px;padding:10px 14px}.jbF1yq_adaptMatrix{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;display:grid}.jbF1yq_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}.jbF1yq_dimCardHead{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.jbF1yq_dimTitle{font-weight:600}.jbF1yq_dimCurrent{white-space:pre-wrap;font-size:13.5px}.jbF1yq_dimCardSelected{border-color:var(--nf-accent);box-shadow:0 0 0 1px var(--nf-accent)}.jbF1yq_dimEdit{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.jbF1yq_adaptOutlinePre{white-space:pre-wrap;max-height:260px;margin:0;font-family:inherit;font-size:13.5px;overflow:auto}.jbF1yq_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}.jbF1yq_adaptTable{border-collapse:collapse;width:100%;font-size:13.5px}.jbF1yq_adaptTable th,.jbF1yq_adaptTable td{border:1px solid var(--nf-glass-border);text-align:left;padding:6px 8px}.jbF1yq_adaptImpacts{flex-direction:column;gap:4px;display:flex}.jbF1yq_adaptImpact{font-size:13.5px}.jbF1yq_adaptTableScroll{overflow-x:auto}.jbF1yq_adaptCell{width:100%;min-width:90px}.jbF1yq_adaptRules{flex-direction:column;gap:10px;display:flex}.jbF1yq_adaptRule{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.jbF1yq_adaptRuleRow{align-items:center;gap:8px;display:flex}.jbF1yq_progressTotalBar .jbF1yq_meta{color:var(--nf-text);justify-content:center;align-items:center;font-size:12px;font-weight:600;display:flex;position:absolute;inset:0}.jbF1yq_shelfHero .jbF1yq_panelTitle{font-size:var(--nf-fs-22,22px);letter-spacing:.3px}.jbF1yq_shelfSearch{max-width:260px}.jbF1yq_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);text-align:center;flex-direction:column;flex:1;display:flex}.jbF1yq_shelfEmptyIcon{font-size:var(--nf-fs-42,42px)}.jbF1yq_shelfEmptyTitle{font-size:var(--nf-fs-16,16px);font-weight:700}.jbF1yq_shelfGrid{gap:var(--nf-container-gap,14px);grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;display:grid}.jbF1yq_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}.jbF1yq_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;--nf-ctrl-s:26px;--nf-ctrl-m:30px;--nf-ctrl-l:35px}.jbF1yq_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;--nf-ctrl-s:30px;--nf-ctrl-m:34px;--nf-ctrl-l:41px}.jbF1yq_panel[data-nf-mode=light]{color-scheme:light;--nf-bg:#f6f3ec;--nf-bg-raise:#fcfaf6;--nf-bg-inset:#efe9dc;--nf-bg-deep:#e9e2d4;--nf-line:#26221b24;--nf-line-2:#26221b0f;--nf-border:#26221b24;--nf-border-strong:#26221b4d;--nf-text:#26221b;--nf-text-2:#6f665a;--nf-text-2-alpha:#6f665ab8;--nf-text-3:#8f8679;--nf-accent:#a63e2a;--nf-accent-hover:#8c3321;--nf-accent-soft:#a63e2a24;--nf-accent-fg:#fdf3ee;--nf-hover:#26221b0d;--nf-success:#5f9656;--nf-error:#b94a41;--nf-warn:#c98a1f;--nf-info:#4a6fa5;--nf-ai:#c07c22;--nf-human:#2f6fa3;--nf-idle:#cfc6b5;--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:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#a0917d47;--nf-glass-inset:#fff6}.jbF1yq_panel[data-nf-mode=dark]{color-scheme:dark;--nf-bg:#17140f;--nf-bg-raise:#201c16;--nf-bg-inset:#2a241c;--nf-bg-deep:#100e0a;--nf-line:#f2e9dc1f;--nf-line-2:#f2e9dc0d;--nf-border:#f2e9dc1f;--nf-border-strong:#f2e9dc3d;--nf-text:#eee7da;--nf-text-2:#c9beab;--nf-text-2-alpha:#c9beabb3;--nf-text-3:#9a917e;--nf-accent:#a63e2a;--nf-accent-hover:#b4472c;--nf-accent-soft:#a63e2a2e;--nf-accent-fg:#fdf3ee;--nf-hover:#f2e9dc0f;--nf-success:#79b372;--nf-error:#d95753;--nf-warn:#e3a52e;--nf-info:#6b8fc7;--nf-ai:#d98a2b;--nf-human:#4aa3d9;--nf-idle:#5c5344;--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:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#f2e9dc24;--nf-glass-inset:#ffffff0f}.jbF1yq_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;min-width:0;transition:border-color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease, box-shadow var(--nf-dur-base,.15s) ease;border-radius:12px;flex-direction:column;gap:10px;padding:12px;display:flex}.jbF1yq_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.jbF1yq_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.jbF1yq_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;flex:none;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}.jbF1yq_bookCardCover img{object-fit:cover;width:100%;height:100%;transition:transform var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_bookCard:hover .jbF1yq_bookCardCover img{transform:scale(1.06)}.jbF1yq_bookCardCover:after{content:\"\";border-radius:inherit;pointer-events:none;opacity:0;transition:opacity var(--nf-dur-slow,.28s) ease;background:linear-gradient(#0000 55%,#00000047);position:absolute;inset:0}.jbF1yq_bookCard:hover .jbF1yq_bookCardCover:after{opacity:1}.jbF1yq_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}.jbF1yq_bookCardCoverTitle{font-size:var(--nf-fs-22,22px);color:var(--nf-accent);letter-spacing:2px;font-weight:800}.jbF1yq_bookCardBody{gap:var(--nf-space-6,5px);flex-direction:column;flex:1;min-width:0;display:flex}.jbF1yq_bookCardTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);display:flex}.jbF1yq_bookCardName{font-weight:700;font-size:var(--nf-fs-14,13.5px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.jbF1yq_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.jbF1yq_bookCardMetaRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;display:flex}.jbF1yq_bookCardProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000001f}.jbF1yq_bookCardProgressFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_createBookInner{align-self:center;gap:var(--nf-space-12,12px);flex-direction:column;width:min(520px,100%);display:flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_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}.jbF1yq_progressLineDone{color:var(--nf-success);font-weight:600}.jbF1yq_progressLineError{color:var(--nf-error);font-weight:600}.jbF1yq_meta{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9}.jbF1yq_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.jbF1yq_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}.jbF1yq_panelContent::-webkit-scrollbar,.jbF1yq_chatScroll::-webkit-scrollbar,.jbF1yq_chapterPreview::-webkit-scrollbar,.jbF1yq_progress::-webkit-scrollbar,.jbF1yq_toolLive::-webkit-scrollbar{width:8px;height:8px}.jbF1yq_panelContent::-webkit-scrollbar-thumb,.jbF1yq_chatScroll::-webkit-scrollbar-thumb,.jbF1yq_chapterPreview::-webkit-scrollbar-thumb,.jbF1yq_progress::-webkit-scrollbar-thumb,.jbF1yq_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:var(--nf-radius-4,4px)}.jbF1yq_panelContent::-webkit-scrollbar-thumb:hover,.jbF1yq_chatScroll::-webkit-scrollbar-thumb:hover,.jbF1yq_chapterPreview::-webkit-scrollbar-thumb:hover,.jbF1yq_progress::-webkit-scrollbar-thumb:hover,.jbF1yq_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}@keyframes jbF1yq_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes jbF1yq_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.jbF1yq_card{animation:jbF1yq_fadeIn var(--nf-dur-base,.15s) ease}.jbF1yq_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);z-index:1;flex-wrap:wrap;flex-shrink:0;margin:10px 12px 0;display:flex;position:relative}.jbF1yq_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;transition:border-color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;align-items:center;gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.jbF1yq_dropzone:hover,.jbF1yq_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.jbF1yq_dropzoneIcon{font-size:var(--nf-fs-22,22px);line-height:1}.jbF1yq_bookCardActions{align-items:center;gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);margin-top:auto;display:flex}.jbF1yq_bookCardActions .jbF1yq_button{flex:1;justify-content:center}.jbF1yq_readerView{transition:background var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease;flex-direction:column;display:flex;position:absolute;inset:0;overflow:hidden}.jbF1yq_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}.jbF1yq_readerTitle{font-weight:700;font-size:var(--nf-fs-14,14px)}.jbF1yq_readerSeg{align-items:center;gap:var(--nf-space-2,2px);border-radius:var(--nf-radius-8,8px);display:flex;overflow:hidden}.jbF1yq_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}.jbF1yq_readerSegBtn:hover,.jbF1yq_readerSegActive{opacity:1}.jbF1yq_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.jbF1yq_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}.jbF1yq_readerGroup{gap:var(--nf-space-2,1px);flex-direction:column;display:flex}.jbF1yq_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}.jbF1yq_readerGroupTitle:hover{opacity:1;background:#8080801f}.jbF1yq_readerGroupArrow{font-size:var(--nf-fs-12,12px);text-align:center;flex:none;width:12px}.jbF1yq_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}.jbF1yq_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;transition:opacity var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;background:0 0;border:1px solid;min-width:0;display:flex}.jbF1yq_readerItem:hover{opacity:1}.jbF1yq_readerItemActive{opacity:1;font-weight:700}.jbF1yq_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.jbF1yq_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_readerItemBadge{font-size:var(--nf-fs-12,11px);flex:none}.jbF1yq_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}.jbF1yq_readerArticle{gap:var(--nf-space-12,12px);flex-direction:column;width:100%;display:flex}.jbF1yq_readerChapterTitle{font-size:var(--nf-fs-24,24px);letter-spacing:1px;margin:0;font-weight:800}.jbF1yq_readerChapterMeta{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-12,12px);display:flex}.jbF1yq_readerText{text-align:justify;letter-spacing:.02em}.jbF1yq_readerPara{text-indent:2em;margin:0 0 .85em}.jbF1yq_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}.jbF1yq_readerLoading,.jbF1yq_readerError{padding:var(--nf-space-32,32px) 0;font-size:var(--nf-fs-14,13px);opacity:.7;align-self:center}.jbF1yq_readerError{color:var(--nf-error)}.jbF1yq_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}.jbF1yq_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);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex;overflow:auto}.jbF1yq_importModalHead{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);display:flex}.jbF1yq_importModalTabs{gap:var(--nf-space-8,8px);display:flex}.jbF1yq_importModalTabs .jbF1yq_button{flex:1}.jbF1yq_importModalBody{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.jbF1yq_importField{gap:var(--nf-space-6,5px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);flex-direction:column;display:flex}.jbF1yq_importHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);line-height:1.5}.jbF1yq_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}.jbF1yq_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}.jbF1yq_importModalActions{justify-content:flex-end;gap:var(--nf-space-8,8px);display:flex}.jbF1yq_settingsDrawerOverlay{z-index:1000;background:#00000073;animation:.16s jbF1yq_nfFadeIn;position:fixed;inset:0}.jbF1yq_settingsDrawer{background:var(--nf-bg-raise,var(--nf-bg));border-left:1px solid var(--nf-border);flex-direction:column;width:min(560px,94vw);animation:.2s jbF1yq_nfSlideInRight;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-18px 0 48px #00000059}@keyframes jbF1yq_nfSlideInRight{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}.jbF1yq_settingsDrawerHead{padding:var(--nf-space-12) var(--nf-space-16);border-bottom:1px solid var(--nf-border);flex:none;justify-content:space-between;align-items:center;display:flex}.jbF1yq_settingsDrawerBody{flex:1;min-height:0;overflow-y:auto}.jbF1yq_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}.jbF1yq_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}.jbF1yq_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}.jbF1yq_settingsCard{min-width:0;max-width:100%}.jbF1yq_settingsCard>*{min-width:0}.jbF1yq_settingsCard .jbF1yq_card{width:100%;min-width:0;max-width:100%}.jbF1yq_settingsCard .jbF1yq_fieldLabel{white-space:nowrap;text-overflow:ellipsis;max-width:100%;min-height:18px;line-height:18px;overflow:hidden}.jbF1yq_settingsCard .jbF1yq_row{align-items:flex-start}.jbF1yq_settingsCard+.jbF1yq_settingsCard{flex:none;min-height:auto}.jbF1yq_switch{border-radius:var(--nf-radius-999,999px);border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);cursor:pointer;width:42px;height:24px;transition:background var(--nf-dur-base,.15s) ease, border-color var(--nf-dur-base,.15s) ease;flex:none;padding:0;position:relative}.jbF1yq_view :is(button,[href],input,select,textarea,summary,[tabindex]):focus-visible,.jbF1yq_entry:focus-visible,.jbF1yq_runChip:focus-visible,.jbF1yq_view [role=button]:focus-visible,.jbF1yq_view [role=tab]:focus-visible,.jbF1yq_view [role=menuitem]:focus-visible,.jbF1yq_view [role=option]:focus-visible{outline:var(--nf-focus-w,2px) solid var(--nf-accent);outline-offset:var(--nf-focus-offset,2px)}.jbF1yq_view :is(input,textarea,select):focus-visible{border-color:var(--nf-accent)}.jbF1yq_view [data-nf-danger]:focus-visible{outline-color:var(--nf-error)}@media (prefers-reduced-motion:reduce){:root{--nf-dur-fast:.01ms;--nf-dur-base:.01ms;--nf-dur-slow:.01ms}.jbF1yq_view,.jbF1yq_view *,.jbF1yq_view :before,.jbF1yq_view :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}:root{--nf-chip-bg:#ffffffd1;--nf-chip-border:#3c3c4329;--nf-chip-fg:#1c1c1e;--nf-chip-shadow:0 2px 12px #0000001f;--nf-chip-running:#00b85c;--nf-chip-paused:#b45309;--nf-chip-done:#0284c7;--nf-chip-stopped:#64748b;--nf-chip-error:#dc2626;--nf-streaming:#d16a92}body[data-ds-dark-theme]{--nf-chip-bg:#1c1c1ed1;--nf-chip-border:#ffffff24;--nf-chip-fg:#f2f2f7;--nf-chip-shadow:0 2px 12px #00000073;--nf-chip-running:#35d07a;--nf-chip-paused:#f0ac82;--nf-chip-done:#5cb3e8;--nf-chip-stopped:#98989d;--nf-chip-error:#ff6b60;--nf-streaming:#e891b5}.jbF1yq_runChip{top:calc(max(var(--dsh-frame-top-clearance,0px), var(--dsh-windows-titlebar-height,0px)) + 12px);z-index:var(--nf-z-chip,2147480000);align-items:center;gap:var(--nf-space-6,6px);max-width:360px;padding:5px var(--nf-space-12,12px);border:1px solid var(--nf-chip-border);border-radius:var(--nf-radius-999,999px);font-family:var(--nf-font);font-size:var(--nf-fs-12,12px);color:var(--nf-chip-fg);background:var(--nf-chip-bg);box-shadow:var(--nf-chip-shadow);backdrop-filter:blur(6px);cursor:pointer;user-select:none;touch-action:none;white-space:nowrap;transition:border-color var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease;font-weight:600;display:none;position:fixed;right:14px}.jbF1yq_runChip[data-visible=true]{display:flex}.jbF1yq_runChip:hover{border-color:var(--nf-chip-running);box-shadow:var(--nf-chip-shadow), 0 0 0 3px color-mix(in srgb, var(--nf-chip-running) 18%, transparent)}.jbF1yq_runChipText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.jbF1yq_runChipDot{background:var(--nf-chip-stopped);border-radius:50%;flex:none;width:7px;height:7px}.jbF1yq_runChip[data-status=running] .jbF1yq_runChipDot{background:var(--nf-chip-running)}.jbF1yq_runChip[data-status=paused] .jbF1yq_runChipDot{background:var(--nf-chip-paused)}.jbF1yq_runChip[data-status=done] .jbF1yq_runChipDot{background:var(--nf-chip-done)}.jbF1yq_runChip[data-status=error] .jbF1yq_runChipDot{background:var(--nf-chip-error)}@keyframes jbF1yq_nfChipPulse{0%,to{opacity:1}50%{opacity:.35}}.jbF1yq_runChip[data-status=running] .jbF1yq_runChipDot{animation:1.4s ease-in-out infinite jbF1yq_nfChipPulse}@media (prefers-reduced-motion:reduce){.jbF1yq_runChipDot{animation:none!important}}.jbF1yq_lfPill{font-size:var(--nf-fs-10,10px);border-radius:var(--nf-radius-999,999px);color:var(--nf-text-2);background:var(--nf-bg-inset);white-space:nowrap;padding:1px 7px;font-weight:600}.jbF1yq_lfPill[data-phase=streaming]{color:var(--nf-streaming);background:color-mix(in srgb, var(--nf-streaming) 16%, transparent)}.jbF1yq_lfPill[data-phase=completed]{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent)}.jbF1yq_lfPill[data-phase=failed]{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 18%, transparent)}.jbF1yq_lfDot{background:var(--nf-text-3);border-radius:50%;flex:none;width:6px;height:6px}.jbF1yq_lfDot[data-size=lg]{width:7px;height:7px}.jbF1yq_lfDot[data-state=streaming]{background:var(--nf-streaming)}.jbF1yq_lfDot[data-state=completed],.jbF1yq_lfDot[data-state=ok]{background:var(--nf-success)}.jbF1yq_lfDot[data-state=failed]{background:var(--nf-error)}.jbF1yq_emptyState{justify-content:center;align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-32,32px) var(--nf-space-20,20px);text-align:center;flex-direction:column;display:flex}.jbF1yq_emptyStateIcon{font-size:var(--nf-fs-34,34px);line-height:1}.jbF1yq_emptyStateTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);font-weight:600}.jbF1yq_emptyStateHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);max-width:340px;line-height:1.5}.jbF1yq_emptyState[data-compact=true]{padding:var(--nf-space-16,16px) var(--nf-space-12,12px);gap:var(--nf-space-6,6px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateIcon{font-size:var(--nf-fs-20,20px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateTitle{font-size:var(--nf-fs-12,12px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateHint{font-size:var(--nf-fs-12,12px);max-width:280px}@keyframes jbF1yq_nfSkeletonShimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.jbF1yq_pillNav{gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex;position:relative}.jbF1yq_pillNavSliding .jbF1yq_pillNavPill[data-active]{color:var(--nf-accent);background:0 0;border-color:#0000;font-weight:600}.jbF1yq_pillNavSlider{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);border:1px solid color-mix(in srgb, var(--nf-accent) 55%, transparent);transition:transform var(--nf-dur-base,.15s) ease, width var(--nf-dur-base,.15s) ease;pointer-events:none;border-radius:999px;position:absolute;top:0;bottom:0;left:0}@media (prefers-reduced-motion:reduce){.jbF1yq_pillNavSlider{transition:none}}.jbF1yq_pillNavPill{border:1px solid var(--nf-border);background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:var(--nf-radius-999,999px);font-size:var(--nf-fs-12,12px);cursor:pointer;transition:border-color var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;padding:5px 14px;font-weight:600}.jbF1yq_pillNavPill:hover{border-color:var(--nf-border-strong);color:var(--nf-text)}.jbF1yq_pillNavPill[data-active]{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);border-color:color-mix(in srgb, var(--nf-accent) 42%, transparent);color:var(--nf-text)}.jbF1yq_assistantFloat[data-top]{z-index:82;box-shadow:var(--nf-shadow-lg), 0 0 0 1px color-mix(in srgb, var(--nf-accent) 22%, transparent)}.jbF1yq_assistantFloatHeader:focus-visible{outline:var(--nf-focus-w,2px) solid var(--nf-accent);outline-offset:-2px}.jbF1yq_view h1,.jbF1yq_view h2{font-family:var(--nf-font-display);letter-spacing:-.3px;font-weight:400;line-height:1.25}.jbF1yq_eyebrow{font-size:var(--nf-fs-10,10px);letter-spacing:.16em;text-transform:uppercase;color:var(--nf-accent);font-weight:600}.jbF1yq_titleBlock{gap:var(--nf-space-2,2px);flex-direction:column;display:flex}.jbF1yq_runLog{border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-inset);min-height:120px;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-2,2px);font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;flex-direction:column;flex:1;line-height:1.6;display:flex;overflow-y:auto}.jbF1yq_runLogLine{gap:var(--nf-space-8,8px);opacity:.88;display:flex}.jbF1yq_runLogTime{color:var(--nf-text-3);flex:none}.jbF1yq_tnum,.jbF1yq_statCardDValue,.jbF1yq_statCardDDetail,.jbF1yq_progressLine,.jbF1yq_liveText{font-variant-numeric:tabular-nums}.jbF1yq_chapterPreview,.jbF1yq_reviewBox{max-width:var(--nf-measure,720px);width:100%;margin-inline:auto}.jbF1yq_view textarea{max-width:var(--nf-measure,720px)}.jbF1yq_planMaster{grid-template-columns:264px minmax(0,1fr);align-items:stretch;height:clamp(480px,100vh - 250px,1200px);display:grid}.jbF1yq_planTree{background:color-mix(in srgb, var(--nf-border) 10%, transparent);border-right:1px solid var(--nf-border);padding:var(--nf-space-12,12px) var(--nf-space-10,10px) var(--nf-space-12,12px) var(--nf-space-14,14px);gap:var(--nf-space-2,2px);flex-direction:column;display:flex;overflow:auto}.jbF1yq_planTreeSearch{margin-bottom:var(--nf-space-6,6px);flex:none}.jbF1yq_planTreeVolGroup{display:block}.jbF1yq_planTreeVol{align-items:center;gap:var(--nf-space-6,6px);padding:var(--nf-space-8,8px) var(--nf-space-4,4px) var(--nf-space-4,4px);cursor:pointer;font-size:var(--nf-fs-12,12px);color:var(--nf-muted,var(--nf-text-2));user-select:none;background:linear-gradient(color-mix(in srgb, var(--nf-border) 10%, transparent), color-mix(in srgb, var(--nf-border) 10%, transparent)), var(--nf-glass-face);z-index:1;font-weight:600;display:flex;position:sticky;top:0}.jbF1yq_planTreeVolMeta{font-variant-numeric:tabular-nums;opacity:.75;margin-left:auto}.jbF1yq_planTreeRow{align-items:center;gap:var(--nf-space-6,6px);width:100%;padding:var(--nf-space-6,6px) var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);color:var(--nf-text);cursor:pointer;text-align:left;font-size:var(--nf-fs-14,13px);transition:background var(--nf-dur-fast,.12s) ease, border-color var(--nf-dur-fast,.12s) ease;background:0 0;border:1px solid #0000;display:flex}.jbF1yq_planTreeRow:hover{background:color-mix(in srgb, var(--nf-accent) 10%, transparent)}.jbF1yq_planTreeRow[data-active]{background:color-mix(in srgb, var(--nf-accent) 16%, var(--nf-glass-face));border-color:var(--nf-accent)}.jbF1yq_planTreeRowNo{font-variant-numeric:tabular-nums;color:var(--nf-muted,var(--nf-text-2));font-size:var(--nf-fs-12,12px);text-align:right;flex:none;min-width:2ch}.jbF1yq_planTreeRowTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_planDot{border-radius:50%;flex:none;width:8px;height:8px}.jbF1yq_planDetail{gap:var(--nf-space-10,10px);min-width:0;padding:var(--nf-space-14,14px) var(--nf-space-14,14px) var(--nf-space-12,12px) var(--nf-space-14,14px);flex-direction:column;display:flex}.jbF1yq_planDetailEmpty{border:1px dashed var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);flex:1;justify-content:center;align-items:center;display:flex}.jbF1yq_planDetailBody{flex:1;min-height:0;overflow:auto}.jbF1yq_planDetailTitle{font-family:var(--nf-font-display,inherit);font-size:var(--nf-fs-20,20px);color:var(--nf-text);letter-spacing:.01em;font-weight:400;line-height:1.3}.jbF1yq_planBeats{gap:var(--nf-space-8,8px);padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);max-width:var(--nf-measure,720px);flex-direction:column;display:flex}.jbF1yq_planBeatsLabel{font-size:var(--nf-fs-12,12px);letter-spacing:.06em;color:var(--nf-muted,var(--nf-text-2));font-weight:600}.jbF1yq_planDetailBar{gap:var(--nf-space-6,6px);border-top:1px solid var(--nf-glass-border);padding-top:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}@container jbF1yq_nfpanel (width<=900px){.jbF1yq_planMaster{grid-template-columns:1fr;height:auto;min-height:480px}.jbF1yq_planTree{border-right:none;border-bottom:1px solid var(--nf-glass-border);padding-right:var(--nf-space-14,14px);padding-bottom:var(--nf-space-10,10px);max-height:300px}}.jbF1yq_t2Master{grid-template-columns:200px minmax(0,1fr);min-height:320px;display:grid}.jbF1yq_t2Rail{background:color-mix(in srgb, var(--nf-border) 10%, transparent);border-right:1px solid var(--nf-border);padding:var(--nf-space-12,12px) var(--nf-space-10,10px);gap:var(--nf-space-4,4px);flex-direction:column;display:flex}.jbF1yq_t2RailHead{font-size:var(--nf-fs-14,14px);padding:var(--nf-space-4,4px) var(--nf-space-6,6px) var(--nf-space-10,10px);font-weight:650}.jbF1yq_t2RailBtn{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,6px) var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);color:var(--nf-text);cursor:pointer;text-align:left;width:100%;font-size:var(--nf-fs-14,13px);transition:background var(--nf-dur-fast,.12s) ease, border-color var(--nf-dur-fast,.12s) ease;background:0 0;border:1px solid #0000;display:flex}.jbF1yq_t2RailBtn:hover{background:color-mix(in srgb, var(--nf-accent) 10%, transparent)}.jbF1yq_t2RailBtn[data-active]{background:color-mix(in srgb, var(--nf-accent) 16%, var(--nf-glass-face));border-color:var(--nf-accent);color:var(--nf-accent);font-weight:600}.jbF1yq_t2RailSep{background:var(--nf-glass-border);height:1px;margin:var(--nf-space-8,8px) 0}.jbF1yq_t2RailMeta{gap:var(--nf-space-6,6px);padding:0 var(--nf-space-6,6px);font-size:var(--nf-fs-12,12px);color:var(--nf-muted,var(--nf-text-2));flex-direction:column;line-height:1.5;display:flex}.jbF1yq_t2Content{padding:var(--nf-space-16,16px) var(--nf-space-20,20px);gap:var(--nf-space-14,14px);flex-direction:column;min-width:0;display:flex}@container jbF1yq_nfpanel (width<=900px){.jbF1yq_t2Master{grid-template-columns:1fr}.jbF1yq_t2Rail{border-right:none;border-bottom:1px solid var(--nf-glass-border)}}.jbF1yq_view .jbF1yq_button,.jbF1yq_view .jbF1yq_buttonPrimary,.jbF1yq_view .jbF1yq_buttonSmall,.jbF1yq_view .jbF1yq_iconButton,.jbF1yq_view .jbF1yq_pillNavPill,.jbF1yq_view .jbF1yq_segTab{transition-property:color,background,border-color,box-shadow,transform,opacity;transition-duration:var(--nf-dur-fast,.12s);transition-timing-function:cubic-bezier(.2,.8,.2,1)}.jbF1yq_view .jbF1yq_button:active,.jbF1yq_view .jbF1yq_buttonPrimary:active,.jbF1yq_view .jbF1yq_buttonSmall:active,.jbF1yq_view .jbF1yq_iconButton:active{transform:scale(.96)}.jbF1yq_card{transition:border-color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-base,.15s) cubic-bezier(.2, .8, .2, 1), box-shadow var(--nf-dur-base,.15s) ease}.jbF1yq_card:hover{border-color:var(--nf-border-strong);transform:translateY(-1px)}@keyframes jbF1yq_nfViewIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .jbF1yq_view{animation:jbF1yq_nfViewIn var(--nf-dur-slow,.28s) cubic-bezier(.2, .8, .2, 1)}:root{--nf-toast-bg:#faf9f5f5;--nf-toast-border:#a0917d66;--nf-toast-fg:#1f1e1c}body[data-ds-dark-theme]{--nf-toast-bg:#181c22f5;--nf-toast-border:#ffffff29;--nf-toast-fg:#e8eaed}.jbF1yq_nfToastHost{z-index:var(--nf-z-chip,2147480000);pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;bottom:26px;left:50%;transform:translate(-50%)}.jbF1yq_nfToast{border:1px solid var(--nf-toast-border);background:var(--nf-toast-bg);max-width:440px;color:var(--nf-toast-fg);font-family:var(--nf-font);font-size:var(--nf-fs-12,12.5px);border-radius:12px;align-items:center;gap:8px;padding:10px 18px;font-weight:600;animation:.3s cubic-bezier(.2,.9,.3,1.15) jbF1yq_nfToastIn;display:flex;box-shadow:0 12px 40px #00000040}.jbF1yq_nfToast[data-kind=done]{border-color:color-mix(in srgb, var(--nf-toast-ok,#2ec27e) 45%, var(--nf-toast-border))}.jbF1yq_nfToast[data-kind=error]{border-color:color-mix(in srgb, #dc2626 45%, var(--nf-toast-border))}.jbF1yq_nfToast .jbF1yq_nfToastTick{flex:none;font-weight:700}.jbF1yq_nfToast[data-kind=done] .jbF1yq_nfToastTick{color:var(--nf-toast-ok,#2ec27e)}.jbF1yq_nfToast[data-kind=error] .jbF1yq_nfToastTick{color:#ef4444}.jbF1yq_nfToast.jbF1yq_nfToastOut{opacity:0;transition:opacity .3s,transform .3s;transform:translateY(8px)}@keyframes jbF1yq_nfToastIn{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}.jbF1yq_cmdMask{z-index:90;backdrop-filter:blur(4px);background:#08090b6b;justify-content:center;align-items:flex-start;padding-top:12vh;animation:.16s jbF1yq_nfFadeIn;display:flex;position:absolute;inset:0}.jbF1yq_cmdBox{border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);width:min(540px,92%);max-height:62vh;box-shadow:var(--nf-shadow-lg);flex-direction:column;animation:.22s cubic-bezier(.2,.9,.3,1.12) jbF1yq_nfCmdPop;display:flex;overflow:hidden}.jbF1yq_cmdInput{width:100%;color:var(--nf-text);font-family:var(--nf-font);font-size:var(--nf-fs-14,14px);padding:var(--nf-space-14,14px) var(--nf-space-16,16px);border:none;border-bottom:1px solid var(--nf-border);background:0 0;outline:none}.jbF1yq_cmdInput::placeholder{color:var(--nf-text-3)}.jbF1yq_cmdList{padding:var(--nf-space-6,6px);margin:0;list-style:none;overflow:auto}.jbF1yq_cmdItem{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border-radius:var(--nf-radius-10,10px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-text-2);cursor:pointer;display:flex}.jbF1yq_cmdItem .jbF1yq_cmdIcon{font-size:var(--nf-fs-14,14px);flex:none}.jbF1yq_cmdItem b{color:var(--nf-text);font-weight:600}.jbF1yq_cmdItem .jbF1yq_cmdHint{font-size:var(--nf-fs-10,10px);color:var(--nf-text-3);margin-left:auto}.jbF1yq_cmdItem[data-active]{background:var(--nf-accent-soft);color:var(--nf-text)}.jbF1yq_cmdEmpty{padding:var(--nf-space-20,20px);text-align:center;color:var(--nf-text-3);font-size:var(--nf-fs-12,12.5px)}@keyframes jbF1yq_nfCmdPop{0%{opacity:0;transform:translateY(-8px)scale(.97)}to{opacity:1;transform:none}}.jbF1yq_wfStage{--wf-bg:var(--nf-bg);--wf-bg2:var(--nf-bg-raise);--wf-bg3:var(--nf-bg-inset);--wf-bg4:var(--nf-bg-deep,var(--nf-bg-inset));--wf-line:var(--nf-border);--wf-line2:var(--nf-border-strong);--wf-text:var(--nf-text);--wf-dim:var(--nf-text-2);--wf-faint:var(--nf-text-3);--wf-ai:var(--nf-ai,#d98a2b);--wf-human:var(--nf-human,#4aa3d9);--wf-ok:var(--nf-success);--wf-warn:var(--nf-warn);--wf-bad:var(--nf-error);--wf-idle:var(--nf-idle,#5c5344);--wf-serif:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);--wf-ui:var(--nf-font,\"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif);--wf-mono:var(--nf-font-mono,\"Cascadia Mono\", Consolas, \"SF Mono\", ui-monospace, monospace);background:var(--wf-bg2);border:1px solid var(--wf-line);color:var(--wf-text);font-family:var(--wf-ui);-webkit-font-smoothing:antialiased;border-radius:16px;font-size:14px;line-height:1.6;position:relative;overflow:hidden}.jbF1yq_wfStage button{font-family:inherit}.jbF1yq_wfTop{background:var(--nf-bg-deep,var(--nf-bg));border-bottom:1px solid var(--wf-line2);flex-wrap:wrap;align-items:center;gap:14px;padding:12px 18px;display:flex}.jbF1yq_wfBook{font-family:var(--wf-serif);white-space:nowrap;text-overflow:ellipsis;max-width:38vw;font-size:22px;line-height:1.2;overflow:hidden}.jbF1yq_wfProg{color:var(--wf-dim);white-space:nowrap;align-items:baseline;gap:6px;font-size:12.5px;display:flex}.jbF1yq_wfProgBig{font-family:var(--wf-serif);color:var(--wf-ok);font-size:22px;line-height:1.1}.jbF1yq_wfProgRest{color:var(--wf-dim)}.jbF1yq_wfPill{border:1px solid var(--wf-line);color:var(--wf-dim);background:var(--wf-bg2);white-space:nowrap;border-radius:99px;align-items:center;gap:6px;padding:3px 10px;font-size:12px;display:inline-flex}.jbF1yq_wfPillDot{border-radius:50%;flex:none;width:7px;height:7px;display:inline-block}.jbF1yq_wfLiveChip{color:var(--wf-ai);border-color:#d98a2b66}.jbF1yq_wfTopRight{flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto;display:flex}.jbF1yq_wfSep{background:var(--wf-line);flex:none;width:1px;height:16px;margin:0 4px}.jbF1yq_wfTool{color:var(--wf-dim);border:1px solid var(--wf-line);cursor:pointer;white-space:nowrap;background:0 0;border-radius:7px;padding:3px 11px;font-size:12.5px;transition:border-color .15s,color .15s}.jbF1yq_wfTool:hover{border-color:var(--wf-line);color:var(--wf-text)}.jbF1yq_wfToolBlue{color:var(--nf-human);border-color:#4aa3d959}.jbF1yq_wfToolAmber{color:var(--nf-ai);border-color:#d98a2b66}.jbF1yq_wfMetrics{gap:var(--nf-space-8,8px);grid-template-columns:repeat(4,minmax(0,1fr));margin:14px 18px 0;display:grid}.jbF1yq_wfMetric{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);min-width:0;padding:9px 11px}.jbF1yq_wfMetric span{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-2);white-space:nowrap;display:block}.jbF1yq_wfMetric b{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);color:var(--nf-text);font-variant-numeric:tabular-nums;font-size:20px;font-weight:700}.jbF1yq_wfMetric small{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;margin-top:1px;display:block;overflow:hidden}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfMetrics{grid-template-columns:repeat(2,minmax(0,1fr))}}.jbF1yq_wfBody{grid-template-columns:minmax(0,1fr) 380px;display:grid}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfBody{grid-template-columns:minmax(0,1fr)}}.jbF1yq_wfColA{flex-direction:column;gap:16px;min-width:0;padding:16px 18px;display:flex}.jbF1yq_wfColB{border-left:1px solid var(--wf-line2);flex-direction:column;gap:16px;min-width:0;padding:16px 18px;display:flex}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfColB{border-left:none}}.jbF1yq_wfRail{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:10px;grid-template-columns:repeat(6,1fr);gap:4px;padding:5px;display:grid}.jbF1yq_wfRs{text-align:center;background:var(--wf-bg4);color:var(--wf-faint);cursor:pointer;border:1px solid #0000;border-radius:7px;min-width:0;padding:6px 2px;font-size:12px;transition:transform .12s,filter .12s;position:relative}.jbF1yq_wfRs:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.jbF1yq_wfRs:disabled{cursor:default;opacity:.8}.jbF1yq_wfRsNo{font-family:var(--wf-mono);opacity:.7;font-size:9px;line-height:1.2;display:block}.jbF1yq_wfRsName{color:inherit;white-space:nowrap;text-overflow:ellipsis;font-size:12.5px;font-weight:600;line-height:1.4;display:block;overflow:hidden}.jbF1yq_wfRsChk{font-family:var(--wf-mono);color:inherit;white-space:nowrap;text-overflow:ellipsis;font-size:10px;font-weight:700;line-height:1.3;display:block;overflow:hidden}.jbF1yq_wfDone{color:var(--wf-ok);background:#79b3721f}.jbF1yq_wfNow{color:var(--nf-ai);background:#d98a2b1f;border-color:#e0a03c80}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfRail{grid-template-columns:repeat(3,1fr)}}.jbF1yq_wfPoolWrap{position:relative}.jbF1yq_wfEmpty{border:1px dashed var(--wf-line);background:var(--wf-bg3);color:var(--wf-dim);border-radius:12px;padding:18px 20px;font-size:12.5px;line-height:1.8}.jbF1yq_wfPoolBar{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:12px;height:64px;display:flex;position:relative;overflow:hidden}.jbF1yq_wfPs{min-width:0;font-family:var(--wf-mono);color:#221b12;cursor:pointer;background:0 0;border:none;border-right:1px solid #0000001f;flex-direction:column;justify-content:center;align-items:center;gap:2px;padding:4px 6px;font-size:13.5px;font-weight:700;transition:filter .2s;display:flex;overflow:hidden}.jbF1yq_wfPs:last-child{border-right:none}.jbF1yq_wfPs:hover{filter:brightness(1.1)}.jbF1yq_wfPsN{font-variant-numeric:tabular-nums;font-size:17px;line-height:1.15}.jbF1yq_wfPsLab{font-family:var(--wf-ui);opacity:.95;font-size:12px;font-weight:600;line-height:1.2}.jbF1yq_wfPsLegend{color:var(--wf-dim);flex-wrap:wrap;gap:16px;margin-top:8px;font-size:12.5px;display:flex}.jbF1yq_wfPl{align-items:center;gap:6px;display:flex}.jbF1yq_wfSw{border-radius:3px;flex:none;width:10px;height:10px;display:inline-block}.jbF1yq_wfCmd{background:#4aa3d912;border:1px solid #4c9ed966;border-radius:14px;align-items:center;gap:16px;min-width:0;padding:13px 16px;display:flex;position:relative}.jbF1yq_wfQt{flex-direction:column;flex:none;gap:2px;display:flex}.jbF1yq_wfQtTone{color:var(--wf-dim);letter-spacing:.06em;text-transform:uppercase;font-size:12.5px}.jbF1yq_wfQt b{color:var(--nf-human);font-size:14px;line-height:1.4}.jbF1yq_wfCmdReason{min-width:0;color:var(--wf-faint);flex:1;font-size:12.5px;line-height:1.6}.jbF1yq_wfCmdBtn{background:var(--wf-human);color:#06202e;cursor:pointer;white-space:nowrap;border:none;border-radius:9px;flex:none;padding:9px 18px;font-size:13.5px;font-weight:700;transition:filter .15s;box-shadow:0 6px 20px #4aa3d94d}.jbF1yq_wfCmdBtn:hover:not(:disabled){filter:brightness(1.1)}.jbF1yq_wfCmdBtn:disabled{opacity:.45;cursor:not-allowed}.jbF1yq_wfCard2{grid-template-columns:1.2fr 1fr;gap:14px;display:grid}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfCard2{grid-template-columns:minmax(0,1fr)}}.jbF1yq_wfBox{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:12px;min-width:0;padding:13px 14px;position:relative}.jbF1yq_wfBoxH{letter-spacing:.14em;text-transform:uppercase;color:var(--wf-faint);align-items:center;gap:7px;margin:0 0 9px;font-size:12px;font-weight:700;line-height:1.4;display:flex}.jbF1yq_wfDot{border-radius:50%;flex:none;width:7px;height:7px;display:inline-block}.jbF1yq_wfRow{border-bottom:1px solid var(--wf-line2);align-items:center;gap:10px;padding:5px 0;font-size:12.5px;display:flex}.jbF1yq_wfRow:last-child{border-bottom:none}.jbF1yq_wfCn{font-family:var(--wf-mono);color:var(--wf-dim);white-space:nowrap;flex:none;min-width:58px}.jbF1yq_wfSt{border-radius:4px;flex:none;padding:1px 6px;font-size:12px}.jbF1yq_wfStRev{color:var(--nf-warn);background:#e3a52e26}.jbF1yq_wfStFix{color:var(--nf-error);background:#d9575326}.jbF1yq_wfStFail{color:var(--nf-error);background:#d957532e}.jbF1yq_wfDs{color:var(--wf-faint);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_wfAct{color:var(--nf-human);cursor:pointer;white-space:nowrap;opacity:.45;background:0 0;border:1px solid #4aa3d959;border-radius:6px;flex:none;padding:2px 9px;font-size:12px;transition:background .12s,opacity .12s}.jbF1yq_wfRow:hover .jbF1yq_wfAct,.jbF1yq_wfAct:focus-visible{opacity:1}.jbF1yq_wfRow:hover .jbF1yq_wfDs{color:var(--wf-dim)}.jbF1yq_wfRow{transition:background .1s}.jbF1yq_wfAct:hover{background:#4aa3d91f}.jbF1yq_wfSmallFoot{color:var(--wf-faint);flex-wrap:wrap;align-items:center;gap:10px;margin-top:8px;font-size:12px;line-height:1.7;display:flex}.jbF1yq_wfFeedBox{min-width:0}.jbF1yq_wfFeedList{flex-direction:column;min-width:0;display:flex}.jbF1yq_wfFi{border-bottom:1px solid var(--wf-line2);align-items:baseline;gap:10px;min-width:0;padding:6px 0;font-size:12.5px;display:flex}.jbF1yq_wfFi:last-child{border-bottom:none}.jbF1yq_wfFdot{background:var(--wf-idle);opacity:.9;border-radius:50%;flex:none;align-self:center;width:6px;height:6px}.jbF1yq_wfFdotOk{background:var(--wf-ok)}.jbF1yq_wfFdotErr{background:var(--wf-bad)}.jbF1yq_wfFt{color:var(--wf-dim);white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.jbF1yq_wfDrawerBox{min-width:0}.jbF1yq_wfDrawerToggle{color:var(--wf-dim);border:1px solid var(--wf-line);cursor:pointer;background:0 0;border-radius:5px;margin-left:auto;padding:1px 8px;font-size:12px}.jbF1yq_wfDrawerToggle:hover{color:var(--wf-text);border-color:var(--wf-line)}.jbF1yq_wfDrawerList{grid-template-columns:1fr 1fr;gap:6px;display:grid}@container jbF1yq_nfpanel (width<=560px){.jbF1yq_wfDrawerList{grid-template-columns:1fr}}.jbF1yq_wfDl{background:var(--wf-bg3);border:1px solid var(--wf-line2);color:var(--wf-dim);text-align:left;cursor:pointer;border-radius:8px;padding:8px 10px;font-size:12.5px;transition:border-color .12s,transform .12s;position:relative}.jbF1yq_wfDl:hover{border-color:#d98a2b73;transform:translateY(-1px)}.jbF1yq_wfDlName{color:var(--wf-text);font-weight:600;display:block}.jbF1yq_wfDlDi{color:var(--wf-faint);font-size:10px;font-family:var(--wf-mono);margin-top:2px;display:block}.jbF1yq_wfDlDim{opacity:.6}.jbF1yq_wfDlDim .jbF1yq_wfDlName{color:var(--wf-dim)}.jbF1yq_wfAccentBlue{border-color:#4c9ed959}.jbF1yq_wfAccentAmber{border-color:#d98a2b59}.jbF1yq_wfHint{color:var(--wf-dim);margin-bottom:8px;font-size:12.5px;line-height:1.7}.jbF1yq_wfEmpty2{color:var(--wf-faint);padding:2px 0 4px;font-size:12.5px;line-height:1.7;display:block}.jbF1yq_wfPreview{color:var(--wf-faint);border:1px dashed #4aa3d94d;border-radius:9px;flex-direction:column;gap:4px;margin-bottom:8px;padding:9px 11px;font-size:12px;display:flex}.jbF1yq_wfPreviewName{color:var(--wf-text);font-size:12.5px;font-weight:600}.jbF1yq_wfPreviewLine{line-height:1.7}.jbF1yq_wfPreviewActs{gap:8px;margin-top:3px;display:flex}.jbF1yq_wfConsole{font-family:var(--wf-mono);color:var(--wf-dim);background:var(--wf-bg3);border:1px solid var(--wf-line2);border-radius:9px;min-width:0;margin-bottom:8px;padding:9px 12px;font-size:12px;line-height:1.9}.jbF1yq_wfConRow{white-space:nowrap;align-items:center;gap:8px;min-width:0;display:flex}.jbF1yq_wfConOk{color:var(--wf-ok);font-weight:600}.jbF1yq_wfConErr{color:var(--nf-error)}.jbF1yq_wfLiveMark{color:var(--wf-ai);flex:none;animation:1s ease-in-out infinite jbF1yq_wfBlink}.jbF1yq_wfConTxt{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.jbF1yq_wfConBar{background:var(--wf-idle);border-radius:99px;flex:none;width:110px;height:4px;overflow:hidden}.jbF1yq_wfConBar i{background:var(--wf-ai);border-radius:99px;height:100%;display:block}.jbF1yq_wfOpsRow{flex-wrap:wrap;gap:8px;display:flex}.jbF1yq_wfOpsBtn{color:var(--wf-dim);border:1px solid var(--wf-line2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:7px;padding:5px 11px;font-size:12.5px;transition:border-color .12s,color .12s}.jbF1yq_wfOpsBtn:hover:not(:disabled){color:var(--wf-text);border-color:var(--wf-line)}.jbF1yq_wfOpsBtn:disabled{opacity:.4;cursor:not-allowed}.jbF1yq_wfOpsBtnMain{color:var(--nf-ai);background:#d98a2b1f;border-color:#d98a2b73}.jbF1yq_wfConsoleNote{color:var(--wf-ai);margin-top:8px;font-size:12px;line-height:1.6}.jbF1yq_wfCoord{color:var(--wf-dim);font-size:12.5px;line-height:1.9}.jbF1yq_wfCoord b{color:var(--wf-text);font-weight:600}.jbF1yq_wfCoordStuck{color:var(--nf-error);margin-top:4px}.jbF1yq_wfSignal{border-top:1px solid var(--wf-line2);background:var(--nf-bg-deep,var(--nf-bg));color:var(--wf-faint);flex-wrap:wrap;align-items:center;gap:22px;padding:10px 18px;font-size:12.5px;display:flex}.jbF1yq_wfSig{align-items:center;gap:6px;display:flex}.jbF1yq_wfSig b{color:var(--wf-dim);font-family:var(--wf-mono);font-weight:600}.jbF1yq_wfSigGood b{color:var(--wf-ok)}.jbF1yq_wfSigBad b{color:var(--nf-error)}.jbF1yq_wfSigRight{color:var(--wf-faint);margin-left:auto;font-size:12px}@keyframes jbF1yq_wfBlink{0%,to{opacity:.35}50%{opacity:1}}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfBook{max-width:70%}}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfRsName{font-size:12px}.jbF1yq_wfProg{display:none}.jbF1yq_wfTopRight{margin-left:0}.jbF1yq_wfPsLab{font-size:10px}.jbF1yq_wfCmd{flex-wrap:wrap}}.jbF1yq_wfStage button:focus-visible,.jbF1yq_wfStage a:focus-visible{outline:1px solid var(--nf-ai);outline-offset:2px}.jbF1yq_chWork{flex-direction:column;flex:1;min-height:0;display:flex}.jbF1yq_chWorkBar{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);flex-wrap:wrap;display:flex}.jbF1yq_chWorkTitle{font-family:var(--nf-font-display,inherit);font-size:var(--nf-fs-20,20px);color:var(--nf-text);font-weight:400;line-height:1.3}.jbF1yq_chWorkActions{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;margin-left:auto;display:flex}.jbF1yq_chWorkGrid{flex:1;grid-template-columns:260px minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.jbF1yq_chWorkSideHead{align-items:center;gap:var(--nf-space-8,8px);min-width:0;display:flex}.jbF1yq_chWorkSideHead>:first-child{flex:1;min-width:0}.jbF1yq_chWorkAside,.jbF1yq_chWorkSide{gap:var(--nf-space-10,10px);min-width:0;min-height:0;padding:var(--nf-space-12,12px);flex-direction:column;display:flex}.jbF1yq_chWorkAside{border-right:1px solid var(--nf-border)}.jbF1yq_chWorkSide{border-left:1px solid var(--nf-border)}.jbF1yq_chWorkAsideTitle{font-size:var(--nf-fs-12,12px);letter-spacing:.08em;color:var(--nf-muted,var(--nf-text-2));font-weight:600}.jbF1yq_chWorkAsideBody{gap:var(--nf-space-10,10px);min-height:0;padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex:1;display:flex;overflow:auto}.jbF1yq_chWorkMain{flex-direction:column;min-width:0;min-height:0;display:flex}.jbF1yq_chWorkToolbar{padding:var(--nf-space-8,8px) var(--nf-space-16,16px);border-bottom:1px solid var(--nf-border);align-items:center;display:flex}.jbF1yq_chWorkText{min-height:0;padding:var(--nf-space-20,20px) var(--nf-space-24,24px);background-color:var(--nf-bg-raise);background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);font-family:var(--nf-font-display);color:var(--nf-text-2);white-space:pre-wrap;word-break:break-word;flex:1;margin:0;line-height:28px;overflow:auto}.jbF1yq_chWorkSideBody{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.jbF1yq_chWorkToolActions{align-items:center;gap:var(--nf-space-8,8px);margin-left:auto;display:flex}.jbF1yq_chWorkDraftBar{gap:var(--nf-space-6,6px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border:1px solid color-mix(in srgb, var(--nf-warn,var(--nf-seal)) 45%, transparent);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex-shrink:0;display:flex}.jbF1yq_chWorkPickBar{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_chWorkPickBtns{align-items:center;gap:var(--nf-space-6,6px);margin-left:auto;display:flex}.jbF1yq_chWorkSideBody input[type=checkbox]{accent-color:var(--nf-seal,var(--nf-accent));cursor:pointer;flex-shrink:0}.jbF1yq_chWorkSideFoot{gap:var(--nf-space-8,8px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex-shrink:0;display:flex}.jbF1yq_chWorkFootRow{gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_panelHidden{display:none}@container jbF1yq_nfpanel (width<=1180px){.jbF1yq_chWorkGrid{grid-template-columns:220px minmax(0,1fr)}.jbF1yq_chWorkSide{border-left:none;border-top:1px solid var(--nf-border);grid-column:1/-1}}@container jbF1yq_nfpanel (width<=820px){.jbF1yq_chWorkGrid{grid-template-columns:minmax(0,1fr)}.jbF1yq_chWorkAside{border-right:none;border-bottom:1px solid var(--nf-border)}}";
1352
+ const css = ":root{--nf-font:-apple-system, BlinkMacSystemFont, \"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-font-display:Georgia, \"Times New Roman\", \"Noto Serif SC\", \"Source Han Serif SC\", \"Songti SC\", SimSun, serif;--nf-measure:720px;--nf-space-section:48px;--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-fs-display:24px;--nf-fs-title:16px;--nf-r:12px;--nf-r-sm:8px;--nf-r-lg:16px;--nf-space:16px;--nf-space-lg:24px;--nf-fs-body:13px;--nf-fs-meta:12px;--nf-fs-caption:11px;--nf-fs-notice:12px;--nf-fs-notice-strong:13px;--nf-lh-body:1.65;--nf-lh-title:1.3;--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-30:30px;--nf-space-36:36px;--nf-space-40:40px;--nf-space-48:48px;--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;--nf-focus-w:2px;--nf-focus-offset:2px;--nf-focus-radius:var(--nf-radius-6,6px);--nf-z-panel:60;--nf-z-float:80;--nf-z-modal:100;--nf-z-chip:2147480000;--nf-dur-fast:.12s;--nf-dur-base:.15s;--nf-dur-slow:.28s;--nf-ease-out:cubic-bezier(.32, .72, 0, 1)}.jbF1yq_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);transition:background var(--nf-dur-base,.15s) ease;background:0 0;border:none;font-size:14px;display:flex}body[data-ds-dark-theme] .jbF1yq_entry{color:var(--dsw-alias-label-primary,#ececf1)}.jbF1yq_entry:hover{background:var(--dsw-alias-interactive-bg-hover,#7f7f7f1f)}.jbF1yq_entry[data-active]{background:var(--dsw-alias-interactive-bg-active,#7f7f7f33)}.jbF1yq_entryIcon{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.jbF1yq_entryLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}[data-pane=conversation],[class*=centerCol]{position:relative}.jbF1yq_view{z-index:var(--nf-z-panel,60);color-scheme:light;font-family:var(--nf-font);--nf-bg:#f6f3ec;--nf-bg-raise:#fcfaf6;--nf-bg-inset:#efe9dc;--nf-bg-deep:#e9e2d4;--nf-line:#26221b24;--nf-line-2:#26221b0f;--nf-border:#26221b24;--nf-border-2:#26221b47;--nf-border-strong:#26221b4d;--nf-text:#26221b;--nf-text-1:#453e33;--nf-text-2:#6f665a;--nf-text-2-alpha:#6f665ab3;--nf-text-3:#726858;--nf-muted:var(--nf-text-3);--nf-muted-line:var(--nf-border);--nf-accent:#a63e2a;--nf-accent-hover:#8c3321;--nf-accent-soft:#a63e2a1f;--nf-accent-fg:#fdf3ee;--nf-seal:#a63e2a;--nf-seal-soft:#a63e2a1f;--nf-ai-soft:#c07c2221;--nf-human-soft:#2f6fa31f;--nf-ok:#5f9656;--nf-bad:#b94a41;--nf-hover:#26221b0d;--nf-success:#34c559;--nf-error:#e5484d;--nf-danger:var(--nf-error);--nf-success-ink:#1b7a3a;--nf-success-ink-soft:#1b7a3a1a;--nf-error-ink:#b3271f;--nf-error-ink-soft:#b3271f1a;--nf-warn-ink:#8a5a00;--nf-warn-ink-soft:#8a5a001a;--nf-info-ink:#3c5b8a;--nf-info-ink-soft:#3c5b8a1a;--nf-toast-ok:var(--nf-success);--nf-warn:#ff9500;--nf-info:#4a6fa5;--nf-ai:#c07c22;--nf-human:#2f6fa3;--nf-idle:#cfc6b5;--nf-paper-grid:#26221b0d;--nf-shadow:0 1px 3px #1f1e1c0d, 0 12px 32px #1f1e1c12;--nf-shadow-lg:0 4px 12px #1f1e1c0f, 0 20px 48px #1f1e1c1c;--nf-card-shadow:0 2px 6px #1f1e1c0d, 0 14px 38px #1f1e1c1a;--nf-card-shadow-hover:0 4px 10px #1f1e1c12, 0 22px 52px #1f1e1c26;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#a0917d47;--nf-glass-inset:#fff6;--nf-glass-noise:none;--nf-card-radius:16px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-sheen:transparent;--nf-card-border:1px solid #a0917d4d;--nf-ctrl-radius:12px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #d6cbbad9;--nf-ctrl-sheen:#fffcf473;--nf-ctrl-caret:var(--nf-accent);--nf-glass-bg-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.72 0 0 0 0 0.66 0 0 0 0 0.56 0 0 0 0.06 0'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23p)'/%3E%3C/svg%3E\");background:var(--nf-bg);color:var(--nf-text);display:none;position:absolute;inset:0;overflow:auto;container:jbF1yq_nfpanel/inline-size}.jbF1yq_panel[data-nf-mode=dark],body[data-ds-dark-theme] .jbF1yq_panel:not([data-nf-mode]),.jbF1yq_view:has(>.jbF1yq_panel[data-nf-mode=dark]),body[data-ds-dark-theme] .jbF1yq_view:not(:has(>.jbF1yq_panel[data-nf-mode=light])){color-scheme:dark;--nf-bg:#17140f;--nf-bg-raise:#201c16;--nf-bg-inset:#2a241c;--nf-bg-deep:#100e0a;--nf-line:#f2e9dc1f;--nf-line-2:#f2e9dc0d;--nf-border:#f2e9dc1f;--nf-border-2:#f2e9dc2e;--nf-border-strong:#f2e9dc3d;--nf-text:#eee7da;--nf-text-1:#d3cab6;--nf-text-2:#b3a78f;--nf-text-2-alpha:#b3a78fb3;--nf-text-3:#9d927b;--nf-muted:var(--nf-text-3);--nf-muted-line:var(--nf-border);--nf-accent:#c0492d;--nf-accent-hover:#d95a3a;--nf-accent-soft:#c14a2e24;--nf-accent-fg:#fdf3ee;--nf-seal:#c0492d;--nf-seal-soft:#c14a2e24;--nf-ai-soft:#d98a2b1f;--nf-human-soft:#4aa3d91f;--nf-ok:#79b372;--nf-warn:#e3a52e;--nf-bad:#d95753;--nf-hover:#f2e9dc0f;--nf-success:#79b372;--nf-error:#d95753;--nf-danger:var(--nf-error);--nf-success-ink:#86c47f;--nf-success-ink-soft:#86c47f21;--nf-error-ink:#e8837e;--nf-error-ink-soft:#e8837e21;--nf-warn-ink:#edb44a;--nf-warn-ink-soft:#edb44a21;--nf-info-ink:#8aabd8;--nf-info-ink-soft:#8aabd821;--nf-toast-ok:var(--nf-success);--nf-info:#6b8fc7;--nf-ai:#d98a2b;--nf-human:#4aa3d9;--nf-idle:#5c5344;--nf-paper-grid:#f2e9dc0d;--nf-shadow:0 1px 2px #00000073, 0 10px 30px #00000073;--nf-shadow-lg:0 4px 12px #00000073, 0 20px 48px #0000008c;--nf-card-shadow:0 2px 6px #0000006b, 0 14px 38px #0000007a;--nf-card-shadow-hover:0 4px 10px #00000070, 0 22px 52px #00000094;--nf-glass-face:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#f2e9dc24;--nf-glass-inset:#ffffff0f;--nf-glass-noise:none;--nf-card-radius:16px;--nf-card-blur:0px;--nf-card-saturate:100%;--nf-card-brightness:1;--nf-card-border:1px solid #f2e9dc1f;--nf-card-sheen:transparent;--nf-glass-bg-image:none;--nf-ctrl-radius:12px;--nf-ctrl-bg:var(--nf-bg-raise);--nf-ctrl-border:1px solid #f2e9dc29;--nf-ctrl-sheen:#ffffff2e;--nf-ctrl-caret:var(--nf-accent)}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .jbF1yq_view{display:block}.jbF1yq_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}.jbF1yq_panelTop{flex-direction:column;flex:none;gap:12px;padding:16px 22px 0;display:flex}.jbF1yq_panelHead,.jbF1yq_topNav{border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r-lg,16px);flex-wrap:wrap;align-items:center;padding:13px 16px;display:flex}.jbF1yq_panelHead{background:color-mix(in srgb, var(--nf-bg-deep,var(--nf-bg)) 92%, transparent);backdrop-filter:blur(12px);box-shadow:var(--nf-shadow,none);gap:12px}.jbF1yq_topNav{background:var(--nf-bg-raise);gap:16px}.jbF1yq_brand{cursor:pointer;user-select:none;align-items:center;gap:10px;min-width:0;display:flex}.jbF1yq_brandLogo{background:var(--nf-bg-inset,var(--nf-bg));border:1px solid var(--nf-line,var(--nf-border));width:32px;height:32px;font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-weight:700;font-size:var(--nf-fs-16,16px);color:var(--nf-accent);border-radius:9px;flex:none;place-items:center;display:grid}.jbF1yq_brandText{flex-direction:column;min-width:0;display:flex}.jbF1yq_brandName{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);letter-spacing:0;color:var(--nf-text);white-space:nowrap;font-size:17px;font-weight:400;line-height:1.3}.jbF1yq_brandSub{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;text-overflow:ellipsis;max-width:340px;overflow:hidden}.jbF1yq_headSpacer{flex:1}.jbF1yq_headChip{width:26px;height:26px;font-size:var(--nf-fs-12,12px);color:var(--nf-text-2,var(--nf-text));border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r,12px);cursor:pointer;background:0 0;flex:none;place-items:center;display:grid}.jbF1yq_headChip:hover{background:var(--nf-bg-inset,var(--nf-bg-raise));color:var(--nf-text)}.jbF1yq_topNavLabel{font-size:var(--nf-fs-caption,11px);letter-spacing:.14em;text-transform:uppercase;color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;margin:0 8px 0 2px}.jbF1yq_topNavBtn{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;padding:5px 10px;transition:background .12s,color .12s,border-color .12s;display:inline-flex}.jbF1yq_topNavBtn:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_topNavBtn.jbF1yq_active,.jbF1yq_topNavActive{background:var(--nf-ai-soft);border-color:color-mix(in srgb, var(--nf-ai) 40%, transparent);color:var(--nf-ai)}.jbF1yq_topNavNi{font-size:var(--nf-fs-12,12px);opacity:.85}.jbF1yq_topNavBadge{font-family:var(--nf-mono,monospace);font-size:var(--nf-fs-10,10px);background:var(--nf-bg-inset,var(--nf-bg-raise));border:1px solid var(--nf-border-2,var(--nf-border));color:var(--nf-text-2,var(--nf-text));border-radius:99px;padding:0 5px}.jbF1yq_topNavActive .jbF1yq_topNavBadge,.jbF1yq_topNavBtn.jbF1yq_active .jbF1yq_topNavBadge{background:color-mix(in srgb, var(--nf-ai) 14%, transparent);color:var(--nf-ai);border-color:#0000}.jbF1yq_topNavSpacer{flex:1}.jbF1yq_drawerScrim{z-index:60;background:#0f0a0673;animation:.18s jbF1yq_nfFadeIn;position:absolute;inset:0}@keyframes jbF1yq_nfFadeIn{0%{opacity:0}to{opacity:1}}.jbF1yq_contentDrawer{background:var(--nf-bg-raise,var(--nf-bg));border-left:1px solid var(--nf-border-strong,var(--nf-border));z-index:62;flex-direction:column;width:min(760px,92vw);animation:.22s jbF1yq_nfDrawerIn;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-18px 0 40px #0f0a062e}.jbF1yq_contentDrawer.jbF1yq_drawerMax{width:100%}.jbF1yq_contentDrawerBody{flex:1;min-height:0;padding:14px 16px;overflow-y:auto}@keyframes jbF1yq_nfDrawerIn{0%{opacity:0;transform:translate(28px)}to{opacity:1;transform:none}}.jbF1yq_wbIndexRow{align-items:center;gap:var(--nf-space-8);width:100%;padding:var(--nf-space-8) var(--nf-space-10);margin-bottom:var(--nf-space-4);border:1px solid var(--nf-border);border-radius:var(--nf-radius-6);background:var(--nf-bg);cursor:pointer;text-align:left;font-size:var(--nf-fs-14);color:var(--nf-text);display:flex}.jbF1yq_wbIndexRow:hover{border-color:var(--nf-border-strong,var(--nf-border));background:var(--nf-bg-inset,var(--nf-bg-raise))}.jbF1yq_wbIndexTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_wbIndexVol{font-size:var(--nf-fs-12);letter-spacing:.06em;color:var(--nf-text-3,var(--nf-text-2));margin:var(--nf-space-10) 0 var(--nf-space-4);font-weight:600}.jbF1yq_drawerHead{background:var(--nf-bg-deep,var(--nf-bg));border-bottom:1px solid var(--nf-border-strong,var(--nf-border));flex:none;align-items:center;gap:8px;padding:10px 12px 10px 18px;display:flex}.jbF1yq_drawerTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.jbF1yq_drawerSpacer{flex:1}.jbF1yq_drawerHeadBtn{width:26px;height:26px;font-size:var(--nf-fs-12,12px);color:var(--nf-text-2,var(--nf-text));border:1px solid var(--nf-border-2,var(--nf-border));border-radius:var(--nf-radius-sm,8px);cursor:pointer;background:0 0;flex:none;place-items:center;display:grid}.jbF1yq_drawerHeadBtn:hover{background:var(--nf-bg-inset,var(--nf-bg-raise));color:var(--nf-text)}.jbF1yq_brandEn{font-size:var(--nf-fs-caption,11px);letter-spacing:.08em;color:var(--nf-text-3,var(--nf-text-2,var(--nf-text)));white-space:nowrap;font-weight:400}.jbF1yq_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;position:absolute;inset:0}.jbF1yq_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}.jbF1yq_panelTitle:before{content:\"\";border-radius:var(--nf-radius-2,2px);background:linear-gradient(180deg, var(--nf-accent), var(--nf-info));width:4px;height:16px}.jbF1yq_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);transition:background var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease;background:0 0;border:none}.jbF1yq_iconButton:hover{background:var(--nf-hover);color:var(--nf-text);transform:translateY(-1px)}.jbF1yq_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);transition:color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;background:0 0;border:none;font-weight:500;position:relative}.jbF1yq_tab:hover{color:var(--nf-text);background:var(--nf-hover)}.jbF1yq_tab[data-active]{color:var(--nf-accent);font-weight:600}.jbF1yq_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}.jbF1yq_panelContent{min-width:0;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}.jbF1yq_panelContent>*{flex-shrink:0}.jbF1yq_pageHeader{justify-content:space-between;align-items:center;gap:var(--nf-space-14,14px);border-bottom:1px solid var(--nf-line-2,var(--nf-border));background:var(--nf-bg-deep);border-radius:var(--nf-r,12px) var(--nf-r,12px) 0 0;flex-wrap:wrap;margin:0;padding:14px 18px;display:flex}.jbF1yq_pageHeaderMain{min-width:0}.jbF1yq_pageHeaderEyebrow{font-size:var(--nf-fs-caption,11px);letter-spacing:.14em;text-transform:uppercase;color:var(--nf-text-3);align-items:center;gap:var(--nf-space-6);display:flex}.jbF1yq_pageHeaderTitle{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-size:var(--nf-fs-display,22px);line-height:var(--nf-lh-title,1.3);color:var(--nf-text);align-items:center;gap:var(--nf-space-8);font-weight:700;display:flex}.jbF1yq_pageHeaderSub{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);max-width:var(--nf-measure,720px);line-height:var(--nf-lh-body,1.65);margin-top:var(--nf-space-2)}.jbF1yq_pageHeaderActions{gap:var(--nf-space-8);flex-wrap:wrap;align-items:center;display:flex}.jbF1yq_numSerif{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";font-weight:700}.jbF1yq_tabular{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}.jbF1yq_docsSurface{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-blend-mode:normal;background-color:#0000;background-size:100% 28px}.jbF1yq_aiTag{font-family:var(--nf-font-mono,ui-monospace, monospace);letter-spacing:.08em;color:var(--nf-ai,var(--nf-accent));border:1px solid color-mix(in srgb, var(--nf-ai,var(--nf-accent)) 38%, transparent);vertical-align:middle;background:color-mix(in srgb, var(--nf-ai,var(--nf-accent)) 9%, transparent);border-radius:4px;align-items:center;margin-left:6px;padding:0 4px;font-size:9px;line-height:1.4;display:inline-flex}.jbF1yq_panelContent[data-tab=overview]>*,.jbF1yq_panelContent[data-tab=blurb]>*,.jbF1yq_panelContent[data-tab=settings]>*,.jbF1yq_panelContent[data-tab=director]>*,.jbF1yq_panelContent[data-tab=breakdown]>*,.jbF1yq_panelContent[data-tab=plotlines]>*{width:100%;max-width:calc(var(--nf-measure,720px) + 48px);margin-inline:auto}.jbF1yq_panelBody{z-index:1;flex:1;min-height:0;display:flex;position:relative}.jbF1yq_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);transition:width var(--nf-dur-base,.15s) ease;flex-direction:column;flex:none;margin:10px 0 10px 12px;display:flex;overflow-y:auto}.jbF1yq_navSpacer{flex:1;min-height:8px}.jbF1yq_navAbout{align-items:center;gap:var(--nf-space-8,8px);flex-direction:row;flex:none;display:flex}.jbF1yq_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);transition:color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;text-align:left;white-space:nowrap;background:0 0;border:none;display:flex}.jbF1yq_navAboutRow:hover{color:var(--nf-text);background:var(--nf-hover)}.jbF1yq_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}.jbF1yq_navAboutUpdate:hover{color:var(--nf-accent-hover)}@keyframes jbF1yq_navBadgePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}.jbF1yq_navTitle{cursor:pointer;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}.jbF1yq_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}.jbF1yq_navTitleName{font-weight:700;font-size:var(--nf-fs-14,15px);letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.jbF1yq_navTitleBook{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.jbF1yq_panelNavCollapsed .jbF1yq_navTitle{padding:var(--nf-space-2,2px) 0 var(--nf-space-10,10px);justify-content:center}.jbF1yq_panelNavCollapsed .jbF1yq_navTitleLogo{width:32px;height:var(--nf-ctrl-m,32px)}.jbF1yq_card{border:1px solid var(--nf-border);gap:var(--nf-space-10,10px);background:var(--nf-bg-deep);min-width:0;transition:border-color var(--nf-dur-base,.15s) ease;border-radius:12px;flex-direction:column;padding:13px 14px;display:flex;position:relative}.jbF1yq_card:hover{border-color:var(--nf-border-strong)}.jbF1yq_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}.jbF1yq_cardTitleLg{font-size:var(--nf-fs-16,16px);font-weight:650}.jbF1yq_button{align-items:center;gap:var(--nf-space-6,6px);border:1px solid var(--nf-line,var(--nf-border));background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:var(--nf-r-sm,8px);cursor:pointer;font-size:var(--nf-fs-meta,12px);transition:background var(--nf-dur-base,.15s) ease, border-color var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease;white-space:nowrap;padding:5px 11px;font-weight:500;display:inline-flex}.jbF1yq_button:hover:not([disabled]){background:var(--nf-hover);border-color:var(--nf-border-strong);transform:translateY(-1px)}.jbF1yq_button:active:not([disabled]){transform:translateY(0)scale(.97)}.jbF1yq_button[disabled]{opacity:.45;cursor:not-allowed}.jbF1yq_buttonPrimary{border-color:var(--nf-accent);background:var(--nf-accent);color:var(--nf-accent-fg);border-radius:var(--nf-r-sm,8px);font-weight:700}.jbF1yq_buttonPrimary:hover:not([disabled]){background:var(--nf-accent-hover);border-color:var(--nf-accent-hover)}.jbF1yq_buttonDanger{border-color:var(--nf-error);color:var(--nf-error)}.jbF1yq_buttonDanger:hover:not([disabled]){background:#ff3b301a}.jbF1yq_buttonSmall{font-size:var(--nf-fs-caption,11px);border-radius:var(--nf-r-sm,8px);padding:3px 9px}.jbF1yq_field{gap:var(--nf-space-6,5px);flex-direction:column;display:flex}.jbF1yq_fieldLabel{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);font-weight:500}.jbF1yq_input{border:1px solid var(--nf-line,var(--nf-border));background:var(--nf-bg-inset);color:var(--nf-text);color-scheme:light;border-radius:var(--nf-r-sm,8px);font-size:var(--nf-fs-meta,12px);box-sizing:border-box;width:100%;transition:border-color var(--nf-dur-base,.15s) ease;padding:7px 10px}body[data-ds-dark-theme] .jbF1yq_input,.jbF1yq_panel[data-nf-mode=dark] .jbF1yq_input{color-scheme:dark}.jbF1yq_panel[data-nf-mode=light] .jbF1yq_input{color-scheme:light}select.jbF1yq_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}.jbF1yq_input option{color:var(--nf-text);background:var(--nf-bg-raise);font-size:var(--nf-fs-14,15px)}.jbF1yq_input:focus,.jbF1yq_textarea:focus{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft);outline:none}.jbF1yq_input::placeholder,.jbF1yq_textarea::placeholder{color:var(--nf-text-3)}.jbF1yq_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;transition:border-color var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease;font-family:inherit;line-height:1.7}.jbF1yq_row{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_chapterList{gap:var(--nf-space-8,8px);flex-direction:column;display:flex}.jbF1yq_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 var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease;display:flex}.jbF1yq_chapter:hover{border-color:var(--nf-border-strong);box-shadow:var(--nf-shadow)}.jbF1yq_chapterFocus{animation:.9s ease-in-out 3 jbF1yq_chapterFocusPulse;border-color:var(--nf-accent)!important;box-shadow:0 0 0 3px color-mix(in srgb, var(--nf-accent) 35%, transparent)!important}@keyframes jbF1yq_chapterFocusPulse{0%,to{background:var(--nf-bg)}50%{background:color-mix(in srgb, var(--nf-accent) 18%, var(--nf-bg))}}.jbF1yq_chapterMain{flex:1;min-width:0}.jbF1yq_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}.jbF1yq_chapter:hover .jbF1yq_chapterActions{opacity:1}.jbF1yq_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}.jbF1yq_badgePending{color:var(--nf-info);border-color:var(--nf-info);background:color-mix(in srgb, var(--nf-info) 10%, transparent)}.jbF1yq_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 jbF1yq_pulse}.jbF1yq_badgeWritten{color:var(--nf-warn);border-color:var(--nf-warn);background:color-mix(in srgb, var(--nf-warn) 10%, transparent)}.jbF1yq_badgeRejected{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.jbF1yq_badgeDone{color:var(--nf-success);border-color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 10%, transparent)}.jbF1yq_badgeError{color:var(--nf-error);border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 10%, transparent)}.jbF1yq_reviewBox{border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-12);padding:var(--nf-space-14) var(--nf-space-16);background:var(--nf-bg-inset);gap:var(--nf-space-10);font-size:var(--nf-fs-14);flex-direction:column;line-height:1.7;display:flex}.jbF1yq_chapterPreview{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-color:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);padding:var(--nf-space-20) var(--nf-space-24);font-family:var(--nf-font-display);color:var(--nf-text);white-space:pre-wrap;word-wrap:break-word;max-height:600px;margin:0;font-size:15px;line-height:2;overflow:auto}.jbF1yq_chatScroll{gap:var(--nf-space-10,10px);min-height:0;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}.jbF1yq_chatBubbleUser{background:linear-gradient(180deg, var(--nf-accent), var(--nf-accent-hover));max-width:72%;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);box-shadow:0 2px 6px color-mix(in srgb, var(--nf-accent) 32%, transparent);align-self:flex-end}.jbF1yq_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}.jbF1yq_chatRole{font-size:var(--nf-fs-12,11px);color:var(--nf-text-3);margin-bottom:3px;font-weight:600}.jbF1yq_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}.jbF1yq_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}.jbF1yq_assistantStatusBusy{color:var(--nf-accent);border-color:var(--nf-accent);background:var(--nf-accent-soft);font-weight:600}.jbF1yq_toolSteps{gap:var(--nf-space-4,4px);flex-direction:column;margin-top:6px;display:flex}.jbF1yq_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}.jbF1yq_toolStepActive{border-color:var(--nf-accent);background:var(--nf-accent-soft)}.jbF1yq_toolStepError{border-color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 8%, transparent)}.jbF1yq_toolStepIcon{font-size:var(--nf-fs-14,13px);flex:none}.jbF1yq_toolStepName{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.jbF1yq_toolStepStatus{color:var(--nf-text-2);font-size:var(--nf-fs-12,11px);flex:none}.jbF1yq_toolStepActive .jbF1yq_toolStepStatus{color:var(--nf-accent)}.jbF1yq_toolStepError .jbF1yq_toolStepStatus{color:var(--nf-error)}.jbF1yq_toolStepDetail{width:100%;color:var(--nf-error);font-size:var(--nf-fs-12,11px);word-break:break-all}.jbF1yq_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}.jbF1yq_progressLine{color:var(--nf-text-2);opacity:.9}.jbF1yq_progressLineLive{color:var(--nf-accent);align-items:center;gap:var(--nf-space-8,8px);font-weight:600;display:flex}.jbF1yq_progressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);flex:none;width:110px;height:6px;display:inline-block;overflow:hidden}.jbF1yq_progressBarFill{border-radius:var(--nf-radius-4,3px);background:var(--nf-accent);height:100%;transition:width var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_busyRow{justify-content:space-between;align-items:center;gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.jbF1yq_liveText{font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;color:var(--nf-text-2)}.jbF1yq_bigProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:8px;margin-top:10px;overflow:hidden}.jbF1yq_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 var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_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}.jbF1yq_legendOld{color:var(--nf-error);font-weight:700}.jbF1yq_legendNew{color:var(--nf-success);font-weight:700}.jbF1yq_onlyChanges{align-items:center;gap:var(--nf-space-4,4px);color:var(--nf-text-2);cursor:pointer;margin-left:auto;display:inline-flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_diffSame summary{cursor:pointer;font-size:var(--nf-fs-12,12px);user-select:none}.jbF1yq_diffSameBody{white-space:pre-wrap;margin-top:6px}.jbF1yq_diffChange{border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);grid-template-columns:1fr 1fr;display:grid;overflow:hidden}.jbF1yq_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}.jbF1yq_diffColumn:first-child{border-right:1px solid var(--nf-border)}.jbF1yq_diffTagOld,.jbF1yq_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}.jbF1yq_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)}.jbF1yq_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)}.jbF1yq_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)}.jbF1yq_diffNew{color:var(--nf-success);white-space:pre-wrap;font-weight:500}.jbF1yq_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}.jbF1yq_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}.jbF1yq_diffText{white-space:pre-wrap}.jbF1yq_diffDel .jbF1yq_diffText{color:var(--nf-error);text-decoration:line-through;text-decoration-color:color-mix(in srgb, var(--nf-error) 50%, transparent)}.jbF1yq_diffAdd .jbF1yq_diffText{color:var(--nf-success)}.jbF1yq_wsPage{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex}.jbF1yq_wsPageHeader{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;flex:none;display:flex}.jbF1yq_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}.jbF1yq_wsColumns{gap:var(--nf-space-14,14px);flex:1;grid-template-columns:minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.jbF1yq_wsColumn{gap:var(--nf-space-8,8px);flex-direction:column;min-width:0;min-height:0;display:flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_wsSelectedText{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);white-space:pre-wrap;margin-top:4px}.jbF1yq_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}.jbF1yq_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}.jbF1yq_assetGroups{gap:var(--nf-space-14,14px);flex-direction:column;display:flex}.jbF1yq_assetGroup{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.jbF1yq_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}.jbF1yq_outlineDocWrap{gap:var(--nf-space-12,12px);flex-direction:column;display:flex}.jbF1yq_outlineToc{padding:var(--nf-space-8) var(--nf-space-10);border:1px solid var(--nf-border);background:var(--nf-bg-inset);border-radius:10px;flex-wrap:wrap;gap:4px 8px;display:flex}.jbF1yq_outlineTocItem{font:inherit;cursor:pointer;color:var(--nf-text-2);background:0 0;border:none;border-radius:6px;padding:2px 6px;font-size:12.5px}.jbF1yq_outlineTocItem:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_outlineTocL1{color:var(--nf-text);font-weight:700}.jbF1yq_outlineTocL2{padding-left:8px}.jbF1yq_outlineTocL3{padding-left:16px;font-size:12px}.jbF1yq_outlineDoc{background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);background-color:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);padding:var(--nf-space-20) var(--nf-space-24);font-family:var(--nf-font-display);color:var(--nf-text);user-select:text;max-height:640px;font-size:15px;line-height:28px;overflow:auto}.jbF1yq_outlineH{font-family:var(--nf-font-display);margin:var(--nf-space-16,16px) 0 var(--nf-space-6,6px);scroll-margin-top:var(--nf-space-14,14px);line-height:1.3}.jbF1yq_outlineH1{font-size:22px;font-weight:700}.jbF1yq_outlineH2{font-size:18px;font-weight:700}.jbF1yq_outlineH3{font-size:15px;font-weight:600}.jbF1yq_outlineH4{color:var(--nf-text-2);font-size:14px;font-weight:600}.jbF1yq_outlineP{margin:0 0 var(--nf-space-10,10px);white-space:pre-wrap;text-indent:2em}.jbF1yq_outlineHr{border:none;border-top:1px solid var(--nf-border-strong);margin:var(--nf-space-14,14px) 0}.jbF1yq_outlineList{margin:0 0 var(--nf-space-10,10px);padding-left:1.6em;list-style-position:outside}.jbF1yq_outlineList .jbF1yq_outlineList{margin:var(--nf-space-4,4px) 0 0}.jbF1yq_outlineLi{margin:0 0 var(--nf-space-4,4px);text-indent:0}.jbF1yq_outlineLi::marker{color:var(--nf-text-2)}.jbF1yq_outlineQuote{margin:0 0 var(--nf-space-10,10px);padding:var(--nf-space-6,6px) var(--nf-space-12,12px);border-left:3px solid var(--nf-border-strong);background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:0 var(--nf-radius-8,8px) var(--nf-radius-8,8px) 0}.jbF1yq_outlineCodeBlock{margin:0 0 var(--nf-space-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-8,8px);font-family:var(--nf-font-mono,ui-monospace, monospace);font-size:12.5px;line-height:1.6;position:relative;overflow-x:auto}.jbF1yq_outlineCodeLang{letter-spacing:.06em;text-transform:uppercase;color:var(--nf-text-2);font-size:10px;position:absolute;top:4px;right:8px}.jbF1yq_outlineCode{font-family:var(--nf-font-mono,ui-monospace, monospace);background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:4px;padding:1px 5px;font-size:.92em}.jbF1yq_outlineTableWrap{margin:0 0 var(--nf-space-10,10px);overflow-x:auto}.jbF1yq_outlineTable{border-collapse:collapse;width:100%;font-size:13px}.jbF1yq_outlineTable th,.jbF1yq_outlineTable td{border:1px solid var(--nf-border);padding:var(--nf-space-6,6px) var(--nf-space-8,8px);text-align:left;vertical-align:top}.jbF1yq_outlineTable th{background:var(--nf-bg-inset);color:var(--nf-text);font-weight:600}.jbF1yq_outlineVol{border:1px solid var(--nf-border);border-radius:var(--nf-radius-12);overflow:hidden}.jbF1yq_outlineVolSummary{cursor:pointer;padding:var(--nf-space-10,10px) var(--nf-space-16,16px);font-weight:700;font-family:var(--nf-font-display);background:var(--nf-bg-inset);color:var(--nf-text)}.jbF1yq_outlineEdit{min-height:240px}.jbF1yq_card>summary{cursor:pointer;list-style:none}.jbF1yq_card>summary::-webkit-details-marker{display:none}.jbF1yq_card>summary:before{content:\"▸ \";color:var(--nf-text-3)}.jbF1yq_card[open]>summary:before{content:\"▾ \"}.jbF1yq_assistantFloat{z-index:80;border:1px solid var(--nf-border);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);box-shadow:var(--nf-shadow-lg);flex-direction:column;min-width:320px;min-height:220px;display:flex;position:absolute;overflow:hidden}.jbF1yq_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}.jbF1yq_assistantFloatHeader:active{cursor:grabbing}.jbF1yq_assistantFloatBody{min-height:0;padding:var(--nf-space-10,10px);flex:1;display:flex;overflow:hidden}.jbF1yq_assistantFloatBody>*{flex:1;min-width:0}.jbF1yq_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}.jbF1yq_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}.jbF1yq_coverPreview img{object-fit:contain;width:100%;height:100%;display:block}.jbF1yq_coverPlaceholder{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3)}.jbF1yq_subPage{background:var(--nf-bg-raise);border:1px solid var(--nf-border);border-radius:16px;flex-direction:column;flex:1;min-height:0;margin:16px 22px 22px;display:flex;overflow:hidden}.jbF1yq_subPageHead{border-bottom:1px solid var(--nf-border);background:var(--nf-bg-deep,var(--nf-bg));flex-wrap:wrap;flex:none;align-items:center;gap:14px;padding:14px 18px;display:flex}.jbF1yq_subPageBack{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-3);border:1px solid var(--nf-border);white-space:nowrap;cursor:pointer;border-radius:7px;padding:3px 10px}.jbF1yq_subPageTitle{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-size:var(--nf-fs-display,22px);font-weight:700;line-height:1.2}.jbF1yq_subPageMeta{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);line-height:1.4}.jbF1yq_subPageActions{flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto;display:flex}.jbF1yq_subPageBody{flex-direction:column;flex:1;gap:14px;min-height:0;padding:16px 18px;display:flex;overflow:auto}.jbF1yq_shelfToolbar{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);flex-wrap:wrap;align-items:center;gap:10px;padding:10px 12px;display:flex}.jbF1yq_shelfToolbar .jbF1yq_input{max-width:260px}.jbF1yq_shelfToolbarExtra{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;margin-left:auto;display:flex}.jbF1yq_shelfStatGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;display:grid}.jbF1yq_shelfStatCard[data-active=\"\"]{background:color-mix(in srgb, var(--nf-ai) 14%, transparent);border-color:color-mix(in srgb, var(--nf-ai) 42%, transparent)}.jbF1yq_shelfStatCard[data-active=\"\"] span,.jbF1yq_shelfStatCard[data-active=\"\"] b{color:var(--nf-ai)}.jbF1yq_shelfStatCard{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);cursor:pointer;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:8px 10px;display:flex}.jbF1yq_shelfStatCard span{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-2);white-space:nowrap}.jbF1yq_shelfStatCard b{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);color:var(--nf-text);font-variant-numeric:tabular-nums;font-size:18px;font-weight:700}.jbF1yq_shelfStatCard[data-active=\"\"]{border-color:var(--nf-ai);background:color-mix(in srgb, var(--nf-ai) 12%, transparent)}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_shelfStatGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}.jbF1yq_authorHome{z-index:1;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.jbF1yq_authorTopNav{align-items:center;gap:var(--nf-space-16,16px);border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r-lg,16px);background:var(--nf-bg-raise);flex-wrap:wrap;flex:none;margin:16px 22px 0;padding:13px 16px;display:flex}.jbF1yq_authorTopNav .jbF1yq_navTitle{align-items:center;gap:var(--nf-space-10,10px);border-bottom:none;flex:none;min-width:0;margin:0;padding:0;display:flex}.jbF1yq_authorTopNav .jbF1yq_navTitleLogo{background:var(--nf-bg-inset);border:1px solid var(--nf-line,var(--nf-border));width:32px;height:32px;font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-weight:700;font-size:var(--nf-fs-16,16px);color:var(--nf-accent);border-radius:9px}.jbF1yq_authorTopNav .jbF1yq_navTitleName{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);letter-spacing:0;font-size:17px;font-weight:400}.jbF1yq_authorTopNav .jbF1yq_navTitleBook{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3)}.jbF1yq_authorTopNav .jbF1yq_navGroup{align-items:center;gap:var(--nf-space-4,4px);display:flex}.jbF1yq_authorTopNav .jbF1yq_navGroupLabel{padding:0 var(--nf-space-6,6px);font-size:var(--nf-fs-12,12px);letter-spacing:.12em}.jbF1yq_authorTopNav .jbF1yq_navTab{width:auto;padding:var(--nf-space-8,8px) var(--nf-space-10,10px)}.jbF1yq_authorTopNav .jbF1yq_navSpacer{flex:1}.jbF1yq_authorTopNav .jbF1yq_navAbout{border-left:1px solid var(--nf-border);padding-left:var(--nf-space-12,12px);margin:0}.jbF1yq_authorTopNav .jbF1yq_navAboutRow{align-items:center;gap:var(--nf-space-6,6px);display:inline-flex}.jbF1yq_authorContent{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.jbF1yq_authorNav{background:var(--nf-bg-raise);border:1px solid var(--nf-line,var(--nf-border));border-radius:var(--nf-r,12px);flex-wrap:wrap;flex:none;align-items:center;gap:4px;margin:14px 22px 0;padding:8px 10px;display:flex}.jbF1yq_authorTopTabs{flex-wrap:wrap;flex:none;align-items:center;gap:6px;display:flex}.jbF1yq_authorNavBtn{font-size:var(--nf-fs-meta,12px);color:var(--nf-text-2);white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 10px;transition:background .12s,color .12s,border-color .12s}.jbF1yq_authorNavBtn:hover{background:var(--nf-hover);color:var(--nf-text)}.jbF1yq_authorNavBtn[data-active]{background:var(--nf-ai-soft);border-color:color-mix(in srgb, var(--nf-ai) 40%, transparent);color:var(--nf-ai)}.jbF1yq_authorPageBodyFlow{gap:var(--nf-space-20,20px);flex-direction:column;flex:1;min-height:0;padding:0;display:flex;overflow:visible}.jbF1yq_authorPageHeader{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:14px;display:flex}.jbF1yq_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}.jbF1yq_noticeSuccess{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);color:var(--nf-accent);border:1px solid var(--nf-accent);border-radius:10px;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 14px;display:flex}.jbF1yq_rowEnd{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.jbF1yq_assetFilterChip{border:1px solid var(--nf-glass-border);color:var(--nf-text);cursor:pointer;background:0 0;border-radius:999px;padding:4px 10px}.jbF1yq_assetFilterChipActive{background:var(--nf-accent);color:var(--nf-accent-fg);border-color:#0000}.jbF1yq_assetEditor{gap:var(--nf-space-12,12px);padding:var(--nf-space-16,16px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;display:flex}.jbF1yq_assetEditorRow{gap:var(--nf-space-12,12px);flex-wrap:wrap;display:flex}.jbF1yq_assetLabel{color:var(--nf-muted,var(--nf-text-2));flex-direction:column;flex:1;gap:4px;min-width:180px;font-size:12.5px;display:flex}.jbF1yq_assetTextarea{resize:vertical;min-height:160px;font-family:inherit}.jbF1yq_assetGrid{gap:var(--nf-space-14,14px);grid-template-columns:repeat(auto-fill,minmax(300px,1fr));display:grid}.jbF1yq_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}.jbF1yq_assetCardTop{justify-content:space-between;align-items:center;gap:8px;display:flex}.jbF1yq_assetKind{font-size:12.5px;font-weight:600}.jbF1yq_assetCardName{font-weight:600}.jbF1yq_assetCardContent{white-space:pre-wrap;color:var(--nf-text);max-height:150px;font-size:13.5px;overflow:auto}.jbF1yq_assetCardFooter{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.jbF1yq_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}.jbF1yq_iconBtn:hover{background:#0000000f}.jbF1yq_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}.jbF1yq_adaptTextarea{resize:vertical;min-height:220px}.jbF1yq_adaptResult{flex-direction:column;gap:14px;display:flex}.jbF1yq_adaptOutline{background:var(--nf-glass-face);border:1px solid var(--nf-glass-border);border-radius:12px;padding:10px 14px}.jbF1yq_adaptMatrix{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;display:grid}.jbF1yq_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}.jbF1yq_dimCardHead{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.jbF1yq_dimTitle{font-weight:600}.jbF1yq_dimCurrent{white-space:pre-wrap;font-size:13.5px}.jbF1yq_dimCardSelected{border-color:var(--nf-accent);box-shadow:0 0 0 1px var(--nf-accent)}.jbF1yq_dimEdit{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.jbF1yq_adaptOutlinePre{white-space:pre-wrap;max-height:260px;margin:0;font-family:inherit;font-size:13.5px;overflow:auto}.jbF1yq_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}.jbF1yq_adaptTable{border-collapse:collapse;width:100%;font-size:13.5px}.jbF1yq_adaptTable th,.jbF1yq_adaptTable td{border:1px solid var(--nf-glass-border);text-align:left;padding:6px 8px}.jbF1yq_adaptImpacts{flex-direction:column;gap:4px;display:flex}.jbF1yq_adaptImpact{font-size:13.5px}.jbF1yq_adaptTableScroll{overflow-x:auto}.jbF1yq_adaptCell{width:100%;min-width:90px}.jbF1yq_adaptRules{flex-direction:column;gap:10px;display:flex}.jbF1yq_adaptRule{border:1px solid var(--nf-glass-border);background:var(--nf-glass-face);border-radius:12px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.jbF1yq_adaptRuleRow{align-items:center;gap:8px;display:flex}.jbF1yq_progressTotalBar .jbF1yq_meta{color:var(--nf-text);justify-content:center;align-items:center;font-size:12px;font-weight:600;display:flex;position:absolute;inset:0}.jbF1yq_shelfHero .jbF1yq_panelTitle{font-size:var(--nf-fs-22,22px);letter-spacing:.3px}.jbF1yq_shelfSearch{max-width:260px}.jbF1yq_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);text-align:center;flex-direction:column;flex:1;display:flex}.jbF1yq_shelfEmptyIcon{font-size:var(--nf-fs-42,42px)}.jbF1yq_shelfEmptyTitle{font-size:var(--nf-fs-16,16px);font-weight:700}.jbF1yq_shelfGrid{gap:var(--nf-container-gap,14px);grid-template-columns:repeat(auto-fill,minmax(190px,1fr));align-content:start;display:grid}.jbF1yq_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}.jbF1yq_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;--nf-ctrl-s:26px;--nf-ctrl-m:30px;--nf-ctrl-l:35px;--nf-fs-18:16px;--nf-fs-16:14px;--nf-fs-14:13px;--nf-fs-body:13px;--nf-fs-title:14px;--nf-fs-display:20px;--nf-lh-body:1.5;--nf-lh-title:1.3;--nf-card-radius:8px;--nf-ctrl-radius:6px}.jbF1yq_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;--nf-ctrl-s:30px;--nf-ctrl-m:34px;--nf-ctrl-l:41px;--nf-fs-18:20px;--nf-fs-16:17px;--nf-fs-14:15px;--nf-fs-body:14px;--nf-fs-title:17px;--nf-fs-display:26px;--nf-lh-body:1.8;--nf-lh-title:1.45;--nf-card-radius:14px;--nf-ctrl-radius:10px}.jbF1yq_panel[data-nf-mode=light]{color-scheme:light;--nf-bg:#f6f3ec;--nf-bg-raise:#fcfaf6;--nf-bg-inset:#efe9dc;--nf-bg-deep:#e9e2d4;--nf-line:#26221b24;--nf-line-2:#26221b0f;--nf-border:#26221b24;--nf-border-2:#26221b47;--nf-border-strong:#26221b4d;--nf-text:#26221b;--nf-text-1:#453e33;--nf-text-2:#6f665a;--nf-text-2-alpha:#6f665ab8;--nf-text-3:#726858;--nf-muted:var(--nf-text-3);--nf-muted-line:var(--nf-border);--nf-accent:#a63e2a;--nf-accent-hover:#8c3321;--nf-accent-soft:#a63e2a24;--nf-accent-fg:#fdf3ee;--nf-hover:#26221b0d;--nf-success:#5f9656;--nf-error:#b94a41;--nf-danger:var(--nf-error);--nf-success-ink:#1b7a3a;--nf-success-ink-soft:#1b7a3a1a;--nf-error-ink:#b3271f;--nf-error-ink-soft:#b3271f1a;--nf-warn-ink:#8a5a00;--nf-warn-ink-soft:#8a5a001a;--nf-info-ink:#3c5b8a;--nf-info-ink-soft:#3c5b8a1a;--nf-toast-ok:var(--nf-success);--nf-warn:#c98a1f;--nf-info:#4a6fa5;--nf-ai:#c07c22;--nf-human:#2f6fa3;--nf-idle:#cfc6b5;--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:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#a0917d47;--nf-glass-inset:#fff6}.jbF1yq_panel[data-nf-mode=dark]{color-scheme:dark;--nf-bg:#17140f;--nf-bg-raise:#201c16;--nf-bg-inset:#2a241c;--nf-bg-deep:#100e0a;--nf-line:#f2e9dc1f;--nf-line-2:#f2e9dc0d;--nf-border:#f2e9dc1f;--nf-border-2:#f2e9dc2e;--nf-border-strong:#f2e9dc3d;--nf-text:#eee7da;--nf-text-1:#d3cab6;--nf-text-2:#c9beab;--nf-text-2-alpha:#c9beabb3;--nf-text-3:#a89d86;--nf-muted:var(--nf-text-3);--nf-muted-line:var(--nf-border);--nf-accent:#a63e2a;--nf-accent-hover:#b4472c;--nf-accent-soft:#a63e2a2e;--nf-accent-fg:#fdf3ee;--nf-hover:#f2e9dc0f;--nf-success:#79b372;--nf-error:#d95753;--nf-danger:var(--nf-error);--nf-success-ink:#86c47f;--nf-success-ink-soft:#86c47f21;--nf-error-ink:#e8837e;--nf-error-ink-soft:#e8837e21;--nf-warn-ink:#edb44a;--nf-warn-ink-soft:#edb44a21;--nf-info-ink:#8aabd8;--nf-info-ink-soft:#8aabd821;--nf-toast-ok:var(--nf-success);--nf-warn:#e3a52e;--nf-info:#6b8fc7;--nf-ai:#d98a2b;--nf-human:#4aa3d9;--nf-idle:#5c5344;--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:var(--nf-bg-raise);--nf-glass-core:none;--nf-glass-sheen:transparent;--nf-glass-border:#f2e9dc24;--nf-glass-inset:#ffffff0f}.jbF1yq_bookCard{border:1px solid var(--nf-border);background:var(--nf-bg-inset);cursor:pointer;min-width:0;transition:border-color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-fast,.12s) ease, box-shadow var(--nf-dur-base,.15s) ease;border-radius:12px;flex-direction:column;gap:10px;padding:12px;display:flex}.jbF1yq_bookCard:hover{border-color:var(--nf-accent);box-shadow:var(--nf-shadow-lg);transform:translateY(-2px)}.jbF1yq_bookCardActive{border-color:var(--nf-accent);box-shadow:0 0 0 3px var(--nf-accent-soft)}.jbF1yq_bookCardCover{aspect-ratio:3/4;background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:10px;flex:none;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}.jbF1yq_bookCardCover img{object-fit:cover;width:100%;height:100%;transition:transform var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_bookCard:hover .jbF1yq_bookCardCover img{transform:scale(1.06)}.jbF1yq_bookCardCover:after{content:\"\";border-radius:inherit;pointer-events:none;opacity:0;transition:opacity var(--nf-dur-slow,.28s) ease;background:linear-gradient(#0000 55%,#00000047);position:absolute;inset:0}.jbF1yq_bookCard:hover .jbF1yq_bookCardCover:after{opacity:1}.jbF1yq_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}.jbF1yq_bookCardCoverTitle{font-size:var(--nf-fs-22,22px);color:var(--nf-accent);letter-spacing:2px;font-weight:800}.jbF1yq_bookCardBody{gap:var(--nf-space-6,5px);flex-direction:column;flex:1;min-width:0;display:flex}.jbF1yq_bookCardTitleRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);display:flex}.jbF1yq_bookCardName{font-weight:700;font-size:var(--nf-fs-14,13.5px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.jbF1yq_bookCardBlurb{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:34px;display:-webkit-box;overflow:hidden}.jbF1yq_bookCardMetaRow{justify-content:space-between;align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;display:flex}.jbF1yq_bookCardProgressBar{border-radius:var(--nf-radius-999,999px);background:var(--nf-border);height:6px;overflow:hidden;box-shadow:inset 0 1px 2px #0000001f}.jbF1yq_bookCardProgressFill{border-radius:var(--nf-radius-999,999px);background:linear-gradient(90deg, var(--nf-info), var(--nf-accent));height:100%;transition:width var(--nf-dur-slow,.28s) ease;display:block}.jbF1yq_createBookInner{align-self:center;gap:var(--nf-space-12,12px);flex-direction:column;width:min(520px,100%);display:flex}.jbF1yq_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}.jbF1yq_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}.jbF1yq_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}.jbF1yq_progressLineDone{color:var(--nf-success);font-weight:600}.jbF1yq_progressLineError{color:var(--nf-error);font-weight:600}.jbF1yq_meta{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);opacity:.9}.jbF1yq_genreDesc{-webkit-line-clamp:2;-webkit-box-orient:vertical;max-width:560px;display:-webkit-box;overflow:hidden}.jbF1yq_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}.jbF1yq_panelContent::-webkit-scrollbar,.jbF1yq_chatScroll::-webkit-scrollbar,.jbF1yq_chapterPreview::-webkit-scrollbar,.jbF1yq_progress::-webkit-scrollbar,.jbF1yq_toolLive::-webkit-scrollbar{width:8px;height:8px}.jbF1yq_panelContent::-webkit-scrollbar-thumb,.jbF1yq_chatScroll::-webkit-scrollbar-thumb,.jbF1yq_chapterPreview::-webkit-scrollbar-thumb,.jbF1yq_progress::-webkit-scrollbar-thumb,.jbF1yq_toolLive::-webkit-scrollbar-thumb{background:var(--nf-border-strong);border-radius:var(--nf-radius-4,4px)}.jbF1yq_panelContent::-webkit-scrollbar-thumb:hover,.jbF1yq_chatScroll::-webkit-scrollbar-thumb:hover,.jbF1yq_chapterPreview::-webkit-scrollbar-thumb:hover,.jbF1yq_progress::-webkit-scrollbar-thumb:hover,.jbF1yq_toolLive::-webkit-scrollbar-thumb:hover{background:var(--nf-text-3)}@keyframes jbF1yq_pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes jbF1yq_fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.jbF1yq_card{animation:jbF1yq_fadeIn var(--nf-dur-base,.15s) ease}.jbF1yq_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);z-index:1;flex-wrap:wrap;flex-shrink:0;margin:10px 12px 0;display:flex;position:relative}.jbF1yq_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;transition:border-color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;align-items:center;gap:var(--nf-space-6,6px);flex-direction:column;display:flex}.jbF1yq_dropzone:hover,.jbF1yq_dropzoneActive{border-color:var(--nf-accent);background:var(--nf-accent-soft);color:var(--nf-accent)}.jbF1yq_dropzoneIcon{font-size:var(--nf-fs-22,22px);line-height:1}.jbF1yq_bookCardActions{align-items:center;gap:var(--nf-space-6,6px);padding-top:var(--nf-space-8,8px);margin-top:auto;display:flex}.jbF1yq_bookCardActions .jbF1yq_button{flex:1;justify-content:center}.jbF1yq_readerView{transition:background var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease;flex-direction:column;display:flex;position:absolute;inset:0;overflow:hidden}.jbF1yq_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}.jbF1yq_readerTitle{font-weight:700;font-size:var(--nf-fs-14,14px)}.jbF1yq_readerSeg{align-items:center;gap:var(--nf-space-2,2px);border-radius:var(--nf-radius-8,8px);display:flex;overflow:hidden}.jbF1yq_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}.jbF1yq_readerSegBtn:hover,.jbF1yq_readerSegActive{opacity:1}.jbF1yq_readerBody{flex:1;align-items:stretch;min-height:0;display:flex}.jbF1yq_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}.jbF1yq_readerGroup{gap:var(--nf-space-2,1px);flex-direction:column;display:flex}.jbF1yq_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}.jbF1yq_readerGroupTitle:hover{opacity:1;background:#8080801f}.jbF1yq_readerGroupArrow{font-size:var(--nf-fs-12,12px);text-align:center;flex:none;width:12px}.jbF1yq_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}.jbF1yq_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;transition:opacity var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;background:0 0;border:1px solid;min-width:0;display:flex}.jbF1yq_readerItem:hover{opacity:1}.jbF1yq_readerItemActive{opacity:1;font-weight:700}.jbF1yq_readerItemNo{text-align:right;opacity:.75;flex:none;min-width:26px;font-weight:700}.jbF1yq_readerItemTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_readerItemBadge{font-size:var(--nf-fs-12,11px);flex:none}.jbF1yq_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}.jbF1yq_readerArticle{gap:var(--nf-space-12,12px);flex-direction:column;width:100%;display:flex}.jbF1yq_readerChapterTitle{font-size:var(--nf-fs-24,24px);letter-spacing:1px;margin:0;font-weight:800}.jbF1yq_readerChapterMeta{align-items:center;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-12,12px);display:flex}.jbF1yq_readerText{text-align:justify;letter-spacing:.02em}.jbF1yq_readerPara{text-indent:2em;margin:0 0 .85em}.jbF1yq_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}.jbF1yq_readerLoading,.jbF1yq_readerError{padding:var(--nf-space-32,32px) 0;font-size:var(--nf-fs-14,13px);opacity:.7;align-self:center}.jbF1yq_readerError{color:var(--nf-error)}.jbF1yq_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}.jbF1yq_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);box-shadow:var(--nf-shadow-lg);flex-direction:column;display:flex;overflow:auto}.jbF1yq_importModalHead{justify-content:space-between;align-items:center;gap:var(--nf-space-10,10px);display:flex}.jbF1yq_importModalTabs{gap:var(--nf-space-8,8px);display:flex}.jbF1yq_importModalTabs .jbF1yq_button{flex:1}.jbF1yq_importModalBody{gap:var(--nf-space-10,10px);flex-direction:column;display:flex}.jbF1yq_importField{gap:var(--nf-space-6,5px);font-size:var(--nf-fs-14,13px);color:var(--nf-text-2);flex-direction:column;display:flex}.jbF1yq_importHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-3);line-height:1.5}.jbF1yq_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}.jbF1yq_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}.jbF1yq_importModalActions{justify-content:flex-end;gap:var(--nf-space-8,8px);display:flex}.jbF1yq_settingsDrawerOverlay{z-index:1000;background:#00000073;animation:.16s jbF1yq_nfFadeIn;position:fixed;inset:0}.jbF1yq_settingsDrawer{background:var(--nf-bg-raise,var(--nf-bg));border-left:1px solid var(--nf-border);flex-direction:column;width:min(560px,94vw);animation:.2s jbF1yq_nfSlideInRight;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-18px 0 48px #00000059}@keyframes jbF1yq_nfSlideInRight{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}.jbF1yq_settingsDrawerHead{padding:var(--nf-space-12) var(--nf-space-16);border-bottom:1px solid var(--nf-border);flex:none;justify-content:space-between;align-items:center;display:flex}.jbF1yq_settingsDrawerBody{flex:1;min-height:0;overflow-y:auto}.jbF1yq_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}.jbF1yq_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}.jbF1yq_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}.jbF1yq_settingsCard{min-width:0;max-width:100%}.jbF1yq_settingsCard>*{min-width:0}.jbF1yq_settingsCard .jbF1yq_card{width:100%;min-width:0;max-width:100%}.jbF1yq_settingsCard .jbF1yq_fieldLabel{white-space:nowrap;text-overflow:ellipsis;max-width:100%;min-height:18px;line-height:18px;overflow:hidden}.jbF1yq_settingsCard .jbF1yq_row{align-items:flex-start}.jbF1yq_settingsCard+.jbF1yq_settingsCard{flex:none;min-height:auto}.jbF1yq_switch{border-radius:var(--nf-radius-999,999px);border:1px solid var(--nf-border-strong);background:var(--nf-bg-inset);cursor:pointer;width:42px;height:24px;transition:background var(--nf-dur-base,.15s) ease, border-color var(--nf-dur-base,.15s) ease;flex:none;padding:0;position:relative}.jbF1yq_view :is(button,[href],input,select,textarea,summary,[tabindex]):focus-visible,.jbF1yq_entry:focus-visible,.jbF1yq_runChip:focus-visible,.jbF1yq_view [role=button]:focus-visible,.jbF1yq_view [role=tab]:focus-visible,.jbF1yq_view [role=menuitem]:focus-visible,.jbF1yq_view [role=option]:focus-visible{outline:var(--nf-focus-w,2px) solid var(--nf-accent);outline-offset:var(--nf-focus-offset,2px)}.jbF1yq_view :is(input,textarea,select):focus-visible{border-color:var(--nf-accent)}.jbF1yq_view [data-nf-danger]:focus-visible{outline-color:var(--nf-error)}@media (prefers-reduced-motion:reduce){:root{--nf-dur-fast:.01ms;--nf-dur-base:.01ms;--nf-dur-slow:.01ms}.jbF1yq_view,.jbF1yq_view *,.jbF1yq_view :before,.jbF1yq_view :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}:root{--nf-chip-bg:#ffffffd1;--nf-chip-border:#3c3c4329;--nf-chip-fg:#1c1c1e;--nf-chip-shadow:0 2px 12px #0000001f;--nf-chip-running:#00b85c;--nf-chip-paused:#b45309;--nf-chip-done:#0284c7;--nf-chip-stopped:#64748b;--nf-chip-error:#dc2626;--nf-streaming:#d16a92}body[data-ds-dark-theme]{--nf-chip-bg:#1c1c1ed1;--nf-chip-border:#ffffff24;--nf-chip-fg:#f2f2f7;--nf-chip-shadow:0 2px 12px #00000073;--nf-chip-running:#35d07a;--nf-chip-paused:#f0ac82;--nf-chip-done:#5cb3e8;--nf-chip-stopped:#98989d;--nf-chip-error:#ff6b60;--nf-streaming:#e891b5}.jbF1yq_runChip{top:calc(max(var(--dsh-frame-top-clearance,0px), var(--dsh-windows-titlebar-height,0px)) + 12px);z-index:var(--nf-z-chip,2147480000);align-items:center;gap:var(--nf-space-6,6px);max-width:360px;padding:5px var(--nf-space-12,12px);border:1px solid var(--nf-chip-border);border-radius:var(--nf-radius-999,999px);font-family:var(--nf-font);font-size:var(--nf-fs-12,12px);color:var(--nf-chip-fg);background:var(--nf-chip-bg);box-shadow:var(--nf-chip-shadow);backdrop-filter:blur(6px);cursor:pointer;user-select:none;touch-action:none;white-space:nowrap;transition:border-color var(--nf-dur-base,.15s) ease, box-shadow var(--nf-dur-base,.15s) ease;font-weight:600;display:none;position:fixed;right:14px}.jbF1yq_runChip[data-visible=true]{display:flex}.jbF1yq_runChip:hover{border-color:var(--nf-chip-running);box-shadow:var(--nf-chip-shadow), 0 0 0 3px color-mix(in srgb, var(--nf-chip-running) 18%, transparent)}.jbF1yq_runChipText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.jbF1yq_runChipDot{background:var(--nf-chip-stopped);border-radius:50%;flex:none;width:7px;height:7px}.jbF1yq_runChip[data-status=running] .jbF1yq_runChipDot{background:var(--nf-chip-running)}.jbF1yq_runChip[data-status=paused] .jbF1yq_runChipDot{background:var(--nf-chip-paused)}.jbF1yq_runChip[data-status=done] .jbF1yq_runChipDot{background:var(--nf-chip-done)}.jbF1yq_runChip[data-status=error] .jbF1yq_runChipDot{background:var(--nf-chip-error)}@keyframes jbF1yq_nfChipPulse{0%,to{opacity:1}50%{opacity:.35}}.jbF1yq_runChip[data-status=running] .jbF1yq_runChipDot{animation:1.4s ease-in-out infinite jbF1yq_nfChipPulse}@media (prefers-reduced-motion:reduce){.jbF1yq_runChipDot{animation:none!important}}.jbF1yq_lfPill{font-size:var(--nf-fs-10,10px);border-radius:var(--nf-radius-999,999px);color:var(--nf-text-2);background:var(--nf-bg-inset);white-space:nowrap;padding:1px 7px;font-weight:600}.jbF1yq_lfPill[data-phase=streaming]{color:var(--nf-streaming);background:color-mix(in srgb, var(--nf-streaming) 16%, transparent)}.jbF1yq_lfPill[data-phase=completed]{color:var(--nf-success);background:color-mix(in srgb, var(--nf-success) 16%, transparent)}.jbF1yq_lfPill[data-phase=failed]{color:var(--nf-error);background:color-mix(in srgb, var(--nf-error) 18%, transparent)}.jbF1yq_lfDot{background:var(--nf-text-3);border-radius:50%;flex:none;width:6px;height:6px}.jbF1yq_lfDot[data-size=lg]{width:7px;height:7px}.jbF1yq_lfDot[data-state=streaming]{background:var(--nf-streaming)}.jbF1yq_lfDot[data-state=completed],.jbF1yq_lfDot[data-state=ok]{background:var(--nf-success)}.jbF1yq_lfDot[data-state=failed]{background:var(--nf-error)}.jbF1yq_emptyState{justify-content:center;align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-32,32px) var(--nf-space-20,20px);text-align:center;flex-direction:column;display:flex}.jbF1yq_emptyStateIcon{font-size:var(--nf-fs-34,34px);line-height:1}.jbF1yq_emptyStateTitle{font-size:var(--nf-fs-14,14px);color:var(--nf-text);font-weight:600}.jbF1yq_emptyStateHint{font-size:var(--nf-fs-12,12px);color:var(--nf-text-2);max-width:340px;line-height:1.5}.jbF1yq_emptyState[data-compact=true]{padding:var(--nf-space-16,16px) var(--nf-space-12,12px);gap:var(--nf-space-6,6px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateIcon{font-size:var(--nf-fs-20,20px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateTitle{font-size:var(--nf-fs-12,12px)}.jbF1yq_emptyState[data-compact=true] .jbF1yq_emptyStateHint{font-size:var(--nf-fs-12,12px);max-width:280px}@keyframes jbF1yq_nfSkeletonShimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.jbF1yq_pillNav{gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex;position:relative}.jbF1yq_pillNavSliding .jbF1yq_pillNavPill[data-active]{color:var(--nf-accent);background:0 0;border-color:#0000;font-weight:600}.jbF1yq_pillNavSlider{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);border:1px solid color-mix(in srgb, var(--nf-accent) 55%, transparent);transition:transform var(--nf-dur-base,.15s) ease, width var(--nf-dur-base,.15s) ease;pointer-events:none;border-radius:999px;position:absolute;top:0;bottom:0;left:0}@media (prefers-reduced-motion:reduce){.jbF1yq_pillNavSlider{transition:none}}.jbF1yq_pillNavPill{border:1px solid var(--nf-border);background:var(--nf-bg-inset);color:var(--nf-text-2);border-radius:var(--nf-radius-999,999px);font-size:var(--nf-fs-12,12px);cursor:pointer;transition:border-color var(--nf-dur-base,.15s) ease, color var(--nf-dur-base,.15s) ease, background var(--nf-dur-base,.15s) ease;padding:5px 14px;font-weight:600}.jbF1yq_pillNavPill:hover{border-color:var(--nf-border-strong);color:var(--nf-text)}.jbF1yq_pillNavPill[data-active]{background:color-mix(in srgb, var(--nf-accent) 14%, transparent);border-color:color-mix(in srgb, var(--nf-accent) 42%, transparent);color:var(--nf-text)}.jbF1yq_assistantFloat[data-top]{z-index:82;box-shadow:var(--nf-shadow-lg), 0 0 0 1px color-mix(in srgb, var(--nf-accent) 22%, transparent)}.jbF1yq_assistantFloatHeader:focus-visible{outline:var(--nf-focus-w,2px) solid var(--nf-accent);outline-offset:-2px}.jbF1yq_view h1,.jbF1yq_view h2{font-family:var(--nf-font-display);letter-spacing:-.3px;font-weight:400;line-height:1.25}.jbF1yq_eyebrow{font-size:var(--nf-fs-10,10px);letter-spacing:.16em;text-transform:uppercase;color:var(--nf-accent);font-weight:600}.jbF1yq_titleBlock{gap:var(--nf-space-2,2px);flex-direction:column;display:flex}.jbF1yq_runLog{border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);background:var(--nf-bg-inset);min-height:120px;padding:var(--nf-space-10,10px) var(--nf-space-12,12px);gap:var(--nf-space-2,2px);font-size:var(--nf-fs-12,12px);font-variant-numeric:tabular-nums;flex-direction:column;flex:1;line-height:1.6;display:flex;overflow-y:auto}.jbF1yq_runLogLine{gap:var(--nf-space-8,8px);opacity:.88;display:flex}.jbF1yq_runLogTime{color:var(--nf-text-3);flex:none}.jbF1yq_tnum,.jbF1yq_statCardDValue,.jbF1yq_statCardDDetail,.jbF1yq_progressLine,.jbF1yq_liveText{font-variant-numeric:tabular-nums}.jbF1yq_chapterPreview,.jbF1yq_reviewBox{max-width:var(--nf-measure,720px);width:100%;margin-inline:auto}.jbF1yq_view textarea{max-width:var(--nf-measure,720px)}.jbF1yq_planMaster{grid-template-columns:264px minmax(0,1fr);align-items:stretch;height:clamp(480px,100vh - 250px,1200px);display:grid}.jbF1yq_planTree{background:color-mix(in srgb, var(--nf-border) 10%, transparent);border-right:1px solid var(--nf-border);padding:var(--nf-space-12,12px) var(--nf-space-10,10px) var(--nf-space-12,12px) var(--nf-space-14,14px);gap:var(--nf-space-2,2px);flex-direction:column;display:flex;overflow:auto}.jbF1yq_planTreeSearch{margin-bottom:var(--nf-space-6,6px);flex:none}.jbF1yq_planTreeVolGroup{display:block}.jbF1yq_planTreeVol{align-items:center;gap:var(--nf-space-6,6px);padding:var(--nf-space-8,8px) var(--nf-space-4,4px) var(--nf-space-4,4px);cursor:pointer;font-size:var(--nf-fs-12,12px);color:var(--nf-muted,var(--nf-text-2));user-select:none;background:linear-gradient(color-mix(in srgb, var(--nf-border) 10%, transparent), color-mix(in srgb, var(--nf-border) 10%, transparent)), var(--nf-glass-face);z-index:1;font-weight:600;display:flex;position:sticky;top:0}.jbF1yq_planTreeVolMeta{font-variant-numeric:tabular-nums;opacity:.75;margin-left:auto}.jbF1yq_planTreeRow{align-items:center;gap:var(--nf-space-6,6px);width:100%;padding:var(--nf-space-6,6px) var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);color:var(--nf-text);cursor:pointer;text-align:left;font-size:var(--nf-fs-14,13px);transition:background var(--nf-dur-fast,.12s) ease, border-color var(--nf-dur-fast,.12s) ease;background:0 0;border:1px solid #0000;display:flex}.jbF1yq_planTreeRow:hover{background:color-mix(in srgb, var(--nf-accent) 10%, transparent)}.jbF1yq_planTreeRow[data-active]{background:color-mix(in srgb, var(--nf-accent) 16%, var(--nf-glass-face));border-color:var(--nf-accent)}.jbF1yq_planTreeRowNo{font-variant-numeric:tabular-nums;color:var(--nf-muted,var(--nf-text-2));font-size:var(--nf-fs-12,12px);text-align:right;flex:none;min-width:2ch}.jbF1yq_planTreeRowTitle{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_planDot{border-radius:50%;flex:none;width:8px;height:8px}.jbF1yq_planDetail{gap:var(--nf-space-10,10px);min-width:0;padding:var(--nf-space-14,14px) var(--nf-space-14,14px) var(--nf-space-12,12px) var(--nf-space-14,14px);flex-direction:column;display:flex}.jbF1yq_planDetailEmpty{border:1px dashed var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);flex:1;justify-content:center;align-items:center;display:flex}.jbF1yq_planDetailBody{flex:1;min-height:0;overflow:auto}.jbF1yq_planDetailTitle{font-family:var(--nf-font-display,inherit);font-size:var(--nf-fs-20,20px);color:var(--nf-text);letter-spacing:.01em;font-weight:400;line-height:1.3}.jbF1yq_planBeats{gap:var(--nf-space-8,8px);padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);max-width:var(--nf-measure,720px);flex-direction:column;display:flex}.jbF1yq_planBeatsLabel{font-size:var(--nf-fs-12,12px);letter-spacing:.06em;color:var(--nf-muted,var(--nf-text-2));font-weight:600}.jbF1yq_planDetailBar{gap:var(--nf-space-6,6px);border-top:1px solid var(--nf-glass-border);padding-top:var(--nf-space-10,10px);flex-wrap:wrap;display:flex}@container jbF1yq_nfpanel (width<=900px){.jbF1yq_planMaster{grid-template-columns:1fr;height:auto;min-height:480px}.jbF1yq_planTree{border-right:none;border-bottom:1px solid var(--nf-glass-border);padding-right:var(--nf-space-14,14px);padding-bottom:var(--nf-space-10,10px);max-height:300px}}.jbF1yq_t2Master{grid-template-columns:200px minmax(0,1fr);min-height:320px;display:grid}.jbF1yq_t2Rail{background:color-mix(in srgb, var(--nf-border) 10%, transparent);border-right:1px solid var(--nf-border);padding:var(--nf-space-12,12px) var(--nf-space-10,10px);gap:var(--nf-space-4,4px);flex-direction:column;display:flex}.jbF1yq_t2RailHead{font-size:var(--nf-fs-14,14px);padding:var(--nf-space-4,4px) var(--nf-space-6,6px) var(--nf-space-10,10px);font-weight:650}.jbF1yq_t2RailBtn{align-items:center;gap:var(--nf-space-8,8px);padding:var(--nf-space-6,6px) var(--nf-space-8,8px);border-radius:var(--nf-radius-8,8px);color:var(--nf-text);cursor:pointer;text-align:left;width:100%;font-size:var(--nf-fs-14,13px);transition:background var(--nf-dur-fast,.12s) ease, border-color var(--nf-dur-fast,.12s) ease;background:0 0;border:1px solid #0000;display:flex}.jbF1yq_t2RailBtn:hover{background:color-mix(in srgb, var(--nf-accent) 10%, transparent)}.jbF1yq_t2RailBtn[data-active]{background:color-mix(in srgb, var(--nf-accent) 16%, var(--nf-glass-face));border-color:var(--nf-accent);color:var(--nf-accent);font-weight:600}.jbF1yq_t2RailSep{background:var(--nf-glass-border);height:1px;margin:var(--nf-space-8,8px) 0}.jbF1yq_t2RailMeta{gap:var(--nf-space-6,6px);padding:0 var(--nf-space-6,6px);font-size:var(--nf-fs-12,12px);color:var(--nf-muted,var(--nf-text-2));flex-direction:column;line-height:1.5;display:flex}.jbF1yq_t2Content{padding:var(--nf-space-16,16px) var(--nf-space-20,20px);gap:var(--nf-space-14,14px);flex-direction:column;min-width:0;display:flex}@container jbF1yq_nfpanel (width<=900px){.jbF1yq_t2Master{grid-template-columns:1fr}.jbF1yq_t2Rail{border-right:none;border-bottom:1px solid var(--nf-glass-border)}}.jbF1yq_view .jbF1yq_button,.jbF1yq_view .jbF1yq_buttonPrimary,.jbF1yq_view .jbF1yq_buttonSmall,.jbF1yq_view .jbF1yq_iconButton,.jbF1yq_view .jbF1yq_pillNavPill,.jbF1yq_view .jbF1yq_segTab{transition-property:color,background,border-color,box-shadow,transform,opacity;transition-duration:var(--nf-dur-fast,.12s);transition-timing-function:cubic-bezier(.2,.8,.2,1)}.jbF1yq_view .jbF1yq_button:active,.jbF1yq_view .jbF1yq_buttonPrimary:active,.jbF1yq_view .jbF1yq_buttonSmall:active,.jbF1yq_view .jbF1yq_iconButton:active{transform:scale(.96)}.jbF1yq_card{transition:border-color var(--nf-dur-base,.15s) ease, transform var(--nf-dur-base,.15s) cubic-bezier(.2, .8, .2, 1), box-shadow var(--nf-dur-base,.15s) ease}.jbF1yq_card:hover{border-color:var(--nf-border-strong);transform:translateY(-1px)}@keyframes jbF1yq_nfViewIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}html[data-dsh-novelforge-active]:not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .jbF1yq_view{animation:jbF1yq_nfViewIn var(--nf-dur-slow,.28s) cubic-bezier(.2, .8, .2, 1)}:root{--nf-toast-bg:#faf9f5f5;--nf-toast-border:#a0917d66;--nf-toast-fg:#1f1e1c}body[data-ds-dark-theme]{--nf-toast-bg:#181c22f5;--nf-toast-border:#ffffff29;--nf-toast-fg:#e8eaed}.jbF1yq_nfToastHost{z-index:var(--nf-z-chip,2147480000);pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;bottom:26px;left:50%;transform:translate(-50%)}.jbF1yq_nfToast{border:1px solid var(--nf-toast-border);background:var(--nf-toast-bg);max-width:440px;color:var(--nf-toast-fg);font-family:var(--nf-font);font-size:var(--nf-fs-12,12.5px);border-radius:12px;align-items:center;gap:8px;padding:10px 18px;font-weight:600;animation:.3s cubic-bezier(.2,.9,.3,1.15) jbF1yq_nfToastIn;display:flex;box-shadow:0 12px 40px #00000040}.jbF1yq_nfToast[data-kind=done]{border-color:color-mix(in srgb, var(--nf-toast-ok,#2ec27e) 45%, var(--nf-toast-border))}.jbF1yq_nfToast[data-kind=error]{border-color:color-mix(in srgb, #dc2626 45%, var(--nf-toast-border))}.jbF1yq_nfToast .jbF1yq_nfToastTick{flex:none;font-weight:700}.jbF1yq_nfToast[data-kind=done] .jbF1yq_nfToastTick{color:var(--nf-toast-ok,#2ec27e)}.jbF1yq_nfToast[data-kind=error] .jbF1yq_nfToastTick{color:#ef4444}.jbF1yq_nfToast.jbF1yq_nfToastOut{opacity:0;transition:opacity .3s,transform .3s;transform:translateY(8px)}@keyframes jbF1yq_nfToastIn{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}.jbF1yq_cmdMask{z-index:90;backdrop-filter:blur(4px);background:#08090b6b;justify-content:center;align-items:flex-start;padding-top:12vh;animation:.16s jbF1yq_nfFadeIn;display:flex;position:absolute;inset:0}.jbF1yq_cmdBox{border:1px solid var(--nf-border-strong);border-radius:var(--nf-radius-16,16px);background:var(--nf-bg-raise);width:min(540px,92%);max-height:62vh;box-shadow:var(--nf-shadow-lg);flex-direction:column;animation:.22s cubic-bezier(.2,.9,.3,1.12) jbF1yq_nfCmdPop;display:flex;overflow:hidden}.jbF1yq_cmdInput{width:100%;color:var(--nf-text);font-family:var(--nf-font);font-size:var(--nf-fs-14,14px);padding:var(--nf-space-14,14px) var(--nf-space-16,16px);border:none;border-bottom:1px solid var(--nf-border);background:0 0;outline:none}.jbF1yq_cmdInput::placeholder{color:var(--nf-text-3)}.jbF1yq_cmdList{padding:var(--nf-space-6,6px);margin:0;list-style:none;overflow:auto}.jbF1yq_cmdItem{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-8,8px) var(--nf-space-12,12px);border-radius:var(--nf-radius-10,10px);font-size:var(--nf-fs-12,12.5px);color:var(--nf-text-2);cursor:pointer;display:flex}.jbF1yq_cmdItem .jbF1yq_cmdIcon{font-size:var(--nf-fs-14,14px);flex:none}.jbF1yq_cmdItem b{color:var(--nf-text);font-weight:600}.jbF1yq_cmdItem .jbF1yq_cmdHint{font-size:var(--nf-fs-10,10px);color:var(--nf-text-3);margin-left:auto}.jbF1yq_cmdItem[data-active]{background:var(--nf-accent-soft);color:var(--nf-text)}.jbF1yq_cmdEmpty{padding:var(--nf-space-20,20px);text-align:center;color:var(--nf-text-3);font-size:var(--nf-fs-12,12.5px)}@keyframes jbF1yq_nfCmdPop{0%{opacity:0;transform:translateY(-8px)scale(.97)}to{opacity:1;transform:none}}.jbF1yq_wfStage{--wf-bg:var(--nf-bg);--wf-bg2:var(--nf-bg-raise);--wf-bg3:var(--nf-bg-inset);--wf-bg4:var(--nf-bg-deep,var(--nf-bg-inset));--wf-line:var(--nf-border);--wf-line2:var(--nf-border-strong);--wf-text:var(--nf-text);--wf-dim:var(--nf-text-2);--wf-faint:var(--nf-text-3);--wf-ai:var(--nf-ai,#d98a2b);--wf-human:var(--nf-human,#4aa3d9);--wf-ok:var(--nf-success);--wf-warn:var(--nf-warn);--wf-bad:var(--nf-error);--wf-idle:var(--nf-idle,#5c5344);--wf-serif:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);--wf-ui:var(--nf-font,\"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif);--wf-mono:var(--nf-font-mono,\"Cascadia Mono\", Consolas, \"SF Mono\", ui-monospace, monospace);background:var(--wf-bg2);border:1px solid var(--wf-line);color:var(--wf-text);font-family:var(--wf-ui);-webkit-font-smoothing:antialiased;border-radius:16px;font-size:14px;line-height:1.6;position:relative;overflow:hidden}.jbF1yq_wfStage button{font-family:inherit}.jbF1yq_wfTop{background:var(--nf-bg-deep,var(--nf-bg));border-bottom:1px solid var(--wf-line2);flex-wrap:wrap;align-items:center;gap:14px;padding:12px 18px;display:flex}.jbF1yq_wfBook{font-family:var(--wf-serif);white-space:nowrap;text-overflow:ellipsis;max-width:38vw;font-size:22px;line-height:1.2;overflow:hidden}.jbF1yq_wfProg{color:var(--wf-dim);white-space:nowrap;align-items:baseline;gap:6px;font-size:12.5px;display:flex}.jbF1yq_wfProgBig{font-family:var(--wf-serif);color:var(--wf-ok);font-size:22px;line-height:1.1}.jbF1yq_wfProgRest{color:var(--wf-dim)}.jbF1yq_wfPill{border:1px solid var(--wf-line);color:var(--wf-dim);background:var(--wf-bg2);white-space:nowrap;border-radius:99px;align-items:center;gap:6px;padding:3px 10px;font-size:12px;display:inline-flex}.jbF1yq_wfPillDot{border-radius:50%;flex:none;width:7px;height:7px;display:inline-block}.jbF1yq_wfLiveChip{color:var(--wf-ai);border-color:#d98a2b66}.jbF1yq_wfTopRight{flex-wrap:wrap;align-items:center;gap:8px;margin-left:auto;display:flex}.jbF1yq_wfSep{background:var(--wf-line);flex:none;width:1px;height:16px;margin:0 4px}.jbF1yq_wfTool{color:var(--wf-dim);border:1px solid var(--wf-line);cursor:pointer;white-space:nowrap;background:0 0;border-radius:7px;padding:3px 11px;font-size:12.5px;transition:border-color .15s,color .15s}.jbF1yq_wfTool:hover{border-color:var(--wf-line);color:var(--wf-text)}.jbF1yq_wfToolBlue{color:var(--nf-human);border-color:#4aa3d959}.jbF1yq_wfToolAmber{color:var(--nf-ai);border-color:#d98a2b66}.jbF1yq_wfMetrics{gap:var(--nf-space-8,8px);grid-template-columns:repeat(4,minmax(0,1fr));margin:14px 18px 0;display:grid}.jbF1yq_wfMetric{background:var(--nf-bg-inset);border:1px solid var(--nf-border);border-radius:var(--nf-radius-10,10px);min-width:0;padding:9px 11px}.jbF1yq_wfMetric span{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-2);white-space:nowrap;display:block}.jbF1yq_wfMetric b{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);color:var(--nf-text);font-variant-numeric:tabular-nums;font-size:20px;font-weight:700}.jbF1yq_wfMetric small{font-size:var(--nf-fs-caption,11px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;margin-top:1px;display:block;overflow:hidden}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfMetrics{grid-template-columns:repeat(2,minmax(0,1fr))}}.jbF1yq_wfBody{grid-template-columns:minmax(0,1fr) 380px;display:grid}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfBody{grid-template-columns:minmax(0,1fr)}}.jbF1yq_wfColA{flex-direction:column;gap:16px;min-width:0;padding:16px 18px;display:flex}.jbF1yq_wfColB{border-left:1px solid var(--wf-line2);flex-direction:column;gap:16px;min-width:0;padding:16px 18px;display:flex}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfColB{border-left:none}}.jbF1yq_wfRail{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:10px;grid-template-columns:repeat(6,1fr);gap:4px;padding:5px;display:grid}.jbF1yq_wfRs{text-align:center;background:var(--wf-bg4);color:var(--wf-faint);cursor:pointer;border:1px solid #0000;border-radius:7px;min-width:0;padding:6px 2px;font-size:12px;transition:transform .12s,filter .12s;position:relative}.jbF1yq_wfRs:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.jbF1yq_wfRs:disabled{cursor:default;opacity:.8}.jbF1yq_wfRsNo{font-family:var(--wf-mono);opacity:.7;font-size:9px;line-height:1.2;display:block}.jbF1yq_wfRsName{color:inherit;white-space:nowrap;text-overflow:ellipsis;font-size:12.5px;font-weight:600;line-height:1.4;display:block;overflow:hidden}.jbF1yq_wfRsChk{font-family:var(--wf-mono);color:inherit;white-space:nowrap;text-overflow:ellipsis;font-size:10px;font-weight:700;line-height:1.3;display:block;overflow:hidden}.jbF1yq_wfDone{color:var(--wf-ok);background:#79b3721f}.jbF1yq_wfNow{color:var(--nf-ai);background:#d98a2b1f;border-color:#e0a03c80}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfRail{grid-template-columns:repeat(3,1fr)}}.jbF1yq_wfPoolWrap{position:relative}.jbF1yq_wfEmpty{border:1px dashed var(--wf-line);background:var(--wf-bg3);color:var(--wf-dim);border-radius:12px;padding:18px 20px;font-size:12.5px;line-height:1.8}.jbF1yq_wfPoolBar{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:12px;height:64px;display:flex;position:relative;overflow:hidden}.jbF1yq_wfPs{min-width:0;font-family:var(--wf-mono);color:#221b12;cursor:pointer;background:0 0;border:none;border-right:1px solid #0000001f;flex-direction:column;justify-content:center;align-items:center;gap:2px;padding:4px 6px;font-size:13.5px;font-weight:700;transition:filter .2s;display:flex;overflow:hidden}.jbF1yq_wfPs:last-child{border-right:none}.jbF1yq_wfPs:hover{filter:brightness(1.1)}.jbF1yq_wfPsN{font-variant-numeric:tabular-nums;font-size:17px;line-height:1.15}.jbF1yq_wfPsLab{font-family:var(--wf-ui);opacity:.95;font-size:12px;font-weight:600;line-height:1.2}.jbF1yq_wfPsLegend{color:var(--wf-dim);flex-wrap:wrap;gap:16px;margin-top:8px;font-size:12.5px;display:flex}.jbF1yq_wfPl{align-items:center;gap:6px;display:flex}.jbF1yq_wfSw{border-radius:3px;flex:none;width:10px;height:10px;display:inline-block}.jbF1yq_wfCmd{background:#4aa3d912;border:1px solid #4c9ed966;border-radius:14px;align-items:center;gap:16px;min-width:0;padding:13px 16px;display:flex;position:relative}.jbF1yq_wfQt{flex-direction:column;flex:none;gap:2px;display:flex}.jbF1yq_wfQtTone{color:var(--wf-dim);letter-spacing:.06em;text-transform:uppercase;font-size:12.5px}.jbF1yq_wfQt b{color:var(--nf-human);font-size:14px;line-height:1.4}.jbF1yq_wfCmdReason{min-width:0;color:var(--wf-faint);flex:1;font-size:12.5px;line-height:1.6}.jbF1yq_wfCmdBtn{background:var(--wf-human);color:#06202e;cursor:pointer;white-space:nowrap;border:none;border-radius:9px;flex:none;padding:9px 18px;font-size:13.5px;font-weight:700;transition:filter .15s;box-shadow:0 6px 20px #4aa3d94d}.jbF1yq_wfCmdBtn:hover:not(:disabled){filter:brightness(1.1)}.jbF1yq_wfCmdBtn:disabled{opacity:.45;cursor:not-allowed}.jbF1yq_wfCard2{grid-template-columns:1.2fr 1fr;gap:14px;display:grid}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfCard2{grid-template-columns:minmax(0,1fr)}}.jbF1yq_wfBox{border:1px solid var(--wf-line2);background:var(--wf-bg3);border-radius:12px;min-width:0;padding:13px 14px;position:relative}.jbF1yq_wfBoxH{letter-spacing:.14em;text-transform:uppercase;color:var(--wf-faint);align-items:center;gap:7px;margin:0 0 9px;font-size:12px;font-weight:700;line-height:1.4;display:flex}.jbF1yq_wfDot{border-radius:50%;flex:none;width:7px;height:7px;display:inline-block}.jbF1yq_wfRow{border-bottom:1px solid var(--wf-line2);align-items:center;gap:10px;padding:5px 0;font-size:12.5px;display:flex}.jbF1yq_wfRow:last-child{border-bottom:none}.jbF1yq_wfCn{font-family:var(--wf-mono);color:var(--wf-dim);white-space:nowrap;flex:none;min-width:58px}.jbF1yq_wfSt{border-radius:4px;flex:none;padding:1px 6px;font-size:12px}.jbF1yq_wfStRev{color:var(--nf-warn);background:#e3a52e26}.jbF1yq_wfStFix{color:var(--nf-error);background:#d9575326}.jbF1yq_wfStFail{color:var(--nf-error);background:#d957532e}.jbF1yq_wfDs{color:var(--wf-faint);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.jbF1yq_wfAct{color:var(--nf-human);cursor:pointer;white-space:nowrap;opacity:.45;background:0 0;border:1px solid #4aa3d959;border-radius:6px;flex:none;padding:2px 9px;font-size:12px;transition:background .12s,opacity .12s}.jbF1yq_wfRow:hover .jbF1yq_wfAct,.jbF1yq_wfAct:focus-visible{opacity:1}.jbF1yq_wfRow:hover .jbF1yq_wfDs{color:var(--wf-dim)}.jbF1yq_wfRow{transition:background .1s}.jbF1yq_wfAct:hover{background:#4aa3d91f}.jbF1yq_wfSmallFoot{color:var(--wf-faint);flex-wrap:wrap;align-items:center;gap:10px;margin-top:8px;font-size:12px;line-height:1.7;display:flex}.jbF1yq_wfFeedBox{min-width:0}.jbF1yq_wfFeedList{flex-direction:column;min-width:0;display:flex}.jbF1yq_wfFi{border-bottom:1px solid var(--wf-line2);align-items:baseline;gap:10px;min-width:0;padding:6px 0;font-size:12.5px;display:flex}.jbF1yq_wfFi:last-child{border-bottom:none}.jbF1yq_wfFdot{background:var(--wf-idle);opacity:.9;border-radius:50%;flex:none;align-self:center;width:6px;height:6px}.jbF1yq_wfFdotOk{background:var(--wf-ok)}.jbF1yq_wfFdotErr{background:var(--wf-bad)}.jbF1yq_wfFt{color:var(--wf-dim);white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.jbF1yq_wfDrawerBox{min-width:0}.jbF1yq_wfDrawerToggle{color:var(--wf-dim);border:1px solid var(--wf-line);cursor:pointer;background:0 0;border-radius:5px;margin-left:auto;padding:1px 8px;font-size:12px}.jbF1yq_wfDrawerToggle:hover{color:var(--wf-text);border-color:var(--wf-line)}.jbF1yq_wfDrawerList{grid-template-columns:1fr 1fr;gap:6px;display:grid}@container jbF1yq_nfpanel (width<=560px){.jbF1yq_wfDrawerList{grid-template-columns:1fr}}.jbF1yq_wfDl{background:var(--wf-bg3);border:1px solid var(--wf-line2);color:var(--wf-dim);text-align:left;cursor:pointer;border-radius:8px;padding:8px 10px;font-size:12.5px;transition:border-color .12s,transform .12s;position:relative}.jbF1yq_wfDl:hover{border-color:#d98a2b73;transform:translateY(-1px)}.jbF1yq_wfDlName{color:var(--wf-text);font-weight:600;display:block}.jbF1yq_wfDlDi{color:var(--wf-faint);font-size:10px;font-family:var(--wf-mono);margin-top:2px;display:block}.jbF1yq_wfDlDim{opacity:.6}.jbF1yq_wfDlDim .jbF1yq_wfDlName{color:var(--wf-dim)}.jbF1yq_wfAccentBlue{border-color:#4c9ed959}.jbF1yq_wfAccentAmber{border-color:#d98a2b59}.jbF1yq_wfHint{color:var(--wf-dim);margin-bottom:8px;font-size:12.5px;line-height:1.7}.jbF1yq_wfEmpty2{color:var(--wf-faint);padding:2px 0 4px;font-size:12.5px;line-height:1.7;display:block}.jbF1yq_wfPreview{color:var(--wf-faint);border:1px dashed #4aa3d94d;border-radius:9px;flex-direction:column;gap:4px;margin-bottom:8px;padding:9px 11px;font-size:12px;display:flex}.jbF1yq_wfPreviewName{color:var(--wf-text);font-size:12.5px;font-weight:600}.jbF1yq_wfPreviewLine{line-height:1.7}.jbF1yq_wfPreviewActs{gap:8px;margin-top:3px;display:flex}.jbF1yq_wfConsole{font-family:var(--wf-mono);color:var(--wf-dim);background:var(--wf-bg3);border:1px solid var(--wf-line2);border-radius:9px;min-width:0;margin-bottom:8px;padding:9px 12px;font-size:12px;line-height:1.9}.jbF1yq_wfConRow{white-space:nowrap;align-items:center;gap:8px;min-width:0;display:flex}.jbF1yq_wfConOk{color:var(--wf-ok);font-weight:600}.jbF1yq_wfConErr{color:var(--nf-error)}.jbF1yq_wfLiveMark{color:var(--wf-ai);flex:none;animation:1s ease-in-out infinite jbF1yq_wfBlink}.jbF1yq_wfConTxt{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.jbF1yq_wfConBar{background:var(--wf-idle);border-radius:99px;flex:none;width:110px;height:4px;overflow:hidden}.jbF1yq_wfConBar i{background:var(--wf-ai);border-radius:99px;height:100%;display:block}.jbF1yq_wfOpsRow{flex-wrap:wrap;gap:8px;display:flex}.jbF1yq_wfOpsBtn{color:var(--wf-dim);border:1px solid var(--wf-line2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:7px;padding:5px 11px;font-size:12.5px;transition:border-color .12s,color .12s}.jbF1yq_wfOpsBtn:hover:not(:disabled){color:var(--wf-text);border-color:var(--wf-line)}.jbF1yq_wfOpsBtn:disabled{opacity:.4;cursor:not-allowed}.jbF1yq_wfOpsBtnMain{color:var(--nf-ai);background:#d98a2b1f;border-color:#d98a2b73}.jbF1yq_wfConsoleNote{color:var(--wf-ai);margin-top:8px;font-size:12px;line-height:1.6}.jbF1yq_wfCoord{color:var(--wf-dim);font-size:12.5px;line-height:1.9}.jbF1yq_wfCoord b{color:var(--wf-text);font-weight:600}.jbF1yq_wfCoordStuck{color:var(--nf-error);margin-top:4px}.jbF1yq_wfSignal{border-top:1px solid var(--wf-line2);background:var(--nf-bg-deep,var(--nf-bg));color:var(--wf-faint);flex-wrap:wrap;align-items:center;gap:22px;padding:10px 18px;font-size:12.5px;display:flex}.jbF1yq_wfSig{align-items:center;gap:6px;display:flex}.jbF1yq_wfSig b{color:var(--wf-dim);font-family:var(--wf-mono);font-weight:600}.jbF1yq_wfSigGood b{color:var(--wf-ok)}.jbF1yq_wfSigBad b{color:var(--nf-error)}.jbF1yq_wfSigRight{color:var(--wf-faint);margin-left:auto;font-size:12px}@keyframes jbF1yq_wfBlink{0%,to{opacity:.35}50%{opacity:1}}@container jbF1yq_nfpanel (width<=1080px){.jbF1yq_wfBook{max-width:70%}}@container jbF1yq_nfpanel (width<=760px){.jbF1yq_wfRsName{font-size:12px}.jbF1yq_wfProg{display:none}.jbF1yq_wfTopRight{margin-left:0}.jbF1yq_wfPsLab{font-size:10px}.jbF1yq_wfCmd{flex-wrap:wrap}}.jbF1yq_wfStage button:focus-visible,.jbF1yq_wfStage a:focus-visible{outline:1px solid var(--nf-ai);outline-offset:2px}.jbF1yq_chWork{flex-direction:column;flex:1;min-height:0;display:flex}.jbF1yq_chWorkBar{align-items:center;gap:var(--nf-space-10,10px);padding:var(--nf-space-10,10px) var(--nf-space-14,14px);border-bottom:1px solid var(--nf-border);background:var(--nf-bg-raise);flex-wrap:wrap;display:flex}.jbF1yq_chWorkTitle{font-family:var(--nf-font-display,inherit);font-size:var(--nf-fs-20,20px);color:var(--nf-text);font-weight:400;line-height:1.3}.jbF1yq_chWorkActions{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;margin-left:auto;display:flex}.jbF1yq_chWorkGrid{flex:1;grid-template-columns:260px minmax(0,1fr) minmax(0,1fr);min-height:0;display:grid}.jbF1yq_chWorkSideHead{align-items:center;gap:var(--nf-space-8,8px);min-width:0;display:flex}.jbF1yq_chWorkSideHead>:first-child{flex:1;min-width:0}.jbF1yq_chWorkAside,.jbF1yq_chWorkSide{gap:var(--nf-space-10,10px);min-width:0;min-height:0;padding:var(--nf-space-12,12px);flex-direction:column;display:flex}.jbF1yq_chWorkAside{border-right:1px solid var(--nf-border)}.jbF1yq_chWorkSide{border-left:1px solid var(--nf-border)}.jbF1yq_chWorkAsideTitle{font-size:var(--nf-fs-12,12px);letter-spacing:.08em;color:var(--nf-muted,var(--nf-text-2));font-weight:600}.jbF1yq_chWorkAsideBody{gap:var(--nf-space-10,10px);min-height:0;padding:var(--nf-space-12,12px) var(--nf-space-14,14px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex:1;display:flex;overflow:auto}.jbF1yq_chWorkMain{flex-direction:column;min-width:0;min-height:0;display:flex}.jbF1yq_chWorkToolbar{padding:var(--nf-space-8,8px) var(--nf-space-16,16px);border-bottom:1px solid var(--nf-border);align-items:center;display:flex}.jbF1yq_chWorkText{min-height:0;padding:var(--nf-space-20,20px) var(--nf-space-24,24px);background-color:var(--nf-bg-raise);background-image:repeating-linear-gradient(0deg, transparent 0, transparent 27px, var(--nf-paper-grid) 27px, var(--nf-paper-grid) 28px);font-family:var(--nf-font-display);color:var(--nf-text-2);white-space:pre-wrap;word-break:break-word;flex:1;margin:0;line-height:28px;overflow:auto}.jbF1yq_chWorkSideBody{gap:var(--nf-space-10,10px);flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.jbF1yq_chWorkToolActions{align-items:center;gap:var(--nf-space-8,8px);margin-left:auto;display:flex}.jbF1yq_chWorkDraftBar{gap:var(--nf-space-6,6px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border:1px solid color-mix(in srgb, var(--nf-warn,var(--nf-seal)) 45%, transparent);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex-shrink:0;display:flex}.jbF1yq_chWorkPickBar{align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_chWorkPickBtns{align-items:center;gap:var(--nf-space-6,6px);margin-left:auto;display:flex}.jbF1yq_chWorkSideBody input[type=checkbox]{accent-color:var(--nf-seal,var(--nf-accent));cursor:pointer;flex-shrink:0}.jbF1yq_chWorkSideFoot{gap:var(--nf-space-8,8px);padding:var(--nf-space-10,10px) var(--nf-space-12,12px);border:1px solid var(--nf-glass-border);border-radius:var(--nf-radius-14,14px);background:var(--nf-glass-face);flex-direction:column;flex-shrink:0;display:flex}.jbF1yq_chWorkFootRow{gap:var(--nf-space-8,8px);flex-wrap:wrap;display:flex}.jbF1yq_panelHidden{display:none}@container jbF1yq_nfpanel (width<=1180px){.jbF1yq_chWorkGrid{grid-template-columns:220px minmax(0,1fr)}.jbF1yq_chWorkSide{border-left:none;border-top:1px solid var(--nf-border);grid-column:1/-1}}@container jbF1yq_nfpanel (width<=820px){.jbF1yq_chWorkGrid{grid-template-columns:minmax(0,1fr)}.jbF1yq_chWorkAside{border-right:none;border-bottom:1px solid var(--nf-border)}}.jbF1yq_noticeBar{align-items:flex-start;gap:var(--nf-space-8,8px);padding:var(--nf-space-8,8px) var(--nf-space-10,10px);border:1px solid var(--nf-border);border-radius:var(--nf-ctrl-radius,8px);font-size:var(--nf-fs-notice,12px);line-height:var(--nf-lh-body,1.55);display:flex}.jbF1yq_noticeIcon{width:16px;height:16px;font-size:var(--nf-fs-14,14px);border-radius:50%;flex:none;place-items:center;margin-top:1px;font-weight:700;display:inline-grid}.jbF1yq_noticeBody{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.jbF1yq_noticeText{font-weight:600}.jbF1yq_noticeDetail{font-weight:400;font-size:var(--nf-fs-14,14px);opacity:.9}.jbF1yq_noticeActions{align-items:center;gap:var(--nf-space-6,6px);flex:none;display:flex}.jbF1yq_noticeBtn{font-size:var(--nf-fs-14,14px);color:inherit;cursor:pointer;transition:background var(--nf-dur-base,.12s) var(--nf-ease-out,ease);background:0 0;border:1px solid;border-radius:6px;flex:none;padding:2px 9px}.jbF1yq_noticeBtn:hover{background:#7f7f7f24}.jbF1yq_noticeBtn:disabled{opacity:.55;cursor:default}.jbF1yq_notice-ok{color:var(--nf-success-ink);background:var(--nf-success-ink-soft);border-color:color-mix(in srgb, var(--nf-success-ink) 34%, transparent)}.jbF1yq_notice-info{color:var(--nf-info-ink);background:var(--nf-info-ink-soft);border-color:color-mix(in srgb, var(--nf-info-ink) 34%, transparent)}.jbF1yq_notice-warn{color:var(--nf-warn-ink);background:var(--nf-warn-ink-soft);border-color:color-mix(in srgb, var(--nf-warn-ink) 34%, transparent)}.jbF1yq_notice-error{color:var(--nf-error-ink);background:var(--nf-error-ink-soft);border-color:color-mix(in srgb, var(--nf-error-ink) 40%, transparent)}.jbF1yq_noticeIcon{color:inherit}.jbF1yq_confirmOverlay{z-index:90;background:color-mix(in srgb, var(--nf-bg-deep,#100e0a) 62%, transparent);backdrop-filter:blur(2px);justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.jbF1yq_confirmCard{gap:var(--nf-space-10,10px);width:min(460px,94vw);max-height:min(86vh,720px);padding:var(--nf-space-16,16px);background:var(--nf-bg);border:1px solid var(--nf-border);border-radius:var(--nf-card-radius,12px);box-shadow:var(--nf-shadow-lg,0 20px 48px #00000047);animation:jbF1yq_nfConfirmIn var(--nf-dur-base,.14s) var(--nf-ease-out,ease) both;flex-direction:column;display:flex;overflow-y:auto}@keyframes jbF1yq_nfConfirmIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.jbF1yq_confirmHead{align-items:flex-start;gap:var(--nf-space-10,10px);display:flex}.jbF1yq_confirmIcon{width:26px;height:26px;font-size:var(--nf-fs-14,14px);border-radius:8px;flex:none;place-items:center;font-weight:700;display:grid}.jbF1yq_confirmTitle{font-family:var(--nf-font-display,Georgia, \"Songti SC\", SimSun, serif);font-size:var(--nf-fs-title,16px);color:var(--nf-text);font-weight:700;line-height:1.35}.jbF1yq_confirmBody{gap:var(--nf-space-8,8px);flex-direction:column;display:flex}.jbF1yq_confirmText{font-size:var(--nf-fs-14,14px);line-height:var(--nf-lh-body,1.6);color:var(--nf-text-2)}.jbF1yq_confirmList{padding:var(--nf-space-8,8px) var(--nf-space-12,12px);font-size:var(--nf-fs-14,14px);color:var(--nf-text-2);background:var(--nf-bg-inset);border-radius:8px;margin:0;line-height:1.65;list-style:outside}.jbF1yq_confirmList li+li{margin-top:2px}.jbF1yq_confirmAssurance{padding:var(--nf-space-8,8px) var(--nf-space-10,10px);font-size:var(--nf-fs-14,14px);color:var(--nf-info-ink);background:var(--nf-info-ink-soft);border:1px solid color-mix(in srgb, var(--nf-info-ink) 28%, transparent);border-radius:8px;line-height:1.55}.jbF1yq_confirmPhraseRow{flex-direction:column;gap:4px;display:flex}.jbF1yq_confirmPhraseHint{font-size:var(--nf-fs-14,14px);color:var(--nf-text-3)}.jbF1yq_confirmPhraseInput{font-family:var(--nf-mono,ui-monospace, monospace);font-size:var(--nf-fs-14,14px);border:1px solid var(--nf-border-strong);background:var(--nf-bg-raise);color:var(--nf-text);border-radius:8px;padding:7px 10px}.jbF1yq_confirmAckRow{align-items:flex-start;gap:var(--nf-space-8,8px);font-size:var(--nf-fs-14,14px);color:var(--nf-text-2);cursor:pointer;line-height:1.5;display:flex}.jbF1yq_confirmAckRow input{flex:none;margin-top:2px}.jbF1yq_confirmActions{justify-content:flex-end;align-items:center;gap:var(--nf-space-8,8px);padding-top:var(--nf-space-4,4px);display:flex}.jbF1yq_confirmGo[data-tone=danger]{border-color:var(--nf-error-ink);color:#fff;background:var(--nf-error-ink)}.jbF1yq_confirmGo[data-tone=danger]:hover:not(:disabled){filter:brightness(1.08)}.jbF1yq_confirmGo[data-tone=warn]{border-color:var(--nf-warn-ink);color:#fff;background:var(--nf-warn-ink)}.jbF1yq_confirmGo[data-tone=warn]:hover:not(:disabled){filter:brightness(1.08)}.jbF1yq_confirmGo[data-tone=info]{border-color:var(--nf-accent);color:var(--nf-accent-fg);background:var(--nf-accent)}.jbF1yq_confirmGo[data-tone=info]:hover:not(:disabled){filter:brightness(1.08)}.jbF1yq_confirmGo:disabled{opacity:.5;cursor:default}.jbF1yq_wfMetricWide{grid-column:span 1}.jbF1yq_wfMetricSpark{align-items:center;gap:var(--nf-space-8,8px);min-width:0;margin-top:6px;display:flex}.jbF1yq_wfMetricSpark svg{flex:none;width:132px;height:26px;overflow:visible}.jbF1yq_wfMetricSparkNote{min-width:0;font-size:var(--nf-fs-notice,12px);color:var(--nf-text-3);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}@container jbF1yq_nfpanel (width<=560px){.jbF1yq_wfMetricSpark svg{display:none}}.jbF1yq_cardHead{justify-content:space-between;align-items:center;gap:var(--nf-space-8,8px);flex-wrap:wrap;min-width:0;display:flex}.jbF1yq_cardHeadLeft{align-items:baseline;gap:var(--nf-space-8,8px);flex-wrap:wrap;min-width:0;display:flex}.jbF1yq_cardHeadNote{font-size:var(--nf-fs-14,14px);color:var(--nf-text-3);text-overflow:ellipsis;min-width:0;overflow:hidden}.jbF1yq_cardHeadCount{color:var(--nf-text-3);font-weight:500}.jbF1yq_cardHeadActions{align-items:center;gap:var(--nf-space-6,6px);flex-wrap:wrap;flex:none;justify-content:flex-end;display:flex}.jbF1yq_rowBetween{justify-content:space-between}.jbF1yq_rowBetweenWrap{flex-wrap:wrap}.jbF1yq_rowBetweenBaseline{align-items:baseline}.jbF1yq_rowEnd{justify-content:flex-end}.jbF1yq_drawerTitle{align-items:center;gap:7px;min-width:0;display:flex}.jbF1yq_drawerTitleNi{color:var(--nf-text-3);flex:none;align-items:center;display:inline-flex}.jbF1yq_topNavNi{align-items:center;display:inline-flex}.jbF1yq_topNavNi>svg,.jbF1yq_drawerTitleNi>svg{stroke-width:1.75px;width:1em;height:1em}.jbF1yq_wfRailWrap{margin:var(--nf-space-14,14px) var(--nf-space-18,18px) 0;overscroll-behavior-x:contain;scrollbar-width:thin;overflow-x:auto}.jbF1yq_wfRailWrap>.jbF1yq_wfRail{min-width:520px;margin:0}";
1348
1353
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
1349
1354
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
1350
1355
  const tag = document.createElement("style");
@@ -1354,500 +1359,540 @@ window.__ModuleLoader__.load({
1354
1359
  document.head.appendChild(tag);
1355
1360
  }
1356
1361
  var panel_module_css_default = {
1357
- "nfFadeIn": "jbF1yq_nfFadeIn",
1358
- "wfHint": "jbF1yq_wfHint",
1359
- "wbIndexRow": "jbF1yq_wbIndexRow",
1360
- "wfFdot": "jbF1yq_wfFdot",
1361
- "legendNew": "jbF1yq_legendNew",
1362
- "wfDlDi": "jbF1yq_wfDlDi",
1363
- "readerItemNo": "jbF1yq_readerItemNo",
1364
- "runLog": "jbF1yq_runLog",
1365
- "wfCn": "jbF1yq_wfCn",
1362
+ "wsPreviewText": "jbF1yq_wsPreviewText",
1363
+ "badgePending": "jbF1yq_badgePending",
1364
+ "outlineH2": "jbF1yq_outlineH2",
1366
1365
  "nfSkeletonShimmer": "jbF1yq_nfSkeletonShimmer",
1367
- "chapterList": "jbF1yq_chapterList",
1368
- "settingsDrawer": "jbF1yq_settingsDrawer",
1369
- "cmdHint": "jbF1yq_cmdHint",
1370
- "planDetailBar": "jbF1yq_planDetailBar",
1371
- "wfDot": "jbF1yq_wfDot",
1372
- "cmdMask": "jbF1yq_cmdMask",
1373
- "badgeWritten": "jbF1yq_badgeWritten",
1374
- "progressTotalBar": "jbF1yq_progressTotalBar",
1375
- "nfViewIn": "jbF1yq_nfViewIn",
1376
- "wfSw": "jbF1yq_wfSw",
1377
- "bookCardProgressFill": "jbF1yq_bookCardProgressFill",
1378
- "wfOpsBtn": "jbF1yq_wfOpsBtn",
1379
- "toolStepIcon": "jbF1yq_toolStepIcon",
1380
- "outlineDoc": "jbF1yq_outlineDoc",
1381
- "diffTagOld": "jbF1yq_diffTagOld",
1382
- "panel": "jbF1yq_panel",
1383
- "importResult": "jbF1yq_importResult",
1366
+ "bookCardActive": "jbF1yq_bookCardActive",
1367
+ "wfPoolBar": "jbF1yq_wfPoolBar",
1384
1368
  "toolSteps": "jbF1yq_toolSteps",
1385
- "rowEnd": "jbF1yq_rowEnd",
1386
- "readerFoot": "jbF1yq_readerFoot",
1387
- "input": "jbF1yq_input",
1388
- "outlineTocItem": "jbF1yq_outlineTocItem",
1389
- "wfCmdBtn": "jbF1yq_wfCmdBtn",
1390
- "wfAccentBlue": "jbF1yq_wfAccentBlue",
1391
- "planDetailEmpty": "jbF1yq_planDetailEmpty",
1392
- "chWorkAside": "jbF1yq_chWorkAside",
1393
- "chWorkPickBar": "jbF1yq_chWorkPickBar",
1394
- "topNavNi": "jbF1yq_topNavNi",
1395
- "drawerScrim": "jbF1yq_drawerScrim",
1396
- "wfNow": "jbF1yq_wfNow",
1397
- "wfPs": "jbF1yq_wfPs",
1398
- "wfConsoleNote": "jbF1yq_wfConsoleNote",
1399
- "navTitleLogo": "jbF1yq_navTitleLogo",
1400
- "navTitle": "jbF1yq_navTitle",
1401
- "buttonPrimary": "jbF1yq_buttonPrimary",
1402
- "wfFeedBox": "jbF1yq_wfFeedBox",
1403
- "fieldLabel": "jbF1yq_fieldLabel",
1404
- "switch": "jbF1yq_switch",
1405
- "wfStage": "jbF1yq_wfStage",
1406
- "wbIndexVol": "jbF1yq_wbIndexVol",
1407
- "diffTagNew": "jbF1yq_diffTagNew",
1408
- "bookCardCover": "jbF1yq_bookCardCover",
1409
- "wfPl": "jbF1yq_wfPl",
1410
- "contentDrawerBody": "jbF1yq_contentDrawerBody",
1411
- "wsColumn": "jbF1yq_wsColumn",
1412
- "wfAccentAmber": "jbF1yq_wfAccentAmber",
1413
- "wfSmallFoot": "jbF1yq_wfSmallFoot",
1414
- "wfFt": "jbF1yq_wfFt",
1369
+ "wfCard2": "jbF1yq_wfCard2",
1370
+ "emptyState": "jbF1yq_emptyState",
1371
+ "confirmOverlay": "jbF1yq_confirmOverlay",
1372
+ "wfOpsRow": "jbF1yq_wfOpsRow",
1373
+ "progressBar": "jbF1yq_progressBar",
1374
+ "wsAppliedBanner": "jbF1yq_wsAppliedBanner",
1375
+ "assetCardName": "jbF1yq_assetCardName",
1376
+ "iconButton": "jbF1yq_iconButton",
1377
+ "outlineList": "jbF1yq_outlineList",
1378
+ "planBeatsLabel": "jbF1yq_planBeatsLabel",
1379
+ "chatRole": "jbF1yq_chatRole",
1380
+ "readerView": "jbF1yq_readerView",
1381
+ "wfTopRight": "jbF1yq_wfTopRight",
1382
+ "wfCmdReason": "jbF1yq_wfCmdReason",
1415
1383
  "pageHeader": "jbF1yq_pageHeader",
1416
- "wfConOk": "jbF1yq_wfConOk",
1417
- "dimEdit": "jbF1yq_dimEdit",
1418
- "wfPill": "jbF1yq_wfPill",
1384
+ "onlyChanges": "jbF1yq_onlyChanges",
1385
+ "drawerSpacer": "jbF1yq_drawerSpacer",
1386
+ "readerSegActive": "jbF1yq_readerSegActive",
1387
+ "importModalOverlay": "jbF1yq_importModalOverlay",
1388
+ "importModalHead": "jbF1yq_importModalHead",
1389
+ "cmdItem": "jbF1yq_cmdItem",
1390
+ "navSpacer": "jbF1yq_navSpacer",
1391
+ "wfPoolWrap": "jbF1yq_wfPoolWrap",
1392
+ "wfEmpty2": "jbF1yq_wfEmpty2",
1393
+ "notice-ok": "jbF1yq_notice-ok",
1394
+ "diffList": "jbF1yq_diffList",
1395
+ "importModalBody": "jbF1yq_importModalBody",
1396
+ "importField": "jbF1yq_importField",
1397
+ "assetCard": "jbF1yq_assetCard",
1419
1398
  "wsPageHeader": "jbF1yq_wsPageHeader",
1420
- "chWorkToolActions": "jbF1yq_chWorkToolActions",
1421
- "contentDrawer": "jbF1yq_contentDrawer",
1422
- "assetCardFooter": "jbF1yq_assetCardFooter",
1423
- "wfTop": "jbF1yq_wfTop",
1424
- "outlineH": "jbF1yq_outlineH",
1425
- "readerChapterTitle": "jbF1yq_readerChapterTitle",
1426
- "toolStepError": "jbF1yq_toolStepError",
1427
- "chWorkPickBtns": "jbF1yq_chWorkPickBtns",
1428
- "chapter": "jbF1yq_chapter",
1429
- "runChip": "jbF1yq_runChip",
1430
- "readerItemActive": "jbF1yq_readerItemActive",
1431
- "toolStep": "jbF1yq_toolStep",
1432
- "wfToolAmber": "jbF1yq_wfToolAmber",
1433
- "t2RailMeta": "jbF1yq_t2RailMeta",
1434
- "wfRsNo": "jbF1yq_wfRsNo",
1435
- "settingsDrawerBody": "jbF1yq_settingsDrawerBody",
1436
- "badgePending": "jbF1yq_badgePending",
1437
- "importFileInfo": "jbF1yq_importFileInfo",
1438
- "chatScroll": "jbF1yq_chatScroll",
1439
- "assetEditorRow": "jbF1yq_assetEditorRow",
1440
- "wfPillDot": "jbF1yq_wfPillDot",
1399
+ "authorTopNav": "jbF1yq_authorTopNav",
1400
+ "wbIndexRow": "jbF1yq_wbIndexRow",
1401
+ "pulse": "jbF1yq_pulse",
1402
+ "assetTextarea": "jbF1yq_assetTextarea",
1441
1403
  "diffDel": "jbF1yq_diffDel",
1442
- "pageHeaderEyebrow": "jbF1yq_pageHeaderEyebrow",
1443
- "planTreeSearch": "jbF1yq_planTreeSearch",
1404
+ "wfBoxH": "jbF1yq_wfBoxH",
1405
+ "wfRs": "jbF1yq_wfRs",
1406
+ "pillNavSlider": "jbF1yq_pillNavSlider",
1407
+ "card": "jbF1yq_card",
1444
1408
  "wfSep": "jbF1yq_wfSep",
1445
- "diffOld": "jbF1yq_diffOld",
1446
- "topNav": "jbF1yq_topNav",
1447
- "badgeRejected": "jbF1yq_badgeRejected",
1448
- "wsSelectedText": "jbF1yq_wsSelectedText",
1449
- "iconButton": "jbF1yq_iconButton",
1450
- "shelfToolbar": "jbF1yq_shelfToolbar",
1451
- "adaptImpact": "jbF1yq_adaptImpact",
1452
- "wfMetrics": "jbF1yq_wfMetrics",
1453
- "wfPoolBar": "jbF1yq_wfPoolBar",
1454
- "wfOpsRow": "jbF1yq_wfOpsRow",
1455
- "headChip": "jbF1yq_headChip",
1456
- "coverPreview": "jbF1yq_coverPreview",
1457
- "assistantStatusBusy": "jbF1yq_assistantStatusBusy",
1458
- "entryLabel": "jbF1yq_entryLabel",
1459
- "pulse": "jbF1yq_pulse",
1409
+ "toolStepName": "jbF1yq_toolStepName",
1460
1410
  "bookCardProgressBar": "jbF1yq_bookCardProgressBar",
1461
- "pageHeaderSub": "jbF1yq_pageHeaderSub",
1462
- "chWork": "jbF1yq_chWork",
1411
+ "assetEditorRow": "jbF1yq_assetEditorRow",
1463
1412
  "cardTitle": "jbF1yq_cardTitle",
1464
- "readerSeg": "jbF1yq_readerSeg",
1465
- "panelNavCollapsed": "jbF1yq_panelNavCollapsed",
1466
- "runLogLine": "jbF1yq_runLogLine",
1467
- "onlyChanges": "jbF1yq_onlyChanges",
1468
- "diffList": "jbF1yq_diffList",
1469
- "pageHeaderActions": "jbF1yq_pageHeaderActions",
1470
- "pillNavSliding": "jbF1yq_pillNavSliding",
1471
- "readerGroupArrow": "jbF1yq_readerGroupArrow",
1472
- "toolLive": "jbF1yq_toolLive",
1473
- "adaptTable": "jbF1yq_adaptTable",
1474
- "authorTopTabs": "jbF1yq_authorTopTabs",
1475
- "buttonDanger": "jbF1yq_buttonDanger",
1476
- "wsPreview": "jbF1yq_wsPreview",
1477
- "diffNew": "jbF1yq_diffNew",
1478
- "authorContent": "jbF1yq_authorContent",
1479
- "pillNav": "jbF1yq_pillNav",
1480
- "bookCardBody": "jbF1yq_bookCardBody",
1481
- "topNavSpacer": "jbF1yq_topNavSpacer",
1482
- "noticeError": "jbF1yq_noticeError",
1483
- "assetEditor": "jbF1yq_assetEditor",
1484
- "progress": "jbF1yq_progress",
1485
- "bookCardName": "jbF1yq_bookCardName",
1486
- "eyebrow": "jbF1yq_eyebrow",
1487
- "authorNav": "jbF1yq_authorNav",
1488
- "assistantFloatHeader": "jbF1yq_assistantFloatHeader",
1489
- "button": "jbF1yq_button",
1490
- "wfEmpty": "jbF1yq_wfEmpty",
1491
- "emptyStateTitle": "jbF1yq_emptyStateTitle",
1492
- "toolStepActive": "jbF1yq_toolStepActive",
1493
- "planTreeRowNo": "jbF1yq_planTreeRowNo",
1413
+ "wfPsLegend": "jbF1yq_wfPsLegend",
1414
+ "planTreeSearch": "jbF1yq_planTreeSearch",
1415
+ "entryIcon": "jbF1yq_entryIcon",
1416
+ "wfQtTone": "jbF1yq_wfQtTone",
1417
+ "active": "jbF1yq_active",
1418
+ "outlineTableWrap": "jbF1yq_outlineTableWrap",
1419
+ "cmdEmpty": "jbF1yq_cmdEmpty",
1420
+ "wfPsLab": "jbF1yq_wfPsLab",
1421
+ "wfMetricWide": "jbF1yq_wfMetricWide",
1422
+ "toolStepStatus": "jbF1yq_toolStepStatus",
1423
+ "planTree": "jbF1yq_planTree",
1424
+ "wbIndexTitle": "jbF1yq_wbIndexTitle",
1425
+ "notice-info": "jbF1yq_notice-info",
1426
+ "wfMetric": "jbF1yq_wfMetric",
1427
+ "bookCardCoverFallback": "jbF1yq_bookCardCoverFallback",
1428
+ "wsColumns": "jbF1yq_wsColumns",
1429
+ "readerItem": "jbF1yq_readerItem",
1430
+ "wfSigGood": "jbF1yq_wfSigGood",
1431
+ "wfCn": "jbF1yq_wfCn",
1432
+ "adaptTableScroll": "jbF1yq_adaptTableScroll",
1433
+ "importModalTabs": "jbF1yq_importModalTabs",
1434
+ "nfChipPulse": "jbF1yq_nfChipPulse",
1435
+ "topNavBtn": "jbF1yq_topNavBtn",
1436
+ "headChip": "jbF1yq_headChip",
1437
+ "outlineH4": "jbF1yq_outlineH4",
1438
+ "outlineLi": "jbF1yq_outlineLi",
1439
+ "dropzoneIcon": "jbF1yq_dropzoneIcon",
1440
+ "wfPreviewActs": "jbF1yq_wfPreviewActs",
1441
+ "drawerHead": "jbF1yq_drawerHead",
1442
+ "wfRail": "jbF1yq_wfRail",
1443
+ "noticeBtn": "jbF1yq_noticeBtn",
1444
+ "outlineP": "jbF1yq_outlineP",
1445
+ "assistantFloatBody": "jbF1yq_assistantFloatBody",
1446
+ "ideaToggle": "jbF1yq_ideaToggle",
1447
+ "subPageBack": "jbF1yq_subPageBack",
1448
+ "textarea": "jbF1yq_textarea",
1449
+ "progressLineError": "jbF1yq_progressLineError",
1494
1450
  "readerArticle": "jbF1yq_readerArticle",
1495
- "chatBubbleUser": "jbF1yq_chatBubbleUser",
1496
- "wfSig": "jbF1yq_wfSig",
1497
- "dropzone": "jbF1yq_dropzone",
1498
- "navGroup": "jbF1yq_navGroup",
1499
- "importPreviewList": "jbF1yq_importPreviewList",
1500
- "assetGroups": "jbF1yq_assetGroups",
1501
- "readerSegActive": "jbF1yq_readerSegActive",
1502
- "progressLineLive": "jbF1yq_progressLineLive",
1451
+ "importModal": "jbF1yq_importModal",
1503
1452
  "runLogTime": "jbF1yq_runLogTime",
1504
- "wfAct": "jbF1yq_wfAct",
1505
- "outlineP": "jbF1yq_outlineP",
1506
- "assetKind": "jbF1yq_assetKind",
1507
- "bookCardTitleRow": "jbF1yq_bookCardTitleRow",
1508
- "assetTextarea": "jbF1yq_assetTextarea",
1453
+ "brand": "jbF1yq_brand",
1454
+ "topNavActive": "jbF1yq_topNavActive",
1455
+ "wfTool": "jbF1yq_wfTool",
1456
+ "wfDone": "jbF1yq_wfDone",
1457
+ "readerTitle": "jbF1yq_readerTitle",
1458
+ "wfNow": "jbF1yq_wfNow",
1459
+ "wfMetricSpark": "jbF1yq_wfMetricSpark",
1460
+ "cmdBox": "jbF1yq_cmdBox",
1461
+ "confirmCard": "jbF1yq_confirmCard",
1462
+ "cmdInput": "jbF1yq_cmdInput",
1509
1463
  "adaptMatrix": "jbF1yq_adaptMatrix",
1510
- "subPageMeta": "jbF1yq_subPageMeta",
1511
- "drawerTitle": "jbF1yq_drawerTitle",
1512
- "readerText": "jbF1yq_readerText",
1513
- "bigProgressBar": "jbF1yq_bigProgressBar",
1514
- "fileList": "jbF1yq_fileList",
1464
+ "runChipDot": "jbF1yq_runChipDot",
1465
+ "topNavNi": "jbF1yq_topNavNi",
1466
+ "wfDrawerList": "jbF1yq_wfDrawerList",
1467
+ "confirmTitle": "jbF1yq_confirmTitle",
1468
+ "wfCoord": "jbF1yq_wfCoord",
1469
+ "wfSigRight": "jbF1yq_wfSigRight",
1470
+ "navTab": "jbF1yq_navTab",
1471
+ "chWorkToolActions": "jbF1yq_chWorkToolActions",
1472
+ "wfBox": "jbF1yq_wfBox",
1473
+ "assistantStatus": "jbF1yq_assistantStatus",
1474
+ "confirmBody": "jbF1yq_confirmBody",
1515
1475
  "tnum": "jbF1yq_tnum",
1516
- "wfEmpty2": "jbF1yq_wfEmpty2",
1517
- "outlineVol": "jbF1yq_outlineVol",
1518
- "panelBody": "jbF1yq_panelBody",
1519
- "chWorkSide": "jbF1yq_chWorkSide",
1520
- "wfCoordStuck": "jbF1yq_wfCoordStuck",
1521
- "drawerHead": "jbF1yq_drawerHead",
1522
- "badgeGenerating": "jbF1yq_badgeGenerating",
1523
- "settingsCard": "jbF1yq_settingsCard",
1476
+ "planTreeRow": "jbF1yq_planTreeRow",
1477
+ "authorPageHeader": "jbF1yq_authorPageHeader",
1478
+ "noticeText": "jbF1yq_noticeText",
1479
+ "wfToolBlue": "jbF1yq_wfToolBlue",
1480
+ "navTitle": "jbF1yq_navTitle",
1481
+ "wsPreview": "jbF1yq_wsPreview",
1482
+ "outlineCodeLang": "jbF1yq_outlineCodeLang",
1483
+ "readerSegBtn": "jbF1yq_readerSegBtn",
1484
+ "planDetailBar": "jbF1yq_planDetailBar",
1485
+ "wfSmallFoot": "jbF1yq_wfSmallFoot",
1486
+ "wfDrawerBox": "jbF1yq_wfDrawerBox",
1487
+ "noticeIcon": "jbF1yq_noticeIcon",
1488
+ "shelfSearch": "jbF1yq_shelfSearch",
1489
+ "authorHome": "jbF1yq_authorHome",
1490
+ "toolStepDetail": "jbF1yq_toolStepDetail",
1491
+ "wfConOk": "jbF1yq_wfConOk",
1492
+ "confirmGo": "jbF1yq_confirmGo",
1493
+ "emptyStateHint": "jbF1yq_emptyStateHint",
1494
+ "pageHeaderActions": "jbF1yq_pageHeaderActions",
1495
+ "toolStepError": "jbF1yq_toolStepError",
1496
+ "wfLiveChip": "jbF1yq_wfLiveChip",
1497
+ "chWork": "jbF1yq_chWork",
1498
+ "runLogLine": "jbF1yq_runLogLine",
1499
+ "pillNav": "jbF1yq_pillNav",
1500
+ "wfConsole": "jbF1yq_wfConsole",
1524
1501
  "brandName": "jbF1yq_brandName",
1525
- "assetCardContent": "jbF1yq_assetCardContent",
1526
- "wfTool": "jbF1yq_wfTool",
1527
- "chWorkBar": "jbF1yq_chWorkBar",
1528
- "entry": "jbF1yq_entry",
1529
- "createBookInner": "jbF1yq_createBookInner",
1530
- "importModalActions": "jbF1yq_importModalActions",
1531
- "bookCard": "jbF1yq_bookCard",
1532
- "nfToastIn": "jbF1yq_nfToastIn",
1533
- "wfColA": "jbF1yq_wfColA",
1534
- "topNavActive": "jbF1yq_topNavActive",
1535
- "bookCardCoverFallback": "jbF1yq_bookCardCoverFallback",
1536
- "wfDrawerList": "jbF1yq_wfDrawerList",
1537
- "legendOld": "jbF1yq_legendOld",
1538
- "adaptOutlinePre": "jbF1yq_adaptOutlinePre",
1539
- "progressBar": "jbF1yq_progressBar",
1540
- "toolStepName": "jbF1yq_toolStepName",
1541
- "shelfToolbarExtra": "jbF1yq_shelfToolbarExtra",
1542
- "coverPlaceholder": "jbF1yq_coverPlaceholder",
1543
- "card": "jbF1yq_card",
1544
- "chatRole": "jbF1yq_chatRole",
1502
+ "dimCardSelected": "jbF1yq_dimCardSelected",
1545
1503
  "iconBtn": "jbF1yq_iconBtn",
1546
- "docsSurface": "jbF1yq_docsSurface",
1547
- "panelContent": "jbF1yq_panelContent",
1548
- "navTitleName": "jbF1yq_navTitleName",
1549
- "importError": "jbF1yq_importError",
1550
- "panelTitle": "jbF1yq_panelTitle",
1551
- "dimCard": "jbF1yq_dimCard",
1552
- "statCardDDetail": "jbF1yq_statCardDDetail",
1553
- "wfPoolWrap": "jbF1yq_wfPoolWrap",
1554
- "planTreeVol": "jbF1yq_planTreeVol",
1555
- "readerGroup": "jbF1yq_readerGroup",
1556
- "wfLiveMark": "jbF1yq_wfLiveMark",
1557
- "t2RailSep": "jbF1yq_t2RailSep",
1558
- "wfCmd": "jbF1yq_wfCmd",
1559
- "bookCardCoverTitle": "jbF1yq_bookCardCoverTitle",
1560
- "readerGroupTitle": "jbF1yq_readerGroupTitle",
1561
- "outlineH3": "jbF1yq_outlineH3",
1562
- "noticeSuccess": "jbF1yq_noticeSuccess",
1563
- "nfToastTick": "jbF1yq_nfToastTick",
1504
+ "brandLogo": "jbF1yq_brandLogo",
1505
+ "outlineTable": "jbF1yq_outlineTable",
1506
+ "confirmHead": "jbF1yq_confirmHead",
1507
+ "brandSub": "jbF1yq_brandSub",
1508
+ "subPageTitle": "jbF1yq_subPageTitle",
1509
+ "bookCardName": "jbF1yq_bookCardName",
1510
+ "chWorkMain": "jbF1yq_chWorkMain",
1511
+ "chWorkSideBody": "jbF1yq_chWorkSideBody",
1512
+ "panelHidden": "jbF1yq_panelHidden",
1513
+ "adaptRules": "jbF1yq_adaptRules",
1514
+ "planDot": "jbF1yq_planDot",
1515
+ "badgeGenerating": "jbF1yq_badgeGenerating",
1516
+ "switch": "jbF1yq_switch",
1517
+ "wfProgBig": "jbF1yq_wfProgBig",
1564
1518
  "wfConRow": "jbF1yq_wfConRow",
1565
- "bookshelf": "jbF1yq_bookshelf",
1566
- "subPageBack": "jbF1yq_subPageBack",
1567
- "shelfEmpty": "jbF1yq_shelfEmpty",
1568
- "assetLabel": "jbF1yq_assetLabel",
1569
- "chatBubbleAssistant": "jbF1yq_chatBubbleAssistant",
1570
- "dimCardSelected": "jbF1yq_dimCardSelected",
1571
- "outlineH1": "jbF1yq_outlineH1",
1572
- "adaptCell": "jbF1yq_adaptCell",
1573
- "importField": "jbF1yq_importField",
1574
- "adaptTextarea": "jbF1yq_adaptTextarea",
1519
+ "chWorkText": "jbF1yq_chWorkText",
1520
+ "notice-warn": "jbF1yq_notice-warn",
1521
+ "wfDot": "jbF1yq_wfDot",
1522
+ "chapterTitle": "jbF1yq_chapterTitle",
1523
+ "dimTitle": "jbF1yq_dimTitle",
1524
+ "pageHeaderMain": "jbF1yq_pageHeaderMain",
1525
+ "drawerTitleNi": "jbF1yq_drawerTitleNi",
1526
+ "wfOpsBtn": "jbF1yq_wfOpsBtn",
1527
+ "nfToastTick": "jbF1yq_nfToastTick",
1528
+ "readerGroup": "jbF1yq_readerGroup",
1529
+ "ideaCard": "jbF1yq_ideaCard",
1530
+ "nfpanel": "jbF1yq_nfpanel",
1531
+ "noticeError": "jbF1yq_noticeError",
1532
+ "diffSameBody": "jbF1yq_diffSameBody",
1533
+ "statCardDDetail": "jbF1yq_statCardDDetail",
1534
+ "rowBetween": "jbF1yq_rowBetween",
1535
+ "contentDrawer": "jbF1yq_contentDrawer",
1536
+ "input": "jbF1yq_input",
1537
+ "diffColumn": "jbF1yq_diffColumn",
1538
+ "outlineVolSummary": "jbF1yq_outlineVolSummary",
1539
+ "assistantFloatHeader": "jbF1yq_assistantFloatHeader",
1540
+ "dimEdit": "jbF1yq_dimEdit",
1575
1541
  "settingsDrawerHead": "jbF1yq_settingsDrawerHead",
1576
- "importPreview": "jbF1yq_importPreview",
1577
- "wfQtTone": "jbF1yq_wfQtTone",
1578
- "outlineLi": "jbF1yq_outlineLi",
1579
1542
  "bookCardActions": "jbF1yq_bookCardActions",
1580
- "wfRail": "jbF1yq_wfRail",
1581
- "assistantFloatBody": "jbF1yq_assistantFloatBody",
1582
1543
  "chWorkTitle": "jbF1yq_chWorkTitle",
1583
- "wfPsLab": "jbF1yq_wfPsLab",
1584
- "wfConErr": "jbF1yq_wfConErr",
1585
- "wfTopRight": "jbF1yq_wfTopRight",
1586
- "brandText": "jbF1yq_brandText",
1587
- "wfRs": "jbF1yq_wfRs",
1588
- "outlineList": "jbF1yq_outlineList",
1589
- "textarea": "jbF1yq_textarea",
1590
- "panelHidden": "jbF1yq_panelHidden",
1591
- "outlineCodeBlock": "jbF1yq_outlineCodeBlock",
1592
- "outlineQuote": "jbF1yq_outlineQuote",
1593
- "t2Rail": "jbF1yq_t2Rail",
1594
- "brandLogo": "jbF1yq_brandLogo",
1595
- "bookCardMetaRow": "jbF1yq_bookCardMetaRow",
1596
- "nfToastHost": "jbF1yq_nfToastHost",
1597
- "topNavBtn": "jbF1yq_topNavBtn",
1598
- "brand": "jbF1yq_brand",
1599
- "numSerif": "jbF1yq_numSerif",
1600
- "shelfGrid": "jbF1yq_shelfGrid",
1601
- "importHint": "jbF1yq_importHint",
1602
- "runChipDot": "jbF1yq_runChipDot",
1603
- "buttonSmall": "jbF1yq_buttonSmall",
1604
- "toolStepDetail": "jbF1yq_toolStepDetail",
1605
- "planDetail": "jbF1yq_planDetail",
1606
- "pillNavSlider": "jbF1yq_pillNavSlider",
1607
- "drawerSpacer": "jbF1yq_drawerSpacer",
1544
+ "panelTitle": "jbF1yq_panelTitle",
1545
+ "adaptTextarea": "jbF1yq_adaptTextarea",
1546
+ "outlineToc": "jbF1yq_outlineToc",
1547
+ "panelContent": "jbF1yq_panelContent",
1548
+ "adaptOutline": "jbF1yq_adaptOutline",
1549
+ "importModalActions": "jbF1yq_importModalActions",
1550
+ "chatBubbleUser": "jbF1yq_chatBubbleUser",
1551
+ "wfPs": "jbF1yq_wfPs",
1552
+ "wfDlName": "jbF1yq_wfDlName",
1553
+ "wfFt": "jbF1yq_wfFt",
1554
+ "wfFi": "jbF1yq_wfFi",
1555
+ "wfStFail": "jbF1yq_wfStFail",
1556
+ "readerSeg": "jbF1yq_readerSeg",
1557
+ "importResult": "jbF1yq_importResult",
1558
+ "assetGroup": "jbF1yq_assetGroup",
1559
+ "wfPreview": "jbF1yq_wfPreview",
1560
+ "outlineDoc": "jbF1yq_outlineDoc",
1561
+ "chapterFocusPulse": "jbF1yq_chapterFocusPulse",
1562
+ "wfMetrics": "jbF1yq_wfMetrics",
1563
+ "readerFoot": "jbF1yq_readerFoot",
1564
+ "confirmIcon": "jbF1yq_confirmIcon",
1565
+ "chWorkAsideBody": "jbF1yq_chWorkAsideBody",
1566
+ "readerError": "jbF1yq_readerError",
1567
+ "bookCardCover": "jbF1yq_bookCardCover",
1568
+ "readerGroupTitle": "jbF1yq_readerGroupTitle",
1569
+ "wfPsN": "jbF1yq_wfPsN",
1570
+ "wfCmdBtn": "jbF1yq_wfCmdBtn",
1571
+ "noticeBar": "jbF1yq_noticeBar",
1572
+ "progress": "jbF1yq_progress",
1573
+ "navAboutRow": "jbF1yq_navAboutRow",
1574
+ "nfConfirmIn": "jbF1yq_nfConfirmIn",
1575
+ "nfDrawerIn": "jbF1yq_nfDrawerIn",
1576
+ "badgeError": "jbF1yq_badgeError",
1577
+ "cmdMask": "jbF1yq_cmdMask",
1578
+ "bookshelf": "jbF1yq_bookshelf",
1579
+ "adaptRuleRow": "jbF1yq_adaptRuleRow",
1580
+ "t2RailBtn": "jbF1yq_t2RailBtn",
1581
+ "wfDlDi": "jbF1yq_wfDlDi",
1608
1582
  "wfProgRest": "jbF1yq_wfProgRest",
1609
- "settingsDrawerOverlay": "jbF1yq_settingsDrawerOverlay",
1610
- "importModalHead": "jbF1yq_importModalHead",
1611
- "pillNavPill": "jbF1yq_pillNavPill",
1612
- "wfDone": "jbF1yq_wfDone",
1613
- "adaptInputCard": "jbF1yq_adaptInputCard",
1614
- "diffLegend": "jbF1yq_diffLegend",
1615
- "importModalBody": "jbF1yq_importModalBody",
1616
- "chapterTitle": "jbF1yq_chapterTitle",
1617
- "navTitleBook": "jbF1yq_navTitleBook",
1618
- "wfBox": "jbF1yq_wfBox",
1619
- "wfFeedList": "jbF1yq_wfFeedList",
1620
- "wfProgBig": "jbF1yq_wfProgBig",
1621
- "chWorkAsideTitle": "jbF1yq_chWorkAsideTitle",
1583
+ "importPreview": "jbF1yq_importPreview",
1584
+ "entry": "jbF1yq_entry",
1585
+ "importFileInfo": "jbF1yq_importFileInfo",
1586
+ "outlineHr": "jbF1yq_outlineHr",
1587
+ "wfPreviewName": "jbF1yq_wfPreviewName",
1588
+ "buttonPrimary": "jbF1yq_buttonPrimary",
1589
+ "t2Content": "jbF1yq_t2Content",
1590
+ "subPageActions": "jbF1yq_subPageActions",
1591
+ "wfQt": "jbF1yq_wfQt",
1592
+ "wbIndexVol": "jbF1yq_wbIndexVol",
1593
+ "wfAct": "jbF1yq_wfAct",
1594
+ "aiTag": "jbF1yq_aiTag",
1595
+ "entryLabel": "jbF1yq_entryLabel",
1596
+ "readerHeader": "jbF1yq_readerHeader",
1622
1597
  "row": "jbF1yq_row",
1623
- "wfStRev": "jbF1yq_wfStRev",
1624
- "wsAppliedBanner": "jbF1yq_wsAppliedBanner",
1625
- "chWorkDraftBar": "jbF1yq_chWorkDraftBar",
1626
- "outlineCode": "jbF1yq_outlineCode",
1627
- "readerGroupCount": "jbF1yq_readerGroupCount",
1628
- "entryIcon": "jbF1yq_entryIcon",
1629
- "diffChange": "jbF1yq_diffChange",
1630
- "adaptTableScroll": "jbF1yq_adaptTableScroll",
1631
- "planDetailBody": "jbF1yq_planDetailBody",
1632
- "nfSlideInRight": "jbF1yq_nfSlideInRight",
1633
- "readerLoading": "jbF1yq_readerLoading",
1634
- "cmdInput": "jbF1yq_cmdInput",
1635
- "wsEditor": "jbF1yq_wsEditor",
1636
- "dimCurrent": "jbF1yq_dimCurrent",
1637
- "navAboutUpdate": "jbF1yq_navAboutUpdate",
1638
- "adaptOutline": "jbF1yq_adaptOutline",
1639
- "brandSub": "jbF1yq_brandSub",
1640
- "assetCardName": "jbF1yq_assetCardName",
1641
- "wfPreviewActs": "jbF1yq_wfPreviewActs",
1598
+ "shelfEmpty": "jbF1yq_shelfEmpty",
1599
+ "assetCardTop": "jbF1yq_assetCardTop",
1600
+ "chatBubbleAssistant": "jbF1yq_chatBubbleAssistant",
1601
+ "pillNavSliding": "jbF1yq_pillNavSliding",
1602
+ "segTab": "jbF1yq_segTab",
1603
+ "runLog": "jbF1yq_runLog",
1604
+ "progressBarFill": "jbF1yq_progressBarFill",
1605
+ "cardHead": "jbF1yq_cardHead",
1606
+ "panelBody": "jbF1yq_panelBody",
1607
+ "contentDrawerBody": "jbF1yq_contentDrawerBody",
1608
+ "navTitleName": "jbF1yq_navTitleName",
1609
+ "chatScroll": "jbF1yq_chatScroll",
1610
+ "shelfGrid": "jbF1yq_shelfGrid",
1611
+ "diffTagNew": "jbF1yq_diffTagNew",
1612
+ "wfFdotErr": "jbF1yq_wfFdotErr",
1613
+ "brandEn": "jbF1yq_brandEn",
1614
+ "pageHeaderTitle": "jbF1yq_pageHeaderTitle",
1615
+ "confirmAssurance": "jbF1yq_confirmAssurance",
1616
+ "badgeRejected": "jbF1yq_badgeRejected",
1617
+ "t2RailSep": "jbF1yq_t2RailSep",
1618
+ "planBeats": "jbF1yq_planBeats",
1619
+ "confirmPhraseRow": "jbF1yq_confirmPhraseRow",
1642
1620
  "chWorkToolbar": "jbF1yq_chWorkToolbar",
1643
- "diffSameBody": "jbF1yq_diffSameBody",
1644
- "assetGrid": "jbF1yq_assetGrid",
1621
+ "chapter": "jbF1yq_chapter",
1622
+ "lfPill": "jbF1yq_lfPill",
1623
+ "adaptTable": "jbF1yq_adaptTable",
1624
+ "outlineTocItem": "jbF1yq_outlineTocItem",
1625
+ "outlineVol": "jbF1yq_outlineVol",
1626
+ "panel": "jbF1yq_panel",
1627
+ "coverPlaceholder": "jbF1yq_coverPlaceholder",
1628
+ "readerItemTitle": "jbF1yq_readerItemTitle",
1629
+ "wfDlDim": "jbF1yq_wfDlDim",
1630
+ "noticeBody": "jbF1yq_noticeBody",
1631
+ "planTreeRowNo": "jbF1yq_planTreeRowNo",
1632
+ "cmdHint": "jbF1yq_cmdHint",
1633
+ "chapterPreview": "jbF1yq_chapterPreview",
1634
+ "navAboutUpdate": "jbF1yq_navAboutUpdate",
1635
+ "shelfEmptyIcon": "jbF1yq_shelfEmptyIcon",
1636
+ "readerLoading": "jbF1yq_readerLoading",
1637
+ "panelNavCollapsed": "jbF1yq_panelNavCollapsed",
1638
+ "wsPage": "jbF1yq_wsPage",
1639
+ "chWorkPickBar": "jbF1yq_chWorkPickBar",
1640
+ "lfDot": "jbF1yq_lfDot",
1641
+ "wfAccentBlue": "jbF1yq_wfAccentBlue",
1642
+ "topNavBadge": "jbF1yq_topNavBadge",
1643
+ "planTreeVol": "jbF1yq_planTreeVol",
1644
+ "readerText": "jbF1yq_readerText",
1645
+ "wfPillDot": "jbF1yq_wfPillDot",
1646
+ "confirmAckRow": "jbF1yq_confirmAckRow",
1647
+ "nfToast": "jbF1yq_nfToast",
1648
+ "wfConBar": "jbF1yq_wfConBar",
1649
+ "emptyStateTitle": "jbF1yq_emptyStateTitle",
1650
+ "readerItemNo": "jbF1yq_readerItemNo",
1651
+ "cardHeadNote": "jbF1yq_cardHeadNote",
1652
+ "tab": "jbF1yq_tab",
1653
+ "progressLine": "jbF1yq_progressLine",
1654
+ "outlineTocL3": "jbF1yq_outlineTocL3",
1655
+ "outlineCodeBlock": "jbF1yq_outlineCodeBlock",
1656
+ "wfConTxt": "jbF1yq_wfConTxt",
1657
+ "t2RailHead": "jbF1yq_t2RailHead",
1658
+ "wfBook": "jbF1yq_wfBook",
1659
+ "noticeDetail": "jbF1yq_noticeDetail",
1660
+ "toolLive": "jbF1yq_toolLive",
1661
+ "outlineEdit": "jbF1yq_outlineEdit",
1662
+ "bookCardBlurb": "jbF1yq_bookCardBlurb",
1663
+ "cardHeadActions": "jbF1yq_cardHeadActions",
1664
+ "reviewBox": "jbF1yq_reviewBox",
1665
+ "subPageHead": "jbF1yq_subPageHead",
1666
+ "shelfStatGrid": "jbF1yq_shelfStatGrid",
1667
+ "planTreeRowTitle": "jbF1yq_planTreeRowTitle",
1668
+ "shelfToolbarExtra": "jbF1yq_shelfToolbarExtra",
1669
+ "t2Master": "jbF1yq_t2Master",
1670
+ "wfCoordStuck": "jbF1yq_wfCoordStuck",
1671
+ "nfCmdPop": "jbF1yq_nfCmdPop",
1672
+ "dimCard": "jbF1yq_dimCard",
1673
+ "importPreviewList": "jbF1yq_importPreviewList",
1674
+ "bookCardCoverTitle": "jbF1yq_bookCardCoverTitle",
1675
+ "bigProgressBarFill": "jbF1yq_bigProgressBarFill",
1645
1676
  "ideaCandidate": "jbF1yq_ideaCandidate",
1646
- "wsSelected": "jbF1yq_wsSelected",
1647
- "wfPreviewLine": "jbF1yq_wfPreviewLine",
1677
+ "authorTopTabs": "jbF1yq_authorTopTabs",
1678
+ "badgeWritten": "jbF1yq_badgeWritten",
1679
+ "panelTop": "jbF1yq_panelTop",
1680
+ "navTitleLogo": "jbF1yq_navTitleLogo",
1681
+ "wfCmd": "jbF1yq_wfCmd",
1682
+ "rowBetweenWrap": "jbF1yq_rowBetweenWrap",
1683
+ "t2RailMeta": "jbF1yq_t2RailMeta",
1684
+ "titleBlock": "jbF1yq_titleBlock",
1685
+ "adaptInputCard": "jbF1yq_adaptInputCard",
1686
+ "wfToolAmber": "jbF1yq_wfToolAmber",
1687
+ "wfRsNo": "jbF1yq_wfRsNo",
1688
+ "wfLiveMark": "jbF1yq_wfLiveMark",
1689
+ "cardHeadLeft": "jbF1yq_cardHeadLeft",
1690
+ "chWorkFootRow": "jbF1yq_chWorkFootRow",
1691
+ "headSpacer": "jbF1yq_headSpacer",
1692
+ "authorPageBodyFlow": "jbF1yq_authorPageBodyFlow",
1693
+ "wsEditor": "jbF1yq_wsEditor",
1694
+ "wfSig": "jbF1yq_wfSig",
1695
+ "importHint": "jbF1yq_importHint",
1696
+ "assetFilterChipActive": "jbF1yq_assetFilterChipActive",
1697
+ "authorContent": "jbF1yq_authorContent",
1698
+ "pillNavPill": "jbF1yq_pillNavPill",
1699
+ "wfBlink": "jbF1yq_wfBlink",
1700
+ "runChip": "jbF1yq_runChip",
1701
+ "wfRailWrap": "jbF1yq_wfRailWrap",
1702
+ "wfProg": "jbF1yq_wfProg",
1703
+ "wfPl": "jbF1yq_wfPl",
1704
+ "drawerScrim": "jbF1yq_drawerScrim",
1648
1705
  "subPageBody": "jbF1yq_subPageBody",
1649
- "runChipText": "jbF1yq_runChipText",
1706
+ "wfDrawerToggle": "jbF1yq_wfDrawerToggle",
1707
+ "coverPreview": "jbF1yq_coverPreview",
1708
+ "busyRow": "jbF1yq_busyRow",
1709
+ "chWorkPickBtns": "jbF1yq_chWorkPickBtns",
1710
+ "t2Rail": "jbF1yq_t2Rail",
1711
+ "chapterFocus": "jbF1yq_chapterFocus",
1712
+ "wsSelectedText": "jbF1yq_wsSelectedText",
1713
+ "nfToastOut": "jbF1yq_nfToastOut",
1650
1714
  "diffText": "jbF1yq_diffText",
1651
- "assistantStatus": "jbF1yq_assistantStatus",
1652
- "pageHeaderMain": "jbF1yq_pageHeaderMain",
1653
- "wfPsN": "jbF1yq_wfPsN",
1654
- "bigProgressBarFill": "jbF1yq_bigProgressBarFill",
1655
- "active": "jbF1yq_active",
1715
+ "wfOpsBtnMain": "jbF1yq_wfOpsBtnMain",
1716
+ "wfStRev": "jbF1yq_wfStRev",
1717
+ "wfPill": "jbF1yq_wfPill",
1718
+ "wfFdot": "jbF1yq_wfFdot",
1719
+ "panelHead": "jbF1yq_panelHead",
1720
+ "topNav": "jbF1yq_topNav",
1721
+ "wfEmpty": "jbF1yq_wfEmpty",
1656
1722
  "chapterMain": "jbF1yq_chapterMain",
1657
- "view": "jbF1yq_view",
1658
- "topNavBadge": "jbF1yq_topNavBadge",
1659
- "field": "jbF1yq_field",
1660
- "wfBook": "jbF1yq_wfBook",
1661
- "wfToolBlue": "jbF1yq_wfToolBlue",
1662
- "authorHome": "jbF1yq_authorHome",
1663
- "chWorkSideFoot": "jbF1yq_chWorkSideFoot",
1664
- "aiTag": "jbF1yq_aiTag",
1665
- "assetGroupHeader": "jbF1yq_assetGroupHeader",
1666
- "outlineToc": "jbF1yq_outlineToc",
1667
- "outlineVolSummary": "jbF1yq_outlineVolSummary",
1668
- "shelfHero": "jbF1yq_shelfHero",
1669
- "t2RailBtn": "jbF1yq_t2RailBtn",
1723
+ "docsSurface": "jbF1yq_docsSurface",
1724
+ "wfHint": "jbF1yq_wfHint",
1670
1725
  "drawerMax": "jbF1yq_drawerMax",
1671
- "wsPage": "jbF1yq_wsPage",
1672
- "adaptResult": "jbF1yq_adaptResult",
1673
- "planDot": "jbF1yq_planDot",
1674
- "outlineTable": "jbF1yq_outlineTable",
1726
+ "topNavLabel": "jbF1yq_topNavLabel",
1727
+ "nfToastHost": "jbF1yq_nfToastHost",
1728
+ "wfFdotOk": "jbF1yq_wfFdotOk",
1729
+ "authorNav": "jbF1yq_authorNav",
1730
+ "chWorkSide": "jbF1yq_chWorkSide",
1731
+ "shelfStatCard": "jbF1yq_shelfStatCard",
1732
+ "assetCardFooter": "jbF1yq_assetCardFooter",
1675
1733
  "readerMain": "jbF1yq_readerMain",
1676
- "diffAdd": "jbF1yq_diffAdd",
1677
- "titleBlock": "jbF1yq_titleBlock",
1678
- "wfProg": "jbF1yq_wfProg",
1679
- "planTreeVolMeta": "jbF1yq_planTreeVolMeta",
1680
- "wfDlName": "jbF1yq_wfDlName",
1681
- "wfSigBad": "jbF1yq_wfSigBad",
1682
- "wfCmdReason": "jbF1yq_wfCmdReason",
1683
- "chWorkText": "jbF1yq_chWorkText",
1734
+ "navTitleBook": "jbF1yq_navTitleBook",
1735
+ "view": "jbF1yq_view",
1736
+ "settingsDrawer": "jbF1yq_settingsDrawer",
1737
+ "outlineTocL1": "jbF1yq_outlineTocL1",
1738
+ "wfSw": "jbF1yq_wfSw",
1739
+ "statCardDValue": "jbF1yq_statCardDValue",
1740
+ "rowEnd": "jbF1yq_rowEnd",
1741
+ "diffSame": "jbF1yq_diffSame",
1742
+ "buttonSmall": "jbF1yq_buttonSmall",
1743
+ "outlineH1": "jbF1yq_outlineH1",
1744
+ "adaptCell": "jbF1yq_adaptCell",
1745
+ "meta": "jbF1yq_meta",
1746
+ "brandText": "jbF1yq_brandText",
1747
+ "subPage": "jbF1yq_subPage",
1748
+ "wfColB": "jbF1yq_wfColB",
1749
+ "wfPreviewLine": "jbF1yq_wfPreviewLine",
1750
+ "wfDl": "jbF1yq_wfDl",
1751
+ "progressLineDone": "jbF1yq_progressLineDone",
1684
1752
  "genreDesc": "jbF1yq_genreDesc",
1685
- "brandEn": "jbF1yq_brandEn",
1686
- "t2RailHead": "jbF1yq_t2RailHead",
1753
+ "planTreeVolMeta": "jbF1yq_planTreeVolMeta",
1754
+ "bigProgressBar": "jbF1yq_bigProgressBar",
1755
+ "navAbout": "jbF1yq_navAbout",
1687
1756
  "adaptProposal": "jbF1yq_adaptProposal",
1688
- "wfStFix": "jbF1yq_wfStFix",
1689
- "wfConsole": "jbF1yq_wfConsole",
1690
- "readerItem": "jbF1yq_readerItem",
1691
- "lfPill": "jbF1yq_lfPill",
1692
- "nfToast": "jbF1yq_nfToast",
1693
- "cmdEmpty": "jbF1yq_cmdEmpty",
1694
- "wfOpsBtnMain": "jbF1yq_wfOpsBtnMain",
1695
- "wfFdotOk": "jbF1yq_wfFdotOk",
1696
- "shelfEmptyTitle": "jbF1yq_shelfEmptyTitle",
1697
- "cmdItem": "jbF1yq_cmdItem",
1698
- "cmdIcon": "jbF1yq_cmdIcon",
1757
+ "fileList": "jbF1yq_fileList",
1758
+ "settingsCard": "jbF1yq_settingsCard",
1759
+ "nfFadeIn": "jbF1yq_nfFadeIn",
1760
+ "adaptImpact": "jbF1yq_adaptImpact",
1761
+ "buttonDanger": "jbF1yq_buttonDanger",
1762
+ "bookCard": "jbF1yq_bookCard",
1763
+ "badge": "jbF1yq_badge",
1764
+ "navBadgePulse": "jbF1yq_navBadgePulse",
1765
+ "settingsDrawerBody": "jbF1yq_settingsDrawerBody",
1766
+ "toolStep": "jbF1yq_toolStep",
1767
+ "assetCardContent": "jbF1yq_assetCardContent",
1699
1768
  "wfRow": "jbF1yq_wfRow",
1700
- "chWorkFootRow": "jbF1yq_chWorkFootRow",
1701
- "adaptRule": "jbF1yq_adaptRule",
1769
+ "cmdList": "jbF1yq_cmdList",
1770
+ "assistantFloat": "jbF1yq_assistantFloat",
1771
+ "readerItemBadge": "jbF1yq_readerItemBadge",
1772
+ "diffAdd": "jbF1yq_diffAdd",
1773
+ "wfColA": "jbF1yq_wfColA",
1774
+ "eyebrow": "jbF1yq_eyebrow",
1775
+ "toolStepIcon": "jbF1yq_toolStepIcon",
1702
1776
  "navGroupLabel": "jbF1yq_navGroupLabel",
1703
- "wfSignal": "jbF1yq_wfSignal",
1704
- "chWorkActions": "jbF1yq_chWorkActions",
1705
- "readerBody": "jbF1yq_readerBody",
1706
- "chWorkSideBody": "jbF1yq_chWorkSideBody",
1707
- "emptyStateIcon": "jbF1yq_emptyStateIcon",
1708
- "assetCardTop": "jbF1yq_assetCardTop",
1709
- "wbIndexTitle": "jbF1yq_wbIndexTitle",
1710
- "adaptRules": "jbF1yq_adaptRules",
1711
- "wfRsChk": "jbF1yq_wfRsChk",
1712
- "nfpanel": "jbF1yq_nfpanel",
1713
- "navAboutRow": "jbF1yq_navAboutRow",
1714
- "diffColumn": "jbF1yq_diffColumn",
1715
- "wfBoxH": "jbF1yq_wfBoxH",
1716
- "readerView": "jbF1yq_readerView",
1717
- "chWorkSideHead": "jbF1yq_chWorkSideHead",
1718
- "outlineDocWrap": "jbF1yq_outlineDocWrap",
1719
- "nfToastOut": "jbF1yq_nfToastOut",
1720
- "chapterFocus": "jbF1yq_chapterFocus",
1721
- "nfDrawerIn": "jbF1yq_nfDrawerIn",
1777
+ "bookCardTitleRow": "jbF1yq_bookCardTitleRow",
1778
+ "toolStepActive": "jbF1yq_toolStepActive",
1779
+ "planDetailBody": "jbF1yq_planDetailBody",
1780
+ "notice-error": "jbF1yq_notice-error",
1781
+ "legendNew": "jbF1yq_legendNew",
1782
+ "progressTotalBar": "jbF1yq_progressTotalBar",
1783
+ "planMaster": "jbF1yq_planMaster",
1784
+ "confirmList": "jbF1yq_confirmList",
1785
+ "outlineH": "jbF1yq_outlineH",
1786
+ "shelfEmptyTitle": "jbF1yq_shelfEmptyTitle",
1787
+ "shelfToolbar": "jbF1yq_shelfToolbar",
1788
+ "readerItemActive": "jbF1yq_readerItemActive",
1789
+ "planDetailEmpty": "jbF1yq_planDetailEmpty",
1790
+ "assetLabel": "jbF1yq_assetLabel",
1791
+ "nfSlideInRight": "jbF1yq_nfSlideInRight",
1792
+ "rowBetweenBaseline": "jbF1yq_rowBetweenBaseline",
1722
1793
  "readerPara": "jbF1yq_readerPara",
1723
- "wfBlink": "jbF1yq_wfBlink",
1724
- "busyRow": "jbF1yq_busyRow",
1725
- "navAbout": "jbF1yq_navAbout",
1726
- "lfDot": "jbF1yq_lfDot",
1727
- "chapterActions": "jbF1yq_chapterActions",
1728
- "wfLiveChip": "jbF1yq_wfLiveChip",
1729
- "wfFdotErr": "jbF1yq_wfFdotErr",
1730
- "assetCard": "jbF1yq_assetCard",
1731
1794
  "panelNav": "jbF1yq_panelNav",
1732
- "navSpacer": "jbF1yq_navSpacer",
1733
- "assetFilterChipActive": "jbF1yq_assetFilterChipActive",
1734
- "shelfSearch": "jbF1yq_shelfSearch",
1735
- "progressLineError": "jbF1yq_progressLineError",
1736
- "fadeIn": "jbF1yq_fadeIn",
1737
- "assetFilterChip": "jbF1yq_assetFilterChip",
1738
- "dropzoneActive": "jbF1yq_dropzoneActive",
1739
- "shelfEmptyIcon": "jbF1yq_shelfEmptyIcon",
1740
- "wfConTxt": "jbF1yq_wfConTxt",
1741
- "chWorkMain": "jbF1yq_chWorkMain",
1742
- "planBeats": "jbF1yq_planBeats",
1743
- "assistantFloat": "jbF1yq_assistantFloat",
1744
- "chWorkGrid": "jbF1yq_chWorkGrid",
1795
+ "assetKind": "jbF1yq_assetKind",
1796
+ "emptyStateIcon": "jbF1yq_emptyStateIcon",
1797
+ "adaptOutlinePre": "jbF1yq_adaptOutlinePre",
1798
+ "confirmText": "jbF1yq_confirmText",
1799
+ "wfTop": "jbF1yq_wfTop",
1745
1800
  "drawerHeadBtn": "jbF1yq_drawerHeadBtn",
1746
- "wfPreviewName": "jbF1yq_wfPreviewName",
1747
- "nfCmdPop": "jbF1yq_nfCmdPop",
1748
- "wfDlDim": "jbF1yq_wfDlDim",
1749
- "headSpacer": "jbF1yq_headSpacer",
1750
- "wfRsName": "jbF1yq_wfRsName",
1751
- "outlineTableWrap": "jbF1yq_outlineTableWrap",
1752
- "readerChapterMeta": "jbF1yq_readerChapterMeta",
1753
- "authorPageBodyFlow": "jbF1yq_authorPageBodyFlow",
1754
- "importModalOverlay": "jbF1yq_importModalOverlay",
1755
- "planMaster": "jbF1yq_planMaster",
1756
- "planTreeRowTitle": "jbF1yq_planTreeRowTitle",
1757
- "adaptRuleRow": "jbF1yq_adaptRuleRow",
1758
- "wfDrawerToggle": "jbF1yq_wfDrawerToggle",
1759
- "chWorkAsideBody": "jbF1yq_chWorkAsideBody",
1760
- "wfQt": "jbF1yq_wfQt",
1761
- "emptyStateHint": "jbF1yq_emptyStateHint",
1762
- "navBadgePulse": "jbF1yq_navBadgePulse",
1763
- "badge": "jbF1yq_badge",
1764
- "wfSigRight": "jbF1yq_wfSigRight",
1765
- "planTreeRow": "jbF1yq_planTreeRow",
1766
- "wfDs": "jbF1yq_wfDs",
1767
- "outlineH2": "jbF1yq_outlineH2",
1768
- "planTreeVolGroup": "jbF1yq_planTreeVolGroup",
1769
- "ideaCard": "jbF1yq_ideaCard",
1770
- "dimTitle": "jbF1yq_dimTitle",
1771
- "cmdBox": "jbF1yq_cmdBox",
1772
- "wfDl": "jbF1yq_wfDl",
1773
- "wfConBar": "jbF1yq_wfConBar",
1774
- "panelTop": "jbF1yq_panelTop",
1775
- "wfFi": "jbF1yq_wfFi",
1776
- "cmdList": "jbF1yq_cmdList",
1777
- "outlineEdit": "jbF1yq_outlineEdit",
1778
- "statCardDValue": "jbF1yq_statCardDValue",
1779
- "outlineHr": "jbF1yq_outlineHr",
1780
- "liveText": "jbF1yq_liveText",
1781
- "dimCardHead": "jbF1yq_dimCardHead",
1782
- "t2Content": "jbF1yq_t2Content",
1783
- "reviewBox": "jbF1yq_reviewBox",
1784
- "panelHead": "jbF1yq_panelHead",
1785
- "nfChipPulse": "jbF1yq_nfChipPulse",
1786
- "wfMetric": "jbF1yq_wfMetric",
1787
- "chapterFocusPulse": "jbF1yq_chapterFocusPulse",
1788
- "badgeError": "jbF1yq_badgeError",
1789
- "planDetailTitle": "jbF1yq_planDetailTitle",
1790
- "progressBarFill": "jbF1yq_progressBarFill",
1791
- "importModal": "jbF1yq_importModal",
1792
- "assistantResize": "jbF1yq_assistantResize",
1793
- "chapterPreview": "jbF1yq_chapterPreview",
1794
- "subPage": "jbF1yq_subPage",
1801
+ "chapterActions": "jbF1yq_chapterActions",
1802
+ "chapterList": "jbF1yq_chapterList",
1803
+ "wfSigBad": "jbF1yq_wfSigBad",
1804
+ "chWorkGrid": "jbF1yq_chWorkGrid",
1805
+ "chWorkBar": "jbF1yq_chWorkBar",
1806
+ "pageHeaderEyebrow": "jbF1yq_pageHeaderEyebrow",
1807
+ "field": "jbF1yq_field",
1808
+ "wfStage": "jbF1yq_wfStage",
1809
+ "wfFeedBox": "jbF1yq_wfFeedBox",
1810
+ "shelfHero": "jbF1yq_shelfHero",
1795
1811
  "wfBody": "jbF1yq_wfBody",
1796
- "readerItemTitle": "jbF1yq_readerItemTitle",
1812
+ "pageHeaderSub": "jbF1yq_pageHeaderSub",
1813
+ "settingsDrawerOverlay": "jbF1yq_settingsDrawerOverlay",
1814
+ "nfToastIn": "jbF1yq_nfToastIn",
1815
+ "wfConErr": "jbF1yq_wfConErr",
1816
+ "chWorkAsideTitle": "jbF1yq_chWorkAsideTitle",
1817
+ "navGroup": "jbF1yq_navGroup",
1818
+ "button": "jbF1yq_button",
1819
+ "confirmActions": "jbF1yq_confirmActions",
1820
+ "assetGroups": "jbF1yq_assetGroups",
1821
+ "outlineTocL2": "jbF1yq_outlineTocL2",
1822
+ "fadeIn": "jbF1yq_fadeIn",
1823
+ "cmdIcon": "jbF1yq_cmdIcon",
1824
+ "liveText": "jbF1yq_liveText",
1825
+ "createBookInner": "jbF1yq_createBookInner",
1826
+ "wfConsoleNote": "jbF1yq_wfConsoleNote",
1827
+ "noticeSuccess": "jbF1yq_noticeSuccess",
1828
+ "subPageMeta": "jbF1yq_subPageMeta",
1829
+ "outlineQuote": "jbF1yq_outlineQuote",
1830
+ "assetGroupHeader": "jbF1yq_assetGroupHeader",
1831
+ "cardTitleLg": "jbF1yq_cardTitleLg",
1832
+ "importError": "jbF1yq_importError",
1833
+ "adaptRule": "jbF1yq_adaptRule",
1834
+ "legendOld": "jbF1yq_legendOld",
1835
+ "wfMetricSparkNote": "jbF1yq_wfMetricSparkNote",
1836
+ "topNavSpacer": "jbF1yq_topNavSpacer",
1797
1837
  "wfSt": "jbF1yq_wfSt",
1798
- "ideaToggle": "jbF1yq_ideaToggle",
1799
- "wfCoord": "jbF1yq_wfCoord",
1800
- "readerSegBtn": "jbF1yq_readerSegBtn",
1801
- "topNavLabel": "jbF1yq_topNavLabel",
1802
- "wfColB": "jbF1yq_wfColB",
1803
- "subPageActions": "jbF1yq_subPageActions",
1804
- "readerItemBadge": "jbF1yq_readerItemBadge",
1805
- "bookCardActive": "jbF1yq_bookCardActive",
1806
- "toolStepStatus": "jbF1yq_toolStepStatus",
1807
- "outlineTocL1": "jbF1yq_outlineTocL1",
1808
- "progressLineDone": "jbF1yq_progressLineDone",
1809
- "assetGroup": "jbF1yq_assetGroup",
1810
- "outlineCodeLang": "jbF1yq_outlineCodeLang",
1811
- "shelfStatCard": "jbF1yq_shelfStatCard",
1812
- "wfPreview": "jbF1yq_wfPreview",
1838
+ "diffOld": "jbF1yq_diffOld",
1839
+ "nfViewIn": "jbF1yq_nfViewIn",
1840
+ "chWorkDraftBar": "jbF1yq_chWorkDraftBar",
1841
+ "diffChange": "jbF1yq_diffChange",
1842
+ "confirmPhraseHint": "jbF1yq_confirmPhraseHint",
1843
+ "planTreeVolGroup": "jbF1yq_planTreeVolGroup",
1844
+ "planDetailTitle": "jbF1yq_planDetailTitle",
1845
+ "chWorkSideHead": "jbF1yq_chWorkSideHead",
1846
+ "diffLegend": "jbF1yq_diffLegend",
1847
+ "diffNew": "jbF1yq_diffNew",
1813
1848
  "badgeDone": "jbF1yq_badgeDone",
1814
- "authorNavBtn": "jbF1yq_authorNavBtn",
1815
- "diffSame": "jbF1yq_diffSame",
1816
- "outlineH4": "jbF1yq_outlineH4",
1817
- "navTab": "jbF1yq_navTab",
1849
+ "chWorkSideFoot": "jbF1yq_chWorkSideFoot",
1818
1850
  "tabular": "jbF1yq_tabular",
1819
- "progressLine": "jbF1yq_progressLine",
1820
- "subPageTitle": "jbF1yq_subPageTitle",
1821
- "emptyState": "jbF1yq_emptyState",
1822
- "cardTitleLg": "jbF1yq_cardTitleLg",
1823
- "dropzoneIcon": "jbF1yq_dropzoneIcon",
1824
- "wfPsLegend": "jbF1yq_wfPsLegend",
1825
- "wfDrawerBox": "jbF1yq_wfDrawerBox",
1826
- "bookCardBlurb": "jbF1yq_bookCardBlurb",
1827
- "readerSidebar": "jbF1yq_readerSidebar",
1828
- "outlineTocL2": "jbF1yq_outlineTocL2",
1829
- "segTab": "jbF1yq_segTab",
1830
- "wfStFail": "jbF1yq_wfStFail",
1831
- "authorPageHeader": "jbF1yq_authorPageHeader",
1832
- "pageHeaderTitle": "jbF1yq_pageHeaderTitle",
1833
- "wsPreviewText": "jbF1yq_wsPreviewText",
1834
- "wfSigGood": "jbF1yq_wfSigGood",
1835
- "subPageHead": "jbF1yq_subPageHead",
1836
1851
  "adaptImpacts": "jbF1yq_adaptImpacts",
1837
- "authorTopNav": "jbF1yq_authorTopNav",
1838
- "tab": "jbF1yq_tab",
1839
- "readerError": "jbF1yq_readerError",
1840
- "importModalTabs": "jbF1yq_importModalTabs",
1841
- "planBeatsLabel": "jbF1yq_planBeatsLabel",
1842
- "wsColumns": "jbF1yq_wsColumns",
1843
- "wfCard2": "jbF1yq_wfCard2",
1844
- "outlineTocL3": "jbF1yq_outlineTocL3",
1845
- "readerTitle": "jbF1yq_readerTitle",
1846
- "t2Master": "jbF1yq_t2Master",
1847
- "planTree": "jbF1yq_planTree",
1848
- "shelfStatGrid": "jbF1yq_shelfStatGrid",
1849
- "meta": "jbF1yq_meta",
1850
- "readerHeader": "jbF1yq_readerHeader"
1852
+ "readerGroupCount": "jbF1yq_readerGroupCount",
1853
+ "adaptResult": "jbF1yq_adaptResult",
1854
+ "wfRsName": "jbF1yq_wfRsName",
1855
+ "outlineH3": "jbF1yq_outlineH3",
1856
+ "wfAccentAmber": "jbF1yq_wfAccentAmber",
1857
+ "assetFilterChip": "jbF1yq_assetFilterChip",
1858
+ "drawerTitle": "jbF1yq_drawerTitle",
1859
+ "assistantStatusBusy": "jbF1yq_assistantStatusBusy",
1860
+ "assetEditor": "jbF1yq_assetEditor",
1861
+ "dimCardHead": "jbF1yq_dimCardHead",
1862
+ "wfStFix": "jbF1yq_wfStFix",
1863
+ "chWorkActions": "jbF1yq_chWorkActions",
1864
+ "chWorkAside": "jbF1yq_chWorkAside",
1865
+ "outlineCode": "jbF1yq_outlineCode",
1866
+ "noticeActions": "jbF1yq_noticeActions",
1867
+ "authorNavBtn": "jbF1yq_authorNavBtn",
1868
+ "readerSidebar": "jbF1yq_readerSidebar",
1869
+ "readerBody": "jbF1yq_readerBody",
1870
+ "wfSignal": "jbF1yq_wfSignal",
1871
+ "diffTagOld": "jbF1yq_diffTagOld",
1872
+ "wsSelected": "jbF1yq_wsSelected",
1873
+ "readerGroupArrow": "jbF1yq_readerGroupArrow",
1874
+ "readerChapterTitle": "jbF1yq_readerChapterTitle",
1875
+ "outlineDocWrap": "jbF1yq_outlineDocWrap",
1876
+ "fieldLabel": "jbF1yq_fieldLabel",
1877
+ "planDetail": "jbF1yq_planDetail",
1878
+ "progressLineLive": "jbF1yq_progressLineLive",
1879
+ "runChipText": "jbF1yq_runChipText",
1880
+ "wfDs": "jbF1yq_wfDs",
1881
+ "dimCurrent": "jbF1yq_dimCurrent",
1882
+ "wsColumn": "jbF1yq_wsColumn",
1883
+ "assistantResize": "jbF1yq_assistantResize",
1884
+ "bookCardBody": "jbF1yq_bookCardBody",
1885
+ "readerChapterMeta": "jbF1yq_readerChapterMeta",
1886
+ "wfFeedList": "jbF1yq_wfFeedList",
1887
+ "bookCardMetaRow": "jbF1yq_bookCardMetaRow",
1888
+ "bookCardProgressFill": "jbF1yq_bookCardProgressFill",
1889
+ "cardHeadCount": "jbF1yq_cardHeadCount",
1890
+ "assetGrid": "jbF1yq_assetGrid",
1891
+ "numSerif": "jbF1yq_numSerif",
1892
+ "dropzoneActive": "jbF1yq_dropzoneActive",
1893
+ "dropzone": "jbF1yq_dropzone",
1894
+ "wfRsChk": "jbF1yq_wfRsChk",
1895
+ "confirmPhraseInput": "jbF1yq_confirmPhraseInput"
1851
1896
  };
1852
1897
  //#endregion
1853
1898
  //#region src/client/panel/status-badge.ts
@@ -9776,7 +9821,7 @@ window.__ModuleLoader__.load({
9776
9821
  d: "m9 11 3 3L22 4",
9777
9822
  key: "1pflzl"
9778
9823
  }]]);
9779
- createLucideIcon("circle-check", [["circle", {
9824
+ const CircleCheck = createLucideIcon("circle-check", [["circle", {
9780
9825
  cx: "12",
9781
9826
  cy: "12",
9782
9827
  r: "10",
@@ -20948,7 +20993,7 @@ window.__ModuleLoader__.load({
20948
20993
  key: "cif1o7"
20949
20994
  }]
20950
20995
  ]);
20951
- createLucideIcon("list-tree", [
20996
+ const ListTree = createLucideIcon("list-tree", [
20952
20997
  ["path", {
20953
20998
  d: "M8 5h13",
20954
20999
  key: "1pao27"
@@ -34419,7 +34464,7 @@ window.__ModuleLoader__.load({
34419
34464
  d: "m22 7-8.5 8.5-5-5L2 17",
34420
34465
  key: "1t1m79"
34421
34466
  }]]);
34422
- createLucideIcon("triangle-alert", [
34467
+ const TriangleAlert = createLucideIcon("triangle-alert", [
34423
34468
  ["path", {
34424
34469
  d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
34425
34470
  key: "wmoenq"
@@ -37363,6 +37408,7 @@ window.__ModuleLoader__.load({
37363
37408
  key: "durymu"
37364
37409
  }]
37365
37410
  ]);
37411
+ exports.AlertTriangle = TriangleAlert;
37366
37412
  exports.ArrowLeft = ArrowLeft;
37367
37413
  exports.ArrowRight = ArrowRight;
37368
37414
  exports.BarChart3 = ChartColumn;
@@ -37372,6 +37418,7 @@ window.__ModuleLoader__.load({
37372
37418
  exports.Boxes = Boxes;
37373
37419
  exports.Brain = Brain;
37374
37420
  exports.Brush = Brush;
37421
+ exports.CheckCircle2 = CircleCheck;
37375
37422
  exports.Download = Download;
37376
37423
  exports.Factory = Factory;
37377
37424
  exports.FileDown = FileDown;
@@ -37384,6 +37431,7 @@ window.__ModuleLoader__.load({
37384
37431
  exports.Library = Library;
37385
37432
  exports.Lightbulb = Lightbulb;
37386
37433
  exports.ListChecks = ListChecks;
37434
+ exports.ListTree = ListTree;
37387
37435
  exports.MessageSquare = MessageSquare;
37388
37436
  exports.PenLine = PenLine;
37389
37437
  exports.Pencil = Pencil;
@@ -37399,6 +37447,7 @@ window.__ModuleLoader__.load({
37399
37447
  exports.Settings = Settings;
37400
37448
  exports.Sparkles = Sparkles;
37401
37449
  exports.Trash2 = Trash;
37450
+ exports.TriangleAlert = TriangleAlert;
37402
37451
  exports.Upload = Upload;
37403
37452
  exports.Wand2 = WandSparkles;
37404
37453
  exports.X = X;
@@ -38144,6 +38193,242 @@ window.__ModuleLoader__.load({
38144
38193
  });
38145
38194
  }
38146
38195
  //#endregion
38196
+ //#region src/client/panel/NoticeBar.tsx
38197
+ const ICON = {
38198
+ ok: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.CheckCircle2, { size: 14 }),
38199
+ error: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { size: 14 }),
38200
+ warn: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { size: 14 }),
38201
+ info: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Info, { size: 14 })
38202
+ };
38203
+ function NoticeBar({ kind, children, onRetry, retryLabel = "重试", detail, actions }) {
38204
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38205
+ className: `${panel_module_css_default.noticeBar} ${panel_module_css_default[`notice-${kind}`] ?? ""}`,
38206
+ role: kind === "error" ? "alert" : "status",
38207
+ "aria-live": kind === "error" ? "assertive" : "polite",
38208
+ children: [
38209
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38210
+ className: panel_module_css_default.noticeIcon,
38211
+ "aria-hidden": "true",
38212
+ children: ICON[kind]
38213
+ }),
38214
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38215
+ className: panel_module_css_default.noticeBody,
38216
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38217
+ className: panel_module_css_default.noticeText,
38218
+ children
38219
+ }), detail !== void 0 && detail !== null && detail !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38220
+ className: panel_module_css_default.noticeDetail,
38221
+ children: detail
38222
+ })]
38223
+ }),
38224
+ (onRetry !== void 0 || actions !== void 0) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38225
+ className: panel_module_css_default.noticeActions,
38226
+ children: [onRetry !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
38227
+ type: "button",
38228
+ className: `${panel_module_css_default.button} ${panel_module_css_default.noticeBtn}`,
38229
+ onClick: onRetry,
38230
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RotateCcw, {
38231
+ size: 13,
38232
+ "aria-hidden": "true"
38233
+ }), retryLabel]
38234
+ }), actions]
38235
+ })
38236
+ ]
38237
+ });
38238
+ }
38239
+ //#endregion
38240
+ //#region src/client/panel/ConfirmDialog.tsx
38241
+ /**
38242
+ * 破坏性操作确认弹窗 —— 取代 9 处 window.confirm。
38243
+ *
38244
+ * 为什么必须换:window.confirm 是全项目唯一一处「从暖纸朱砂瞬间跳到 Windows 灰白」
38245
+ * 的视觉破口。它同时也是最该被认真设计的地方 —— 用户在这几个动作上押的是
38246
+ * 「不可恢复」:清空聊天记录、删除提供方与 API 密钥、用新总纲重置全书进度、
38247
+ * 删除剧情线、删除角色。而原生弹窗给不出两样东西:
38248
+ * 1. 后果清单(到底会删掉什么、保留什么)
38249
+ * 2. 承诺(哪些东西会先自动备份)
38250
+ * 这两样正是这个产品已有的正确做法 —— 采纳章节新稿时那句「原稿已自动备份 .bak」
38251
+ * (NovelPanel wsAppliedBanner)就很好,这里沿用同一套语言。
38252
+ *
38253
+ * 三档强度:
38254
+ * danger —— 不可恢复,必须勾选知悉;requirePhrase 存在时需逐字输入确认词
38255
+ * warn —— 会覆盖或会丢数据,直接确认
38256
+ * info —— 跳过审稿 / 覆盖正文这类可回滚动作,直接确认
38257
+ *
38258
+ * 执行失败不停在「关掉弹窗 + 一句红字」:动作在弹窗内 await,失败时弹窗保持打开
38259
+ * 并就地显示错误 + 重试按钮 —— 这正是「失败了不知道还能怎么办」的正解。
38260
+ */
38261
+ const TONE_ICON = {
38262
+ danger: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { size: 16 }),
38263
+ warn: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.TriangleAlert, { size: 16 }),
38264
+ info: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Info, { size: 16 })
38265
+ };
38266
+ function ConfirmDialog({ spec, onCancel, onDone }) {
38267
+ const tone = spec.tone ?? "warn";
38268
+ const [phrase, setPhrase] = (0, react.useState)("");
38269
+ const [ack, setAck] = (0, react.useState)(false);
38270
+ const [busy, setBusy] = (0, react.useState)(false);
38271
+ const [error, setError] = (0, react.useState)("");
38272
+ const confirmRef = (0, react.useRef)(null);
38273
+ const phraseOk = spec.requirePhrase === void 0 || phrase.trim() === spec.requirePhrase;
38274
+ const ackOk = spec.requirePhrase !== void 0 || tone !== "danger" || ack;
38275
+ const canConfirm = !busy && phraseOk && ackOk;
38276
+ (0, react.useEffect)(() => {
38277
+ confirmRef.current?.focus();
38278
+ }, []);
38279
+ (0, react.useEffect)(() => {
38280
+ const onKey = (e) => {
38281
+ if (e.key === "Escape" && !busy) {
38282
+ e.preventDefault();
38283
+ onCancel();
38284
+ }
38285
+ };
38286
+ window.addEventListener("keydown", onKey);
38287
+ return () => {
38288
+ window.removeEventListener("keydown", onKey);
38289
+ };
38290
+ }, [onCancel, busy]);
38291
+ const run = async () => {
38292
+ setBusy(true);
38293
+ setError("");
38294
+ try {
38295
+ await spec.onConfirm();
38296
+ onDone();
38297
+ } catch (err) {
38298
+ setError(err instanceof Error ? err.message : String(err));
38299
+ setBusy(false);
38300
+ }
38301
+ };
38302
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
38303
+ className: panel_module_css_default.confirmOverlay,
38304
+ onClick: (e) => {
38305
+ if (e.target === e.currentTarget && !busy) onCancel();
38306
+ },
38307
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38308
+ className: panel_module_css_default.confirmCard,
38309
+ role: "alertdialog",
38310
+ "aria-modal": "true",
38311
+ "aria-label": spec.title,
38312
+ "data-tone": tone,
38313
+ children: [
38314
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38315
+ className: panel_module_css_default.confirmHead,
38316
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38317
+ className: panel_module_css_default.confirmIcon,
38318
+ "data-tone": tone,
38319
+ "aria-hidden": "true",
38320
+ children: TONE_ICON[tone]
38321
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38322
+ className: panel_module_css_default.confirmTitle,
38323
+ children: spec.title
38324
+ })]
38325
+ }),
38326
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38327
+ className: panel_module_css_default.confirmBody,
38328
+ children: [
38329
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
38330
+ className: panel_module_css_default.confirmText,
38331
+ children: spec.body
38332
+ }),
38333
+ spec.effects !== void 0 && spec.effects.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
38334
+ className: panel_module_css_default.confirmList,
38335
+ children: spec.effects.map((t, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: t }, i))
38336
+ }),
38337
+ spec.assurance !== void 0 && spec.assurance !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
38338
+ className: panel_module_css_default.confirmAssurance,
38339
+ children: spec.assurance
38340
+ })
38341
+ ]
38342
+ }),
38343
+ spec.requirePhrase !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38344
+ className: panel_module_css_default.confirmPhraseRow,
38345
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
38346
+ className: panel_module_css_default.confirmPhraseHint,
38347
+ children: [
38348
+ "请输入 ",
38349
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: spec.requirePhrase }),
38350
+ " 以确认"
38351
+ ]
38352
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38353
+ className: panel_module_css_default.input,
38354
+ value: phrase,
38355
+ autoComplete: "off",
38356
+ spellCheck: false,
38357
+ onChange: (e) => {
38358
+ setPhrase(e.target.value);
38359
+ },
38360
+ placeholder: spec.requirePhrase
38361
+ })]
38362
+ }),
38363
+ spec.requirePhrase === void 0 && tone === "danger" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
38364
+ className: panel_module_css_default.confirmAckRow,
38365
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
38366
+ type: "checkbox",
38367
+ checked: ack,
38368
+ onChange: (e) => {
38369
+ setAck(e.target.checked);
38370
+ }
38371
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "我已知悉这一步不可恢复。" })]
38372
+ }),
38373
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
38374
+ kind: "error",
38375
+ detail: "弹窗不会自动关闭,改动如已部分生效请先核对再重试。",
38376
+ onRetry: () => {
38377
+ run();
38378
+ },
38379
+ children: error
38380
+ }),
38381
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38382
+ className: panel_module_css_default.confirmActions,
38383
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38384
+ type: "button",
38385
+ className: panel_module_css_default.button,
38386
+ onClick: onCancel,
38387
+ disabled: busy,
38388
+ children: spec.cancelLabel ?? "取消"
38389
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
38390
+ ref: confirmRef,
38391
+ type: "button",
38392
+ className: `${panel_module_css_default.button} ${panel_module_css_default.confirmGo}`,
38393
+ "data-tone": tone,
38394
+ disabled: !canConfirm,
38395
+ onClick: () => {
38396
+ run();
38397
+ },
38398
+ children: busy ? "处理中…" : spec.confirmLabel ?? "确认"
38399
+ })]
38400
+ })
38401
+ ]
38402
+ })
38403
+ });
38404
+ }
38405
+ /**
38406
+ * 用法(替代 window.confirm):
38407
+ * const confirm = useConfirm()
38408
+ * confirm({ title: '…', body: '…', tone: 'danger', onConfirm: async () => { await api.x() } })
38409
+ * // …并在 JSX 里渲染 {confirm.dialog}
38410
+ *
38411
+ * 动作用回调传入(而不是 resolve(true) 后由调用方自己跑),这样执行失败时
38412
+ * 弹窗能留在原地显示错误并提供重试 —— 不会退化成「关掉弹窗 + 一句红字」。
38413
+ */
38414
+ function useConfirm() {
38415
+ const [spec, setSpec] = (0, react.useState)(null);
38416
+ return {
38417
+ confirm: (0, react.useCallback)((next) => {
38418
+ setSpec(next);
38419
+ }, []),
38420
+ dialog: (0, react.useMemo)(() => spec === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmDialog, {
38421
+ spec,
38422
+ onCancel: () => {
38423
+ setSpec(null);
38424
+ },
38425
+ onDone: () => {
38426
+ setSpec(null);
38427
+ }
38428
+ }), [spec])
38429
+ };
38430
+ }
38431
+ //#endregion
38147
38432
  //#region src/client/panel/toast.ts
38148
38433
  /**
38149
38434
  * Toast — 完成时刻的轻确认(R3 微交互)。
@@ -38335,6 +38620,8 @@ window.__ModuleLoader__.load({
38335
38620
  const [busy, setBusy] = (0, react.useState)(false);
38336
38621
  const [error, setError] = (0, react.useState)("");
38337
38622
  const [notice, setNotice] = (0, react.useState)("");
38623
+ /** 破坏性操作确认弹窗(取代 window.confirm)。 */
38624
+ const confirmUi = useConfirm();
38338
38625
  /** 思考耗时(秒,busy 时每秒刷新)。 */
38339
38626
  const [thinkSeconds, setThinkSeconds] = (0, react.useState)(0);
38340
38627
  const idRef = (0, react.useRef)(0);
@@ -38476,19 +38763,28 @@ window.__ModuleLoader__.load({
38476
38763
  scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight });
38477
38764
  }, [lines]);
38478
38765
  /** 清空对话记录(服务端删除历史 + 本地清空)。 */
38479
- const handleClear = async () => {
38480
- if (!window.confirm("清空全部聊天记录?此操作不可恢复(不影响大纲/设定/章节)。")) return;
38481
- setBusy(true);
38482
- setError("");
38483
- try {
38484
- await api.assistantClear();
38485
- setLines([]);
38486
- setNotice("对话已清空,编辑老师会重新了解项目");
38487
- } catch (err) {
38488
- setError(err.message);
38489
- } finally {
38490
- setBusy(false);
38491
- }
38766
+ const handleClear = () => {
38767
+ confirmUi.confirm({
38768
+ title: "清空全部聊天记录",
38769
+ body: "与编辑老师的全部对话历史会被删除,此操作不可恢复。",
38770
+ effects: ["大纲 / 设定 / 章节正文不受影响", "编辑老师会重新从零了解项目"],
38771
+ tone: "danger",
38772
+ requirePhrase: "清空",
38773
+ confirmLabel: "确认清空",
38774
+ onConfirm: async () => {
38775
+ setBusy(true);
38776
+ setError("");
38777
+ try {
38778
+ await api.assistantClear();
38779
+ setLines([]);
38780
+ setNotice("对话已清空,编辑老师会重新了解项目");
38781
+ } catch (err) {
38782
+ setError(err.message);
38783
+ } finally {
38784
+ setBusy(false);
38785
+ }
38786
+ }
38787
+ });
38492
38788
  };
38493
38789
  /** Send one message. */
38494
38790
  const handleSend = async () => {
@@ -38548,12 +38844,8 @@ window.__ModuleLoader__.load({
38548
38844
  },
38549
38845
  children: [
38550
38846
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38551
- className: panel_module_css_default.row,
38552
- style: {
38553
- justifyContent: "space-between",
38554
- alignItems: "center",
38555
- gap: "var(--nf-space-8)"
38556
- },
38847
+ className: `css.rowBetween`,
38848
+ style: { gap: "var(--nf-space-8)" },
38557
38849
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38558
38850
  className: panel_module_css_default.meta,
38559
38851
  children: tt("assistant.hint")
@@ -38733,7 +39025,8 @@ window.__ModuleLoader__.load({
38733
39025
  },
38734
39026
  children: tt("assistant.send")
38735
39027
  })]
38736
- })
39028
+ }),
39029
+ confirmUi.dialog
38737
39030
  ]
38738
39031
  });
38739
39032
  }
@@ -38976,11 +39269,7 @@ window.__ModuleLoader__.load({
38976
39269
  },
38977
39270
  children: [
38978
39271
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38979
- className: panel_module_css_default.row,
38980
- style: {
38981
- justifyContent: "space-between",
38982
- flexWrap: "wrap"
38983
- },
39272
+ className: `css.rowBetween css.rowBetweenWrap`,
38984
39273
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38985
39274
  className: panel_module_css_default.titleBlock,
38986
39275
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -39632,7 +39921,7 @@ window.__ModuleLoader__.load({
39632
39921
  className: panel_module_css_default.bookCardProgressBar,
39633
39922
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39634
39923
  className: panel_module_css_default.bookCardProgressFill,
39635
- style: { width: `${Math.round(ratio * 100)}%` }
39924
+ style: { transform: `scaleX(${ratio})` }
39636
39925
  })
39637
39926
  }),
39638
39927
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -40559,8 +40848,7 @@ window.__ModuleLoader__.load({
40559
40848
  }, d.key + "-" + i))
40560
40849
  }),
40561
40850
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40562
- className: panel_module_css_default.rowEnd,
40563
- style: { justifyContent: "flex-end" },
40851
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
40564
40852
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
40565
40853
  type: "button",
40566
40854
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
@@ -42025,7 +42313,7 @@ window.__ModuleLoader__.load({
42025
42313
  className: panel_module_css_default.bigProgressBar,
42026
42314
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
42027
42315
  className: panel_module_css_default.bigProgressBarFill,
42028
- style: { width: Math.round(liveBar.ratio * 100) + "%" }
42316
+ style: { transform: `scaleX(${liveBar.ratio})` }
42029
42317
  })
42030
42318
  }),
42031
42319
  liveBar?.text !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -42064,7 +42352,7 @@ window.__ModuleLoader__.load({
42064
42352
  className: panel_module_css_default.progressBar,
42065
42353
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42066
42354
  className: panel_module_css_default.progressBarFill,
42067
- style: { width: Math.round((line.ratio ?? 0) * 100) + "%" }
42355
+ style: { transform: `scaleX(${line.ratio ?? 0})` }
42068
42356
  })
42069
42357
  }), line.text]
42070
42358
  }, line.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { ref: endRef })]
@@ -42199,6 +42487,8 @@ window.__ModuleLoader__.load({
42199
42487
  const [providerCustom, setProviderCustom] = (0, react.useState)(false);
42200
42488
  const [modelCustom, setModelCustom] = (0, react.useState)(false);
42201
42489
  const [test, setTest] = (0, react.useState)({ testing: false });
42490
+ /** 破坏性操作确认弹窗(取代 window.confirm:删除提供方会连带移除 API 密钥)。 */
42491
+ const confirmUi = useConfirm();
42202
42492
  const [vendors, setVendors] = (0, react.useState)(fallbackVendors());
42203
42493
  const [addPanel, setAddPanel] = (0, react.useState)("none");
42204
42494
  const [editTarget, setEditTarget] = (0, react.useState)("");
@@ -42367,18 +42657,28 @@ window.__ModuleLoader__.load({
42367
42657
  setSavingAdd(false);
42368
42658
  }
42369
42659
  };
42370
- const removeProvider = async (p) => {
42371
- if (!window.confirm("删除提供方「" + (p.name !== "" ? p.name : p.id) + "」?将移除 DSH 配置与 API 密钥。")) return;
42372
- try {
42373
- const vendor = vendors.find((v) => v.id === p.id);
42374
- await api.removeProvider({
42375
- provider: p.id,
42376
- apiKeyEnv: vendor?.apiKeyEnv
42377
- });
42378
- await loadProviders();
42379
- } catch (err) {
42380
- setAddErr(err.message);
42381
- }
42660
+ const removeProvider = (p) => {
42661
+ const label = p.name !== "" ? p.name : p.id;
42662
+ confirmUi.confirm({
42663
+ title: `删除提供方「${label}」`,
42664
+ body: "该提供方会从列表中移除,DSH 配置与 API 密钥一并清除。",
42665
+ effects: ["用该提供方配置的模型会变成不可选", "需要时需重新填写 API 密钥"],
42666
+ tone: "danger",
42667
+ requirePhrase: "删除",
42668
+ confirmLabel: "删除提供方",
42669
+ onConfirm: async () => {
42670
+ try {
42671
+ const vendor = vendors.find((v) => v.id === p.id);
42672
+ await api.removeProvider({
42673
+ provider: p.id,
42674
+ apiKeyEnv: vendor?.apiKeyEnv
42675
+ });
42676
+ await loadProviders();
42677
+ } catch (err) {
42678
+ setAddErr(err.message);
42679
+ }
42680
+ }
42681
+ });
42382
42682
  };
42383
42683
  const providerOptions = configuredProviders.some((p) => p.id === provider) ? configuredProviders : provider !== "" && provider !== CUSTOM ? [{
42384
42684
  id: provider,
@@ -42399,426 +42699,418 @@ window.__ModuleLoader__.load({
42399
42699
  minWidth: 0,
42400
42700
  width: "100%"
42401
42701
  },
42402
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42403
- className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42404
- style: { gap: "var(--nf-space-16)" },
42405
- children: [
42406
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42407
- className: panel_module_css_default.cardTitle,
42408
- children: "模型"
42409
- }),
42410
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42411
- className: panel_module_css_default.meta,
42412
- children: "填入各提供方的 API 密钥即可使用其模型。"
42413
- }),
42414
- configuredProviders.map((p) => {
42415
- const isBuiltin = p.id === "deepseek-official";
42416
- const isKnownVendor = vendors.some((v) => v.id === p.id);
42417
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42418
- style: {
42419
- border: "1px solid var(--nf-border)",
42420
- borderRadius: "var(--nf-radius-12)",
42421
- padding: "var(--nf-space-12)",
42422
- display: "flex",
42423
- alignItems: "center",
42424
- gap: "var(--nf-space-8)",
42425
- flexWrap: "wrap",
42426
- justifyContent: "space-between"
42427
- },
42428
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42702
+ children: [
42703
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42704
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42705
+ style: { gap: "var(--nf-space-16)" },
42706
+ children: [
42707
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42708
+ className: panel_module_css_default.cardTitle,
42709
+ children: "模型"
42710
+ }),
42711
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42712
+ className: panel_module_css_default.meta,
42713
+ children: "填入各提供方的 API 密钥即可使用其模型。"
42714
+ }),
42715
+ configuredProviders.map((p) => {
42716
+ const isBuiltin = p.id === "deepseek-official";
42717
+ const isKnownVendor = vendors.some((v) => v.id === p.id);
42718
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42429
42719
  style: {
42720
+ border: "1px solid var(--nf-border)",
42721
+ borderRadius: "var(--nf-radius-12)",
42722
+ padding: "var(--nf-space-12)",
42430
42723
  display: "flex",
42431
42724
  alignItems: "center",
42432
- gap: "var(--nf-space-8)"
42433
- },
42434
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42435
- style: { fontWeight: 600 },
42436
- children: p.name !== "" && p.name !== p.id ? p.name : p.id
42437
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: {
42438
- width: 8,
42439
- height: 8,
42440
- borderRadius: "50%",
42441
- background: "var(--nf-success)"
42442
- } })]
42443
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42444
- style: {
42445
- display: "flex",
42446
- gap: "var(--nf-space-6)",
42447
- alignItems: "center"
42725
+ gap: "var(--nf-space-8)",
42726
+ flexWrap: "wrap",
42727
+ justifyContent: "space-between"
42448
42728
  },
42449
- children: [!isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42450
- type: "button",
42451
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42452
- onClick: () => openPanel(isKnownVendor ? "standard" : "custom", p.id),
42453
- children: tt("settings.edit")
42454
- }), !isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42455
- type: "button",
42456
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42457
- style: { color: "var(--nf-error)" },
42458
- onClick: () => {
42459
- removeProvider(p);
42729
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42730
+ style: {
42731
+ display: "flex",
42732
+ alignItems: "center",
42733
+ gap: "var(--nf-space-8)"
42460
42734
  },
42461
- children: tt("settings.delete")
42735
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42736
+ style: { fontWeight: 600 },
42737
+ children: p.name !== "" && p.name !== p.id ? p.name : p.id
42738
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: {
42739
+ width: 8,
42740
+ height: 8,
42741
+ borderRadius: "50%",
42742
+ background: "var(--nf-success)"
42743
+ } })]
42744
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42745
+ style: {
42746
+ display: "flex",
42747
+ gap: "var(--nf-space-6)",
42748
+ alignItems: "center"
42749
+ },
42750
+ children: [!isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42751
+ type: "button",
42752
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42753
+ onClick: () => openPanel(isKnownVendor ? "standard" : "custom", p.id),
42754
+ children: tt("settings.edit")
42755
+ }), !isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42756
+ type: "button",
42757
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42758
+ style: { color: "var(--nf-error)" },
42759
+ onClick: () => {
42760
+ removeProvider(p);
42761
+ },
42762
+ children: tt("settings.delete")
42763
+ })]
42462
42764
  })]
42463
- })]
42464
- }, p.id);
42465
- }),
42466
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42467
- className: panel_module_css_default.row,
42468
- style: {
42469
- gap: "var(--nf-space-10)",
42470
- flexWrap: "wrap"
42471
- },
42472
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42473
- type: "button",
42474
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42475
- onClick: () => openPanel("standard"),
42476
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42477
- size: 13,
42478
- style: { verticalAlign: -2 }
42479
- }), " 添加提供方"]
42480
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42481
- type: "button",
42482
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42483
- onClick: () => openPanel("custom"),
42484
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42485
- size: 13,
42486
- style: { verticalAlign: -2 }
42487
- }), " 添加自定义提供方"]
42488
- })]
42489
- }),
42490
- addPanel !== "none" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42491
- style: {
42492
- border: "1px solid var(--nf-border)",
42493
- borderRadius: "var(--nf-radius-12)",
42494
- padding: "var(--nf-space-12)",
42495
- display: "flex",
42496
- flexDirection: "column",
42497
- gap: "var(--nf-space-12)"
42498
- },
42499
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42765
+ }, p.id);
42766
+ }),
42767
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42500
42768
  className: panel_module_css_default.row,
42501
42769
  style: {
42502
- justifyContent: "space-between",
42503
- alignItems: "center"
42770
+ gap: "var(--nf-space-10)",
42771
+ flexWrap: "wrap"
42504
42772
  },
42505
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42506
- className: panel_module_css_default.fieldLabel,
42507
- children: addPanel === "standard" ? editTarget !== "" ? "编辑提供方" : "添加提供方" : "自定义提供方"
42773
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42774
+ type: "button",
42775
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42776
+ onClick: () => openPanel("standard"),
42777
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42778
+ size: 13,
42779
+ style: { verticalAlign: -2 }
42780
+ }), " 添加提供方"]
42508
42781
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42509
42782
  type: "button",
42510
42783
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42511
- onClick: () => openPanel("none"),
42512
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.X, {
42784
+ onClick: () => openPanel("custom"),
42785
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42513
42786
  size: 13,
42514
42787
  style: { verticalAlign: -2 }
42515
- }), " 关闭"]
42788
+ }), " 添加自定义提供方"]
42516
42789
  })]
42517
- }), addPanel === "standard" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42518
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42519
- className: panel_module_css_default.field,
42520
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42521
- className: panel_module_css_default.fieldLabel,
42522
- children: "提供方"
42523
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42524
- className: panel_module_css_default.input,
42525
- value: vendorId,
42526
- onChange: (e) => setVendorId(e.target.value),
42527
- children: vendors.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42528
- value: v.id,
42529
- children: v.name
42530
- }, v.id))
42531
- })]
42532
- }),
42533
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42534
- className: panel_module_css_default.field,
42535
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42536
- className: panel_module_css_default.fieldLabel,
42537
- children: "API 密钥"
42538
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42539
- className: panel_module_css_default.input,
42540
- type: "password",
42541
- value: addApiKey,
42542
- onChange: (e) => setAddApiKey(e.target.value),
42543
- placeholder: "输入 API 密钥,或留空使用环境认证"
42544
- })]
42545
- }),
42546
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42547
- className: panel_module_css_default.field,
42548
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42549
- className: panel_module_css_default.fieldLabel,
42550
- children: "模型 id(可选)"
42551
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42552
- className: panel_module_css_default.input,
42553
- value: addModel,
42554
- onChange: (e) => setAddModel(e.target.value),
42555
- placeholder: "例如 glm-5.3-flash"
42556
- })]
42557
- }),
42558
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42790
+ }),
42791
+ addPanel !== "none" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42792
+ style: {
42793
+ border: "1px solid var(--nf-border)",
42794
+ borderRadius: "var(--nf-radius-12)",
42795
+ padding: "var(--nf-space-12)",
42796
+ display: "flex",
42797
+ flexDirection: "column",
42798
+ gap: "var(--nf-space-12)"
42799
+ },
42800
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42559
42801
  className: panel_module_css_default.row,
42560
42802
  style: {
42561
- justifyContent: "flex-end",
42562
- gap: "var(--nf-space-8)"
42803
+ justifyContent: "space-between",
42804
+ alignItems: "center"
42563
42805
  },
42564
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42565
- type: "button",
42566
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42567
- onClick: () => openPanel("none"),
42568
- children: "取消"
42569
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42570
- type: "button",
42571
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42572
- disabled: savingAdd,
42573
- onClick: () => {
42574
- saveStandard();
42575
- },
42576
- children: savingAdd ? "保存中…" : "保存"
42577
- })]
42578
- })
42579
- ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42580
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42581
- className: panel_module_css_default.field,
42582
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42583
- className: panel_module_css_default.fieldLabel,
42584
- children: "Provider ID"
42585
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42586
- className: panel_module_css_default.input,
42587
- value: custProvider,
42588
- onChange: (e) => setCustProvider(e.target.value),
42589
- placeholder: "acme-gateway"
42590
- })]
42591
- }),
42592
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42593
- className: panel_module_css_default.field,
42594
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42595
- className: panel_module_css_default.fieldLabel,
42596
- children: "显示名称"
42597
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42598
- className: panel_module_css_default.input,
42599
- value: custName,
42600
- onChange: (e) => setCustName(e.target.value),
42601
- placeholder: "显示名称"
42602
- })]
42603
- }),
42604
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42605
- className: panel_module_css_default.field,
42606
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42607
- className: panel_module_css_default.fieldLabel,
42608
- children: "API 地址"
42609
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42610
- className: panel_module_css_default.input,
42611
- value: custBaseURL,
42612
- onChange: (e) => setCustBaseURL(e.target.value),
42613
- placeholder: "https://gateway.example/v1"
42614
- })]
42615
- }),
42616
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42617
- className: panel_module_css_default.field,
42618
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42619
- className: panel_module_css_default.fieldLabel,
42620
- children: "API 协议"
42621
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42622
- className: panel_module_css_default.input,
42623
- value: custProtocol,
42624
- onChange: (e) => setCustProtocol(e.target.value),
42625
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42626
- value: "openai-completions",
42627
- children: "openai-completions"
42628
- })
42629
- })]
42630
- }),
42631
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42632
- className: panel_module_css_default.field,
42633
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42634
- className: panel_module_css_default.fieldLabel,
42635
- children: "API 密钥"
42636
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42637
- className: panel_module_css_default.input,
42638
- type: "password",
42639
- value: custApiKey,
42640
- onChange: (e) => setCustApiKey(e.target.value),
42641
- placeholder: "输入 API 密钥"
42642
- })]
42643
- }),
42644
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42645
- className: panel_module_css_default.field,
42646
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42806
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42647
42807
  className: panel_module_css_default.fieldLabel,
42648
- children: "模型目录 / 模型 id"
42649
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42650
- className: panel_module_css_default.input,
42651
- value: custModel,
42652
- onChange: (e) => setCustModel(e.target.value),
42653
- placeholder: "例如 glm-5.3-flash"
42654
- })]
42655
- }),
42656
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42657
- className: panel_module_css_default.row,
42658
- style: {
42659
- justifyContent: "flex-end",
42660
- gap: "var(--nf-space-8)"
42661
- },
42662
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42808
+ children: addPanel === "standard" ? editTarget !== "" ? "编辑提供方" : "添加提供方" : "自定义提供方"
42809
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42663
42810
  type: "button",
42664
42811
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42665
42812
  onClick: () => openPanel("none"),
42666
- children: "取消"
42667
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42668
- type: "button",
42669
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42670
- disabled: savingAdd,
42671
- onClick: () => {
42672
- saveCustom();
42673
- },
42674
- children: savingAdd ? "创建中…" : "创建提供方"
42675
- })]
42676
- })
42677
- ] })]
42678
- }),
42679
- addMsg !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42680
- className: panel_module_css_default.meta,
42681
- style: { color: "var(--nf-success)" },
42682
- children: ["✓ ", addMsg]
42683
- }),
42684
- addErr !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42685
- className: panel_module_css_default.meta,
42686
- style: { color: "var(--nf-error)" },
42687
- children: ["✗ ", addErr]
42688
- })
42689
- ]
42690
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42691
- className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42692
- style: { gap: "var(--nf-space-16)" },
42693
- children: [
42694
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42695
- className: panel_module_css_default.cardTitle,
42696
- children: "当前写作模型"
42697
- }),
42698
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42699
- className: panel_module_css_default.field,
42700
- children: [
42701
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42702
- className: panel_module_css_default.fieldLabel,
42703
- children: tt("settings.provider")
42704
- }),
42705
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
42706
- className: panel_module_css_default.input,
42707
- value: providerValue,
42708
- onChange: (e) => {
42709
- const v = e.target.value;
42710
- if (v === CUSTOM) setProviderCustom(true);
42711
- else {
42712
- setProviderCustom(false);
42713
- onProvider(v);
42714
- }
42715
- },
42716
- children: [providerOptions.map((p) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42717
- value: p.id,
42718
- children: p.name !== "" && p.name !== p.id ? p.name + "(" + p.id + ")" : p.id
42719
- }, p.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42720
- value: CUSTOM,
42721
- children: tt("settings.customProvider")
42813
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.X, {
42814
+ size: 13,
42815
+ style: { verticalAlign: -2 }
42816
+ }), " 关闭"]
42722
42817
  })]
42723
- }),
42724
- providerCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42725
- className: panel_module_css_default.input,
42726
- style: { marginTop: "var(--nf-space-6)" },
42727
- value: provider,
42728
- placeholder: "provider 路由 id",
42729
- onChange: (e) => onProvider(e.target.value)
42730
- })
42731
- ]
42732
- }),
42733
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42734
- className: panel_module_css_default.field,
42735
- children: [
42736
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42737
- className: panel_module_css_default.fieldLabel,
42738
- children: tt("settings.model")
42739
- }),
42740
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42741
- className: panel_module_css_default.row,
42742
- style: {
42743
- gap: "var(--nf-space-8)",
42744
- flexWrap: "wrap"
42745
- },
42746
- children: [
42747
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
42818
+ }), addPanel === "standard" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42819
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42820
+ className: panel_module_css_default.field,
42821
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42822
+ className: panel_module_css_default.fieldLabel,
42823
+ children: "提供方"
42824
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42748
42825
  className: panel_module_css_default.input,
42749
- style: {
42750
- flex: 1,
42751
- minWidth: 200
42752
- },
42753
- value: modelValue,
42754
- onChange: (e) => {
42755
- const v = e.target.value;
42756
- if (v === CUSTOM) setModelCustom(true);
42757
- else {
42758
- setModelCustom(false);
42759
- onModel(v);
42760
- }
42761
- },
42762
- children: [modelOptions.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42763
- value: m.id,
42764
- children: m.name !== "" && m.name !== m.id ? m.name + "(" + m.id + ")" : m.id
42765
- }, m.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42766
- value: CUSTOM,
42767
- children: tt("settings.modelCustom")
42768
- })]
42769
- }),
42770
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42826
+ value: vendorId,
42827
+ onChange: (e) => setVendorId(e.target.value),
42828
+ children: vendors.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42829
+ value: v.id,
42830
+ children: v.name
42831
+ }, v.id))
42832
+ })]
42833
+ }),
42834
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42835
+ className: panel_module_css_default.field,
42836
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42837
+ className: panel_module_css_default.fieldLabel,
42838
+ children: "API 密钥"
42839
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42840
+ className: panel_module_css_default.input,
42841
+ type: "password",
42842
+ value: addApiKey,
42843
+ onChange: (e) => setAddApiKey(e.target.value),
42844
+ placeholder: "输入 API 密钥,或留空使用环境认证"
42845
+ })]
42846
+ }),
42847
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42848
+ className: panel_module_css_default.field,
42849
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42850
+ className: panel_module_css_default.fieldLabel,
42851
+ children: "模型 id(可选)"
42852
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42853
+ className: panel_module_css_default.input,
42854
+ value: addModel,
42855
+ onChange: (e) => setAddModel(e.target.value),
42856
+ placeholder: "例如 glm-5.3-flash"
42857
+ })]
42858
+ }),
42859
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42860
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
42861
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42771
42862
  type: "button",
42772
42863
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42773
- disabled: modelsLoading || provider === "",
42774
- title: "刷新模型",
42864
+ onClick: () => openPanel("none"),
42865
+ children: "取消"
42866
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42867
+ type: "button",
42868
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42869
+ disabled: savingAdd,
42775
42870
  onClick: () => {
42776
- loadProviderModels(provider);
42871
+ saveStandard();
42777
42872
  },
42778
- children: [
42779
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RefreshCw, {
42780
- size: 13,
42781
- style: { verticalAlign: -2 }
42782
- }),
42783
- " ",
42784
- modelsLoading ? "…" : tt("settings.refreshModels")
42785
- ]
42786
- }),
42787
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42873
+ children: savingAdd ? "保存中…" : "保存"
42874
+ })]
42875
+ })
42876
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42877
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42878
+ className: panel_module_css_default.field,
42879
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42880
+ className: panel_module_css_default.fieldLabel,
42881
+ children: "Provider ID"
42882
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42883
+ className: panel_module_css_default.input,
42884
+ value: custProvider,
42885
+ onChange: (e) => setCustProvider(e.target.value),
42886
+ placeholder: "acme-gateway"
42887
+ })]
42888
+ }),
42889
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42890
+ className: panel_module_css_default.field,
42891
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42892
+ className: panel_module_css_default.fieldLabel,
42893
+ children: "显示名称"
42894
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42895
+ className: panel_module_css_default.input,
42896
+ value: custName,
42897
+ onChange: (e) => setCustName(e.target.value),
42898
+ placeholder: "显示名称"
42899
+ })]
42900
+ }),
42901
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42902
+ className: panel_module_css_default.field,
42903
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42904
+ className: panel_module_css_default.fieldLabel,
42905
+ children: "API 地址"
42906
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42907
+ className: panel_module_css_default.input,
42908
+ value: custBaseURL,
42909
+ onChange: (e) => setCustBaseURL(e.target.value),
42910
+ placeholder: "https://gateway.example/v1"
42911
+ })]
42912
+ }),
42913
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42914
+ className: panel_module_css_default.field,
42915
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42916
+ className: panel_module_css_default.fieldLabel,
42917
+ children: "API 协议"
42918
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42919
+ className: panel_module_css_default.input,
42920
+ value: custProtocol,
42921
+ onChange: (e) => setCustProtocol(e.target.value),
42922
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42923
+ value: "openai-completions",
42924
+ children: "openai-completions"
42925
+ })
42926
+ })]
42927
+ }),
42928
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42929
+ className: panel_module_css_default.field,
42930
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42931
+ className: panel_module_css_default.fieldLabel,
42932
+ children: "API 密钥"
42933
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42934
+ className: panel_module_css_default.input,
42935
+ type: "password",
42936
+ value: custApiKey,
42937
+ onChange: (e) => setCustApiKey(e.target.value),
42938
+ placeholder: "输入 API 密钥"
42939
+ })]
42940
+ }),
42941
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42942
+ className: panel_module_css_default.field,
42943
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42944
+ className: panel_module_css_default.fieldLabel,
42945
+ children: "模型目录 / 模型 id"
42946
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42947
+ className: panel_module_css_default.input,
42948
+ value: custModel,
42949
+ onChange: (e) => setCustModel(e.target.value),
42950
+ placeholder: "例如 glm-5.3-flash"
42951
+ })]
42952
+ }),
42953
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42954
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
42955
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42788
42956
  type: "button",
42789
42957
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42790
- disabled: test.testing || provider.trim() === "" || model.trim() === "",
42958
+ onClick: () => openPanel("none"),
42959
+ children: "取消"
42960
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42961
+ type: "button",
42962
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42963
+ disabled: savingAdd,
42791
42964
  onClick: () => {
42792
- runTest();
42965
+ saveCustom();
42793
42966
  },
42794
- title: tt("settings.testHint"),
42795
- children: [
42796
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PlugZap, {
42797
- size: 13,
42798
- style: { verticalAlign: -2 }
42799
- }),
42800
- " ",
42801
- test.testing ? tt("settings.testRunning") : tt("settings.testConnection")
42802
- ]
42803
- })
42804
- ]
42805
- }),
42806
- modelCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42807
- className: panel_module_css_default.input,
42808
- style: { marginTop: "var(--nf-space-6)" },
42809
- value: model,
42810
- placeholder: tt("settings.modelCustomPlaceholder"),
42811
- onChange: (e) => onModel(e.target.value)
42812
- }),
42813
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42814
- className: panel_module_css_default.meta,
42815
- style: { color: test.ok === true ? "var(--nf-success)" : test.ok === false ? "var(--nf-error)" : void 0 },
42816
- children: test.testing ? tt("settings.testRunning") + "…" : test.ok === true ? "✓ " + tt("settings.testOk") + " · " + (test.ms ?? "?") + "ms" : test.ok === false ? "✗ " + tt("settings.testFail") + (test.message !== void 0 ? ":" + test.message : "") : tt("settings.testHint")
42817
- })
42818
- ]
42819
- })
42820
- ]
42821
- })]
42967
+ children: savingAdd ? "创建中…" : "创建提供方"
42968
+ })]
42969
+ })
42970
+ ] })]
42971
+ }),
42972
+ addMsg !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42973
+ className: panel_module_css_default.meta,
42974
+ style: { color: "var(--nf-success)" },
42975
+ children: ["✓ ", addMsg]
42976
+ }),
42977
+ addErr !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42978
+ className: panel_module_css_default.meta,
42979
+ style: { color: "var(--nf-error)" },
42980
+ children: ["✗ ", addErr]
42981
+ })
42982
+ ]
42983
+ }),
42984
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42985
+ className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42986
+ style: { gap: "var(--nf-space-16)" },
42987
+ children: [
42988
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42989
+ className: panel_module_css_default.cardTitle,
42990
+ children: "当前写作模型"
42991
+ }),
42992
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42993
+ className: panel_module_css_default.field,
42994
+ children: [
42995
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42996
+ className: panel_module_css_default.fieldLabel,
42997
+ children: tt("settings.provider")
42998
+ }),
42999
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
43000
+ className: panel_module_css_default.input,
43001
+ value: providerValue,
43002
+ onChange: (e) => {
43003
+ const v = e.target.value;
43004
+ if (v === CUSTOM) setProviderCustom(true);
43005
+ else {
43006
+ setProviderCustom(false);
43007
+ onProvider(v);
43008
+ }
43009
+ },
43010
+ children: [providerOptions.map((p) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
43011
+ value: p.id,
43012
+ children: p.name !== "" && p.name !== p.id ? p.name + "(" + p.id + ")" : p.id
43013
+ }, p.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
43014
+ value: CUSTOM,
43015
+ children: tt("settings.customProvider")
43016
+ })]
43017
+ }),
43018
+ providerCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43019
+ className: panel_module_css_default.input,
43020
+ style: { marginTop: "var(--nf-space-6)" },
43021
+ value: provider,
43022
+ placeholder: "provider 路由 id",
43023
+ onChange: (e) => onProvider(e.target.value)
43024
+ })
43025
+ ]
43026
+ }),
43027
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43028
+ className: panel_module_css_default.field,
43029
+ children: [
43030
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
43031
+ className: panel_module_css_default.fieldLabel,
43032
+ children: tt("settings.model")
43033
+ }),
43034
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43035
+ className: panel_module_css_default.row,
43036
+ children: [
43037
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
43038
+ className: panel_module_css_default.input,
43039
+ style: {
43040
+ flex: 1,
43041
+ minWidth: 200
43042
+ },
43043
+ value: modelValue,
43044
+ onChange: (e) => {
43045
+ const v = e.target.value;
43046
+ if (v === CUSTOM) setModelCustom(true);
43047
+ else {
43048
+ setModelCustom(false);
43049
+ onModel(v);
43050
+ }
43051
+ },
43052
+ children: [modelOptions.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
43053
+ value: m.id,
43054
+ children: m.name !== "" && m.name !== m.id ? m.name + "(" + m.id + ")" : m.id
43055
+ }, m.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
43056
+ value: CUSTOM,
43057
+ children: tt("settings.modelCustom")
43058
+ })]
43059
+ }),
43060
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
43061
+ type: "button",
43062
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
43063
+ disabled: modelsLoading || provider === "",
43064
+ title: "刷新模型",
43065
+ onClick: () => {
43066
+ loadProviderModels(provider);
43067
+ },
43068
+ children: [
43069
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RefreshCw, {
43070
+ size: 13,
43071
+ style: { verticalAlign: -2 }
43072
+ }),
43073
+ " ",
43074
+ modelsLoading ? "…" : tt("settings.refreshModels")
43075
+ ]
43076
+ }),
43077
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
43078
+ type: "button",
43079
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
43080
+ disabled: test.testing || provider.trim() === "" || model.trim() === "",
43081
+ onClick: () => {
43082
+ runTest();
43083
+ },
43084
+ title: tt("settings.testHint"),
43085
+ children: [
43086
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PlugZap, {
43087
+ size: 13,
43088
+ style: { verticalAlign: -2 }
43089
+ }),
43090
+ " ",
43091
+ test.testing ? tt("settings.testRunning") : tt("settings.testConnection")
43092
+ ]
43093
+ })
43094
+ ]
43095
+ }),
43096
+ modelCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43097
+ className: panel_module_css_default.input,
43098
+ style: { marginTop: "var(--nf-space-6)" },
43099
+ value: model,
43100
+ placeholder: tt("settings.modelCustomPlaceholder"),
43101
+ onChange: (e) => onModel(e.target.value)
43102
+ }),
43103
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
43104
+ className: panel_module_css_default.meta,
43105
+ style: { color: test.ok === true ? "var(--nf-success)" : test.ok === false ? "var(--nf-error)" : void 0 },
43106
+ children: test.testing ? tt("settings.testRunning") + "…" : test.ok === true ? "✓ " + tt("settings.testOk") + " · " + (test.ms ?? "?") + "ms" : test.ok === false ? "✗ " + tt("settings.testFail") + (test.message !== void 0 ? ":" + test.message : "") : tt("settings.testHint")
43107
+ })
43108
+ ]
43109
+ })
43110
+ ]
43111
+ }),
43112
+ confirmUi.dialog
43113
+ ]
42822
43114
  });
42823
43115
  }
42824
43116
  //#endregion
@@ -43195,10 +43487,6 @@ window.__ModuleLoader__.load({
43195
43487
  }),
43196
43488
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43197
43489
  className: panel_module_css_default.row,
43198
- style: {
43199
- gap: "var(--nf-space-8)",
43200
- flexWrap: "wrap"
43201
- },
43202
43490
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43203
43491
  className: panel_module_css_default.input,
43204
43492
  style: {
@@ -43372,8 +43660,7 @@ window.__ModuleLoader__.load({
43372
43660
  ]
43373
43661
  }),
43374
43662
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
43375
- className: panel_module_css_default.row,
43376
- style: { justifyContent: "flex-end" },
43663
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
43377
43664
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
43378
43665
  type: "button",
43379
43666
  className: panel_module_css_default.button,
@@ -43402,10 +43689,6 @@ window.__ModuleLoader__.load({
43402
43689
  }),
43403
43690
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43404
43691
  className: panel_module_css_default.row,
43405
- style: {
43406
- gap: "var(--nf-space-8)",
43407
- flexWrap: "wrap"
43408
- },
43409
43692
  children: [
43410
43693
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43411
43694
  className: panel_module_css_default.input,
@@ -44847,7 +45130,7 @@ window.__ModuleLoader__.load({
44847
45130
  * 作者级首页容器:书架页左侧导航 + 内容区。
44848
45131
  * 导航复用工作区 .panelNav 玻璃卡片样式(同款),导航项为作者级:书架/改编/资产库/全局资产库/AI 进度/设置。
44849
45132
  */
44850
- const PLUGIN_VERSION = "2.1.3";
45133
+ const PLUGIN_VERSION = "2.1.5";
44851
45134
  /** GitHub 仓库地址(关于区块点击跳转)。 */
44852
45135
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
44853
45136
  /** 顶层 tab(横向,墨案:创作 / 灵感策划 / 资产 / 设置)+ 组内二级页。 */
@@ -45330,6 +45613,69 @@ window.__ModuleLoader__.load({
45330
45613
  });
45331
45614
  }
45332
45615
  //#endregion
45616
+ //#region src/client/panel/Sparkline.tsx
45617
+ /** 迷你柱状走势。宽固定 132、高 26,用 viewBox 缩放以适配窄容器。 */
45618
+ function Sparkline({ points, emptyHint = "尚未开写" }) {
45619
+ if (points.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
45620
+ className: "nf-spark-empty",
45621
+ children: emptyHint
45622
+ });
45623
+ const W = 132;
45624
+ const H = 26;
45625
+ const gap = 1;
45626
+ const bw = points.length === 1 ? W : Math.max(1, (W - gap * (points.length - 1)) / points.length);
45627
+ const max = Math.max(1, ...points.map((p) => p.chars));
45628
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
45629
+ className: "nf-spark",
45630
+ viewBox: `0 0 ${W} ${H}`,
45631
+ preserveAspectRatio: "none",
45632
+ "aria-hidden": "true",
45633
+ focusable: "false",
45634
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
45635
+ x1: 0,
45636
+ x2: W,
45637
+ y1: H - .5,
45638
+ y2: H - .5,
45639
+ stroke: "var(--nf-border)",
45640
+ strokeWidth: 1
45641
+ }), points.map((p, i) => {
45642
+ const x = i * (bw + gap);
45643
+ const h = p.chars === 0 ? 1 : Math.max(1.5, p.chars / max * (H - 3));
45644
+ const fill = p.approved ? "var(--nf-success)" : "var(--nf-border-2)";
45645
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
45646
+ x,
45647
+ y: H - h,
45648
+ width: bw,
45649
+ height: h,
45650
+ fill,
45651
+ rx: bw > 3 ? 1 : 0,
45652
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("title", { children: `第 ${p.no} 章 · ${p.chars.toLocaleString()} 字${p.approved ? " · 已过审" : ""}` })
45653
+ }, p.no);
45654
+ })]
45655
+ });
45656
+ }
45657
+ /**
45658
+ * 形态解读:把序列讲成一句人话,给 sparkline 当无障碍替代与悬停提示。
45659
+ * 不新增数据,只描述现有分布 —— 目的是让作者知道「该看哪里」而不是给结论。
45660
+ */
45661
+ function describeShape(points) {
45662
+ if (points.length === 0) return "尚未开写";
45663
+ const max = Math.max(...points.map((p) => p.chars));
45664
+ if (max === 0) return "已排章节均未落笔";
45665
+ const avg = points.reduce((a, b) => a + b.chars, 0) / points.length;
45666
+ const peak = points.reduce((a, b) => b.chars > a.chars ? b : a, points[0]);
45667
+ const empty = points.filter((p) => p.chars === 0).length;
45668
+ const bits = [];
45669
+ if (empty > 0) bits.push(`${empty} 章空白`);
45670
+ bits.push(`峰值第 ${peak.no} 章 ${peak.chars.toLocaleString()} 字`);
45671
+ if (max > 0 && avg > 0) {
45672
+ const ratio = max / avg;
45673
+ if (ratio >= 3) bits.push("分布很不均");
45674
+ else if (ratio <= 1.4) bits.push("分布均匀");
45675
+ }
45676
+ return bits.join(" · ");
45677
+ }
45678
+ //#endregion
45333
45679
  //#region src/client/panel/ReaderView.tsx
45334
45680
  /**
45335
45681
  * 阅读页:沉浸式章节阅读(纯只读,零 LLM 消耗)。
@@ -45932,12 +46278,8 @@ window.__ModuleLoader__.load({
45932
46278
  })]
45933
46279
  })] }) : null,
45934
46280
  run !== null && run.status === "running" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45935
- className: panel_module_css_default.row,
45936
- style: {
45937
- justifyContent: "space-between",
45938
- flexWrap: "wrap",
45939
- gap: "var(--nf-space-8)"
45940
- },
46281
+ className: `css.rowBetween css.rowBetweenWrap`,
46282
+ style: { gap: "var(--nf-space-8)" },
45941
46283
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
45942
46284
  className: panel_module_css_default.meta,
45943
46285
  children: [
@@ -46132,10 +46474,6 @@ window.__ModuleLoader__.load({
46132
46474
  children: [
46133
46475
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
46134
46476
  className: panel_module_css_default.row,
46135
- style: {
46136
- flexWrap: "wrap",
46137
- gap: "var(--nf-space-8)"
46138
- },
46139
46477
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
46140
46478
  className: panel_module_css_default.meta,
46141
46479
  children: [
@@ -46168,7 +46506,7 @@ window.__ModuleLoader__.load({
46168
46506
  className: panel_module_css_default.bigProgressBar,
46169
46507
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
46170
46508
  className: panel_module_css_default.bigProgressBarFill,
46171
- style: { width: `${Math.round(ratio * 100)}%` }
46509
+ style: { transform: `scaleX(${ratio})` }
46172
46510
  })
46173
46511
  }),
46174
46512
  run.pendingManual.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -47020,7 +47358,6 @@ window.__ModuleLoader__.load({
47020
47358
  }),
47021
47359
  (outlineText.trim().length > 0 || effectiveName !== "") && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47022
47360
  className: panel_module_css_default.row,
47023
- style: { flexWrap: "wrap" },
47024
47361
  children: [
47025
47362
  outlineText.trim().length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47026
47363
  className: panel_module_css_default.meta,
@@ -47069,7 +47406,6 @@ window.__ModuleLoader__.load({
47069
47406
  }),
47070
47407
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47071
47408
  className: panel_module_css_default.row,
47072
- style: { flexWrap: "wrap" },
47073
47409
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
47074
47410
  type: "button",
47075
47411
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
@@ -47104,12 +47440,8 @@ window.__ModuleLoader__.load({
47104
47440
  } : void 0,
47105
47441
  children: [
47106
47442
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47107
- className: panel_module_css_default.row,
47108
- style: {
47109
- justifyContent: "space-between",
47110
- flexWrap: "wrap",
47111
- gap: "var(--nf-space-6)"
47112
- },
47443
+ className: `css.rowBetween css.rowBetweenWrap`,
47444
+ style: { gap: "var(--nf-space-6)" },
47113
47445
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47114
47446
  style: {
47115
47447
  display: "flex",
@@ -47683,8 +48015,7 @@ window.__ModuleLoader__.load({
47683
48015
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47684
48016
  className: panel_module_css_default.card,
47685
48017
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47686
- className: panel_module_css_default.row,
47687
- style: { justifyContent: "space-between" },
48018
+ className: `css.rowBetween`,
47688
48019
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
47689
48020
  className: panel_module_css_default.cardTitle,
47690
48021
  children: "大世界"
@@ -47716,8 +48047,7 @@ window.__ModuleLoader__.load({
47716
48047
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47717
48048
  className: panel_module_css_default.card,
47718
48049
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47719
- className: panel_module_css_default.row,
47720
- style: { justifyContent: "space-between" },
48050
+ className: `css.rowBetween`,
47721
48051
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47722
48052
  className: panel_module_css_default.cardTitle,
47723
48053
  children: [
@@ -47775,8 +48105,7 @@ window.__ModuleLoader__.load({
47775
48105
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47776
48106
  className: panel_module_css_default.card,
47777
48107
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47778
- className: panel_module_css_default.row,
47779
- style: { justifyContent: "space-between" },
48108
+ className: `css.rowBetween`,
47780
48109
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47781
48110
  className: panel_module_css_default.cardTitle,
47782
48111
  children: [
@@ -47834,8 +48163,7 @@ window.__ModuleLoader__.load({
47834
48163
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47835
48164
  className: panel_module_css_default.card,
47836
48165
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47837
- className: panel_module_css_default.row,
47838
- style: { justifyContent: "space-between" },
48166
+ className: `css.rowBetween`,
47839
48167
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47840
48168
  className: panel_module_css_default.cardTitle,
47841
48169
  children: [
@@ -48542,11 +48870,7 @@ window.__ModuleLoader__.load({
48542
48870
  })
48543
48871
  ]
48544
48872
  })] }) : selected !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48545
- className: panel_module_css_default.row,
48546
- style: {
48547
- justifyContent: "space-between",
48548
- flexWrap: "wrap"
48549
- },
48873
+ className: `css.rowBetween css.rowBetweenWrap`,
48550
48874
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
48551
48875
  className: panel_module_css_default.cardTitleLg,
48552
48876
  children: [" ", selected.title]
@@ -48682,13 +49006,8 @@ window.__ModuleLoader__.load({
48682
49006
  style: { gap: "var(--nf-space-12)" },
48683
49007
  children: [
48684
49008
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48685
- className: panel_module_css_default.row,
48686
- style: {
48687
- justifyContent: "space-between",
48688
- alignItems: "center",
48689
- flexWrap: "wrap",
48690
- gap: "var(--nf-space-8)"
48691
- },
49009
+ className: `css.rowBetween css.rowBetweenWrap`,
49010
+ style: { gap: "var(--nf-space-8)" },
48692
49011
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48693
49012
  className: panel_module_css_default.cardTitle,
48694
49013
  children: "故事时间线"
@@ -48704,11 +49023,6 @@ window.__ModuleLoader__.load({
48704
49023
  }),
48705
49024
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48706
49025
  className: panel_module_css_default.row,
48707
- style: {
48708
- flexWrap: "wrap",
48709
- gap: "var(--nf-space-8)",
48710
- alignItems: "center"
48711
- },
48712
49026
  children: [
48713
49027
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
48714
49028
  className: panel_module_css_default.input,
@@ -48743,17 +49057,19 @@ window.__ModuleLoader__.load({
48743
49057
  })
48744
49058
  ]
48745
49059
  }),
48746
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48747
- style: {
48748
- color: "var(--nf-success)",
48749
- fontSize: "var(--nf-text-12)"
49060
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49061
+ kind: "ok",
49062
+ onRetry: () => {
49063
+ refresh();
48750
49064
  },
49065
+ retryLabel: "重新读取",
48751
49066
  children: notice
48752
49067
  }),
48753
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48754
- style: {
48755
- color: "var(--nf-error)",
48756
- fontSize: "var(--nf-text-12)"
49068
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49069
+ kind: "error",
49070
+ detail: "时间线依赖已抽取的章节事件。刚抽取完某章却报此错,通常是那章的抽取被中断了。",
49071
+ onRetry: () => {
49072
+ refresh();
48757
49073
  },
48758
49074
  children: error
48759
49075
  }),
@@ -48926,7 +49242,7 @@ window.__ModuleLoader__.load({
48926
49242
  },
48927
49243
  children: [
48928
49244
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
48929
- style: { fontSize: "var(--nf-fs-13)" },
49245
+ style: { fontSize: "var(--nf-fs-14)" },
48930
49246
  children: [
48931
49247
  "修正时间线事件 · 第 ",
48932
49248
  editing.chapterNo,
@@ -48992,11 +49308,7 @@ window.__ModuleLoader__.load({
48992
49308
  })]
48993
49309
  }),
48994
49310
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48995
- className: panel_module_css_default.row,
48996
- style: {
48997
- justifyContent: "flex-end",
48998
- gap: 6
48999
- },
49311
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49000
49312
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49001
49313
  type: "button",
49002
49314
  className: panel_module_css_default.button,
@@ -49199,13 +49511,8 @@ window.__ModuleLoader__.load({
49199
49511
  style: { gap: "var(--nf-space-12)" },
49200
49512
  children: [
49201
49513
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49202
- className: panel_module_css_default.row,
49203
- style: {
49204
- justifyContent: "space-between",
49205
- alignItems: "center",
49206
- flexWrap: "wrap",
49207
- gap: "var(--nf-space-8)"
49208
- },
49514
+ className: `css.rowBetween css.rowBetweenWrap`,
49515
+ style: { gap: "var(--nf-space-8)" },
49209
49516
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49210
49517
  className: panel_module_css_default.cardTitle,
49211
49518
  children: "张力曲线"
@@ -49224,11 +49531,6 @@ window.__ModuleLoader__.load({
49224
49531
  }),
49225
49532
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49226
49533
  className: panel_module_css_default.row,
49227
- style: {
49228
- gap: "var(--nf-space-8)",
49229
- alignItems: "center",
49230
- flexWrap: "wrap"
49231
- },
49232
49534
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
49233
49535
  className: panel_module_css_default.input,
49234
49536
  value: data?.preset ?? "escalation",
@@ -49243,17 +49545,19 @@ window.__ModuleLoader__.load({
49243
49545
  children: "虚线=参考曲线形状;实线=目标;绿点=审稿实际。点图中任意一章可改目标张力。"
49244
49546
  })]
49245
49547
  }),
49246
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49247
- style: {
49248
- color: "var(--nf-success)",
49249
- fontSize: "var(--nf-text-12)"
49548
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49549
+ kind: "ok",
49550
+ onRetry: () => {
49551
+ refresh();
49250
49552
  },
49553
+ retryLabel: "重新读取",
49251
49554
  children: notice
49252
49555
  }),
49253
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49254
- style: {
49255
- color: "var(--nf-error)",
49256
- fontSize: "var(--nf-text-12)"
49556
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49557
+ kind: "error",
49558
+ detail: "张力曲线依赖章节计划与审稿结果。若刚改过卷 / 章节计划,先重试刷新再核对。",
49559
+ onRetry: () => {
49560
+ refresh();
49257
49561
  },
49258
49562
  children: error
49259
49563
  }),
@@ -49354,7 +49658,7 @@ window.__ModuleLoader__.load({
49354
49658
  },
49355
49659
  children: [
49356
49660
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
49357
- style: { fontSize: "var(--nf-fs-13)" },
49661
+ style: { fontSize: "var(--nf-fs-14)" },
49358
49662
  children: [
49359
49663
  "第 ",
49360
49664
  editing,
@@ -49369,8 +49673,7 @@ window.__ModuleLoader__.load({
49369
49673
  onChange: (e) => setDraft(Number(e.target.value))
49370
49674
  }),
49371
49675
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49372
- className: panel_module_css_default.row,
49373
- style: { justifyContent: "space-between" },
49676
+ className: `css.rowBetween`,
49374
49677
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49375
49678
  className: panel_module_css_default.meta,
49376
49679
  children: [
@@ -49390,11 +49693,7 @@ window.__ModuleLoader__.load({
49390
49693
  })]
49391
49694
  }),
49392
49695
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49393
- className: panel_module_css_default.row,
49394
- style: {
49395
- justifyContent: "flex-end",
49396
- gap: 6
49397
- },
49696
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49398
49697
  children: [
49399
49698
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49400
49699
  type: "button",
@@ -49425,6 +49724,281 @@ window.__ModuleLoader__.load({
49425
49724
  });
49426
49725
  }
49427
49726
  //#endregion
49727
+ //#region src/client/panel/StyleView.tsx
49728
+ /**
49729
+ * 风格漂移曲线:把「每一章离本书自己的风格基线有多远」画出来。
49730
+ *
49731
+ * 图上三条信息:基线(虚线,本书已过审章节的中位数)、逐章实际(折线)、显著偏离的章(红点)。
49732
+ * 指标可切换:句均长 / 短句占比 / 对话占比 / 段落均长。
49733
+ *
49734
+ * 两点刻意的设计:
49735
+ * 1. **基线与审稿同源** —— 用的是同一份 styleBaseline,所以图上看到的就是审稿判偏离用的那把尺子。
49736
+ * 若各画各的,作者会看到两个不一致的结论。
49737
+ * 2. **数值即时算、不落盘** —— 数据源就是章节文件本身,存一份快照只会带来陈旧问题。
49738
+ *
49739
+ * 只画四项长度/比率指标:句长起伏与意象密度是诊断用的,画成曲线反而难读。
49740
+ */
49741
+ const METRICS = [
49742
+ {
49743
+ key: "avgSentenceLength",
49744
+ label: "句均长",
49745
+ percent: false
49746
+ },
49747
+ {
49748
+ key: "shortSentenceRatio",
49749
+ label: "短句占比",
49750
+ percent: true
49751
+ },
49752
+ {
49753
+ key: "dialogueRatio",
49754
+ label: "对话占比",
49755
+ percent: true
49756
+ },
49757
+ {
49758
+ key: "avgParagraphLength",
49759
+ label: "段落均长",
49760
+ percent: false
49761
+ }
49762
+ ];
49763
+ /** 把服务端给的「指标 key + 方向箭头」显示成中文。 */
49764
+ function labelOf(significant) {
49765
+ const found = METRICS.find((m) => significant.startsWith(m.key));
49766
+ return found === void 0 ? significant : found.label + significant.slice(found.key.length);
49767
+ }
49768
+ /** 简易折线图(SVG,无依赖):横轴按章节序号均分,纵轴按本图最大值归一。 */
49769
+ function DriftChart({ points, metric, baseline, percent }) {
49770
+ const W = 720;
49771
+ const H = 200;
49772
+ const padX = 28;
49773
+ const padY = 16;
49774
+ const n = points.length;
49775
+ const values = points.map((p) => p.measured ? p[metric] : void 0);
49776
+ const known = values.filter((v) => v !== void 0);
49777
+ const maxRaw = Math.max(baseline ?? 0, ...known);
49778
+ const max = maxRaw > 0 ? maxRaw * 1.12 : 1;
49779
+ const x = (i) => n <= 1 ? W / 2 : padX + i / (n - 1) * (W - padX * 2);
49780
+ const y = (v) => padY + (1 - v / max) * (H - padY * 2);
49781
+ const fmt = (v) => percent ? (v * 100).toFixed(1) + "%" : v.toFixed(1);
49782
+ const line = values.map((v, i) => v === void 0 ? null : x(i).toFixed(1) + "," + y(v).toFixed(1)).filter((s) => s !== null).join(" ");
49783
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
49784
+ viewBox: "0 0 720 200",
49785
+ width: "100%",
49786
+ height: H,
49787
+ role: "img",
49788
+ "aria-label": "风格漂移曲线",
49789
+ children: [
49790
+ [0, .5].map((r) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
49791
+ x1: padX,
49792
+ x2: W - padX,
49793
+ y1: y(max * r),
49794
+ y2: y(max * r),
49795
+ stroke: "var(--nf-border)",
49796
+ strokeWidth: .5,
49797
+ strokeDasharray: "3 4"
49798
+ }, r)),
49799
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
49800
+ x1: padX,
49801
+ x2: W - padX,
49802
+ y1: y(0),
49803
+ y2: y(0),
49804
+ stroke: "var(--nf-border)",
49805
+ strokeWidth: 1
49806
+ }),
49807
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
49808
+ x: 4,
49809
+ y: y(max) + 10,
49810
+ fontSize: 9,
49811
+ fill: "var(--nf-text-2)",
49812
+ children: fmt(max)
49813
+ }),
49814
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
49815
+ x: 4,
49816
+ y: y(0) + 3,
49817
+ fontSize: 9,
49818
+ fill: "var(--nf-text-2)",
49819
+ children: "0"
49820
+ }),
49821
+ baseline !== void 0 && baseline > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
49822
+ x1: padX,
49823
+ x2: W - padX,
49824
+ y1: y(baseline),
49825
+ y2: y(baseline),
49826
+ stroke: "var(--nf-accent)",
49827
+ strokeWidth: 1.5,
49828
+ strokeDasharray: "5 4",
49829
+ opacity: .85
49830
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("text", {
49831
+ x: W - padX,
49832
+ y: y(baseline) - 4,
49833
+ fontSize: 9,
49834
+ textAnchor: "end",
49835
+ fill: "var(--nf-accent)",
49836
+ children: ["基线 ", fmt(baseline)]
49837
+ })] }),
49838
+ line !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("polyline", {
49839
+ points: line,
49840
+ fill: "none",
49841
+ stroke: "var(--nf-text-2)",
49842
+ strokeWidth: 1.5
49843
+ }),
49844
+ points.map((p, i) => {
49845
+ const v = values[i];
49846
+ if (v === void 0) return null;
49847
+ const off = p.significant.some((s) => s.startsWith(metric));
49848
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
49849
+ cx: x(i),
49850
+ cy: y(v),
49851
+ r: off ? 3.4 : 2,
49852
+ fill: off ? "var(--nf-error)" : "var(--nf-success)",
49853
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("title", { children: "第" + p.no + "章 " + p.title + "|" + fmt(v) + (off ? "|偏离:" + p.significant.map(labelOf).join("、") : "") })
49854
+ }, p.no);
49855
+ })
49856
+ ]
49857
+ });
49858
+ }
49859
+ function StyleView({ api }) {
49860
+ const [data, setData] = (0, react.useState)(null);
49861
+ const [error, setError] = (0, react.useState)("");
49862
+ const [metric, setMetric] = (0, react.useState)("avgSentenceLength");
49863
+ const refresh = (0, react.useCallback)(async (showError = true) => {
49864
+ try {
49865
+ setData(await api.styleHistory());
49866
+ } catch (err) {
49867
+ if (showError) setError(err.message);
49868
+ }
49869
+ }, [api]);
49870
+ (0, react.useEffect)(() => {
49871
+ refresh(false);
49872
+ }, [refresh]);
49873
+ const points = data?.points ?? [];
49874
+ const measured = points.filter((p) => p.measured);
49875
+ const offChapters = points.filter((p) => p.significant.length > 0);
49876
+ const current = METRICS.find((m) => m.key === metric) ?? METRICS[0];
49877
+ const baseline = data?.baseline === null || data?.baseline === void 0 ? void 0 : data.baseline[metric];
49878
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49879
+ className: panel_module_css_default.card,
49880
+ style: { gap: "var(--nf-space-12)" },
49881
+ children: [
49882
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49883
+ className: `css.rowBetween css.rowBetweenWrap`,
49884
+ style: { gap: "var(--nf-space-8)" },
49885
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49886
+ className: panel_module_css_default.cardTitle,
49887
+ children: "风格漂移曲线"
49888
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49889
+ className: panel_module_css_default.meta,
49890
+ children: [
49891
+ points.length,
49892
+ " 章 · 可测 ",
49893
+ measured.length,
49894
+ " 章 · 偏离 ",
49895
+ offChapters.length,
49896
+ " 章",
49897
+ data !== null && data.baselineLabel !== "" ? " · 基线:" + data.baselineLabel : ""
49898
+ ]
49899
+ })]
49900
+ }),
49901
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49902
+ className: panel_module_css_default.row,
49903
+ children: [
49904
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
49905
+ className: panel_module_css_default.input,
49906
+ value: metric,
49907
+ onChange: (e) => setMetric(e.target.value),
49908
+ children: METRICS.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
49909
+ value: m.key,
49910
+ children: m.label
49911
+ }, m.key))
49912
+ }),
49913
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49914
+ className: panel_module_css_default.meta,
49915
+ children: "虚线=本书风格基线;红点=该指标超出容忍度。基线与审稿同源。"
49916
+ }),
49917
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49918
+ type: "button",
49919
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
49920
+ onClick: () => {
49921
+ refresh();
49922
+ },
49923
+ children: "刷新"
49924
+ })
49925
+ ]
49926
+ }),
49927
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49928
+ kind: "error",
49929
+ detail: "风格漂移需要已有章节正文(每章 200 字以上)。若刚写完新章,重试通常就能算出指标。",
49930
+ onRetry: () => {
49931
+ refresh();
49932
+ },
49933
+ children: error
49934
+ }),
49935
+ measured.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49936
+ className: panel_module_css_default.meta,
49937
+ children: "还没有可测的章节正文(每章需 200 字以上才能算指标)。先在「总编台 → 生产单」写几章。"
49938
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49939
+ style: {
49940
+ display: "flex",
49941
+ flexDirection: "column",
49942
+ gap: "var(--nf-space-8)"
49943
+ },
49944
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DriftChart, {
49945
+ points,
49946
+ metric,
49947
+ baseline,
49948
+ percent: current.percent
49949
+ }), offChapters.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49950
+ style: {
49951
+ border: "1px solid var(--nf-border)",
49952
+ borderRadius: 8,
49953
+ padding: 8,
49954
+ background: "var(--nf-bg-inset)",
49955
+ maxHeight: 220,
49956
+ overflowY: "auto"
49957
+ },
49958
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
49959
+ style: { fontSize: "var(--nf-fs-12)" },
49960
+ children: [
49961
+ "偏离章节 ",
49962
+ offChapters.length,
49963
+ " 章"
49964
+ ]
49965
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
49966
+ style: {
49967
+ display: "flex",
49968
+ flexDirection: "column",
49969
+ gap: 4,
49970
+ marginTop: 6
49971
+ },
49972
+ children: offChapters.map((p) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49973
+ style: { fontSize: "var(--nf-fs-12)" },
49974
+ children: [
49975
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49976
+ className: panel_module_css_default.lfPill,
49977
+ "data-phase": "requesting",
49978
+ children: [
49979
+ "第 ",
49980
+ p.no,
49981
+ " 章"
49982
+ ]
49983
+ }),
49984
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49985
+ style: { marginLeft: 6 },
49986
+ children: p.title
49987
+ }),
49988
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49989
+ className: panel_module_css_default.meta,
49990
+ style: { marginLeft: 6 },
49991
+ children: p.significant.map(labelOf).join("、")
49992
+ })
49993
+ ]
49994
+ }, p.no))
49995
+ })]
49996
+ })]
49997
+ })
49998
+ ]
49999
+ });
50000
+ }
50001
+ //#endregion
49428
50002
  //#region src/client/panel/PromptSlotsView.tsx
49429
50003
  /**
49430
50004
  * 提示词槽位:给作者留几个**安全可改**的位置来微调本书表达偏好。
@@ -49474,13 +50048,8 @@ window.__ModuleLoader__.load({
49474
50048
  style: { gap: "var(--nf-space-12)" },
49475
50049
  children: [
49476
50050
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49477
- className: panel_module_css_default.row,
49478
- style: {
49479
- justifyContent: "space-between",
49480
- alignItems: "center",
49481
- flexWrap: "wrap",
49482
- gap: "var(--nf-space-8)"
49483
- },
50051
+ className: `css.rowBetween css.rowBetweenWrap`,
50052
+ style: { gap: "var(--nf-space-8)" },
49484
50053
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49485
50054
  className: panel_module_css_default.cardTitle,
49486
50055
  children: "提示词槽位(本书)"
@@ -49493,17 +50062,15 @@ window.__ModuleLoader__.load({
49493
50062
  className: panel_module_css_default.meta,
49494
50063
  children: "这里的文字会追加到写作提示词末尾,用来微调表达方式。**规则类内容不可改**: 道藏、写作红线、内容合规红线、反 AI 规则、阶段契约由宿主锁定,槽位碰不到。"
49495
50064
  }),
49496
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49497
- style: {
49498
- color: "var(--nf-success)",
49499
- fontSize: "var(--nf-text-12)"
49500
- },
50065
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
50066
+ kind: "ok",
49501
50067
  children: notice
49502
50068
  }),
49503
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49504
- style: {
49505
- color: "var(--nf-error)",
49506
- fontSize: "var(--nf-text-12)"
50069
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
50070
+ kind: "error",
50071
+ detail: "槽位写入失败时本次修改未生效,规则类内容(道藏 / 红线 / 合规)不受影响。重试会重新提交当前草稿。",
50072
+ onRetry: () => {
50073
+ refresh();
49507
50074
  },
49508
50075
  children: error
49509
50076
  }),
@@ -49521,12 +50088,8 @@ window.__ModuleLoader__.load({
49521
50088
  },
49522
50089
  children: [
49523
50090
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49524
- className: panel_module_css_default.row,
49525
- style: {
49526
- justifyContent: "space-between",
49527
- alignItems: "baseline",
49528
- gap: "var(--nf-space-8)"
49529
- },
50091
+ className: `css.rowBetween css.rowBetweenBaseline`,
50092
+ style: { gap: "var(--nf-space-8)" },
49530
50093
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
49531
50094
  style: { fontSize: "var(--nf-fs-12)" },
49532
50095
  children: slot.label
@@ -49555,11 +50118,7 @@ window.__ModuleLoader__.load({
49555
50118
  }))
49556
50119
  }),
49557
50120
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49558
- className: panel_module_css_default.row,
49559
- style: {
49560
- justifyContent: "flex-end",
49561
- gap: 6
49562
- },
50121
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49563
50122
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49564
50123
  type: "button",
49565
50124
  className: panel_module_css_default.button,
@@ -49664,11 +50223,7 @@ window.__ModuleLoader__.load({
49664
50223
  },
49665
50224
  children: [
49666
50225
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49667
- className: panel_module_css_default.row,
49668
- style: {
49669
- justifyContent: "space-between",
49670
- flexWrap: "wrap"
49671
- },
50226
+ className: `css.rowBetween css.rowBetweenWrap`,
49672
50227
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49673
50228
  style: {
49674
50229
  display: "flex",
@@ -49759,11 +50314,7 @@ window.__ModuleLoader__.load({
49759
50314
  },
49760
50315
  children: [
49761
50316
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49762
- className: panel_module_css_default.row,
49763
- style: {
49764
- justifyContent: "space-between",
49765
- flexWrap: "wrap"
49766
- },
50317
+ className: `css.rowBetween css.rowBetweenWrap`,
49767
50318
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49768
50319
  style: {
49769
50320
  display: "flex",
@@ -49832,11 +50383,7 @@ window.__ModuleLoader__.load({
49832
50383
  },
49833
50384
  children: [
49834
50385
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49835
- className: panel_module_css_default.row,
49836
- style: {
49837
- justifyContent: "space-between",
49838
- flexWrap: "wrap"
49839
- },
50386
+ className: `css.rowBetween css.rowBetweenWrap`,
49840
50387
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49841
50388
  style: {
49842
50389
  display: "flex",
@@ -49925,11 +50472,7 @@ window.__ModuleLoader__.load({
49925
50472
  },
49926
50473
  children: [
49927
50474
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49928
- className: panel_module_css_default.row,
49929
- style: {
49930
- justifyContent: "space-between",
49931
- flexWrap: "wrap"
49932
- },
50475
+ className: `css.rowBetween css.rowBetweenWrap`,
49933
50476
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 剧情健康检查" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49934
50477
  style: {
49935
50478
  display: "flex",
@@ -50027,11 +50570,7 @@ window.__ModuleLoader__.load({
50027
50570
  },
50028
50571
  children: [
50029
50572
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50030
- className: panel_module_css_default.row,
50031
- style: {
50032
- justifyContent: "space-between",
50033
- flexWrap: "wrap"
50034
- },
50573
+ className: `css.rowBetween css.rowBetweenWrap`,
50035
50574
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 剧情方案" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
50036
50575
  type: "button",
50037
50576
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
@@ -50059,11 +50598,7 @@ window.__ModuleLoader__.load({
50059
50598
  },
50060
50599
  children: [
50061
50600
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50062
- className: panel_module_css_default.row,
50063
- style: {
50064
- justifyContent: "space-between",
50065
- flexWrap: "wrap"
50066
- },
50601
+ className: `css.rowBetween css.rowBetweenWrap`,
50067
50602
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50068
50603
  style: {
50069
50604
  display: "flex",
@@ -50116,11 +50651,7 @@ window.__ModuleLoader__.load({
50116
50651
  },
50117
50652
  children: [
50118
50653
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50119
- className: panel_module_css_default.row,
50120
- style: {
50121
- justifyContent: "space-between",
50122
- flexWrap: "wrap"
50123
- },
50654
+ className: `css.rowBetween css.rowBetweenWrap`,
50124
50655
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
50125
50656
  " 建议(",
50126
50657
  props.suggestions.length,
@@ -50144,11 +50675,7 @@ window.__ModuleLoader__.load({
50144
50675
  fontSize: "var(--nf-fs-12)"
50145
50676
  },
50146
50677
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50147
- className: panel_module_css_default.row,
50148
- style: {
50149
- justifyContent: "space-between",
50150
- flexWrap: "wrap"
50151
- },
50678
+ className: `css.rowBetween css.rowBetweenWrap`,
50152
50679
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50153
50680
  style: {
50154
50681
  display: "flex",
@@ -50319,6 +50846,87 @@ window.__ModuleLoader__.load({
50319
50846
  label: tt("tab.settings"),
50320
50847
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 18 })
50321
50848
  };
50849
+ /**
50850
+ * 工作台顶栏导航项(组件内构造,因为 go / badge 依赖当前状态)。
50851
+ *
50852
+ * 修订(设计专属性):此前顶栏用 5 个 Unicode 字形(▣ ✎ ❖ ▦ ⚙),
50853
+ * 而 NAV_GROUPS 里已经躺着 13 个 lucide 图标 + 6 个「按创作阶段归类」的分组 ——
50854
+ * 一套被设计好、写过、注释里解释清楚的东西从未被渲染,被临时字形替掉了。
50855
+ * 现在统一到 lucide 图标语汇,并按 NAV_GROUPS 的阶段语义重排:
50856
+ *
50857
+ * 构思 → 总纲 → 设定 → 写作 → 分析
50858
+ *
50859
+ * 顺序不再按「功能」(写作/设定/资产),而是按作者真实的推进顺序;
50860
+ * `title` 说明每个入口到底做什么(原来只有 3 个字,看不出边界)。
50861
+ */
50862
+ /** 抽屉标题元数据:图标 + 文案。原先用 Unicode 字形(✎❖▦⚙⌘⚲…),
50863
+ * 在无 ligature 的字体里退化成豆腐块,且与顶栏已改用的 lucide 不是一套语言。 */
50864
+ const DRAWER_META = {
50865
+ write: {
50866
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookMarked, { size: 14 }),
50867
+ label: "写作 · 章节索引"
50868
+ },
50869
+ setup: {
50870
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 14 }),
50871
+ label: "设定 · 道藏"
50872
+ },
50873
+ assets: {
50874
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Folder, { size: 14 }),
50875
+ label: "资产 · 创作素材库"
50876
+ },
50877
+ params: {
50878
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 14 }),
50879
+ label: "写作参数 · 设置"
50880
+ },
50881
+ overview: {
50882
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 14 }),
50883
+ label: "总纲 / 大纲"
50884
+ },
50885
+ blurb: {
50886
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Book, { size: 14 }),
50887
+ label: "简介 / 封面"
50888
+ },
50889
+ plotlines: {
50890
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.GitBranch, { size: 14 }),
50891
+ label: "剧情线 · 伏笔"
50892
+ },
50893
+ director: {
50894
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Brain, { size: 14 }),
50895
+ label: "自动编辑"
50896
+ },
50897
+ knowledge: {
50898
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, { size: 14 }),
50899
+ label: "知识库"
50900
+ },
50901
+ run: {
50902
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Factory, { size: 14 }),
50903
+ label: "生产单"
50904
+ },
50905
+ breakdown: {
50906
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Search, { size: 14 }),
50907
+ label: "拆书分析"
50908
+ },
50909
+ timeline: {
50910
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ScrollText, { size: 14 }),
50911
+ label: "故事时间线"
50912
+ },
50913
+ tension: {
50914
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BarChart3, { size: 14 }),
50915
+ label: "张力曲线"
50916
+ },
50917
+ style: {
50918
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Sparkles, { size: 14 }),
50919
+ label: "风格漂移"
50920
+ },
50921
+ promptSlots: {
50922
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ListTree, { size: 14 }),
50923
+ label: "提示词槽位"
50924
+ },
50925
+ fallback: {
50926
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 14 }),
50927
+ label: "详情"
50928
+ }
50929
+ };
50322
50930
  /** 审稿维度中文名(审稿问题按维度标注展示)。 */
50323
50931
  const REVIEW_DIM_ZH = {
50324
50932
  character: "人设",
@@ -50859,11 +51467,7 @@ window.__ModuleLoader__.load({
50859
51467
  },
50860
51468
  children: [
50861
51469
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50862
- className: panel_module_css_default.row,
50863
- style: {
50864
- justifyContent: "space-between",
50865
- alignItems: "center"
50866
- },
51470
+ className: `css.rowBetween`,
50867
51471
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50868
51472
  className: panel_module_css_default.meta,
50869
51473
  children: "覆盖写入前会自动留存;回滚也可再撤销。"
@@ -50919,8 +51523,7 @@ window.__ModuleLoader__.load({
50919
51523
  tab === "diff" && (hasDraft ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50920
51524
  className: panel_module_css_default.chWorkDraftBar,
50921
51525
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50922
- className: panel_module_css_default.row,
50923
- style: { justifyContent: "space-between" },
51526
+ className: `css.rowBetween`,
50924
51527
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "草稿待处置" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50925
51528
  className: panel_module_css_default.meta,
50926
51529
  children: [
@@ -50965,8 +51568,7 @@ window.__ModuleLoader__.load({
50965
51568
  className: panel_module_css_default.reviewBox,
50966
51569
  children: [
50967
51570
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50968
- className: panel_module_css_default.row,
50969
- style: { justifyContent: "space-between" },
51571
+ className: `css.rowBetween`,
50970
51572
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "审稿报告" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50971
51573
  style: { color: review.passed ? "var(--nf-success)" : "var(--nf-error)" },
50972
51574
  children: [
@@ -51091,8 +51693,7 @@ window.__ModuleLoader__.load({
51091
51693
  style: { borderColor: "color-mix(in srgb, var(--nf-info) 45%, transparent)" },
51092
51694
  children: [
51093
51695
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51094
- className: panel_module_css_default.row,
51095
- style: { justifyContent: "space-between" },
51696
+ className: `css.rowBetween`,
51096
51697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "作者复盘" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
51097
51698
  style: { color: author.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
51098
51699
  children: [
@@ -51192,6 +51793,8 @@ window.__ModuleLoader__.load({
51192
51793
  const [busyLabel, setBusyLabel] = (0, react.useState)("");
51193
51794
  const [error, setError] = (0, react.useState)("");
51194
51795
  const [notice, setNotice] = (0, react.useState)("");
51796
+ /** 破坏性操作确认弹窗(取代 9 处 window.confirm)。渲染点在本组件 return 的根部。 */
51797
+ const confirmUi = useConfirm();
51195
51798
  const [progress, setProgress] = (0, react.useState)([]);
51196
51799
  const [configDraft, setConfigDraft] = (0, react.useState)(null);
51197
51800
  const [expandedChapter, setExpandedChapter] = (0, react.useState)(null);
@@ -51880,50 +52483,73 @@ window.__ModuleLoader__.load({
51880
52483
  }
51881
52484
  };
51882
52485
  /** 反推大纲:从已写章节正文反向生成全书总纲(流式进度)。 */
51883
- const handleReverseOutline = async () => {
52486
+ const handleReverseOutline = () => {
51884
52487
  if (project === null) return;
51885
- if (!window.confirm("将从已写章节正文反推出全书总纲(覆盖当前大纲文本,不影响章节/设定/进度)。确定继续?")) return;
51886
- setBusy(true);
51887
- setError("");
51888
- try {
51889
- await api.outlineReverse((frame) => {
51890
- if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
51891
- else if (frame.type === "outline-done") {
51892
- setOutlineText(frame.outline);
51893
- pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
52488
+ confirmUi.confirm({
52489
+ title: "从已写章节反推全书总纲",
52490
+ body: "将读取已写章节正文,反推出全书总纲并覆盖当前大纲文本。",
52491
+ effects: ["当前「总纲 / 大纲」文本会被覆盖", "已写章节、设定、进度不受影响"],
52492
+ assurance: "覆盖前会先留存当前大纲,可在历史版本里换回来。",
52493
+ tone: "warn",
52494
+ confirmLabel: "反推并覆盖",
52495
+ onConfirm: async () => {
52496
+ setBusy(true);
52497
+ setError("");
52498
+ try {
52499
+ await api.outlineReverse((frame) => {
52500
+ if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
52501
+ else if (frame.type === "outline-done") {
52502
+ setOutlineText(frame.outline);
52503
+ pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
52504
+ }
52505
+ });
52506
+ await refresh(false);
52507
+ } catch (err) {
52508
+ setError(err.message);
52509
+ pushProgress(`反推大纲失败:${err.message}`, "error");
52510
+ } finally {
52511
+ setBusy(false);
51894
52512
  }
51895
- });
51896
- await refresh(false);
51897
- } catch (err) {
51898
- setError(err.message);
51899
- pushProgress(`反推大纲失败:${err.message}`, "error");
51900
- } finally {
51901
- setBusy(false);
51902
- }
52513
+ }
52514
+ });
51903
52515
  };
51904
52516
  /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */
51905
52517
  const handleToggleUpdateOutline = () => {
51906
52518
  if (!updatingOutline && project !== null) setOutlineText(project.outline);
51907
52519
  setUpdatingOutline((v) => !v);
51908
52520
  };
51909
- /** 重置项目:清空全部进度,从新大纲重新开始(二次确认)。 */
51910
- const handleResetProject = async () => {
52521
+ /** 重置项目:清空全部进度,从新大纲重新开始(危险档:需逐字输入「重置」)。 */
52522
+ const handleResetProject = () => {
51911
52523
  if (project === null) return;
51912
- if (!window.confirm("将清空本书全部进度(道藏/卷计划/章节计划/已生成章节/暗线/写作资产/编年录),且不可恢复。确定用新总纲重置?")) return;
51913
- setBusy(true);
51914
- setError("");
51915
- try {
51916
- const result = await api.reset(outlineText);
51917
- setUpdatingOutline(false);
51918
- pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, "done");
51919
- } catch (err) {
51920
- setError(err.message);
51921
- pushProgress(`重置失败:${err.message}`, "error");
51922
- } finally {
51923
- setBusy(false);
51924
- setBusyLabel("");
51925
- await refresh(false);
51926
- }
52524
+ confirmUi.confirm({
52525
+ title: "用新总纲重置本书",
52526
+ body: "本书的全部进度会被清空,从新总纲重新开始。这一步不可恢复。",
52527
+ effects: [
52528
+ "道藏 / 卷计划 / 章节计划",
52529
+ "已生成章节正文",
52530
+ "暗线 / 写作资产 / 编年录"
52531
+ ],
52532
+ assurance: "大纲文本本身保留;已写章节建议先在书架里备份一份再重置。",
52533
+ tone: "danger",
52534
+ requirePhrase: "重置",
52535
+ confirmLabel: "确认重置",
52536
+ onConfirm: async () => {
52537
+ setBusy(true);
52538
+ setError("");
52539
+ try {
52540
+ const result = await api.reset(outlineText);
52541
+ setUpdatingOutline(false);
52542
+ pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, "done");
52543
+ } catch (err) {
52544
+ setError(err.message);
52545
+ pushProgress(`重置失败:${err.message}`, "error");
52546
+ } finally {
52547
+ setBusy(false);
52548
+ setBusyLabel("");
52549
+ await refresh(false);
52550
+ }
52551
+ }
52552
+ });
51927
52553
  };
51928
52554
  /** 全书一致性质检(LLM 扫描已生成章节)。 */
51929
52555
  const handleAudit = async () => {
@@ -52025,26 +52651,35 @@ window.__ModuleLoader__.load({
52025
52651
  }
52026
52652
  };
52027
52653
  /** 章节直接通过(作者行使最终决定权)。 */
52028
- const handleChapterApprove = async (no) => {
52029
- if (!window.confirm(`确定直接通过第 ${no} 章?(跳过审稿判定,保留审稿记录)`)) return;
52030
- setBusy(true);
52031
- setError("");
52032
- try {
52033
- await api.chapterApprove(no);
52034
- setProject((prev) => prev === null ? prev : {
52035
- ...prev,
52036
- chapters: prev.chapters.map((c) => c.no === no ? {
52037
- ...c,
52038
- status: "approved"
52039
- } : c)
52040
- });
52041
- pushProgress(`第 ${no} 章已直接通过`, "done");
52042
- } catch (err) {
52043
- setError(err.message);
52044
- pushProgress(`操作失败:${err.message}`, "error");
52045
- } finally {
52046
- setBusy(false);
52047
- }
52654
+ const handleChapterApprove = (no) => {
52655
+ confirmUi.confirm({
52656
+ title: `直接通过第 ${no} 章`,
52657
+ body: "跳过审稿判定,直接把本章标记为通过。",
52658
+ effects: ["审稿记录会保留,但判定结论不再阻止本章定稿"],
52659
+ assurance: "事后仍可对该章重新审稿。",
52660
+ tone: "info",
52661
+ confirmLabel: "直接通过",
52662
+ onConfirm: async () => {
52663
+ setBusy(true);
52664
+ setError("");
52665
+ try {
52666
+ await api.chapterApprove(no);
52667
+ setProject((prev) => prev === null ? prev : {
52668
+ ...prev,
52669
+ chapters: prev.chapters.map((c) => c.no === no ? {
52670
+ ...c,
52671
+ status: "approved"
52672
+ } : c)
52673
+ });
52674
+ pushProgress(`第 ${no} 章已直接通过`, "done");
52675
+ } catch (err) {
52676
+ setError(err.message);
52677
+ pushProgress(`操作失败:${err.message}`, "error");
52678
+ } finally {
52679
+ setBusy(false);
52680
+ }
52681
+ }
52682
+ });
52048
52683
  };
52049
52684
  /** 剧情线:保存草稿(新增或更新)。 */
52050
52685
  const handlePlotlineSave = async () => {
@@ -52085,26 +52720,34 @@ window.__ModuleLoader__.load({
52085
52720
  }
52086
52721
  };
52087
52722
  /** 剧情线:删除。 */
52088
- const handlePlotlineRemove = async (id) => {
52089
- if (!window.confirm("确定删除这条剧情线?关联章节记录会一并移除。")) return;
52090
- setBusy(true);
52091
- setError("");
52092
- try {
52093
- const result = await api.plotlines({
52094
- op: "remove",
52095
- id
52096
- });
52097
- setProject((prev) => prev === null ? prev : {
52098
- ...prev,
52099
- plotlines: result.plotlines,
52100
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52101
- });
52102
- pushProgress("剧情线已删除", "done");
52103
- } catch (err) {
52104
- setError(err.message);
52105
- } finally {
52106
- setBusy(false);
52107
- }
52723
+ const handlePlotlineRemove = (id) => {
52724
+ const line = project?.plotlines?.find((p) => p.id === id);
52725
+ confirmUi.confirm({
52726
+ title: "删除这条剧情线",
52727
+ body: line === void 0 ? "剧情线与其关联的章节记录会一并移除。" : `剧情线「${line.name}」与其关联的章节记录会一并移除。`,
52728
+ effects: ["章节正文里的剧情线标记会消失", "该线下的伏笔账目不再计入统计"],
52729
+ tone: "danger",
52730
+ onConfirm: async () => {
52731
+ setBusy(true);
52732
+ setError("");
52733
+ try {
52734
+ const result = await api.plotlines({
52735
+ op: "remove",
52736
+ id
52737
+ });
52738
+ setProject((prev) => prev === null ? prev : {
52739
+ ...prev,
52740
+ plotlines: result.plotlines,
52741
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52742
+ });
52743
+ pushProgress("剧情线已删除", "done");
52744
+ } catch (err) {
52745
+ setError(err.message);
52746
+ } finally {
52747
+ setBusy(false);
52748
+ }
52749
+ }
52750
+ });
52108
52751
  };
52109
52752
  /** 剧情线:建议候选线。 */
52110
52753
  const handlePlotlineSuggest = async () => {
@@ -52407,26 +53050,33 @@ window.__ModuleLoader__.load({
52407
53050
  }
52408
53051
  };
52409
53052
  /** 角色库:删除角色。 */
52410
- const handleRoleRemove = async (name) => {
52411
- if (!window.confirm(`确定从角色库删除「${name}」?`)) return;
52412
- setBusy(true);
52413
- setError("");
52414
- try {
52415
- const result = await api.roles({
52416
- op: "remove",
52417
- name
52418
- });
52419
- setProject((prev) => prev === null ? prev : {
52420
- ...prev,
52421
- roles: result.roles,
52422
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52423
- });
52424
- pushProgress(`已从角色库删除:${name}`, "info");
52425
- } catch (err) {
52426
- setError(err.message);
52427
- } finally {
52428
- setBusy(false);
52429
- }
53053
+ const handleRoleRemove = (name) => {
53054
+ confirmUi.confirm({
53055
+ title: `从角色库删除「${name}」`,
53056
+ body: "该角色会从角色库移除。",
53057
+ effects: ["章节正文里对它的引用不受影响", "设定集中与它绑定的角色关系会一并移除"],
53058
+ tone: "danger",
53059
+ onConfirm: async () => {
53060
+ setBusy(true);
53061
+ setError("");
53062
+ try {
53063
+ const result = await api.roles({
53064
+ op: "remove",
53065
+ name
53066
+ });
53067
+ setProject((prev) => prev === null ? prev : {
53068
+ ...prev,
53069
+ roles: result.roles,
53070
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
53071
+ });
53072
+ pushProgress(`已从角色库删除:${name}`, "info");
53073
+ } catch (err) {
53074
+ setError(err.message);
53075
+ } finally {
53076
+ setBusy(false);
53077
+ }
53078
+ }
53079
+ });
52430
53080
  };
52431
53081
  /** 保存世界观规则编辑(bible tab,每行一条)。 */
52432
53082
  const handleSaveWorldRules = async () => {
@@ -53242,20 +53892,28 @@ window.__ModuleLoader__.load({
53242
53892
  } catch {}
53243
53893
  };
53244
53894
  /** 回滚到某个历史版本(回滚前宿主会先留存当前正文,所以可撤销)。 */
53245
- const handleRestoreSnapshot = async (id) => {
53246
- if (!window.confirm("用这一版覆盖当前正文?回滚前会自动留存当前正文,可以再换回来。")) return;
53247
- setBusy(true);
53248
- setError("");
53249
- try {
53250
- await api.snapshotRestore(id);
53251
- await refresh(false, true);
53252
- await refreshSnapshots();
53253
- setNotice("已回滚到所选版本");
53254
- } catch (err) {
53255
- setError(err.message);
53256
- } finally {
53257
- setBusy(false);
53258
- }
53895
+ const handleRestoreSnapshot = (id) => {
53896
+ confirmUi.confirm({
53897
+ title: "回滚正文到所选版本",
53898
+ body: "当前正文会被这一版覆盖。",
53899
+ assurance: "回滚前会自动留存当前正文,可以再换回来。",
53900
+ tone: "info",
53901
+ confirmLabel: "回滚",
53902
+ onConfirm: async () => {
53903
+ setBusy(true);
53904
+ setError("");
53905
+ try {
53906
+ await api.snapshotRestore(id);
53907
+ await refresh(false, true);
53908
+ await refreshSnapshots();
53909
+ setNotice("已回滚到所选版本");
53910
+ } catch (err) {
53911
+ setError(err.message);
53912
+ } finally {
53913
+ setBusy(false);
53914
+ }
53915
+ }
53916
+ });
53259
53917
  };
53260
53918
  /** 手工给当前章节存档一个历史版本。 */
53261
53919
  const handleCreateSnapshot = async (no) => {
@@ -53415,6 +54073,7 @@ window.__ModuleLoader__.load({
53415
54073
  let reviewPending = 0;
53416
54074
  let totalChars = 0;
53417
54075
  let writingNow;
54076
+ const charSeries = [];
53418
54077
  for (const c of chapters) {
53419
54078
  const s = c.status;
53420
54079
  if (s === "approved" || s === "written" || s === "rejected") done++;
@@ -53422,7 +54081,13 @@ window.__ModuleLoader__.load({
53422
54081
  if (s === "approved") approved++;
53423
54082
  if (s === "rejected" || s === "written") reviewPending++;
53424
54083
  if (s === "generating" || s === "reviewing") writingNow = c;
53425
- totalChars += c.chars ?? 0;
54084
+ const ch = c.chars ?? 0;
54085
+ totalChars += ch;
54086
+ charSeries.push({
54087
+ no: c.no,
54088
+ chars: ch,
54089
+ approved: s === "approved"
54090
+ });
53426
54091
  }
53427
54092
  return {
53428
54093
  done,
@@ -53430,7 +54095,8 @@ window.__ModuleLoader__.load({
53430
54095
  approved,
53431
54096
  reviewPending,
53432
54097
  totalChars,
53433
- writingNow
54098
+ writingNow,
54099
+ charSeries
53434
54100
  };
53435
54101
  }, [chapters]);
53436
54102
  const doneCount = chapterStats.done;
@@ -53501,6 +54167,92 @@ window.__ModuleLoader__.load({
53501
54167
  const reviewPendingCount = chapterStats.reviewPending;
53502
54168
  const writingNow = chapterStats.writingNow;
53503
54169
  const totalChars = chapterStats.totalChars;
54170
+ /**
54171
+ * 工作台顶栏导航项 —— 按作者真实的创作推进顺序排列,而非按功能分区。
54172
+ * 顺序依据 NAV_GROUPS 注释里写的「按创作阶段归类」:先看全局(总纲),
54173
+ * 再立设定,然后写,最后回头分析长线与拆书。原来的「写作/设定/资产」是
54174
+ * 文件夹式的功能序,作者点「写作」时还不知道该先做什么。
54175
+ */
54176
+ const WORKBENCH_NAV = [
54177
+ {
54178
+ id: "workflow",
54179
+ label: "总编台",
54180
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Library, { size: 14 }),
54181
+ on: "workflow",
54182
+ title: "总编台:全书进度、推荐下一步、四项常驻指标",
54183
+ go: () => {
54184
+ setRightDrawer(null);
54185
+ setDrawerMax(false);
54186
+ setActiveTab("workflow");
54187
+ }
54188
+ },
54189
+ {
54190
+ id: "overview",
54191
+ label: "总纲",
54192
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.FileText, { size: 14 }),
54193
+ on: "overview",
54194
+ title: "总纲 / 大纲:全书结构、卷与章节计划",
54195
+ go: () => {
54196
+ openDrawer("overview");
54197
+ }
54198
+ },
54199
+ {
54200
+ id: "setup",
54201
+ label: "设定",
54202
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookOpen, { size: 14 }),
54203
+ on: "setup",
54204
+ title: "道藏:角色、世界规则、事实与红线",
54205
+ badge: bible === void 0 ? "" : "道藏",
54206
+ go: () => {
54207
+ openDrawer("setup");
54208
+ }
54209
+ },
54210
+ {
54211
+ id: "write",
54212
+ label: "写作",
54213
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.BookMarked, { size: 14 }),
54214
+ on: "write",
54215
+ title: "写作:章节索引、生成与审稿",
54216
+ badge: pendingCount + reviewPendingCount > 0 ? String(pendingCount + reviewPendingCount) : "",
54217
+ go: () => {
54218
+ openDrawer("write");
54219
+ }
54220
+ },
54221
+ {
54222
+ id: "assets",
54223
+ label: "资产",
54224
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Folder, { size: 14 }),
54225
+ on: "assets",
54226
+ title: "创作素材库:题材、设定模板、世界规则",
54227
+ go: () => {
54228
+ openDrawer("assets");
54229
+ }
54230
+ },
54231
+ {
54232
+ id: "run",
54233
+ label: "生产单",
54234
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Factory, { size: 14 }),
54235
+ on: "run",
54236
+ title: "生产单:批次生产与流水线",
54237
+ go: () => {
54238
+ openDrawer("run");
54239
+ }
54240
+ },
54241
+ {
54242
+ id: "plotlines",
54243
+ label: "长线",
54244
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.ScrollText, { size: 14 }),
54245
+ on: "plotlines",
54246
+ title: "剧情线 · 伏笔:长线推进与伏笔账目",
54247
+ badge: (() => {
54248
+ const p = foreshadows.filter((f) => f.status === "planned").length;
54249
+ return p > 0 ? String(p) : "";
54250
+ })(),
54251
+ go: () => {
54252
+ openDrawer("plotlines");
54253
+ }
54254
+ }
54255
+ ];
53504
54256
  /** 创作旅程 6 阶段(完成/当前/未到)。 */
53505
54257
  const journeyStages = [
53506
54258
  {
@@ -53752,6 +54504,16 @@ window.__ModuleLoader__.load({
53752
54504
  openDrawer("tension");
53753
54505
  }
53754
54506
  },
54507
+ {
54508
+ key: "style",
54509
+ group: "tools",
54510
+ name: "风格漂移曲线",
54511
+ di: chapters.length > 0 ? `● ${chapters.length} 章可比对` : "○ 需先有正文",
54512
+ dim: project === null,
54513
+ go: () => {
54514
+ openDrawer("style");
54515
+ }
54516
+ },
53755
54517
  {
53756
54518
  key: "promptSlots",
53757
54519
  group: "tools",
@@ -53976,50 +54738,16 @@ window.__ModuleLoader__.load({
53976
54738
  children: "工作台"
53977
54739
  }),
53978
54740
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.topNavSpacer }),
53979
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54741
+ WORKBENCH_NAV.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
53980
54742
  type: "button",
53981
- className: `${panel_module_css_default.topNavBtn} ${activeTab === "workflow" && rightDrawer === null ? panel_module_css_default.topNavActive : ""}`,
53982
- "aria-current": activeTab === "workflow" && rightDrawer === null ? "page" : void 0,
53983
- onClick: () => {
53984
- setRightDrawer(null);
53985
- setDrawerMax(false);
53986
- setActiveTab("workflow");
53987
- },
53988
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53989
- className: panel_module_css_default.topNavNi,
53990
- children: "▣"
53991
- }), "总编台"]
53992
- }),
53993
- [
53994
- {
53995
- drawer: "write",
53996
- label: "写作",
53997
- ni: "✎",
53998
- badge: pendingCount + reviewPendingCount > 0 ? String(pendingCount + reviewPendingCount) : ""
53999
- },
54000
- {
54001
- drawer: "setup",
54002
- label: "设定",
54003
- ni: "❖",
54004
- badge: "道藏"
54005
- },
54006
- {
54007
- drawer: "assets",
54008
- label: "资产",
54009
- ni: "▦",
54010
- badge: ""
54011
- }
54012
- ].map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54013
- type: "button",
54014
- className: `${panel_module_css_default.topNavBtn} ${rightDrawer === item.drawer ? panel_module_css_default.topNavActive : ""}`,
54015
- "aria-current": rightDrawer === item.drawer ? "page" : void 0,
54016
- onClick: () => {
54017
- openDrawer(item.drawer);
54018
- },
54743
+ className: `${panel_module_css_default.topNavBtn} ${item.on === rightDrawer || item.on === "workflow" && rightDrawer === null ? panel_module_css_default.topNavActive : ""}`,
54744
+ "aria-current": item.on === rightDrawer || item.on === "workflow" && rightDrawer === null ? "page" : void 0,
54745
+ onClick: item.go,
54746
+ title: item.title,
54019
54747
  children: [
54020
54748
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54021
54749
  className: panel_module_css_default.topNavNi,
54022
- children: item.ni
54750
+ children: item.icon
54023
54751
  }),
54024
54752
  item.label,
54025
54753
  item.badge !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -54027,7 +54755,7 @@ window.__ModuleLoader__.load({
54027
54755
  children: item.badge
54028
54756
  })
54029
54757
  ]
54030
- }, item.drawer)),
54758
+ }, item.id)),
54031
54759
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54032
54760
  type: "button",
54033
54761
  className: `${panel_module_css_default.topNavBtn} ${rightDrawer === "params" ? panel_module_css_default.topNavActive : ""}`,
@@ -54038,7 +54766,7 @@ window.__ModuleLoader__.load({
54038
54766
  title: "写作参数 / 设置",
54039
54767
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54040
54768
  className: panel_module_css_default.topNavNi,
54041
- children: "⚙"
54769
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 14 })
54042
54770
  }), "写作参数"]
54043
54771
  })
54044
54772
  ]
@@ -54110,21 +54838,12 @@ window.__ModuleLoader__.load({
54110
54838
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54111
54839
  className: panel_module_css_default.drawerHead,
54112
54840
  children: [
54113
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54841
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54114
54842
  className: panel_module_css_default.drawerTitle,
54115
- children: {
54116
- write: "✎ 写作 · 章节索引",
54117
- setup: "❖ 设定 · 道藏",
54118
- assets: "▦ 资产 · 创作素材库",
54119
- params: "⚙ 写作参数 · 设置",
54120
- overview: "▤ 总纲 / 大纲",
54121
- blurb: "◈ 简介 / 封面",
54122
- plotlines: "⟟ 剧情线 · 伏笔",
54123
- director: "✿ 自动编辑",
54124
- knowledge: "⊞ 知识库",
54125
- run: "⌘ 生产单",
54126
- breakdown: "⚲ 拆书分析"
54127
- }[rightDrawer]
54843
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54844
+ className: panel_module_css_default.drawerTitleNi,
54845
+ children: (DRAWER_META[rightDrawer] ?? DRAWER_META.fallback).icon
54846
+ }), (DRAWER_META[rightDrawer] ?? DRAWER_META.fallback).label]
54128
54847
  }),
54129
54848
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.drawerSpacer }),
54130
54849
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -54151,11 +54870,7 @@ window.__ModuleLoader__.load({
54151
54870
  rightDrawer === "write" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54152
54871
  className: panel_module_css_default.card,
54153
54872
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54154
- className: panel_module_css_default.row,
54155
- style: {
54156
- justifyContent: "space-between",
54157
- flexWrap: "wrap"
54158
- },
54873
+ className: `css.rowBetween css.rowBetweenWrap`,
54159
54874
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54160
54875
  className: panel_module_css_default.cardTitle,
54161
54876
  children: [
@@ -54262,8 +54977,7 @@ window.__ModuleLoader__.load({
54262
54977
  bookTab === "bible" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54263
54978
  className: panel_module_css_default.card,
54264
54979
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54265
- className: panel_module_css_default.row,
54266
- style: { justifyContent: "space-between" },
54980
+ className: `css.rowBetween`,
54267
54981
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54268
54982
  className: panel_module_css_default.cardTitle,
54269
54983
  children: tt("bible.title")
@@ -54303,8 +55017,7 @@ window.__ModuleLoader__.load({
54303
55017
  },
54304
55018
  children: [
54305
55019
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54306
- className: panel_module_css_default.row,
54307
- style: { justifyContent: "space-between" },
55020
+ className: `css.rowBetween`,
54308
55021
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
54309
55022
  tt("bible.worldRules"),
54310
55023
  "(",
@@ -54442,11 +55155,7 @@ window.__ModuleLoader__.load({
54442
55155
  className: panel_module_css_default.card,
54443
55156
  children: [
54444
55157
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54445
- className: panel_module_css_default.row,
54446
- style: {
54447
- justifyContent: "space-between",
54448
- flexWrap: "wrap"
54449
- },
55158
+ className: `css.rowBetween css.rowBetweenWrap`,
54450
55159
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54451
55160
  className: panel_module_css_default.cardTitle,
54452
55161
  children: [
@@ -54492,11 +55201,7 @@ window.__ModuleLoader__.load({
54492
55201
  },
54493
55202
  children: [
54494
55203
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54495
- className: panel_module_css_default.row,
54496
- style: {
54497
- justifyContent: "space-between",
54498
- flexWrap: "wrap"
54499
- },
55204
+ className: `css.rowBetween css.rowBetweenWrap`,
54500
55205
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
54501
55206
  " 提炼候选(",
54502
55207
  roleCandidates.length,
@@ -54538,7 +55243,6 @@ window.__ModuleLoader__.load({
54538
55243
  children: [
54539
55244
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54540
55245
  className: panel_module_css_default.row,
54541
- style: { flexWrap: "wrap" },
54542
55246
  children: [
54543
55247
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54544
55248
  className: panel_module_css_default.field,
@@ -54738,11 +55442,7 @@ window.__ModuleLoader__.load({
54738
55442
  className: panel_module_css_default.card,
54739
55443
  children: [
54740
55444
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
54741
- className: panel_module_css_default.row,
54742
- style: {
54743
- justifyContent: "space-between",
54744
- flexWrap: "wrap"
54745
- },
55445
+ className: `css.rowBetween css.rowBetweenWrap`,
54746
55446
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54747
55447
  className: `${panel_module_css_default.cardTitle} ${panel_module_css_default.cardTitleLg}`,
54748
55448
  children: " 编年 / 复盘"
@@ -54762,11 +55462,7 @@ window.__ModuleLoader__.load({
54762
55462
  }),
54763
55463
  archiveTab === "reviews" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
54764
55464
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54765
- className: panel_module_css_default.row,
54766
- style: {
54767
- justifyContent: "space-between",
54768
- flexWrap: "wrap"
54769
- },
55465
+ className: `css.rowBetween css.rowBetweenWrap`,
54770
55466
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54771
55467
  className: panel_module_css_default.cardTitle,
54772
55468
  children: [
@@ -54830,11 +55526,7 @@ window.__ModuleLoader__.load({
54830
55526
  const groupsWithReviews = chapterGroups.filter((group) => group.chapters.some((c) => c.authorReview !== void 0));
54831
55527
  if (groupsWithReviews.length === 0) return null;
54832
55528
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54833
- className: panel_module_css_default.row,
54834
- style: {
54835
- justifyContent: "flex-end",
54836
- gap: "var(--nf-space-6)"
54837
- },
55529
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
54838
55530
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
54839
55531
  type: "button",
54840
55532
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
@@ -55071,13 +55763,8 @@ window.__ModuleLoader__.load({
55071
55763
  style: { gap: "var(--nf-space-12)" },
55072
55764
  children: [
55073
55765
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55074
- className: panel_module_css_default.row,
55075
- style: {
55076
- justifyContent: "space-between",
55077
- alignItems: "center",
55078
- flexWrap: "wrap",
55079
- gap: "var(--nf-space-8)"
55080
- },
55766
+ className: `css.rowBetween css.rowBetweenWrap`,
55767
+ style: { gap: "var(--nf-space-8)" },
55081
55768
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55082
55769
  className: panel_module_css_default.titleBlock,
55083
55770
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -55089,7 +55776,6 @@ window.__ModuleLoader__.load({
55089
55776
  })]
55090
55777
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55091
55778
  className: panel_module_css_default.row,
55092
- style: { gap: "var(--nf-space-8)" },
55093
55779
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55094
55780
  type: "button",
55095
55781
  className: panel_module_css_default.button,
@@ -55400,10 +56086,6 @@ window.__ModuleLoader__.load({
55400
56086
  }),
55401
56087
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55402
56088
  className: panel_module_css_default.row,
55403
- style: {
55404
- flexWrap: "wrap",
55405
- gap: "var(--nf-space-8)"
55406
- },
55407
56089
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
55408
56090
  className: panel_module_css_default.input,
55409
56091
  value: exportScope,
@@ -55544,8 +56226,7 @@ window.__ModuleLoader__.load({
55544
56226
  ]
55545
56227
  }),
55546
56228
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55547
- className: panel_module_css_default.row,
55548
- style: { justifyContent: "space-between" },
56229
+ className: `css.rowBetween`,
55549
56230
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
55550
56231
  className: panel_module_css_default.meta,
55551
56232
  children: [
@@ -55644,7 +56325,6 @@ window.__ModuleLoader__.load({
55644
56325
  title: "简介 / 封面",
55645
56326
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55646
56327
  className: panel_module_css_default.row,
55647
- style: { flexWrap: "wrap" },
55648
56328
  children: [
55649
56329
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55650
56330
  type: "button",
@@ -55669,7 +56349,16 @@ window.__ModuleLoader__.load({
55669
56349
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
55670
56350
  disabled: busy || project === null,
55671
56351
  onClick: () => {
55672
- if (window.confirm("重新生成会覆盖当前简介(可先复制保存),确定?")) handleBlurbGenerate();
56352
+ confirmUi.confirm({
56353
+ title: "重新生成简介",
56354
+ body: "当前简介会被新生成的文本覆盖。",
56355
+ assurance: "如需保留现版本,先复制保存再生成。",
56356
+ tone: "warn",
56357
+ confirmLabel: "重新生成",
56358
+ onConfirm: async () => {
56359
+ await handleBlurbGenerate();
56360
+ }
56361
+ });
55673
56362
  },
55674
56363
  children: "重新生成"
55675
56364
  })
@@ -55818,11 +56507,7 @@ window.__ModuleLoader__.load({
55818
56507
  onSelect: changeLonglineTab
55819
56508
  }),
55820
56509
  longlineTab === "foreshadow" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55821
- className: panel_module_css_default.row,
55822
- style: {
55823
- justifyContent: "space-between",
55824
- flexWrap: "wrap"
55825
- },
56510
+ className: `css.rowBetween css.rowBetweenWrap`,
55826
56511
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
55827
56512
  className: panel_module_css_default.cardTitle,
55828
56513
  children: [
@@ -55934,11 +56619,7 @@ window.__ModuleLoader__.load({
55934
56619
  })
55935
56620
  })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
55936
56621
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55937
- className: panel_module_css_default.row,
55938
- style: {
55939
- justifyContent: "space-between",
55940
- flexWrap: "wrap"
55941
- },
56622
+ className: `css.rowBetween css.rowBetweenWrap`,
55942
56623
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
55943
56624
  className: panel_module_css_default.cardTitle,
55944
56625
  children: [
@@ -55950,7 +56631,6 @@ window.__ModuleLoader__.load({
55950
56631
  ]
55951
56632
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55952
56633
  className: panel_module_css_default.row,
55953
- style: { flexWrap: "wrap" },
55954
56634
  children: [
55955
56635
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55956
56636
  type: "button",
@@ -56056,7 +56736,6 @@ window.__ModuleLoader__.load({
56056
56736
  children: [
56057
56737
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56058
56738
  className: panel_module_css_default.row,
56059
- style: { flexWrap: "wrap" },
56060
56739
  children: [
56061
56740
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56062
56741
  className: panel_module_css_default.field,
@@ -56268,6 +56947,7 @@ window.__ModuleLoader__.load({
56268
56947
  },
56269
56948
  busy
56270
56949
  }),
56950
+ rightDrawer === "style" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyleView, { api }),
56271
56951
  rightDrawer === "promptSlots" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PromptSlotsView, { api }),
56272
56952
  rightDrawer === "run" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RunPanel, {
56273
56953
  api,
@@ -56281,7 +56961,6 @@ window.__ModuleLoader__.load({
56281
56961
  title: "拆书分析",
56282
56962
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56283
56963
  className: panel_module_css_default.row,
56284
- style: { flexWrap: "wrap" },
56285
56964
  children: [
56286
56965
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
56287
56966
  className: panel_module_css_default.input,
@@ -56672,7 +57351,6 @@ window.__ModuleLoader__.load({
56672
57351
  }),
56673
57352
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56674
57353
  className: panel_module_css_default.row,
56675
- style: { flexWrap: "wrap" },
56676
57354
  children: [
56677
57355
  wsCheckReport !== null && wsCheckReport.issues.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
56678
57356
  type: "button",
@@ -57006,14 +57684,22 @@ window.__ModuleLoader__.load({
57006
57684
  ]
57007
57685
  }),
57008
57686
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57009
- className: panel_module_css_default.wfMetric,
57687
+ className: `${panel_module_css_default.wfMetric} ${panel_module_css_default.wfMetricWide}`,
57010
57688
  children: [
57011
57689
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "全书字数" }),
57012
57690
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
57013
57691
  className: `${panel_module_css_default.numSerif} ${panel_module_css_default.tabular}`,
57014
57692
  children: totalChars.toLocaleString()
57015
57693
  }),
57016
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "累计" })
57694
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: "累计" }),
57695
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57696
+ className: panel_module_css_default.wfMetricSpark,
57697
+ title: describeShape(chapterStats.charSeries),
57698
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Sparkline, { points: chapterStats.charSeries }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
57699
+ className: panel_module_css_default.wfMetricSparkNote,
57700
+ children: describeShape(chapterStats.charSeries)
57701
+ })]
57702
+ })
57017
57703
  ]
57018
57704
  })
57019
57705
  ]
@@ -57715,7 +58401,6 @@ window.__ModuleLoader__.load({
57715
58401
  title: tt("tab.plan"),
57716
58402
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57717
58403
  className: panel_module_css_default.row,
57718
- style: { flexWrap: "wrap" },
57719
58404
  children: [
57720
58405
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
57721
58406
  className: panel_module_css_default.meta,
@@ -57764,11 +58449,7 @@ window.__ModuleLoader__.load({
57764
58449
  style: { borderColor: sensHits.length > 0 ? "var(--nf-warn)" : "var(--nf-success)" },
57765
58450
  children: [
57766
58451
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57767
- className: panel_module_css_default.row,
57768
- style: {
57769
- justifyContent: "space-between",
57770
- flexWrap: "wrap"
57771
- },
58452
+ className: `css.rowBetween css.rowBetweenWrap`,
57772
58453
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
57773
58454
  className: panel_module_css_default.cardTitle,
57774
58455
  children: sensHits.length === 0 ? tt("sensitive.clean", { n: sensScanned }) : tt("sensitive.hits", {
@@ -57966,11 +58647,7 @@ window.__ModuleLoader__.load({
57966
58647
  const detailTab = chapterDetailTab;
57967
58648
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
57968
58649
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57969
- className: panel_module_css_default.row,
57970
- style: {
57971
- justifyContent: "space-between",
57972
- flexWrap: "wrap"
57973
- },
58650
+ className: `css.rowBetween css.rowBetweenWrap`,
57974
58651
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
57975
58652
  className: panel_module_css_default.planDetailTitle,
57976
58653
  children: [
@@ -58047,8 +58724,7 @@ window.__ModuleLoader__.load({
58047
58724
  className: panel_module_css_default.reviewBox,
58048
58725
  children: [
58049
58726
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58050
- className: panel_module_css_default.row,
58051
- style: { justifyContent: "space-between" },
58727
+ className: `css.rowBetween`,
58052
58728
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: tt("plan.reviewReport") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
58053
58729
  style: { color: review.passed ? "var(--nf-success)" : "var(--nf-error)" },
58054
58730
  children: [
@@ -58116,8 +58792,7 @@ window.__ModuleLoader__.load({
58116
58792
  style: { borderColor: "color-mix(in srgb, var(--nf-info) 45%, transparent)" },
58117
58793
  children: [
58118
58794
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58119
- className: panel_module_css_default.row,
58120
- style: { justifyContent: "space-between" },
58795
+ className: `css.rowBetween`,
58121
58796
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 作者复盘" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
58122
58797
  style: { color: chapter.authorReview.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
58123
58798
  children: [
@@ -58439,7 +59114,7 @@ window.__ModuleLoader__.load({
58439
59114
  className: panel_module_css_default.bigProgressBar,
58440
59115
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
58441
59116
  className: panel_module_css_default.bigProgressBarFill,
58442
- style: { width: `${Math.round(liveBar.ratio * 100)}%` }
59117
+ style: { transform: `scaleX(${liveBar.ratio})` }
58443
59118
  })
58444
59119
  }),
58445
59120
  liveBar?.text !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -58478,7 +59153,7 @@ window.__ModuleLoader__.load({
58478
59153
  className: panel_module_css_default.progressBar,
58479
59154
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58480
59155
  className: panel_module_css_default.progressBarFill,
58481
- style: { width: `${Math.round((line.ratio ?? 0) * 100)}%` }
59156
+ style: { transform: `scaleX(${line.ratio ?? 0})` }
58482
59157
  })
58483
59158
  }), line.text]
58484
59159
  }, line.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { ref: progressEndRef })]
@@ -58520,7 +59195,8 @@ window.__ModuleLoader__.load({
58520
59195
  onImported: async () => {
58521
59196
  await refreshShelf();
58522
59197
  }
58523
- })
59198
+ }),
59199
+ confirmUi.dialog
58524
59200
  ]
58525
59201
  });
58526
59202
  }
@@ -58657,12 +59333,8 @@ window.__ModuleLoader__.load({
58657
59333
  className: panel_module_css_default.outlineDocWrap,
58658
59334
  children: [
58659
59335
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58660
- className: panel_module_css_default.row,
58661
- style: {
58662
- justifyContent: "space-between",
58663
- flexWrap: "wrap",
58664
- gap: "var(--nf-space-8)"
58665
- },
59336
+ className: `css.rowBetween css.rowBetweenWrap`,
59337
+ style: { gap: "var(--nf-space-8)" },
58666
59338
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58667
59339
  className: panel_module_css_default.meta,
58668
59340
  children: "大纲是本书的「出生证明」;可点右上「反推大纲」从正文反推,或「更新大纲」手动修订。"