@waterwx/dsh-novel-forge 1.10.1 → 2.0.1-alpha

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.
Files changed (56) hide show
  1. package/README.md +8 -3
  2. package/assets/styles/guoman-2d-gufeng.webp +0 -0
  3. package/assets/styles/guoman-3d-tianyuan.webp +0 -0
  4. package/assets/styles/guoman-3d-xuanhuan.webp +0 -0
  5. package/assets/styles/hyperreal-3d.webp +0 -0
  6. package/assets/styles/sandiao-qban.webp +0 -0
  7. package/assets/styles/urban-lightreal-3d.webp +0 -0
  8. package/lib/client.js +3456 -2133
  9. package/lib/index.js +1975 -438
  10. package/lib/types/ai-scan.d.ts +36 -0
  11. package/lib/types/assets.d.ts +1 -1
  12. package/lib/types/client/api.d.ts +8 -1
  13. package/lib/types/client/index.d.ts +1 -1
  14. package/lib/types/client/panel/AuthorHome.d.ts +4 -2
  15. package/lib/types/client/panel/FlowGuide.d.ts +6 -5
  16. package/lib/types/client/panel/MangaRoleLibrary.d.ts +3 -1
  17. package/lib/types/client/panel/MangaWorkspace.d.ts +2 -5
  18. package/lib/types/client/panel/PropLibrary.d.ts +8 -0
  19. package/lib/types/client/panel/SceneLibrary.d.ts +3 -1
  20. package/lib/types/client/panel/SettingsView.d.ts +4 -2
  21. package/lib/types/engine.d.ts +50 -21
  22. package/lib/types/index.d.ts +2 -2
  23. package/lib/types/manga-genre-rules.d.ts +22 -0
  24. package/lib/types/novel-context.d.ts +80 -0
  25. package/lib/types/prompt-utils.d.ts +35 -0
  26. package/lib/types/protocol.d.ts +104 -12
  27. package/lib/types/review-policy.d.ts +97 -0
  28. package/lib/types/style-library.d.ts +3 -3
  29. package/package.json +21 -24
  30. package/src/ai-scan.ts +179 -0
  31. package/src/assets.ts +353 -9
  32. package/src/client/api.ts +11 -1
  33. package/src/client/index.ts +1 -1
  34. package/src/client/mount.tsx +1 -1
  35. package/src/client/panel/AdaptModeView.tsx +2 -2
  36. package/src/client/panel/AssistantTab.tsx +1 -1
  37. package/src/client/panel/AuthorHome.tsx +5 -3
  38. package/src/client/panel/FlowGuide.tsx +15 -14
  39. package/src/client/panel/MangaRoleLibrary.tsx +1002 -810
  40. package/src/client/panel/MangaWorkspace.tsx +715 -359
  41. package/src/client/panel/ModelManager.tsx +1 -1
  42. package/src/client/panel/NovelPanel.tsx +4620 -4655
  43. package/src/client/panel/PropLibrary.tsx +175 -0
  44. package/src/client/panel/SceneLibrary.tsx +453 -396
  45. package/src/client/panel/SettingsView.tsx +24 -30
  46. package/src/client/panel/StoryboardTab.tsx +6 -0
  47. package/src/client/panel/panel.module.css +165 -4
  48. package/src/engine.ts +796 -286
  49. package/src/index.ts +9 -7
  50. package/src/manga-genre-rules.ts +87 -0
  51. package/src/novel-context.ts +287 -0
  52. package/src/prompt-utils.ts +73 -0
  53. package/src/protocol.ts +2233 -2148
  54. package/src/review-policy.ts +161 -0
  55. package/src/routes.ts +3419 -3359
  56. package/src/style-library.ts +32 -26
@@ -31,17 +31,19 @@ const NAV_ITEMS: Array<{ id: Exclude<AuthorNav, 'settings'>; label: string; icon
31
31
  ];
32
32
 
33
33
 
