@blocknote/core 0.6.1 → 0.7.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/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "homepage": "https://github.com/TypeCellOS/BlockNote",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
- "version": "0.6.1",
6
+ "version": "0.7.0",
7
7
  "files": [
8
8
  "dist",
9
9
  "types",
@@ -51,23 +51,23 @@
51
51
  "@emotion/cache": "^11.10.5",
52
52
  "@emotion/serialize": "^1.1.1",
53
53
  "@emotion/utils": "^1.2.0",
54
- "@tiptap/core": "2.0.0-beta.217",
55
- "@tiptap/extension-bold": "2.0.0-beta.217",
56
- "@tiptap/extension-code": "2.0.0-beta.217",
57
- "@tiptap/extension-collaboration": "2.0.0-beta.217",
58
- "@tiptap/extension-collaboration-cursor": "2.0.0-beta.217",
59
- "@tiptap/extension-dropcursor": "2.0.0-beta.217",
60
- "@tiptap/extension-gapcursor": "2.0.0-beta.217",
61
- "@tiptap/extension-hard-break": "2.0.0-beta.217",
62
- "@tiptap/extension-history": "2.0.0-beta.217",
63
- "@tiptap/extension-horizontal-rule": "2.0.0-beta.217",
64
- "@tiptap/extension-italic": "2.0.0-beta.217",
65
- "@tiptap/extension-link": "2.0.0-beta.217",
66
- "@tiptap/extension-paragraph": "2.0.0-beta.217",
67
- "@tiptap/extension-strike": "2.0.0-beta.217",
68
- "@tiptap/extension-text": "2.0.0-beta.217",
69
- "@tiptap/extension-underline": "2.0.0-beta.217",
70
- "@tiptap/pm": "2.0.0-beta.217",
54
+ "@tiptap/core": "^2.0.3",
55
+ "@tiptap/extension-bold": "^2.0.3",
56
+ "@tiptap/extension-code": "^2.0.3",
57
+ "@tiptap/extension-collaboration": "^2.0.3",
58
+ "@tiptap/extension-collaboration-cursor": "^2.0.3",
59
+ "@tiptap/extension-dropcursor": "^2.0.3",
60
+ "@tiptap/extension-gapcursor": "^2.0.3",
61
+ "@tiptap/extension-hard-break": "^2.0.3",
62
+ "@tiptap/extension-history": "^2.0.3",
63
+ "@tiptap/extension-horizontal-rule": "^2.0.3",
64
+ "@tiptap/extension-italic": "^2.0.3",
65
+ "@tiptap/extension-link": "^2.0.3",
66
+ "@tiptap/extension-paragraph": "^2.0.3",
67
+ "@tiptap/extension-strike": "^2.0.3",
68
+ "@tiptap/extension-text": "^2.0.3",
69
+ "@tiptap/extension-underline": "^2.0.3",
70
+ "@tiptap/pm": "^2.0.3",
71
71
  "hast-util-from-dom": "^4.2.0",
72
72
  "lodash": "^4.17.21",
73
73
  "rehype-parse": "^8.0.4",
@@ -80,8 +80,8 @@
80
80
  "unified": "^10.1.2",
81
81
  "uuid": "^8.3.2",
82
82
  "y-prosemirror": "1.0.20",
83
- "y-protocols": "1.0.5",
84
- "yjs": "13.5.44"
83
+ "y-protocols": "^1.0.5",
84
+ "yjs": "^13.6.1"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@types/hast": "^2.3.4",
@@ -109,5 +109,5 @@
109
109
  "access": "public",
110
110
  "registry": "https://registry.npmjs.org/"
111
111
  },
112
- "gitHead": "018be0fdd45fa93b16cdb513720eb7c700cc022b"
112
+ "gitHead": "c0fc174529fb2bcd23c53956818ad0f451c0e65c"
113
113
  }
@@ -2,6 +2,7 @@ import { Editor, EditorOptions } from "@tiptap/core";
2
2
  import { Node } from "prosemirror-model";
