@waterwx/dsh-novel-forge 2.1.4 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -1349,7 +1349,7 @@ window.__ModuleLoader__.load({
1349
1349
  }
1350
1350
  //#endregion
1351
1351
  //#region \0dsh-css:src/client/panel/panel.module.css.mjs
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-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}";
1353
1353
  const tagId = "@waterwx/dsh-novel-forge/panel.module.css";
1354
1354
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
1355
1355
  const tag = document.createElement("style");
@@ -1359,500 +1359,540 @@ window.__ModuleLoader__.load({
1359
1359
  document.head.appendChild(tag);
1360
1360
  }
1361
1361
  var panel_module_css_default = {
1362
- "bookCardBody": "jbF1yq_bookCardBody",
1363
- "navTitle": "jbF1yq_navTitle",
1364
- "badgeError": "jbF1yq_badgeError",
1365
- "wbIndexTitle": "jbF1yq_wbIndexTitle",
1366
- "progressBarFill": "jbF1yq_progressBarFill",
1367
- "entryIcon": "jbF1yq_entryIcon",
1368
- "readerItemNo": "jbF1yq_readerItemNo",
1369
- "wfSigBad": "jbF1yq_wfSigBad",
1370
- "authorNavBtn": "jbF1yq_authorNavBtn",
1371
- "panelNav": "jbF1yq_panelNav",
1372
- "card": "jbF1yq_card",
1373
- "chapterMain": "jbF1yq_chapterMain",
1374
- "bookCardCoverFallback": "jbF1yq_bookCardCoverFallback",
1375
- "readerItemTitle": "jbF1yq_readerItemTitle",
1376
- "outlineQuote": "jbF1yq_outlineQuote",
1377
- "toolStep": "jbF1yq_toolStep",
1378
- "assetGroups": "jbF1yq_assetGroups",
1379
- "wfProg": "jbF1yq_wfProg",
1362
+ "wsPreviewText": "jbF1yq_wsPreviewText",
1363
+ "badgePending": "jbF1yq_badgePending",
1364
+ "outlineH2": "jbF1yq_outlineH2",
1365
+ "nfSkeletonShimmer": "jbF1yq_nfSkeletonShimmer",
1366
+ "bookCardActive": "jbF1yq_bookCardActive",
1367
+ "wfPoolBar": "jbF1yq_wfPoolBar",
1368
+ "toolSteps": "jbF1yq_toolSteps",
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",
1383
+ "pageHeader": "jbF1yq_pageHeader",
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",
1380
1392
  "wfEmpty2": "jbF1yq_wfEmpty2",
1381
- "wfStage": "jbF1yq_wfStage",
1382
- "fieldLabel": "jbF1yq_fieldLabel",
1383
- "readerMain": "jbF1yq_readerMain",
1393
+ "notice-ok": "jbF1yq_notice-ok",
1394
+ "diffList": "jbF1yq_diffList",
1395
+ "importModalBody": "jbF1yq_importModalBody",
1396
+ "importField": "jbF1yq_importField",
1397
+ "assetCard": "jbF1yq_assetCard",
1398
+ "wsPageHeader": "jbF1yq_wsPageHeader",
1399
+ "authorTopNav": "jbF1yq_authorTopNav",
1400
+ "wbIndexRow": "jbF1yq_wbIndexRow",
1401
+ "pulse": "jbF1yq_pulse",
1402
+ "assetTextarea": "jbF1yq_assetTextarea",
1403
+ "diffDel": "jbF1yq_diffDel",
1404
+ "wfBoxH": "jbF1yq_wfBoxH",
1405
+ "wfRs": "jbF1yq_wfRs",
1406
+ "pillNavSlider": "jbF1yq_pillNavSlider",
1407
+ "card": "jbF1yq_card",
1408
+ "wfSep": "jbF1yq_wfSep",
1409
+ "toolStepName": "jbF1yq_toolStepName",
1410
+ "bookCardProgressBar": "jbF1yq_bookCardProgressBar",
1411
+ "assetEditorRow": "jbF1yq_assetEditorRow",
1412
+ "cardTitle": "jbF1yq_cardTitle",
1413
+ "wfPsLegend": "jbF1yq_wfPsLegend",
1414
+ "planTreeSearch": "jbF1yq_planTreeSearch",
1415
+ "entryIcon": "jbF1yq_entryIcon",
1416
+ "wfQtTone": "jbF1yq_wfQtTone",
1384
1417
  "active": "jbF1yq_active",
1385
- "authorPageHeader": "jbF1yq_authorPageHeader",
1386
- "wsPreviewText": "jbF1yq_wsPreviewText",
1387
- "planDetailBody": "jbF1yq_planDetailBody",
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",
1388
1428
  "wsColumns": "jbF1yq_wsColumns",
1389
- "badgeWritten": "jbF1yq_badgeWritten",
1390
- "dimCardSelected": "jbF1yq_dimCardSelected",
1391
- "cmdHint": "jbF1yq_cmdHint",
1392
- "chWorkFootRow": "jbF1yq_chWorkFootRow",
1393
- "nfSlideInRight": "jbF1yq_nfSlideInRight",
1394
- "runLogTime": "jbF1yq_runLogTime",
1395
- "wfConOk": "jbF1yq_wfConOk",
1396
- "eyebrow": "jbF1yq_eyebrow",
1397
- "shelfToolbarExtra": "jbF1yq_shelfToolbarExtra",
1398
- "chapter": "jbF1yq_chapter",
1399
- "navGroupLabel": "jbF1yq_navGroupLabel",
1400
- "settingsDrawerBody": "jbF1yq_settingsDrawerBody",
1401
- "diffTagNew": "jbF1yq_diffTagNew",
1402
- "authorNav": "jbF1yq_authorNav",
1403
- "adaptTable": "jbF1yq_adaptTable",
1404
- "pillNavPill": "jbF1yq_pillNavPill",
1405
- "planDetailTitle": "jbF1yq_planDetailTitle",
1406
- "iconButton": "jbF1yq_iconButton",
1407
- "dropzoneIcon": "jbF1yq_dropzoneIcon",
1408
- "readerGroup": "jbF1yq_readerGroup",
1409
- "cmdIcon": "jbF1yq_cmdIcon",
1410
- "importHint": "jbF1yq_importHint",
1411
- "tab": "jbF1yq_tab",
1412
- "readerItemActive": "jbF1yq_readerItemActive",
1413
- "chWorkAside": "jbF1yq_chWorkAside",
1414
- "importError": "jbF1yq_importError",
1415
- "bigProgressBar": "jbF1yq_bigProgressBar",
1429
+ "readerItem": "jbF1yq_readerItem",
1430
+ "wfSigGood": "jbF1yq_wfSigGood",
1416
1431
  "wfCn": "jbF1yq_wfCn",
1417
- "readerArticle": "jbF1yq_readerArticle",
1418
- "adaptRuleRow": "jbF1yq_adaptRuleRow",
1419
- "navGroup": "jbF1yq_navGroup",
1420
- "planTreeRowTitle": "jbF1yq_planTreeRowTitle",
1421
- "pageHeaderEyebrow": "jbF1yq_pageHeaderEyebrow",
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",
1422
1449
  "progressLineError": "jbF1yq_progressLineError",
1450
+ "readerArticle": "jbF1yq_readerArticle",
1451
+ "importModal": "jbF1yq_importModal",
1452
+ "runLogTime": "jbF1yq_runLogTime",
1453
+ "brand": "jbF1yq_brand",
1454
+ "topNavActive": "jbF1yq_topNavActive",
1423
1455
  "wfTool": "jbF1yq_wfTool",
1424
- "panelHidden": "jbF1yq_panelHidden",
1456
+ "wfDone": "jbF1yq_wfDone",
1425
1457
  "readerTitle": "jbF1yq_readerTitle",
1426
- "readerSidebar": "jbF1yq_readerSidebar",
1427
- "contentDrawerBody": "jbF1yq_contentDrawerBody",
1428
- "wfBlink": "jbF1yq_wfBlink",
1429
- "fileList": "jbF1yq_fileList",
1430
- "wfFi": "jbF1yq_wfFi",
1431
- "wfDrawerToggle": "jbF1yq_wfDrawerToggle",
1458
+ "wfNow": "jbF1yq_wfNow",
1459
+ "wfMetricSpark": "jbF1yq_wfMetricSpark",
1460
+ "cmdBox": "jbF1yq_cmdBox",
1461
+ "confirmCard": "jbF1yq_confirmCard",
1462
+ "cmdInput": "jbF1yq_cmdInput",
1463
+ "adaptMatrix": "jbF1yq_adaptMatrix",
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",
1475
+ "tnum": "jbF1yq_tnum",
1476
+ "planTreeRow": "jbF1yq_planTreeRow",
1477
+ "authorPageHeader": "jbF1yq_authorPageHeader",
1478
+ "noticeText": "jbF1yq_noticeText",
1432
1479
  "wfToolBlue": "jbF1yq_wfToolBlue",
1433
- "lfDot": "jbF1yq_lfDot",
1434
- "buttonPrimary": "jbF1yq_buttonPrimary",
1435
- "adaptImpacts": "jbF1yq_adaptImpacts",
1436
- "badgeDone": "jbF1yq_badgeDone",
1437
- "assetEditor": "jbF1yq_assetEditor",
1438
- "wfMetrics": "jbF1yq_wfMetrics",
1439
- "nfChipPulse": "jbF1yq_nfChipPulse",
1440
- "nfToastIn": "jbF1yq_nfToastIn",
1441
- "textarea": "jbF1yq_textarea",
1442
- "progressTotalBar": "jbF1yq_progressTotalBar",
1443
- "wfTopRight": "jbF1yq_wfTopRight",
1444
- "wfBoxH": "jbF1yq_wfBoxH",
1445
- "dropzone": "jbF1yq_dropzone",
1446
- "wfDot": "jbF1yq_wfDot",
1447
- "adaptTableScroll": "jbF1yq_adaptTableScroll",
1448
- "navAboutUpdate": "jbF1yq_navAboutUpdate",
1449
- "wfStFail": "jbF1yq_wfStFail",
1450
- "wfBody": "jbF1yq_wfBody",
1451
- "outlineList": "jbF1yq_outlineList",
1452
- "wfPsLegend": "jbF1yq_wfPsLegend",
1453
- "rowEnd": "jbF1yq_rowEnd",
1454
- "progressBar": "jbF1yq_progressBar",
1455
- "segTab": "jbF1yq_segTab",
1456
- "chWorkActions": "jbF1yq_chWorkActions",
1457
- "drawerMax": "jbF1yq_drawerMax",
1458
- "outlineTableWrap": "jbF1yq_outlineTableWrap",
1459
- "liveText": "jbF1yq_liveText",
1460
- "adaptRules": "jbF1yq_adaptRules",
1461
- "outlineTocItem": "jbF1yq_outlineTocItem",
1462
- "t2RailHead": "jbF1yq_t2RailHead",
1463
- "navSpacer": "jbF1yq_navSpacer",
1464
- "assetLabel": "jbF1yq_assetLabel",
1465
- "readerGroupCount": "jbF1yq_readerGroupCount",
1466
- "wfPillDot": "jbF1yq_wfPillDot",
1480
+ "navTitle": "jbF1yq_navTitle",
1481
+ "wsPreview": "jbF1yq_wsPreview",
1482
+ "outlineCodeLang": "jbF1yq_outlineCodeLang",
1483
+ "readerSegBtn": "jbF1yq_readerSegBtn",
1484
+ "planDetailBar": "jbF1yq_planDetailBar",
1485
+ "wfSmallFoot": "jbF1yq_wfSmallFoot",
1467
1486
  "wfDrawerBox": "jbF1yq_wfDrawerBox",
1468
- "outlineH2": "jbF1yq_outlineH2",
1469
- "wfFeedBox": "jbF1yq_wfFeedBox",
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",
1501
+ "brandName": "jbF1yq_brandName",
1502
+ "dimCardSelected": "jbF1yq_dimCardSelected",
1503
+ "iconBtn": "jbF1yq_iconBtn",
1504
+ "brandLogo": "jbF1yq_brandLogo",
1505
+ "outlineTable": "jbF1yq_outlineTable",
1506
+ "confirmHead": "jbF1yq_confirmHead",
1507
+ "brandSub": "jbF1yq_brandSub",
1470
1508
  "subPageTitle": "jbF1yq_subPageTitle",
1471
- "adaptCell": "jbF1yq_adaptCell",
1472
- "wfSt": "jbF1yq_wfSt",
1473
- "cmdBox": "jbF1yq_cmdBox",
1474
- "outlineP": "jbF1yq_outlineP",
1475
- "diffColumn": "jbF1yq_diffColumn",
1476
- "wfToolAmber": "jbF1yq_wfToolAmber",
1477
- "legendOld": "jbF1yq_legendOld",
1478
- "contentDrawer": "jbF1yq_contentDrawer",
1479
- "subPage": "jbF1yq_subPage",
1480
- "readerBody": "jbF1yq_readerBody",
1481
- "pillNavSlider": "jbF1yq_pillNavSlider",
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",
1482
1517
  "wfProgBig": "jbF1yq_wfProgBig",
1483
- "chWorkSide": "jbF1yq_chWorkSide",
1484
- "chWorkAsideBody": "jbF1yq_chWorkAsideBody",
1485
- "headChip": "jbF1yq_headChip",
1486
- "readerGroupArrow": "jbF1yq_readerGroupArrow",
1518
+ "wfConRow": "jbF1yq_wfConRow",
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",
1541
+ "settingsDrawerHead": "jbF1yq_settingsDrawerHead",
1542
+ "bookCardActions": "jbF1yq_bookCardActions",
1543
+ "chWorkTitle": "jbF1yq_chWorkTitle",
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",
1487
1556
  "readerSeg": "jbF1yq_readerSeg",
1488
- "iconBtn": "jbF1yq_iconBtn",
1489
- "outlineLi": "jbF1yq_outlineLi",
1490
- "chWorkDraftBar": "jbF1yq_chWorkDraftBar",
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",
1582
+ "wfProgRest": "jbF1yq_wfProgRest",
1583
+ "importPreview": "jbF1yq_importPreview",
1584
+ "entry": "jbF1yq_entry",
1585
+ "importFileInfo": "jbF1yq_importFileInfo",
1586
+ "outlineHr": "jbF1yq_outlineHr",
1587
+ "wfPreviewName": "jbF1yq_wfPreviewName",
1588
+ "buttonPrimary": "jbF1yq_buttonPrimary",
1491
1589
  "t2Content": "jbF1yq_t2Content",
1492
- "chapterActions": "jbF1yq_chapterActions",
1493
- "assetEditorRow": "jbF1yq_assetEditorRow",
1494
- "emptyStateTitle": "jbF1yq_emptyStateTitle",
1495
- "numSerif": "jbF1yq_numSerif",
1496
- "wfRsName": "jbF1yq_wfRsName",
1497
- "runChip": "jbF1yq_runChip",
1498
- "wfFeedList": "jbF1yq_wfFeedList",
1499
- "assetCardContent": "jbF1yq_assetCardContent",
1500
- "nfSkeletonShimmer": "jbF1yq_nfSkeletonShimmer",
1501
- "wfDl": "jbF1yq_wfDl",
1590
+ "subPageActions": "jbF1yq_subPageActions",
1591
+ "wfQt": "jbF1yq_wfQt",
1592
+ "wbIndexVol": "jbF1yq_wbIndexVol",
1502
1593
  "wfAct": "jbF1yq_wfAct",
1503
- "adaptInputCard": "jbF1yq_adaptInputCard",
1504
- "chWorkAsideTitle": "jbF1yq_chWorkAsideTitle",
1505
- "diffChange": "jbF1yq_diffChange",
1506
- "outlineEdit": "jbF1yq_outlineEdit",
1594
+ "aiTag": "jbF1yq_aiTag",
1595
+ "entryLabel": "jbF1yq_entryLabel",
1507
1596
  "readerHeader": "jbF1yq_readerHeader",
1508
- "runChipDot": "jbF1yq_runChipDot",
1597
+ "row": "jbF1yq_row",
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",
1620
+ "chWorkToolbar": "jbF1yq_chWorkToolbar",
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",
1509
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",
1510
1653
  "progressLine": "jbF1yq_progressLine",
1511
- "adaptImpact": "jbF1yq_adaptImpact",
1512
- "tnum": "jbF1yq_tnum",
1513
- "wfRow": "jbF1yq_wfRow",
1514
- "wfCmd": "jbF1yq_wfCmd",
1515
- "chWorkPickBtns": "jbF1yq_chWorkPickBtns",
1516
- "wbIndexRow": "jbF1yq_wbIndexRow",
1517
- "planDetailEmpty": "jbF1yq_planDetailEmpty",
1518
- "wfSigRight": "jbF1yq_wfSigRight",
1519
- "shelfToolbar": "jbF1yq_shelfToolbar",
1520
- "chapterFocusPulse": "jbF1yq_chapterFocusPulse",
1521
- "adaptOutline": "jbF1yq_adaptOutline",
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",
1676
+ "ideaCandidate": "jbF1yq_ideaCandidate",
1522
1677
  "authorTopTabs": "jbF1yq_authorTopTabs",
1523
- "toolStepActive": "jbF1yq_toolStepActive",
1524
- "ideaToggle": "jbF1yq_ideaToggle",
1525
- "planDetailBar": "jbF1yq_planDetailBar",
1526
- "nfToast": "jbF1yq_nfToast",
1527
- "planBeatsLabel": "jbF1yq_planBeatsLabel",
1528
- "chWorkBar": "jbF1yq_chWorkBar",
1678
+ "badgeWritten": "jbF1yq_badgeWritten",
1679
+ "panelTop": "jbF1yq_panelTop",
1680
+ "navTitleLogo": "jbF1yq_navTitleLogo",
1681
+ "wfCmd": "jbF1yq_wfCmd",
1682
+ "rowBetweenWrap": "jbF1yq_rowBetweenWrap",
1683
+ "t2RailMeta": "jbF1yq_t2RailMeta",
1529
1684
  "titleBlock": "jbF1yq_titleBlock",
1530
- "wfProgRest": "jbF1yq_wfProgRest",
1531
- "adaptTextarea": "jbF1yq_adaptTextarea",
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",
1705
+ "subPageBody": "jbF1yq_subPageBody",
1706
+ "wfDrawerToggle": "jbF1yq_wfDrawerToggle",
1707
+ "coverPreview": "jbF1yq_coverPreview",
1708
+ "busyRow": "jbF1yq_busyRow",
1709
+ "chWorkPickBtns": "jbF1yq_chWorkPickBtns",
1532
1710
  "t2Rail": "jbF1yq_t2Rail",
1533
- "wfPreview": "jbF1yq_wfPreview",
1534
- "outlineDoc": "jbF1yq_outlineDoc",
1535
- "brandLogo": "jbF1yq_brandLogo",
1536
- "toolStepIcon": "jbF1yq_toolStepIcon",
1537
- "navAboutRow": "jbF1yq_navAboutRow",
1538
- "topNavBadge": "jbF1yq_topNavBadge",
1539
- "readerItemBadge": "jbF1yq_readerItemBadge",
1540
- "settingsCard": "jbF1yq_settingsCard",
1541
- "toolStepDetail": "jbF1yq_toolStepDetail",
1542
- "wsColumn": "jbF1yq_wsColumn",
1543
- "bookCardMetaRow": "jbF1yq_bookCardMetaRow",
1544
- "t2RailSep": "jbF1yq_t2RailSep",
1545
- "adaptResult": "jbF1yq_adaptResult",
1711
+ "chapterFocus": "jbF1yq_chapterFocus",
1712
+ "wsSelectedText": "jbF1yq_wsSelectedText",
1546
1713
  "nfToastOut": "jbF1yq_nfToastOut",
1547
- "wfCoordStuck": "jbF1yq_wfCoordStuck",
1548
- "headSpacer": "jbF1yq_headSpacer",
1549
- "diffSameBody": "jbF1yq_diffSameBody",
1550
- "outlineTocL2": "jbF1yq_outlineTocL2",
1551
- "dimTitle": "jbF1yq_dimTitle",
1714
+ "diffText": "jbF1yq_diffText",
1715
+ "wfOpsBtnMain": "jbF1yq_wfOpsBtnMain",
1716
+ "wfStRev": "jbF1yq_wfStRev",
1717
+ "wfPill": "jbF1yq_wfPill",
1552
1718
  "wfFdot": "jbF1yq_wfFdot",
1553
- "wfConRow": "jbF1yq_wfConRow",
1554
- "adaptOutlinePre": "jbF1yq_adaptOutlinePre",
1555
- "genreDesc": "jbF1yq_genreDesc",
1556
- "planDetail": "jbF1yq_planDetail",
1557
- "diffDel": "jbF1yq_diffDel",
1558
- "shelfGrid": "jbF1yq_shelfGrid",
1719
+ "panelHead": "jbF1yq_panelHead",
1720
+ "topNav": "jbF1yq_topNav",
1721
+ "wfEmpty": "jbF1yq_wfEmpty",
1722
+ "chapterMain": "jbF1yq_chapterMain",
1723
+ "docsSurface": "jbF1yq_docsSurface",
1724
+ "wfHint": "jbF1yq_wfHint",
1725
+ "drawerMax": "jbF1yq_drawerMax",
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",
1733
+ "readerMain": "jbF1yq_readerMain",
1559
1734
  "navTitleBook": "jbF1yq_navTitleBook",
1560
- "topNavActive": "jbF1yq_topNavActive",
1561
- "wbIndexVol": "jbF1yq_wbIndexVol",
1562
- "aiTag": "jbF1yq_aiTag",
1563
- "wsPreview": "jbF1yq_wsPreview",
1564
- "chapterList": "jbF1yq_chapterList",
1565
- "dimEdit": "jbF1yq_dimEdit",
1566
- "readerSegBtn": "jbF1yq_readerSegBtn",
1567
- "toolStepStatus": "jbF1yq_toolStepStatus",
1568
- "importResult": "jbF1yq_importResult",
1569
- "wfBook": "jbF1yq_wfBook",
1570
- "adaptMatrix": "jbF1yq_adaptMatrix",
1571
1735
  "view": "jbF1yq_view",
1572
- "badgeRejected": "jbF1yq_badgeRejected",
1573
- "planDot": "jbF1yq_planDot",
1574
- "wfMetric": "jbF1yq_wfMetric",
1575
- "wfDone": "jbF1yq_wfDone",
1576
- "panelTop": "jbF1yq_panelTop",
1577
- "bookCardActions": "jbF1yq_bookCardActions",
1578
- "t2RailBtn": "jbF1yq_t2RailBtn",
1579
- "wfPsN": "jbF1yq_wfPsN",
1580
- "topNavNi": "jbF1yq_topNavNi",
1581
1736
  "settingsDrawer": "jbF1yq_settingsDrawer",
1582
- "wsAppliedBanner": "jbF1yq_wsAppliedBanner",
1583
- "outlineTable": "jbF1yq_outlineTable",
1584
- "planTreeRow": "jbF1yq_planTreeRow",
1585
- "brandName": "jbF1yq_brandName",
1586
- "assetKind": "jbF1yq_assetKind",
1587
- "dropzoneActive": "jbF1yq_dropzoneActive",
1588
- "wsEditor": "jbF1yq_wsEditor",
1589
- "importPreview": "jbF1yq_importPreview",
1590
- "drawerHead": "jbF1yq_drawerHead",
1591
- "chWorkText": "jbF1yq_chWorkText",
1592
- "outlineTocL3": "jbF1yq_outlineTocL3",
1593
- "adaptRule": "jbF1yq_adaptRule",
1594
- "settingsDrawerHead": "jbF1yq_settingsDrawerHead",
1595
- "emptyStateHint": "jbF1yq_emptyStateHint",
1596
- "wfStFix": "jbF1yq_wfStFix",
1597
- "assetGroup": "jbF1yq_assetGroup",
1598
- "wfOpsBtn": "jbF1yq_wfOpsBtn",
1599
- "wfOpsBtnMain": "jbF1yq_wfOpsBtnMain",
1600
- "planTreeVolGroup": "jbF1yq_planTreeVolGroup",
1601
- "wsPage": "jbF1yq_wsPage",
1602
- "row": "jbF1yq_row",
1603
- "wfDrawerList": "jbF1yq_wfDrawerList",
1604
- "input": "jbF1yq_input",
1605
- "panelTitle": "jbF1yq_panelTitle",
1606
- "panelBody": "jbF1yq_panelBody",
1607
- "pageHeader": "jbF1yq_pageHeader",
1608
- "meta": "jbF1yq_meta",
1609
- "readerPara": "jbF1yq_readerPara",
1610
- "createBookInner": "jbF1yq_createBookInner",
1611
- "wfAccentBlue": "jbF1yq_wfAccentBlue",
1612
- "wfCmdReason": "jbF1yq_wfCmdReason",
1613
- "lfPill": "jbF1yq_lfPill",
1614
- "assetCard": "jbF1yq_assetCard",
1615
- "readerGroupTitle": "jbF1yq_readerGroupTitle",
1616
1737
  "outlineTocL1": "jbF1yq_outlineTocL1",
1617
- "chWorkSideHead": "jbF1yq_chWorkSideHead",
1618
- "readerSegActive": "jbF1yq_readerSegActive",
1619
- "buttonSmall": "jbF1yq_buttonSmall",
1620
- "wfFt": "jbF1yq_wfFt",
1621
- "outlineVol": "jbF1yq_outlineVol",
1622
- "cardTitleLg": "jbF1yq_cardTitleLg",
1623
- "importModalHead": "jbF1yq_importModalHead",
1624
1738
  "wfSw": "jbF1yq_wfSw",
1625
- "wfLiveChip": "jbF1yq_wfLiveChip",
1626
- "shelfStatGrid": "jbF1yq_shelfStatGrid",
1627
- "wfDlDim": "jbF1yq_wfDlDim",
1628
- "topNavSpacer": "jbF1yq_topNavSpacer",
1629
- "runLogLine": "jbF1yq_runLogLine",
1630
- "progressLineLive": "jbF1yq_progressLineLive",
1631
- "adaptProposal": "jbF1yq_adaptProposal",
1632
- "wfConsoleNote": "jbF1yq_wfConsoleNote",
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",
1633
1751
  "progressLineDone": "jbF1yq_progressLineDone",
1634
- "toolStepError": "jbF1yq_toolStepError",
1635
- "wfTop": "jbF1yq_wfTop",
1636
- "wfRsChk": "jbF1yq_wfRsChk",
1637
- "tabular": "jbF1yq_tabular",
1638
- "wfPs": "jbF1yq_wfPs",
1639
- "wfDlDi": "jbF1yq_wfDlDi",
1640
- "wfRs": "jbF1yq_wfRs",
1641
- "assetGrid": "jbF1yq_assetGrid",
1642
- "cmdItem": "jbF1yq_cmdItem",
1643
- "entry": "jbF1yq_entry",
1644
- "shelfEmptyIcon": "jbF1yq_shelfEmptyIcon",
1645
- "chWorkSideBody": "jbF1yq_chWorkSideBody",
1646
- "nfCmdPop": "jbF1yq_nfCmdPop",
1647
- "wfDlName": "jbF1yq_wfDlName",
1648
- "planTreeVol": "jbF1yq_planTreeVol",
1649
- "navBadgePulse": "jbF1yq_navBadgePulse",
1650
- "button": "jbF1yq_button",
1651
- "importField": "jbF1yq_importField",
1652
- "assetCardFooter": "jbF1yq_assetCardFooter",
1653
- "topNavLabel": "jbF1yq_topNavLabel",
1654
- "diffList": "jbF1yq_diffList",
1655
- "wfPreviewActs": "jbF1yq_wfPreviewActs",
1656
- "wfPoolBar": "jbF1yq_wfPoolBar",
1657
- "readerItem": "jbF1yq_readerItem",
1658
- "importModalBody": "jbF1yq_importModalBody",
1659
- "badgeGenerating": "jbF1yq_badgeGenerating",
1660
- "diffOld": "jbF1yq_diffOld",
1661
- "wfEmpty": "jbF1yq_wfEmpty",
1662
- "emptyStateIcon": "jbF1yq_emptyStateIcon",
1663
- "wsSelectedText": "jbF1yq_wsSelectedText",
1752
+ "genreDesc": "jbF1yq_genreDesc",
1664
1753
  "planTreeVolMeta": "jbF1yq_planTreeVolMeta",
1665
- "dimCurrent": "jbF1yq_dimCurrent",
1666
- "assetCardName": "jbF1yq_assetCardName",
1667
- "readerFoot": "jbF1yq_readerFoot",
1668
- "subPageMeta": "jbF1yq_subPageMeta",
1669
- "wfPill": "jbF1yq_wfPill",
1670
- "bookCardCover": "jbF1yq_bookCardCover",
1671
- "runLog": "jbF1yq_runLog",
1672
- "wfStRev": "jbF1yq_wfStRev",
1673
- "bookCardName": "jbF1yq_bookCardName",
1674
- "wfOpsRow": "jbF1yq_wfOpsRow",
1754
+ "bigProgressBar": "jbF1yq_bigProgressBar",
1755
+ "navAbout": "jbF1yq_navAbout",
1756
+ "adaptProposal": "jbF1yq_adaptProposal",
1757
+ "fileList": "jbF1yq_fileList",
1758
+ "settingsCard": "jbF1yq_settingsCard",
1759
+ "nfFadeIn": "jbF1yq_nfFadeIn",
1760
+ "adaptImpact": "jbF1yq_adaptImpact",
1761
+ "buttonDanger": "jbF1yq_buttonDanger",
1675
1762
  "bookCard": "jbF1yq_bookCard",
1676
- "bookCardCoverTitle": "jbF1yq_bookCardCoverTitle",
1677
- "outlineCodeBlock": "jbF1yq_outlineCodeBlock",
1678
- "outlineH3": "jbF1yq_outlineH3",
1679
- "shelfHero": "jbF1yq_shelfHero",
1680
- "settingsDrawerOverlay": "jbF1yq_settingsDrawerOverlay",
1681
- "brandEn": "jbF1yq_brandEn",
1763
+ "badge": "jbF1yq_badge",
1764
+ "navBadgePulse": "jbF1yq_navBadgePulse",
1765
+ "settingsDrawerBody": "jbF1yq_settingsDrawerBody",
1766
+ "toolStep": "jbF1yq_toolStep",
1767
+ "assetCardContent": "jbF1yq_assetCardContent",
1768
+ "wfRow": "jbF1yq_wfRow",
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",
1776
+ "navGroupLabel": "jbF1yq_navGroupLabel",
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",
1682
1786
  "shelfEmptyTitle": "jbF1yq_shelfEmptyTitle",
1683
- "bookCardProgressBar": "jbF1yq_bookCardProgressBar",
1684
- "chatBubbleUser": "jbF1yq_chatBubbleUser",
1787
+ "shelfToolbar": "jbF1yq_shelfToolbar",
1788
+ "readerItemActive": "jbF1yq_readerItemActive",
1789
+ "planDetailEmpty": "jbF1yq_planDetailEmpty",
1790
+ "assetLabel": "jbF1yq_assetLabel",
1791
+ "nfSlideInRight": "jbF1yq_nfSlideInRight",
1792
+ "rowBetweenBaseline": "jbF1yq_rowBetweenBaseline",
1793
+ "readerPara": "jbF1yq_readerPara",
1794
+ "panelNav": "jbF1yq_panelNav",
1795
+ "assetKind": "jbF1yq_assetKind",
1796
+ "emptyStateIcon": "jbF1yq_emptyStateIcon",
1797
+ "adaptOutlinePre": "jbF1yq_adaptOutlinePre",
1798
+ "confirmText": "jbF1yq_confirmText",
1799
+ "wfTop": "jbF1yq_wfTop",
1685
1800
  "drawerHeadBtn": "jbF1yq_drawerHeadBtn",
1686
- "entryLabel": "jbF1yq_entryLabel",
1687
- "wfSignal": "jbF1yq_wfSignal",
1688
- "nfDrawerIn": "jbF1yq_nfDrawerIn",
1689
- "outlineH1": "jbF1yq_outlineH1",
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",
1811
+ "wfBody": "jbF1yq_wfBody",
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",
1690
1827
  "noticeSuccess": "jbF1yq_noticeSuccess",
1691
- "dimCardHead": "jbF1yq_dimCardHead",
1692
- "emptyState": "jbF1yq_emptyState",
1693
- "planMaster": "jbF1yq_planMaster",
1694
- "diffSame": "jbF1yq_diffSame",
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",
1837
+ "wfSt": "jbF1yq_wfSt",
1838
+ "diffOld": "jbF1yq_diffOld",
1695
1839
  "nfViewIn": "jbF1yq_nfViewIn",
1696
- "outlineH": "jbF1yq_outlineH",
1697
- "wfHint": "jbF1yq_wfHint",
1698
- "badgePending": "jbF1yq_badgePending",
1699
- "wfSig": "jbF1yq_wfSig",
1700
- "chWorkSideFoot": "jbF1yq_chWorkSideFoot",
1701
- "outlineCode": "jbF1yq_outlineCode",
1702
- "panel": "jbF1yq_panel",
1703
- "assistantFloatHeader": "jbF1yq_assistantFloatHeader",
1704
- "bookshelf": "jbF1yq_bookshelf",
1705
- "navAbout": "jbF1yq_navAbout",
1706
- "toolStepName": "jbF1yq_toolStepName",
1707
- "readerError": "jbF1yq_readerError",
1708
- "readerChapterTitle": "jbF1yq_readerChapterTitle",
1709
- "docsSurface": "jbF1yq_docsSurface",
1710
- "brandText": "jbF1yq_brandText",
1711
- "nfFadeIn": "jbF1yq_nfFadeIn",
1712
- "wfPsLab": "jbF1yq_wfPsLab",
1713
- "wfFdotOk": "jbF1yq_wfFdotOk",
1714
- "chWorkToolActions": "jbF1yq_chWorkToolActions",
1715
- "chatBubbleAssistant": "jbF1yq_chatBubbleAssistant",
1716
- "coverPreview": "jbF1yq_coverPreview",
1717
- "wfPreviewName": "jbF1yq_wfPreviewName",
1718
- "assetCardTop": "jbF1yq_assetCardTop",
1719
- "importFileInfo": "jbF1yq_importFileInfo",
1720
- "chWorkToolbar": "jbF1yq_chWorkToolbar",
1721
- "nfToastHost": "jbF1yq_nfToastHost",
1722
- "planTree": "jbF1yq_planTree",
1723
- "pulse": "jbF1yq_pulse",
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",
1724
1847
  "diffNew": "jbF1yq_diffNew",
1725
- "brandSub": "jbF1yq_brandSub",
1726
- "importModalActions": "jbF1yq_importModalActions",
1727
- "wfNow": "jbF1yq_wfNow",
1728
- "readerLoading": "jbF1yq_readerLoading",
1729
- "drawerSpacer": "jbF1yq_drawerSpacer",
1730
- "topNav": "jbF1yq_topNav",
1731
- "chWorkMain": "jbF1yq_chWorkMain",
1732
- "wsSelected": "jbF1yq_wsSelected",
1733
- "ideaCard": "jbF1yq_ideaCard",
1734
- "outlineH4": "jbF1yq_outlineH4",
1735
- "importModalTabs": "jbF1yq_importModalTabs",
1736
- "wfRail": "jbF1yq_wfRail",
1737
- "wfCmdBtn": "jbF1yq_wfCmdBtn",
1738
- "cardTitle": "jbF1yq_cardTitle",
1739
- "wfConErr": "jbF1yq_wfConErr",
1740
- "wfConTxt": "jbF1yq_wfConTxt",
1741
- "chatRole": "jbF1yq_chatRole",
1742
- "subPageHead": "jbF1yq_subPageHead",
1743
- "badge": "jbF1yq_badge",
1744
- "shelfEmpty": "jbF1yq_shelfEmpty",
1745
- "chatScroll": "jbF1yq_chatScroll",
1746
- "legendNew": "jbF1yq_legendNew",
1747
- "wsPageHeader": "jbF1yq_wsPageHeader",
1748
- "ideaCandidate": "jbF1yq_ideaCandidate",
1749
- "authorContent": "jbF1yq_authorContent",
1750
- "bookCardProgressFill": "jbF1yq_bookCardProgressFill",
1751
- "wfColB": "jbF1yq_wfColB",
1752
- "panelNavCollapsed": "jbF1yq_panelNavCollapsed",
1753
- "subPageBack": "jbF1yq_subPageBack",
1754
- "runChipText": "jbF1yq_runChipText",
1755
- "bookCardActive": "jbF1yq_bookCardActive",
1848
+ "badgeDone": "jbF1yq_badgeDone",
1849
+ "chWorkSideFoot": "jbF1yq_chWorkSideFoot",
1850
+ "tabular": "jbF1yq_tabular",
1851
+ "adaptImpacts": "jbF1yq_adaptImpacts",
1852
+ "readerGroupCount": "jbF1yq_readerGroupCount",
1853
+ "adaptResult": "jbF1yq_adaptResult",
1854
+ "wfRsName": "jbF1yq_wfRsName",
1855
+ "outlineH3": "jbF1yq_outlineH3",
1756
1856
  "wfAccentAmber": "jbF1yq_wfAccentAmber",
1757
- "bigProgressBarFill": "jbF1yq_bigProgressBarFill",
1758
- "progress": "jbF1yq_progress",
1759
- "shelfStatCard": "jbF1yq_shelfStatCard",
1760
- "cmdInput": "jbF1yq_cmdInput",
1761
1857
  "assetFilterChip": "jbF1yq_assetFilterChip",
1762
- "pageHeaderTitle": "jbF1yq_pageHeaderTitle",
1763
1858
  "drawerTitle": "jbF1yq_drawerTitle",
1764
- "wfSmallFoot": "jbF1yq_wfSmallFoot",
1765
- "outlineToc": "jbF1yq_outlineToc",
1766
- "importModalOverlay": "jbF1yq_importModalOverlay",
1767
- "switch": "jbF1yq_switch",
1768
- "wfConsole": "jbF1yq_wfConsole",
1769
- "wfLiveMark": "jbF1yq_wfLiveMark",
1770
- "shelfSearch": "jbF1yq_shelfSearch",
1771
- "diffText": "jbF1yq_diffText",
1772
- "bookCardBlurb": "jbF1yq_bookCardBlurb",
1773
- "outlineCodeLang": "jbF1yq_outlineCodeLang",
1774
- "subPageBody": "jbF1yq_subPageBody",
1775
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",
1776
1871
  "diffTagOld": "jbF1yq_diffTagOld",
1872
+ "wsSelected": "jbF1yq_wsSelected",
1873
+ "readerGroupArrow": "jbF1yq_readerGroupArrow",
1874
+ "readerChapterTitle": "jbF1yq_readerChapterTitle",
1777
1875
  "outlineDocWrap": "jbF1yq_outlineDocWrap",
1778
- "wfPoolWrap": "jbF1yq_wfPoolWrap",
1779
- "planBeats": "jbF1yq_planBeats",
1780
- "outlineVolSummary": "jbF1yq_outlineVolSummary",
1781
- "assistantFloatBody": "jbF1yq_assistantFloatBody",
1782
- "fadeIn": "jbF1yq_fadeIn",
1783
- "diffAdd": "jbF1yq_diffAdd",
1784
- "readerChapterMeta": "jbF1yq_readerChapterMeta",
1785
- "planTreeSearch": "jbF1yq_planTreeSearch",
1786
- "wfPl": "jbF1yq_wfPl",
1787
- "topNavBtn": "jbF1yq_topNavBtn",
1788
- "authorTopNav": "jbF1yq_authorTopNav",
1789
- "importPreviewList": "jbF1yq_importPreviewList",
1790
- "wfQtTone": "jbF1yq_wfQtTone",
1791
- "coverPlaceholder": "jbF1yq_coverPlaceholder",
1792
- "reviewBox": "jbF1yq_reviewBox",
1793
- "navTitleName": "jbF1yq_navTitleName",
1794
- "chWorkPickBar": "jbF1yq_chWorkPickBar",
1795
- "nfpanel": "jbF1yq_nfpanel",
1796
- "assetTextarea": "jbF1yq_assetTextarea",
1797
- "wfPreviewLine": "jbF1yq_wfPreviewLine",
1798
- "t2RailMeta": "jbF1yq_t2RailMeta",
1799
- "authorPageBodyFlow": "jbF1yq_authorPageBodyFlow",
1800
- "wfCard2": "jbF1yq_wfCard2",
1801
- "toolSteps": "jbF1yq_toolSteps",
1802
- "dimCard": "jbF1yq_dimCard",
1803
- "wfSigGood": "jbF1yq_wfSigGood",
1804
- "authorHome": "jbF1yq_authorHome",
1805
- "readerView": "jbF1yq_readerView",
1806
- "t2Master": "jbF1yq_t2Master",
1807
- "outlineHr": "jbF1yq_outlineHr",
1808
- "chWorkTitle": "jbF1yq_chWorkTitle",
1809
- "assistantResize": "jbF1yq_assistantResize",
1810
- "field": "jbF1yq_field",
1811
- "planTreeRowNo": "jbF1yq_planTreeRowNo",
1812
- "assistantStatus": "jbF1yq_assistantStatus",
1813
- "assetGroupHeader": "jbF1yq_assetGroupHeader",
1814
- "chWorkGrid": "jbF1yq_chWorkGrid",
1815
- "importModal": "jbF1yq_importModal",
1816
- "wfQt": "jbF1yq_wfQt",
1817
- "wfConBar": "jbF1yq_wfConBar",
1818
- "wfCoord": "jbF1yq_wfCoord",
1819
- "wfColA": "jbF1yq_wfColA",
1820
- "pageHeaderMain": "jbF1yq_pageHeaderMain",
1821
- "assistantFloat": "jbF1yq_assistantFloat",
1822
- "cmdEmpty": "jbF1yq_cmdEmpty",
1823
- "buttonDanger": "jbF1yq_buttonDanger",
1824
- "panelHead": "jbF1yq_panelHead",
1825
- "subPageActions": "jbF1yq_subPageActions",
1826
- "cmdMask": "jbF1yq_cmdMask",
1827
- "noticeError": "jbF1yq_noticeError",
1828
- "navTab": "jbF1yq_navTab",
1829
- "toolLive": "jbF1yq_toolLive",
1830
- "statCardDDetail": "jbF1yq_statCardDDetail",
1831
- "busyRow": "jbF1yq_busyRow",
1832
- "chWork": "jbF1yq_chWork",
1833
- "wfBox": "jbF1yq_wfBox",
1834
- "pillNav": "jbF1yq_pillNav",
1835
- "readerText": "jbF1yq_readerText",
1836
- "diffLegend": "jbF1yq_diffLegend",
1837
- "wfFdotErr": "jbF1yq_wfFdotErr",
1838
- "assetFilterChipActive": "jbF1yq_assetFilterChipActive",
1839
- "wfRsNo": "jbF1yq_wfRsNo",
1840
- "pageHeaderSub": "jbF1yq_pageHeaderSub",
1841
- "statCardDValue": "jbF1yq_statCardDValue",
1842
- "chapterFocus": "jbF1yq_chapterFocus",
1843
- "pillNavSliding": "jbF1yq_pillNavSliding",
1844
- "bookCardTitleRow": "jbF1yq_bookCardTitleRow",
1845
- "navTitleLogo": "jbF1yq_navTitleLogo",
1846
- "pageHeaderActions": "jbF1yq_pageHeaderActions",
1847
- "drawerScrim": "jbF1yq_drawerScrim",
1876
+ "fieldLabel": "jbF1yq_fieldLabel",
1877
+ "planDetail": "jbF1yq_planDetail",
1878
+ "progressLineLive": "jbF1yq_progressLineLive",
1879
+ "runChipText": "jbF1yq_runChipText",
1848
1880
  "wfDs": "jbF1yq_wfDs",
1849
- "nfToastTick": "jbF1yq_nfToastTick",
1850
- "chapterTitle": "jbF1yq_chapterTitle",
1851
- "onlyChanges": "jbF1yq_onlyChanges",
1852
- "panelContent": "jbF1yq_panelContent",
1853
- "cmdList": "jbF1yq_cmdList",
1854
- "brand": "jbF1yq_brand",
1855
- "wfSep": "jbF1yq_wfSep"
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"
1856
1896
  };
1857
1897
  //#endregion
1858
1898
  //#region src/client/panel/status-badge.ts
@@ -9781,7 +9821,7 @@ window.__ModuleLoader__.load({
9781
9821
  d: "m9 11 3 3L22 4",
9782
9822
  key: "1pflzl"
9783
9823
  }]]);
