diff --git a/apps/frontend/src/app/global.scss b/apps/frontend/src/app/global.scss index 38b11cff..70fe681a 100644 --- a/apps/frontend/src/app/global.scss +++ b/apps/frontend/src/app/global.scss @@ -531,3 +531,11 @@ html[dir='rtl'] [dir='ltr'] { // padding: 0 !important; //} // + +.ProseMirror { + font-family: Arial; +} + +.ProseMirror:focus { + outline: none; +} \ No newline at end of file diff --git a/apps/frontend/src/components/launches/ai.video.tsx b/apps/frontend/src/components/launches/ai.video.tsx index 699c20a1..65200636 100644 --- a/apps/frontend/src/components/launches/ai.video.tsx +++ b/apps/frontend/src/components/launches/ai.video.tsx @@ -248,7 +248,7 @@ export const AiVideo: FC<{ {data.map((p: any) => (
  • {p.title} diff --git a/apps/frontend/src/components/launches/generator/generator.tsx b/apps/frontend/src/components/launches/generator/generator.tsx index 9d531215..e126c296 100644 --- a/apps/frontend/src/components/launches/generator/generator.tsx +++ b/apps/frontend/src/components/launches/generator/generator.tsx @@ -166,7 +166,15 @@ const FirstStep: FC = (props) => { mutate={reloadCalendarView} date={dayjs.utc(load.date).local()} reopenModal={() => ({})} - onlyValues={messages} + onlyValues={messages.map((p: any) => { + return { + ...p, + content: p.content + .split('\n') + .map((line: string) => `

    ${line}

    `) + .join(''), + }; + })} /> ), size: '80%', diff --git a/apps/frontend/src/components/new-launch/bold.text.tsx b/apps/frontend/src/components/new-launch/bold.text.tsx index 14617649..5f0f7662 100644 --- a/apps/frontend/src/components/new-launch/bold.text.tsx +++ b/apps/frontend/src/components/new-launch/bold.text.tsx @@ -75,17 +75,9 @@ export const BoldText: FC<{ currentValue: string; }> = ({ editor }) => { const mark = () => { - const selectedText = Editor.string(editor, editor.selection); - const newText = Array.from( - !selectedText ? prompt('What do you want to write?') || '' : selectedText - ) - .map((char) => { - // @ts-ignore - return originalMap?.[char] || reverseMap?.[char] || char; - }) - .join(''); - Transforms.insertText(editor, newText); - ReactEditor.focus(editor); + editor.commands.unsetUnderline(); + editor.commands.toggleBold(); + editor.commands.focus(); }; return (
    { + // For example, toggle bold while removing underline + this.editor.commands.unsetUnderline(); + return this.editor.commands.toggleBold(); + }, + }; + }, +}); + +const InterceptUnderlineShortcut = Extension.create({ + name: 'preventUnderlineWithUnderline', + + addKeyboardShortcuts() { + return { + 'Mod-u': () => { + // For example, toggle bold while removing underline + this.editor.commands.unsetBold(); + return this.editor.commands.toggleUnderline(); + }, + }; + }, +}); + +const Span = Node.create({ + name: 'mention', + + inline: true, + group: 'inline', + selectable: false, + atom: true, + + addAttributes() { + return { + linkedinId: { + default: null, + }, + label: { + default: '', + }, + }; + }, + + parseHTML() { + return [ + { + tag: 'span[data-linkedin-id]', + }, + ]; + }, + + renderHTML({ HTMLAttributes }) { + return [ + 'span', + mergeAttributes(HTMLAttributes, { + 'data-linkedin-id': HTMLAttributes.linkedinId, + class: 'mention', + }), + `@${HTMLAttributes.label}`, + ]; + }, + + addNodeView() { + return ({ HTMLAttributes }) => { + const span = document.createElement('span'); + span.classList.add('mention'); + span.dataset.linkedinId = HTMLAttributes.linkedinId; + span.innerText = `@${HTMLAttributes.label}`; + return { dom: span }; + }; + }, +}); + export const EditorWrapper: FC<{ totalPosts: number; value: string; @@ -435,28 +526,65 @@ export const Editor: FC<{ const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }); + const editor = useEditor({ + extensions: [ + Document, + Paragraph, + Text, + Underline, + Bold, + InterceptBoldShortcut, + InterceptUnderlineShortcut, + Span, + ], + content: props.value || '', + shouldRerenderOnTransaction: true, + immediatelyRender: false, + onUpdate: (innerProps) => { + props?.onChange?.(innerProps.editor.getHTML()); + }, + }); + + const valueWithoutHtml = useMemo(() => { + return stripHtmlValidation(props.value || ''); + }, [props.value]); + const addText = useCallback( (emoji: string) => { - setTimeout(() => { - // @ts-ignore - Transforms.insertText(newRef?.current?.editor!, emoji); - }, 10); + editor?.commands.insertContent(emoji); + editor?.commands.focus(); }, [props.value, id] ); + + const addLinkedinTag = useCallback((text: string) => { + const id = text.split('(')[1].split(')')[0]; + const name = text.split('[')[1].split(']')[0]; + + editor + ?.chain() + .focus() + .insertContent({ + type: 'mention', + attrs: { + linkedinId: id, + label: `@${name}`, + }, + }) + .run(); + }, []); + + if (!editor) { + return null; + } + return (
    - - - + + +
    setEmojiPickerOpen(!emojiPickerOpen)} @@ -464,7 +592,7 @@ export const Editor: FC<{ {'\uD83D\uDE00'}
    {identifier === 'linkedin' || identifier === 'linkedin-page' ? ( - + ) : null}
    @@ -479,12 +607,14 @@ export const Editor: FC<{
    -
    - {validateChars && props.value.length === 0 && pictures?.length === 0 && ( -
    - Your post should have at least one character or one image. -
    - )} +
    + {validateChars && + props.value.length === 0 && + pictures?.length === 0 && ( +
    + Your post should have at least one character or one image. +
    + )}
    Drop your files here to upload
    - 1 && '!max-h-80' - )} - value={props.value} - onChange={(e) => { - props?.onChange?.(e.target.value); - }} - onPaste={paste} - placeholder={t('write_your_reply', 'Write your post...')} - autosuggestionsConfig={{ - textareaPurpose: `Assist me in writing social media posts.`, - chatApiConfigs: { - suggestionsApiConfig: { - maxTokens: 20, - stop: ['.', '?', '!'], - }, - }, - disabled: user?.tier?.ai ? !autoComplete : true, - }} - /> +
    + +
    -
    +
    { + if (editor?.isFocused) { + return; + } + editor?.commands?.focus('end'); + }} + >
    -
    +
    { + if (editor?.isFocused) { + return; + } + editor?.commands?.focus('end'); + }} + > {setImages && ( props.totalChars && '!text-red-500' + valueWithoutHtml.length > props.totalChars && '!text-red-500' )} > - {props?.value?.length}/{props.totalChars} + {valueWithoutHtml.length}/{props.totalChars}
    )}
    diff --git a/apps/frontend/src/components/new-launch/finisher/thread.finisher.tsx b/apps/frontend/src/components/new-launch/finisher/thread.finisher.tsx index 0090bf29..e959c4c8 100644 --- a/apps/frontend/src/components/new-launch/finisher/thread.finisher.tsx +++ b/apps/frontend/src/components/new-launch/finisher/thread.finisher.tsx @@ -40,7 +40,7 @@ export const ThreadFinisher = () => { />
    -
    +
    = (props) => { const notEnoughChars = checkAllValid.filter((p: any) => { return p.values.some((a: any) => { return ( - countCharacters(a.content, p?.integration?.identifier || '') === - 0 && a.media?.length === 0 + countCharacters( + stripHtmlValidation(a.content), + p?.integration?.identifier || '' + ) === 0 && a.media?.length === 0 ); }); }); diff --git a/apps/frontend/src/components/new-launch/u.text.tsx b/apps/frontend/src/components/new-launch/u.text.tsx index 6ea6acae..7c6d2a17 100644 --- a/apps/frontend/src/components/new-launch/u.text.tsx +++ b/apps/frontend/src/components/new-launch/u.text.tsx @@ -75,20 +75,9 @@ export const UText: FC<{ currentValue: string; }> = ({ editor }) => { const mark = () => { - const selectedText = Editor.string(editor, editor.selection); - const setUnderline = selectedText.indexOf('̲') === -1; - const newText = Array.from( - !selectedText - ? prompt('What do you want to write?') || '' - : selectedText.replace(/̲/g, '') - ) - .map((char) => { - // @ts-ignore - return ((setUnderline ? underlineMap?.[char] : reverseMap?.[char]) || char); - }) - .join(''); - Transforms.insertText(editor, newText); - ReactEditor.focus(editor); + editor.commands.unsetBold(); + editor.commands.toggleUnderline(); + editor.commands.focus(); }; return (
    { - Transforms.insertText(editor, '\n' + val); + editor?.commands.insertContent("\n\n" + val); + editor?.commands.focus(); setShowModal(false); }; return ( diff --git a/libraries/helpers/src/utils/strip.html.validation.ts b/libraries/helpers/src/utils/strip.html.validation.ts new file mode 100644 index 00000000..6d1df7f4 --- /dev/null +++ b/libraries/helpers/src/utils/strip.html.validation.ts @@ -0,0 +1,166 @@ +import striptags from 'striptags'; + +const bold = { + a: '𝗮', + b: '𝗯', + c: '𝗰', + d: '𝗱', + e: '𝗲', + f: '𝗳', + g: '𝗴', + h: '𝗵', + i: '𝗶', + j: '𝗷', + k: '𝗸', + l: '𝗹', + m: '𝗺', + n: '𝗻', + o: '𝗼', + p: '𝗽', + q: '𝗾', + r: '𝗿', + s: '𝘀', + t: '𝘁', + u: '𝘂', + v: '𝘃', + w: '𝘄', + x: '𝘅', + y: '𝘆', + z: '𝘇', + A: '𝗔', + B: '𝗕', + C: '𝗖', + D: '𝗗', + E: '𝗘', + F: '𝗙', + G: '𝗚', + H: '𝗛', + I: '𝗜', + J: '𝗝', + K: '𝗞', + L: '𝗟', + M: '𝗠', + N: '𝗡', + O: '𝗢', + P: '𝗣', + Q: '𝗤', + R: '𝗥', + S: '𝗦', + T: '𝗧', + U: '𝗨', + V: '𝗩', + W: '𝗪', + X: '𝗫', + Y: '𝗬', + Z: '𝗭', + '1': '𝟭', + '2': '𝟮', + '3': '𝟯', + '4': '𝟰', + '5': '𝟱', + '6': '𝟲', + '7': '𝟳', + '8': '𝟴', + '9': '𝟵', + '0': '𝟬', +}; + +const underlineMap = { + a: 'a̲', + b: 'b̲', + c: 'c̲', + d: 'd̲', + e: 'e̲', + f: 'f̲', + g: 'g̲', + h: 'h̲', + i: 'i̲', + j: 'j̲', + k: 'k̲', + l: 'l̲', + m: 'm̲', + n: 'n̲', + o: 'o̲', + p: 'p̲', + q: 'q̲', + r: 'r̲', + s: 's̲', + t: 't̲', + u: 'u̲', + v: 'v̲', + w: 'w̲', + x: 'x̲', + y: 'y̲', + z: 'z̲', + A: 'A̲', + B: 'B̲', + C: 'C̲', + D: 'D̲', + E: 'E̲', + F: 'F̲', + G: 'G̲', + H: 'H̲', + I: 'I̲', + J: 'J̲', + K: 'K̲', + L: 'L̲', + M: 'M̲', + N: 'N̲', + O: 'O̲', + P: 'P̲', + Q: 'Q̲', + R: 'R̲', + S: 'S̲', + T: 'T̲', + U: 'U̲', + V: 'V̲', + W: 'W̲', + X: 'X̲', + Y: 'Y̲', + Z: 'Z̲', + '1': '1̲', + '2': '2̲', + '3': '3̲', + '4': '4̲', + '5': '5̲', + '6': '6̲', + '7': '7̲', + '8': '8̲', + '9': '9̲', + '0': '0̲', +}; + +export const stripHtmlValidation = (value: string, replaceBold = false): string => { + const html = (value || '') + .replace(/ /gi, ' ') + .replace(/^]*>/i, '') + .replace(/]*>/gi, '\n') + .replace(/<\/p>/gi, ''); + + if (replaceBold) { + return striptags(convertToAscii(html)); + } + + // Strip all other tags + return striptags(html); +}; + +export const convertToAscii = (value: string): string => { + return value + .replace(/(.+?)<\/strong>/gi, (match, p1) => { + const replacer = p1.split('').map((char: string) => { + // @ts-ignore + return bold?.[char] || char; + }); + + return match.replace(p1, replacer.join('')); + }) + .replace(/(.+?)<\/u>/gi, (match, p1) => { + const replacer = p1.split('').map((char: string) => { + // @ts-ignore + return underlineMap?.[char] || char; + }); + + return match.replace(p1, replacer.join('')); + }); +}; diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 4ebdfd68..d2f8140a 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -36,6 +36,7 @@ import { Readable } from 'stream'; import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; +import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; dayjs.extend(utc); type PostWithConditionals = Post & { @@ -466,7 +467,7 @@ export class PostsService { await Promise.all( (newPosts || []).map(async (p) => ({ id: p.id, - message: p.content, + message: stripHtmlValidation(p.content, true), settings: JSON.parse(p.settings || '{}'), media: await this.updateMedia( p.id, diff --git a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts index 3f5d67c4..7c3cd67c 100644 --- a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts @@ -24,6 +24,7 @@ import sharp from 'sharp'; import { Plug } from '@gitroom/helpers/decorators/plug.decorator'; import { timer } from '@gitroom/helpers/utils/timer'; import axios from 'axios'; +import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; async function reduceImageBySize(url: string, maxSizeKB = 976) { try { @@ -311,13 +312,13 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { if (postDetails?.[0]?.settings?.active_thread_finisher) { const rt = new RichText({ - text: postDetails?.[0]?.settings?.thread_finisher, + text: stripHtmlValidation(postDetails?.[0]?.settings?.thread_finisher, true), }); await rt.detectFacets(agent); await agent.post({ - text: postDetails?.[0]?.settings?.thread_finisher, + text: stripHtmlValidation(rt.text, true), facets: rt.facets, createdAt: new Date().toISOString(), embed: { @@ -458,7 +459,7 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { if (getThread.data.thread.post?.likeCount >= +fields.likesAmount) { await timer(2000); const rt = new RichText({ - text: fields.post, + text: stripHtmlValidation(fields.post, true), }); await agent.post({ diff --git a/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts b/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts index 809d1e84..dca5a974 100644 --- a/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/threads.provider.ts @@ -12,6 +12,7 @@ import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.ab import { capitalize, chunk } from 'lodash'; import { Plug } from '@gitroom/helpers/decorators/plug.decorator'; import { Integration } from '@prisma/client'; +import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; export class ThreadsProvider extends SocialAbstract implements SocialProvider { identifier = 'threads'; @@ -499,7 +500,7 @@ export class ThreadsProvider extends SocialAbstract implements SocialProvider { const form = new FormData(); form.append('media_type', 'TEXT'); - form.append('text', fields.post); + form.append('text', stripHtmlValidation(fields.post, true)); form.append('reply_to_id', id); form.append('access_token', integration.token); diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index c0637035..d3039438 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -16,6 +16,7 @@ import { timer } from '@gitroom/helpers/utils/timer'; import { PostPlug } from '@gitroom/helpers/decorators/post.plug'; import dayjs from 'dayjs'; import { uniqBy } from 'lodash'; +import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; export class XProvider extends SocialAbstract implements SocialProvider { identifier = 'x'; @@ -149,7 +150,7 @@ export class XProvider extends SocialAbstract implements SocialProvider { await timer(2000); await client.v2.tweet({ - text: fields.post, + text: stripHtmlValidation(fields.post, true), reply: { in_reply_to_tweet_id: id }, }); return true; diff --git a/package.json b/package.json index 528e88bf..492e4f99 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,14 @@ "@swc/helpers": "0.5.13", "@sweetalert2/theme-dark": "^5.0.16", "@tailwindcss/postcss": "^4.1.7", + "@tiptap/extension-bold": "^3.0.6", + "@tiptap/extension-document": "^3.0.6", + "@tiptap/extension-paragraph": "^3.0.6", + "@tiptap/extension-text": "^3.0.6", + "@tiptap/extension-underline": "^3.0.6", + "@tiptap/pm": "^3.0.6", + "@tiptap/react": "^3.0.6", + "@tiptap/starter-kit": "^3.0.6", "@types/bcrypt": "^5.0.2", "@types/concat-stream": "^2.0.3", "@types/facebook-nodejs-business-sdk": "^20.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1000bea..5af5a684 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,30 @@ importers: '@tailwindcss/postcss': specifier: ^4.1.7 version: 4.1.11 + '@tiptap/extension-bold': + specifier: ^3.0.6 + version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-document': + specifier: ^3.0.6 + version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-paragraph': + specifier: ^3.0.6 + version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-text': + specifier: ^3.0.6 + version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-underline': + specifier: ^3.0.6 + version: 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/pm': + specifier: ^3.0.6 + version: 3.0.6 + '@tiptap/react': + specifier: ^3.0.6 + version: 3.0.6(@floating-ui/dom@1.7.2)(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/starter-kit': + specifier: ^3.0.6 + version: 3.0.6 '@types/bcrypt': specifier: ^5.0.2 version: 5.0.2 @@ -4270,6 +4294,9 @@ packages: peerDependencies: '@redis/client': ^1.0.0 + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@reown/appkit-common@1.7.2': resolution: {integrity: sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==} @@ -5393,6 +5420,153 @@ packages: '@types/react': optional: true + '@tiptap/core@3.0.6': + resolution: {integrity: sha512-dqAQCKb/++6lFub4q7fcIFTNDLRLR5ZQWDL23OxQYW2oXV+EppNZROlFoSOLYOykqVbtvQ7xp+Ja3aZou3hZJg==} + peerDependencies: + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-blockquote@3.0.6': + resolution: {integrity: sha512-hNDFTfh27Zglc887tCqZBlpFdAKZcA5lAO0VOYXp0Rt9ckpcduX8rQZ0HByiovZqrQ9AEsIR0p1yihjWORhXzA==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-bold@3.0.6': + resolution: {integrity: sha512-NjZl5R9rxoxDl1uGTY3q8+ZTqgrBvkXlPs7jvjZXcv9WFYlnageAlpjDSxxPJhUe4o9ZMuERcIV7ui4HD05z9Q==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-bubble-menu@3.0.6': + resolution: {integrity: sha512-hL4SLHmErrAWAKFFaTB+8f49ZYtKuega7SDOkwXUI5dcyphpyFknI0qV9x1vvHIveFxSsDFadvaWkBq5Q/jQhQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-bullet-list@3.0.6': + resolution: {integrity: sha512-psY+ZlC0hp1HCqNgZgpdyQkWlIQlhpgxXMs/NqyrH4zM62ds4531QIpbltvFqLVFLk8/KkKW5X5T1spfndzfUQ==} + peerDependencies: + '@tiptap/extension-list': ^3.0.6 + + '@tiptap/extension-code-block@3.0.6': + resolution: {integrity: sha512-iYdzqi8L9VYGnFJ2JQ6oI5ErTSPTbELSbyXzLkiMM5/+lv/miOCFyRxpf7gCAefzRgahh7pgDYczngf7siG/3g==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-code@3.0.6': + resolution: {integrity: sha512-7310bV2UU2Kt/9W4TYarlYU9muM9M9Vv7Gd0hVpID7cAztiTG4pUaTsNt2IFCuhnIaslmcuGtv70eldkylgEdw==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-document@3.0.6': + resolution: {integrity: sha512-NeDsgGNfwGbuoSot75bvCXyIFZqRCvPP68iZm+WVJXJq5SZ7L3T/PAf02aFz/4gvUntmtKwL/ZUj7jjt1Ap2Uw==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-dropcursor@3.0.6': + resolution: {integrity: sha512-eNJL6KNHK2OkSWr9lzJZfMZ1d8OI9xz3wV36vc4nLDFnJdRkLKMZAbF5fCGG+80yNcEULwChgiRgxizS6TMZeg==} + peerDependencies: + '@tiptap/extensions': ^3.0.6 + + '@tiptap/extension-floating-menu@3.0.6': + resolution: {integrity: sha512-HXmuRSrTVPtxBTbg+MZdevoNbPsHo9Yv0zg/k3zVP30FylMmdC6a9V8sqTu3sSiX3Of1pEsJ3/P1xWonnhFhTA==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-gapcursor@3.0.6': + resolution: {integrity: sha512-i9flYYMHbGJUiPcbutfk6L5fsnJsrJwv9XpQEiP3Bl2rCcOe3HdF+1Chvk/FuGfvbQov9voO8P86RvBhkI/y8g==} + peerDependencies: + '@tiptap/extensions': ^3.0.6 + + '@tiptap/extension-hard-break@3.0.6': + resolution: {integrity: sha512-fLn1QeyyHOO4RVND5J43LdBp99Ejemrm+SPtrysfczDZvbsHKM05/OjZOg+f7QxcwcXyItYp35xmHCayxs+tFA==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-heading@3.0.6': + resolution: {integrity: sha512-umcsnc4IEacQjlnl7d/IaiFsVA5xG993VvnUG5fK08TOuy0yrliOqXsFGp4czGnRLBEh2zfXMMK+vnm2fuk5zw==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-horizontal-rule@3.0.6': + resolution: {integrity: sha512-we803tmjQc7SIxw05DNCjrVg6e+eM8bJNM9qPTU4Uo2PkJxvGPshhhfvCz5wchz2ohL3zjEUKJ1FCB6j6iL2nA==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-italic@3.0.6': + resolution: {integrity: sha512-Gv773wa94utRWf+6rkqLiPLedny3Wy/gs4OJ3snU2McWslfqCWCVVB82RK6PlcbNtvDb/rfLj0utqaJX30V4Tg==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-link@3.0.6': + resolution: {integrity: sha512-BQZNnXx52jncbWrS60PXCtL7kYewA9j4XuYj6U+V943mjmXE+pJ8KczF1YZRmbU7YRLRLrGOtMrSUC8ioJpq6Q==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-list-item@3.0.6': + resolution: {integrity: sha512-gu3WJ+7GhIi7gPQuaD59Si1oXjBJHKt9wndLKHjYgzlQZb8pfHvix7MqkdSrF/wY+5ScYm2bZToCZku2baoAJw==} + peerDependencies: + '@tiptap/extension-list': ^3.0.6 + + '@tiptap/extension-list-keymap@3.0.6': + resolution: {integrity: sha512-uBPMmrukntNhhKaUsNuagWFvHm0v4lZdINZlsEwZkgqlKC03JDcN/VmKwSzCuV1sQXddWaIdZcpjVm5uD+LxHQ==} + peerDependencies: + '@tiptap/extension-list': ^3.0.6 + + '@tiptap/extension-list@3.0.6': + resolution: {integrity: sha512-pg4R8cjUSMKuMjfOJexFt961U0UDUXfChXQh7PI7BCRCxLAtUvm2l0kGg4OMXiM1PM/ylTApdtUDal0gdOuSrQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/extension-ordered-list@3.0.6': + resolution: {integrity: sha512-9SbeGO6kGKoX8GwhaSgpFNCGxlzfGu5otK5DE+Unn5F8/gIYGBJkXTZE1tj8XzPmH6lWhmKJQPudANnW6yuKqg==} + peerDependencies: + '@tiptap/extension-list': ^3.0.6 + + '@tiptap/extension-paragraph@3.0.6': + resolution: {integrity: sha512-2R1lNHGhPR3yxDEq6Mzto8ihk958AwCdhuEXGUOrXcphmomoFR9gfokJMUiVcQhmkCvh+0nrf8NChS/VygLuPQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-strike@3.0.6': + resolution: {integrity: sha512-f2TVfdU/wIES87P1v9NRuD3oNcAelg+YhXfPFpJTXaojyqU/6Img90HnoDPcx+5Od3+JUBSj4efr0RKX6SvXqQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-text@3.0.6': + resolution: {integrity: sha512-5jZTzaafLV0eQNwOrGZyqdhgF7PP3+Hrl1CUwL0f5m7guTrdvbx/ATNzQX6iIuJMp2MFwl03mgKcmb1APaDmHQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extension-underline@3.0.6': + resolution: {integrity: sha512-ndBuYwC1TyvDWjmnpPXDv9pTOozAjnZvJLdJ/eegqyqkKYkmqJHZm7pjwUAmtZBWJUGGi4c5RFlINxEFCOFKRQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + + '@tiptap/extensions@3.0.6': + resolution: {integrity: sha512-rrTFjX3JoaRj/eEFR+8rYiiqOcCWDBIfFPLcb6TIvj+mo2kLp3QtbuhjqSSkpUxxn/hcVj7iwa5c4n33IyQ8lA==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + + '@tiptap/pm@3.0.6': + resolution: {integrity: sha512-bbOHDApNHUTEBEhfA1WA9A+PGs/bUD7/E5CpPvh4C+24PLxk1PfY5yOuzh+UGGHFUNTyBWwkgUZPNP7PRVcoDg==} + + '@tiptap/react@3.0.6': + resolution: {integrity: sha512-RUH8Gj0OVk2tFP0h4cGLnZT4qE912bP+Yt1hcYYBcQ1mJLfL6XVxQj7Wegs7ow3db4YdDif7Rq6cjf8IcwKUPQ==} + peerDependencies: + '@tiptap/core': ^3.0.6 + '@tiptap/pm': ^3.0.6 + 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.0.6': + resolution: {integrity: sha512-7xqcx5hwa+o0J6vpqJRSQNxKHOO6/vSwwicmaHxZ4zdGtlUjJrdreeYaaUpCf0wvpBT1DAQlRnancuD6DJkkPg==} + '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} @@ -5631,12 +5805,18 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash@4.17.20': resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} '@types/luxon@3.4.2': resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/md5@2.3.5': resolution: {integrity: sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw==} @@ -5646,6 +5826,9 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} @@ -5783,6 +5966,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/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -7517,6 +7703,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -10271,6 +10460,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.1: + resolution: {integrity: sha512-DRSlB9DKVW04c4SUdGvKK5FR6be45lTU9M76JnngqPeeGDqPwYc0zdUErtsNVMtxPXgUWV4HbXbnC4sNyBxkYg==} + lit-element@4.2.0: resolution: {integrity: sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==} @@ -10501,6 +10696,10 @@ packages: map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -10589,6 +10788,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + 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'} @@ -11433,6 +11635,9 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + os-filter-obj@2.0.0: resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} engines: {node: '>=4'} @@ -11933,6 +12138,64 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + + prosemirror-inputrules@1.5.0: + resolution: {integrity: sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + 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.2: + resolution: {integrity: sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q==} + + 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==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-tables@1.7.1: + resolution: {integrity: sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.4: + resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} + + prosemirror-view@1.40.0: + resolution: {integrity: sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -11975,6 +12238,10 @@ packages: pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -12653,6 +12920,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -13811,6 +14081,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -14296,6 +14569,9 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -19187,6 +19463,8 @@ snapshots: dependencies: '@redis/client': 1.6.1 + '@remirror/core-constants@3.0.0': {} + '@reown/appkit-common@1.7.2(bufferutil@4.0.9)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 @@ -20850,6 +21128,181 @@ snapshots: optionalDependencies: '@types/react': 18.3.1 + '@tiptap/core@3.0.6(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/pm': 3.0.6 + + '@tiptap/extension-blockquote@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-bold@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-bubble-menu@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@floating-ui/dom': 1.7.2 + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + optional: true + + '@tiptap/extension-bullet-list@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-code-block@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + + '@tiptap/extension-code@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-document@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-dropcursor@3.0.6(@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extensions': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-floating-menu@3.0.6(@floating-ui/dom@1.7.2)(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@floating-ui/dom': 1.7.2 + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + optional: true + + '@tiptap/extension-gapcursor@3.0.6(@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extensions': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-hard-break@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-heading@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-horizontal-rule@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + + '@tiptap/extension-italic@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-link@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + linkifyjs: 4.3.1 + + '@tiptap/extension-list-item@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-list-keymap@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + + '@tiptap/extension-ordered-list@3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + + '@tiptap/extension-paragraph@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-strike@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-text@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extension-underline@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + + '@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + + '@tiptap/pm@3.0.6': + 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.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.2 + 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.2)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + '@tiptap/react@3.0.6(@floating-ui/dom@1.7.2)(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-floating-menu': 3.0.6(@floating-ui/dom@1.7.2)(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/starter-kit@3.0.6': + dependencies: + '@tiptap/core': 3.0.6(@tiptap/pm@3.0.6) + '@tiptap/extension-blockquote': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-bold': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-bullet-list': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-code': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-code-block': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-document': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-dropcursor': 3.0.6(@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-gapcursor': 3.0.6(@tiptap/extensions@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-hard-break': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-heading': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-horizontal-rule': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-italic': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-link': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/extension-list-item': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-list-keymap': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-ordered-list': 3.0.6(@tiptap/extension-list@3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6)) + '@tiptap/extension-paragraph': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-strike': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-text': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extension-underline': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6)) + '@tiptap/extensions': 3.0.6(@tiptap/core@3.0.6(@tiptap/pm@3.0.6))(@tiptap/pm@3.0.6) + '@tiptap/pm': 3.0.6 + '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.1(supports-color@5.5.0) @@ -21177,10 +21630,17 @@ snapshots: dependencies: '@types/node': 18.16.9 + '@types/linkify-it@5.0.0': {} + '@types/lodash@4.17.20': {} '@types/luxon@3.4.2': {} + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/md5@2.3.5': {} '@types/mdast@3.0.15': @@ -21191,6 +21651,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/mime-types@2.1.4': {} '@types/mime@1.3.5': {} @@ -21335,6 +21797,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.6': {} + '@types/uuid@10.0.0': {} '@types/uuid@8.3.4': {} @@ -23817,6 +24281,8 @@ snapshots: create-require@1.1.1: {} + crelt@1.0.6: {} + cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -27418,6 +27884,12 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.1: {} + lit-element@4.2.0: dependencies: '@lit-labs/ssr-dom-shim': 1.3.0 @@ -27623,6 +28095,15 @@ snapshots: map-or-similar@1.5.0: {} + 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: {} marky@1.3.0: {} @@ -27852,6 +28333,8 @@ snapshots: mdn-data@2.0.30: {} + mdurl@2.0.0: {} + media-typer@0.3.0: {} media-typer@1.1.0: {} @@ -29001,6 +29484,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + orderedmap@2.1.1: {} + os-filter-obj@2.0.0: dependencies: arch: 2.2.0 @@ -29567,6 +30052,109 @@ snapshots: property-information@7.1.0: {} + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.4 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.3 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + prosemirror-gapcursor@1.3.2: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + + prosemirror-history@1.4.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.0: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + + prosemirror-keymap@1.2.3: + dependencies: + 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.2 + + 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.2: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.2 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.25.2 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + prosemirror-tables@1.7.1: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.2)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + + prosemirror-transform@1.10.4: + dependencies: + prosemirror-model: 1.25.2 + + prosemirror-view@1.40.0: + dependencies: + prosemirror-model: 1.25.2 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + proto-list@1.2.4: {} protobufjs@7.5.3: @@ -29636,6 +30224,8 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@1.4.1: {} punycode@2.3.1: {} @@ -30534,6 +31124,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.44.2 fsevents: 2.3.3 + rope-sequence@1.3.4: {} + router@2.2.0: dependencies: debug: 4.4.1(supports-color@5.5.0) @@ -31879,6 +32471,8 @@ snapshots: typescript@5.5.4: {} + uc.micro@2.1.0: {} + ufo@1.6.1: {} uid@2.0.2: @@ -32394,6 +32988,8 @@ snapshots: void-elements@3.1.0: {} + w3c-keyname@2.2.8: {} + w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0