import MarkdownArticle from '@/components/Note/MarkdownArticle/MarkdownArticle' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { createFakeEvent } from '@/lib/event' 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 { CircleHelp } from 'lucide-react' import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react' import { KeyboardShortcutsHelpContext, useKeyboardShortcutsHelp } from '@/contexts/keyboard-shortcuts-help-context' import { useTranslation } from 'react-i18next' import readmeMarkdown from '../../../README.md?raw' export { useKeyboardShortcutsHelp } from '@/contexts/keyboard-shortcuts-help-context' 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')}

? {t('shortcuts.or')} 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 readmeEvent = useMemo( () => createFakeEvent({ id: '0'.repeat(64), pubkey: '0'.repeat(64), content: readmeMarkdown, created_at: 0, kind: 1, tags: [], sig: '0'.repeat(128) }), [] ) return (
) } 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 const isQuestionMark = e.key === '?' || (e.shiftKey && e.code === 'Slash' && !e.ctrlKey && !e.metaKey && !e.altKey) if (isQuestionMark && !e.ctrlKey && !e.metaKey && !e.altKey) { e.preventDefault() setOpen(true) 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')} ) } /** Titlebar-sized help control (e.g. home feed, next to profile). */ export function KeyboardShortcutsHelpButton() { const { openHelp } = useKeyboardShortcutsHelp() const { t } = useTranslation() return ( ) }