@@ -107,8 +106,8 @@ export default function NotFound() {
Page Not Found
- We couldn't find the page you're looking for, but here are some
- pages that might help:
+ We couldn't find the page you're looking for, but here
+ are some pages that might help:
@@ -165,7 +164,6 @@ export default function NotFound() {
-
>
);
}
diff --git a/docs/app/og/docs/[...slug]/route.tsx b/docs/app/og/docs/[...slug]/route.tsx
new file mode 100644
index 0000000000..9d62877c08
--- /dev/null
+++ b/docs/app/og/docs/[...slug]/route.tsx
@@ -0,0 +1,25 @@
+import { getPageImage, source } from "@/lib/source/docs";
+import { notFound } from "next/navigation";
+import { ogImageResponse } from "../../ogImageResponse";
+
+export const revalidate = false;
+
+export async function GET(
+ _req: Request,
+ { params }: RouteContext<"/og/docs/[...slug]">,
+) {
+ const { slug } = await params;
+ const page = source.getPage(slug.slice(0, -1));
+ if (!page || slug[slug.length - 1] !== "image.png") notFound();
+
+ let title = page.data.imageTitle || page.data.title;
+
+ return ogImageResponse(title);
+}
+
+export function generateStaticParams() {
+ return source.getPages().map((page) => ({
+ lang: page.locale,
+ slug: getPageImage(page).segments,
+ }));
+}
diff --git a/docs/app/og/examples/[...slug]/route.tsx b/docs/app/og/examples/[...slug]/route.tsx
new file mode 100644
index 0000000000..31d79e786b
--- /dev/null
+++ b/docs/app/og/examples/[...slug]/route.tsx
@@ -0,0 +1,25 @@
+import { getPageImage, source } from "@/lib/source/examples";
+import { notFound } from "next/navigation";
+import { ogImageResponse } from "../../ogImageResponse";
+
+export const revalidate = false;
+
+export async function GET(
+ _req: Request,
+ { params }: RouteContext<"/og/docs/[...slug]">,
+) {
+ const { slug } = await params;
+ const page = source.getPage(slug.slice(0, -1));
+ if (!page || slug[slug.length - 1] !== "image.png") notFound();
+
+ let title = page.data.imageTitle || page.data.title;
+
+ return ogImageResponse(title);
+}
+
+export function generateStaticParams() {
+ return source.getPages().map((page) => ({
+ lang: page.locale,
+ slug: getPageImage(page).segments,
+ }));
+}
diff --git a/docs/app/og/image.png/route.tsx b/docs/app/og/image.png/route.tsx
new file mode 100644
index 0000000000..c0bf639dd0
--- /dev/null
+++ b/docs/app/og/image.png/route.tsx
@@ -0,0 +1,8 @@
+import { ogImageResponse } from "../ogImageResponse";
+
+export const revalidate = false;
+
+// route used for og images without a title
+export async function GET(_req: Request) {
+ return ogImageResponse();
+}
diff --git a/docs/app/og/ogImageResponse.tsx b/docs/app/og/ogImageResponse.tsx
new file mode 100644
index 0000000000..c613a6f273
--- /dev/null
+++ b/docs/app/og/ogImageResponse.tsx
@@ -0,0 +1,102 @@
+import { ImageResponse } from "next/og";
+import { readFile } from "node:fs/promises";
+import { join } from "node:path";
+
+export async function ogImageResponse(title?: string) {
+ if (title && title.length > 100) {
+ title = title.slice(0, 99) + "…";
+ }
+
+ const fontData = await readFile(
+ join(process.cwd(), "assets/fonts/Gilroy-Regular.ttf"),
+ );
+
+ const bannerSVG = (
+
+ );
+
+ const bannerWithTitle = (title: string) => (
+
+ {bannerSVG}
+
+ {title}
+
+
+ );
+
+ const banner = (
+
+ {bannerSVG}
+
+ );
+
+ return new ImageResponse(title ? bannerWithTitle(title) : banner, {
+ width: 1200,
+ height: 630,
+ fonts: [
+ {
+ name: "Gilroy",
+ data: fontData,
+ style: "normal",
+ },
+ ],
+ });
+}
diff --git a/docs/app/og/pages/[...slug]/route.tsx b/docs/app/og/pages/[...slug]/route.tsx
new file mode 100644
index 0000000000..7822756e46
--- /dev/null
+++ b/docs/app/og/pages/[...slug]/route.tsx
@@ -0,0 +1,25 @@
+import { getPageImage, source } from "@/lib/source/pages";
+import { notFound } from "next/navigation";
+import { ogImageResponse } from "../../ogImageResponse";
+
+export const revalidate = false;
+
+export async function GET(
+ _req: Request,
+ { params }: RouteContext<"/og/pages/[...slug]">,
+) {
+ const { slug } = await params;
+ const page = source.getPage(slug.slice(0, -1));
+ if (!page || slug[slug.length - 1] !== "image.png") notFound();
+
+ let title = page.data.imageTitle || page.data.title;
+
+ return ogImageResponse(title);
+}
+
+export function generateStaticParams() {
+ return source.getPages().map((page) => ({
+ lang: page.locale,
+ slug: getPageImage(page).segments,
+ }));
+}
diff --git a/docs/app/pricing/faq.tsx b/docs/app/pricing/faq.tsx
index f7904591d9..a7acc4b98f 100644
--- a/docs/app/pricing/faq.tsx
+++ b/docs/app/pricing/faq.tsx
@@ -1,6 +1,6 @@
-"use client";
import { Accordion, Accordions } from "fumadocs-ui/components/accordion";
import { Heading } from "fumadocs-ui/components/heading";
+import Link from "next/link";
const faqs = [
{
@@ -8,22 +8,22 @@ const faqs = [
"What license is BlockNote using? Do I need a subscription to use BlockNote?",
answer: (
<>
- We're proud to say that BlockNote is 100% open source software. The core
- library is licensed under the{" "}
+ We're proud to say that BlockNote is 100% open source software. The
+ core library is licensed under the{" "}
MPL 2.0 license,
which allows you to use BlockNote in commercial and closed-source
applications - even without a subscription. If you make changes to the
- BlockNote source files, you're expected to publish these changes so the
- wider community can benefit as well.
+ BlockNote source files, you're expected to publish these changes so
+ the wider community can benefit as well.
The XL packages (like AI integration, multi-column layouts, and
exporters) are dual-licensed and available under{" "}
GPL-3.0, or -
for closed-source projects - a commercial license as part of the
BlockNote Business subscription or above. See the{" "}
-
+
commercial license terms
- {" "}
+ {" "}
for the exact details.
>
),
@@ -34,9 +34,11 @@ const faqs = [
<>
Only when you use any of the XL packages (like AI integration,
multi-column layouts, and exporters) and you cannot comply with the
- GPL-3.0 license you'll need a{" "}
- commercial license.
- This is likely to be the case when you're building closed-source
+ GPL-3.0 license you'll need a{" "}
+
+ commercial license
+
+ . This is likely to be the case when you're building closed-source
applications. The BlockNote Business subscription and above includes a
commercial license.
>
@@ -71,8 +73,10 @@ const faqs = [
<>
We have you covered! All BlockNote subscriptions come with prioritized
support. See the{" "}
- Service Level Agreement for
- the exact details.
+
+ Service Level Agreement
+ {" "}
+ for the exact details.
>
),
},
@@ -88,13 +92,14 @@ const faqs = [
<>
The BlockNote Commercial license (included in the Business tier and
above) for XL packages covers one application per license. See the{" "}
-
+
commercial license terms
- {" "}
+ {" "}
for the exact details.
If you want to use XL packages in more than one app, contact us at
- team@blocknotejs.org; we're happy to work with you on a custom license.
+ team@blocknotejs.org; we're happy to work with you on a custom
+ license.
>
),
},
@@ -104,9 +109,9 @@ const faqs = [
<>
Yes! We offer a discount for startups with less than 5 employees. See
the{" "}
-
+
commercial license terms
- {" "}
+ {" "}
for the exact details.
>
),
@@ -119,10 +124,10 @@ const faqs = [
export function FAQ() {
return (
-
+
Frequently asked questions
-
+
{faqs.map((faq) => (
{faq.answer}
diff --git a/docs/app/pricing/layout.tsx b/docs/app/pricing/layout.tsx
index df2dbbd578..bbe4b9a500 100644
--- a/docs/app/pricing/layout.tsx
+++ b/docs/app/pricing/layout.tsx
@@ -1,32 +1,6 @@
-import { HomeLayout } from "fumadocs-ui/layouts/home";
-import type { ReactNode } from "react";
-import { baseOptions } from "@/app/layout.config";
-import { Footer } from "@/components/Footer";
-import * as Sentry from "@sentry/nextjs";
+import { HomeLayout } from "@/components/fumadocs/layout/home";
+import { baseOptions } from "@/lib/layout.shared";
-export default function Layout({ children }: { children: ReactNode }) {
- return (
- <>
-
-
- We encountered an error trying to show this page. Please report
- this to us on GitHub at{" "}
-
- https://github.com/TypeCellOS/BlockNote/issues
-
-
- }
- beforeCapture={(scope) => {
- scope.setTag("type", "react-render");
- scope.setTag("page", "pricing");
- }}
- >
- {children}
-
-
-
- >
- );
+export default function Layout({ children }: LayoutProps<"/pricing">) {
+ return {children};
}
diff --git a/docs/app/pricing/page.tsx b/docs/app/pricing/page.tsx
index e47753bbe2..e7095d8f07 100644
--- a/docs/app/pricing/page.tsx
+++ b/docs/app/pricing/page.tsx
@@ -1,12 +1,12 @@
import { FAQ } from "@/app/pricing/faq";
import { Tier, Tiers } from "@/app/pricing/tiers";
import { SectionSubHeader } from "@/components/Headings";
-import { getFullMetadata } from "@/util/getFullMetadata";
+import { getFullMetadata } from "@/lib/getFullMetadata";
+import Link from "next/link";
export const metadata = getFullMetadata({
title: "Pricing",
path: "/pricing",
- ogImageTitle: "Pricing",
});
const tiers: Tier[] = [
@@ -45,7 +45,7 @@ const tiers: Tier[] = [
"Best for companies that want a direct line to the team and a commercial license.",
price: { month: 390, year: 48 },
features: [
- Commercial license for XL packages:,
+ Commercial license for XL packages:,
"- AI integration",
"- Multi-column layouts",
"- Export to PDF, Docx, ODT, Email",
@@ -53,9 +53,9 @@ const tiers: Tier[] = [
"Prioritized Bug Reports on GitHub",
"Support maintenance and new versions of our open source library",
"Logo on our website and repositories",
-
+
Standard Support included (
- see SLA)
+ see SLA)
,
],
},
@@ -69,7 +69,7 @@ const tiers: Tier[] = [
"Development of BlockNote features required for your organization",
"Access to a private Slack channel with the maintainers",
"Guidance on integrating BlockNote into your project",
- Commercial license for XL packages:,
+ Commercial license for XL packages:,
"- AI integration",
"- Multi-column layouts",
"- Export to PDF, Docx, ODT, Email",
@@ -77,9 +77,9 @@ const tiers: Tier[] = [
"Prioritized Bug Reports and Feature Requests on GitHub",
"Support maintenance and new versions of our open source library",
"Logo on our website and repositories",
-
+
Priority Support included (
- see SLA)
+ see SLA)
,
],
href: "/about/",
diff --git a/docs/app/pricing/tiers.tsx b/docs/app/pricing/tiers.tsx
index 74e7f6154c..1dd63e8039 100644
--- a/docs/app/pricing/tiers.tsx
+++ b/docs/app/pricing/tiers.tsx
@@ -1,10 +1,10 @@
"use client";
-import { authClient, useSession } from "@/util/auth-client";
-import { CheckIcon } from "@heroicons/react/20/solid";
+import { authClient, useSession } from "@/lib/auth-client";
+import { cn } from "@/lib/fumadocs/cn";
+import * as Sentry from "@sentry/nextjs";
import { track } from "@vercel/analytics";
-import classNames from "classnames";
+import { CheckIcon } from "lucide-react";
import React from "react";
-import * as Sentry from "@sentry/nextjs";
type Frequency = "month" | "year";
@@ -22,7 +22,7 @@ function TierTitle({ tier }: { tier: Tier }) {
return (
-
-
-
+ // width needed for our header
+
+
+
+ {/*
+ Added custom sidebar toggle button for mobile views.
+ This is specific to Docs, because it triggers the left sidebar (not the top nav)
+ */}
+
+
+
+ {base.nav?.children}
+ >
+ ),
+ }}
+ />
+
+ ),
+ }}
+ // We override the gridTemplate to add support for our full-width header
+ // (the default can be seen when ejecting the docs layout, or
+ // https://github.com/fuma-nama/fumadocs/blob/e2fbe21c8aca4485ee189f3bf2a83ceb1edc336e/packages/base-ui/src/layouts/docs/client.tsx#L61 )
+ containerProps={{
+ style: {
+ gridTemplate: `"header header header"
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(var(--fd-toc-width), 1fr)`,
+ "--fd-docs-row-1": "var(--fd-banner-height, 0px)",
+ "--fd-docs-row-2":
+ "calc(var(--fd-docs-row-1) + var(--fd-header-height))",
+ "--fd-docs-row-3":
+ "calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))",
+ // '--fd-sidebar-col': collapsed ? '0px' : 'var(--fd-sidebar-width)',
+ } as object,
+ className: "[--fd-layout-width:1400px]",
+ }}
+ sidebar={{
+ // don't allow collapsing when sidebar when not on mobile
+ collapsible: false,
+ // tabs for the dropdown (top of sidebar)
+ tabs: [
+ {
+ icon: (
+
+ ),
+ title: "Documentation",
+ description: "Learn how to use BlockNote",
+ url: "/docs",
+ },
+ {
+ icon: (
+
+ ),
+ title: "Examples",
+ description: "See BlockNote in action",
+ url: "/examples",
+ },
+ ],
+ }}
+ >
+ {children}
+
+
);
}
-
-export { CollapsibleControl, Navbar, NavbarSidebarTrigger, type LinkItemType };
diff --git a/docs/components/DocPage.tsx b/docs/components/DocPage.tsx
deleted file mode 100644
index 3c15daa250..0000000000
--- a/docs/components/DocPage.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import { getMDXComponents } from "@/util/mdx-components";
-import { getPageTreePeers } from "fumadocs-core/server";
-import { LoaderOutput } from "fumadocs-core/source";
-import { Card, Cards } from "fumadocs-ui/components/card";
-import { createRelativeLink } from "fumadocs-ui/mdx";
-import { DocsBody, DocsPage } from "fumadocs-ui/page";
-import { notFound } from "next/navigation";
-
-export function CardTable({
- path,
- source,
-}: {
- path: string;
- source: LoaderOutput<{ i18n: false; source: any }>;
-}) {
- return (
-
- {getPageTreePeers(
- source.pageTree,
- `docs/${path.startsWith("/") ? path.slice(1) : path}`,
- ).map((peer) => (
-
- {peer.description}
-
- ))}
-
- );
-}
-
-export async function DocPage(props: {
- params: Promise<{ slug?: string[] }>;
- source: LoaderOutput;
-}) {
- const params = await props.params;
- const page = props.source.getPage(params.slug);
- if (!page) {
- notFound();
- }
-
- const MDXContent = page.data.body;
-
- return (
- > }}
- toc={page.data.toc}
- full={page.data.full}
- container={{
- // Slight hack to force uniform padding for viewport sizes where the
- // ToC is hidden but the sidebar is still visible.
- className: "m-0 *:md:pl-12! *:md:pt-12! *:md:pr-4!",
- }}
- >
-
- (
-
- ),
- })}
- />
-
-
- );
-}
diff --git a/docs/components/Example.tsx b/docs/components/Example.tsx
index f4e21530cd..1a390e72ca 100644
--- a/docs/components/Example.tsx
+++ b/docs/components/Example.tsx
@@ -1,17 +1,17 @@
"use client";
-import dynamic from "next/dynamic";
-import { useTheme } from "next-themes";
import { BlockNoteContext } from "@blocknote/react";
+import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock";
+import { Tab, Tabs } from "fumadocs-ui/components/tabs";
+import { useTheme } from "next-themes";
+import dynamic from "next/dynamic";
import { AiFillGithub } from "react-icons/ai";
import { SiStackblitz } from "react-icons/si";
-import { Tab, Tabs } from "fumadocs-ui/components/tabs";
-import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock";
import CTAButton from "@/components/CTAButton";
import { SectionHeader } from "@/components/Headings";
import { ExampleData } from "@/components/example/generated/exampleGroupsData.gen";
-import { authClient } from "@/util/auth-client";
+import { authClient } from "@/lib/auth-client";
import * as Sentry from "@sentry/nextjs";
function ExampleDemoBarSourceCodeLink(props: {
diff --git a/docs/components/ExampleCards.tsx b/docs/components/ExampleCards.tsx
index 1a8187ccaa..6c4fe66f7c 100644
--- a/docs/components/ExampleCards.tsx
+++ b/docs/components/ExampleCards.tsx
@@ -1,8 +1,7 @@
import { Card, Cards } from "fumadocs-ui/components/card";
import { Heading } from "fumadocs-ui/components/heading";
-
-import { exampleGroupsData } from "./example/generated/exampleGroupsData.gen";
import { Fragment } from "react";
+import { exampleGroupsData } from "./example/generated/exampleGroupsData.gen";
import { ProBadge } from "./ProBadge";
export default function ExampleCards() {
diff --git a/docs/components/ExamplePage.tsx b/docs/components/ExamplePage.tsx
deleted file mode 100644
index ee49c0a9d7..0000000000
--- a/docs/components/ExamplePage.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { LoaderOutput } from "fumadocs-core/source";
-import { Heading } from "fumadocs-ui/components/heading";
-import { DocsBody, DocsPage } from "fumadocs-ui/page";
-import { notFound } from "next/navigation";
-
-import Example from "@/components/Example";
-import ExampleCards from "@/components/ExampleCards";
-import { getMDXComponents } from "@/util/mdx-components";
-import { getExampleData } from "@/util/getExampleData";
-
-export async function ExamplePage(props: {
- params: Promise<{ slug?: string[] }>;
- source: LoaderOutput;
-}) {
- const params = await props.params;
- const page = props.source.getPage(params.slug);
- if (!page) {
- notFound();
- }
-
- const MDXContent = page.data.body;
-
- return (
-
-
- {page.data.title}
-
- {params.slug && params.slug.length > 0 ? (
-
- ) : null}
-
-
- );
-}
diff --git a/docs/components/Footer.tsx b/docs/components/Footer.tsx
index cd90b0b311..5d9c683e59 100644
--- a/docs/components/Footer.tsx
+++ b/docs/components/Footer.tsx
@@ -1,9 +1,7 @@
-"use client";
-
+import { ThemeToggle } from "@/components/fumadocs/layout/theme-toggle";
+import { cn } from "@/lib/fumadocs/cn";
import LogoDark from "@/public/img/logos/banner.dark.svg";
import LogoLight from "@/public/img/logos/banner.svg";
-import cn from "classnames";
-import { ThemeToggle } from "fumadocs-ui/components/layout/theme-toggle";
import Link from "next/link";
import type { ReactElement, ReactNode } from "react";
diff --git a/docs/components/GitHubButton.tsx b/docs/components/GitHubButton.tsx
index 6e3a611ad3..0da9b7cbdf 100644
--- a/docs/components/GitHubButton.tsx
+++ b/docs/components/GitHubButton.tsx
@@ -1,5 +1,4 @@
"use client";
-
import GHB from "react-github-btn";
export default function GitHubButton() {
diff --git a/docs/components/Headings.tsx b/docs/components/Headings.tsx
index 57c533d088..51a862b245 100644
--- a/docs/components/Headings.tsx
+++ b/docs/components/Headings.tsx
@@ -1,7 +1,7 @@
-import cn from "classnames";
-import gradients from "./gradients.module.css";
import { FadeIn } from "@/components/FadeIn";
+import { cn } from "@/lib/fumadocs/cn";
import { ReactNode } from "react";
+import gradients from "./gradients.module.css";
export function HeroText({
children,
diff --git a/docs/components/fumadocs/README.md b/docs/components/fumadocs/README.md
new file mode 100644
index 0000000000..d9f65a1066
--- /dev/null
+++ b/docs/components/fumadocs/README.md
@@ -0,0 +1,7 @@
+Files in this directory have been added by ejecting parts (mostly the "home layout" to customise the navbar) of fumadocs with `npx @fumadocs/cli customise`.
+
+The most significant changes are:
+
+- added groups to the navbar (in `layout/home/client.tsx` and `link-item.tsx`) (support columns in dropdowns)
+
+changes in code in this directory SHOULD always be commented
diff --git a/docs/components/fumadocs/layout/home/client.tsx b/docs/components/fumadocs/layout/home/client.tsx
new file mode 100644
index 0000000000..5106258349
--- /dev/null
+++ b/docs/components/fumadocs/layout/home/client.tsx
@@ -0,0 +1,504 @@
+"use client";
+import { NavigationMenu } from "@base-ui/react";
+import { useIsScrollTop } from "@fumadocs/base-ui/utils/use-is-scroll-top";
+import { cva } from "class-variance-authority";
+import Link from "fumadocs-core/link";
+import { ChevronDown, Languages } from "lucide-react";
+import {
+ type ComponentProps,
+ createContext,
+ Fragment,
+ use,
+ useEffect,
+ useEffectEvent,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
+import { cn } from "../../../../lib/fumadocs/cn";
+import { buttonVariants } from "../../ui/button";
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from "../../ui/collapsible";
+import {
+ NavigationMenuContent,
+ NavigationMenuItem,
+ NavigationMenuLink,
+ NavigationMenuList,
+ NavigationMenuRoot,
+ NavigationMenuTrigger,
+} from "../../ui/navigation-menu";
+import { LanguageToggle, LanguageToggleText } from "../language-toggle";
+import { LinkItem, MenuItemType } from "../link-item";
+import { LargeSearchToggle, SearchToggle } from "../search-toggle";
+import {
+ type LinkItemType,
+ type NavOptions,
+ renderTitleNav,
+ resolveLinkItems,
+} from "../shared";
+import { ThemeToggle } from "../theme-toggle";
+import type { HomeLayoutProps } from "./index";
+
+/*
+ See `components/fumadocs/README.md` for more information on changes
+*/
+const MobileMenuContext = createContext<{
+ open: boolean;
+ setOpen: (open: boolean) => void;
+} | null>(null);
+
+export const navItemVariants = cva("[&_svg]:size-4", {
+ variants: {
+ variant: {
+ main: "inline-flex items-center gap-1 p-2 text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground data-[active=true]:text-fd-primary data-[popup-open]:text-fd-primary",
+ button: buttonVariants({
+ color: "secondary",
+ className: "gap-1.5",
+ }),
+ icon: buttonVariants({
+ color: "ghost",
+ size: "icon",
+ }),
+ },
+ },
+ defaultVariants: {
+ variant: "main",
+ },
+});
+
+export function Header({
+ nav = {},
+ i18n = false,
+ links,
+ githubUrl,
+ themeSwitch = {},
+ searchToggle = {},
+}: HomeLayoutProps) {
+ const { navItems, menuItems } = useMemo(() => {
+ const navItems: LinkItemType[] = [];
+ const menuItems: LinkItemType[] = [];
+
+ for (const item of resolveLinkItems({ links, githubUrl })) {
+ switch (item.on ?? "all") {
+ case "menu":
+ menuItems.push(item);
+ break;
+ case "nav":
+ navItems.push(item);
+ break;
+ default:
+ navItems.push(item);
+ menuItems.push(item);
+ }
+ }
+
+ return { navItems, menuItems };
+ }, [links, githubUrl]);
+
+ const listRef = useRef(null);
+
+ return (
+ (
+
+
+ {renderTitleNav(nav, {
+ className: "inline-flex items-center gap-2.5 font-semibold",
+ })}
+ {nav.children}
+
+ );
+}
diff --git a/docs/components/fumadocs/ui/button.tsx b/docs/components/fumadocs/ui/button.tsx
new file mode 100644
index 0000000000..b427d4e080
--- /dev/null
+++ b/docs/components/fumadocs/ui/button.tsx
@@ -0,0 +1,28 @@
+import { cva, type VariantProps } from 'class-variance-authority';
+
+const variants = {
+ primary: 'bg-fd-primary text-fd-primary-foreground hover:bg-fd-primary/80',
+ outline: 'border hover:bg-fd-accent hover:text-fd-accent-foreground',
+ ghost: 'hover:bg-fd-accent hover:text-fd-accent-foreground',
+ secondary:
+ 'border bg-fd-secondary text-fd-secondary-foreground hover:bg-fd-accent hover:text-fd-accent-foreground',
+} as const;
+
+export const buttonVariants = cva(
+ 'inline-flex items-center justify-center rounded-md p-2 text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring',
+ {
+ variants: {
+ variant: variants,
+ // fumadocs use `color` instead of `variant`
+ color: variants,
+ size: {
+ sm: 'gap-1 px-2 py-1.5 text-xs',
+ icon: 'p-1.5 [&_svg]:size-5',
+ 'icon-sm': 'p-1.5 [&_svg]:size-4.5',
+ 'icon-xs': 'p-1 [&_svg]:size-4',
+ },
+ },
+ },
+);
+
+export type ButtonProps = VariantProps;
diff --git a/docs/components/fumadocs/ui/collapsible.tsx b/docs/components/fumadocs/ui/collapsible.tsx
new file mode 100644
index 0000000000..27079bd7b3
--- /dev/null
+++ b/docs/components/fumadocs/ui/collapsible.tsx
@@ -0,0 +1,32 @@
+'use client';
+import { Collapsible as Primitive } from '@base-ui/react/collapsible';
+import type { ComponentProps } from 'react';
+import { cn } from '../../../lib/fumadocs/cn';
+
+export const Collapsible = Primitive.Root;
+
+export const CollapsibleTrigger = Primitive.Trigger;
+
+export function CollapsibleContent({
+ children,
+ className,
+ ...props
+}: ComponentProps) {
+ return (
+
+ cn(
+ "overflow-hidden [&[hidden]:not([hidden='until-found'])]:hidden h-(--collapsible-panel-height) transition-[height] data-[starting-style]:h-0 data-[ending-style]:h-0",
+ typeof className === 'function' ? className(s) : className,
+ )
+ }
+ >
+ {children}
+
+ );
+}
+
+export type CollapsibleProps = Primitive.Root.Props;
+export type CollapsibleContentProps = Primitive.Panel.Props;
+export type CollapsibleTriggerProps = Primitive.Trigger.Props;
diff --git a/docs/components/fumadocs/ui/navigation-menu.tsx b/docs/components/fumadocs/ui/navigation-menu.tsx
new file mode 100644
index 0000000000..af7f262651
--- /dev/null
+++ b/docs/components/fumadocs/ui/navigation-menu.tsx
@@ -0,0 +1,70 @@
+'use client';
+import * as React from 'react';
+import { NavigationMenu as Primitive } from '@base-ui/react/navigation-menu';
+import { cn } from '../../../lib/fumadocs/cn';
+
+export type NavigationMenuContentProps = Primitive.Content.Props;
+export type NavigationMenuTriggerProps = Primitive.Trigger.Props;
+
+const NavigationMenuRoot = Primitive.Root;
+
+const NavigationMenuList = Primitive.List;
+
+const NavigationMenuItem = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ cn('list-none', typeof className === 'function' ? className(s) : className)}
+ {...props}
+ >
+ {children}
+
+));
+
+NavigationMenuItem.displayName = Primitive.Item.displayName;
+
+const NavigationMenuTrigger = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ children, ...props }, ref) => (
+
+ {children}
+
+));
+NavigationMenuTrigger.displayName = Primitive.Trigger.displayName;
+
+const NavigationMenuContent = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+ cn(
+ 'size-full p-4',
+ 'transition-[opacity,transform,translate] duration-(--duration) ease-(--easing)',
+ 'data-[starting-style]:opacity-0 data-[ending-style]:opacity-0',
+ 'data-[starting-style]:data-[activation-direction=left]:-translate-x-1/2',
+ 'data-[starting-style]:data-[activation-direction=right]:translate-x-1/2',
+ 'data-[ending-style]:data-[activation-direction=left]:translate-x-1/2',
+ 'data-[ending-style]:data-[activation-direction=right]:-translate-x-1/2',
+ typeof className === 'function' ? className(s) : className,
+ )
+ }
+ {...props}
+ />
+));
+NavigationMenuContent.displayName = Primitive.Content.displayName;
+
+const NavigationMenuLink = Primitive.Link;
+
+export {
+ NavigationMenuRoot,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+};
diff --git a/docs/components/fumadocs/ui/popover.tsx b/docs/components/fumadocs/ui/popover.tsx
new file mode 100644
index 0000000000..8955bdcdbd
--- /dev/null
+++ b/docs/components/fumadocs/ui/popover.tsx
@@ -0,0 +1,34 @@
+'use client';
+import { Popover as Primitive } from '@base-ui/react/popover';
+import * as React from 'react';
+import { cn } from '../../../lib/fumadocs/cn';
+
+const Popover = Primitive.Root;
+
+const PopoverTrigger = Primitive.Trigger;
+
+const PopoverContent = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef &
+ Pick
+>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (
+
+
+
+ cn(
+ 'z-50 origin-(--transform-origin) overflow-y-auto max-h-(--available-height) min-w-[240px] max-w-[98vw] rounded-xl border bg-fd-popover/60 backdrop-blur-lg p-2 text-sm text-fd-popover-foreground shadow-lg focus-visible:outline-none data-[closed]:animate-fd-popover-out data-[open]:animate-fd-popover-in',
+ typeof className === 'function' ? className(s) : className,
+ )
+ }
+ {...props}
+ />
+
+
+));
+PopoverContent.displayName = Primitive.Popup.displayName;
+
+const PopoverClose = Primitive.Close;
+
+export { Popover, PopoverTrigger, PopoverContent, PopoverClose };
diff --git a/docs/components/fumadocs/ui/scroll-area.tsx b/docs/components/fumadocs/ui/scroll-area.tsx
new file mode 100644
index 0000000000..fbdbce0baf
--- /dev/null
+++ b/docs/components/fumadocs/ui/scroll-area.tsx
@@ -0,0 +1,65 @@
+import { ScrollArea as Primitive } from '@base-ui/react/scroll-area';
+import * as React from 'react';
+import { cn } from '../../../lib/fumadocs/cn';
+
+const ScrollArea = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ cn('overflow-hidden', typeof className === 'function' ? className(s) : className)
+ }
+ {...props}
+ >
+ {children}
+
+
+
+));
+
+ScrollArea.displayName = Primitive.Root.displayName;
+
+const ScrollViewport = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ cn('size-full rounded-[inherit]', typeof className === 'function' ? className(s) : className)
+ }
+ {...props}
+ >
+ {children}
+
+));
+
+ScrollViewport.displayName = Primitive.Viewport.displayName;
+
+const ScrollBar = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = 'vertical', ...props }, ref) => (
+
+ cn(
+ 'flex select-none transition-opacity',
+ !s.hovering && 'opacity-0',
+ orientation === 'vertical' && 'h-full w-1.5',
+ orientation === 'horizontal' && 'h-1.5 flex-col',
+ typeof className === 'function' ? className(s) : className,
+ )
+ }
+ {...props}
+ >
+
+
+));
+ScrollBar.displayName = Primitive.Scrollbar.displayName;
+
+export { ScrollArea, ScrollBar, ScrollViewport };
+export type ScrollAreaProps = Primitive.Root.Props;
diff --git a/docs/components/provider.tsx b/docs/components/provider.tsx
new file mode 100644
index 0000000000..522282b2de
--- /dev/null
+++ b/docs/components/provider.tsx
@@ -0,0 +1,8 @@
+'use client';
+import SearchDialog from '@/components/search';
+import { RootProvider } from 'fumadocs-ui/provider/next';
+import { type ReactNode } from 'react';
+
+export function Provider({ children }: { children: ReactNode }) {
+ return {children};
+}
diff --git a/docs/components/search.tsx b/docs/components/search.tsx
new file mode 100644
index 0000000000..1f704205fd
--- /dev/null
+++ b/docs/components/search.tsx
@@ -0,0 +1,46 @@
+'use client';
+import {
+ SearchDialog,
+ SearchDialogClose,
+ SearchDialogContent,
+ SearchDialogHeader,
+ SearchDialogIcon,
+ SearchDialogInput,
+ SearchDialogList,
+ SearchDialogOverlay,
+ type SharedProps,
+} from 'fumadocs-ui/components/dialog/search';
+import { useDocsSearch } from 'fumadocs-core/search/client';
+import { create } from '@orama/orama';
+import { useI18n } from 'fumadocs-ui/contexts/i18n';
+
+function initOrama() {
+ return create({
+ schema: { _: 'string' },
+ // https://docs.orama.com/docs/orama-js/supported-languages
+ language: 'english',
+ });
+}
+
+export default function DefaultSearchDialog(props: SharedProps) {
+ const { locale } = useI18n(); // (optional) for i18n
+ const { search, setSearch, query } = useDocsSearch({
+ type: 'static',
+ initOrama,
+ locale,
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/docs/content/docs/features/ai/custom-commands.mdx b/docs/content/docs/features/ai/custom-commands.mdx
index 75b5c029db..4bf760dcd8 100644
--- a/docs/content/docs/features/ai/custom-commands.mdx
+++ b/docs/content/docs/features/ai/custom-commands.mdx
@@ -1,7 +1,6 @@
---
title: Custom AI Commands
description: Customize the AI menu items (commands) in your BlockNote rich text editor
-imageTitle: BlockNote AI
---
# Custom AI Menu Items (commands)
diff --git a/docs/content/docs/features/ai/getting-started.mdx b/docs/content/docs/features/ai/getting-started.mdx
index 36128da1ba..602d9d7d6a 100644
--- a/docs/content/docs/features/ai/getting-started.mdx
+++ b/docs/content/docs/features/ai/getting-started.mdx
@@ -1,7 +1,7 @@
---
title: Getting Started
description: Add AI functionality to your BlockNote rich text editor
-imageTitle: BlockNote AI
+imageTitle: Getting Started with BlockNote AI
---
# Getting Started with BlockNote AI
diff --git a/docs/content/docs/features/ai/index.mdx b/docs/content/docs/features/ai/index.mdx
index f6049986dd..a5ad9c6ca3 100644
--- a/docs/content/docs/features/ai/index.mdx
+++ b/docs/content/docs/features/ai/index.mdx
@@ -1,7 +1,7 @@
---
title: AI Rich Text Editing
description: Add AI functionality to your BlockNote rich text editor
-imageTitle: BlockNote AI
+imageTitle: BlockNote AI Integration
---
# BlockNote AI Integration
diff --git a/docs/content/docs/features/ai/reference.mdx b/docs/content/docs/features/ai/reference.mdx
index 15494f8720..ee8f305b5c 100644
--- a/docs/content/docs/features/ai/reference.mdx
+++ b/docs/content/docs/features/ai/reference.mdx
@@ -1,9 +1,10 @@
---
title: BlockNote AI Reference
description: Reference documentation for the BlockNote AI extension
-imageTitle: BlockNote AI
---
+# AI Reference
+
## `AIExtension`
Use `AIExtension` to create a new AI Extension that can be registered to an editor when calling `useCreateBlockNote`.
diff --git a/docs/content/docs/features/blocks/code-blocks.mdx b/docs/content/docs/features/blocks/code-blocks.mdx
index c900b10b86..26c79c7212 100644
--- a/docs/content/docs/features/blocks/code-blocks.mdx
+++ b/docs/content/docs/features/blocks/code-blocks.mdx
@@ -1,7 +1,6 @@
---
title: Code Blocks
description: How to add syntax highlighting to code blocks.
-imageTitle: Code Blocks
---
# Code Blocks
diff --git a/docs/content/docs/features/blocks/custom.mdx b/docs/content/docs/features/blocks/custom.mdx
index 95bed91865..5735a5dd3e 100644
--- a/docs/content/docs/features/blocks/custom.mdx
+++ b/docs/content/docs/features/blocks/custom.mdx
@@ -1,7 +1,6 @@
---
title: Custom
description: How to create custom blocks, inline content and styles in BlockNote.
-imageTitle: Custom
---
# Custom Blocks, Inline Content and Styles
diff --git a/docs/content/docs/features/blocks/embeds.mdx b/docs/content/docs/features/blocks/embeds.mdx
index 4845cca191..5084df8338 100644
--- a/docs/content/docs/features/blocks/embeds.mdx
+++ b/docs/content/docs/features/blocks/embeds.mdx
@@ -1,7 +1,6 @@
---
title: Embeds
description: How to use embeds in BlockNote.
-imageTitle: Embeds
---
# Embed Blocks
diff --git a/docs/content/docs/features/blocks/index.mdx b/docs/content/docs/features/blocks/index.mdx
index 18c25bba5a..7e07b6f773 100644
--- a/docs/content/docs/features/blocks/index.mdx
+++ b/docs/content/docs/features/blocks/index.mdx
@@ -1,7 +1,6 @@
---
title: Built-in Blocks
description: BlockNote supports a variety of built-in block and inline content types that are included in the editor by default.
-imageTitle: Built-in Blocks
---
# Built-in Blocks
diff --git a/docs/content/docs/features/blocks/inline-content.mdx b/docs/content/docs/features/blocks/inline-content.mdx
index 438b3aa386..23512e9e47 100644
--- a/docs/content/docs/features/blocks/inline-content.mdx
+++ b/docs/content/docs/features/blocks/inline-content.mdx
@@ -1,7 +1,6 @@
---
title: Inline Content
description: How to use inline content in BlockNote.
-imageTitle: Inline Content
---
# Inline Content
diff --git a/docs/content/docs/features/blocks/list-types.mdx b/docs/content/docs/features/blocks/list-types.mdx
index fb7c5c6b4d..edc941c1c4 100644
--- a/docs/content/docs/features/blocks/list-types.mdx
+++ b/docs/content/docs/features/blocks/list-types.mdx
@@ -1,7 +1,6 @@
---
title: List Types
description: How to use list types in BlockNote.
-imageTitle: List Types
---
# List Item Blocks
diff --git a/docs/content/docs/features/blocks/tables.mdx b/docs/content/docs/features/blocks/tables.mdx
index 8c0d232b26..6992a8b140 100644
--- a/docs/content/docs/features/blocks/tables.mdx
+++ b/docs/content/docs/features/blocks/tables.mdx
@@ -1,7 +1,6 @@
---
title: Tables
description: How to use tables in BlockNote.
-imageTitle: Tables
---
# Table Blocks
diff --git a/docs/content/docs/features/blocks/typography.mdx b/docs/content/docs/features/blocks/typography.mdx
index c88ecb0093..8e35589cb2 100644
--- a/docs/content/docs/features/blocks/typography.mdx
+++ b/docs/content/docs/features/blocks/typography.mdx
@@ -1,7 +1,6 @@
---
title: Typography
description: How to use typography blocks in BlockNote.
-imageTitle: Typography
---
# Typography Blocks
diff --git a/docs/content/docs/features/collaboration/comments.mdx b/docs/content/docs/features/collaboration/comments.mdx
index c6e8165cc2..e03aa26ccf 100644
--- a/docs/content/docs/features/collaboration/comments.mdx
+++ b/docs/content/docs/features/collaboration/comments.mdx
@@ -1,7 +1,6 @@
---
title: Comments
description: Learn how to enable comments in your BlockNote editor
-imageTitle: Comments
---
# Comments
diff --git a/docs/content/docs/features/collaboration/index.mdx b/docs/content/docs/features/collaboration/index.mdx
index 8c2557a5da..2d320ab829 100644
--- a/docs/content/docs/features/collaboration/index.mdx
+++ b/docs/content/docs/features/collaboration/index.mdx
@@ -1,7 +1,6 @@
---
title: Real-time Collaboration
description: Learn how to create multiplayer experiences with BlockNote
-imageTitle: Real-time Collaboration
---
# Real-time Collaboration (Multiplayer Text Editor)
@@ -103,5 +102,3 @@ const provider = new YPartyKitProvider(
```
To learn how to set up your own development / production servers, check out the [PartyKit docs](https://github.com/partykit/partykit) and the [BlockNote + Partykit example](https://github.com/partykit/partykit/tree/main/examples/blocknote).
-
-
diff --git a/docs/content/docs/features/custom-schemas/custom-blocks.mdx b/docs/content/docs/features/custom-schemas/custom-blocks.mdx
index 6bee335c2e..73676502c3 100644
--- a/docs/content/docs/features/custom-schemas/custom-blocks.mdx
+++ b/docs/content/docs/features/custom-schemas/custom-blocks.mdx
@@ -1,7 +1,6 @@
---
title: Custom Blocks
description: Learn how to create custom block types for your BlockNote editor
-imageTitle: Custom Blocks
---
# Custom Block Types
diff --git a/docs/content/docs/features/custom-schemas/custom-inline-content.mdx b/docs/content/docs/features/custom-schemas/custom-inline-content.mdx
index 73bc739006..efc8c424ae 100644
--- a/docs/content/docs/features/custom-schemas/custom-inline-content.mdx
+++ b/docs/content/docs/features/custom-schemas/custom-inline-content.mdx
@@ -1,7 +1,6 @@
---
title: Custom Inline Content
description: Learn how to create custom inline content for your BlockNote editor
-imageTitle: Custom Inline Content
---
# Custom Inline Content Types
@@ -61,7 +60,8 @@ type CustomInlineContentConfig = {
`content:` `styled` if your custom inline content should contain [`StyledText`](/docs/foundations/document-structure#inline-content-objects), `none` if not.
- _In the mentions demo, we want each mention to be a single, non-editable element, so we set `content` to `"none"`._
+ _In the mentions demo, we want each mention to be a single, non-editable
+ element, so we set `content` to `"none"`._
`propSchema:` The `PropSchema` specifies the props that the inline content supports. Inline content props (properties) are data stored with your inline content in the document, and can be used to customize its appearance or behavior.
@@ -96,7 +96,8 @@ If you do not want the prop to have a default value, you can define it as an obj
- `values?:` Specifies an array of values that the prop can take, for example, to limit the value to a list of pre-defined strings. If `values` is not defined, BlockNote assumes the prop can be any value of `PrimitiveType`.
- _In the mentions demo, we add a `user` prop for the user that's being mentioned._
+ _In the mentions demo, we add a `user` prop for the user that's being
+ mentioned._
### Inline Content Implementation (`ReactCustomInlineContentImplementation`)
@@ -136,7 +137,9 @@ type ReactCustomInlineContentImplementation = {
`toExternalHTML?:` This component is used whenever the inline content is being exported to HTML for use outside BlockNote, for example when copying it to the clipboard. If it's not defined, BlockNote will just use `render` for the HTML conversion. Takes the same props as `render`.
- _Note that your component passed to `toExternalHTML` is rendered and serialized in a separate React root, which means you can't use hooks that rely on React Contexts._
+ _Note that your component passed to `toExternalHTML` is rendered and
+ serialized in a separate React root, which means you can't use hooks that rely
+ on React Contexts._
`parse?:` The `parse` function defines how to parse HTML content into your inline content, for example when pasting contents from the clipboard. If the element should be parsed into your custom inline content, you return the props that the block should be given. Otherwise, return `undefined`. Takes a single argument:
@@ -146,7 +149,8 @@ type ReactCustomInlineContentImplementation = {
`meta?.draggable?:` Whether the inline content should be draggable.
- _Note that since inline content is, by definition, inline, your component should also return an HTML inline element._
+ _Note that since inline content is, by definition, inline, your component
+ should also return an HTML inline element._
## Adding Custom Inline Content to the Editor
diff --git a/docs/content/docs/features/custom-schemas/custom-styles.mdx b/docs/content/docs/features/custom-schemas/custom-styles.mdx
index 2ae91be8d0..6339ff9f37 100644
--- a/docs/content/docs/features/custom-schemas/custom-styles.mdx
+++ b/docs/content/docs/features/custom-schemas/custom-styles.mdx
@@ -1,7 +1,6 @@
---
title: Custom Styles
description: Learn how to create custom style schemas for your BlockNote editor
-imageTitle: Custom Styles
---
# Custom Style Types
diff --git a/docs/content/docs/features/custom-schemas/index.mdx b/docs/content/docs/features/custom-schemas/index.mdx
index c8298fe080..ae2dd24754 100644
--- a/docs/content/docs/features/custom-schemas/index.mdx
+++ b/docs/content/docs/features/custom-schemas/index.mdx
@@ -135,4 +135,4 @@ type MyPartialBlock = typeof schema.PartialBlock;
Alternatively, the easiest way to get full type safety without any additional work is to override all default types with your custom schema, by using a custom type definition file. See this [example blocknote.d.ts](https://github.com/TypeCellOS/BlockNote/blob/main/examples/06-custom-schema/react-custom-styles/blocknote.d.ts.example). This is an experimental feature - we would love to hear your feedback on this approach.
-
+
diff --git a/docs/content/docs/features/export/docx.mdx b/docs/content/docs/features/export/docx.mdx
index 217b088e99..2536daa6bb 100644
--- a/docs/content/docs/features/export/docx.mdx
+++ b/docs/content/docs/features/export/docx.mdx
@@ -1,7 +1,7 @@
---
title: DOCX
description: Export BlockNote documents to a docx word (Office Open XML) file.
-imageTitle: BlockNote DOCX Export
+imageTitle: DOCX Export
path: /docs/export-to-docx
---
diff --git a/docs/content/docs/features/export/email.mdx b/docs/content/docs/features/export/email.mdx
index a6599b7694..b36f7ccd58 100644
--- a/docs/content/docs/features/export/email.mdx
+++ b/docs/content/docs/features/export/email.mdx
@@ -1,13 +1,11 @@
---
-title: Email
+title: Email Export
description: Export BlockNote documents to an email using React Email.
-imageTitle: BlockNote Email Export
-path: /docs/export-to-email
---
# Email Export
-It's possible to export BlockNote documents to email, completely client-side.
+It's possible to export BlockNote documents to email-compatible HTML, completely client-side.
This feature is provided by the `@blocknote/xl-email-exporter`. `xl-` packages
@@ -60,7 +58,7 @@ See the [full example](/examples/interoperability/converting-blocks-to-react-ema
Example usage:
-```tsx twoslash
+```tsx
import React from "react";
import {
ReactEmailExporter,
diff --git a/docs/content/docs/features/export/html.mdx b/docs/content/docs/features/export/html.mdx
index 74d59f1dd9..93e0aea8f7 100644
--- a/docs/content/docs/features/export/html.mdx
+++ b/docs/content/docs/features/export/html.mdx
@@ -1,7 +1,7 @@
---
title: HTML
description: It's possible to export Blocks to HTML, completely client-side.
-imageTitle: BlockNote HTML Export
+imageTitle: HTML Export
path: /docs/converting-blocks
---
diff --git a/docs/content/docs/features/export/markdown.mdx b/docs/content/docs/features/export/markdown.mdx
index dce5661a95..65ef462f25 100644
--- a/docs/content/docs/features/export/markdown.mdx
+++ b/docs/content/docs/features/export/markdown.mdx
@@ -1,7 +1,7 @@
---
title: Markdown
description: It's possible to export Blocks to Markdown, completely client-side.
-imageTitle: BlockNote Markdown Export
+imageTitle: Markdown Export
path: /docs/converting-blocks
---
diff --git a/docs/content/docs/features/export/odt.mdx b/docs/content/docs/features/export/odt.mdx
index 45f463f3ce..3f5248a875 100644
--- a/docs/content/docs/features/export/odt.mdx
+++ b/docs/content/docs/features/export/odt.mdx
@@ -1,7 +1,7 @@
---
title: ODT
description: Export BlockNote documents to an ODT (Open Document Text) file.
-imageTitle: BlockNote ODT Export
+imageTitle: ODT Export
path: /docs/export-to-odt
---
diff --git a/docs/content/docs/features/export/pdf.mdx b/docs/content/docs/features/export/pdf.mdx
index a3bad92ae3..08594cf96f 100644
--- a/docs/content/docs/features/export/pdf.mdx
+++ b/docs/content/docs/features/export/pdf.mdx
@@ -1,7 +1,7 @@
---
title: PDF
description: Export BlockNote documents to a PDF.
-imageTitle: BlockNote PDF Export
+imageTitle: PDF Export
path: /docs/export-to-pdf
---
diff --git a/docs/content/docs/features/import/html.mdx b/docs/content/docs/features/import/html.mdx
index b44f7fcabc..36f828fe4d 100644
--- a/docs/content/docs/features/import/html.mdx
+++ b/docs/content/docs/features/import/html.mdx
@@ -1,7 +1,7 @@
---
title: HTML
description: It's possible to export or import Blocks to and from HTML.
-imageTitle: BlockNote HTML Export
+imageTitle: HTML Ixport
---
# HTML Import
diff --git a/docs/content/docs/features/import/markdown.mdx b/docs/content/docs/features/import/markdown.mdx
index e33564db98..9248790b2b 100644
--- a/docs/content/docs/features/import/markdown.mdx
+++ b/docs/content/docs/features/import/markdown.mdx
@@ -1,8 +1,7 @@
---
title: Markdown
description: It's possible to import Markdown content into BlockNote blocks, completely client-side.
-imageTitle: BlockNote Markdown Import
-path: /docs/converting-blocks
+imageTitle: Markdown Import
---
# Markdown Import
diff --git a/docs/content/docs/features/server-processing.mdx b/docs/content/docs/features/server-processing.mdx
index a766fa7a15..505edadce7 100644
--- a/docs/content/docs/features/server-processing.mdx
+++ b/docs/content/docs/features/server-processing.mdx
@@ -1,7 +1,6 @@
---
title: Server-side processing
description: Use `ServerBlockNoteEditor` to process Blocks on the server.
-imageTitle: Server-side processing
path: /docs/server-side-processing
---
diff --git a/docs/content/docs/foundations/document-structure.mdx b/docs/content/docs/foundations/document-structure.mdx
index 60a43d668c..e70540437d 100644
--- a/docs/content/docs/foundations/document-structure.mdx
+++ b/docs/content/docs/foundations/document-structure.mdx
@@ -1,7 +1,6 @@
---
title: Document Structure
description: Learn how documents (the content of the rich text editor) are structured to make the most out of BlockNote.
-imageTitle: Document Structure
---
# Document Structure
@@ -74,8 +73,7 @@ type CustomInlineContent = {
};
type InlineContent = Link | StyledText | CustomInlineContent;
-
-````
+```
The `styles` property is explained below.
diff --git a/docs/content/docs/foundations/manipulating-content.mdx b/docs/content/docs/foundations/manipulating-content.mdx
index 984172cc4b..5fa4584310 100644
--- a/docs/content/docs/foundations/manipulating-content.mdx
+++ b/docs/content/docs/foundations/manipulating-content.mdx
@@ -1,7 +1,6 @@
---
title: Manipulating Blocks
description: Learn how to manipulate blocks in the editor.
-imageTitle: Manipulating Blocks
---
# Manipulating Blocks
diff --git a/docs/content/docs/foundations/schemas.mdx b/docs/content/docs/foundations/schemas.mdx
index 8cc9137185..cd4c0f679c 100644
--- a/docs/content/docs/foundations/schemas.mdx
+++ b/docs/content/docs/foundations/schemas.mdx
@@ -1,7 +1,6 @@
---
title: Schemas
description: Learn about how content types are defined in the editor.
-imageTitle: Schemas
---
# Schemas
diff --git a/docs/content/docs/foundations/supported-formats.mdx b/docs/content/docs/foundations/supported-formats.mdx
index e0291b8baf..4b5c89e71c 100644
--- a/docs/content/docs/foundations/supported-formats.mdx
+++ b/docs/content/docs/foundations/supported-formats.mdx
@@ -1,7 +1,6 @@
---
title: Format Interoperability
description: Learn about the formats BlockNote supports for importing and exporting content.
-imageTitle: Format Interoperability
---
# Format Interoperability
diff --git a/docs/content/docs/getting-started/ariakit.mdx b/docs/content/docs/getting-started/ariakit.mdx
index 26918ea8e0..bb5a2b2036 100644
--- a/docs/content/docs/getting-started/ariakit.mdx
+++ b/docs/content/docs/getting-started/ariakit.mdx
@@ -1,7 +1,6 @@
---
title: With Ariakit
description: Ariakit rich text editor with BlockNote
-imageTitle: BlockNote with Ariakit
---
# Getting Started With Ariakit
diff --git a/docs/content/docs/getting-started/editor-setup.mdx b/docs/content/docs/getting-started/editor-setup.mdx
index a3c62bb08e..3881e88acd 100644
--- a/docs/content/docs/getting-started/editor-setup.mdx
+++ b/docs/content/docs/getting-started/editor-setup.mdx
@@ -1,7 +1,6 @@
---
title: Editor Setup
description: Learn how to set up the editor.
-imageTitle: Editor Setup
---
# Editor Setup
diff --git a/docs/content/docs/getting-started/mantine.mdx b/docs/content/docs/getting-started/mantine.mdx
index 8dbc70680c..013b7d3493 100644
--- a/docs/content/docs/getting-started/mantine.mdx
+++ b/docs/content/docs/getting-started/mantine.mdx
@@ -1,7 +1,6 @@
---
title: With Mantine
description: Mantine rich text editor using BlockNote
-imageTitle: Mantine rich text editor using BlockNote
---
# Getting Started With Mantine
diff --git a/docs/content/docs/getting-started/nextjs.mdx b/docs/content/docs/getting-started/nextjs.mdx
index 72bd3f1ca7..8e3a73a8ce 100644
--- a/docs/content/docs/getting-started/nextjs.mdx
+++ b/docs/content/docs/getting-started/nextjs.mdx
@@ -1,7 +1,6 @@
---
title: With Next.js
description: Details on integrating BlockNote with Next.js
-imageTitle: Next.js support
---
# Getting Started With Next.js
diff --git a/docs/content/docs/getting-started/shadcn.mdx b/docs/content/docs/getting-started/shadcn.mdx
index 256c61c112..da0598ede0 100644
--- a/docs/content/docs/getting-started/shadcn.mdx
+++ b/docs/content/docs/getting-started/shadcn.mdx
@@ -1,7 +1,6 @@
---
title: With ShadCN
description: ShadCN rich text editor using BlockNote
-imageTitle: ShadCN rich text editor using BlockNote
---
# Getting Started With ShadCN
diff --git a/docs/content/docs/getting-started/vanilla-js.mdx b/docs/content/docs/getting-started/vanilla-js.mdx
index 857db534aa..54aff2fae5 100644
--- a/docs/content/docs/getting-started/vanilla-js.mdx
+++ b/docs/content/docs/getting-started/vanilla-js.mdx
@@ -1,7 +1,6 @@
---
title: With Vanilla JS
description: BlockNote is mainly designed as a quick and easy drop-in block-based editor for React apps, but can also be used in vanilla JavaScript apps.
-imageTitle: Usage Without React (Vanilla JS)
---
# Getting Started With Vanilla JS
diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx
index be81994292..6585e7a5e4 100644
--- a/docs/content/docs/index.mdx
+++ b/docs/content/docs/index.mdx
@@ -1,7 +1,6 @@
---
title: Introduction
description: BlockNote is a block-based rich-text editor for React, focused on providing a great out-of-the-box experience with minimal setup.
-imageTitle: Introduction to BlockNote
---
# Introduction to BlockNote
diff --git a/docs/content/docs/react/components/formatting-toolbar.mdx b/docs/content/docs/react/components/formatting-toolbar.mdx
index d676d8c787..962035ba57 100644
--- a/docs/content/docs/react/components/formatting-toolbar.mdx
+++ b/docs/content/docs/react/components/formatting-toolbar.mdx
@@ -1,8 +1,6 @@
---
title: Formatting Toolbar
description: The Formatting Toolbar appears whenever you highlight text in the editor.
-imageTitle: Formatting Toolbar
-path: /docs/formatting-toolbar
---
# Formatting Toolbar
diff --git a/docs/content/docs/react/components/grid-suggestion-menus.mdx b/docs/content/docs/react/components/grid-suggestion-menus.mdx
index d4cb83d3c9..8fe53197f8 100644
--- a/docs/content/docs/react/components/grid-suggestion-menus.mdx
+++ b/docs/content/docs/react/components/grid-suggestion-menus.mdx
@@ -1,7 +1,6 @@
---
title: Grid Suggestion Menus
description: In addition to displaying Suggestion Menus as stacks, BlockNote also supports displaying them as grids.
-imageTitle: Grid Suggestion Menus
---
# Grid Suggestion Menus
diff --git a/docs/content/docs/react/components/hyperlink-toolbar.mdx b/docs/content/docs/react/components/hyperlink-toolbar.mdx
index f6a72d47d4..436fc88116 100644
--- a/docs/content/docs/react/components/hyperlink-toolbar.mdx
+++ b/docs/content/docs/react/components/hyperlink-toolbar.mdx
@@ -1,8 +1,6 @@
---
title: Link Toolbar
description: The Link Toolbar appears whenever you hover a link in the editor.
-imageTitle: Link Toolbar
-path: /docs/link-toolbar
---
# Link Toolbar
diff --git a/docs/content/docs/react/components/image-toolbar.mdx b/docs/content/docs/react/components/image-toolbar.mdx
index fe6716a7e5..e76c47a1a7 100644
--- a/docs/content/docs/react/components/image-toolbar.mdx
+++ b/docs/content/docs/react/components/image-toolbar.mdx
@@ -1,8 +1,6 @@
---
title: File Panel
description: The File Panel appears whenever you select an image that doesn't have a URL, or when you click the "Replace File" button in the Formatting Panel when an image is selected.
-imageTitle: File Panel
-path: /docs/image-toolbar
---
# File Panel
diff --git a/docs/content/docs/react/components/index.mdx b/docs/content/docs/react/components/index.mdx
index 217bdd3b32..72deabe9ab 100644
--- a/docs/content/docs/react/components/index.mdx
+++ b/docs/content/docs/react/components/index.mdx
@@ -1,8 +1,6 @@
---
title: UI Components
description: BlockNote includes a number of UI Components (like menus and toolbars) that can be completely customized.
-imageTitle: UI Components
-path: /docs/ui-components
---
# UI Components
@@ -15,4 +13,4 @@ BlockNote includes a number of UI Components (like menus and toolbars) that can
{/* - Link Toolbar */}
{/* - [Image Toolbar](/docs/react/components/image-toolbar) */}
-
+
diff --git a/docs/content/docs/react/components/side-menu.mdx b/docs/content/docs/react/components/side-menu.mdx
index 4d8dfa698a..cec3bfedc5 100644
--- a/docs/content/docs/react/components/side-menu.mdx
+++ b/docs/content/docs/react/components/side-menu.mdx
@@ -1,8 +1,6 @@
---
title: Block Side Menu
description: The Block Side Menu appears on the left side whenever you hover a block.
-imageTitle: Block Side Menu
-path: /docs/side-menu
---
# Block Side Menu
diff --git a/docs/content/docs/react/components/suggestion-menus.mdx b/docs/content/docs/react/components/suggestion-menus.mdx
index f0fde39dff..db9b8421a6 100644
--- a/docs/content/docs/react/components/suggestion-menus.mdx
+++ b/docs/content/docs/react/components/suggestion-menus.mdx
@@ -1,8 +1,6 @@
---
title: Suggestion Menus
description: Suggestion Menus appear when the user enters a trigger character, and text after the character is used to filter the menu items.
-imageTitle: Suggestion Menus
-path: /docs/slash-menu
---
# Suggestion Menus
diff --git a/docs/content/docs/react/overview.mdx b/docs/content/docs/react/overview.mdx
index 47be04c457..da09fe2a3c 100644
--- a/docs/content/docs/react/overview.mdx
+++ b/docs/content/docs/react/overview.mdx
@@ -1,7 +1,7 @@
---
title: Overview
-description: Learn how to manipulate the content of the editor.
-imageTitle: Manipulating Content
+description: Learn how to use BlockNote With React
+imageTitle: Using BlockNote With React
---
# Using BlockNote With React
diff --git a/docs/content/docs/react/styling-theming/adding-dom-attributes.mdx b/docs/content/docs/react/styling-theming/adding-dom-attributes.mdx
index 32ad13b989..596b5c7fc1 100644
--- a/docs/content/docs/react/styling-theming/adding-dom-attributes.mdx
+++ b/docs/content/docs/react/styling-theming/adding-dom-attributes.mdx
@@ -1,8 +1,6 @@
---
title: Adding DOM Attributes
description: BlockNote allows you to change how the editor UI looks. You can change the theme of the default UI, or override its CSS styles.
-imageTitle: Styling & Theming
-path: /docs/theming
---
# Adding DOM Attributes
diff --git a/docs/content/docs/react/styling-theming/index.mdx b/docs/content/docs/react/styling-theming/index.mdx
index c24e4b7f51..66c2b7aac2 100644
--- a/docs/content/docs/react/styling-theming/index.mdx
+++ b/docs/content/docs/react/styling-theming/index.mdx
@@ -1,8 +1,6 @@
---
title: Styling & Theming
description: You can completely change the look and feel of the BlockNote editor. Change basic styling quickly with theme CSS variables, or apply more complex styles with additional CSS rules.
-imageTitle: Styling & Theming
-path: /docs/styling-theming
---
# Styling & Theming
@@ -11,4 +9,4 @@ You can completely change the look and feel of the BlockNote editor. Change basi
If you want to change, remove, or entirely replace the React components for menus & toolbars, see [UI Components](/docs/react/components).
-
+
diff --git a/docs/content/docs/react/styling-theming/overriding-css.mdx b/docs/content/docs/react/styling-theming/overriding-css.mdx
index 54f110d927..fe7c2047c1 100644
--- a/docs/content/docs/react/styling-theming/overriding-css.mdx
+++ b/docs/content/docs/react/styling-theming/overriding-css.mdx
@@ -1,8 +1,6 @@
---
title: Overriding CSS
description: You can change any styles applied to the editor by setting your own CSS styles.
-imageTitle: Overriding CSS
-path: docs/react/styling-theming/overriding-css
---
# Overriding CSS
diff --git a/docs/content/docs/react/styling-theming/themes.mdx b/docs/content/docs/react/styling-theming/themes.mdx
index 43f786506c..a0b0631e3e 100644
--- a/docs/content/docs/react/styling-theming/themes.mdx
+++ b/docs/content/docs/react/styling-theming/themes.mdx
@@ -1,8 +1,6 @@
---
title: Themes
description: Themes let you quickly change the basic look of the editor UI, including colors, borders, shadows, and font.
-imageTitle: Themes
-path: /docs/styling-theming/theming
---
# Themes
diff --git a/docs/content/docs/reference/editor/cursor-selections.mdx b/docs/content/docs/reference/editor/cursor-selections.mdx
index 8a51bbd6d6..c437f845ee 100644
--- a/docs/content/docs/reference/editor/cursor-selections.mdx
+++ b/docs/content/docs/reference/editor/cursor-selections.mdx
@@ -1,7 +1,6 @@
---
title: Cursor & Selections
description: Handle cursor positions and text selections in the editor
-imageTitle: Cursor & Selections
---
# Cursor & Selections
diff --git a/docs/content/docs/reference/editor/events.mdx b/docs/content/docs/reference/editor/events.mdx
index e575c8b883..16cce965ff 100644
--- a/docs/content/docs/reference/editor/events.mdx
+++ b/docs/content/docs/reference/editor/events.mdx
@@ -1,7 +1,6 @@
---
title: Events
description: BlockNote emits events when certain actions occur in the editor
-imageTitle: Events
---
# Events
diff --git a/docs/content/docs/reference/editor/low-level.mdx.bak b/docs/content/docs/reference/editor/low-level.mdx.bak
index f3a26d3519..e11e891e72 100644
--- a/docs/content/docs/reference/editor/low-level.mdx.bak
+++ b/docs/content/docs/reference/editor/low-level.mdx.bak
@@ -1,7 +1,6 @@
---
title: Low-level APIs
description: Advanced APIs for direct editor state manipulation and ProseMirror integration
-imageTitle: Low-level APIs
---
# Low-level APIs
diff --git a/docs/content/docs/reference/editor/manipulating-content.mdx b/docs/content/docs/reference/editor/manipulating-content.mdx
index f1ab97d845..9adea6e21c 100644
--- a/docs/content/docs/reference/editor/manipulating-content.mdx
+++ b/docs/content/docs/reference/editor/manipulating-content.mdx
@@ -1,7 +1,6 @@
---
title: Manipulating Content
description: How to read, create, update, and remove blocks and inline content in the BlockNote editor
-imageTitle: Manipulating Content
---
# Manipulating Content
diff --git a/docs/content/docs/reference/editor/paste-handling.mdx b/docs/content/docs/reference/editor/paste-handling.mdx
index b8c55831ba..4115afb2cf 100644
--- a/docs/content/docs/reference/editor/paste-handling.mdx
+++ b/docs/content/docs/reference/editor/paste-handling.mdx
@@ -1,7 +1,6 @@
---
title: Paste Handling
description: This section explains how to handle paste events in BlockNote.
-imageTitle: Paste Handling
---
# Paste Handling
diff --git a/docs/content/docs/reference/editor/yjs-utilities.mdx b/docs/content/docs/reference/editor/yjs-utilities.mdx
index 50ead8d1c6..1b2f7cba30 100644
--- a/docs/content/docs/reference/editor/yjs-utilities.mdx
+++ b/docs/content/docs/reference/editor/yjs-utilities.mdx
@@ -1,7 +1,6 @@
---
title: YJS Utilities
description: Utilities for converting between BlockNote blocks and YJS collaborative documents
-imageTitle: YJS Utilities
---
# YJS Utilities
diff --git a/docs/content/examples/index.mdx b/docs/content/examples/index.mdx
index 3c5ab43e9f..2792a08136 100644
--- a/docs/content/examples/index.mdx
+++ b/docs/content/examples/index.mdx
@@ -1,7 +1,6 @@
---
title: Examples
description: Explore BlockNote examples
-imageTitle: Examples
---
Browse through the examples below to see how to use and customize BlockNote. Want to contribute? Copy the [basic example on StackBlitz](https://stackblitz.com/github/TypeCellOS/BlockNote/tree/main/examples/01-basic/01-minimal/) and submit a PR.
diff --git a/docs/content/pages/about.mdx b/docs/content/pages/about.mdx
index 8145aad790..a3731ec631 100644
--- a/docs/content/pages/about.mdx
+++ b/docs/content/pages/about.mdx
@@ -1,7 +1,6 @@
---
title: About
description: BlockNote is an open source project led by Matthew Lipski, Nick Perez, and Yousef El-Dardiry. It's made possible by our partners, sponsors, and community members.
-imageTitle: About
---
# About BlockNote
diff --git a/docs/content/pages/blocknote-xl-commercial-license.mdx b/docs/content/pages/legal/blocknote-xl-commercial-license.mdx
similarity index 99%
rename from docs/content/pages/blocknote-xl-commercial-license.mdx
rename to docs/content/pages/legal/blocknote-xl-commercial-license.mdx
index e07430bf9b..26a7b72faa 100644
--- a/docs/content/pages/blocknote-xl-commercial-license.mdx
+++ b/docs/content/pages/legal/blocknote-xl-commercial-license.mdx
@@ -1,7 +1,6 @@
---
title: BlockNote XL Commercial License
description: BlockNote XL Commercial License
-imageTitle: BlockNote XL Commercial License
---
# BlockNote XL Commercial License
diff --git a/docs/content/pages/privacy-policy.mdx b/docs/content/pages/legal/privacy-policy.mdx
similarity index 99%
rename from docs/content/pages/privacy-policy.mdx
rename to docs/content/pages/legal/privacy-policy.mdx
index 3817ddb057..22d3fa9669 100644
--- a/docs/content/pages/privacy-policy.mdx
+++ b/docs/content/pages/legal/privacy-policy.mdx
@@ -1,7 +1,6 @@
---
title: Privacy Policy
description: We are BlockNote (OpenBlocks B.V.). We take your privacy seriously.
-imageTitle: Privacy Policy
---
# Privacy Policy BlockNote
@@ -130,4 +129,4 @@ In the event that you wish to exercise these rights, or in the event of other qu
BlockNote (OpenBlocks B.V.)
-[team@blocknotejs.org](team@blocknotejs.org)
+team@blocknotejs.org
diff --git a/docs/content/pages/service-level-agreement.mdx b/docs/content/pages/legal/service-level-agreement.mdx
similarity index 98%
rename from docs/content/pages/service-level-agreement.mdx
rename to docs/content/pages/legal/service-level-agreement.mdx
index 72abf1099f..b733dbda1e 100644
--- a/docs/content/pages/service-level-agreement.mdx
+++ b/docs/content/pages/legal/service-level-agreement.mdx
@@ -1,7 +1,6 @@
---
title: Service Level Agreement for Technical Support
description: Service Level Agreement for Technical Support
-imageTitle: Service Level Agreement for Technical Support
---
# Service Level Agreement for Technical Support
diff --git a/docs/content/pages/terms-and-conditions.mdx b/docs/content/pages/legal/terms-and-conditions.mdx
similarity index 98%
rename from docs/content/pages/terms-and-conditions.mdx
rename to docs/content/pages/legal/terms-and-conditions.mdx
index 4dfc202a43..7b595aeb50 100644
--- a/docs/content/pages/terms-and-conditions.mdx
+++ b/docs/content/pages/legal/terms-and-conditions.mdx
@@ -1,7 +1,6 @@
---
title: Terms & Conditions
description: These are our general terms and conditions.
-imageTitle: Terms & Conditions
---
# General terms and conditions
@@ -21,7 +20,7 @@ When we refer to _you_ in these Terms, we mean you as a user of our BlockNote.
## Questions?
-If you have any questions regarding these Terms or BlockNote, do not hesitate to contact us by sending an email to [team@blocknotejs.org](team@blocknotejs.org).
+If you have any questions regarding these Terms or BlockNote, do not hesitate to contact us by sending an email to team@blocknotejs.org.
### Applicability of these Terms
@@ -41,7 +40,7 @@ If you have any questions regarding these Terms or BlockNote, do not hesitate to
1. Before the use of BlockNote Pro you must enter into an agreement with us (**Subscription**). You can find more information about our Subscriptions on our Website.
2. The term of the Subscription (**Subscription Period**) will be agreed during the application procedure. The Subscription will commence on the date as agreed during the application procedure (**Start Date**).
3. If you have chosen a Subscription Period of 1 year, your Subscription will be automatically renewed, each time for the period of 12 months. If you have chosen a Subscription Period of 1 month, your Subscription will be renewed automatically, each time for the period of 1 month.
-4. You can cancel your Subscription before the end of the Subscription Period. You can cancel your subscription via the subscriber dashboard or by sending an email to [team@blocknotejs.org](team@blocknotejs.org).
+4. You can cancel your Subscription before the end of the Subscription Period. You can cancel your subscription via the subscriber dashboard or by sending an email to team@blocknotejs.org.
5. If you are a Consumer, you have the right to cancel your Subscription within 14 days of the Start Date. We will refund the payment to your means of payment if you have already made a payment for your Subscription.
### Prices
diff --git a/docs/content/pages/thanks.mdx b/docs/content/pages/thanks.mdx
index da7602f644..94a7a2ba9b 100644
--- a/docs/content/pages/thanks.mdx
+++ b/docs/content/pages/thanks.mdx
@@ -1,7 +1,6 @@
---
title: Thank You for Subscribing!
description: We're thrilled to have you as a BlockNote subscriber!
-imageTitle: Thank you for subscribing to BlockNote!
---
# Thank You for Subscribing!
diff --git a/docs/eslint.config.mjs b/docs/eslint.config.mjs
new file mode 100644
index 0000000000..bc72ced675
--- /dev/null
+++ b/docs/eslint.config.mjs
@@ -0,0 +1,17 @@
+import nextVitals from "eslint-config-next/core-web-vitals";
+import { defineConfig, globalIgnores } from "eslint/config";
+
+const eslintConfig = defineConfig([
+ ...nextVitals,
+ globalIgnores([
+ ".next/**",
+ "out/**",
+ "build/**",
+ "next-env.d.ts",
+ ".source/**",
+ "components/fumadocs/**",
+ "components/example/generated/**", // TODO: fix lint of examples
+ ]),
+]);
+
+export default eslintConfig;
diff --git a/docs/instrumentation-client.ts b/docs/instrumentation-client.ts
index f8e21d5500..96a933a35e 100644
--- a/docs/instrumentation-client.ts
+++ b/docs/instrumentation-client.ts
@@ -8,12 +8,12 @@ Sentry.init({
dsn: "https://31af815601e4174f4443c863953eebe7@o4508925169500160.ingest.de.sentry.io/4508925646078032",
// Add optional integrations for additional features
- integrations: [
- Sentry.replayIntegration(),
- ],
+ integrations: [Sentry.replayIntegration()],
// Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
tracesSampleRate: 1,
+ // Enable logs to be sent to Sentry
+ enableLogs: true,
// Define how likely Replay events are sampled.
// This sets the sample rate to be 10%. You may want this to be 100% while
@@ -23,8 +23,12 @@ Sentry.init({
// Define how likely Replay events are sampled when an error occurs.
replaysOnErrorSampleRate: 1.0,
+ // Enable sending user PII (Personally Identifiable Information)
+ // https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options/#sendDefaultPii
+ sendDefaultPii: false,
+
// Setting this option to true will print useful information to the console while you're setting up Sentry.
debug: false,
});
-export const onRouterTransitionStart = Sentry.captureRouterTransitionStart;
\ No newline at end of file
+export const onRouterTransitionStart = Sentry.captureRouterTransitionStart;
diff --git a/docs/instrumentation.ts b/docs/instrumentation.ts
index 964f937c43..7cbe93c132 100644
--- a/docs/instrumentation.ts
+++ b/docs/instrumentation.ts
@@ -1,12 +1,12 @@
-import * as Sentry from '@sentry/nextjs';
+import * as Sentry from "@sentry/nextjs";
export async function register() {
- if (process.env.NEXT_RUNTIME === 'nodejs') {
- await import('./sentry.server.config');
+ if (process.env.NEXT_RUNTIME === "nodejs") {
+ await import("./sentry.server.config");
}
- if (process.env.NEXT_RUNTIME === 'edge') {
- await import('./sentry.edge.config');
+ if (process.env.NEXT_RUNTIME === "edge") {
+ await import("./sentry.edge.config");
}
}
diff --git a/docs/util/auth-client.ts b/docs/lib/auth-client.ts
similarity index 66%
rename from docs/util/auth-client.ts
rename to docs/lib/auth-client.ts
index 5a60fb8ba5..ba5062cb3c 100644
--- a/docs/util/auth-client.ts
+++ b/docs/lib/auth-client.ts
@@ -1,8 +1,10 @@
-import { createAuthClient } from "better-auth/react";
-import { customSessionClient } from "better-auth/client/plugins";
-import { magicLinkClient } from "better-auth/client/plugins";
+import type { auth } from "@/lib/auth";
import { polarClient } from "@polar-sh/better-auth";
-import type { auth } from "@/auth";
+import {
+ customSessionClient,
+ magicLinkClient,
+} from "better-auth/client/plugins";
+import { createAuthClient } from "better-auth/react";
export const authClient = createAuthClient({
plugins: [
diff --git a/docs/auth.ts b/docs/lib/auth.ts
similarity index 95%
rename from docs/auth.ts
rename to docs/lib/auth.ts
index 54a03e9f28..bd7e3139d6 100644
--- a/docs/auth.ts
+++ b/docs/lib/auth.ts
@@ -1,15 +1,17 @@
-import { polar, checkout, portal, webhooks } from "@polar-sh/better-auth";
+import { checkout, polar, portal, webhooks } from "@polar-sh/better-auth";
import { Polar } from "@polar-sh/sdk";
import * as Sentry from "@sentry/nextjs";
import { betterAuth } from "better-auth";
-import { createAuthMiddleware } from "better-auth/api";
-import { customSession, magicLink, openAPI } from "better-auth/plugins";
+import {
+ createAuthMiddleware,
+ customSession,
+ magicLink,
+} from "better-auth/plugins";
import { github } from "better-auth/social-providers";
import Database from "better-sqlite3";
import { Pool } from "pg";
-
-import { PRODUCTS } from "./util/product-list";
-import { sendEmail } from "./util/send-mail";
+import { PRODUCTS } from "./product-list";
+import { sendEmail } from "./send-mail";
export const polarClient = new Polar({
accessToken: process.env.POLAR_ACCESS_TOKEN,
@@ -77,13 +79,12 @@ export const auth = betterAuth({
tier {
name
monthlyPriceInDollars
- }
+ }
}
}
}`,
}),
});
-
if (resSponsor.ok) {
// Mock data. TODO: disable and test actial data
// profile.sponsorInfo = {
@@ -94,11 +95,9 @@ export const auth = betterAuth({
// },
// };
// use API data:
-
const data = await resSponsor.json();
- // eslint-disable-next-line no-console
+ //// eslint-disable-next-line no-console
console.log("sponsor data", data);
-
// {
// "data": {
// "user": {
@@ -112,23 +111,19 @@ export const auth = betterAuth({
// }
// }
// }
-
const sponsorInfo: null | {
isActive: boolean;
tier: {
monthlyPriceInDollars: number;
};
} = data.data.user.sponsorshipForViewerAsSponsor;
-
if (!sponsorInfo?.isActive) {
return {};
}
-
return {
ghSponsorInfo: JSON.stringify(sponsorInfo),
};
}
-
return {};
},
}).getUserInfo(token))!;
@@ -194,7 +189,7 @@ export const auth = betterAuth({
}),
// Just temporary for testing
// Serves on http://localhost:3000/api/auth/reference
- openAPI(),
+ // openAPI(),
polar({
client: polarClient,
// Enable automatic Polar Customer creation on signup
@@ -253,7 +248,10 @@ export const auth = betterAuth({
],
onAPIError: {
onError: (error) => {
- Sentry.captureException(error);
+ Sentry.captureException(error, {
+ tags: { source: "better-auth" },
+ level: "fatal",
+ });
},
},
hooks: {
diff --git a/docs/lib/fumadocs/README.md b/docs/lib/fumadocs/README.md
new file mode 100644
index 0000000000..8830900a4d
--- /dev/null
+++ b/docs/lib/fumadocs/README.md
@@ -0,0 +1 @@
+files in this directory have been added by ejecting parts of fumadocs with `npx @fumadocs/cli customise`
diff --git a/docs/lib/fumadocs/cn.ts b/docs/lib/fumadocs/cn.ts
new file mode 100644
index 0000000000..ba66fd250b
--- /dev/null
+++ b/docs/lib/fumadocs/cn.ts
@@ -0,0 +1 @@
+export { twMerge as cn } from 'tailwind-merge';
diff --git a/docs/lib/fumadocs/merge-refs.ts b/docs/lib/fumadocs/merge-refs.ts
new file mode 100644
index 0000000000..cf019f13b0
--- /dev/null
+++ b/docs/lib/fumadocs/merge-refs.ts
@@ -0,0 +1,13 @@
+import type * as React from 'react';
+
+export function mergeRefs(...refs: (React.Ref | undefined)[]): React.RefCallback {
+ return (value) => {
+ refs.forEach((ref) => {
+ if (typeof ref === 'function') {
+ ref(value);
+ } else if (ref) {
+ ref.current = value;
+ }
+ });
+ };
+}
diff --git a/docs/lib/fumadocs/urls.ts b/docs/lib/fumadocs/urls.ts
new file mode 100644
index 0000000000..2cc3b4efd0
--- /dev/null
+++ b/docs/lib/fumadocs/urls.ts
@@ -0,0 +1,14 @@
+export function normalize(urlOrPath: string) {
+ if (urlOrPath.length > 1 && urlOrPath.endsWith('/')) return urlOrPath.slice(0, -1);
+ return urlOrPath;
+}
+
+/**
+ * @returns if `href` is matching the given pathname
+ */
+export function isActive(href: string, pathname: string, nested = true): boolean {
+ href = normalize(href);
+ pathname = normalize(pathname);
+
+ return href === pathname || (nested && pathname.startsWith(`${href}/`));
+}
diff --git a/docs/lib/get-llm-text.ts b/docs/lib/get-llm-text.ts
deleted file mode 100644
index bbf1a40940..0000000000
--- a/docs/lib/get-llm-text.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { remark } from "remark";
-import remarkGfm from "remark-gfm";
-import { remarkInstall } from "fumadocs-docgen";
-import remarkMdx from "remark-mdx";
-import { remarkAutoTypeTable } from "fumadocs-typescript";
-import { remarkInclude } from "fumadocs-mdx/config";
-
-const processor = remark()
- .use(remarkMdx)
- .use(remarkInclude)
- .use(remarkGfm)
- .use(remarkAutoTypeTable)
- .use(remarkInstall);
-
-export type LLMData = {
- data: {
- title: string;
- description?: string;
- content: string;
- _file: {
- absolutePath: string;
- };
- };
- url: string;
- file: {
- path: string;
- };
-};
-
-// Function to rewrite links in markdown content
-function rewriteLinks(content: string): string {
- return (
- content
- // Rewrite absolute docs links: /docs/something -> /llms.mdx/docs/something
- .replace(/\[([^\]]+)\]\(\/docs\/([^)]+)\)/g, "[$1](/llms.mdx/docs/$2)")
- // Rewrite relative docs links: docs/something -> /llms.mdx/docs/something
- .replace(/\[([^\]]+)\]\(docs\/([^)]+)\)/g, "[$1](/llms.mdx/docs/$2)")
- // Handle links without text: /docs/something -> /llms.mdx/docs/something
- .replace(/\(\/docs\/([^)]+)\)/g, "(/llms.mdx/docs/$1)")
- .replace(/\(docs\/([^)]+)\)/g, "(/llms.mdx/docs/$1)")
- );
-}
-
-export async function getLLMText(page: LLMData) {
- const processed = await processor.process({
- path: page.data._file.absolutePath,
- value: page.data.content,
- });
-
- // Rewrite links in the processed content
- const contentWithRewrittenLinks = rewriteLinks(processed.value.toString());
-
- return `# ${page.data.title}
-URL: ${page.url}
-Source: https://raw.githubusercontent.com/TypeCellOS/BlockNote/refs/heads/main/docs/content/docs/${page.file.path}
-
-${page.data.description}
-
-${contentWithRewrittenLinks}`;
-}
diff --git a/docs/util/getExampleData.ts b/docs/lib/getExampleData.ts
similarity index 100%
rename from docs/util/getExampleData.ts
rename to docs/lib/getExampleData.ts
diff --git a/docs/util/getFullMetadata.ts b/docs/lib/getFullMetadata.ts
similarity index 59%
rename from docs/util/getFullMetadata.ts
rename to docs/lib/getFullMetadata.ts
index cf372d5333..d0f5653dce 100644
--- a/docs/util/getFullMetadata.ts
+++ b/docs/lib/getFullMetadata.ts
@@ -4,25 +4,26 @@ export const getFullMetadata = (metadata: {
title: string;
description?: string;
path?: string;
- ogImageTitle?: string;
+ openGraphImages?: Exclude["images"];
}): Metadata => ({
+ metadataBase: "https://www.blocknotejs.org",
title: `BlockNote - ${metadata.title}`,
description: metadata.description,
icons: {
icon: [
- { url: "/favicon.ico", sizes: "any" },
- { url: "/favicon.svg", type: "image/svg+xml" },
+ { url: "/favicon.ico", sizes: "any", type: "image/x-icon" },
+ { url: "/favicon.svg", sizes: "any", type: "image/svg+xml" },
{ url: "/favicon.png", type: "image/png" },
],
- apple: "/apple-touch-icon.png",
+ apple: { url: "/apple-touch-icon.png", type: "image/png" },
},
manifest: "/site.webmanifest",
openGraph: {
- images: `/api/og${metadata.ogImageTitle ? `?title=${metadata.ogImageTitle}` : ""}`,
+ images: metadata.openGraphImages || "/og/image.png",
locale: "en_US",
siteName: "BlockNote",
type: "website",
- url: `https://www.blocknotejs.org${metadata.path || ""}`,
+ url: metadata.path || "/",
},
robots: {
follow: true,
diff --git a/docs/lib/layout.shared.tsx b/docs/lib/layout.shared.tsx
new file mode 100644
index 0000000000..31095b2614
--- /dev/null
+++ b/docs/lib/layout.shared.tsx
@@ -0,0 +1,394 @@
+import { AuthNavButton } from "@/components/AuthNavButton";
+import ThemedImage from "@/components/ThemedImage";
+import LogoDark from "@/public/img/logos/banner.dark.svg";
+import LogoLight from "@/public/img/logos/banner.svg";
+import type { BaseLayoutProps, LinkItemType } from "fumadocs-ui/layouts/shared";
+import { FaGithub } from "react-icons/fa6";
+// import { LinkItemType } from "@/components/fumadocs/layout/link-item";
+// import {
+// ActivityIcon,
+// BotIcon,
+// BoxIcon,
+// CpuIcon,
+// GlobeIcon,
+// LockIcon,
+// RocketIcon,
+// ShieldCheckIcon,
+// SparklesIcon,
+// } from "lucide-react";
+
+// const links: LinkItemType[] = [
+// {
+// text: "Docs",
+// url: "/docs",
+// active: "nested-url",
+// items: [
+// {
+// text: "Overview",
+// url: "/docs/overview",
+// },
+// ],
+// },
+
+// {
+// type: "menu",
+// text: "Product",
+// items: [
+// {
+// groupName: "Platform",
+// text: "Editor Platform",
+// description: "Modern block-based editor",
+// url: "/product/platform/editor",
+// icon: ,
+// },
+// {
+// groupName: "Platform",
+// text: "Block Model",
+// description: "Composable, structured content",
+// url: "/product/platform/block-model",
+// icon: ,
+// },
+// {
+// groupName: "Platform",
+// text: "Real-time Collaboration",
+// description: "Multi-user editing with presence",
+// url: "/product/platform/collaboration",
+// icon: ,
+// },
+// {
+// groupName: "Platform",
+// text: "Extensibility",
+// description: "Custom blocks, plugins, and APIs",
+// url: "/product/platform/extensibility",
+// icon: ,
+// },
+// {
+// groupName: "Platform",
+// text: "Performance & Scalability",
+// description: "Reliable at any scale",
+// url: "/product/platform/performance",
+// icon: ,
+// },
+// {
+// groupName: "Features",
+// text: "Custom Blocks",
+// description: "Extend functionality with your own blocks",
+// url: "/product/features/custom-blocks",
+// icon: ,
+// },
+// {
+// groupName: "Features",
+// text: "Collaborative Editing",
+// description: "Edit documents with your team in real time",
+// url: "/product/features/collaboration",
+// icon: ,
+// },
+// {
+// groupName: "Features",
+// text: "Comments & Mentions",
+// description: "Streamline team communication in context",
+// url: "/product/features/comments",
+// icon: ,
+// },
+// {
+// groupName: "Features",
+// text: "Version History",
+// description: "Track changes and revert safely",
+// url: "/product/features/version-history",
+// icon: ,
+// },
+// {
+// groupName: "Integrations",
+// text: "Yjs Collaboration Engine",
+// description: "Reliable CRDT-based synchronization",
+// url: "/product/integrations/yjs",
+// icon: ,
+// },
+// {
+// groupName: "Integrations",
+// text: "ProseMirror Ecosystem",
+// description: "Interoperable editor architecture",
+// url: "/product/integrations/prosemirror",
+// icon: ,
+// },
+// {
+// groupName: "Integrations",
+// text: "Framework Integrations",
+// description: "React, Next.js, and more",
+// url: "/product/integrations/frameworks",
+// icon: ,
+// },
+// {
+// groupName: "Integrations",
+// text: "API & SDKs",
+// description: "Extend and automate workflows",
+// url: "/product/integrations/api-sdk",
+// icon: ,
+// },
+// ],
+// },
+
+// {
+// type: "menu",
+// text: "Solutions",
+// items: [
+// {
+// groupName: "Use Cases",
+// text: "Knowledge Bases",
+// description: "Centralize and structure knowledge",
+// url: "/solutions/use-cases/knowledge-bases",
+// icon: ,
+// },
+// {
+// groupName: "Use Cases",
+// text: "Collaborative Documents",
+// description: "Team-driven document workflows",
+// url: "/solutions/use-cases/collaborative-docs",
+// icon: ,
+// },
+// {
+// groupName: "Use Cases",
+// text: "Internal Tools",
+// description: "Custom apps built on BlockNote",
+// url: "/solutions/use-cases/internal-tools",
+// icon: ,
+// },
+// {
+// groupName: "Industries",
+// text: "Public Sector",
+// description: "Digital autonomy & EU collaborations",
+// url: "/solutions/industries/public-sector",
+// icon: ,
+// },
+// {
+// groupName: "Industries",
+// text: "Enterprise Teams",
+// description: "Custom collaboration & consulting",
+// url: "/solutions/industries/enterprise",
+// icon: ,
+// },
+// {
+// groupName: "Industries",
+// text: "Startups & Scaleups",
+// description: "Flexible partnerships for growth-stage companies",
+// url: "/solutions/industries/startups",
+// icon: ,
+// },
+// ],
+// },
+
+// {
+// type: "menu",
+// text: "AI",
+// items: [
+// {
+// groupName: "AI Features",
+// text: "AI Writing Assistance",
+// description: "Content generation powered by AI",
+// url: "/ai/features/writing-assistance",
+// icon: ,
+// },
+// {
+// groupName: "AI Features",
+// text: "Smart Blocks",
+// description: "Context-aware content blocks",
+// url: "/ai/features/smart-blocks",
+// icon: ,
+// },
+// {
+// groupName: "AI Use Cases",
+// text: "Knowledge Capture",
+// description: "Automate knowledge aggregation",
+// url: "/ai/use-cases/knowledge-capture",
+// icon: ,
+// },
+// {
+// groupName: "AI Use Cases",
+// text: "Content Drafting",
+// description: "Draft documents efficiently",
+// url: "/ai/use-cases/content-drafting",
+// icon: ,
+// },
+// {
+// groupName: "AI Platform",
+// text: "Model-Agnostic Design",
+// description: "Flexible AI integration",
+// url: "/ai/platform/model-agnostic",
+// icon: ,
+// },
+// {
+// groupName: "AI Platform",
+// text: "Data Privacy & Security",
+// description: "Enterprise-grade compliance",
+// url: "/ai/platform/privacy-security",
+// icon: ,
+// },
+// ],
+// },
+
+// {
+// type: "menu",
+// text: "Resources",
+// items: [
+// {
+// groupName: "Documentation & Developer Tools",
+// text: "Get Started",
+// description: "Learn how to use BlockNote",
+// url: "/resources/get-started",
+// icon: ,
+// },
+// {
+// groupName: "Documentation & Developer Tools",
+// text: "Installation",
+// description: "Set up BlockNote in your environment",
+// url: "/resources/installation",
+// icon: ,
+// },
+// {
+// groupName: "Documentation & Developer Tools",
+// text: "Guides",
+// description: "In-depth tutorials and examples",
+// url: "/resources/guides",
+// icon: ,
+// },
+// {
+// groupName: "Documentation & Developer Tools",
+// text: "API Reference",
+// description: "Technical documentation for developers",
+// url: "/resources/api",
+// icon: ,
+// },
+// {
+// groupName: "Learning & Proof",
+// text: "Case Studies",
+// description: "Real-world use cases of BlockNote",
+// url: "/resources/case-studies",
+// icon: ,
+// },
+// {
+// groupName: "Learning & Proof",
+// text: "Open-Source Deployments",
+// description: "Examples of OSS projects using BlockNote",
+// url: "/resources/oss-deployments",
+// icon: ,
+// },
+// {
+// groupName: "Learning & Proof",
+// text: "Comparisons",
+// description: "How BlockNote compares to other editors",
+// url: "/resources/comparisons",
+// icon: ,
+// },
+// {
+// groupName: "About & Trust",
+// text: "About BlockNote",
+// description: "Mission, vision, and OSS philosophy",
+// url: "/resources/about",
+// icon: ,
+// },
+// {
+// groupName: "About & Trust",
+// text: "Security & Privacy",
+// description: "Compliance and enterprise-grade trust",
+// url: "/resources/security-privacy",
+// icon: ,
+// },
+// {
+// groupName: "About & Trust",
+// text: "Digital Sovereignty",
+// description: "Collaborations with governments and EU initiatives",
+// url: "/resources/digital-sovereignty",
+// icon: ,
+// },
+// {
+// groupName: "About & Trust",
+// text: "Careers & Partners",
+// description: "Work with or join BlockNote",
+// url: "/resources/careers-partners",
+// icon: ,
+// },
+// {
+// groupName: "About & Trust",
+// text: "Enterprise Inquiries",
+// description: "Custom consultation and collaboration",
+// url: "/resources/enterprise",
+// icon: ,
+// },
+// ],
+// },
+// ];
+
+const links: LinkItemType[] = [
+ // {
+ // type: "menu",
+ // icon: ,
+ // text: "Profile",
+ // items: [
+ // {
+ // text: "Getting Started",
+ // description: "Learn to use Fumadocs",
+ // url: "/docs",
+ // },
+ // ],
+ // },
+ {
+ text: "Docs",
+ url: "/docs",
+ active: "nested-url",
+ },
+ {
+ text: "AI",
+ url: "/docs/features/ai",
+ active: "nested-url",
+ },
+ {
+ text: "Examples",
+ url: "/examples",
+ active: "nested-url",
+ },
+ {
+ text: "Pricing",
+ url: "/pricing",
+ active: "url",
+ },
+ {
+ text: "About",
+ url: "/about",
+ active: "url",
+ },
+ // {
+ // type: "icon",
+ // icon: ,
+ // text: "Discord",
+ // url: "https://discord.gg/Qc2QTTH5dF",
+ // },
+ {
+ type: "icon",
+ icon: ,
+ text: "GitHub",
+ url: "https://github.com/TypeCellOS/BlockNote",
+ },
+ {
+ type: "custom",
+ on: "all",
+ secondary: true,
+ children: ,
+ },
+];
+export function baseOptions(): BaseLayoutProps {
+ return {
+ themeSwitch: {
+ enabled: false,
+ },
+ nav: {
+ title: (
+
+ ),
+ },
+ links,
+ };
+}
diff --git a/docs/util/product-list.ts b/docs/lib/product-list.ts
similarity index 100%
rename from docs/util/product-list.ts
rename to docs/lib/product-list.ts
diff --git a/docs/util/send-mail.tsx b/docs/lib/send-mail.tsx
similarity index 100%
rename from docs/util/send-mail.tsx
rename to docs/lib/send-mail.tsx
diff --git a/docs/lib/source/docs.ts b/docs/lib/source/docs.ts
index c22bd40b3f..140086837c 100644
--- a/docs/lib/source/docs.ts
+++ b/docs/lib/source/docs.ts
@@ -1,15 +1,26 @@
-import { docs } from "@/.source";
-import { InferMetaType, InferPageType, loader } from "fumadocs-core/source";
+import { type InferPageType, loader } from "fumadocs-core/source";
+import { docs } from "fumadocs-mdx:collections/server";
-// See https://fumadocs.vercel.app/docs/headless/source-api for more info
+// See https://fumadocs.dev/docs/headless/source-api for more info
export const source = loader({
baseUrl: "/docs",
- // icon(icon) {
- // if (icon && icon in icons)
- // return createElement(icons[icon as keyof typeof icons]);
- // },
source: docs.toFumadocsSource(),
+ plugins: [],
});
-export type Page = InferPageType;
-export type Meta = InferMetaType;
+export function getPageImage(page: InferPageType) {
+ const segments = [...page.slugs, "image.png"];
+
+ return {
+ segments,
+ url: `/og/docs/${segments.join("/")}`,
+ };
+}
+
+export async function getLLMText(page: InferPageType) {
+ const processed = await page.data.getText("processed");
+
+ return `# ${page.data.title}
+
+${processed}`;
+}
diff --git a/docs/lib/source/examples.ts b/docs/lib/source/examples.ts
index 6c7f520b60..0d86f2a5ce 100644
--- a/docs/lib/source/examples.ts
+++ b/docs/lib/source/examples.ts
@@ -1,12 +1,26 @@
-import { examples } from "@/.source";
-import { InferMetaType, InferPageType, loader } from "fumadocs-core/source";
+import { type InferPageType, loader } from "fumadocs-core/source";
+import { examples } from "fumadocs-mdx:collections/server";
-// See https://fumadocs.vercel.app/docs/headless/source-api for more info
+// See https://fumadocs.dev/docs/headless/source-api for more info
export const source = loader({
- // it assigns a URL to your pages
baseUrl: "/examples",
source: examples.toFumadocsSource(),
+ plugins: [],
});
-export type Page = InferPageType;
-export type Meta = InferMetaType;
+export function getPageImage(page: InferPageType) {
+ const segments = [...page.slugs, "image.png"];
+
+ return {
+ segments,
+ url: `/og/examples/${segments.join("/")}`,
+ };
+}
+
+export async function getLLMText(page: InferPageType) {
+ const processed = await page.data.getText("processed");
+
+ return `# ${page.data.title}
+
+${processed}`;
+}
diff --git a/docs/lib/source/pages.ts b/docs/lib/source/pages.ts
index fe09e8edea..ada917c408 100644
--- a/docs/lib/source/pages.ts
+++ b/docs/lib/source/pages.ts
@@ -1,11 +1,26 @@
-import { pages } from "@/.source";
-import { InferMetaType, InferPageType, loader } from "fumadocs-core/source";
+import { type InferPageType, loader } from "fumadocs-core/source";
+import { pages } from "fumadocs-mdx:collections/server";
-// See https://fumadocs.vercel.app/docs/headless/source-api for more info
+// See https://fumadocs.dev/docs/headless/source-api for more info
export const source = loader({
baseUrl: "/",
source: pages.toFumadocsSource(),
+ plugins: [],
});
-export type Page = InferPageType;
-export type Meta = InferMetaType;
+export function getPageImage(page: InferPageType) {
+ const segments = [...page.slugs, "image.png"];
+
+ return {
+ segments,
+ url: `/og/pages/${segments.join("/")}`,
+ };
+}
+
+export async function getLLMText(page: InferPageType) {
+ const processed = await page.data.getText("processed");
+
+ return `# ${page.data.title}
+
+${processed}`;
+}
diff --git a/docs/util/mdx-components.tsx b/docs/mdx-components.tsx
similarity index 55%
rename from docs/util/mdx-components.tsx
rename to docs/mdx-components.tsx
index a2f993b7b3..bdb79ee1f0 100644
--- a/docs/util/mdx-components.tsx
+++ b/docs/mdx-components.tsx
@@ -1,14 +1,25 @@
+import CTAButton from "@/components/CTAButton";
import Example from "@/components/Example";
import ThemedImage from "@/components/ThemedImage";
-import { getExampleData } from "@/util/getExampleData";
-import { Tab, Tabs } from "fumadocs-ui/components/tabs";
-import { TypeTable } from "fumadocs-ui/components/type-table";
+import { getExampleData } from "@/lib/getExampleData";
import * as Twoslash from "fumadocs-twoslash/ui";
+import {
+ createFileSystemGeneratorCache,
+ createGenerator,
+} from "fumadocs-typescript";
+import { AutoTypeTable } from "fumadocs-typescript/ui";
+import * as TabsComponents from "fumadocs-ui/components/tabs";
+import { TypeTable } from "fumadocs-ui/components/type-table";
import defaultMdxComponents from "fumadocs-ui/mdx";
import type { MDXComponents } from "mdx/types";
import { Suspense } from "react";
+import GitHubButton from "./components/GitHubButton";
+
+const generator = createGenerator({
+ // set a cache, necessary for serverless platform like Vercel
+ cache: createFileSystemGeneratorCache(".next/fumadocs-typescript"),
+});
-// use this function to get MDX components, you will need it for rendering MDX
export function getMDXComponents(components?: MDXComponents): MDXComponents {
return {
...defaultMdxComponents,
@@ -24,10 +35,14 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents {
);
},
- Tabs: Tabs,
- Tab: Tab,
+ ...TabsComponents,
ThemedImage: ThemedImage,
TypeTable: TypeTable,
+ AutoTypeTable: (props) => (
+
+ ),
+ CTAButton,
+ GitHubButton,
...components,
- } as any;
+ };
}
diff --git a/docs/next.config.ts b/docs/next.config.ts
index 886e3bcd87..0879257822 100644
--- a/docs/next.config.ts
+++ b/docs/next.config.ts
@@ -1,16 +1,16 @@
import { withSentryConfig } from "@sentry/nextjs";
import { createMDX } from "fumadocs-mdx/next";
import { NextConfig } from "next";
+import { redirects } from "./redirects";
const withMDX = createMDX();
const config = {
+ // output: "export",
reactStrictMode: true,
serverExternalPackages: ["typescript", "twoslash"],
- experimental: {
- reactCompiler: true,
- turbopackScopeHoisting: false,
- },
+ reactCompiler: true,
+ redirects,
images: {
remotePatterns: [
{
@@ -27,262 +27,6 @@ const config = {
},
],
},
- redirects: async () => [
- {
- source: "/docs/editor-api/converting-blocks",
- destination: "/docs/features/interoperability",
- permanent: true,
- },
- {
- source: "/docs/ai/setup",
- destination: "/docs/features/ai/getting-started",
- permanent: true,
- },
- {
- source: "/docs/advanced/ariakit",
- destination: "/docs/getting-started/ariakit",
- permanent: true,
- },
- {
- source: "/docs/advanced/shadcn",
- destination: "/docs/getting-started/shadcn",
- permanent: true,
- },
- {
- source: "/docs/advanced/paste-handling",
- destination: "/docs/features/interoperability",
- permanent: true,
- },
- {
- source: "/docs/ui-components/formatting-toolbar",
- destination: "/docs/react/components/formatting-toolbar",
- permanent: true,
- },
- {
- source: "/docs/ui-components/suggestion-menus",
- destination: "/docs/react/components/suggestion-menus",
- permanent: true,
- },
- {
- source: "/docs/ui-components/side-menu",
- destination: "/docs/react/components/side-menu",
- permanent: true,
- },
- {
- source: "/docs/ui-components/link-toolbar",
- destination: "/docs/react/components/link-toolbar",
- permanent: true,
- },
- {
- source: "/docs/custom-schemas/custom-blocks",
- destination: "/docs/features/custom-schemas/custom-blocks",
- permanent: true,
- },
- {
- source: "/docs/custom-schemas/custom-inline-content",
- destination: "/docs/features/custom-schemas/custom-inline-content",
- permanent: true,
- },
- {
- source: "/docs/custom-schemas/custom-styles",
- destination: "/docs/features/custom-schemas/custom-styles",
- permanent: true,
- },
- {
- source: "/docs/custom-schemas",
- destination: "/docs/features/custom-schemas",
- permanent: true,
- },
- {
- source: "/docs/editor-basics/document-structure",
- destination: "/docs/foundations/document-structure",
- permanent: true,
- },
- {
- source: "/docs/editor-basics/default-schema",
- destination: "/docs/foundations/schemas",
- permanent: true,
- },
- {
- source: "/docs/editor-api/manipulating-blocks",
- destination: "/docs/reference/editor/manipulating-content",
- permanent: true,
- },
- {
- source: "/docs/editor-api/manipulating-inline-content",
- destination: "/docs/reference/editor/manipulating-content",
- permanent: true,
- },
- {
- source: "/docs/editor-api/cursor-selections",
- destination: "/docs/reference/editor/cursor-selections",
- permanent: true,
- },
- {
- source: "/docs/advanced/code-blocks",
- destination: "/docs/features/blocks/code-blocks",
- permanent: true,
- },
- {
- source: "/docs/advanced/tables",
- destination: "/docs/features/blocks/tables",
- permanent: true,
- },
- {
- source: "/docs/ai/custom-commands",
- destination: "/docs/features/ai/custom-commands",
- permanent: true,
- },
- {
- source: "/docs/ai/getting-started",
- destination: "/docs/features/ai/getting-started",
- permanent: true,
- },
- {
- source: "/docs/ai/reference",
- destination: "/docs/features/ai/reference",
- permanent: true,
- },
- {
- source: "/docs/ai",
- destination: "/docs/features/ai",
- permanent: true,
- },
- {
- source: "/docs/styling-theming/overriding-css",
- destination: "/docs/react/styling-theming/overriding-css",
- permanent: true,
- },
- {
- source: "/docs/styling-theming/themes",
- destination: "/docs/react/styling-theming/themes",
- permanent: true,
- },
- {
- source: "/docs/styling-theming/adding-dom-attributes",
- destination: "/docs/react/styling-theming/adding-dom-attributes",
- permanent: true,
- },
- {
- source: "/docs/collaboration/real-time-collaboration",
- destination: "/docs/features/collaboration",
- permanent: true,
- },
- {
- source: "/docs/collaboration/comments",
- destination: "/docs/features/collaboration/comments",
- permanent: true,
- },
- {
- source: "/docs/editor-api/server-processing",
- destination: "/docs/features/server-processing",
- permanent: true,
- },
- { source: "/docs/introduction", destination: "/docs", permanent: true },
- {
- source: "/docs/quickstart",
- destination: "/docs/install",
- permanent: true,
- },
- {
- source: "/docs/editor",
- destination: "/docs/getting-started",
- permanent: true,
- },
- {
- source: "/docs/theming",
- destination: "/docs/react/styling-theming",
- permanent: true,
- },
- {
- source: "/docs/formatting-toolbar",
- destination: "/docs/react/components/formatting-toolbar",
- permanent: true,
- },
- {
- source: "/docs/slash-menu",
- destination: "/docs/react/components/suggestion-menus",
- permanent: true,
- },
- {
- source: "/docs/side-menu",
- destination: "/docs/react/components/side-menu",
- permanent: true,
- },
- {
- source: "/docs/ui-elements",
- destination: "/docs/react/components",
- permanent: true,
- },
- {
- source: "/docs/blocks",
- destination: "/docs/foundations/document-structure",
- permanent: true,
- },
- {
- source: "/docs/block-types",
- destination: "/docs/features/blocks",
- permanent: true,
- },
- {
- source: "/docs/editor-basics/setup",
- destination: "/docs/getting-started/editor-setup",
- permanent: true,
- },
- {
- source: "/docs/manipulating-blocks",
- destination: "/docs/reference/editor/manipulating-content",
- permanent: true,
- },
- {
- source: "/docs/inline-content",
- destination: "/docs/reference/editor/manipulating-content",
- permanent: true,
- },
- {
- source: "/docs/cursor-selections",
- destination: "/docs/reference/editor/cursor-selections",
- permanent: true,
- },
- {
- source: "/docs/converting-blocks",
- destination: "/docs/foundations/supported-formats",
- permanent: true,
- },
- {
- source: "/docs/real-time-collaboration",
- destination: "/docs/features/collaboration",
- permanent: true,
- },
- {
- source: "/docs/nextjs",
- destination: "/docs/getting-started/nextjs",
- permanent: true,
- },
- {
- source: "/docs/vanilla-js",
- destination: "/docs/getting-started/vanilla-js",
- permanent: true,
- },
- {
- source: "/docs/advanced/real-time-collaboration",
- destination: "/docs/features/collaboration",
- permanent: true,
- },
- {
- source: "/privacy-policy",
- destination: "/legal/privacy-policy",
- permanent: true,
- },
- {
- source: "/terms-and-conditions",
- destination: "/legal/terms-and-conditions",
- permanent: true,
- },
- ],
- turbopack: {
- resolveExtensions: [".ts", ".tsx", ".js", ".jsx", ".json", ".mdx"],
- },
} satisfies NextConfig;
export default withSentryConfig(withMDX(config), {
@@ -290,6 +34,7 @@ export default withSentryConfig(withMDX(config), {
// https://www.npmjs.com/package/@sentry/webpack-plugin#options
org: "blocknote-js",
+
project: "website",
// Only print logs for uploading source maps in CI
@@ -301,24 +46,29 @@ export default withSentryConfig(withMDX(config), {
// Upload a larger set of source maps for prettier stack traces (increases build time)
widenClientFileUpload: true,
- // Automatically annotate React components to show their full name in breadcrumbs and session replay
- reactComponentAnnotation: {
- enabled: false,
- },
-
// Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.
// This can increase your server load as well as your hosting bill.
// Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-
// side errors will fail.
tunnelRoute: "/monitoring",
- // Automatically tree-shake Sentry logger statements to reduce bundle size
- disableLogger: true,
+ webpack: {
+ // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)
+ // See the following for more information:
+ // https://docs.sentry.io/product/crons/
+ // https://vercel.com/docs/cron-jobs
+ automaticVercelMonitors: true,
+
+ // TODO: why was this disabled?
+ reactComponentAnnotation: {
+ enabled: false,
+ },
+ // Tree-shaking options for reducing bundle size
+ treeshake: {
+ // Automatically tree-shake Sentry logger statements to reduce bundle size
+ removeDebugLogging: true,
+ },
+ },
- // Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)
- // See the following for more information:
- // https://docs.sentry.io/product/crons/
- // https://vercel.com/docs/cron-jobs
- automaticVercelMonitors: true,
telemetry: false,
});
diff --git a/docs/package.json b/docs/package.json
index a9a9b11870..2226e35ab8 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -2,39 +2,38 @@
"name": "docs",
"version": "0.0.0",
"private": true,
- "type": "module",
+ "license": "UNLICENSED",
"scripts": {
- "dev": "next dev --turbopack",
- "dev:email": "email dev",
+ "dev": "next dev",
+ "dev:email": "next dev",
"prebuild:site": "nx run @blocknote/dev-scripts:gen",
- "build:site": "fumadocs-mdx && next build --turbopack",
- "start": "next start",
+ "build:site": "fumadocs-mdx && next build",
+ "start": "serve out",
+ "types:check": "fumadocs-mdx && next typegen && tsc --noEmit",
"postinstall": "fumadocs-mdx",
+ "lint": "eslint",
"init-db": "pnpx @better-auth/cli migrate",
- "test": "node validate-links.js"
+ "test": "pnpm -w run gen && node validate-links.mjs"
},
"dependencies": {
- "@ai-sdk/anthropic": "^3.0.2",
- "@ai-sdk/google": "^3.0.2",
"@ai-sdk/groq": "^3.0.2",
- "@ai-sdk/mistral": "^3.0.2",
- "@ai-sdk/openai": "^3.0.2",
- "@ai-sdk/openai-compatible": "^2.0.4",
"@aws-sdk/client-s3": "^3.609.0",
"@aws-sdk/s3-request-presigner": "^3.609.0",
+ "@base-ui/react": "^1.1.0",
+ "@blocknote/ariakit": "workspace:*",
"@blocknote/code-block": "workspace:*",
+ "@blocknote/core": "workspace:*",
+ "@blocknote/mantine": "workspace:*",
+ "@blocknote/react": "workspace:*",
"@blocknote/server-util": "workspace:*",
+ "@blocknote/shadcn": "workspace:*",
"@blocknote/xl-ai": "workspace:*",
"@blocknote/xl-docx-exporter": "workspace:*",
"@blocknote/xl-email-exporter": "workspace:*",
"@blocknote/xl-multi-column": "workspace:*",
"@blocknote/xl-odt-exporter": "workspace:*",
"@blocknote/xl-pdf-exporter": "workspace:*",
- "@emotion/react": "^11.11.4",
- "@emotion/styled": "^11.11.5",
- "@fumadocs/mdx-remote": "1.3.0",
- "@headlessui/react": "^2.2.9",
- "@heroicons/react": "^2.2.0",
+ "@fumadocs/base-ui": "^16.4.7",
"@liveblocks/client": "3.7.1-tiptap3",
"@liveblocks/react": "3.7.1-tiptap3",
"@liveblocks/react-blocknote": "3.7.1-tiptap3",
@@ -45,12 +44,13 @@
"@mantine/utils": "^6.0.22",
"@mui/icons-material": "^5.16.1",
"@mui/material": "^5.16.1",
- "@polar-sh/better-auth": "^1.1.9",
- "@polar-sh/nextjs": "^0.4.9",
- "@polar-sh/sdk": "^0.34.17",
- "@react-email/render": "^1.1.2",
+ "@orama/orama": "^3.1.18",
+ "@polar-sh/better-auth": "^1.6.4",
+ "@polar-sh/sdk": "^0.42.2",
+ "@react-email/components": "^1.0.4",
+ "@react-email/render": "^2.0.4",
"@react-pdf/renderer": "^4.3.0",
- "@sentry/nextjs": "9.14.0",
+ "@sentry/nextjs": "^10.34.0",
"@shikijs/core": "^3.19.0",
"@shikijs/engine-javascript": "^3.19.0",
"@shikijs/langs-precompiled": "^3.19.0",
@@ -68,77 +68,63 @@
"@uppy/status-bar": "^3.1.1",
"@uppy/webcam": "^3.4.2",
"@uppy/xhr-upload": "^3.4.0",
- "@vercel/analytics": "^1.5.0",
- "@vercel/og": "^0.6.8",
+ "@vercel/analytics": "^1.6.1",
"@y-sweet/react": "^0.6.3",
"ai": "^6.0.5",
- "babel-plugin-react-compiler": "19.1.0-rc.2",
- "better-auth": "^1.3.27",
- "better-sqlite3": "^11.10.0",
- "classnames": "2.3.2",
- "clsx": "2.1.1",
- "docx": "^9.5.1",
- "framer-motion": "^11.18.2",
- "fumadocs-core": "15.5.4",
- "fumadocs-docgen": "2.0.1",
- "fumadocs-mdx": "11.6.9",
- "fumadocs-twoslash": "3.1.4",
- "fumadocs-typescript": "4.0.6",
- "fumadocs-ui": "15.5.4",
- "import-in-the-middle": "^1.15.0",
- "next": "15.5.9",
- "nodemailer": "^7.0.11",
- "partykit": "^0.0.115",
- "pg": "^8.16.3",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "better-auth": "^1.4.15",
+ "better-sqlite3": "^12.6.2",
+ "class-variance-authority": "^0.7.1",
+ "framer-motion": "^12.26.2",
+ "fumadocs-core": "16.4.7",
+ "fumadocs-mdx": "14.2.5",
+ "fumadocs-twoslash": "^3.1.12",
+ "fumadocs-typescript": "^5.0.1",
+ "fumadocs-ui": "npm:@fumadocs/base-ui@latest",
+ "lucide-react": "^0.562.0",
+ "next": "16.1.1",
+ "next-themes": "^0.4.6",
+ "nodemailer": "^7.0.12",
+ "pg": "^8.17.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-email": "^5.2.5",
"react-github-btn": "^1.4.0",
- "react-icons": "^5.2.1",
- "remark": "^15.0.1",
- "remark-gfm": "^4.0.1",
- "remark-mdx": "^3.1.1",
- "require-in-the-middle": "^7.5.2",
- "shiki": "^3.13.0",
- "ts-morph": "26.0.0",
- "twoslash": "^0.3.4",
+ "react-icons": "^5.5.0",
+ "scroll-into-view-if-needed": "^3.1.0",
+ "tailwind-merge": "^3.4.0",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27",
- "zod": "^3.25.76"
+ "zod": "^4.3.5"
},
"devDependencies": {
- "@blocknote/ariakit": "workspace:*",
"@blocknote/code-block": "workspace:*",
"@blocknote/core": "workspace:*",
"@blocknote/mantine": "workspace:*",
"@blocknote/react": "workspace:*",
+ "@blocknote/server-util": "workspace:*",
"@blocknote/shadcn": "workspace:*",
+ "@blocknote/xl-ai": "workspace:*",
"@blocknote/xl-docx-exporter": "workspace:*",
+ "@blocknote/xl-email-exporter": "workspace:*",
"@blocknote/xl-multi-column": "workspace:*",
+ "@blocknote/xl-odt-exporter": "workspace:*",
"@blocknote/xl-pdf-exporter": "workspace:*",
- "@liveblocks/react": "^2.24.3",
- "@liveblocks/react-tiptap": "^2.24.3",
- "@liveblocks/react-ui": "^2.24.3",
- "@mui/material": "^5.17.1",
- "@react-email/components": "^0.0.36",
- "@react-pdf/renderer": "^4.3.0",
- "@tailwindcss/postcss": "^4.1.14",
- "@types/better-sqlite3": "7.6.13",
+ "@tailwindcss/postcss": "^4.1.18",
+ "@types/better-sqlite3": "^7.6.13",
"@types/mdx": "^2.0.13",
- "@types/node": "22.15.2",
- "@types/nodemailer": "6.4.17",
- "@types/pg": "8.11.14",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
- "@y-sweet/react": "^0.6.4",
- "next-themes": "0.4.6",
- "next-validate-link": "^1.6.3",
+ "@types/node": "^25.0.5",
+ "@types/nodemailer": "^7.0.5",
+ "@types/pg": "^8.16.0",
+ "@types/react": "^19.2.8",
+ "@types/react-dom": "^19.2.3",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "eslint": "^9.39.2",
+ "eslint-config-next": "16.1.1",
+ "next-validate-link": "^1.6.4",
"postcss": "^8.5.6",
- "react-email": "^4.3.0",
- "react-icons": "^5.5.0",
- "tailwindcss": "^4.1.14",
+ "serve": "^14.2.5",
+ "tailwindcss": "^4.1.18",
"tw-animate-css": "^1.4.0",
- "typescript": "^5.9.3",
- "y-partykit": "^0.0.33",
- "yjs": "^13.6.27"
+ "typescript": "^5.9.3"
}
-}
\ No newline at end of file
+}
diff --git a/docs/postcss.config.mjs b/docs/postcss.config.mjs
index c2ddf74822..61e36849cf 100644
--- a/docs/postcss.config.mjs
+++ b/docs/postcss.config.mjs
@@ -1,5 +1,7 @@
-export default {
+const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
+
+export default config;
diff --git a/docs/redirects.ts b/docs/redirects.ts
new file mode 100644
index 0000000000..ea909c829f
--- /dev/null
+++ b/docs/redirects.ts
@@ -0,0 +1,255 @@
+import { NextConfig } from "next";
+
+export const redirects: NextConfig["redirects"] = () => [
+ {
+ source: "/docs/editor-api/converting-blocks",
+ destination: "/docs/features/interoperability",
+ permanent: true,
+ },
+ {
+ source: "/docs/ai/setup",
+ destination: "/docs/features/ai/getting-started",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/ariakit",
+ destination: "/docs/getting-started/ariakit",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/shadcn",
+ destination: "/docs/getting-started/shadcn",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/paste-handling",
+ destination: "/docs/features/interoperability",
+ permanent: true,
+ },
+ {
+ source: "/docs/ui-components/formatting-toolbar",
+ destination: "/docs/react/components/formatting-toolbar",
+ permanent: true,
+ },
+ {
+ source: "/docs/ui-components/suggestion-menus",
+ destination: "/docs/react/components/suggestion-menus",
+ permanent: true,
+ },
+ {
+ source: "/docs/ui-components/side-menu",
+ destination: "/docs/react/components/side-menu",
+ permanent: true,
+ },
+ {
+ source: "/docs/ui-components/link-toolbar",
+ destination: "/docs/react/components/link-toolbar",
+ permanent: true,
+ },
+ {
+ source: "/docs/custom-schemas/custom-blocks",
+ destination: "/docs/features/custom-schemas/custom-blocks",
+ permanent: true,
+ },
+ {
+ source: "/docs/custom-schemas/custom-inline-content",
+ destination: "/docs/features/custom-schemas/custom-inline-content",
+ permanent: true,
+ },
+ {
+ source: "/docs/custom-schemas/custom-styles",
+ destination: "/docs/features/custom-schemas/custom-styles",
+ permanent: true,
+ },
+ {
+ source: "/docs/custom-schemas",
+ destination: "/docs/features/custom-schemas",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-basics/document-structure",
+ destination: "/docs/foundations/document-structure",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-basics/default-schema",
+ destination: "/docs/foundations/schemas",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-api/manipulating-blocks",
+ destination: "/docs/reference/editor/manipulating-content",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-api/manipulating-inline-content",
+ destination: "/docs/reference/editor/manipulating-content",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-api/cursor-selections",
+ destination: "/docs/reference/editor/cursor-selections",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/code-blocks",
+ destination: "/docs/features/blocks/code-blocks",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/tables",
+ destination: "/docs/features/blocks/tables",
+ permanent: true,
+ },
+ {
+ source: "/docs/ai/custom-commands",
+ destination: "/docs/features/ai/custom-commands",
+ permanent: true,
+ },
+ {
+ source: "/docs/ai/getting-started",
+ destination: "/docs/features/ai/getting-started",
+ permanent: true,
+ },
+ {
+ source: "/docs/ai/reference",
+ destination: "/docs/features/ai/reference",
+ permanent: true,
+ },
+ {
+ source: "/docs/ai",
+ destination: "/docs/features/ai",
+ permanent: true,
+ },
+ {
+ source: "/docs/styling-theming/overriding-css",
+ destination: "/docs/react/styling-theming/overriding-css",
+ permanent: true,
+ },
+ {
+ source: "/docs/styling-theming/themes",
+ destination: "/docs/react/styling-theming/themes",
+ permanent: true,
+ },
+ {
+ source: "/docs/styling-theming/adding-dom-attributes",
+ destination: "/docs/react/styling-theming/adding-dom-attributes",
+ permanent: true,
+ },
+ {
+ source: "/docs/collaboration/real-time-collaboration",
+ destination: "/docs/features/collaboration",
+ permanent: true,
+ },
+ {
+ source: "/docs/collaboration/comments",
+ destination: "/docs/features/collaboration/comments",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-api/server-processing",
+ destination: "/docs/features/server-processing",
+ permanent: true,
+ },
+ { source: "/docs/introduction", destination: "/docs", permanent: true },
+ {
+ source: "/docs/quickstart",
+ destination: "/docs/install",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor",
+ destination: "/docs/getting-started",
+ permanent: true,
+ },
+ {
+ source: "/docs/theming",
+ destination: "/docs/react/styling-theming",
+ permanent: true,
+ },
+ {
+ source: "/docs/formatting-toolbar",
+ destination: "/docs/react/components/formatting-toolbar",
+ permanent: true,
+ },
+ {
+ source: "/docs/slash-menu",
+ destination: "/docs/react/components/suggestion-menus",
+ permanent: true,
+ },
+ {
+ source: "/docs/side-menu",
+ destination: "/docs/react/components/side-menu",
+ permanent: true,
+ },
+ {
+ source: "/docs/ui-elements",
+ destination: "/docs/react/components",
+ permanent: true,
+ },
+ {
+ source: "/docs/blocks",
+ destination: "/docs/foundations/document-structure",
+ permanent: true,
+ },
+ {
+ source: "/docs/block-types",
+ destination: "/docs/features/blocks",
+ permanent: true,
+ },
+ {
+ source: "/docs/editor-basics/setup",
+ destination: "/docs/getting-started/editor-setup",
+ permanent: true,
+ },
+ {
+ source: "/docs/manipulating-blocks",
+ destination: "/docs/reference/editor/manipulating-content",
+ permanent: true,
+ },
+ {
+ source: "/docs/inline-content",
+ destination: "/docs/reference/editor/manipulating-content",
+ permanent: true,
+ },
+ {
+ source: "/docs/cursor-selections",
+ destination: "/docs/reference/editor/cursor-selections",
+ permanent: true,
+ },
+ {
+ source: "/docs/converting-blocks",
+ destination: "/docs/foundations/supported-formats",
+ permanent: true,
+ },
+ {
+ source: "/docs/real-time-collaboration",
+ destination: "/docs/features/collaboration",
+ permanent: true,
+ },
+ {
+ source: "/docs/nextjs",
+ destination: "/docs/getting-started/nextjs",
+ permanent: true,
+ },
+ {
+ source: "/docs/vanilla-js",
+ destination: "/docs/getting-started/vanilla-js",
+ permanent: true,
+ },
+ {
+ source: "/docs/advanced/real-time-collaboration",
+ destination: "/docs/features/collaboration",
+ permanent: true,
+ },
+ {
+ source: "/privacy-policy",
+ destination: "/legal/privacy-policy",
+ permanent: true,
+ },
+ {
+ source: "/terms-and-conditions",
+ destination: "/legal/terms-and-conditions",
+ permanent: true,
+ },
+];
diff --git a/docs/sentry.edge.config.ts b/docs/sentry.edge.config.ts
index 3b048d7dcb..752fe1d5b3 100644
--- a/docs/sentry.edge.config.ts
+++ b/docs/sentry.edge.config.ts
@@ -13,4 +13,11 @@ Sentry.init({
// Setting this option to true will print useful information to the console while you're setting up Sentry.
debug: false,
+
+ // Enable logs to be sent to Sentry
+ enableLogs: true,
+
+ // Enable sending user PII (Personally Identifiable Information)
+ // https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options/#sendDefaultPii
+ sendDefaultPii: false,
});
diff --git a/docs/sentry.server.config.ts b/docs/sentry.server.config.ts
index 0fe5988ec3..f324f532ce 100644
--- a/docs/sentry.server.config.ts
+++ b/docs/sentry.server.config.ts
@@ -12,4 +12,11 @@ Sentry.init({
// Setting this option to true will print useful information to the console while you're setting up Sentry.
debug: false,
+
+ // Enable logs to be sent to Sentry
+ enableLogs: true,
+
+ // Enable sending user PII (Personally Identifiable Information)
+ // https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options/#sendDefaultPii
+ sendDefaultPii: false,
});
diff --git a/docs/source.config.ts b/docs/source.config.ts
index 9f81d31c63..b67079e70b 100644
--- a/docs/source.config.ts
+++ b/docs/source.config.ts
@@ -3,47 +3,61 @@ import {
defineConfig,
defineDocs,
frontmatterSchema,
+ metaSchema,
} from "fumadocs-mdx/config";
import { transformerTwoslash } from "fumadocs-twoslash";
import { createFileSystemTypesCache } from "fumadocs-twoslash/cache-fs";
-import { createGenerator, remarkAutoTypeTable } from "fumadocs-typescript";
-import { bundledLanguages, getSingletonHighlighter } from "shiki";
-import { z } from 'zod/v3';
-const generator = createGenerator();
+import { z } from "zod/v4";
-// suggested here: https://github.com/fuma-nama/fumadocs/issues/1095#issuecomment-2495855920
-// before highlight call
-await getSingletonHighlighter({
- langs: Object.keys(bundledLanguages),
-});
-// Options: https://fumadocs.vercel.app/docs/mdx/collections#define-docs
+// You can customise Zod schemas for frontmatter and `meta.json` here
+// see https://fumadocs.dev/docs/mdx/collections
export const docs = defineDocs({
dir: "content/docs",
docs: {
schema: frontmatterSchema.extend({
- description: z.string(),
- imageTitle: z.string().optional(),
+ // description: z.string(), // make required (unfortunately, breaks build)
+ imageTitle: z.string().optional(), // add imageTitle to customize text on og image
}),
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+ meta: {
+ schema: metaSchema,
},
});
-export const examples = defineDocs({
- dir: "content/examples",
+export const pages = defineDocs({
+ dir: "content/pages",
docs: {
schema: frontmatterSchema.extend({
- author: z.string().optional(),
- isPro: z.boolean().optional(),
+ // description: z.string(), // make required (unfortunately, breaks build)
+ imageTitle: z.string().optional(), // add imageTitle to customize text on og image
}),
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+ meta: {
+ schema: metaSchema,
},
});
-export const pages = defineDocs({
- dir: "content/pages",
+export const examples = defineDocs({
+ dir: "content/examples",
docs: {
schema: frontmatterSchema.extend({
- description: z.string(),
- imageTitle: z.string(),
+ author: z.string().optional(),
+ isPro: z.boolean().optional(),
+ imageTitle: z.string().optional(), // add imageTitle to customize text on og image
}),
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+
+ meta: {
+ schema: metaSchema,
},
});
@@ -54,15 +68,15 @@ export default defineConfig({
light: "github-light",
dark: "github-dark",
},
- // suggested here: https://github.com/fuma-nama/fumadocs/issues/1095#issuecomment-2495855920
- langs: Object.keys(bundledLanguages) as any[],
transformers: [
...(rehypeCodeDefaultOptions.transformers ?? []),
transformerTwoslash({
typesCache: createFileSystemTypesCache(),
}),
],
+ // important: Shiki doesn't support lazy loading languages for codeblocks in Twoslash popups
+ // make sure to define them first (e.g. the common ones)
+ langs: ["js", "jsx", "ts", "tsx", "css"],
},
- remarkPlugins: [[remarkAutoTypeTable, { generator }]],
},
});
diff --git a/docs/sqlite.db b/docs/sqlite.db
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
index 4fd260f7f9..3838223ce4 100644
--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -13,11 +13,11 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"paths": {
- "@/.source": ["./.source/index.ts"],
- "@/*": ["./*"]
+ "@/*": ["./*"],
+ "fumadocs-mdx:collections/*": [".source/*"]
},
"plugins": [
{
@@ -25,6 +25,12 @@
}
]
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
"exclude": ["node_modules"]
}
diff --git a/docs/validate-links.js b/docs/validate-links.js
deleted file mode 100644
index 7ce5bc0a0b..0000000000
--- a/docs/validate-links.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import { getTableOfContents } from "fumadocs-core/server";
-import { getSlugs, parseFilePath } from "fumadocs-core/source";
-import {
- printErrors,
- readFiles,
- scanURLs,
- validateFiles,
-} from "next-validate-link";
-import path from "node:path";
-
-async function checkLinks() {
- // we read them all at once to avoid repeated file read
- const docsFiles = await readFiles("content/docs/**/*.{md,mdx}");
-
- const exampleFiles = await readFiles("content/examples/**/*.{md,mdx}");
-
- const scanned = await scanURLs({
- populate: {
- "examples/[[...slug]]": exampleFiles.map((file) => {
- const info = parseFilePath(
- path.relative("content/examples", file.path),
- );
-
- return {
- value: getSlugs(info)[0],
- hashes: getTableOfContents(file.content).map((item) =>
- item.url.slice(1),
- ),
- };
- }),
- "docs/[[...slug]]": docsFiles.map((file) => {
- const info = parseFilePath(path.relative("content/docs", file.path));
-
- return {
- value: getSlugs(info),
- hashes: getTableOfContents(file.content).map((item) =>
- item.url.slice(1),
- ),
- };
- }),
- },
- });
-
- printErrors(
- await validateFiles([...docsFiles, ...exampleFiles], {
- scanned,
- }),
- true,
- );
-}
-
-void checkLinks();
diff --git a/docs/validate-links.mjs b/docs/validate-links.mjs
new file mode 100644
index 0000000000..d9a45f69b2
--- /dev/null
+++ b/docs/validate-links.mjs
@@ -0,0 +1,50 @@
+import { getTableOfContents } from "fumadocs-core/content/toc";
+import { getSlugs } from "fumadocs-core/source";
+import {
+ printErrors,
+ readFiles,
+ scanURLs,
+ validateFiles,
+} from "next-validate-link";
+import path from "node:path";
+async function checkLinks() {
+ const docsFiles = await readFiles("content/docs/**/*.{md,mdx}");
+ const pagesFiles = await readFiles("content/pages/**/*.{md,mdx}");
+ const examplesFiles = await readFiles("content/examples/**/*.{md,mdx}");
+
+ const scanned = await scanURLs({
+ populate: {
+ "[...slug]": pagesFiles.map((file) => {
+ return {
+ value: getSlugs(path.relative("content/pages", file.path)),
+ hashes: getTableOfContents(file.content).map((item) =>
+ item.url.slice(1),
+ ),
+ };
+ }),
+ "docs/[[...slug]]": docsFiles.map((file) => {
+ return {
+ value: getSlugs(path.relative("content/docs", file.path)),
+ hashes: getTableOfContents(file.content).map((item) =>
+ item.url.slice(1),
+ ),
+ };
+ }),
+ "examples/[[...slug]]": examplesFiles.map((file) => {
+ return {
+ value: getSlugs(path.relative("content/examples", file.path)),
+ hashes: getTableOfContents(file.content).map((item) =>
+ item.url.slice(1),
+ ),
+ };
+ }),
+ },
+ });
+ printErrors(
+ await validateFiles([...docsFiles, ...pagesFiles, ...examplesFiles], {
+ scanned,
+ }),
+ true,
+ );
+}
+void checkLinks();
diff --git a/examples/01-basic/01-minimal/package.json b/examples/01-basic/01-minimal/package.json
index 6832640639..af406c6b8f 100644
--- a/examples/01-basic/01-minimal/package.json
+++ b/examples/01-basic/01-minimal/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/02-block-objects/package.json b/examples/01-basic/02-block-objects/package.json
index 88c17de139..8b3ca5bf72 100644
--- a/examples/01-basic/02-block-objects/package.json
+++ b/examples/01-basic/02-block-objects/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/03-multi-column/package.json b/examples/01-basic/03-multi-column/package.json
index 25995902c9..dbcada18f2 100644
--- a/examples/01-basic/03-multi-column/package.json
+++ b/examples/01-basic/03-multi-column/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-multi-column": "latest"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/04-default-blocks/package.json b/examples/01-basic/04-default-blocks/package.json
index 1f5c5d6f34..bec32ddecb 100644
--- a/examples/01-basic/04-default-blocks/package.json
+++ b/examples/01-basic/04-default-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/05-removing-default-blocks/package.json b/examples/01-basic/05-removing-default-blocks/package.json
index 78c40cc86c..4970fe877a 100644
--- a/examples/01-basic/05-removing-default-blocks/package.json
+++ b/examples/01-basic/05-removing-default-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/06-block-manipulation/package.json b/examples/01-basic/06-block-manipulation/package.json
index 43564c8d09..362df04dd3 100644
--- a/examples/01-basic/06-block-manipulation/package.json
+++ b/examples/01-basic/06-block-manipulation/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/07-selection-blocks/package.json b/examples/01-basic/07-selection-blocks/package.json
index 8ffc080115..8bcccee05f 100644
--- a/examples/01-basic/07-selection-blocks/package.json
+++ b/examples/01-basic/07-selection-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/08-ariakit/package.json b/examples/01-basic/08-ariakit/package.json
index c08e2f29e6..75c7713c06 100644
--- a/examples/01-basic/08-ariakit/package.json
+++ b/examples/01-basic/08-ariakit/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/09-shadcn/package.json b/examples/01-basic/09-shadcn/package.json
index 95b944f747..2968b91d44 100644
--- a/examples/01-basic/09-shadcn/package.json
+++ b/examples/01-basic/09-shadcn/package.json
@@ -19,15 +19,15 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"tailwindcss": "^4.1.14",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@tailwindcss/vite": "^4.1.14",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/10-localization/package.json b/examples/01-basic/10-localization/package.json
index 090b16e0e7..39828f74fd 100644
--- a/examples/01-basic/10-localization/package.json
+++ b/examples/01-basic/10-localization/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/11-custom-placeholder/package.json b/examples/01-basic/11-custom-placeholder/package.json
index b6950cc686..4cde94a58d 100644
--- a/examples/01-basic/11-custom-placeholder/package.json
+++ b/examples/01-basic/11-custom-placeholder/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/12-multi-editor/package.json b/examples/01-basic/12-multi-editor/package.json
index 93c95a5682..ab6428dc8b 100644
--- a/examples/01-basic/12-multi-editor/package.json
+++ b/examples/01-basic/12-multi-editor/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/13-custom-paste-handler/package.json b/examples/01-basic/13-custom-paste-handler/package.json
index 3d9e7da82c..15dc905cb7 100644
--- a/examples/01-basic/13-custom-paste-handler/package.json
+++ b/examples/01-basic/13-custom-paste-handler/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/14-editor-scrollable/package.json b/examples/01-basic/14-editor-scrollable/package.json
index 8f15c5aae4..df436a2643 100644
--- a/examples/01-basic/14-editor-scrollable/package.json
+++ b/examples/01-basic/14-editor-scrollable/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/14-shadowdom/package.json b/examples/01-basic/14-shadowdom/package.json
index 2cfe9ca947..07d63662c1 100644
--- a/examples/01-basic/14-shadowdom/package.json
+++ b/examples/01-basic/14-shadowdom/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/01-basic/testing/package.json b/examples/01-basic/testing/package.json
index 62e08736a9..909248d480 100644
--- a/examples/01-basic/testing/package.json
+++ b/examples/01-basic/testing/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/02-backend/01-file-uploading/package.json b/examples/02-backend/01-file-uploading/package.json
index 0fcdee6a29..cd75ed5462 100644
--- a/examples/02-backend/01-file-uploading/package.json
+++ b/examples/02-backend/01-file-uploading/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/02-backend/02-saving-loading/package.json b/examples/02-backend/02-saving-loading/package.json
index 8eb3c04e48..95f0aa24f7 100644
--- a/examples/02-backend/02-saving-loading/package.json
+++ b/examples/02-backend/02-saving-loading/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/02-backend/03-s3/package.json b/examples/02-backend/03-s3/package.json
index 0e8fa4176f..bd1a31aa01 100644
--- a/examples/02-backend/03-s3/package.json
+++ b/examples/02-backend/03-s3/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@aws-sdk/client-s3": "^3.609.0",
"@aws-sdk/s3-request-presigner": "^3.609.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/02-backend/04-rendering-static-documents/package.json b/examples/02-backend/04-rendering-static-documents/package.json
index b9a9e406cc..17927198a8 100644
--- a/examples/02-backend/04-rendering-static-documents/package.json
+++ b/examples/02-backend/04-rendering-static-documents/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/server-util": "latest"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/01-ui-elements-remove/package.json b/examples/03-ui-components/01-ui-elements-remove/package.json
index 0bee48d039..70aa1a2265 100644
--- a/examples/03-ui-components/01-ui-elements-remove/package.json
+++ b/examples/03-ui-components/01-ui-elements-remove/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/02-formatting-toolbar-buttons/package.json b/examples/03-ui-components/02-formatting-toolbar-buttons/package.json
index 28120fe6f8..bbdc0d592c 100644
--- a/examples/03-ui-components/02-formatting-toolbar-buttons/package.json
+++ b/examples/03-ui-components/02-formatting-toolbar-buttons/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/03-formatting-toolbar-block-type-items/.bnexample.json b/examples/03-ui-components/03-formatting-toolbar-block-type-items/.bnexample.json
index 289811434f..73a254bea5 100644
--- a/examples/03-ui-components/03-formatting-toolbar-block-type-items/.bnexample.json
+++ b/examples/03-ui-components/03-formatting-toolbar-block-type-items/.bnexample.json
@@ -11,6 +11,6 @@
],
"dependencies": {
"@mantine/core": "^8.3.11",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/03-ui-components/03-formatting-toolbar-block-type-items/package.json b/examples/03-ui-components/03-formatting-toolbar-block-type-items/package.json
index 6e2d308b1d..64b3352fb2 100644
--- a/examples/03-ui-components/03-formatting-toolbar-block-type-items/package.json
+++ b/examples/03-ui-components/03-formatting-toolbar-block-type-items/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/04-side-menu-buttons/.bnexample.json b/examples/03-ui-components/04-side-menu-buttons/.bnexample.json
index 90cd5e6f3b..2e64fc3cdb 100644
--- a/examples/03-ui-components/04-side-menu-buttons/.bnexample.json
+++ b/examples/03-ui-components/04-side-menu-buttons/.bnexample.json
@@ -4,6 +4,6 @@
"author": "matthewlipski",
"tags": ["Intermediate", "Blocks", "UI Components", "Block Side Menu"],
"dependencies": {
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/03-ui-components/04-side-menu-buttons/package.json b/examples/03-ui-components/04-side-menu-buttons/package.json
index b9e2f9edd5..c3f63ce21a 100644
--- a/examples/03-ui-components/04-side-menu-buttons/package.json
+++ b/examples/03-ui-components/04-side-menu-buttons/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/05-side-menu-drag-handle-items/.bnexample.json b/examples/03-ui-components/05-side-menu-drag-handle-items/.bnexample.json
index 90cd5e6f3b..2e64fc3cdb 100644
--- a/examples/03-ui-components/05-side-menu-drag-handle-items/.bnexample.json
+++ b/examples/03-ui-components/05-side-menu-drag-handle-items/.bnexample.json
@@ -4,6 +4,6 @@
"author": "matthewlipski",
"tags": ["Intermediate", "Blocks", "UI Components", "Block Side Menu"],
"dependencies": {
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/03-ui-components/05-side-menu-drag-handle-items/package.json b/examples/03-ui-components/05-side-menu-drag-handle-items/package.json
index 1390e542af..1f9c75200d 100644
--- a/examples/03-ui-components/05-side-menu-drag-handle-items/package.json
+++ b/examples/03-ui-components/05-side-menu-drag-handle-items/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/06-suggestion-menus-slash-menu-items/.bnexample.json b/examples/03-ui-components/06-suggestion-menus-slash-menu-items/.bnexample.json
index ecb51384b1..26081354ce 100644
--- a/examples/03-ui-components/06-suggestion-menus-slash-menu-items/.bnexample.json
+++ b/examples/03-ui-components/06-suggestion-menus-slash-menu-items/.bnexample.json
@@ -10,6 +10,6 @@
"Slash Menu"
],
"dependencies": {
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/03-ui-components/06-suggestion-menus-slash-menu-items/package.json b/examples/03-ui-components/06-suggestion-menus-slash-menu-items/package.json
index 023140719d..4e1e364c94 100644
--- a/examples/03-ui-components/06-suggestion-menus-slash-menu-items/package.json
+++ b/examples/03-ui-components/06-suggestion-menus-slash-menu-items/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/07-suggestion-menus-slash-menu-component/package.json b/examples/03-ui-components/07-suggestion-menus-slash-menu-component/package.json
index 75a01f7096..e47e7b3eb0 100644
--- a/examples/03-ui-components/07-suggestion-menus-slash-menu-component/package.json
+++ b/examples/03-ui-components/07-suggestion-menus-slash-menu-component/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/08-suggestion-menus-emoji-picker-columns/package.json b/examples/03-ui-components/08-suggestion-menus-emoji-picker-columns/package.json
index 78daa5c657..1da0bd93ff 100644
--- a/examples/03-ui-components/08-suggestion-menus-emoji-picker-columns/package.json
+++ b/examples/03-ui-components/08-suggestion-menus-emoji-picker-columns/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/09-suggestion-menus-emoji-picker-component/package.json b/examples/03-ui-components/09-suggestion-menus-emoji-picker-component/package.json
index 098eafc205..305056b4ec 100644
--- a/examples/03-ui-components/09-suggestion-menus-emoji-picker-component/package.json
+++ b/examples/03-ui-components/09-suggestion-menus-emoji-picker-component/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/10-suggestion-menus-grid-mentions/package.json b/examples/03-ui-components/10-suggestion-menus-grid-mentions/package.json
index 9583d4e7a2..c1fef484c3 100644
--- a/examples/03-ui-components/10-suggestion-menus-grid-mentions/package.json
+++ b/examples/03-ui-components/10-suggestion-menus-grid-mentions/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/11-uppy-file-panel/.bnexample.json b/examples/03-ui-components/11-uppy-file-panel/.bnexample.json
index e26f344c76..49477b124d 100644
--- a/examples/03-ui-components/11-uppy-file-panel/.bnexample.json
+++ b/examples/03-ui-components/11-uppy-file-panel/.bnexample.json
@@ -15,7 +15,7 @@
"@uppy/status-bar": "^3.1.1",
"@uppy/webcam": "^3.4.2",
"@uppy/xhr-upload": "^3.4.0",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
},
"pro": true
}
diff --git a/examples/03-ui-components/11-uppy-file-panel/package.json b/examples/03-ui-components/11-uppy-file-panel/package.json
index 2231935398..8955ce5b72 100644
--- a/examples/03-ui-components/11-uppy-file-panel/package.json
+++ b/examples/03-ui-components/11-uppy-file-panel/package.json
@@ -19,8 +19,8 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@uppy/core": "^3.13.1",
"@uppy/dashboard": "^3.9.1",
"@uppy/drag-drop": "^3.1.1",
@@ -32,11 +32,11 @@
"@uppy/status-bar": "^3.1.1",
"@uppy/webcam": "^3.4.2",
"@uppy/xhr-upload": "^3.4.0",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/12-static-formatting-toolbar/package.json b/examples/03-ui-components/12-static-formatting-toolbar/package.json
index 6390bba3b0..8b455ffe0e 100644
--- a/examples/03-ui-components/12-static-formatting-toolbar/package.json
+++ b/examples/03-ui-components/12-static-formatting-toolbar/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/13-custom-ui/.bnexample.json b/examples/03-ui-components/13-custom-ui/.bnexample.json
index 337dc13521..02811781ee 100644
--- a/examples/03-ui-components/13-custom-ui/.bnexample.json
+++ b/examples/03-ui-components/13-custom-ui/.bnexample.json
@@ -13,8 +13,6 @@
"Appearance & Styling"
],
"dependencies": {
- "@emotion/react": "^11.11.4",
- "@emotion/styled": "^11.11.5",
"@mui/icons-material": "^5.16.1",
"@mui/material": "^5.16.1"
},
diff --git a/examples/03-ui-components/13-custom-ui/package.json b/examples/03-ui-components/13-custom-ui/package.json
index 8c122adc63..1ea4e67783 100644
--- a/examples/03-ui-components/13-custom-ui/package.json
+++ b/examples/03-ui-components/13-custom-ui/package.json
@@ -19,16 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "@emotion/react": "^11.11.4",
- "@emotion/styled": "^11.11.5",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@mui/icons-material": "^5.16.1",
"@mui/material": "^5.16.1"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/14-experimental-mobile-formatting-toolbar/package.json b/examples/03-ui-components/14-experimental-mobile-formatting-toolbar/package.json
index 20ecac123e..60265f345c 100644
--- a/examples/03-ui-components/14-experimental-mobile-formatting-toolbar/package.json
+++ b/examples/03-ui-components/14-experimental-mobile-formatting-toolbar/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/15-advanced-tables/package.json b/examples/03-ui-components/15-advanced-tables/package.json
index 5ca69ed25e..38e68d10e4 100644
--- a/examples/03-ui-components/15-advanced-tables/package.json
+++ b/examples/03-ui-components/15-advanced-tables/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/16-link-toolbar-buttons/package.json b/examples/03-ui-components/16-link-toolbar-buttons/package.json
index f85f9c77aa..8e5263cf56 100644
--- a/examples/03-ui-components/16-link-toolbar-buttons/package.json
+++ b/examples/03-ui-components/16-link-toolbar-buttons/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/03-ui-components/17-advanced-tables-2/package.json b/examples/03-ui-components/17-advanced-tables-2/package.json
index 4c6bd76b3e..0b759efc24 100644
--- a/examples/03-ui-components/17-advanced-tables-2/package.json
+++ b/examples/03-ui-components/17-advanced-tables-2/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/01-theming-dom-attributes/package.json b/examples/04-theming/01-theming-dom-attributes/package.json
index 8f39110dd9..e507bf0891 100644
--- a/examples/04-theming/01-theming-dom-attributes/package.json
+++ b/examples/04-theming/01-theming-dom-attributes/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/02-changing-font/package.json b/examples/04-theming/02-changing-font/package.json
index 176d0d29d4..012ea4a389 100644
--- a/examples/04-theming/02-changing-font/package.json
+++ b/examples/04-theming/02-changing-font/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/03-theming-css/package.json b/examples/04-theming/03-theming-css/package.json
index 7078b16aae..946f29cfab 100644
--- a/examples/04-theming/03-theming-css/package.json
+++ b/examples/04-theming/03-theming-css/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/04-theming-css-variables/package.json b/examples/04-theming/04-theming-css-variables/package.json
index bb840db236..2d3fb8fd37 100644
--- a/examples/04-theming/04-theming-css-variables/package.json
+++ b/examples/04-theming/04-theming-css-variables/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/05-theming-css-variables-code/package.json b/examples/04-theming/05-theming-css-variables-code/package.json
index 64c7c46041..e391fc873d 100644
--- a/examples/04-theming/05-theming-css-variables-code/package.json
+++ b/examples/04-theming/05-theming-css-variables-code/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/06-code-block/package.json b/examples/04-theming/06-code-block/package.json
index 27e3d19b4e..d1122bd3ac 100644
--- a/examples/04-theming/06-code-block/package.json
+++ b/examples/04-theming/06-code-block/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/code-block": "latest"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/04-theming/07-custom-code-block/package.json b/examples/04-theming/07-custom-code-block/package.json
index 35fb2fbf97..153b1c160c 100644
--- a/examples/04-theming/07-custom-code-block/package.json
+++ b/examples/04-theming/07-custom-code-block/package.json
@@ -19,8 +19,8 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/code-block": "latest",
"@shikijs/core": "^3.19.0",
"@shikijs/engine-javascript": "^3.19.0",
@@ -29,8 +29,8 @@
"@shikijs/types": "^3.19.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/01-converting-blocks-to-html/package.json b/examples/05-interoperability/01-converting-blocks-to-html/package.json
index 7668c90103..0f0316000f 100644
--- a/examples/05-interoperability/01-converting-blocks-to-html/package.json
+++ b/examples/05-interoperability/01-converting-blocks-to-html/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/02-converting-blocks-from-html/package.json b/examples/05-interoperability/02-converting-blocks-from-html/package.json
index 77cd354bd4..d62b8e0f42 100644
--- a/examples/05-interoperability/02-converting-blocks-from-html/package.json
+++ b/examples/05-interoperability/02-converting-blocks-from-html/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/03-converting-blocks-to-md/package.json b/examples/05-interoperability/03-converting-blocks-to-md/package.json
index 7555881b9b..f6b0651c0d 100644
--- a/examples/05-interoperability/03-converting-blocks-to-md/package.json
+++ b/examples/05-interoperability/03-converting-blocks-to-md/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/04-converting-blocks-from-md/package.json b/examples/05-interoperability/04-converting-blocks-from-md/package.json
index 99607c8164..3ca496c50d 100644
--- a/examples/05-interoperability/04-converting-blocks-from-md/package.json
+++ b/examples/05-interoperability/04-converting-blocks-from-md/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/05-converting-blocks-to-pdf/package.json b/examples/05-interoperability/05-converting-blocks-to-pdf/package.json
index b6a5ea3af3..3af24b9f75 100644
--- a/examples/05-interoperability/05-converting-blocks-to-pdf/package.json
+++ b/examples/05-interoperability/05-converting-blocks-to-pdf/package.json
@@ -19,15 +19,15 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-pdf-exporter": "latest",
"@blocknote/xl-multi-column": "latest",
"@react-pdf/renderer": "^4.3.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/06-converting-blocks-to-docx/.bnexample.json b/examples/05-interoperability/06-converting-blocks-to-docx/.bnexample.json
index 9c92212421..17ec620bc9 100644
--- a/examples/05-interoperability/06-converting-blocks-to-docx/.bnexample.json
+++ b/examples/05-interoperability/06-converting-blocks-to-docx/.bnexample.json
@@ -5,8 +5,7 @@
"tags": [""],
"dependencies": {
"@blocknote/xl-docx-exporter": "latest",
- "@blocknote/xl-multi-column": "latest",
- "docx": "^9.5.1"
+ "@blocknote/xl-multi-column": "latest"
},
"pro": true
}
diff --git a/examples/05-interoperability/06-converting-blocks-to-docx/package.json b/examples/05-interoperability/06-converting-blocks-to-docx/package.json
index 75b2649ac6..af8c76e04b 100644
--- a/examples/05-interoperability/06-converting-blocks-to-docx/package.json
+++ b/examples/05-interoperability/06-converting-blocks-to-docx/package.json
@@ -19,15 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-docx-exporter": "latest",
- "@blocknote/xl-multi-column": "latest",
- "docx": "^9.5.1"
+ "@blocknote/xl-multi-column": "latest"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/07-converting-blocks-to-odt/package.json b/examples/05-interoperability/07-converting-blocks-to-odt/package.json
index da6a49b6fa..aae892d407 100644
--- a/examples/05-interoperability/07-converting-blocks-to-odt/package.json
+++ b/examples/05-interoperability/07-converting-blocks-to-odt/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-odt-exporter": "latest",
"@blocknote/xl-multi-column": "latest"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/08-converting-blocks-to-react-email/.bnexample.json b/examples/05-interoperability/08-converting-blocks-to-react-email/.bnexample.json
index 4292fc5c25..34a9fffa9c 100644
--- a/examples/05-interoperability/08-converting-blocks-to-react-email/.bnexample.json
+++ b/examples/05-interoperability/08-converting-blocks-to-react-email/.bnexample.json
@@ -5,7 +5,7 @@
"tags": [""],
"dependencies": {
"@blocknote/xl-email-exporter": "latest",
- "@react-email/render": "^1.1.2"
+ "@react-email/render": "^2.0.4"
},
"pro": true
}
diff --git a/examples/05-interoperability/08-converting-blocks-to-react-email/package.json b/examples/05-interoperability/08-converting-blocks-to-react-email/package.json
index 132f1798eb..10e8836f84 100644
--- a/examples/05-interoperability/08-converting-blocks-to-react-email/package.json
+++ b/examples/05-interoperability/08-converting-blocks-to-react-email/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-email-exporter": "latest",
- "@react-email/render": "^1.1.2"
+ "@react-email/render": "^2.0.4"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/09-blocks-to-html-static-render/package.json b/examples/05-interoperability/09-blocks-to-html-static-render/package.json
index 058d97a04e..52926421b4 100644
--- a/examples/05-interoperability/09-blocks-to-html-static-render/package.json
+++ b/examples/05-interoperability/09-blocks-to-html-static-render/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/05-interoperability/10-static-html-render/package.json b/examples/05-interoperability/10-static-html-render/package.json
index a236672e08..6343ac6efc 100644
--- a/examples/05-interoperability/10-static-html-render/package.json
+++ b/examples/05-interoperability/10-static-html-render/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/01-alert-block/.bnexample.json b/examples/06-custom-schema/01-alert-block/.bnexample.json
index 6c9da82e4d..955f240be5 100644
--- a/examples/06-custom-schema/01-alert-block/.bnexample.json
+++ b/examples/06-custom-schema/01-alert-block/.bnexample.json
@@ -11,6 +11,6 @@
],
"dependencies": {
"@mantine/core": "^8.3.11",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/06-custom-schema/01-alert-block/package.json b/examples/06-custom-schema/01-alert-block/package.json
index 597e5bc0d8..b02510a70f 100644
--- a/examples/06-custom-schema/01-alert-block/package.json
+++ b/examples/06-custom-schema/01-alert-block/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/02-suggestion-menus-mentions/package.json b/examples/06-custom-schema/02-suggestion-menus-mentions/package.json
index 24233f9fa0..ea836ebabe 100644
--- a/examples/06-custom-schema/02-suggestion-menus-mentions/package.json
+++ b/examples/06-custom-schema/02-suggestion-menus-mentions/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/03-font-style/.bnexample.json b/examples/06-custom-schema/03-font-style/.bnexample.json
index cc557039c8..c9e4d4d97a 100644
--- a/examples/06-custom-schema/03-font-style/.bnexample.json
+++ b/examples/06-custom-schema/03-font-style/.bnexample.json
@@ -9,6 +9,6 @@
"Formatting Toolbar"
],
"dependencies": {
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/06-custom-schema/03-font-style/package.json b/examples/06-custom-schema/03-font-style/package.json
index a741e24efe..ab031bf380 100644
--- a/examples/06-custom-schema/03-font-style/package.json
+++ b/examples/06-custom-schema/03-font-style/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/04-pdf-file-block/.bnexample.json b/examples/06-custom-schema/04-pdf-file-block/.bnexample.json
index b128b50e24..f3f9f4d51b 100644
--- a/examples/06-custom-schema/04-pdf-file-block/.bnexample.json
+++ b/examples/06-custom-schema/04-pdf-file-block/.bnexample.json
@@ -11,7 +11,7 @@
],
"dependencies": {
"@mantine/core": "^8.3.11",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
},
"pro": true
}
diff --git a/examples/06-custom-schema/04-pdf-file-block/package.json b/examples/06-custom-schema/04-pdf-file-block/package.json
index f4a5f37da7..d5f5615cd0 100644
--- a/examples/06-custom-schema/04-pdf-file-block/package.json
+++ b/examples/06-custom-schema/04-pdf-file-block/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/05-alert-block-full-ux/.bnexample.json b/examples/06-custom-schema/05-alert-block-full-ux/.bnexample.json
index 797177a289..3326066fe0 100644
--- a/examples/06-custom-schema/05-alert-block-full-ux/.bnexample.json
+++ b/examples/06-custom-schema/05-alert-block-full-ux/.bnexample.json
@@ -12,6 +12,6 @@
],
"dependencies": {
"@mantine/core": "^8.3.11",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/06-custom-schema/05-alert-block-full-ux/package.json b/examples/06-custom-schema/05-alert-block-full-ux/package.json
index 114cb7c4fd..55dc8b0bf1 100644
--- a/examples/06-custom-schema/05-alert-block-full-ux/package.json
+++ b/examples/06-custom-schema/05-alert-block-full-ux/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-icons": "^5.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/06-toggleable-blocks/package.json b/examples/06-custom-schema/06-toggleable-blocks/package.json
index 835a2496da..5449c535a2 100644
--- a/examples/06-custom-schema/06-toggleable-blocks/package.json
+++ b/examples/06-custom-schema/06-toggleable-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/07-configuring-blocks/package.json b/examples/06-custom-schema/07-configuring-blocks/package.json
index 752a6acec9..edf107c487 100644
--- a/examples/06-custom-schema/07-configuring-blocks/package.json
+++ b/examples/06-custom-schema/07-configuring-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/draggable-inline-content/package.json b/examples/06-custom-schema/draggable-inline-content/package.json
index 9defd6f5be..98db481029 100644
--- a/examples/06-custom-schema/draggable-inline-content/package.json
+++ b/examples/06-custom-schema/draggable-inline-content/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/react-custom-blocks/package.json b/examples/06-custom-schema/react-custom-blocks/package.json
index ec58fa6ebf..0372b1c809 100644
--- a/examples/06-custom-schema/react-custom-blocks/package.json
+++ b/examples/06-custom-schema/react-custom-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/react-custom-inline-content/package.json b/examples/06-custom-schema/react-custom-inline-content/package.json
index 83b07f70da..98abca8461 100644
--- a/examples/06-custom-schema/react-custom-inline-content/package.json
+++ b/examples/06-custom-schema/react-custom-inline-content/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/06-custom-schema/react-custom-styles/package.json b/examples/06-custom-schema/react-custom-styles/package.json
index 90d5e25b62..eb88b335ff 100644
--- a/examples/06-custom-schema/react-custom-styles/package.json
+++ b/examples/06-custom-schema/react-custom-styles/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/01-partykit/package.json b/examples/07-collaboration/01-partykit/package.json
index 35f9a23120..c29a4981a9 100644
--- a/examples/07-collaboration/01-partykit/package.json
+++ b/examples/07-collaboration/01-partykit/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/02-liveblocks/package.json b/examples/07-collaboration/02-liveblocks/package.json
index 5d57e063a8..42dac31b38 100644
--- a/examples/07-collaboration/02-liveblocks/package.json
+++ b/examples/07-collaboration/02-liveblocks/package.json
@@ -19,8 +19,8 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@liveblocks/client": "3.7.1-tiptap3",
"@liveblocks/react": "3.7.1-tiptap3",
"@liveblocks/react-blocknote": "3.7.1-tiptap3",
@@ -29,8 +29,8 @@
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/03-y-sweet/package.json b/examples/07-collaboration/03-y-sweet/package.json
index 35d2cab7ce..ca2e4b0097 100644
--- a/examples/07-collaboration/03-y-sweet/package.json
+++ b/examples/07-collaboration/03-y-sweet/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@y-sweet/react": "^0.6.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/04-electric-sql/package.json b/examples/07-collaboration/04-electric-sql/package.json
index 434c134ea9..dd9d538875 100644
--- a/examples/07-collaboration/04-electric-sql/package.json
+++ b/examples/07-collaboration/04-electric-sql/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/05-comments/package.json b/examples/07-collaboration/05-comments/package.json
index 3ae88fc974..27897406ce 100644
--- a/examples/07-collaboration/05-comments/package.json
+++ b/examples/07-collaboration/05-comments/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@y-sweet/react": "^0.6.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/06-comments-with-sidebar/package.json b/examples/07-collaboration/06-comments-with-sidebar/package.json
index 1d5757f630..c1a6c49f9a 100644
--- a/examples/07-collaboration/06-comments-with-sidebar/package.json
+++ b/examples/07-collaboration/06-comments-with-sidebar/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/07-ghost-writer/package.json b/examples/07-collaboration/07-ghost-writer/package.json
index 04286681ae..a45bc3a305 100644
--- a/examples/07-collaboration/07-ghost-writer/package.json
+++ b/examples/07-collaboration/07-ghost-writer/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/07-collaboration/08-forking/package.json b/examples/07-collaboration/08-forking/package.json
index b2ffbba8c6..08ca3f389d 100644
--- a/examples/07-collaboration/08-forking/package.json
+++ b/examples/07-collaboration/08-forking/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/08-extensions/01-tiptap-arrow-conversion/package.json b/examples/08-extensions/01-tiptap-arrow-conversion/package.json
index 203a3c1018..7eaeaf3eaa 100644
--- a/examples/08-extensions/01-tiptap-arrow-conversion/package.json
+++ b/examples/08-extensions/01-tiptap-arrow-conversion/package.json
@@ -19,13 +19,13 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@tiptap/core": "^3.13.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/01-minimal/package.json b/examples/09-ai/01-minimal/package.json
index 02e9eb8d14..b244123bd7 100644
--- a/examples/09-ai/01-minimal/package.json
+++ b/examples/09-ai/01-minimal/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/02-playground/package.json b/examples/09-ai/02-playground/package.json
index c97f955d47..9bfc984a4a 100644
--- a/examples/09-ai/02-playground/package.json
+++ b/examples/09-ai/02-playground/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/03-custom-ai-menu-items/.bnexample.json b/examples/09-ai/03-custom-ai-menu-items/.bnexample.json
index 7f60d22409..a026ef1ee5 100644
--- a/examples/09-ai/03-custom-ai-menu-items/.bnexample.json
+++ b/examples/09-ai/03-custom-ai-menu-items/.bnexample.json
@@ -7,6 +7,6 @@
"@blocknote/xl-ai": "latest",
"@mantine/core": "^8.3.11",
"ai": "^6.0.5",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
}
}
diff --git a/examples/09-ai/03-custom-ai-menu-items/package.json b/examples/09-ai/03-custom-ai-menu-items/package.json
index 87b119dbb1..1385ceab9b 100644
--- a/examples/09-ai/03-custom-ai-menu-items/package.json
+++ b/examples/09-ai/03-custom-ai-menu-items/package.json
@@ -19,15 +19,15 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5",
- "react-icons": "^5.2.1"
+ "react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/04-with-collaboration/package.json b/examples/09-ai/04-with-collaboration/package.json
index 1ad2d37d14..fe17faaa59 100644
--- a/examples/09-ai/04-with-collaboration/package.json
+++ b/examples/09-ai/04-with-collaboration/package.json
@@ -19,16 +19,16 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/05-manual-execution/package.json b/examples/09-ai/05-manual-execution/package.json
index 403386889f..b23f7678a0 100644
--- a/examples/09-ai/05-manual-execution/package.json
+++ b/examples/09-ai/05-manual-execution/package.json
@@ -19,16 +19,16 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5",
"y-partykit": "^0.0.25",
"yjs": "^13.6.27"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/06-client-side-transport/package.json b/examples/09-ai/06-client-side-transport/package.json
index 3c34c06836..4a143fbef3 100644
--- a/examples/09-ai/06-client-side-transport/package.json
+++ b/examples/09-ai/06-client-side-transport/package.json
@@ -19,15 +19,15 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@ai-sdk/groq": "^3.0.2",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/09-ai/07-server-persistence/package.json b/examples/09-ai/07-server-persistence/package.json
index 15ca07ef6a..b379364817 100644
--- a/examples/09-ai/07-server-persistence/package.json
+++ b/examples/09-ai/07-server-persistence/package.json
@@ -19,14 +19,14 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"@blocknote/xl-ai": "latest",
"ai": "^6.0.5"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/vanilla-js/react-vanilla-custom-blocks/package.json b/examples/vanilla-js/react-vanilla-custom-blocks/package.json
index 6744c230fa..caf42e11e5 100644
--- a/examples/vanilla-js/react-vanilla-custom-blocks/package.json
+++ b/examples/vanilla-js/react-vanilla-custom-blocks/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/vanilla-js/react-vanilla-custom-inline-content/package.json b/examples/vanilla-js/react-vanilla-custom-inline-content/package.json
index 996714d813..2eb0b9a64f 100644
--- a/examples/vanilla-js/react-vanilla-custom-inline-content/package.json
+++ b/examples/vanilla-js/react-vanilla-custom-inline-content/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/examples/vanilla-js/react-vanilla-custom-styles/package.json b/examples/vanilla-js/react-vanilla-custom-styles/package.json
index cf7cd8bd69..f192b05a60 100644
--- a/examples/vanilla-js/react-vanilla-custom-styles/package.json
+++ b/examples/vanilla-js/react-vanilla-custom-styles/package.json
@@ -19,12 +19,12 @@
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- "react": "^19.2.1",
- "react-dom": "^19.2.1"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"vite": "^5.4.20"
}
diff --git a/packages/ariakit/package.json b/packages/ariakit/package.json
index 22dc8fedab..755434c3e9 100644
--- a/packages/ariakit/package.json
+++ b/packages/ariakit/package.json
@@ -61,12 +61,12 @@
"@blocknote/react": "0.46.1"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rimraf": "^5.0.10",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
diff --git a/packages/dev-scripts/examples/template-react/package.json.template.tsx b/packages/dev-scripts/examples/template-react/package.json.template.tsx
index 649d2d8f1e..a08cdc93ad 100644
--- a/packages/dev-scripts/examples/template-react/package.json.template.tsx
+++ b/packages/dev-scripts/examples/template-react/package.json.template.tsx
@@ -21,8 +21,8 @@ const template = (project: Project) => ({
"@mantine/core": "^8.3.11",
"@mantine/hooks": "^8.3.11",
"@mantine/utils": "^6.0.22",
- react: "^19.2.1",
- "react-dom": "^19.2.1",
+ react: "^19.2.3",
+ "react-dom": "^19.2.3",
...(project.config.tailwind
? {
tailwindcss: "^4.1.14",
@@ -37,8 +37,8 @@ const template = (project: Project) => ({
"@tailwindcss/vite": "^4.1.14",
}
: {}),
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
vite: "^5.4.20",
...(project.config?.devDependencies || {}),
diff --git a/packages/dev-scripts/package.json b/packages/dev-scripts/package.json
index 735c97cba8..2e497fd957 100644
--- a/packages/dev-scripts/package.json
+++ b/packages/dev-scripts/package.json
@@ -19,12 +19,12 @@
"lint": "eslint examples --max-warnings 0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"eslint": "^8.57.1",
"glob": "^10.5.0",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"tinyglobby": "0.2.12",
"tsx": "^4.20.6",
"typescript": "^5.9.3"
diff --git a/packages/mantine/package.json b/packages/mantine/package.json
index 23e3337fe3..6235a8300c 100644
--- a/packages/mantine/package.json
+++ b/packages/mantine/package.json
@@ -66,12 +66,12 @@
"react-icons": "^5.5.0"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rimraf": "^5.0.10",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
diff --git a/packages/react/package.json b/packages/react/package.json
index a15f0e71ba..2499e01fcd 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -78,12 +78,12 @@
"@types/lodash.foreach": "^4.5.9",
"@types/lodash.groupby": "^4.6.9",
"@types/lodash.merge": "^4.6.9",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rimraf": "^5.0.10",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
diff --git a/packages/server-util/package.json b/packages/server-util/package.json
index cee11600e8..409f556738 100644
--- a/packages/server-util/package.json
+++ b/packages/server-util/package.json
@@ -67,11 +67,11 @@
},
"devDependencies": {
"@types/jsdom": "^21.1.7",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
"vite": "^5.4.20",
diff --git a/packages/shadcn/package.json b/packages/shadcn/package.json
index ae29cff917..326c5a20ff 100644
--- a/packages/shadcn/package.json
+++ b/packages/shadcn/package.json
@@ -77,12 +77,12 @@
"devDependencies": {
"@radix-ui/colors": "^3.0.0",
"@types/node": "^20.19.22",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rimraf": "^5.0.10",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
diff --git a/packages/xl-ai/package.json b/packages/xl-ai/package.json
index 65a1f563fb..63d8921dad 100644
--- a/packages/xl-ai/package.json
+++ b/packages/xl-ai/package.json
@@ -86,8 +86,8 @@
"prosemirror-tables": "^1.8.3",
"prosemirror-transform": "^1.10.5",
"prosemirror-view": "^1.41.4",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"react-icons": "^5.5.0",
"remark-parse": "^11.0.0",
"remark-stringify": "^11.0.0",
@@ -107,8 +107,8 @@
"@types/json-schema": "^7.0.15",
"@types/lodash.isequal": "^4.5.8",
"@types/lodash.merge": "^4.6.9",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/runner": "^2.1.9",
"eslint": "^8.57.1",
diff --git a/packages/xl-docx-exporter/package.json b/packages/xl-docx-exporter/package.json
index caffbaa4fb..8b184d1937 100644
--- a/packages/xl-docx-exporter/package.json
+++ b/packages/xl-docx-exporter/package.json
@@ -64,12 +64,12 @@
"image-meta": "^0.2.2"
},
"devDependencies": {
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"@zip.js/zip.js": "^2.8.8",
"eslint": "^8.57.1",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
"vite": "^5.4.20",
diff --git a/packages/xl-email-exporter/package.json b/packages/xl-email-exporter/package.json
index 0bd1174eb5..9a3b087b3c 100644
--- a/packages/xl-email-exporter/package.json
+++ b/packages/xl-email-exporter/package.json
@@ -57,17 +57,17 @@
"web-streams-polyfill": "^4.2.0",
"@blocknote/core": "0.46.1",
"@blocknote/react": "0.46.1",
- "@react-email/components": "^0.1.1",
- "@react-email/render": "^1.4.0",
+ "@react-email/components": "^1.0.5",
+ "@react-email/render": "^2.0.4",
"buffer": "^6.0.3",
- "react": "^19.2.1",
- "react-dom": "^19.2.1",
- "react-email": "^4.3.0"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-email": "^5.2.5"
},
"devDependencies": {
"@types/jsdom": "^21.1.7",
- "@types/react": "^19.2.2",
- "@types/react-dom": "^19.2.2",
+ "@types/react": "^19.2.3",
+ "@types/react-dom": "^19.2.3",
"eslint": "^8.57.1",
"rollup-plugin-webpack-stats": "^0.2.6",
"typescript": "^5.9.3",
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 73e152af24..0bfcd950f1 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,37 +1,37 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`react email exporter > should export a document (HTML snapshot) > __snapshots__/reactEmailExporter 1`] = `"
Welcome to this demo 🙌!
Hello World nested
Hello World double nested
This paragraph has a background color
Paragraph
Heading
Heading right
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.
All those moments will be lost in time, like tears in rain.
"`;
+exports[`react email exporter > should export a document (HTML snapshot) > __snapshots__/reactEmailExporter 1`] = `"
Welcome to this demo 🙌!
Hello World nested
Hello World double nested
This paragraph has a background color
Paragraph
Heading
Heading right
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.
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.
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.
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.
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.
All those moments will be lost in time, like tears in rain.
"`;
-exports[`react email exporter > should handle document with background colors > __snapshots__/reactEmailExporterBackgroundColor 1`] = `"
Text with background color
"`;
+exports[`react email exporter > should handle document with background colors > __snapshots__/reactEmailExporterBackgroundColor 1`] = `"
Text with background color
"`;
-exports[`react email exporter > should handle document with check list items > __snapshots__/reactEmailExporterCheckList 1`] = `"
Checked item
Unchecked item
"`;
+exports[`react email exporter > should handle document with check list items > __snapshots__/reactEmailExporterCheckList 1`] = `"
Checked item
Unchecked item
"`;
-exports[`react email exporter > should handle document with code blocks > __snapshots__/reactEmailExporterCodeBlock 1`] = `"
const hello ='world';
console.log(hello);
"`;
+exports[`react email exporter > should handle document with code blocks > __snapshots__/reactEmailExporterCodeBlock 1`] = `"
const hello = 'world'; console.log(hello);
"`;
-exports[`react email exporter > should handle document with complex nested structure > __snapshots__/reactEmailExporterComplexNested 1`] = `"
Complex Document
This is a paragraph with bold and italic text, plus a link.
List item with nested content
Nested paragraph
Nested numbered item
"`;
+exports[`react email exporter > should handle document with complex nested structure > __snapshots__/reactEmailExporterComplexNested 1`] = `"
Complex Document
This is a paragraph with bold and italic text, plus a link.
List item with nested content
Nested paragraph
Nested numbered item
"`;
-exports[`react email exporter > should handle document with custom body styles > __snapshots__/reactEmailExporterCustomBodyStyles 1`] = `"
Welcome to this demo 🙌!
Hello World nested
Hello World double nested
This paragraph has a background color
Paragraph
Heading
Heading right
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.
All those moments will be lost in time, like tears in rain.
"`;
+exports[`react email exporter > should handle document with custom body styles > __snapshots__/reactEmailExporterCustomBodyStyles 1`] = `"
Welcome to this demo 🙌!
Hello World nested
Hello World double nested
This paragraph has a background color
Paragraph
Heading
Heading right
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.