import * as view from './view';
import type { CursorRenderOpts } from './view';
import type { PresenceManager } from '@jsonjoy.com/collaborative-presence/lib/PresenceManager';
import type { StrApi } from 'json-joy/lib/json-crdt';
import type { Extension } from '@codemirror/state';
/** Accessor for the JSON CRDT `str` node — mirrors the `PeritextRef` pattern
* used in the ProseMirror presence plugin. Return `null` / `undefined` when
* the node is not yet available (e.g. loading state). */
export type StrRef = () => StrApi | null | undefined;
export interface PresenceExtensionOpts extends CursorRenderOpts {
/** The shared presence store. */
manager: PresenceManager;
/** Accessor for the JSON CRDT `str` node. */
str: StrRef;
/** Custom caret DOM factory. When omitted, the default label-style cursor
* from `view.ts` is used. */
renderCursor?: view.CursorRenderer;
/** Custom inline decoration attrs factory for selection highlights. When
* omitted, a semi-transparent background is used. */
renderSelection?: view.SelectionRenderer;
/** Extracts a {@link PresenceUser} (name, color) from the `meta` payload of a
* `UserPresence` tuple. When omitted, user info is not shown on carets. */
userFromMeta?: (meta: Meta) => view.PresenceUser | undefined;
/** Interval in milliseconds for running {@link PresenceManager.removeOutdated}.
* Pass `0` to disable internal GC. Default: 5000. */
gcIntervalMs?: number;
}
/**
* Creates a CodeMirror 6 {@link Extension} that renders remote peer cursors
* and selections using a {@link PresenceManager} backed by a JSON CRDT `str` node.
*
* @example
* ```ts
* const editor = new EditorView({
* extensions: [
* ...otherExtensions,
* createExtension({ manager, str: () => model.api.str('/path/to/string/node') }),
* ],
* parent: container,
* });
* ```
*/
export declare const presenceExtension: (opts: PresenceExtensionOpts) => Extension;
//# sourceMappingURL=extension.d.ts.map