mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
fixed types
This commit is contained in:
parent
35ffb850b7
commit
e35848718d
@ -1,139 +0,0 @@
|
|||||||
<a href="https://plane.so">
|
|
||||||
<img alt="This is the core engine that supports Rich Text Editing at Plane" src="https://novel.sh/opengraph-image.png">
|
|
||||||
<h1 align="center">Plane's Editor</h1>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
An open-source Notion-style WYSIWYG editor with AI-powered autocompletions.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://news.ycombinator.com/item?id=36360789"><img src="https://img.shields.io/badge/Hacker%20News-369-%23FF6600" alt="Hacker News"></a>
|
|
||||||
<a href="https://github.com/steven-tey/novel/blob/main/LICENSE">
|
|
||||||
<img src="https://img.shields.io/github/license/steven-tey/novel?label=license&logo=github&color=f80&logoColor=fff" alt="License" />
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/steven-tey/novel"><img src="https://img.shields.io/github/stars/steven-tey/novel?style=social" alt="Novel.sh's GitHub repo"></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="#introduction"><strong>Introduction</strong></a> ·
|
|
||||||
<a href="#installation"><strong>Installation</strong></a> ·
|
|
||||||
<a href="#deploy-your-own"><strong>Deploy Your Own</strong></a> ·
|
|
||||||
<a href="#setting-up-locally"><strong>Setting Up Locally</strong></a> ·
|
|
||||||
<a href="#tech-stack"><strong>Tech Stack</strong></a> ·
|
|
||||||
<a href="#contributing"><strong>Contributing</strong></a> ·
|
|
||||||
<a href="#license"><strong>License</strong></a>
|
|
||||||
</p>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
[Novel](https://novel.sh/) is a Notion-style WYSIWYG editor with AI-powered autocompletions.
|
|
||||||
|
|
||||||
https://github.com/steven-tey/novel/assets/28986134/2099877f-4f2b-4b1c-8782-5d803d63be5c
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
To use Novel in a project, you can run the following command to install the `novel` [NPM package](https://www.npmjs.com/package/novel):
|
|
||||||
|
|
||||||
```
|
|
||||||
npm i novel
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, you can use it in your code like this:
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
import { Editor } from "novel";
|
|
||||||
|
|
||||||
export default function App() {
|
|
||||||
return <Editor />;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The `Editor` is a React component that takes in the following props:
|
|
||||||
|
|
||||||
| Prop | Type | Description | Default |
|
|
||||||
| ------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| `completionApi` | `string` | The API route to use for the OpenAI completion API. | `/api/generate` |
|
|
||||||
| `className` | `string` | Editor container classname. | `"relative min-h-[500px] w-full max-w-screen-lg border-stone-200 bg-white sm:mb-[calc(20vh)] sm:rounded-lg sm:border sm:shadow-lg"` |
|
|
||||||
| `defaultValue` | `JSONContent` or `string` | The default value to use for the editor. | [`defaultEditorContent`](https://github.com/steven-tey/novel/blob/main/packages/core/src/ui/editor/default-content.tsx) |
|
|
||||||
| `extensions` | `Extension[]` | A list of extensions to use for the editor, in addition to the [default Novel extensions](https://github.com/steven-tey/novel/blob/main/packages/core/src/ui/editor/extensions/index.tsx). | `[]` |
|
|
||||||
| `editorProps` | `EditorProps` | Props to pass to the underlying Tiptap editor, in addition to the [default Novel editor props](https://github.com/steven-tey/novel/blob/main/packages/core/src/ui/editor/props.ts). | `{}` |
|
|
||||||
| `onUpdate` | `(editor?: Editor) => void` | A callback function that is called whenever the editor is updated. | `() => {}` |
|
|
||||||
| `onDebouncedUpdate` | `(editor?: Editor) => void` | A callback function that is called whenever the editor is updated, but only after the defined debounce duration. | `() => {}` |
|
|
||||||
| `debounceDuration` | `number` | The duration (in milliseconds) to debounce the `onDebouncedUpdate` callback. | `750` |
|
|
||||||
| `storageKey` | `string` | The key to use for storing the editor's value in local storage. | `novel__content` |
|
|
||||||
|
|
||||||
> **Note**: Make sure to define an API endpoint that matches the `completionApi` prop (default is `/api/generate`). This is needed for the AI autocompletions to work. Here's an example: https://github.com/steven-tey/novel/blob/main/apps/web/app/api/generate/route.ts
|
|
||||||
|
|
||||||
Here's an example application: https://github.com/steven-tey/novella
|
|
||||||
|
|
||||||
## Deploy Your Own
|
|
||||||
|
|
||||||
You can deploy your own version of Novel to Vercel with one click:
|
|
||||||
|
|
||||||
[](https://stey.me/novel-deploy)
|
|
||||||
|
|
||||||
## Setting Up Locally
|
|
||||||
|
|
||||||
To set up Novel locally, you'll need to clone the repository and set up the following environment variables:
|
|
||||||
|
|
||||||
- `OPENAI_API_KEY` – your OpenAI API key (you can get one [here](https://platform.openai.com/account/api-keys))
|
|
||||||
- `BLOB_READ_WRITE_TOKEN` – your Vercel Blob read/write token (currently [still in beta](https://vercel.com/docs/storage/vercel-blob/quickstart#quickstart), but feel free to [sign up on this form](https://vercel.fyi/blob-beta) for access)
|
|
||||||
|
|
||||||
If you've deployed this to Vercel, you can also use [`vc env pull`](https://vercel.com/docs/cli/env#exporting-development-environment-variables) to pull the environment variables from your Vercel project.
|
|
||||||
|
|
||||||
To run the app locally, you can run the following commands:
|
|
||||||
|
|
||||||
```
|
|
||||||
pnpm i
|
|
||||||
pnpm build
|
|
||||||
pnpm dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Cross-framework support
|
|
||||||
|
|
||||||
While Novel is built for React, we also have a few community-maintained packages for non-React frameworks:
|
|
||||||
|
|
||||||
- Svelte: https://novel.sh/svelte
|
|
||||||
- Vue: https://novel.sh/vue
|
|
||||||
|
|
||||||
## VSCode Extension
|
|
||||||
|
|
||||||
Thanks to @bennykok, Novel also has a VSCode Extension: https://novel.sh/vscode
|
|
||||||
|
|
||||||
https://github.com/steven-tey/novel/assets/28986134/58ebf7e3-cdb3-43df-878b-119e304f7373
|
|
||||||
|
|
||||||
## Tech Stack
|
|
||||||
|
|
||||||
Novel is built on the following stack:
|
|
||||||
|
|
||||||
- [Next.js](https://nextjs.org/) – framework
|
|
||||||
- [Tiptap](https://tiptap.dev/) – text editor
|
|
||||||
- [OpenAI](https://openai.com/) - AI completions
|
|
||||||
- [Vercel AI SDK](https://sdk.vercel.ai/docs) – AI library
|
|
||||||
- [Vercel](https://vercel.com) – deployments
|
|
||||||
- [TailwindCSS](https://tailwindcss.com/) – styles
|
|
||||||
- [Cal Sans](https://github.com/calcom/font) – font
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Here's how you can contribute:
|
|
||||||
|
|
||||||
- [Open an issue](https://github.com/steven-tey/novel/issues) if you believe you've encountered a bug.
|
|
||||||
- Make a [pull request](https://github.com/steven-tey/novel/pull) to add new features/make quality-of-life improvements/fix bugs.
|
|
||||||
|
|
||||||
<a href="https://github.com/steven-tey/novel/graphs/contributors">
|
|
||||||
<img src="https://contrib.rocks/image?repo=steven-tey/novel" />
|
|
||||||
</a>
|
|
||||||
|
|
||||||
## Repo Activity
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Licensed under the [Apache-2.0 license](https://github.com/steven-tey/novel/blob/main/LICENSE.md).
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "plane-editor",
|
"name": "@plane/editor",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "Rich Text Editor that powers Plane",
|
"description": "Rich Text Editor that powers Plane",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
@ -27,15 +27,11 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@blueprintjs/popover2": "^2.0.10",
|
"@blueprintjs/popover2": "^2.0.10",
|
||||||
"@tiptap/core": "^2.1.7",
|
"@tiptap/core": "^2.1.7",
|
||||||
"@tiptap/extension-blockquote": "^2.1.10",
|
|
||||||
"@tiptap/extension-bullet-list": "^2.1.10",
|
|
||||||
"@tiptap/extension-code-block-lowlight": "^2.0.4",
|
"@tiptap/extension-code-block-lowlight": "^2.0.4",
|
||||||
"@tiptap/extension-highlight": "^2.1.7",
|
"@tiptap/extension-highlight": "^2.1.7",
|
||||||
"@tiptap/extension-horizontal-rule": "^2.1.7",
|
"@tiptap/extension-horizontal-rule": "^2.1.7",
|
||||||
"@tiptap/extension-image": "^2.1.7",
|
"@tiptap/extension-image": "^2.1.7",
|
||||||
"@tiptap/extension-link": "^2.1.7",
|
"@tiptap/extension-link": "^2.1.7",
|
||||||
"@tiptap/extension-list-item": "^2.1.10",
|
|
||||||
"@tiptap/extension-ordered-list": "^2.1.10",
|
|
||||||
"@tiptap/extension-placeholder": "2.0.3",
|
"@tiptap/extension-placeholder": "2.0.3",
|
||||||
"@tiptap/extension-table": "^2.1.6",
|
"@tiptap/extension-table": "^2.1.6",
|
||||||
"@tiptap/extension-table-cell": "^2.1.6",
|
"@tiptap/extension-table-cell": "^2.1.6",
|
||||||
@ -63,7 +59,6 @@
|
|||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"react-markdown": "^8.0.7",
|
"react-markdown": "^8.0.7",
|
||||||
"sonner": "^0.7.0",
|
|
||||||
"tailwind-merge": "^1.14.0",
|
"tailwind-merge": "^1.14.0",
|
||||||
"tippy.js": "^6.3.7",
|
"tippy.js": "^6.3.7",
|
||||||
"tiptap-markdown": "^0.8.2",
|
"tiptap-markdown": "^0.8.2",
|
||||||
|
@ -1 +1 @@
|
|||||||
export type UploadImage = (workspaceSlug: string, formData: FormData) => Promise<string>;
|
export type UploadImage = (workspaceSlug: string, formData: FormData) => Promise<any>;
|
@ -1,9 +1,9 @@
|
|||||||
import Image from "@tiptap/extension-image";
|
import Image from "@tiptap/extension-image";
|
||||||
import TrackImageDeletionPlugin from "@/ui/editor/plugins/delete-image";
|
import TrackImageDeletionPlugin from "@/ui/editor/plugins/delete-image";
|
||||||
import UploadImagesPlugin from "@/ui/editor/plugins/upload-image";
|
import UploadImagesPlugin from "@/ui/editor/plugins/upload-image";
|
||||||
import { DeleteFileFunction } from "@/types/delete-file";
|
import { DeleteImage } from "@/types/delete-image";
|
||||||
|
|
||||||
const UpdatedImage = (deleteImage: DeleteFileFunction) => Image.extend({
|
const UpdatedImage = (deleteImage: DeleteImage) => Image.extend({
|
||||||
addProseMirrorPlugins() {
|
addProseMirrorPlugins() {
|
||||||
return [UploadImagesPlugin(), TrackImageDeletionPlugin(deleteImage)];
|
return [UploadImagesPlugin(), TrackImageDeletionPlugin(deleteImage)];
|
||||||
},
|
},
|
||||||
|
@ -12,9 +12,6 @@ import Highlight from "@tiptap/extension-highlight";
|
|||||||
import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
|
import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
|
||||||
import { InputRule } from "@tiptap/core";
|
import { InputRule } from "@tiptap/core";
|
||||||
import Gapcursor from "@tiptap/extension-gapcursor";
|
import Gapcursor from "@tiptap/extension-gapcursor";
|
||||||
import OrderedList from "@tiptap/extension-ordered-list";
|
|
||||||
import ListItem from "@tiptap/extension-list-item";
|
|
||||||
import BulletList from "@tiptap/extension-bullet-list";
|
|
||||||
import { Table } from "@/ui/editor/extensions/table/table";
|
import { Table } from "@/ui/editor/extensions/table/table";
|
||||||
import { TableHeader } from "@/ui/editor/extensions/table/table-header";
|
import { TableHeader } from "@/ui/editor/extensions/table/table-header";
|
||||||
import { TableRow } from "@tiptap/extension-table-row";
|
import { TableRow } from "@tiptap/extension-table-row";
|
||||||
@ -23,8 +20,8 @@ import { CustomTableCell } from "@/ui/editor/extensions/table/table-cell";
|
|||||||
import UpdatedImage from "@/ui/editor/extensions/image/updated-image";
|
import UpdatedImage from "@/ui/editor/extensions/image/updated-image";
|
||||||
import SlashCommand from "@/ui/editor/extensions/slash-command";
|
import SlashCommand from "@/ui/editor/extensions/slash-command";
|
||||||
|
|
||||||
import { DeleteFileFunction } from "@/types/delete-file";
|
import { DeleteImage } from "@/types/delete-image";
|
||||||
import { UploadFileFunction } from "@/types/upload-file";
|
import { UploadImage } from "@/types/upload-image";
|
||||||
|
|
||||||
import isValidHttpUrl from "@/ui/editor/menus/bubble-menu/utils"
|
import isValidHttpUrl from "@/ui/editor/menus/bubble-menu/utils"
|
||||||
|
|
||||||
@ -36,8 +33,8 @@ lowlight.registerLanguage("ts", ts);
|
|||||||
|
|
||||||
export const TiptapExtensions = (
|
export const TiptapExtensions = (
|
||||||
workspaceSlug: string,
|
workspaceSlug: string,
|
||||||
uploadFile: UploadFileFunction,
|
uploadFile: UploadImage,
|
||||||
deleteFile: DeleteFileFunction,
|
deleteFile: DeleteImage,
|
||||||
setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void
|
setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void
|
||||||
) => [
|
) => [
|
||||||
StarterKit.configure({
|
StarterKit.configure({
|
||||||
|
@ -19,7 +19,7 @@ import {
|
|||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import { startImageUpload } from "@/ui/editor/plugins/upload-image";
|
import { startImageUpload } from "@/ui/editor/plugins/upload-image";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { UploadImage } from "@/types/upload-file";
|
import { UploadImage } from "@/types/upload-image";
|
||||||
|
|
||||||
interface CommandItemProps {
|
interface CommandItemProps {
|
||||||
title: string;
|
title: string;
|
||||||
|
@ -8,8 +8,8 @@ import { TiptapExtensions } from '@/ui/editor/extensions';
|
|||||||
import { EditorBubbleMenu } from '@/ui/editor/menus/bubble-menu';
|
import { EditorBubbleMenu } from '@/ui/editor/menus/bubble-menu';
|
||||||
import { ImageResizer } from '@/ui/editor/extensions/image/image-resize';
|
import { ImageResizer } from '@/ui/editor/extensions/image/image-resize';
|
||||||
import { TiptapEditorProps } from '@/ui/editor/props';
|
import { TiptapEditorProps } from '@/ui/editor/props';
|
||||||
import { UploadImage } from '@/types/upload-file';
|
import { UploadImage } from '@/types/upload-image';
|
||||||
import { DeleteImage } from '@/types/delete-file';
|
import { DeleteImage } from '@/types/delete-image';
|
||||||
|
|
||||||
export interface ITipTapRichTextEditor {
|
export interface ITipTapRichTextEditor {
|
||||||
value: string;
|
value: string;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { EditorState, Plugin, PluginKey, Transaction } from "@tiptap/pm/state";
|
import { EditorState, Plugin, PluginKey, Transaction } from "@tiptap/pm/state";
|
||||||
import { Node as ProseMirrorNode } from "@tiptap/pm/model";
|
import { Node as ProseMirrorNode } from "@tiptap/pm/model";
|
||||||
import { DeleteFileFunction } from "@/types/delete-file";
|
import { DeleteImage } from "@/types/delete-image";
|
||||||
|
|
||||||
const deleteKey = new PluginKey("delete-image");
|
const deleteKey = new PluginKey("delete-image");
|
||||||
const IMAGE_NODE_TYPE = "image";
|
const IMAGE_NODE_TYPE = "image";
|
||||||
@ -12,7 +12,7 @@ interface ImageNode extends ProseMirrorNode {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const TrackImageDeletionPlugin = (deleteImage: DeleteFileFunction): Plugin =>
|
const TrackImageDeletionPlugin = (deleteImage: DeleteImage): Plugin =>
|
||||||
new Plugin({
|
new Plugin({
|
||||||
key: deleteKey,
|
key: deleteKey,
|
||||||
appendTransaction: (transactions: readonly Transaction[], oldState: EditorState, newState: EditorState) => {
|
appendTransaction: (transactions: readonly Transaction[], oldState: EditorState, newState: EditorState) => {
|
||||||
@ -55,7 +55,7 @@ const TrackImageDeletionPlugin = (deleteImage: DeleteFileFunction): Plugin =>
|
|||||||
|
|
||||||
export default TrackImageDeletionPlugin;
|
export default TrackImageDeletionPlugin;
|
||||||
|
|
||||||
async function onNodeDeleted(src: string, deleteImage: DeleteFileFunction): Promise<void> {
|
async function onNodeDeleted(src: string, deleteImage: DeleteImage): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const assetUrlWithWorkspaceId = new URL(src).pathname.substring(1);
|
const assetUrlWithWorkspaceId = new URL(src).pathname.substring(1);
|
||||||
const resStatus = await deleteImage(assetUrlWithWorkspaceId);
|
const resStatus = await deleteImage(assetUrlWithWorkspaceId);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { UploadFileFunction, UploadImage } from "@/types/upload-file";
|
import { UploadImage } from "@/types/upload-image";
|
||||||
import { EditorState, Plugin, PluginKey } from "@tiptap/pm/state";
|
import { EditorState, Plugin, PluginKey } from "@tiptap/pm/state";
|
||||||
import { Decoration, DecorationSet, EditorView } from "@tiptap/pm/view";
|
import { Decoration, DecorationSet, EditorView } from "@tiptap/pm/view";
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ export async function startImageUpload(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const UploadImageHandler = (file: File, workspaceSlug: string,
|
const UploadImageHandler = (file: File, workspaceSlug: string,
|
||||||
uploadFile: UploadFileFunction
|
uploadFile: UploadImage
|
||||||
): Promise<string> => {
|
): Promise<string> => {
|
||||||
if (!workspaceSlug) {
|
if (!workspaceSlug) {
|
||||||
return Promise.reject("Workspace slug is missing");
|
return Promise.reject("Workspace slug is missing");
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { EditorProps } from "@tiptap/pm/view";
|
import { EditorProps } from "@tiptap/pm/view";
|
||||||
import { findTableAncestor } from "@/ui/editor/menus/table-menu";
|
import { findTableAncestor } from "@/ui/editor/menus/table-menu";
|
||||||
import { startImageUpload } from "@/ui/editor/plugins/upload-image";
|
import { startImageUpload } from "@/ui/editor/plugins/upload-image";
|
||||||
import { UploadImage } from "@/types/upload-file";
|
import { UploadImage } from "@/types/upload-image";
|
||||||
|
|
||||||
export function TiptapEditorProps(
|
export function TiptapEditorProps(
|
||||||
workspaceSlug: string,
|
workspaceSlug: string,
|
||||||
|
@ -80,7 +80,7 @@
|
|||||||
"tlds": "^1.238.0",
|
"tlds": "^1.238.0",
|
||||||
"use-debounce": "^9.0.4",
|
"use-debounce": "^9.0.4",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
"plane-editor": "*"
|
"@plane/editor": "*"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/js-cookie": "^3.0.2",
|
"@types/js-cookie": "^3.0.2",
|
||||||
@ -101,8 +101,5 @@
|
|||||||
"tsconfig": "*",
|
"tsconfig": "*",
|
||||||
"tailwind-config": "*",
|
"tailwind-config": "*",
|
||||||
"typescript": "4.7.4"
|
"typescript": "4.7.4"
|
||||||
},
|
|
||||||
"resolutions": {
|
|
||||||
"prosemirror-model": "1.18.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
yarn.lock
14
yarn.lock
@ -7190,7 +7190,14 @@ prosemirror-menu@^1.2.1:
|
|||||||
prosemirror-history "^1.0.0"
|
prosemirror-history "^1.0.0"
|
||||||
prosemirror-state "^1.0.0"
|
prosemirror-state "^1.0.0"
|
||||||
|
|
||||||
prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.19.0, prosemirror-model@^1.8.1:
|
prosemirror-model@^1.0.0, prosemirror-model@^1.16.0, prosemirror-model@^1.18.1, prosemirror-model@^1.8.1:
|
||||||
|
version "1.18.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.18.1.tgz#1d5d6b6de7b983ee67a479dc607165fdef3935bd"
|
||||||
|
integrity sha512-IxSVBKAEMjD7s3n8cgtwMlxAXZrC7Mlag7zYsAKDndAqnDScvSmp/UdnRTV/B33lTCVU3CCm7dyAn/rVVD0mcw==
|
||||||
|
dependencies:
|
||||||
|
orderedmap "^2.0.0"
|
||||||
|
|
||||||
|
prosemirror-model@^1.19.0:
|
||||||
version "1.19.3"
|
version "1.19.3"
|
||||||
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.3.tgz#f0d55285487fefd962d0ac695f716f4ec6705006"
|
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.19.3.tgz#f0d55285487fefd962d0ac695f716f4ec6705006"
|
||||||
integrity sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==
|
integrity sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==
|
||||||
@ -7951,11 +7958,6 @@ sonner@^0.6.2:
|
|||||||
resolved "https://registry.yarnpkg.com/sonner/-/sonner-0.6.2.tgz#d87420e80d8b25b6d2bd6aabcc28465f03962bdc"
|
resolved "https://registry.yarnpkg.com/sonner/-/sonner-0.6.2.tgz#d87420e80d8b25b6d2bd6aabcc28465f03962bdc"
|
||||||
integrity sha512-bh4FWhYoNN481ZIW94W4e0kSLBTMGislYg2YXvDS1px1AJJz4erQe9jHV8s5pS1VMVDgfh3CslNSFLaU6Ldrnw==
|
integrity sha512-bh4FWhYoNN481ZIW94W4e0kSLBTMGislYg2YXvDS1px1AJJz4erQe9jHV8s5pS1VMVDgfh3CslNSFLaU6Ldrnw==
|
||||||
|
|
||||||
sonner@^0.7.0:
|
|
||||||
version "0.7.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/sonner/-/sonner-0.7.1.tgz#46441caa4e94a0491fe8e7ce56887d097f90c4df"
|
|
||||||
integrity sha512-awbVcBwV0xV5TN7kJEZv6Sx7Fi9JBL26vTn0FnBcf6YsyWKnyvz16I/jE6omCtBjd0/YXsPHJ//VuA5fvD2vEg==
|
|
||||||
|
|
||||||
source-list-map@^2.0.0:
|
source-list-map@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
|
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
|
||||||
|
Loading…
Reference in New Issue
Block a user