Files
tools/vue/editor/src/view/context.ts
T
robonen 09272dffeb feat(editor): eslint/tsconfig migration + type fixes
@robonen/editor: migrate to eslint flat config + composite tsconfig; fix
convergence test type annotations.
2026-06-07 16:30:05 +07:00

37 lines
1.5 KiB
TypeScript

import type { Ref, ShallowRef } from 'vue';
import type { Registry } from '../registry';
import { useContextFactory } from './composables';
import type { Command, Dispatch, Editor, EditorState } from '../state';
import type { EditorConfig } from './config';
import type { BlockElementRegistry, SelectionBridge } from './selection';
/** Everything child components and the input/selection plumbing need. */
export interface EditorContextValue {
/** The headless controller. */
editor: Editor;
/** Reactive mirror of `editor.state`, replaced wholesale per transaction. */
state: ShallowRef<EditorState>;
registry: Registry;
config: EditorConfig;
/** The single contenteditable root element (set by EditorContent). */
contentRoot: ShallowRef<HTMLElement | null>;
/** Block id → its (non-editable) block-content element. */
blockElements: BlockElementRegistry;
/** DOM ↔ model selection mapping. */
selection: SelectionBridge;
/** True while an IME composition is in flight (suppresses model sync). */
composing: Ref<boolean>;
/** Origin (`meta('origin')`) of the most recent transaction, if any. */
lastOrigin: Ref<string | undefined>;
dispatch: Dispatch;
/** Run a command against the current state. */
exec: (command: Command) => boolean;
/** Move real DOM focus + caret into a block. */
focusBlock: (blockId: string, offset: number | 'start' | 'end') => void;
}
export const {
inject: useEditorContext,
provide: provideEditorContext,
} = useContextFactory<EditorContextValue>('EditorContext');