@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 +1994 -1322
- package/lib/index.js +77 -22
- package/lib/types/client/api.d.ts +2 -0
- package/lib/types/client/panel/CardHead.d.ts +42 -0
- package/lib/types/client/panel/ConfirmDialog.d.ts +36 -0
- package/lib/types/client/panel/NoticeBar.d.ts +26 -0
- package/lib/types/client/panel/Sparkline.d.ts +34 -0
- package/lib/types/client/panel/StyleView.d.ts +18 -0
- package/lib/types/engine.d.ts +26 -0
- package/lib/types/protocol.d.ts +27 -0
- package/package.json +4 -1
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
|
-
"
|
|
1358
|
-
"
|
|
1359
|
-
"
|
|
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
|
-
"
|
|
1368
|
-
"
|
|
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
|
-
"
|
|
1386
|
-
"
|
|
1387
|
-
"
|
|
1388
|
-
"
|
|
1389
|
-
"
|
|
1390
|
-
"
|
|
1391
|
-
"
|
|
1392
|
-
"
|
|
1393
|
-
"
|
|
1394
|
-
"
|
|
1395
|
-
"
|
|
1396
|
-
"
|
|
1397
|
-
"
|
|
1398
|
-
"
|
|
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
|
-
"
|
|
1417
|
-
"
|
|
1418
|
-
"
|
|
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
|
-
"
|
|
1421
|
-
"
|
|
1422
|
-
"
|
|
1423
|
-
"
|
|
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
|
-
"
|
|
1443
|
-
"
|
|
1404
|
+
"wfBoxH": "jbF1yq_wfBoxH",
|
|
1405
|
+
"wfRs": "jbF1yq_wfRs",
|
|
1406
|
+
"pillNavSlider": "jbF1yq_pillNavSlider",
|
|
1407
|
+
"card": "jbF1yq_card",
|
|
1444
1408
|
"wfSep": "jbF1yq_wfSep",
|
|
1445
|
-
"
|
|
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
|
-
"
|
|
1462
|
-
"chWork": "jbF1yq_chWork",
|
|
1411
|
+
"assetEditorRow": "jbF1yq_assetEditorRow",
|
|
1463
1412
|
"cardTitle": "jbF1yq_cardTitle",
|
|
1464
|
-
"
|
|
1465
|
-
"
|
|
1466
|
-
"
|
|
1467
|
-
"
|
|
1468
|
-
"
|
|
1469
|
-
"
|
|
1470
|
-
"
|
|
1471
|
-
"
|
|
1472
|
-
"
|
|
1473
|
-
"
|
|
1474
|
-
"
|
|
1475
|
-
"
|
|
1476
|
-
"
|
|
1477
|
-
"
|
|
1478
|
-
"
|
|
1479
|
-
"
|
|
1480
|
-
"
|
|
1481
|
-
"
|
|
1482
|
-
"
|
|
1483
|
-
"
|
|
1484
|
-
"
|
|
1485
|
-
"
|
|
1486
|
-
"
|
|
1487
|
-
"
|
|
1488
|
-
"
|
|
1489
|
-
"
|
|
1490
|
-
"
|
|
1491
|
-
"
|
|
1492
|
-
"
|
|
1493
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1505
|
-
"
|
|
1506
|
-
"
|
|
1507
|
-
"
|
|
1508
|
-
"
|
|
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
|
-
"
|
|
1511
|
-
"
|
|
1512
|
-
"
|
|
1513
|
-
"
|
|
1514
|
-
"
|
|
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
|
-
"
|
|
1517
|
-
"
|
|
1518
|
-
"
|
|
1519
|
-
"
|
|
1520
|
-
"
|
|
1521
|
-
"
|
|
1522
|
-
"
|
|
1523
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1547
|
-
"
|
|
1548
|
-
"
|
|
1549
|
-
"
|
|
1550
|
-
"
|
|
1551
|
-
"
|
|
1552
|
-
"
|
|
1553
|
-
"
|
|
1554
|
-
"
|
|
1555
|
-
"
|
|
1556
|
-
"
|
|
1557
|
-
"
|
|
1558
|
-
"
|
|
1559
|
-
"
|
|
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
|
-
"
|
|
1566
|
-
"
|
|
1567
|
-
"
|
|
1568
|
-
"
|
|
1569
|
-
"
|
|
1570
|
-
"
|
|
1571
|
-
"
|
|
1572
|
-
"
|
|
1573
|
-
"
|
|
1574
|
-
"
|
|
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
|
-
"
|
|
1584
|
-
"
|
|
1585
|
-
"
|
|
1586
|
-
"
|
|
1587
|
-
"
|
|
1588
|
-
"
|
|
1589
|
-
"
|
|
1590
|
-
"
|
|
1591
|
-
"
|
|
1592
|
-
"
|
|
1593
|
-
"
|
|
1594
|
-
"
|
|
1595
|
-
"
|
|
1596
|
-
"
|
|
1597
|
-
"
|
|
1598
|
-
"
|
|
1599
|
-
"
|
|
1600
|
-
"
|
|
1601
|
-
"
|
|
1602
|
-
"
|
|
1603
|
-
"
|
|
1604
|
-
"
|
|
1605
|
-
"
|
|
1606
|
-
"
|
|
1607
|
-
"
|
|
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
|
-
"
|
|
1610
|
-
"
|
|
1611
|
-
"
|
|
1612
|
-
"
|
|
1613
|
-
"
|
|
1614
|
-
"
|
|
1615
|
-
"
|
|
1616
|
-
"
|
|
1617
|
-
"
|
|
1618
|
-
"
|
|
1619
|
-
"
|
|
1620
|
-
"
|
|
1621
|
-
"
|
|
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
|
-
"
|
|
1624
|
-
"
|
|
1625
|
-
"
|
|
1626
|
-
"
|
|
1627
|
-
"
|
|
1628
|
-
"
|
|
1629
|
-
"
|
|
1630
|
-
"
|
|
1631
|
-
"
|
|
1632
|
-
"
|
|
1633
|
-
"
|
|
1634
|
-
"
|
|
1635
|
-
"
|
|
1636
|
-
"
|
|
1637
|
-
"
|
|
1638
|
-
"
|
|
1639
|
-
"
|
|
1640
|
-
"
|
|
1641
|
-
"
|
|
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
|
-
"
|
|
1644
|
-
"
|
|
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
|
-
"
|
|
1647
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1652
|
-
"
|
|
1653
|
-
"
|
|
1654
|
-
"
|
|
1655
|
-
"
|
|
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
|
-
"
|
|
1658
|
-
"
|
|
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
|
-
"
|
|
1672
|
-
"
|
|
1673
|
-
"
|
|
1674
|
-
"
|
|
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
|
-
"
|
|
1677
|
-
"
|
|
1678
|
-
"
|
|
1679
|
-
"
|
|
1680
|
-
"
|
|
1681
|
-
"
|
|
1682
|
-
"
|
|
1683
|
-
"
|
|
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
|
-
"
|
|
1686
|
-
"
|
|
1753
|
+
"planTreeVolMeta": "jbF1yq_planTreeVolMeta",
|
|
1754
|
+
"bigProgressBar": "jbF1yq_bigProgressBar",
|
|
1755
|
+
"navAbout": "jbF1yq_navAbout",
|
|
1687
1756
|
"adaptProposal": "jbF1yq_adaptProposal",
|
|
1688
|
-
"
|
|
1689
|
-
"
|
|
1690
|
-
"
|
|
1691
|
-
"
|
|
1692
|
-
"
|
|
1693
|
-
"
|
|
1694
|
-
"
|
|
1695
|
-
"
|
|
1696
|
-
"
|
|
1697
|
-
"
|
|
1698
|
-
"
|
|
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
|
-
"
|
|
1701
|
-
"
|
|
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
|
-
"
|
|
1704
|
-
"
|
|
1705
|
-
"
|
|
1706
|
-
"
|
|
1707
|
-
"
|
|
1708
|
-
"
|
|
1709
|
-
"
|
|
1710
|
-
"
|
|
1711
|
-
"
|
|
1712
|
-
"
|
|
1713
|
-
"
|
|
1714
|
-
"
|
|
1715
|
-
"
|
|
1716
|
-
"
|
|
1717
|
-
"
|
|
1718
|
-
"
|
|
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
|
-
"
|
|
1733
|
-
"
|
|
1734
|
-
"
|
|
1735
|
-
"
|
|
1736
|
-
"
|
|
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
|
-
"
|
|
1747
|
-
"
|
|
1748
|
-
"
|
|
1749
|
-
"
|
|
1750
|
-
"
|
|
1751
|
-
"
|
|
1752
|
-
"
|
|
1753
|
-
"
|
|
1754
|
-
"
|
|
1755
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1799
|
-
"
|
|
1800
|
-
"
|
|
1801
|
-
"
|
|
1802
|
-
"
|
|
1803
|
-
"
|
|
1804
|
-
"
|
|
1805
|
-
"
|
|
1806
|
-
"
|
|
1807
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
1838
|
-
"
|
|
1839
|
-
"
|
|
1840
|
-
"
|
|
1841
|
-
"
|
|
1842
|
-
"
|
|
1843
|
-
"
|
|
1844
|
-
"
|
|
1845
|
-
"
|
|
1846
|
-
"
|
|
1847
|
-
"
|
|
1848
|
-
"
|
|
1849
|
-
"
|
|
1850
|
-
"
|
|
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 =
|
|
38480
|
-
|
|
38481
|
-
|
|
38482
|
-
|
|
38483
|
-
|
|
38484
|
-
|
|
38485
|
-
|
|
38486
|
-
|
|
38487
|
-
|
|
38488
|
-
|
|
38489
|
-
|
|
38490
|
-
|
|
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:
|
|
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:
|
|
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: {
|
|
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: {
|
|
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: {
|
|
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 =
|
|
42371
|
-
|
|
42372
|
-
|
|
42373
|
-
|
|
42374
|
-
|
|
42375
|
-
|
|
42376
|
-
|
|
42377
|
-
|
|
42378
|
-
|
|
42379
|
-
|
|
42380
|
-
|
|
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: [
|
|
42403
|
-
|
|
42404
|
-
|
|
42405
|
-
|
|
42406
|
-
|
|
42407
|
-
|
|
42408
|
-
|
|
42409
|
-
|
|
42410
|
-
|
|
42411
|
-
|
|
42412
|
-
|
|
42413
|
-
|
|
42414
|
-
|
|
42415
|
-
|
|
42416
|
-
|
|
42417
|
-
|
|
42418
|
-
|
|
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
|
-
|
|
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: [
|
|
42450
|
-
|
|
42451
|
-
|
|
42452
|
-
|
|
42453
|
-
|
|
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:
|
|
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
|
-
},
|
|
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
|
-
|
|
42503
|
-
|
|
42770
|
+
gap: "var(--nf-space-10)",
|
|
42771
|
+
flexWrap: "wrap"
|
|
42504
42772
|
},
|
|
42505
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.
|
|
42506
|
-
|
|
42507
|
-
|
|
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("
|
|
42512
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.
|
|
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
|
-
}),
|
|
42518
|
-
|
|
42519
|
-
|
|
42520
|
-
|
|
42521
|
-
|
|
42522
|
-
|
|
42523
|
-
|
|
42524
|
-
|
|
42525
|
-
|
|
42526
|
-
|
|
42527
|
-
|
|
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: "
|
|
42562
|
-
|
|
42803
|
+
justifyContent: "space-between",
|
|
42804
|
+
alignItems: "center"
|
|
42563
42805
|
},
|
|
42564
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("
|
|
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: "
|
|
42649
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
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
|
-
|
|
42668
|
-
|
|
42669
|
-
|
|
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
|
-
|
|
42725
|
-
|
|
42726
|
-
|
|
42727
|
-
|
|
42728
|
-
|
|
42729
|
-
|
|
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
|
-
|
|
42750
|
-
|
|
42751
|
-
|
|
42752
|
-
|
|
42753
|
-
|
|
42754
|
-
|
|
42755
|
-
|
|
42756
|
-
|
|
42757
|
-
|
|
42758
|
-
|
|
42759
|
-
|
|
42760
|
-
|
|
42761
|
-
|
|
42762
|
-
|
|
42763
|
-
|
|
42764
|
-
|
|
42765
|
-
|
|
42766
|
-
|
|
42767
|
-
|
|
42768
|
-
|
|
42769
|
-
|
|
42770
|
-
|
|
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
|
-
|
|
42774
|
-
|
|
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
|
-
|
|
42871
|
+
saveStandard();
|
|
42777
42872
|
},
|
|
42778
|
-
children:
|
|
42779
|
-
|
|
42780
|
-
|
|
42781
|
-
|
|
42782
|
-
|
|
42783
|
-
|
|
42784
|
-
|
|
42785
|
-
|
|
42786
|
-
|
|
42787
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
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
|
-
|
|
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
|
-
|
|
42965
|
+
saveCustom();
|
|
42793
42966
|
},
|
|
42794
|
-
|
|
42795
|
-
|
|
42796
|
-
|
|
42797
|
-
|
|
42798
|
-
|
|
42799
|
-
|
|
42800
|
-
|
|
42801
|
-
|
|
42802
|
-
|
|
42803
|
-
|
|
42804
|
-
|
|
42805
|
-
|
|
42806
|
-
|
|
42807
|
-
|
|
42808
|
-
|
|
42809
|
-
|
|
42810
|
-
|
|
42811
|
-
|
|
42812
|
-
|
|
42813
|
-
|
|
42814
|
-
|
|
42815
|
-
|
|
42816
|
-
|
|
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.
|
|
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:
|
|
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: {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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)(
|
|
48747
|
-
|
|
48748
|
-
|
|
48749
|
-
|
|
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)(
|
|
48754
|
-
|
|
48755
|
-
|
|
48756
|
-
|
|
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-
|
|
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:
|
|
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)(
|
|
49247
|
-
|
|
49248
|
-
|
|
49249
|
-
|
|
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)(
|
|
49254
|
-
|
|
49255
|
-
|
|
49256
|
-
|
|
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-
|
|
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:
|
|
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:
|
|
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)(
|
|
49497
|
-
|
|
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)(
|
|
49504
|
-
|
|
49505
|
-
|
|
49506
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 =
|
|
52486
|
+
const handleReverseOutline = () => {
|
|
51884
52487
|
if (project === null) return;
|
|
51885
|
-
|
|
51886
|
-
|
|
51887
|
-
|
|
51888
|
-
|
|
51889
|
-
|
|
51890
|
-
|
|
51891
|
-
|
|
51892
|
-
|
|
51893
|
-
|
|
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
|
-
|
|
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 =
|
|
52521
|
+
/** 重置项目:清空全部进度,从新大纲重新开始(危险档:需逐字输入「重置」)。 */
|
|
52522
|
+
const handleResetProject = () => {
|
|
51911
52523
|
if (project === null) return;
|
|
51912
|
-
|
|
51913
|
-
|
|
51914
|
-
|
|
51915
|
-
|
|
51916
|
-
|
|
51917
|
-
|
|
51918
|
-
|
|
51919
|
-
|
|
51920
|
-
|
|
51921
|
-
|
|
51922
|
-
|
|
51923
|
-
|
|
51924
|
-
|
|
51925
|
-
|
|
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 =
|
|
52029
|
-
|
|
52030
|
-
|
|
52031
|
-
|
|
52032
|
-
|
|
52033
|
-
|
|
52034
|
-
|
|
52035
|
-
|
|
52036
|
-
|
|
52037
|
-
|
|
52038
|
-
|
|
52039
|
-
|
|
52040
|
-
|
|
52041
|
-
|
|
52042
|
-
|
|
52043
|
-
|
|
52044
|
-
|
|
52045
|
-
|
|
52046
|
-
|
|
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 =
|
|
52089
|
-
|
|
52090
|
-
|
|
52091
|
-
|
|
52092
|
-
|
|
52093
|
-
|
|
52094
|
-
|
|
52095
|
-
|
|
52096
|
-
|
|
52097
|
-
|
|
52098
|
-
|
|
52099
|
-
|
|
52100
|
-
|
|
52101
|
-
|
|
52102
|
-
|
|
52103
|
-
|
|
52104
|
-
|
|
52105
|
-
|
|
52106
|
-
|
|
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 =
|
|
52411
|
-
|
|
52412
|
-
|
|
52413
|
-
|
|
52414
|
-
|
|
52415
|
-
|
|
52416
|
-
|
|
52417
|
-
|
|
52418
|
-
|
|
52419
|
-
|
|
52420
|
-
|
|
52421
|
-
|
|
52422
|
-
|
|
52423
|
-
|
|
52424
|
-
|
|
52425
|
-
|
|
52426
|
-
|
|
52427
|
-
|
|
52428
|
-
|
|
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 =
|
|
53246
|
-
|
|
53247
|
-
|
|
53248
|
-
|
|
53249
|
-
|
|
53250
|
-
|
|
53251
|
-
|
|
53252
|
-
|
|
53253
|
-
|
|
53254
|
-
|
|
53255
|
-
|
|
53256
|
-
|
|
53257
|
-
|
|
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
|
-
|
|
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} ${
|
|
53982
|
-
"aria-current":
|
|
53983
|
-
onClick:
|
|
53984
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
54841
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
54114
54842
|
className: panel_module_css_default.drawerTitle,
|
|
54115
|
-
children: {
|
|
54116
|
-
|
|
54117
|
-
|
|
54118
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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: {
|
|
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: {
|
|
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:
|
|
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: "大纲是本书的「出生证明」;可点右上「反推大纲」从正文反推,或「更新大纲」手动修订。"
|