edix
Version:
An experimental, type-safe, framework agnostic and small (5kB+) contenteditable state manager.
28 lines (27 loc) • 939 B
TypeScript
export interface TextNode {
readonly text: string;
}
export interface VoidNode {
}
export type InlineNode = TextNode | VoidNode;
export interface BlockNode {
readonly children: readonly InlineNode[];
}
export type Node = BlockNode | InlineNode;
export interface DocNode {
readonly children: readonly BlockNode[];
}
export type Fragment = DocNode["children"];
type InferChild<T> = T extends {
children: readonly (infer N)[];
} ? InferChild<N> : T;
type InferBlock<T> = T extends {
children: readonly (infer N)[];
} ? T & InferBlock<N> : T;
export type InferInlineNode<T extends DocNode> = InferChild<T>;
export type InferBlockNode<T extends DocNode> = InferBlock<T>;
export type Path = readonly [number?];
export type Position = readonly [path: Path, offset: number];
export type Range = readonly [start: Position, end: Position];
export type SelectionSnapshot = readonly [anchor: Position, focus: Position];
export {};