A React Rich Text Editor that's block-based (Notion style) and extensible. Built on top of Prosemirror and Tiptap.
keydown
handler from suggestion plugin by @matthewlipski in https://github.com/TypeCellOS/BlockNote/pull/682
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.12.3...v0.12.4
all: unset
from default styles by @matthewlipski in https://github.com/TypeCellOS/BlockNote/pull/658
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.12.2...v0.12.3
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.12.1...v0.12.2
setEditable
when not necessary by @YousefED in https://github.com/TypeCellOS/BlockNote/pull/635
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.12.0...v0.12.1
v0.12 is a big one, which unlocks a number of highly requested features (and fixes) 🥳! As part of this, we're also shipping a brand new website with plenty of updated examples and completely revised the documentation.
Looking forward to your feedback! Although most of the API has stayed the same, there are a few breaking changes. Let us know in case you have trouble upgrading.
useBlockNote
has been renamed to useCreateBlockNote
. Also, event handlers mostly moved to BlockNoteView
or hooks. onEditorReady
event has been removed as it's no longer needed. See Editor Setup
BlockNoteView
now takes props to disable built-in components. See Editor Setup
[element]Positioner
components have been renamed to [element]Controller
)BlockNoteSchema
to register your custom blocks / styles / inline content. See Custom Schemas
Inter
font to reduce the main bundle size. Add import "@blocknote/core/fonts/inter.css";
separatelyFull Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.11.2...v0.12.0
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.11.1...v0.11.2
package-lock.json
by @matthewlipski in https://github.com/TypeCellOS/BlockNote/pull/536
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.11.0...v0.11.1
replaceBlocks
by @matthewlipski in https://github.com/TypeCellOS/BlockNote/pull/487
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.10.1...v0.11.0
Change import "@blocknote/core/style.css";
to import "@blocknote/react/style.css";
if you're using @blocknote/react
This update changes how themes and styles are applied to the editor. This means if you were previously overriding CSS using the componentStyles
field in a Theme
object, you should convert those styles to CSS rules. See the new theming and styling documentation here.
BlockNoteView
types export by @matthewlipski in https://github.com/TypeCellOS/BlockNote/pull/457
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.10.0...v0.10.1
Some nice new stuff now possible with BlockNote!
Closes https://github.com/TypeCellOS/BlockNote/issues/194
Until now, it was only possible to create your own custom Blocks. Now, you can also create custom Styles and Inline Content. Styles are markup that can be enabled on text (think bold, italic, etc.). Custom Inline Content can be used for "inline blocks", for example for Mentions.
Closes https://github.com/TypeCellOS/BlockNote/issues/267
The copy / paste and Blocks to / from Markdown / HTML system has been overhauled and should be more robust. Copying and pasting of custom blocks is now also supported!
Closes #221 #69 #361 #381 #282 #226 #249
If you're using Custom Blocks (createReactBlockSpec
), there are 3 major changes:
<InlineContent />
element has been removed in favor of contentRef
content: "inline" | "none"
instead of containsInlineContent: boolean
Old (deprecated) code example:
const ImageBlock = createReactBlockSpec({
type: "image",
propSchema: {
src: {
default: "https://via.placeholder.com/1000",
},
},
containsInlineContent: true,
render: ({ block }) => (
<div
style={{
display: "flex",
flexDirection: "column",
}}>
<img
style={{
width: "100%",
}}
src={block.props.src}
alt={"Image"}
contentEditable={false}
/>
<InlineContent />
</div>
),
});
New version:
const ImageBlock = createReactBlockSpec({
type: "image",
propSchema: {
src: {
default: "https://via.placeholder.com/1000",
},
},
content: "inline"
}, {
render: ({ block, contentRef }) => (
<div
style={{
display: "flex",
flexDirection: "column",
}}>
<img
style={{
width: "100%",
}}
src={block.props.src}
alt={"Image"}
contentEditable={false}
/>
<span ref={contentRef} />
</div>
),
});
Additionally, blockSchema
s are now blockSpecs
, so to pass in the blocks that you want the editor to use:
const editor = useBlockNote({
blockSpecs: {
...defaultBlockSpecs,
image: ImageBlock
}
});
In functions that still require a BlockSchema
type, you can use the getBlockSchemaFromSpecs
function, e.g. for getDefaultReactSlashMenuItems
:
const blockSpecs = {
...defaultBlockSpecs,
image: ImageBlock
}
const blockSchema = getBlockSchemaFromSpecs(blockSpecs);
const editor = useBlockNote({
blockSpecs: blockSpecs,
slashMenuItems: {
...getDefaultReactSlashMenuItems(blockSchema),
insertImageBlock
}
});
To better indicate the conversion to / from Markdown and HTML is lossy, the following functions have been renamed:
editor.blocksToHTML
-> editor.blocksToHTMLLossy
editor.HTMLToBlocks
-> editor.tryParseHTMLToBlocks
editor.blocksToMarkdown
-> editor.blocksToMarkdownLossy
editor.markdownToBlocks
-> editor.tryParseMarkdownToBlocks
Instead of new BlockNoteEditor(...)
, now use BlockNoteEditor.create(...)
Full Changelog: https://github.com/TypeCellOS/BlockNote/compare/v0.9.6...v0.10.0