* feat: add theming system design file with 3 frames Design frames for Settings > Appearance panel, Command Palette theme switching, and live theme editing flow visualization. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add Rust backend for vault-native theming system Theme files live in _themes/*.json with colors, typography, and spacing sections. Vault-level settings (.laputa/settings.json) store the active theme. Built-in themes (default, dark, minimal) are seeded on vault creation. All 6 Tauri commands registered: list_themes, get_theme, get_vault_settings, save_vault_settings, set_active_theme, create_theme. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add frontend theme engine, settings UI, and command palette integration Wire up useThemeManager hook to load themes via Tauri IPC, apply CSS custom properties to :root, and support switching/creating themes. Add Appearance section to Settings panel with color swatches and theme cards. Register theme switch and create commands in the command registry. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use .to_string() instead of format! for string literal (clippy) * style: cargo fmt on theme.rs --------- Co-authored-by: Test <test@test.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
133 lines
4.4 KiB
TypeScript
133 lines
4.4 KiB
TypeScript
import { useAppKeyboard } from './useAppKeyboard'
|
|
import { useCommandRegistry } from './useCommandRegistry'
|
|
import type { CommandAction } from './useCommandRegistry'
|
|
import { useKeyboardNavigation } from './useKeyboardNavigation'
|
|
import { useMenuEvents } from './useMenuEvents'
|
|
import type { SidebarSelection, ThemeFile, VaultEntry } from '../types'
|
|
import type { ViewMode } from './useViewMode'
|
|
|
|
interface Tab { entry: VaultEntry; content: string }
|
|
|
|
interface AppCommandsConfig {
|
|
activeTabPath: string | null
|
|
activeTabPathRef: React.MutableRefObject<string | null>
|
|
handleCloseTabRef: React.MutableRefObject<(path: string) => void>
|
|
tabs: Tab[]
|
|
entries: VaultEntry[]
|
|
allContent: Record<string, string>
|
|
modifiedCount: number
|
|
selection: SidebarSelection
|
|
onQuickOpen: () => void
|
|
onCommandPalette: () => void
|
|
onSearch: () => void
|
|
onCreateNote: () => void
|
|
onCreateNoteOfType: (type: string) => void
|
|
onSave: () => void
|
|
onOpenSettings: () => void
|
|
onTrashNote: (path: string) => void
|
|
onArchiveNote: (path: string) => void
|
|
onUnarchiveNote: (path: string) => void
|
|
onCommitPush: () => void
|
|
onSetViewMode: (mode: ViewMode) => void
|
|
onToggleInspector: () => void
|
|
onZoomIn: () => void
|
|
onZoomOut: () => void
|
|
onZoomReset: () => void
|
|
zoomLevel: number
|
|
onSelect: (sel: SidebarSelection) => void
|
|
onCloseTab: (path: string) => void
|
|
onSwitchTab: (path: string) => void
|
|
onReplaceActiveTab: (entry: VaultEntry) => void
|
|
onSelectNote: (entry: VaultEntry) => void
|
|
onGoBack?: () => void
|
|
onGoForward?: () => void
|
|
canGoBack?: boolean
|
|
canGoForward?: boolean
|
|
themes?: ThemeFile[]
|
|
activeThemeId?: string | null
|
|
onSwitchTheme?: (themeId: string) => void
|
|
onCreateTheme?: () => void
|
|
}
|
|
|
|
/** Sets up keyboard shortcuts, command registry, menu events, and keyboard navigation. */
|
|
export function useAppCommands(config: AppCommandsConfig): CommandAction[] {
|
|
useAppKeyboard({
|
|
onQuickOpen: config.onQuickOpen,
|
|
onCommandPalette: config.onCommandPalette,
|
|
onSearch: config.onSearch,
|
|
onCreateNote: config.onCreateNote,
|
|
onSave: config.onSave,
|
|
onOpenSettings: config.onOpenSettings,
|
|
onTrashNote: config.onTrashNote,
|
|
onArchiveNote: config.onArchiveNote,
|
|
onSetViewMode: config.onSetViewMode,
|
|
onZoomIn: config.onZoomIn,
|
|
onZoomOut: config.onZoomOut,
|
|
onZoomReset: config.onZoomReset,
|
|
onGoBack: config.onGoBack,
|
|
onGoForward: config.onGoForward,
|
|
activeTabPathRef: config.activeTabPathRef,
|
|
handleCloseTabRef: config.handleCloseTabRef,
|
|
})
|
|
|
|
useMenuEvents({
|
|
onSetViewMode: config.onSetViewMode,
|
|
onCreateNote: config.onCreateNote,
|
|
onQuickOpen: config.onQuickOpen,
|
|
onSave: config.onSave,
|
|
onOpenSettings: config.onOpenSettings,
|
|
onToggleInspector: config.onToggleInspector,
|
|
onCommandPalette: config.onCommandPalette,
|
|
onZoomIn: config.onZoomIn,
|
|
onZoomOut: config.onZoomOut,
|
|
onZoomReset: config.onZoomReset,
|
|
activeTabPathRef: config.activeTabPathRef,
|
|
handleCloseTabRef: config.handleCloseTabRef,
|
|
activeTabPath: config.activeTabPath,
|
|
})
|
|
|
|
const commands = useCommandRegistry({
|
|
activeTabPath: config.activeTabPath,
|
|
entries: config.entries,
|
|
modifiedCount: config.modifiedCount,
|
|
onQuickOpen: config.onQuickOpen,
|
|
onCreateNote: config.onCreateNote,
|
|
onCreateNoteOfType: config.onCreateNoteOfType,
|
|
onSave: config.onSave,
|
|
onOpenSettings: config.onOpenSettings,
|
|
onTrashNote: config.onTrashNote,
|
|
onArchiveNote: config.onArchiveNote,
|
|
onUnarchiveNote: config.onUnarchiveNote,
|
|
onCommitPush: config.onCommitPush,
|
|
onSetViewMode: config.onSetViewMode,
|
|
onToggleInspector: config.onToggleInspector,
|
|
onZoomIn: config.onZoomIn,
|
|
onZoomOut: config.onZoomOut,
|
|
onZoomReset: config.onZoomReset,
|
|
zoomLevel: config.zoomLevel,
|
|
onSelect: config.onSelect,
|
|
onCloseTab: config.onCloseTab,
|
|
onGoBack: config.onGoBack,
|
|
onGoForward: config.onGoForward,
|
|
canGoBack: config.canGoBack,
|
|
canGoForward: config.canGoForward,
|
|
themes: config.themes,
|
|
activeThemeId: config.activeThemeId,
|
|
onSwitchTheme: config.onSwitchTheme,
|
|
onCreateTheme: config.onCreateTheme,
|
|
})
|
|
|
|
useKeyboardNavigation({
|
|
tabs: config.tabs,
|
|
activeTabPath: config.activeTabPath,
|
|
entries: config.entries,
|
|
selection: config.selection,
|
|
allContent: config.allContent,
|
|
onSwitchTab: config.onSwitchTab,
|
|
onReplaceActiveTab: config.onReplaceActiveTab,
|
|
onSelectNote: config.onSelectNote,
|
|
})
|
|
|
|
return commands
|
|
}
|