diff --git a/apps/docs/public/assets/pages/courselit-text-editor-create-links.gif b/apps/docs/public/assets/pages/courselit-text-editor-create-links.gif new file mode 100644 index 000000000..87cf53faf Binary files /dev/null and b/apps/docs/public/assets/pages/courselit-text-editor-create-links.gif differ diff --git a/apps/docs/src/pages/en/website/blocks.md b/apps/docs/src/pages/en/website/blocks.md index 9f7bed0b9..072c716db 100644 --- a/apps/docs/src/pages/en/website/blocks.md +++ b/apps/docs/src/pages/en/website/blocks.md @@ -6,7 +6,7 @@ layout: ../../../layouts/MainLayout.astro Every page in CourseLit is made up of various blocks, stacked in a top-to-bottom fashion. Each block serves a unique purpose and can be customized. -The following screenshot shows [Header](/en/pages/header), [Rich Text](/en/pages/banner), [Hero](/en/pages/content), and [Grid](/en/pages/grid) blocks (top to bottom) in action. Different blocks are highlighted in different colors. +The following screenshot shows [Header](/en/website/blocks#header), [Rich Text](/en/website/blocks#rich-text), [Hero](/en/website/blocks#hero), and [Grid](/en/website/blocks#grid) blocks (top to bottom) in action. Different blocks are highlighted in different colors. ![CourseLit page blocks](/assets/pages/page-builder-blocks.png) @@ -36,32 +36,40 @@ You will also see the newly added link on the header itself. 3. Click on the pencil icon against the newly added link to edit it as shown above. 4. Change the label (displayed as text on the header block) and the URL (where the user should be taken upon clicking the label on the header) and click `Done` to save. ![Header edit link](/assets/pages/header-edit-link.png) - + ### [Rich Text](#rich-text)
Expand to see Rich Text block details -The rich text block can be used to add text blocks containing elements like hyperlinks, etc. +The rich text block uses the same text editor available elsewhere on the platform. It supports all functionality that does not require a toolbar, as the toolbar is hidden in this block. -#### Making text bold/italic/underline +#### Keyboard shortcuts 1. Select the text. -2. To make the selected text bold, press Ctrl+B; to make it italic, press Ctrl+I; and for underline, press Ctrl+U. - -You can also use the floating controls to do the same as shown below. +2. Use the following shortcuts to format it: + +- **Bold**: Ctrl+B +- **Italic**: Ctrl+I +- **Underline**: Ctrl+U +- **Strikethrough**: Ctrl+Shift+S +- **Undo**: Ctrl+Z +- **Redo**: Ctrl+Shift+Z +- **Paste**: Ctrl+V +- **Ordered list**: Ctrl+Shift+7 +- **Bulleted list**: Ctrl+Shift+8 +- **Highlight**: Ctrl+Shift+H (or type `==two equal signs==`) ![Stylised text](/assets/pages/rich-text-styling.gif) #### Creating hyperlinks 1. Select the text. - > Double-clicking the text to select won't work due to a bug. We are working on it. -2. Click on the floating `link` button to reveal a popup text input. -3. In the popup text input, enter the URL as shown below. - ![Create a hyperlink in rich text block](/assets/pages/rich-text-create-hyperlink.gif) -
+2. Click on the floating `link` icon to reveal a text input. +3. In the popup text input, enter the URL as shown below and press Enter. + ![Create a hyperlink in rich text block](/assets/pages/courselit-text-editor-create-links.gif) + ### [Hero](#hero) @@ -87,7 +95,7 @@ Following is how it looks on a page. 4. In the button action, enter the URL the user should be taken to upon clicking. a. If the URL is from your own school, use its relative form, i.e., `/courses`. b. If the URL is from some external website, use the absolute (complete) URL, i.e., `https://website.com/courses`. - + ### [Grid](#grid) @@ -132,7 +140,7 @@ A grid block comes in handy when you want to show some sort of list, for example 4. In the button action, enter the URL the user should be taken to upon clicking. a. If the URL is from your own school, use its relative form, i.e., `/courses`. b. If the URL is from some external website, use the absolute (complete) URL, i.e., `https://website.com/courses`. - + ### [Featured](#featured) @@ -268,7 +276,7 @@ In the `Design` panel, you can customize: - Maximum width - Vertical padding - Social media links (Facebook, Twitter, Instagram, LinkedIn, YouTube, Discord, GitHub) - + ## [Shared blocks](#shared-blocks) diff --git a/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/client-side-text-renderer.tsx b/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/client-side-text-renderer.tsx index 522188ff2..697c00ccf 100644 --- a/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/client-side-text-renderer.tsx +++ b/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/client-side-text-renderer.tsx @@ -1,7 +1,23 @@ "use client"; -import { TextRenderer } from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; +import { ThemeStyle } from "@courselit/page-models"; +import { TableOfContent } from "@components/table-of-content"; +import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; -export default function ClientSideTextRenderer({ json }: { json: any }) { - return ; +export default function ClientSideTextRenderer({ + json, + theme, +}: { + json: any; + theme: ThemeStyle; +}) { + return ( +
+ + + + +
+ ); } diff --git a/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/page.tsx b/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/page.tsx index 7d46a04a1..d09888a9b 100644 --- a/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/page.tsx +++ b/apps/web/app/(with-contexts)/(with-layout)/blog/[slug]/[id]/page.tsx @@ -1,5 +1,5 @@ import { Course } from "@courselit/common-models"; -import { Caption, Header1, Section, Text1 } from "@courselit/page-primitives"; +import { Caption, Header1, Section } from "@courselit/page-primitives"; import { formattedLocaleDate, getFullSiteSetup } from "@ui-lib/utils"; import { getAddressFromHeaders } from "@/app/actions"; import { headers } from "next/headers"; @@ -96,11 +96,10 @@ export default async function ProductPage(props: { )} {product?.description && ( - - - + )} diff --git a/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx b/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx index 6ca661bd9..2bf9aa0b5 100644 --- a/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx +++ b/apps/web/app/(with-contexts)/course/[slug]/[id]/page.tsx @@ -14,18 +14,21 @@ import { Link, Button2, getSymbolFromCurrency, - TextRenderer, - TextEditorEmptyDoc, Image, } from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; +import { TableOfContent } from "@components/table-of-content"; import { AddressContext, ProfileContext, SiteInfoContext, + ThemeContext, } from "@components/contexts"; import { getProduct } from "./helpers"; import { getUserProfile } from "@/app/(with-contexts)/helpers"; import { BadgeCheck } from "lucide-react"; +import { emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; +import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; const { permissions } = UIConstants; export default function ProductPage(props: { @@ -38,6 +41,7 @@ export default function ProductPage(props: { const siteInfo = useContext(SiteInfoContext); const address = useContext(AddressContext); const [progress, setProgress] = useState(null); + const { theme } = useContext(ThemeContext); useEffect(() => { if (id) { @@ -68,6 +72,10 @@ export default function ProductPage(props: { return null; } + const descriptionJson = product.description + ? JSON.parse(product.description) + : TextEditorEmptyDoc; + return (

{product.title}

@@ -118,14 +126,18 @@ export default function ProductPage(props: {
)}
- +
+ + + + +
{isEnrolled(product.courseId, profile as Profile) && (
diff --git a/apps/web/app/(with-contexts)/dashboard/(sidebar)/community/[id]/manage/page.tsx b/apps/web/app/(with-contexts)/dashboard/(sidebar)/community/[id]/manage/page.tsx index 80b7d2adc..35a1d1c02 100644 --- a/apps/web/app/(with-contexts)/dashboard/(sidebar)/community/[id]/manage/page.tsx +++ b/apps/web/app/(with-contexts)/dashboard/(sidebar)/community/[id]/manage/page.tsx @@ -1,11 +1,7 @@ "use client"; import DashboardContent from "@components/admin/dashboard-content"; -import { - AddressContext, - ProfileContext, - SiteInfoContext, -} from "@components/contexts"; +import { AddressContext, ProfileContext } from "@components/contexts"; import { COMMUNITY_HEADER, COMMUNITY_SETTINGS, @@ -31,8 +27,6 @@ import { Image, Link, MediaSelector, - TextEditor, - TextEditorEmptyDoc, useToast, } from "@courselit/components-library"; import { Separator } from "@components/ui/separator"; @@ -72,6 +66,7 @@ import { Input } from "@/components/ui/input"; import { redirect, useRouter } from "next/navigation"; import { useMembership } from "@/hooks/use-membership"; import { useGraphQLFetch } from "@/hooks/use-graphql-fetch"; +import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; const { PaymentPlanType: paymentPlanType, MembershipEntityType } = Constants; export default function Page(props: { @@ -90,7 +85,6 @@ export default function Page(props: { ]; const { profile } = useContext(ProfileContext); const address = useContext(AddressContext); - const siteinfo = useContext(SiteInfoContext); const [name, setName] = useState(""); const [enabled, setEnabled] = useState(false); @@ -565,7 +559,7 @@ export default function Page(props: { />

Description

- setDescription(state)} showToolbar={false} diff --git a/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/content/section/[section]/lesson/page.tsx b/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/content/section/[section]/lesson/page.tsx index d15f11eac..d4d108150 100644 --- a/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/content/section/[section]/lesson/page.tsx +++ b/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/content/section/[section]/lesson/page.tsx @@ -51,12 +51,7 @@ import { TextEditorContent, UIConstants, } from "@courselit/common-models"; -import { - MediaSelector, - TextEditor, - TextEditorEmptyDoc, - useToast, -} from "@courselit/components-library"; +import { MediaSelector, useToast } from "@courselit/components-library"; import { MIMETYPE_VIDEO, MIMETYPE_AUDIO, @@ -67,6 +62,7 @@ import { QuizBuilder } from "@components/admin/products/quiz-builder"; import { isTextEditorNonEmpty, truncate } from "@ui-lib/utils"; import { Skeleton } from "@/components/ui/skeleton"; import { Separator } from "@components/ui/separator"; +import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; const { permissions } = UIConstants; @@ -214,7 +210,7 @@ export default function LessonPage() { case Constants.LessonType.TEXT: return (
- { diff --git a/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/manage/components/product-details.tsx b/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/manage/components/product-details.tsx index 95adb9037..7f0e09e2d 100644 --- a/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/manage/components/product-details.tsx +++ b/apps/web/app/(with-contexts)/dashboard/(sidebar)/product/[id]/manage/components/product-details.tsx @@ -5,11 +5,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; -import { - TextEditor, - TextEditorEmptyDoc, - useToast, -} from "@courselit/components-library"; +import { useToast } from "@courselit/components-library"; import { AddressContext } from "@components/contexts"; import { APP_MESSAGE_COURSE_SAVED, @@ -20,6 +16,7 @@ import { } from "@ui-config/strings"; import { useGraphQLFetch } from "@/hooks/use-graphql-fetch"; import { Save, Loader2 } from "lucide-react"; +import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; const MUTATION_UPDATE_BASIC_DETAILS = ` mutation UpdateBasicDetails($courseId: String!, $title: String!, $description: String!) { @@ -131,7 +128,7 @@ export default function ProductDetails({ product }: ProductDetailsProps) { Description - { handleInputChange({ diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index d98ddbe58..0c8efd932 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,7 +1,7 @@ -import "remirror/styles/all.css"; import "@courselit/page-blocks/styles.css"; import "@courselit/components-library/styles.css"; import "@courselit/page-primitives/styles.css"; +import "@courselit/text-editor/styles.css"; import "../styles/globals.css"; import type { Metadata } from "next"; import { headers } from "next/headers"; diff --git a/apps/web/components/admin/blogs/editor/details.tsx b/apps/web/components/admin/blogs/editor/details.tsx index 77792d87d..3388adf38 100644 --- a/apps/web/components/admin/blogs/editor/details.tsx +++ b/apps/web/components/admin/blogs/editor/details.tsx @@ -1,8 +1,6 @@ import React, { FormEvent, useContext, useEffect, useState } from "react"; import { MediaSelector, - TextEditor, - TextEditorEmptyDoc, Form, FormField, Button, @@ -23,6 +21,7 @@ import { import { MIMETYPE_IMAGE } from "@/ui-config/constants"; import { Media, Profile } from "@courselit/common-models"; import { AddressContext, ProfileContext } from "@components/contexts"; +import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; interface DetailsProps { id: string; @@ -145,12 +144,19 @@ export default function Details({ id }: DetailsProps) { onChange={(e) => setTitle(e.target.value)} /> - setDescription(state)} url={address.backend} placeholder={TEXT_EDITOR_PLACEHOLDER} + onError={(err: any) => { + toast({ + title: TOAST_TITLE_ERROR, + description: err, + variant: "destructive", + }); + }} />
diff --git a/apps/web/components/community/banner.tsx b/apps/web/components/community/banner.tsx index 1fe060ba7..35f915596 100644 --- a/apps/web/components/community/banner.tsx +++ b/apps/web/components/community/banner.tsx @@ -2,16 +2,14 @@ import { useState, useEffect, useRef, useContext } from "react"; import { Button } from "@/components/ui/button"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { AlertCircle, Pencil, Check, X, Loader2 } from "lucide-react"; -import { - TextEditor, - TextEditorEmptyDoc, - TextRenderer, - useToast, -} from "@courselit/components-library"; +import { useToast } from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; import { isTextEditorNonEmpty } from "@ui-lib/utils"; import { BUTTON_SAVING, TOAST_TITLE_SUCCESS } from "@ui-config/strings"; import { AddressContext } from "@components/contexts"; import type { TextEditorContent } from "@courselit/common-models"; +import { Editor, emptyDoc as TextEditorEmptyDoc } from "@courselit/text-editor"; +import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; interface BannerComponentProps { canEdit: boolean; @@ -81,14 +79,16 @@ export default function Banner({ <> {isTextEditorNonEmpty(bannerText) ? ( - - } - /> + + + } + /> + ) : ( canEdit && (
@@ -116,10 +116,12 @@ export default function Banner({ ) : (
- setEditedBannerText(value)} + onChange={(value) => + setEditedBannerText(value as TextEditorContent) + } url={address.backend} />
diff --git a/apps/web/components/community/info.tsx b/apps/web/components/community/info.tsx index fb609f036..b185274d2 100644 --- a/apps/web/components/community/info.tsx +++ b/apps/web/components/community/info.tsx @@ -14,13 +14,14 @@ import { FormField, getSymbolFromCurrency, Link, - TextRenderer, useToast, } from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; import { AddressContext, ProfileContext, SiteInfoContext, + ThemeContext, } from "@components/contexts"; import { Dialog, @@ -33,6 +34,7 @@ import { } from "@components/ui/dialog"; import { COMMUNITY_SETTINGS, TOAST_TITLE_SUCCESS } from "@ui-config/strings"; import { Share2 } from "lucide-react"; +import WidgetErrorBoundary from "@components/public/base-layout/template/widget-error-boundary"; const { permissions } = UIConstants; interface CommunityInfoProps { @@ -74,6 +76,7 @@ export function CommunityInfo({ const currencySymbol = getSymbolFromCurrency(siteinfo.currencyISOCode || "USD") || "$"; const { toast } = useToast(); + const { theme } = useContext(ThemeContext); const handleJoinSubmit = async (e: FormEvent) => { e.preventDefault(); @@ -121,7 +124,14 @@ export function CommunityInfo({ />
- {description && } + {description && ( + + + + )}

{memberCount.toLocaleString()} members diff --git a/apps/web/components/public/lesson-viewer/index.tsx b/apps/web/components/public/lesson-viewer/index.tsx index 03973794b..af1e76480 100644 --- a/apps/web/components/public/lesson-viewer/index.tsx +++ b/apps/web/components/public/lesson-viewer/index.tsx @@ -19,12 +19,12 @@ import { NOT_ENROLLED_HEADER, } from "@/ui-config/strings"; import { - TextRenderer, Link, Button2, Skeleton, useToast, } from "@courselit/components-library"; +import { TextRenderer } from "@courselit/page-blocks"; import { Constants, type Address, @@ -38,6 +38,7 @@ import { isEnrolled } from "../../../ui-lib/utils"; import LessonEmbedViewer from "./embed-viewer"; import QuizViewer from "./quiz-viewer"; import { getUserProfile } from "@/app/(with-contexts)/helpers"; +import WidgetErrorBoundary from "../base-layout/template/widget-error-boundary"; interface CaptionProps { text: string; @@ -299,14 +300,16 @@ export const LessonViewer = ({ {String.prototype.toUpperCase.call(LESSON_TYPE_TEXT) === lesson.type && lesson.content && ( - - } - /> + + + } + /> + )} {String.prototype.toUpperCase.call( LESSON_TYPE_EMBED, diff --git a/apps/web/components/table-of-content.tsx b/apps/web/components/table-of-content.tsx new file mode 100644 index 000000000..2ab56dd82 --- /dev/null +++ b/apps/web/components/table-of-content.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import { extractHeadings } from "@courselit/text-editor"; +import { Header2, Link } from "@courselit/page-primitives"; +import type { ThemeStyle } from "@courselit/page-models"; + +interface TableOfContentProps { + json: Record; + contentTableHeader?: string; + theme?: ThemeStyle; +} + +export function TableOfContent({ + json, + contentTableHeader = "Table of Contents", + theme, +}: TableOfContentProps) { + let headings: { text: string; id: string }[] = []; + + try { + headings = json ? extractHeadings(json as any) : []; + } catch (err) { + // eslint-disable-next-line no-console + console.error("Error extracting headings", err); + } + + if (headings.length === 0) { + return null; + } + + return ( +

+ ); +} diff --git a/apps/web/graphql/pages/logic.ts b/apps/web/graphql/pages/logic.ts index fe80764bc..b58ed1a22 100644 --- a/apps/web/graphql/pages/logic.ts +++ b/apps/web/graphql/pages/logic.ts @@ -472,3 +472,44 @@ export const deletePageInternal = async (ctx: GQLContext, id: string) => { pageId: id, }); }; + +export const deleteBlock = async ({ + context: ctx, + pageId, + blockId, +}: { + context: GQLContext; + pageId: string; + blockId: string; +}) => { + checkIfAuthenticated(ctx); + if (!checkPermission(ctx.user.permissions, [permissions.manageSite])) { + throw new Error(responses.action_not_allowed); + } + const page: Page | null = await PageModel.findOne({ + pageId, + domain: ctx.subdomain._id, + }); + + if (!page) { + return null; + } + + const block = page.draftLayout.find( + (block: any) => block.widgetId === blockId, + ); + if (!block) { + return null; + } + + const deletedMediaIds = extractMediaIDs(JSON.stringify(block)); + for (const mediaId of Array.from(deletedMediaIds)) { + await deleteMedia(mediaId); + } + + page.draftLayout = page.draftLayout.filter( + (block: any) => block.widgetId !== blockId, + ); + await (page as any).save(); + return getPageResponse(page!, ctx); +}; diff --git a/apps/web/graphql/pages/mutation.ts b/apps/web/graphql/pages/mutation.ts index 1871aa103..2d698ba45 100644 --- a/apps/web/graphql/pages/mutation.ts +++ b/apps/web/graphql/pages/mutation.ts @@ -1,6 +1,12 @@ import { GraphQLBoolean, GraphQLNonNull, GraphQLString } from "graphql"; import GQLContext from "../../models/GQLContext"; -import { updatePage, createPage, deletePage, publish } from "./logic"; +import { + updatePage, + createPage, + deletePage, + publish, + deleteBlock, +} from "./logic"; import types from "./types"; import constants from "../../config/constants"; const { defaultPages } = constants; @@ -89,6 +95,18 @@ const mutations = { context: GQLContext, ) => deletePage(context, id), }, + deleteBlock: { + type: types.page, + args: { + pageId: { type: new GraphQLNonNull(GraphQLString) }, + blockId: { type: new GraphQLNonNull(GraphQLString) }, + }, + resolve: async ( + _: any, + { pageId, blockId }: { pageId: string; blockId: string }, + context: GQLContext, + ) => deleteBlock({ context, pageId, blockId }), + }, }; export default mutations; diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts index 9edff1c7c..c4b7818fb 100644 --- a/apps/web/next-env.d.ts +++ b/apps/web/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/web/package.json b/apps/web/package.json index ff42f96a5..2d696e448 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,6 +13,7 @@ "@courselit/common-models": "workspace:^", "@courselit/components-library": "workspace:^", "@courselit/email-editor": "workspace:^", + "@courselit/text-editor": "workspace:^", "@courselit/icons": "workspace:^", "@courselit/page-blocks": "workspace:^", "@courselit/page-models": "workspace:^", @@ -109,4 +110,4 @@ "@types/react": "19.2.4" } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index f76727a8d..c14d9ae40 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "test:watch": "NODE_OPTIONS='--experimental-vm-modules' SUPPRESS_JEST_WARNINGS=1 jest --watch", "test:coverage": "NODE_OPTIONS='--experimental-vm-modules' SUPPRESS_JEST_WARNINGS=1 jest --coverage" }, - "packageManager": "pnpm@10.17.0+sha512.fce8a3dd29a4ed2ec566fb53efbb04d8c44a0f05bc6f24a73046910fb9c3ce7afa35a0980500668fa3573345bd644644fa98338fa168235c80f4aa17aa17fbef", + "packageManager": "pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c", "devDependencies": { "@changesets/cli": "^2.29.7", "@testing-library/dom": "^10.4.0", diff --git a/packages/components-library/src/index.ts b/packages/components-library/src/index.ts index 6b1dd53b6..0a4ded271 100644 --- a/packages/components-library/src/index.ts +++ b/packages/components-library/src/index.ts @@ -7,8 +7,6 @@ import Section from "./section"; import CourseItem from "./course-item"; import Link from "./link"; import MediaSelector from "./media-selector"; -import TextEditor, { emptyDoc as TextEditorEmptyDoc } from "./text-editor"; -import TextRenderer from "./text-renderer"; import LessonIcon from "./lesson-icon"; import ColorSelector from "./color-selector"; import Button from "./button"; @@ -71,9 +69,6 @@ export { Select, Link, MediaSelector, - TextEditor, - TextEditorEmptyDoc, - TextRenderer, LessonIcon, ColorSelector, Button, diff --git a/packages/components-library/src/styles.css b/packages/components-library/src/styles.css index 766ccd5fc..32d5e1015 100644 --- a/packages/components-library/src/styles.css +++ b/packages/components-library/src/styles.css @@ -2,179 +2,6 @@ @tailwind components; @tailwind utilities; -.text-editor { - .remirror-theme { - /* Base paragraph spacing for consistent rhythm */ - :is(p) { - @apply leading-relaxed mb-6 text-base; - line-height: 1.7; - } - - /* Consistent heading spacing with proper hierarchy */ - *:not(:first-child) ~ :is(h1, h2, h3, h4, h5, h6) { - @apply mt-16 mb-6; - } - - :is(h1) { - @apply text-4xl font-bold mb-8 mt-16; - color: inherit; - line-height: 1.2; - } - - :is(h2) { - @apply text-3xl font-bold mb-6 mt-12; - color: inherit; - line-height: 1.3; - } - - :is(h3) { - @apply text-2xl font-semibold mb-5 mt-10; - color: inherit; - line-height: 1.4; - } - - :is(h4) { - @apply text-xl font-semibold mb-4 mt-8; - color: inherit; - line-height: 1.4; - } - - :is(h5) { - @apply text-lg font-semibold mb-4 mt-6; - color: inherit; - line-height: 1.5; - } - - :is(h6) { - @apply text-base font-semibold mb-3 mt-5; - color: inherit; - line-height: 1.5; - } - - /* List spacing for better readability */ - :is(ul, ol) { - @apply mb-6 mt-2; - - :is(p) { - @apply !mb-0; - } - - :is(li) { - @apply mb-3 leading-relaxed; - line-height: 1.6; - } - } - - :is(ul) { - @apply list-disc ml-6; - } - - :is(ol) { - @apply list-decimal ml-6; - } - - /* Remove margin from last paragraph in divs */ - :is(div) > p:last-of-type { - @apply mb-0; - } - - /* Code block styling */ - :is(pre) { - @apply mb-6 mt-4 p-4 bg-accent rounded-lg; - - :is(code) { - @apply !bg-transparent !px-0 !py-0 !rounded-none !border-none !text-base; - } - } - - /* Blockquote with better spacing */ - :is(blockquote) { - @apply italic border-l-4 border-border text-muted-foreground pl-6 py-2 mb-6 mt-4; - line-height: 1.6; - - :is(p) { - @apply !mb-0; - } - } - - /* Inline code styling */ - :is(code) { - @apply bg-muted px-2 py-1 rounded border border-border text-sm; - } - - /* Image spacing for better visual flow */ - :is(img) { - @apply !w-full !h-auto mb-8 mt-6; - } - - /* Link styling */ - :is(a) { - @apply underline decoration-2 underline-offset-2 transition-all duration-200 hover:decoration-dotted; - } - - /* Better spacing for content sections */ - :is(div) { - @apply mb-6; - } - - /* Table spacing */ - :is(table) { - @apply mb-6 mt-4 w-full; - } - - :is(th, td) { - @apply p-3 border border-border; - } - - /* Horizontal rule spacing */ - :is(hr) { - @apply my-8 border-border; - } - - .MuiStack-root { - @apply bg-background flex justify-center; - - .MuiBox-root { - @apply bg-transparent; - - :is(button) { - @apply border border-border hover:cursor-pointer; - - :is(svg) { - fill: hsl(var(--foreground)); - } - } - } - } - - .ProseMirror { - @apply border border-border outline-none overflow-y-auto; - } - - .ProseMirror-gapcursor:after { - border-top-color: hsl(var(--foreground)); - } - } -} - -.MuiPopper-root { - .MuiStack-root { - @apply bg-background; - - .MuiBox-root { - @apply bg-transparent; - - :is(button) { - @apply border border-border hover:cursor-pointer; - - :is(svg) { - fill: hsl(var(--foreground)); - } - } - } - } -} - @layer base { :root { --background: 0 0% 100%; diff --git a/packages/components-library/src/text-editor.tsx b/packages/components-library/src/text-editor.tsx deleted file mode 100644 index 2c06394c0..000000000 --- a/packages/components-library/src/text-editor.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from "react"; -import { WysiwygEditor as TextEditor } from "@courselit/text-editor"; -export { emptyDoc } from "@courselit/text-editor"; - -export interface WysiwygEditorProps { - initialContent?: any; - onChange: (...args: any[]) => void; - showToolbar?: boolean; - editable?: boolean; - refresh?: number; - url: string; - placeholder?: string; -} - -export default function Editor({ - initialContent, - onChange, - showToolbar, - editable, - refresh, - url, - placeholder, -}: WysiwygEditorProps) { - return ( -
- -
- ); -} diff --git a/packages/components-library/src/text-renderer.tsx b/packages/components-library/src/text-renderer.tsx deleted file mode 100644 index 75c55d28c..000000000 --- a/packages/components-library/src/text-renderer.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from "react"; -import { Renderer, extractHeadings } from "@courselit/text-editor"; - -interface RendererProps { - json: Record; - showTableOfContent?: boolean; - contentTableHeader?: string; -} - -export default function TextRenderer({ - json, - showTableOfContent = false, - contentTableHeader = "Table of Contents", -}: RendererProps) { - let headings; - - try { - headings = json && extractHeadings(json as any); - } catch (err) { - console.error("Error extracting headings", err); // eslint-disable-line no-console - } - - return ( - - {showTableOfContent && headings.length > 0 && ( - - )} - - - - - ); -} diff --git a/packages/page-blocks/package.json b/packages/page-blocks/package.json index a34e87883..cc6aa2ed5 100644 --- a/packages/page-blocks/package.json +++ b/packages/page-blocks/package.json @@ -60,6 +60,9 @@ "dependencies": { "@courselit/common-models": "workspace:^", "@courselit/components-library": "workspace:^", + "@courselit/text-editor": "workspace:^", + "@tiptap/core": "^3.0.0", + "@tiptap/static-renderer": "^3.10.7", "@courselit/icons": "workspace:^", "@courselit/page-models": "workspace:^", "@courselit/page-primitives": "workspace:^", diff --git a/packages/page-blocks/src/blocks/banner/admin-widget/custom-settings.tsx b/packages/page-blocks/src/blocks/banner/admin-widget/custom-settings.tsx index ec9b070fa..6593a51a0 100644 --- a/packages/page-blocks/src/blocks/banner/admin-widget/custom-settings.tsx +++ b/packages/page-blocks/src/blocks/banner/admin-widget/custom-settings.tsx @@ -2,7 +2,6 @@ import * as React from "react"; import { useState, useEffect } from "react"; import Settings from "../settings"; import { - TextEditor, Select, AdminWidgetPanel, AdminWidgetPanelContainer, @@ -20,6 +19,8 @@ import { } from "@courselit/common-models"; import { DEFAULT_FAILURE_MESSAGE, DEFAULT_SUCCESS_MESSAGE } from "../constants"; import { ThemeStyle } from "@courselit/page-models"; +import { Editor } from "@courselit/text-editor"; +import { TextEditorContent } from "@courselit/common-models"; interface CustomSettingsProps { name: string; @@ -133,7 +134,7 @@ export default function CustomSettings({ />

Custom description

- setDescription(state)} showToolbar={false} @@ -162,8 +163,10 @@ export default function CustomSettings({

Success message

- setSuccessMessage(state) } diff --git a/packages/page-blocks/src/blocks/banner/widget.tsx b/packages/page-blocks/src/blocks/banner/widget.tsx index 84b512ef6..a212a1522 100644 --- a/packages/page-blocks/src/blocks/banner/widget.tsx +++ b/packages/page-blocks/src/blocks/banner/widget.tsx @@ -2,11 +2,11 @@ import { FormEvent, useState } from "react"; import { Constants, Media, WidgetProps } from "@courselit/common-models"; import { Image, - TextRenderer, Link, useToast, getSymbolFromCurrency, } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { FetchBuilder, getPlanPrice } from "@courselit/utils"; import { DEFAULT_FAILURE_MESSAGE, DEFAULT_SUCCESS_MESSAGE } from "./constants"; import Settings from "./settings"; @@ -244,7 +244,10 @@ export default function Widget({ theme={overiddenTheme} component="span" > - +
)} @@ -259,6 +262,7 @@ export default function Widget({ successMessage || defaultSuccessMessage } + theme={overiddenTheme} /> )} diff --git a/packages/page-blocks/src/blocks/content/admin-widget.tsx b/packages/page-blocks/src/blocks/content/admin-widget.tsx index 164938a15..e9b9e6a15 100644 --- a/packages/page-blocks/src/blocks/content/admin-widget.tsx +++ b/packages/page-blocks/src/blocks/content/admin-widget.tsx @@ -6,7 +6,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, Form, FormField, CssIdField, @@ -14,6 +13,7 @@ import { VerticalPaddingSelector, } from "@courselit/components-library"; import { Theme, ThemeStyle } from "@courselit/page-models"; +import { Editor } from "@courselit/text-editor"; interface AdminWidgetProps { settings: Settings; @@ -66,7 +66,7 @@ export default function AdminWidget({

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/content/widget.tsx b/packages/page-blocks/src/blocks/content/widget.tsx index 03224bb98..354d07f9e 100644 --- a/packages/page-blocks/src/blocks/content/widget.tsx +++ b/packages/page-blocks/src/blocks/content/widget.tsx @@ -12,7 +12,6 @@ import { FetchBuilder } from "@courselit/utils"; import { Link, LessonIcon, - TextRenderer, Skeleton, useToast, Badge, @@ -21,6 +20,7 @@ import { AccordionTrigger, AccordionContent, } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { Header1, Text1, @@ -162,7 +162,10 @@ export default function Widget({ }`} > - +
)} diff --git a/packages/page-blocks/src/blocks/faq/admin-widget/index.tsx b/packages/page-blocks/src/blocks/faq/admin-widget/index.tsx index c5e69b412..826227b08 100644 --- a/packages/page-blocks/src/blocks/faq/admin-widget/index.tsx +++ b/packages/page-blocks/src/blocks/faq/admin-widget/index.tsx @@ -7,7 +7,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, Button, Form, FormField, @@ -19,6 +18,7 @@ import { } from "@courselit/components-library"; import { Edit } from "@courselit/icons"; import { generateUniqueId } from "@courselit/utils"; +import { Editor } from "@courselit/text-editor"; export interface AdminWidgetProps { settings: Settings; @@ -179,7 +179,7 @@ export default function AdminWidget({ />

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/faq/admin-widget/item-editor.tsx b/packages/page-blocks/src/blocks/faq/admin-widget/item-editor.tsx index 718bf4a14..e00850d71 100644 --- a/packages/page-blocks/src/blocks/faq/admin-widget/item-editor.tsx +++ b/packages/page-blocks/src/blocks/faq/admin-widget/item-editor.tsx @@ -1,7 +1,6 @@ import { useState } from "react"; import { Item } from "../settings"; import { - TextEditor, Button, Form, FormField, @@ -11,6 +10,7 @@ import { } from "@courselit/components-library"; import { Address, Auth, Profile } from "@courselit/common-models"; import { AlertCircle } from "lucide-react"; +import { Editor } from "@courselit/text-editor"; interface ItemProps { item: Item; @@ -54,7 +54,7 @@ export default function ItemEditor({ />

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/faq/widget.tsx b/packages/page-blocks/src/blocks/faq/widget.tsx index 50342a98f..7489fd19f 100644 --- a/packages/page-blocks/src/blocks/faq/widget.tsx +++ b/packages/page-blocks/src/blocks/faq/widget.tsx @@ -2,12 +2,12 @@ import React from "react"; import { WidgetProps } from "@courselit/common-models"; import Settings, { Item } from "./settings"; import { - TextRenderer, Accordion, AccordionItem, AccordionTrigger, AccordionContent, } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { Header1, Section, @@ -68,7 +68,10 @@ export default function Widget({ }`} > - +
)} @@ -101,7 +104,10 @@ export default function Widget({ - + ))} diff --git a/packages/page-blocks/src/blocks/featured/admin-widget.tsx b/packages/page-blocks/src/blocks/featured/admin-widget.tsx index 0e6e6bd41..eb922bddb 100644 --- a/packages/page-blocks/src/blocks/featured/admin-widget.tsx +++ b/packages/page-blocks/src/blocks/featured/admin-widget.tsx @@ -6,7 +6,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, IconButton, Form, FormField, @@ -17,6 +16,7 @@ import { } from "@courselit/components-library"; import { Delete } from "@courselit/icons"; import { Alignment, Address } from "@courselit/common-models"; +import { Editor } from "@courselit/text-editor"; interface AdminWidgetProps { settings: Settings; @@ -145,7 +145,7 @@ export default function AdminWidget({

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/featured/widget.tsx b/packages/page-blocks/src/blocks/featured/widget.tsx index f003b234e..b1fc86680 100644 --- a/packages/page-blocks/src/blocks/featured/widget.tsx +++ b/packages/page-blocks/src/blocks/featured/widget.tsx @@ -1,10 +1,10 @@ import React, { useEffect, useState } from "react"; import { Course, SiteInfo, WidgetProps } from "@courselit/common-models"; import { - TextRenderer, SkeletonCard, getSymbolFromCurrency, } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { FetchBuilder, getPlanPrice } from "@courselit/utils"; import Settings from "./settings"; import { Header1, Subheader1, Section } from "@courselit/page-primitives"; @@ -110,7 +110,10 @@ export default function Widget({ {description && ( - + )}
diff --git a/packages/page-blocks/src/blocks/grid/admin-widget/index.tsx b/packages/page-blocks/src/blocks/grid/admin-widget/index.tsx index f980605b0..37d4fc20b 100644 --- a/packages/page-blocks/src/blocks/grid/admin-widget/index.tsx +++ b/packages/page-blocks/src/blocks/grid/admin-widget/index.tsx @@ -6,7 +6,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, Button, Form, FormField, @@ -22,6 +21,7 @@ import { columns as defaultColumns } from "../defaults"; import { Theme, ThemeStyle } from "@courselit/page-models"; import { PencilIcon, WandSparkles, HelpCircle } from "lucide-react"; import SvgStyleEditor from "./svg-style-editor"; +import { Editor } from "@courselit/text-editor"; export interface AdminWidgetProps { settings: Settings; @@ -220,7 +220,7 @@ export default function AdminWidget({

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/grid/admin-widget/item-editor.tsx b/packages/page-blocks/src/blocks/grid/admin-widget/item-editor.tsx index 2d3b4917b..e57ef97ac 100644 --- a/packages/page-blocks/src/blocks/grid/admin-widget/item-editor.tsx +++ b/packages/page-blocks/src/blocks/grid/admin-widget/item-editor.tsx @@ -2,7 +2,6 @@ import React, { useState } from "react"; import { Item, SvgStyle } from "../settings"; import { MediaSelector, - TextEditor, Button, Form, FormField, @@ -16,6 +15,8 @@ import { VerticalAlignment, } from "@courselit/common-models"; import SvgEditor from "./svg-editor"; +import { Editor } from "@courselit/text-editor"; + interface ItemProps { item: Item; svgStyle: SvgStyle; @@ -65,7 +66,7 @@ export default function ItemEditor({ />

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/grid/widget/index.tsx b/packages/page-blocks/src/blocks/grid/widget/index.tsx index 605ccbeb8..f1f3c0137 100644 --- a/packages/page-blocks/src/blocks/grid/widget/index.tsx +++ b/packages/page-blocks/src/blocks/grid/widget/index.tsx @@ -1,7 +1,8 @@ import React from "react"; import { WidgetProps } from "@courselit/common-models"; import Settings from "../settings"; -import { TextRenderer, Link } from "@courselit/components-library"; +import { Link } from "@courselit/components-library"; +import { TextRenderer } from "../../../components"; import Itemm from "./item"; import { columns as defaultColumns } from "../defaults"; import { @@ -63,7 +64,10 @@ export default function Widget({ }`} > - +
)} diff --git a/packages/page-blocks/src/blocks/grid/widget/item.tsx b/packages/page-blocks/src/blocks/grid/widget/item.tsx index 5940d8543..c1704e550 100644 --- a/packages/page-blocks/src/blocks/grid/widget/item.tsx +++ b/packages/page-blocks/src/blocks/grid/widget/item.tsx @@ -1,6 +1,7 @@ import React from "react"; import { Item, SvgStyle } from "../settings"; -import { TextRenderer, Link } from "@courselit/components-library"; +import { Link } from "@courselit/components-library"; +import { TextRenderer } from "../../../components"; import { Alignment } from "@courselit/common-models"; import { ThemeStyle } from "@courselit/page-models"; import { @@ -101,7 +102,10 @@ export default function Itemm({ }`} > - +
)} diff --git a/packages/page-blocks/src/blocks/hero/admin-widget.tsx b/packages/page-blocks/src/blocks/hero/admin-widget.tsx index f4c6b400a..5a24cd156 100644 --- a/packages/page-blocks/src/blocks/hero/admin-widget.tsx +++ b/packages/page-blocks/src/blocks/hero/admin-widget.tsx @@ -12,7 +12,6 @@ import { AdminWidgetPanelContainer, MediaSelector, Select, - TextEditor, Form, FormField, Accordion, @@ -29,8 +28,8 @@ import { MaxWidthSelector, SectionBackgroundPanel, } from "@courselit/components-library"; - import { isVideo } from "@courselit/utils"; +import { Editor } from "@courselit/text-editor"; interface AdminWidgetProps { name: string; @@ -181,7 +180,7 @@ export default function AdminWidget({

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/hero/widget.tsx b/packages/page-blocks/src/blocks/hero/widget.tsx index 10ec6e784..028b90096 100644 --- a/packages/page-blocks/src/blocks/hero/widget.tsx +++ b/packages/page-blocks/src/blocks/hero/widget.tsx @@ -1,12 +1,8 @@ import React from "react"; import { WidgetProps } from "@courselit/common-models"; import Settings from "./settings"; -import { - Image, - TextRenderer, - VideoWithPreview, - Link, -} from "@courselit/components-library"; +import { Image, VideoWithPreview, Link } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { isVideo } from "@courselit/utils"; import clsx from "clsx"; import { @@ -168,7 +164,10 @@ export default function Widget({ )} > - +
)} diff --git a/packages/page-blocks/src/blocks/pricing/admin-widget/index.tsx b/packages/page-blocks/src/blocks/pricing/admin-widget/index.tsx index ef097d2ad..a19ed4456 100644 --- a/packages/page-blocks/src/blocks/pricing/admin-widget/index.tsx +++ b/packages/page-blocks/src/blocks/pricing/admin-widget/index.tsx @@ -6,7 +6,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, Form, FormField, CssIdField, @@ -20,6 +19,7 @@ import { columns as defaultColumns } from "../defaults"; import { PageBuilderSlider } from "@courselit/components-library"; import { Theme, ThemeStyle } from "@courselit/page-models"; import { PencilIcon } from "lucide-react"; +import { Editor } from "@courselit/text-editor"; export interface AdminWidgetProps { settings: Settings; @@ -200,7 +200,7 @@ export default function AdminWidget({ />

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/pricing/admin-widget/item-editor.tsx b/packages/page-blocks/src/blocks/pricing/admin-widget/item-editor.tsx index 23bc3e0e3..2eb34e06c 100644 --- a/packages/page-blocks/src/blocks/pricing/admin-widget/item-editor.tsx +++ b/packages/page-blocks/src/blocks/pricing/admin-widget/item-editor.tsx @@ -1,7 +1,6 @@ import { useState } from "react"; import { Item } from "../settings"; import { - TextEditor, Button, Form, FormField, @@ -9,6 +8,7 @@ import { } from "@courselit/components-library"; import { Address } from "@courselit/common-models"; import { Checkbox } from "@courselit/components-library"; +import { Editor } from "@courselit/text-editor"; interface ItemProps { item: Item; @@ -57,7 +57,7 @@ export default function ItemEditor({ />

Description

- setDescription(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/pricing/widget.tsx b/packages/page-blocks/src/blocks/pricing/widget.tsx index 17ec46016..5da4ec1a2 100644 --- a/packages/page-blocks/src/blocks/pricing/widget.tsx +++ b/packages/page-blocks/src/blocks/pricing/widget.tsx @@ -2,7 +2,8 @@ import React from "react"; import { useState } from "react"; import { WidgetProps } from "@courselit/common-models"; import Settings from "./settings"; -import { Link, TextRenderer } from "@courselit/components-library"; +import { Link } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import { columns as defaultColumns } from "./defaults"; import { Button, @@ -71,7 +72,10 @@ export default function Widget({ }`} > - +
)} @@ -138,6 +142,7 @@ export default function Widget({ >
diff --git a/packages/page-blocks/src/blocks/rich-text/admin-widget.tsx b/packages/page-blocks/src/blocks/rich-text/admin-widget.tsx index ee418cca0..7e840b4e5 100644 --- a/packages/page-blocks/src/blocks/rich-text/admin-widget.tsx +++ b/packages/page-blocks/src/blocks/rich-text/admin-widget.tsx @@ -3,8 +3,6 @@ import { AdminWidgetPanel, AdminWidgetPanelContainer, Select, - TextEditor, - // PageBuilderSlider, VerticalPaddingSelector, MaxWidthSelector, } from "@courselit/components-library"; @@ -13,6 +11,7 @@ import { Address, HorizontalAlignment } from "@courselit/common-models"; import { fontSize as defaultFontSize } from "./defaults"; import { CssIdField } from "@courselit/components-library"; import type { Theme, ThemeStyle } from "@courselit/page-models"; +import { Editor } from "@courselit/text-editor"; export interface AboutWidgetProps { onChange: (...args: any[]) => void; @@ -75,7 +74,7 @@ const AdminWidget = ({

Text

- setContent(state)} showToolbar={false} diff --git a/packages/page-blocks/src/blocks/rich-text/widget.tsx b/packages/page-blocks/src/blocks/rich-text/widget.tsx index 48d31e3ee..161cb05d7 100644 --- a/packages/page-blocks/src/blocks/rich-text/widget.tsx +++ b/packages/page-blocks/src/blocks/rich-text/widget.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { TextRenderer } from "@courselit/components-library"; +import { TextRenderer } from "../../components"; import type { WidgetProps } from "@courselit/common-models"; import Settings from "./settings"; import { fontSize as defaultFontSize } from "./defaults"; @@ -54,7 +54,7 @@ const Widget = ({ className={`${twFontSize[fontSize]}`} component="span" > - + ); diff --git a/packages/page-blocks/src/components/index.ts b/packages/page-blocks/src/components/index.ts index 382cf2edd..c19b693e2 100644 --- a/packages/page-blocks/src/components/index.ts +++ b/packages/page-blocks/src/components/index.ts @@ -1 +1,2 @@ export * from "./product-card"; +export * from "./text-renderer"; diff --git a/packages/page-blocks/src/components/text-renderer.tsx b/packages/page-blocks/src/components/text-renderer.tsx new file mode 100644 index 000000000..1ef9fea2f --- /dev/null +++ b/packages/page-blocks/src/components/text-renderer.tsx @@ -0,0 +1,116 @@ +import React from "react"; +import { renderToReactElement } from "@tiptap/static-renderer"; +import { + extractTextFromNode, + emptyDoc, + createExtensions, + createId, +} from "@courselit/text-editor"; +import type { ThemeStyle } from "@courselit/page-models"; +import { + Header1, + Header2, + Header3, + Link, + Text1, +} from "@courselit/page-primitives"; + +interface TextRendererProps { + json: Record; + className?: string; + theme?: ThemeStyle; +} + +export function TextRenderer({ json, className, theme }: TextRendererProps) { + const extensions = createExtensions(); + const content = (json as any) ?? (emptyDoc as any); + + const rendered = renderToReactElement({ + extensions, + content, + options: { + nodeMapping: { + paragraph: ({ children }) => { + if (theme) { + return ( + + {children} + + ); + } + return

{children}

; + }, + heading: ({ node, children }) => { + const level = node?.attrs?.level ?? 1; + // Extract text from the node structure (same as extractHeadings does) + const textContent = extractTextFromNode(node); + const id = createId(textContent); + + if (!theme) { + const Tag = + `h${level}` as unknown as keyof JSX.IntrinsicElements; + return {children}; + } + + if (level === 1) { + return ( + + {children} + + ); + } + if (level === 2) { + return ( + + {children} + + ); + } + return ( + + {children} + + ); + }, + codeMirror: ({ children }) => ( +
+                        {children}
+                    
+ ), + }, + markMapping: { + link: ({ mark, children, node }) => { + const href = mark?.attrs?.href; + return ( + + + {children} + + + ); + }, + highlight: ({ children }) => ( + + {children} + + ), + }, + }, + }); + + const combinedClassName = ["tiptap-renderer", className] + .filter(Boolean) + .join(" "); + + return ( +
+
{rendered}
+
+ ); +} + +export default TextRenderer; diff --git a/packages/page-blocks/src/styles.css b/packages/page-blocks/src/styles.css index b5c61c956..4bd3bd471 100644 --- a/packages/page-blocks/src/styles.css +++ b/packages/page-blocks/src/styles.css @@ -1,3 +1,120 @@ @tailwind base; @tailwind components; @tailwind utilities; + +.tiptap-renderer { + line-height: 1.7; + color: inherit; +} + +.tiptap-renderer p { + margin: 0.75rem 0; +} + +.tiptap-renderer h1, +.tiptap-renderer h2, +.tiptap-renderer h3, +.tiptap-renderer h4, +.tiptap-renderer h5, +.tiptap-renderer h6 { + /* font-weight: 600; */ + line-height: 1.25; + margin: 1.5rem 0 0.75rem; +} + +/* .tiptap-renderer h1 { + font-size: clamp(2rem, 3vw, 2.5rem); +} + +.tiptap-renderer h2 { + font-size: clamp(1.75rem, 2.5vw, 2rem); +} + +.tiptap-renderer h3 { + font-size: clamp(1.5rem, 2vw, 1.75rem); +} */ + +.tiptap-renderer ul, +.tiptap-renderer ol { + padding-left: 1.5rem; + margin: 0.75rem 0; +} + +.tiptap-renderer ul li { + list-style: disc; +} + +.tiptap-renderer ol li { + list-style: decimal; +} + +.tiptap-renderer blockquote { + border-left: 3px solid hsl(var(--border)); + margin: 0.75rem 0; + padding-left: 1rem; + color: hsl(var(--muted-foreground)); + font-style: italic; +} + +.tiptap-renderer pre { + background-color: hsl(var(--muted)); + border-radius: 0.5rem; + color: hsl(var(--foreground)); + font-family: + ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, + "Liberation Mono", monospace; + font-size: 0.875rem; + margin: 0.75rem 0; + padding: 1rem; + overflow-x: auto; +} + +.tiptap-renderer pre code { + background: none; + color: inherit; + padding: 0; +} + +.tiptap-renderer code { + background-color: hsl(var(--muted)); + border-radius: 0.375rem; + padding: 0.125rem 0.375rem; + font-size: 0.875em; + font-family: + ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, + "Liberation Mono", monospace; +} + +.tiptap-renderer hr { + border: none; + border-top: 1px solid hsl(var(--border)); + margin: 1.5rem 0; +} + +.tiptap-renderer table { + border-collapse: collapse; + border: 1px solid hsl(var(--border)); + margin: 1rem 0; + width: 100%; + table-layout: fixed; +} + +.tiptap-renderer table th, +.tiptap-renderer table td { + border: 1px solid hsl(var(--border)); + padding: 0.5rem; +} + +.tiptap-renderer table th { + background-color: hsl(var(--muted)); + font-weight: 600; + text-align: left; +} + +.tiptap-renderer img { + display: block; + max-width: 100%; + height: auto; + border-radius: 0.5rem; + margin: 1rem auto; +} diff --git a/packages/page-primitives/src/link.tsx b/packages/page-primitives/src/link.tsx index d1702827e..4266f0ce3 100644 --- a/packages/page-primitives/src/link.tsx +++ b/packages/page-primitives/src/link.tsx @@ -23,7 +23,7 @@ export const Link: React.FC = ({ const linkStyles = theme?.interactives?.link; const classes = cn( // Base styles - "font-medium", + "font-medium cursor-pointer", // Theme typography typographyStyles?.fontFamily, typographyStyles?.fontSize, diff --git a/packages/page-primitives/src/section.tsx b/packages/page-primitives/src/section.tsx index a6a70cab0..332440d1d 100644 --- a/packages/page-primitives/src/section.tsx +++ b/packages/page-primitives/src/section.tsx @@ -130,14 +130,6 @@ export const Section: React.FC = ({ theme?.structure?.section?.padding?.y || "py-4", )} > - {" "} - {/** This is used to force re-render the component when the theme changes */} {children}
, diff --git a/packages/text-editor/.eslintrc.js b/packages/text-editor/.eslintrc.cjs similarity index 100% rename from packages/text-editor/.eslintrc.js rename to packages/text-editor/.eslintrc.cjs diff --git a/packages/text-editor/README.md b/packages/text-editor/README.md index ee47cbd1f..861380330 100644 --- a/packages/text-editor/README.md +++ b/packages/text-editor/README.md @@ -1,6 +1,6 @@ # CourseLit's Text Editor -This is a rich text editor, based on [Remirror](https://remirror.io). +This is a rich text editor built on top of [TipTap v3](https://tiptap.dev/). ## Installation @@ -10,7 +10,13 @@ To install this package, use the following command. npm install @courselit/text-editor ``` -> You need to install [remirror](https://www.npmjs.com/package/remirror) package in your application and import Remirror's CSS file in your application using the following command `import 'remirror/styles/all.css'`. +After installing, import the bundled styles once in your app (for example, in your root layout). + +```ts +import "@courselit/text-editor/styles.css"; +``` + +> TipTap relies on ProseMirror. The editor ships with all required extensions, so no additional peer dependencies are needed. ## Shortcut keys @@ -20,9 +26,7 @@ npm install @courselit/text-editor `Ctrl + u`: Underline -`Ctrl + d`: Strikethrough - -`Ctrl + k`: Create/edit a link +`Ctrl + Shift + s`: Strikethrough `Ctrl + z`: Undo @@ -30,12 +34,12 @@ npm install @courselit/text-editor `Ctrl + v`: Paste -`Ctrl + Shift + 8`: Bulleted list +`Ctrl + Shift + 7`: Ordered list -`Ctrl + Shift + 9`: Ordered list +`Ctrl + Shift + 8`: Bulleted list -`Ctrl + Shift + 7`: Tasked list +`Ctrl + Shift + H`: Highlight (or type `==two equal signs==` and it will be converted to highlight) ## Images -Simply drag and drop images in the editor window to put it as a `data:` embed in your content. +Use the _Image_ button in the toolbar to upload assets to CourseLit. Uploads are limited to `2 Mega bytes` per file. diff --git a/packages/text-editor/additional.d.ts b/packages/text-editor/additional.d.ts new file mode 100644 index 000000000..03ee8baef --- /dev/null +++ b/packages/text-editor/additional.d.ts @@ -0,0 +1 @@ +declare module "@tiptap/react/menus"; diff --git a/packages/text-editor/package.json b/packages/text-editor/package.json index 03aef8162..a6d7f40fa 100644 --- a/packages/text-editor/package.json +++ b/packages/text-editor/package.json @@ -1,7 +1,7 @@ { "name": "@courselit/text-editor", "version": "0.34.10", - "description": "A text editor based on Remirror", + "description": "A text editor based on TipTap", "private": true, "keywords": [ "text editor", @@ -13,12 +13,21 @@ "license": "MIT", "main": "dist/index.js", "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.js" + }, + "./styles.css": "./styles.css" + }, "directories": { "lib": "src", "test": "__tests__" }, "files": [ - "dist" + "dist", + "styles.css" ], "publishConfig": { "access": "public" @@ -40,23 +49,26 @@ "react": "^17.0.2" }, "dependencies": { - "@codemirror/language-data": "^6.5.1", - "@codemirror/state": "^6.5.2", - "@codemirror/theme-one-dark": "^6.1.2", "@courselit/common-models": "workspace:^", "@courselit/utils": "workspace:^", - "@remirror/core": "^3.0.2", - "@remirror/core-types": "^3.0.0", - "@remirror/extension-codemirror6": "^2.0.2", - "@remirror/extension-react-tables": "^3.0.3", - "@remirror/i18n": "^3.0.0", - "@remirror/pm": "^3.0.1", - "@remirror/react": "^3.0.3", - "@remirror/react-editors": "^2.0.3", - "@remirror/react-ui": "^1.0.3", - "codemirror": "^6.0.2", - "prosemirror-model": "^1.25.3", - "remirror": "^3.0.3" + "@floating-ui/dom": "^1.6.0", + "@tiptap/core": "^3.0.0", + "@tiptap/extension-bubble-menu": "^3.10.4", + "@tiptap/extension-code-block-lowlight": "^3.0.0", + "@tiptap/extension-dropcursor": "^3.0.0", + "@tiptap/extension-gapcursor": "^3.0.0", + "@tiptap/extension-heading": "^3.0.0", + "@tiptap/extension-highlight": "^3.11.0", + "@tiptap/extension-image": "^3.0.0", + "@tiptap/extension-link": "^3.0.0", + "@tiptap/extension-placeholder": "^3.0.0", + "@tiptap/extension-table": "^3.10.7", + "@tiptap/react": "^3.0.0", + "@tiptap/starter-kit": "^3.0.0", + "@tiptap/static-renderer": "^3.10.7", + "highlight.js": "^11.10.0", + "lowlight": "^2.9.0", + "lucide-react": "^0.544.0" }, "devDependencies": { "@types/node": "^18.8.0", diff --git a/packages/text-editor/src/BubbleMenu.tsx b/packages/text-editor/src/BubbleMenu.tsx deleted file mode 100644 index b21e2368c..000000000 --- a/packages/text-editor/src/BubbleMenu.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { FC } from "react"; -import { FloatingToolbar, FormattingButtonGroup } from "@remirror/react-ui"; -import FloatingLinkCommandGroup from "./FloatingLinkCommandGroup"; - -/** - * Bubble menu for the pre-packaged editors - */ -const BubbleMenu: FC = () => { - return ( - - - - - ); -}; - -export default BubbleMenu; diff --git a/packages/text-editor/src/FloatingLinkCommandGroup.tsx b/packages/text-editor/src/FloatingLinkCommandGroup.tsx deleted file mode 100644 index 0881eda30..000000000 --- a/packages/text-editor/src/FloatingLinkCommandGroup.tsx +++ /dev/null @@ -1,244 +0,0 @@ -import type { ChangeEvent, HTMLProps, KeyboardEvent } from "react"; -import React, { - useCallback, - useEffect, - useLayoutEffect, - useMemo, - useRef, - useState, -} from "react"; -import type { AnyExtensionConstructor } from "@remirror/core"; -import { - createMarkPositioner, - LinkExtension, - ShortcutHandlerProps, -} from "remirror/extensions"; -import { - FloatingWrapper, - useActive, - useAttrs, - useChainedCommands, - useCurrentSelection, - useExtensionEvent, - useUpdateReason, -} from "@remirror/react"; -import { CommandButton, CommandButtonGroup } from "@remirror/react-ui"; - -function useLinkShortcut() { - const [linkShortcut, setLinkShortcut] = useState< - ShortcutHandlerProps | undefined - >(); - const [isEditing, setIsEditing] = useState(false); - - useExtensionEvent( - LinkExtension as unknown as AnyExtensionConstructor, - "onShortcut", - useCallback( - (props) => { - if (!isEditing) { - setIsEditing(true); - } - - return setLinkShortcut(props); - }, - [isEditing], - ), - ); - - return { linkShortcut, isEditing, setIsEditing }; -} - -function useFloatingLinkState() { - // @ts-ignore - const chain = useChainedCommands(); - const { isEditing, linkShortcut, setIsEditing } = useLinkShortcut(); - const { to, empty } = useCurrentSelection(); - - const url = (useAttrs().link()?.href as string) ?? ""; - const [href, setHref] = useState(url); - - // A positioner which only shows for links. - const linkPositioner = useMemo( - () => createMarkPositioner({ type: "link" }), - [], - ); - - const onRemove = useCallback(() => { - return chain.removeLink().focus().run(); - }, [chain]); - - const updateReason = useUpdateReason(); - - useLayoutEffect(() => { - if (!isEditing) { - return; - } - - if (updateReason.doc || updateReason.selection) { - setIsEditing(false); - } - }, [isEditing, setIsEditing, updateReason.doc, updateReason.selection]); - - useEffect(() => { - setHref(url); - }, [url]); - - const submitHref = useCallback(() => { - setIsEditing(false); - const range = linkShortcut ?? undefined; - - if (href === "") { - chain.removeLink(); - } else { - chain.updateLink({ href, auto: false }, range); - } - - chain.focus(range?.to ?? to).run(); - }, [setIsEditing, linkShortcut, chain, href, to]); - - const cancelHref = useCallback(() => { - setIsEditing(false); - }, [setIsEditing]); - - const clickEdit = useCallback(() => { - if (empty) { - chain.selectLink(); - } - - setIsEditing(true); - }, [chain, empty, setIsEditing]); - - return useMemo( - () => ({ - href, - setHref, - linkShortcut, - linkPositioner, - isEditing, - clickEdit, - onRemove, - submitHref, - cancelHref, - }), - [ - href, - linkShortcut, - linkPositioner, - isEditing, - clickEdit, - onRemove, - submitHref, - cancelHref, - ], - ); -} - -const DelayAutoFocusInput = ({ - autoFocus, - ...rest -}: HTMLProps) => { - const inputRef = useRef(null); - - useEffect(() => { - if (!autoFocus) { - return; - } - - const frame = window.requestAnimationFrame(() => { - inputRef.current?.focus(); - }); - - return () => { - window.cancelAnimationFrame(frame); - }; - }, [autoFocus]); - - return ; -}; - -const FloatingLinkToolbar = () => { - const { - isEditing, - clickEdit, - onRemove, - submitHref, - href, - setHref, - cancelHref, - } = useFloatingLinkState(); - const active = useActive(); - const activeLink = active.link(); - const { empty } = useCurrentSelection(); - - const handleClickEdit = useCallback(() => { - clickEdit(); - }, [clickEdit]); - const label = "Link"; - - const linkEditButtons = activeLink ? ( - <> - - - - ) : ( - - ); - - return ( - <> - {!isEditing && ( - {linkEditButtons} - )} - {!isEditing && empty && ( - {linkEditButtons} - )} - - - ) => - setHref(event.target.value) - } - value={href} - onKeyPress={(event: KeyboardEvent) => { - const { code } = event; - - if (code === "Enter") { - submitHref(); - } - - if (code === "Escape") { - cancelHref(); - } - }} - /> - - - ); -}; - -export default FloatingLinkToolbar; diff --git a/packages/text-editor/src/Renderer/code-mirror-renderer.tsx b/packages/text-editor/src/Renderer/code-mirror-renderer.tsx deleted file mode 100644 index 993c00415..000000000 --- a/packages/text-editor/src/Renderer/code-mirror-renderer.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { MarkMap, TextHandler } from "@remirror/react"; -import React, { FC } from "react"; -import { RemirrorJSON } from "remirror"; - -export const CodeMirrorRenderer: FC<{ - node: RemirrorJSON; - markMap: MarkMap; -}> = (props) => { - const content = props.node.content; - if (!content) { - return null; - } - - const children = content.map((node, ii) => { - return ; - }); - - return ( -
-            {children}
-        
- ); -}; diff --git a/packages/text-editor/src/Renderer/index.tsx b/packages/text-editor/src/Renderer/index.tsx deleted file mode 100644 index 2e9ad93c8..000000000 --- a/packages/text-editor/src/Renderer/index.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from "react"; -import { - Callout, - CodeBlock, - createIFrameHandler, - createLinkHandler, - Doc, - MarkMap, - RemirrorRenderer, - TextHandler, - ThemeProvider, -} from "@remirror/react"; -import { RemirrorJSON } from "@remirror/core-types"; -import { CodeMirrorRenderer } from "./code-mirror-renderer"; -import { createId } from "../create-id"; - -const typeMap: MarkMap = { - blockquote: "blockquote", - bulletList: "ul", - callout: Callout, - codeBlock: CodeBlock, - codeMirror: CodeMirrorRenderer, - doc: Doc, - hardBreak: "br", - horizontalRule: "hr", - iframe: createIFrameHandler(), - image: "img", - listItem: "li", - paragraph: "p", - orderedList: "ol", - text: TextHandler, - taskList: "ul", - taskListItem: "li", - // add links to headings for table of contents navigation - heading: ({ node, children }) => { - if (!node.content) { - return null; - } - - let textContent = ""; - for (const child of node.content) { - textContent += child.text; - } - const id = createId(textContent); - const HeadingTag = - `h${node.attrs.level}` as keyof JSX.IntrinsicElements; - - return {children}; - }, -}; - -const markMap: MarkMap = { - italic: "em", - bold: "strong", - code: "code", - link: createLinkHandler({ target: "_blank", rel: "noopener noreferrer" }), - underline: "u", - strike: "strike", -}; - -interface RendererProps { - json: RemirrorJSON; - fontFamily?: string; -} - -const Renderer = ({ json, fontFamily }: RendererProps): JSX.Element => { - const theme = { - fontFamily: { - default: fontFamily, - }, - }; - - return ( - - - - ); -}; - -export default Renderer; diff --git a/packages/text-editor/src/Toolbar.tsx b/packages/text-editor/src/Toolbar.tsx deleted file mode 100644 index c3dc002c3..000000000 --- a/packages/text-editor/src/Toolbar.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React, { FC } from "react"; -import { - FormattingButtonGroup, - HeadingLevelButtonGroup, - InsertHorizontalRuleButton, - ListButtonGroup, - RedoButton, - Toolbar as RemirrorToolbar, - ToggleBlockquoteButton, - UndoButton, -} from "@remirror/react-ui"; - -const Toolbar: FC = () => { - return ( - - - - - - - - - - - ); -}; - -export default Toolbar; diff --git a/packages/text-editor/src/WysiwygEditor.tsx b/packages/text-editor/src/WysiwygEditor.tsx deleted file mode 100644 index c62f4b813..000000000 --- a/packages/text-editor/src/WysiwygEditor.tsx +++ /dev/null @@ -1,150 +0,0 @@ -"use client"; - -/* eslint-disable react-hooks/rules-of-hooks */ -import React, { useEffect, FC, PropsWithChildren, useCallback } from "react"; -import { - EditorComponent, - Remirror, - ThemeProvider, - useRemirror, -} from "@remirror/react"; -import { TableComponents } from "@remirror/extension-react-tables"; -import { RemirrorContentType } from "@remirror/core-types"; -import { - getTextContentFromSlice, - AnyExtension, - RemirrorEventListenerProps, - Slice, -} from "@remirror/core"; -import { InvalidContentHandler } from "remirror"; -import BubbleMenu from "./BubbleMenu"; -import Toolbar from "./Toolbar"; -import { ReactEditorProps } from "./types"; -import emptyDoc from "./empty-doc"; -import { getExtensions } from "./extensions"; -import { i18nFormat } from "@remirror/i18n"; - -export interface WysiwygEditorProps { - onChange: (json: unknown) => void; - showToolbar?: boolean; - editable?: boolean; - refresh?: number; - fontFamily?: string; - url: string; - initialContent?: ReactEditorProps["initialContent"]; - stringHandler?: ReactEditorProps["stringHandler"]; - placeholder?: string; - autoFocus?: boolean; - hooks?: ReactEditorProps["hooks"]; -} - -interface WysiwygEditorType extends FC> { - getPlainText: (doc: RemirrorContentType) => string; - emptyDoc: RemirrorContentType; -} - -const WysiwygEditor: WysiwygEditorType = Object.assign( - ({ - initialContent, - onChange, - placeholder, - stringHandler, - children, - showToolbar = true, - editable = true, - refresh, - fontFamily, - url, - ...rest - }) => { - const theme = { - fontFamily: { - default: fontFamily, - }, - }; - - if (typeof window === "undefined") { - return <>; - } - - useEffect(() => { - manager.view.updateState( - manager.createState({ - content: initialContent as RemirrorContentType, - }), - ); - }, [refresh]); - - const extensions = useCallback(() => { - const exts = getExtensions(placeholder, url)(); - return exts as unknown as AnyExtension[]; - }, [placeholder, url]); - - const onError: InvalidContentHandler = useCallback( - ({ json, invalidContent, transformers }) => { - // Automatically remove all invalid nodes and marks. - return transformers.remove(json, invalidContent); - }, - [], - ); - - const { - manager, - state, - onChange: onChangeRemirror, - } = useRemirror({ - extensions, - stringHandler, - content: (initialContent as RemirrorContentType) || emptyDoc, - onError, - }); - - const onChangeFunc = ( - data: RemirrorEventListenerProps, - ) => { - setTimeout(() => onChange(data.helpers.getJSON()), 0); - }; - - return ( - - { - onChangeRemirror(data); - onChangeFunc(data); - }} - editable={editable} - i18nFormat={i18nFormat} - {...rest} - > -
- {editable && showToolbar && ( -
- -
- )} - - - - {children} -
-
-
- ); - }, - { - getPlainText: (doc: RemirrorContentType) => - getTextContentFromSlice(doc as unknown as Slice), - emptyDoc, - }, -) as WysiwygEditorType; - -export default WysiwygEditor; diff --git a/packages/text-editor/src/bubble-menu.tsx b/packages/text-editor/src/bubble-menu.tsx new file mode 100644 index 000000000..c65f8721e --- /dev/null +++ b/packages/text-editor/src/bubble-menu.tsx @@ -0,0 +1,196 @@ +import React, { useCallback, useEffect, useRef, useState } from "react"; +import type { Editor } from "@tiptap/core"; +import type { BubbleMenuPluginProps } from "@tiptap/extension-bubble-menu"; +import { BubbleMenuPlugin } from "@tiptap/extension-bubble-menu"; +import { + Bold, + Code, + Italic, + Link as LinkIcon, + Strikethrough, + Underline, +} from "lucide-react"; +import LinkEditorPopover from "./components/link-editor-popover"; + +interface BubbleMenuProps { + editor: Editor; +} + +const buttonBase = + "inline-flex h-8 w-8 items-center justify-center rounded text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary"; + +type TipTapBubbleMenuProps = { + editor: Editor | null; + className?: string; + children: React.ReactNode; + pluginKey?: string; +} & Partial>; + +const TipTapBubbleMenu = ({ + editor, + className, + children, + pluginKey = "inlineBubbleMenu", + updateDelay, + resizeDelay, + shouldShow, + appendTo, + getReferencedVirtualElement, + options, +}: TipTapBubbleMenuProps): JSX.Element => { + const menuRef = useRef(null); + + useEffect(() => { + const element = menuRef.current; + + if (!editor || editor.isDestroyed || !element) { + return; + } + + const plugin = BubbleMenuPlugin({ + editor, + element, + pluginKey, + updateDelay, + resizeDelay, + shouldShow: shouldShow ?? null, + appendTo, + getReferencedVirtualElement, + options, + }); + + editor.registerPlugin(plugin); + + return () => { + editor.unregisterPlugin(pluginKey); + }; + }, [ + editor, + pluginKey, + updateDelay, + resizeDelay, + shouldShow, + appendTo, + getReferencedVirtualElement, + options, + ]); + + return ( +
+ {children} +
+ ); +}; + +function InlineButton({ + icon: Icon, + label, + active, + onClick, +}: { + icon: React.ComponentType<{ className?: string }>; + label: string; + active?: boolean; + onClick: () => void; +}): JSX.Element { + return ( + + ); +} + +const InlineBubbleMenu = ({ editor }: BubbleMenuProps): JSX.Element | null => { + const [isLinkEditing, setIsLinkEditing] = useState(false); + + const openLinkEditor = useCallback(() => { + setIsLinkEditing((prev) => !prev); + }, []); + + useEffect(() => { + const handleSelectionUpdate = () => { + setIsLinkEditing(false); + }; + + editor.on("selectionUpdate", handleSelectionUpdate); + + return () => { + editor.off("selectionUpdate", handleSelectionUpdate); + }; + }, [editor]); + + if (!editor) { + return null; + } + + return ( + +
+ editor.chain().focus().toggleBold().run()} + /> + editor.chain().focus().toggleItalic().run()} + /> + + editor.chain().focus().toggleMark("underline").run() + } + /> + editor.chain().focus().toggleStrike().run()} + /> + editor.chain().focus().toggleCode().run()} + /> + +
+ {isLinkEditing && ( + setIsLinkEditing(false)} + variant="inline" + /> + )} +
+ ); +}; + +export default InlineBubbleMenu; diff --git a/packages/text-editor/src/components/custom-code-mirror.tsx b/packages/text-editor/src/components/custom-code-mirror.tsx new file mode 100644 index 000000000..b9a4fbb35 --- /dev/null +++ b/packages/text-editor/src/components/custom-code-mirror.tsx @@ -0,0 +1,27 @@ +// This is only to maintain backward compatibility for codeMirror node type + +import { Node } from "@tiptap/core"; + +export const CodeMirrorNode = Node.create({ + name: "codeMirror", + content: "block+", + code: true, + + addOptions() { + return { + HTMLAttributes: {}, + }; + }, + + parseHTML() { + return [ + { + tag: "pre", + }, + ]; + }, + + renderHTML({ HTMLAttributes }) { + return ["pre", HTMLAttributes, 0]; + }, +}); diff --git a/packages/text-editor/src/components/link-editor-popover.tsx b/packages/text-editor/src/components/link-editor-popover.tsx new file mode 100644 index 000000000..552e1b747 --- /dev/null +++ b/packages/text-editor/src/components/link-editor-popover.tsx @@ -0,0 +1,170 @@ +"use client"; + +import React, { useEffect, useRef, useState } from "react"; +import type { Editor } from "@tiptap/react"; +import { Check, Trash2, X } from "lucide-react"; + +interface LinkEditorPopoverProps { + editor: Editor; + onClose: () => void; + variant?: "panel" | "inline"; + containerRef?: React.MutableRefObject; +} + +const LinkEditorPopover = ({ + editor, + onClose, + variant = "panel", + containerRef, +}: LinkEditorPopoverProps): JSX.Element => { + const [linkValue, setLinkValue] = useState(""); + const inputRef = useRef(null); + const localContainerRef = useRef(null); + + const assignContainerRef = (node: HTMLDivElement | null) => { + localContainerRef.current = node; + if (containerRef) { + containerRef.current = node; + } + }; + + useEffect(() => { + const current = editor.getAttributes("link").href as string | undefined; + setLinkValue(current ?? ""); + }, [editor]); + + useEffect(() => { + const timer = window.setTimeout(() => { + inputRef.current?.focus(); + }, 20); + + return () => window.clearTimeout(timer); + }, []); + + const applyLink = () => { + const value = linkValue.trim(); + if (!value) { + editor.chain().focus().extendMarkRange("link").unsetLink().run(); + } else { + editor + .chain() + .focus() + .extendMarkRange("link") + .setLink({ href: value }) + .run(); + } + + onClose(); + }; + + const removeLink = () => { + editor.chain().focus().extendMarkRange("link").unsetLink().run(); + onClose(); + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key === "Enter") { + event.preventDefault(); + applyLink(); + } + + if (event.key === "Escape") { + event.preventDefault(); + onClose(); + } + }; + + if (variant === "inline") { + return ( +
event.stopPropagation()} + > + setLinkValue(event.target.value)} + onKeyDown={handleKeyDown} + className="w-48 rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary" + /> + + + +
+ ); + } + + return ( +
+
+ + setLinkValue(event.target.value)} + onKeyDown={handleKeyDown} + className="w-full rounded border border-border bg-background px-2 py-1 text-sm text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary" + /> +
+ + + +
+
+
+ ); +}; + +export default LinkEditorPopover; diff --git a/packages/text-editor/src/editor.tsx b/packages/text-editor/src/editor.tsx new file mode 100644 index 000000000..e9dd519c7 --- /dev/null +++ b/packages/text-editor/src/editor.tsx @@ -0,0 +1,240 @@ +"use client"; + +import React, { + FC, + PropsWithChildren, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import type { JSONContent } from "@tiptap/core"; +import { generateText } from "@tiptap/core"; +import { EditorContent, useEditor } from "@tiptap/react"; +import emptyDoc from "./empty-doc"; +import { createExtensions } from "./extensions"; +import Toolbar from "./toolbar"; +import BubbleMenu from "./bubble-menu"; +import type { ReactEditorProps } from "./types"; +import { uploadImageToMediaLit } from "./file-upload-extention"; + +export interface EditorProps { + onChange: (json: JSONContent) => void; + showToolbar?: boolean; + editable?: boolean; + refresh?: number; + url: string; + initialContent?: ReactEditorProps["initialContent"]; + placeholder?: string; + autoFocus?: boolean; + imageSizeLimit?: number; + onError?: (...args: any[]) => void; +} + +interface EditorType extends FC> { + getPlainText: (doc: JSONContent) => string; + emptyDoc: JSONContent; +} + +const Editor: EditorType = Object.assign( + ({ + initialContent, + onChange, + placeholder, + children, + showToolbar = true, + editable = true, + refresh, + url, + autoFocus, + imageSizeLimit, + onError, + }) => { + const [isUploading, setIsUploading] = useState(false); + const fileInputRef = useRef(null); + const hasInteractedRef = useRef(false); + const lastSerializedContentRef = useRef( + JSON.stringify(initialContent ?? emptyDoc), + ); + const refreshRef = useRef(refresh); + + const extensions = useMemo( + () => createExtensions({ placeholder }), + [placeholder], + ); + + const changeTimeoutRef = useRef(null); + + const editor = useEditor( + { + immediatelyRender: false, + extensions, + content: initialContent ?? emptyDoc, + autofocus: autoFocus ? "end" : false, + editable, + editorProps: { + attributes: { + class: "tiptap-content", + "data-placeholder": placeholder ?? "", + }, + }, + onUpdate: ({ editor: instance }) => { + if (changeTimeoutRef.current) { + clearTimeout(changeTimeoutRef.current); + } + + changeTimeoutRef.current = setTimeout(() => { + hasInteractedRef.current = true; + onChange(instance.getJSON()); + changeTimeoutRef.current = null; + }, 1000); + }, + onSelectionUpdate: ({ editor: instance }) => { + hasInteractedRef.current = true; + }, + }, + [extensions], + ); + useEffect(() => { + return () => { + if (changeTimeoutRef.current) { + clearTimeout(changeTimeoutRef.current); + } + }; + }, []); + + useEffect(() => { + if (!editor) { + return; + } + + editor.setEditable(editable); + }, [editor, editable]); + + useEffect(() => { + if (!editor) { + return; + } + + const nextContent = initialContent ?? emptyDoc; + const nextSerialized = JSON.stringify(nextContent); + const refreshChanged = refreshRef.current !== refresh; + + if (refreshChanged) { + refreshRef.current = refresh; + hasInteractedRef.current = false; + lastSerializedContentRef.current = nextSerialized; + editor.commands.setContent(nextContent, { + emitUpdate: false, + }); + return; + } + + if (!hasInteractedRef.current) { + if (lastSerializedContentRef.current !== nextSerialized) { + lastSerializedContentRef.current = nextSerialized; + editor.commands.setContent(nextContent, { + emitUpdate: false, + }); + } + return; + } + + lastSerializedContentRef.current = nextSerialized; + }, [editor, initialContent, refresh]); + + const handleImageUpload = useCallback( + async (file: File) => { + try { + setIsUploading(true); + const result = await uploadImageToMediaLit({ + url, + file, + fileSizeLimit: imageSizeLimit, + onError, + }); + editor + ?.chain() + .focus() + .setImage({ + src: result.src, + alt: result.fileName, + title: result.fileName, + }) + .run(); + } catch (error) { + console.error("Image upload failed", error); + } finally { + setIsUploading(false); + } + }, + [editor, url], + ); + + const handleSelectFile = useCallback( + (event: React.ChangeEvent) => { + const files = event.target.files; + if (!files || files.length === 0) { + return; + } + + const file = files[0]; + void handleImageUpload(file); + event.target.value = ""; + }, + [handleImageUpload], + ); + + const openFileDialog = useCallback(() => { + fileInputRef.current?.click(); + }, []); + + if (typeof window === "undefined") { + return <>; + } + + return ( +
+ {editable && showToolbar && ( +
+ +
+ )} +
+
+ + + {children} + {editor && } +
+
+
+ ); + }, + { + getPlainText: (doc: JSONContent) => + generateText(doc || emptyDoc, createExtensions()), + emptyDoc, + }, +) as EditorType; + +export default Editor; diff --git a/packages/text-editor/src/empty-doc.ts b/packages/text-editor/src/empty-doc.ts index 47633cf56..12a71e997 100644 --- a/packages/text-editor/src/empty-doc.ts +++ b/packages/text-editor/src/empty-doc.ts @@ -1,6 +1,6 @@ -import { RemirrorContentType } from "remirror"; +import type { JSONContent } from "@tiptap/core"; -const emptyDoc: RemirrorContentType = { +const emptyDoc: JSONContent = { type: "doc", content: [], }; diff --git a/packages/text-editor/src/extensions.ts b/packages/text-editor/src/extensions.ts index 431a2b4a5..8300d76d6 100644 --- a/packages/text-editor/src/extensions.ts +++ b/packages/text-editor/src/extensions.ts @@ -1,77 +1,97 @@ +import StarterKit from "@tiptap/starter-kit"; +import Placeholder from "@tiptap/extension-placeholder"; +import Link from "@tiptap/extension-link"; import { - BulletListExtension, - DocExtension, - DropCursorExtension, - HeadingExtension, - ImageExtension, - LinkExtension, - OrderedListExtension, - ParagraphExtension, - PlaceholderExtension, - TaskListExtension, - TextExtension, - BlockquoteExtension, - HardBreakExtension, - BoldExtension, - ItalicExtension, - GapCursorExtension, - HorizontalRuleExtension, - StrikeExtension, - UnderlineExtension, - CodeExtension, - BidiExtension, - CodeBlockExtension, - TrailingNodeExtension, - IframeExtension, - ShortcutsExtension, -} from "remirror/extensions"; -import { CodeMirrorExtension } from "@remirror/extension-codemirror6"; -import { TableExtension } from "@remirror/extension-react-tables"; -import { oneDark } from "@codemirror/theme-one-dark"; -import { basicSetup } from "codemirror"; -import { getUploadHandler } from "./file-upload-extention"; + Table, + TableCell, + TableHeader, + TableRow, +} from "@tiptap/extension-table"; +import Image from "@tiptap/extension-image"; +import Dropcursor from "@tiptap/extension-dropcursor"; +import Gapcursor from "@tiptap/extension-gapcursor"; +import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight"; +import Heading from "@tiptap/extension-heading"; +import Highlight from "@tiptap/extension-highlight"; +import { lowlight } from "lowlight"; +import javascript from "highlight.js/lib/languages/javascript"; +import typescript from "highlight.js/lib/languages/typescript"; +import json from "highlight.js/lib/languages/json"; +import css from "highlight.js/lib/languages/css"; +import xml from "highlight.js/lib/languages/xml"; +import type { Extensions } from "@tiptap/core"; +import { createId } from "./create-id"; +import { CodeMirrorNode } from "./components/custom-code-mirror"; -export const getExtensions = (placeholder, url) => () => [ - new DocExtension({}), - new TextExtension(), - new ParagraphExtension(), - new HeadingExtension({}), - new BulletListExtension({}), - new LinkExtension({}), - new OrderedListExtension(), - new PlaceholderExtension({ placeholder }), - new TableExtension(), - new TaskListExtension(), - new ImageExtension({ - enableResizing: true, - uploadHandler: getUploadHandler(url), +lowlight.registerLanguage("javascript", javascript); +lowlight.registerLanguage("typescript", typescript); +lowlight.registerLanguage("json", json); +lowlight.registerLanguage("css", css); +lowlight.registerLanguage("html", xml); + +interface ExtensionOptions { + placeholder?: string; +} + +export const createExtensions = ({ + placeholder, +}: ExtensionOptions = {}): Extensions => [ + StarterKit.configure({ + codeBlock: false, + }), + Placeholder.configure({ + placeholder: placeholder || "Write something…", + }), + Link.configure({ + openOnClick: false, + autolink: true, + linkOnPaste: true, }), - new DropCursorExtension({ + Table.configure({ + resizable: true, + }), + TableRow, + TableHeader, + TableCell, + Image.configure({ + allowBase64: false, + HTMLAttributes: { + class: "max-w-full h-auto rounded-md", + }, + resize: { + enabled: true, + directions: ["top", "bottom", "left", "right"], + alwaysPreserveAspectRatio: true, + }, + }), + Dropcursor.configure({ color: "hsl(var(--foreground))", + width: 2, }), - new CodeMirrorExtension({ - extensions: [basicSetup, oneDark], + Gapcursor, + CodeBlockLowlight.configure({ + lowlight, + }), + Heading.extend({ + renderHTML({ node, HTMLAttributes }) { + const level = this.options.levels.includes(node.attrs.level) + ? node.attrs.level + : this.options.levels[0]; + const id = + typeof node.textContent === "string" + ? createId(node.textContent) + : undefined; + + return [ + `h${level}`, + { + ...HTMLAttributes, + id, + }, + 0, + ]; + }, }), - new BlockquoteExtension(), - new HardBreakExtension(), - new BoldExtension(null), - new ItalicExtension(), - new HardBreakExtension(), - new GapCursorExtension(), - new HardBreakExtension(), - new HorizontalRuleExtension(), - new StrikeExtension(), - new UnderlineExtension(), - new BlockquoteExtension(), - new CodeExtension(), - new BidiExtension(null), - new CodeBlockExtension(null), - new DropCursorExtension(), - new HeadingExtension(null), - new TrailingNodeExtension(), - new IframeExtension({ enableResizing: false }), - new BulletListExtension({}), - new OrderedListExtension(), - new TaskListExtension(), - new ShortcutsExtension(), + Highlight, + CodeMirrorNode, ]; diff --git a/packages/text-editor/src/extract-headings.ts b/packages/text-editor/src/extract-headings.ts index db97ac7c8..65cd2ee0e 100644 --- a/packages/text-editor/src/extract-headings.ts +++ b/packages/text-editor/src/extract-headings.ts @@ -1,7 +1,4 @@ -import { Node, Schema } from "prosemirror-model"; -import { RemirrorManager } from "remirror"; -import { AnyExtension } from "@remirror/core"; -import { getExtensions } from "./extensions"; +import type { JSONContent } from "@tiptap/core"; import { createId } from "./create-id"; interface Heading { @@ -10,28 +7,53 @@ interface Heading { id: string; } -interface JSONDoc { - type: string; - content?: JSONDoc[]; - attrs?: Record; - text?: string; -} - -export function extractHeadings(json: JSONDoc): Heading[] { +export function extractHeadings( + json: JSONContent | null | undefined, +): Heading[] { const headings: Heading[] = []; - const exts = getExtensions("", "")() as unknown as AnyExtension[]; - const manager = RemirrorManager.create(exts); - const doc = Node.fromJSON(manager.schema as Schema, json); - doc.descendants((node) => { - if (node.type.name === "heading") { + const collectHeadings = (node?: JSONContent) => { + if (!node) { + return; + } + + if (node.type === "heading") { + const level = + typeof node.attrs?.level === "number" ? node.attrs.level : 1; + + const collectText = (current?: JSONContent): string => { + if (!current) { + return ""; + } + + if (typeof current.text === "string") { + return current.text; + } + + if (!current.content) { + return ""; + } + + return current.content.map(collectText).join(""); + }; + + const textContent = collectText(node); + headings.push({ - level: node.attrs.level as number, - text: node.textContent, - id: createId(node.textContent), + level, + text: textContent, + id: createId(textContent), }); } - }); + + if (Array.isArray(node.content)) { + node.content.forEach((child) => { + collectHeadings(child as JSONContent); + }); + } + }; + + collectHeadings(json || undefined); return headings; } diff --git a/packages/text-editor/src/extract-text-from-node.ts b/packages/text-editor/src/extract-text-from-node.ts new file mode 100644 index 000000000..dfbeb9ef8 --- /dev/null +++ b/packages/text-editor/src/extract-text-from-node.ts @@ -0,0 +1,42 @@ +export function extractTextFromNode(node): string { + if (!node) { + return ""; + } + + // ProseMirror nodes have a textContent property that contains all text + if (typeof node.textContent === "string") { + return node.textContent; + } + + // Fallback: if content is a Fragment, access its content array + if ( + node.content && + node.content.content && + Array.isArray(node.content.content) + ) { + return node.content.content + .map((child: any) => { + // Text nodes have a text property + if (child.text) { + return child.text; + } + // Recursively extract from child nodes + return extractTextFromNode(child); + }) + .join(""); + } + + // Fallback: if content is directly an array + if (Array.isArray(node.content)) { + return node.content + .map((child: any) => { + if (child.text) { + return child.text; + } + return extractTextFromNode(child); + }) + .join(""); + } + + return ""; +} diff --git a/packages/text-editor/src/file-upload-extention.ts b/packages/text-editor/src/file-upload-extention.ts index a48a05b86..923076364 100644 --- a/packages/text-editor/src/file-upload-extention.ts +++ b/packages/text-editor/src/file-upload-extention.ts @@ -1,14 +1,5 @@ -import { DelayedPromiseCreator, ErrorConstant, invariant } from "remirror"; import { FetchBuilder } from "@courselit/utils"; import { Media } from "@courselit/common-models"; -import { ImageAttributes } from "remirror/extensions"; - -type SetProgress = (progress: number) => void; - -interface FileWithProgress { - file: File; - progress: SetProgress; -} async function getPresignedUrl(url: string) { const fetch = new FetchBuilder() @@ -18,55 +9,52 @@ async function getPresignedUrl(url: string) { return await fetch.exec(); } -export function getUploadHandler(url: string) { - return function uploadFileToMediaLit( - files: FileWithProgress[], - ): DelayedPromiseCreator[] { - invariant(files.length > 0, { - code: ErrorConstant.EXTENSION, - message: - "The upload handler was applied for the image extension without any valid files", - }); +export interface UploadedImage { + mediaId: string; + src: string; + fileName?: string; +} - let completed = 0; - const promises: DelayedPromiseCreator[] = []; +export async function uploadImageToMediaLit({ + url, + file, + fileSizeLimit = 2097152, // 2 MB, + onError, +}: { + url: string; + file: File; + fileSizeLimit?: number; + onError?: (args: any) => void; +}): Promise { + if (file.size > fileSizeLimit) { + if (onError) { + onError("File is larger than 2MB"); + return { src: "", mediaId: "", fileName: "" }; + } else { + throw new Error("File is larger than 2MB"); + } + } - for (const { file, progress } of files) { - promises.push( - () => - new Promise((resolve, reject) => { - if (file.size > 2097152) { - // 2 MB (taken from: https://stackoverflow.com/a/49490014) - return reject("File is larger than 2MB"); - } - getPresignedUrl(url) - .then(({ signature, endpoint }) => { - const fD = new FormData(); - fD.append("caption", file.name); - fD.append("access", "public"); - fD.append("file", file); + const { signature, endpoint } = await getPresignedUrl(url); - return fetch(`${endpoint}/media/create`, { - method: "POST", - headers: { - "x-medialit-signature": signature, - }, - body: fD, - }); - }) - .then((data) => data.json()) - .then((data: Media) => { - completed += 1; - progress(completed / files.length); - resolve({ - src: data.file, - fileName: data.originalFileName, - }); - }) - .catch((err) => reject(err.message)); - }), - ); - } - return promises; + const formData = new FormData(); + formData.append("caption", file.name); + formData.append("access", "public"); + formData.append("file", file); + + const response = await fetch(`${endpoint}/media/create`, { + method: "POST", + headers: { + "x-medialit-signature": signature, + }, + body: formData, + }); + + const data: Media = await response.json(); + + return { + src: data.file, + fileName: data.originalFileName, + mediaId: data.mediaId, }; } diff --git a/packages/text-editor/src/index.tsx b/packages/text-editor/src/index.tsx index 71f330911..52f082d3f 100644 --- a/packages/text-editor/src/index.tsx +++ b/packages/text-editor/src/index.tsx @@ -1,4 +1,7 @@ -export { default as WysiwygEditor } from "./WysiwygEditor"; -export { default as Renderer } from "./Renderer"; +export { default as Editor } from "./editor"; +export type { EditorProps } from "./editor"; export { default as emptyDoc } from "./empty-doc"; -export { extractHeadings } from "./extract-headings"; +export * from "./extract-headings"; +export * from "./extensions"; +export * from "./create-id"; +export * from "./extract-text-from-node"; diff --git a/packages/text-editor/src/toolbar.tsx b/packages/text-editor/src/toolbar.tsx new file mode 100644 index 000000000..0819b8b74 --- /dev/null +++ b/packages/text-editor/src/toolbar.tsx @@ -0,0 +1,416 @@ +import React, { useEffect, useRef, useState } from "react"; +import type { Editor } from "@tiptap/core"; +import type { Level } from "@tiptap/extension-heading"; +import { + Bold, + Code, + CodeSquare, + Heading1, + Heading2, + Heading3, + Image as ImageIcon, + Italic, + Link as LinkIcon, + List as ListIcon, + ListOrdered, + Minus, + Quote, + Redo2, + SquarePen, + Strikethrough, + Table as TableIcon, + Trash2, + Underline, + Undo2, +} from "lucide-react"; +import LinkEditorPopover from "./components/link-editor-popover.js"; + +interface ToolbarProps { + editor: Editor | null; + onRequestImageUpload: () => void; + isUploadingImage?: boolean; +} + +type PopoverType = "link" | "table" | null; + +const iconButtonBase = + "inline-flex h-8 w-8 items-center justify-center rounded border border-transparent text-foreground transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50"; + +function IconButton({ + icon: Icon, + label, + active, + disabled, + onClick, +}: { + icon: React.ComponentType<{ className?: string }>; + label: string; + active?: boolean; + disabled?: boolean; + onClick?: () => void; +}): JSX.Element { + return ( + + ); +} + +const headingButtons: Array<{ + label: string; + value: string; + icon: React.ComponentType<{ className?: string }>; + level?: Level; +}> = [ + { label: "Paragraph", value: "paragraph", icon: SquarePen }, + { label: "Heading 1", value: "h1", icon: Heading1, level: 1 }, + { label: "Heading 2", value: "h2", icon: Heading2, level: 2 }, + { label: "Heading 3", value: "h3", icon: Heading3, level: 3 }, +]; + +const Toolbar = ({ + editor, + onRequestImageUpload, + isUploadingImage, +}: ToolbarProps): JSX.Element | null => { + const [activePopover, setActivePopover] = useState(null); + + const popoverRef = useRef(null); + + useEffect(() => { + if (!activePopover) { + return undefined; + } + + const handleClick = (event: MouseEvent) => { + if ( + popoverRef.current && + !popoverRef.current.contains(event.target as Node) + ) { + setActivePopover(null); + } + }; + + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setActivePopover(null); + } + }; + + document.addEventListener("mousedown", handleClick); + document.addEventListener("keydown", handleKeyDown); + + return () => { + document.removeEventListener("mousedown", handleClick); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [activePopover]); + + if (!editor) { + return null; + } + + const togglePopover = (type: PopoverType, onBeforeOpen?: () => void) => { + setActivePopover((current) => { + if (current === type) { + return null; + } + + onBeforeOpen?.(); + return type; + }); + }; + + const toggleTablePopover = () => { + togglePopover("table"); + }; + + const insertTable = () => { + editor + .chain() + .focus() + .insertTable({ rows: 3, cols: 3, withHeaderRow: true }) + .run(); + setActivePopover(null); + }; + + const addRowAfter = () => { + editor.chain().focus().addRowAfter().run(); + setActivePopover(null); + }; + + const deleteRow = () => { + editor.chain().focus().deleteRow().run(); + setActivePopover(null); + }; + + const addColumnAfter = () => { + editor.chain().focus().addColumnAfter().run(); + setActivePopover(null); + }; + + const deleteColumn = () => { + editor.chain().focus().deleteColumn().run(); + setActivePopover(null); + }; + + const deleteTable = () => { + editor.chain().focus().deleteTable().run(); + setActivePopover(null); + }; + + const canInsertTable = editor + .can() + .chain() + .focus() + .insertTable({ rows: 3, cols: 3, withHeaderRow: true }) + .run(); + const canAddRow = editor.can().chain().focus().addRowAfter().run(); + const canDeleteRow = editor.can().chain().focus().deleteRow().run(); + const canAddColumn = editor.can().chain().focus().addColumnAfter().run(); + const canDeleteColumn = editor.can().chain().focus().deleteColumn().run(); + const canDeleteTable = editor.can().chain().focus().deleteTable().run(); + + return ( +
+
+
+
+ editor.chain().focus().undo().run()} + /> + editor.chain().focus().redo().run()} + /> +
+
+ {headingButtons.map((button) => ( + { + const chain = editor.chain().focus(); + if (button.level) { + chain + .toggleHeading({ + level: button.level, + }) + .run(); + } else { + chain.setParagraph().run(); + } + }} + /> + ))} +
+
+ + editor.chain().focus().toggleBold().run() + } + /> + + editor.chain().focus().toggleItalic().run() + } + /> + + editor + .chain() + .focus() + .toggleMark("underline") + .run() + } + /> + + editor.chain().focus().toggleStrike().run() + } + /> + + editor.chain().focus().toggleCode().run() + } + /> + togglePopover("link")} + /> +
+
+ + editor.chain().focus().toggleBulletList().run() + } + /> + + editor.chain().focus().toggleOrderedList().run() + } + /> + + editor.chain().focus().toggleBlockquote().run() + } + /> + + editor.chain().focus().setHorizontalRule().run() + } + /> + + editor.chain().focus().toggleCodeBlock().run() + } + /> +
+
+ + +
+
+
+ + {activePopover === "link" && ( + setActivePopover(null)} + containerRef={popoverRef} + /> + )} + + {activePopover === "table" && ( +
+
+ + + + + + +
+
+ )} +
+ ); +}; + +export default Toolbar; diff --git a/packages/text-editor/src/types.tsx b/packages/text-editor/src/types.tsx index fbea39090..219b4a9bc 100644 --- a/packages/text-editor/src/types.tsx +++ b/packages/text-editor/src/types.tsx @@ -1,11 +1,11 @@ -import type { CreateEditorStateProps } from "remirror"; -import type { RemirrorProps } from "@remirror/react"; +import type { JSONContent, Extensions } from "@tiptap/core"; + +export type EditorJSONContent = JSONContent; +export type EditorExtensions = Extensions; export interface ReactEditorProps { - stringHandler?: CreateEditorStateProps["stringHandler"]; - initialContent?: RemirrorProps["initialContent"]; - editable?: RemirrorProps["editable"]; - autoFocus?: RemirrorProps["autoFocus"]; - hooks?: RemirrorProps["hooks"]; + initialContent?: JSONContent | string | null; + editable?: boolean; + autoFocus?: boolean; placeholder?: string; } diff --git a/packages/text-editor/styles.css b/packages/text-editor/styles.css new file mode 100644 index 000000000..72da29216 --- /dev/null +++ b/packages/text-editor/styles.css @@ -0,0 +1,165 @@ +.tiptap-editor { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.tiptap-editor .ProseMirror { + min-height: 12.5rem; + padding: 1rem; + border-radius: 0.5rem; + outline: none; + word-break: break-word; +} + +/* .tiptap-editor .ProseMirror:focus-visible { + outline: 2px solid hsl(var(--primary)); + outline-offset: 0; +} */ + +.tiptap-editor .ProseMirror p.is-editor-empty:first-child::before { + color: hsl(var(--muted-foreground)); + content: attr(data-placeholder); + float: left; + height: 0; + pointer-events: none; +} + +.tiptap-editor .ProseMirror a { + color: hsl(var(--primary)); + text-decoration: underline; + text-decoration-thickness: 0.1em; + text-decoration-color: hsl(var(--primary)); +} + +.tiptap-editor .ProseMirror ul, +.tiptap-editor .ProseMirror ol { + padding-left: 1.5rem; + margin: 0.75rem 0; +} + +.tiptap-editor .ProseMirror ul li { + list-style: disc; +} + +.tiptap-editor .ProseMirror ol li { + list-style: decimal; +} + +.tiptap-editor .ProseMirror blockquote { + border-left: 3px solid hsl(var(--border)); + margin: 0.75rem 0; + padding-left: 1rem; + color: hsl(var(--muted-foreground)); + font-style: italic; +} + +.tiptap-editor .ProseMirror h1, +.tiptap-editor .ProseMirror h2, +.tiptap-editor .ProseMirror h3, +.tiptap-editor .ProseMirror h4, +.tiptap-editor .ProseMirror h5, +.tiptap-editor .ProseMirror h6 { + font-weight: 600; + line-height: 1.25; + margin: 1.5rem 0 0.75rem; +} + +.tiptap-editor .ProseMirror h1 { + font-size: clamp(2rem, 3vw, 2.5rem); +} + +.tiptap-editor .ProseMirror h2 { + font-size: clamp(1.75rem, 2.5vw, 2rem); +} + +.tiptap-editor .ProseMirror h3 { + font-size: clamp(1.5rem, 2vw, 1.75rem); +} + +.tiptap-editor .ProseMirror pre { + background-color: #0d0d0d; + border-radius: 0.5rem; + color: #fff; + font-family: + "JetBrains Mono", ui-monospace, SFMono-Regular, Consolas, + "Liberation Mono", Menlo, monospace; + font-size: 0.875rem; + margin: 0.75rem 0; + padding: 1rem; + overflow-x: auto; +} + +.tiptap-editor .ProseMirror pre code { + background: none; + color: inherit; + padding: 0; +} + +.tiptap-editor .ProseMirror code { + background-color: hsl(var(--muted)); + border-radius: 0.375rem; + padding: 0.125rem 0.375rem; + font-size: 0.875em; + font-family: + "JetBrains Mono", ui-monospace, SFMono-Regular, Consolas, + "Liberation Mono", Menlo, monospace; +} + +.tiptap-editor .ProseMirror hr { + border: none; + border-top: 1px solid hsl(var(--border)); + margin: 1.5rem 0; +} + +.tiptap-editor .ProseMirror table { + border-collapse: collapse; + border: 1px solid hsl(var(--border)); + margin: 1rem 0; + width: 100%; + table-layout: fixed; +} + +.tiptap-editor .ProseMirror table th, +.tiptap-editor .ProseMirror table td { + border: 1px solid hsl(var(--border)); + padding: 0.5rem; + vertical-align: top; +} + +.tiptap-editor .ProseMirror table th { + background-color: hsl(var(--muted)); + font-weight: 600; + text-align: left; +} + +.tiptap-editor .ProseMirror img { + display: block; + max-width: 100%; + height: auto; + border-radius: 0.5rem; + margin: 1rem auto; +} + +.tiptap-editor .ProseMirror iframe { + width: 100%; + aspect-ratio: 16 / 9; + border: 0; + border-radius: 0.75rem; + background-color: #000; + margin: 1.5rem 0; +} + +.tiptap-editor .bubble-menu { + display: flex; + align-items: center; + gap: 0.375rem; + padding: 0.5rem; + border-radius: 0.5rem; + border: 1px solid hsl(var(--border)); + background-color: hsl(var(--background)); + box-shadow: + 0 10px 15px -3px rgba(15, 23, 42, 0.12), + 0 4px 6px -4px rgba(15, 23, 42, 0.04); + z-index: 2; +} diff --git a/packages/text-editor/tsconfig.json b/packages/text-editor/tsconfig.json index 21785599c..92936881e 100644 --- a/packages/text-editor/tsconfig.json +++ b/packages/text-editor/tsconfig.json @@ -19,5 +19,5 @@ "react": ["./node_modules/@types/react"] } }, - "include": ["src/**/*"] + "include": ["src/**/*", "additional.d.ts"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 477ff10a5..a6225b0f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -222,6 +222,9 @@ importers: '@courselit/page-primitives': specifier: workspace:^ version: link:../../packages/page-primitives + '@courselit/text-editor': + specifier: workspace:^ + version: link:../../packages/text-editor '@courselit/utils': specifier: workspace:^ version: link:../../packages/utils @@ -819,9 +822,18 @@ importers: '@courselit/page-primitives': specifier: workspace:^ version: link:../page-primitives + '@courselit/text-editor': + specifier: workspace:^ + version: link:../text-editor '@courselit/utils': specifier: workspace:^ version: link:../utils + '@tiptap/core': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/static-renderer': + specifier: ^3.10.7 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -981,60 +993,69 @@ importers: packages/text-editor: dependencies: - '@codemirror/language-data': - specifier: ^6.5.1 - version: 6.5.1 - '@codemirror/state': - specifier: ^6.5.2 - version: 6.5.2 - '@codemirror/theme-one-dark': - specifier: ^6.1.2 - version: 6.1.2 '@courselit/common-models': specifier: workspace:^ version: link:../common-models '@courselit/utils': specifier: workspace:^ version: link:../utils - '@remirror/core': - specifier: ^3.0.2 - version: 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/core-types': + '@floating-ui/dom': + specifier: ^1.6.0 + version: 1.6.13 + '@tiptap/core': specifier: ^3.0.0 - version: 3.0.0(@remirror/pm@3.0.1) - '@remirror/extension-codemirror6': - specifier: ^2.0.2 - version: 2.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-react-tables': - specifier: ^3.0.3 - version: 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/i18n': + version: 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/extension-bubble-menu': + specifier: ^3.10.4 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-code-block-lowlight': specifier: ^3.0.0 - version: 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': - specifier: ^3.0.1 - version: 3.0.1 - '@remirror/react': - specifier: ^3.0.3 - version: 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-editors': - specifier: ^2.0.3 - version: 2.0.3(@emotion/css@11.13.5)(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(prettier@3.5.3)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-ui': - specifier: ^1.0.3 - version: 1.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(prettier@3.5.3)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - codemirror: - specifier: ^6.0.2 - version: 6.0.2 - prosemirror-model: - specifier: ^1.22.3 - version: 1.25.1 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/extension-code-block@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(highlight.js@11.11.1)(lowlight@2.9.0) + '@tiptap/extension-dropcursor': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-gapcursor': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-heading': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-highlight': + specifier: ^3.11.0 + version: 3.11.0(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-image': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-link': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-placeholder': + specifier: ^3.0.0 + version: 3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-table': + specifier: ^3.10.7 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/react': + specifier: ^3.0.0 + version: 3.10.8(@floating-ui/dom@1.6.13)(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) + '@tiptap/starter-kit': + specifier: ^3.0.0 + version: 3.10.8 + '@tiptap/static-renderer': + specifier: ^3.10.7 + version: 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) + highlight.js: + specifier: ^11.10.0 + version: 11.11.1 + lowlight: + specifier: ^2.9.0 + version: 2.9.0 + lucide-react: + specifier: ^0.544.0 + version: 0.544.0(react@17.0.2) react: specifier: ^17.0.2 version: 17.0.2 - remirror: - specifier: ^3.0.3 - version: 3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2))(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) devDependencies: '@types/node': specifier: ^18.8.0 @@ -1625,96 +1646,6 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@codemirror/autocomplete@6.18.6': - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} - - '@codemirror/commands@6.8.1': - resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} - - '@codemirror/lang-angular@0.1.4': - resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} - - '@codemirror/lang-cpp@6.0.2': - resolution: {integrity: sha512-6oYEYUKHvrnacXxWxYa6t4puTlbN3dgV662BDfSH8+MfjQjVmP697/KYTDOqpxgerkvoNm7q5wlFMBeX8ZMocg==} - - '@codemirror/lang-css@6.3.1': - resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} - - '@codemirror/lang-go@6.0.1': - resolution: {integrity: sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==} - - '@codemirror/lang-html@6.4.9': - resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} - - '@codemirror/lang-java@6.0.1': - resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} - - '@codemirror/lang-javascript@6.2.3': - resolution: {integrity: sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==} - - '@codemirror/lang-json@6.0.1': - resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} - - '@codemirror/lang-less@6.0.2': - resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} - - '@codemirror/lang-liquid@6.2.3': - resolution: {integrity: sha512-yeN+nMSrf/lNii3FJxVVEGQwFG0/2eDyH6gNOj+TGCa0hlNO4bhQnoO5ISnd7JOG+7zTEcI/GOoyraisFVY7jQ==} - - '@codemirror/lang-markdown@6.3.2': - resolution: {integrity: sha512-c/5MYinGbFxYl4itE9q/rgN/sMTjOr8XL5OWnC+EaRMLfCbVUmmubTJfdgpfcSS2SCaT7b+Q+xi3l6CgoE+BsA==} - - '@codemirror/lang-php@6.0.1': - resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} - - '@codemirror/lang-python@6.2.0': - resolution: {integrity: sha512-+oLTR88uLib84tvb4XmOBBq/dgrctvPXueP3Wjotu4zmHLM2KW2wfswJ6r1BKlfJNcGgdWX1AgUeGEf3E2H5LA==} - - '@codemirror/lang-rust@6.0.1': - resolution: {integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==} - - '@codemirror/lang-sass@6.0.2': - resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} - - '@codemirror/lang-sql@6.8.0': - resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} - - '@codemirror/lang-vue@0.1.3': - resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} - - '@codemirror/lang-wast@6.0.2': - resolution: {integrity: sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==} - - '@codemirror/lang-xml@6.1.0': - resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} - - '@codemirror/lang-yaml@6.1.2': - resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} - - '@codemirror/language-data@6.5.1': - resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} - - '@codemirror/language@6.11.0': - resolution: {integrity: sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==} - - '@codemirror/legacy-modes@6.5.1': - resolution: {integrity: sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw==} - - '@codemirror/lint@6.8.5': - resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} - - '@codemirror/search@6.5.10': - resolution: {integrity: sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==} - - '@codemirror/state@6.5.2': - resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} - - '@codemirror/theme-one-dark@6.1.2': - resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} - - '@codemirror/view@6.36.6': - resolution: {integrity: sha512-uxugGLet+Nzp0Jcit8Hn3LypM8ioMLKTsdf8FRoT3HWvZtb9GhaWMe0Cc15rz90Ljab4YFJiAulmIVB74OY0IQ==} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1825,45 +1756,18 @@ packages: '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} - '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - '@emotion/serialize@1.3.3': resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.14.0': - resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - '@emotion/unitless@0.10.0': resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} - peerDependencies: - react: '>=16.8.0' - '@emotion/utils@1.4.2': resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} @@ -2738,57 +2642,6 @@ packages: '@kurkle/color@0.3.4': resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} - - '@lezer/cpp@1.1.3': - resolution: {integrity: sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==} - - '@lezer/css@1.1.11': - resolution: {integrity: sha512-FuAnusbLBl1SEAtfN8NdShxYJiESKw9LAFysfea1T96jD3ydBn12oYjaSG1a04BQRIUd93/0D8e5CV1cUMkmQg==} - - '@lezer/go@1.0.0': - resolution: {integrity: sha512-co9JfT3QqX1YkrMmourYw2Z8meGC50Ko4d54QEcQbEYpvdUvN4yb0NBZdn/9ertgvjsySxHsKzH3lbm3vqJ4Jw==} - - '@lezer/highlight@1.2.1': - resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} - - '@lezer/html@1.3.10': - resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} - - '@lezer/java@1.1.3': - resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} - - '@lezer/javascript@1.5.1': - resolution: {integrity: sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==} - - '@lezer/json@1.0.3': - resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} - - '@lezer/markdown@1.4.2': - resolution: {integrity: sha512-iYewCigG/517D0xJPQd7RGaCjZAFwROiH8T9h7OTtz0bRVtkxzFhGBFJ9JGKgBBs4uuo1cvxzyQ5iKhDLMcLUQ==} - - '@lezer/php@1.0.2': - resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==} - - '@lezer/python@1.1.18': - resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==} - - '@lezer/rust@1.0.2': - resolution: {integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==} - - '@lezer/sass@1.0.7': - resolution: {integrity: sha512-8HLlOkuX/SMHOggI2DAsXUw38TuURe+3eQ5hiuk9QmYOUyC55B1dYEIMkav5A4IELVaW4e1T4P9WRiI5ka4mdw==} - - '@lezer/xml@1.0.6': - resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - - '@lezer/yaml@1.0.3': - resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} - '@linaria/core@4.2.10': resolution: {integrity: sha512-S1W01W7L4SQnGpWzp8awyCpPIYUOEJ+OLjjXqKpIXOU+ozPwBt86Mjjdas9aZccVhNBWDja74cMCUAVp8yUpDQ==} engines: {node: ^12.16.0 || >=13.7.0} @@ -2805,18 +2658,6 @@ packages: resolution: {integrity: sha512-tSpxA3Zn0DKJ2n/YBnYAgiDY+MNvkmzAHrD8R9PKrpGaZ+wz1jQEmE1vGn1cqh8dJyWK0NzPAA8sf1cqa+RmAg==} engines: {node: ^12.16.0 || >=13.7.0} - '@lingui/core@4.14.1': - resolution: {integrity: sha512-3O6bnNzApWjb+jIdXa7G2VbrP6jZ5nfCeYSVloEYg6YFIfsQ3GunccK6I2nL80mWgr2qGP4VilGD+ODCeXHITA==} - engines: {node: '>=16.0.0'} - - '@lingui/detect-locale@4.14.1': - resolution: {integrity: sha512-w3sS+tVcZ8uDVJxLjHYArTjzUFK0NyMh2wukVGU52UO1WYjCCujf1DPboooIm5zeMquuTpa5XK017lnPJzB21w==} - engines: {node: '>=16.0.0'} - - '@lingui/message-utils@4.14.1': - resolution: {integrity: sha512-J6MzyTLNCzEnyR1Da188G81cRcQMbk/lyYnLWMzQjIELDX8bBBwNea91Sf5Zm+BB+ADWmmGTdUqRPAjDqT9Y5w==} - engines: {node: '>=16.0.0'} - '@ljharb/has-package-exports-patterns@0.0.2': resolution: {integrity: sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==} @@ -2826,12 +2667,6 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@marijn/find-cluster-break@1.0.2': - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - - '@messageformat/parser@5.1.1': - resolution: {integrity: sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==} - '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -2868,83 +2703,6 @@ packages: cpu: [x64] os: [win32] - '@mui/core-downloads-tracker@5.17.1': - resolution: {integrity: sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==} - - '@mui/material@5.17.1': - resolution: {integrity: sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': 18.3.7 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/private-theming@5.17.1': - resolution: {integrity: sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': 18.3.7 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/styled-engine@5.16.14': - resolution: {integrity: sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/system@5.17.1': - resolution: {integrity: sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': 18.3.7 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/types@7.2.24': - resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} - peerDependencies: - '@types/react': 18.3.7 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.17.1': - resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': 18.3.7 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} @@ -3086,9 +2844,6 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@preact/signals-core@1.8.0': resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} @@ -4195,11 +3950,6 @@ packages: peerDependencies: '@remirror/pm': ^3.0.1 - '@remirror/extension-codemirror6@2.0.2': - resolution: {integrity: sha512-5+X8H+TSuITy196A6BFT8sHEtIMa4E9whYJvQM11ErPmtkI17uMjx94OtbUqkCN0clzOFtp0M1z1TM2o5BDWgw==} - peerDependencies: - '@remirror/pm': ^3.0.1 - '@remirror/extension-collaboration@3.0.2': resolution: {integrity: sha512-MuTkbpKiaRLyZOYJyt0x73LC5hQE0iSaLOaFBT0RmDGY7kQ2HjSumCAw3e/MoNmrF8GbpHOFmeOVVssbf6SEsw==} peerDependencies: @@ -4435,9 +4185,6 @@ packages: peerDependencies: '@remirror/pm': ^3.0.1 - '@remirror/i18n@3.0.0': - resolution: {integrity: sha512-MFyHyjDl7N7vyLWfW4GEd5uEJCmtTytB0mznULrOe/83mEY+Zl/X4Tbt3IlKQas/v2R9Gi63wNrRBuMvkPylMg==} - '@remirror/icons@3.0.0': resolution: {integrity: sha512-NOgd0ENWWlUOb8xH7xz3qpcW+OCVt0oxF2Lde1hOg/x67LyUbybofe6SwXpdx3TN8bdgSU5CzlNPeugGsGMdwg==} @@ -4504,19 +4251,6 @@ packages: '@types/react-dom': optional: true - '@remirror/react-editors@2.0.3': - resolution: {integrity: sha512-4aYLixZ1HOLqI48JsU6lFmqxLEqJnnKIoJ3+Dat60OcmijUD1qb9fXudNVMMaxKyIDoNsbZxiXB13Cqvs5jL5g==} - peerDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - react: ^16.14.0 || ^17 || ^18 - react-dom: ^16.14.0 || ^17 || ^18 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@remirror/react-hooks@3.0.3': resolution: {integrity: sha512-Cf7qXF9H+QgA2tRngV5jfJhQ6SWEEC6G7/3JLGQOx2q6Wh/KAlAEol6hZfmJGM27ZR1H1IwKFQoUTHy7Dz0QtQ==} peerDependencies: @@ -4544,20 +4278,6 @@ packages: '@types/react': optional: true - '@remirror/react-ui@1.0.3': - resolution: {integrity: sha512-jiOvi5GcBKgRV/EF+/TtoUbzZavRBkSwqcweQk8dA7uh8+RIx8jhQlOYobEJQQBaS4MfO8IrFcLdHJMtuuLQCA==} - peerDependencies: - '@remirror/pm': ^3.0.1 - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - react: ^16.14.0 || ^17 || ^18 - react-dom: ^16.14.0 || ^17 || ^18 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@remirror/react-utils@3.0.0': resolution: {integrity: sha512-9v+Mhup4n4tajJEnqsTBJKvyC7kHwsuTRe5Z7NXKN1O5WOMJyT+sOfAis8cOn4oPco3adVBEvbm54JSIwZXQEA==} peerDependencies: @@ -4567,40 +4287,6 @@ packages: '@types/react': optional: true - '@remirror/react@3.0.3': - resolution: {integrity: sha512-6e6rd6rGBEUZWh6Ax1L24pWZA8aFmo8OmqAtSRQyGDnGaUw3/g6AQFY3l7YXbjDbC3WDAL617/x/KPmvBPIeug==} - peerDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - react: ^16.14.0 || ^17 || ^18 - react-dom: ^16.14.0 || ^17 || ^18 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@remirror/styles@3.0.0': - resolution: {integrity: sha512-Q4B5mwwHZBpxH3Yn95MSxBlCuQgEn09OGwGFfBdeOaSFQGiqiWPQ/jFFGvJkSks3vn/jdn3o9ol4PhiNWxluoA==} - peerDependencies: - '@emotion/css': ^11.11.0 - '@emotion/react': ^11.11.0 - '@emotion/styled': ^11.11.0 - '@types/react': 18.3.7 - react: '>= 16.14.0' - styled-components: ^6.1.0 - peerDependenciesMeta: - '@emotion/css': - optional: true - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - react: - optional: true - styled-components: - optional: true - '@remirror/theme@3.0.0': resolution: {integrity: sha512-TJkcpOV3iR8A80NjYczzsGcDfkBXR24cElH9vnuF57LUqZwsgX9QHfZG1QaBJIVy9Zl/hFWMBcSzQqj0+P4NnA==} @@ -4959,69 +4645,256 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@tiptap/core@3.10.8': + resolution: {integrity: sha512-Kps4pl9O2fBrWaZkKemOaBBhOnEDiaBszCJIp2PKkW55ok1dsTWlwV6mFyywk9p8yjHEds6msqkngQokSpSwrQ==} + peerDependencies: + '@tiptap/pm': ^3.10.8 - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tiptap/extension-blockquote@3.10.8': + resolution: {integrity: sha512-K5FC8mGDB5bElgndAcee4MMNQ6JKtyCfO2/x24LSUUVkocU3szZdVIrLf51PTHWvRwPuDtTJZjlDmCyJ2TOsqw==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tiptap/extension-bold@3.10.8': + resolution: {integrity: sha512-2HKJcxJUHNEAW78JC3FmjgqHQ6W66nHf3Uyvxkr4WPcmgZkAHV3kxQQjTDWP2U0IpylfnleaooWiHtNNk8/Qng==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tiptap/extension-bubble-menu@3.10.8': + resolution: {integrity: sha512-4hq6x87w0UYjtgD1au9N34Fl4OHcn8RW1lpMOyCGl4d8dURoUNfMHHGCRpUvaAsBW64Eh4qTG0CJrDAPyXzqYQ==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tiptap/extension-bullet-list@3.10.8': + resolution: {integrity: sha512-VNY1/VBxNEj45w8L/eeI7C00XWW4Nd7Sk20vxLhmPFtXh7BuzzR7yviTEXjGUgwgNO2enFb+5Qi7bFLFjMR94g==} + peerDependencies: + '@tiptap/extension-list': ^3.10.8 - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@tiptap/extension-code-block-lowlight@3.10.8': + resolution: {integrity: sha512-BGczlwXy/83axecHIubnYVL4wbt7dH6uhFPsI3kOrCovtsHFY2zWNrDmkHlPr+BlyGrvQ9LzISKrUIv99/PLwA==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/extension-code-block': ^3.10.8 + '@tiptap/pm': ^3.10.8 + highlight.js: ^11 + lowlight: ^2 || ^3 - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@tiptap/extension-code-block@3.10.8': + resolution: {integrity: sha512-/6/IftjAUXhRj3VWr4EiETKxrUS3CU8GHw7/TPTpJ79ddBSftjVs1nBQIlKqg6qG10D6fD1HbxvgTWXiE5FZQQ==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@tiptap/extension-code@3.10.8': + resolution: {integrity: sha512-QgM68sJfV4Wd7ip2gM9LOS382CZhkITR/PAOGzmKp2JrHYK7uoMoV92Wk3RVdiJfOLwNJ5rtZ+DKboW9dVzLDw==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@tiptap/extension-document@3.10.8': + resolution: {integrity: sha512-RJOD23zPSMFsSdV4vfC09zLvjzKQBN0JGVZ9yGGyWydnZkUo+ENlYJlu6P3YfCvgkFQ2qYgSGYC/19CTCiEaHQ==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@tiptap/extension-dropcursor@3.10.8': + resolution: {integrity: sha512-BP9P6IElQWVipNjj04eeSuo2z7EW1HL/bOPUa+VvcH7micuzFwQ4d2rhLIobsoDy3ULlOtYgyZDOYCY5dnlctQ==} + peerDependencies: + '@tiptap/extensions': ^3.10.8 - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@tiptap/extension-floating-menu@3.10.8': + resolution: {integrity: sha512-3Zhsq2+Pu/7Q3gfQmR/+/5l0XZk2BKDujc6BR0IX/67Hzoo+en5O0BQdwekDeowEJn+FnHxxB9LOYNku4OF/Mg==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@tiptap/extension-gapcursor@3.10.8': + resolution: {integrity: sha512-/6nmZI00NyaJ5IcjdGzHbYj5+cC/LS3MfpPWLlr10ISmUs/m9Ve605D/7S7lbCbz28GAV8MwaLjfvNERZYqCzQ==} + peerDependencies: + '@tiptap/extensions': ^3.10.8 - '@types/base-64@1.0.2': - resolution: {integrity: sha512-uPgKMmM9fmn7I+Zi6YBqctOye4SlJsHKcisjHIMWpb2YKZRc36GpKyNuQ03JcT+oNXg1m7Uv4wU94EVltn8/cw==} + '@tiptap/extension-hard-break@3.10.8': + resolution: {integrity: sha512-olBa5MLPNGQksT8y3ILvEIed/hkb+dcKbnci4g7AXCmn2omUP6u6Dl306YOOO1hzd0CzjfNjlUVX5csWYjH3pw==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/bcryptjs@2.4.6': - resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + '@tiptap/extension-heading@3.10.8': + resolution: {integrity: sha512-P9It6F/W/jsixOg6FdKIbzsALDmI5mMccN5Ve60A2G9GNCmMttBNA4QTe39eLR9Puzj8TKg+xHTDhcg94MzSzA==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@tiptap/extension-highlight@3.11.0': + resolution: {integrity: sha512-1Yzz77Nr4JB22WwAHKgfBsO+4fTaDdCsYVx9HDFkfGk6hliATwtNXvoi/7srfNjSpZzLUeqmPLjOhx3WS/hwtw==} + peerDependencies: + '@tiptap/core': ^3.11.0 - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@tiptap/extension-horizontal-rule@3.10.8': + resolution: {integrity: sha512-NmorfyiSQabA9VwpPeoeYnuF/tSDemVLC++FLdKo1GdgZUmmmZUHgdpKn6TRsdbqWkuK13KyVpAjg+p38eFIOw==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@tiptap/extension-image@3.10.8': + resolution: {integrity: sha512-Key9DoWw5St5pw5uOpQ5yk35Wi264pWTrpSTddHw0UZd2/+6MDG5BeTZSS4KcYSr3GsfWkLon3smSFKuPGcfyw==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + '@tiptap/extension-italic@3.10.8': + resolution: {integrity: sha512-+V+QR7ZzyCpuxRppanvhdwwEj01kH0HEdBU7w5IP3tyQ+rMUFLMv7iT3tJMWvd9PcH3o15pl1DidP6ce0JUWsg==} + peerDependencies: + '@tiptap/core': ^3.10.8 - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + '@tiptap/extension-link@3.10.8': + resolution: {integrity: sha512-8F7Az8jaPAjydt6Nk6DXcz6Lak0qV7InyjRMTDgumVHVsSY13RoJi159O/weexNUa0CgPDQv0s680UWpFf1hUw==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + '@tiptap/extension-list-item@3.10.8': + resolution: {integrity: sha512-Z9E18uuN4rgEce6jOS1LULyWav9NjqztN/9j+jUXOrlnVwURaWoBfi1H8z28NimAzFOaKJKzVlp3KnIfGt+mEA==} + peerDependencies: + '@tiptap/extension-list': ^3.10.8 - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@tiptap/extension-list-keymap@3.10.8': + resolution: {integrity: sha512-zrNXGP+9D+4M4bUowWBQdn3mMKWrciif2nTwB54EcYZ9vCUjgGvMzVuADdikClTbPtYNOQMIF1HbAu4hL1Cc1g==} + peerDependencies: + '@tiptap/extension-list': ^3.10.8 + + '@tiptap/extension-list@3.10.8': + resolution: {integrity: sha512-VwnHSfAjphMnBXkyEsCZ8K6ZXMESdoK/opSyPzPh4vRcLe6M5MDOsLfC51MvsfWEM2dR9XfqCxd0CYTqBvwP/g==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 + + '@tiptap/extension-ordered-list@3.10.8': + resolution: {integrity: sha512-ZyK6C7ocs8D2OJi7k+kyMC6Zy5shKjyUtLan6bo9RpqkOiKNPKnjprzIyktLtRd+wo9A8czYUqddYRogHTabcg==} + peerDependencies: + '@tiptap/extension-list': ^3.10.8 + + '@tiptap/extension-paragraph@3.10.8': + resolution: {integrity: sha512-KhVIzwC51wHJ1FUbUjTwZaleKn5exdBbHSRyEsOR71udaR86yhTv93p1A6Y/dO0DLeKzbP2pujqK5eDbLSgeqQ==} + peerDependencies: + '@tiptap/core': ^3.10.8 + + '@tiptap/extension-placeholder@3.10.8': + resolution: {integrity: sha512-tyE9SOWXks9UVmlnvO7cZhIey7FHHZ3UjniVRUOtrdl/9h4QOrerNJI+ShsBY6oQSvijTc6OaqRTGTxDf0mkTA==} + peerDependencies: + '@tiptap/extensions': ^3.10.8 + + '@tiptap/extension-strike@3.10.8': + resolution: {integrity: sha512-Qp07IdioE4uZK6AnpuAuniIKNdByRHKu7Yt8XK3MDfIicQ0bGjZWFglVay5HYzL83MGHGQLaTCdoCQqbIKjCmw==} + peerDependencies: + '@tiptap/core': ^3.10.8 + + '@tiptap/extension-table@3.10.8': + resolution: {integrity: sha512-tvigSdbrHonb/6NJb3+Md3P3DHexgqCQmtUm3/qQGv14VGKmOoPeJpe9mB2m4UO4E9shSV9Mt0tbHiv2AkgWmQ==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 + + '@tiptap/extension-text@3.10.8': + resolution: {integrity: sha512-dyadqItdphLAYPnxLal43mOcQr1biriCSh2S0KhLdb5sTV2HWsNxg7DrIdJZ7aRK0PXfBg9g+XF8euCbfq0iYA==} + peerDependencies: + '@tiptap/core': ^3.10.8 + + '@tiptap/extension-underline@3.10.8': + resolution: {integrity: sha512-eV8Myeb/8Fk/dRZK/mlKX3WelAbBwHUlkkCVVwKgTfRqRSpeu6vLjwI0RX5pNdWaTDUeHIhTzWWEZll+vms8lA==} + peerDependencies: + '@tiptap/core': ^3.10.8 + + '@tiptap/extensions@3.10.8': + resolution: {integrity: sha512-OLjQCbSFmVGNjcLKJ0fkEmOcJHSeRujc9A9jmdd/5crYc2VrKrjwvBLnFyS8WCb9E5OjXh8CNQdr+KzDXJaM9g==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 + + '@tiptap/pm@3.10.8': + resolution: {integrity: sha512-KxrVb7Yx9it+4PxlefRPsS+aACp4abwgqA0QVSdZt0lCkp1PWsii0JVJGgdu70fRuN74yXo5GUp60yVb1/kXPQ==} + + '@tiptap/react@3.10.8': + resolution: {integrity: sha512-24G/ao0nHxxsJHCsZTHcxmjcIomwx0iN5QQ93aj0VUFPKpE8MjMECmuxcVucas0gv717cXyXr0WrCrr+ebw3Qg==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tiptap/starter-kit@3.10.8': + resolution: {integrity: sha512-en4XQ64QmK+5PDIXM6xinecp8Jdch5JjfbY/bpOeRBBzrCO8vqHHSINHhaQFwmc9nfuoMoyEfVWZjCWooD2L4Q==} + + '@tiptap/static-renderer@3.10.8': + resolution: {integrity: sha512-1cKTsDv5bpe9bVWk7UHEk4M01aXFqgGotBIQbxE+wL8SBhwrY6u7vXgHnvtFwJvX8BIZUFWpdwHcon/eBzNy1Q==} + peerDependencies: + '@tiptap/core': ^3.10.8 + '@tiptap/pm': ^3.10.8 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/base-64@1.0.2': + resolution: {integrity: sha512-uPgKMmM9fmn7I+Zi6YBqctOye4SlJsHKcisjHIMWpb2YKZRc36GpKyNuQ03JcT+oNXg1m7Uv4wU94EVltn8/cw==} + + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} '@types/d3-path@3.1.1': resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} @@ -5098,12 +4971,21 @@ packages: '@types/json5@0.0.30': resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/marked@4.3.2': resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -5173,11 +5055,6 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} - peerDependencies: - '@types/react': 18.3.7 - '@types/react@18.3.7': resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} @@ -5219,6 +5096,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} @@ -5988,9 +5868,6 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - codemirror@6.0.2: - resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} - collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -7014,6 +6891,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -7103,6 +6983,10 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -7351,8 +7235,13 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + highlight.js@11.8.0: + resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==} + engines: {node: '>=12.0.0'} html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} @@ -7929,9 +7818,6 @@ packages: js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - js-sha256@0.10.1: - resolution: {integrity: sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==} - js-stringify@1.0.2: resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} @@ -8074,6 +7960,12 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lint-staged@15.5.1: resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} @@ -8204,6 +8096,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowlight@2.9.0: + resolution: {integrity: sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -8243,12 +8138,13 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-plural@6.2.2: - resolution: {integrity: sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -8321,6 +8217,9 @@ packages: mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -8558,9 +8457,6 @@ packages: resolution: {integrity: sha512-IxDxIUu42apE7oEknJK535xkQ6Gd7GKx/gNrNHY+vP4+ucVU2TOCWjVVW14Vc79y9DEEElzHDlTOuVNM8glUFA==} engines: {node: '>=16.20.1'} - moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - mpath@0.9.0: resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} engines: {node: '>=4.0.0'} @@ -9165,6 +9061,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} @@ -9186,6 +9085,12 @@ packages: prosemirror-keymap@1.2.2: resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + prosemirror-model@1.25.1: resolution: {integrity: sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==} @@ -9199,6 +9104,9 @@ packages: prosemirror-resizable-view@3.0.0: resolution: {integrity: sha512-xIy2fU7B7z46oH8zW6aC0i4EhwieuW1HtWwwSJ8PB3dDq/AJGR7EBce+1Jn/Fmeu1zPd5CWoCJbvAlEs8cQV4A==} + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -9274,6 +9182,10 @@ packages: pug@3.0.3: resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -9351,9 +9263,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} - react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -10009,9 +9918,6 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -10395,6 +10301,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -10470,9 +10379,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unraw@3.0.0: - resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} - unrs-resolver@1.7.0: resolution: {integrity: sha512-b76tVoT9KPniDY1GoYghDUQX20gjzXm/TONfHfgayLaiuo+oGyT9CsQkGCEJs+1/uryVBEOGOt3yYWDXbJhL7g==} @@ -11887,251 +11793,6 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@codemirror/autocomplete@6.18.6': - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - - '@codemirror/commands@6.8.1': - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - - '@codemirror/lang-angular@0.1.4': - dependencies: - '@codemirror/lang-html': 6.4.9 - '@codemirror/lang-javascript': 6.2.3 - '@codemirror/language': 6.11.0 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-cpp@6.0.2': - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/cpp': 1.1.3 - - '@codemirror/lang-css@6.3.1': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/css': 1.1.11 - - '@codemirror/lang-go@6.0.1': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/go': 1.0.0 - - '@codemirror/lang-html@6.4.9': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-css': 6.3.1 - '@codemirror/lang-javascript': 6.2.3 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/css': 1.1.11 - '@lezer/html': 1.3.10 - - '@codemirror/lang-java@6.0.1': - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/java': 1.1.3 - - '@codemirror/lang-javascript@6.2.3': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/lint': 6.8.5 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/javascript': 1.5.1 - - '@codemirror/lang-json@6.0.1': - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/json': 1.0.3 - - '@codemirror/lang-less@6.0.2': - dependencies: - '@codemirror/lang-css': 6.3.1 - '@codemirror/language': 6.11.0 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-liquid@6.2.3': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-html': 6.4.9 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-markdown@6.3.2': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-html': 6.4.9 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/markdown': 1.4.2 - - '@codemirror/lang-php@6.0.1': - dependencies: - '@codemirror/lang-html': 6.4.9 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/php': 1.0.2 - - '@codemirror/lang-python@6.2.0': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/python': 1.1.18 - - '@codemirror/lang-rust@6.0.1': - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/rust': 1.0.2 - - '@codemirror/lang-sass@6.0.2': - dependencies: - '@codemirror/lang-css': 6.3.1 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/sass': 1.0.7 - - '@codemirror/lang-sql@6.8.0': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-vue@0.1.3': - dependencies: - '@codemirror/lang-html': 6.4.9 - '@codemirror/lang-javascript': 6.2.3 - '@codemirror/language': 6.11.0 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-wast@6.0.2': - dependencies: - '@codemirror/language': 6.11.0 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@codemirror/lang-xml@6.1.0': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/xml': 1.0.6 - - '@codemirror/lang-yaml@6.1.2': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - '@lezer/yaml': 1.0.3 - - '@codemirror/language-data@6.5.1': - dependencies: - '@codemirror/lang-angular': 0.1.4 - '@codemirror/lang-cpp': 6.0.2 - '@codemirror/lang-css': 6.3.1 - '@codemirror/lang-go': 6.0.1 - '@codemirror/lang-html': 6.4.9 - '@codemirror/lang-java': 6.0.1 - '@codemirror/lang-javascript': 6.2.3 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lang-less': 6.0.2 - '@codemirror/lang-liquid': 6.2.3 - '@codemirror/lang-markdown': 6.3.2 - '@codemirror/lang-php': 6.0.1 - '@codemirror/lang-python': 6.2.0 - '@codemirror/lang-rust': 6.0.1 - '@codemirror/lang-sass': 6.0.2 - '@codemirror/lang-sql': 6.8.0 - '@codemirror/lang-vue': 0.1.3 - '@codemirror/lang-wast': 6.0.2 - '@codemirror/lang-xml': 6.1.0 - '@codemirror/lang-yaml': 6.1.2 - '@codemirror/language': 6.11.0 - '@codemirror/legacy-modes': 6.5.1 - - '@codemirror/language@6.11.0': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - style-mod: 4.1.2 - - '@codemirror/legacy-modes@6.5.1': - dependencies: - '@codemirror/language': 6.11.0 - - '@codemirror/lint@6.8.5': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - crelt: 1.0.6 - - '@codemirror/search@6.5.10': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - crelt: 1.0.6 - - '@codemirror/state@6.5.2': - dependencies: - '@marijn/find-cluster-break': 1.0.2 - - '@codemirror/theme-one-dark@6.1.2': - dependencies: - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@lezer/highlight': 1.2.1 - - '@codemirror/view@6.36.6': - dependencies: - '@codemirror/state': 6.5.2 - style-mod: 4.1.2 - w3c-keyname: 2.2.8 - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -12248,6 +11909,7 @@ snapshots: stylis: 4.2.0 transitivePeerDependencies: - supports-color + optional: true '@emotion/cache@11.14.0': dependencies: @@ -12256,6 +11918,7 @@ snapshots: '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 + optional: true '@emotion/css@11.13.5': dependencies: @@ -12266,30 +11929,13 @@ snapshots: '@emotion/utils': 1.4.2 transitivePeerDependencies: - supports-color + optional: true - '@emotion/hash@0.9.2': {} - - '@emotion/is-prop-valid@1.3.1': - dependencies: - '@emotion/memoize': 0.9.0 - - '@emotion/memoize@0.9.0': {} + '@emotion/hash@0.9.2': + optional: true - '@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@17.0.2) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - supports-color + '@emotion/memoize@0.9.0': + optional: true '@emotion/serialize@1.3.3': dependencies: @@ -12298,33 +11944,19 @@ snapshots: '@emotion/unitless': 0.10.0 '@emotion/utils': 1.4.2 csstype: 3.1.3 + optional: true - '@emotion/sheet@1.4.0': {} - - '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@17.0.2) - '@emotion/utils': 1.4.2 - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - supports-color - - '@emotion/unitless@0.10.0': {} + '@emotion/sheet@1.4.0': + optional: true - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@17.0.2)': - dependencies: - react: 17.0.2 + '@emotion/unitless@0.10.0': + optional: true - '@emotion/utils@1.4.2': {} + '@emotion/utils@1.4.2': + optional: true - '@emotion/weak-memoize@0.4.0': {} + '@emotion/weak-memoize@0.4.0': + optional: true '@esbuild/aix-ppc64@0.19.12': optional: true @@ -12548,12 +12180,6 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@floating-ui/dom': 1.6.13 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - '@floating-ui/react-dom@2.1.2(react-dom@19.2.0(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 1.6.13 @@ -12566,14 +12192,6 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@floating-ui/react@0.24.8(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - aria-hidden: 1.2.4 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - tabbable: 6.2.0 - '@floating-ui/react@0.24.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -12610,10 +12228,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@icons/material@0.2.4(react@17.0.2)': - dependencies: - react: 17.0.2 - '@icons/material@0.2.4(react@19.2.0)': dependencies: react: 19.2.0 @@ -13126,99 +12740,6 @@ snapshots: '@kurkle/color@0.3.4': {} - '@lezer/common@1.2.3': {} - - '@lezer/cpp@1.1.3': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/css@1.1.11': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/go@1.0.0': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/highlight@1.2.1': - dependencies: - '@lezer/common': 1.2.3 - - '@lezer/html@1.3.10': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/java@1.1.3': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/javascript@1.5.1': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/json@1.0.3': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/lr@1.4.2': - dependencies: - '@lezer/common': 1.2.3 - - '@lezer/markdown@1.4.2': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - - '@lezer/php@1.0.2': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/python@1.1.18': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/rust@1.0.2': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/sass@1.0.7': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/xml@1.0.6': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@lezer/yaml@1.0.3': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - '@linaria/core@4.2.10': dependencies: '@linaria/logger': 4.5.0 @@ -13259,19 +12780,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@lingui/core@4.14.1': - dependencies: - '@babel/runtime': 7.27.0 - '@lingui/message-utils': 4.14.1 - unraw: 3.0.0 - - '@lingui/detect-locale@4.14.1': {} - - '@lingui/message-utils@4.14.1': - dependencies: - '@messageformat/parser': 5.1.1 - js-sha256: 0.10.1 - '@ljharb/has-package-exports-patterns@0.0.2': {} '@manypkg/find-root@1.1.0': @@ -13290,12 +12798,6 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@marijn/find-cluster-break@1.0.2': {} - - '@messageformat/parser@5.1.1': - dependencies: - moo: 0.5.2 - '@mixmark-io/domino@2.2.0': {} '@mongodb-js/saslprep@1.2.2': @@ -13320,81 +12822,6 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@mui/core-downloads-tracker@5.17.1': {} - - '@mui/material@5.17.1(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@mui/core-downloads-tracker': 5.17.1 - '@mui/system': 5.17.1(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@mui/types': 7.2.24(@types/react@18.3.7) - '@mui/utils': 5.17.1(@types/react@18.3.7)(react@17.0.2) - '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.7) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - react-is: 19.1.0 - react-transition-group: 4.4.5(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@types/react': 18.3.7 - - '@mui/private-theming@5.17.1(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@mui/utils': 5.17.1(@types/react@18.3.7)(react@17.0.2) - prop-types: 15.8.1 - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - - '@mui/styled-engine@5.16.14(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/cache': 11.14.0 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 17.0.2 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - - '@mui/system@5.17.1(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@mui/private-theming': 5.17.1(@types/react@18.3.7)(react@17.0.2) - '@mui/styled-engine': 5.16.14(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(react@17.0.2) - '@mui/types': 7.2.24(@types/react@18.3.7) - '@mui/utils': 5.17.1(@types/react@18.3.7)(react@17.0.2) - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 17.0.2 - optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@types/react': 18.3.7 - - '@mui/types@7.2.24(@types/react@18.3.7)': - optionalDependencies: - '@types/react': 18.3.7 - - '@mui/utils@5.17.1(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@mui/types': 7.2.24(@types/react@18.3.7) - '@types/prop-types': 15.7.14 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 17.0.2 - react-is: 19.1.0 - optionalDependencies: - '@types/react': 18.3.7 - '@napi-rs/wasm-runtime@0.2.9': dependencies: '@emnapi/core': 1.4.3 @@ -13485,8 +12912,6 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@popperjs/core@2.11.8': {} - '@preact/signals-core@1.8.0': {} '@preact/signals@1.3.2(preact@10.26.5)': @@ -15170,24 +14595,6 @@ snapshots: transitivePeerDependencies: - jsdom - '@remirror/core-utils@3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@types/min-document': 2.19.2 - css-in-js-utils: 3.1.0 - get-dom-document: 0.1.3(jsdom@26.1.0) - min-document: 2.19.0 - parenthesis: 3.1.8 - optionalDependencies: - '@types/node': 18.19.87 - transitivePeerDependencies: - - jsdom - '@remirror/core@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 @@ -15204,22 +14611,6 @@ snapshots: - '@types/node' - jsdom - '@remirror/core@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - nanoevents: 5.1.13 - tiny-warning: 1.0.3 - transitivePeerDependencies: - - '@types/node' - - jsdom - '@remirror/dom@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 @@ -15231,17 +14622,6 @@ snapshots: - jsdom - supports-color - '@remirror/dom@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - '@remirror/preset-core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/extension-annotation@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 @@ -15254,43 +14634,41 @@ snapshots: - jsdom - supports-color - '@remirror/extension-annotation@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-bidi@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@types/direction': 1.0.0 + direction: 1.0.4 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-bidi@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-blockquote@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@types/direction': 1.0.0 - direction: 1.0.4 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-bidi@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-bold@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@types/direction': 1.0.0 - direction: 1.0.4 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-blockquote@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-callout@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15302,19 +14680,24 @@ snapshots: - jsdom - supports-color - '@remirror/extension-blockquote@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-code-block@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)(prettier@3.5.3)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) + '@types/refractor': 3.4.1 + refractor: 3.6.0 + optionalDependencies: + prettier: 3.5.3 transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/extension-bold@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-code@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15324,107 +14707,100 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-bold@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-collaboration@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-callout@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-columns@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-callout@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-diff@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-code-block@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)(prettier@3.5.3)': + '@remirror/extension-doc@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - '@types/refractor': 3.4.1 - refractor: 3.6.0 - optionalDependencies: - prettier: 3.5.3 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-code-block@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3)': + '@remirror/extension-drop-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - '@types/refractor': 3.4.1 - refractor: 3.6.0 - optionalDependencies: - prettier: 3.5.3 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-code@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-embed@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@types/querystringify': 2.0.2 + prosemirror-resizable-view: 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + querystringify: 2.2.0 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-code@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-emoji@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@ocavue/svgmoji-cjs': 0.1.1 + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) + emojibase: 6.1.0 + emojibase-data: 6.2.0(emojibase@6.1.0) + emojibase-regex: 6.0.1 + escape-string-regexp: 4.0.0 + svgmoji: 3.2.0 transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-codemirror6@2.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-entity-reference@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@codemirror/language': 6.11.0 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-collaboration@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-epic-mode@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15434,57 +14810,59 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-collaboration@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-events@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-columns@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-find@1.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: - '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@types/string.prototype.matchall': 4.0.4 + escape-string-regexp: 4.0.0 + string.prototype.matchall: 4.0.12 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-columns@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-font-family@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-diff@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-font-size@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + round: 2.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-diff@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-gap-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-doc@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-hard-break@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15494,17 +14872,17 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-doc@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-heading@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-drop-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-history@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15514,123 +14892,117 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-drop-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-horizontal-rule@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-embed@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-image@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@types/querystringify': 2.0.2 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) prosemirror-resizable-view: 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - querystringify: 2.2.0 transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-embed@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-italic@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@types/querystringify': 2.0.2 - prosemirror-resizable-view: 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - querystringify: 2.2.0 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-emoji@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-link@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@ocavue/svgmoji-cjs': 0.1.1 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - emojibase: 6.1.0 - emojibase-data: 6.2.0(emojibase@6.1.0) - emojibase-regex: 6.0.1 - escape-string-regexp: 4.0.0 - svgmoji: 3.2.0 + extract-domain: 2.2.1 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-emoji@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-list@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@ocavue/svgmoji-cjs': 0.1.1 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - emojibase: 6.1.0 - emojibase-data: 6.2.0(emojibase@6.1.0) - emojibase-regex: 6.0.1 - escape-string-regexp: 4.0.0 - svgmoji: 3.2.0 transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/extension-entity-reference@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-markdown@3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@types/marked': 4.3.2 + '@types/turndown': 5.0.5 + marked: 4.3.0 + turndown: 7.2.0 + turndown-plugin-gfm: 1.0.2 + optionalDependencies: + '@remirror/extension-react-tables': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-entity-reference@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-mention-atom@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/extension-epic-mode@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-mention@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + escape-string-regexp: 4.0.0 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-epic-mode@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-node-formatting@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-events@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-paragraph@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -15640,763 +15012,169 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-events@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-placeholder@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-find@1.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - '@types/string.prototype.matchall': 4.0.4 - escape-string-regexp: 4.0.0 - string.prototype.matchall: 4.0.12 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-find@1.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - '@types/string.prototype.matchall': 4.0.4 - escape-string-regexp: 4.0.0 - string.prototype.matchall: 4.0.12 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-font-family@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-font-family@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-font-size@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - round: 2.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-font-size@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - round: 2.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-gap-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-gap-cursor@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-hard-break@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-hard-break@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-heading@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-heading@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-history@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-history@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-horizontal-rule@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-horizontal-rule@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-image@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - prosemirror-resizable-view: 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-image@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - prosemirror-resizable-view: 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-italic@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-italic@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-link@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - extract-domain: 2.2.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-link@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - extract-domain: 2.2.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-list@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-list@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-markdown@3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@types/marked': 4.3.2 - '@types/turndown': 5.0.5 - marked: 4.3.0 - turndown: 7.2.0 - turndown-plugin-gfm: 1.0.2 - optionalDependencies: - '@remirror/extension-react-tables': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-markdown@3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2))(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@types/marked': 4.3.2 - '@types/turndown': 5.0.5 - marked: 4.3.0 - turndown: 7.2.0 - turndown-plugin-gfm: 1.0.2 - optionalDependencies: - '@remirror/extension-react-tables': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-mention-atom@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-mention-atom@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-mention@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - escape-string-regexp: 4.0.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-mention@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - escape-string-regexp: 4.0.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-node-formatting@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-node-formatting@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-paragraph@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-paragraph@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-placeholder@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-placeholder@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-positioner@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - nanoevents: 5.1.13 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-positioner@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - nanoevents: 5.1.13 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-react-component@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - nanoevents: 5.1.13 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - optional: true - - '@remirror/extension-react-component@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - nanoevents: 5.1.13 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/css': 11.13.5 - '@linaria/core': 4.2.10 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-tables': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/react-components': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - optionalDependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - '@types/react-dom' - - jsdom - - supports-color - optional: true - - '@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/css': 11.13.5 - '@linaria/core': 4.2.10 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-tables': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/react-components': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - optionalDependencies: - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - '@types/react-dom' - - jsdom - - supports-color - - '@remirror/extension-shortcuts@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-shortcuts@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-strike@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-strike@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-sub@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-sub@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-sup@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-sup@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - '@remirror/extension-tables@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/extension-tables@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-positioner@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) + nanoevents: 5.1.13 transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/extension-text-case@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-react-component@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/core-constants': 3.0.0 + '@remirror/core-helpers': 4.0.0 + '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) + '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + nanoevents: 5.1.13 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 transitivePeerDependencies: - '@types/node' - jsdom + optional: true - '@remirror/extension-text-case@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@emotion/css': 11.13.5 + '@linaria/core': 4.2.10 + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-tables': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/icons': 3.0.0 '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/react-components': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) + optionalDependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@types/node' + - '@types/react' + - '@types/react-dom' - jsdom + - supports-color + optional: true - '@remirror/extension-text-color@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-shortcuts@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - color2k: 2.0.3 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-text-color@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-strike@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - color2k: 2.0.3 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-text-highlight@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-sub@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) - '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-text-highlight@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-sup@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - - supports-color - '@remirror/extension-text@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-tables@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-text@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-text-case@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-trailing-node@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-text-color@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 + '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) + color2k: 2.0.3 transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-trailing-node@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-text-highlight@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) + '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom + - supports-color - '@remirror/extension-underline@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-text@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -16406,17 +15184,17 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-underline@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-trailing-node@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/extension-whitespace@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': + '@remirror/extension-underline@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) @@ -16426,27 +15204,16 @@ snapshots: - '@types/node' - jsdom - '@remirror/extension-whitespace@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': + '@remirror/extension-whitespace@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) + '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0) '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) '@remirror/pm': 3.0.1 transitivePeerDependencies: - '@types/node' - jsdom - '@remirror/i18n@3.0.0(@remirror/pm@3.0.1)': - dependencies: - '@babel/runtime': 7.27.0 - '@lingui/core': 4.14.1 - '@lingui/detect-locale': 4.14.1 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - make-plural: 6.2.2 - transitivePeerDependencies: - - '@remirror/pm' - '@remirror/icons@3.0.0': dependencies: '@babel/runtime': 7.27.0 @@ -16499,23 +15266,6 @@ snapshots: - jsdom - supports-color - '@remirror/preset-core@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-doc': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-gap-cursor': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-history': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-paragraph': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/preset-formatting@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16540,30 +15290,6 @@ snapshots: - jsdom - supports-color - '@remirror/preset-formatting@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bold': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-columns': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-font-size': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-heading': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-italic': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-node-formatting': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-strike': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sub': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sup': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-case': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-highlight': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-underline': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-whitespace': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/preset-react@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16583,24 +15309,6 @@ snapshots: - supports-color optional: true - '@remirror/preset-react@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-placeholder': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-react-component': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/pm': 3.0.1 - '@remirror/react-utils': 3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/preset-wysiwyg@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(jsdom@26.1.0)(prettier@3.5.3)': dependencies: '@babel/runtime': 7.27.0 @@ -16633,38 +15341,6 @@ snapshots: - prettier - supports-color - '@remirror/preset-wysiwyg@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bidi': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-blockquote': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bold': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code-block': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) - '@remirror/extension-drop-cursor': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-embed': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-find': 1.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-gap-cursor': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-hard-break': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-heading': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-horizontal-rule': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-image': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-italic': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-link': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-list': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-shortcuts': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-strike': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-trailing-node': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-underline': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - '@remirror/preset-core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - transitivePeerDependencies: - - '@types/node' - - jsdom - - prettier - - supports-color - '@remirror/react-components@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16695,35 +15371,6 @@ snapshots: - supports-color optional: true - '@remirror/react-components@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@floating-ui/react': 0.24.8(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-utils': 3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - '@seznam/compose-react-refs': 1.0.6 - '@types/react-color': 3.0.13(@types/react@18.3.7) - create-context-state: 2.0.3(@types/react@18.3.7)(react@17.0.2) - match-sorter: 6.3.4 - multishift: 2.0.10(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - react: 17.0.2 - react-color: 2.19.3(react@17.0.2) - react-dom: 19.2.0(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/react-core@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16751,63 +15398,6 @@ snapshots: - supports-color optional: true - '@remirror/react-core@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-react-component': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/pm': 3.0.1 - '@remirror/preset-core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/preset-react': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-renderer': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react@18.3.7)(jsdom@26.1.0)(react@17.0.2) - '@remirror/react-utils': 3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - '@seznam/compose-react-refs': 1.0.6 - fast-deep-equal: 3.1.3 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - resize-observer-polyfill: 1.5.1 - tiny-warning: 1.0.3 - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - - '@remirror/react-editors@2.0.3(@emotion/css@11.13.5)(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(prettier@3.5.3)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/extension-react-tables': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/i18n': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/react': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-ui': 1.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(prettier@3.5.3)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/styles': 3.0.0(@emotion/css@11.13.5)(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@svgmoji/noto': 3.2.0 - '@types/refractor': 3.4.1 - create-context-state: 2.0.3(@types/react@18.3.7)(react@17.0.2) - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - refractor: 3.6.0 - remirror: 3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2))(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) - svgmoji: 3.2.0 - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@emotion/css' - - '@emotion/react' - - '@emotion/styled' - - '@types/node' - - jsdom - - prettier - - styled-components - - supports-color - '@remirror/react-hooks@3.0.3(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16837,34 +15427,6 @@ snapshots: - supports-color optional: true - '@remirror/react-hooks@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/extension-emoji': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-history': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-mention': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-mention-atom': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/pm': 3.0.1 - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-utils': 3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - multishift: 2.0.10(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.7)(react@17.0.2) - use-previous: 1.2.0(@types/react@18.3.7)(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - transitivePeerDependencies: - - '@types/node' - - jsdom - - supports-color - '@remirror/react-renderer@3.0.2(@remirror/pm@3.0.1)(@types/node@17.0.21)(@types/react@18.3.7)(jsdom@26.1.0)(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16878,78 +15440,6 @@ snapshots: - jsdom optional: true - '@remirror/react-renderer@3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react@18.3.7)(jsdom@26.1.0)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - '@remirror/pm' - - '@types/node' - - jsdom - - '@remirror/react-ui@1.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(prettier@3.5.3)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@mui/material': 5.17.1(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@mui/system': 5.17.1(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-blockquote': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bold': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-callout': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code-block': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) - '@remirror/extension-columns': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-find': 1.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-font-size': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-heading': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-history': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-horizontal-rule': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-italic': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-list': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-node-formatting': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-strike': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sub': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sup': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-tables': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-underline': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-whitespace': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/messages': 3.0.0(@remirror/pm@3.0.1) - '@remirror/pm': 3.0.1 - '@remirror/react-components': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@types/node' - - jsdom - - prettier - - supports-color - - '@remirror/react-utils@3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - '@remirror/pm' - '@remirror/react-utils@3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@19.2.0)': dependencies: '@babel/runtime': 7.27.0 @@ -16958,44 +15448,10 @@ snapshots: '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) react: 19.2.0 optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - '@remirror/pm' - optional: true - - '@remirror/react@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/extension-placeholder': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-react-component': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/preset-react': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-components': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-core': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-hooks': 3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2) - '@remirror/react-renderer': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react@18.3.7)(jsdom@26.1.0)(react@17.0.2) - '@remirror/react-utils': 3.0.0(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2) - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - transitivePeerDependencies: - - '@remirror/pm' - - '@types/node' - - jsdom - - supports-color - - '@remirror/styles@3.0.0(@emotion/css@11.13.5)(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2)': - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-helpers': 4.0.0 - '@types/react': 18.3.7 - optionalDependencies: - '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(@types/react@18.3.7)(react@17.0.2) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.7)(react@17.0.2))(@types/react@18.3.7)(react@17.0.2) - react: 17.0.2 + '@types/react': 18.3.7 + transitivePeerDependencies: + - '@remirror/pm' + optional: true '@remirror/theme@3.0.0(@remirror/pm@3.0.1)': dependencies: @@ -17079,7 +15535,8 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@seznam/compose-react-refs@1.0.6': {} + '@seznam/compose-react-refs@1.0.6': + optional: true '@shelf/jest-mongodb@5.2.2(@aws-sdk/credential-providers@3.797.0)(jest-environment-node@29.7.0)(mongodb@6.16.0(@aws-sdk/credential-providers@3.797.0)(socks@2.8.4))(socks@2.8.4)': dependencies: @@ -17495,6 +15952,221 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 + '@tiptap/core@3.10.8(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-blockquote@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-bold@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-bubble-menu@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@floating-ui/dom': 1.6.13 + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-bullet-list@3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extension-list': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-code-block-lowlight@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/extension-code-block@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(highlight.js@11.11.1)(lowlight@2.9.0)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/extension-code-block': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + highlight.js: 11.11.1 + lowlight: 2.9.0 + + '@tiptap/extension-code-block@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-code@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-document@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-dropcursor@3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extensions': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-floating-menu@3.10.8(@floating-ui/dom@1.6.13)(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@floating-ui/dom': 1.6.13 + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + optional: true + + '@tiptap/extension-gapcursor@3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extensions': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-hard-break@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-heading@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-highlight@3.11.0(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-horizontal-rule@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-image@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-italic@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-link@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extension-list': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-list-keymap@3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extension-list': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-ordered-list@3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extension-list': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-paragraph@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-placeholder@3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/extensions': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + + '@tiptap/extension-strike@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-table@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/extension-text@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extension-underline@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + + '@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/pm@3.10.8': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.5.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.1 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.7.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.2) + prosemirror-transform: 1.10.4 + prosemirror-view: 1.39.2 + + '@tiptap/react@3.10.8(@floating-ui/dom@1.6.13)(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 17.0.2 + react-dom: 19.2.0(react@17.0.2) + use-sync-external-store: 1.5.0(react@17.0.2) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-floating-menu': 3.10.8(@floating-ui/dom@1.6.13)(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/starter-kit@3.10.8': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/extension-blockquote': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-bold': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-bullet-list': 3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-code': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-code-block': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-document': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-dropcursor': 3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-gapcursor': 3.10.8(@tiptap/extensions@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-hard-break': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-heading': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-horizontal-rule': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-italic': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-link': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-list': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/extension-list-item': 3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-list-keymap': 3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-ordered-list': 3.10.8(@tiptap/extension-list@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)) + '@tiptap/extension-paragraph': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-strike': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-text': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extension-underline': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8)) + '@tiptap/extensions': 3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + + '@tiptap/static-renderer@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tiptap/static-renderer@3.10.8(@tiptap/core@3.10.8(@tiptap/pm@3.10.8))(@tiptap/pm@3.10.8)(react-dom@19.2.0(react@17.0.2))(react@17.0.2)': + dependencies: + '@tiptap/core': 3.10.8(@tiptap/pm@3.10.8) + '@tiptap/pm': 3.10.8 + react: 17.0.2 + react-dom: 19.2.0(react@17.0.2) + '@tootallnate/once@2.0.0': {} '@tsconfig/node10@1.0.11': {} @@ -17651,12 +16323,21 @@ snapshots: '@types/json5@0.0.30': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/marked@4.3.2': {} '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.11 + '@types/mdurl@2.0.0': {} + '@types/mime@1.3.5': {} '@types/min-document@2.19.2': {} @@ -17699,7 +16380,8 @@ snapshots: '@types/object.pick@1.3.4': {} - '@types/parse-json@4.0.2': {} + '@types/parse-json@4.0.2': + optional: true '@types/parse5@6.0.3': {} @@ -17719,15 +16401,12 @@ snapshots: dependencies: '@types/react': 18.3.7 '@types/reactcss': 1.2.13(@types/react@18.3.7) + optional: true '@types/react-dom@18.3.0': dependencies: '@types/react': 18.3.7 - '@types/react-transition-group@4.4.12(@types/react@18.3.7)': - dependencies: - '@types/react': 18.3.7 - '@types/react@18.3.7': dependencies: '@types/prop-types': 15.7.14 @@ -17736,6 +16415,7 @@ snapshots: '@types/reactcss@1.2.13(@types/react@18.3.7)': dependencies: '@types/react': 18.3.7 + optional: true '@types/refractor@3.4.1': dependencies: @@ -17768,6 +16448,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.6': {} + '@types/webidl-conversions@7.0.3': {} '@types/whatwg-url@11.0.5': @@ -18231,6 +16913,7 @@ snapshots: '@babel/runtime': 7.27.0 '@types/throttle-debounce': 2.1.0 throttle-debounce: 3.0.1 + optional: true abab@2.0.6: {} @@ -18627,6 +17310,7 @@ snapshots: '@babel/runtime': 7.27.0 cosmiconfig: 7.1.0 resolve: 1.22.10 + optional: true babel-plugin-module-resolver@4.1.0: dependencies: @@ -18945,16 +17629,6 @@ snapshots: co@4.6.0: {} - codemirror@6.0.2: - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 - '@codemirror/language': 6.11.0 - '@codemirror/lint': 6.8.5 - '@codemirror/search': 6.5.10 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.36.6 - collect-v8-coverage@1.0.2: {} color-convert@2.0.1: @@ -19015,7 +17689,8 @@ snapshots: normalize-path: 3.0.0 readable-stream: 3.6.2 - compute-scroll-into-view@1.0.20: {} + compute-scroll-into-view@1.0.20: + optional: true concat-map@0.0.1: {} @@ -19030,7 +17705,8 @@ snapshots: content-type@1.0.5: {} - convert-source-map@1.9.0: {} + convert-source-map@1.9.0: + optional: true convert-source-map@2.0.0: {} @@ -19051,6 +17727,7 @@ snapshots: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + optional: true crc-32@1.2.2: {} @@ -19059,13 +17736,6 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-context-state@2.0.3(@types/react@18.3.7)(react@17.0.2): - dependencies: - '@babel/runtime': 7.27.0 - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - create-context-state@2.0.3(@types/react@18.3.7)(react@19.2.0): dependencies: '@babel/runtime': 7.27.0 @@ -20139,6 +18809,10 @@ snapshots: dependencies: reusify: 1.1.0 + fault@2.0.1: + dependencies: + format: 0.2.2 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -20187,7 +18861,8 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 - find-root@1.1.0: {} + find-root@1.1.0: + optional: true find-up@3.0.0: dependencies: @@ -20241,6 +18916,8 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 + format@0.2.2: {} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -20540,9 +19217,9 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 + highlight.js@11.11.1: {} + + highlight.js@11.8.0: {} html-encoding-sniffer@3.0.0: dependencies: @@ -21397,8 +20074,6 @@ snapshots: js-base64@3.7.8: {} - js-sha256@0.10.1: {} - js-stringify@1.0.2: {} js-tokens@4.0.0: {} @@ -21573,6 +20248,12 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + lint-staged@15.5.1: dependencies: chalk: 5.4.1 @@ -21623,7 +20304,8 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + lodash-es@4.17.21: + optional: true lodash._baseiteratee@4.7.0: dependencies: @@ -21706,12 +20388,22 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowlight@2.9.0: + dependencies: + '@types/hast': 2.3.10 + fault: 2.0.1 + highlight.js: 11.8.0 + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lucide-react@0.544.0(react@17.0.2): + dependencies: + react: 17.0.2 + lucide-react@0.544.0(react@18.3.1): dependencies: react: 18.3.1 @@ -21746,12 +20438,19 @@ snapshots: make-error@1.3.6: {} - make-plural@6.2.2: {} - makeerror@1.0.12: dependencies: tmpl: 1.0.5 + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} marked@15.0.12: {} @@ -21767,7 +20466,8 @@ snapshots: dependencies: escape-string-regexp: 4.0.0 - material-colors@1.2.6: {} + material-colors@1.2.6: + optional: true math-intrinsics@1.1.0: {} @@ -21897,6 +20597,8 @@ snapshots: dependencies: '@types/mdast': 3.0.15 + mdurl@2.0.0: {} + media-typer@0.3.0: {} medialit@0.1.0: @@ -22277,8 +20979,6 @@ snapshots: - socks - supports-color - moo@0.5.2: {} - mpath@0.9.0: {} mquery@5.0.0: @@ -22311,22 +21011,6 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 - multishift@2.0.10(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@17.0.2): - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@seznam/compose-react-refs': 1.0.6 - a11y-status: 2.0.2 - compute-scroll-into-view: 1.0.20 - react: 17.0.2 - tiny-warning: 1.0.3 - w3c-keyname: 2.2.8 - optionalDependencies: - '@types/react': 18.3.7 - transitivePeerDependencies: - - '@remirror/pm' - multishift@2.0.10(@remirror/pm@3.0.1)(@types/react@18.3.7)(react@19.2.0): dependencies: '@babel/runtime': 7.27.0 @@ -22946,6 +21630,10 @@ snapshots: property-information@6.5.0: {} + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.4 + prosemirror-collab@1.3.1: dependencies: prosemirror-state: 1.4.3 @@ -22986,6 +21674,19 @@ snapshots: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.1 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.4.1 + prosemirror-state: 1.4.3 + prosemirror-model@1.25.1: dependencies: orderedmap: 2.1.1 @@ -23012,17 +21713,9 @@ snapshots: - '@types/node' - jsdom - prosemirror-resizable-view@3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0): + prosemirror-schema-basic@1.2.4: dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) prosemirror-model: 1.25.1 - prosemirror-view: 1.39.2 - transitivePeerDependencies: - - '@remirror/pm' - - '@types/node' - - jsdom prosemirror-schema-list@1.5.1: dependencies: @@ -23151,6 +21844,8 @@ snapshots: pug-runtime: 3.0.1 pug-strip-comments: 2.0.0 + punycode.js@2.3.1: {} + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -23191,17 +21886,6 @@ snapshots: chart.js: 4.4.9 react: 19.2.0 - react-color@2.19.3(react@17.0.2): - dependencies: - '@icons/material': 0.2.4(react@17.0.2) - lodash: 4.17.21 - lodash-es: 4.17.21 - material-colors: 1.2.6 - prop-types: 15.8.1 - react: 17.0.2 - reactcss: 1.2.3(react@17.0.2) - tinycolor2: 1.6.0 - react-color@2.19.3(react@19.2.0): dependencies: '@icons/material': 0.2.4(react@19.2.0) @@ -23247,8 +21931,6 @@ snapshots: react-is@18.3.1: {} - react-is@19.1.0: {} - react-remove-scroll-bar@2.3.8(@types/react@18.3.7)(react@18.3.1): dependencies: react: 18.3.1 @@ -23311,15 +21993,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.7 - react-transition-group@4.4.5(react-dom@19.2.0(react@17.0.2))(react@17.0.2): - dependencies: - '@babel/runtime': 7.27.0 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 17.0.2 - react-dom: 19.2.0(react@17.0.2) - react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.27.0 @@ -23340,11 +22013,6 @@ snapshots: react@19.2.0: {} - reactcss@1.2.3(react@17.0.2): - dependencies: - lodash: 4.17.21 - react: 17.0.2 - reactcss@1.2.3(react@19.2.0): dependencies: lodash: 4.17.21 @@ -23590,79 +22258,6 @@ snapshots: - jsdom - supports-color - remirror@3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2))(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3): - dependencies: - '@babel/runtime': 7.27.0 - '@remirror/core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/core-constants': 3.0.0 - '@remirror/core-helpers': 4.0.0 - '@remirror/core-types': 3.0.0(@remirror/pm@3.0.1) - '@remirror/core-utils': 3.0.0(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/dom': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-annotation': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bidi': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-blockquote': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-bold': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-callout': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-code-block': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) - '@remirror/extension-collaboration': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-columns': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-diff': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-doc': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-drop-cursor': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-embed': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-emoji': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-entity-reference': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-epic-mode': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-events': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-find': 1.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-font-family': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-font-size': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-gap-cursor': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-hard-break': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-heading': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-history': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-horizontal-rule': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-image': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-italic': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-link': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-list': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-markdown': 3.0.3(@remirror/extension-react-tables@3.0.3(@remirror/pm@3.0.1)(@types/node@18.19.87)(@types/react-dom@18.3.0)(@types/react@18.3.7)(jsdom@26.1.0)(react-dom@19.2.0(react@17.0.2))(react@17.0.2))(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-mention': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-mention-atom': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-node-formatting': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-paragraph': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-placeholder': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-positioner': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-shortcuts': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-strike': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sub': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-sup': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-tables': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-case': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-color': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-text-highlight': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-trailing-node': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-underline': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/extension-whitespace': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/icons': 3.0.0 - '@remirror/pm': 3.0.1 - '@remirror/preset-core': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/preset-formatting': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0) - '@remirror/preset-wysiwyg': 3.0.2(@remirror/pm@3.0.1)(@types/node@18.19.87)(jsdom@26.1.0)(prettier@3.5.3) - '@remirror/theme': 3.0.0(@remirror/pm@3.0.1) - '@types/refractor': 3.4.1 - refractor: 3.6.0 - optionalDependencies: - prettier: 3.5.3 - transitivePeerDependencies: - - '@remirror/extension-react-tables' - - '@types/node' - - jsdom - - supports-color - remove-accents@0.5.0: {} require-directory@2.1.1: {} @@ -23671,7 +22266,8 @@ snapshots: reselect@4.1.8: {} - resize-observer-polyfill@1.5.1: {} + resize-observer-polyfill@1.5.1: + optional: true resolve-cwd@3.0.0: dependencies: @@ -24119,7 +22715,8 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.5.7: {} + source-map@0.5.7: + optional: true source-map@0.6.1: {} @@ -24294,8 +22891,6 @@ snapshots: strnum@1.1.2: optional: true - style-mod@4.1.2: {} - styled-jsx@5.1.6(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -24312,7 +22907,8 @@ snapshots: '@babel/core': 7.26.10 babel-plugin-macros: 3.1.0 - stylis@4.2.0: {} + stylis@4.2.0: + optional: true sucrase@3.35.0: dependencies: @@ -24364,7 +22960,8 @@ snapshots: '@pkgr/core': 0.1.2 tslib: 2.8.1 - tabbable@6.2.0: {} + tabbable@6.2.0: + optional: true tailwind-merge@2.6.0: {} @@ -24513,7 +23110,8 @@ snapshots: tiny-warning@1.0.3: {} - tinycolor2@1.6.0: {} + tinycolor2@1.6.0: + optional: true tinyglobby@0.2.13: dependencies: @@ -24907,6 +23505,8 @@ snapshots: typescript@5.9.3: {} + uc.micro@2.1.0: {} + uglify-js@3.19.3: optional: true @@ -25001,8 +23601,6 @@ snapshots: unpipe@1.0.0: {} - unraw@3.0.0: {} - unrs-resolver@1.7.0: dependencies: napi-postinstall: 0.1.6 @@ -25054,12 +23652,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.7 - use-isomorphic-layout-effect@1.2.0(@types/react@18.3.7)(react@17.0.2): - dependencies: - react: 17.0.2 - optionalDependencies: - '@types/react': 18.3.7 - use-isomorphic-layout-effect@1.2.0(@types/react@18.3.7)(react@19.2.0): dependencies: react: 19.2.0 @@ -25067,13 +23659,6 @@ snapshots: '@types/react': 18.3.7 optional: true - use-previous@1.2.0(@types/react@18.3.7)(react@17.0.2): - dependencies: - react: 17.0.2 - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.7)(react@17.0.2) - transitivePeerDependencies: - - '@types/react' - use-previous@1.2.0(@types/react@18.3.7)(react@19.2.0): dependencies: react: 19.2.0 @@ -25098,6 +23683,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.7 + use-sync-external-store@1.5.0(react@17.0.2): + dependencies: + react: 17.0.2 + use-sync-external-store@1.5.0(react@18.3.1): dependencies: react: 18.3.1