feat: ship v1.1.0 writer toolkit with templates, import, export, and inspiration capture

Implement chapter templates, txt/md/docx import, submission export presets, and global inspiration shortcut. Split import handlers into a separate main bundle and fix EditorLayout setTarget loop that broke E2E.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 13:53:22 +08:00
parent ea4819847f
commit adf877861d
49 changed files with 2450 additions and 87 deletions
+4
View File
@@ -9,6 +9,7 @@ interface AppState {
versionModalOpen: boolean
landmarksModalOpen: boolean
inspirationModalOpen: boolean
importBookModalOpen: boolean
toast: string | null
setView: (view: AppView) => void
setSidebarPanel: (panel: AppState['sidebarPanel']) => void
@@ -16,6 +17,7 @@ interface AppState {
setVersionModalOpen: (open: boolean) => void
setLandmarksModalOpen: (open: boolean) => void
setInspirationModalOpen: (open: boolean) => void
setImportBookModalOpen: (open: boolean) => void
showToast: (message: string) => void
clearToast: () => void
}
@@ -27,6 +29,7 @@ export const useAppStore = create<AppState>((set) => ({
versionModalOpen: false,
landmarksModalOpen: false,
inspirationModalOpen: false,
importBookModalOpen: false,
toast: null,
setView: (view) => set({ view }),
setSidebarPanel: (sidebarPanel) => set({ sidebarPanel }),
@@ -34,6 +37,7 @@ export const useAppStore = create<AppState>((set) => ({
setVersionModalOpen: (versionModalOpen) => set({ versionModalOpen }),
setLandmarksModalOpen: (landmarksModalOpen) => set({ landmarksModalOpen }),
setInspirationModalOpen: (inspirationModalOpen) => set({ inspirationModalOpen }),
setImportBookModalOpen: (importBookModalOpen) => set({ importBookModalOpen }),
showToast: (toast) => {
set({ toast })
setTimeout(() => set({ toast: null }), 2500)
+13
View File
@@ -0,0 +1,13 @@
import { create } from 'zustand'
interface ExportState {
open: boolean
openModal: () => void
close: () => void
}
export const useExportStore = create<ExportState>((set) => ({
open: false,
openModal: () => set({ open: true }),
close: () => set({ open: false })
}))
+3
View File
@@ -29,6 +29,9 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
pomodoroDurationMinutes: 25,
enableSystemNotifications: false,
enableGoalNotifications: true,
chapterTemplates: [],
submissionPresets: [],
defaultSubmissionPresetId: 'builtin-webnovel',
loaded: false,
load: async () => {
const data = await ipcCall(() => window.electronAPI.settings.get())