9784
- createLucideIcon("circle-check", [["circle", {
9824
+ const CircleCheck = createLucideIcon("circle-check", [["circle", {
9785
9825
  cx: "12",
9786
9826
  cy: "12",
9787
9827
  r: "10",
@@ -20953,7 +20993,7 @@ window.__ModuleLoader__.load({
20953
20993
  key: "cif1o7"
20954
20994
  }]
20955
20995
  ]);
20956
- createLucideIcon("list-tree", [
20996
+ const ListTree = createLucideIcon("list-tree", [
20957
20997
  ["path", {
20958
20998
  d: "M8 5h13",
20959
20999
  key: "1pao27"
@@ -34424,7 +34464,7 @@ window.__ModuleLoader__.load({
34424
34464
  d: "m22 7-8.5 8.5-5-5L2 17",
34425
34465
  key: "1t1m79"
34426
34466
  }]]);
34427
- createLucideIcon("triangle-alert", [
34467
+ const TriangleAlert = createLucideIcon("triangle-alert", [
34428
34468
  ["path", {
34429
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",
34430
34470
  key: "wmoenq"
@@ -37368,6 +37408,7 @@ window.__ModuleLoader__.load({
37368
37408
  key: "durymu"
37369
37409
  }]
37370
37410
  ]);
37411
+ exports.AlertTriangle = TriangleAlert;
37371
37412
  exports.ArrowLeft = ArrowLeft;
37372
37413
  exports.ArrowRight = ArrowRight;
37373
37414
  exports.BarChart3 = ChartColumn;
@@ -37377,6 +37418,7 @@ window.__ModuleLoader__.load({
37377
37418
  exports.Boxes = Boxes;
37378
37419
  exports.Brain = Brain;
37379
37420
  exports.Brush = Brush;
37421
+ exports.CheckCircle2 = CircleCheck;
37380
37422
  exports.Download = Download;
37381
37423
  exports.Factory = Factory;
37382
37424
  exports.FileDown = FileDown;
@@ -37389,6 +37431,7 @@ window.__ModuleLoader__.load({
37389
37431
  exports.Library = Library;
37390
37432
  exports.Lightbulb = Lightbulb;
37391
37433
  exports.ListChecks = ListChecks;
37434
+ exports.ListTree = ListTree;
37392
37435
  exports.MessageSquare = MessageSquare;
37393
37436
  exports.PenLine = PenLine;
37394
37437
  exports.Pencil = Pencil;
@@ -37404,6 +37447,7 @@ window.__ModuleLoader__.load({
37404
37447
  exports.Settings = Settings;
37405
37448
  exports.Sparkles = Sparkles;
37406
37449
  exports.Trash2 = Trash;
37450
+ exports.TriangleAlert = TriangleAlert;
37407
37451
  exports.Upload = Upload;
37408
37452
  exports.Wand2 = WandSparkles;
37409
37453
  exports.X = X;
@@ -38149,6 +38193,242 @@ window.__ModuleLoader__.load({
38149
38193
  });
38150
38194
  }
38151
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
38152
38432
  //#region src/client/panel/toast.ts
38153
38433
  /**
38154
38434
  * Toast — 完成时刻的轻确认(R3 微交互)。
@@ -38340,6 +38620,8 @@ window.__ModuleLoader__.load({
38340
38620
  const [busy, setBusy] = (0, react.useState)(false);
38341
38621
  const [error, setError] = (0, react.useState)("");
38342
38622
  const [notice, setNotice] = (0, react.useState)("");
38623
+ /** 破坏性操作确认弹窗(取代 window.confirm)。 */
38624
+ const confirmUi = useConfirm();
38343
38625
  /** 思考耗时(秒,busy 时每秒刷新)。 */
38344
38626
  const [thinkSeconds, setThinkSeconds] = (0, react.useState)(0);
38345
38627
  const idRef = (0, react.useRef)(0);
@@ -38481,19 +38763,28 @@ window.__ModuleLoader__.load({
38481
38763
  scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight });
38482
38764
  }, [lines]);
38483
38765
  /** 清空对话记录(服务端删除历史 + 本地清空)。 */
38484
- const handleClear = async () => {
38485
- if (!window.confirm("清空全部聊天记录?此操作不可恢复(不影响大纲/设定/章节)。")) return;
38486
- setBusy(true);
38487
- setError("");
38488
- try {
38489
- await api.assistantClear();
38490
- setLines([]);
38491
- setNotice("对话已清空,编辑老师会重新了解项目");
38492
- } catch (err) {
38493
- setError(err.message);
38494
- } finally {
38495
- setBusy(false);
38496
- }
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
+ });
38497
38788
  };
38498
38789
  /** Send one message. */
38499
38790
  const handleSend = async () => {
@@ -38553,12 +38844,8 @@ window.__ModuleLoader__.load({
38553
38844
  },
38554
38845
  children: [
38555
38846
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38556
- className: panel_module_css_default.row,
38557
- style: {
38558
- justifyContent: "space-between",
38559
- alignItems: "center",
38560
- gap: "var(--nf-space-8)"
38561
- },
38847
+ className: `css.rowBetween`,
38848
+ style: { gap: "var(--nf-space-8)" },
38562
38849
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
38563
38850
  className: panel_module_css_default.meta,
38564
38851
  children: tt("assistant.hint")
@@ -38738,7 +39025,8 @@ window.__ModuleLoader__.load({
38738
39025
  },
38739
39026
  children: tt("assistant.send")
38740
39027
  })]
38741
- })
39028
+ }),
39029
+ confirmUi.dialog
38742
39030
  ]
38743
39031
  });
38744
39032
  }
@@ -38981,11 +39269,7 @@ window.__ModuleLoader__.load({
38981
39269
  },
38982
39270
  children: [
38983
39271
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38984
- className: panel_module_css_default.row,
38985
- style: {
38986
- justifyContent: "space-between",
38987
- flexWrap: "wrap"
38988
- },
39272
+ className: `css.rowBetween css.rowBetweenWrap`,
38989
39273
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38990
39274
  className: panel_module_css_default.titleBlock,
38991
39275
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -39637,7 +39921,7 @@ window.__ModuleLoader__.load({
39637
39921
  className: panel_module_css_default.bookCardProgressBar,
39638
39922
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
39639
39923
  className: panel_module_css_default.bookCardProgressFill,
39640
- style: { width: `${Math.round(ratio * 100)}%` }
39924
+ style: { transform: `scaleX(${ratio})` }
39641
39925
  })
39642
39926
  }),
39643
39927
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -40564,8 +40848,7 @@ window.__ModuleLoader__.load({
40564
40848
  }, d.key + "-" + i))
40565
40849
  }),
40566
40850
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
40567
- className: panel_module_css_default.rowEnd,
40568
- style: { justifyContent: "flex-end" },
40851
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
40569
40852
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
40570
40853
  type: "button",
40571
40854
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonPrimary,
@@ -42030,7 +42313,7 @@ window.__ModuleLoader__.load({
42030
42313
  className: panel_module_css_default.bigProgressBar,
42031
42314
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
42032
42315
  className: panel_module_css_default.bigProgressBarFill,
42033
- style: { width: Math.round(liveBar.ratio * 100) + "%" }
42316
+ style: { transform: `scaleX(${liveBar.ratio})` }
42034
42317
  })
42035
42318
  }),
42036
42319
  liveBar?.text !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -42069,7 +42352,7 @@ window.__ModuleLoader__.load({
42069
42352
  className: panel_module_css_default.progressBar,
42070
42353
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42071
42354
  className: panel_module_css_default.progressBarFill,
42072
- style: { width: Math.round((line.ratio ?? 0) * 100) + "%" }
42355
+ style: { transform: `scaleX(${line.ratio ?? 0})` }
42073
42356
  })
42074
42357
  }), line.text]
