From a17f479c3a754ee761cbbdeefc8f83e049468752 Mon Sep 17 00:00:00 2001
From: Nick the Sick
Date: Thu, 18 Sep 2025 15:48:44 +0200
Subject: [PATCH 1/5] fix(core): input rules can handle when a new block is
empty now
---
packages/core/src/editor/BlockNoteEditor.ts | 38 +++++++++++----------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/packages/core/src/editor/BlockNoteEditor.ts b/packages/core/src/editor/BlockNoteEditor.ts
index 93b7c11193..2523288e43 100644
--- a/packages/core/src/editor/BlockNoteEditor.ts
+++ b/packages/core/src/editor/BlockNoteEditor.ts
@@ -794,29 +794,31 @@ export class BlockNoteEditor<
editor: this,
});
if (replaceWith) {
- const blockInfo = getBlockInfoFromTransaction(
- state.tr,
- );
+ const cursorPosition =
+ this.getTextCursorPosition();
- // TODO this is weird, why do we need it?
if (
- blockInfo.isBlockContainer &&
- blockInfo.blockContent.node.type.spec
- .content === "inline*"
+ this.schema.blockSchema[
+ cursorPosition.block.type
+ ].content !== "inline"
) {
- const tr = state.tr.deleteRange(
- range.from,
- range.to,
- );
- updateBlockTr(
- tr,
- blockInfo.bnBlock.beforePos,
- replaceWith,
- range.from,
- range.to,
- );
return undefined;
}
+
+ const blockInfo = getBlockInfoFromTransaction(
+ state.tr,
+ );
+ const tr = state.tr.deleteRange(
+ range.from,
+ range.to,
+ );
+
+ updateBlockTr(
+ tr,
+ blockInfo.bnBlock.beforePos,
+ replaceWith,
+ );
+ return undefined;
}
return null;
},
From 3f2020b26fdf81ef33a68d221068b13ddf7b68c5 Mon Sep 17 00:00:00 2001
From: Nick the Sick
Date: Thu, 18 Sep 2025 15:47:59 +0200
Subject: [PATCH 2/5] feat(divider): add a divider block
---
packages/core/src/blocks/Divider/block.ts | 49 +++++++++++++++++++
packages/core/src/blocks/defaultBlocks.ts | 30 ++++++------
packages/core/src/blocks/index.ts | 1 +
packages/core/src/editor/Block.css | 8 +++
.../getDefaultSlashMenuItems.ts | 10 ++++
packages/core/src/i18n/locales/ar.ts | 6 +++
packages/core/src/i18n/locales/de.ts | 6 +++
packages/core/src/i18n/locales/en.ts | 6 +++
packages/core/src/i18n/locales/es.ts | 6 +++
packages/core/src/i18n/locales/fr.ts | 6 +++
packages/core/src/i18n/locales/he.ts | 6 +++
packages/core/src/i18n/locales/hr.ts | 6 +++
packages/core/src/i18n/locales/is.ts | 6 +++
packages/core/src/i18n/locales/it.ts | 6 +++
packages/core/src/i18n/locales/ja.ts | 6 +++
packages/core/src/i18n/locales/ko.ts | 6 +++
packages/core/src/i18n/locales/nl.ts | 6 +++
packages/core/src/i18n/locales/no.ts | 6 +++
packages/core/src/i18n/locales/pl.ts | 6 +++
packages/core/src/i18n/locales/pt.ts | 6 +++
packages/core/src/i18n/locales/ru.ts | 6 +++
packages/core/src/i18n/locales/sk.ts | 6 +++
packages/core/src/i18n/locales/uk.ts | 6 +++
packages/core/src/i18n/locales/vi.ts | 6 +++
packages/core/src/i18n/locales/zh-tw.ts | 6 +++
packages/core/src/i18n/locales/zh.ts | 6 +++
.../getDefaultReactSlashMenuItems.tsx | 2 +
27 files changed, 212 insertions(+), 14 deletions(-)
create mode 100644 packages/core/src/blocks/Divider/block.ts
diff --git a/packages/core/src/blocks/Divider/block.ts b/packages/core/src/blocks/Divider/block.ts
new file mode 100644
index 0000000000..3de2211d3f
--- /dev/null
+++ b/packages/core/src/blocks/Divider/block.ts
@@ -0,0 +1,49 @@
+import { createBlockNoteExtension } from "../../editor/BlockNoteExtension.js";
+import { createBlockConfig, createBlockSpec } from "../../schema/index.js";
+
+export type DividerBlockConfig = ReturnType;
+
+export const createDividerBlockConfig = createBlockConfig(
+ () =>
+ ({
+ type: "divider" as const,
+ propSchema: {},
+ content: "none",
+ }) as const,
+);
+
+export const createDividerBlockSpec = createBlockSpec(
+ createDividerBlockConfig,
+ {
+ meta: {
+ isolating: false,
+ },
+ parse(element) {
+ if (element.tagName === "HR") {
+ return {};
+ }
+
+ return undefined;
+ },
+ render() {
+ const dom = document.createElement("hr");
+
+ return {
+ dom,
+ };
+ },
+ },
+ [
+ createBlockNoteExtension({
+ key: "divider-block-shortcuts",
+ inputRules: [
+ {
+ find: new RegExp(`^---$`),
+ replace() {
+ return { type: "divider", props: {}, content: [] };
+ },
+ },
+ ],
+ }),
+ ],
+);
diff --git a/packages/core/src/blocks/defaultBlocks.ts b/packages/core/src/blocks/defaultBlocks.ts
index a2d01b92df..459b987f00 100644
--- a/packages/core/src/blocks/defaultBlocks.ts
+++ b/packages/core/src/blocks/defaultBlocks.ts
@@ -3,11 +3,26 @@ import Code from "@tiptap/extension-code";
import Italic from "@tiptap/extension-italic";
import Strike from "@tiptap/extension-strike";
import Underline from "@tiptap/extension-underline";
+import { COLORS_DEFAULT } from "../editor/defaultColors.js";
+import {
+ BlockNoDefaults,
+ BlockSchema,
+ InlineContentSchema,
+ InlineContentSpecs,
+ PartialBlockNoDefaults,
+ StyleSchema,
+ StyleSpecs,
+ createStyleSpec,
+ createStyleSpecFromTipTapMark,
+ getInlineContentSchemaFromSpecs,
+ getStyleSchemaFromSpecs,
+} from "../schema/index.js";
import {
createAudioBlockSpec,
createBulletListItemBlockSpec,
createCheckListItemBlockSpec,
createCodeBlockSpec,
+ createDividerBlockSpec,
createFileBlockSpec,
createHeadingBlockSpec,
createImageBlockSpec,
@@ -18,27 +33,14 @@ import {
createVideoBlockSpec,
defaultProps,
} from "./index.js";
-import {
- BlockNoDefaults,
- BlockSchema,
- InlineContentSchema,
- InlineContentSpecs,
- PartialBlockNoDefaults,
- StyleSchema,
- StyleSpecs,
- createStyleSpec,
- createStyleSpecFromTipTapMark,
- getInlineContentSchemaFromSpecs,
- getStyleSchemaFromSpecs,
-} from "../schema/index.js";
import { createTableBlockSpec } from "./Table/block.js";
-import { COLORS_DEFAULT } from "../editor/defaultColors.js";
export const defaultBlockSpecs = {
audio: createAudioBlockSpec(),
bulletListItem: createBulletListItemBlockSpec(),
checkListItem: createCheckListItemBlockSpec(),
codeBlock: createCodeBlockSpec(),
+ divider: createDividerBlockSpec(),
file: createFileBlockSpec(),
heading: createHeadingBlockSpec(),
image: createImageBlockSpec(),
diff --git a/packages/core/src/blocks/index.ts b/packages/core/src/blocks/index.ts
index 7d8a9fc3c4..56f4c6de3c 100644
--- a/packages/core/src/blocks/index.ts
+++ b/packages/core/src/blocks/index.ts
@@ -1,6 +1,7 @@
export * from "./Audio/block.js";
export * from "./Audio/parseAudioElement.js";
export * from "./Code/block.js";
+export * from "./Divider/block.js";
export * from "./File/block.js";
export * from "./Heading/block.js";
export * from "./Image/block.js";
diff --git a/packages/core/src/editor/Block.css b/packages/core/src/editor/Block.css
index f882ba0559..fdf4d31123 100644
--- a/packages/core/src/editor/Block.css
+++ b/packages/core/src/editor/Block.css
@@ -184,6 +184,14 @@ NESTED BLOCKS
padding-left: 1em;
}
+/* DIVIDERS */
+[data-content-type="divider"] hr {
+ border: none;
+ border-top: 1px solid rgb(125, 121, 122);
+ margin: 0.5em 0;
+ flex: 1;
+}
+
/* LISTS */
.bn-block-content::before {
diff --git a/packages/core/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts b/packages/core/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts
index 26748a35dd..921d181d1a 100644
--- a/packages/core/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts
+++ b/packages/core/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts
@@ -215,6 +215,16 @@ export function getDefaultSlashMenuItems<
});
}
+ if (editorHasBlockWithType(editor, "divider")) {
+ items.push({
+ onItemClick: () => {
+ insertOrUpdateBlock(editor, { type: "divider" });
+ },
+ key: "divider",
+ ...editor.dictionary.slash_menu.divider,
+ });
+ }
+
if (editorHasBlockWithType(editor, "table")) {
items.push({
onItemClick: () => {
diff --git a/packages/core/src/i18n/locales/ar.ts b/packages/core/src/i18n/locales/ar.ts
index ef9632ff23..00574debed 100644
--- a/packages/core/src/i18n/locales/ar.ts
+++ b/packages/core/src/i18n/locales/ar.ts
@@ -156,6 +156,12 @@ export const ar: Dictionary = {
aliases: ["رمز تعبيري", "إيموجي", "إيموت", "عاطفة", "وجه"],
group: "آخرون",
},
+ divider: {
+ title: "فاصل",
+ subtext: "يستخدم لفصل الكتل",
+ aliases: ["فاصل", "فاصل", "فاصل", "فاصل"],
+ group: "الكتل الأساسية",
+ },
},
placeholders: {
default: "أدخل نصًا أو اكتب '/' للأوامر",
diff --git a/packages/core/src/i18n/locales/de.ts b/packages/core/src/i18n/locales/de.ts
index 511e8a1fb3..cac48dd80a 100644
--- a/packages/core/src/i18n/locales/de.ts
+++ b/packages/core/src/i18n/locales/de.ts
@@ -191,6 +191,12 @@ export const de: Dictionary = {
aliases: ["emoji", "emote", "emotion", "gesicht"],
group: "Andere",
},
+ divider: {
+ title: "Trennlinie",
+ subtext: "Trennlinie zwischen Blöcken",
+ aliases: ["trennlinie", "hr", "horizontal rule"],
+ group: "Grundlegende Blöcke",
+ },
},
placeholders: {
default: "Text eingeben oder '/' für Befehle tippen",
diff --git a/packages/core/src/i18n/locales/en.ts b/packages/core/src/i18n/locales/en.ts
index fee176d7e8..af7927d207 100644
--- a/packages/core/src/i18n/locales/en.ts
+++ b/packages/core/src/i18n/locales/en.ts
@@ -170,6 +170,12 @@ export const en = {
aliases: ["emoji", "emote", "emotion", "face"],
group: "Others",
},
+ divider: {
+ title: "Divider",
+ subtext: "Visually divide blocks",
+ aliases: ["divider", "hr", "line", "horizontal rule"],
+ group: "Basic blocks",
+ },
},
placeholders: {
default: "Enter text or type '/' for commands",
diff --git a/packages/core/src/i18n/locales/es.ts b/packages/core/src/i18n/locales/es.ts
index ab9b2882b7..9e830b406b 100644
--- a/packages/core/src/i18n/locales/es.ts
+++ b/packages/core/src/i18n/locales/es.ts
@@ -171,6 +171,12 @@ export const es: Dictionary = {
aliases: ["emoji", "emoticono", "emoción", "cara"],
group: "Otros",
},
+ divider: {
+ title: "Divisor",
+ subtext: "Divisor de bloques",
+ aliases: ["divisor", "hr", "horizontal rule"],
+ group: "Bloques básicos",
+ },
},
placeholders: {
default: "Escribe o teclea '/' para comandos",
diff --git a/packages/core/src/i18n/locales/fr.ts b/packages/core/src/i18n/locales/fr.ts
index a3f22ebada..b56e6942f6 100644
--- a/packages/core/src/i18n/locales/fr.ts
+++ b/packages/core/src/i18n/locales/fr.ts
@@ -216,6 +216,12 @@ export const fr: Dictionary = {
aliases: ["emoji", "émoticône", "émotion", "visage", "smiley"],
group: "Autres",
},
+ divider: {
+ title: "Diviseur",
+ subtext: "Utilisé pour diviser les blocs",
+ aliases: ["diviseur", "hr", "horizontal rule"],
+ group: "Blocs de base",
+ },
},
placeholders: {
default:
diff --git a/packages/core/src/i18n/locales/he.ts b/packages/core/src/i18n/locales/he.ts
index 98f73573d3..553fc42941 100644
--- a/packages/core/src/i18n/locales/he.ts
+++ b/packages/core/src/i18n/locales/he.ts
@@ -172,6 +172,12 @@ export const he: Dictionary = {
aliases: ["emoji", "emote", "emotion", "face"],
group: "אחר",
},
+ divider: {
+ title: "מחיצה",
+ subtext: "מחיצה בין בלוקים",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "בלוקים בסיסיים",
+ },
},
placeholders: {
default: "הזן טקסט או הקלד '/' לפקודות",
diff --git a/packages/core/src/i18n/locales/hr.ts b/packages/core/src/i18n/locales/hr.ts
index 34c353c009..31c0b71159 100644
--- a/packages/core/src/i18n/locales/hr.ts
+++ b/packages/core/src/i18n/locales/hr.ts
@@ -184,6 +184,12 @@ export const hr: Dictionary = {
aliases: ["emoji", "emotikon", "emocija", "lice"],
group: "Ostalo",
},
+ divider: {
+ title: "Razdjelnik",
+ subtext: "Razdjelnik blokova",
+ aliases: ["razdjelnik", "hr", "horizontal rule"],
+ group: "Osnovni blokovi",
+ },
},
placeholders: {
default: "Unesi tekst ili upiši ‘/’ za naredbe",
diff --git a/packages/core/src/i18n/locales/is.ts b/packages/core/src/i18n/locales/is.ts
index c141c5f7a0..25060d651f 100644
--- a/packages/core/src/i18n/locales/is.ts
+++ b/packages/core/src/i18n/locales/is.ts
@@ -185,6 +185,12 @@ export const is: Dictionary = {
aliases: ["emoji", "andlitsávísun", "tilfinningar", "andlit"],
group: "Annað",
},
+ divider: {
+ title: "Razdjelnik",
+ subtext: "Razdjelnik blokova",
+ aliases: ["razdjelnik", "hr", "horizontal rule"],
+ group: "Osnovni blokovi",
+ },
},
placeholders: {
default: "Sláðu inn texta eða skrifaðu '/' fyrir skipanir",
diff --git a/packages/core/src/i18n/locales/it.ts b/packages/core/src/i18n/locales/it.ts
index 2b654c4396..45d9dcd277 100644
--- a/packages/core/src/i18n/locales/it.ts
+++ b/packages/core/src/i18n/locales/it.ts
@@ -193,6 +193,12 @@ export const it: Dictionary = {
aliases: ["emoji", "emote", "emozione", "faccia"],
group: "Altri",
},
+ divider: {
+ title: "Divisore",
+ subtext: "Divisore di blocchi",
+ aliases: ["divisore", "hr", "horizontal rule"],
+ group: "Blocchi base",
+ },
},
placeholders: {
default: "Inserisci testo o digita '/' per i comandi",
diff --git a/packages/core/src/i18n/locales/ja.ts b/packages/core/src/i18n/locales/ja.ts
index 8fcbbd6306..236b834443 100644
--- a/packages/core/src/i18n/locales/ja.ts
+++ b/packages/core/src/i18n/locales/ja.ts
@@ -211,6 +211,12 @@ export const ja: Dictionary = {
aliases: ["絵文字", "顔文字", "感情表現", "顔"],
group: "その他",
},
+ divider: {
+ title: "区切り",
+ subtext: "区切りを表示するために使用",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "基本ブロック",
+ },
},
placeholders: {
default: "テキストを入力するか'/' を入力してコマンド選択",
diff --git a/packages/core/src/i18n/locales/ko.ts b/packages/core/src/i18n/locales/ko.ts
index 4b5e9dbc6c..cce4c8f7c6 100644
--- a/packages/core/src/i18n/locales/ko.ts
+++ b/packages/core/src/i18n/locales/ko.ts
@@ -184,6 +184,12 @@ export const ko: Dictionary = {
],
group: "기타",
},
+ divider: {
+ title: "구분선",
+ subtext: "구분선 블록",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "기본 블록",
+ },
},
placeholders: {
default: "텍스트를 입력하거나 /를 입력하여 명령을 입력하세요.",
diff --git a/packages/core/src/i18n/locales/nl.ts b/packages/core/src/i18n/locales/nl.ts
index 9f5160f24e..6d1f48cde2 100644
--- a/packages/core/src/i18n/locales/nl.ts
+++ b/packages/core/src/i18n/locales/nl.ts
@@ -172,6 +172,12 @@ export const nl: Dictionary = {
],
group: "Overig",
},
+ divider: {
+ title: "Scheidingslijn",
+ subtext: "Scheidingslijn tussen blokken",
+ aliases: ["scheidingslijn", "hr", "horizontal rule"],
+ group: "Basisblokken",
+ },
},
placeholders: {
default: "Voer tekst in of type '/' voor commando's",
diff --git a/packages/core/src/i18n/locales/no.ts b/packages/core/src/i18n/locales/no.ts
index d9001ef6d5..c28cac2b9f 100644
--- a/packages/core/src/i18n/locales/no.ts
+++ b/packages/core/src/i18n/locales/no.ts
@@ -190,6 +190,12 @@ export const no: Dictionary = {
aliases: ["emoji", "emote", "emosjon", "ansikt"],
group: "Andre",
},
+ divider: {
+ title: "Delingslinje",
+ subtext: "Delingslinje mellom blokker",
+ aliases: ["delingslinje", "hr", "horizontal rule"],
+ group: "Grunnleggende blokker",
+ },
},
placeholders: {
default: "Skriv tekst eller skriv '/' for å vise kommandoer",
diff --git a/packages/core/src/i18n/locales/pl.ts b/packages/core/src/i18n/locales/pl.ts
index 20d02de609..35bf1f255a 100644
--- a/packages/core/src/i18n/locales/pl.ts
+++ b/packages/core/src/i18n/locales/pl.ts
@@ -162,6 +162,12 @@ export const pl: Dictionary = {
aliases: ["emoji", "emotka", "wyrażenie emocji", "twarz"],
group: "Inne",
},
+ divider: {
+ title: "Separator",
+ subtext: "Separator bloków",
+ aliases: ["separator", "hr", "horizontal rule"],
+ group: "Podstawowe bloki",
+ },
},
placeholders: {
default: "Wprowadź tekst lub wpisz '/' aby użyć poleceń",
diff --git a/packages/core/src/i18n/locales/pt.ts b/packages/core/src/i18n/locales/pt.ts
index c935b3201e..7801cd2d36 100644
--- a/packages/core/src/i18n/locales/pt.ts
+++ b/packages/core/src/i18n/locales/pt.ts
@@ -163,6 +163,12 @@ export const pt: Dictionary = {
aliases: ["emoji", "emoticon", "expressão emocional", "rosto"],
group: "Outros",
},
+ divider: {
+ title: "Separador",
+ subtext: "Separador de blocos",
+ aliases: ["separador", "hr", "horizontal rule"],
+ group: "Blocos básicos",
+ },
},
placeholders: {
default: "Digite texto ou use '/' para comandos",
diff --git a/packages/core/src/i18n/locales/ru.ts b/packages/core/src/i18n/locales/ru.ts
index 728db913e0..b150359714 100644
--- a/packages/core/src/i18n/locales/ru.ts
+++ b/packages/core/src/i18n/locales/ru.ts
@@ -214,6 +214,12 @@ export const ru: Dictionary = {
aliases: ["эмодзи", "смайлик", "выражение эмоций", "лицо"],
group: "Прочее",
},
+ divider: {
+ title: "Разделитель",
+ subtext: "Разделитель блоков",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "Базовые блоки",
+ },
},
placeholders: {
default: "Введите текст или введите «/» для команд",
diff --git a/packages/core/src/i18n/locales/sk.ts b/packages/core/src/i18n/locales/sk.ts
index 78474b0183..cbdd0b706f 100644
--- a/packages/core/src/i18n/locales/sk.ts
+++ b/packages/core/src/i18n/locales/sk.ts
@@ -170,6 +170,12 @@ export const sk = {
aliases: ["emoji", "emócia", "tvár"],
group: "Ostatné",
},
+ divider: {
+ title: "Oddelovač",
+ subtext: "Oddelovač blokov",
+ aliases: ["oddelovač", "hr", "horizontal rule"],
+ group: "Základné bloky",
+ },
},
placeholders: {
default: "Zadajte text alebo napíšte '/' pre príkazy",
diff --git a/packages/core/src/i18n/locales/uk.ts b/packages/core/src/i18n/locales/uk.ts
index 45f1e46391..a99a4259c6 100644
--- a/packages/core/src/i18n/locales/uk.ts
+++ b/packages/core/src/i18n/locales/uk.ts
@@ -196,6 +196,12 @@ export const uk: Dictionary = {
aliases: ["emoji", "emote", "emotion", "face", "смайлик", "емодзі"],
group: "Інше",
},
+ divider: {
+ title: "Розділювач",
+ subtext: "Розділювач блоків",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "Базові блоки",
+ },
},
placeholders: {
default: "Введіть текст або наберіть '/' для команд",
diff --git a/packages/core/src/i18n/locales/vi.ts b/packages/core/src/i18n/locales/vi.ts
index 9532d7214b..b300fdcfd0 100644
--- a/packages/core/src/i18n/locales/vi.ts
+++ b/packages/core/src/i18n/locales/vi.ts
@@ -170,6 +170,12 @@ export const vi: Dictionary = {
],
group: "Khác",
},
+ divider: {
+ title: "Phân cách",
+ subtext: "Phân cách khối",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "Khối cơ bản",
+ },
},
placeholders: {
default: "Nhập văn bản hoặc gõ '/' để thêm định dạng",
diff --git a/packages/core/src/i18n/locales/zh-tw.ts b/packages/core/src/i18n/locales/zh-tw.ts
index e1babf3980..e9aa1e8ac6 100644
--- a/packages/core/src/i18n/locales/zh-tw.ts
+++ b/packages/core/src/i18n/locales/zh-tw.ts
@@ -212,6 +212,12 @@ export const zhTW: Dictionary = {
],
group: "其他",
},
+ divider: {
+ title: "分隔線",
+ subtext: "分隔線區塊",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "基礎區塊",
+ },
},
placeholders: {
default: "輸入 '/' 以使用指令",
diff --git a/packages/core/src/i18n/locales/zh.ts b/packages/core/src/i18n/locales/zh.ts
index 1794096830..b44c81aa36 100644
--- a/packages/core/src/i18n/locales/zh.ts
+++ b/packages/core/src/i18n/locales/zh.ts
@@ -212,6 +212,12 @@ export const zh: Dictionary = {
],
group: "其他",
},
+ divider: {
+ title: "分隔线",
+ subtext: "分隔线区块",
+ aliases: ["divider", "hr", "horizontal rule"],
+ group: "基础区块",
+ },
},
placeholders: {
default: "输入 '/' 以使用命令",
diff --git a/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx b/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx
index 62adf03b18..17bc55a293 100644
--- a/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx
+++ b/packages/react/src/components/SuggestionMenu/getDefaultReactSlashMenuItems.tsx
@@ -22,6 +22,7 @@ import {
RiListUnordered,
RiPlayList2Fill,
RiQuoteText,
+ RiSubtractLine,
RiTable2,
RiText,
RiVolumeUpFill,
@@ -53,6 +54,7 @@ const icons: Record = {
file: RiFile2Line,
emoji: RiEmotionFill,
code_block: RiCodeBlock,
+ divider: RiSubtractLine,
};
export function getDefaultReactSlashMenuItems<
From 9b9b1590ea6008dc094aab246416937788a17697 Mon Sep 17 00:00:00 2001
From: Nick the Sick
Date: Thu, 18 Sep 2025 16:26:10 +0200
Subject: [PATCH 3/5] feat: add conversion for divider block
---
.../05-converting-blocks-to-pdf/src/App.tsx | 1 +
.../06-converting-blocks-to-docx/src/App.tsx | 1 +
.../07-converting-blocks-to-odt/src/App.tsx | 1 +
.../src/App.tsx | 1 +
.../schemaToJSONSchema.test.ts.snap | 21 +++++++++++++++++++
.../src/docx/__snapshots__/basic/document.xml | 7 +++++++
.../src/docx/defaultSchema/blocks.ts | 12 +++++++++++
.../reactEmailExporter.test.tsx.snap | 6 +++---
.../src/react-email/defaultSchema/blocks.tsx | 11 ++++++++++
.../src/odt/__snapshots__/basic/content.xml | 4 ++++
.../withCustomOptions/content.xml | 4 ++++
.../src/odt/defaultSchema/blocks.tsx | 18 ++++++++++++++++
.../src/pdf/__snapshots__/example.jsx | 19 +++++++++++++++++
.../exampleWithHeaderAndFooter.jsx | 19 +++++++++++++++++
.../src/pdf/defaultSchema/blocks.tsx | 11 ++++++++++
shared/testDocument.ts | 1 +
16 files changed, 134 insertions(+), 3 deletions(-)
diff --git a/examples/05-interoperability/05-converting-blocks-to-pdf/src/App.tsx b/examples/05-interoperability/05-converting-blocks-to-pdf/src/App.tsx
index 49da735428..d910886113 100644
--- a/examples/05-interoperability/05-converting-blocks-to-pdf/src/App.tsx
+++ b/examples/05-interoperability/05-converting-blocks-to-pdf/src/App.tsx
@@ -98,6 +98,7 @@ export default function App() {
backgroundColor: "red",
},
},
+ { type: "divider" },
{
type: "paragraph",
content: [
diff --git a/examples/05-interoperability/06-converting-blocks-to-docx/src/App.tsx b/examples/05-interoperability/06-converting-blocks-to-docx/src/App.tsx
index 6b1fa6f42c..9c91a99aff 100644
--- a/examples/05-interoperability/06-converting-blocks-to-docx/src/App.tsx
+++ b/examples/05-interoperability/06-converting-blocks-to-docx/src/App.tsx
@@ -92,6 +92,7 @@ export default function App() {
backgroundColor: "red",
},
},
+ { type: "divider" },
{
type: "paragraph",
content: [
diff --git a/examples/05-interoperability/07-converting-blocks-to-odt/src/App.tsx b/examples/05-interoperability/07-converting-blocks-to-odt/src/App.tsx
index 4f0eb846a4..9ece22d905 100644
--- a/examples/05-interoperability/07-converting-blocks-to-odt/src/App.tsx
+++ b/examples/05-interoperability/07-converting-blocks-to-odt/src/App.tsx
@@ -92,6 +92,7 @@ export default function App() {
backgroundColor: "red",
},
},
+ { type: "divider" },
{
type: "paragraph",
content: [
diff --git a/examples/05-interoperability/08-converting-blocks-to-react-email/src/App.tsx b/examples/05-interoperability/08-converting-blocks-to-react-email/src/App.tsx
index ba2fec5510..9b46d8e927 100644
--- a/examples/05-interoperability/08-converting-blocks-to-react-email/src/App.tsx
+++ b/examples/05-interoperability/08-converting-blocks-to-react-email/src/App.tsx
@@ -88,6 +88,7 @@ export default function App() {
backgroundColor: "red",
},
},
+ { type: "divider" },
{
type: "paragraph",
content: [
diff --git a/packages/xl-ai/src/api/schema/__snapshots__/schemaToJSONSchema.test.ts.snap b/packages/xl-ai/src/api/schema/__snapshots__/schemaToJSONSchema.test.ts.snap
index 683fd3b9c9..8c393501e5 100644
--- a/packages/xl-ai/src/api/schema/__snapshots__/schemaToJSONSchema.test.ts.snap
+++ b/packages/xl-ai/src/api/schema/__snapshots__/schemaToJSONSchema.test.ts.snap
@@ -128,6 +128,27 @@ exports[`creates json schema 1`] = `
],
"type": "object",
},
+ {
+ "additionalProperties": false,
+ "properties": {
+ "content": undefined,
+ "props": {
+ "additionalProperties": false,
+ "properties": {},
+ "type": "object",
+ },
+ "type": {
+ "enum": [
+ "divider",
+ ],
+ "type": "string",
+ },
+ },
+ "required": [
+ "type",
+ ],
+ "type": "object",
+ },
{
"additionalProperties": false,
"properties": {
diff --git a/packages/xl-docx-exporter/src/docx/__snapshots__/basic/document.xml b/packages/xl-docx-exporter/src/docx/__snapshots__/basic/document.xml
index 06e915d628..b26b4d789b 100644
--- a/packages/xl-docx-exporter/src/docx/__snapshots__/basic/document.xml
+++ b/packages/xl-docx-exporter/src/docx/__snapshots__/basic/document.xml
@@ -736,6 +736,13 @@
};
+
+
+
+
+
+
+
diff --git a/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts b/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts
index 5f0d9ac9c4..c80818fb96 100644
--- a/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts
+++ b/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts
@@ -192,6 +192,18 @@ export const docxBlockMappingForDefaultSchema: BlockMapping<
children: [new PageBreak()],
});
},
+ divider: () => {
+ return new Paragraph({
+ border: {
+ top: {
+ color: "auto",
+ space: 1,
+ style: "single",
+ size: 1,
+ },
+ },
+ });
+ },
column: (block, _exporter, _nestingLevel, _numberedListIndex, children) => {
return new TableCell({
width: {
diff --git a/packages/xl-email-exporter/src/react-email/__snapshots__/reactEmailExporter.test.tsx.snap b/packages/xl-email-exporter/src/react-email/__snapshots__/reactEmailExporter.test.tsx.snap
index 5334c2cd62..d4554d6689 100644
--- a/packages/xl-email-exporter/src/react-email/__snapshots__/reactEmailExporter.test.tsx.snap
+++ b/packages/xl-email-exporter/src/react-email/__snapshots__/reactEmailExporter.test.tsx.snap
@@ -1,10 +1,10 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`react email exporter > should export a document (HTML snapshot) > __snapshots__/reactEmailExporter 1`] = `"Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
+exports[`react email exporter > should export a document (HTML snapshot) > __snapshots__/reactEmailExporter 1`] = `"Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
-exports[`react email exporter > should export a document with multiple preview lines > __snapshots__/reactEmailExporterWithMultiplePreview 1`] = `"First preview lineSecond preview line
Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
+exports[`react email exporter > should export a document with multiple preview lines > __snapshots__/reactEmailExporterWithMultiplePreview 1`] = `"First preview lineSecond preview line
Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
-exports[`react email exporter > should export a document with preview > __snapshots__/reactEmailExporterWithPreview 1`] = `"This is a preview of the email content
Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
+exports[`react email exporter > should export a document with preview > __snapshots__/reactEmailExporterWithPreview 1`] = `"This is a preview of the email content
Hello World double nested
This paragraph has a background color
justified paragraph. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Bullet List Item right. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Numbered List Item 1
Numbered List Item 2
Numbered List Item Nested 1
Numbered List Item Nested 2
Numbered List Item Nested funky right
Numbered List Item Nested funky center
Numbered List Item
Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell Wide Cell Table Cell Table Cell
Open video file From https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm
Open audio file From https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3
Table Cell 1 Table Cell 2 Table Cell 3 Table Cell 4 Table Cell Bold 5 Table Cell 6 Table Cell 7 Table Cell 8 Table Cell 9
const helloWorld = ( message ) => {
console . log ( "Hello World" , message ) ;
} ;
"`;
exports[`react email exporter > should handle document with background colors > __snapshots__/reactEmailExporterBackgroundColor 1`] = `"Text with background color
"`;
diff --git a/packages/xl-email-exporter/src/react-email/defaultSchema/blocks.tsx b/packages/xl-email-exporter/src/react-email/defaultSchema/blocks.tsx
index 1c1a58fae9..a0befbcb32 100644
--- a/packages/xl-email-exporter/src/react-email/defaultSchema/blocks.tsx
+++ b/packages/xl-email-exporter/src/react-email/defaultSchema/blocks.tsx
@@ -491,6 +491,17 @@ export const createReactEmailBlockMappingForDefaultSchema = (
/>
);
},
+ divider: () => {
+ return (
+
+ );
+ },
});
// Export the original mapping for backward compatibility
diff --git a/packages/xl-odt-exporter/src/odt/__snapshots__/basic/content.xml b/packages/xl-odt-exporter/src/odt/__snapshots__/basic/content.xml
index 07d23ec74e..ac2fee74ad 100644
--- a/packages/xl-odt-exporter/src/odt/__snapshots__/basic/content.xml
+++ b/packages/xl-odt-exporter/src/odt/__snapshots__/basic/content.xml
@@ -92,6 +92,9 @@
+
+
+
@@ -443,6 +446,7 @@
};
+
\ No newline at end of file
diff --git a/packages/xl-odt-exporter/src/odt/__snapshots__/withCustomOptions/content.xml b/packages/xl-odt-exporter/src/odt/__snapshots__/withCustomOptions/content.xml
index 986e87756c..a938523f64 100644
--- a/packages/xl-odt-exporter/src/odt/__snapshots__/withCustomOptions/content.xml
+++ b/packages/xl-odt-exporter/src/odt/__snapshots__/withCustomOptions/content.xml
@@ -92,6 +92,9 @@
+
+
+
@@ -457,6 +460,7 @@
};
+
\ No newline at end of file
diff --git a/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx b/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx
index b9fd80a97c..85fa80d0ff 100644
--- a/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx
+++ b/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx
@@ -313,6 +313,24 @@ export const odtBlockMappingForDefaultSchema: BlockMapping<
return ;
},
+ divider: (block, exporter) => {
+ const styleName = createParagraphStyle(
+ exporter as ODTExporter,
+ block.props,
+ "Standard",
+ {},
+ {
+ "fo:border-top": "1pt solid #cccccc",
+ "fo:margin-top": "11pt",
+ "fo:margin-bottom": "12pt",
+ "fo:padding-top": "0pt",
+ "fo:padding-bottom": "0pt",
+ },
+ );
+
+ return ;
+ },
+
column: (_block, exporter, _nestingLevel, _numberedListIndex, children) => {
const ex = exporter as ODTExporter;
const style = ex.registerStyle((name) => (
diff --git a/packages/xl-pdf-exporter/src/pdf/__snapshots__/example.jsx b/packages/xl-pdf-exporter/src/pdf/__snapshots__/example.jsx
index a9b3f7ef67..bf68e3e9af 100644
--- a/packages/xl-pdf-exporter/src/pdf/__snapshots__/example.jsx
+++ b/packages/xl-pdf-exporter/src/pdf/__snapshots__/example.jsx
@@ -1117,5 +1117,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/xl-pdf-exporter/src/pdf/__snapshots__/exampleWithHeaderAndFooter.jsx b/packages/xl-pdf-exporter/src/pdf/__snapshots__/exampleWithHeaderAndFooter.jsx
index 89d1d756ea..ee30e0587a 100644
--- a/packages/xl-pdf-exporter/src/pdf/__snapshots__/exampleWithHeaderAndFooter.jsx
+++ b/packages/xl-pdf-exporter/src/pdf/__snapshots__/exampleWithHeaderAndFooter.jsx
@@ -1125,6 +1125,25 @@
+
+
+
+
+
{
return ;
},
+ divider: () => {
+ return (
+
+ );
+ },
column: (block, _exporter, _nestingLevel, _numberedListIndex, children) => {
return {children} ;
},
diff --git a/shared/testDocument.ts b/shared/testDocument.ts
index 5c082b6adf..22c57bb192 100644
--- a/shared/testDocument.ts
+++ b/shared/testDocument.ts
@@ -282,5 +282,6 @@ export const testDocument = partialBlocksToBlocksForTesting(
console.log("Hello World", message);
};`,
},
+ { type: "divider" },
],
);
From a037e98db2fb15fe2894e09a7b2d82b80abd65ce Mon Sep 17 00:00:00 2001
From: Matthew Lipski
Date: Fri, 3 Oct 2025 20:25:17 +0200
Subject: [PATCH 4/5] Added tests
---
.../__snapshots__/text/html/basicBlocks.html | 1 +
.../text/html/basicBlocksWithProps.html | 1 +
.../core/clipboard/copy/copyTestInstances.ts | 6 +++
.../blocknoteHTML/divider/basic.html | 9 ++++
.../__snapshots__/html/divider/basic.html | 1 +
.../__snapshots__/markdown/divider/basic.md | 1 +
.../__snapshots__/nodes/divider/basic.json | 13 +++++
.../export/exportTestInstances.ts | 11 +++++
.../exportParseEqualityTestInstances.ts | 3 ++
.../parse/__snapshots__/html/divider.json | 9 ++++
.../parse/__snapshots__/markdown/complex.json | 49 +++++++++++++------
.../parse/parseTestInstances.ts | 10 ++++
12 files changed, 100 insertions(+), 14 deletions(-)
create mode 100644 tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/divider/basic.html
create mode 100644 tests/src/unit/core/formatConversion/export/__snapshots__/html/divider/basic.html
create mode 100644 tests/src/unit/core/formatConversion/export/__snapshots__/markdown/divider/basic.md
create mode 100644 tests/src/unit/core/formatConversion/export/__snapshots__/nodes/divider/basic.json
create mode 100644 tests/src/unit/core/formatConversion/parse/__snapshots__/html/divider.json
diff --git a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocks.html b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocks.html
index 3659da8923..c8b7208e24 100644
--- a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocks.html
+++ b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocks.html
@@ -40,4 +40,5 @@ Heading 1
Add image
+
Paragraph 2
\ No newline at end of file
diff --git a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocksWithProps.html b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocksWithProps.html
index 9c30cd19ad..38d4f68da7 100644
--- a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocksWithProps.html
+++ b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/basicBlocksWithProps.html
@@ -52,4 +52,5 @@ Heading 1
/>
Placeholder
+
Paragraph 2
\ No newline at end of file
diff --git a/tests/src/unit/core/clipboard/copy/copyTestInstances.ts b/tests/src/unit/core/clipboard/copy/copyTestInstances.ts
index 9e709ab630..8f9e677d97 100644
--- a/tests/src/unit/core/clipboard/copy/copyTestInstances.ts
+++ b/tests/src/unit/core/clipboard/copy/copyTestInstances.ts
@@ -535,6 +535,9 @@ export const copyTestInstancesHTML: TestInstance<
{
type: "image",
},
+ {
+ type: "divider",
+ },
{
type: "paragraph",
content: "Paragraph 2",
@@ -619,6 +622,9 @@ export const copyTestInstancesHTML: TestInstance<
previewWidth: 256,
},
},
+ {
+ type: "divider",
+ },
{
type: "paragraph",
content: "Paragraph 2",
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/divider/basic.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/divider/basic.html
new file mode 100644
index 0000000000..5aae92d448
--- /dev/null
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/divider/basic.html
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/html/divider/basic.html b/tests/src/unit/core/formatConversion/export/__snapshots__/html/divider/basic.html
new file mode 100644
index 0000000000..1d6667d2e3
--- /dev/null
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/html/divider/basic.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/divider/basic.md b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/divider/basic.md
new file mode 100644
index 0000000000..6a7e452749
--- /dev/null
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/divider/basic.md
@@ -0,0 +1 @@
+***
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/nodes/divider/basic.json b/tests/src/unit/core/formatConversion/export/__snapshots__/nodes/divider/basic.json
new file mode 100644
index 0000000000..275e6faf36
--- /dev/null
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/nodes/divider/basic.json
@@ -0,0 +1,13 @@
+[
+ {
+ "attrs": {
+ "id": "1",
+ },
+ "content": [
+ {
+ "type": "divider",
+ },
+ ],
+ "type": "blockContainer",
+ },
+]
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/exportTestInstances.ts b/tests/src/unit/core/formatConversion/export/exportTestInstances.ts
index d27cbfad64..89dcd7a171 100644
--- a/tests/src/unit/core/formatConversion/export/exportTestInstances.ts
+++ b/tests/src/unit/core/formatConversion/export/exportTestInstances.ts
@@ -243,6 +243,17 @@ export const exportTestInstancesBlockNoteHTML: TestInstance<
},
executeTest: testExportBlockNoteHTML,
},
+ {
+ testCase: {
+ name: "divider/basic",
+ content: [
+ {
+ type: "divider",
+ },
+ ],
+ },
+ executeTest: testExportBlockNoteHTML,
+ },
{
testCase: {
name: "pageBreak/basic",
diff --git a/tests/src/unit/core/formatConversion/exportParseEquality/exportParseEqualityTestInstances.ts b/tests/src/unit/core/formatConversion/exportParseEquality/exportParseEqualityTestInstances.ts
index 74654d55e9..33d9b09c15 100644
--- a/tests/src/unit/core/formatConversion/exportParseEquality/exportParseEqualityTestInstances.ts
+++ b/tests/src/unit/core/formatConversion/exportParseEquality/exportParseEqualityTestInstances.ts
@@ -63,6 +63,9 @@ export const exportParseEqualityTestInstancesHTML: TestInstance<
type: "checkListItem",
content: "Check List Item",
},
+ {
+ type: "divider",
+ },
{
type: "codeBlock",
content: "Code",
diff --git a/tests/src/unit/core/formatConversion/parse/__snapshots__/html/divider.json b/tests/src/unit/core/formatConversion/parse/__snapshots__/html/divider.json
new file mode 100644
index 0000000000..a15c3c8e38
--- /dev/null
+++ b/tests/src/unit/core/formatConversion/parse/__snapshots__/html/divider.json
@@ -0,0 +1,9 @@
+[
+ {
+ "children": [],
+ "content": undefined,
+ "id": "1",
+ "props": {},
+ "type": "divider",
+ },
+]
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/parse/__snapshots__/markdown/complex.json b/tests/src/unit/core/formatConversion/parse/__snapshots__/markdown/complex.json
index 758a0902ad..8f30c274ae 100644
--- a/tests/src/unit/core/formatConversion/parse/__snapshots__/markdown/complex.json
+++ b/tests/src/unit/core/formatConversion/parse/__snapshots__/markdown/complex.json
@@ -130,6 +130,13 @@
},
"type": "paragraph",
},
+ {
+ "children": [],
+ "content": undefined,
+ "id": "8",
+ "props": {},
+ "type": "divider",
+ },
{
"children": [],
"content": [
@@ -158,7 +165,7 @@
"type": "text",
},
],
- "id": "8",
+ "id": "9",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -166,6 +173,13 @@
},
"type": "paragraph",
},
+ {
+ "children": [],
+ "content": undefined,
+ "id": "10",
+ "props": {},
+ "type": "divider",
+ },
{
"children": [],
"content": [
@@ -194,7 +208,7 @@
"type": "text",
},
],
- "id": "9",
+ "id": "11",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -202,6 +216,13 @@
},
"type": "paragraph",
},
+ {
+ "children": [],
+ "content": undefined,
+ "id": "12",
+ "props": {},
+ "type": "divider",
+ },
{
"children": [],
"content": [
@@ -211,7 +232,7 @@
"type": "text",
},
],
- "id": "10",
+ "id": "13",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -232,7 +253,7 @@
"type": "text",
},
],
- "id": "13",
+ "id": "16",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -248,7 +269,7 @@
"type": "text",
},
],
- "id": "12",
+ "id": "15",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -267,7 +288,7 @@
"type": "text",
},
],
- "id": "15",
+ "id": "18",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -284,7 +305,7 @@
"type": "text",
},
],
- "id": "16",
+ "id": "19",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -303,7 +324,7 @@
"type": "text",
},
],
- "id": "18",
+ "id": "21",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -319,7 +340,7 @@
"type": "text",
},
],
- "id": "17",
+ "id": "20",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -336,7 +357,7 @@
"type": "text",
},
],
- "id": "19",
+ "id": "22",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -352,7 +373,7 @@
"type": "text",
},
],
- "id": "14",
+ "id": "17",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -369,7 +390,7 @@
"type": "text",
},
],
- "id": "20",
+ "id": "23",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -385,7 +406,7 @@
"type": "text",
},
],
- "id": "11",
+ "id": "14",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
@@ -402,7 +423,7 @@
"type": "text",
},
],
- "id": "21",
+ "id": "24",
"props": {
"backgroundColor": "default",
"textAlignment": "left",
diff --git a/tests/src/unit/core/formatConversion/parse/parseTestInstances.ts b/tests/src/unit/core/formatConversion/parse/parseTestInstances.ts
index 7a6781b938..72996b8368 100644
--- a/tests/src/unit/core/formatConversion/parse/parseTestInstances.ts
+++ b/tests/src/unit/core/formatConversion/parse/parseTestInstances.ts
@@ -922,6 +922,10 @@ With Hard Break
},
executeTest: testParseHTML,
},
+ {
+ testCase: { name: "divider", content: ` ` },
+ executeTest: testParseHTML,
+ },
];
export const parseTestInstancesMarkdown: TestInstance<
@@ -982,10 +986,16 @@ Paragraph
Paragraph
+---
+
P**ara***grap*h
+***
+
P*ara*~~grap~~h
+___
+
* Bullet List Item
* Bullet List Item
From 8b421804c36d0d8b9c7ef71bd60464be5df7deca Mon Sep 17 00:00:00 2001
From: Matthew Lipski
Date: Sat, 4 Oct 2025 15:30:34 +0200
Subject: [PATCH 5/5] Updated e2e snaps
---
.../ariakit-slash-menu-webkit-linux.png | Bin 160474 -> 160494 bytes
.../shadcn-slash-menu-chromium-linux.png | Bin 54371 -> 54909 bytes
.../shadcn-slash-menu-firefox-linux.png | Bin 78865 -> 79703 bytes
.../shadcn-slash-menu-webkit-linux.png | Bin 169237 -> 172641 bytes
.../dark-slash-menu-chromium-linux.png | Bin 52470 -> 53359 bytes
.../dark-slash-menu-firefox-linux.png | Bin 75490 -> 76943 bytes
.../dark-slash-menu-webkit-linux.png | Bin 158272 -> 161837 bytes
7 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/tests/src/end-to-end/ariakit/ariakit.test.ts-snapshots/ariakit-slash-menu-webkit-linux.png b/tests/src/end-to-end/ariakit/ariakit.test.ts-snapshots/ariakit-slash-menu-webkit-linux.png
index 139ec203298d439469506cf9db7b0a9021bb5caa..35c7f334b26b8358c5633c3652d008e1fd2c27ae 100644
GIT binary patch
delta 14383
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%0Dg(*x9~xS!70k1n
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
F{{W|@{<;7F
diff --git a/tests/src/end-to-end/shadcn/shadcn.test.ts-snapshots/shadcn-slash-menu-chromium-linux.png b/tests/src/end-to-end/shadcn/shadcn.test.ts-snapshots/shadcn-slash-menu-chromium-linux.png
index 17f0ba6f2798de7afb86a44493d06b6fac1a3494..a8092107da32dd2b10acc32977f7d41583befd8a 100644
GIT binary patch
delta 4918
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
c&x0NP`J#dT%1Cd`On==}7*0YoKuM*si-
delta 4376
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
diff --git a/tests/src/end-to-end/shadcn/shadcn.test.ts-snapshots/shadcn-slash-menu-firefox-linux.png b/tests/src/end-to-end/shadcn/shadcn.test.ts-snapshots/shadcn-slash-menu-firefox-linux.png
index f9a148b94b341664b08d85ece55d5b4a9c3ced28..2d8d62515d550e630f210f8f2d307c09e929d111 100644
GIT binary patch
delta 26771
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