import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { isRadixDialogOpen, OPEN_NEW_POST_SHORTCUT_KEY, shouldIgnoreKeyboardShortcutEvent } from '@/lib/keyboard-shortcuts' import { cn } from '@/lib/utils' import postEditorService from '@/services/post-editor.service' import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react' import { marked } from 'marked' import { KeyboardShortcutsHelpContext } from '@/contexts/keyboard-shortcuts-help-context' import { useTranslation } from 'react-i18next' import readmeMarkdown from '../../../README.md?raw' function Kbd({ children }: { children: ReactNode }) { return ( {children} ) } function KbdRow({ keys, label }: { keys: ReactNode; label: string }) { return (
{label}
{keys}
) } function ShortcutsPanel() { const { t } = useTranslation() return (

{t('shortcuts.intro')}

{t('shortcuts.sectionApp')}

F1} /> Shift + Alt + F } /> Shift + Alt + S } /> Shift + Alt + N } />

{t('shortcuts.sectionSearch')}

{t('shortcuts.then')} Enter } /> Esc} />

{t('shortcuts.sectionStandard')}

Tab {t('shortcuts.or')} Shift + Tab } /> Enter {t('shortcuts.or')} Space } /> Esc} /> PgUp PgDn Home End } /> Alt + } />
) } function ReadmeOverviewPanel({ className }: { className?: string }) { const readmeHtml = useMemo(() => { // README is local project content; render it as regular markdown (not note-content parsing). const html = marked.parse(readmeMarkdown, { gfm: true, breaks: true }) const resolved = typeof html === 'string' ? html : '' return resolved.replace(/ ) } export function KeyboardShortcutsHelpProvider({ children }: { children: ReactNode }) { const [open, setOpen] = useState(false) const openHelp = useCallback(() => setOpen(true), []) const { t } = useTranslation() useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (open) return if (shouldIgnoreKeyboardShortcutEvent(e.target)) return if (isRadixDialogOpen()) return if (e.key === 'F1' && !e.ctrlKey && !e.metaKey && !e.altKey) { e.preventDefault() setOpen(true) return } if ( e.altKey && e.shiftKey && e.key.toLowerCase() === OPEN_NEW_POST_SHORTCUT_KEY && !e.ctrlKey && !e.metaKey ) { e.preventDefault() postEditorService.requestOpenNewPost() } } document.addEventListener('keydown', onKeyDown, true) return () => document.removeEventListener('keydown', onKeyDown, true) }, [open]) const value = useMemo(() => ({ openHelp }), [openHelp]) return ( {children} {t('help.title')} {t('shortcuts.intro')} {t('help.tabShortcuts')} {t('help.tabOverview')} ) }