@blankdotpage/cake 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -0
- package/dist/cake/clipboard.d.ts +1 -0
- package/dist/cake/core/mapping/cursor-source-map.d.ts +32 -0
- package/dist/cake/core/runtime.d.ts +121 -0
- package/dist/cake/core/types.d.ts +42 -0
- package/dist/cake/dom/dom-map.d.ts +21 -0
- package/dist/cake/dom/dom-selection.d.ts +4 -0
- package/dist/cake/dom/render.d.ts +14 -0
- package/dist/cake/dom/types.d.ts +10 -0
- package/dist/cake/engine/cake-engine.d.ts +208 -0
- package/dist/cake/engine/selection/selection-geometry-dom.d.ts +23 -0
- package/dist/cake/engine/selection/selection-geometry.d.ts +23 -0
- package/dist/cake/engine/selection/selection-layout-dom.d.ts +30 -0
- package/dist/cake/engine/selection/selection-layout.d.ts +54 -0
- package/dist/cake/engine/selection/selection-navigation.d.ts +21 -0
- package/dist/cake/engine/selection/visible-text.d.ts +4 -0
- package/dist/cake/extensions/blockquote/blockquote.d.ts +2 -0
- package/dist/cake/extensions/bold/bold.d.ts +2 -0
- package/dist/cake/extensions/bundles.d.ts +2 -0
- package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts +2 -0
- package/dist/cake/extensions/heading/heading.d.ts +2 -0
- package/dist/cake/extensions/image/image.d.ts +2 -0
- package/dist/cake/extensions/index.d.ts +13 -0
- package/dist/cake/extensions/italic/italic.d.ts +2 -0
- package/dist/cake/extensions/link/link-popover.d.ts +10 -0
- package/dist/cake/extensions/link/link.d.ts +2 -0
- package/dist/cake/extensions/list/list-ast.d.ts +50 -0
- package/dist/cake/extensions/list/list.d.ts +2 -0
- package/dist/cake/extensions/overlay-types.d.ts +31 -0
- package/dist/cake/extensions/pipe-link/pipe-link.d.ts +2 -0
- package/dist/cake/extensions/scrollbar/index.d.ts +2 -0
- package/dist/cake/extensions/strikethrough/strikethrough.d.ts +2 -0
- package/dist/cake/extensions/types.d.ts +5 -0
- package/dist/cake/index.d.ts +1 -0
- package/dist/cake/react/CakeEditor.d.ts +8 -0
- package/dist/cake/shared/platform.d.ts +2 -0
- package/dist/cake/shared/segmenter.d.ts +12 -0
- package/dist/cake/shared/url.d.ts +2 -0
- package/dist/cake/shared/word-break.d.ts +18 -0
- package/dist/cake/test/harness.d.ts +53 -0
- package/dist/codemirror/markdown-commands.d.ts +12 -0
- package/dist/editor.d.ts +83 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +92 -0
- package/package.json +52 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { boldExtension } from "./bold/bold";
|
|
2
|
+
import { combinedEmphasisExtension } from "./combined-emphasis/combined-emphasis";
|
|
3
|
+
import { linkExtension } from "./link/link";
|
|
4
|
+
import { pipeLinkExtension } from "./pipe-link/pipe-link";
|
|
5
|
+
import { blockquoteExtension } from "./blockquote/blockquote";
|
|
6
|
+
import { italicExtension } from "./italic/italic";
|
|
7
|
+
import { headingExtension } from "./heading/heading";
|
|
8
|
+
import { imageExtension } from "./image/image";
|
|
9
|
+
import { listExtension } from "./list/list";
|
|
10
|
+
import { scrollbarExtension } from "./scrollbar";
|
|
11
|
+
import { strikethroughExtension } from "./strikethrough/strikethrough";
|
|
12
|
+
export { boldExtension, combinedEmphasisExtension, linkExtension, pipeLinkExtension, blockquoteExtension, italicExtension, headingExtension, imageExtension, listExtension, scrollbarExtension, strikethroughExtension, };
|
|
13
|
+
export declare const bundledExtensions: import("../core/runtime").CakeExtension[];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function CakeLinkPopover(params: {
|
|
2
|
+
container: HTMLElement;
|
|
3
|
+
contentRoot: HTMLElement;
|
|
4
|
+
toOverlayRect: (rect: DOMRectReadOnly) => {
|
|
5
|
+
top: number;
|
|
6
|
+
left: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List AST - a structured representation of list content that can be
|
|
3
|
+
* transformed and serialized back to text with correct numbering.
|
|
4
|
+
*/
|
|
5
|
+
type MarkerType = "bullet" | "numbered";
|
|
6
|
+
interface ListItem {
|
|
7
|
+
indent: number;
|
|
8
|
+
markerType: MarkerType;
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
interface PlainLine {
|
|
12
|
+
type: "plain";
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
interface ListItemLine {
|
|
16
|
+
type: "list-item";
|
|
17
|
+
item: ListItem;
|
|
18
|
+
}
|
|
19
|
+
type ListLine = PlainLine | ListItemLine;
|
|
20
|
+
interface ListRange {
|
|
21
|
+
lines: ListLine[];
|
|
22
|
+
startOffset: number;
|
|
23
|
+
endOffset: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function parseListRange(source: string, startOffset: number, endOffset: number): ListRange;
|
|
26
|
+
export declare function serializeListRange(range: ListRange, startNumber?: number): string;
|
|
27
|
+
export declare function insertItemAfter(range: ListRange, lineIndex: number, item: ListItem): ListRange;
|
|
28
|
+
export declare function removeItem(range: ListRange, lineIndex: number): ListRange;
|
|
29
|
+
export declare function convertToPlainText(range: ListRange, lineIndex: number): ListRange;
|
|
30
|
+
export declare function indentItem(range: ListRange, lineIndex: number): ListRange;
|
|
31
|
+
export declare function outdentItem(range: ListRange, lineIndex: number): ListRange;
|
|
32
|
+
export declare function updateItemContent(range: ListRange, lineIndex: number, content: string): ListRange;
|
|
33
|
+
export declare function mergeItems(range: ListRange, targetLineIndex: number, sourceLineIndex: number): ListRange;
|
|
34
|
+
export declare function findListRangeBoundaries(source: string, cursorOffset: number): {
|
|
35
|
+
startOffset: number;
|
|
36
|
+
endOffset: number;
|
|
37
|
+
lineIndex: number;
|
|
38
|
+
} | null;
|
|
39
|
+
export declare function getLineInfo(source: string, offset: number): {
|
|
40
|
+
lineIndex: number;
|
|
41
|
+
lineStart: number;
|
|
42
|
+
lineEnd: number;
|
|
43
|
+
line: string;
|
|
44
|
+
offsetInLine: number;
|
|
45
|
+
};
|
|
46
|
+
export declare function getListPrefixLength(line: string): number | null;
|
|
47
|
+
export declare function isListLine(line: string): boolean;
|
|
48
|
+
export declare function parseListItem(line: string): ListItem | null;
|
|
49
|
+
export declare function countNumberedItemsBefore(source: string, beforeLineIndex: number): number;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
export type OverlayExtensionContext = {
|
|
3
|
+
container: HTMLElement;
|
|
4
|
+
insertText: (text: string) => void;
|
|
5
|
+
replaceText: (oldText: string, newText: string) => void;
|
|
6
|
+
getSelection: () => {
|
|
7
|
+
start: number;
|
|
8
|
+
end: number;
|
|
9
|
+
} | null;
|
|
10
|
+
contentRoot?: HTMLElement;
|
|
11
|
+
overlayRoot?: HTMLElement;
|
|
12
|
+
toOverlayRect?: (rect: DOMRectReadOnly) => {
|
|
13
|
+
top: number;
|
|
14
|
+
left: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export type OverlayExtension = {
|
|
20
|
+
type: "overlay";
|
|
21
|
+
name: string;
|
|
22
|
+
render: (context: OverlayExtensionContext) => ReactElement | null;
|
|
23
|
+
};
|
|
24
|
+
export type Extension = OverlayExtension | {
|
|
25
|
+
type: "inline" | "block";
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
export type BlockExtension = {
|
|
29
|
+
type: "block";
|
|
30
|
+
name: string;
|
|
31
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CakeEditor } from "./react/CakeEditor";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EditorProps, EditorRefHandle } from "../../editor";
|
|
2
|
+
import type { CakeExtensionBundle } from "../extensions/types";
|
|
3
|
+
export type CakeEditorProps = Omit<EditorProps, "ref"> & {
|
|
4
|
+
extensionBundles?: CakeExtensionBundle[];
|
|
5
|
+
};
|
|
6
|
+
export declare const CakeEditor: import("react").ForwardRefExoticComponent<Omit<EditorProps, "ref"> & {
|
|
7
|
+
extensionBundles?: CakeExtensionBundle[];
|
|
8
|
+
} & import("react").RefAttributes<EditorRefHandle | null>>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type GraphemeSegment = {
|
|
2
|
+
segment: string;
|
|
3
|
+
index: number;
|
|
4
|
+
input: string;
|
|
5
|
+
};
|
|
6
|
+
export type WordSegment = GraphemeSegment & {
|
|
7
|
+
isWordLike: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function graphemeSegments(text: string): GraphemeSegment[];
|
|
10
|
+
export declare function wordSegments(text: string, locale?: string): WordSegment[];
|
|
11
|
+
export declare function graphemeClusterLengthBefore(text: string, offset: number): number;
|
|
12
|
+
export declare function graphemeClusterLengthAfter(text: string, offset: number): number;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find word boundaries at a given offset.
|
|
3
|
+
* Returns the start and end offsets of the word (or non-word segment) at the position.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getWordBoundariesAt(text: string, offset: number): {
|
|
6
|
+
start: number;
|
|
7
|
+
end: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Get word boundaries for double-click selection.
|
|
11
|
+
* Handles edge cases like clicking at newlines or end of text.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getWordBoundaries(text: string, offset: number): {
|
|
14
|
+
start: number;
|
|
15
|
+
end: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function prevWordBreak(text: string, offset: number): number;
|
|
18
|
+
export declare function nextWordBreak(text: string, offset: number): number;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CakeEngine } from "../engine/cake-engine";
|
|
2
|
+
import type { Selection } from "../core/types";
|
|
3
|
+
import type { CakeExtension } from "../core/runtime";
|
|
4
|
+
export interface SelectionRectInfo {
|
|
5
|
+
top: number;
|
|
6
|
+
left: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
export interface CaretInfo {
|
|
11
|
+
top: number;
|
|
12
|
+
left: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
export interface TestHarness {
|
|
16
|
+
container: HTMLDivElement;
|
|
17
|
+
contentRoot: HTMLElement;
|
|
18
|
+
engine: CakeEngine;
|
|
19
|
+
selection: Selection;
|
|
20
|
+
getLine(index: number): HTMLElement;
|
|
21
|
+
getLineCount(): number;
|
|
22
|
+
getLineRect(index: number): DOMRect;
|
|
23
|
+
getTextNode(lineIndex?: number): Text;
|
|
24
|
+
getCharRect(offset: number, lineIndex?: number): DOMRect;
|
|
25
|
+
getSelectionRects(): SelectionRectInfo[];
|
|
26
|
+
getCaretRect(): CaretInfo | null;
|
|
27
|
+
clickLeftOf(offset: number, lineIndex?: number): Promise<void>;
|
|
28
|
+
clickRightOf(offset: number, lineIndex?: number): Promise<void>;
|
|
29
|
+
clickAt(offset: number, lineIndex?: number): Promise<void>;
|
|
30
|
+
clickAtCoords(clientX: number, clientY: number): Promise<void>;
|
|
31
|
+
doubleClick(offset: number, lineIndex: number): Promise<void>;
|
|
32
|
+
tripleClick(lineIndex: number): Promise<void>;
|
|
33
|
+
typeText(text: string): Promise<void>;
|
|
34
|
+
pressEnter(): Promise<void>;
|
|
35
|
+
pressBackspace(): Promise<void>;
|
|
36
|
+
pressTab(): Promise<void>;
|
|
37
|
+
pressShiftTab(): Promise<void>;
|
|
38
|
+
pressKey(key: string, modifiers?: {
|
|
39
|
+
meta?: boolean;
|
|
40
|
+
ctrl?: boolean;
|
|
41
|
+
shift?: boolean;
|
|
42
|
+
alt?: boolean;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
focus(): Promise<void>;
|
|
45
|
+
destroy(): void;
|
|
46
|
+
}
|
|
47
|
+
export interface TestHarnessOptions {
|
|
48
|
+
value: string;
|
|
49
|
+
css?: string;
|
|
50
|
+
extensions?: CakeExtension[];
|
|
51
|
+
renderOverlays?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare function createTestHarness(valueOrOptions: string | TestHarnessOptions): TestHarness;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StateCommand } from "@codemirror/state";
|
|
2
|
+
export declare const toggleBold: StateCommand;
|
|
3
|
+
export declare const toggleItalic: StateCommand;
|
|
4
|
+
export declare const toggleUnderline: StateCommand;
|
|
5
|
+
export declare const toggleStrikethrough: StateCommand;
|
|
6
|
+
export declare const toggleLink: StateCommand;
|
|
7
|
+
export declare const toggleHeading: StateCommand;
|
|
8
|
+
export declare const toggleSubheading: StateCommand;
|
|
9
|
+
export declare const toggleInlineCode: StateCommand;
|
|
10
|
+
export declare const toggleQuote: StateCommand;
|
|
11
|
+
export declare const toggleBulletList: StateCommand;
|
|
12
|
+
export declare const toggleNumberedList: StateCommand;
|
package/dist/editor.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { StateCommand } from "@codemirror/state";
|
|
2
|
+
import type { BlockExtension, Extension } from "./cake/extensions/overlay-types";
|
|
3
|
+
export interface EditorSelectionRange {
|
|
4
|
+
anchor: number;
|
|
5
|
+
head: number;
|
|
6
|
+
}
|
|
7
|
+
export type EditorSelection = {
|
|
8
|
+
start: number;
|
|
9
|
+
end: number;
|
|
10
|
+
affinity?: "backward" | "forward";
|
|
11
|
+
};
|
|
12
|
+
export interface EditorChangeMetadata {
|
|
13
|
+
selectionBefore?: EditorSelectionRange | null;
|
|
14
|
+
selectionAfter?: EditorSelectionRange | null;
|
|
15
|
+
}
|
|
16
|
+
export type EditorSettings = {
|
|
17
|
+
theme: "light" | "dark";
|
|
18
|
+
fullScreenEnabled: boolean;
|
|
19
|
+
spellCheckEnabled: boolean;
|
|
20
|
+
showUpgradeSuccessModal: boolean;
|
|
21
|
+
counterVisible: boolean;
|
|
22
|
+
goalType: "word" | "character" | null;
|
|
23
|
+
goalValue: number | null;
|
|
24
|
+
};
|
|
25
|
+
export interface EditorUpdate {
|
|
26
|
+
value?: string;
|
|
27
|
+
selection?: EditorSelection;
|
|
28
|
+
focus?: boolean;
|
|
29
|
+
addToHistory?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface EditorTextSegment {
|
|
32
|
+
textStart: number;
|
|
33
|
+
textEnd: number;
|
|
34
|
+
docStart: number;
|
|
35
|
+
docEnd: number;
|
|
36
|
+
}
|
|
37
|
+
export interface EditorTextSlice {
|
|
38
|
+
text: string;
|
|
39
|
+
segments: EditorTextSegment[] | null;
|
|
40
|
+
}
|
|
41
|
+
export declare const defaultEditorSettings: EditorSettings;
|
|
42
|
+
export interface EditorProps {
|
|
43
|
+
initialValue: string;
|
|
44
|
+
value: string;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
ref: React.MutableRefObject<HTMLElement | null>;
|
|
47
|
+
extensions?: Extension[];
|
|
48
|
+
blockExtensions?: BlockExtension[];
|
|
49
|
+
onSelectionChange?: (start: number, end: number, affinity?: EditorSelection["affinity"]) => void;
|
|
50
|
+
selection?: EditorSelection;
|
|
51
|
+
onBlur?: (event?: FocusEvent) => void;
|
|
52
|
+
onChange: (value: string, metadata?: EditorChangeMetadata) => void;
|
|
53
|
+
settings: EditorSettings;
|
|
54
|
+
className?: string;
|
|
55
|
+
placeholder: string;
|
|
56
|
+
style?: React.CSSProperties;
|
|
57
|
+
headerHeight?: number;
|
|
58
|
+
pageId: string | null;
|
|
59
|
+
canUploadImage: () => boolean;
|
|
60
|
+
onHistoryChange?: (params: {
|
|
61
|
+
canUndo: boolean;
|
|
62
|
+
canRedo: boolean;
|
|
63
|
+
}) => void;
|
|
64
|
+
}
|
|
65
|
+
export interface EditorRefHandle {
|
|
66
|
+
element: HTMLElement | null;
|
|
67
|
+
focus: (props?: {
|
|
68
|
+
selection?: EditorSelection;
|
|
69
|
+
}) => void;
|
|
70
|
+
blur: () => void;
|
|
71
|
+
hasFocus: () => boolean;
|
|
72
|
+
selectAll: () => void;
|
|
73
|
+
executeCommand: (command: StateCommand) => boolean;
|
|
74
|
+
applyUpdate: (update: EditorUpdate) => void;
|
|
75
|
+
getValue?: () => string;
|
|
76
|
+
getSelectedText?: () => EditorTextSlice | null;
|
|
77
|
+
getSelectedMarkdown?: () => string | null;
|
|
78
|
+
getDocSelectionRange?: () => {
|
|
79
|
+
start: number;
|
|
80
|
+
end: number;
|
|
81
|
+
} | null;
|
|
82
|
+
getDocTextBetween?: (start: number, end: number) => EditorTextSlice | null;
|
|
83
|
+
}
|
package/dist/index.d.ts
ADDED