diff --git a/apps/web/src/apps/showcase/example/features/form-demo/components/all-fields-demo.tsx b/apps/web/src/apps/showcase/example/features/form-demo/components/all-fields-demo.tsx index 8d31ee5..738c802 100644 --- a/apps/web/src/apps/showcase/example/features/form-demo/components/all-fields-demo.tsx +++ b/apps/web/src/apps/showcase/example/features/form-demo/components/all-fields-demo.tsx @@ -6,7 +6,8 @@ import { FieldMultiSelect, FieldNativeSelect, FieldTagsInput, FieldCheckbox, FieldRadioGroup, FieldSwitch, FieldChipGroup, FieldSegmentedControl, FieldSlider, FieldRangeSlider, FieldRating, FieldColorInput, - FieldColorPicker, FieldFileInput, FieldLocalSelect, FieldAsyncSelect + FieldColorPicker, FieldFileInput, FieldLocalSelect, FieldAsyncSelect, + FieldRichTextEditor } from '@repo/ui/form'; import type { LoadOptionsFn } from '@repo/ui/form'; import { useFormDemoTranslation } from '../i18n/useFormDemoTranslation'; @@ -91,6 +92,8 @@ export default function AllFieldsDemo() { { id: 888, code: 'ASYNC-88', name: 'Ghost Async Vendor 1' }, { id: 999, code: 'ASYNC-99', name: 'Ghost Async Vendor 2' } ], + richTextEmpty: "", + richTextPrefilled: "

ERP Release Notes

This is a highly important update. Please observe the following:

Thank you for your cooperation.