42075
42358
  }, line.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { ref: endRef })]
@@ -42204,6 +42487,8 @@ window.__ModuleLoader__.load({
42204
42487
  const [providerCustom, setProviderCustom] = (0, react.useState)(false);
42205
42488
  const [modelCustom, setModelCustom] = (0, react.useState)(false);
42206
42489
  const [test, setTest] = (0, react.useState)({ testing: false });
42490
+ /** 破坏性操作确认弹窗(取代 window.confirm:删除提供方会连带移除 API 密钥)。 */
42491
+ const confirmUi = useConfirm();
42207
42492
  const [vendors, setVendors] = (0, react.useState)(fallbackVendors());
42208
42493
  const [addPanel, setAddPanel] = (0, react.useState)("none");
42209
42494
  const [editTarget, setEditTarget] = (0, react.useState)("");
@@ -42372,18 +42657,28 @@ window.__ModuleLoader__.load({
42372
42657
  setSavingAdd(false);
42373
42658
  }
42374
42659
  };
42375
- const removeProvider = async (p) => {
42376
- if (!window.confirm("删除提供方「" + (p.name !== "" ? p.name : p.id) + "」?将移除 DSH 配置与 API 密钥。")) return;
42377
- try {
42378
- const vendor = vendors.find((v) => v.id === p.id);
42379
- await api.removeProvider({
42380
- provider: p.id,
42381
- apiKeyEnv: vendor?.apiKeyEnv
42382
- });
42383
- await loadProviders();
42384
- } catch (err) {
42385
- setAddErr(err.message);
42386
- }
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
+ });
42387
42682
  };
