loro-codemirror
Version:
A CodeMirror plugin for loro
96 lines (95 loc) • 3.24 kB
TypeScript
import { EditorView, type PluginValue, ViewUpdate, type LayerMarker } from "@codemirror/view";
import { Awareness, type AwarenessListener, LoroDoc, LoroText, type Subscription } from "loro-crdt";
import { type Extension, SelectionRange, StateField } from "@codemirror/state";
export declare const loroCursorTheme: Extension;
export type CursorState = {
anchor: Uint8Array;
head?: Uint8Array;
};
export type AwarenessState = {
type: "update";
uid: string;
cursor: CursorState;
user?: UserState;
} | {
type: "delete";
uid: string;
};
export type UserState = {
name: string;
colorClassName: string;
};
export type CursorEffect = {
type: "update";
peer: string;
cursor: {
anchor: number;
head?: number;
};
user?: UserState;
} | {
type: "delete";
peer: string;
} | {
type: "checkout";
checkout: boolean;
};
export declare const remoteAwarenessAnnotation: import("@codemirror/state").AnnotationType<undefined>;
export declare const remoteAwarenessEffect: import("@codemirror/state").StateEffectType<CursorEffect>;
export declare const remoteAwarenessStateField: StateField<{
remoteCursors: Map<string, CursorPosition>;
isCheckout: boolean;
}>;
export declare const createCursorLayer: () => Extension;
export declare const createSelectionLayer: () => Extension;
/**
* Renders a blinking cursor to indicate the cursor of another user.
*/
export declare class RemoteCursorMarker implements LayerMarker {
private left;
private top;
private height;
private name;
private colorClassName;
constructor(left: number, top: number, height: number, name: string, colorClassName: string);
draw(): HTMLElement;
update(elt: HTMLElement): boolean;
adjust(element: HTMLElement): void;
eq(other: RemoteCursorMarker): boolean;
static createCursor(view: EditorView, position: SelectionRange, displayName: string, colorClassName: string): RemoteCursorMarker[];
private static calculateAbsoluteCursorPosition;
}
export interface CursorPosition {
cursor: {
anchor: number;
head?: number;
};
user?: UserState;
}
/**
* @deprecated Use EphemeralPlugin instead
*/
export declare class AwarenessPlugin implements PluginValue {
view: EditorView;
doc: LoroDoc;
user: UserState;
awareness: Awareness<AwarenessState>;
private getUserId;
private getTextFromDoc;
sub: Subscription;
constructor(view: EditorView, doc: LoroDoc, user: UserState, awareness: Awareness<AwarenessState>, getUserId: (() => string) | undefined, getTextFromDoc: (doc: LoroDoc) => LoroText);
update(update: ViewUpdate): void;
destroy(): void;
}
export declare class RemoteAwarenessPlugin implements PluginValue {
view: EditorView;
doc: LoroDoc;
awareness: Awareness<AwarenessState>;
_awarenessListener?: AwarenessListener;
constructor(view: EditorView, doc: LoroDoc, awareness: Awareness<AwarenessState>);
destroy(): void;
}
export declare const getCursorState: (doc: LoroDoc, anchor: number, head: number | undefined, getTextFromDoc: (doc: LoroDoc) => LoroText) => {
anchor: Uint8Array<ArrayBufferLike>;
head: Uint8Array<ArrayBufferLike> | undefined;
};