@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.
Files changed (45) hide show
  1. package/README.md +54 -0
  2. package/dist/cake/clipboard.d.ts +1 -0
  3. package/dist/cake/core/mapping/cursor-source-map.d.ts +32 -0
  4. package/dist/cake/core/runtime.d.ts +121 -0
  5. package/dist/cake/core/types.d.ts +42 -0
  6. package/dist/cake/dom/dom-map.d.ts +21 -0
  7. package/dist/cake/dom/dom-selection.d.ts +4 -0
  8. package/dist/cake/dom/render.d.ts +14 -0
  9. package/dist/cake/dom/types.d.ts +10 -0
  10. package/dist/cake/engine/cake-engine.d.ts +208 -0
  11. package/dist/cake/engine/selection/selection-geometry-dom.d.ts +23 -0
  12. package/dist/cake/engine/selection/selection-geometry.d.ts +23 -0
  13. package/dist/cake/engine/selection/selection-layout-dom.d.ts +30 -0
  14. package/dist/cake/engine/selection/selection-layout.d.ts +54 -0
  15. package/dist/cake/engine/selection/selection-navigation.d.ts +21 -0
  16. package/dist/cake/engine/selection/visible-text.d.ts +4 -0
  17. package/dist/cake/extensions/blockquote/blockquote.d.ts +2 -0
  18. package/dist/cake/extensions/bold/bold.d.ts +2 -0
  19. package/dist/cake/extensions/bundles.d.ts +2 -0
  20. package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts +2 -0
  21. package/dist/cake/extensions/heading/heading.d.ts +2 -0
  22. package/dist/cake/extensions/image/image.d.ts +2 -0
  23. package/dist/cake/extensions/index.d.ts +13 -0
  24. package/dist/cake/extensions/italic/italic.d.ts +2 -0
  25. package/dist/cake/extensions/link/link-popover.d.ts +10 -0
  26. package/dist/cake/extensions/link/link.d.ts +2 -0
  27. package/dist/cake/extensions/list/list-ast.d.ts +50 -0
  28. package/dist/cake/extensions/list/list.d.ts +2 -0
  29. package/dist/cake/extensions/overlay-types.d.ts +31 -0
  30. package/dist/cake/extensions/pipe-link/pipe-link.d.ts +2 -0
  31. package/dist/cake/extensions/scrollbar/index.d.ts +2 -0
  32. package/dist/cake/extensions/strikethrough/strikethrough.d.ts +2 -0
  33. package/dist/cake/extensions/types.d.ts +5 -0
  34. package/dist/cake/index.d.ts +1 -0
  35. package/dist/cake/react/CakeEditor.d.ts +8 -0
  36. package/dist/cake/shared/platform.d.ts +2 -0
  37. package/dist/cake/shared/segmenter.d.ts +12 -0
  38. package/dist/cake/shared/url.d.ts +2 -0
  39. package/dist/cake/shared/word-break.d.ts +18 -0
  40. package/dist/cake/test/harness.d.ts +53 -0
  41. package/dist/codemirror/markdown-commands.d.ts +12 -0
  42. package/dist/editor.d.ts +83 -0
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.js +92 -0
  45. package/package.json +52 -0
@@ -0,0 +1,2 @@
1
+ import type { CakeExtensionBundle } from "./types";
2
+ export declare const bundledExtensionBundles: CakeExtensionBundle[];
@@ -0,0 +1,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const combinedEmphasisExtension: CakeExtension;
@@ -0,0 +1,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const headingExtension: CakeExtension;
@@ -0,0 +1,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const imageExtension: CakeExtension;
@@ -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,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const italicExtension: 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,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const linkExtension: CakeExtension;
@@ -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,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const listExtension: CakeExtension;
@@ -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,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const pipeLinkExtension: CakeExtension;
@@ -0,0 +1,2 @@
1
+ import type { OverlayExtension } from "../overlay-types";
2
+ export declare const scrollbarExtension: OverlayExtension;
@@ -0,0 +1,2 @@
1
+ import type { CakeExtension } from "../../core/runtime";
2
+ export declare const strikethroughExtension: CakeExtension;
@@ -0,0 +1,5 @@
1
+ import type { CakeExtension } from "../core/runtime";
2
+ export type CakeExtensionBundle = {
3
+ name: string;
4
+ extensions: CakeExtension[];
5
+ };
@@ -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,2 @@
1
+ export declare const currentPlatform: "mac" | "windows" | "linux";
2
+ export declare function isMacPlatform(): boolean;
@@ -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,2 @@
1
+ export declare function ensureHttpsProtocol(url: string): string;
2
+ export declare function isUrl(text: string): boolean;
@@ -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;
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ export { CakeEditor } from "./cake";
2
+ export { CakeEngine } from "./cake/engine/cake-engine";
3
+ export * from "./cake/extensions";
4
+ export * from "./editor";