2026-02-24 23:41:54 +01:00
import { useMemo } from 'react'
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
import type { SidebarSelection , VaultEntry } from '../types'
2026-03-18 03:43:23 +01:00
import type { NoteListFilter } from '../utils/noteListHelpers'
2026-02-24 23:41:54 +01:00
import type { ViewMode } from './useViewMode'
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
export type CommandGroup = 'Navigation' | 'Note' | 'Git' | 'View' | 'Settings'
2026-02-24 23:41:54 +01:00
export interface CommandAction {
id : string
label : string
group : CommandGroup
shortcut? : string
keywords? : string [ ]
enabled : boolean
execute : ( ) = > void
}
interface CommandRegistryConfig {
activeTabPath : string | null
entries : VaultEntry [ ]
modifiedCount : number
2026-03-17 22:42:55 +01:00
/** Whether the active note has an emoji icon set. */
activeNoteHasIcon? : boolean
2026-03-04 13:11:58 +01:00
mcpStatus? : string
onInstallMcp ? : ( ) = > void
2026-03-12 00:06:33 +01:00
onEmptyTrash ? : ( ) = > void
trashedCount? : number
2026-03-07 01:14:12 +01:00
onReindexVault ? : ( ) = > void
2026-03-09 00:35:21 +01:00
onReloadVault ? : ( ) = > void
2026-03-07 12:39:55 +01:00
onRepairVault ? : ( ) = > void
2026-03-17 22:42:55 +01:00
onSetNoteIcon ? : ( ) = > void
onRemoveNoteIcon ? : ( ) = > void
2026-03-19 08:47:25 +01:00
onOpenInNewWindow ? : ( ) = > void
2026-02-24 23:41:54 +01:00
onQuickOpen : ( ) = > void
onCreateNote : ( ) = > void
2026-02-28 19:13:29 +01:00
onCreateNoteOfType : ( type : string ) = > void
2026-02-24 23:41:54 +01:00
onSave : ( ) = > void
onOpenSettings : ( ) = > void
2026-03-01 16:04:51 +01:00
onOpenVault ? : ( ) = > void
2026-03-03 00:31:10 +01:00
onCreateType ? : ( ) = > void
2026-02-24 23:41:54 +01:00
onTrashNote : ( path : string ) = > void
2026-03-02 11:55:51 +01:00
onRestoreNote : ( path : string ) = > void
2026-02-24 23:41:54 +01:00
onArchiveNote : ( path : string ) = > void
onUnarchiveNote : ( path : string ) = > void
onCommitPush : ( ) = > void
2026-03-19 09:51:06 +01:00
onPull ? : ( ) = > void
2026-03-03 02:27:42 +01:00
onResolveConflicts ? : ( ) = > void
2026-02-24 23:41:54 +01:00
onSetViewMode : ( mode : ViewMode ) = > void
onToggleInspector : ( ) = > void
2026-03-03 02:00:48 +01:00
onToggleDiff ? : ( ) = > void
2026-03-02 18:38:25 +01:00
onToggleRawEditor ? : ( ) = > void
2026-03-02 05:00:29 +01:00
onToggleAIChat ? : ( ) = > void
2026-03-03 02:00:48 +01:00
activeNoteModified : boolean
2026-03-02 23:48:01 +01:00
onCheckForUpdates ? : ( ) = > void
2026-02-28 12:41:57 +01:00
onZoomIn : ( ) = > void
onZoomOut : ( ) = > void
onZoomReset : ( ) = > void
zoomLevel : number
2026-02-24 23:41:54 +01:00
onSelect : ( sel : SidebarSelection ) = > void
2026-03-02 03:08:15 +01:00
onOpenDailyNote : ( ) = > void
2026-02-24 23:41:54 +01:00
onCloseTab : ( path : string ) = > void
2026-02-25 19:39:12 +01:00
onGoBack ? : ( ) = > void
onGoForward ? : ( ) = > void
canGoBack? : boolean
canGoForward? : boolean
2026-03-03 02:26:41 +01:00
onRemoveActiveVault ? : ( ) = > void
onRestoreGettingStarted ? : ( ) = > void
isGettingStartedHidden? : boolean
vaultCount? : number
2026-03-18 03:43:23 +01:00
/** Current selection — used to scope filter pill commands to section group views. */
selection? : SidebarSelection
noteListFilter? : NoteListFilter
onSetNoteListFilter ? : ( filter : NoteListFilter ) = > void
2026-02-24 23:41:54 +01:00
}
2026-02-28 19:13:29 +01:00
const PLURAL_OVERRIDES : Record < string , string > = {
Person : 'People' ,
Responsibility : 'Responsibilities' ,
}
const DEFAULT_TYPES = [ 'Event' , 'Person' , 'Project' , 'Note' ]
export function pluralizeType ( type : string ) : string {
if ( PLURAL_OVERRIDES [ type ] ) return PLURAL_OVERRIDES [ type ]
if ( type . endsWith ( 's' ) || type . endsWith ( 'x' ) || type . endsWith ( 'ch' ) || type . endsWith ( 'sh' ) ) return ` ${ type } es `
if ( type . endsWith ( 'y' ) && ! /[aeiou]y$/i . test ( type ) ) return ` ${ type . slice ( 0 , - 1 ) } ies `
return ` ${ type } s `
}
export function extractVaultTypes ( entries : VaultEntry [ ] ) : string [ ] {
const typeSet = new Set < string > ( )
for ( const e of entries ) {
if ( e . isA && e . isA !== 'Type' && ! e . trashed ) typeSet . add ( e . isA )
}
if ( typeSet . size === 0 ) return DEFAULT_TYPES
return Array . from ( typeSet ) . sort ( )
}
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
const GROUP_ORDER : CommandGroup [ ] = [ 'Navigation' , 'Note' , 'Git' , 'View' , 'Settings' ]
2026-02-24 23:41:54 +01:00
export function groupSortKey ( group : CommandGroup ) : number {
return GROUP_ORDER . indexOf ( group )
}
2026-02-28 19:13:29 +01:00
export function buildTypeCommands (
types : string [ ] ,
onCreateNoteOfType : ( type : string ) = > void ,
onSelect : ( sel : SidebarSelection ) = > void ,
) : CommandAction [ ] {
return types . flatMap ( ( type ) = > {
const slug = type . toLowerCase ( ) . replace ( /\s+/g , '-' )
const plural = pluralizeType ( type )
return [
{
id : ` new- ${ slug } ` , label : ` New ${ type } ` , group : 'Note' as CommandGroup ,
keywords : [ 'new' , 'create' , type . toLowerCase ( ) ] ,
enabled : true , execute : ( ) = > onCreateNoteOfType ( type ) ,
} ,
{
id : ` list- ${ slug } ` , label : ` List ${ plural } ` , group : 'Navigation' as CommandGroup ,
keywords : [ 'list' , 'show' , 'filter' , type . toLowerCase ( ) , plural . toLowerCase ( ) ] ,
enabled : true , execute : ( ) = > onSelect ( { kind : 'sectionGroup' , type } ) ,
} ,
]
} )
}
2026-03-02 18:38:25 +01:00
export function buildViewCommands (
hasActiveNote : boolean ,
2026-03-03 02:00:48 +01:00
activeNoteModified : boolean ,
2026-03-02 18:38:25 +01:00
onSetViewMode : ( mode : ViewMode ) = > void ,
onToggleInspector : ( ) = > void ,
2026-03-03 02:00:48 +01:00
onToggleDiff : ( ( ) = > void ) | undefined ,
2026-03-02 18:38:25 +01:00
onToggleRawEditor : ( ( ) = > void ) | undefined ,
onToggleAIChat : ( ( ) = > void ) | undefined ,
zoomLevel : number ,
onZoomIn : ( ) = > void ,
onZoomOut : ( ) = > void ,
onZoomReset : ( ) = > void ,
) : CommandAction [ ] {
return [
{ id : 'view-editor' , label : 'Editor Only' , group : 'View' , shortcut : '⌘1' , keywords : [ 'layout' , 'focus' ] , enabled : true , execute : ( ) = > onSetViewMode ( 'editor-only' ) } ,
{ id : 'view-editor-list' , label : 'Editor + Note List' , group : 'View' , shortcut : '⌘2' , keywords : [ 'layout' ] , enabled : true , execute : ( ) = > onSetViewMode ( 'editor-list' ) } ,
{ id : 'view-all' , label : 'Full Layout' , group : 'View' , shortcut : '⌘3' , keywords : [ 'layout' , 'sidebar' ] , enabled : true , execute : ( ) = > onSetViewMode ( 'all' ) } ,
2026-03-03 02:00:48 +01:00
{ id : 'toggle-inspector' , label : 'Toggle Properties Panel' , group : 'View' , keywords : [ 'properties' , 'inspector' , 'panel' , 'right' , 'sidebar' ] , enabled : true , execute : onToggleInspector } ,
{ id : 'toggle-diff' , label : 'Toggle Diff Mode' , group : 'View' , keywords : [ 'diff' , 'changes' , 'git' , 'compare' , 'version' ] , enabled : hasActiveNote && activeNoteModified , execute : ( ) = > onToggleDiff ? . ( ) } ,
2026-03-02 18:38:25 +01:00
{ id : 'toggle-raw-editor' , label : 'Toggle Raw Editor' , group : 'View' , keywords : [ 'raw' , 'source' , 'markdown' , 'frontmatter' , 'code' , 'textarea' ] , enabled : hasActiveNote , execute : ( ) = > onToggleRawEditor ? . ( ) } ,
{ id : 'toggle-ai-chat' , label : 'Toggle AI Chat' , group : 'View' , shortcut : '⌘I' , keywords : [ 'ai' , 'agent' , 'chat' , 'assistant' , 'contextual' ] , enabled : true , execute : ( ) = > onToggleAIChat ? . ( ) } ,
2026-03-03 02:00:48 +01:00
{ id : 'toggle-backlinks' , label : 'Toggle Backlinks' , group : 'View' , keywords : [ 'backlinks' , 'references' , 'links' , 'mentions' , 'incoming' ] , enabled : hasActiveNote , execute : onToggleInspector } ,
2026-03-02 18:38:25 +01:00
{ id : 'zoom-in' , label : ` Zoom In ( ${ zoomLevel } %) ` , group : 'View' , shortcut : '⌘=' , keywords : [ 'zoom' , 'bigger' , 'larger' , 'scale' ] , enabled : zoomLevel < 150 , execute : onZoomIn } ,
{ id : 'zoom-out' , label : ` Zoom Out ( ${ zoomLevel } %) ` , group : 'View' , shortcut : '⌘-' , keywords : [ 'zoom' , 'smaller' , 'scale' ] , enabled : zoomLevel > 80 , execute : onZoomOut } ,
{ id : 'zoom-reset' , label : 'Reset Zoom' , group : 'View' , shortcut : '⌘0' , keywords : [ 'zoom' , 'actual' , 'default' , '100' ] , enabled : zoomLevel !== 100 , execute : onZoomReset } ,
]
}
2026-02-24 23:41:54 +01:00
export function useCommandRegistry ( config : CommandRegistryConfig ) : CommandAction [ ] {
const {
2026-03-05 18:18:52 +01:00
activeTabPath , entries , modifiedCount ,
2026-02-28 19:13:29 +01:00
onQuickOpen , onCreateNote , onCreateNoteOfType , onSave , onOpenSettings ,
2026-03-02 11:55:51 +01:00
onTrashNote , onRestoreNote , onArchiveNote , onUnarchiveNote ,
2026-03-19 09:51:06 +01:00
onCommitPush , onPull , onResolveConflicts , onSetViewMode , onToggleInspector , onToggleDiff , onToggleRawEditor , onToggleAIChat , onOpenVault ,
2026-03-03 02:00:48 +01:00
activeNoteModified ,
2026-02-28 12:41:57 +01:00
onZoomIn , onZoomOut , onZoomReset , zoomLevel ,
2026-03-02 03:08:15 +01:00
onSelect , onOpenDailyNote , onCloseTab ,
2026-02-25 19:39:12 +01:00
onGoBack , onGoForward , canGoBack , canGoForward ,
2026-03-03 16:46:47 +01:00
onCheckForUpdates ,
2026-03-03 00:31:10 +01:00
onCreateType ,
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
onRemoveActiveVault , onRestoreGettingStarted , isGettingStartedHidden , vaultCount ,
2026-03-04 13:11:58 +01:00
mcpStatus , onInstallMcp ,
2026-03-12 00:06:33 +01:00
onEmptyTrash , trashedCount ,
2026-03-07 01:14:12 +01:00
onReindexVault ,
2026-03-09 00:35:21 +01:00
onReloadVault ,
2026-03-07 12:39:55 +01:00
onRepairVault ,
2026-03-17 22:42:55 +01:00
onSetNoteIcon ,
onRemoveNoteIcon ,
activeNoteHasIcon ,
2026-03-19 08:47:25 +01:00
onOpenInNewWindow ,
2026-03-18 03:43:23 +01:00
selection , noteListFilter , onSetNoteListFilter ,
2026-02-24 23:41:54 +01:00
} = config
2026-03-18 03:43:23 +01:00
const isSectionGroup = selection ? . kind === 'sectionGroup'
2026-02-24 23:41:54 +01:00
const hasActiveNote = activeTabPath !== null
const activeEntry = useMemo (
( ) = > ( hasActiveNote ? entries . find ( e = > e . path === activeTabPath ) : undefined ) ,
[ entries , activeTabPath , hasActiveNote ] ,
)
const isArchived = activeEntry ? . archived ? ? false
2026-03-02 11:55:51 +01:00
const isTrashed = activeEntry ? . trashed ? ? false
2026-02-24 23:41:54 +01:00
2026-02-28 19:13:29 +01:00
const vaultTypes = useMemo ( ( ) = > extractVaultTypes ( entries ) , [ entries ] )
2026-02-24 23:41:54 +01:00
return useMemo ( ( ) = > {
const cmds : CommandAction [ ] = [
// Navigation
{ id : 'search-notes' , label : 'Search Notes' , group : 'Navigation' , shortcut : '⌘P' , keywords : [ 'find' , 'open' , 'quick' ] , enabled : true , execute : onQuickOpen } ,
{ id : 'go-all' , label : 'Go to All Notes' , group : 'Navigation' , keywords : [ 'filter' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'all' } ) } ,
{ id : 'go-archived' , label : 'Go to Archived' , group : 'Navigation' , keywords : [ ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'archived' } ) } ,
{ id : 'go-trash' , label : 'Go to Trash' , group : 'Navigation' , keywords : [ 'deleted' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'trash' } ) } ,
2026-03-12 00:06:33 +01:00
{ id : 'empty-trash' , label : 'Empty Trash' , group : 'Note' , keywords : [ 'delete' , 'permanently' , 'purge' , 'clear' , 'trash' ] , enabled : ( trashedCount ? ? 0 ) > 0 , execute : ( ) = > onEmptyTrash ? . ( ) } ,
2026-02-24 23:41:54 +01:00
{ id : 'go-changes' , label : 'Go to Changes' , group : 'Navigation' , keywords : [ 'git' , 'modified' , 'pending' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'changes' } ) } ,
2026-03-05 16:27:29 +01:00
{ id : 'go-pulse' , label : 'Go to Pulse' , group : 'Navigation' , keywords : [ 'activity' , 'history' , 'commits' , 'git' , 'feed' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'pulse' } ) } ,
2026-03-19 06:41:40 +01:00
{ id : 'go-inbox' , label : 'Go to Inbox' , group : 'Navigation' , keywords : [ 'inbox' , 'unlinked' , 'orphan' , 'unorganized' , 'triage' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'inbox' } ) } ,
2026-02-25 19:39:12 +01:00
{ id : 'go-back' , label : 'Go Back' , group : 'Navigation' , shortcut : '⌘[' , keywords : [ 'previous' , 'history' , 'back' ] , enabled : ! ! canGoBack , execute : ( ) = > onGoBack ? . ( ) } ,
{ id : 'go-forward' , label : 'Go Forward' , group : 'Navigation' , shortcut : '⌘]' , keywords : [ 'next' , 'history' , 'forward' ] , enabled : ! ! canGoForward , execute : ( ) = > onGoForward ? . ( ) } ,
2026-02-24 23:41:54 +01:00
// Note actions (contextual)
{ id : 'create-note' , label : 'Create New Note' , group : 'Note' , shortcut : '⌘N' , keywords : [ 'new' , 'add' ] , enabled : true , execute : onCreateNote } ,
2026-03-03 00:31:10 +01:00
{ id : 'create-type' , label : 'New Type' , group : 'Note' , keywords : [ 'new' , 'create' , 'type' , 'template' ] , enabled : ! ! onCreateType , execute : ( ) = > onCreateType ? . ( ) } ,
2026-03-02 03:08:15 +01:00
{ id : 'open-daily-note' , label : "Open Today's Note" , group : 'Note' , shortcut : '⌘J' , keywords : [ 'daily' , 'journal' , 'today' ] , enabled : true , execute : onOpenDailyNote } ,
2026-02-24 23:41:54 +01:00
{ id : 'save-note' , label : 'Save Note' , group : 'Note' , shortcut : '⌘S' , keywords : [ 'write' ] , enabled : hasActiveNote , execute : onSave } ,
{ id : 'close-tab' , label : 'Close Tab' , group : 'Note' , shortcut : '⌘W' , keywords : [ ] , enabled : hasActiveNote , execute : ( ) = > { if ( activeTabPath ) onCloseTab ( activeTabPath ) } } ,
2026-03-02 11:55:51 +01:00
{
id : 'trash-note' , label : isTrashed ? 'Restore Note' : 'Trash Note' , group : 'Note' , shortcut : '⌘⌫' ,
keywords : [ 'delete' , 'remove' , 'restore' , 'trash' ] , enabled : hasActiveNote ,
execute : ( ) = > { if ( activeTabPath ) ( isTrashed ? onRestoreNote : onTrashNote ) ( activeTabPath ) } ,
} ,
2026-02-24 23:41:54 +01:00
{
id : 'archive-note' , label : isArchived ? 'Unarchive Note' : 'Archive Note' , group : 'Note' , shortcut : '⌘E' ,
keywords : [ 'archive' ] , enabled : hasActiveNote ,
execute : ( ) = > { if ( activeTabPath ) ( isArchived ? onUnarchiveNote : onArchiveNote ) ( activeTabPath ) } ,
} ,
2026-03-17 22:42:55 +01:00
{
id : 'set-note-icon' , label : 'Set Note Icon' , group : 'Note' ,
keywords : [ 'icon' , 'emoji' , 'set' , 'add' , 'change' , 'picker' ] ,
enabled : hasActiveNote && ! ! onSetNoteIcon ,
execute : ( ) = > onSetNoteIcon ? . ( ) ,
} ,
{
id : 'remove-note-icon' , label : 'Remove Note Icon' , group : 'Note' ,
keywords : [ 'icon' , 'emoji' , 'remove' , 'delete' , 'clear' ] ,
enabled : hasActiveNote && ! ! activeNoteHasIcon && ! ! onRemoveNoteIcon ,
execute : ( ) = > onRemoveNoteIcon ? . ( ) ,
} ,
2026-03-19 08:47:25 +01:00
{
id : 'open-in-new-window' , label : 'Open in New Window' , group : 'Note' , shortcut : '⌘⇧O' ,
keywords : [ 'window' , 'new' , 'detach' , 'pop' , 'external' , 'separate' ] ,
enabled : hasActiveNote ,
execute : ( ) = > onOpenInNewWindow ? . ( ) ,
} ,
2026-02-24 23:41:54 +01:00
// Git
{ id : 'commit-push' , label : 'Commit & Push' , group : 'Git' , keywords : [ 'git' , 'save' , 'sync' ] , enabled : modifiedCount > 0 , execute : onCommitPush } ,
2026-03-19 09:51:06 +01:00
{ id : 'git-pull' , label : 'Pull from Remote' , group : 'Git' , keywords : [ 'git' , 'pull' , 'fetch' , 'download' , 'sync' , 'remote' ] , enabled : true , execute : ( ) = > onPull ? . ( ) } ,
2026-03-05 18:18:52 +01:00
{ id : 'resolve-conflicts' , label : 'Resolve Conflicts' , group : 'Git' , keywords : [ 'conflict' , 'merge' , 'git' , 'sync' ] , enabled : true , execute : ( ) = > onResolveConflicts ? . ( ) } ,
2026-02-24 23:41:54 +01:00
{ id : 'view-changes' , label : 'View Pending Changes' , group : 'Git' , keywords : [ 'modified' , 'diff' ] , enabled : true , execute : ( ) = > onSelect ( { kind : 'filter' , filter : 'changes' } ) } ,
// View
2026-03-03 02:00:48 +01:00
. . . buildViewCommands ( hasActiveNote , activeNoteModified , onSetViewMode , onToggleInspector , onToggleDiff , onToggleRawEditor , onToggleAIChat , zoomLevel , onZoomIn , onZoomOut , onZoomReset ) ,
2026-02-24 23:41:54 +01:00
// Settings
{ id : 'open-settings' , label : 'Open Settings' , group : 'Settings' , shortcut : '⌘,' , keywords : [ 'preferences' , 'config' ] , enabled : true , execute : onOpenSettings } ,
2026-03-01 16:04:51 +01:00
{ id : 'open-vault' , label : 'Open Vault…' , group : 'Settings' , keywords : [ 'vault' , 'folder' , 'switch' , 'open' , 'workspace' ] , enabled : true , execute : ( ) = > onOpenVault ? . ( ) } ,
2026-03-03 02:26:41 +01:00
{ id : 'remove-vault' , label : 'Remove Vault from List' , group : 'Settings' , keywords : [ 'vault' , 'remove' , 'disconnect' , 'hide' ] , enabled : ( vaultCount ? ? 0 ) > 1 && ! ! onRemoveActiveVault , execute : ( ) = > onRemoveActiveVault ? . ( ) } ,
{ id : 'restore-getting-started' , label : 'Restore Getting Started Vault' , group : 'Settings' , keywords : [ 'vault' , 'restore' , 'demo' , 'getting started' , 'reset' ] , enabled : ! ! isGettingStartedHidden && ! ! onRestoreGettingStarted , execute : ( ) = > onRestoreGettingStarted ? . ( ) } ,
2026-03-03 16:46:47 +01:00
{ id : 'check-updates' , label : 'Check for Updates' , group : 'Settings' , keywords : [ 'update' , 'version' , 'upgrade' , 'release' ] , enabled : true , execute : ( ) = > onCheckForUpdates ? . ( ) } ,
2026-03-07 11:58:46 +01:00
{ id : 'install-mcp' , label : mcpStatus === 'installed' ? 'Restore MCP Server' : 'Install MCP Server' , group : 'Settings' , keywords : [ 'mcp' , 'claude' , 'ai' , 'tools' , 'install' , 'restore' , 'fix' , 'repair' ] , enabled : true , execute : ( ) = > onInstallMcp ? . ( ) } ,
2026-03-07 01:14:12 +01:00
{ id : 'reindex-vault' , label : 'Reindex Vault' , group : 'Settings' , keywords : [ 'reindex' , 'index' , 'search' , 'rebuild' , 'refresh' ] , enabled : ! ! onReindexVault , execute : ( ) = > onReindexVault ? . ( ) } ,
2026-03-09 00:35:21 +01:00
{ id : 'reload-vault' , label : 'Reload Vault' , group : 'Settings' , keywords : [ 'reload' , 'refresh' , 'rescan' , 'sync' , 'filesystem' , 'cache' ] , enabled : ! ! onReloadVault , execute : ( ) = > onReloadVault ? . ( ) } ,
2026-03-17 13:35:29 +01:00
{ id : 'repair-vault' , label : 'Repair Vault' , group : 'Settings' , keywords : [ 'repair' , 'fix' , 'restore' , 'config' , 'agents' , 'themes' , 'missing' , 'reset' , 'flatten' , 'structure' ] , enabled : ! ! onRepairVault , execute : ( ) = > onRepairVault ? . ( ) } ,
2026-02-28 19:13:29 +01:00
// Type-aware: "New [Type]" and "List [Type]"
. . . buildTypeCommands ( vaultTypes , onCreateNoteOfType , onSelect ) ,
2026-03-18 03:43:23 +01:00
// Note list filter pills (scoped to section group views)
{ id : 'filter-open' , label : 'Show Open Notes' , group : 'Navigation' , keywords : [ 'filter' , 'open' , 'active' , 'pill' ] , enabled : ! ! isSectionGroup && noteListFilter !== 'open' , execute : ( ) = > onSetNoteListFilter ? . ( 'open' ) } ,
{ id : 'filter-archived' , label : 'Show Archived Notes' , group : 'Navigation' , keywords : [ 'filter' , 'archived' , 'pill' ] , enabled : ! ! isSectionGroup && noteListFilter !== 'archived' , execute : ( ) = > onSetNoteListFilter ? . ( 'archived' ) } ,
{ id : 'filter-trashed' , label : 'Show Trashed Notes' , group : 'Navigation' , keywords : [ 'filter' , 'trashed' , 'trash' , 'pill' , 'deleted' ] , enabled : ! ! isSectionGroup && noteListFilter !== 'trashed' , execute : ( ) = > onSetNoteListFilter ? . ( 'trashed' ) } ,
2026-02-24 23:41:54 +01:00
]
return cmds
} , [
2026-03-05 18:18:52 +01:00
hasActiveNote , activeTabPath , isArchived , isTrashed , modifiedCount , activeNoteModified ,
2026-03-03 00:31:10 +01:00
onQuickOpen , onCreateNote , onCreateNoteOfType , onCreateType , onSave , onOpenSettings ,
2026-03-02 11:55:51 +01:00
onTrashNote , onRestoreNote , onArchiveNote , onUnarchiveNote ,
2026-03-19 09:51:06 +01:00
onCommitPush , onPull , onResolveConflicts , onSetViewMode , onToggleInspector , onToggleDiff , onToggleRawEditor , onToggleAIChat , onOpenVault ,
2026-03-03 16:46:47 +01:00
onCheckForUpdates ,
2026-02-28 12:41:57 +01:00
onZoomIn , onZoomOut , onZoomReset , zoomLevel ,
2026-03-02 03:08:15 +01:00
onSelect , onOpenDailyNote , onCloseTab ,
2026-02-25 19:39:12 +01:00
onGoBack , onGoForward , canGoBack , canGoForward ,
refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.
Editor styling via theme.json/EditorTheme.css is preserved (not user theming).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
vaultTypes ,
2026-03-03 02:48:10 +01:00
onRemoveActiveVault , onRestoreGettingStarted , isGettingStartedHidden , vaultCount ,
2026-03-19 09:51:06 +01:00
mcpStatus , onInstallMcp , onEmptyTrash , trashedCount ,
2026-03-09 00:35:21 +01:00
onReindexVault , onReloadVault , onRepairVault ,
2026-03-17 22:42:55 +01:00
onSetNoteIcon , onRemoveNoteIcon , activeNoteHasIcon ,
2026-03-18 03:43:23 +01:00
isSectionGroup , noteListFilter , onSetNoteListFilter ,
2026-03-19 08:47:25 +01:00
onOpenInNewWindow ,
2026-02-24 23:41:54 +01:00
] )
}