42388
42683
  const providerOptions = configuredProviders.some((p) => p.id === provider) ? configuredProviders : provider !== "" && provider !== CUSTOM ? [{
42389
42684
  id: provider,
@@ -42404,426 +42699,418 @@ window.__ModuleLoader__.load({
42404
42699
  minWidth: 0,
42405
42700
  width: "100%"
42406
42701
  },
42407
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42408
- className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42409
- style: { gap: "var(--nf-space-16)" },
42410
- children: [
42411
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42412
- className: panel_module_css_default.cardTitle,
42413
- children: "模型"
42414
- }),
42415
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42416
- className: panel_module_css_default.meta,
42417
- children: "填入各提供方的 API 密钥即可使用其模型。"
42418
- }),
42419
- configuredProviders.map((p) => {
42420
- const isBuiltin = p.id === "deepseek-official";
42421
- const isKnownVendor = vendors.some((v) => v.id === p.id);
42422
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42423
- style: {
42424
- border: "1px solid var(--nf-border)",
42425
- borderRadius: "var(--nf-radius-12)",
42426
- padding: "var(--nf-space-12)",
42427
- display: "flex",
42428
- alignItems: "center",
42429
- gap: "var(--nf-space-8)",
42430
- flexWrap: "wrap",
42431
- justifyContent: "space-between"
42432
- },
42433
- 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", {
42434
42719
  style: {
42720
+ border: "1px solid var(--nf-border)",
42721
+ borderRadius: "var(--nf-radius-12)",
42722
+ padding: "var(--nf-space-12)",
42435
42723
  display: "flex",
42436
42724
  alignItems: "center",
42437
- gap: "var(--nf-space-8)"
42438
- },
42439
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42440
- style: { fontWeight: 600 },
42441
- children: p.name !== "" && p.name !== p.id ? p.name : p.id
42442
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: {
42443
- width: 8,
42444
- height: 8,
42445
- borderRadius: "50%",
42446
- background: "var(--nf-success)"
42447
- } })]
42448
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42449
- style: {
42450
- display: "flex",
42451
- gap: "var(--nf-space-6)",
42452
- alignItems: "center"
42725
+ gap: "var(--nf-space-8)",
42726
+ flexWrap: "wrap",
42727
+ justifyContent: "space-between"
42453
42728
  },
42454
- children: [!isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42455
- type: "button",
42456
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42457
- onClick: () => openPanel(isKnownVendor ? "standard" : "custom", p.id),
42458
- children: tt("settings.edit")
42459
- }), !isBuiltin && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42460
- type: "button",
42461
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42462
- style: { color: "var(--nf-error)" },
42463
- onClick: () => {
42464
- 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)"
42465
42734
  },
42466
- children: tt("settings.delete")
42467
- })]
42468
- })]
42469
- }, p.id);
42470
- }),
42471
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42472
- className: panel_module_css_default.row,
42473
- style: {
42474
- gap: "var(--nf-space-10)",
42475
- flexWrap: "wrap"
42476
- },
42477
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42478
- type: "button",
42479
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42480
- onClick: () => openPanel("standard"),
42481
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42482
- size: 13,
42483
- style: { verticalAlign: -2 }
42484
- }), " 添加提供方"]
42485
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42486
- type: "button",
42487
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42488
- onClick: () => openPanel("custom"),
42489
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42490
- size: 13,
42491
- style: { verticalAlign: -2 }
42492
- }), " 添加自定义提供方"]
42493
- })]
42494
- }),
42495
- addPanel !== "none" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42496
- style: {
42497
- border: "1px solid var(--nf-border)",
42498
- borderRadius: "var(--nf-radius-12)",
42499
- padding: "var(--nf-space-12)",
42500
- display: "flex",
42501
- flexDirection: "column",
42502
- gap: "var(--nf-space-12)"
42503
- },
42504
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42505
- className: panel_module_css_default.row,
42506
- style: {
42507
- justifyContent: "space-between",
42508
- alignItems: "center"
42509
- },
42510
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42511
- className: panel_module_css_default.fieldLabel,
42512
- children: addPanel === "standard" ? editTarget !== "" ? "编辑提供方" : "添加提供方" : "自定义提供方"
42513
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42514
- type: "button",
42515
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42516
- onClick: () => openPanel("none"),
42517
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.X, {
42518
- size: 13,
42519
- style: { verticalAlign: -2 }
42520
- }), " 关闭"]
42521
- })]
42522
- }), addPanel === "standard" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42523
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42524
- className: panel_module_css_default.field,
42525
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42526
- className: panel_module_css_default.fieldLabel,
42527
- children: "提供方"
42528
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42529
- className: panel_module_css_default.input,
42530
- value: vendorId,
42531
- onChange: (e) => setVendorId(e.target.value),
42532
- children: vendors.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42533
- value: v.id,
42534
- children: v.name
42535
- }, v.id))
42536
- })]
42537
- }),
42538
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42539
- className: panel_module_css_default.field,
42540
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42541
- className: panel_module_css_default.fieldLabel,
42542
- children: "API 密钥"
42543
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42544
- className: panel_module_css_default.input,
42545
- type: "password",
42546
- value: addApiKey,
42547
- onChange: (e) => setAddApiKey(e.target.value),
42548
- placeholder: "输入 API 密钥,或留空使用环境认证"
42549
- })]
42550
- }),
42551
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42552
- className: panel_module_css_default.field,
42553
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42554
- className: panel_module_css_default.fieldLabel,
42555
- children: "模型 id(可选)"
42556
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42557
- className: panel_module_css_default.input,
42558
- value: addModel,
42559
- onChange: (e) => setAddModel(e.target.value),
42560
- placeholder: "例如 glm-5.3-flash"
42561
- })]
42562
- }),
42563
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42564
- className: panel_module_css_default.row,
42565
- style: {
42566
- justifyContent: "flex-end",
42567
- gap: "var(--nf-space-8)"
42568
- },
42569
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42570
- type: "button",
42571
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42572
- onClick: () => openPanel("none"),
42573
- children: "取消"
42574
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42575
- type: "button",
42576
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42577
- disabled: savingAdd,
42578
- onClick: () => {
42579
- saveStandard();
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"
42580
42749
  },
42581
- children: savingAdd ? "保存中…" : "保存"
42582
- })]
42583
- })
42584
- ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42585
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42586
- className: panel_module_css_default.field,
42587
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42588
- className: panel_module_css_default.fieldLabel,
42589
- children: "Provider ID"
42590
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42591
- className: panel_module_css_default.input,
42592
- value: custProvider,
42593
- onChange: (e) => setCustProvider(e.target.value),
42594
- placeholder: "acme-gateway"
42595
- })]
42596
- }),
42597
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42598
- className: panel_module_css_default.field,
42599
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42600
- className: panel_module_css_default.fieldLabel,
42601
- children: "显示名称"
42602
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42603
- className: panel_module_css_default.input,
42604
- value: custName,
42605
- onChange: (e) => setCustName(e.target.value),
42606
- placeholder: "显示名称"
42607
- })]
42608
- }),
42609
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42610
- className: panel_module_css_default.field,
42611
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42612
- className: panel_module_css_default.fieldLabel,
42613
- children: "API 地址"
42614
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42615
- className: panel_module_css_default.input,
42616
- value: custBaseURL,
42617
- onChange: (e) => setCustBaseURL(e.target.value),
42618
- placeholder: "https://gateway.example/v1"
42619
- })]
42620
- }),
42621
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42622
- className: panel_module_css_default.field,
42623
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42624
- className: panel_module_css_default.fieldLabel,
42625
- children: "API 协议"
42626
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42627
- className: panel_module_css_default.input,
42628
- value: custProtocol,
42629
- onChange: (e) => setCustProtocol(e.target.value),
42630
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42631
- value: "openai-completions",
42632
- children: "openai-completions"
42633
- })
42634
- })]
42635
- }),
42636
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42637
- className: panel_module_css_default.field,
42638
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42639
- className: panel_module_css_default.fieldLabel,
42640
- children: "API 密钥"
42641
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42642
- className: panel_module_css_default.input,
42643
- type: "password",
42644
- value: custApiKey,
42645
- onChange: (e) => setCustApiKey(e.target.value),
42646
- placeholder: "输入 API 密钥"
42647
- })]
42648
- }),
42649
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42650
- className: panel_module_css_default.field,
42651
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42652
- className: panel_module_css_default.fieldLabel,
42653
- children: "模型目录 / 模型 id"
42654
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42655
- className: panel_module_css_default.input,
42656
- value: custModel,
42657
- onChange: (e) => setCustModel(e.target.value),
42658
- placeholder: "例如 glm-5.3-flash"
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
+ })]
42659
42764
  })]
42660
- }),
42661
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42765
+ }, p.id);
42766
+ }),
42767
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42768
+ className: panel_module_css_default.row,
42769
+ style: {
42770
+ gap: "var(--nf-space-10)",
42771
+ flexWrap: "wrap"
42772
+ },
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
+ }), " 添加提供方"]
42781
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42782
+ type: "button",
42783
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42784
+ onClick: () => openPanel("custom"),
42785
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Plus, {
42786
+ size: 13,
42787
+ style: { verticalAlign: -2 }
42788
+ }), " 添加自定义提供方"]
42789
+ })]
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", {
42662
42801
  className: panel_module_css_default.row,