", realPokeSelect: null, multiRealPokeSelect: [] } @@ -305,6 +308,23 @@ export default function AllFieldsDemo() { clearable /> + + Rich Text Editor (TipTap) + + +
+ +
{/* --- Toggles & Choices --- */} diff --git a/apps/web/src/apps/showcase/example/features/form-demo/components/reactive-watch-demo.tsx b/apps/web/src/apps/showcase/example/features/form-demo/components/reactive-watch-demo.tsx index feeec0d..ad19d40 100644 --- a/apps/web/src/apps/showcase/example/features/form-demo/components/reactive-watch-demo.tsx +++ b/apps/web/src/apps/showcase/example/features/form-demo/components/reactive-watch-demo.tsx @@ -1,8 +1,8 @@ import { useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { Button, Paper, Title, Divider, Stack, Code, Alert } from '@repo/ui/components'; -import { FieldTextInput, FieldSelect, FieldSwitch, FieldLocalSelect, FieldAsyncSelect } from '@repo/ui/form'; +import { Button, Paper, Title, Divider, Stack, Code, Alert, TypographyStylesProvider } from '@repo/ui/components'; +import { FieldTextInput, FieldSelect, FieldSwitch, FieldLocalSelect, FieldAsyncSelect, FieldRichTextEditor } from '@repo/ui/form'; import { useConditionalField } from '@repo/ui/hooks'; import { compose, required, emailValidator } from '@repo/ui/validators'; import { useFormDemoTranslation } from '../i18n/useFormDemoTranslation'; @@ -67,6 +67,7 @@ export default function ReactiveWatchDemo() { role: z.string().optional(), regions: z.array(z.object({ id: z.string(), code: z.string(), taxRate: z.number() })).optional(), warehouses: z.array(z.object({ id: z.string(), regionId: z.string(), name: z.string() })).optional(), + richTextLive: z.string().optional(), }) .and( z.discriminatedUnion('userType', [ @@ -109,6 +110,7 @@ export default function ReactiveWatchDemo() { { id: 'W-99', regionId: 'R1', name: 'APAC Central Hub' }, { id: 'W-98', regionId: 'R1', name: 'APAC Backup Hub' } ], + richTextLive: "

Start typing to see the live preview...

", }, }); @@ -119,6 +121,7 @@ export default function ReactiveWatchDemo() { const department = useWatch({ control, name: 'department' }); const role = useWatch({ control, name: 'role' }); const regions = useWatch({ control, name: 'regions' }); + const watchedRichTextLive = useWatch({ control, name: 'richTextLive' }); // Use the custom hook to cleanly unregister and reset fields when hidden useConditionalField({ @@ -328,6 +331,25 @@ export default function ReactiveWatchDemo() { )} + + Reactive Rich Text Preview + + + + + + + Live HTML Preview Render + +
+ + + diff --git a/apps/web/src/apps/showcase/example/features/form-demo/components/validation-bank-demo.tsx b/apps/web/src/apps/showcase/example/features/form-demo/components/validation-bank-demo.tsx index 8a13102..6c14137 100644 --- a/apps/web/src/apps/showcase/example/features/form-demo/components/validation-bank-demo.tsx +++ b/apps/web/src/apps/showcase/example/features/form-demo/components/validation-bank-demo.tsx @@ -4,7 +4,7 @@ import { z } from 'zod'; import { Button, Paper, Title, Group, Stack, Code, Divider } from '@repo/ui/components'; import { FieldTextInput, FieldPasswordInput, FieldNumberInput, - FieldLocalSelect, FieldAsyncSelect + FieldLocalSelect, FieldAsyncSelect, FieldRichTextEditor } from '@repo/ui/form'; import type { LoadOptionsFn } from '@repo/ui/form'; @@ -75,6 +75,7 @@ export default function ValidationBankDemo() { prefilledVendor: z.object({ id: z.union([z.string(), z.number()]), code: z.string(), name: z.string() }, { required_error: 'Vendor is required' }), emptyVendor: z.object({ id: z.union([z.string(), z.number()]), code: z.string(), name: z.string() }, { required_error: 'Vendor is required' }), prefilledAsyncMulti: z.array(z.object({ id: z.union([z.string(), z.number()]), code: z.string(), name: z.string() })).min(1, "Select at least 1 vendor"), + richTextNotes: z.string().min(15, "Notes must be at least 15 characters long (including HTML tags)"), }); type ValidationFormValues = z.infer; @@ -96,6 +97,7 @@ export default function ValidationBankDemo() { { id: 'V1', code: 'VN-01', name: 'Vendor One' }, { id: 'V2', code: 'VN-02', name: 'Vendor Two' } ] as any, + richTextNotes: '', } }); @@ -226,6 +228,17 @@ export default function ValidationBankDemo() { withAsterisk /> + Rich Text Editor Validations + + + + diff --git a/packages/ui/docs/FORM-COMPONENTS.md b/packages/ui/docs/FORM-COMPONENTS.md index a9dd0ff..e6105c9 100644 --- a/packages/ui/docs/FORM-COMPONENTS.md +++ b/packages/ui/docs/FORM-COMPONENTS.md @@ -122,7 +122,8 @@ packages/ui/src/components/Form/ ├── tags-input.field.tsx # FieldTagsInput ├── chip-group.field.tsx # FieldChipGroup ├── segmented-control.field.tsx # FieldSegmentedControl - └── file-input.field.tsx # FieldFileInput + ├── file-input.field.tsx # FieldFileInput + └── rich-text.field.tsx # FieldRichTextEditor ``` Each field file is a thin one-liner: @@ -889,7 +890,11 @@ export const FieldDatePicker = withRHF( | `FieldColorPicker` | `ColorPicker` | Color | Color picker only (uses `Input.Wrapper`) | | `FieldLocalSelect` | `Select / MultiSelect` | Selection | Stores full `T` or `T[]` object in RHF instead of string ID. Accepts static `options` array with `valueKey`/`labelKey` mapping. | | `FieldAsyncSelect` | `Select / MultiSelect` | Selection | Async paginated object select with IoC `loadOptions` callback. Supports search-keyed caching, `defaultOptions` for edit forms, and automatic pagination detection. | -| `FieldFileInput` | `FileInput` | File | File upload input | +| `FieldFileInput` | `` | `File | File[] | null` | +| `FieldRichTextEditor` | `@mantine/tiptap` | `string` (HTML) | + +### Rich Text Editor (TipTap) +The `FieldRichTextEditor` component integrates `@mantine/tiptap` directly with React Hook Form. It safely stores the Editor's HTML output directly into the RHF state as a `string`. Because TipTap is an uncontrolled editor natively, this field uses a specialized `useController` wrapper that automatically syncs bidirectional updates (e.g., calling `editor.commands.setContent(field.value)` when the form is reset or async default values arrive). --- diff --git a/packages/ui/package.json b/packages/ui/package.json index 608a58a..06fe1aa 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -23,8 +23,15 @@ "@hookform/resolvers": "^5.0.1", "@mantine/core": "^8.3.15", "@mantine/hooks": "^8.3.15", + "@mantine/tiptap": "^9.3.2", "@repo/core-i18n": "workspace:*", "@repo/utils": "workspace:*", + "@tiptap/extension-link": "^3.27.1", + "@tiptap/extension-text-align": "^3.27.1", + "@tiptap/extension-underline": "^3.27.1", + "@tiptap/pm": "^3.27.1", + "@tiptap/react": "^3.27.1", + "@tiptap/starter-kit": "^3.27.1", "dayjs": "^1.11.19", "react-hook-form": "^7.56.4", "tailwind-merge": "^3.4.0", diff --git a/packages/ui/src/components/Form/fields/rich-text.field.tsx b/packages/ui/src/components/Form/fields/rich-text.field.tsx new file mode 100644 index 0000000..31f0450 --- /dev/null +++ b/packages/ui/src/components/Form/fields/rich-text.field.tsx @@ -0,0 +1,121 @@ +import React, { useEffect } from 'react'; +import { useController, type FieldPath, type FieldValues, type UseControllerProps } from 'react-hook-form'; +import { useEditor } from '@tiptap/react'; +import StarterKit from '@tiptap/starter-kit'; +import Underline from '@tiptap/extension-underline'; +import Link from '@tiptap/extension-link'; +import TextAlign from '@tiptap/extension-text-align'; +import { RichTextEditor } from '@mantine/tiptap'; +import { Input } from '@mantine/core'; +import { useTranslatedError } from '../useTranslatedError'; + +export type FieldRichTextEditorProps< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = UseControllerProps & { + label?: React.ReactNode; + description?: React.ReactNode; + withAsterisk?: boolean; +}; + +function FieldRichTextEditorComponent< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>(props: FieldRichTextEditorProps) { + const { + name, + control, + rules, + shouldUnregister, + defaultValue, + disabled, + label, + description, + withAsterisk, + } = props; + + const { + field, + fieldState: { error }, + } = useController({ + name, + control, + rules, + shouldUnregister, + defaultValue, + disabled, + }); + + const translatedError = useTranslatedError(error?.message); + + const editor = useEditor({ + extensions: [ + StarterKit, + Underline, + Link, + TextAlign.configure({ types: ['heading', 'paragraph'], alignments: ['left', 'center', 'right', 'justify'] }), + ], + content: field.value || '', + onUpdate({ editor }) { + field.onChange(editor.getHTML()); + }, + onBlur() { + field.onBlur(); + }, + }); + + useEffect(() => { + if (editor && field.value !== editor.getHTML()) { + editor.commands.setContent(field.value || ''); + } + }, [field.value, editor]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +// Wrap with React.memo for identical performance characteristics as withRHF components +export const FieldRichTextEditor = React.memo(FieldRichTextEditorComponent) as typeof FieldRichTextEditorComponent; diff --git a/packages/ui/src/components/Form/index.ts b/packages/ui/src/components/Form/index.ts index 6cef66b..7cbba4f 100644 --- a/packages/ui/src/components/Form/index.ts +++ b/packages/ui/src/components/Form/index.ts @@ -28,6 +28,7 @@ export { FieldNumberInput } from './fields/number-input.field'; export { FieldJsonInput } from './fields/json-input.field'; export { FieldPinInput } from './fields/pin-input.field'; export { FieldAutocomplete } from './fields/autocomplete.field'; +export { FieldRichTextEditor } from './fields/rich-text.field'; // --------------------------------------------------------------------------- // Selection Fields diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 60020e1..137e26a 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -1,4 +1,8 @@ export * from '@mantine/core'; +export { + List, + TypographyStylesProvider, +} from '@mantine/core'; export * from './Form'; export * from './system-pages/coming-soon'; diff --git a/packages/ui/src/theme.css b/packages/ui/src/theme.css index 27cfea7..8a145ff 100644 --- a/packages/ui/src/theme.css +++ b/packages/ui/src/theme.css @@ -1,19 +1,35 @@ +/* ========================================= + 1. CORE IMPORTS & TAILWIND CONFIG + ========================================= */ +/* Import Mantine core and TipTap extensions */ @import '@mantine/core/styles.css'; +@import '@mantine/tiptap/styles.css'; + +/* Initialize Tailwind CSS v4 engine */ @import 'tailwindcss'; + +/* Instruct Tailwind to scan the src directory for utility class usage */ @source "../src"; @theme { /* ========================================= - FONT FAMILY MAPPING (Mantine -> Tailwind) + 2. FONT FAMILY MAPPING + Synchronizes Tailwind's typography utilities + with Mantine's global font configurations. ========================================= */ --base-font-size: 13px; --font-sans: var(--mantine-font-family); --font-mono: var(--mantine-font-family-monospace); /* ========================================= - 1. COLORS (Strictly mapped to Mantine 0-9) + 3. COLOR SYSTEM (Mantine to Tailwind Sync) + Maps Tailwind's 50-900 scale directly to + Mantine's 0-9 scale for seamless theming. + Usage: `bg-brand-500`, `text-error-700` ========================================= */ - --color-brand-50: var(--mantine-color-brand-0); + + /* Brand Colors */ + --color-brand-50: var(--mantine-color-brand-0); --color-brand-100: var(--mantine-color-brand-1); --color-brand-200: var(--mantine-color-brand-2); --color-brand-300: var(--mantine-color-brand-3); @@ -24,7 +40,8 @@ --color-brand-800: var(--mantine-color-brand-8); --color-brand-900: var(--mantine-color-brand-9); - --color-error-50: var(--mantine-color-error-0); + /* Error Colors (Red/Danger) */ + --color-error-50: var(--mantine-color-error-0); --color-error-100: var(--mantine-color-error-1); --color-error-200: var(--mantine-color-error-2); --color-error-300: var(--mantine-color-error-3); @@ -35,7 +52,8 @@ --color-error-800: var(--mantine-color-error-8); --color-error-900: var(--mantine-color-error-9); - --color-warning-50: var(--mantine-color-warning-0); + /* Warning Colors (Yellow/Orange) */ + --color-warning-50: var(--mantine-color-warning-0); --color-warning-100: var(--mantine-color-warning-1); --color-warning-200: var(--mantine-color-warning-2); --color-warning-300: var(--mantine-color-warning-3); @@ -46,7 +64,8 @@ --color-warning-800: var(--mantine-color-warning-8); --color-warning-900: var(--mantine-color-warning-9); - --color-success-50: var(--mantine-color-success-0); + /* Success Colors (Green) */ + --color-success-50: var(--mantine-color-success-0); --color-success-100: var(--mantine-color-success-1); --color-success-200: var(--mantine-color-success-2); --color-success-300: var(--mantine-color-success-3); @@ -57,7 +76,8 @@ --color-success-800: var(--mantine-color-success-8); --color-success-900: var(--mantine-color-success-9); - --color-info-50: var(--mantine-color-info-0); + /* Info Colors (Blue/Cyan) */ + --color-info-50: var(--mantine-color-info-0); --color-info-100: var(--mantine-color-info-1); --color-info-200: var(--mantine-color-info-2); --color-info-300: var(--mantine-color-info-3); @@ -69,22 +89,26 @@ --color-info-900: var(--mantine-color-info-9); /* ========================================= - 2. SPACING & CONTAINERS + 4. SPACING, BREAKPOINTS & CONTAINERS + Aligns Tailwind's padding/margin scale + with Mantine's layout engine. ========================================= */ - --spacing: 0.25rem; + --spacing: 0.25rem; /* Base Tailwind unit (1 = 0.25rem) */ - /* Core mapped to Mantine */ + /* Map core layout spacing to Mantine */ --spacing-xs: var(--mantine-spacing-xs); --spacing-sm: var(--mantine-spacing-sm); --spacing-md: var(--mantine-spacing-md); --spacing-lg: var(--mantine-spacing-lg); --spacing-xl: var(--mantine-spacing-xl); + /* Standard Tailwind responsive breakpoints and container sizes */ --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; --breakpoint-2xl: 96rem; + --container-3xs: 16rem; --container-2xs: 18rem; --container-xs: 20rem; @@ -100,17 +124,22 @@ --container-7xl: 80rem; /* ========================================= - 3. TYPOGRAPHY + 5. TYPOGRAPHY SCALES + Base sizes (xs to xl) inherit from Mantine. + Extended sizes (2xl to 9xl) use static rems. ========================================= */ - /* Core text sizes mapped to Mantine, extended kept static */ --text-xs: var(--mantine-font-size-xs); --text-xs--line-height: calc(1 / 0.75); + --text-sm: var(--mantine-font-size-sm); --text-sm--line-height: calc(1.25 / 0.875); + --text-base: var(--mantine-font-size-md); --text-base--line-height: calc(1.5 / 1); + --text-lg: var(--mantine-font-size-lg); --text-lg--line-height: calc(1.75 / 1.125); + --text-xl: var(--mantine-font-size-xl); --text-xl--line-height: calc(1.75 / 1.25); @@ -131,6 +160,7 @@ --text-9xl: 8rem; --text-9xl--line-height: 1; + /* Font Weights */ --font-weight-thin: 100; --font-weight-extralight: 200; --font-weight-light: 300; @@ -141,6 +171,7 @@ --font-weight-extrabold: 800; --font-weight-black: 900; + /* Letter Spacing (Tracking) */ --tracking-tighter: -0.05em; --tracking-tight: -0.025em; --tracking-normal: 0em; @@ -148,6 +179,7 @@ --tracking-wider: 0.05em; --tracking-widest: 0.1em; + /* Line Height (Leading) */ --leading-tight: 1.25; --leading-snug: 1.375; --leading-normal: 1.5; @@ -155,19 +187,23 @@ --leading-loose: 2; /* ========================================= - 4. RADIUS + 6. BORDER RADIUS + Inherits exact corner rounding from Mantine. ========================================= */ --radius-xs: var(--mantine-radius-xs); --radius-sm: var(--mantine-radius-sm); --radius-md: var(--mantine-radius-md); --radius-lg: var(--mantine-radius-lg); --radius-xl: var(--mantine-radius-xl); + --radius-2xl: 1rem; --radius-3xl: 1.5rem; --radius-4xl: 2rem; /* ========================================= - 5. SHADOWS & BLURS + 7. SHADOWS & BLURS + Ensures popovers, modals, and dropdowns + share identical elevation depths. ========================================= */ --shadow-2xs: 0 1px rgb(0 0 0 / 0.05); --shadow-xs: var(--mantine-shadow-xs); @@ -203,7 +239,7 @@ --blur-3xl: 64px; /* ========================================= - 6. MISCELLANEOUS (Aspect, Anim, Perspective) + 8. MISCELLANEOUS & ANIMATIONS ========================================= */ --perspective-dramatic: 100px; --perspective-near: 300px; @@ -217,31 +253,26 @@ --ease-out: cubic-bezier(0, 0, 0.2, 1); --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + /* Standard Tailwind Animations */ --animate-spin: spin 1s linear infinite; --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; --animate-bounce: bounce 1s infinite; @keyframes spin { - to { - transform: rotate(360deg); - } + to { transform: rotate(360deg); } } @keyframes ping { - 75%, - 100% { + 75%, 100% { transform: scale(2); opacity: 0; } } @keyframes pulse { - 50% { - opacity: 0.5; - } + 50% { opacity: 0.5; } } @keyframes bounce { - 0%, - 100% { + 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(0.8, 0, 1, 1); } @@ -253,13 +284,14 @@ } /* ========================================= - BASE RESETS + 9. BASE RESETS + Applies global typography smoothing and + sets the root font size. ========================================= */ - @layer base { body { font-size: var(--base-font-size); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baf8113..09af81a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -245,7 +245,7 @@ importers: version: 5.4.17(@types/node@22.19.3) vitest: specifier: ^4.0.17 - version: 4.0.17(jsdom@26.1.0) + version: 4.0.17(@opentelemetry/api@1.9.1) packages/configs/eslint: dependencies: @@ -442,7 +442,7 @@ importers: version: 5.5.4 vitest: specifier: ^4.0.17 - version: 4.0.17(jsdom@26.1.0) + version: 4.0.17(@opentelemetry/api@1.9.1) packages/ui: dependencies: @@ -455,12 +455,33 @@ importers: '@mantine/hooks': specifier: ^8.3.15 version: 8.3.15(react@19.2.3) + '@mantine/tiptap': + specifier: ^9.3.2 + version: 9.3.2(@mantine/core@8.3.15)(@mantine/hooks@8.3.15)(@tiptap/extension-link@3.27.1)(@tiptap/react@3.27.1)(react-dom@19.2.3)(react@19.2.3) '@repo/core-i18n': specifier: workspace:* version: link:../core-i18n '@repo/utils': specifier: workspace:* version: link:../utils + '@tiptap/extension-link': + specifier: ^3.27.1 + version: 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-text-align': + specifier: ^3.27.1 + version: 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-underline': + specifier: ^3.27.1 + version: 3.27.1(@tiptap/core@3.27.1) + '@tiptap/pm': + specifier: ^3.27.1 + version: 3.27.1 + '@tiptap/react': + specifier: ^3.27.1 + version: 3.27.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1)(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) + '@tiptap/starter-kit': + specifier: ^3.27.1 + version: 3.27.1 dayjs: specifier: ^1.11.19 version: 1.11.19 @@ -555,7 +576,7 @@ importers: version: 5.5.4 vitest: specifier: ^4.0.17 - version: 4.0.17(jsdom@26.1.0) + version: 4.0.17(@opentelemetry/api@1.9.1) packages: @@ -1647,6 +1668,24 @@ packages: react: 19.2.3 dev: false + /@mantine/tiptap@9.3.2(@mantine/core@8.3.15)(@mantine/hooks@8.3.15)(@tiptap/extension-link@3.27.1)(@tiptap/react@3.27.1)(react-dom@19.2.3)(react@19.2.3): + resolution: {integrity: sha512-X344wqt3eusMLPANWuNSnKoFjTDlCEOUpYq6hPWU6uBvxEHJGHuJFXjtm/jg/D6aNEvWr+P+m1+ElE7eLT/G0A==} + peerDependencies: + '@mantine/core': 9.3.2 + '@mantine/hooks': 9.3.2 + '@tiptap/extension-link': '>=3.3.0' + '@tiptap/react': '>=3.3.0' + react: ^19.2.0 + react-dom: ^19.2.0 + dependencies: + '@mantine/core': 8.3.15(@mantine/hooks@8.3.15)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) + '@mantine/hooks': 8.3.15(react@19.2.3) + '@tiptap/extension-link': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/react': 3.27.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1)(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + dev: false + /@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.3): resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: @@ -3066,6 +3105,309 @@ packages: '@testing-library/dom': 10.4.1 dev: true + /@tiptap/core@3.27.1(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-rV6Qn4wmC6BxfF+4mu6bqGWj9vA4oXXhsrpXaJL2uhjxeHAGofjwcHof2X84VYzeyXgdlsGmqKie4TAppVXZUQ==} + peerDependencies: + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/pm': 3.27.1 + dev: false + + /@tiptap/extension-blockquote@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-VMF7xJx6qEGiX6DTKNiL31NLqypOcd/4sNjFSe8rb41PwejBJh/nOqVIbBvWkiT6NMGFLxMhj7zJ8/zPo1hXeg==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-bold@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-TlC5bsS+pqETTrlz4CZz9RO/cKBYtELGIxwtKeivUn3eNfnOxQbbu4WDsiwIfzRFyd0OMnKl6BPM2KnYEehoEQ==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-bubble-menu@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-j/j8Qp9Z5nViade2m7zjrO/CYH/Ca80Qj7aqo0eUaei6FZQ5izlF9o4XQU5EFMAutV6mwynsPUp8FVo5sCuYfw==} + requiresBuild: true + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@floating-ui/dom': 1.7.5 + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + optional: true + + /@tiptap/extension-bullet-list@3.27.1(@tiptap/extension-list@3.27.1): + resolution: {integrity: sha512-faCUHnRP47o9Zh9VZZX6EX/569udw9Vopm2PgEKPWuKLE2qaS5WBuUVU0iItdJmKUqaWiOZkpoW4jvnDmj0dfg==} + peerDependencies: + '@tiptap/extension-list': 3.27.1 + dependencies: + '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-code-block@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-pHlzmZx2OlHfyQ0yRlT5UL4mGokz947DthZuYefN1OleVqOkHpWBG+2JQwqoNq6bmzMne92zbH32rhcJUEYSjA==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + + /@tiptap/extension-code@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-epOUpFfEmBzjvnqvjv2qHX7NAuLo5dlOGV690lWu+sAYMjibuJBeVvAiKPyFCfRCCTUxdbDB3jbaOA1yEcEJ7w==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-document@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-8FbBTkfnRP4iVaoj+2h3iWa+H0eGDD3yTyVCwrmue/sQTkqUNUoSuAZa3GDG4Sd41xdPwTJxl9nUWGgM1qDCnw==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-dropcursor@3.27.1(@tiptap/extensions@3.27.1): + resolution: {integrity: sha512-blFf9x9RG0Qr7P3FoAH/033ffa+mMLZn34trVs8Vi0Ppk6FmJAg5HpYFOtmYoeREdNDJ5rHJKV7SoACbOHgskQ==} + peerDependencies: + '@tiptap/extensions': 3.27.1 + dependencies: + '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-floating-menu@3.27.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-BmJF1VqB7dSJkgAalrpVFj88WLhxKjcWPuWHOqf2ITrUU2832BhKLXKmxjWUy1gqV8PfNNVWtGfIERy7I0y0+Q==} + requiresBuild: true + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@floating-ui/dom': 1.7.5 + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + optional: true + + /@tiptap/extension-gapcursor@3.27.1(@tiptap/extensions@3.27.1): + resolution: {integrity: sha512-QoezN0wdvXIwLQ4ee2ccWDaX3RG0lzgQpIMpMz55oPDhpUVax1+19ApsS53LkcktpS4EbnPL4xO4DaJk0Vp7PQ==} + peerDependencies: + '@tiptap/extensions': 3.27.1 + dependencies: + '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-hard-break@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-iv/m9hzl6jfSj9Q8UEjAxONvCoUDaP7M9SRCPx3PaLNxA230TTD6RE0Ye4zFJ8ze7ZVoJJMAqg9Qpq1iYg2JOQ==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-heading@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-SrC4l1kEIyv9ZXFaI/8LQqU2MyMmjczw7XXsWUQOTN4YXv0JyVgMNR3cI/wz0d2xsTfBdZ1N85Tdng+Ga1t0Sg==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-horizontal-rule@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-QlKE7qn5qMnIGVGhXQlvYedvLtNJ9z0dmit5w8vPb8tKzW4Spk6M7N2kruprrDA8GBwHfeR5wmF+njfUm34qxg==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + + /@tiptap/extension-italic@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-jGGeyn9uRUnNjSTHpbqhiGsp6KaYTSbV09jDXPJI9cDwfV9hpugLvpaCZd0BMBbhU1B1W6kOfX0BE15qX/HQfA==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-link@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-/2jBfsxBZUDGJmpZifqRQPz7f1E5qpS1BckTZ39TADzUJX+feKy7RJ3DtQ02+8y6SSMzvP9loGVjrk6zEMTk4g==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + linkifyjs: 4.3.3 + dev: false + + /@tiptap/extension-list-item@3.27.1(@tiptap/extension-list@3.27.1): + resolution: {integrity: sha512-zwRl01ETfCkWUvtvK5fw9bXtAajMPkvlkE3Cq6JvH3LF7XXJwDtNj5Tj7exacMpCaSZmlNc43vFb2rAYnrnwMA==} + peerDependencies: + '@tiptap/extension-list': 3.27.1 + dependencies: + '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-list-keymap@3.27.1(@tiptap/extension-list@3.27.1): + resolution: {integrity: sha512-OIMZNlzPSO8WRd4ic73Fxckzl4N1tesjjLL2XApaNA/uMpO0LoF6WSRPAWv+Z24Wp92ARRJAnRP7iZoI5+Jxig==} + peerDependencies: + '@tiptap/extension-list': 3.27.1 + dependencies: + '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-list@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-c2Upru7lj0/ZV/Ibww6cNz6sUS8m6Dp/9uygFhYcZOd3X8M0xBIEk42c6m6SQehkPziVA8QOgNJz7sMqsbz1OQ==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + + /@tiptap/extension-ordered-list@3.27.1(@tiptap/extension-list@3.27.1): + resolution: {integrity: sha512-GYrKqD//9nHJ2r80uXqbDMzRnFpGzbaEQRTSGaO/SH7DvXWFMow8evkOdjQ7PCQO07jNjJo75+A85Jwu3Ov3AA==} + peerDependencies: + '@tiptap/extension-list': 3.27.1 + dependencies: + '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-paragraph@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-7K7eo1gruOgAsnbK+GCV23AUVUI0cL1bTig8HaPneoFMVbig7vddk8jNLKBWO8TXVbG7TuHdnDN4F98vdtwh5Q==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-strike@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-Y3DW1jlSlCNCyMGHP3+3qBNNPS83wuFz4RTYGjZtvRRTCRh7apZme9XRWMq1rN5mJ2Cr7fKocA2/5Bs13KgN6Q==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-text-align@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-EXawuJBO55wd8WcTbHTMoPhv0CGQxza4yCCPB5Hqz4ZPQwahIr3ej+8yp/kimIl0xokabwZ0/Fu8STQ4AkZv5g==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-text@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-6ZwaZwSrDh+KFFv6V1J79oO37yPs7y1bFxvk1/9Ih2rn3Xr5AWz+eMS+n8RpH3djBVVAQpdIAeYQgcn+VCSsTg==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extension-underline@3.27.1(@tiptap/core@3.27.1): + resolution: {integrity: sha512-N889J4nXN/TPfVt8uF9N1A0SY82E90zwc1y26lqOcw6KWNLmQrlhMh/9OD4ikLDbekmFpOBq/UicpHf/6S8hbQ==} + peerDependencies: + '@tiptap/core': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + dev: false + + /@tiptap/extensions@3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1): + resolution: {integrity: sha512-1Tdx9faw8k0/83V6X+xCDVhV8yElGt95JxeW3YMkKQJI56QdlPz0xOdJPlMiSGJKinPyVier+x9LJD/YZUZIaw==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + + /@tiptap/pm@3.27.1: + resolution: {integrity: sha512-Ffjx+vimmBU7zH/KrpXzJid3+pziCe/VL2aexSTP63cyQwKQ65LkFkCKaIsSpFdQQuakVZBGWjCA5RoBV852pw==} + dependencies: + prosemirror-changeset: 2.4.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.9 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.9 + dev: false + + /@tiptap/react@3.27.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1)(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3): + resolution: {integrity: sha512-/Wn2fc9zMtX08MXYScDFsm4wJ8lzfhfPEdbtls7WCDlbtrop48PWlkHDBBJrywARfAQTB2mFs9KiFy9yrQm5Lg==} + peerDependencies: + '@tiptap/core': 3.27.1 + '@tiptap/pm': 3.27.1 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@types/use-sync-external-store': 0.0.6 + fast-equals: 5.4.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-floating-menu': 3.27.1(@floating-ui/dom@1.7.5)(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + transitivePeerDependencies: + - '@floating-ui/dom' + dev: false + + /@tiptap/starter-kit@3.27.1: + resolution: {integrity: sha512-vfxRsqW8rCc0k4pzo0ilU3wobVi2wqVj88VZI2SlgZlNnUAkrDGDIAph7CTa9k9fshV+O1ivpEgPC5yC046jow==} + dependencies: + '@tiptap/core': 3.27.1(@tiptap/pm@3.27.1) + '@tiptap/extension-blockquote': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-bold': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-bullet-list': 3.27.1(@tiptap/extension-list@3.27.1) + '@tiptap/extension-code': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-code-block': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-document': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-dropcursor': 3.27.1(@tiptap/extensions@3.27.1) + '@tiptap/extension-gapcursor': 3.27.1(@tiptap/extensions@3.27.1) + '@tiptap/extension-hard-break': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-heading': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-horizontal-rule': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-italic': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-link': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-list': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/extension-list-item': 3.27.1(@tiptap/extension-list@3.27.1) + '@tiptap/extension-list-keymap': 3.27.1(@tiptap/extension-list@3.27.1) + '@tiptap/extension-ordered-list': 3.27.1(@tiptap/extension-list@3.27.1) + '@tiptap/extension-paragraph': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-strike': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-text': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extension-underline': 3.27.1(@tiptap/core@3.27.1) + '@tiptap/extensions': 3.27.1(@tiptap/core@3.27.1)(@tiptap/pm@3.27.1) + '@tiptap/pm': 3.27.1 + dev: false + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -3370,7 +3712,6 @@ packages: '@types/react': ^19.2.0 dependencies: '@types/react': 19.2.7 - dev: true /@types/react@19.2.7: resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} @@ -3403,6 +3744,10 @@ packages: resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} dev: false + /@types/use-sync-external-store@0.0.6: + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + dev: false + /@types/uuid@9.0.8: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true @@ -6276,6 +6621,11 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-equals@5.4.0: + resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} + engines: {node: '>=6.0.0'} + dev: false + /fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -7606,6 +7956,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /linkifyjs@4.3.3: + resolution: {integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==} + dev: false + /load-plugin@6.0.3: resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} dependencies: @@ -8637,6 +8991,10 @@ packages: wcwidth: 1.0.1 dev: true + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + /own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -9068,6 +9426,106 @@ packages: react-is: 16.13.1 dev: false + /prosemirror-changeset@2.4.1: + resolution: {integrity: sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==} + dependencies: + prosemirror-transform: 1.12.0 + dev: false + + /prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + dependencies: + prosemirror-model: 1.25.9 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + dev: false + + /prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.9 + dev: false + + /prosemirror-gapcursor@1.4.1: + resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.9 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.9 + dev: false + + /prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.9 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + dev: false + + /prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-model@1.25.9: + resolution: {integrity: sha512-pRTklkDDMMRopyoAcrr9wV/8g/RYgrLHBuJAb5hlEuYZRdm5yqmPjWId83fpBwPpSFqEdja0H7Dfd7z1X/npcA==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + dependencies: + prosemirror-model: 1.25.9 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + dev: false + + /prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + dependencies: + prosemirror-model: 1.25.9 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.9 + dev: false + + /prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.9 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.9 + dev: false + + /prosemirror-transform@1.12.0: + resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} + dependencies: + prosemirror-model: 1.25.9 + dev: false + + /prosemirror-view@1.41.9: + resolution: {integrity: sha512-clTunTX+eaLbr87L1V1QPheRlEQJyTlL3gXe9x3jQIk3rL0RVWxviDGz8tFaydwIVm+hKhYCyr+R/zBtWr9s6A==} + dependencies: + prosemirror-model: 1.25.9 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.0 + dev: false + /protobufjs@7.6.1: resolution: {integrity: sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==} engines: {node: '>=12.0.0'} @@ -9670,6 +10128,10 @@ packages: fsevents: 2.3.3 dev: true + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false + /rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} dev: true @@ -10901,6 +11363,14 @@ packages: tslib: 2.8.1 dev: false + /use-sync-external-store@1.6.0(react@19.2.3): + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + react: 19.2.3 + dev: false + /utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} dev: true @@ -11241,6 +11711,10 @@ packages: /vuvuzela@1.0.3: resolution: {integrity: sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==} + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + /w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'}