feat: implement FieldRichTextEditor component using TipTap and Mantine integration

This commit is contained in:
Firman Ramdhani
2026-06-22 11:24:44 +07:00
parent eaec6ec38f
commit edd71243a4
10 changed files with 737 additions and 38 deletions
@@ -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: "<h2 style=\"text-align: center\">ERP Release Notes</h2><p>This is a <b>highly important</b> update. Please observe the following:</p><ul><li>System maintenance at <i>midnight</i>.</li><li><u style=\"text-align: justify\">All users must log out.</u></li></ul><p style=\"text-align: justify\">Thank you for your cooperation.</p>",
realPokeSelect: null,
multiRealPokeSelect: []
}
@@ -305,6 +308,23 @@ export default function AllFieldsDemo() {
clearable
/>
</Group>
<Title order={5} mb="sm" mt="lg" c="brand">Rich Text Editor (TipTap)</Title>
<Divider mb="md" />
<FieldRichTextEditor
name="richTextEmpty"
control={control}
label="Rich Text (Empty)"
description="A fresh TipTap editor instance"
/>
<div style={{ marginTop: '16px' }}>
<FieldRichTextEditor
name="richTextPrefilled"
control={control}
label="Rich Text (Prefilled / Edit Mode)"
description="HTML string successfully loaded from default values"
/>
</div>
</div>
{/* --- Toggles & Choices --- */}
@@ -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: "<p>Start typing to see the live preview...</p>",
},
});
@@ -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() {
</Alert>
)}
<Title order={5} mb="sm" c="brand" mt="lg">
Reactive Rich Text Preview
</Title>
<Divider mb="sm" />
<FieldRichTextEditor
name="richTextLive"
control={control as any}
label="Live Editor"
description="Type to see instantaneous reactive rendering below"
/>
<Paper p="md" withBorder radius="md" mt="sm">
<Title order={6} mb="xs">Live HTML Preview Render</Title>
<TypographyStylesProvider>
<div dangerouslySetInnerHTML={{ __html: watchedRichTextLive }} />
</TypographyStylesProvider>
</Paper>
<Button type="submit" mt="md">
{t.common?.submit || 'Submit Reactive Form'}
</Button>
@@ -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<typeof validationSchema>;
@@ -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
/>
<Title order={5} c="brand" mt="lg">Rich Text Editor Validations</Title>
<Divider mb="sm" />
<FieldRichTextEditor
name="richTextNotes"
control={control as any}
label="Important Notes"
description="This uses Zod minimum length string validation"
withAsterisk
/>
<Button type="submit" mt="md">{t.common.submit}</Button>
</Stack>
</form>
+7 -2
View File
@@ -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<DatePickerInputProps>(
| `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` | `<FileInput />` | `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).
---
+7
View File
@@ -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",
@@ -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<TFieldValues> = FieldPath<TFieldValues>,
> = UseControllerProps<TFieldValues, TName> & {
label?: React.ReactNode;
description?: React.ReactNode;
withAsterisk?: boolean;
};
function FieldRichTextEditorComponent<
TFieldValues extends FieldValues = FieldValues,
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
>(props: FieldRichTextEditorProps<TFieldValues, TName>) {
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 (
<Input.Wrapper
label={label}
description={description}
withAsterisk={withAsterisk}
error={translatedError}
>
<RichTextEditor editor={editor}>
<RichTextEditor.Toolbar sticky stickyOffset={60}>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Bold />
<RichTextEditor.Italic />
<RichTextEditor.Underline />
<RichTextEditor.Strikethrough />
<RichTextEditor.ClearFormatting />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.H1 />
<RichTextEditor.H2 />
<RichTextEditor.H3 />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.BulletList />
<RichTextEditor.OrderedList />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Link />
<RichTextEditor.Unlink />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.AlignLeft />
<RichTextEditor.AlignCenter />
<RichTextEditor.AlignRight />
<RichTextEditor.AlignJustify />
</RichTextEditor.ControlsGroup>
</RichTextEditor.Toolbar>
<RichTextEditor.Content />
</RichTextEditor>
</Input.Wrapper>
);
}
// Wrap with React.memo for identical performance characteristics as withRHF components
export const FieldRichTextEditor = React.memo(FieldRichTextEditorComponent) as typeof FieldRichTextEditorComponent;
+1
View File
@@ -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
+4
View File
@@ -1,4 +1,8 @@
export * from '@mantine/core';
export {
List,
TypographyStylesProvider,
} from '@mantine/core';
export * from './Form';
export * from './system-pages/coming-soon';
+54 -22
View File
@@ -1,18 +1,34 @@
/* =========================================
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`
========================================= */
/* 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);
@@ -24,6 +40,7 @@
--color-brand-800: var(--mantine-color-brand-8);
--color-brand-900: var(--mantine-color-brand-9);
/* 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);
@@ -35,6 +52,7 @@
--color-error-800: var(--mantine-color-error-8);
--color-error-900: var(--mantine-color-error-9);
/* 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);
@@ -46,6 +64,7 @@
--color-warning-800: var(--mantine-color-warning-8);
--color-warning-900: var(--mantine-color-warning-9);
/* 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);
@@ -57,6 +76,7 @@
--color-success-800: var(--mantine-color-success-8);
--color-success-900: var(--mantine-color-success-9);
/* 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);
@@ -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,9 +284,10 @@
}
/* =========================================
BASE RESETS
9. BASE RESETS
Applies global typography smoothing and
sets the root font size.
========================================= */
@layer base {
body {
font-size: var(--base-font-size);
+478 -4
View File
@@ -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'}