import { useState, useEffect, useRef } from 'react'; const EDITOR_FONTS = [ { name: 'Source Code Pro', value: 'Source Code Pro' }, { name: 'Roboto Mono', value: 'Roboto Mono' }, { name: 'Inconsolata', value: 'Inconsolata' }, { name: 'System Mono', value: 'ui-monospace, monospace' }, ]; const PREVIEW_FONTS = [ { name: 'Merriweather', value: 'Merriweather' }, { name: 'Crimson Pro', value: 'Crimson Pro' }, { name: 'Roboto Serif', value: 'Roboto Serif' }, { name: 'Average', value: 'Average' }, { name: 'System Serif', value: 'ui-serif, Georgia, serif' }, ]; interface CategoriesSidebarProps { categories: string[]; selectedCategory: string; onSelectCategory: (category: string) => void; onCreateCategory: (name: string) => void; isCollapsed: boolean; onToggleCollapse: () => void; username: string; onLogout: () => void; theme: 'light' | 'dark' | 'system'; onThemeChange: (theme: 'light' | 'dark' | 'system') => void; editorFont: string; onEditorFontChange: (font: string) => void; editorFontSize: number; onEditorFontSizeChange: (size: number) => void; previewFont: string; onPreviewFontChange: (font: string) => void; previewFontSize: number; onPreviewFontSizeChange: (size: number) => void; } export function CategoriesSidebar({ categories, selectedCategory, onSelectCategory, onCreateCategory, isCollapsed, onToggleCollapse, username, onLogout, theme, onThemeChange, editorFont, onEditorFontChange, editorFontSize, onEditorFontSizeChange, previewFont, onPreviewFontChange, previewFontSize, onPreviewFontSizeChange, }: CategoriesSidebarProps) { const [isCreating, setIsCreating] = useState(false); const [newCategoryName, setNewCategoryName] = useState(''); const [isSettingsCollapsed, setIsSettingsCollapsed] = useState(true); const inputRef = useRef(null); useEffect(() => { if (isCreating && inputRef.current) { inputRef.current.focus(); } }, [isCreating]); const handleCreateCategory = () => { if (newCategoryName.trim()) { onCreateCategory(newCategoryName.trim()); setNewCategoryName(''); setIsCreating(false); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { handleCreateCategory(); } else if (e.key === 'Escape') { setIsCreating(false); setNewCategoryName(''); } }; if (isCollapsed) { return ( ); } return (

Categories

{categories.map((category) => ( ))} {isCreating && (
setNewCategoryName(e.target.value)} onKeyDown={handleKeyDown} onBlur={() => { if (newCategoryName.trim()) { handleCreateCategory(); } else { setIsCreating(false); } }} placeholder="Category name..." className="flex-1 text-sm px-0 py-0 border-none bg-transparent text-gray-900 dark:text-gray-100 focus:ring-0 focus:outline-none" />
)}
{/* User Info and Settings */}
{username.charAt(0).toUpperCase()}
{username}
{!isSettingsCollapsed && (
{/* Theme Toggle */}
Theme
{/* Font Settings */}
Fonts {/* Editor Font */}
Editor
{/* Preview Font */}
Preview
)}
); }