@blocknote/core 0.2.2 → 0.2.4-alpha.7

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 (89) hide show
  1. package/dist/blocknote.js +1061 -936
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +1 -1
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/style.css +1 -1
  6. package/package.json +22 -29
  7. package/src/BlockNoteExtensions.ts +11 -10
  8. package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +61 -0
  9. package/src/extensions/BackgroundColor/BackgroundColorMark.ts +62 -0
  10. package/src/extensions/Blocks/PreviousBlockTypePlugin.ts +112 -106
  11. package/src/extensions/Blocks/apiTypes.ts +48 -0
  12. package/src/extensions/Blocks/helpers/findBlock.ts +3 -1
  13. package/src/extensions/Blocks/helpers/getBlockInfoFromPos.ts +1 -1
  14. package/src/extensions/Blocks/index.ts +10 -8
  15. package/src/extensions/Blocks/nodes/Block.module.css +122 -35
  16. package/src/extensions/Blocks/{BlockAttributes.ts → nodes/BlockAttributes.ts} +0 -0
  17. package/src/extensions/Blocks/nodes/{Block.ts → BlockContainer.ts} +113 -119
  18. package/src/extensions/Blocks/nodes/{BlockTypes/HeadingBlock/HeadingContent.ts → BlockContent/HeadingBlockContent/HeadingBlockContent.ts} +16 -24
  19. package/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +76 -0
  20. package/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.ts +47 -0
  21. package/src/extensions/Blocks/nodes/{BlockTypes/ListItemBlock/OrderedListItemIndexPlugin.ts → BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts} +10 -14
  22. package/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +95 -0
  23. package/src/extensions/Blocks/nodes/{BlockTypes/TextBlock/TextContent.ts → BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts} +7 -12
  24. package/src/extensions/Blocks/nodes/BlockGroup.ts +4 -4
  25. package/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts +9 -1
  26. package/src/extensions/DraggableBlocks/DraggableBlocksPlugin.ts +87 -42
  27. package/src/extensions/{Blocks → DraggableBlocks}/MultipleNodeSelection.ts +0 -0
  28. package/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.ts +20 -7
  29. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +51 -12
  30. package/src/extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes.ts +1 -1
  31. package/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.ts +3 -1
  32. package/src/extensions/Placeholder/PlaceholderExtension.ts +1 -1
  33. package/src/extensions/SlashMenu/SlashMenuExtension.ts +1 -1
  34. package/src/extensions/SlashMenu/SlashMenuItem.ts +3 -28
  35. package/src/extensions/SlashMenu/defaultCommands.tsx +36 -55
  36. package/src/extensions/SlashMenu/index.ts +1 -6
  37. package/src/extensions/TextAlignment/TextAlignmentExtension.ts +75 -0
  38. package/src/extensions/TextColor/TextColorExtension.ts +54 -0
  39. package/src/extensions/TextColor/TextColorMark.ts +62 -0
  40. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +4 -4
  41. package/src/extensions/UniqueID/UniqueID.ts +6 -0
  42. package/src/index.ts +2 -1
  43. package/src/shared/EditorElement.ts +12 -6
  44. package/src/shared/plugins/suggestion/SuggestionItem.ts +0 -9
  45. package/src/shared/plugins/suggestion/SuggestionPlugin.ts +191 -228
  46. package/src/shared/plugins/suggestion/SuggestionsMenuFactoryTypes.ts +2 -2
  47. package/types/src/BlockNoteEditor.d.ts +1 -1
  48. package/types/src/BlockNoteExtensions.d.ts +1 -3
  49. package/types/src/api/Document.d.ts +5 -0
  50. package/types/src/extensions/BackgroundColor/BackgroundColorExtension.d.ts +9 -0
  51. package/types/src/extensions/BackgroundColor/BackgroundColorMark.d.ts +9 -0
  52. package/types/src/extensions/Blocks/PreviousBlockTypePlugin.d.ts +3 -2
  53. package/types/src/extensions/Blocks/apiTypes.d.ts +16 -0
  54. package/types/src/extensions/Blocks/helpers/getBlockInfoFromPos.d.ts +1 -1
  55. package/types/src/extensions/Blocks/nodes/BlockAttributes.d.ts +2 -0
  56. package/types/src/extensions/Blocks/nodes/BlockContainer.d.ts +21 -0
  57. package/types/src/extensions/Blocks/nodes/BlockContent/BlockContentTypes.d.ts +4 -0
  58. package/types/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.d.ts +2 -0
  59. package/types/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContentTypes.d.ts +4 -0
  60. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +2 -0
  61. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContentTypes.d.ts +2 -0
  62. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/ListItemKeyboardShortcuts.d.ts +2 -0
  63. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.d.ts +2 -0
  64. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +2 -0
  65. package/types/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContentTypes.d.ts +2 -0
  66. package/types/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.d.ts +2 -0
  67. package/types/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContentTypes.d.ts +2 -0
  68. package/types/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.d.ts +9 -5
  69. package/types/src/extensions/DraggableBlocks/DraggableBlocksExtension.d.ts +1 -1
  70. package/types/src/extensions/DraggableBlocks/DraggableBlocksPlugin.d.ts +6 -11
  71. package/types/src/extensions/DraggableBlocks/MultipleNodeSelection.d.ts +24 -0
  72. package/types/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.d.ts +18 -8
  73. package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +1 -1
  74. package/types/src/extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes.d.ts +5 -5
  75. package/types/src/extensions/HyperlinkToolbar/HyperlinkToolbarPlugin.d.ts +2 -2
  76. package/types/src/extensions/SlashMenu/SlashMenuExtension.d.ts +1 -1
  77. package/types/src/extensions/SlashMenu/SlashMenuItem.d.ts +2 -19
  78. package/types/src/extensions/SlashMenu/defaultSlashCommands.d.ts +5 -0
  79. package/types/src/extensions/SlashMenu/index.d.ts +1 -2
  80. package/types/src/extensions/TextAlignment/TextAlignmentExtension.d.ts +9 -0
  81. package/types/src/extensions/TextColor/TextColorExtension.d.ts +9 -0
  82. package/types/src/extensions/TextColor/TextColorMark.d.ts +9 -0
  83. package/types/src/index.d.ts +2 -1
  84. package/types/src/shared/EditorElement.d.ts +6 -2
  85. package/types/src/shared/plugins/suggestion/SuggestionItem.d.ts +0 -6
  86. package/types/src/shared/plugins/suggestion/SuggestionPlugin.d.ts +11 -25
  87. package/types/src/shared/plugins/suggestion/SuggestionsMenuFactoryTypes.d.ts +6 -6
  88. package/src/extensions/Blocks/nodes/BlockTypes/ListItemBlock/ListItemContent.ts +0 -177
  89. package/src/extensions/Paragraph/FixedParagraph.ts +0 -12