3
3
  // import "./blocknote.css";
4
4
  import { Editor as TiptapEditor } from "@tiptap/core/dist/packages/core/src/Editor";
5
+ import * as Y from "yjs";
5
6
  import {
6
7
  insertBlocks,
7
8
  removeBlocks,
@@ -23,12 +24,12 @@ import {
23
24
  BlockIdentifier,
24
25
  PartialBlock,
25
26
  } from "./extensions/Blocks/api/blockTypes";
27
+ import { TextCursorPosition } from "./extensions/Blocks/api/cursorPositionTypes";
26
28
  import {
27
29
  ColorStyle,
28
30
  Styles,
29
31
  ToggledStyle,
30
32
  } from "./extensions/Blocks/api/inlineContentTypes";
31
- import { TextCursorPosition } from "./extensions/Blocks/api/cursorPositionTypes";
32
33
  import { Selection } from "./extensions/Blocks/api/selectionTypes";
33
34
  import { getBlockInfoFromPos } from "./extensions/Blocks/helpers/getBlockInfoFromPos";
34
35
  import {
@@ -37,11 +38,12 @@ import {
37
38
  } from "./extensions/SlashMenu";
38
39
 
39
40
  export type BlockNoteEditorOptions = {
40
- // TODO: Figure out if enableBlockNoteExtensions/disableHistoryExtension are needed and document them.
41
+ // TODO: Figure out if enableBlockNoteExtensions is needed and document them.
41
42
  enableBlockNoteExtensions: boolean;
42
- disableHistoryExtension: boolean;
43
+
43
44
  /**
44
- * Factories used to create a custom UI for BlockNote
45
+ * UI element factories for creating a custom UI, including custom positioning
46
+ * & rendering.
45
47
  */
46
48
  uiFactories: UiFactories;
47
49
  /**
@@ -96,6 +98,31 @@ export type BlockNoteEditorOptions = {
96
98
  */
97
99
  theme: "light" | "dark";
98
100
 
101
+ /**
102
+ * When enabled, allows for collaboration between multiple users.
103
+ */
104
+ collaboration: {
105
+ /**
106
+ * The Yjs XML fragment that's used for collaboration.
107
+ */
108
+ fragment: Y.XmlFragment;
109
+ /**
110
+ * The user info for the current user that's shown to other collaborators.
111
+ */
112
+ user: {
113
+ name: string;
114
+ color: string;
115
+ };
116
+ /**
117
+ * A Yjs provider (used for awareness / cursor information)
118
+ */
119
+ provider: any;
120
+ /**
121
+ * Optional function to customize how cursors of users are rendered
122
+ */
123
+ renderCursor?: (user: any) => HTMLElement;
124
+ };
125
+
99
126
  // tiptap options, undocumented
100
127
  _tiptapOptions: any;
101
128
  };
@@ -118,23 +145,20 @@ export class BlockNoteEditor {
118
145
  this._tiptapEditor.view.focus();
119
146
  }
120
147
 
121
- constructor(options: Partial<BlockNoteEditorOptions> = {}) {
148
+ constructor(private readonly options: Partial<BlockNoteEditorOptions> = {}) {
122
149
  // apply defaults
123
150
  options = {
124
151
  defaultStyles: true,
125
152
  ...options,
126
153
  };
127
154
 
128
- const blockNoteExtensions = getBlockNoteExtensions({
155
+ const extensions = getBlockNoteExtensions({
129
156
  editor: this,
130
157
  uiFactories: options.uiFactories || {},
131
158
  slashCommands: options.slashCommands || defaultSlashMenuItems,
159
+ collaboration: options.collaboration,
132
160
  });
133
161
 
134
- let extensions = options.disableHistoryExtension
135
- ? blockNoteExtensions.filter((e) => e.name !== "history")
136
- : blockNoteExtensions;
137
-
138
162
  const tiptapOptions: EditorOptions = {
139
163
  // TODO: This approach to setting initial content is "cleaner" but requires the PM editor schema, which is only
140
164
  // created after initializing the TipTap editor. Not sure it's feasible.
@@ -643,4 +667,16 @@ export class BlockNoteEditor {
643
667
  public async markdownToBlocks(markdown: string): Promise<Block[]> {
644
668
  return markdownToBlocks(markdown, this._tiptapEditor.schema);
645
669
  }
670
+
671
+ /**
672
+ * Updates the user info for the current user that's shown to other collaborators.
673
+ */
674
+ public updateCollaborationUserInfo(user: { name: string; color: string }) {
675
+ if (!this.options.collaboration) {
676
+ throw new Error(
677
+ "Cannot update collaboration user info when collaboration is disabled."
678
+ );
679
+ }
680
+ this._tiptapEditor.commands.updateUser(user);
681
+ }
646
682
  }
@@ -4,6 +4,8 @@ import { BlockNoteEditor } from "./BlockNoteEditor";
4
4
 
5
5
  import { Bold } from "@tiptap/extension-bold";
6
6
  import { Code } from "@tiptap/extension-code";
7
+ import Collaboration from "@tiptap/extension-collaboration";
8
+ import CollaborationCursor from "@tiptap/extension-collaboration-cursor";
7
9
  import { Dropcursor } from "@tiptap/extension-dropcursor";
8
10
  import { Gapcursor } from "@tiptap/extension-gapcursor";
9
11
  import { HardBreak } from "@tiptap/extension-hard-break";
@@ -13,6 +15,8 @@ import { Link } from "@tiptap/extension-link";
13
15
  import { Strike } from "@tiptap/extension-strike";
14
16
  import { Text } from "@tiptap/extension-text";
15
17
  import { Underline } from "@tiptap/extension-underline";
18
+ import * as Y from "yjs";
19
+ import styles from "./editor.module.css";
16
20
  import { BackgroundColorExtension } from "./extensions/BackgroundColor/BackgroundColorExtension";
17
21
  import { BackgroundColorMark } from "./extensions/BackgroundColor/BackgroundColorMark";
18
22
  import { blocks } from "./extensions/Blocks";
@@ -46,6 +50,15 @@ export const getBlockNoteExtensions = (opts: {
46
50
  editor: BlockNoteEditor;
47
51
  uiFactories: UiFactories;
48
52
  slashCommands: BaseSlashMenuItem[];
53
+ collaboration?: {
54
+ fragment: Y.XmlFragment;
55
+ user: {
56
+ name: string;
57
+ color: string;
58
+ };
59
+ provider: any;
60
+ renderCursor?: (user: any) => HTMLElement;
61
+ };
49
62
  }) => {
50
63
  const ret: Extensions = [
51
64
  extensions.ClipboardTextSerializer,
@@ -90,12 +103,48 @@ export const getBlockNoteExtensions = (opts: {
90
103
  ...blocks,
91
104
 
92
105
  Dropcursor.configure({ width: 5, color: "#ddeeff" }),
93
- History,
94
106
  // This needs to be at the bottom of this list, because Key events (such as enter, when selecting a /command),
95
107
  // should be handled before Enter handlers in other components like splitListItem
96
108
  TrailingNode,
97
109
  ];
98
110
 
111
+ if (opts.collaboration) {
112
+ ret.push(
113
+ Collaboration.configure({
114
+ fragment: opts.collaboration.fragment,
115
+ })
116
+ );
117
+ const defaultRender = (user: { color: string; name: string }) => {
118
+ const cursor = document.createElement("span");
119
+
120
+ cursor.classList.add(styles["collaboration-cursor__caret"]);
121
+ cursor.setAttribute("style", `border-color: ${user.color}`);
122
+
123
+ const label = document.createElement("span");
124
+
125
+ label.classList.add(styles["collaboration-cursor__label"]);
126
+ label.setAttribute("style", `background-color: ${user.color}`);
127
+ label.insertBefore(document.createTextNode(user.name), null);
128
+
129
+ const nonbreakingSpace1 = document.createTextNode("\u2060");
130
+ const nonbreakingSpace2 = document.createTextNode("\u2060");
131
+ cursor.insertBefore(nonbreakingSpace1, null);
132
+ cursor.insertBefore(label, null);
133
+ cursor.insertBefore(nonbreakingSpace2, null);
134
+ return cursor;
135
+ };
136
+ ret.push(
137
+ CollaborationCursor.configure({
138
+ user: opts.collaboration.user,
139
+ render: opts.collaboration.renderCursor || defaultRender,
140
+ provider: opts.collaboration.provider,
141
+ })
142
+ );
143
+ } else {
144
+ // disable history extension when collaboration is enabled as Yjs takes care of undo / redo
145
+ ret.push(History);
146
+ }
147
+
99
148
  if (opts.uiFactories.blockSideMenuFactory) {
100
149
  ret.push(
101
150
  DraggableBlocksExtension.configure({
@@ -38,9 +38,12 @@ Tippy popups that are appended to document.body directly
38
38
  .defaultStyles h3,
39
39
  .defaultStyles li {
40
40
  all: unset !important;
41
+ flex-grow: 1 !important;
41
42
  margin: 0;
42
43
  padding: 0;
43
44
  font-size: inherit;
45
+ /* min width to make sure cursor is always visible */
46
+ min-width: 2px !important;
44
47
  }
45
48
 
46
49
  .defaultStyles {
@@ -54,16 +57,43 @@ Tippy popups that are appended to document.body directly
54
57
  }
55
58
 
56
59
  [data-theme="light"] {
57
- background-color: #FFFFFF;
60
+ background-color: #ffffff;
58
61
  color: #444444;
59
62
  }
60
63
 
61
64
  [data-theme="dark"] {
62
65
  background-color: #444444;
63
- color: #DDDDDD;
66
+ color: #dddddd;
64
67
  }
65
68
 
66
69
  .dragPreview {
67
70
  position: absolute;
68
71
  top: -1000px;
69
72
  }
73
+
74
+ /* Give a remote user a caret */
75
+ .collaboration-cursor__caret {
76
+ border-left: 1px solid #0d0d0d;
77
+ border-right: 1px solid #0d0d0d;
78
+ margin-left: -1px;
79
+ margin-right: -1px;
80
+ pointer-events: none;
81
+ position: relative;
82
+ word-break: normal;
83
+ }
84
+
85
+ /* Render the username above the caret */
86
+ .collaboration-cursor__label {
87
+ border-radius: 3px 3px 3px 0;
88
+ color: #0d0d0d;
89
+ font-size: 12px;
90
+ font-style: normal;
91
+ font-weight: 600;
92
+ left: -1px;
93
+ line-height: normal;
94
+ padding: 0.1rem 0.3rem;
95
+ position: absolute;
96
+ top: -1.4em;
97
+ user-select: none;
98
+ white-space: nowrap;
99
+ }
@@ -10,7 +10,11 @@ BASIC STYLES
10
10
  .blockContent {
11
11
  padding: 3px 0;
12
12
  transition: font-size 0.2s;
13
- /* display: inline-block; */
13
+ /*
14
+ because the content elements are display: block
15
+ we use flex to position them next to list markers
16
+ */
17
+ display: flex;
14
18
  }
15
19
 
16
20
  .blockContent::before {
@@ -40,13 +44,17 @@ NESTED BLOCKS
40
44
  transition: all 0.2s 0.1s;
41
45
  }
42
46
 
43
- [data-theme="light"] .blockGroup .blockGroup
44
- > .blockOuter:not([data-prev-depth-changed])::before {
45
- border-left: 1px solid #CCCCCC;
47
+ [data-theme="light"]
48
+ .blockGroup
49
+ .blockGroup
50
+ > .blockOuter:not([data-prev-depth-changed])::before {
51
+ border-left: 1px solid #cccccc;
46
52
  }
47
53
 
48
- [data-theme="dark"] .blockGroup .blockGroup
49
- > .blockOuter:not([data-prev-depth-changed])::before {
54
+ [data-theme="dark"]
55
+ .blockGroup
56
+ .blockGroup
57
+ > .blockOuter:not([data-prev-depth-changed])::before {
50
58
  border-left: 1px solid #999999;
51
59
  }
52
60
 
@@ -217,10 +225,6 @@ NESTED BLOCKS
217
225
 
218
226
  /* PLACEHOLDERS*/
219
227
 
220
- .blockContent > :first-child {
221
- display: inline;
222
- }
223
-
224
228
  .blockContent.isEmpty > :first-child:before,
225
229
  .blockContent.isFilter > :first-child:before {
226
230
  /*float: left; */
@@ -234,7 +238,7 @@ NESTED BLOCKS
234
238
 
235
239
  [data-theme="light"] .blockContent.isEmpty > :first-child:before,
236
240
  .blockContent.isFilter > :first-child:before {
237
- color: #CCCCCC;
241
+ color: #cccccc;
238
242
  }
239
243
 
240
244
  [data-theme="dark"] .blockContent.isEmpty > :first-child:before,
@@ -1,15 +1,16 @@
1
1
  import { Editor as TiptapEditor } from "@tiptap/core/dist/packages/core/src/Editor";
2
+ import * as Y from "yjs";
2
3
  import { UiFactories } from "./BlockNoteExtensions";
3
4
  import { Block, BlockIdentifier, PartialBlock } from "./extensions/Blocks/api/blockTypes";
4
- import { Styles } from "./extensions/Blocks/api/inlineContentTypes";
5
5
  import { TextCursorPosition } from "./extensions/Blocks/api/cursorPositionTypes";
6
+ import { Styles } from "./extensions/Blocks/api/inlineContentTypes";
6
7
  import { Selection } from "./extensions/Blocks/api/selectionTypes";
7
8
  import { BaseSlashMenuItem } from "./extensions/SlashMenu";
8
9
  export type BlockNoteEditorOptions = {
9
10
  enableBlockNoteExtensions: boolean;
10
- disableHistoryExtension: boolean;
11
11
  /**
12
- * Factories used to create a custom UI for BlockNote
12
+ * UI element factories for creating a custom UI, including custom positioning
13
+ * & rendering.
13
14
  */
14
15
  uiFactories: UiFactories;
15
16
  /**
@@ -62,9 +63,34 @@ export type BlockNoteEditorOptions = {
62
63
  * @default "light"
63
64
  */
64
65
  theme: "light" | "dark";
66
+ /**
67
+ * When enabled, allows for collaboration between multiple users.
68
+ */
69
+ collaboration: {
70
+ /**
71
+ * The Yjs XML fragment that's used for collaboration.
72
+ */
73
+ fragment: Y.XmlFragment;
74
+ /**
75
+ * The user info for the current user that's shown to other collaborators.
76
+ */
77
+ user: {
78
+ name: string;
79
+ color: string;
80
+ };
81
+ /**
82
+ * A Yjs provider (used for awareness / cursor information)
83
+ */
84
+ provider: any;
85
+ /**
86
+ * Optional function to customize how cursors of users are rendered
87
+ */
88
+ renderCursor?: (user: any) => HTMLElement;
89
+ };
65
90
  _tiptapOptions: any;
66
91
  };
67
92
  export declare class BlockNoteEditor {
93
+ private readonly options;
68
94
  readonly _tiptapEditor: TiptapEditor & {
69
95
  contentComponent: any;
70
96
  };
@@ -224,4 +250,11 @@ export declare class BlockNoteEditor {
224
250
  * @returns The blocks parsed from the Markdown string.
225
251
  */
226
252
  markdownToBlocks(markdown: string): Promise<Block[]>;
253
+ /**
254
+ * Updates the user info for the current user that's shown to other collaborators.
255
+ */
256
+ updateCollaborationUserInfo(user: {
257
+ name: string;
258
+ color: string;
259
+ }): void;
227
260
  }
@@ -1,5 +1,6 @@
1
1
  import { Extensions } from "@tiptap/core";
2
2
  import { BlockNoteEditor } from "./BlockNoteEditor";
3
+ import * as Y from "yjs";
3
4
  import { BlockSideMenuFactory } from "./extensions/DraggableBlocks/BlockSideMenuFactoryTypes";
4
5
  import { FormattingToolbarFactory } from "./extensions/FormattingToolbar/FormattingToolbarFactoryTypes";
5
6
  import { HyperlinkToolbarFactory } from "./extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes";
@@ -18,4 +19,13 @@ export declare const getBlockNoteExtensions: (opts: {
18
19
  editor: BlockNoteEditor;
19
20
  uiFactories: UiFactories;
20
21
  slashCommands: BaseSlashMenuItem[];
22
+ collaboration?: {
23
+ fragment: Y.XmlFragment;
24
+ user: {
25
+ name: string;
26
+ color: string;
27
+ };
28
+ provider: any;
29
+ renderCursor?: ((user: any) => HTMLElement) | undefined;
30
+ } | undefined;
21
31
  }) => Extensions;
@@ -0,0 +1,15 @@
1
+ import { Node } from "@tiptap/core";
2
+ import { NodeViewRendererProps } from "@tiptap/core";
3
+ export type CustomBlock = {
4
+ name: string;
5
+ priority?: number;
6
+ atom?: boolean;
7
+ selectable?: boolean;
8
+ className?: string;
9
+ props?: Record<string, string>;
10
+ element: (props: NodeViewRendererProps) => {
11
+ element: HTMLElement;
12
+ editable?: HTMLElement;
13
+ };
14
+ };
15
+ export declare function createCustomBlock(customBlock: CustomBlock): Node<CustomBlock, any>;
@@ -0,0 +1,13 @@
1
+ export declare const Alert: import("./blockTypes").BlockSpec<"alert", {
2
+ readonly textAlignment: {
3
+ default: "left";
4
+ values: readonly ["left", "center", "right", "justify"];
5
+ };
6
+ readonly textColor: {
7
+ default: "black";
8
+ };
9
+ readonly type: {
10
+ readonly default: "warning";
11
+ readonly values: readonly ["warning", "error", "info", "success"];
12
+ };
13
+ }>;
@@ -0,0 +1,13 @@
1
+ export declare const Alert2: import("./blockTypes").BlockSpec<"alert2", {
2
+ readonly textAlignment: {
3
+ default: "left";
4
+ values: readonly ["left", "center", "right", "justify"];
5
+ };
6
+ readonly textColor: {
7
+ default: "black";
8
+ };
9
+ readonly type: {
10
+ readonly default: "warning";
11
+ readonly values: readonly ["warning", "error", "info", "success"];
12
+ };
13
+ }>;
@@ -0,0 +1,15 @@
1
+ import { Attribute, Extension } from "@tiptap/core";
2
+ import { BlockConfig, BlockSchema, BlockSpec, PropSchema, TipTapNode, TipTapNodeConfig } from "./blockTypes";
3
+ export declare function propsToAttributes<BType extends string, PSchema extends PropSchema, ContainsInlineContent extends boolean, BSchema extends BlockSchema>(blockConfig: Omit<BlockConfig<BType, PSchema, ContainsInlineContent, BSchema>, "render">): Record<string, Attribute>;
4
+ export declare function parse<BType extends string, PSchema extends PropSchema, ContainsInlineContent extends boolean, BSchema extends BlockSchema>(blockConfig: Omit<BlockConfig<BType, PSchema, ContainsInlineContent, BSchema>, "render">): {
5
+ getAttrs: (node: HTMLElement | string) => false | import("./blockTypes").Props<PSchema>;
6
+ }[] | {
7
+ tag: string;
8
+ }[];
9
+ export declare function render<BType extends string, PSchema extends PropSchema, ContainsInlineContent extends boolean, BSchema extends BlockSchema>(blockConfig: Omit<BlockConfig<BType, PSchema, ContainsInlineContent, BSchema>, "render">, HTMLAttributes: Record<string, any>): {
10
+ dom: HTMLDivElement;
11
+ contentDOM: HTMLDivElement | undefined;
12
+ };
13
+ export declare function createBlockSpec<BType extends string, PSchema extends PropSchema, ContainsInlineContent extends boolean, BSchema extends BlockSchema>(blockConfig: BlockConfig<BType, PSchema, ContainsInlineContent, BSchema>): BlockSpec<BType, PSchema>;
14
+ export declare function createTipTapBlock<Type extends string>(config: TipTapNodeConfig<Type>): TipTapNode<Type>;
15
+ export declare const CustomBlockSerializerExtension: Extension<any, any>;
@@ -0,0 +1,81 @@
1
+ import { TypesMatch } from "./blockTypes";
2
+ export declare const defaultProps: {
3
+ backgroundColor: {
4
+ default: "transparent";
5
+ };
6
+ textColor: {
7
+ default: "black";
8
+ };
9
+ textAlignment: {
10
+ default: "left";
11
+ values: readonly ["left", "center", "right", "justify"];
12
+ };
13
+ };
14
+ export type DefaultProps = typeof defaultProps;
15
+ export declare const defaultBlockSchema: {
16
+ readonly paragraph: {
17
+ readonly propSchema: {
18
+ backgroundColor: {
19
+ default: "transparent";
20
+ };
21
+ textColor: {
22
+ default: "black";
23
+ };
24
+ textAlignment: {
25
+ default: "left";
26
+ values: readonly ["left", "center", "right", "justify"];
27
+ };
28
+ };
29
+ readonly node: import("./blockTypes").TipTapNode<"paragraph">;
30
+ };
31
+ readonly heading: {
32
+ readonly propSchema: {
33
+ readonly level: {
34
+ readonly default: "1";
35
+ readonly values: readonly ["1", "2", "3"];
36
+ };
37
+ readonly backgroundColor: {
38
+ default: "transparent";
39
+ };
40
+ readonly textColor: {
41
+ default: "black";
42
+ };
43
+ readonly textAlignment: {
44
+ default: "left";
45
+ values: readonly ["left", "center", "right", "justify"];
46
+ };
47
+ };
48
+ readonly node: import("./blockTypes").TipTapNode<"heading">;
49
+ };
50
+ readonly bulletListItem: {
51
+ readonly propSchema: {
52
+ backgroundColor: {
53
+ default: "transparent";
54
+ };
55
+ textColor: {
56
+ default: "black";
57
+ };
58
+ textAlignment: {
59
+ default: "left";
60
+ values: readonly ["left", "center", "right", "justify"];
61
+ };
62
+ };
63
+ readonly node: import("./blockTypes").TipTapNode<"bulletListItem">;
64
+ };
65
+ readonly numberedListItem: {
66
+ readonly propSchema: {
67
+ backgroundColor: {
68
+ default: "transparent";
69
+ };
70
+ textColor: {
71
+ default: "black";
72
+ };
73
+ textAlignment: {
74
+ default: "left";
75
+ values: readonly ["left", "center", "right", "justify"];
76
+ };
77
+ };
78
+ readonly node: import("./blockTypes").TipTapNode<"numberedListItem">;
79
+ };
80
+ };
81
+ export type DefaultBlockSchema = TypesMatch<typeof defaultBlockSchema>;
@@ -0,0 +1,2 @@
1
+ import { Node } from "@tiptap/core";
2
+ export declare const TableCol: Node<any, any>;
@@ -0,0 +1,2 @@
1
+ import { Node } from "@tiptap/core";
2
+ export declare const TableContent: Node<any, any>;
@@ -0,0 +1,2 @@
1
+ import { Node } from "@tiptap/core";
2
+ export declare const TableRow: Node<any, any>;