34
- export function AuthorHome({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onOpenSettings, onTheme, onBackground, onOpacity, adaptEnabled, progress, busy, busyLabel, liveBar, onClearProgress }: {
34
+ export function AuthorHome({ api, shelf, onOpenBook, onReadBook, onAddBook, onImportBook, onOpenSettings, onTheme, onBackground, onOpacity, onEndfieldAccent, adaptEnabled, progress, busy, busyLabel, liveBar, onClearProgress }: {
35
35
  api: NovelApi; shelf: BookshelfSnapshot;
36
36
  onOpenBook: (id: string) => void; onReadBook: (id: string) => void; onAddBook: () => void; onImportBook: () => void;
37
37
  /** 兼容旧入口:首页设置现为独立设置页,此回调保留但不再使用。 */
38
38
  onOpenSettings?: () => void;
39
39
  /** 主题/模式/密度变化回调(供面板根容器实时生效)。 */
40
- onTheme?: (theme: 'liquid' | 'neumorph' | 'macos' | 'clay', mode: 'system' | 'light' | 'dark', density: 'comfort' | 'compact' | 'spacious') => void;
40
+ onTheme?: (theme: 'liquid' | 'neumorph' | 'macos' | 'clay' | 'endfield', mode: 'system' | 'light' | 'dark', density: 'comfort' | 'compact' | 'spacious') => void;
41
41
  /** 自定义背景变化回调。 */
42
42
  onBackground?: (bg: string | undefined, blur: number) => void;
43
43
  /** 玻璃透明度变化回调。 */
44
44
  onOpacity?: (n: number) => void;
45
+ /** 终末地强调色变化回调。 */
46
+ onEndfieldAccent?: (accent: 'valley' | 'wuling') => void;
45
47
  /** 是否启用改编模式(默认 false=隐藏入口)。 */
46
48
  adaptEnabled?: boolean;
47
49
  /** AI 进度实时状态(与书内共享同一份)。 */
@@ -162,7 +164,7 @@ export function AuthorHome({ api, shelf, onOpenBook, onReadBook, onAddBook, onIm
162
164
  {nav === 'adapt' && <AdaptModeView api={api} onOpenBook={onOpenBook} />}
163
165
  {nav === 'assets' && <AuthorAssetsView api={api} />}
164
166
  {nav === 'library' && <GlobalAssetLibraryView api={api} />}
165
- {nav === 'settings' && <SettingsView api={api} onTheme={onTheme} onBackground={onBackground} onOpacity={onOpacity} />}
167
+ {nav === 'settings' && <SettingsView api={api} onTheme={onTheme} onBackground={onBackground} onOpacity={onOpacity} onEndfieldAccent={onEndfieldAccent} />}
166
168
  </div>
167
169
  {progressOpen && (
168
170
  <div className={css.assistantFloat} style={{ left: progressPos.x, top: progressPos.y, width: progressSize.w, height: progressSize.h }}>
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * 漫剧工作台·全流程步骤条(唯一导航,方案X):
3
- * ①创建方案 → ②视觉规则 → ③剧情骨架 → ④分镜表 → ⑤导入角色 → ⑥角色定妆 → ⑦视频提示词 → ⑧场景库 → ⑨导出使用。
3
+ * ①创建方案 → ②一键生成 → ③分镜 → ④角色定妆 → ⑤场景底图 → ⑥导出使用。
4
4
  * 每个步骤对应一个独立页面主体;完成度自动判定(读 project 现有字段)。
5
5
  */
6
6
  import type { ProjectState } from '../../protocol.ts'
@@ -16,7 +16,8 @@ export type FlowTarget =
16
16
  | 'makeup' // ⑥ 角色定妆页(角色·卡片)
17
17
  | 'prompts' // ⑦ 视频提示词页(分镜·提示词)
18
18
  | 'scenes' // ⑧ 场景库页
19
- | 'export' // ⑨ 导出使用页
19
+ | 'props' // ⑨ 道具库页
20
+ | 'export' // ⑩ 导出使用页
20
21
 
21
22
  export interface FlowStep {
22
23
  no: number
@@ -26,37 +27,37 @@ export interface FlowStep {
26
27
  target: FlowTarget
27
28
  }
28
29
 
29
- /** 依据 project 数据计算 9 步完成度(与存储顺序无关,按生产顺序排列)。 */
30
- export function computeFlowSteps(project: ProjectState | null): FlowStep[] {
30
+ /** 依据 project 数据计算 6 步完成度(与存储顺序无关,按生产顺序排列)。 */
31
+ export function computeFlowSteps(project: ProjectState | null, exported?: boolean): FlowStep[] {
31
32
  const plans = project?.mangaPlans ?? []
32
33
  const rules = project?.visualRules ?? []
33
34
  const sbs = project?.storyboards ?? []
34
35
  const manga = project?.mangaRoles ?? []
35
36
  const scenes = project?.scenes ?? []
37
+ const props = project?.props ?? []
36
38
  const hasSkeleton = sbs.some(e => e.skeleton !== undefined)
37
39
  const hasTable = sbs.some(e => e.table !== undefined)
38
40
  const hasPrompts = sbs.some(e => (e.prompts ?? []).length > 0)
39
41
  return [
40
- { no: 1, label: '创建方案', hint: '选基底风格+可选滤镜并命名;此后所有提示词按此风格生成', done: plans.length > 0, target: 'plan' },
41
- { no: 2, label: '视觉规则', hint: '从道藏提炼 3-6 条视觉世界观规则,自动注入所有生图/生视频提示词', done: rules.length > 0, target: 'rules' },
42
- { no: 3, label: '剧情骨架', hint: '分镜①:本章弧线+节拍链+出场角色(characters 提名地基)', done: hasSkeleton, target: 'skeleton' },
43
- { no: 4, label: '分镜表', hint: '分镜②:骨架展开为镜头级画面(景别/机位/台词/每镜头角色)', done: hasTable, target: 'table' },
44
- { no: 5, label: '导入角色', hint: '从本集分镜提名→小说库匹配(规则+LLM 两段式)→导入为漫剧卡', done: manga.length > 0, target: 'import' },
45
- { no: 6, label: '角色定妆', hint: '生成形象锚点→精修提示词→上传/生成定妆图(status=已定妆)', done: manga.some(c => c.status === 'anchored'), target: 'makeup' },
46
- { no: 7, label: '视频提示词', hint: '分镜③:每镜头一段即梦可粘贴提示词,带风格词块与定妆绑定', done: hasPrompts, target: 'prompts' },
47
- { no: 8, label: '场景库', hint: '(选做)从正文提炼场景卡并采纳,分镜表会标注使用场景', done: scenes.length > 0, target: 'scenes' },
48
- { no: 9, label: '导出使用', hint: '复制提示词到即梦/豆包/ComfyUI 出图生视频;定妆卡按 mangaRoleIds 绑定参考图', done: hasPrompts, target: 'export' },
42
+ { no: 1, label: '创建方案', hint: '选基底风格+题材并命名;此后所有提示词按此风格生成', done: plans.length > 0, target: 'plan' },
43
+ { no: 2, label: '一键生成', hint: '选章节后自动做 剧情骨架→分镜表→角色导入;视频提示词留到⑤', done: hasTable, target: 'import' },
44
+ { no: 3, label: '角色库', hint: '主要角色定妆图提示词→去即梦出图→建智能角色', done: manga.some(c => c.status === 'anchored'), target: 'makeup' },
45
+ { no: 4, label: '场景库', hint: '(选做)从正文提炼场景卡并出场景参考图,提示词自动引用', done: scenes.length > 0, target: 'scenes' },
46
+ { no: 5, label: '道具库', hint: '(选做)从正文提炼常驻道具,提示词里道具外观跨镜头统一', done: props.length > 0, target: 'props' },
47
+ { no: 6, label: '分镜·提示词', hint: '生成逐镜即梦提示词(可粘贴)→复制去即梦;含导出存档', done: hasPrompts, target: 'prompts' },
49
48
  ]
50
49
  }
51
50
 
52
51
  export function FlowGuide({
53
52
  project,
54
53
  onNavigate,
54
+ exported,
55
55
  }: {
56
56
  project: ProjectState | null
57
57
  onNavigate: (target: FlowTarget) => void
58
+ exported?: boolean
58
59
  }) {
59
- const steps = computeFlowSteps(project)
60
+ const steps = computeFlowSteps(project, exported)
60
61
  const doneCount = steps.filter(s => s.done).length
61
62
  return (
62
63
  <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--nf-space-6)', marginTop: 'var(--nf-space-8)' }}>