42663
42802
  style: {
42664
- justifyContent: "flex-end",
42665
- gap: "var(--nf-space-8)"
42803
+ justifyContent: "space-between",
42804
+ alignItems: "center"
42666
42805
  },
42667
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42806
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42807
+ className: panel_module_css_default.fieldLabel,
42808
+ children: addPanel === "standard" ? editTarget !== "" ? "编辑提供方" : "添加提供方" : "自定义提供方"
42809
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42668
42810
  type: "button",
42669
42811
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42670
42812
  onClick: () => openPanel("none"),
42671
- children: "取消"
42672
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42673
- type: "button",
42674
- className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42675
- disabled: savingAdd,
42676
- onClick: () => {
42677
- saveCustom();
42678
- },
42679
- children: savingAdd ? "创建中…" : "创建提供方"
42680
- })]
42681
- })
42682
- ] })]
42683
- }),
42684
- addMsg !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42685
- className: panel_module_css_default.meta,
42686
- style: { color: "var(--nf-success)" },
42687
- children: ["✓ ", addMsg]
42688
- }),
42689
- addErr !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
42690
- className: panel_module_css_default.meta,
42691
- style: { color: "var(--nf-error)" },
42692
- children: ["✗ ", addErr]
42693
- })
42694
- ]
42695
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42696
- className: panel_module_css_default.card + " " + panel_module_css_default.settingsCard,
42697
- style: { gap: "var(--nf-space-16)" },
42698
- children: [
42699
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42700
- className: panel_module_css_default.cardTitle,
42701
- children: "当前写作模型"
42702
- }),
42703
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42704
- className: panel_module_css_default.field,
42705
- children: [
42706
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42707
- className: panel_module_css_default.fieldLabel,
42708
- children: tt("settings.provider")
42709
- }),
42710
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
42711
- className: panel_module_css_default.input,
42712
- value: providerValue,
42713
- onChange: (e) => {
42714
- const v = e.target.value;
42715
- if (v === CUSTOM) setProviderCustom(true);
42716
- else {
42717
- setProviderCustom(false);
42718
- onProvider(v);
42719
- }
42720
- },
42721
- children: [providerOptions.map((p) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42722
- value: p.id,
42723
- children: p.name !== "" && p.name !== p.id ? p.name + "(" + p.id + ")" : p.id
42724
- }, p.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42725
- value: CUSTOM,
42726
- children: tt("settings.customProvider")
42813
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.X, {
42814
+ size: 13,
42815
+ style: { verticalAlign: -2 }
42816
+ }), " 关闭"]
42727
42817
  })]
42728
- }),
42729
- providerCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42730
- className: panel_module_css_default.input,
42731
- style: { marginTop: "var(--nf-space-6)" },
42732
- value: provider,
42733
- placeholder: "provider 路由 id",
42734
- onChange: (e) => onProvider(e.target.value)
42735
- })
42736
- ]
42737
- }),
42738
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42739
- className: panel_module_css_default.field,
42740
- children: [
42741
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42742
- className: panel_module_css_default.fieldLabel,
42743
- children: tt("settings.model")
42744
- }),
42745
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42746
- className: panel_module_css_default.row,
42747
- style: {
42748
- gap: "var(--nf-space-8)",
42749
- flexWrap: "wrap"
42750
- },
42751
- children: [
42752
- /* @__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", {
42753
42825
  className: panel_module_css_default.input,
42754
- style: {
42755
- flex: 1,
42756
- minWidth: 200
42757
- },
42758
- value: modelValue,
42759
- onChange: (e) => {
42760
- const v = e.target.value;
42761
- if (v === CUSTOM) setModelCustom(true);
42762
- else {
42763
- setModelCustom(false);
42764
- onModel(v);
42765
- }
42766
- },
42767
- children: [modelOptions.map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42768
- value: m.id,
42769
- children: m.name !== "" && m.name !== m.id ? m.name + "(" + m.id + ")" : m.id
42770
- }, m.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42771
- value: CUSTOM,
42772
- children: tt("settings.modelCustom")
42773
- })]
42774
- }),
42775
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42826
+ value: vendorId,
42827
+ onChange: (e) => setVendorId(e.target.value),
42828
+ children: vendors.map((v) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42829
+ value: v.id,
42830
+ children: v.name
42831
+ }, v.id))
42832
+ })]
42833
+ }),
42834
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42835
+ className: panel_module_css_default.field,
42836
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42837
+ className: panel_module_css_default.fieldLabel,
42838
+ children: "API 密钥"
42839
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42840
+ className: panel_module_css_default.input,
42841
+ type: "password",
42842
+ value: addApiKey,
42843
+ onChange: (e) => setAddApiKey(e.target.value),
42844
+ placeholder: "输入 API 密钥,或留空使用环境认证"
42845
+ })]
42846
+ }),
42847
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42848
+ className: panel_module_css_default.field,
42849
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42850
+ className: panel_module_css_default.fieldLabel,
42851
+ children: "模型 id(可选)"
42852
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42853
+ className: panel_module_css_default.input,
42854
+ value: addModel,
42855
+ onChange: (e) => setAddModel(e.target.value),
42856
+ placeholder: "例如 glm-5.3-flash"
42857
+ })]
42858
+ }),
42859
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42860
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
42861
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42776
42862
  type: "button",
42777
42863
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42778
- disabled: modelsLoading || provider === "",
42779
- title: "刷新模型",
42864
+ onClick: () => openPanel("none"),
42865
+ children: "取消"
42866
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42867
+ type: "button",
42868
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42869
+ disabled: savingAdd,
42780
42870
  onClick: () => {
42781
- loadProviderModels(provider);
42871
+ saveStandard();
42782
42872
  },
42783
- children: [
42784
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.RefreshCw, {
42785
- size: 13,
42786
- style: { verticalAlign: -2 }
42787
- }),
42788
- " ",
42789
- modelsLoading ? "…" : tt("settings.refreshModels")
42790
- ]
42791
- }),
42792
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42873
+ children: savingAdd ? "保存中…" : "保存"
42874
+ })]
42875
+ })
42876
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
42877
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42878
+ className: panel_module_css_default.field,
42879
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42880
+ className: panel_module_css_default.fieldLabel,
42881
+ children: "Provider ID"
42882
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42883
+ className: panel_module_css_default.input,
42884
+ value: custProvider,
42885
+ onChange: (e) => setCustProvider(e.target.value),
42886
+ placeholder: "acme-gateway"
42887
+ })]
42888
+ }),
42889
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42890
+ className: panel_module_css_default.field,
42891
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42892
+ className: panel_module_css_default.fieldLabel,
42893
+ children: "显示名称"
42894
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42895
+ className: panel_module_css_default.input,
42896
+ value: custName,
42897
+ onChange: (e) => setCustName(e.target.value),
42898
+ placeholder: "显示名称"
42899
+ })]
42900
+ }),
42901
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42902
+ className: panel_module_css_default.field,
42903
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42904
+ className: panel_module_css_default.fieldLabel,
42905
+ children: "API 地址"
42906
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42907
+ className: panel_module_css_default.input,
42908
+ value: custBaseURL,
42909
+ onChange: (e) => setCustBaseURL(e.target.value),
42910
+ placeholder: "https://gateway.example/v1"
42911
+ })]
42912
+ }),
42913
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42914
+ className: panel_module_css_default.field,
42915
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42916
+ className: panel_module_css_default.fieldLabel,
42917
+ children: "API 协议"
42918
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
42919
+ className: panel_module_css_default.input,
42920
+ value: custProtocol,
42921
+ onChange: (e) => setCustProtocol(e.target.value),
42922
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
42923
+ value: "openai-completions",
42924
+ children: "openai-completions"
42925
+ })
42926
+ })]
42927
+ }),
42928
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42929
+ className: panel_module_css_default.field,
42930
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42931
+ className: panel_module_css_default.fieldLabel,
42932
+ children: "API 密钥"
42933
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42934
+ className: panel_module_css_default.input,
42935
+ type: "password",
42936
+ value: custApiKey,
42937
+ onChange: (e) => setCustApiKey(e.target.value),
42938
+ placeholder: "输入 API 密钥"
42939
+ })]
42940
+ }),
42941
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42942
+ className: panel_module_css_default.field,
42943
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
42944
+ className: panel_module_css_default.fieldLabel,
42945
+ children: "模型目录 / 模型 id"
42946
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42947
+ className: panel_module_css_default.input,
42948
+ value: custModel,
42949
+ onChange: (e) => setCustModel(e.target.value),
42950
+ placeholder: "例如 glm-5.3-flash"
42951
+ })]
42952
+ }),
42953
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
42954
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
42955
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42793
42956
  type: "button",
42794
42957
  className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall,
42795
- disabled: test.testing || provider.trim() === "" || model.trim() === "",
42958
+ onClick: () => openPanel("none"),
42959
+ children: "取消"
42960
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
42961
+ type: "button",
42962
+ className: panel_module_css_default.button + " " + panel_module_css_default.buttonSmall + " " + panel_module_css_default.buttonPrimary,
42963
+ disabled: savingAdd,
42796
42964
  onClick: () => {
42797
- runTest();
42965
+ saveCustom();
42798
42966
  },
42799
- title: tt("settings.testHint"),
42800
- children: [
42801
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.PlugZap, {
42802
- size: 13,
42803
- style: { verticalAlign: -2 }
42804
- }),
42805
- " ",
42806
- test.testing ? tt("settings.testRunning") : tt("settings.testConnection")
42807
- ]
42808
- })
42809
- ]
42810
- }),
42811
- modelCustom && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
42812
- className: panel_module_css_default.input,
42813
- style: { marginTop: "var(--nf-space-6)" },
42814
- value: model,
42815
- placeholder: tt("settings.modelCustomPlaceholder"),
42816
- onChange: (e) => onModel(e.target.value)
42817
- }),
42818
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
42819
- className: panel_module_css_default.meta,
42820
- style: { color: test.ok === true ? "var(--nf-success)" : test.ok === false ? "var(--nf-error)" : void 0 },
42821
- 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")
42822
- })
42823
- ]
42824
- })
42825
- ]
42826
- })]
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
+ ]
42827
43114
  });
42828
43115
  }
42829
43116
  //#endregion
@@ -43200,10 +43487,6 @@ window.__ModuleLoader__.load({
43200
43487
  }),
43201
43488
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43202
43489
  className: panel_module_css_default.row,
43203
- style: {
43204
- gap: "var(--nf-space-8)",
43205
- flexWrap: "wrap"
43206
- },
43207
43490
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43208
43491
  className: panel_module_css_default.input,
43209
43492
  style: {
@@ -43377,8 +43660,7 @@ window.__ModuleLoader__.load({
43377
43660
  ]
43378
43661
  }),
43379
43662
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
43380
- className: panel_module_css_default.row,
43381
- style: { justifyContent: "flex-end" },
43663
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
43382
43664
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
43383
43665
  type: "button",
43384
43666
  className: panel_module_css_default.button,
@@ -43407,10 +43689,6 @@ window.__ModuleLoader__.load({
43407
43689
  }),
43408
43690
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43409
43691
  className: panel_module_css_default.row,
43410
- style: {
43411
- gap: "var(--nf-space-8)",
43412
- flexWrap: "wrap"
43413
- },
43414
43692
  children: [
43415
43693
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
43416
43694
  className: panel_module_css_default.input,
@@ -44852,7 +45130,7 @@ window.__ModuleLoader__.load({
44852
45130
  * 作者级首页容器:书架页左侧导航 + 内容区。
44853
45131
  * 导航复用工作区 .panelNav 玻璃卡片样式(同款),导航项为作者级:书架/改编/资产库/全局资产库/AI 进度/设置。
44854
45132
  */
44855
- const PLUGIN_VERSION = "2.1.4";
45133
+ const PLUGIN_VERSION = "2.1.5";
44856
45134
  /** GitHub 仓库地址(关于区块点击跳转)。 */
44857
45135
  const REPO_URL = "https://github.com/watersxya/dsh-novel-forge";
44858
45136
  /** 顶层 tab(横向,墨案:创作 / 灵感策划 / 资产 / 设置)+ 组内二级页。 */
@@ -45335,6 +45613,69 @@ window.__ModuleLoader__.load({
45335
45613
  });
45336
45614
  }
45337
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
45338
45679
  //#region src/client/panel/ReaderView.tsx
