diff --git a/docs/pages/examples/_meta.json b/docs/pages/examples/_meta.json
index c01af6596d..aa81bb87ad 100644
--- a/docs/pages/examples/_meta.json
+++ b/docs/pages/examples/_meta.json
@@ -6,5 +6,6 @@
"theming": "Theming",
"interoperability": "Interoperability",
"custom-schema": "Custom Schemas",
- "collaboration": "Collaboration"
+ "collaboration": "Collaboration",
+ "extensions": "Extensions"
}
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/.bnexample.json b/examples/08-extensions/01-tiptap-arrow-conversion/.bnexample.json
new file mode 100644
index 0000000000..c82999398f
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/.bnexample.json
@@ -0,0 +1,7 @@
+{
+ "playground": true,
+ "docs": true,
+ "author": "komsenapati",
+ "tags": ["Extension"],
+ "pro": true
+}
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/App.tsx b/examples/08-extensions/01-tiptap-arrow-conversion/App.tsx
new file mode 100644
index 0000000000..94619d637c
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/App.tsx
@@ -0,0 +1,17 @@
+import "@blocknote/core/fonts/inter.css";
+import { useCreateBlockNote } from "@blocknote/react";
+import { BlockNoteView } from "@blocknote/mantine";
+import "@blocknote/mantine/style.css";
+import { ArrowConversionExtension } from "./ArrowConversionExtension";
+
+export default function App() {
+ // Creates a new editor instance.
+ const editor = useCreateBlockNote({
+ _tiptapOptions: {
+ extensions: [ArrowConversionExtension]
+ }
+ });
+
+ // Renders the editor instance using a React component.
+ return ;
+}
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/ArrowConversionExtension.ts b/examples/08-extensions/01-tiptap-arrow-conversion/ArrowConversionExtension.ts
new file mode 100644
index 0000000000..abef46c69e
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/ArrowConversionExtension.ts
@@ -0,0 +1,18 @@
+import { Extension } from "@tiptap/core";
+
+export const ArrowConversionExtension = Extension.create({
+ name: 'arrowConversion',
+
+ addInputRules() {
+ return [
+ {
+ find: /->/g,
+ handler: ({ state, range, chain }) => {
+ const { from, to } = range;
+ const tr = state.tr.replaceWith(from, to, state.schema.text('→'));
+ chain().insertContent(tr).run();
+ },
+ },
+ ];
+ },
+})
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/README.md b/examples/08-extensions/01-tiptap-arrow-conversion/README.md
new file mode 100644
index 0000000000..83175f3aab
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/README.md
@@ -0,0 +1,5 @@
+# TipTap extension (arrow InputRule)
+
+This example shows how to set up a BlockNote editor with a TipTap extension that registers an InputRule to convert `->` into `→`.
+
+**Try it out:** Type `->` anywhere in the editor and see how it's automatically converted to a single arrow unicode character.
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/index.html b/examples/08-extensions/01-tiptap-arrow-conversion/index.html
new file mode 100644
index 0000000000..68d9a1fd78
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ TipTap extension (arrow InputRule)
+
+
+
+
+
+
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/main.tsx b/examples/08-extensions/01-tiptap-arrow-conversion/main.tsx
new file mode 100644
index 0000000000..f88b490fbd
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/main.tsx
@@ -0,0 +1,11 @@
+// AUTO-GENERATED FILE, DO NOT EDIT DIRECTLY
+import React from "react";
+import { createRoot } from "react-dom/client";
+import App from "./App";
+
+const root = createRoot(document.getElementById("root")!);
+root.render(
+
+
+
+);
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/package.json b/examples/08-extensions/01-tiptap-arrow-conversion/package.json
new file mode 100644
index 0000000000..974c116732
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@blocknote/example-tiptap-arrow-conversion",
+ "description": "AUTO-GENERATED FILE, DO NOT EDIT DIRECTLY",
+ "private": true,
+ "version": "0.12.4",
+ "scripts": {
+ "start": "vite",
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "lint": "eslint . --max-warnings 0"
+ },
+ "dependencies": {
+ "@blocknote/core": "latest",
+ "@blocknote/react": "latest",
+ "@blocknote/ariakit": "latest",
+ "@blocknote/mantine": "latest",
+ "@blocknote/shadcn": "latest",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.25",
+ "@types/react-dom": "^18.0.9",
+ "@vitejs/plugin-react": "^4.3.1",
+ "eslint": "^8.10.0",
+ "vite": "^5.3.4"
+ },
+ "eslintConfig": {
+ "extends": [
+ "../../../.eslintrc.js"
+ ]
+ },
+ "eslintIgnore": [
+ "dist"
+ ]
+}
\ No newline at end of file
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/tsconfig.json b/examples/08-extensions/01-tiptap-arrow-conversion/tsconfig.json
new file mode 100644
index 0000000000..1bd8ab3c57
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "__comment": "AUTO-GENERATED FILE, DO NOT EDIT DIRECTLY",
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "composite": true
+ },
+ "include": [
+ "."
+ ],
+ "__ADD_FOR_LOCAL_DEV_references": [
+ {
+ "path": "../../../packages/core/"
+ },
+ {
+ "path": "../../../packages/react/"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/vite.config.ts b/examples/08-extensions/01-tiptap-arrow-conversion/vite.config.ts
new file mode 100644
index 0000000000..f62ab20bc2
--- /dev/null
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/vite.config.ts
@@ -0,0 +1,32 @@
+// AUTO-GENERATED FILE, DO NOT EDIT DIRECTLY
+import react from "@vitejs/plugin-react";
+import * as fs from "fs";
+import * as path from "path";
+import { defineConfig } from "vite";
+// import eslintPlugin from "vite-plugin-eslint";
+// https://vitejs.dev/config/
+export default defineConfig((conf) => ({
+ plugins: [react()],
+ optimizeDeps: {},
+ build: {
+ sourcemap: true,
+ },
+ resolve: {
+ alias:
+ conf.command === "build" ||
+ !fs.existsSync(path.resolve(__dirname, "../../packages/core/src"))
+ ? {}
+ : ({
+ // Comment out the lines below to load a built version of blocknote
+ // or, keep as is to load live from sources with live reload working
+ "@blocknote/core": path.resolve(
+ __dirname,
+ "../../packages/core/src/"
+ ),
+ "@blocknote/react": path.resolve(
+ __dirname,
+ "../../packages/react/src/"
+ ),
+ } as any),
+ },
+}));
diff --git a/playground/src/examples.gen.tsx b/playground/src/examples.gen.tsx
index eaac162755..52d5df36f3 100644
--- a/playground/src/examples.gen.tsx
+++ b/playground/src/examples.gen.tsx
@@ -968,6 +968,31 @@
}
]
},
+ "extensions": {
+ "pathFromRoot": "examples/08-extensions",
+ "slug": "extensions",
+ "projects": [
+ {
+ "projectSlug": "tiptap-arrow-conversion",
+ "fullSlug": "extensions/tiptap-arrow-conversion",
+ "pathFromRoot": "examples/08-extensions/01-tiptap-arrow-conversion",
+ "config": {
+ "playground": true,
+ "docs": true,
+ "author": "komsenapati",
+ "tags": [
+ "Extension"
+ ],
+ "pro": true
+ },
+ "title": "TipTap extension (arrow InputRule)",
+ "group": {
+ "pathFromRoot": "examples/08-extensions",
+ "slug": "extensions"
+ }
+ }
+ ]
+ },
"vanilla-js": {
"pathFromRoot": "examples/vanilla-js",
"slug": "vanilla-js",