diff --git a/examples/editor/examples/basic/App.tsx b/examples/editor/examples/basic/App.tsx index b703b065c..99e7379a3 100644 --- a/examples/editor/examples/basic/App.tsx +++ b/examples/editor/examples/basic/App.tsx @@ -9,16 +9,11 @@ import { uploadToTmpFilesDotOrg_DEV_ONLY, } from "@blocknote/core"; import { + BlockNoteDefaultUI, BlockNoteView, createReactInlineContentSpec, - DefaultSlashMenu, - FormattingToolbarPositioner, - HyperlinkToolbarPositioner, - ImageToolbarPositioner, - SideMenuPositioner, - SlashMenuPositioner, - SuggestionMenuPositioner, - TableHandlesPositioner, + DefaultPositionedSuggestionMenu, + SuggestionMenuItemProps, useBlockNote, } from "@blocknote/react"; import "@blocknote/react/style.css"; @@ -53,17 +48,23 @@ const customInlineContentSchema = { mention: MentionInlineContent.config, } satisfies InlineContentSchema; -async function getMentionMenuItems(query: string) { +async function getMentionMenuItems( + editor: BlockNoteEditor< + DefaultBlockSchema, + typeof customInlineContentSchema, + DefaultStyleSchema + >, + query: string, + closeMenu: () => void, + clearQuery: () => void +): Promise { const users = ["Steve", "Bob", "Joe", "Mike"]; - const items = users.map((user) => ({ + const items: SuggestionMenuItemProps[] = users.map((user) => ({ name: user, - execute: ( - editor: BlockNoteEditor< - DefaultBlockSchema, - typeof customInlineContentSchema, - DefaultStyleSchema - > - ) => { + execute: () => { + closeMenu(); + clearQuery(); + editor._tiptapEditor.commands.insertContent({ type: "mention", attrs: { @@ -94,32 +95,21 @@ export function App() { }, }, uploadFile: uploadToTmpFilesDotOrg_DEV_ONLY, - extraSuggestionMenus: [ - { - name: "mentions", - triggerCharacter: "@", - getItems: getMentionMenuItems, - }, - ], }); // Give tests a way to get prosemirror instance (window as WindowWithProseMirror).ProseMirror = editor?._tiptapEditor; + // TODO: Figure out cleaner API for adding/changing/removing menus & toolbars return ( - - - - - - {editor.blockSchema.table && ( - - )} - + + getMentionMenuItems(editor, query, closeMenu, clearQuery) + } /> ); diff --git a/examples/editor/package.json b/examples/editor/package.json index 711a3c76c..e60a795e2 100644 --- a/examples/editor/package.json +++ b/examples/editor/package.json @@ -1,7 +1,7 @@ { "name": "@blocknote/example-editor", "private": true, - "version": "0.11.0", + "version": "0.11.2", "scripts": { "dev": "vite", "build": "tsc && vite build", @@ -10,9 +10,9 @@ "clean": "rimraf dist" }, "dependencies": { - "@blocknote/core": "^0.11.0", - "@blocknote/react": "^0.11.0", - "@mantine/core": "^7.3.1", + "@blocknote/core": "^0.11.2", + "@blocknote/react": "^0.11.2", + "@mantine/core": "^7.4.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.20.0", diff --git a/examples/editor/src/main.tsx b/examples/editor/src/main.tsx index ff07f62c9..31ea82f01 100644 --- a/examples/editor/src/main.tsx +++ b/examples/editor/src/main.tsx @@ -8,13 +8,13 @@ import { createBrowserRouter, } from "react-router-dom"; +import "./style.css"; import { App } from "../examples/basic/App"; import { ReactCustomBlocks } from "../examples/react-custom-blocks/App"; import { ReactInlineContent } from "../examples/react-custom-inline-content/App"; import { ReactStyles } from "../examples/react-custom-styles/App"; import { CustomBlocks } from "../examples/vanilla-custom-blocks/App"; import { InlineContent } from "../examples/vanilla-custom-inline-content/App"; -import "./style.css"; window.React = React; diff --git a/examples/editor/src/style.css b/examples/editor/src/style.css index e5369ae43..a5130ce3b 100644 --- a/examples/editor/src/style.css +++ b/examples/editor/src/style.css @@ -1,6 +1,4 @@ -body { - height: auto; -} +@import url("@mantine/core/styles.css"); .editor { margin: 8px calc((100% - 731px) / 2) 0; diff --git a/examples/vanilla/package.json b/examples/vanilla/package.json index 00c566a4b..32906f0cb 100644 --- a/examples/vanilla/package.json +++ b/examples/vanilla/package.json @@ -1,7 +1,7 @@ { "name": "@blocknote/example-vanilla", "private": true, - "version": "0.11.0", + "version": "0.11.2", "scripts": { "dev": "vite", "build": "tsc && vite build", @@ -9,7 +9,7 @@ "lint": "eslint src --max-warnings 0" }, "dependencies": { - "@blocknote/core": "^0.11.0" + "@blocknote/core": "^0.11.2" }, "devDependencies": { "eslint": "^8.10.0", diff --git a/examples/vanilla/src/ui/addSlashMenu.ts b/examples/vanilla/src/ui/addSlashMenu.ts index f0a79d5d7..98355a43d 100644 --- a/examples/vanilla/src/ui/addSlashMenu.ts +++ b/examples/vanilla/src/ui/addSlashMenu.ts @@ -1,10 +1,4 @@ -import { - BlockNoteEditor, - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema, - SuggestionItem, -} from "@blocknote/core"; +import { BlockNoteEditor } from "@blocknote/core"; import { createButton } from "./util"; export const addSlashMenu = async (editor: BlockNoteEditor) => { @@ -12,28 +6,13 @@ export const addSlashMenu = async (editor: BlockNoteEditor) => { async function updateItems( query: string, - getItems: ( - query: string - ) => Promise< - SuggestionItem< - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema - >[] - >, - onClick: ( - item: SuggestionItem< - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema - > - ) => void + getItems: (query: string) => Promise ) { element.innerHTML = ""; const items = await getItems(query); - const domItems = items.map((val, i) => { - const element = createButton(val.name, () => { - onClick(val); + const domItems = items.map((val) => { + const element = createButton(val.text, () => { + val.executeItem(); }); element.style.display = "block"; return element; @@ -42,7 +21,7 @@ export const addSlashMenu = async (editor: BlockNoteEditor) => { return domItems; } - editor.suggestionMenus.slashMenu.onUpdate(async (slashMenuState) => { + editor.suggestionMenus.onUpdate("slashMenu", async (slashMenuState) => { if (!element) { element = document.createElement("div"); element.style.background = "gray"; @@ -55,11 +34,76 @@ export const addSlashMenu = async (editor: BlockNoteEditor) => { } if (slashMenuState.show) { - await updateItems( - slashMenuState.query, - editor.suggestionMenus.slashMenu.getItems, - editor.suggestionMenus.slashMenu.executeItem - ); + // TODO: Default vanilla getItems data type? + const getItems = async (query: string) => { + const items = [ + { + text: "Heading", + aliases: ["h", "heading1", "h1"], + executeItem: () => { + editor.suggestionMenus.closeMenu(); + editor.suggestionMenus.clearQuery(); + + editor.insertBlocks( + [ + { + type: "heading", + }, + ], + editor.getTextCursorPosition().block, + "after" + ); + }, + }, + { + text: "List", + aliases: ["ul", "li", "list", "bulletlist", "bullet list"], + executeItem: () => { + editor.suggestionMenus.closeMenu(); + editor.suggestionMenus.clearQuery(); + + editor.insertBlocks( + [ + { + type: "bulletListItem", + }, + ], + editor.getTextCursorPosition().block, + "after" + ); + }, + }, + { + text: "Paragraph", + aliases: ["p", "paragraph"], + executeItem: () => { + editor.suggestionMenus.closeMenu(); + editor.suggestionMenus.clearQuery(); + + editor.insertBlocks( + [ + { + type: "paragraph", + }, + ], + editor.getTextCursorPosition().block, + "after" + ); + }, + }, + ]; + + return items.filter( + ({ text, aliases }) => + text.toLowerCase().startsWith(query.toLowerCase()) || + (aliases && + aliases.filter((alias) => + alias.toLowerCase().startsWith(query.toLowerCase()) + ).length !== 0) + ); + }; + + await updateItems(slashMenuState.query, getItems); element.style.display = "block"; diff --git a/lerna.json b/lerna.json index aa5d9a958..ff5732907 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "$schema": "node_modules/lerna/schemas/lerna-schema.json", "useNx": false, "useWorkspaces": true, - "version": "0.11.0" + "version": "0.11.2" } diff --git a/package-lock.json b/package-lock.json index c122bebd9..d43793e52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,11 +23,11 @@ }, "examples/editor": { "name": "@blocknote/example-editor", - "version": "0.11.0", + "version": "0.11.2", "dependencies": { - "@blocknote/core": "^0.11.0", - "@blocknote/react": "^0.11.0", - "@mantine/core": "^7.3.1", + "@blocknote/core": "^0.11.2", + "@blocknote/react": "^0.11.2", + "@mantine/core": "^7.4.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.20.0", @@ -45,63 +45,11 @@ "vite-plugin-eslint": "^1.8.1" } }, - "examples/editor/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "examples/editor/node_modules/glob": { - "version": "10.3.10", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "examples/editor/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "examples/editor/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "examples/editor/node_modules/rimraf": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^10.3.7" }, @@ -117,9 +65,9 @@ }, "examples/vanilla": { "name": "@blocknote/example-vanilla", - "version": "0.11.0", + "version": "0.11.2", "dependencies": { - "@blocknote/core": "^0.11.0" + "@blocknote/core": "^0.11.2" }, "devDependencies": { "eslint": "^8.10.0", @@ -183,132 +131,132 @@ } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz", - "integrity": "sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.0.tgz", - "integrity": "sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz", - "integrity": "sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/client-account": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.0.tgz", - "integrity": "sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.0.tgz", - "integrity": "sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.0.tgz", - "integrity": "sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.0.tgz", - "integrity": "sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-search": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.0.tgz", - "integrity": "sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", "dev": true, "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/logger-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.0.tgz", - "integrity": "sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.0.tgz", - "integrity": "sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", "dev": true, "dependencies": { - "@algolia/logger-common": "4.22.0" + "@algolia/logger-common": "4.22.1" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz", - "integrity": "sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.0.tgz", - "integrity": "sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz", - "integrity": "sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/transporter": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.0.tgz", - "integrity": "sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/requester-common": "4.22.0" + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" } }, "node_modules/@ampproject/remapping": { @@ -418,9 +366,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -428,11 +376,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -457,9 +405,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz", + "integrity": "sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -557,9 +505,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz", + "integrity": "sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -615,9 +563,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -840,14 +788,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", - "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -939,9 +887,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1016,12 +964,12 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz", - "integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", + "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.7", + "@babel/helper-create-class-features-plugin": "^7.23.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-decorators": "^7.23.3" }, @@ -1424,9 +1372,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1522,16 +1470,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -1808,9 +1755,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", @@ -2163,16 +2110,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -2349,9 +2296,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz", - "integrity": "sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", @@ -2381,13 +2328,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", @@ -2403,7 +2350,7 @@ "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", @@ -2429,9 +2376,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2511,9 +2458,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", - "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2522,23 +2469,23 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -2547,8 +2494,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2566,9 +2513,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -2600,9 +2547,9 @@ "link": true }, "node_modules/@codemirror/autocomplete": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.11.1.tgz", - "integrity": "sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", + "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", "dev": true, "dependencies": { "@codemirror/language": "^6.0.0", @@ -2643,9 +2590,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.7.tgz", - "integrity": "sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.8.tgz", + "integrity": "sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==", "dev": true, "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -2689,9 +2636,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.4.2.tgz", - "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz", + "integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==", "dev": true, "dependencies": { "@codemirror/state": "^6.0.0", @@ -2706,9 +2653,9 @@ "dev": true }, "node_modules/@codemirror/view": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz", - "integrity": "sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.1.tgz", + "integrity": "sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==", "dev": true, "dependencies": { "@codemirror/state": "^6.4.0", @@ -2780,60 +2727,6 @@ } } }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -3243,29 +3136,29 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", + "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", "dependencies": { - "@floating-ui/core": "^1.5.3", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/react": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.5.tgz", - "integrity": "sha512-LJeSQa+yOwV0Tdpc/C3Vr92QMrwRqRMTk4yOwsRJKc57x3Lcw317GE0EV+ECM7+Z89yEAPBe7nzbDEWfkWCrBA==", + "version": "0.26.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.8.tgz", + "integrity": "sha512-fOZb8BnJBrVohGPZ8RthDM5cHD9SnBKgY/U7LFXHhuwafSZD7TVmCX67+ezkkwxFbWpQGTEbgcjuHUDRonGy1g==", "dependencies": { - "@floating-ui/react-dom": "^2.0.5", - "@floating-ui/utils": "^0.2.0", + "@floating-ui/react-dom": "^2.0.8", + "@floating-ui/utils": "^0.2.1", "tabbable": "^6.0.1" }, "peerDependencies": { @@ -3274,11 +3167,11 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -3297,13 +3190,13 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -3324,9 +3217,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@hutson/parse-repository-url": { @@ -3367,35 +3260,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -3411,23 +3275,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", @@ -3485,9 +3332,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4079,6 +3926,12 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/npm-install/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/@lerna/npm-publish": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.6.2.tgz", @@ -4553,15 +4406,15 @@ } }, "node_modules/@lezer/common": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.0.tgz", - "integrity": "sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", "dev": true }, "node_modules/@lezer/css": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.6.tgz", - "integrity": "sha512-/HhbnfXchRc995VdDH9TBzd1B2CO/A4uhOhELqGjd7Bymgc+tGlb0W9Vp5GA1Otq8Ef4JCXpuKmr4hH3aFny6A==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.7.tgz", + "integrity": "sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==", "dev": true, "dependencies": { "@lezer/common": "^1.2.0", @@ -4590,28 +4443,29 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.12.tgz", - "integrity": "sha512-kwO5MftUiyfKBcECMEDc4HYnc10JME9kTJNPVoCXqJj/Y+ASWF0rgstORi3BThlQI6SoPSshrK5TjuiLFnr29A==", + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.13.tgz", + "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", "dev": true, "dependencies": { + "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "node_modules/@lezer/lr": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.14.tgz", - "integrity": "sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", "dev": true, "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@mantine/core": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.4.0.tgz", - "integrity": "sha512-wnQOz1aSpqVlCpdyY4XyJKRqlW87mexMADQrbCTwg/5BbxKp8XU6sTcnk1piwyR0mM6SI1uo0Yik2qYNGFlyWw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.5.0.tgz", + "integrity": "sha512-0Qfn4oLCs6Qrli+JK6Q325xhNblVEPSKOB4sDMUkvKYUlCt/2lsIhwUXarVBgiIV3X+rKccf0/LcEWmpn/dYuw==", "dependencies": { "@floating-ui/react": "^0.24.8", "clsx": "2.0.0", @@ -4621,7 +4475,7 @@ "type-fest": "^3.13.1" }, "peerDependencies": { - "@mantine/hooks": "7.4.0", + "@mantine/hooks": "7.5.0", "react": "^18.2.0", "react-dom": "^18.2.0" } @@ -4641,9 +4495,9 @@ } }, "node_modules/@mantine/hooks": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.4.0.tgz", - "integrity": "sha512-Swv23D8XmZqE2hohPBcff+ITwv5l8UlwiiEGMhL+ceUvJLnPzdwlW21qnLBtRtZWyQQ59TAav4M0GFGd93JS8Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.5.0.tgz", + "integrity": "sha512-KCL/RRMO+9HRIaNww3RIykifWL9XHovnANAyaCU2YUHOPyGCLSXs1UfFxsKNU71HaZ7cHwqSd7J0rR8JpVYLxw==", "peerDependencies": { "react": "^18.2.0" } @@ -4866,6 +4720,25 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -5349,14 +5222,14 @@ } }, "node_modules/@playwright/experimental-ct-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.40.1.tgz", - "integrity": "sha512-FjYQP74I2xVAO6W52+Yn2t48FDs+IhOHcWAwZHqAX+lHVHidz4f/b0FY3Qnq8+ZIt5TgqucEzGXbw/TdqJYDtA==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.41.1.tgz", + "integrity": "sha512-d7PxESV29x6W9RYs0mhkXmxr+6FfTbg2Tm/WJZlhgbIP+OLv79uJ8hl8ERsiBBFtH88sR+WmxHBMiZRpfpa6Fw==", "dev": true, "dependencies": { - "playwright": "1.40.1", - "playwright-core": "1.40.1", - "vite": "^4.4.10" + "playwright": "1.41.1", + "playwright-core": "1.41.1", + "vite": "^4.4.12" }, "bin": { "playwright": "cli.js" @@ -5366,12 +5239,12 @@ } }, "node_modules/@playwright/experimental-ct-react": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.40.1.tgz", - "integrity": "sha512-a2ubB04+pSswpWOgIwgBcSvvdvVNv4Cz8wud5ZLV5+4fcRqRACxFlGJPiVHw1zanhDSD+rH6H9+zaNm/o1iJHw==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.41.1.tgz", + "integrity": "sha512-Ht04RKD/4J69EPHOR4iAWtsOkkqswxonkcEEhniTNflGn30SoPyNww72LJECDrls+7AJayflJf4qe/cK1Ao/ug==", "dev": true, "dependencies": { - "@playwright/experimental-ct-core": "1.40.1", + "@playwright/experimental-ct-core": "1.41.1", "@vitejs/plugin-react": "^4.0.0" }, "bin": { @@ -5382,12 +5255,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.1.tgz", - "integrity": "sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.41.1.tgz", + "integrity": "sha512-9g8EWTjiQ9yFBXc6HjCWe41msLpxEX0KhmfmPl9RPLJdfzL4F0lg2BdJ91O9azFdl11y1pmpwdjBiSxvqc+btw==", "dev": true, "dependencies": { - "playwright": "1.40.1" + "playwright": "1.41.1" }, "bin": { "playwright": "cli.js" @@ -5450,9 +5323,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", - "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", "engines": { "node": ">=14.0.0" } @@ -5479,9 +5352,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz", - "integrity": "sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", "cpu": [ "arm" ], @@ -5493,9 +5366,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz", - "integrity": "sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", "cpu": [ "arm64" ], @@ -5507,9 +5380,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz", - "integrity": "sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", "cpu": [ "arm64" ], @@ -5521,9 +5394,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz", - "integrity": "sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", "cpu": [ "x64" ], @@ -5535,9 +5408,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz", - "integrity": "sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", "cpu": [ "arm" ], @@ -5549,9 +5422,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz", - "integrity": "sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", "cpu": [ "arm64" ], @@ -5563,9 +5436,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz", - "integrity": "sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", "cpu": [ "arm64" ], @@ -5577,9 +5450,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz", - "integrity": "sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", "cpu": [ "riscv64" ], @@ -5591,9 +5464,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz", - "integrity": "sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", "cpu": [ "x64" ], @@ -5605,9 +5478,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz", - "integrity": "sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", "cpu": [ "x64" ], @@ -5619,9 +5492,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz", - "integrity": "sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", "cpu": [ "arm64" ], @@ -5633,9 +5506,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz", - "integrity": "sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", "cpu": [ "ia32" ], @@ -5647,9 +5520,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz", - "integrity": "sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", "cpu": [ "x64" ], @@ -5661,9 +5534,9 @@ "peer": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", - "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", + "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", "dev": true }, "node_modules/@shuding/opentype.js": { @@ -5694,9 +5567,9 @@ "dev": true }, "node_modules/@tiptap/core": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz", - "integrity": "sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.2.0.tgz", + "integrity": "sha512-ped7XlQ9k5VyE2xUwyRegn1yVF/CAsaF+riBUBJ9+71/gSo2mCZ+6gQvee+LVN1+rD1qN/vWgKhKNDVaU+VaFg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5706,9 +5579,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.13.tgz", - "integrity": "sha512-6cHsQTh/rUiG4jkbJer3vk7g60I5tBwEBSGpdxmEHh83RsvevD8+n92PjA24hYYte5RNlATB011E1wu8PVhSvw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.2.0.tgz", + "integrity": "sha512-GlrI0FzUSzYhXoYbctcXALbyc22uKfZ0nv1k0qTw8qkKbWsz6qT/rm+rcB2YgugW3r6cu5n5HDQbzbgjapNAEA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5718,9 +5591,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.13.tgz", - "integrity": "sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.2.0.tgz", + "integrity": "sha512-ukwFb9wbwA/GkM7wGGv/ScKRBn4QSZkNzObhU6TgDKISjo1b7gGaUdC6gPoAFtQamCOCL8559PJIXXJ4wtL5/w==", "dependencies": { "tippy.js": "^6.3.7" }, @@ -5734,9 +5607,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.13.tgz", - "integrity": "sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.2.0.tgz", + "integrity": "sha512-SqAoJFuwqMzxyaKoULxEgo0e0fJjr/iOLQbnPSQEOuhgVaqRsaBSS3dbxgm94Gt29P7YPZ6IMqLSv/QZQzyjXw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5746,9 +5619,9 @@ } }, "node_modules/@tiptap/extension-collaboration": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.1.13.tgz", - "integrity": "sha512-EGzev7lONwOCaz7vWj/LkC9f86WLZIgRmqP7sD0xA7t8R+2qdEaRPeqwwy99EOataHxm9++BEd8hKAdBV8MVdw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.2.0.tgz", + "integrity": "sha512-8riEqnfQ465gxRzHynKbjhlc0oZ6iiEx8Rhhmabc1zjV1U49k/MC+ZmSz2WiDqKl22BCKUtSMt1VPi7QELVYYA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5756,26 +5629,26 @@ "peerDependencies": { "@tiptap/core": "^2.0.0", "@tiptap/pm": "^2.0.0", - "y-prosemirror": "1.0.20" + "y-prosemirror": "^1.2.1" } }, "node_modules/@tiptap/extension-collaboration-cursor": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.1.13.tgz", - "integrity": "sha512-K9HJ75GJ/IRNMHLqcbthJ9AXgVusBi8Q17NKPe41LU2/mD6gk6aKbH4P0q4SIfEsTCzP0P4fnz1D6s+z77aJZg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.2.0.tgz", + "integrity": "sha512-CfjCQJ9YEeXobC4KBcNON8RV4jC6GWLFfFVkWmpi0BBy1Ds9EiHlyTXSH/R+gu9VaM1gt7oRUwsP+HCOEu9rhA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { "@tiptap/core": "^2.0.0", - "y-prosemirror": "1.0.20" + "y-prosemirror": "^1.2.1" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.13.tgz", - "integrity": "sha512-NAyJi4BJxH7vl/2LNS1X0ndwFKjEtX+cRgshXCnMyh7qNpIRW6Plczapc/W1OiMncOEhZJfpZfkRSfwG01FWFg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.2.0.tgz", + "integrity": "sha512-7OfGn/EmDp3IN+OyjlFrgeO/GfmBZXMzwW/yWl+42ulhWItqeQ1qmApxOAj1zWes0hbVcULZXIpw3alfTvfPOA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5786,9 +5659,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.13.tgz", - "integrity": "sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.2.0.tgz", + "integrity": "sha512-psvRz/69Q/DnVHABYwMKlZv2C6AuLmcQQKTrEBHZKz7OX6E3pLveRVIjaetFg8jci8ZeNMPupKmeLzBVuN8U2A==", "dependencies": { "tippy.js": "^6.3.7" }, @@ -5802,9 +5675,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.13.tgz", - "integrity": "sha512-Cl5apsoTcyPPCgE3ThufxQxZ1wyqqh+9uxUN9VF9AbeTkid6oPZvKXwaILf6AFnkSy+SuKrb9kZD2iaezxpzXw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.2.0.tgz", + "integrity": "sha512-FsIoLA2xC1tUCK2cw5jWOKlwYNZgex3puMRwQaZjbph2oz8Jel8SRAzAwsfoi4JkaN9TpNlRP1i00xzGGaezow==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5815,9 +5688,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.13.tgz", - "integrity": "sha512-TGkMzMQayuKg+vN4du0x1ahEItBLcCT1jdWeRsjdM8gHfzbPLdo4PQhVsvm1I0xaZmbJZelhnVsUwRZcIu1WNA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.2.0.tgz", + "integrity": "sha512-VptjsgvYOK6EcErn7GdEZZ5CjRkC4O6dsz2cRFA/DIY1IecB628X81n4G6cCyVsb+D98cYnsY44D3Qo+70Xkzw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5827,9 +5700,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.13.tgz", - "integrity": "sha512-1ouitThGTBUObqw250aDwGLMNESBH5PRXIGybsCFO1bktdmWtEw7m72WY41EuX2BH8iKJpcYPerl3HfY1vmCNw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.2.0.tgz", + "integrity": "sha512-djHQxD5KP4EI3U6cri0/wcJxyMspU1B6+UVXL1G7867JiV9mvAw/HUoZsHTOsn+kajTi8szFfl2exa6dCYVrmA==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5840,9 +5713,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.13.tgz", - "integrity": "sha512-7OgjgNqZXvBejgULNdMSma2M1nzv4bbZG+FT5XMFZmEOxR9IB1x/RzChjPdeicff2ZK2sfhMBc4Y9femF5XkUg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.2.0.tgz", + "integrity": "sha512-AmaMBZwCEBH2eoy9Qt8Z+fiP6olSelz/cODz8/8XiXXi8ydY6oHW2s4pmrEYZH0un9dQAGWMP/LGUwyQZof1GQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5853,9 +5726,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.13.tgz", - "integrity": "sha512-HyDJfuDn5hzwGKZiANcvgz6wcum6bEgb4wmJnfej8XanTMJatNVv63TVxCJ10dSc9KGpPVcIkg6W8/joNXIEbw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.2.0.tgz", + "integrity": "sha512-eOesosmbf8mXCJ8E58PnuhO5gtDpviCTpi3ZaGn1yP0gLRV3wlo8wpCbxlGXLStgFT0tejN26MGbEHCJHkRkFQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5865,9 +5738,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.13.tgz", - "integrity": "sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.2.0.tgz", + "integrity": "sha512-1evYv5Fjod47kobd/0RsHYyCFWrkU5IYZSIBC7bAGsnzG4fId2O5SEyn9SPsMYOVtEL2EIhiqb0i+wcwXf6jOQ==", "dependencies": { "linkifyjs": "^4.1.0" }, @@ -5881,9 +5754,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.13.tgz", - "integrity": "sha512-cEoZBJrsQn69FPpUMePXG/ltGXtqKISgypj70PEHXt5meKDjpmMVSY4/8cXvFYEYsI9GvIwyAK0OrfAHiSoROA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.2.0.tgz", + "integrity": "sha512-niuvuBEkhz9gnQvFHbxs5z044bpDXRH9zz8QW2bA8+IDSxWHfnVmSZ3AZsed7OJ4EK1AcgGxy+gFOpAcZ73XTw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5893,9 +5766,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.13.tgz", - "integrity": "sha512-VN6zlaCNCbyJUCDyBFxavw19XmQ4LkCh8n20M8huNqW77lDGXA2A7UcWLHaNBpqAijBRu9mWI8l4Bftyf2fcAw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.2.0.tgz", + "integrity": "sha512-AMVC94mWNCAXLyZdkB5KqLai9FMUaQDkWAZSD1DKCRq2OJeA71nW9G1eDPa2TzQezl2IVTW9mU4m37hcsTmRfg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5905,9 +5778,9 @@ } }, "node_modules/@tiptap/extension-table-cell": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.1.13.tgz", - "integrity": "sha512-30pyVt2PxGAk8jmsXKxDheql8K/xIRA9FiDo++kS2Kr6Y7I42/kNPQttJ2W+Q1JdRJvedNfQtziQfKWDRLLCNA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.2.0.tgz", + "integrity": "sha512-wWLJnQdxF7tnS0oyZGWlUj3k+wf0R2fbq1n0n0EbnOmZV9CWhYwmKnUbdMEsW/HCYm1lgc94TAYGwaHkqQvHWQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5917,9 +5790,9 @@ } }, "node_modules/@tiptap/extension-table-header": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.1.13.tgz", - "integrity": "sha512-FwIV5iso5kmpu01QyvrPCjJqZfqxRTjtjMsDyut2uIgx9v5TXk0V5XvMWobx435ANIDJoGTYCMRlIqcgtyqwAQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.2.0.tgz", + "integrity": "sha512-U2XQcXinMNlx4fhRI7mivx8mFclajR7q3+gU1sFwGaRuyufOUM/1LwoiuzHK1VqMQWkWq8u+XEqtw9K6BtmyNw==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5929,9 +5802,9 @@ } }, "node_modules/@tiptap/extension-table-row": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.1.13.tgz", - "integrity": "sha512-27Mb9/oYbiLd+/BUFMhQzRIqMd2Z5j1BZMYsktwtDG8vGdYVlaW257UVaoNR9TmiXyIzd3Dh1mOil8G35+HRHg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.2.0.tgz", + "integrity": "sha512-sR0MWUz5hy6QZsaaI/v4+wC8V8IKRZOZvl7PMhKAJVnAGr5nF34V8h/E9kWGDDyYw2mKi5dSf1E/cEZVAwdlVQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5941,9 +5814,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.13.tgz", - "integrity": "sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.2.0.tgz", + "integrity": "sha512-h3lJRUZaUBisqUSQDEO+NU4SgKW7rj/vvbsbML8klWdEhg8U9btdv4eZgoJxbsqOdpUc6Cy6dBhre4myWI8Y2w==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5953,9 +5826,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.13.tgz", - "integrity": "sha512-z0CNKPjcvU8TrUSTui1voM7owssyXE9WvEGhIZMHzWwlx2ZXY2/L5+Hh33X/LzSKB9OGf/g1HAuHxrPcYxFuAQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.2.0.tgz", + "integrity": "sha512-y+D9gUWa/sVeCftZBMCEpcD1tD4OgNXfjsS7/qxv6ge9t0HCRhAJfHWm6rX8P7QybjacinZuun/T6CudRdGbMg==", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5965,28 +5838,28 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz", - "integrity": "sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==", - "dependencies": { - "prosemirror-changeset": "^2.2.0", - "prosemirror-collab": "^1.3.0", - "prosemirror-commands": "^1.3.1", - "prosemirror-dropcursor": "^1.5.0", - "prosemirror-gapcursor": "^1.3.1", - "prosemirror-history": "^1.3.0", - "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", - "prosemirror-markdown": "^1.10.1", - "prosemirror-menu": "^1.2.1", - "prosemirror-model": "^1.18.1", - "prosemirror-schema-basic": "^1.2.0", - "prosemirror-schema-list": "^1.2.2", - "prosemirror-state": "^1.4.1", - "prosemirror-tables": "^1.3.0", - "prosemirror-trailing-node": "^2.0.2", - "prosemirror-transform": "^1.7.0", - "prosemirror-view": "^1.28.2" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.2.0.tgz", + "integrity": "sha512-CL/ys9rvUgYcRHyeQFuIQdw09+0LUgKAfYWzCr6Pu4DDdbRooiex/a9M29imnRMEgS9SwuHN2v17fKHH0w65Hg==", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" }, "funding": { "type": "github", @@ -5994,12 +5867,12 @@ } }, "node_modules/@tiptap/react": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.1.13.tgz", - "integrity": "sha512-Dq3f8EtJnpImP3iDtJo+7bulnN9SJZRZcVVzxHXccLcC2MxtmDdlPGZjP+wxO800nd8toSIOd5734fPNf/YcfA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.2.0.tgz", + "integrity": "sha512-6A/o6vzD06S8Ds9NJJ4deMBEGVhtIAoGImKuc0aBDBY0ISUSaowaO/hVvZC+ClU74CpmjIUz242HotYXgHNxOw==", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.1.13", - "@tiptap/extension-floating-menu": "^2.1.13" + "@tiptap/extension-bubble-menu": "^2.2.0", + "@tiptap/extension-floating-menu": "^2.2.0" }, "funding": { "type": "github", @@ -6086,9 +5959,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", - "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -6107,9 +5980,9 @@ "integrity": "sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==" }, "node_modules/@types/hast": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", - "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "dependencies": { "@types/unist": "^2" } @@ -6185,9 +6058,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.7.tgz", - "integrity": "sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==", + "version": "20.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz", + "integrity": "sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6227,9 +6100,9 @@ "devOptional": true }, "node_modules/@types/react": { - "version": "18.2.47", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.47.tgz", - "integrity": "sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==", + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -6634,53 +6507,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.5.tgz", - "integrity": "sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", + "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", "dev": true, "dependencies": { "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.5", + "@vue/shared": "3.4.15", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.5.tgz", - "integrity": "sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", + "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.5", - "@vue/shared": "3.4.5" + "@vue/compiler-core": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.5.tgz", - "integrity": "sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz", + "integrity": "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==", "dev": true, "dependencies": { "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.5", - "@vue/compiler-dom": "3.4.5", - "@vue/compiler-ssr": "3.4.5", - "@vue/shared": "3.4.5", + "@vue/compiler-core": "3.4.15", + "@vue/compiler-dom": "3.4.15", + "@vue/compiler-ssr": "3.4.15", + "@vue/shared": "3.4.15", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", - "postcss": "^8.4.32", + "postcss": "^8.4.33", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.5.tgz", - "integrity": "sha512-DDdEcDzj2lWTMfUMMtEpLDhURai9LhM0zSZ219jCt7b2Vyl0/jy3keFgCPMitG0V1S1YG4Cmws3lWHWdxHQOpg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz", + "integrity": "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.5", - "@vue/shared": "3.4.5" + "@vue/compiler-dom": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/devtools-api": { @@ -6690,52 +6563,52 @@ "dev": true }, "node_modules/@vue/reactivity": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.5.tgz", - "integrity": "sha512-BcWkKvjdvqJwb7BhhFkXPLDCecX4d4a6GATvCduJQDLv21PkPowAE5GKuIE5p6RC07/Lp9FMkkq4AYCTVF5KlQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.15.tgz", + "integrity": "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==", "dev": true, "dependencies": { - "@vue/shared": "3.4.5" + "@vue/shared": "3.4.15" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.5.tgz", - "integrity": "sha512-wh9ELIOQKeWT9SaUPdLrsxRkZv14jp+SJm9aiQGWio+/MWNM3Lib0wE6CoKEqQ9+SCYyGjDBhTOTtO47kCgbkg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.15.tgz", + "integrity": "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==", "dev": true, "dependencies": { - "@vue/reactivity": "3.4.5", - "@vue/shared": "3.4.5" + "@vue/reactivity": "3.4.15", + "@vue/shared": "3.4.15" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.5.tgz", - "integrity": "sha512-n5ewvOjyG3IEpqGBahdPXODFSpVlSz3H4LF76Sx0XAqpIOqyJ5bIb2PrdYuH2ogBMAQPh+o5tnoH4nJpBr8U0Q==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz", + "integrity": "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.4.5", - "@vue/shared": "3.4.5", + "@vue/runtime-core": "3.4.15", + "@vue/shared": "3.4.15", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.5.tgz", - "integrity": "sha512-jOFc/VE87yvifQpNju12VcqimH8pBLxdcT+t3xMeiED1K6DfH9SORyhFEoZlW5TG2Vwfn3Ul5KE+1aC99xnSBg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.15.tgz", + "integrity": "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.4.5", - "@vue/shared": "3.4.5" + "@vue/compiler-ssr": "3.4.15", + "@vue/shared": "3.4.15" }, "peerDependencies": { - "vue": "3.4.5" + "vue": "3.4.15" } }, "node_modules/@vue/shared": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.5.tgz", - "integrity": "sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", + "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==", "dev": true }, "node_modules/@vue/tsconfig": { @@ -6753,14 +6626,14 @@ } }, "node_modules/@vueuse/core": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.1.tgz", - "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.2.tgz", + "integrity": "sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==", "dev": true, "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.7.1", - "@vueuse/shared": "10.7.1", + "@vueuse/metadata": "10.7.2", + "@vueuse/shared": "10.7.2", "vue-demi": ">=0.14.6" }, "funding": { @@ -6794,13 +6667,13 @@ } }, "node_modules/@vueuse/integrations": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.1.tgz", - "integrity": "sha512-cKo5LEeKVHdBRBtMTOrDPdR0YNtrmN9IBfdcnY2P3m5LHVrsD0xiHUtAH1WKjHQRIErZG6rJUa6GA4tWZt89Og==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.7.2.tgz", + "integrity": "sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==", "dev": true, "dependencies": { - "@vueuse/core": "10.7.1", - "@vueuse/shared": "10.7.1", + "@vueuse/core": "10.7.2", + "@vueuse/shared": "10.7.2", "vue-demi": ">=0.14.6" }, "funding": { @@ -6886,18 +6759,18 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.1.tgz", - "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.2.tgz", + "integrity": "sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.1.tgz", - "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==", + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.2.tgz", + "integrity": "sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==", "dev": true, "dependencies": { "vue-demi": ">=0.14.6" @@ -7030,9 +6903,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -7098,25 +6971,25 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.0.tgz", - "integrity": "sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg==", - "dev": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.0", - "@algolia/cache-common": "4.22.0", - "@algolia/cache-in-memory": "4.22.0", - "@algolia/client-account": "4.22.0", - "@algolia/client-analytics": "4.22.0", - "@algolia/client-common": "4.22.0", - "@algolia/client-personalization": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/logger-console": "4.22.0", - "@algolia/requester-browser-xhr": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/requester-node-http": "4.22.0", - "@algolia/transporter": "4.22.0" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/ansi-colors": { @@ -7469,9 +7342,9 @@ } }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dev": true, "dependencies": { "follow-redirects": "^1.15.4", @@ -7504,13 +7377,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", - "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { @@ -7527,25 +7400,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7713,9 +7586,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "dev": true, "funding": [ { @@ -7732,8 +7605,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -7830,6 +7703,34 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -7839,9 +7740,39 @@ "node": ">=12" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { @@ -7897,9 +7828,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001581", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", + "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", "dev": true, "funding": [ { @@ -7937,9 +7868,9 @@ } }, "node_modules/chai": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.0.tgz", - "integrity": "sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", @@ -8128,6 +8059,26 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -8504,9 +8455,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", - "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", "dev": true, "dependencies": { "browserslist": "^4.22.2" @@ -8600,7 +8551,8 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -8975,9 +8927,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.623", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.623.tgz", - "integrity": "sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==", + "version": "1.4.651", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz", + "integrity": "sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA==", "dev": true }, "node_modules/emoji-regex": { @@ -9790,6 +9742,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -9873,9 +9831,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -10028,9 +9986,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "dev": true, "funding": [ { @@ -10072,18 +10030,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -10131,6 +10077,24 @@ "node": ">= 8" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10138,9 +10102,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -10206,6 +10170,32 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10460,19 +10450,22 @@ "integrity": "sha512-PmfRMI2Rttg/2jDfKBeSl621sEznrsKF019SuoLdoNlO7qRUZaOyEI5Li4uW+79pVqnDtKfIEVuHTIJ5lgy64w==" }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10500,15 +10493,18 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -10728,9 +10724,9 @@ } }, "node_modules/hast-util-embedded/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -10779,9 +10775,9 @@ } }, "node_modules/hast-util-has-property/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -10799,9 +10795,9 @@ } }, "node_modules/hast-util-is-body-ok-link/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -10819,9 +10815,9 @@ } }, "node_modules/hast-util-is-element/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -10855,9 +10851,9 @@ } }, "node_modules/hast-util-phrasing/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -11106,9 +11102,9 @@ } }, "node_modules/hast-util-whitespace/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -11326,9 +11322,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, "node_modules/import-fresh": { @@ -11492,6 +11488,40 @@ "node": ">=12.0.0" } }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/internal-slot": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", @@ -12507,6 +12537,18 @@ "node": ">=12" } }, + "node_modules/libnpmaccess/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/libnpmaccess/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -12522,6 +12564,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/libnpmaccess/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/libnpmpublish": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.5.tgz", @@ -12690,16 +12738,6 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" - }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -12857,6 +12895,24 @@ "node": ">=12" } }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -13966,15 +14022,12 @@ } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { @@ -13989,6 +14042,24 @@ "node": ">= 8" } }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", @@ -14006,18 +14077,54 @@ "encoding": "^0.1.13" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -14028,6 +14135,24 @@ "minipass": "^3.0.0" } }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -14040,6 +14165,24 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -14052,7 +14195,19 @@ "node": ">=8" } }, - "node_modules/minipass/node_modules/yallist": { + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", @@ -14077,6 +14232,18 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -14110,15 +14277,15 @@ } }, "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", + "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", "dev": true, "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", + "acorn": "^8.11.3", + "pathe": "^1.1.2", "pkg-types": "^1.0.3", - "ufo": "^1.3.0" + "ufo": "^1.3.2" } }, "node_modules/modify-values": { @@ -14496,6 +14663,46 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-packlist/node_modules/npm-bundled": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", @@ -14616,6 +14823,18 @@ "node": ">=12" } }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -14631,6 +14850,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -14734,6 +14959,12 @@ } } }, + "node_modules/nx/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/nx/node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -14805,6 +15036,20 @@ "node": "*" } }, + "node_modules/nx/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nx/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -15312,6 +15557,18 @@ "node": ">=12" } }, + "node_modules/pacote/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -15327,6 +15584,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/pacote/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -15636,23 +15899,14 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -15663,9 +15917,9 @@ } }, "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, "node_modules/pathval": { @@ -15783,12 +16037,12 @@ } }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.1.tgz", + "integrity": "sha512-gdZAWG97oUnbBdRL3GuBvX3nDDmUOuqzV/D24dytqlKt+eI5KbwusluZRGljx1YoJKZ2NRPaeWiFTeGZO7SosQ==", "dev": true, "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.41.1" }, "bin": { "playwright": "cli.js" @@ -15801,9 +16055,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.41.1.tgz", + "integrity": "sha512-/KPO5DzXSMlxSX77wy+HihKGOunh3hqndhqeo/nMxfigiKzogn8kfL0ZBDu0L1RKgan5XHCPmn6zXd2NUJgjhg==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -15812,20 +16066,6 @@ "node": ">=16" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/postcss": { "version": "8.4.33", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", @@ -15997,9 +16237,9 @@ } }, "node_modules/property-information": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", - "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -16064,9 +16304,9 @@ } }, "node_modules/prosemirror-inputrules": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.3.0.tgz", - "integrity": "sha512-z1GRP2vhh5CihYMQYsJSa1cOwXb3SYxALXOIfAkX8nZserARtl9LiL+CEl+T+OFIsXc3mJIHKhbsmRzC0HDAXA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" @@ -16371,11 +16611,11 @@ } }, "node_modules/react-router": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", - "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", + "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", "dependencies": { - "@remix-run/router": "1.14.1" + "@remix-run/router": "1.14.2" }, "engines": { "node": ">=14.0.0" @@ -16385,12 +16625,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", - "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", + "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", "dependencies": { - "@remix-run/router": "1.14.1", - "react-router": "6.21.1" + "@remix-run/router": "1.14.2", + "react-router": "6.21.3" }, "engines": { "node": ">=14.0.0" @@ -16487,6 +16727,34 @@ "node": ">=10" } }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/read-package-json/node_modules/hosted-git-info": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", @@ -16508,6 +16776,18 @@ "node": ">=12" } }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/read-package-json/node_modules/normalize-package-data": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", @@ -16890,9 +17170,9 @@ } }, "node_modules/rehype-format/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -16914,9 +17194,9 @@ } }, "node_modules/rehype-minify-whitespace/node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -17103,6 +17383,12 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -17158,9 +17444,9 @@ } }, "node_modules/rollup": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz", - "integrity": "sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", "dev": true, "peer": true, "dependencies": { @@ -17174,26 +17460,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.4", - "@rollup/rollup-android-arm64": "4.9.4", - "@rollup/rollup-darwin-arm64": "4.9.4", - "@rollup/rollup-darwin-x64": "4.9.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.4", - "@rollup/rollup-linux-arm64-gnu": "4.9.4", - "@rollup/rollup-linux-arm64-musl": "4.9.4", - "@rollup/rollup-linux-riscv64-gnu": "4.9.4", - "@rollup/rollup-linux-x64-gnu": "4.9.4", - "@rollup/rollup-linux-x64-musl": "4.9.4", - "@rollup/rollup-win32-arm64-msvc": "4.9.4", - "@rollup/rollup-win32-ia32-msvc": "4.9.4", - "@rollup/rollup-win32-x64-msvc": "4.9.4", + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-webpack-stats": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-webpack-stats/-/rollup-plugin-webpack-stats-0.2.3.tgz", - "integrity": "sha512-X9I9eZJPaEaYpyQgHgIH0PVJ1c8v+kPXbpWrcHQWwX6LhqqqF7oW5o0RlsCsyeQBStSah1i/oRUPAlk754ClFw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-webpack-stats/-/rollup-plugin-webpack-stats-0.2.4.tgz", + "integrity": "sha512-bWGNGWpCFXB662mdIN2OHCrxXFBIgG+wS4UEksmORlT670F2ucLFYrrOVFTU6wjifGwPPRWwJMx5Z03rbDisWw==", "dev": true, "engines": { "node": ">=14" @@ -17266,13 +17552,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -17304,15 +17590,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17430,9 +17719,9 @@ } }, "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", + "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -17538,15 +17827,16 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -17632,10 +17922,16 @@ "dev": true }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/slash": { "version": "3.0.0", @@ -17746,9 +18042,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -17806,6 +18102,24 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/ssri/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ssri/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -17834,17 +18148,20 @@ "dev": true }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -17868,11 +18185,32 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/string.prototype.codepointat": { "version": "0.2.1", @@ -18059,11 +18397,6 @@ "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==", "dev": true }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18212,9 +18545,9 @@ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", "dev": true }, "node_modules/tinypool": { @@ -19094,9 +19427,9 @@ } }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -19374,16 +19707,16 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.5.tgz", - "integrity": "sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.15.tgz", + "integrity": "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.5", - "@vue/compiler-sfc": "3.4.5", - "@vue/runtime-dom": "3.4.5", - "@vue/server-renderer": "3.4.5", - "@vue/shared": "3.4.5" + "@vue/compiler-dom": "3.4.15", + "@vue/compiler-sfc": "3.4.15", + "@vue/runtime-dom": "3.4.15", + "@vue/server-renderer": "3.4.15", + "@vue/shared": "3.4.15" }, "peerDependencies": { "typescript": "*" @@ -19614,6 +19947,26 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -19621,17 +19974,20 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { @@ -19652,6 +20008,65 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -19671,6 +20086,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/write-json-file": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz", @@ -19700,6 +20121,12 @@ "node": ">=8" } }, + "node_modules/write-json-file/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/write-json-file/node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -19766,6 +20193,12 @@ "semver": "bin/semver" } }, + "node_modules/write-pkg/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/write-pkg/node_modules/sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", @@ -19872,9 +20305,9 @@ } }, "node_modules/y-prosemirror": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.0.20.tgz", - "integrity": "sha512-LVMtu3qWo0emeYiP+0jgNcvZkqhzE/otOoro+87q0iVKxy/sMKuiJZnokfJdR4cn9qKx0Un5fIxXqbAlR2bFkA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.1.tgz", + "integrity": "sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ==", "dependencies": { "lib0": "^0.2.42" }, @@ -19887,7 +20320,7 @@ "prosemirror-state": "^1.2.3", "prosemirror-view": "^1.9.10", "y-protocols": "^1.0.1", - "yjs": "^13.3.2" + "yjs": "^13.5.38" } }, "node_modules/y-protocols": { @@ -19960,10 +20393,30 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yjs": { - "version": "13.6.10", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.10.tgz", - "integrity": "sha512-1JcyQek1vaMyrDm7Fqfa+pvHg/DURSbVo4VmeN7wjnTKB/lZrfIPhdCj7d8sboK6zLfRBJXegTjc9JlaDd8/Zw==", + "version": "13.6.11", + "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.11.tgz", + "integrity": "sha512-FvRRJKX9u270dOLkllGF/UDCWwmIv2Z+ucM4v1QO1TuxdmoiMnSUXH1HAcOKOrkBEhQtPTkxep7tD2DrQB+l0g==", "dependencies": { "lib0": "^0.2.86" }, @@ -20004,12 +20457,9 @@ }, "packages/core": { "name": "@blocknote/core", - "version": "0.11.0", + "version": "0.11.2", "license": "MPL-2.0", "dependencies": { - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/utils": "^1.2.0", "@tiptap/core": "^2.0.3", "@tiptap/extension-bold": "^2.0.3", "@tiptap/extension-code": "^2.0.3", @@ -20046,7 +20496,7 @@ "remark-stringify": "^10.0.2", "unified": "^10.1.2", "uuid": "^8.3.2", - "y-prosemirror": "1.0.20", + "y-prosemirror": "1.2.1", "y-protocols": "^1.0.5", "yjs": "^13.6.1" }, @@ -20064,61 +20514,6 @@ "vitest": "^0.34.1" } }, - "packages/core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/core/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/core/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/core/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "packages/core/node_modules/rimraf": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", @@ -20139,18 +20534,16 @@ }, "packages/react": { "name": "@blocknote/react", - "version": "0.11.0", + "version": "0.11.2", "license": "MPL-2.0", "dependencies": { - "@blocknote/core": "^0.11.0", + "@blocknote/core": "^0.11.2", "@floating-ui/react": "^0.26.4", - "@mantine/core": "^7.3.1", - "@mantine/hooks": "^7.3.1", - "@mantine/utils": "^6.0.5", + "@mantine/core": "^7.5.0", + "@mantine/hooks": "^7.5.0", + "@mantine/utils": "^6.0.21", "@tiptap/core": "^2.0.3", "@tiptap/react": "^2.0.3", - "lodash.foreach": "^4.5.0", - "lodash.groupby": "^4.6.0", "lodash.merge": "^4.6.2", "react": "^18", "react-dom": "^18.2.0", @@ -20179,61 +20572,6 @@ "react-dom": "^18" } }, - "packages/react/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/react/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/react/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/react/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "packages/react/node_modules/rimraf": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", @@ -20254,10 +20592,10 @@ }, "packages/website": { "name": "blocknote-website", - "version": "0.11.0", + "version": "0.11.2", "license": "MPL-2.0", "dependencies": { - "@blocknote/react": "^0.11.0", + "@blocknote/react": "^0.11.2", "@vercel/og": "^0.5.6", "veaury": "^2.3.12", "vue-github-button": "^3.1.0", @@ -20286,14 +20624,14 @@ }, "tests": { "name": "@blocknote/tests", - "version": "0.11.0", + "version": "0.11.2", "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@blocknote/core": "^0.11.0", - "@blocknote/react": "^0.11.0", + "@blocknote/core": "^0.11.2", + "@blocknote/react": "^0.11.2", "@playwright/experimental-ct-react": "^1.38.1", "@playwright/test": "^1.38.1", "eslint": "^8.10.0", @@ -20301,63 +20639,11 @@ "rimraf": "^5.0.5" } }, - "tests/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "tests/node_modules/glob": { - "version": "10.3.10", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "tests/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "tests/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "tests/node_modules/rimraf": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^10.3.7" }, diff --git a/packages/core/package.json b/packages/core/package.json index 0080a2a0a..97256acd9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "homepage": "https://github.com/TypeCellOS/BlockNote", "private": false, "license": "MPL-2.0", - "version": "0.11.0", + "version": "0.11.2", "files": [ "dist", "types", @@ -50,9 +50,6 @@ "clean": "rimraf dist && rimraf types" }, "dependencies": { - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/utils": "^1.2.0", "@tiptap/core": "^2.0.3", "@tiptap/extension-bold": "^2.0.3", "@tiptap/extension-code": "^2.0.3", @@ -89,7 +86,7 @@ "remark-stringify": "^10.0.2", "unified": "^10.1.2", "uuid": "^8.3.2", - "y-prosemirror": "1.0.20", + "y-prosemirror": "1.2.1", "y-protocols": "^1.0.5", "yjs": "^13.6.1" }, diff --git a/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts b/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts index 7043bae53..6fd56d749 100644 --- a/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts +++ b/packages/core/src/blocks/ImageBlockContent/ImageBlockContent.ts @@ -148,6 +148,15 @@ export const renderImage = ( // offset from when the resize began, and which resize handle is being used. const windowMouseMoveHandler = (event: MouseEvent) => { if (!resizeParams) { + if ( + !editor.isEditable && + imageWrapper.contains(leftResizeHandle) && + imageWrapper.contains(rightResizeHandle) + ) { + imageWrapper.removeChild(leftResizeHandle); + imageWrapper.removeChild(rightResizeHandle); + } + return; } @@ -192,13 +201,11 @@ export const renderImage = ( // Stops mouse movements from resizing the image and updates the block's // `width` prop to the new value. const windowMouseUpHandler = (event: MouseEvent) => { - if (!resizeParams) { - return; - } - // Hides the drag handles if the cursor is no longer over the image. if ( - (!event.target || !imageWrapper.contains(event.target as Node)) && + (!event.target || + !imageWrapper.contains(event.target as Node) || + !editor.isEditable) && imageWrapper.contains(leftResizeHandle) && imageWrapper.contains(rightResizeHandle) ) { @@ -206,6 +213,10 @@ export const renderImage = ( imageWrapper.removeChild(rightResizeHandle); } + if (!resizeParams) { + return; + } + resizeParams = undefined; editor.updateBlock(block, { @@ -235,9 +246,6 @@ export const renderImage = ( if (editor.isEditable) { imageWrapper.appendChild(leftResizeHandle); imageWrapper.appendChild(rightResizeHandle); - } else { - imageWrapper.removeChild(leftResizeHandle); - imageWrapper.removeChild(rightResizeHandle); } }; // Hides the resize handles when the cursor leaves the image, unless the @@ -254,8 +262,14 @@ export const renderImage = ( return; } - imageWrapper.removeChild(leftResizeHandle); - imageWrapper.removeChild(rightResizeHandle); + if ( + editor.isEditable && + imageWrapper.contains(leftResizeHandle) && + imageWrapper.contains(rightResizeHandle) + ) { + imageWrapper.removeChild(leftResizeHandle); + imageWrapper.removeChild(rightResizeHandle); + } }; // Sets the resize params, allowing the user to begin resizing the image by diff --git a/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts b/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts index c6daafbcc..3a862d49e 100644 --- a/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +++ b/packages/core/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts @@ -37,7 +37,7 @@ const BulletListItemBlockContent = createStronglyTypedTiptapNode({ addKeyboardShortcuts() { return { Enter: () => handleEnter(this.editor), - "Mod-Shift-7": () => + "Mod-Shift-8": () => this.editor.commands.BNUpdateBlock(this.editor.state.selection.anchor, { type: "bulletListItem", props: {}, diff --git a/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts index 7e8752a27..09464c067 100644 --- a/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +++ b/packages/core/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts @@ -52,7 +52,7 @@ const NumberedListItemBlockContent = createStronglyTypedTiptapNode({ addKeyboardShortcuts() { return { Enter: () => handleEnter(this.editor), - "Mod-Shift-8": () => + "Mod-Shift-7": () => this.editor.commands.BNUpdateBlock(this.editor.state.selection.anchor, { type: "numberedListItem", props: {}, diff --git a/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts b/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts index fcb532a8a..07425c77d 100644 --- a/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +++ b/packages/core/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts @@ -4,6 +4,7 @@ import { } from "../../schema"; import { createDefaultBlockDOMOutputSpec } from "../defaultBlockHelpers"; import { defaultProps } from "../defaultProps"; +import { handleEnter } from "../ListItemBlockContent/ListItemKeyboardShortcuts"; export const paragraphPropSchema = { ...defaultProps, @@ -13,6 +14,18 @@ export const ParagraphBlockContent = createStronglyTypedTiptapNode({ name: "paragraph", content: "inline*", group: "blockContent", + + addKeyboardShortcuts() { + return { + Enter: () => handleEnter(this.editor), + "Mod-Alt-0": () => + this.editor.commands.BNUpdateBlock(this.editor.state.selection.anchor, { + type: "paragraph", + props: {}, + }), + }; + }, + parseHTML() { return [ { tag: "div[data-content-type=" + this.name + "]" }, diff --git a/packages/core/src/editor/Block.css b/packages/core/src/editor/Block.css index 8d3980cd2..5c94b887a 100644 --- a/packages/core/src/editor/Block.css +++ b/packages/core/src/editor/Block.css @@ -65,6 +65,10 @@ NESTED BLOCKS height: 0; } +.bn-inline-content code { + font-family: monospace; +} + /* NESTED BLOCK ANIMATIONS (change in indent) */ [data-prev-depth-change="1"] { diff --git a/packages/core/src/editor/BlockNoteEditor.ts b/packages/core/src/editor/BlockNoteEditor.ts index adf8c8595..0a2d6af1a 100644 --- a/packages/core/src/editor/BlockNoteEditor.ts +++ b/packages/core/src/editor/BlockNoteEditor.ts @@ -21,18 +21,18 @@ import { HTMLToBlocks } from "../api/parsers/html/parseHTML"; import { markdownToBlocks } from "../api/parsers/markdown/parseMarkdown"; import { DefaultBlockSchema, + DefaultInlineContentSchema, + DefaultStyleSchema, defaultBlockSchema, defaultBlockSpecs, - DefaultInlineContentSchema, defaultInlineContentSpecs, - DefaultStyleSchema, defaultStyleSpecs, } from "../blocks/defaultBlocks"; import { FormattingToolbarProsemirrorPlugin } from "../extensions/FormattingToolbar/FormattingToolbarPlugin"; import { HyperlinkToolbarProsemirrorPlugin } from "../extensions/HyperlinkToolbar/HyperlinkToolbarPlugin"; import { ImageToolbarProsemirrorPlugin } from "../extensions/ImageToolbar/ImageToolbarPlugin"; import { SideMenuProsemirrorPlugin } from "../extensions/SideMenu/SideMenuPlugin"; -import { getDefaultSlashMenuItems } from "../extensions/SlashMenu/defaultSlashMenuItems"; +import { SuggestionMenuProseMirrorPlugin } from "../extensions/SuggestionMenu/SuggestionPlugin"; import { TableHandlesProsemirrorPlugin } from "../extensions/TableHandles/TableHandlesPlugin"; import { UniqueID } from "../extensions/UniqueID/UniqueID"; import { @@ -43,17 +43,17 @@ import { BlockSchemaFromSpecs, BlockSchemaWithBlock, BlockSpecs, - getBlockSchemaFromSpecs, - getInlineContentSchemaFromSpecs, - getStyleSchemaFromSpecs, InlineContentSchema, InlineContentSchemaFromSpecs, InlineContentSpecs, PartialBlock, - Styles, StyleSchema, StyleSchemaFromSpecs, StyleSpecs, + Styles, + getBlockSchemaFromSpecs, + getInlineContentSchemaFromSpecs, + getStyleSchemaFromSpecs, } from "../schema"; import { mergeCSSClasses } from "../util/browser"; import { UnreachableCaseError } from "../util/typescript"; @@ -67,11 +67,6 @@ import { transformPasted } from "./transformPasted"; // CSS import "./Block.css"; import "./editor.css"; -import { - createSuggestionMenu, - SuggestionMenuProseMirrorPlugin, -} from "../extensions-shared/suggestion/SuggestionPlugin"; -import { SuggestionItem } from "../extensions-shared/suggestion/SuggestionItem"; export type BlockNoteEditorOptions< BSpecs extends BlockSpecs, @@ -80,19 +75,6 @@ export type BlockNoteEditorOptions< > = { // TODO: Figure out if enableBlockNoteExtensions/disableHistoryExtension are needed and document them. enableBlockNoteExtensions: boolean; - /** - * - * (couldn't fix any type, see https://github.com/TypeCellOS/BlockNote/pull/191#discussion_r1210708771) - * - * @default defaultSlashMenuItems from `./extensions/SlashMenu` - */ - slashMenuItems: (query: string) => Promise[]>; - - extraSuggestionMenus: { - name: string; - triggerCharacter: string; - getItems: (query: string) => Promise[]>; - }[]; /** * The HTML element that should be used as the parent element for the editor. @@ -252,15 +234,11 @@ export class BlockNoteEditor< > | undefined; - public readonly suggestionMenus: Record< - string | "slashMenu", - SuggestionMenuProseMirrorPlugin< - SuggestionItem, - BSchema, - ISchema, - SSchema - > - > = {}; + public readonly suggestionMenus: SuggestionMenuProseMirrorPlugin< + BSchema, + ISchema, + SSchema + >; public readonly uploadFile: ((file: File) => Promise) | undefined; @@ -301,30 +279,7 @@ export class BlockNoteEditor< this.sideMenu = new SideMenuProsemirrorPlugin(this); this.formattingToolbar = new FormattingToolbarProsemirrorPlugin(this); - this.suggestionMenus.slashMenu = createSuggestionMenu< - BSchema, - ISchema, - SSchema, - SuggestionItem - >( - "slashMenu", - "/", - newOptions.slashMenuItems || - ((query) => getDefaultSlashMenuItems(query, this.blockSchema) as any) - )(this); - - for (const extraSuggestionMenu of newOptions.extraSuggestionMenus || []) { - this.suggestionMenus[extraSuggestionMenu.name] = createSuggestionMenu< - BSchema, - ISchema, - SSchema, - SuggestionItem - >( - extraSuggestionMenu.name, - extraSuggestionMenu.triggerCharacter, - extraSuggestionMenu.getItems - )(this); - } + this.suggestionMenus = new SuggestionMenuProseMirrorPlugin(this); this.hyperlinkToolbar = new HyperlinkToolbarProsemirrorPlugin(this); this.imageToolbar = new ImageToolbarProsemirrorPlugin(this); @@ -352,8 +307,8 @@ export class BlockNoteEditor< this.formattingToolbar.plugin, this.hyperlinkToolbar.plugin, this.imageToolbar.plugin, + this.suggestionMenus.plugin, ...(this.tableHandles ? [this.tableHandles.plugin] : []), - ...Object.values(this.suggestionMenus).map((menu) => menu.plugin), ]; }, }); @@ -405,7 +360,7 @@ export class BlockNoteEditor< jsonNode.content[0].content[0].attrs.id = "initialBlockId"; cache = Node.fromJSON(schema, jsonNode); - return ret; + return cache; }; const root = schema.node( diff --git a/packages/core/src/extensions-shared/README.md b/packages/core/src/extensions-shared/README.md deleted file mode 100644 index 89c300fd7..000000000 --- a/packages/core/src/extensions-shared/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### @blocknote/core/src/extensions-shared - -Helper functions / base plugins for @blocknote/core/src/extensions \ No newline at end of file diff --git a/packages/core/src/extensions-shared/suggestion/SuggestionItem.ts b/packages/core/src/extensions-shared/suggestion/SuggestionItem.ts deleted file mode 100644 index f19c7581d..000000000 --- a/packages/core/src/extensions-shared/suggestion/SuggestionItem.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; -import { BlockNoteEditor } from "../../editor/BlockNoteEditor"; - -export type SuggestionItem< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema -> = { - name: string; - execute: (editor: BlockNoteEditor) => void; - aliases?: string[]; -}; diff --git a/packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts b/packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts deleted file mode 100644 index 591159dfd..000000000 --- a/packages/core/src/extensions-shared/suggestion/SuggestionPlugin.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { findParentNode } from "@tiptap/core"; -import { EditorState, Plugin, PluginKey } from "prosemirror-state"; -import { Decoration, DecorationSet, EditorView } from "prosemirror-view"; -import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; -import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; -import { BaseUiElementState } from "../BaseUiElementTypes"; -import { SuggestionItem } from "./SuggestionItem"; -import { EventEmitter } from "../../util/EventEmitter"; - -const findBlock = findParentNode((node) => node.type.name === "blockContainer"); - -export type SuggestionsMenuState = BaseUiElementState & { - query: string; -}; - -class SuggestionMenuView< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema -> { - private suggestionsMenuState?: SuggestionsMenuState; - public updateSuggestionsMenu: () => void; - - pluginState: SuggestionPluginState; - - constructor( - private readonly editor: BlockNoteEditor, - private readonly pluginKey: PluginKey, - updateSuggestionsMenu: ( - suggestionsMenuState: SuggestionsMenuState - ) => void = () => { - // noop - } - ) { - this.pluginState = getDefaultPluginState(); - - this.updateSuggestionsMenu = () => { - if (!this.suggestionsMenuState) { - throw new Error("Attempting to update uninitialized suggestions menu"); - } - - updateSuggestionsMenu(this.suggestionsMenuState); - }; - - document.addEventListener("scroll", this.handleScroll); - } - - handleScroll = () => { - if (this.suggestionsMenuState?.show) { - const decorationNode = document.querySelector( - `[data-decoration-id="${this.pluginState.decorationId}"]` - ); - this.suggestionsMenuState.referencePos = - decorationNode!.getBoundingClientRect(); - this.updateSuggestionsMenu(); - } - }; - - update(view: EditorView, prevState: EditorState) { - const prev = this.pluginKey.getState(prevState); - const next = this.pluginKey.getState(view.state); - - // See how the state changed - const started = !prev.active && next.active; - const stopped = prev.active && !next.active; - // TODO: Currently also true for cases in which an update isn't needed so selected list item index updates still - // cause the view to update. May need to be more strict. - const changed = prev.active && next.active; - - // Cancel when suggestion isn't active - if (!started && !changed && !stopped) { - return; - } - - this.pluginState = stopped ? prev : next; - - if (stopped || !this.editor.isEditable) { - this.suggestionsMenuState!.show = false; - this.updateSuggestionsMenu(); - - return; - } - - const decorationNode = document.querySelector( - `[data-decoration-id="${this.pluginState.decorationId}"]` - ); - - if (this.editor.isEditable) { - this.suggestionsMenuState = { - show: true, - referencePos: decorationNode!.getBoundingClientRect(), - query: this.pluginState.query, - }; - - this.updateSuggestionsMenu(); - } - } - - destroy() { - document.removeEventListener("scroll", this.handleScroll); - } -} - -type SuggestionPluginState = { - // True when the menu is shown, false when hidden. - active: boolean; - // The character that triggered the menu being shown. Allowing the trigger to be different to the default - // trigger allows other extensions to open it programmatically. - triggerCharacter: string | undefined; - // The editor position just after the trigger character, i.e. where the user query begins. Used to figure out - // which menu items to show and can also be used to delete the trigger character. - queryStartPos: number | undefined; - query: string; - decorationId: string | undefined; -}; - -function getDefaultPluginState(): SuggestionPluginState { - return { - active: false, - triggerCharacter: undefined, - queryStartPos: undefined, - query: "", - decorationId: undefined, - }; -} - -/** - * A ProseMirror plugin for suggestions, designed to make '/'-commands possible as well as mentions. - * - * This is basically a simplified version of TipTap's [Suggestions](https://github.com/ueberdosis/tiptap/tree/db92a9b313c5993b723c85cd30256f1d4a0b65e1/packages/suggestion) plugin. - * - * This version is adapted from the aforementioned version in the following ways: - * - This version supports generic items instead of only strings (to allow for more advanced filtering for example) - * - This version hides some unnecessary complexity from the user of the plugin. - * - This version handles key events differently - */ -export const setupSuggestionMenu = < - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema, - T extends SuggestionItem ->( - editor: BlockNoteEditor, - updateSuggestionMenu: (suggestionMenuState: SuggestionsMenuState) => void, - - pluginKey: PluginKey, - defaultTriggerCharacter: string, - getItems: (query: string) => Promise = () => - new Promise((resolve) => resolve([])), - onSelectItem: (props: { - item: T; - editor: BlockNoteEditor; - }) => void = () => { - // noop - } -) => { - // Assertions - if (defaultTriggerCharacter.length !== 1) { - throw new Error("'char' should be a single character"); - } - - let suggestionPluginView: SuggestionMenuView; - - const deactivate = (view: EditorView) => { - view.dispatch(view.state.tr.setMeta(pluginKey, { deactivate: true })); - }; - - return { - plugin: new Plugin({ - key: pluginKey, - - view: () => { - suggestionPluginView = new SuggestionMenuView( - editor, - pluginKey, - - updateSuggestionMenu - ); - return suggestionPluginView; - }, - - state: { - // Initialize the plugin's internal state. - init(): SuggestionPluginState { - return getDefaultPluginState(); - }, - - // Apply changes to the plugin state from an editor transaction. - apply(transaction, prev, _oldState, newState): SuggestionPluginState { - // TODO: More clearly define which transactions should be ignored. - if (transaction.getMeta("orderedListIndexing") !== undefined) { - return prev; - } - - // Checks if the menu should be shown. - if (transaction.getMeta(pluginKey)?.activate) { - return { - active: true, - triggerCharacter: - transaction.getMeta(pluginKey)?.triggerCharacter || "", - queryStartPos: newState.selection.from, - query: "", - decorationId: `id_${Math.floor(Math.random() * 0xffffffff)}`, - }; - } - - // Checks if the menu is hidden, in which case it doesn't need to be hidden or updated. - if (!prev.active) { - return prev; - } - - // Checks if the menu should be hidden. - if ( - // Highlighting text should hide the menu. - newState.selection.from !== newState.selection.to || - // Transactions with plugin metadata {deactivate: true} should hide the menu. - transaction.getMeta(pluginKey)?.deactivate || - // Certain mouse events should hide the menu. - // TODO: Change to global mousedown listener. - transaction.getMeta("focus") || - transaction.getMeta("blur") || - transaction.getMeta("pointer") || - // Moving the caret before the character which triggered the menu should hide it. - (prev.active && newState.selection.from < prev.queryStartPos!) - ) { - return getDefaultPluginState(); - } - - const next = { ...prev }; - - // Updates the current query. - next.query = newState.doc.textBetween( - prev.queryStartPos!, - newState.selection.from - ); - - return next; - }, - }, - - props: { - handleKeyDown(view, event) { - const menuIsActive = (this as Plugin).getState(view.state).active; - - // Shows the menu if the default trigger character was pressed and the menu isn't active. - if (event.key === defaultTriggerCharacter && !menuIsActive) { - view.dispatch( - view.state.tr - .insertText(defaultTriggerCharacter) - .scrollIntoView() - .setMeta(pluginKey, { - activate: true, - triggerCharacter: defaultTriggerCharacter, - }) - ); - - return true; - } - - return false; - }, - - // Setup decorator on the currently active suggestion. - decorations(state) { - const { active, decorationId, queryStartPos, triggerCharacter } = ( - this as Plugin - ).getState(state); - - if (!active) { - return null; - } - - // If the menu was opened programmatically by another extension, it may not use a trigger character. In this - // case, the decoration is set on the whole block instead, as the decoration range would otherwise be empty. - if (triggerCharacter === "") { - const blockNode = findBlock(state.selection); - if (blockNode) { - return DecorationSet.create(state.doc, [ - Decoration.node( - blockNode.pos, - blockNode.pos + blockNode.node.nodeSize, - { - nodeName: "span", - class: "bn-suggestion-decorator", - "data-decoration-id": decorationId, - } - ), - ]); - } - } - // Creates an inline decoration around the trigger character. - return DecorationSet.create(state.doc, [ - Decoration.inline( - queryStartPos - triggerCharacter.length, - queryStartPos, - { - nodeName: "span", - class: "bn-suggestion-decorator", - "data-decoration-id": decorationId, - } - ), - ]); - }, - }, - }), - getItems: getItems, - executeItem: (item: T) => { - onSelectItem({ item, editor }); - }, - closeMenu: () => deactivate(editor._tiptapEditor.view), - clearQuery: () => - editor._tiptapEditor - .chain() - .focus() - .deleteRange({ - from: - suggestionPluginView.pluginState.queryStartPos! - - suggestionPluginView.pluginState.triggerCharacter!.length, - to: editor._tiptapEditor.state.selection.from, - }) - .run(), - }; -}; - -export class SuggestionMenuProseMirrorPlugin< - Item extends SuggestionItem, - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema -> extends EventEmitter { - public readonly plugin: Plugin; - public readonly getItems: (query: string) => Promise; - public readonly executeItem: (item: Item) => void; - public readonly closeMenu: () => void; - public readonly clearQuery: () => void; - - constructor( - editor: BlockNoteEditor, - name: string, - triggerCharacter: string, - getItems: (query: string) => Promise - ) { - if (triggerCharacter.length !== 1) { - throw new Error( - `The trigger character must be a single character, but received ${triggerCharacter}` - ); - } - - super(); - const suggestionMenu = setupSuggestionMenu( - editor, - (state) => { - this.emit("update", state); - }, - new PluginKey(name), - triggerCharacter, - getItems, - ({ item, editor }) => item.execute(editor) - ); - - this.plugin = suggestionMenu.plugin; - this.getItems = getItems; - this.executeItem = suggestionMenu.executeItem; - this.closeMenu = suggestionMenu.closeMenu; - this.clearQuery = suggestionMenu.clearQuery; - } - - public onUpdate(callback: (state: SuggestionsMenuState) => void) { - return this.on("update", callback); - } -} - -export function createSuggestionMenu< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema, - SuggestionMenuItem extends SuggestionItem ->( - name: string, - triggerCharacter: string, - getItems: (query: string) => Promise -) { - return (editor: BlockNoteEditor) => - new SuggestionMenuProseMirrorPlugin( - editor, - name, - triggerCharacter, - getItems - ); -} diff --git a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts index 0dcdf5026..dac58aae4 100644 --- a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +++ b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts @@ -52,7 +52,8 @@ export class FormattingToolbarView { pmView.dom.addEventListener("mousedown", this.viewMousedownHandler); pmView.dom.addEventListener("mouseup", this.viewMouseupHandler); - pmView.dom.addEventListener("dragstart", this.dragstartHandler); + pmView.dom.addEventListener("dragstart", this.dragHandler); + pmView.dom.addEventListener("dragover", this.dragHandler); pmView.dom.addEventListener("focus", this.focusHandler); pmView.dom.addEventListener("blur", this.blurHandler); @@ -70,7 +71,7 @@ export class FormattingToolbarView { }; // For dragging the whole editor. - dragstartHandler = () => { + dragHandler = () => { if (this.formattingToolbarState?.show) { this.formattingToolbarState.show = false; this.updateFormattingToolbar(); @@ -177,7 +178,8 @@ export class FormattingToolbarView { destroy() { this.pmView.dom.removeEventListener("mousedown", this.viewMousedownHandler); this.pmView.dom.removeEventListener("mouseup", this.viewMouseupHandler); - this.pmView.dom.removeEventListener("dragstart", this.dragstartHandler); + this.pmView.dom.removeEventListener("dragstart", this.dragHandler); + this.pmView.dom.removeEventListener("dragover", this.dragHandler); this.pmView.dom.removeEventListener("focus", this.focusHandler); this.pmView.dom.removeEventListener("blur", this.blurHandler); diff --git a/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts b/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts index bed6d7f96..71e80d75b 100644 --- a/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts +++ b/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts @@ -2,7 +2,8 @@ import { Editor, Extension } from "@tiptap/core"; import { Node as ProsemirrorNode } from "prosemirror-model"; import { Plugin, PluginKey } from "prosemirror-state"; import { Decoration, DecorationSet } from "prosemirror-view"; -import { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { suggestionMenuPluginKey } from "../SuggestionMenu/SuggestionPlugin"; const PLUGIN_KEY = new PluginKey(`blocknote-placeholder`); @@ -57,10 +58,7 @@ export const Placeholder = Extension.create({ decorations: (state) => { const { doc, selection } = state; // Get state of slash menu - const menuState = - this.options.editor!.suggestionMenus.slashMenu.plugin.getState( - state - ); + const menuState = suggestionMenuPluginKey.getState(state); const active = this.editor.isEditable || !this.options.showOnlyWhenEditable; const { anchor } = selection; diff --git a/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts b/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts index eca6052d9..a468dc989 100644 --- a/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts +++ b/packages/core/src/extensions/SideMenu/SideMenuPlugin.ts @@ -16,6 +16,7 @@ import { } from "../../schema"; import { EventEmitter } from "../../util/EventEmitter"; import { MultipleNodeSelection } from "./MultipleNodeSelection"; +import { suggestionMenuPluginKey } from "../SuggestionMenu/SuggestionPlugin"; let dragImageElement: Element | undefined; @@ -549,14 +550,17 @@ export class SideMenuView< const { contentNode, startPos, endPos } = blockInfo; // Creates a new block if current one is not empty for the suggestion menu to open in. - if (contentNode.textContent.length !== 0) { + if ( + contentNode.type.spec.content !== "inline*" || + contentNode.textContent.length !== 0 + ) { const newBlockInsertionPos = endPos + 1; const newBlockContentPos = newBlockInsertionPos + 2; this.editor._tiptapEditor .chain() .BNCreateBlock(newBlockInsertionPos) - .BNUpdateBlock(newBlockContentPos, { type: "paragraph", props: {} }) + // .BNUpdateBlock(newBlockContentPos, { type: "paragraph", props: {} }) .setTextSelection(newBlockContentPos) .run(); } else { @@ -566,13 +570,10 @@ export class SideMenuView< // Focuses and activates the suggestion menu. this.pmView.focus(); this.pmView.dispatch( - this.pmView.state.tr - .scrollIntoView() - .setMeta(this.editor.suggestionMenus.slashMenu.plugin.spec.key!, { - // TODO import suggestion plugin key - activate: true, - type: "drag", - }) + this.pmView.state.tr.scrollIntoView().setMeta(suggestionMenuPluginKey, { + triggerCharacter: "/", + fromUserInput: false, + }) ); } } diff --git a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts b/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts deleted file mode 100644 index 480360314..000000000 --- a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { defaultBlockSchema } from "../../blocks/defaultBlocks"; -import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; -import { - Block, - BlockSchema, - InlineContentSchema, - PartialBlock, - StyleSchema, - isStyledTextInlineContent, -} from "../../schema"; -import { imageToolbarPluginKey } from "../ImageToolbar/ImageToolbarPlugin"; -import { SuggestionItem } from "../../extensions-shared/suggestion/SuggestionItem"; - -// Sets the editor's text cursor position to the next content editable block, -// so either a block with inline content or a table. The last block is always a -// paragraph, so this function won't try to set the cursor position past the -// last block. -function setSelectionToNextContentEditableBlock< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema ->(editor: BlockNoteEditor) { - let block = editor.getTextCursorPosition().block; - let contentType = editor.blockSchema[block.type].content; - - while (contentType === "none") { - block = editor.getTextCursorPosition().nextBlock!; - contentType = editor.blockSchema[block.type].content as - | "inline" - | "table" - | "none"; - editor.setTextCursorPosition(block, "end"); - } -} - -// Checks if the current block is empty or only contains a slash, and if so, -// updates the current block instead of inserting a new one below. If the new -// block doesn't contain editable content, the cursor is moved to the next block -// that does. -function insertOrUpdateBlock< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema ->( - editor: BlockNoteEditor, - block: PartialBlock -): Block { - const currentBlock = editor.getTextCursorPosition().block; - - if (currentBlock.content === undefined) { - throw new Error("Slash Menu open in a block that doesn't contain content."); - } - - if ( - Array.isArray(currentBlock.content) && - ((currentBlock.content.length === 1 && - isStyledTextInlineContent(currentBlock.content[0]) && - currentBlock.content[0].type === "text" && - currentBlock.content[0].text === "/") || - currentBlock.content.length === 0) - ) { - editor.updateBlock(currentBlock, block); - } else { - editor.insertBlocks([block], currentBlock, "after"); - editor.setTextCursorPosition( - editor.getTextCursorPosition().nextBlock!, - "end" - ); - } - - const insertedBlock = editor.getTextCursorPosition().block; - setSelectionToNextContentEditableBlock(editor); - - return insertedBlock; -} - -export async function getDefaultSlashMenuItems< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema ->(query: string, schema: BSchema = defaultBlockSchema as unknown as BSchema) { - const slashMenuItems: SuggestionItem[] = []; - - if ("heading" in schema && "level" in schema.heading.propSchema) { - // Command for creating a level 1 heading - if (schema.heading.propSchema.level.values?.includes(1)) { - slashMenuItems.push({ - name: "Heading", - aliases: ["h", "heading1", "h1"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "heading", - props: { level: 1 }, - } as PartialBlock), - }); - } - - // Command for creating a level 2 heading - if (schema.heading.propSchema.level.values?.includes(2)) { - slashMenuItems.push({ - name: "Heading 2", - aliases: ["h2", "heading2", "subheading"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "heading", - props: { level: 2 }, - } as PartialBlock), - }); - } - - // Command for creating a level 3 heading - if (schema.heading.propSchema.level.values?.includes(3)) { - slashMenuItems.push({ - name: "Heading 3", - aliases: ["h3", "heading3", "subheading"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "heading", - props: { level: 3 }, - } as PartialBlock), - }); - } - } - - if ("bulletListItem" in schema) { - slashMenuItems.push({ - name: "Bullet List", - aliases: ["ul", "list", "bulletlist", "bullet list"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "bulletListItem", - }), - }); - } - - if ("numberedListItem" in schema) { - slashMenuItems.push({ - name: "Numbered List", - aliases: ["li", "list", "numberedlist", "numbered list"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "numberedListItem", - }), - }); - } - - if ("paragraph" in schema) { - slashMenuItems.push({ - name: "Paragraph", - aliases: ["p"], - execute: (editor) => - insertOrUpdateBlock(editor, { - type: "paragraph", - }), - }); - } - - if ("table" in schema) { - slashMenuItems.push({ - name: "Table", - aliases: ["table"], - execute: (editor) => { - insertOrUpdateBlock(editor, { - type: "table", - content: { - type: "tableContent", - rows: [ - { - cells: ["", "", ""], - }, - { - cells: ["", "", ""], - }, - ], - }, - } as PartialBlock); - }, - }); - } - - if ("image" in schema) { - slashMenuItems.push({ - name: "Image", - aliases: [ - "image", - "imageUpload", - "upload", - "img", - "picture", - "media", - "url", - "drive", - "dropbox", - ], - execute: (editor) => { - const insertedBlock = insertOrUpdateBlock(editor, { - type: "image", - }); - - // Immediately open the image toolbar - editor._tiptapEditor.view.dispatch( - editor._tiptapEditor.state.tr.setMeta(imageToolbarPluginKey, { - block: insertedBlock, - }) - ); - }, - }); - } - - return slashMenuItems.filter( - ({ name, aliases }) => - name.toLowerCase().startsWith(query.toLowerCase()) || - (aliases && - aliases.filter((alias) => - alias.toLowerCase().startsWith(query.toLowerCase()) - ).length !== 0) - ); -} diff --git a/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts b/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts new file mode 100644 index 000000000..08df51312 --- /dev/null +++ b/packages/core/src/extensions/SuggestionMenu/SuggestionPlugin.ts @@ -0,0 +1,349 @@ +import { findParentNode } from "@tiptap/core"; +import { EditorState, Plugin, PluginKey } from "prosemirror-state"; +import { Decoration, DecorationSet, EditorView } from "prosemirror-view"; +import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; +import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; +import { EventEmitter } from "../../util/EventEmitter"; +import { BaseUiElementState } from "../../extensions-shared/BaseUiElementTypes"; +// TODO: clean file +const findBlock = findParentNode((node) => node.type.name === "blockContainer"); + +export type SuggestionsMenuState = BaseUiElementState & { + query: string; +}; + +class SuggestionMenuView< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +> { + private suggestionsMenuState?: SuggestionsMenuState; + public updateSuggestionsMenu: (triggerCharacter: string) => void; + + pluginState: SuggestionPluginState; + + constructor( + private readonly editor: BlockNoteEditor, + updateSuggestionsMenu: ( + menuName: string, + suggestionsMenuState: SuggestionsMenuState + ) => void + ) { + this.pluginState = undefined; + + this.updateSuggestionsMenu = (menuName: string) => { + if (!this.suggestionsMenuState) { + throw new Error("Attempting to update uninitialized suggestions menu"); + } + + updateSuggestionsMenu(menuName, this.suggestionsMenuState); + }; + + document.addEventListener("scroll", this.handleScroll); + } + + handleScroll = () => { + if (this.suggestionsMenuState?.show) { + const decorationNode = document.querySelector( + `[data-decoration-id="${this.pluginState!.decorationId}"]` + ); + this.suggestionsMenuState.referencePos = + decorationNode!.getBoundingClientRect(); + this.updateSuggestionsMenu(this.pluginState!.triggerCharacter!); + } + }; + + update(view: EditorView, prevState: EditorState) { + const prev: SuggestionPluginState = + suggestionMenuPluginKey.getState(prevState); + const next: SuggestionPluginState = suggestionMenuPluginKey.getState( + view.state + ); + + // See how the state changed + const started = prev === undefined && next !== undefined; + const stopped = prev !== undefined && next === undefined; + const changed = prev !== undefined && next !== undefined; + + // Cancel when suggestion isn't active + if (!started && !changed && !stopped) { + return; + } + + this.pluginState = stopped ? prev : next; + + if (stopped || !this.editor.isEditable) { + this.suggestionsMenuState!.show = false; + this.updateSuggestionsMenu(this.pluginState!.triggerCharacter); + + return; + } + + const decorationNode = document.querySelector( + `[data-decoration-id="${this.pluginState!.decorationId}"]` + ); + + if (this.editor.isEditable) { + this.suggestionsMenuState = { + show: true, + referencePos: decorationNode!.getBoundingClientRect(), + query: this.pluginState!.query, + }; + + this.updateSuggestionsMenu(this.pluginState!.triggerCharacter!); + } + } + + destroy() { + document.removeEventListener("scroll", this.handleScroll); + } + + closeMenu = () => { + this.editor._tiptapEditor.view.dispatch( + this.editor._tiptapEditor.view.state.tr.setMeta( + suggestionMenuPluginKey, + null + ) + ); + }; + + clearQuery = () => { + if (this.pluginState === undefined) { + return; + } + + this.editor._tiptapEditor + .chain() + .focus() + .deleteRange({ + from: + this.pluginState.queryStartPos! - + (this.pluginState.fromUserInput + ? this.pluginState.triggerCharacter!.length + : 0), + to: this.editor._tiptapEditor.state.selection.from, + }) + .run(); + }; +} + +type SuggestionPluginState = + | { + triggerCharacter: string; + fromUserInput: boolean; + queryStartPos: number; + query: string; + decorationId: string; + } + | undefined; + +export const suggestionMenuPluginKey = new PluginKey("SuggestionMenuPlugin"); + +/** + * A ProseMirror plugin for suggestions, designed to make '/'-commands possible as well as mentions. + * + * This is basically a simplified version of TipTap's [Suggestions](https://github.com/ueberdosis/tiptap/tree/db92a9b313c5993b723c85cd30256f1d4a0b65e1/packages/suggestion) plugin. + * + * This version is adapted from the aforementioned version in the following ways: + * - This version supports generic items instead of only strings (to allow for more advanced filtering for example) + * - This version hides some unnecessary complexity from the user of the plugin. + * - This version handles key events differently + */ +export class SuggestionMenuProseMirrorPlugin< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +> extends EventEmitter { + private view: SuggestionMenuView | undefined; + public readonly plugin: Plugin; + + private triggerCharacters: string[] = []; + + constructor(editor: BlockNoteEditor) { + super(); + const triggerCharacters = this.triggerCharacters; + this.plugin = new Plugin({ + key: suggestionMenuPluginKey, + + view: () => { + this.view = new SuggestionMenuView( + editor, + (triggerCharacter, suggestionsMenuState) => { + this.emit(`update ${triggerCharacter}`, suggestionsMenuState); + } + ); + return this.view; + }, + + state: { + // Initialize the plugin's internal state. + init(): SuggestionPluginState { + return undefined; + }, + + // Apply changes to the plugin state from an editor transaction. + apply(transaction, prev, _oldState, newState): SuggestionPluginState { + // TODO: More clearly define which transactions should be ignored. + if (transaction.getMeta("orderedListIndexing") !== undefined) { + return prev; + } + + // Either contains the trigger character if the menu should be shown, + // or null if it should be hidden. + const suggestionPluginTransactionMeta: { + triggerCharacter: string; + fromUserInput?: boolean; + } | null = transaction.getMeta(suggestionMenuPluginKey); + + // Only opens a menu of no menu is already open + if ( + typeof suggestionPluginTransactionMeta === "object" && + suggestionPluginTransactionMeta !== null && + prev === undefined + ) { + return { + triggerCharacter: + suggestionPluginTransactionMeta.triggerCharacter, + fromUserInput: + suggestionPluginTransactionMeta.fromUserInput !== false, + queryStartPos: newState.selection.from, + query: "", + decorationId: `id_${Math.floor(Math.random() * 0xffffffff)}`, + }; + } + + // Checks if the menu is hidden, in which case it doesn't need to be hidden or updated. + if (prev === undefined) { + return prev; + } + + // Checks if the menu should be hidden. + if ( + // Highlighting text should hide the menu. + newState.selection.from !== newState.selection.to || + // Transactions with plugin metadata should hide the menu. + suggestionPluginTransactionMeta === null || + // Certain mouse events should hide the menu. + // TODO: Change to global mousedown listener. + transaction.getMeta("focus") || + transaction.getMeta("blur") || + transaction.getMeta("pointer") || + // Moving the caret before the character which triggered the menu should hide it. + (prev.triggerCharacter !== undefined && + newState.selection.from < prev.queryStartPos!) + ) { + return undefined; + } + + const next = { ...prev }; + + // Updates the current query. + next.query = newState.doc.textBetween( + prev.queryStartPos!, + newState.selection.from + ); + + return next; + }, + }, + + props: { + handleKeyDown(view, event) { + const suggestionPluginState: SuggestionPluginState = ( + this as Plugin + ).getState(view.state); + + if ( + triggerCharacters.includes(event.key) && + suggestionPluginState === undefined + ) { + event.preventDefault(); + + view.dispatch( + view.state.tr + .insertText(event.key) + .scrollIntoView() + .setMeta(suggestionMenuPluginKey, { + triggerCharacter: event.key, + }) + ); + + return true; + } + + return false; + }, + + // Setup decorator on the currently active suggestion. + decorations(state) { + const suggestionPluginState: SuggestionPluginState = ( + this as Plugin + ).getState(state); + + if (suggestionPluginState === undefined) { + return null; + } + + // If the menu was opened programmatically by another extension, it may not use a trigger character. In this + // case, the decoration is set on the whole block instead, as the decoration range would otherwise be empty. + if (!suggestionPluginState.fromUserInput) { + const blockNode = findBlock(state.selection); + if (blockNode) { + return DecorationSet.create(state.doc, [ + Decoration.node( + blockNode.pos, + blockNode.pos + blockNode.node.nodeSize, + { + nodeName: "span", + class: "bn-suggestion-decorator", + "data-decoration-id": suggestionPluginState.decorationId, + } + ), + ]); + } + } + // Creates an inline decoration around the trigger character. + return DecorationSet.create(state.doc, [ + Decoration.inline( + suggestionPluginState.queryStartPos! - + suggestionPluginState.triggerCharacter!.length, + suggestionPluginState.queryStartPos!, + { + nodeName: "span", + class: "bn-suggestion-decorator", + "data-decoration-id": suggestionPluginState.decorationId, + } + ), + ]); + }, + }, + }); + } + + public onUpdate( + triggerCharacter: string, + callback: (state: SuggestionsMenuState) => void + ) { + if (!this.triggerCharacters.includes(triggerCharacter)) { + this.addTriggerCharacter(triggerCharacter); + } + // TODO: be able to remove the triggerCharacter + return this.on(`update ${triggerCharacter}`, callback); + } + + addTriggerCharacter = (triggerCharacter: string) => { + this.triggerCharacters.push(triggerCharacter); + }; + + closeMenu = () => this.view!.closeMenu(); + + clearQuery = () => this.view!.clearQuery(); +} + +export function createSuggestionMenu< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +>(editor: BlockNoteEditor, triggerCharacter: string) { + editor.suggestionMenus.addTriggerCharacter(triggerCharacter); +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6db1e4735..62046f183 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,16 +7,13 @@ export * from "./blocks/defaultProps"; export * from "./editor/BlockNoteEditor"; export * from "./editor/BlockNoteExtensions"; export * from "./editor/selectionTypes"; -export * from "./extensions-shared/BaseUiElementTypes"; -export type { SuggestionItem } from "./extensions-shared/suggestion/SuggestionItem"; -export * from "./extensions-shared/suggestion/SuggestionItem"; -export * from "./extensions-shared/suggestion/SuggestionPlugin"; export * from "./extensions/FormattingToolbar/FormattingToolbarPlugin"; export * from "./extensions/HyperlinkToolbar/HyperlinkToolbarPlugin"; export * from "./extensions/ImageToolbar/ImageToolbarPlugin"; +export * from "./extensions/SuggestionMenu/SuggestionPlugin"; export * from "./extensions/SideMenu/SideMenuPlugin"; -export { getDefaultSlashMenuItems } from "./extensions/SlashMenu/defaultSlashMenuItems"; export * from "./extensions/TableHandles/TableHandlesPlugin"; +export * from "./extensions-shared/BaseUiElementTypes"; export * from "./schema"; export * from "./util/browser"; export * from "./util/string"; diff --git a/packages/core/src/pm-nodes/BlockContainer.ts b/packages/core/src/pm-nodes/BlockContainer.ts index d7aab2b0e..77e3e3dab 100644 --- a/packages/core/src/pm-nodes/BlockContainer.ts +++ b/packages/core/src/pm-nodes/BlockContainer.ts @@ -693,10 +693,6 @@ export const BlockContainer = Node.create<{ this.editor.commands.liftListItem("blockContainer"); return true; }, - "Mod-Alt-0": () => - this.editor.commands.BNCreateBlock( - this.editor.state.selection.anchor + 2 - ), }; }, }); diff --git a/packages/react/package.json b/packages/react/package.json index 1e3b8c289..b3ac905e8 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -3,7 +3,7 @@ "homepage": "https://github.com/TypeCellOS/BlockNote", "private": false, "license": "MPL-2.0", - "version": "0.11.0", + "version": "0.11.2", "files": [ "dist", "types", @@ -50,15 +50,13 @@ "clean": "rimraf dist && rimraf types" }, "dependencies": { - "@blocknote/core": "^0.11.0", + "@blocknote/core": "^0.11.2", "@floating-ui/react": "^0.26.4", - "@mantine/core": "^7.3.1", - "@mantine/hooks": "^7.3.1", - "@mantine/utils": "^6.0.5", + "@mantine/core": "^7.5.0", + "@mantine/hooks": "^7.5.0", + "@mantine/utils": "^6.0.21", "@tiptap/core": "^2.0.3", "@tiptap/react": "^2.0.3", - "lodash.foreach": "^4.5.0", - "lodash.groupby": "^4.6.0", "lodash.merge": "^4.6.2", "react": "^18", "react-dom": "^18.2.0", diff --git a/packages/react/src/components-shared/SuggestionMenu/SuggestionMenuPositioner.tsx b/packages/react/src/components-shared/SuggestionMenu/SuggestionMenuPositioner.tsx deleted file mode 100644 index 147a21874..000000000 --- a/packages/react/src/components-shared/SuggestionMenu/SuggestionMenuPositioner.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { - BlockNoteEditor, - BlockSchema, - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema, - InlineContentSchema, - StyleSchema, - SuggestionItem, - SuggestionMenuProseMirrorPlugin, - SuggestionsMenuState, -} from "@blocknote/core"; -import { - flip, - offset, - size, - useFloating, - useTransitionStyles, -} from "@floating-ui/react"; -import { FC, useEffect, useRef, useState } from "react"; - -export type SuggestionMenuProps< - Item extends SuggestionItem, - BSchema extends BlockSchema = DefaultBlockSchema, - I extends InlineContentSchema = DefaultInlineContentSchema, - S extends StyleSchema = DefaultStyleSchema -> = Pick< - SuggestionMenuProseMirrorPlugin, - "getItems" | "executeItem" | "closeMenu" | "clearQuery" -> & - Pick & { - editor: BlockNoteEditor; - }; - -export const SuggestionMenuPositioner = < - Item extends SuggestionItem, - BSchema extends BlockSchema = DefaultBlockSchema, - I extends InlineContentSchema = DefaultInlineContentSchema, - S extends StyleSchema = DefaultStyleSchema ->(props: { - editor: BlockNoteEditor; - suggestionsMenuName: string; - suggestionsMenuComponent: FC>; -}) => { - const [show, setShow] = useState(false); - const [query, setQuery] = useState(""); - - const referencePos = useRef(); - - const { refs, update, context, floatingStyles } = useFloating({ - open: show, - placement: "bottom-start", - middleware: [ - offset(10), - // Flips the menu placement to maximize the space available, and prevents - // the menu from being cut off by the confines of the screen. - flip(), - size({ - apply({ availableHeight, elements }) { - Object.assign(elements.floating.style, { - maxHeight: `${availableHeight - 10}px`, - }); - }, - }), - ], - }); - - const { isMounted, styles } = useTransitionStyles(context); - - useEffect(() => { - return props.editor.suggestionMenus[props.suggestionsMenuName].onUpdate( - (suggestionsMenuState) => { - setShow(suggestionsMenuState.show); - setQuery(suggestionsMenuState.query); - - referencePos.current = suggestionsMenuState.referencePos; - - update(); - } - ); - }, [props.editor, props.suggestionsMenuName, show, update]); - - useEffect(() => { - refs.setReference({ - getBoundingClientRect: () => referencePos.current!, - }); - }, [refs]); - - if (!isMounted || !query === undefined) { - return null; - } - - const SuggestionsMenu = props.suggestionsMenuComponent; - - return ( -
- -
- ); -}; diff --git a/packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx b/packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx deleted file mode 100644 index db1c39f13..000000000 --- a/packages/react/src/components/SlashMenu/DefaultSlashMenu.tsx +++ /dev/null @@ -1,209 +0,0 @@ -import { Loader, Menu } from "@mantine/core"; -import foreach from "lodash.foreach"; -import groupBy from "lodash.groupby"; - -import { BlockSchema, InlineContentSchema, StyleSchema } from "@blocknote/core"; -import { useEffect, useMemo, useRef, useState } from "react"; -import { ReactSlashMenuItem } from "../../slashMenuItems/ReactSlashMenuItem"; -import { SlashMenuItem } from "./SlashMenuItem"; -import { SuggestionMenuProps } from "../../components-shared/SuggestionMenu/SuggestionMenuPositioner"; - -export function DefaultSlashMenu< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema ->( - props: SuggestionMenuProps, BSchema, I, S> -) { - const { query, getItems, closeMenu, executeItem, clearQuery, editor } = props; - - const [orderedItems, setOrderedItems] = useState< - ReactSlashMenuItem[] | undefined - >(undefined); - const [loading, setLoading] = useState(false); - const [selectedIndex, setSelectedIndex] = useState(0); - - // Used to ignore the previous query if a new one is made before it returns. - const currentQuery = useRef(); - - // Used to close the menu if the query is >3 characters longer than the last - // query that returned any results. - const lastUsefulQueryLength = useRef(0); - - // Gets the items to display and orders them by group. - useEffect(() => { - const thisQuery = query; - currentQuery.current = query; - - setLoading(true); - - getItems(query).then((items) => { - if (currentQuery.current !== thisQuery) { - // outdated query returned, ignore the result - return; - } - - const orderedItems: ReactSlashMenuItem[] = []; - - const groups = groupBy(items, (item) => item.group); - - foreach(groups, (groupedItems) => { - for (const item of groupedItems) { - orderedItems.push(item); - } - }); - - if (orderedItems.length > 0) { - lastUsefulQueryLength.current = query.length; - } else if (query.length - lastUsefulQueryLength.current > 3) { - closeMenu(); - } - - setOrderedItems(orderedItems); - setLoading(false); - }); - }, [query, getItems, closeMenu]); - - // Creates the JSX elements to render. - const renderedItems = useMemo(() => { - if (orderedItems === undefined) { - return null; - } - - if (orderedItems.length === 0) { - return []; - } - - const renderedItems: JSX.Element[] = []; - let currentGroup = undefined; - let itemIndex = 0; - - for (const item of orderedItems) { - if (item.group !== currentGroup) { - currentGroup = item.group; - renderedItems.push( - {currentGroup} - ); - } - - renderedItems.push( - { - closeMenu(); - clearQuery(); - executeItem(item); - }} - /> - ); - - itemIndex++; - } - - return renderedItems; - }, [closeMenu, executeItem, clearQuery, orderedItems, selectedIndex]); - - // Handles keyboard navigation. - useEffect(() => { - const preventMenuNavigationKeys = (event: KeyboardEvent) => { - if (event.key === "ArrowUp") { - event.preventDefault(); - - if (orderedItems !== undefined) { - setSelectedIndex( - (selectedIndex - 1 + orderedItems!.length) % orderedItems!.length - ); - } - - return true; - } - - if (event.key === "ArrowDown") { - event.preventDefault(); - - if (orderedItems !== undefined) { - setSelectedIndex((selectedIndex + 1) % orderedItems!.length); - } - - return true; - } - - if (event.key === "Enter") { - event.preventDefault(); - - if (orderedItems !== undefined) { - closeMenu(); - clearQuery(); - executeItem(orderedItems[selectedIndex]); - } - - return true; - } - - if (event.key === "Escape") { - event.preventDefault(); - - closeMenu(); - - return true; - } - - return false; - }; - - editor.domElement.addEventListener( - "keydown", - preventMenuNavigationKeys, - true - ); - - return () => { - editor.domElement.removeEventListener( - "keydown", - preventMenuNavigationKeys, - true - ); - }; - }, [ - selectedIndex, - orderedItems, - editor.domElement, - closeMenu, - clearQuery, - executeItem, - ]); - - const loader = loading ? ( - - ) : null; - - return ( - - event.preventDefault()} - className={"bn-slash-menu"}> - {renderedItems === null - ? loader - : renderedItems.length > 0 - ? [...renderedItems, loader] - : [No match found, loader]} - - - ); -} diff --git a/packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx b/packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx deleted file mode 100644 index f0fe96f8e..000000000 --- a/packages/react/src/components/SlashMenu/SlashMenuPositioner.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { - BlockNoteEditor, - BlockSchema, - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema, - InlineContentSchema, - StyleSchema, -} from "@blocknote/core"; -import { FC } from "react"; - -import { DefaultSlashMenu } from "./DefaultSlashMenu"; -import { - SuggestionMenuPositioner, - SuggestionMenuProps, -} from "../../components-shared/SuggestionMenu/SuggestionMenuPositioner"; -import { ReactSlashMenuItem } from "../../slashMenuItems/ReactSlashMenuItem"; - -export const SlashMenuPositioner = < - BSchema extends BlockSchema = DefaultBlockSchema, - I extends InlineContentSchema = DefaultInlineContentSchema, - S extends StyleSchema = DefaultStyleSchema ->(props: { - editor: BlockNoteEditor; - slashMenu?: FC< - SuggestionMenuProps, BSchema, I, S> - >; -}) => { - const SlashMenu = props.slashMenu || DefaultSlashMenu; - - return ( - - ); -}; diff --git a/packages/react/src/components/SuggestionMenu/DefaultSuggestionMenu.tsx b/packages/react/src/components/SuggestionMenu/DefaultSuggestionMenu.tsx new file mode 100644 index 000000000..2212b81bd --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/DefaultSuggestionMenu.tsx @@ -0,0 +1,133 @@ +import { FC, useMemo } from "react"; +import { + BlockNoteEditor, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "@blocknote/core"; + +import { SuggestionMenuItemProps } from "./MantineSuggestionMenuItem"; +import { useLoadSuggestionMenuItems } from "./hooks/useLoadSuggestionMenuItems"; +import { useCloseSuggestionMenuNoItems } from "./hooks/useCloseSuggestionMenuNoItems"; +import { useSuggestionMenuKeyboardNavigation } from "./hooks/useSuggestionMenuKeyboardNavigation"; +import { useSuggestionMenu } from "../../hooks/useSuggestionMenu"; +import { defaultGetItems } from "./defaultGetItems"; +import { + MantineSuggestionMenu, + SuggestionMenuProps, +} from "./MantineSuggestionMenu"; + +export function DefaultPositionedSuggestionMenu< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema, + Item extends { + name: string; + execute: () => void; + } = SuggestionMenuItemProps +>(props: { + editor: BlockNoteEditor; + triggerCharacter?: string; + getItems?: ( + query: string, + closeMenu: () => void, + clearQuery: () => void + ) => Promise; + suggestionMenuComponent?: FC>; +}) { + const { editor, triggerCharacter, getItems, suggestionMenuComponent } = props; + + const { isMounted, suggestionMenuProps, positionerProps } = useSuggestionMenu( + editor, + triggerCharacter || "/" + ); + + if (!isMounted) { + return null; + } + + return ( +
+ +
+ ); +} + +// TODO: The reason these 2 components are split is because the hooks in +// `DefaultSuggestionMenu` assume that the menu is open. Therefore, they should +// only be run when the menu is open (you cannot conditionally run hooks). +// We could add a `show` param to each hook, but I feel like that is less +// "React-ish" than splitting the components. I think that it might be an issue +// that the menu plugins currently send both position and state data in the +// same update, as we can't separate `useSuggestionMenu` into 2 hooks, one for +// state and one for position. +// TODO: Make renderItems accept any item type if getItems also returns an +// arbitrary data type. +export function DefaultSuggestionMenu< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema, + Item extends { + name: string; + execute: () => void; + } = SuggestionMenuItemProps +>(props: { + editor: BlockNoteEditor; + query: string; + closeMenu: () => void; + clearQuery: () => void; + getItems?: ( + query: string, + closeMenu: () => void, + clearQuery: () => void + ) => Promise; + suggestionMenuComponent?: FC>; +}) { + const { + editor, + query, + closeMenu, + clearQuery, + getItems, + suggestionMenuComponent, + } = props; + + const getItemsForLoading = useMemo<(query: string) => Promise>( + () => (query: string) => + getItems !== undefined + ? getItems(query, closeMenu, clearQuery) + : (defaultGetItems(editor, query, closeMenu, clearQuery) as Promise< + Item[] + >), + [clearQuery, closeMenu, editor, getItems] + ); + + const { items, usedQuery, loadingState } = useLoadSuggestionMenuItems( + query, + getItemsForLoading + ); + + useCloseSuggestionMenuNoItems(items, usedQuery, closeMenu); + + const selectedIndex = useSuggestionMenuKeyboardNavigation( + editor, + items, + closeMenu + ); + + const SuggestionMenu: FC> = + suggestionMenuComponent || MantineSuggestionMenu; + + return ( + + ); +} diff --git a/packages/react/src/components/SuggestionMenu/MantineSuggestionMenu.tsx b/packages/react/src/components/SuggestionMenu/MantineSuggestionMenu.tsx new file mode 100644 index 000000000..434c58794 --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/MantineSuggestionMenu.tsx @@ -0,0 +1,74 @@ +import { Loader, Menu } from "@mantine/core"; +import { Children, useMemo } from "react"; +import { + MantineSuggestionMenuItem, + SuggestionMenuItemProps, +} from "./MantineSuggestionMenuItem"; + +export type SuggestionMenuProps = { + items: T[]; + loadingState: "loading-initial" | "loading" | "loaded"; + selectedIndex: number; +}; + +export function MantineSuggestionMenu( + props: SuggestionMenuProps +) { + const { items, loadingState, selectedIndex } = props; + + const loader = + loadingState === "loading-initial" || loadingState === "loading" ? ( + + ) : null; + + const renderedItems = useMemo(() => { + let currentGroup: string | undefined = undefined; + const renderedItems = []; + + for (let i = 0; i < items.length; i++) { + if (items[i].group !== currentGroup) { + currentGroup = items[i].group; + renderedItems.push( + {currentGroup} + ); + } + + renderedItems.push( + + ); + } + + return renderedItems; + }, [items, selectedIndex]); + + return ( + + event.preventDefault()} + className={"bn-slash-menu"}> + {renderedItems} + {Children.count(renderedItems) === 0 && + (props.loadingState === "loading" || + props.loadingState === "loaded") && ( + No match found + )} + {loader} + + + ); +} diff --git a/packages/react/src/components/SlashMenu/SlashMenuItem.tsx b/packages/react/src/components/SuggestionMenu/MantineSuggestionMenuItem.tsx similarity index 84% rename from packages/react/src/components/SlashMenu/SlashMenuItem.tsx rename to packages/react/src/components/SuggestionMenu/MantineSuggestionMenuItem.tsx index c5a5e499a..df4595218 100644 --- a/packages/react/src/components/SlashMenu/SlashMenuItem.tsx +++ b/packages/react/src/components/SuggestionMenu/MantineSuggestionMenuItem.tsx @@ -1,18 +1,21 @@ -import { Badge, Menu, Stack, Text } from "@mantine/core"; import { useEffect, useRef } from "react"; +import { Badge, Menu, Stack, Text } from "@mantine/core"; const MIN_LEFT_MARGIN = 5; -export type SlashMenuItemProps = { +export type SuggestionMenuItemProps = { name: string; - icon: JSX.Element; - hint: string | undefined; - shortcut?: string; - isSelected: boolean; - set: () => void; + execute: () => void; + subtext?: string; + icon?: JSX.Element; + badge?: string; + isSelected?: boolean; + + aliases?: string[]; + group?: string; }; -export function SlashMenuItem(props: SlashMenuItemProps) { +export function MantineSuggestionMenuItem(props: SuggestionMenuItemProps) { const itemRef = useRef(null); function isSelected() { @@ -52,7 +55,7 @@ export function SlashMenuItem(props: SlashMenuItemProps) { return ( { @@ -61,9 +64,7 @@ export function SlashMenuItem(props: SlashMenuItemProps) { }, 1); }} leftSection={props.icon} - rightSection={ - props.shortcut && {props.shortcut} - } + rightSection={props.badge && {props.badge}} ref={itemRef}> {/*Might need separate classes.*/} @@ -71,7 +72,7 @@ export function SlashMenuItem(props: SlashMenuItemProps) { {props.name} - {props.hint} + {props.subtext} diff --git a/packages/react/src/components/SuggestionMenu/defaultGetItems.tsx b/packages/react/src/components/SuggestionMenu/defaultGetItems.tsx new file mode 100644 index 000000000..3471ad79f --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/defaultGetItems.tsx @@ -0,0 +1,284 @@ +import { + Block, + BlockNoteEditor, + BlockSchema, + DefaultBlockSchema, + DefaultInlineContentSchema, + DefaultStyleSchema, + formatKeyboardShortcut, + imageToolbarPluginKey, + InlineContentSchema, + isStyledTextInlineContent, + PartialBlock, + StyleSchema, +} from "@blocknote/core"; +import { + RiH1, + RiH2, + RiH3, + RiImage2Fill, + RiListOrdered, + RiListUnordered, + RiTable2, + RiText, +} from "react-icons/ri"; + +import { SuggestionMenuItemProps } from "./MantineSuggestionMenuItem"; + +// Sets the editor's text cursor position to the next content editable block, +// so either a block with inline content or a table. The last block is always a +// paragraph, so this function won't try to set the cursor position past the +// last block. +function setSelectionToNextContentEditableBlock< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +>(editor: BlockNoteEditor) { + let block = editor.getTextCursorPosition().block; + let contentType = editor.blockSchema[block.type].content; + + while (contentType === "none") { + block = editor.getTextCursorPosition().nextBlock!; + contentType = editor.blockSchema[block.type].content as + | "inline" + | "table" + | "none"; + editor.setTextCursorPosition(block, "end"); + } +} + +// Checks if the current block is empty or only contains a slash, and if so, +// updates the current block instead of inserting a new one below. If the new +// block doesn't contain editable content, the cursor is moved to the next block +// that does. +export function insertOrUpdateBlock< + BSchema extends BlockSchema, + I extends InlineContentSchema, + S extends StyleSchema +>( + editor: BlockNoteEditor, + block: PartialBlock +): Block { + const currentBlock = editor.getTextCursorPosition().block; + + if (currentBlock.content === undefined) { + throw new Error("Slash Menu open in a block that doesn't contain content."); + } + + if ( + Array.isArray(currentBlock.content) && + ((currentBlock.content.length === 1 && + isStyledTextInlineContent(currentBlock.content[0]) && + currentBlock.content[0].type === "text" && + currentBlock.content[0].text === "/") || + currentBlock.content.length === 0) + ) { + editor.updateBlock(currentBlock, block); + } else { + editor.insertBlocks([block], currentBlock, "after"); + editor.setTextCursorPosition( + editor.getTextCursorPosition().nextBlock!, + "end" + ); + } + + const insertedBlock = editor.getTextCursorPosition().block; + setSelectionToNextContentEditableBlock(editor); + + return insertedBlock; +} + +// TODO: Not sure on the return type of this. I think it's nice that the items +// can just be plugged as props into SuggestionMenuLabel and SuggestionMenuItem +// components, but the labels make the keyboard selection code more complex. +// TODO: Also probably want an easier way of customizing the items list. +export async function defaultGetItems< + BSchema extends BlockSchema = DefaultBlockSchema, + I extends InlineContentSchema = DefaultInlineContentSchema, + S extends StyleSchema = DefaultStyleSchema +>( + editor: BlockNoteEditor, + query: string, + closeMenu: () => void, + clearQuery: () => void +): Promise { + const items: SuggestionMenuItemProps[] = [ + { + name: "Heading 1", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { + type: "heading", + props: { level: 1 }, + } as PartialBlock); + }, + subtext: "Used for a top-level heading", + icon: , + badge: formatKeyboardShortcut("Mod-Alt-1"), + aliases: ["h", "heading1", "h1"], + group: "Headings", + }, + { + name: "Heading 2", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { + type: "heading", + props: { level: 2 }, + } as PartialBlock); + }, + subtext: "Used for key sections", + icon: , + badge: formatKeyboardShortcut("Mod-Alt-2"), + aliases: ["h2", "heading2", "subheading"], + group: "Headings", + }, + { + name: "Heading 3", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { + type: "heading", + props: { level: 3 }, + } as PartialBlock); + }, + subtext: "Used for subsections and group headings", + icon: , + badge: formatKeyboardShortcut("Mod-Alt-3"), + aliases: ["h3", "heading3", "subheading"], + group: "Headings", + }, + { + name: "Numbered List", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { type: "numberedListItem" }); + }, + subtext: "Used to display a numbered list", + icon: , + badge: formatKeyboardShortcut("Mod-Shift-7"), + aliases: ["ol", "li", "list", "numberedlist", "numbered list"], + group: "Basic blocks", + }, + { + name: "Bullet List", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { type: "bulletListItem" }); + }, + subtext: "Used to display an unordered list", + icon: , + badge: formatKeyboardShortcut("Mod-Shift-8"), + aliases: ["ul", "li", "list", "bulletlist", "bullet list"], + group: "Basic blocks", + }, + { + name: "Paragraph", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { type: "paragraph" }); + }, + subtext: "Used for the body of your document", + icon: , + badge: formatKeyboardShortcut("Mod-Alt-0"), + aliases: ["p", "paragraph"], + group: "Basic blocks", + }, + { + name: "Table", + execute: () => { + closeMenu(); + clearQuery(); + + insertOrUpdateBlock(editor, { + type: "table", + content: { + type: "tableContent", + rows: [ + { + cells: ["", "", ""], + }, + { + cells: ["", "", ""], + }, + ], + }, + } as PartialBlock); + }, + subtext: "Used for for tables", + icon: , + aliases: ["table"], + group: "Advanced", + }, + { + name: "Image", + execute: () => { + closeMenu(); + clearQuery(); + + const insertedBlock = insertOrUpdateBlock(editor, { + type: "image", + }); + + // Immediately open the image toolbar + editor._tiptapEditor.view.dispatch( + editor._tiptapEditor.state.tr.setMeta(imageToolbarPluginKey, { + block: insertedBlock, + }) + ); + }, + subtext: "Insert an image", + icon: , + aliases: [ + "image", + "imageUpload", + "upload", + "img", + "picture", + "media", + "url", + "drive", + "dropbox", + ], + group: "Media", + } satisfies SuggestionMenuItemProps, + ]; + + // For testing async + // return new Promise((resolve) => { + // setTimeout(() => { + // console.log("return items"); + // resolve( + // items.filter( + // ({ name, aliases }) => + // name.toLowerCase().startsWith(query.toLowerCase()) || + // (aliases && + // aliases.filter((alias) => + // alias.toLowerCase().startsWith(query.toLowerCase()) + // ).length !== 0) + // ) + // ); + // }, 1000); + // }); + + return items.filter( + ({ name, aliases }) => + name.toLowerCase().startsWith(query.toLowerCase()) || + (aliases && + aliases.filter((alias) => + alias.toLowerCase().startsWith(query.toLowerCase()) + ).length !== 0) + ); +} diff --git a/packages/react/src/components/SuggestionMenu/hooks/useCloseSuggestionMenuNoItems.ts b/packages/react/src/components/SuggestionMenu/hooks/useCloseSuggestionMenuNoItems.ts new file mode 100644 index 000000000..d8cae0642 --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/hooks/useCloseSuggestionMenuNoItems.ts @@ -0,0 +1,34 @@ +import { useEffect, useRef } from "react"; +import { SuggestionMenuItemProps } from "../MantineSuggestionMenuItem"; + +// Hook which closes the suggestion after a certain number of consecutive +// invalid queries are made. An invalid query is one which returns no items, and +// each invalid query must be longer than the previous one to close the menu +export function useCloseSuggestionMenuNoItems< + Item extends { + name: string; + execute: () => void; + } = SuggestionMenuItemProps +>( + items: Item[], + usedQuery: string | undefined, + closeMenu: () => void, + invalidQueries = 3 +) { + const lastUsefulQueryLength = useRef(0); + + useEffect(() => { + if (usedQuery === undefined) { + return; + } + + if (items.length > 0) { + lastUsefulQueryLength.current = usedQuery.length; + } else if ( + usedQuery.length - lastUsefulQueryLength.current > + invalidQueries + ) { + closeMenu(); + } + }, [closeMenu, invalidQueries, items.length, usedQuery]); +} diff --git a/packages/react/src/components/SuggestionMenu/hooks/useLoadSuggestionMenuItems.ts b/packages/react/src/components/SuggestionMenu/hooks/useLoadSuggestionMenuItems.ts new file mode 100644 index 000000000..7c205eb43 --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/hooks/useLoadSuggestionMenuItems.ts @@ -0,0 +1,52 @@ +import { useEffect, useRef, useState } from "react"; + +// Hook which loads the items for a suggestion menu and returns them along with +// information whether the current query is still being processed, and the +// query that was used to retrieve the last set of items. +export function useLoadSuggestionMenuItems( + query: string, + getItems: (query: string) => Promise +): { + items: T[]; + usedQuery: string | undefined; + loadingState: "loading-initial" | "loading" | "loaded"; +} { + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(false); + + const currentQuery = useRef(); + const usedQuery = useRef(); + + useEffect(() => { + const thisQuery = query; + currentQuery.current = query; + + setLoading(true); + + getItems(query).then((items) => { + if (currentQuery.current !== thisQuery) { + // outdated query returned, ignore the result + return; + } + + setItems(items); + setLoading(false); + usedQuery.current = thisQuery; + }); + }, [query, getItems]); + + return { + items: items || [], + // The query that was used to retrieve the last set of items may not be the + // same as the current query as the items from the current query may not + // have been retrieved yet. This is useful when using the returns of this + // hook in other hooks. + usedQuery: usedQuery.current, + loadingState: + usedQuery.current === undefined + ? "loading-initial" + : loading + ? "loading" + : "loaded", + }; +} diff --git a/packages/react/src/components/SuggestionMenu/hooks/useSuggestionMenuKeyboardNavigation.ts b/packages/react/src/components/SuggestionMenu/hooks/useSuggestionMenuKeyboardNavigation.ts new file mode 100644 index 000000000..edef4b737 --- /dev/null +++ b/packages/react/src/components/SuggestionMenu/hooks/useSuggestionMenuKeyboardNavigation.ts @@ -0,0 +1,79 @@ +import { BlockNoteEditor } from "@blocknote/core"; +import { useEffect, useState } from "react"; +import { SuggestionMenuItemProps } from "../MantineSuggestionMenuItem"; + +// Hook which handles keyboard navigation of a suggestion menu. Arrow keys are +// used to select a menu item, enter to execute it, and escape to close the +// menu. +export function useSuggestionMenuKeyboardNavigation< + Item extends { + name: string; + execute: () => void; + } = SuggestionMenuItemProps +>( + editor: BlockNoteEditor, + items: Item[], + closeMenu: () => void +) { + const [selectedIndex, setSelectedIndex] = useState(0); + + useEffect(() => { + const handleMenuNavigationKeys = (event: KeyboardEvent) => { + if (event.key === "ArrowUp") { + event.preventDefault(); + + if (items.length) { + setSelectedIndex((selectedIndex - 1 + items!.length) % items!.length); + } + + return true; + } + + if (event.key === "ArrowDown") { + event.preventDefault(); + + if (items.length) { + setSelectedIndex((selectedIndex + 1) % items!.length); + } + + return true; + } + + if (event.key === "Enter") { + event.preventDefault(); + + if (items.length) { + items[selectedIndex].execute(); + } + + return true; + } + + if (event.key === "Escape") { + event.preventDefault(); + + closeMenu(); + + return true; + } + + return false; + }; + + editor.domElement.addEventListener( + "keydown", + handleMenuNavigationKeys, + true + ); + + return () => { + editor.domElement.removeEventListener( + "keydown", + handleMenuNavigationKeys, + true + ); + }; + }, [closeMenu, editor.domElement, items, selectedIndex]); + + return selectedIndex; +} diff --git a/packages/react/src/editor/BlockNoteDefaultUI.tsx b/packages/react/src/editor/BlockNoteDefaultUI.tsx new file mode 100644 index 000000000..65f8d1a9e --- /dev/null +++ b/packages/react/src/editor/BlockNoteDefaultUI.tsx @@ -0,0 +1,47 @@ +import { FormattingToolbarPositioner } from "../components/FormattingToolbar/FormattingToolbarPositioner"; +import { HyperlinkToolbarPositioner } from "../components/HyperlinkToolbar/HyperlinkToolbarPositioner"; +import { DefaultPositionedSuggestionMenu } from "../components/SuggestionMenu/DefaultSuggestionMenu"; +import { SideMenuPositioner } from "../components/SideMenu/SideMenuPositioner"; +import { ImageToolbarPositioner } from "../components/ImageToolbar/ImageToolbarPositioner"; +import { TableHandlesPositioner } from "../components/TableHandles/TableHandlePositioner"; +import { + BlockNoteEditor, + BlockSchema, + InlineContentSchema, + StyleSchema, +} from "@blocknote/core"; + +export function BlockNoteDefaultUI< + BSchema extends BlockSchema, + ISchema extends InlineContentSchema, + SSchema extends StyleSchema +>(props: { + editor: BlockNoteEditor; + formattingToolbar?: boolean; + hyperlinkToolbar?: boolean; + slashMenu?: boolean; + sideMenu?: boolean; + imageToolbar?: boolean; + tableHandles?: boolean; +}) { + return ( + <> + {props.formattingToolbar !== false && ( + + )} + {props.hyperlinkToolbar !== false && ( + + )} + {props.slashMenu !== false && ( + + )} + {props.sideMenu !== false && } + {props.imageToolbar !== false && ( + + )} + {props.editor.blockSchema.table && props.tableHandles !== false && ( + + )} + + ); +} diff --git a/packages/react/src/editor/BlockNoteView.tsx b/packages/react/src/editor/BlockNoteView.tsx index d28ed5b64..10177b132 100644 --- a/packages/react/src/editor/BlockNoteView.tsx +++ b/packages/react/src/editor/BlockNoteView.tsx @@ -14,13 +14,8 @@ import { applyBlockNoteCSSVariablesFromTheme, removeBlockNoteCSSVariables, } from "./BlockNoteTheme"; -import { FormattingToolbarPositioner } from "../components/FormattingToolbar/FormattingToolbarPositioner"; -import { HyperlinkToolbarPositioner } from "../components/HyperlinkToolbar/HyperlinkToolbarPositioner"; -import { ImageToolbarPositioner } from "../components/ImageToolbar/ImageToolbarPositioner"; -import { SideMenuPositioner } from "../components/SideMenu/SideMenuPositioner"; -import { SlashMenuPositioner } from "../components/SlashMenu/SlashMenuPositioner"; -import { TableHandlesPositioner } from "../components/TableHandles/TableHandlePositioner"; import "./styles.css"; +import { BlockNoteDefaultUI } from "./BlockNoteDefaultUI"; const mantineTheme = { // Removes button press effect @@ -88,24 +83,15 @@ export function BlockNoteView< }, [systemColorScheme, editor.domElement, theme]); return ( - + // `cssVariablesSelector` scopes Mantine CSS variables to only the editor, + // as proposed here: https://github.com/orgs/mantinedev/discussions/5685 + - {children || ( - <> - - - - - - {editor.blockSchema.table && ( - - )} - - )} + {children || } ); diff --git a/packages/react/src/editor/mantineStyles.css b/packages/react/src/editor/mantineStyles.css new file mode 100644 index 000000000..9fbad9526 --- /dev/null +++ b/packages/react/src/editor/mantineStyles.css @@ -0,0 +1,138 @@ +/* Based on https://github.com/orgs/mantinedev/discussions/5685 */ + +/* We need all the Mantine styles except the global styles, so unfortunately our + only option is to import all the component styles separately. Could consider + importing only styles for components used in BlockNote in the future. */ +/* Files list: https://mantine.dev/styles/css-files-list/ */ +@import url("@mantine/core/styles/ScrollArea.css"); +@import url("@mantine/core/styles/UnstyledButton.css"); +@import url("@mantine/core/styles/VisuallyHidden.css"); +@import url("@mantine/core/styles/Paper.css"); +@import url("@mantine/core/styles/Popover.css"); +@import url("@mantine/core/styles/CloseButton.css"); +@import url("@mantine/core/styles/Group.css"); +@import url("@mantine/core/styles/Loader.css"); +@import url("@mantine/core/styles/Overlay.css"); +@import url("@mantine/core/styles/ModalBase.css"); +@import url("@mantine/core/styles/Input.css"); +@import url("@mantine/core/styles/Flex.css"); + +@import url("@mantine/core/styles/Accordion.css"); +@import url("@mantine/core/styles/ActionIcon.css"); +@import url("@mantine/core/styles/Affix.css"); +@import url("@mantine/core/styles/Alert.css"); +@import url("@mantine/core/styles/Anchor.css"); +@import url("@mantine/core/styles/AspectRatio.css"); +@import url("@mantine/core/styles/AppShell.css"); +@import url("@mantine/core/styles/Avatar.css"); +@import url("@mantine/core/styles/Badge.css"); +@import url("@mantine/core/styles/BackgroundImage.css"); +@import url("@mantine/core/styles/Blockquote.css"); +@import url("@mantine/core/styles/Breadcrumbs.css"); +@import url("@mantine/core/styles/Button.css"); +@import url("@mantine/core/styles/Burger.css"); +@import url("@mantine/core/styles/Card.css"); +@import url("@mantine/core/styles/Center.css"); +@import url("@mantine/core/styles/Checkbox.css"); +@import url("@mantine/core/styles/Chip.css"); +@import url("@mantine/core/styles/Code.css"); +@import url("@mantine/core/styles/ColorInput.css"); +@import url("@mantine/core/styles/ColorPicker.css"); +@import url("@mantine/core/styles/ColorSwatch.css"); +@import url("@mantine/core/styles/Combobox.css"); +@import url("@mantine/core/styles/Container.css"); +@import url("@mantine/core/styles/Dialog.css"); +@import url("@mantine/core/styles/Divider.css"); +@import url("@mantine/core/styles/Drawer.css"); +@import url("@mantine/core/styles/Fieldset.css"); +@import url("@mantine/core/styles/Grid.css"); +@import url("@mantine/core/styles/Image.css"); +@import url("@mantine/core/styles/Indicator.css"); +@import url("@mantine/core/styles/InlineInput.css"); +@import url("@mantine/core/styles/Kbd.css"); +@import url("@mantine/core/styles/List.css"); +@import url("@mantine/core/styles/LoadingOverlay.css"); +@import url("@mantine/core/styles/Mark.css"); +@import url("@mantine/core/styles/Menu.css"); +@import url("@mantine/core/styles/Modal.css"); +@import url("@mantine/core/styles/NavLink.css"); +@import url("@mantine/core/styles/Notification.css"); +@import url("@mantine/core/styles/NumberInput.css"); +@import url("@mantine/core/styles/Pagination.css"); +@import url("@mantine/core/styles/Pill.css"); +@import url("@mantine/core/styles/PasswordInput.css"); +@import url("@mantine/core/styles/PillsInput.css"); +@import url("@mantine/core/styles/PinInput.css"); +@import url("@mantine/core/styles/Progress.css"); +@import url("@mantine/core/styles/Radio.css"); +@import url("@mantine/core/styles/Rating.css"); +@import url("@mantine/core/styles/RingProgress.css"); +@import url("@mantine/core/styles/SegmentedControl.css"); +@import url("@mantine/core/styles/SimpleGrid.css"); +@import url("@mantine/core/styles/Skeleton.css"); +@import url("@mantine/core/styles/Slider.css"); +@import url("@mantine/core/styles/Spoiler.css"); +@import url("@mantine/core/styles/Stack.css"); +@import url("@mantine/core/styles/Stepper.css"); +@import url("@mantine/core/styles/Switch.css"); +@import url("@mantine/core/styles/Table.css"); +@import url("@mantine/core/styles/Tabs.css"); +@import url("@mantine/core/styles/Text.css"); +@import url("@mantine/core/styles/ThemeIcon.css"); +@import url("@mantine/core/styles/Timeline.css"); +@import url("@mantine/core/styles/Title.css"); +@import url("@mantine/core/styles/Tooltip.css"); +@import url("@mantine/core/styles/TypographyStylesProvider.css"); + +/* Mantine global styles, scoped to bn-container */ +/* Based on @mantine/core/styles/global.css + (src: https://github.com/mantinedev/mantine/blob/master/packages/%40mantine/core/src/core/MantineProvider/global.css) + but with styles set on `body` and `html` instead set on `bn-container`, as + well as other minor changes. */ +.bn-container *, .bn-container :after, .bn-container :before { + box-sizing: border-box +} + +.bn-container button, +.bn-container select { + text-transform: none +} + +@media screen and (max-device-width: 500px) { + .bn-container { + -webkit-text-size-adjust: 100% + } +} + +@media (prefers-reduced-motion: reduce) { + .bn-container [data-respect-reduced-motion] [data-reduce-motion] { + animation: none; + transition: none + } +} + +.bn-container [data-mantine-color-scheme=dark] .mantine-dark-hidden, .bn-container [data-mantine-color-scheme=light] .mantine-light-hidden { + display: none +} + +.bn-container .mantine-focus-auto:focus-visible { + outline: calc(.125rem * var(--mantine-scale)) solid var(--mantine-primary-color-filled); + outline-offset: calc(.125rem * var(--mantine-scale)) +} + +.bn-container .mantine-focus-always:focus { + outline: calc(.125rem * var(--mantine-scale)) solid var(--mantine-primary-color-filled); + outline-offset: calc(.125rem * var(--mantine-scale)) +} + +.bn-container .mantine-focus-never:focus { + outline: none +} + +.bn-container .mantine-active:active { + transform: translateY(calc(.0625rem * var(--mantine-scale))) +} + +.bn-container[dir=rtl] .mantine-rotate-rtl { + transform: rotate(180deg) +} \ No newline at end of file diff --git a/packages/react/src/editor/styles.css b/packages/react/src/editor/styles.css index 5458ca61b..82805a38b 100644 --- a/packages/react/src/editor/styles.css +++ b/packages/react/src/editor/styles.css @@ -1,4 +1,4 @@ -@import url("@mantine/core/styles.css"); +@import url("./mantineStyles.css"); @import url("@blocknote/core/style.css"); /* Default theme params */ @@ -158,7 +158,7 @@ } /* Mantine Popover component base styles */ -.mantine-Popover-dropdown { +.bn-container .mantine-Popover-dropdown { background-color: transparent; border: none; border-radius: 0; @@ -242,54 +242,71 @@ [data-text-color="gray"] { color: var(--bn-colors-highlights-gray-text); } + [data-text-color="brown"] { color: var(--bn-colors-highlights-brown-text); } + [data-text-color="red"] { color: var(--bn-colors-highlights-red-text); } + [data-text-color="orange"] { color: var(--bn-colors-highlights-orange-text); } + [data-text-color="yellow"] { color: var(--bn-colors-highlights-yellow-text); } + [data-text-color="green"] { color: var(--bn-colors-highlights-green-text); } + [data-text-color="blue"] { color: var(--bn-colors-highlights-blue-text); } + [data-text-color="purple"] { color: var(--bn-colors-highlights-purple-text); } + [data-text-color="pink"] { color: var(--bn-colors-highlights-pink-text); } + [data-background-color="gray"] { background-color: var(--bn-colors-highlights-gray-background); } + [data-background-color="brown"] { background-color: var(--bn-colors-highlights-brown-background); } + [data-background-color="red"] { background-color: var(--bn-colors-highlights-red-background); } + [data-background-color="orange"] { background-color: var(--bn-colors-highlights-orange-background); } + [data-background-color="yellow"] { background-color: var(--bn-colors-highlights-yellow-background); } + [data-background-color="green"] { background-color: var(--bn-colors-highlights-green-background); } + [data-background-color="blue"] { background-color: var(--bn-colors-highlights-blue-background); } + [data-background-color="purple"] { background-color: var(--bn-colors-highlights-purple-background); } + [data-background-color="pink"] { background-color: var(--bn-colors-highlights-pink-background); } diff --git a/packages/react/src/hooks/useBlockNote.ts b/packages/react/src/hooks/useBlockNote.ts index 9b1d61f65..c6f72f00d 100644 --- a/packages/react/src/hooks/useBlockNote.ts +++ b/packages/react/src/hooks/useBlockNote.ts @@ -10,10 +10,8 @@ import { defaultBlockSpecs, defaultInlineContentSpecs, defaultStyleSpecs, - getBlockSchemaFromSpecs, } from "@blocknote/core"; import { DependencyList, useMemo, useRef } from "react"; -import { getDefaultReactSlashMenuItems } from "../slashMenuItems/defaultReactSlashMenuItems"; const initEditor = < BSpecs extends BlockSpecs, @@ -21,15 +19,7 @@ const initEditor = < SSpecs extends StyleSpecs >( options: Partial> -) => - BlockNoteEditor.create({ - slashMenuItems: (query) => - getDefaultReactSlashMenuItems( - query, - getBlockSchemaFromSpecs(options.blockSpecs || defaultBlockSpecs) - ), - ...options, - }); +) => BlockNoteEditor.create(options); /** * Main hook for importing a BlockNote editor into a React project diff --git a/packages/react/src/hooks/useSuggestionMenu.ts b/packages/react/src/hooks/useSuggestionMenu.ts new file mode 100644 index 000000000..23eb0bd9c --- /dev/null +++ b/packages/react/src/hooks/useSuggestionMenu.ts @@ -0,0 +1,87 @@ +import { + BlockNoteEditor, + BlockSchema, + DefaultBlockSchema, + DefaultInlineContentSchema, + DefaultStyleSchema, + InlineContentSchema, + StyleSchema, +} from "@blocknote/core"; +import { + flip, + offset, + size, + useFloating, + useTransitionStyles, +} from "@floating-ui/react"; +import { useEffect, useRef, useState } from "react"; + +// TODO: maybe separate the positioning part (floating ui) +export function useSuggestionMenu< + BSchema extends BlockSchema = DefaultBlockSchema, + I extends InlineContentSchema = DefaultInlineContentSchema, + S extends StyleSchema = DefaultStyleSchema +>(editor: BlockNoteEditor, triggerCharacter: string) { + const [show, setShow] = useState(false); + const [query, setQuery] = useState(""); + + const referencePos = useRef(); + + const { refs, update, context, floatingStyles } = useFloating({ + open: show, + placement: "bottom-start", + middleware: [ + offset(10), + // Flips the menu placement to maximize the space available, and prevents + // the menu from being cut off by the confines of the screen. + flip(), + size({ + apply({ availableHeight, elements }) { + Object.assign(elements.floating.style, { + maxHeight: `${availableHeight - 10}px`, + }); + }, + }), + ], + }); + + const { isMounted, styles } = useTransitionStyles(context); + + useEffect(() => { + return editor.suggestionMenus.onUpdate( + triggerCharacter, + (suggestionsMenuState) => { + setShow(suggestionsMenuState.show); + setQuery(suggestionsMenuState.query); + + referencePos.current = suggestionsMenuState.referencePos; + + update(); + } + ); + }, [editor.suggestionMenus, triggerCharacter, show, update]); + + useEffect(() => { + refs.setReference({ + getBoundingClientRect: () => referencePos.current!, + }); + }, [refs]); + + return { + isMounted: isMounted, + suggestionMenuProps: { + query, + closeMenu: editor.suggestionMenus.closeMenu, + clearQuery: editor.suggestionMenus.clearQuery, + }, + positionerProps: { + ref: refs.setFloating, + styles: { + display: "flex", + ...styles, + ...floatingStyles, + zIndex: 2000, + }, + }, + }; +} diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index c09a2880f..d0e698c13 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,4 +1,5 @@ // TODO: review directories +export * from "./editor/BlockNoteDefaultUI"; export * from "./editor/BlockNoteTheme"; export * from "./editor/BlockNoteView"; export * from "./editor/defaultThemes"; @@ -29,11 +30,13 @@ export * from "./components/SideMenu/DragHandleMenu/DefaultDragHandleMenu"; export * from "./components/SideMenu/DragHandleMenu/DragHandleMenu"; export * from "./components/SideMenu/DragHandleMenu/DragHandleMenuItem"; -export * from "./slashMenuItems/ReactSlashMenuItem"; -export * from "./components/SlashMenu/DefaultSlashMenu"; -export * from "./components/SlashMenu/SlashMenuItem"; -export * from "./components/SlashMenu/SlashMenuPositioner"; -export * from "./slashMenuItems/defaultReactSlashMenuItems"; +export * from "./components/SuggestionMenu/MantineSuggestionMenu"; +export * from "./components/SuggestionMenu/MantineSuggestionMenuItem"; +export * from "./components/SuggestionMenu/DefaultSuggestionMenu"; +export * from "./components/SuggestionMenu/defaultGetItems"; +export * from "./components/SuggestionMenu/hooks/useCloseSuggestionMenuNoItems"; +export * from "./components/SuggestionMenu/hooks/useLoadSuggestionMenuItems"; +export * from "./components/SuggestionMenu/hooks/useSuggestionMenuKeyboardNavigation"; export * from "./components/ImageToolbar/DefaultImageToolbar"; export * from "./components/ImageToolbar/ImageToolbarPositioner"; @@ -41,7 +44,6 @@ export * from "./components/ImageToolbar/ImageToolbarPositioner"; export * from "./components/TableHandles/DefaultTableHandle"; export * from "./components/TableHandles/TableHandlePositioner"; -export * from "./components-shared/SuggestionMenu/SuggestionMenuPositioner"; export * from "./components-shared/Toolbar/Toolbar"; export * from "./components-shared/Toolbar/ToolbarButton"; export * from "./components-shared/Toolbar/ToolbarDropdown"; @@ -53,6 +55,7 @@ export * from "./hooks/useEditorContentChange"; export * from "./hooks/useEditorForceUpdate"; export * from "./hooks/useEditorSelectionChange"; export * from "./hooks/useSelectedBlocks"; +export * from "./hooks/useSuggestionMenu"; export * from "./schema/ReactBlockSpec"; export * from "./schema/ReactInlineContentSpec"; diff --git a/packages/react/src/slashMenuItems/ReactSlashMenuItem.ts b/packages/react/src/slashMenuItems/ReactSlashMenuItem.ts deleted file mode 100644 index 59830fced..000000000 --- a/packages/react/src/slashMenuItems/ReactSlashMenuItem.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { - BlockSchema, - DefaultBlockSchema, - DefaultInlineContentSchema, - DefaultStyleSchema, - InlineContentSchema, - StyleSchema, - SuggestionItem, -} from "@blocknote/core"; - -export type ReactSlashMenuItem< - BSchema extends BlockSchema = DefaultBlockSchema, - I extends InlineContentSchema = DefaultInlineContentSchema, - S extends StyleSchema = DefaultStyleSchema -> = SuggestionItem & { - group: string; - icon: JSX.Element; - hint?: string; - shortcut?: string; -}; diff --git a/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx b/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx index e531c2c85..e69de29bb 100644 --- a/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx +++ b/packages/react/src/slashMenuItems/defaultReactSlashMenuItems.tsx @@ -1,95 +0,0 @@ -import { - BlockSchema, - defaultBlockSchema, - DefaultBlockSchema, - getDefaultSlashMenuItems, - InlineContentSchema, - StyleSchema, - SuggestionItem, -} from "@blocknote/core"; -import { - RiH1, - RiH2, - RiH3, - RiImage2Fill, - RiListOrdered, - RiListUnordered, - RiTable2, - RiText, -} from "react-icons/ri"; -import { formatKeyboardShortcut } from "@blocknote/core"; -import { ReactSlashMenuItem } from "./ReactSlashMenuItem"; - -const extraFields: Record< - string, - Omit> -> = { - Heading: { - group: "Headings", - icon: , - hint: "Used for a top-level heading", - shortcut: formatKeyboardShortcut("Mod-Alt-1"), - }, - "Heading 2": { - group: "Headings", - icon: , - hint: "Used for key sections", - shortcut: formatKeyboardShortcut("Mod-Alt-2"), - }, - "Heading 3": { - group: "Headings", - icon: , - hint: "Used for subsections and group headings", - shortcut: formatKeyboardShortcut("Mod-Alt-3"), - }, - "Numbered List": { - group: "Basic blocks", - icon: , - hint: "Used to display a numbered list", - shortcut: formatKeyboardShortcut("Mod-Alt-7"), - }, - "Bullet List": { - group: "Basic blocks", - icon: , - hint: "Used to display an unordered list", - shortcut: formatKeyboardShortcut("Mod-Alt-9"), - }, - Paragraph: { - group: "Basic blocks", - icon: , - hint: "Used for the body of your document", - shortcut: formatKeyboardShortcut("Mod-Alt-0"), - }, - Table: { - group: "Advanced", - icon: , - hint: "Used for for tables", - // shortcut: formatKeyboardShortcut("Mod-Alt-0"), - }, - Image: { - group: "Media", - icon: , - hint: "Insert an image", - }, -}; - -export async function getDefaultReactSlashMenuItems< - BSchema extends BlockSchema, - I extends InlineContentSchema, - S extends StyleSchema ->( - query: string, - // This type casting is weird, but it's the best way of doing it, as it allows - // the schema type to be automatically inferred if it is defined, or be - // inferred as any if it is not defined. I don't think it's possible to make it - // infer to DefaultBlockSchema if it is not defined. - schema: BSchema = defaultBlockSchema as any as BSchema -): Promise[]> { - const slashMenuItems: SuggestionItem[] = - await getDefaultSlashMenuItems(query, schema); - - return slashMenuItems.map((item) => ({ - ...item, - ...extraFields[item.name], - })); -} diff --git a/packages/website/docs/.vitepress/config.ts b/packages/website/docs/.vitepress/config.ts index e1cd8404f..ae7e1f5a5 100644 --- a/packages/website/docs/.vitepress/config.ts +++ b/packages/website/docs/.vitepress/config.ts @@ -137,6 +137,10 @@ const EXAMPLES_SIDEBAR = [ text: "Changing Font", link: "/examples/changing-font", }, + { + text: "Formatting Toolbar Buttons", + link: "/examples/formatting-toolbar-buttons", + }, ], }, { diff --git a/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.module.css b/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.module.css index 839b9c96c..9e8b05648 100644 --- a/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.module.css +++ b/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.module.css @@ -2,3 +2,24 @@ background: transparent !important; height: 500px; } + +/* From Vitepress base styles, to overwrite Mantine globals */ +body { + margin: 0; + width: 100%; + min-width: 320px; + min-height: 100vh; + line-height: 24px; + font-family: var(--vp-font-family-base); + font-size: 16px; + font-weight: 400; + color: var(--vp-c-text-1); + background-color: var(--vp-c-bg); + direction: ltr; + font-synthesis: style; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + diff --git a/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.tsx b/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.tsx index 364133eb7..aa3cc7ab0 100644 --- a/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.tsx +++ b/packages/website/docs/.vitepress/theme/components/Examples/BlockNote/ReactBlockNote.tsx @@ -1,6 +1,6 @@ import { uploadToTmpFilesDotOrg_DEV_ONLY } from "@blocknote/core"; -import "@blocknote/core/style.css"; import { BlockNoteView, useBlockNote } from "@blocknote/react"; +import "@blocknote/react/style.css"; import { useEffect, useMemo } from "react"; import YPartyKitProvider from "y-partykit/provider"; import * as Y from "yjs"; diff --git a/packages/website/docs/demoUtils.ts b/packages/website/docs/demoUtils.ts index 63e67e066..b0b39153d 100644 --- a/packages/website/docs/demoUtils.ts +++ b/packages/website/docs/demoUtils.ts @@ -14,5 +14,5 @@ export const getStyles = (isDark: Ref): string => `body { -webkit-tap-highlight-color: transparent; -webkit-touch-callout: none; - background-color: ${isDark ? "#151515" : "white"}; + background-color: ${isDark ? "#151515" : "white"} !important; }`; diff --git a/packages/website/docs/docs/cursor-selections.md b/packages/website/docs/docs/cursor-selections.md index 80c9037c8..4579505cc 100644 --- a/packages/website/docs/docs/cursor-selections.md +++ b/packages/website/docs/docs/cursor-selections.md @@ -25,7 +25,7 @@ type TextCursorPosition = { block: Block; prevBlock: Block | undefined; nextBlock: Block | undefined; -} +}; ``` `block:` The block currently containing the text cursor. If the cursor is in a nested block, this is the block at the deepest possible nesting level. @@ -61,7 +61,7 @@ You can set the text cursor position to the start or end of an existing block us class BlockNoteEditor { ... public setTextCursorPosition( - targetBlock: BlockIdentifier, + targetBlock: BlockIdentifier, placement: "start" | "end" = "start" ): void; ... @@ -94,7 +94,7 @@ export default function App() { // Listens for when the text cursor position changes. onTextCursorPositionChange: (editor) => { // Gets the block currently hovered by the text cursor. - const hoveredBlock: Block = editor.getTextCursorPosition().block; + const hoveredBlock = editor.getTextCursorPosition().block; // Traverses all blocks. editor.forEachBlock((block) => { @@ -102,7 +102,7 @@ export default function App() { block.id === hoveredBlock.id && block.props.backgroundColor !== "blue" ) { - // If the block is currently hovered by the text cursor, makes its + // If the block is currently hovered by the text cursor, makes its // background blue if it isn't already. editor.updateBlock(block, { props: {backgroundColor: "blue"}, @@ -111,18 +111,18 @@ export default function App() { block.id !== hoveredBlock.id && block.props.backgroundColor === "blue" ) { - // If the block is not currently hovered by the text cursor, resets + // If the block is not currently hovered by the text cursor, resets // its background if it's blue. editor.updateBlock(block, { props: {backgroundColor: "default"}, }); } - + return true; }); } }) - + // Renders the editor instance. return ; } @@ -141,7 +141,7 @@ When you highlight content using the mouse or keyboard, this is called a selecti ```typescript type Selection = { blocks: Block[]; -} +}; ``` `blocks:` The blocks currently spanned by the selection, including nested blocks. @@ -232,4 +232,4 @@ export default function App() { {{ getStyles(isDark) }} ``` -::: \ No newline at end of file +::: diff --git a/packages/website/docs/docs/real-time-collaboration.md b/packages/website/docs/docs/real-time-collaboration.md index b3d6661b7..7ea30e00b 100644 --- a/packages/website/docs/docs/real-time-collaboration.md +++ b/packages/website/docs/docs/real-time-collaboration.md @@ -44,6 +44,7 @@ const editor = useBlockNote({ When a user edits the document, an incremental change (or "update") is captured and can be shared between users of your app. You can share these updates by setting up a _Yjs Provider_. In the snipped above, we use [y-webrtc](https://github.com/yjs/y-webrtc) which shares updates over WebRTC (and BroadcastChannel), but you might be interested in different providers for production-ready use cases. +- [Liveblocks](https://liveblocks.io/yjs) A fully hosted WebSocket infrastructure and persisted data store for Yjs documents. Includes webhooks, REST API, and browser DevTools, all for Yjs - [PartyKit](https://www.partykit.io/) A serverless provider that runs on Cloudflare - [Hocuspocus](https://www.hocuspocus.dev/) open source and extensible Node.js server with pluggable storage (scales with Redis) - [y-websocket](https://github.com/yjs/y-websocket) provider that you can connect to your own websocket server @@ -52,6 +53,18 @@ When a user edits the document, an incremental change (or "update") is captured - [Matrix-CRDT](https://github.com/yousefED/matrix-crdt) syncs updates over Matrix (experimental) - [Nostr-CRDT](https://github.com/yousefED/nostr-crdt) syncs updates over Nostr (experimental) +## Liveblocks + +Liveblocks provides a hosted back-end for Yjs which allows you to download and set up a real-time multiplayer BlockNote example with one command. + +```shell +npx create-liveblocks-app@latest --example nextjs-yjs-blocknote-advanced +``` + +