import { Editor } from '@tiptap/react'; import { UploadImageOptions } from '../utils/insert-commands'; export type EditorCommand = { run: (arg?: string) => void; isActive?: boolean; isEnabled: boolean; current?: string | null; }; export type EditorCommandId = 'edit.undo' | 'edit.redo' | 'edit.selectAll' | 'edit.cut' | 'edit.copy' | 'edit.paste' | 'edit.pasteWithoutFormatting' | 'edit.delete' | 'edit.findReplace' | 'insert.image' | 'insert.table' | 'insert.link' | 'insert.comment' | 'insert.callout' | 'insert.quote' | 'insert.code' | 'insert.codeBlock' | 'insert.video' | 'insert.mermaid' | 'insert.plainText' | 'insert.tweet' | 'insert.soundcloud' | 'insert.divider' | 'insert.pageBreak' | 'insert.columns2' | 'insert.columns3' | 'format.bold' | 'format.italic' | 'format.underline' | 'format.strike' | 'format.superscript' | 'format.subscript' | 'format.heading' | 'format.align' | 'format.direction' | 'format.lineHeight' | 'format.fontFamily' | 'format.fontSize.increase' | 'format.fontSize.decrease' | 'format.list.bullet' | 'format.list.numbered' | 'format.list.check' | 'format.clearFormatting' | 'table.addRowAbove' | 'table.addRowBelow' | 'table.mergeCells' | 'table.deleteRow' | 'table.addColumnLeft' | 'table.addColumnRight' | 'table.deleteColumn' | 'table.toggleHeaderRow' | 'table.toggleHeaderColumn' | 'table.toggleHeaderCell' | 'table.deleteTable'; export type UseEditorCommandsOptions = UploadImageOptions; /** * Reactive, editor-derived command registry (architecture doc §2 bucket 1). * INVARIANT: all isActive/current/isEnabled values are derived from the * editor via `useEditorState` (Tiptap's useSyncExternalStore wrapper) — the * hook holds no authoritative state of its own, so any number of instances * stay in sync, and consumers only re-render when a derived value changes * (deep-equality gated), not on every transaction. */ export declare const useEditorCommands: (editor: Editor | null, options?: UseEditorCommandsOptions) => Record;