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:
- System maintenance at midnight.
- All users must log out.
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'}