@musnows/scriverse 0.4.9 → 0.4.11

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.
@@ -6,14 +6,26 @@ const RELATION_STYLE = Object.freeze({
6
6
  uncertain: { label: "未确定", color: "#9aa5b5" }
7
7
  });
8
8
 
9
- /** Obsidian Graph View 风格:低饱和度分组配色 */
9
+ /** Obsidian Graph View 风格:为浅色和深色背景分别提供可辨识的低饱和度分组配色 */
10
10
  export const OBSIDIAN_NODE_PALETTE = Object.freeze([
11
- Object.freeze({ key: "blue", color: "#7a9bb5", glow: "rgba(122,155,181,.48)" }),
12
- Object.freeze({ key: "lavender", color: "#9a8fb5", glow: "rgba(154,143,181,.48)" }),
13
- Object.freeze({ key: "slate", color: "#8b9099", glow: "rgba(139,144,153,.42)" }),
14
- Object.freeze({ key: "rose", color: "#b58a9a", glow: "rgba(181,138,154,.48)" }),
15
- Object.freeze({ key: "mist", color: "#8aa8a3", glow: "rgba(138,168,163,.45)" }),
16
- Object.freeze({ key: "sand", color: "#a89a88", glow: "rgba(168,154,136,.42)" })
11
+ Object.freeze({ key: "blue", color: "#3f6f99", darkColor: "#7fb7e3", glow: "rgba(63,111,153,.42)", darkGlow: "rgba(127,183,227,.56)" }),
12
+ Object.freeze({ key: "indigo", color: "#5b5fa3", darkColor: "#9ea6ed", glow: "rgba(91,95,163,.42)", darkGlow: "rgba(158,166,237,.56)" }),
13
+ Object.freeze({ key: "violet", color: "#77549a", darkColor: "#bd91df", glow: "rgba(119,84,154,.42)", darkGlow: "rgba(189,145,223,.56)" }),
14
+ Object.freeze({ key: "purple", color: "#8b4f83", darkColor: "#d28bc5", glow: "rgba(139,79,131,.42)", darkGlow: "rgba(210,139,197,.56)" }),
15
+ Object.freeze({ key: "rose", color: "#a84e6a", darkColor: "#e78da8", glow: "rgba(168,78,106,.42)", darkGlow: "rgba(231,141,168,.56)" }),
16
+ Object.freeze({ key: "red", color: "#ad554f", darkColor: "#ef948c", glow: "rgba(173,85,79,.42)", darkGlow: "rgba(239,148,140,.56)" }),
17
+ Object.freeze({ key: "coral", color: "#a95d45", darkColor: "#eda083", glow: "rgba(169,93,69,.42)", darkGlow: "rgba(237,160,131,.56)" }),
18
+ Object.freeze({ key: "amber", color: "#956b2f", darkColor: "#deb46d", glow: "rgba(149,107,47,.42)", darkGlow: "rgba(222,180,109,.56)" }),
19
+ Object.freeze({ key: "olive", color: "#777331", darkColor: "#bdba70", glow: "rgba(119,115,49,.42)", darkGlow: "rgba(189,186,112,.56)" }),
20
+ Object.freeze({ key: "green", color: "#47794f", darkColor: "#84c98f", glow: "rgba(71,121,79,.42)", darkGlow: "rgba(132,201,143,.56)" }),
21
+ Object.freeze({ key: "emerald", color: "#337965", darkColor: "#74c9aa", glow: "rgba(51,121,101,.42)", darkGlow: "rgba(116,201,170,.56)" }),
22
+ Object.freeze({ key: "teal", color: "#31777a", darkColor: "#72c6c8", glow: "rgba(49,119,122,.42)", darkGlow: "rgba(114,198,200,.56)" }),
23
+ Object.freeze({ key: "cyan", color: "#34758f", darkColor: "#7cc4de", glow: "rgba(52,117,143,.42)", darkGlow: "rgba(124,196,222,.56)" }),
24
+ Object.freeze({ key: "sky", color: "#41749f", darkColor: "#87bce6", glow: "rgba(65,116,159,.42)", darkGlow: "rgba(135,188,230,.56)" }),
25
+ Object.freeze({ key: "steel", color: "#576f86", darkColor: "#98afc5", glow: "rgba(87,111,134,.42)", darkGlow: "rgba(152,175,197,.56)" }),
26
+ Object.freeze({ key: "slate", color: "#626b78", darkColor: "#aab3c0", glow: "rgba(98,107,120,.42)", darkGlow: "rgba(170,179,192,.56)" }),
27
+ Object.freeze({ key: "sand", color: "#806e58", darkColor: "#c5ad91", glow: "rgba(128,110,88,.42)", darkGlow: "rgba(197,173,145,.56)" }),
28
+ Object.freeze({ key: "taupe", color: "#75636d", darkColor: "#b9a0ad", glow: "rgba(117,99,109,.42)", darkGlow: "rgba(185,160,173,.56)" })
17
29
  ]);