@@ -1,11 +1,6 @@
1
1
  import { SlashMenuExtension } from "./SlashMenuExtension";
2
2
  import defaultCommands from "./defaultCommands";
3
- import { SlashMenuGroups, SlashMenuItem } from "./SlashMenuItem";
4
3
 
5
- export {
6
- defaultCommands,
7
- SlashMenuItem as SlashCommand,
8
- SlashMenuGroups as CommandGroup,
9
- };
4
+ export { defaultCommands };
10
5
 
11
6
  export default SlashMenuExtension;
@@ -0,0 +1,75 @@
1
+ import { Extension } from "@tiptap/core";
2
+ import { getBlockInfoFromPos } from "../Blocks/helpers/getBlockInfoFromPos";
3
+
4
+ declare module "@tiptap/core" {
5
+ interface Commands<ReturnType> {
6
+ textAlignment: {
7
+ setTextAlignment: (
8
+ textAlignment: "left" | "center" | "right" | "justify"
9
+ ) => ReturnType;
10
+ };
11
+ }
12
+ }
13
+
14
+ export const TextAlignmentExtension = Extension.create({
15
+ name: "textAlignment",
16
+
17
+ addGlobalAttributes() {
18
+ return [
19
+ {
20
+ // Attribute is applied to block content instead of container so that child blocks don't inherit the text
21
+ // alignment styling.
22
+ types: ["paragraph", "heading", "bulletListItem", "numberedListItem"],
23
+ attributes: {
24
+ textAlignment: {
25
+ default: "left",
26
+ parseHTML: (element) => element.getAttribute("data-text-alignment"),
27
+ renderHTML: (attributes) =>
28
+ attributes.textAlignment !== "left" && {
29
+ "data-text-alignment": attributes.textAlignment,
30
+ },
31
+ },
32
+ },
33
+ },
34
+ ];
35
+ },
36
+
37
+ addCommands() {
38
+ return {
39
+ setTextAlignment:
40
+ (textAlignment) =>
41
+ ({ state }) => {
42
+ const positionsBeforeSelectedContent = [];
43
+
44
+ const blockInfo = getBlockInfoFromPos(
45
+ state.doc,
46
+ state.selection.from
47
+ );
48
+ if (blockInfo === undefined) {
49
+ return false;
50
+ }
51
+
52
+ // Finds all blockContent nodes that the current selection is in.
53
+ let pos = blockInfo.startPos;
54
+ while (pos < state.selection.to) {
55
+ if (
56
+ state.doc.resolve(pos).node().type.spec.group === "blockContent"
57
+ ) {
58
+ positionsBeforeSelectedContent.push(pos - 1);
59
+
60
+ pos += state.doc.resolve(pos).node().nodeSize - 1;
61
+ } else {
62
+ pos += 1;
63
+ }
64
+ }
65
+
66
+ // Sets text alignment for all blockContent nodes that the current selection is in.
67
+ for (const pos of positionsBeforeSelectedContent) {
68
+ state.tr.setNodeAttribute(pos, "textAlignment", textAlignment);
69
+ }
70
+
71
+ return true;
72
+ },
73
+ };
74
+ },
75
+ });
@@ -0,0 +1,54 @@
1
+ import { Extension } from "@tiptap/core";
2
+ import { getBlockInfoFromPos } from "../Blocks/helpers/getBlockInfoFromPos";
3
+
4
+ declare module "@tiptap/core" {
5
+ interface Commands<ReturnType> {
6
+ blockTextColor: {
7
+ setBlockTextColor: (posInBlock: number, color: string) => ReturnType;
8
+ };
9
+ }
10
+ }
11
+
12
+ export const TextColorExtension = Extension.create({
13
+ name: "blockTextColor",
14
+
15
+ addGlobalAttributes() {
16
+ return [
17
+ {
18
+ types: ["blockContainer"],
19
+ attributes: {
20
+ textColor: {
21
+ default: "default",
22
+ parseHTML: (element) =>
23
+ element.hasAttribute("data-text-color")
24
+ ? element.getAttribute("data-text-color")
25
+ : "default",
26
+ renderHTML: (attributes) =>
27
+ attributes.textColor !== "default" && {
28
+ "data-text-color": attributes.textColor,
29
+ },
30
+ },
31
+ },
32
+ },
33
+ ];
34
+ },
35
+
36
+ addCommands() {
37
+ return {
38
+ setBlockTextColor:
39
+ (posInBlock, color) =>
40
+ ({ state, view }) => {
41
+ const blockInfo = getBlockInfoFromPos(state.doc, posInBlock);
42
+ if (blockInfo === undefined) {
43
+ return false;
44
+ }
45
+
46
+ state.tr.setNodeAttribute(blockInfo.startPos - 1, "textColor", color);
47
+
48
+ view.focus();
49
+
50
+ return true;
51
+ },
52
+ };
53
+ },
54
+ });
@@ -0,0 +1,62 @@
1
+ import { Mark } from "@tiptap/core";
2
+
3
+ declare module "@tiptap/core" {
4
+ interface Commands<ReturnType> {
5
+ textColor: {
6
+ setTextColor: (color: string) => ReturnType;
7
+ };
8
+ }
9
+ }
10
+
11
+ export const TextColorMark = Mark.create({
12
+ name: "textColor",
13
+
14
+ addAttributes() {
15
+ return {
16
+ color: {
17
+ default: undefined,
18
+ parseHTML: (element) => element.getAttribute("data-text-color"),
19
+ renderHTML: (attributes) => ({
20
+ "data-text-color": attributes.color,
21
+ }),
22
+ },
23
+ };
24
+ },
25
+
26
+ parseHTML() {
27
+ return [
28
+ {
29
+ tag: "span",
30
+ getAttrs: (element) => {
31
+ if (typeof element === "string") {
32
+ return false;
33
+ }
34
+
35
+ if (element.hasAttribute("data-text-color")) {
36
+ return { color: element.getAttribute("data-text-color") };
37
+ }
38
+
39
+ return false;
40
+ },
41
+ },
42
+ ];
43
+ },
44
+
45
+ renderHTML({ HTMLAttributes }) {
46
+ return ["span", HTMLAttributes, 0];
47
+ },
48
+
49
+ addCommands() {
50
+ return {
51
+ setTextColor:
52
+ (color) =>
53
+ ({ commands }) => {
54
+ if (color !== "default") {
55
+ return commands.setMark(this.name, { color: color });
56
+ }
57
+
58
+ return commands.unsetMark(this.name);
59
+ },
60
+ };
61
+ },
62
+ });
@@ -32,8 +32,8 @@ export const TrailingNode = Extension.create<TrailingNodeOptions>({
32
32
  const { doc, tr, schema } = state;
33
33
  const shouldInsertNodeAtEnd = plugin.getState(state);
34
34
  const endPosition = doc.content.size - 2;
35
- const type = schema.nodes["block"];
36
- const contentType = schema.nodes["textContent"];
35
+ const type = schema.nodes["blockContainer"];
36
+ const contentType = schema.nodes["paragraph"];
37
37
  if (!shouldInsertNodeAtEnd) {
38
38
  return;
39
39
  }
@@ -61,8 +61,8 @@ export const TrailingNode = Extension.create<TrailingNodeOptions>({
61
61
 
62
62
  lastNode = lastNode.lastChild;
63
63
 
64
- if (!lastNode || lastNode.type.name !== "block") {
65
- throw new Error("Expected block");
64
+ if (!lastNode || lastNode.type.name !== "blockContainer") {
65
+ throw new Error("Expected blockContainer");
66
66
  }
67
67
  return lastNode.nodeSize > 4; // empty <block><content/></block> is length 4
68
68
  },
@@ -75,6 +75,12 @@ const UniqueID = Extension.create({
75
75
  attributes: {
76
76
  [this.options.attributeName]: {
77
77
  default: null,
78
+ parseHTML: (element) =>
79
+ element.getAttribute(`data-${this.options.attributeName}`),
80
+ renderHTML: (attributes) => ({
81
+ [`data-${this.options.attributeName}`]:
82
+ attributes[this.options.attributeName],
83
+ }),
78
84
  },
79
85
  },
80
86
  },
package/src/index.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export * from "./BlockNoteEditor";
2
2
  export * from "./BlockNoteExtensions";
3
- export type { BlockContentType } from "./extensions/Blocks/nodes/Block";
3
+ export type { Block, BlockUpdate } from "./extensions/Blocks/apiTypes";
4
4
  export * from "./extensions/FormattingToolbar/FormattingToolbarFactoryTypes";
5
5
  export * from "./extensions/DraggableBlocks/BlockSideMenuFactoryTypes";
6
6
  export * from "./extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes";
7
7
  export * from "./extensions/SlashMenu/SlashMenuItem";
8
+ export * from "./shared/EditorElement";
8
9
  export type { SuggestionItem } from "./shared/plugins/suggestion/SuggestionItem";
9
10
  export * from "./shared/plugins/suggestion/SuggestionsMenuFactoryTypes";
@@ -1,10 +1,16 @@
1
- export type EditorElement<ElementDynamicParams extends Record<string, any>> = {
2
- element: HTMLElement | undefined;
3
- render: (params: ElementDynamicParams, isHidden: boolean) => void;
4
- hide: () => void;
1
+ export type RequiredStaticParams = Record<string, any>;
2
+ export type RequiredDynamicParams = Record<string, any> & {
3
+ referenceRect: DOMRect;
5
4
  };
6
5
 
6
+ export type EditorElement<ElementDynamicParams extends RequiredDynamicParams> =
7
+ {
8
+ element: HTMLElement | undefined;
9
+ render: (params: ElementDynamicParams, isHidden: boolean) => void;
10
+ hide: () => void;
11
+ };
12
+
7
13
  export type ElementFactory<
8
- ElementStaticParams extends Record<string, any>,
9
- ElementDynamicParams extends Record<string, any>
14
+ ElementStaticParams extends RequiredStaticParams,
15
+ ElementDynamicParams extends RequiredDynamicParams
10
16
  > = (staticParams: ElementStaticParams) => EditorElement<ElementDynamicParams>;
@@ -7,15 +7,6 @@ export interface SuggestionItem {
7
7
  */
8
8
  name: string;
9
9
 
10
- /**
11
- * The name of the group to which this item belongs
12
- */
13
- groupName: string;
14
-
15
- hint?: string;
16
-
17
- shortcut?: string;
18
-
19
10
  /**
20
11
  * This function matches this item against a query string, the function should return **true** if the item
21
12
  * matches the query or **false** otherwise.