diff --git a/apps/web/src/app/(private)/projects/[projectId]/versions/[commitUuid]/documents/[documentUuid]/_components/DocumentEditor/Editor/BlocksEditor/index.tsx b/apps/web/src/app/(private)/projects/[projectId]/versions/[commitUuid]/documents/[documentUuid]/_components/DocumentEditor/Editor/BlocksEditor/index.tsx index 2c9afb7db..f53cc3fb2 100644 --- a/apps/web/src/app/(private)/projects/[projectId]/versions/[commitUuid]/documents/[documentUuid]/_components/DocumentEditor/Editor/BlocksEditor/index.tsx +++ b/apps/web/src/app/(private)/projects/[projectId]/versions/[commitUuid]/documents/[documentUuid]/_components/DocumentEditor/Editor/BlocksEditor/index.tsx @@ -1,13 +1,15 @@ -import { memo, Suspense } from 'react' +import { memo, Suspense, useState } from 'react' import { AstError } from '@latitude-data/constants/simpleBlocks' import { TextEditorPlaceholder } from '@latitude-data/web-ui/molecules/TextEditorPlaceholder' import { AnyBlock } from '@latitude-data/constants/simpleBlocks' -import { CodeBlock } from '@latitude-data/web-ui/atoms/CodeBlock' +import { + type JSONContent, + BlocksEditor, +} from '@latitude-data/web-ui/molecules/BlocksEditor' export const PlaygroundBlocksEditor = memo( ({ value: _prompt, - blocks = [], }: { compileErrors: AstError[] | undefined blocks: AnyBlock[] | undefined @@ -17,12 +19,153 @@ export const PlaygroundBlocksEditor = memo( readOnlyMessage?: string onChange: (value: string) => void }) => { - if (!blocks.length) return null + const [localBlocks, setLocalBlocks] = useState([ + { + type: 'message', + attrs: { + role: 'system', + }, + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'This is my initial system message', + }, + ], + }, + ], + }, + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'Hi, I am {{ name }}, and I am also a system message', + }, + ], + }, + { + type: 'paragraph', + content: [ + { + type: 'prompt', + attrs: { + id: 'prompt-block-1', + path: 'latitude-extract', + attributes: { + location: '{{thing}}', + }, + // errors: [{ message: 'Path is required' }], + }, + }, + ], + }, + { + type: 'step', + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: "I'm inside a step", + }, + ], + }, + { + type: 'paragraph', + content: [ + { + type: 'prompt', + attrs: { + id: 'prompt-block-2', + path: 'weather-prompt', + }, + }, + ], + }, + { + type: 'message', + attrs: { + role: 'user', + }, + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'What is the weather like in {{ location }}?', + }, + ], + }, + { + type: 'codeBlock', + attrs: { + language: 'promptl', + }, + content: [ + { + type: 'text', + text: `{{for cities in ['Barcelona', 'Madrid']}} + {{city}} is a city in Spain. +{{ endof }}`, + }, + ], + }, + ], + }, + ], + }, + { + type: 'message', + attrs: { + role: 'assistant', + }, + content: [ + { + type: 'paragraph', + content: [ + { + type: 'text', + text: 'Hello! How can I assist you today?', + }, + ], + }, + ], + }, + { + type: 'codeBlock', + attrs: { + language: 'promptl', + }, + content: [ + { + type: 'text', + text: `{{if location == 'Barcelona'}} + + + /* This is a comment */ + Is a sunny place with nice weather and good food. {{location}} + + +{{ endif }}`, + }, + ], + }, + ]) + + console.log('LOCAL_BLOCKS', localBlocks) return ( }> - Blocks Editor - {JSON.stringify(blocks, null, 2)} + ) }, diff --git a/packages/constants/src/simpleBlocks/index.ts b/packages/constants/src/simpleBlocks/index.ts index 559e94936..33f0b9a4a 100644 --- a/packages/constants/src/simpleBlocks/index.ts +++ b/packages/constants/src/simpleBlocks/index.ts @@ -1,3 +1,3 @@ -export type { AnyBlock, AstError } from './types' +export type { AnyBlock, AstError, MessageBlockType } from './types' export * from './astToSimpleBlocks' export * from './simpleBlocksToText' diff --git a/packages/web-ui/package.json b/packages/web-ui/package.json index abf7713bd..78c3596fd 100644 --- a/packages/web-ui/package.json +++ b/packages/web-ui/package.json @@ -73,6 +73,7 @@ "./molecules/CollapsibleBox": "./src/ds/molecules/CollapsibleBox/index.tsx", "./molecules/DocumentChange": "./src/ds/molecules/DocumentChange/index.tsx", "./molecules/DocumentTextEditor": "./src/ds/molecules/DocumentTextEditor/index.tsx", + "./molecules/BlocksEditor": "./src/ds/molecules/BlocksEditor/index.tsx", "./molecules/EditableText": "./src/ds/molecules/EditableText/index.tsx", "./molecules/ErrorComponent": "./src/ds/molecules/ErrorComponent/index.tsx", "./molecules/FakeProgress": "./src/ds/molecules/FakeProgress/index.tsx", @@ -141,12 +142,24 @@ "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-toast": "^1.2.6", "@radix-ui/react-tooltip": "^1.1.8", + "@tiptap/core": "3.0.0-beta.8", + "@tiptap/extension-code-block-lowlight": "3.0.0-beta.10", + "@tiptap/extension-document": "3.0.0-beta.10", + "@tiptap/extension-drag-handle-react": "3.0.0-beta.10", + "@tiptap/extension-dropcursor": "3.0.0-beta.10", + "@tiptap/extension-paragraph": "3.0.0-beta.10", + "@tiptap/extension-placeholder": "3.0.0-beta.10", + "@tiptap/extension-text": "3.0.0-beta.8", + "@tiptap/pm": "3.0.0-beta.8", + "@tiptap/react": "3.0.0-beta.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^3.6.0", + "highlight.js": "^11.11.1", "hsl-to-hex": "^1.0.0", "lodash-es": "^4.17.21", + "lowlight": "^3.3.0", "lucide-react": "^0.468.0", "monaco-editor": "^0.50.0", "next-themes": "^0.3.0", @@ -162,6 +175,8 @@ "remark-gfm": "^4.0.1", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", + "tiptap-extension-auto-joiner": "^0.1.3", + "tiptap-extension-global-drag-handle": "^0.1.18", "use-debounce": "^10.0.4", "zod": "catalog:", "zustand": "^4.5.6" diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/BaseNodeView/index.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/BaseNodeView/index.tsx new file mode 100644 index 000000000..5449e353f --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/BaseNodeView/index.tsx @@ -0,0 +1,65 @@ +import { ReactNode, JSX } from 'react' +import { NodeViewProps } from '@tiptap/react' +import { AnyBlock } from '@latitude-data/constants/simpleBlocks' +import { NodeViewWrapper } from '@tiptap/react' +import { cn } from '../../../../../lib/utils' + +type Error = + T extends Array ? U : never + +type BaseAttrs = { + id: string + errors?: Error[] +} + +export type TypedNodeViewProps = Omit & { + node: Omit & { + attrs: BaseAttrs & Attr + } +} + +export function BaseNodeView({ + children, + errors = [], + as, + className, + draggable = true, +}: { + children: ReactNode + errors?: Error[] + className?: string + as?: string + draggable?: boolean +}) { + // {draggable ? ( + //
+ // + //
+ // ) : null} + + return ( + + {children} + + {/* FIXME: Style errors in a nice way */} + {errors?.length > 0 ? ( +
+ {errors.map((err: Error, i: number) => ( +
{err.message}
+ ))} +
+ ) : null} +
+ ) +} + +export function withNodeViewProps( + Component: (props: TypedNodeViewProps) => JSX.Element, +) { + return function Wrapped(props: NodeViewProps) { + return + } +} diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/View.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/View.tsx new file mode 100644 index 000000000..4c707acf1 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/View.tsx @@ -0,0 +1,33 @@ +import { NodeViewContent } from '@tiptap/react' +import { MessageBlockType } from '@latitude-data/constants/simpleBlocks' +import { + BaseNodeView, + TypedNodeViewProps, + withNodeViewProps, +} from '../../BaseNodeView' +import { Badge } from '../../../../../atoms/Badge' +import { roleToString, roleVariant } from '../../../../ChatWrapper' + +type Props = TypedNodeViewProps<{ role: MessageBlockType }> +export type Attr = Props['node']['attrs'] + +function View({ node }: Props) { + const role = node.attrs.role + const label = roleToString(role) + const variant = roleVariant(role) + return ( + +
+ {label} +
+
+
+
+ +
+
+ + ) +} + +export default withNodeViewProps(View) diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/index.ts b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/index.ts new file mode 100644 index 000000000..c40abb984 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/MessageReference/index.ts @@ -0,0 +1,36 @@ +import { Node, mergeAttributes } from '@tiptap/core' +import { ReactNodeViewRenderer } from '@tiptap/react' +import View, { type Attr } from './View' + +export const MessageReference = Node.create({ + name: 'message', + group: 'block', + content: 'block+', + inline: false, + atom: false, + isolating: true, + draggable: true, + + addAttributes() { + return { + id: { default: () => crypto.randomUUID() }, + role: { default: 'system' }, + } + }, + + parseHTML() { + return [{ tag: 'div[data-type="message"]' }] + }, + + renderHTML({ HTMLAttributes }) { + return [ + 'div', + mergeAttributes(HTMLAttributes, { 'data-type': 'message' }), + 0, + ] + }, + + addNodeView() { + return ReactNodeViewRenderer(View) + }, +}) diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/View.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/View.tsx new file mode 100644 index 000000000..32dc69421 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/View.tsx @@ -0,0 +1,35 @@ +import { + BaseNodeView, + TypedNodeViewProps, + withNodeViewProps, +} from '../../BaseNodeView' +import { Icon } from '../../../../../atoms/Icons' +import { Text } from '../../../../../atoms/Text' + +export type Attr = { path: string; attributes?: Record } +type Props = TypedNodeViewProps + +function View({ node, updateAttributes: _ua }: Props) { + // TODO: Implement the logic to handle changes in attributes + // const _onChangeAttribute = useCallback( + // ({ name, value }: { name: string; value: string }) => { + // updateAttributes({ + // attributes: { ...node.attrs.attributes, [name]: value }, + // }) + // }, + // [updateAttributes, node.attrs.attributes], + // ) + + return ( + + + {node.attrs.path} + + ) +} + +export default withNodeViewProps(View) diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/index.ts b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/index.ts new file mode 100644 index 000000000..33f627098 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/PromptReference/index.ts @@ -0,0 +1,28 @@ +import { Node } from '@tiptap/core' +import { ReactNodeViewRenderer } from '@tiptap/react' +import View, { type Attr } from './View' + +export const PROMPT_REF_ID = 'prompt' +export const PromptReference = Node.create({ + name: PROMPT_REF_ID, + group: 'inline', + inline: true, + atom: true, + + addAttributes() { + return { + id: { default: () => crypto.randomUUID() }, + errors: { default: [] }, + path: { default: '' }, + attributes: { default: {} }, + } + }, + + renderHTML({ HTMLAttributes }) { + return ['span', { ...HTMLAttributes, 'data-type': PROMPT_REF_ID }] + }, + + addNodeView() { + return ReactNodeViewRenderer(View) + }, +}) diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/View.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/View.tsx new file mode 100644 index 000000000..2cd39e0db --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/View.tsx @@ -0,0 +1,29 @@ +import { NodeViewContent } from '@tiptap/react' +import { + BaseNodeView, + TypedNodeViewProps, + withNodeViewProps, +} from '../../BaseNodeView' +import { Text } from '../../../../../atoms/Text' + +type Props = TypedNodeViewProps<{ as: string; isolated: boolean }> +export type Attr = Props['node']['attrs'] + +function View({ node }: Props) { + // TODO: Handle update of these attributes + // Also show an indication if the step has extra configuration like the `schema`, `temperature`, `model`... + const { as: _as, isolated: _isolated } = node.attrs + + return ( + +
+
+ step +
+
+ +
+ ) +} + +export default withNodeViewProps(View) diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/index.ts b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/index.ts new file mode 100644 index 000000000..fd6a251c5 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/extensions/StepReference/index.ts @@ -0,0 +1,35 @@ +import { Node, mergeAttributes } from '@tiptap/core' +import { ReactNodeViewRenderer } from '@tiptap/react' +import View, { type Attr } from './View' + +export const StepReference = Node.create({ + name: 'step', + group: 'block', + content: 'block+', + inline: false, + atom: false, + isolating: true, + draggable: true, + + addAttributes() { + return { + id: { default: () => crypto.randomUUID() }, + errors: { default: [] }, + as: { default: null }, + isolated: { default: false }, + } + }, + + parseHTML() { + return [{ tag: 'div[data-type="step"]' }] + }, + + renderHTML({ HTMLAttributes }) { + return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'step' }), 0] + }, + + addNodeView() { + return ReactNodeViewRenderer(View) + }, +}) + diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/index.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/index.tsx new file mode 100644 index 000000000..d8f8baa03 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/Editor/index.tsx @@ -0,0 +1,109 @@ +import React, { useRef, useState } from 'react' +import { useEditor, EditorContent } from '@tiptap/react' +import Document from '@tiptap/extension-document' +import Text from '@tiptap/extension-text' +import Paragraph from '@tiptap/extension-paragraph' +import Placeholder from '@tiptap/extension-placeholder' +import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight' +import DragHandle from '@tiptap/extension-drag-handle-react' +import { Dropcursor } from '@tiptap/extension-dropcursor' +import GlobalDragHandle from 'tiptap-extension-global-drag-handle' +import AutoJoiner from 'tiptap-extension-auto-joiner' // optional + +import { cn } from '../../../../lib/utils' + +import { BlocksEditorProps, JSONContent } from '../types' +import { PromptReference } from './extensions/PromptReference' +import { StepReference } from './extensions/StepReference' +import { MessageReference } from './extensions/MessageReference' +import { initLowLight } from '../syntax/promptlSyntax' +import { Icon } from '../../../atoms/Icons' +import { recalculateColors } from '../../../../lib/monacoEditor/language' + +function ensureTrailingParagraph(content: JSONContent[] = []): JSONContent[] { + const last = content[content.length - 1] + if (!last || last.type !== 'paragraph') { + return [...content, { type: 'paragraph', content: [] }] + } + return content +} +const lowlight = initLowLight() + +export function BlocksEditor({ + onUpdate, + placeholder, + editable = true, + content, +}: BlocksEditorProps) { + const [colors] = useState(recalculateColors()) + const ref = useRef(null) + const editor = useEditor({ + immediatelyRender: false, + onDrop: (event) => { + console.log('Drop event:', event) + }, + extensions: [ + // Root Document is mandatory + Document.configure({ content: 'block+' }), + Paragraph, + Text, + CodeBlockLowlight.configure({ + lowlight, + defaultLanguage: 'promptl', + HTMLAttributes: { + class: 'bg-backgroundCode border border-border rounded-sm p-2', + }, + }), + Dropcursor.configure({ width: 2, color: colors.primary }), + Placeholder.configure({ + placeholder, + includeChildren: true, + showOnlyCurrent: true, + emptyEditorClass: 'is-editor-empty', + emptyNodeClass: 'is-empty-node', + }), + GlobalDragHandle, + AutoJoiner, + + // Latitude extensions + PromptReference, + StepReference, + MessageReference, + ], + content: { + type: 'doc', + content: ensureTrailingParagraph(content), + }, + editable, + onUpdate: ({ editor }) => { + const json = editor.getJSON() + onUpdate(json.content) + }, + editorProps: { + attributes: { + class: cn( + 'py-4 latitude-blocks-editor space-y-3', + '[&_p]:text-muted-foreground', + 'font-mono text-sm leading-tight whitespace-pre outline-none', + '[&_.is-empty-node]:before:content-[attr(data-placeholder)]', + '[&_.is-empty-node]:before:text-muted-foreground/60', + '[&_.is-empty-node]:pointer-events-none', + '[&_.is-empty-node]:before:absolute', + ), + 'data-placeholder': placeholder, + }, + }, + }) + + return ( +
+ {editor ? ( + + + + + ) : null} + +
+ ) +} diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/index.tsx b/packages/web-ui/src/ds/molecules/BlocksEditor/index.tsx new file mode 100644 index 000000000..393ec8389 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/index.tsx @@ -0,0 +1,28 @@ +'use client' + +import React, { lazy } from 'react' + +import { TextEditorPlaceholder } from '../TextEditorPlaceholder' +import { BlocksEditorProps, JSONContent } from './types' +import { ClientOnly } from '../../atoms/ClientOnly' + +const LazyBlocksEditor = lazy(() => + import('./Editor/index').then( + (module) => + ({ + default: module.BlocksEditor, + }) as { + default: React.ComponentType + }, + ), +) + +function EditorWrapper(props: BlocksEditorProps) { + return ( + + + + ) +} + +export { EditorWrapper as BlocksEditor, TextEditorPlaceholder, type JSONContent } diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/syntax/promptlSyntax.ts b/packages/web-ui/src/ds/molecules/BlocksEditor/syntax/promptlSyntax.ts new file mode 100644 index 000000000..2b968e984 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/syntax/promptlSyntax.ts @@ -0,0 +1,66 @@ +import type { HLJSApi, Language } from 'highlight.js' +import { createLowlight } from 'lowlight' + +function definePromptl(hljs: HLJSApi): Language { + const TEMPLATE_EXPR = { + begin: /\{\{/, + end: /\}\}/, + className: 'template-tag', + contains: [ + { + className: 'template-brace', + begin: /\{\{|\}\}/, + }, + { + className: 'keyword', + begin: /\b(if|for|else|elseif|endif|endfor|unless|endunless)\b/, + }, + { + className: 'variable', + begin: /\b[a-zA-Z_][\w-]*\b/, + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + hljs.NUMBER_MODE, + ], + } + + return { + name: 'promptl', + contains: [ + // HTML-like tags like + { + className: 'tag', + begin: /<\/?[\w-]+>/, + }, + + // Comments like /* ... */ + { + className: 'comment', + begin: /\/\*/, + end: /\*\//, + contains: [ + { + begin: /[^*]+/, // match inner text of the comment + } + ] + }, + + // Template blocks like {{ location }} + TEMPLATE_EXPR, + + // Optional fallback: regular text + { + begin: /[^\s<{\n][^\n]*/, + className: 'text', + }, + ], + } +} + + +export function initLowLight() { + const lowlight = createLowlight() + lowlight.register('promptl', definePromptl) + return lowlight +} diff --git a/packages/web-ui/src/ds/molecules/BlocksEditor/types.ts b/packages/web-ui/src/ds/molecules/BlocksEditor/types.ts new file mode 100644 index 000000000..d7e0a0072 --- /dev/null +++ b/packages/web-ui/src/ds/molecules/BlocksEditor/types.ts @@ -0,0 +1,12 @@ +import { type AnyBlock } from '@latitude-data/constants/simpleBlocks' +import { JSONContent as TipTabRawJSONContent } from '@tiptap/core' + +export interface BlocksEditorProps { + /* blocks: AnyBlock[] */ + content: JSONContent[] + onUpdate: (content: JSONContent[]) => void + placeholder: string + editable?: boolean +} + +export type JSONContent = TipTabRawJSONContent diff --git a/packages/web-ui/src/lib/monacoEditor/language.ts b/packages/web-ui/src/lib/monacoEditor/language.ts index d9f60495b..60cbeae9b 100644 --- a/packages/web-ui/src/lib/monacoEditor/language.ts +++ b/packages/web-ui/src/lib/monacoEditor/language.ts @@ -158,12 +158,13 @@ function colorFromProperty(property: string): string { return hslToHex(h!, s!, l!) } -const recalculateColors = () => ({ +export const recalculateColors = () => ({ primary: colorFromProperty('--primary'), primaryForeground: colorFromProperty('--primary-foreground'), secondary: colorFromProperty('--secondary'), secondaryForeground: colorFromProperty('--secondary-foreground'), foreground: colorFromProperty('--foreground'), + accent: colorFromProperty('--accent'), accentForeground: colorFromProperty('--accent-foreground'), destructive: colorFromProperty('--destructive'), destructiveMutedForeground: colorFromProperty( diff --git a/packages/web-ui/styles.css b/packages/web-ui/styles.css index 3878dbc90..5cd026c70 100644 --- a/packages/web-ui/styles.css +++ b/packages/web-ui/styles.css @@ -66,6 +66,63 @@ .sidebar-icon-mask { clip-path: polygon(0 0, 100% 0, 100% 48%, 48% 48%, 48% 100%, 0 100%); } + + /* Blocks editor highlight for promptl */ + .latitude-blocks-editor { + .editor-block > div > .custom-drag-handle { + opacity: 0; + transition: opacity 0.2s; + } + .editor-block:hover > div > .custom-drag-handle { + opacity: 1; + } + + .base-node-view { + & > div { + @apply space-y-2; + } + } + + .language-promptl { + .hljs-punctuation, + .hljs-tag { + color: hsl(var(--muted-foreground)); + } + .hljs-keyword { + color: hsl(var(--accent-foreground)); + font-weight: 500; + } + .hljs-variable { + color: hsl(var(--accent-foreground)); + } + .hljs-string { + color: hsl(var(--destructive-muted-foreground)); + } + .hljs-comment { + color: hsl(var(--muted-foreground)); + font-style: italic; + } + .hljs-number, + .hljs-symbol, + .hljs-operator, + .hljs-delimiter, + .hljs-bracket { + color: hsl(var(--accent-foreground)); + } + .hljs-strong { + color: hsl(var(--foreground)); + font-weight: bold; + } + .hljs-emphasis { + color: hsl(var(--foreground)); + font-style: italic; + } + .hljs-link { + color: hsl(var(--primary)); + text-decoration: underline; + } + } + } } @layer base { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c45787ce5..46ca71731 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -218,7 +218,7 @@ importers: version: 0.0.4 '@sentry/nextjs': specifier: 9.10.1 - version: 9.10.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@opentelemetry/api@1.8.0)(react-dom@19.0.0-rc-5d19e1c8-20240923(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923)(webpack@5.99.9(esbuild@0.25.5)) + version: 9.10.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@opentelemetry/api@1.8.0)(react-dom@19.0.0-rc-5d19e1c8-20240923(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923)(webpack@5.99.9) '@sindresorhus/slugify': specifier: 2.2.1 version: 2.2.1 @@ -1195,6 +1195,36 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.7(@types/react-dom@18.3.0)(@types/react@18.3.0)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@tiptap/core': + specifier: 3.0.0-beta.8 + version: 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/extension-code-block-lowlight': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-code-block@3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(highlight.js@11.11.1)(lowlight@3.3.0) + '@tiptap/extension-document': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8)) + '@tiptap/extension-drag-handle-react': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/extension-drag-handle@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-collaboration@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27))(@tiptap/extension-node-range@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)))(@tiptap/pm@3.0.0-beta.8)(@tiptap/react@3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + '@tiptap/extension-dropcursor': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/extensions@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)) + '@tiptap/extension-paragraph': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8)) + '@tiptap/extension-placeholder': + specifier: 3.0.0-beta.10 + version: 3.0.0-beta.10(@tiptap/extensions@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)) + '@tiptap/extension-text': + specifier: 3.0.0-beta.8 + version: 3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8)) + '@tiptap/pm': + specifier: 3.0.0-beta.8 + version: 3.0.0-beta.8 + '@tiptap/react': + specifier: 3.0.0-beta.8 + version: 3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1207,12 +1237,18 @@ importers: date-fns: specifier: ^3.6.0 version: 3.6.0 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 hsl-to-hex: specifier: ^1.0.0 version: 1.0.0 lodash-es: specifier: ^4.17.21 version: 4.17.21 + lowlight: + specifier: ^3.3.0 + version: 3.3.0 lucide-react: specifier: ^0.468.0 version: 0.468.0(react@18.3.0) @@ -1258,6 +1294,12 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.17) + tiptap-extension-auto-joiner: + specifier: ^0.1.3 + version: 0.1.3 + tiptap-extension-global-drag-handle: + specifier: ^0.1.18 + version: 0.1.18 use-debounce: specifier: ^10.0.4 version: 10.0.5(react@18.3.0) @@ -5262,6 +5304,9 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -6376,6 +6421,123 @@ packages: '@types/react-dom': optional: true + '@tiptap/core@3.0.0-beta.8': + resolution: {integrity: sha512-TQsHwPZV/YGydnYO99b9otg1zwCLRsI2+KCxMzSkK+IQNfya5oUIqZ2MQjbPLBfiR6rSR9cFx88K+DTozbTXsQ==} + peerDependencies: + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-bubble-menu@3.0.0-beta.8': + resolution: {integrity: sha512-RCj+jxR9y+4XcCkLQG5c0Kf8FQ78jhoF1SvxuCxiPvvRS775MwXCpkMctnM7EUDd/XwTwmESxpUSyAsP5Z9XVQ==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.8 + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-code-block-lowlight@3.0.0-beta.10': + resolution: {integrity: sha512-gRSaLKlT9o0VYJjNK/jdX7FdVU9tO1a1i15VOUJnyTLVPuVv33FWpy+rUNXlzJrdWu1nakXXg0+SOYUNf/3ciA==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + '@tiptap/extension-code-block': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + highlight.js: ^11 + lowlight: ^2 || ^3 + + '@tiptap/extension-code-block@3.0.0-beta.8': + resolution: {integrity: sha512-l4MBkBRFhmPCMQXNQJ7ohC5cOIZ1/CmyXLxHnf9aIgyZeSfih6lxh+DHfTWd77wLl4iLD5LNgg9+KUDngvKtFA==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.8 + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-collaboration@3.0.0-beta.10': + resolution: {integrity: sha512-z+YSXxbqwFPe86NsagKmBomkSNyX4BDN6fSZqgTNj5Xq74tpIlSK+xnvCpwToKyBdSaexf7SZCIX4/+q07EpPQ==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + '@tiptap/y-tiptap': ^3.0.0-beta.3 + yjs: ^13 + + '@tiptap/extension-document@3.0.0-beta.10': + resolution: {integrity: sha512-oORvjMFYhi5A5gBwEQAXxjVs311cJM1KVo7QV8Rz2jdHv4f4X/pd5bSLC+mDzqZSQLWXv6g3PG1BKFHKuvnrLw==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + + '@tiptap/extension-drag-handle-react@3.0.0-beta.10': + resolution: {integrity: sha512-8nAsrANu1fyK4/m3LDSvWwKmqizGPTRNBMt7qNFH/pEziv2Gjx9rHUkgRU0KnFbjbRKDFY/XpyL05IvR0n7URQ==} + peerDependencies: + '@tiptap/extension-drag-handle': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + '@tiptap/react': 3.0.0-beta.10 + react: ^16.8 || ^17 || ^18 || ^19 + react-dom: ^16.8 || ^17 || ^18 || ^19 + + '@tiptap/extension-drag-handle@3.0.0-beta.10': + resolution: {integrity: sha512-V0iyYDtP1d0YfDjrM9Xnph6KbcamFvXUBkhIBtsOgCoy9czMqK6xBy1q5Og3ge4lPV04Z+BzIHQ1Oh4lMwJ8nQ==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + '@tiptap/extension-collaboration': 3.0.0-beta.10 + '@tiptap/extension-node-range': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + '@tiptap/y-tiptap': ^3.0.0-beta.3 + + '@tiptap/extension-dropcursor@3.0.0-beta.10': + resolution: {integrity: sha512-vvsSgkQV81Hg+PkMuVNFib7UfzBNtey9uUpSHsfzKkPreSuCdbPSeEH/TBBCI/Sho+M+YPVjp5rWvvWCFDRpMA==} + peerDependencies: + '@tiptap/extensions': 3.0.0-beta.10 + + '@tiptap/extension-floating-menu@3.0.0-beta.8': + resolution: {integrity: sha512-ZtQHz4lc6ZSd6ynTIhnlSzjtXz+oqDt0OeGwC6wkiB2MuiWqbBybxcz274tFRiilnJUo222wwCPftJkegckfcw==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.0.0-beta.8 + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-node-range@3.0.0-beta.10': + resolution: {integrity: sha512-P90UP4S7bXmSc04eGyvAmE5hkOZHuT+wmINQ8w9RHCXZgdXK3zVv+zhuVuGz992CE2nTwNO8hGCHMR9zyh9Kng==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + + '@tiptap/extension-paragraph@3.0.0-beta.10': + resolution: {integrity: sha512-RJZ6ompYu4Az0uHmdw9r4xPmYtAwfN33ujtVC2Y/ajavDMTAlHWst4wc1Df9ni1eg1CXM9Hrbmqs90rvvuCjPQ==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + + '@tiptap/extension-placeholder@3.0.0-beta.10': + resolution: {integrity: sha512-DWXWEf17GRez/gUu51x6p1bS1fQk8n9MzoTU52iTp67Bnq2XPN+Ab5IailFuH7TnheDFEQ6XnXIrdt+bnz8yZQ==} + peerDependencies: + '@tiptap/extensions': 3.0.0-beta.10 + + '@tiptap/extension-text@3.0.0-beta.8': + resolution: {integrity: sha512-krMDBLf9fay3DBLIl8qD7Q7g0oIJISjwInMQKoJq5apEQaoJyOywFWG4pYrKHcRtZIg9sQHSRkuKsT1wxD42Ew==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.8 + + '@tiptap/extensions@3.0.0-beta.10': + resolution: {integrity: sha512-QkF/JPIkR/YkLNLEykCuA8Mv6+/vBOy+9N9g0UQkBv7HWIEB8+NlkT/94fj5r3DMoLXU+1sRMDCl1PjL4Pr/bQ==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.10 + '@tiptap/pm': 3.0.0-beta.10 + + '@tiptap/pm@3.0.0-beta.8': + resolution: {integrity: sha512-mPgXEY/HrZZBTPqZ9EGHGV2oVzXXYXL+RnJ4F8oxb6d8PeNhCMqSUPCzhZW6/efL7g3147OisA4X3nzhR4YaeQ==} + + '@tiptap/react@3.0.0-beta.8': + resolution: {integrity: sha512-Wp9KzS8QyX2ZN2u4nQoS5Z54lcWGEbjKID3ARFnEg3gFTON88D+M7M8udyivddbXSo52tcYaMLPFsG97kYVjJA==} + peerDependencies: + '@tiptap/core': 3.0.0-beta.8 + '@tiptap/pm': 3.0.0-beta.8 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tiptap/y-tiptap@3.0.0-beta.3': + resolution: {integrity: sha512-1U/MTG7mpkc2VEIRzVueXqpHpawflF0DUuqkPwTezmBst6HPZ+NnZuDbJGay8dh//KSXcrS1Vtu1Wqa2Z/1HTw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -6569,6 +6731,9 @@ packages: '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -6584,9 +6749,15 @@ packages: '@types/long@4.0.2': resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} @@ -6728,6 +6899,9 @@ packages: '@types/urijs@1.19.25': resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==} + '@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==} @@ -8186,6 +8360,9 @@ packages: typescript: optional: true + 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'} @@ -9709,6 +9886,10 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} @@ -10128,6 +10309,9 @@ packages: peerDependencies: ws: '*' + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -10419,6 +10603,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lib0@0.2.108: + resolution: {integrity: sha512-+3eK/B0SqYoZiQu9fNk4VEc6EX8cb0Li96tPGKgugzoGj/OdRdREtuTLvUW+mtinoB2mFiJjSqOJBIaMkAGhxQ==} + engines: {node: '>=16'} + hasBin: true + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -10432,6 +10621,9 @@ 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==} + llamaindex@0.8.37: resolution: {integrity: sha512-2q7rbfGH478+qFGN/45ZyJymWhPBhVxCC1nJgBlcwSFMkZKwsOJ2BRuxKv3EK+w157Mg1rJu0ub1LW86slo3lg==} engines: {node: '>=18.0.0'} @@ -10565,6 +10757,9 @@ packages: lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -10629,6 +10824,10 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -10714,6 +10913,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'} @@ -11469,6 +11671,9 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -11964,6 +12169,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.1: + resolution: {integrity: sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==} + + 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==} + proto3-json-serializer@2.0.2: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} @@ -12000,6 +12263,10 @@ packages: pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + 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'} @@ -12464,6 +12731,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'} @@ -13162,6 +13432,12 @@ packages: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} + tiptap-extension-auto-joiner@0.1.3: + resolution: {integrity: sha512-nY3aKeCpVb2WjjVEZkLtEqxsK3KU1zGioyglMhK1sUFNjKDccOfRyz/YDKrHRAVsKJPGnk2A8VA1827iGEAXWQ==} + + tiptap-extension-global-drag-handle@0.1.18: + resolution: {integrity: sha512-jwFuy1K8DP3a4bFy76Hpc63w1Sil0B7uZ3mvhQomVvUFCU787Lg2FowNhn7NFzeyok761qY2VG+PZ/FDthWUdg==} + tlhunter-sorted-set@0.1.0: resolution: {integrity: sha512-eGYW4bjf1DtrHzUYxYfAcSytpOkA44zsr7G2n3PV7yOUR23vmkGe3LL4R+1jL9OsXtbsFOwe8XtbCrabeaEFnw==} @@ -13389,6 +13665,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==} @@ -13781,6 +14060,9 @@ packages: typescript: optional: true + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -13975,6 +14257,12 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y-protocols@1.0.6: + resolution: {integrity: sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + yjs: ^13.0.0 + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -14027,6 +14315,10 @@ packages: resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} engines: {node: '>=12'} + yjs@13.6.27: + resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -19418,6 +19710,8 @@ snapshots: dependencies: react: 18.3.0 + '@remirror/core-constants@3.0.0': {} + '@rollup/plugin-alias@5.1.1(rollup@4.43.0)': optionalDependencies: rollup: 4.43.0 @@ -19763,7 +20057,7 @@ snapshots: '@sentry/core@9.9.0': {} - '@sentry/nextjs@9.10.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@opentelemetry/api@1.8.0)(react-dom@19.0.0-rc-5d19e1c8-20240923(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923)(webpack@5.99.9(esbuild@0.25.5))': + '@sentry/nextjs@9.10.1(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@opentelemetry/api@1.8.0)(react-dom@19.0.0-rc-5d19e1c8-20240923(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923)(webpack@5.99.9)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.34.0 @@ -19771,10 +20065,10 @@ snapshots: '@sentry-internal/browser-utils': 9.10.1 '@sentry/core': 9.10.1 '@sentry/node': 9.10.1 - '@sentry/opentelemetry': 9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.34.0) + '@sentry/opentelemetry': 9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) '@sentry/react': 9.10.1(react@19.0.0-rc-5d19e1c8-20240923) '@sentry/vercel-edge': 9.10.1 - '@sentry/webpack-plugin': 3.2.4(webpack@5.99.9(esbuild@0.25.5)) + '@sentry/webpack-plugin': 3.2.4(webpack@5.99.9) chalk: 3.0.0 next: 15.3.3(@opentelemetry/api@1.8.0)(react-dom@19.0.0-rc-5d19e1c8-20240923(react@19.0.0-rc-5d19e1c8-20240923))(react@19.0.0-rc-5d19e1c8-20240923) resolve: 1.22.8 @@ -19824,7 +20118,7 @@ snapshots: '@opentelemetry/semantic-conventions': 1.34.0 '@prisma/instrumentation': 6.5.0(@opentelemetry/api@1.9.0) '@sentry/core': 9.10.1 - '@sentry/opentelemetry': 9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.34.0) + '@sentry/opentelemetry': 9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0) import-in-the-middle: 1.14.0 transitivePeerDependencies: - supports-color @@ -19868,7 +20162,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.8.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.8.0))(@opentelemetry/semantic-conventions@1.34.0)': + '@sentry/opentelemetry@9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.34.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -19900,12 +20194,12 @@ snapshots: '@opentelemetry/api': 1.9.0 '@sentry/core': 9.10.1 - '@sentry/webpack-plugin@3.2.4(webpack@5.99.9(esbuild@0.25.5))': + '@sentry/webpack-plugin@3.2.4(webpack@5.99.9)': dependencies: '@sentry/bundler-plugin-core': 3.2.4 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.99.9(esbuild@0.25.5) + webpack: 5.99.9 transitivePeerDependencies: - encoding - supports-color @@ -20911,6 +21205,136 @@ snapshots: '@types/react': 18.3.0 '@types/react-dom': 18.3.0 + '@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-bubble-menu@3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@floating-ui/dom': 1.7.1 + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + optional: true + + '@tiptap/extension-code-block-lowlight@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-code-block@3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(highlight.js@11.11.1)(lowlight@3.3.0)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/extension-code-block': 3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + highlight.js: 11.11.1 + lowlight: 3.3.0 + + '@tiptap/extension-code-block@3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-collaboration@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + '@tiptap/y-tiptap': 3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + yjs: 13.6.27 + + '@tiptap/extension-document@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + + '@tiptap/extension-drag-handle-react@3.0.0-beta.10(@tiptap/extension-drag-handle@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-collaboration@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27))(@tiptap/extension-node-range@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)))(@tiptap/pm@3.0.0-beta.8)(@tiptap/react@3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@tiptap/extension-drag-handle': 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-collaboration@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27))(@tiptap/extension-node-range@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + '@tiptap/pm': 3.0.0-beta.8 + '@tiptap/react': 3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0) + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + + '@tiptap/extension-drag-handle@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/extension-collaboration@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27))(@tiptap/extension-node-range@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + dependencies: + '@floating-ui/dom': 1.7.1 + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/extension-collaboration': 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/extension-node-range': 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + '@tiptap/y-tiptap': 3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + + '@tiptap/extension-dropcursor@3.0.0-beta.10(@tiptap/extensions@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))': + dependencies: + '@tiptap/extensions': 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + + '@tiptap/extension-floating-menu@3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@floating-ui/dom': 1.7.1 + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + optional: true + + '@tiptap/extension-node-range@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/extension-paragraph@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + + '@tiptap/extension-placeholder@3.0.0-beta.10(@tiptap/extensions@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8))': + dependencies: + '@tiptap/extensions': 3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + + '@tiptap/extension-text@3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + + '@tiptap/extensions@3.0.0-beta.10(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + + '@tiptap/pm@3.0.0-beta.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.3 + 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.40.0) + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + '@tiptap/react@3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': + dependencies: + '@tiptap/core': 3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8) + '@tiptap/pm': 3.0.0-beta.8 + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 18.3.0 + react-dom: 18.3.0(react@18.3.0) + use-sync-external-store: 1.5.0(react@18.3.0) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.0.0-beta.8(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + '@tiptap/extension-floating-menu': 3.0.0-beta.8(@floating-ui/dom@1.7.1)(@tiptap/core@3.0.0-beta.8(@tiptap/pm@3.0.0-beta.8))(@tiptap/pm@3.0.0-beta.8) + transitivePeerDependencies: + - '@floating-ui/dom' + + '@tiptap/y-tiptap@3.0.0-beta.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + dependencies: + lib0: 0.2.108 + prosemirror-model: 1.25.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + y-protocols: 1.0.6(yjs@13.6.27) + yjs: 13.6.27 + '@tokenizer/token@0.3.0': {} '@tootallnate/once@2.0.0': {} @@ -21168,6 +21592,8 @@ snapshots: '@types/katex@0.16.7': {} + '@types/linkify-it@5.0.0': {} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.17.17 @@ -21184,10 +21610,17 @@ snapshots: '@types/long@4.0.2': {} + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/mdx@2.0.13': {} '@types/mime@1.3.5': {} @@ -21346,6 +21779,8 @@ snapshots: '@types/urijs@1.19.25': {} + '@types/use-sync-external-store@0.0.6': {} + '@types/uuid@10.0.0': {} '@types/uuid@9.0.8': {} @@ -22860,6 +23295,8 @@ snapshots: optionalDependencies: typescript: 5.8.3 + crelt@1.0.6: {} + cron-parser@4.9.0: dependencies: luxon: 3.6.1 @@ -24881,6 +25318,8 @@ snapshots: highlight.js@10.7.3: {} + highlight.js@11.11.1: {} + highlightjs-vue@1.0.0: {} hoist-non-react-statics@3.3.2: @@ -25313,6 +25752,8 @@ snapshots: dependencies: ws: 8.18.2 + isomorphic.js@0.2.5: {} + istanbul-lib-coverage@3.2.0: {} istextorbinary@9.5.0: @@ -25598,6 +26039,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lib0@0.2.108: + dependencies: + isomorphic.js: 0.2.5 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -25608,6 +26053,10 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + llamaindex@0.8.37(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-providers@3.826.0)(@huggingface/transformers@3.5.2)(cohere-ai@7.17.1)(js-tiktoken@1.0.20)(jsdom@24.1.3(canvas@2.11.2))(msw@2.10.2(@types/node@22.15.31)(typescript@5.8.3))(openai@4.104.0(ws@8.18.2)(zod@3.24.2))(pathe@1.1.2)(pg-query-stream@4.8.1(pg@8.14.1))(pg@8.14.1)(socks@2.8.5)(terser@5.42.0)(tree-sitter@0.22.4)(typescript@5.8.3)(web-tree-sitter@0.24.7)(ws@8.18.2)(zod@3.24.2): dependencies: '@llamaindex/anthropic': 0.0.33(@aws-crypto/sha256-js@5.2.0)(@huggingface/transformers@3.5.2)(@types/node@22.15.31)(gpt-tokenizer@2.9.0)(js-tiktoken@1.0.20)(jsdom@24.1.3(canvas@2.11.2))(msw@2.10.2(@types/node@22.15.31)(typescript@5.8.3))(pathe@1.1.2)(terser@5.42.0) @@ -25798,6 +26247,12 @@ snapshots: fault: 1.0.4 highlight.js: 10.7.3 + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + lru-cache@10.4.3: {} lru-cache@11.1.0: {} @@ -25864,6 +26319,15 @@ snapshots: markdown-extensions@2.0.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: {} marked@7.0.4: {} @@ -26071,6 +26535,8 @@ snapshots: mdn-data@2.0.30: {} + mdurl@2.0.0: {} + media-typer@0.3.0: {} media-typer@1.1.0: {} @@ -27110,6 +27576,8 @@ snapshots: strip-ansi: 7.1.0 wcwidth: 1.0.1 + orderedmap@2.1.1: {} + os-tmpdir@1.0.2: {} oslo@1.2.0: @@ -27602,6 +28070,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.1 + 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.1 + 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.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 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.1 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.25.1 + 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.1 + 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.1)(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.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + + prosemirror-transform@1.10.4: + dependencies: + prosemirror-model: 1.25.1 + + prosemirror-view@1.40.0: + dependencies: + prosemirror-model: 1.25.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 + proto3-json-serializer@2.0.2: dependencies: protobufjs: 7.5.3 @@ -27676,6 +28247,8 @@ snapshots: end-of-stream: 1.4.4 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@2.3.1: {} puppeteer-core@22.15.0: @@ -28401,6 +28974,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 + rope-sequence@1.3.4: {} + router@2.2.0: dependencies: debug: 4.4.1 @@ -29255,16 +29830,14 @@ snapshots: - encoding - supports-color - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.99.9(esbuild@0.25.5)): + terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.42.0 - webpack: 5.99.9(esbuild@0.25.5) - optionalDependencies: - esbuild: 0.25.5 + webpack: 5.99.9 terser@5.42.0: dependencies: @@ -29336,6 +29909,10 @@ snapshots: tinyspy@4.0.3: {} + tiptap-extension-auto-joiner@0.1.3: {} + + tiptap-extension-global-drag-handle@0.1.18: {} + tlhunter-sorted-set@0.1.0: {} tmp-promise@3.0.3: @@ -29579,6 +30156,8 @@ snapshots: typescript@5.8.3: {} + uc.micro@2.1.0: {} + ufo@1.6.1: {} unbox-primitive@1.1.0: @@ -30183,6 +30762,8 @@ snapshots: optionalDependencies: typescript: 5.8.3 + w3c-keyname@2.2.8: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -30229,7 +30810,7 @@ snapshots: webpack-virtual-modules@0.5.0: {} - webpack@5.99.9(esbuild@0.25.5): + webpack@5.99.9: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -30252,7 +30833,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.99.9(esbuild@0.25.5)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) watchpack: 2.4.4 webpack-sources: 3.3.2 transitivePeerDependencies: @@ -30410,6 +30991,11 @@ snapshots: xtend@4.0.2: {} + y-protocols@1.0.6(yjs@13.6.27): + dependencies: + lib0: 0.2.108 + yjs: 13.6.27 + y18n@4.0.3: {} y18n@5.0.8: {} @@ -30466,6 +31052,10 @@ snapshots: buffer-crc32: 0.2.13 pend: 1.2.0 + yjs@13.6.27: + dependencies: + lib0: 0.2.108 + yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.2: {}