diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 1bdf861..55f1f29 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react' import { FileTree } from './components/FileTree/FileTree' +import { currentEditorView } from './components/Editor/MarkdownEditor' import { MarkdownEditor } from './components/Editor/MarkdownEditor' import { DocumentOutline } from './components/Editor/DocumentOutline' import { ChatPanel } from './components/AIChat/ChatPanel' @@ -16,8 +17,24 @@ export default function App(): JSX.Element { setFileTree, activeFilePath, isDirty, markSaved, activeFileContent, theme, toggleTheme, loadSession, revisionPanelOpen, toggleRevisionPanel, fontSize, setFontSize, openProjectSearch, clearActiveFile, initPrefs, focusMode, toggleFocusMode, - showHome, goHome + showHome, goHome, setActiveFile } = useEditorStore() + + const handleOpenStoryBible = async (): Promise => { + try { + const { path, content } = await window.api.openStoryBible() + setActiveFile(path, content) + if (path === activeFilePath) { + const view = currentEditorView + if (view) { + view.dispatch({ changes: { from: 0, to: view.state.doc.length, insert: content } }) + markSaved() + } + } + } catch (err) { + console.error('[App] openStoryBible failed:', err) + } + } const [sidebarOpen, setSidebarOpen] = useState( () => localStorage.getItem('sidebarOpen') !== 'false' ) @@ -175,14 +192,22 @@ export default function App(): JSX.Element {
diff --git a/src/renderer/components/FileTree/FileTree.css b/src/renderer/components/FileTree/FileTree.css index 03504bf..fe8352e 100644 --- a/src/renderer/components/FileTree/FileTree.css +++ b/src/renderer/components/FileTree/FileTree.css @@ -5,34 +5,6 @@ overflow: hidden; } -.file-tree-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 14px 12px 10px; - font-size: 11px; - font-weight: 700; - letter-spacing: 0.12em; - color: var(--text-muted); - border-bottom: 1px solid var(--border); - text-transform: uppercase; -} - -.file-tree-bible-btn { - background: none; - border: none; - cursor: pointer; - font-size: 14px; - line-height: 1; - padding: 0 2px; - opacity: 0.55; - transition: opacity 0.15s; - flex-shrink: 0; -} - -.file-tree-bible-btn:hover { - opacity: 1; -} .file-tree-list { overflow-y: auto; diff --git a/src/renderer/components/FileTree/FileTree.tsx b/src/renderer/components/FileTree/FileTree.tsx index bfda7ea..3f1384a 100644 --- a/src/renderer/components/FileTree/FileTree.tsx +++ b/src/renderer/components/FileTree/FileTree.tsx @@ -1,13 +1,12 @@ import { useState } from 'react' import { useEditorStore } from '../../store/editorStore' -import { currentEditorView } from '../Editor/MarkdownEditor' import { FileTreeNode } from './FileTreeNode' import { ContextMenu } from './ContextMenu' import type { MenuItem } from './ContextMenu' import './FileTree.css' export function FileTree(): JSX.Element { - const { fileTree, activeFilePath, setActiveFile, markSaved, setFileTree } = useEditorStore() + const { fileTree, setFileTree } = useEditorStore() const [creatingRoot, setCreatingRoot] = useState<'file' | 'dir' | null>(null) const [createRootValue, setCreateRootValue] = useState('') const [rootMenuPos, setRootMenuPos] = useState<{ x: number; y: number } | null>(null) @@ -39,39 +38,8 @@ export function FileTree(): JSX.Element { } } - const handleOpenStoryBible = async (): Promise => { - try { - const { path, content } = await window.api.openStoryBible() - setActiveFile(path, content) - // If the path didn't change (already on Story Bible), the MarkdownEditor's - // activeFilePath-keyed effect won't fire. Push content directly, same - // pattern as RevisionPanel.restore(). - if (path === activeFilePath) { - const view = currentEditorView - if (view) { - view.dispatch({ - changes: { from: 0, to: view.state.doc.length, insert: content } - }) - markSaved() - } - } - } catch (err) { - console.error('[FileTree] openStoryBible failed:', err) - } - } - return (