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