45339
45680
  /**
45340
45681
  * 阅读页:沉浸式章节阅读(纯只读,零 LLM 消耗)。
@@ -45937,12 +46278,8 @@ window.__ModuleLoader__.load({
45937
46278
  })]
45938
46279
  })] }) : null,
45939
46280
  run !== null && run.status === "running" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45940
- className: panel_module_css_default.row,
45941
- style: {
45942
- justifyContent: "space-between",
45943
- flexWrap: "wrap",
45944
- gap: "var(--nf-space-8)"
45945
- },
46281
+ className: `css.rowBetween css.rowBetweenWrap`,
46282
+ style: { gap: "var(--nf-space-8)" },
45946
46283
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
45947
46284
  className: panel_module_css_default.meta,
45948
46285
  children: [
@@ -46137,10 +46474,6 @@ window.__ModuleLoader__.load({
46137
46474
  children: [
46138
46475
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
46139
46476
  className: panel_module_css_default.row,
46140
- style: {
46141
- flexWrap: "wrap",
46142
- gap: "var(--nf-space-8)"
46143
- },
46144
46477
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
46145
46478
  className: panel_module_css_default.meta,
46146
46479
  children: [
@@ -46173,7 +46506,7 @@ window.__ModuleLoader__.load({
46173
46506
  className: panel_module_css_default.bigProgressBar,
46174
46507
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
46175
46508
  className: panel_module_css_default.bigProgressBarFill,
46176
- style: { width: `${Math.round(ratio * 100)}%` }
46509
+ style: { transform: `scaleX(${ratio})` }
46177
46510
  })
46178
46511
  }),
46179
46512
  run.pendingManual.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -47025,7 +47358,6 @@ window.__ModuleLoader__.load({
47025
47358
  }),
47026
47359
  (outlineText.trim().length > 0 || effectiveName !== "") && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47027
47360
  className: panel_module_css_default.row,
47028
- style: { flexWrap: "wrap" },
47029
47361
  children: [
47030
47362
  outlineText.trim().length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47031
47363
  className: panel_module_css_default.meta,
@@ -47074,7 +47406,6 @@ window.__ModuleLoader__.load({
47074
47406
  }),
47075
47407
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47076
47408
  className: panel_module_css_default.row,
47077
- style: { flexWrap: "wrap" },
47078
47409
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
47079
47410
  type: "button",
47080
47411
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall} ${panel_module_css_default.buttonPrimary}`,
@@ -47109,12 +47440,8 @@ window.__ModuleLoader__.load({
47109
47440
  } : void 0,
47110
47441
  children: [
47111
47442
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47112
- className: panel_module_css_default.row,
47113
- style: {
47114
- justifyContent: "space-between",
47115
- flexWrap: "wrap",
47116
- gap: "var(--nf-space-6)"
47117
- },
47443
+ className: `css.rowBetween css.rowBetweenWrap`,
47444
+ style: { gap: "var(--nf-space-6)" },
47118
47445
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47119
47446
  style: {
47120
47447
  display: "flex",
@@ -47688,8 +48015,7 @@ window.__ModuleLoader__.load({
47688
48015
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47689
48016
  className: panel_module_css_default.card,
47690
48017
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47691
- className: panel_module_css_default.row,
47692
- style: { justifyContent: "space-between" },
48018
+ className: `css.rowBetween`,
47693
48019
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
47694
48020
  className: panel_module_css_default.cardTitle,
47695
48021
  children: "大世界"
@@ -47721,8 +48047,7 @@ window.__ModuleLoader__.load({
47721
48047
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47722
48048
  className: panel_module_css_default.card,
47723
48049
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47724
- className: panel_module_css_default.row,
47725
- style: { justifyContent: "space-between" },
48050
+ className: `css.rowBetween`,
47726
48051
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47727
48052
  className: panel_module_css_default.cardTitle,
47728
48053
  children: [
@@ -47780,8 +48105,7 @@ window.__ModuleLoader__.load({
47780
48105
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47781
48106
  className: panel_module_css_default.card,
47782
48107
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47783
- className: panel_module_css_default.row,
47784
- style: { justifyContent: "space-between" },
48108
+ className: `css.rowBetween`,
47785
48109
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47786
48110
  className: panel_module_css_default.cardTitle,
47787
48111
  children: [
@@ -47839,8 +48163,7 @@ window.__ModuleLoader__.load({
47839
48163
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47840
48164
  className: panel_module_css_default.card,
47841
48165
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
47842
- className: panel_module_css_default.row,
47843
- style: { justifyContent: "space-between" },
48166
+ className: `css.rowBetween`,
47844
48167
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
47845
48168
  className: panel_module_css_default.cardTitle,
47846
48169
  children: [
@@ -48547,11 +48870,7 @@ window.__ModuleLoader__.load({
48547
48870
  })
48548
48871
  ]
48549
48872
  })] }) : selected !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48550
- className: panel_module_css_default.row,
48551
- style: {
48552
- justifyContent: "space-between",
48553
- flexWrap: "wrap"
48554
- },
48873
+ className: `css.rowBetween css.rowBetweenWrap`,
48555
48874
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
48556
48875
  className: panel_module_css_default.cardTitleLg,
48557
48876
  children: [" ", selected.title]
@@ -48687,13 +49006,8 @@ window.__ModuleLoader__.load({
48687
49006
  style: { gap: "var(--nf-space-12)" },
48688
49007
  children: [
48689
49008
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48690
- className: panel_module_css_default.row,
48691
- style: {
48692
- justifyContent: "space-between",
48693
- alignItems: "center",
48694
- flexWrap: "wrap",
48695
- gap: "var(--nf-space-8)"
48696
- },
49009
+ className: `css.rowBetween css.rowBetweenWrap`,
49010
+ style: { gap: "var(--nf-space-8)" },
48697
49011
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48698
49012
  className: panel_module_css_default.cardTitle,
48699
49013
  children: "故事时间线"
@@ -48709,11 +49023,6 @@ window.__ModuleLoader__.load({
48709
49023
  }),
48710
49024
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
48711
49025
  className: panel_module_css_default.row,
48712
- style: {
48713
- flexWrap: "wrap",
48714
- gap: "var(--nf-space-8)",
48715
- alignItems: "center"
48716
- },
48717
49026
  children: [
48718
49027
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
48719
49028
  className: panel_module_css_default.input,
@@ -48748,17 +49057,19 @@ window.__ModuleLoader__.load({
48748
49057
  })
48749
49058
  ]
48750
49059
  }),
48751
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48752
- style: {
48753
- color: "var(--nf-success)",
48754
- fontSize: "var(--nf-text-12)"
49060
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49061
+ kind: "ok",
49062
+ onRetry: () => {
49063
+ refresh();
48755
49064
  },
49065
+ retryLabel: "重新读取",
48756
49066
  children: notice
48757
49067
  }),
48758
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
48759
- style: {
48760
- color: "var(--nf-error)",
48761
- fontSize: "var(--nf-text-12)"
49068
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49069
+ kind: "error",
49070
+ detail: "时间线依赖已抽取的章节事件。刚抽取完某章却报此错,通常是那章的抽取被中断了。",
49071
+ onRetry: () => {
49072
+ refresh();
48762
49073
  },
48763
49074
  children: error
48764
49075
  }),
@@ -48931,7 +49242,7 @@ window.__ModuleLoader__.load({
48931
49242
  },
48932
49243
  children: [
48933
49244
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
48934
- style: { fontSize: "var(--nf-fs-13)" },
49245
+ style: { fontSize: "var(--nf-fs-14)" },
48935
49246
  children: [
48936
49247
  "修正时间线事件 · 第 ",
48937
49248
  editing.chapterNo,
@@ -48997,11 +49308,7 @@ window.__ModuleLoader__.load({
48997
49308
  })]
48998
49309
  }),
48999
49310
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49000
- className: panel_module_css_default.row,
49001
- style: {
49002
- justifyContent: "flex-end",
49003
- gap: 6
49004
- },
49311
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49005
49312
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49006
49313
  type: "button",
49007
49314
  className: panel_module_css_default.button,
@@ -49204,13 +49511,8 @@ window.__ModuleLoader__.load({
49204
49511
  style: { gap: "var(--nf-space-12)" },
49205
49512
  children: [
49206
49513
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49207
- className: panel_module_css_default.row,
49208
- style: {
49209
- justifyContent: "space-between",
49210
- alignItems: "center",
49211
- flexWrap: "wrap",
49212
- gap: "var(--nf-space-8)"
49213
- },
49514
+ className: `css.rowBetween css.rowBetweenWrap`,
49515
+ style: { gap: "var(--nf-space-8)" },
49214
49516
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49215
49517
  className: panel_module_css_default.cardTitle,
49216
49518
  children: "张力曲线"
@@ -49229,11 +49531,6 @@ window.__ModuleLoader__.load({
49229
49531
  }),
49230
49532
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49231
49533
  className: panel_module_css_default.row,
49232
- style: {
49233
- gap: "var(--nf-space-8)",
49234
- alignItems: "center",
49235
- flexWrap: "wrap"
49236
- },
49237
49534
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
49238
49535
  className: panel_module_css_default.input,
49239
49536
  value: data?.preset ?? "escalation",
@@ -49248,17 +49545,19 @@ window.__ModuleLoader__.load({
49248
49545
  children: "虚线=参考曲线形状;实线=目标;绿点=审稿实际。点图中任意一章可改目标张力。"
49249
49546
  })]
49250
49547
  }),
49251
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49252
- style: {
49253
- color: "var(--nf-success)",
49254
- fontSize: "var(--nf-text-12)"
49548
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49549
+ kind: "ok",
49550
+ onRetry: () => {
49551
+ refresh();
49255
49552
  },
49553
+ retryLabel: "重新读取",
49256
49554
  children: notice
49257
49555
  }),
49258
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49259
- style: {
49260
- color: "var(--nf-error)",
49261
- fontSize: "var(--nf-text-12)"
49556
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49557
+ kind: "error",
49558
+ detail: "张力曲线依赖章节计划与审稿结果。若刚改过卷 / 章节计划,先重试刷新再核对。",
49559
+ onRetry: () => {
49560
+ refresh();
49262
49561
  },
49263
49562
  children: error
49264
49563
  }),
@@ -49359,7 +49658,7 @@ window.__ModuleLoader__.load({
49359
49658
  },
49360
49659
  children: [
49361
49660
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", {
49362
- style: { fontSize: "var(--nf-fs-13)" },
49661
+ style: { fontSize: "var(--nf-fs-14)" },
49363
49662
  children: [
49364
49663
  "第 ",
49365
49664
  editing,
@@ -49374,8 +49673,7 @@ window.__ModuleLoader__.load({
49374
49673
  onChange: (e) => setDraft(Number(e.target.value))
49375
49674
  }),
49376
49675
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49377
- className: panel_module_css_default.row,
49378
- style: { justifyContent: "space-between" },
49676
+ className: `css.rowBetween`,
49379
49677
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49380
49678
  className: panel_module_css_default.meta,
49381
49679
  children: [
@@ -49395,11 +49693,7 @@ window.__ModuleLoader__.load({
49395
49693
  })]
49396
49694
  }),
49397
49695
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49398
- className: panel_module_css_default.row,
49399
- style: {
49400
- justifyContent: "flex-end",
49401
- gap: 6
49402
- },
49696
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49403
49697
  children: [
49404
49698
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49405
49699
  type: "button",
@@ -49586,13 +49880,8 @@ window.__ModuleLoader__.load({
49586
49880
  style: { gap: "var(--nf-space-12)" },
49587
49881
  children: [
49588
49882
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49589
- className: panel_module_css_default.row,
49590
- style: {
49591
- justifyContent: "space-between",
49592
- alignItems: "center",
49593
- flexWrap: "wrap",
49594
- gap: "var(--nf-space-8)"
49595
- },
49883
+ className: `css.rowBetween css.rowBetweenWrap`,
49884
+ style: { gap: "var(--nf-space-8)" },
49596
49885
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49597
49886
  className: panel_module_css_default.cardTitle,
49598
49887
  children: "风格漂移曲线"
@@ -49611,11 +49900,6 @@ window.__ModuleLoader__.load({
49611
49900
  }),
49612
49901
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49613
49902
  className: panel_module_css_default.row,
49614
- style: {
49615
- gap: "var(--nf-space-8)",
49616
- alignItems: "center",
49617
- flexWrap: "wrap"
49618
- },
49619
49903
  children: [
49620
49904
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
49621
49905
  className: panel_module_css_default.input,
@@ -49640,10 +49924,11 @@ window.__ModuleLoader__.load({
49640
49924
  })
49641
49925
  ]
49642
49926
  }),
49643
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49644
- style: {
49645
- color: "var(--nf-error)",
49646
- fontSize: "var(--nf-text-12)"
49927
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
49928
+ kind: "error",
49929
+ detail: "风格漂移需要已有章节正文(每章 200 字以上)。若刚写完新章,重试通常就能算出指标。",
49930
+ onRetry: () => {
49931
+ refresh();
49647
49932
  },
49648
49933
  children: error
49649
49934
  }),
@@ -49763,13 +50048,8 @@ window.__ModuleLoader__.load({
49763
50048
  style: { gap: "var(--nf-space-12)" },
49764
50049
  children: [
49765
50050
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49766
- className: panel_module_css_default.row,
49767
- style: {
49768
- justifyContent: "space-between",
49769
- alignItems: "center",
49770
- flexWrap: "wrap",
49771
- gap: "var(--nf-space-8)"
49772
- },
50051
+ className: `css.rowBetween css.rowBetweenWrap`,
50052
+ style: { gap: "var(--nf-space-8)" },
49773
50053
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49774
50054
  className: panel_module_css_default.cardTitle,
49775
50055
  children: "提示词槽位(本书)"
@@ -49782,17 +50062,15 @@ window.__ModuleLoader__.load({
49782
50062
  className: panel_module_css_default.meta,
49783
50063
  children: "这里的文字会追加到写作提示词末尾,用来微调表达方式。**规则类内容不可改**: 道藏、写作红线、内容合规红线、反 AI 规则、阶段契约由宿主锁定,槽位碰不到。"
49784
50064
  }),
49785
- notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49786
- style: {
49787
- color: "var(--nf-success)",
49788
- fontSize: "var(--nf-text-12)"
49789
- },
50065
+ notice !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
50066
+ kind: "ok",
49790
50067
  children: notice
49791
50068
  }),
49792
- error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
49793
- style: {
49794
- color: "var(--nf-error)",
49795
- fontSize: "var(--nf-text-12)"
50069
+ error !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoticeBar, {
50070
+ kind: "error",
50071
+ detail: "槽位写入失败时本次修改未生效,规则类内容(道藏 / 红线 / 合规)不受影响。重试会重新提交当前草稿。",
50072
+ onRetry: () => {
50073
+ refresh();
49796
50074
  },
49797
50075
  children: error
49798
50076
  }),
@@ -49810,12 +50088,8 @@ window.__ModuleLoader__.load({
49810
50088
  },
49811
50089
  children: [
49812
50090
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49813
- className: panel_module_css_default.row,
49814
- style: {
49815
- justifyContent: "space-between",
49816
- alignItems: "baseline",
49817
- gap: "var(--nf-space-8)"
49818
- },
50091
+ className: `css.rowBetween css.rowBetweenBaseline`,
50092
+ style: { gap: "var(--nf-space-8)" },
49819
50093
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
49820
50094
  style: { fontSize: "var(--nf-fs-12)" },
49821
50095
  children: slot.label
@@ -49844,11 +50118,7 @@ window.__ModuleLoader__.load({
49844
50118
  }))
49845
50119
  }),
49846
50120
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49847
- className: panel_module_css_default.row,
49848
- style: {
49849
- justifyContent: "flex-end",
49850
- gap: 6
49851
- },
50121
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
49852
50122
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
49853
50123
  type: "button",
49854
50124
  className: panel_module_css_default.button,
@@ -49953,11 +50223,7 @@ window.__ModuleLoader__.load({
49953
50223
  },
49954
50224
  children: [
49955
50225
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
49956
- className: panel_module_css_default.row,
49957
- style: {
49958
- justifyContent: "space-between",
49959
- flexWrap: "wrap"
49960
- },
50226
+ className: `css.rowBetween css.rowBetweenWrap`,
49961
50227
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
49962
50228
  style: {
49963
50229
  display: "flex",
@@ -50048,11 +50314,7 @@ window.__ModuleLoader__.load({
50048
50314
  },
50049
50315
  children: [
50050
50316
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50051
- className: panel_module_css_default.row,
50052
- style: {
50053
- justifyContent: "space-between",
50054
- flexWrap: "wrap"
50055
- },
50317
+ className: `css.rowBetween css.rowBetweenWrap`,
50056
50318
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50057
50319
  style: {
50058
50320
  display: "flex",
@@ -50121,11 +50383,7 @@ window.__ModuleLoader__.load({
50121
50383
  },
50122
50384
  children: [
50123
50385
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50124
- className: panel_module_css_default.row,
50125
- style: {
50126
- justifyContent: "space-between",
50127
- flexWrap: "wrap"
50128
- },
50386
+ className: `css.rowBetween css.rowBetweenWrap`,
50129
50387
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50130
50388
  style: {
50131
50389
  display: "flex",
@@ -50214,11 +50472,7 @@ window.__ModuleLoader__.load({
50214
50472
  },
50215
50473
  children: [
50216
50474
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50217
- className: panel_module_css_default.row,
50218
- style: {
50219
- justifyContent: "space-between",
50220
- flexWrap: "wrap"
50221
- },
50475
+ className: `css.rowBetween css.rowBetweenWrap`,
50222
50476
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 剧情健康检查" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50223
50477
  style: {
50224
50478
  display: "flex",
@@ -50316,11 +50570,7 @@ window.__ModuleLoader__.load({
50316
50570
  },
50317
50571
  children: [
50318
50572
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50319
- className: panel_module_css_default.row,
50320
- style: {
50321
- justifyContent: "space-between",
50322
- flexWrap: "wrap"
50323
- },
50573
+ className: `css.rowBetween css.rowBetweenWrap`,
50324
50574
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 剧情方案" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
50325
50575
  type: "button",
50326
50576
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
@@ -50348,11 +50598,7 @@ window.__ModuleLoader__.load({
50348
50598
  },
50349
50599
  children: [
50350
50600
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50351
- className: panel_module_css_default.row,
50352
- style: {
50353
- justifyContent: "space-between",
50354
- flexWrap: "wrap"
50355
- },
50601
+ className: `css.rowBetween css.rowBetweenWrap`,
50356
50602
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50357
50603
  style: {
50358
50604
  display: "flex",
@@ -50405,11 +50651,7 @@ window.__ModuleLoader__.load({
50405
50651
  },
50406
50652
  children: [
50407
50653
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50408
- className: panel_module_css_default.row,
50409
- style: {
50410
- justifyContent: "space-between",
50411
- flexWrap: "wrap"
50412
- },
50654
+ className: `css.rowBetween css.rowBetweenWrap`,
50413
50655
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
50414
50656
  " 建议(",
50415
50657
  props.suggestions.length,
@@ -50433,11 +50675,7 @@ window.__ModuleLoader__.load({
50433
50675
  fontSize: "var(--nf-fs-12)"
50434
50676
  },
50435
50677
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
50436
- className: panel_module_css_default.row,
50437
- style: {
50438
- justifyContent: "space-between",
50439
- flexWrap: "wrap"
50440
- },
50678
+ className: `css.rowBetween css.rowBetweenWrap`,
50441
50679
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50442
50680
  style: {
50443
50681
  display: "flex",
@@ -50608,6 +50846,87 @@ window.__ModuleLoader__.load({
50608
50846
  label: tt("tab.settings"),
50609
50847
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 18 })
50610
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
+ };
50611
50930
  /** 审稿维度中文名(审稿问题按维度标注展示)。 */
