diff --git a/src/app/App.tsx b/src/app/App.tsx index 359a162..97b8e52 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -17,6 +17,10 @@ import { dbGet, dbSet, removeLegacyLocalStorageKeys } from '../shared/storage/db const STORAGE_KEY = 'visual_text_flow_state'; const MAX_HISTORY_ENTRIES = 50; const EMPTY_DOCUMENT_HTML = '
在此输入草稿,或从段落切片管理器将内容转化为卡片节点。
'; +const MIN_EDITOR_WIDTH = 320; +const DEFAULT_EDITOR_WIDTH = 480; +const OUTLINE_EDITOR_WIDTH = 732; +const MIN_CANVAS_WIDTH = 360; interface HistoryAvailability { canUndo: boolean; @@ -38,6 +42,8 @@ export default function App() { const [activeTab, setActiveTab] = useState<'editor' | 'canvas' | 'split'>('split'); const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false); const [isEditorOutlineOpen, setIsEditorOutlineOpen] = useState(false); + const [editorWidth, setEditorWidth] = useState(DEFAULT_EDITOR_WIDTH); + const [isEditorResizing, setIsEditorResizing] = useState(false); const [isLoaded, setIsLoaded] = useState(false); const [saveStatus, setSaveStatus] = useState+
{data.content || 空白灵感卡... 双击进行编辑}
)} diff --git a/src/features/canvas/nodes/ImageNode.tsx b/src/features/canvas/nodes/ImageNode.tsx index 59d237d..4495fb1 100644 --- a/src/features/canvas/nodes/ImageNode.tsx +++ b/src/features/canvas/nodes/ImageNode.tsx @@ -29,7 +29,7 @@ export const ImageNode = memo(({ id, data, selected }: { id: string; data: Image : imageDisplayMode === 'original' ? 'max-h-full max-w-full object-contain' : 'max-h-full max-w-full object-contain'; - const isPureImageMode = imageNodeDisplayMode === 'image-only' && !!imageUrl; + const isPureImageMode = imageNodeDisplayMode === 'image-only'; // Sync state with outer modifications useEffect(() => { @@ -45,20 +45,41 @@ export const ImageNode = memo(({ id, data, selected }: { id: string; data: Image onUpdateContent?.(id, data.content, titleVal, imageUrl, caption); }; + const applyImageFile = (file: File) => { + const nameWithoutExtension = file.name.substring(0, file.name.lastIndexOf('.')) || file.name; + const reader = new FileReader(); + reader.onloadend = () => { + const base64String = reader.result as string; + setImageUrl(base64String); + setTitleVal(nameWithoutExtension); + setCaption(nameWithoutExtension); + onUpdateContent?.(id, data.content, nameWithoutExtension, base64String, nameWithoutExtension); + }; + reader.readAsDataURL(file); + }; + const handleFileChange = (e: React.ChangeEvent