18
30
 
19
31
  const clamp = (value, minimum, maximum) => Math.min(maximum, Math.max(minimum, value));
@@ -186,12 +198,18 @@ export function getObsidianNodeAppearance(node, maxDegree = 1) {
186
198
  const group = resolveRelationshipNodeGroup(node);
187
199
  const degree = Math.max(0, Number(node?.degree) || 0);
188
200
  const normalizedDegree = clamp(degree / Math.max(1, Number(maxDegree) || 1), 0, 1);
189
- const paletteIndex = group.key === "default" ? 2 : hashString(group.key) % OBSIDIAN_NODE_PALETTE.length;
201
+ // 未分组角色没有可共享的分组语义,按角色稳定标识散列,避免资料不完整时大片同色。
202
+ const colorKey = group.key === "default"
203
+ ? `node:${String(node?.id ?? node?.name ?? "default")}`
204
+ : group.key;
205
+ const paletteIndex = hashString(colorKey) % OBSIDIAN_NODE_PALETTE.length;
190
206
  const palette = OBSIDIAN_NODE_PALETTE[paletteIndex];
191
207
  return {
192
208
  group,
193
209
  color: palette.color,
210
+ darkColor: palette.darkColor,
194
211
  glow: palette.glow,
212
+ darkGlow: palette.darkGlow,
195
213
  size: clamp(8 + Math.sqrt(degree) * 4.8 + normalizedDegree * 4, 8, 38),
196
214
  degree,
197
215
  normalizedDegree
@@ -299,7 +317,9 @@ export function buildRelationshipGraph(characters, relationships) {
299
317
  node.importance = node.weightedDegree + Math.sqrt(node.degree) * 0.8;
300
318
  const appearance = getObsidianNodeAppearance(node, maxDegree);
301
319
  node.color = appearance.color;
320
+ node.darkColor = appearance.darkColor;
302
321
  node.glow = appearance.glow;
322
+ node.darkGlow = appearance.darkGlow;
303
323
  node.nodeSize = appearance.size;
304
324
  }
305
325
  nodes.sort((left, right) => right.importance - left.importance || left.name.localeCompare(right.name, "zh-CN"));
@@ -1253,8 +1273,10 @@ export function renderRelationshipMindMap(container, graph, options = {}) {
1253
1273
  button.dataset.groupKey = node.groupKey || appearance.group.key;
1254
1274
  button.classList.toggle("is-label-visible", graph.nodes.indexOf(node) < defaultLabelLimit || node.degree >= 4);
1255
1275
  button.style.setProperty("--node-size", `${nodeSize}px`);
1256
- button.style.setProperty("--node-color", node.color || appearance.color);
1257
- button.style.setProperty("--node-glow", node.glow || appearance.glow);
1276
+ button.style.setProperty("--node-color-light", node.color || appearance.color);
1277
+ button.style.setProperty("--node-color-dark", node.darkColor || appearance.darkColor);
1278
+ button.style.setProperty("--node-glow-light", node.glow || appearance.glow);
1279
+ button.style.setProperty("--node-glow-dark", node.darkGlow || appearance.darkGlow);
1258
1280
  const labelEl = document.createElement("span");
1259
1281
  labelEl.textContent = node.name;
1260
1282
  button.append(labelEl);
@@ -485,8 +485,9 @@ input[type="checkbox"][hidden] { display: none; }
485
485
  @keyframes onboarding-popover-in { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }
486
486
 
487
487
  .left-panel, .ai-panel { position: relative; min-height: 0; background: var(--panel); }
488
- .left-panel { border-right: 1px solid var(--line); padding: 18px 14px 16px; overflow-y: auto; }
489
- .ai-panel { border-left: 1px solid var(--line); display: flex; flex-direction: column; padding: 18px; min-width: 0; }
488
+ .left-panel { display: flex; flex-direction: column; border-right: 1px solid var(--line); padding: 0; overflow: hidden; }
489
+ .left-panel-body { flex: 1 1 auto; min-height: 0; padding: 18px 14px 16px; overflow-y: auto; }
490
+ .ai-panel { border-left: 1px solid var(--line); display: flex; flex-direction: column; padding: 14px 16px 18px; min-width: 0; }
490
491
  .panel-collapse-button { z-index: 8; flex: 0 0 auto; width: 24px; height: 24px; padding: 0; border: 1px solid var(--line); border-radius: 4px; background: var(--panel); color: var(--muted); font-size: 18px; line-height: 1; }
491
492
  .ai-heading #ai-panel-toggle { flex-basis: 30px; width: 30px; height: 30px; }
492
493
  .panel-resize-handle { position: absolute; z-index: 7; top: 0; bottom: 0; width: 7px; cursor: col-resize; touch-action: none; }
@@ -496,7 +497,10 @@ input[type="checkbox"][hidden] { display: none; }
496
497
  body.is-panel-resizing { cursor: col-resize; user-select: none; }
497
498
  .app-shell.left-panel-collapsed { --left-panel-width: 42px !important; }.app-shell.ai-panel-collapsed { --ai-panel-width: 42px !important; }
498
499
  .app-shell.left-panel-collapsed .left-panel, .app-shell.ai-panel-collapsed .ai-panel { padding: 0; overflow: hidden; }
499
- .app-shell.left-panel-collapsed .left-panel > :not(.left-actions), .app-shell.ai-panel-collapsed .ai-panel > :not(.ai-heading) { display: none; }
500
+ .app-shell.left-panel-collapsed .left-panel > .panel-resize-handle,
501
+ .app-shell.left-panel-collapsed .left-panel-body > :not(.left-actions),
502
+ .app-shell.ai-panel-collapsed .ai-panel > :not(.ai-heading) { display: none; }
503
+ .app-shell.left-panel-collapsed .left-panel-body { padding: 0; overflow: hidden; }
500
504
  .app-shell.left-panel-collapsed .left-actions, .app-shell.ai-panel-collapsed .ai-heading { display: flex; justify-content: center; padding: 8px 0; border: 0; }
501
505
  .app-shell.left-panel-collapsed .left-actions > :not(.left-primary-actions), .app-shell.left-panel-collapsed .left-primary-actions > :not(.panel-collapse-button), .app-shell.ai-panel-collapsed .ai-heading > :not(.panel-collapse-button) { display: none; }
502
506
  .app-shell.left-panel-collapsed .left-primary-actions { display: flex; justify-content: center; }
@@ -1018,6 +1022,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1018
1022
  .module-header { display: flex; justify-content: space-between; align-items: flex-end; gap: 18px; padding-bottom: 24px; border-bottom: 1px solid var(--line); }
1019
1023
  .module-header-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; }
1020
1024
  .module-header-actions > [data-module-header-action] { order: 1; }
1025
+ .module-header-actions > .module-count-badge { order: 0; }
1021
1026
  .module-header-actions > #module-create-button { order: 2; min-height: 36px; }
1022
1027
  .module-count-badge { display: inline-grid; min-width: 28px; height: 28px; padding: 0 7px; place-items: center; border: 1px solid var(--line); border-radius: 14px; background: var(--surface); color: var(--accent-dark); font-family: var(--font-latin), monospace; font-size: 11px; font-weight: 650; }
1023
1028
  .module-header h1 { margin: 0 0 6px; font-weight: 500; font-size: 24px; line-height: 1.25; }
@@ -1317,6 +1322,8 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1317
1322
  }
1318
1323
  .relationship-network .mind-node,
1319
1324
  .relationship-network .obsidian-node {
1325
+ --node-color: var(--node-color-light, #626b78);
1326
+ --node-glow: var(--node-glow-light, rgba(98,107,120,.42));
1320
1327
  width: var(--node-size);
1321
1328
  height: var(--node-size);
1322
1329
  min-height: 0;
@@ -1333,6 +1340,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1333
1340
  transition: opacity .12s ease, transform .12s ease, box-shadow .12s ease;
1334
1341
  will-change: left, top;
1335
1342
  }
1343
+ :root[data-theme="dark"] .relationship-network .mind-node,
1344
+ :root[data-theme="dark"] .relationship-network .obsidian-node {
1345
+ --node-color: var(--node-color-dark, #aab3c0);
1346
+ --node-glow: var(--node-glow-dark, rgba(170,179,192,.56));
1347
+ }
1336
1348
  .relationship-network .mind-node span {
1337
1349
  position: absolute;
1338
1350
  left: 50%;
@@ -1463,14 +1475,15 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1463
1475
  .galaxy-detail { position: fixed; z-index: 7; left: 22px; top: 22px; width: min(300px, 30vw); max-height: 55vh; overflow: auto; padding: 15px; border: 1px solid rgba(255,255,255,.14); border-radius: 8px; background: rgba(5,7,13,.74); backdrop-filter: blur(14px); }.galaxy-detail strong, .galaxy-detail small { display: block; }.galaxy-detail strong { font-size: 18px; }.galaxy-detail small, .galaxy-detail p { color: rgba(220,235,250,.65); font-size: 9px; }.galaxy-detail ul { display: grid; gap: 7px; padding: 0; list-style: none; font-size: 9px; }.galaxy-detail li { display: flex; align-items: center; gap: 6px; }
1464
1476
  .sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
1465
1477
 
1466
- .ai-heading { display: flex; align-items: center; gap: 8px; padding-bottom: 17px; border-bottom: 1px solid var(--line); }
1467
- .ai-heading > div { display: flex; gap: 8px; align-items: center; }
1468
- .ai-heading small { margin-left: auto; color: var(--muted); font-size: 10px; }
1478
+ .ai-heading { display: flex; align-items: center; gap: 8px; min-width: 0; padding-bottom: 9px; border-bottom: 1px solid var(--line); }
1479
+ .ai-heading-title { display: flex; flex: 0 0 auto; gap: 8px; align-items: center; }
1480
+ .ai-heading-title strong { white-space: nowrap; }
1481
+ .ai-heading-actions { display: flex; align-items: center; min-width: 0; margin-left: auto; gap: 5px; }
1482
+ .ai-heading-actions > span { min-width: 0; max-width: 88px; overflow: hidden; color: var(--muted); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
1483
+ .ai-heading-actions button { min-width: 28px; height: 28px; padding: 0 7px; border: 1px solid var(--line); border-radius: 4px; background: transparent; color: var(--muted); font-size: 9px; }
1484
+ .ai-heading-actions #ai-new-conversation { padding: 0; font: 17px/1 var(--font-latin), monospace; }
1485
+ .ai-heading-actions button:hover, .ai-heading-actions button[aria-expanded="true"] { background: var(--paper-deep); color: var(--ink); }
1469
1486
  .status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 3px rgba(94,118,92,.14); }
1470
- .ai-conversation-toolbar { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 5px; align-items: center; padding: 10px 0; }
1471
- .ai-conversation-toolbar > span { min-width: 0; overflow: hidden; color: var(--muted); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }
1472
- .ai-conversation-toolbar button { padding: 5px 7px; border: 1px solid var(--line); border-radius: 4px; background: transparent; color: var(--muted); font-size: 9px; }
1473
- .ai-conversation-toolbar button:hover, .ai-conversation-toolbar button[aria-expanded="true"] { background: var(--paper-deep); color: var(--ink); }
1474
1487
  .ai-history-dialog-body { min-height: min(360px, 55vh); max-height: 65vh; overflow-y: auto; padding: 18px 24px 24px; }
1475
1488
  .ai-history-list { display: grid; gap: 8px; }
1476
1489
  .ai-history-item { display: grid; gap: 5px; width: 100%; min-width: 0; padding: 14px 16px; border: 1px solid var(--line); border-radius: 5px; background: var(--surface-soft); text-align: left; }
@@ -1499,10 +1512,10 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1499
1512
  line-height: 1.65;
1500
1513
  resize: vertical;
1501
1514
  }
1502
- .quick-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
1503
- .quick-actions button { border: 1px solid var(--line); background: transparent; border-radius: 3px; padding: 7px; color: var(--muted); font-size: 10px; }
1515
+ .quick-actions { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px; margin-top: 8px; }
1516
+ .quick-actions button { min-width: 0; min-height: 30px; border: 1px solid var(--line); background: transparent; border-radius: 3px; padding: 5px 3px; color: var(--muted); font-size: 10px; white-space: nowrap; }
1504
1517
  .quick-actions button:hover { color: var(--ink); background: var(--paper-deep); }
1505
- .ai-feed { flex: 1; min-height: 0; overflow-y: auto; margin: 16px -5px; padding: 0 5px; }
1518
+ .ai-feed { flex: 1; min-height: 0; overflow-y: auto; margin: 10px -5px 12px; padding: 0 5px; }
1506
1519
  .assistant-message, .user-message { position: relative; margin-bottom: 12px; padding: 12px 13px; border-radius: 5px; font-size: 12px; line-height: 1.55; }
1507
1520
  .assistant-message { background: var(--paper-deep); }
1508
1521
  .assistant-message.has-message-actions, .user-message.has-message-actions { margin-bottom: 42px; }
@@ -1859,6 +1872,10 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1859
1872
  .vditor-editor-host .vditor-reset { color: var(--ink); font-family: var(--font-cjk), var(--font-latin), sans-serif; }
1860
1873
  .vditor-editor-host .vditor-ir, .vditor-editor-host .vditor-sv, .vditor-editor-host .vditor-wysiwyg { background: var(--surface); color: var(--ink); }
1861
1874
  .vditor-editor-host .vditor-sv textarea { color: var(--ink); }
1875
+ .vditor-editor-host.vditor--dark .vditor-reset table { background: var(--surface); color: var(--ink); }
1876
+ .vditor-editor-host.vditor--dark .vditor-reset table tr { background: var(--surface); border-top-color: var(--line); }
1877
+ .vditor-editor-host.vditor--dark .vditor-reset table td, .vditor-editor-host.vditor--dark .vditor-reset table th { border-color: var(--line); color: var(--ink); }
1878
+ .vditor-editor-host.vditor--dark .vditor-reset table tbody tr:nth-child(2n) { background: var(--surface-soft); }
1862
1879
  .record-markdown-preview { display: -webkit-box; margin: 12px 0 8px; overflow: hidden; overflow-wrap: anywhere; color: var(--ink); font-size: 12px; line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 12; }
1863
1880
  .record-markdown-preview > :first-child, .knowledge-markdown-block .message-body > :first-child { margin-top: 0; }
1864
1881
  .record-markdown-preview > :last-child, .knowledge-markdown-block .message-body > :last-child { margin-bottom: 0; }
@@ -2058,7 +2075,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2058
2075
  }
2059
2076
 
2060
2077
  @media (max-width: 1100px) {
2061
- .left-panel { padding-inline: 10px; }
2078
+ .left-panel-body { padding-inline: 10px; }
2062
2079
  .ai-panel { padding-inline: 14px; }
2063
2080
  .editor-toolbar { grid-template-areas: "path" "title" "actions"; grid-template-columns: minmax(0, 1fr); gap: 12px; padding-inline: 6%; }
2064
2081
  .editor-actions { justify-content: flex-end; flex-wrap: wrap; }
@@ -2197,17 +2214,19 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2197
2214
  grid-column: auto;
2198
2215
  grid-row: auto;
2199
2216
  min-width: 0;
2200
- padding: 76px var(--mobile-gutter) 18px;
2217
+ padding: 0;
2201
2218
  border-left: 1px solid var(--line);
2202
2219
  border-bottom: 1px solid var(--line);
2203
2220
  box-shadow: -12px 0 36px rgba(36, 30, 24, .2);
2204
- overflow-y: auto;
2221
+ overflow: hidden;
2205
2222
  transform: translateX(0);
2206
2223
  transition: transform .2s ease;
2207
2224
  }
2208
- .app-shell.left-panel-collapsed .left-panel { padding: 76px var(--mobile-gutter) 18px; transform: translateX(100%); }
2209
- .app-shell.left-panel-collapsed .left-panel > :not(.left-actions) { display: block; }
2210
- .app-shell.left-panel-collapsed .left-panel > .module-nav { display: grid; }
2225
+ .left-panel-body { padding: 76px var(--mobile-gutter) 18px; }
2226
+ .app-shell.left-panel-collapsed .left-panel { transform: translateX(100%); }
2227
+ .app-shell.left-panel-collapsed .left-panel > .panel-resize-handle { display: none; }
2228
+ .app-shell.left-panel-collapsed .left-panel-body > :not(.left-actions) { display: block; }
2229
+ .app-shell.left-panel-collapsed .left-panel-body > .module-nav { display: grid; }
2211
2230
  .left-panel > .panel-resize-handle { display: none; }
2212
2231
  .left-actions { margin: 0 0 8px; }
2213
2232
  .left-primary-actions { gap: 6px; }
@@ -2223,7 +2242,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
2223
2242
  .module-nav .nav-icon { width: 16px; height: 16px; }
2224
2243
  .module-nav .module-nav-secondary.hidden { display: none !important; }
2225
2244
  .panel-heading, #novel-tree { display: none; }
2226
- .app-shell.left-panel-collapsed .left-panel { padding: 8px var(--mobile-gutter) 0; }
2245
+ .app-shell.left-panel-collapsed .left-panel-body { padding: 8px var(--mobile-gutter) 0; }
2227
2246
  .app-shell.left-panel-collapsed .left-actions { display: block; padding: 0; }
2228
2247
 
2229
2248
  .main-panel {
package/dist/store.js CHANGED
@@ -764,9 +764,9 @@ export class Store {
764
764
  const chapterRows = this.db.all(`SELECT id, work_id, volume_id, title, chapter_type, sort_order, word_count, version_no,
765
765
  analysis_status, excluded_from_analysis, created_at, updated_at
766
766
  FROM chapters WHERE work_id = ? ORDER BY sort_order, created_at${page.sql}`, workId, ...page.params);
767
- const chapters = chapterRows.map((row) => this.mapChapterDirectoryEntry(row));
767
+ const pageResult = paginated(chapterRows.map((row) => this.mapChapterDirectoryEntry(row)), pagination);
768
768
  const chaptersByVolume = new Map();
769
- for (const chapter of chapters) {
769
+ for (const chapter of pageResult.items) {
770
770
  const volumeId = String(chapter.volumeId);
771
771
  const list = chaptersByVolume.get(volumeId) ?? [];
772
772
  list.push(chapter);
@@ -776,7 +776,7 @@ export class Store {
776
776
  ...this.mapVolume(row),
777
777
  chapters: chaptersByVolume.get(requiredString(row, "id")) ?? []
778
778
  }));
779
- return { ...work, volumes, directoryPage: paginated(chapters, pagination) };
779
+ return { ...work, volumes, directoryPage: pageResult };
780
780
  }
781
781
  listFileVersions(workId) {
782
782
  this.getWork(workId);