50612
50931
  const REVIEW_DIM_ZH = {
50613
50932
  character: "人设",
@@ -51148,11 +51467,7 @@ window.__ModuleLoader__.load({
51148
51467
  },
51149
51468
  children: [
51150
51469
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51151
- className: panel_module_css_default.row,
51152
- style: {
51153
- justifyContent: "space-between",
51154
- alignItems: "center"
51155
- },
51470
+ className: `css.rowBetween`,
51156
51471
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
51157
51472
  className: panel_module_css_default.meta,
51158
51473
  children: "覆盖写入前会自动留存;回滚也可再撤销。"
@@ -51208,8 +51523,7 @@ window.__ModuleLoader__.load({
51208
51523
  tab === "diff" && (hasDraft ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51209
51524
  className: panel_module_css_default.chWorkDraftBar,
51210
51525
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51211
- className: panel_module_css_default.row,
51212
- style: { justifyContent: "space-between" },
51526
+ className: `css.rowBetween`,
51213
51527
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "草稿待处置" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
51214
51528
  className: panel_module_css_default.meta,
51215
51529
  children: [
@@ -51254,8 +51568,7 @@ window.__ModuleLoader__.load({
51254
51568
  className: panel_module_css_default.reviewBox,
51255
51569
  children: [
51256
51570
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51257
- className: panel_module_css_default.row,
51258
- style: { justifyContent: "space-between" },
51571
+ className: `css.rowBetween`,
51259
51572
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "审稿报告" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
51260
51573
  style: { color: review.passed ? "var(--nf-success)" : "var(--nf-error)" },
51261
51574
  children: [
@@ -51380,8 +51693,7 @@ window.__ModuleLoader__.load({
51380
51693
  style: { borderColor: "color-mix(in srgb, var(--nf-info) 45%, transparent)" },
51381
51694
  children: [
51382
51695
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
51383
- className: panel_module_css_default.row,
51384
- style: { justifyContent: "space-between" },
51696
+ className: `css.rowBetween`,
51385
51697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: "作者复盘" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
51386
51698
  style: { color: author.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
51387
51699
  children: [
@@ -51481,6 +51793,8 @@ window.__ModuleLoader__.load({
51481
51793
  const [busyLabel, setBusyLabel] = (0, react.useState)("");
51482
51794
  const [error, setError] = (0, react.useState)("");
51483
51795
  const [notice, setNotice] = (0, react.useState)("");
51796
+ /** 破坏性操作确认弹窗(取代 9 处 window.confirm)。渲染点在本组件 return 的根部。 */
51797
+ const confirmUi = useConfirm();
51484
51798
  const [progress, setProgress] = (0, react.useState)([]);
51485
51799
  const [configDraft, setConfigDraft] = (0, react.useState)(null);
51486
51800
  const [expandedChapter, setExpandedChapter] = (0, react.useState)(null);
@@ -52169,50 +52483,73 @@ window.__ModuleLoader__.load({
52169
52483
  }
52170
52484
  };
52171
52485
  /** 反推大纲:从已写章节正文反向生成全书总纲(流式进度)。 */
52172
- const handleReverseOutline = async () => {
52486
+ const handleReverseOutline = () => {
52173
52487
  if (project === null) return;
52174
- if (!window.confirm("将从已写章节正文反推出全书总纲(覆盖当前大纲文本,不影响章节/设定/进度)。确定继续?")) return;
52175
- setBusy(true);
52176
- setError("");
52177
- try {
52178
- await api.outlineReverse((frame) => {
52179
- if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
52180
- else if (frame.type === "outline-done") {
52181
- setOutlineText(frame.outline);
52182
- pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
52488
+ confirmUi.confirm({
52489
+ title: "从已写章节反推全书总纲",
52490
+ body: "将读取已写章节正文,反推出全书总纲并覆盖当前大纲文本。",
52491
+ effects: ["当前「总纲 / 大纲」文本会被覆盖", "已写章节、设定、进度不受影响"],
52492
+ assurance: "覆盖前会先留存当前大纲,可在历史版本里换回来。",
52493
+ tone: "warn",
52494
+ confirmLabel: "反推并覆盖",
52495
+ onConfirm: async () => {
52496
+ setBusy(true);
52497
+ setError("");
52498
+ try {
52499
+ await api.outlineReverse((frame) => {
52500
+ if (frame.type === "outline-progress") pushProgress(`反推大纲:${frame.phase}(${frame.done}/${frame.total})`, "info");
52501
+ else if (frame.type === "outline-done") {
52502
+ setOutlineText(frame.outline);
52503
+ pushProgress(`反推大纲完成(${frame.chars} 字),已保存为当前总纲`, "done");
52504
+ }
52505
+ });
52506
+ await refresh(false);
52507
+ } catch (err) {
52508
+ setError(err.message);
52509
+ pushProgress(`反推大纲失败:${err.message}`, "error");
52510
+ } finally {
52511
+ setBusy(false);
52183
52512
  }
52184
- });
52185
- await refresh(false);
52186
- } catch (err) {
52187
- setError(err.message);
52188
- pushProgress(`反推大纲失败:${err.message}`, "error");
52189
- } finally {
52190
- setBusy(false);
52191
- }
52513
+ }
52514
+ });
52192
52515
  };
52193
52516
  /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */
52194
52517
  const handleToggleUpdateOutline = () => {
52195
52518
  if (!updatingOutline && project !== null) setOutlineText(project.outline);
52196
52519
  setUpdatingOutline((v) => !v);
52197
52520
  };
52198
- /** 重置项目:清空全部进度,从新大纲重新开始(二次确认)。 */
52199
- const handleResetProject = async () => {
52521
+ /** 重置项目:清空全部进度,从新大纲重新开始(危险档:需逐字输入「重置」)。 */
52522
+ const handleResetProject = () => {
52200
52523
  if (project === null) return;
52201
- if (!window.confirm("将清空本书全部进度(道藏/卷计划/章节计划/已生成章节/暗线/写作资产/编年录),且不可恢复。确定用新总纲重置?")) return;
52202
- setBusy(true);
52203
- setError("");
52204
- try {
52205
- const result = await api.reset(outlineText);
52206
- setUpdatingOutline(false);
52207
- pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, "done");
52208
- } catch (err) {
52209
- setError(err.message);
52210
- pushProgress(`重置失败:${err.message}`, "error");
52211
- } finally {
52212
- setBusy(false);
52213
- setBusyLabel("");
52214
- await refresh(false);
52215
- }
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
+ });
52216
52553
  };
52217
52554
  /** 全书一致性质检(LLM 扫描已生成章节)。 */
52218
52555
  const handleAudit = async () => {
@@ -52314,26 +52651,35 @@ window.__ModuleLoader__.load({
52314
52651
  }
52315
52652
  };
52316
52653
  /** 章节直接通过(作者行使最终决定权)。 */
52317
- const handleChapterApprove = async (no) => {
52318
- if (!window.confirm(`确定直接通过第 ${no} 章?(跳过审稿判定,保留审稿记录)`)) return;
52319
- setBusy(true);
52320
- setError("");
52321
- try {
52322
- await api.chapterApprove(no);
52323
- setProject((prev) => prev === null ? prev : {
52324
- ...prev,
52325
- chapters: prev.chapters.map((c) => c.no === no ? {
52326
- ...c,
52327
- status: "approved"
52328
- } : c)
52329
- });
52330
- pushProgress(`第 ${no} 章已直接通过`, "done");
52331
- } catch (err) {
52332
- setError(err.message);
52333
- pushProgress(`操作失败:${err.message}`, "error");
52334
- } finally {
52335
- setBusy(false);
52336
- }
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
+ });
52337
52683
  };
52338
52684
  /** 剧情线:保存草稿(新增或更新)。 */
52339
52685
  const handlePlotlineSave = async () => {
@@ -52374,26 +52720,34 @@ window.__ModuleLoader__.load({
52374
52720
  }
52375
52721
  };
52376
52722
  /** 剧情线:删除。 */
52377
- const handlePlotlineRemove = async (id) => {
52378
- if (!window.confirm("确定删除这条剧情线?关联章节记录会一并移除。")) return;
52379
- setBusy(true);
52380
- setError("");
52381
- try {
52382
- const result = await api.plotlines({
52383
- op: "remove",
52384
- id
52385
- });
52386
- setProject((prev) => prev === null ? prev : {
52387
- ...prev,
52388
- plotlines: result.plotlines,
52389
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52390
- });
52391
- pushProgress("剧情线已删除", "done");
52392
- } catch (err) {
52393
- setError(err.message);
52394
- } finally {
52395
- setBusy(false);
52396
- }
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
+ });
52397
52751
  };
52398
52752
  /** 剧情线:建议候选线。 */
52399
52753
  const handlePlotlineSuggest = async () => {
@@ -52696,26 +53050,33 @@ window.__ModuleLoader__.load({
52696
53050
  }
52697
53051
  };
52698
53052
  /** 角色库:删除角色。 */
52699
- const handleRoleRemove = async (name) => {
52700
- if (!window.confirm(`确定从角色库删除「${name}」?`)) return;
52701
- setBusy(true);
52702
- setError("");
52703
- try {
52704
- const result = await api.roles({
52705
- op: "remove",
52706
- name
52707
- });
52708
- setProject((prev) => prev === null ? prev : {
52709
- ...prev,
52710
- roles: result.roles,
52711
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52712
- });
52713
- pushProgress(`已从角色库删除:${name}`, "info");
52714
- } catch (err) {
52715
- setError(err.message);
52716
- } finally {
52717
- setBusy(false);
52718
- }
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
+ });
52719
53080
  };
52720
53081
  /** 保存世界观规则编辑(bible tab,每行一条)。 */
52721
53082
  const handleSaveWorldRules = async () => {
@@ -53531,20 +53892,28 @@ window.__ModuleLoader__.load({
53531
53892
  } catch {}
53532
53893
  };
53533
53894
  /** 回滚到某个历史版本(回滚前宿主会先留存当前正文,所以可撤销)。 */
53534
- const handleRestoreSnapshot = async (id) => {
53535
- if (!window.confirm("用这一版覆盖当前正文?回滚前会自动留存当前正文,可以再换回来。")) return;
53536
- setBusy(true);
53537
- setError("");
53538
- try {
53539
- await api.snapshotRestore(id);
53540
- await refresh(false, true);
53541
- await refreshSnapshots();
53542
- setNotice("已回滚到所选版本");
53543
- } catch (err) {
53544
- setError(err.message);
53545
- } finally {
53546
- setBusy(false);
53547
- }
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
+ });
53548
53917
  };
53549
53918
  /** 手工给当前章节存档一个历史版本。 */
53550
53919
  const handleCreateSnapshot = async (no) => {
@@ -53704,6 +54073,7 @@ window.__ModuleLoader__.load({
53704
54073
  let reviewPending = 0;
53705
54074
  let totalChars = 0;
53706
54075
  let writingNow;
54076
+ const charSeries = [];
53707
54077
  for (const c of chapters) {
53708
54078
  const s = c.status;
53709
54079
  if (s === "approved" || s === "written" || s === "rejected") done++;
@@ -53711,7 +54081,13 @@ window.__ModuleLoader__.load({
53711
54081
  if (s === "approved") approved++;
53712
54082
  if (s === "rejected" || s === "written") reviewPending++;
53713
54083
  if (s === "generating" || s === "reviewing") writingNow = c;
53714
- totalChars += c.chars ?? 0;
54084
+ const ch = c.chars ?? 0;
54085
+ totalChars += ch;
54086
+ charSeries.push({
54087
+ no: c.no,
54088
+ chars: ch,
54089
+ approved: s === "approved"
54090
+ });
53715
54091
  }
53716
54092
  return {
53717
54093
  done,
@@ -53719,7 +54095,8 @@ window.__ModuleLoader__.load({
53719
54095
  approved,
53720
54096
  reviewPending,
53721
54097
  totalChars,
53722
- writingNow
54098
+ writingNow,
54099
+ charSeries
53723
54100
  };
53724
54101
  }, [chapters]);
53725
54102
  const doneCount = chapterStats.done;
@@ -53790,6 +54167,92 @@ window.__ModuleLoader__.load({
53790
54167
  const reviewPendingCount = chapterStats.reviewPending;
53791
54168
  const writingNow = chapterStats.writingNow;
53792
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
+ ];
53793
54256
  /** 创作旅程 6 阶段(完成/当前/未到)。 */
53794
54257
  const journeyStages = [
53795
54258
  {
@@ -54275,50 +54738,16 @@ window.__ModuleLoader__.load({
54275
54738
  children: "工作台"
54276
54739
  }),
54277
54740
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.topNavSpacer }),
54278
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54279
- type: "button",
54280
- className: `${panel_module_css_default.topNavBtn} ${activeTab === "workflow" && rightDrawer === null ? panel_module_css_default.topNavActive : ""}`,
54281
- "aria-current": activeTab === "workflow" && rightDrawer === null ? "page" : void 0,
54282
- onClick: () => {
54283
- setRightDrawer(null);
54284
- setDrawerMax(false);
54285
- setActiveTab("workflow");
54286
- },
54287
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54288
- className: panel_module_css_default.topNavNi,
54289
- children: "▣"
54290
- }), "总编台"]
54291
- }),
54292
- [
54293
- {
54294
- drawer: "write",
54295
- label: "写作",
54296
- ni: "✎",
54297
- badge: pendingCount + reviewPendingCount > 0 ? String(pendingCount + reviewPendingCount) : ""
54298
- },
54299
- {
54300
- drawer: "setup",
54301
- label: "设定",
54302
- ni: "❖",
54303
- badge: "道藏"
54304
- },
54305
- {
54306
- drawer: "assets",
54307
- label: "资产",
54308
- ni: "▦",
54309
- badge: ""
54310
- }
54311
- ].map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54741
+ WORKBENCH_NAV.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54312
54742
  type: "button",
54313
- className: `${panel_module_css_default.topNavBtn} ${rightDrawer === item.drawer ? panel_module_css_default.topNavActive : ""}`,
54314
- "aria-current": rightDrawer === item.drawer ? "page" : void 0,
54315
- onClick: () => {
54316
- openDrawer(item.drawer);
54317
- },
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,
54318
54747
  children: [
54319
54748
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54320
54749
  className: panel_module_css_default.topNavNi,
54321
- children: item.ni
54750
+ children: item.icon
54322
54751
  }),
54323
54752
  item.label,
54324
54753
  item.badge !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -54326,7 +54755,7 @@ window.__ModuleLoader__.load({
54326
54755
  children: item.badge
54327
54756
  })
54328
54757
  ]
54329
- }, item.drawer)),
54758
+ }, item.id)),
54330
54759
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
54331
54760
  type: "button",
54332
54761
  className: `${panel_module_css_default.topNavBtn} ${rightDrawer === "params" ? panel_module_css_default.topNavActive : ""}`,
@@ -54337,7 +54766,7 @@ window.__ModuleLoader__.load({
54337
54766
  title: "写作参数 / 设置",
54338
54767
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54339
54768
  className: panel_module_css_default.topNavNi,
54340
- children: "⚙"
54769
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(import_lucide_react.Settings, { size: 14 })
54341
54770
  }), "写作参数"]
54342
54771
  })
54343
54772
  ]
@@ -54409,21 +54838,12 @@ window.__ModuleLoader__.load({
54409
54838
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54410
54839
  className: panel_module_css_default.drawerHead,
54411
54840
  children: [
54412
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54841
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54413
54842
  className: panel_module_css_default.drawerTitle,
54414
- children: {
54415
- write: "✎ 写作 · 章节索引",
54416
- setup: "❖ 设定 · 道藏",
54417
- assets: "▦ 资产 · 创作素材库",
54418
- params: "⚙ 写作参数 · 设置",
54419
- overview: "▤ 总纲 / 大纲",
54420
- blurb: "◈ 简介 / 封面",
54421
- plotlines: "⟟ 剧情线 · 伏笔",
54422
- director: "✿ 自动编辑",
54423
- knowledge: "⊞ 知识库",
54424
- run: "⌘ 生产单",
54425
- breakdown: "⚲ 拆书分析"
54426
- }[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]
54427
54847
  }),
54428
54848
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: panel_module_css_default.drawerSpacer }),
54429
54849
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -54450,11 +54870,7 @@ window.__ModuleLoader__.load({
54450
54870
  rightDrawer === "write" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54451
54871
  className: panel_module_css_default.card,
54452
54872
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54453
- className: panel_module_css_default.row,
54454
- style: {
54455
- justifyContent: "space-between",
54456
- flexWrap: "wrap"
54457
- },
54873
+ className: `css.rowBetween css.rowBetweenWrap`,
54458
54874
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54459
54875
  className: panel_module_css_default.cardTitle,
54460
54876
  children: [
@@ -54561,8 +54977,7 @@ window.__ModuleLoader__.load({
54561
54977
  bookTab === "bible" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54562
54978
  className: panel_module_css_default.card,
54563
54979
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54564
- className: panel_module_css_default.row,
54565
- style: { justifyContent: "space-between" },
54980
+ className: `css.rowBetween`,
54566
54981
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
54567
54982
  className: panel_module_css_default.cardTitle,
54568
54983
  children: tt("bible.title")
@@ -54602,8 +55017,7 @@ window.__ModuleLoader__.load({
54602
55017
  },
54603
55018
  children: [
54604
55019
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54605
- className: panel_module_css_default.row,
54606
- style: { justifyContent: "space-between" },
55020
+ className: `css.rowBetween`,
54607
55021
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
54608
55022
  tt("bible.worldRules"),
54609
55023
  "(",
@@ -54741,11 +55155,7 @@ window.__ModuleLoader__.load({
54741
55155
  className: panel_module_css_default.card,
54742
55156
  children: [
54743
55157
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54744
- className: panel_module_css_default.row,
54745
- style: {
54746
- justifyContent: "space-between",
54747
- flexWrap: "wrap"
54748
- },
55158
+ className: `css.rowBetween css.rowBetweenWrap`,
54749
55159
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
54750
55160
  className: panel_module_css_default.cardTitle,
54751
55161
  children: [
@@ -54791,11 +55201,7 @@ window.__ModuleLoader__.load({
54791
55201
  },
54792
55202
  children: [
54793
55203
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54794
- className: panel_module_css_default.row,
54795
- style: {
54796
- justifyContent: "space-between",
54797
- flexWrap: "wrap"
54798
- },
55204
+ className: `css.rowBetween css.rowBetweenWrap`,
54799
55205
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("b", { children: [
54800
55206
  " 提炼候选(",
54801
55207
  roleCandidates.length,
@@ -54837,7 +55243,6 @@ window.__ModuleLoader__.load({
54837
55243
  children: [
54838
55244
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54839
55245
  className: panel_module_css_default.row,
54840
- style: { flexWrap: "wrap" },
54841
55246
  children: [
54842
55247
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
54843
55248
  className: panel_module_css_default.field,
@@ -55037,11 +55442,7 @@ window.__ModuleLoader__.load({
55037
55442
  className: panel_module_css_default.card,
55038
55443
  children: [
55039
55444
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
55040
- className: panel_module_css_default.row,
55041
- style: {
55042
- justifyContent: "space-between",
55043
- flexWrap: "wrap"
55044
- },
55445
+ className: `css.rowBetween css.rowBetweenWrap`,
55045
55446
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
55046
55447
  className: `${panel_module_css_default.cardTitle} ${panel_module_css_default.cardTitleLg}`,
55047
55448
  children: " 编年 / 复盘"
@@ -55061,11 +55462,7 @@ window.__ModuleLoader__.load({
55061
55462
  }),
55062
55463
  archiveTab === "reviews" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
55063
55464
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55064
- className: panel_module_css_default.row,
55065
- style: {
55066
- justifyContent: "space-between",
55067
- flexWrap: "wrap"
55068
- },
55465
+ className: `css.rowBetween css.rowBetweenWrap`,
55069
55466
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
55070
55467
  className: panel_module_css_default.cardTitle,
55071
55468
  children: [
@@ -55129,11 +55526,7 @@ window.__ModuleLoader__.load({
55129
55526
  const groupsWithReviews = chapterGroups.filter((group) => group.chapters.some((c) => c.authorReview !== void 0));
55130
55527
  if (groupsWithReviews.length === 0) return null;
55131
55528
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55132
- className: panel_module_css_default.row,
55133
- style: {
55134
- justifyContent: "flex-end",
55135
- gap: "var(--nf-space-6)"
55136
- },
55529
+ className: `${panel_module_css_default.row} ${panel_module_css_default.rowEnd}`,
55137
55530
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55138
55531
  type: "button",
55139
55532
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
@@ -55370,13 +55763,8 @@ window.__ModuleLoader__.load({
55370
55763
  style: { gap: "var(--nf-space-12)" },
55371
55764
  children: [
55372
55765
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55373
- className: panel_module_css_default.row,
55374
- style: {
55375
- justifyContent: "space-between",
55376
- alignItems: "center",
55377
- flexWrap: "wrap",
55378
- gap: "var(--nf-space-8)"
55379
- },
55766
+ className: `css.rowBetween css.rowBetweenWrap`,
55767
+ style: { gap: "var(--nf-space-8)" },
55380
55768
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55381
55769
  className: panel_module_css_default.titleBlock,
55382
55770
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -55388,7 +55776,6 @@ window.__ModuleLoader__.load({
55388
55776
  })]
55389
55777
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55390
55778
  className: panel_module_css_default.row,
55391
- style: { gap: "var(--nf-space-8)" },
55392
55779
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55393
55780
  type: "button",
55394
55781
  className: panel_module_css_default.button,
@@ -55699,10 +56086,6 @@ window.__ModuleLoader__.load({
55699
56086
  }),
55700
56087
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55701
56088
  className: panel_module_css_default.row,
55702
- style: {
55703
- flexWrap: "wrap",
55704
- gap: "var(--nf-space-8)"
55705
- },
55706
56089
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
55707
56090
  className: panel_module_css_default.input,
55708
56091
  value: exportScope,
@@ -55843,8 +56226,7 @@ window.__ModuleLoader__.load({
55843
56226
  ]
55844
56227
  }),
55845
56228
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55846
- className: panel_module_css_default.row,
55847
- style: { justifyContent: "space-between" },
56229
+ className: `css.rowBetween`,
55848
56230
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
55849
56231
  className: panel_module_css_default.meta,
55850
56232
  children: [
@@ -55943,7 +56325,6 @@ window.__ModuleLoader__.load({
55943
56325
  title: "简介 / 封面",
55944
56326
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
55945
56327
  className: panel_module_css_default.row,
55946
- style: { flexWrap: "wrap" },
55947
56328
  children: [
55948
56329
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55949
56330
  type: "button",
@@ -55968,7 +56349,16 @@ window.__ModuleLoader__.load({
55968
56349
  className: `${panel_module_css_default.button} ${panel_module_css_default.buttonSmall}`,
55969
56350
  disabled: busy || project === null,
55970
56351
  onClick: () => {
55971
- if (window.confirm("重新生成会覆盖当前简介(可先复制保存),确定?")) handleBlurbGenerate();
56352
+ confirmUi.confirm({
56353
+ title: "重新生成简介",
56354
+ body: "当前简介会被新生成的文本覆盖。",
56355
+ assurance: "如需保留现版本,先复制保存再生成。",
56356
+ tone: "warn",
56357
+ confirmLabel: "重新生成",
56358
+ onConfirm: async () => {
56359
+ await handleBlurbGenerate();
56360
+ }
56361
+ });
55972
56362
  },
55973
56363
  children: "重新生成"
55974
56364
  })
@@ -56117,11 +56507,7 @@ window.__ModuleLoader__.load({
56117
56507
  onSelect: changeLonglineTab
56118
56508
  }),
56119
56509
  longlineTab === "foreshadow" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56120
- className: panel_module_css_default.row,
56121
- style: {
56122
- justifyContent: "space-between",
56123
- flexWrap: "wrap"
56124
- },
56510
+ className: `css.rowBetween css.rowBetweenWrap`,
56125
56511
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
56126
56512
  className: panel_module_css_default.cardTitle,
56127
56513
  children: [
@@ -56233,11 +56619,7 @@ window.__ModuleLoader__.load({
56233
56619
  })
56234
56620
  })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
56235
56621
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56236
- className: panel_module_css_default.row,
56237
- style: {
56238
- justifyContent: "space-between",
56239
- flexWrap: "wrap"
56240
- },
56622
+ className: `css.rowBetween css.rowBetweenWrap`,
56241
56623
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
56242
56624
  className: panel_module_css_default.cardTitle,
56243
56625
  children: [
@@ -56249,7 +56631,6 @@ window.__ModuleLoader__.load({
56249
56631
  ]
56250
56632
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56251
56633
  className: panel_module_css_default.row,
56252
- style: { flexWrap: "wrap" },
56253
56634
  children: [
56254
56635
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
56255
56636
  type: "button",
@@ -56355,7 +56736,6 @@ window.__ModuleLoader__.load({
56355
56736
  children: [
56356
56737
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56357
56738
  className: panel_module_css_default.row,
56358
- style: { flexWrap: "wrap" },
56359
56739
  children: [
56360
56740
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56361
56741
  className: panel_module_css_default.field,
@@ -56581,7 +56961,6 @@ window.__ModuleLoader__.load({
56581
56961
  title: "拆书分析",
56582
56962
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56583
56963
  className: panel_module_css_default.row,
56584
- style: { flexWrap: "wrap" },
56585
56964
  children: [
56586
56965
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
56587
56966
  className: panel_module_css_default.input,
@@ -56972,7 +57351,6 @@ window.__ModuleLoader__.load({
56972
57351
  }),
56973
57352
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
56974
57353
  className: panel_module_css_default.row,
56975
- style: { flexWrap: "wrap" },
56976
57354
  children: [
56977
57355
  wsCheckReport !== null && wsCheckReport.issues.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
56978
57356
  type: "button",
@@ -57306,14 +57684,22 @@ window.__ModuleLoader__.load({
57306
57684
  ]
57307
57685
  }),
57308
57686
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
57309
- className: panel_module_css_default.wfMetric,
57687
+ className: `${panel_module_css_default.wfMetric} ${panel_module_css_default.wfMetricWide}`,
57310
57688
  children: [
57311
57689
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "全书字数" }),
57312
57690
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", {
57313
57691
  className: `${panel_module_css_default.numSerif} ${panel_module_css_default.tabular}`,
57314
57692
  children: totalChars.toLocaleString()
57315
57693
  }),
57316
- /* @__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
+ })
57317
57703
  ]
57318
57704
  })
57319
57705
  ]
@@ -58015,7 +58401,6 @@ window.__ModuleLoader__.load({
58015
58401
  title: tt("tab.plan"),
58016
58402
  actions: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58017
58403
  className: panel_module_css_default.row,
58018
- style: { flexWrap: "wrap" },
58019
58404
  children: [
58020
58405
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58021
58406
  className: panel_module_css_default.meta,
@@ -58064,11 +58449,7 @@ window.__ModuleLoader__.load({
58064
58449
  style: { borderColor: sensHits.length > 0 ? "var(--nf-warn)" : "var(--nf-success)" },
58065
58450
  children: [
58066
58451
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58067
- className: panel_module_css_default.row,
58068
- style: {
58069
- justifyContent: "space-between",
58070
- flexWrap: "wrap"
58071
- },
58452
+ className: `css.rowBetween css.rowBetweenWrap`,
58072
58453
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58073
58454
  className: panel_module_css_default.cardTitle,
58074
58455
  children: sensHits.length === 0 ? tt("sensitive.clean", { n: sensScanned }) : tt("sensitive.hits", {
@@ -58266,11 +58647,7 @@ window.__ModuleLoader__.load({
58266
58647
  const detailTab = chapterDetailTab;
58267
58648
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
58268
58649
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58269
- className: panel_module_css_default.row,
58270
- style: {
58271
- justifyContent: "space-between",
58272
- flexWrap: "wrap"
58273
- },
58650
+ className: `css.rowBetween css.rowBetweenWrap`,
58274
58651
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
58275
58652
  className: panel_module_css_default.planDetailTitle,
58276
58653
  children: [
@@ -58347,8 +58724,7 @@ window.__ModuleLoader__.load({
58347
58724
  className: panel_module_css_default.reviewBox,
58348
58725
  children: [
58349
58726
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58350
- className: panel_module_css_default.row,
58351
- style: { justifyContent: "space-between" },
58727
+ className: `css.rowBetween`,
58352
58728
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: tt("plan.reviewReport") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
58353
58729
  style: { color: review.passed ? "var(--nf-success)" : "var(--nf-error)" },
58354
58730
  children: [
@@ -58416,8 +58792,7 @@ window.__ModuleLoader__.load({
58416
58792
  style: { borderColor: "color-mix(in srgb, var(--nf-info) 45%, transparent)" },
58417
58793
  children: [
58418
58794
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58419
- className: panel_module_css_default.row,
58420
- style: { justifyContent: "space-between" },
58795
+ className: `css.rowBetween`,
58421
58796
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: " 作者复盘" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
58422
58797
  style: { color: chapter.authorReview.hookHonored ? "var(--nf-success)" : "var(--nf-warn)" },
58423
58798
  children: [
@@ -58739,7 +59114,7 @@ window.__ModuleLoader__.load({
58739
59114
  className: panel_module_css_default.bigProgressBar,
58740
59115
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
58741
59116
  className: panel_module_css_default.bigProgressBarFill,
58742
- style: { width: `${Math.round(liveBar.ratio * 100)}%` }
59117
+ style: { transform: `scaleX(${liveBar.ratio})` }
58743
59118
  })
58744
59119
  }),
58745
59120
  liveBar?.text !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -58778,7 +59153,7 @@ window.__ModuleLoader__.load({
58778
59153
  className: panel_module_css_default.progressBar,
58779
59154
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58780
59155
  className: panel_module_css_default.progressBarFill,
58781
- style: { width: `${Math.round((line.ratio ?? 0) * 100)}%` }
59156
+ style: { transform: `scaleX(${line.ratio ?? 0})` }
58782
59157
  })
58783
59158
  }), line.text]
58784
59159
  }, line.id)), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { ref: progressEndRef })]
@@ -58820,7 +59195,8 @@ window.__ModuleLoader__.load({
58820
59195
  onImported: async () => {
58821
59196
  await refreshShelf();
58822
59197
  }
58823
- })
59198
+ }),
59199
+ confirmUi.dialog
58824
59200
  ]
58825
59201
  });
58826
59202
  }
@@ -58957,12 +59333,8 @@ window.__ModuleLoader__.load({
58957
59333
  className: panel_module_css_default.outlineDocWrap,
58958
59334
  children: [
58959
59335
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
58960
- className: panel_module_css_default.row,
58961
- style: {
58962
- justifyContent: "space-between",
58963
- flexWrap: "wrap",
58964
- gap: "var(--nf-space-8)"
58965
- },
59336
+ className: `css.rowBetween css.rowBetweenWrap`,
59337
+ style: { gap: "var(--nf-space-8)" },
58966
59338
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
58967
59339
  className: panel_module_css_default.meta,
58968
59340
  children: "大纲是本书的「出生证明」;可点右上「反推大纲」从正文反推,或「更新大纲」手动修订。"