diff --git a/README.md b/README.md index cf9c610..a5ffbeb 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,31 @@ -<a href="https://shadcn-minimal-tiptap.vercel.app" target="_blank"> - <img src="https://i.postimg.cc/7P03FZkh/Screenshot-2024-08-11-at-22-15-02.png" border="0" alt="Minimal Tiptap Editor" /> -</a> + -# Minimal Tiptap Editor +## Overview -This is a Minimal Tiptap Editor Component built for [Shadcn](https://ui.shadcn.com). It provides a simple and clean editor for users to write and format text. +The Minimal Tiptap Editor is a lightweight, customizable rich text editor component built for [Shadcn](https://ui.shadcn.com). It provides an intuitive interface for text formatting and editing. -<!-- > **Note:** If you are worry about future updates. You dont have to. This project will not be receiving any more updates after the last release, v1.0.1. Over the past week, the component got several updates and bug fixes as I've been using it in production. As of now, there are no remaining bugs or features to address, so I've decided to release it. If you encounter any issues or have feature requests, feel free to open an issue. --> +## Table of Contents + +1. [Installation](#installation) +2. [Dependencies](#dependencies) +3. [Usage](#usage) +4. [Props](#props) +5. [Toolbar Customization](#toolbar-customization) +6. [Key Behaviors](#key-behaviors) +7. [Other Projects](#other-projects) +8. [License](#license) ## Installation -Before you can use the Minimal Tiptap Editor Component, you need to install the following packages: +Install the required packages: ```bash npm install @tiptap/core @tiptap/extension-heading @tiptap/extension-horizontal-rule @tiptap/extension-image @tiptap/extension-link @tiptap/pm @tiptap/react @tiptap/starter-kit @tiptap/extension-placeholder @tiptap/extension-task-item @tiptap/extension-task-list @tiptap/extension-typography @tiptap/extension-code-block-lowlight @tiptap/extension-color @tiptap/extension-text-style lowlight ``` -The Minimal Tiptap Editor Component depends on the following components from Shadcn: +## Dependencies + +This component relies on the following Shadcn components: - [Button](https://ui.shadcn.com/docs/components/button) - [Dropdown Menu](https://ui.shadcn.com/docs/components/dropdown-menu) @@ -30,22 +39,13 @@ The Minimal Tiptap Editor Component depends on the following components from Sha - [Dialog](https://ui.shadcn.com/docs/components/dialog) - [Toggle Group](https://ui.shadcn.com/docs/components/toggle-group) -Next, copy the `minimal-tiptap` directory and paste into your project. The code is yours to use and modify. - -## Props - -The Minimal Tiptap Editor Component accepts all the props from the Tiptap Editor Component. The following are additional props: - -- `value` is the initial value of the editor. -- `onChange` is a function that receives the value of the editor. -- `editorContentClassName` is a string to add a class to the `EditorContent` component. -- `output` is the format of the output value. It can be `'html'`, `'json'`, or `'text'`. Default is `'html'`. -- `placeholder` is a string to display as a placeholder in the editor. -- `editorClassName` is a string to add a class to the `useEditor` hooks. which is the editor itself. -- `throttleDelay` is a number to delay the throttle of the editor. Default is `1000`. +Ensure these components are installed in your Shadcn project. ## Usage +1. Copy the `minimal-tiptap` directory into your project. +2. Import and use the component in your React application: + ```tsx import { useState } from 'react' import { MinimalTiptapEditor } from './minimal-tiptap' @@ -66,13 +66,102 @@ export const App = () => { immediatelyRender={true} editable={true} injectCSS={true} - shouldRerenderOnTransaction={false} editorClassName="focus:outline-none" /> ) } ``` +## Props + +| Prop | Type | Default | Description | +| ------------------------ | -------------------------- | ------- | ------------------------------------------- | +| `value` | string | - | Initial editor content | +| `onChange` | function | - | Callback function for content changes | +| `editorContentClassName` | string | - | CSS class for the EditorContent component | +| `output` | 'html' \| 'json' \| 'text' | 'html' | Output format of the editor content | +| `placeholder` | string | - | Placeholder text for the editor | +| `editorClassName` | string | - | CSS class for the editor instance | +| `throttleDelay` | number | 1000 | Delay for throttling editor updates (in ms) | + +Plus all props from the Tiptap Editor Component. + +## Toolbar Customization + +The Toolbar component offers extensive customization options, allowing you to control which editing options are available, their order, and how they are displayed. This customization is primarily achieved through the `activeActions` and `mainActionCount` props in various sections. + +### Ordering and Display of Actions + +- **Order of Actions**: The order of items in the `activeActions` array directly determines the order in which they appear in the toolbar. +- **Inclusion of Actions**: Only the items specified in `activeActions` will be shown. +- **Main Actions vs Dropdown**: The `mainActionCount` prop determines how many actions are displayed as primary buttons versus being placed in a dropdown menu. + +### Customizable Sections + +#### SectionOne: Heading Levels + +```typescript +<SectionOne editor={editor} activeLevels={[1, 2, 3, 4, 5, 6]} /> +``` + +Customization Options: + +- `activeLevels`: Array of numbers representing heading levels to include (1-6). +- Example: `[3, 1, 2]` shows options for H3, H1, and H2 in that order. + +#### SectionTwo: Text Formatting + +```typescript +<SectionTwo + editor={editor} + activeActions={['bold', 'italic', 'strikethrough', 'code', 'clearFormatting']} + mainActionCount={2} +/> +``` + +Customization Options: + +- `activeActions`: Array of text formatting options to include. +- `mainActionCount`: Number of actions to display as primary buttons. + +#### SectionFour: List Formatting + +```typescript +<SectionFour editor={editor} activeActions={['orderedList', 'bulletList']} mainActionCount={0} /> +``` + +Customization Options: + +- `activeActions`: Array of list formatting options to include. +- `mainActionCount`: Number of actions to display as primary buttons. + +#### SectionFive: Block Formatting + +```typescript +<SectionFive editor={editor} activeActions={['codeBlock', 'blockquote', 'horizontalRule']} mainActionCount={0} /> +``` + +Customization Options: + +- `activeActions`: Array of block formatting options to include. +- `mainActionCount`: Number of actions to display as primary buttons. + +### General Behavior + +- The order in `activeActions` determines the display order in the toolbar. +- Only items in `activeActions` are shown, allowing for both inclusion/exclusion and ordering. +- `mainActionCount` determines button vs dropdown display: + - If 0, all actions are in the dropdown. + - If 1, the first action is a button, the rest are in the dropdown. + - If >= number of `activeActions`, all actions are buttons. + +By adjusting these props, you can create a toolbar tailored to your specific editing needs, showing only the tools you want, in the order you prefer, and with the display style that suits your interface best. + +## Key Behaviors + +- Pressing `Enter` removes active states for 'bold', 'italic', 'strike', 'underline', and 'code'. +- Set `shouldRerenderOnTransaction` to `true` (default) to maintain active states. + ## Other Projects - [React Fancy Switch](https://github.com/Aslam97/react-fancy-switch) @@ -80,4 +169,4 @@ export const App = () => { ## License -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. diff --git a/package.json b/package.json index dcbd3a5..85e6238 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "shadcn-tiptap", + "name": "shadcn-minimal-tiptap", "private": true, "version": "0.0.0", "type": "module", @@ -22,19 +22,19 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@tiptap/core": "^2.5.9", - "@tiptap/extension-code-block-lowlight": "^2.5.9", - "@tiptap/extension-color": "^2.5.9", - "@tiptap/extension-heading": "^2.5.9", - "@tiptap/extension-horizontal-rule": "^2.5.9", - "@tiptap/extension-image": "^2.5.9", - "@tiptap/extension-link": "^2.5.9", - "@tiptap/extension-placeholder": "^2.5.9", - "@tiptap/extension-text-style": "^2.5.9", - "@tiptap/extension-typography": "^2.5.9", - "@tiptap/pm": "^2.5.9", - "@tiptap/react": "^2.5.9", - "@tiptap/starter-kit": "^2.5.9", + "@tiptap/core": "^2.6.4", + "@tiptap/extension-code-block-lowlight": "^2.6.4", + "@tiptap/extension-color": "^2.6.4", + "@tiptap/extension-heading": "^2.6.4", + "@tiptap/extension-horizontal-rule": "^2.6.4", + "@tiptap/extension-image": "^2.6.4", + "@tiptap/extension-link": "^2.6.4", + "@tiptap/extension-placeholder": "^2.6.4", + "@tiptap/extension-text-style": "^2.6.4", + "@tiptap/extension-typography": "^2.6.4", + "@tiptap/pm": "^2.6.4", + "@tiptap/react": "^2.6.4", + "@tiptap/starter-kit": "^2.6.4", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "lowlight": "^3.1.0", @@ -42,13 +42,13 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.52.2", - "tailwind-merge": "^2.5.0", + "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", "zod": "^3.23.8" }, "devDependencies": { "@tailwindcss/typography": "^0.5.14", - "@types/node": "^20.14.15", + "@types/node": "^20.16.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^7.18.0", @@ -61,8 +61,8 @@ "postcss": "^8.4.41", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.6", - "tailwindcss": "^3.4.9", + "tailwindcss": "^3.4.10", "typescript": "^5.5.4", - "vite": "^5.4.0" + "vite": "^5.4.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 910a3d9..5fd2fe5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,44 +45,44 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/core': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/pm@2.5.9) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/pm@2.6.4) '@tiptap/extension-code-block-lowlight': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/extension-code-block@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)(highlight.js@11.9.0)(lowlight@3.1.0) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/extension-code-block@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)(highlight.js@11.9.0)(lowlight@3.1.0) '@tiptap/extension-color': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/extension-text-style@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))) '@tiptap/extension-heading': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) '@tiptap/extension-horizontal-rule': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) '@tiptap/extension-image': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) '@tiptap/extension-link': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) '@tiptap/extension-placeholder': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) '@tiptap/extension-text-style': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) '@tiptap/extension-typography': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) '@tiptap/pm': - specifier: ^2.5.9 - version: 2.5.9 + specifier: ^2.6.4 + version: 2.6.4 '@tiptap/react': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.6.4 + version: 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.5.9 - version: 2.5.9(@tiptap/pm@2.5.9) + specifier: ^2.6.4 + version: 2.6.4 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -105,21 +105,21 @@ importers: specifier: ^7.52.2 version: 7.52.2(react@18.3.1) tailwind-merge: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.5.2 + version: 2.5.2 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.9) + version: 1.0.7(tailwindcss@3.4.10) zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@tailwindcss/typography': specifier: ^0.5.14 - version: 0.5.14(tailwindcss@3.4.9) + version: 0.5.14(tailwindcss@3.4.10) '@types/node': - specifier: ^20.14.15 - version: 20.14.15 + specifier: ^20.16.0 + version: 20.16.0 '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -134,7 +134,7 @@ importers: version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(vite@5.4.0(@types/node@20.14.15)) + version: 3.7.0(vite@5.4.1(@types/node@20.16.0)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.41) @@ -157,14 +157,14 @@ importers: specifier: ^0.6.6 version: 0.6.6(prettier@3.3.3) tailwindcss: - specifier: ^3.4.9 - version: 3.4.9 + specifier: ^3.4.10 + version: 3.4.10 typescript: specifier: ^5.5.4 version: 5.5.4 vite: - specifier: ^5.4.0 - version: 5.4.0(@types/node@20.14.15) + specifier: ^5.4.1 + version: 5.4.1(@types/node@20.16.0) packages: @@ -793,148 +793,148 @@ packages: '@remirror/core-constants@2.0.2': resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} - '@rollup/rollup-android-arm-eabi@4.20.0': - resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + '@rollup/rollup-android-arm-eabi@4.21.0': + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.20.0': - resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + '@rollup/rollup-android-arm64@4.21.0': + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.20.0': - resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + '@rollup/rollup-darwin-arm64@4.21.0': + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.20.0': - resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + '@rollup/rollup-darwin-x64@4.21.0': + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': - resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.20.0': - resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.20.0': - resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + '@rollup/rollup-linux-arm64-gnu@4.21.0': + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.20.0': - resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + '@rollup/rollup-linux-arm64-musl@4.21.0': + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': - resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.20.0': - resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.20.0': - resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + '@rollup/rollup-linux-s390x-gnu@4.21.0': + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.20.0': - resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + '@rollup/rollup-linux-x64-gnu@4.21.0': + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.20.0': - resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + '@rollup/rollup-linux-x64-musl@4.21.0': + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.20.0': - resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + '@rollup/rollup-win32-arm64-msvc@4.21.0': + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.20.0': - resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + '@rollup/rollup-win32-ia32-msvc@4.21.0': + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.20.0': - resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + '@rollup/rollup-win32-x64-msvc@4.21.0': + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} cpu: [x64] os: [win32] - '@swc/core-darwin-arm64@1.7.10': - resolution: {integrity: sha512-TYp4x/9w/C/yMU1olK5hTKq/Hi7BjG71UJ4V1U1WxI1JA3uokjQ/GoktDfmH5V5pX4dgGSOJwUe2RjoN8Z/XnA==} + '@swc/core-darwin-arm64@1.7.11': + resolution: {integrity: sha512-HRQv4qIeMBPThZ6Y/4yYW52rGsS6yrpusvuxLGyoFo45Y0y12/V2yXkOIA/0HIQyrqoUAxn1k4zQXpPaPNCmnw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.10': - resolution: {integrity: sha512-P3LJjAWh5yLc6p5IUwV5LgRfA3R1oDCZDMabYyb2BVQuJTD4MfegW9DhBcUUF5dhBLwq3191KpLVzE+dLTbiXw==} + '@swc/core-darwin-x64@1.7.11': + resolution: {integrity: sha512-vtMQj0F3oYwDu5yhO7SKDRg1XekRSi6/TbzHAbBXv+dBhlGGvcZZynT1H90EVFTv+7w7Sh+lOFvRv5Z4ZTcxow==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.10': - resolution: {integrity: sha512-yGOFjE7w/akRTmqGY3FvWYrqbxO7OB2N2FHj2LO5HtzXflfoABb5RyRvdEquX+17J6mEpu4EwjYNraTD/WHIEQ==} + '@swc/core-linux-arm-gnueabihf@1.7.11': + resolution: {integrity: sha512-mHtzWKxhtyreI4CSxs+3+ENv8t/Qo35WFoYG66qHEgJz/Z2Lh6jv1E+MYgHdYwnpQHgHbdvAco7HsBu/Dt6xXw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.10': - resolution: {integrity: sha512-SPWsgWHfdWKKjLrYlvhxcdBJ7Ruy6crJbPoE9NfD95eJEjMnS2yZTqj2ChFsY737WeyhWYlHzgYhYOVCp83YwQ==} + '@swc/core-linux-arm64-gnu@1.7.11': + resolution: {integrity: sha512-FRwe/x0GfXSQjGP2lIk+NO0pUFS/lI/RorCLBPiK808EVE9JTbh9DKCc/4Bbb4jgScAjNkrFCUVObQYl3YKmpA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.10': - resolution: {integrity: sha512-PUi50bkNqnBL3Z/Zq6jSfwgN9A/taA6u2Zou0tjDJi7oVdpjdr7SxNgCGzMJ/nNg5D/IQn1opM1jktMvpsPAuQ==} + '@swc/core-linux-arm64-musl@1.7.11': + resolution: {integrity: sha512-GY/rs0+GUq14Gbnza90KOrQd/9yHd5qQMii5jcSWcUCT5A8QTa8kiicsM2NxZeTJ69xlKmT7sLod5l99lki/2A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.10': - resolution: {integrity: sha512-Sc+pY55gknCAmBQBR6DhlA7jZSxHaLSDb5Sevzi6DOFMXR79NpA6zWTNKwp1GK2AnRIkbAfvYLgOxS5uWTFVpg==} + '@swc/core-linux-x64-gnu@1.7.11': + resolution: {integrity: sha512-QDkGRwSPmp2RBOlSs503IUXlWYlny8DyznTT0QuK0ML2RpDFlXWU94K/EZhS0RBEUkMY/W51OacM8P8aS/dkCg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.10': - resolution: {integrity: sha512-g5NKx2LXaGd0K26hmEts1Cvb7ptIvq3MHSgr6/D1tRPcDZw1Sp0dYsmyOv0ho4F5GOJyiCooG3oE9FXdb7jIpQ==} + '@swc/core-linux-x64-musl@1.7.11': + resolution: {integrity: sha512-SBEfKrXy6zQ6ksnyxw1FaCftrIH4fLfA81xNnKb7x/6iblv7Ko6H0aK3P5C86jyqF/82+ONl9C7ImGkUFQADig==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.10': - resolution: {integrity: sha512-plRIsOcfy9t9Q/ivm5DA7I0HaIvfAWPbI+bvVRrr3C/1K2CSqnqZJjEWOAmx2LiyipijNnEaFYuLBp0IkGuJpg==} + '@swc/core-win32-arm64-msvc@1.7.11': + resolution: {integrity: sha512-a2Y4xxEsLLYHJN7sMnw9+YQJDi3M1BxEr9hklfopPuGGnYLFNnx5CypH1l9ReijEfWjIAHNi7pq3m023lzW1Hg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.10': - resolution: {integrity: sha512-GntrVNT23viHtbfzmlK8lfBiKeajH24GzbDT7qXhnoO20suUPcyYZxyvCb4gWM2zu8ZBTPHNlqfrNsriQCZ+lQ==} + '@swc/core-win32-ia32-msvc@1.7.11': + resolution: {integrity: sha512-ZbZFMwZO+j8ulhegJ7EhJ/QVZPoQ5qc30ylJQSxizizTJaen71Q7/13lXWc6ksuCKvg6dUKrp/TPgoxOOtSrFA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.10': - resolution: {integrity: sha512-uXIF8GuSappe1imm6Lf7pHGepfCBjDQlS+qTqvEGE0wZAsL1IVATK9P/cH/OCLfJXeQDTLeSYmrpwjtXNt46tQ==} + '@swc/core-win32-x64-msvc@1.7.11': + resolution: {integrity: sha512-IUohZedSJyDu/ReEBG/mqX6uG29uA7zZ9z6dIAF+p6eFxjXmh9MuHryyM+H8ebUyoq/Ad3rL+rUCksnuYNnI0w==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.10': - resolution: {integrity: sha512-l0xrFwBQ9atizhmV94yC2nwcecTk/oftofwMNPiFMGe56dqdmi2ArHaTV3PCtMlgaUH6rGCehoRMt5OrCI1ktg==} + '@swc/core@1.7.11': + resolution: {integrity: sha512-AB+qc45UrJrDfbhPKcUXk+9z/NmFfYYwJT6G7/iur0fCse9kXjx45gi40+u/O2zgarG/30/zV6E3ps8fUvjh7g==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -953,173 +953,173 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - '@tiptap/core@2.5.9': - resolution: {integrity: sha512-PPUR+0tbr+wX2G8RG4FEps4qhbnAPEeXK1FUtirLXSRh8vm+TDgafu3sms7wBc4fAyw9zTO/KNNZ90GBe04guA==} + '@tiptap/core@2.6.4': + resolution: {integrity: sha512-lv+JyBI+5C6C7BMLYg2bloB00HvAZkcvgO3CzmFia28Vtt1P9yhS44elvBemhUf7IP7Hu12FUzDWY+2GQqiqkw==} peerDependencies: - '@tiptap/pm': ^2.5.9 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-blockquote@2.5.9': - resolution: {integrity: sha512-LhGyigmd/v1OjYPeoVK8UvFHbH6ffh175ZuNvseZY4PsBd7kZhrSUiuMG8xYdNX8FxamsxAzr2YpsYnOzu3W7A==} + '@tiptap/extension-blockquote@2.6.4': + resolution: {integrity: sha512-BzeQ52qHL4AEryPqgvPNRJ2siSTfSi2s3k7hVC29QYUTOidLSSDWVihn7lzJoBnqDMAOYj7yUhnEUEdjvOFGqw==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-bold@2.5.9': - resolution: {integrity: sha512-XUJdzFb31t0+bwiRquJf0btBpqOB3axQNHTKM9XADuL4S+Z6OBPj0I5rYINeElw/Q7muvdWrHWHh/ovNJA1/5A==} + '@tiptap/extension-bold@2.6.4': + resolution: {integrity: sha512-DIKUiO2aqO9D3dAQngBacWk/vYwDY13+q3t5dlawRTCIHxgV571vGb+YbcLswbWPQjOziIBc5QgwUVZLjA8OkA==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-bubble-menu@2.5.9': - resolution: {integrity: sha512-NddZ8Qn5dgPPa1W4yk0jdhF4tDBh0FwzBpbnDu2Xz/0TUHrA36ugB2CvR5xS1we4zUKckgpVqOqgdelrmqqFVg==} + '@tiptap/extension-bubble-menu@2.6.4': + resolution: {integrity: sha512-rtqV6d4qfoTBcXdiYYMpFi7cRhraVaLiGOrGCsHX0mNr4imDbwxVsge279X7IzyGhTvn+kprTTQG57s67Te5aA==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-bullet-list@2.5.9': - resolution: {integrity: sha512-hJTv1x4omFgaID4LMRT5tOZb/VKmi8Kc6jsf4JNq4Grxd2sANmr9qpmKtBZvviK+XD5PpTXHvL+1c8C1SQtuHQ==} + '@tiptap/extension-bullet-list@2.6.4': + resolution: {integrity: sha512-SsEqWNvbcLjgPYQXWT+gm8Mdtd6SnM9kr5xdfOvfe9W1RCYi7U7SQjaYGLGQXuy3E8NDugNiG+ss2POMj4RaUQ==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-code-block-lowlight@2.5.9': - resolution: {integrity: sha512-taIXxXQ/Lka9CegHFHQS+nx6cX9i9Ws63ZFMPbrXLMSJRhXk8+m4UAoGZQJH9CGGb5/Rv0p3Z8I59AGiyUHLEw==} + '@tiptap/extension-code-block-lowlight@2.6.4': + resolution: {integrity: sha512-MSgRoVJdztZ4y+1ffBw3xcUp7R1/p8zuNAHalSPjv3Lm+iNI+QeBoPRE1B4sC1K0NujZqb0F/LYjdXVGSSng1A==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/extension-code-block': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/extension-code-block': ^2.6.4 + '@tiptap/pm': ^2.6.4 highlight.js: ^11 lowlight: ^2 || ^3 - '@tiptap/extension-code-block@2.5.9': - resolution: {integrity: sha512-+MUwp0VFFv2aFiZ/qN6q10vfIc6VhLoFFpfuETX10eIRks0Xuj2nGiqCDj7ca0/M44bRg2VvW8+tg/ZEHFNl9g==} + '@tiptap/extension-code-block@2.6.4': + resolution: {integrity: sha512-dnZYiKVNdHfqZqYgoCElLk8ETLlV3Q0rw3IVDKDTwrhanSSooGfkVts/Gn/jtJUIulRdu8lH/0qZCgM4ihznfw==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-code@2.5.9': - resolution: {integrity: sha512-Q1PL3DUXiEe5eYUwOug1haRjSaB0doAKwx7KFVI+kSGbDwCV6BdkKAeYf3us/O2pMP9D0im8RWX4dbSnatgwBA==} + '@tiptap/extension-code@2.6.4': + resolution: {integrity: sha512-qCt/CRhV+s1E9XVCDxGgFwyQRjcLsqBuY5UTwH3Zp8MIBniyLyJDD0Rv9DgvVqalzRC8RoRxVey9Al3YhYNqsw==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-color@2.5.9': - resolution: {integrity: sha512-VUGCT9iqD/Ni9arLIxkCbykAElRMFyew7uk2kbbNvttzdwzmZkbslEgCiaEZQTqKr8w4wjuQL14YOtXc6iwEww==} + '@tiptap/extension-color@2.6.4': + resolution: {integrity: sha512-dXPDK5cf3uTda67CYrkMppTzlgOOtcv7WtzK+ascJYcyGzUG0nhYjfBxEUuWWbAsqNbhtDWgdeoysWLkmTIvTw==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/extension-text-style': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/extension-text-style': ^2.6.4 - '@tiptap/extension-document@2.5.9': - resolution: {integrity: sha512-VdNZYDyCzC3W430UdeRXR9IZzPeODSbi5Xz/JEdV93THVp8AC9CrZR7/qjqdBTgbTB54VP8Yr6bKfCoIAF0BeQ==} + '@tiptap/extension-document@2.6.4': + resolution: {integrity: sha512-fEQzou6J/w7GWiMqxxiwX2TEB6hgjBsImkHCxU05a4IOnIkzC8C9pV+NWa8u1LGvbERmVPBQqWYJG6phDhtYkg==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-dropcursor@2.5.9': - resolution: {integrity: sha512-nEOb37UryG6bsU9JAs/HojE6Jg43LupNTAMISbnuB1CPAeAqNsFMwORd9eEPkyEwnQT7MkhsMOSJM44GoPGIFA==} + '@tiptap/extension-dropcursor@2.6.4': + resolution: {integrity: sha512-maTQi2R63i1S3CCJTjyuHMpk0BvnFuUxq7krZ3LBCOJgUeS78PF/XPirbbR7s2jOVsHK77LYsgdoS3ApDu1zdQ==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-floating-menu@2.5.9': - resolution: {integrity: sha512-MWJIQQT6e5MgqHny8neeH2Dx926nVPF7sv4p84nX4E0dnkRbEYUP8mCsWYhSUvxxIif6e+yY+4654f2Q9qTx1w==} + '@tiptap/extension-floating-menu@2.6.4': + resolution: {integrity: sha512-oF5utOabYQ/a0Mpt3RS21NKtz2Kd8jnwHOw+4nMgis8Crb0eO5gizWqWMyktLU7oVFU/v8CKTqMBJOAmF4a+eA==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-gapcursor@2.5.9': - resolution: {integrity: sha512-yW7V2ebezsa7mWEDWCg4A1ZGsmSV5bEHKse9wzHCDkb7TutSVhLZxGo72U6hNN9PnAksv+FJQk03NuZNYvNyRQ==} + '@tiptap/extension-gapcursor@2.6.4': + resolution: {integrity: sha512-g5fa1RLNpFZoiE5PIvG/pFIz88CvtiWkBUp5OOYrPxNzByazcbBsBI8Sa5ptDVrbDqerayUZYAVFPhXnq7MSlQ==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-hard-break@2.5.9': - resolution: {integrity: sha512-8hQ63SgZRG4BqHOeSfeaowG2eMr2beced018pOGbpHbE3XSYoISkMVuFz4Z8UEVR3W9dTbKo4wxNufSTducocQ==} + '@tiptap/extension-hard-break@2.6.4': + resolution: {integrity: sha512-kBGGSBtp9oQlRBH7PfRvhbrauEphiJEuFUP9n/amAbrrNSabwmvBgyMl6wFXgMdfHF6CSv2YDgndE1sk8SjPSg==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-heading@2.5.9': - resolution: {integrity: sha512-HHowAlGUbFn1qvmY02ydM7qiPPMTGhAJn2A46enDRjNHW5UoqeMfkMpTEYaioOexyguRFSfDT3gpK68IHkQORQ==} + '@tiptap/extension-heading@2.6.4': + resolution: {integrity: sha512-GHwDguzRXRrB5htGPx6T0f0uN9RPAkjbjrl28T7LFXX5Lb2XO+Esr1l4LNsTU49H4wR9nL/89ZjEcd36BUWkog==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-history@2.5.9': - resolution: {integrity: sha512-hGPtJgoZSwnVVqi/xipC2ET/9X2G2UI/Y+M3IYV1ZlM0tCYsv4spNi3uXlZqnXRwYcBXLk5u6e/dmsy5QFbL8g==} + '@tiptap/extension-history@2.6.4': + resolution: {integrity: sha512-Hr3SrvMsyDHKcsF4u3QPdY/NBYG9V0g5pPmZs/tdysXot3NUdkEYowjs9K9o5osKom364KjxQS0c9mOjyeKu1g==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-horizontal-rule@2.5.9': - resolution: {integrity: sha512-/ES5NdxCndBmZAgIXSpCJH8YzENcpxR0S8w34coSWyv+iW0Sq7rW/mksQw8ZIVsj8a7ntpoY5OoRFpSlqcvyGw==} + '@tiptap/extension-horizontal-rule@2.6.4': + resolution: {integrity: sha512-lL29Hxsj1qFwRqtg41JlBOK/hmN+qnwIWvNCyZpKEVHs7d0iELj2REB/7R1KKAAdsvYo7pJrgqwBd1Ph6xRLpw==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-image@2.5.9': - resolution: {integrity: sha512-v4WZISCvbriac6HE6v7kYYY7KX+v9rJaIZC3gbYGtqnBWfaAwZiVVu8Z03xSrqYhoc+KHuI+oQ4VubcvZ/i7OQ==} + '@tiptap/extension-image@2.6.4': + resolution: {integrity: sha512-uc2JA1qnZ6X33di3RTIDfE9oaJeWKyE6aJdWDt5OXPOW60kPKO8PIxy9n11O8v0oVb/+bZ9cnPu9UpSnJVaUCg==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-italic@2.5.9': - resolution: {integrity: sha512-Bw+P139L4cy+B56zpUiRjP8BZSaAUl3JFMnr/FO+FG55QhCxFMXIc6XrC3vslNy5ef3B3zv4gCttS3ee8ByMiw==} + '@tiptap/extension-italic@2.6.4': + resolution: {integrity: sha512-XG/zaKVuorKr1vGEWEgLQTnQwOpNn/JyGxO7oC7wfYx5eYpbbCtMTEMvuqNvkm7kpvVAUx3ugi/D8DWyWZEtYg==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-link@2.5.9': - resolution: {integrity: sha512-7v9yRsX7NuiY8DPslIsPIlFqcD8aGBMLqfEGXltJDvuG6kykdr+khEZeWcJ8ihHIL4yWR3/MAgeT2W72Z/nxiQ==} + '@tiptap/extension-link@2.6.4': + resolution: {integrity: sha512-Uwx9J0lfNZFYYGDDoomTB35CzEx9RDBzoIoKXjLWU+RXxAZzwgx+8W3F6otnyjrm5AcNf67JLzcvCFFN7FtrQQ==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-list-item@2.5.9': - resolution: {integrity: sha512-d9Eo+vBz74SMxP0r25aqiErV256C+lGz+VWMjOoqJa6xWLM1keYy12JtGQWJi8UDVZrDskJKCHq81A0uLt27WA==} + '@tiptap/extension-list-item@2.6.4': + resolution: {integrity: sha512-NLP0nshX8eCZMLospdCsUApUQHPL1+T/MIi/Hhr0aNeaAg7KwBNH8/rFPuxPNs4BQkHOCuYq4Fm+klkebkFYJA==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-ordered-list@2.5.9': - resolution: {integrity: sha512-9MsWpvVvzILuEOd/GdroF7RI7uDuE1M6at9rzsaVGvCPVHZBvu1XR3MSVK5OdiJbbJuPGttlzEFLaN/rQdCGFg==} + '@tiptap/extension-ordered-list@2.6.4': + resolution: {integrity: sha512-ecAEFpRKZc+b3f54EGvaRp7hsVza2i1nRhxHoPElqVR5DiCCSuSgAPCsKhUUT1rKweK9h56HiC4xswAyFrU5Ag==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-paragraph@2.5.9': - resolution: {integrity: sha512-HDXGiHTJ/V85dbDMjcFj4XfqyTQZqry6V21ucMzgBZYX60X3gIn7VpQTQnnRjvULSgtfOASSJP6BELc5TyiK0w==} + '@tiptap/extension-paragraph@2.6.4': + resolution: {integrity: sha512-JVlvhZPzjz0Q+29KmnrmLr3A3SvAMfKOZxbZZVnzee6vtI6rqjdYGBOtyyyWwrAliNQB6GkHiKmT3GxH76dz7A==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-placeholder@2.5.9': - resolution: {integrity: sha512-ytKmlSiebtCBXoMPE2cup48DR0rQiekXhLKLkNyt7m8tSXkaRO4eDaFqCqPEXLeQXWdhwWEoPM6Cejaaa3ztkA==} + '@tiptap/extension-placeholder@2.6.4': + resolution: {integrity: sha512-2F6gmVDtXfXRU6G4aE+vSZYtkwuaJLZE2r4B8/t83ei1z+elnNT2SWD3Dy5K3zDXhBupvqcMFKgjMnIlUXG0QA==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 - '@tiptap/extension-strike@2.5.9': - resolution: {integrity: sha512-QezkOZpczpl09S8lp5JL7sRkwREoPY16Y/lTvBcFKm3TZbVzYZZ/KwS0zpwK9HXTfXr8os4L9AGjQf0tHonX+w==} + '@tiptap/extension-strike@2.6.4': + resolution: {integrity: sha512-EV4hEA5qnRtKViaLKcucFvXP9xEUJOFgpFeOrp2xIgSXJLSmutkaDfz7nxJ2RLzwwYvPfWUL7ay97JSCzSuaIA==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-text-style@2.5.9': - resolution: {integrity: sha512-1pNnl/a5EdY7g3IeFomm0B6eiTvAFOBeJGswoYxogzHmkWbLFhXFdgZ6qz7+k985w4qscsG1GpvtOW3IrJ9J6g==} + '@tiptap/extension-text-style@2.6.4': + resolution: {integrity: sha512-cVxU3PE+jIBfqFp4xBlm0hq9seZl3lQRk+H58YAcY2BXkEZukyAd0OhmkQZHxadM1cQuducrSUkcJJ0Z4jP0PQ==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-text@2.5.9': - resolution: {integrity: sha512-W0pfiQUPsMkwaV5Y/wKW4cFsyXAIkyOFt7uN5u6LrZ/iW9KZ/IsDODPJDikWp0aeQnXzT9NNQULTpCjbHzzS6g==} + '@tiptap/extension-text@2.6.4': + resolution: {integrity: sha512-QfspuCTTpmFrSLbDs2z/0W7GLaoNanwj4OCKPSPz5XcraZJgFLsWAqZxZE4aLgZbJH2hcGWMe5ZHmvLf5dJogw==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/extension-typography@2.5.9': - resolution: {integrity: sha512-S+r4m3J0eK4qOszUcCU7NeOEUMuOwj0pGO4YYbIJs3AjWOyLrXD04grb64u8sCGcM8hiibQ7uZKSLJOmLjuoEA==} + '@tiptap/extension-typography@2.6.4': + resolution: {integrity: sha512-yp7G+aLomomx7XlLRoa22VreLyS8JZyAlMoEPMtp6Cn53qdI/yssbIbahnt7J5xFKx5qIeFDhbcDAX/mWcv2bg==} peerDependencies: - '@tiptap/core': ^2.5.9 + '@tiptap/core': ^2.6.4 - '@tiptap/pm@2.5.9': - resolution: {integrity: sha512-YSUaEQVtvZnGzGjif2Tl2o9utE+6tR2Djhz0EqFUcAUEVhOMk7UYUO+r/aPfcCRraIoKKuDQzyCpjKmJicjCUA==} + '@tiptap/pm@2.6.4': + resolution: {integrity: sha512-k/AyigUioZVxFTcF7kWcUh5xeOV0bdGzHz+wmtP33md2jo8SJP29yEZ4Kshvk0IcFnVFEDrsfKiGhLRWpKx+YQ==} - '@tiptap/react@2.5.9': - resolution: {integrity: sha512-NZYAslIb79oxIOFHx9T9ey5oX0aJ1uRbtT2vvrvvyRaO6fKWgAwMYN92bOu5/f2oUVGUp6l7wkYZGdjz/XP5bA==} + '@tiptap/react@2.6.4': + resolution: {integrity: sha512-6P0CAMakY/zBDq7HrGvM2Ku4kcoEvbZI0uEAfG36fl4wQ3JEnKT25H8NtVBmVxcrPIgtHPalHkalV4IMNu8dUw==} peerDependencies: - '@tiptap/core': ^2.5.9 - '@tiptap/pm': ^2.5.9 + '@tiptap/core': ^2.6.4 + '@tiptap/pm': ^2.6.4 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tiptap/starter-kit@2.5.9': - resolution: {integrity: sha512-nZ4V+vRayomjxUsajFMHv1iJ5SiSaEA65LAXze/CzyZXGMXfL2OLzY7wJoaVJ4BgwINuO0dOSAtpNDN6jI+6mQ==} + '@tiptap/starter-kit@2.6.4': + resolution: {integrity: sha512-uvGXOI6h+AjyyOgJOmBSFrDR7xJ841+gtwzGbAolVM2a7LCEkocyHjLBWFYVfQu2vvMIqA63+0+yAsw6ghwUgw==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1127,8 +1127,8 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/node@20.14.15': - resolution: {integrity: sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==} + '@types/node@20.16.0': + resolution: {integrity: sha512-vDxceJcoZhIVh67S568bm1UGZO0DX0hpplJZxzeXMKwIPLn190ec5RRxQ69BKhX44SUGIxxgMdDY557lGLKprQ==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1139,8 +1139,8 @@ packages: '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} @@ -1388,8 +1388,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.6: - resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==} + electron-to-chromium@1.5.11: + resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1554,8 +1554,8 @@ packages: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1839,8 +1839,8 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss-selector-parser@6.1.1: - resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -1966,11 +1966,11 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.9.0: - resolution: {integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==} + prosemirror-transform@1.10.0: + resolution: {integrity: sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==} - prosemirror-view@1.33.9: - resolution: {integrity: sha512-xV1A0Vz9cIcEnwmMhKKFAOkfIp8XmJRnaZoPqNXrPS7EK5n11Ov8V76KhR0RsfQd/SIzmWY+bg+M44A2Lx/Nnw==} + prosemirror-view@1.33.10: + resolution: {integrity: sha512-wsKg9JeQkWlkXG8DDcloI/tbB9r3CysziubigoC8wTuE6zobN/9cl8bGRk1J1XjkUp7rxGBziOSxrhoILL84hg==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -2052,8 +2052,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.20.0: - resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2124,16 +2124,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tailwind-merge@2.5.0: - resolution: {integrity: sha512-a6Q/isR5XAo9IR7Hjh80BQDkn8PG9ONJpSO/U3vGzdKyKG125lPHNXdiPfeQ5X0EOG0qKlS/0qnxdBYkLlD6tA==} + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.9: - resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==} + tailwindcss@3.4.10: + resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} engines: {node: '>=14.0.0'} hasBin: true @@ -2182,8 +2182,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.6: + resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} update-browserslist-db@1.1.0: resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} @@ -2222,8 +2222,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vite@5.4.0: - resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==} + vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2374,7 +2374,7 @@ snapshots: debug: 4.3.6 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2837,99 +2837,99 @@ snapshots: '@remirror/core-constants@2.0.2': {} - '@rollup/rollup-android-arm-eabi@4.20.0': + '@rollup/rollup-android-arm-eabi@4.21.0': optional: true - '@rollup/rollup-android-arm64@4.20.0': + '@rollup/rollup-android-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-arm64@4.20.0': + '@rollup/rollup-darwin-arm64@4.21.0': optional: true - '@rollup/rollup-darwin-x64@4.20.0': + '@rollup/rollup-darwin-x64@4.21.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.20.0': + '@rollup/rollup-linux-arm-musleabihf@4.21.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.20.0': + '@rollup/rollup-linux-arm64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.20.0': + '@rollup/rollup-linux-arm64-musl@4.21.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.20.0': + '@rollup/rollup-linux-riscv64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.20.0': + '@rollup/rollup-linux-s390x-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.20.0': + '@rollup/rollup-linux-x64-gnu@4.21.0': optional: true - '@rollup/rollup-linux-x64-musl@4.20.0': + '@rollup/rollup-linux-x64-musl@4.21.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.20.0': + '@rollup/rollup-win32-arm64-msvc@4.21.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.20.0': + '@rollup/rollup-win32-ia32-msvc@4.21.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.20.0': + '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true - '@swc/core-darwin-arm64@1.7.10': + '@swc/core-darwin-arm64@1.7.11': optional: true - '@swc/core-darwin-x64@1.7.10': + '@swc/core-darwin-x64@1.7.11': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.10': + '@swc/core-linux-arm-gnueabihf@1.7.11': optional: true - '@swc/core-linux-arm64-gnu@1.7.10': + '@swc/core-linux-arm64-gnu@1.7.11': optional: true - '@swc/core-linux-arm64-musl@1.7.10': + '@swc/core-linux-arm64-musl@1.7.11': optional: true - '@swc/core-linux-x64-gnu@1.7.10': + '@swc/core-linux-x64-gnu@1.7.11': optional: true - '@swc/core-linux-x64-musl@1.7.10': + '@swc/core-linux-x64-musl@1.7.11': optional: true - '@swc/core-win32-arm64-msvc@1.7.10': + '@swc/core-win32-arm64-msvc@1.7.11': optional: true - '@swc/core-win32-ia32-msvc@1.7.10': + '@swc/core-win32-ia32-msvc@1.7.11': optional: true - '@swc/core-win32-x64-msvc@1.7.10': + '@swc/core-win32-x64-msvc@1.7.11': optional: true - '@swc/core@1.7.10': + '@swc/core@1.7.11': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.10 - '@swc/core-darwin-x64': 1.7.10 - '@swc/core-linux-arm-gnueabihf': 1.7.10 - '@swc/core-linux-arm64-gnu': 1.7.10 - '@swc/core-linux-arm64-musl': 1.7.10 - '@swc/core-linux-x64-gnu': 1.7.10 - '@swc/core-linux-x64-musl': 1.7.10 - '@swc/core-win32-arm64-msvc': 1.7.10 - '@swc/core-win32-ia32-msvc': 1.7.10 - '@swc/core-win32-x64-msvc': 1.7.10 + '@swc/core-darwin-arm64': 1.7.11 + '@swc/core-darwin-x64': 1.7.11 + '@swc/core-linux-arm-gnueabihf': 1.7.11 + '@swc/core-linux-arm64-gnu': 1.7.11 + '@swc/core-linux-arm64-musl': 1.7.11 + '@swc/core-linux-x64-gnu': 1.7.11 + '@swc/core-linux-x64-musl': 1.7.11 + '@swc/core-win32-arm64-msvc': 1.7.11 + '@swc/core-win32-ia32-msvc': 1.7.11 + '@swc/core-win32-x64-msvc': 1.7.11 '@swc/counter@0.1.3': {} @@ -2937,144 +2937,144 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/typography@0.5.14(tailwindcss@3.4.9)': + '@tailwindcss/typography@0.5.14(tailwindcss@3.4.10)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.9 + tailwindcss: 3.4.10 - '@tiptap/core@2.5.9(@tiptap/pm@2.5.9)': + '@tiptap/core@2.6.4(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/pm': 2.5.9 + '@tiptap/pm': 2.6.4 - '@tiptap/extension-blockquote@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-blockquote@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-bold@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-bold@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-bubble-menu@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-bubble-menu@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-bullet-list@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-code-block-lowlight@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/extension-code-block@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)(highlight.js@11.9.0)(lowlight@3.1.0)': + '@tiptap/extension-code-block-lowlight@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/extension-code-block@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)(highlight.js@11.9.0)(lowlight@3.1.0)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/extension-code-block': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/extension-code-block': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 highlight.js: 11.9.0 lowlight: 3.1.0 - '@tiptap/extension-code-block@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-code-block@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-code@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-code@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-color@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)))': + '@tiptap/extension-color@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/extension-text-style@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/extension-text-style': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/extension-text-style': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) - '@tiptap/extension-document@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-document@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-dropcursor@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-dropcursor@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-floating-menu@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-floating-menu@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-gapcursor@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-hard-break@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-hard-break@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-heading@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-heading@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-history@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-history@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-horizontal-rule@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-horizontal-rule@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-image@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-image@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-italic@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-italic@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-link@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-link@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 linkifyjs: 4.1.3 - '@tiptap/extension-list-item@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-list-item@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-ordered-list@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-ordered-list@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-paragraph@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-paragraph@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-placeholder@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)': + '@tiptap/extension-placeholder@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 - '@tiptap/extension-strike@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-strike@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-text-style@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-text@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-text@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/extension-typography@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))': + '@tiptap/extension-typography@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) - '@tiptap/pm@2.5.9': + '@tiptap/pm@2.6.4': dependencies: prosemirror-changeset: 2.2.1 prosemirror-collab: 1.3.1 @@ -3091,54 +3091,53 @@ snapshots: prosemirror-schema-list: 1.4.1 prosemirror-state: 1.4.3 prosemirror-tables: 1.4.0 - prosemirror-trailing-node: 2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.9) - prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.9 + prosemirror-trailing-node: 2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.10) + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.10 - '@tiptap/react@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/extension-bubble-menu': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-floating-menu': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/pm': 2.5.9 + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/extension-bubble-menu': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-floating-menu': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/pm': 2.6.4 '@types/use-sync-external-store': 0.0.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tiptap/starter-kit@2.5.9(@tiptap/pm@2.5.9)': - dependencies: - '@tiptap/core': 2.5.9(@tiptap/pm@2.5.9) - '@tiptap/extension-blockquote': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-bold': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-bullet-list': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-code': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-code-block': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-document': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-dropcursor': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-gapcursor': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-hard-break': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-heading': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-history': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-horizontal-rule': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9))(@tiptap/pm@2.5.9) - '@tiptap/extension-italic': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-list-item': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-ordered-list': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-paragraph': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-strike': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - '@tiptap/extension-text': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.5.9)) - transitivePeerDependencies: - - '@tiptap/pm' + '@tiptap/starter-kit@2.6.4': + dependencies: + '@tiptap/core': 2.6.4(@tiptap/pm@2.6.4) + '@tiptap/extension-blockquote': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-bold': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-bullet-list': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-code': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-code-block': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-document': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-dropcursor': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-gapcursor': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-hard-break': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-heading': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-history': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-horizontal-rule': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4))(@tiptap/pm@2.6.4) + '@tiptap/extension-italic': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-list-item': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-ordered-list': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-paragraph': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-strike': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/extension-text': 2.6.4(@tiptap/core@2.6.4(@tiptap/pm@2.6.4)) + '@tiptap/pm': 2.6.4 '@types/estree@1.0.5': {} '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 - '@types/node@20.14.15': + '@types/node@20.16.0': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.6 '@types/prop-types@15.7.12': {} @@ -3151,7 +3150,7 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/use-sync-external-store@0.0.6': {} @@ -3165,7 +3164,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -3238,10 +3237,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.4.0(@types/node@20.14.15))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.1(@types/node@20.16.0))': dependencies: - '@swc/core': 1.7.10 - vite: 5.4.0(@types/node@20.14.15) + '@swc/core': 1.7.11 + vite: 5.4.1(@types/node@20.16.0) transitivePeerDependencies: - '@swc/helpers' @@ -3315,7 +3314,7 @@ snapshots: browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.6 + electron-to-chromium: 1.5.11 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -3400,7 +3399,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.6: {} + electron-to-chromium@1.5.11: {} emoji-regex@8.0.0: {} @@ -3480,7 +3479,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -3604,7 +3603,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -3618,7 +3617,7 @@ snapshots: highlight.js@11.9.0: {} - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -3852,14 +3851,14 @@ snapshots: postcss-nested@6.2.0(postcss@8.4.41): dependencies: postcss: 8.4.41 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@6.1.1: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -3882,7 +3881,7 @@ snapshots: prosemirror-changeset@2.2.1: dependencies: - prosemirror-transform: 1.9.0 + prosemirror-transform: 1.10.0 prosemirror-collab@1.3.1: dependencies: @@ -3892,32 +3891,32 @@ snapshots: dependencies: prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 + prosemirror-transform: 1.10.0 prosemirror-dropcursor@1.8.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.9 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.10 prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.2 prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.9 + prosemirror-view: 1.33.10 prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.9 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.10 rope-sequence: 1.3.4 prosemirror-inputrules@1.4.0: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 + prosemirror-transform: 1.10.0 prosemirror-keymap@1.2.2: dependencies: @@ -3948,39 +3947,39 @@ snapshots: dependencies: prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 + prosemirror-transform: 1.10.0 prosemirror-state@1.4.3: dependencies: prosemirror-model: 1.22.3 - prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.9 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.10 prosemirror-tables@1.4.0: dependencies: prosemirror-keymap: 1.2.2 prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.9 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.10 - prosemirror-trailing-node@2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.9): + prosemirror-trailing-node@2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.10): dependencies: '@remirror/core-constants': 2.0.2 escape-string-regexp: 4.0.0 prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.9 + prosemirror-view: 1.33.10 - prosemirror-transform@1.9.0: + prosemirror-transform@1.10.0: dependencies: prosemirror-model: 1.22.3 - prosemirror-view@1.33.9: + prosemirror-view@1.33.10: dependencies: prosemirror-model: 1.22.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.9.0 + prosemirror-transform: 1.10.0 punycode.js@2.3.1: {} @@ -4052,26 +4051,26 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.20.0: + rollup@4.21.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.20.0 - '@rollup/rollup-android-arm64': 4.20.0 - '@rollup/rollup-darwin-arm64': 4.20.0 - '@rollup/rollup-darwin-x64': 4.20.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 - '@rollup/rollup-linux-arm-musleabihf': 4.20.0 - '@rollup/rollup-linux-arm64-gnu': 4.20.0 - '@rollup/rollup-linux-arm64-musl': 4.20.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 - '@rollup/rollup-linux-riscv64-gnu': 4.20.0 - '@rollup/rollup-linux-s390x-gnu': 4.20.0 - '@rollup/rollup-linux-x64-gnu': 4.20.0 - '@rollup/rollup-linux-x64-musl': 4.20.0 - '@rollup/rollup-win32-arm64-msvc': 4.20.0 - '@rollup/rollup-win32-ia32-msvc': 4.20.0 - '@rollup/rollup-win32-x64-msvc': 4.20.0 + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -4136,13 +4135,13 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tailwind-merge@2.5.0: {} + tailwind-merge@2.5.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.9): + tailwindcss-animate@1.0.7(tailwindcss@3.4.10): dependencies: - tailwindcss: 3.4.9 + tailwindcss: 3.4.10 - tailwindcss@3.4.9: + tailwindcss@3.4.10: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -4163,7 +4162,7 @@ snapshots: postcss-js: 4.0.1(postcss@8.4.41) postcss-load-config: 4.0.2(postcss@8.4.41) postcss-nested: 6.2.0(postcss@8.4.41) - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -4205,7 +4204,7 @@ snapshots: uc.micro@2.1.0: {} - undici-types@5.26.5: {} + undici-types@6.19.6: {} update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: @@ -4238,13 +4237,13 @@ snapshots: util-deprecate@1.0.2: {} - vite@5.4.0(@types/node@20.14.15): + vite@5.4.1(@types/node@20.16.0): dependencies: esbuild: 0.21.5 postcss: 8.4.41 - rollup: 4.20.0 + rollup: 4.21.0 optionalDependencies: - '@types/node': 20.14.15 + '@types/node': 20.16.0 fsevents: 2.3.3 w3c-keyname@2.2.8: {} diff --git a/src/App.tsx b/src/App.tsx index 345b2d3..d65e0d6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -71,7 +71,6 @@ const ExampleForm = () => { immediatelyRender={true} editable={true} injectCSS={true} - shouldRerenderOnTransaction={false} editorClassName="focus:outline-none p-5" /> </FormControl> diff --git a/src/components/minimal-tiptap/components/bubble-menu/image-bubble-menu.tsx b/src/components/minimal-tiptap/components/bubble-menu/image-bubble-menu.tsx index 58d55ef..cae3243 100644 --- a/src/components/minimal-tiptap/components/bubble-menu/image-bubble-menu.tsx +++ b/src/components/minimal-tiptap/components/bubble-menu/image-bubble-menu.tsx @@ -1,4 +1,4 @@ -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import { BubbleMenu } from '@tiptap/react' import { ImagePopoverBlock } from '../image/image-popover-block' import { ShouldShowProps } from '../../types' diff --git a/src/components/minimal-tiptap/components/bubble-menu/link-bubble-menu.tsx b/src/components/minimal-tiptap/components/bubble-menu/link-bubble-menu.tsx index 01323e2..53aa107 100644 --- a/src/components/minimal-tiptap/components/bubble-menu/link-bubble-menu.tsx +++ b/src/components/minimal-tiptap/components/bubble-menu/link-bubble-menu.tsx @@ -1,5 +1,5 @@ import React, { useState, useCallback } from 'react' -import { Editor } from '@tiptap/core' +import { Editor } from '@tiptap/react' import { BubbleMenu } from '@tiptap/react' import { LinkEditBlock } from '../link/link-edit-block' import { LinkPopoverBlock } from '../link/link-popover-block' diff --git a/src/components/minimal-tiptap/components/image/image-edit-block.tsx b/src/components/minimal-tiptap/components/image/image-edit-block.tsx index 394eb8e..3c78197 100644 --- a/src/components/minimal-tiptap/components/image/image-edit-block.tsx +++ b/src/components/minimal-tiptap/components/image/image-edit-block.tsx @@ -1,4 +1,4 @@ -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import React, { useRef, useState } from 'react' import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' diff --git a/src/components/minimal-tiptap/components/image/image-edit-dialog.tsx b/src/components/minimal-tiptap/components/image/image-edit-dialog.tsx index 6904177..b0e7e63 100644 --- a/src/components/minimal-tiptap/components/image/image-edit-dialog.tsx +++ b/src/components/minimal-tiptap/components/image/image-edit-dialog.tsx @@ -1,4 +1,4 @@ -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import { useState } from 'react' import { ImageIcon } from '@radix-ui/react-icons' import { ToolbarButton } from '../toolbar-button' diff --git a/src/components/minimal-tiptap/components/link/link-edit-popover.tsx b/src/components/minimal-tiptap/components/link/link-edit-popover.tsx index 9046bb3..b225f16 100644 --- a/src/components/minimal-tiptap/components/link/link-edit-popover.tsx +++ b/src/components/minimal-tiptap/components/link/link-edit-popover.tsx @@ -1,4 +1,4 @@ -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import * as React from 'react' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' import { Link2Icon } from '@radix-ui/react-icons' diff --git a/src/components/minimal-tiptap/components/section/five.tsx b/src/components/minimal-tiptap/components/section/five.tsx index be9a0da..fca3f33 100644 --- a/src/components/minimal-tiptap/components/section/five.tsx +++ b/src/components/minimal-tiptap/components/section/five.tsx @@ -1,84 +1,78 @@ import * as React from 'react' -import type { Editor } from '@tiptap/core' -import { cn } from '@/lib/utils' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' +import type { Editor } from '@tiptap/react' import { CaretDownIcon, CodeIcon, DividerHorizontalIcon, PlusIcon, QuoteIcon } from '@radix-ui/react-icons' -import { ToolbarButton } from '../toolbar-button' -import { ShortcutKey } from '../shortcut-key' import { LinkEditPopover } from '../link/link-edit-popover' import { ImageEditDialog } from '../image/image-edit-dialog' +import { FormatAction } from '../../types' +import { ToolbarSection } from '../toolbar-section' -interface InsertElement { - label: string - icon: React.ReactNode - action: (editor: Editor) => void - isActive?: (editor: Editor) => boolean - shortcut?: string[] +type InsertElementAction = 'codeBlock' | 'blockquote' | 'horizontalRule' +interface InsertElement extends FormatAction { + value: InsertElementAction } -const insertElements: InsertElement[] = [ +const formatActions: InsertElement[] = [ { + value: 'codeBlock', label: 'Code block', - icon: <CodeIcon className="mr-2 size-4" />, + icon: <CodeIcon className="size-5" />, action: editor => editor.chain().focus().toggleCodeBlock().run(), isActive: editor => editor.isActive('codeBlock'), - shortcut: ['mod', 'alt', 'C'] + canExecute: editor => editor.can().chain().focus().toggleCodeBlock().run(), + shortcuts: ['mod', 'alt', 'C'] }, { + value: 'blockquote', label: 'Blockquote', - icon: <QuoteIcon className="mr-2 size-4" />, + icon: <QuoteIcon className="size-5" />, action: editor => editor.chain().focus().toggleBlockquote().run(), isActive: editor => editor.isActive('blockquote'), - shortcut: ['mod', 'shift', 'B'] + canExecute: editor => editor.can().chain().focus().toggleBlockquote().run(), + shortcuts: ['mod', 'shift', 'B'] }, { + value: 'horizontalRule', label: 'Divider', - icon: <DividerHorizontalIcon className="mr-2 size-4" />, + icon: <DividerHorizontalIcon className="size-5" />, action: editor => editor.chain().focus().setHorizontalRule().run(), - shortcut: ['mod', 'alt', '-'] + isActive: () => false, + canExecute: editor => editor.can().chain().focus().setHorizontalRule().run(), + shortcuts: ['mod', 'alt', '-'] } ] -export const SectionFive = ({ editor }: { editor: Editor }) => { - const isAnyElementActive = insertElements.some(element => element.isActive?.(editor)) +interface SectionFiveProps { + editor: Editor + activeActions?: InsertElementAction[] + mainActionCount?: number +} +export const SectionFive: React.FC<SectionFiveProps> = ({ + editor, + activeActions = formatActions.map(action => action.value), + mainActionCount = 0 +}) => { return ( <> <LinkEditPopover editor={editor} /> <ImageEditDialog editor={editor} /> - - <DropdownMenu> - <DropdownMenuTrigger asChild> - <ToolbarButton - isActive={isAnyElementActive} - tooltip="Insert elements" - aria-label="Insert elements" - className="w-12" - > + <ToolbarSection + editor={editor} + actions={formatActions} + activeActions={activeActions} + mainActionCount={mainActionCount} + dropdownIcon={ + <> <PlusIcon className="size-5" /> <CaretDownIcon className="size-5" /> - </ToolbarButton> - </DropdownMenuTrigger> - <DropdownMenuContent align="start" className="w-full" onCloseAutoFocus={event => event.preventDefault()}> - {insertElements.map(element => ( - <DropdownMenuItem - key={element.label} - onClick={() => element.action(editor)} - className={cn('flex flex-row items-center justify-between gap-4', { - 'bg-accent': element.isActive?.(editor) - })} - > - <span className="flex grow items-center"> - {element.icon} - {element.label} - </span> - {element.shortcut && <ShortcutKey keys={element.shortcut} />} - </DropdownMenuItem> - ))} - </DropdownMenuContent> - </DropdownMenu> + </> + } + dropdownTooltip="Insert elements" + /> </> ) } +SectionFive.displayName = 'SectionFive' + export default SectionFive diff --git a/src/components/minimal-tiptap/components/section/four.tsx b/src/components/minimal-tiptap/components/section/four.tsx index 7d807bc..679cf00 100644 --- a/src/components/minimal-tiptap/components/section/four.tsx +++ b/src/components/minimal-tiptap/components/section/four.tsx @@ -1,58 +1,63 @@ -import type { Editor } from '@tiptap/core' -import { cn } from '@/lib/utils' +import * as React from 'react' +import type { Editor } from '@tiptap/react' import { CaretDownIcon, ListBulletIcon } from '@radix-ui/react-icons' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' -import { ToolbarButton } from '../toolbar-button' -import { ShortcutKey } from '../shortcut-key' +import { FormatAction } from '../../types' +import { ToolbarSection } from '../toolbar-section' -interface ListItem { - label: string - isActive: (editor: Editor) => boolean - onClick: (editor: Editor) => void - shortcutKeys: string[] +type ListItemAction = 'orderedList' | 'bulletList' +interface ListItem extends FormatAction { + value: ListItemAction } -const listItems: ListItem[] = [ +const formatActions: ListItem[] = [ { + value: 'orderedList', label: 'Numbered list', + icon: <ListBulletIcon className="size-5" />, isActive: editor => editor.isActive('orderedList'), - onClick: editor => editor.chain().focus().toggleOrderedList().run(), - shortcutKeys: ['mod', 'shift', '7'] + action: editor => editor.chain().focus().toggleOrderedList().run(), + canExecute: editor => editor.can().chain().focus().toggleOrderedList().run(), + shortcuts: ['mod', 'shift', '7'] }, { + value: 'bulletList', label: 'Bullet list', + icon: <ListBulletIcon className="size-5" />, isActive: editor => editor.isActive('bulletList'), - onClick: editor => editor.chain().focus().toggleBulletList().run(), - shortcutKeys: ['mod', 'shift', '8'] + action: editor => editor.chain().focus().toggleBulletList().run(), + canExecute: editor => editor.can().chain().focus().toggleBulletList().run(), + shortcuts: ['mod', 'shift', '8'] } ] -export const SectionFour = ({ editor }: { editor: Editor }) => { - const isAnyListActive = listItems.some(item => item.isActive(editor)) +interface SectionFourProps { + editor: Editor + activeActions?: ListItemAction[] + mainActionCount?: number +} +export const SectionFour: React.FC<SectionFourProps> = ({ + editor, + activeActions = formatActions.map(action => action.value), + mainActionCount = 0 +}) => { return ( - <DropdownMenu> - <DropdownMenuTrigger asChild> - <ToolbarButton isActive={isAnyListActive} tooltip="Lists" aria-label="Lists" className="w-12"> + <ToolbarSection + editor={editor} + actions={formatActions} + activeActions={activeActions} + mainActionCount={mainActionCount} + dropdownIcon={ + <> <ListBulletIcon className="size-5" /> <CaretDownIcon className="size-5" /> - </ToolbarButton> - </DropdownMenuTrigger> - <DropdownMenuContent align="start" className="w-full" onCloseAutoFocus={event => event.preventDefault()}> - {listItems.map(item => ( - <DropdownMenuItem - key={item.label} - onClick={() => item.onClick(editor)} - className={cn('flex flex-row items-center justify-between gap-4', { 'bg-accent': item.isActive(editor) })} - aria-label={item.label} - > - <span className="grow">{item.label}</span> - <ShortcutKey keys={item.shortcutKeys} /> - </DropdownMenuItem> - ))} - </DropdownMenuContent> - </DropdownMenu> + </> + } + dropdownTooltip="Lists" + /> ) } +SectionFour.displayName = 'SectionFour' + export default SectionFour diff --git a/src/components/minimal-tiptap/components/section/one.tsx b/src/components/minimal-tiptap/components/section/one.tsx index 858f352..2d70e22 100644 --- a/src/components/minimal-tiptap/components/section/one.tsx +++ b/src/components/minimal-tiptap/components/section/one.tsx @@ -1,96 +1,117 @@ -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import type { Level } from '@tiptap/extension-heading' import { cn } from '@/lib/utils' import { CaretDownIcon, LetterCaseCapitalizeIcon } from '@radix-ui/react-icons' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { ToolbarButton } from '../toolbar-button' import { ShortcutKey } from '../shortcut-key' +import React, { useCallback, useMemo } from 'react' +import { FormatAction } from '../../types' -interface TextStyle { - label: string +interface TextStyle extends Omit<FormatAction, 'icon' | 'action' | 'isActive' | 'canExecute'> { element: keyof JSX.IntrinsicElements level?: Level className: string - shortcut: string[] } -const TEXT_STYLES: TextStyle[] = [ - { label: 'Normal Text', element: 'span', className: 'grow', shortcut: ['mod', 'alt', '0'] }, +const formatActions: TextStyle[] = [ + { + label: 'Normal Text', + element: 'span', + className: 'grow', + shortcuts: ['mod', 'alt', '0'] + }, { label: 'Heading 1', element: 'h1', level: 1, className: 'm-0 grow text-3xl font-extrabold', - shortcut: ['mod', 'alt', '1'] + shortcuts: ['mod', 'alt', '1'] }, { label: 'Heading 2', element: 'h2', level: 2, className: 'm-0 grow text-xl font-bold', - shortcut: ['mod', 'alt', '2'] + shortcuts: ['mod', 'alt', '2'] }, { label: 'Heading 3', element: 'h3', level: 3, className: 'm-0 grow text-lg font-semibold', - shortcut: ['mod', 'alt', '3'] + shortcuts: ['mod', 'alt', '3'] }, { label: 'Heading 4', element: 'h4', level: 4, className: 'm-0 grow text-base font-semibold', - shortcut: ['mod', 'alt', '4'] + shortcuts: ['mod', 'alt', '4'] }, { label: 'Heading 5', element: 'h5', level: 5, className: 'm-0 grow text-sm font-normal', - shortcut: ['mod', 'alt', '5'] + shortcuts: ['mod', 'alt', '5'] }, { label: 'Heading 6', element: 'h6', level: 6, className: 'm-0 grow text-sm font-normal', - shortcut: ['mod', 'alt', '6'] + shortcuts: ['mod', 'alt', '6'] } ] -export const SectionOne = ({ editor }: { editor: Editor }) => { - const handleStyleChange = (level?: Level) => { - if (level) { - editor.chain().focus().toggleHeading({ level }).run() - } else { - editor.chain().focus().setParagraph().run() - } - } +interface SectionOneProps { + editor: Editor + activeLevels?: Level[] +} + +export const SectionOne: React.FC<SectionOneProps> = React.memo(({ editor, activeLevels = [1, 2, 3, 4, 5, 6] }) => { + const filteredActions = useMemo( + () => formatActions.filter(action => !action.level || activeLevels.includes(action.level)), + [activeLevels] + ) + + const handleStyleChange = useCallback( + (level?: Level) => { + if (level) { + editor.chain().focus().toggleHeading({ level }).run() + } else { + editor.chain().focus().setParagraph().run() + } + }, + [editor] + ) - const renderMenuItem = ({ label, element: Element, level, className, shortcut }: TextStyle) => ( - <DropdownMenuItem - key={label} - onClick={() => handleStyleChange(level)} - className={cn('flex flex-row items-center justify-between gap-4', { - 'bg-accent': level ? editor.isActive('heading', { level }) : editor.isActive('paragraph') - })} - aria-label={label} - > - <Element className={className}>{label}</Element> - <ShortcutKey keys={shortcut} /> - </DropdownMenuItem> + const renderMenuItem = useCallback( + ({ label, element: Element, level, className, shortcuts }: TextStyle) => ( + <DropdownMenuItem + key={label} + onClick={() => handleStyleChange(level)} + className={cn('flex flex-row items-center justify-between gap-4', { + 'bg-accent': level ? editor.isActive('heading', { level }) : editor.isActive('paragraph') + })} + aria-label={label} + > + <Element className={className}>{label}</Element> + <ShortcutKey keys={shortcuts} /> + </DropdownMenuItem> + ), + [editor, handleStyleChange] ) return ( <DropdownMenu> <DropdownMenuTrigger asChild> <ToolbarButton - isActive={editor.isActive('heading')} + isActive={editor.isActive('heading') || editor.isActive('paragraph')} tooltip="Text styles" aria-label="Text styles" - pressed={editor.isActive('heading')} + pressed={editor.isActive('heading') || editor.isActive('paragraph')} className="w-12" disabled={editor.isActive('codeBlock')} > @@ -99,10 +120,12 @@ export const SectionOne = ({ editor }: { editor: Editor }) => { </ToolbarButton> </DropdownMenuTrigger> <DropdownMenuContent align="start" className="w-full" onCloseAutoFocus={event => event.preventDefault()}> - {TEXT_STYLES.map(renderMenuItem)} + {filteredActions.map(renderMenuItem)} </DropdownMenuContent> </DropdownMenu> ) -} +}) + +SectionOne.displayName = 'SectionOne' export default SectionOne diff --git a/src/components/minimal-tiptap/components/section/three.tsx b/src/components/minimal-tiptap/components/section/three.tsx index bdddc55..563fe02 100644 --- a/src/components/minimal-tiptap/components/section/three.tsx +++ b/src/components/minimal-tiptap/components/section/three.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import type { Editor } from '@tiptap/core' +import type { Editor } from '@tiptap/react' import { CaretDownIcon, CheckIcon } from '@radix-ui/react-icons' import { ToolbarButton } from '../toolbar-button' import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/popover' diff --git a/src/components/minimal-tiptap/components/section/two.tsx b/src/components/minimal-tiptap/components/section/two.tsx index 53a7c82..05d09b2 100644 --- a/src/components/minimal-tiptap/components/section/two.tsx +++ b/src/components/minimal-tiptap/components/section/two.tsx @@ -1,110 +1,94 @@ import * as React from 'react' -import type { Editor } from '@tiptap/core' -import { cn } from '@/lib/utils' -import { DotsHorizontalIcon, FontBoldIcon, FontItalicIcon } from '@radix-ui/react-icons' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' -import { ToolbarButton } from '../toolbar-button' -import { ShortcutKey } from '../shortcut-key' -import { getShortcutKey } from '../../utils' +import type { Editor } from '@tiptap/react' +import { + CodeIcon, + DotsHorizontalIcon, + FontBoldIcon, + FontItalicIcon, + StrikethroughIcon, + TextNoneIcon +} from '@radix-ui/react-icons' +import { FormatAction } from '../../types' +import { ToolbarSection } from '../toolbar-section' -interface FormatAction { - label: string - icon?: React.ReactNode - action: (editor: Editor) => void - isActive: (editor: Editor) => boolean - canExecute: (editor: Editor) => boolean - shortcut?: string[] +type TextStyleAction = 'bold' | 'italic' | 'strikethrough' | 'code' | 'clearFormatting' + +interface TextStyle extends FormatAction { + value: TextStyleAction } -const formatActions: FormatAction[] = [ +const formatActions: TextStyle[] = [ { - label: 'Bold ', + value: 'bold', + label: 'Bold', icon: <FontBoldIcon className="size-5" />, action: editor => editor.chain().focus().toggleBold().run(), isActive: editor => editor.isActive('bold'), canExecute: editor => editor.can().chain().focus().toggleBold().run() && !editor.isActive('codeBlock'), - shortcut: ['mod', 'B'] + shortcuts: ['mod', 'B'] }, { + value: 'italic', label: 'Italic', icon: <FontItalicIcon className="size-5" />, action: editor => editor.chain().focus().toggleItalic().run(), isActive: editor => editor.isActive('italic'), canExecute: editor => editor.can().chain().focus().toggleItalic().run() && !editor.isActive('codeBlock'), - shortcut: ['mod', 'I'] + shortcuts: ['mod', 'I'] }, { + value: 'strikethrough', label: 'Strikethrough', + icon: <StrikethroughIcon className="size-5" />, action: editor => editor.chain().focus().toggleStrike().run(), isActive: editor => editor.isActive('strike'), canExecute: editor => editor.can().chain().focus().toggleStrike().run() && !editor.isActive('codeBlock'), - shortcut: ['mod', 'shift', 'S'] + shortcuts: ['mod', 'shift', 'S'] }, { + value: 'code', label: 'Code', + icon: <CodeIcon className="size-5" />, action: editor => editor.chain().focus().toggleCode().run(), isActive: editor => editor.isActive('code'), canExecute: editor => editor.can().chain().focus().toggleCode().run() && !editor.isActive('codeBlock'), - shortcut: ['mod', 'E'] + shortcuts: ['mod', 'E'] }, { + value: 'clearFormatting', label: 'Clear formatting', + icon: <TextNoneIcon className="size-5" />, action: editor => editor.chain().focus().unsetAllMarks().run(), isActive: () => false, canExecute: editor => editor.can().chain().focus().unsetAllMarks().run() && !editor.isActive('codeBlock'), - shortcut: ['mod', '\\'] + shortcuts: ['mod', '\\'] } ] -export const SectionTwo = ({ editor }: { editor: Editor }) => { - const mainActions = formatActions.slice(0, 2) - const dropdownActions = formatActions.slice(2) - - const renderToolbarButton = (action: FormatAction) => ( - <ToolbarButton - key={action.label} - onClick={() => action.action(editor)} - disabled={!action.canExecute(editor)} - isActive={action.isActive(editor)} - tooltip={`${action.label} ${action.shortcut && `${action.shortcut.map(s => getShortcutKey(s).symbol).join(' ')}`}`} - aria-label={action.label} - > - {action.icon} - </ToolbarButton> - ) - - const renderDropdownMenuItem = (action: FormatAction) => ( - <DropdownMenuItem - key={action.label} - onClick={() => action.action(editor)} - disabled={!action.canExecute(editor)} - className={cn('flex flex-row items-center justify-between gap-4', { 'bg-accent': action.isActive(editor) })} - aria-label={action.label} - > - <span className="grow">{action.label}</span> - {action.shortcut && <ShortcutKey keys={action.shortcut} />} - </DropdownMenuItem> - ) +interface SectionTwoProps { + editor: Editor + activeActions?: TextStyleAction[] + mainActionCount?: number +} +export const SectionTwo: React.FC<SectionTwoProps> = ({ + editor, + activeActions = formatActions.map(action => action.value), + mainActionCount = 2 +}) => { return ( - <> - {mainActions.map(renderToolbarButton)} - <DropdownMenu> - <DropdownMenuTrigger asChild> - <ToolbarButton - isActive={dropdownActions.some(action => action.isActive(editor))} - tooltip="More formatting" - aria-label="More formatting" - > - <DotsHorizontalIcon className="size-5" /> - </ToolbarButton> - </DropdownMenuTrigger> - <DropdownMenuContent align="start" className="w-full" onCloseAutoFocus={event => event.preventDefault()}> - {dropdownActions.map(renderDropdownMenuItem)} - </DropdownMenuContent> - </DropdownMenu> - </> + <ToolbarSection + editor={editor} + actions={formatActions} + activeActions={activeActions} + mainActionCount={mainActionCount} + dropdownIcon={<DotsHorizontalIcon className="size-5" />} + dropdownTooltip="More formatting" + dropdownClassName="w-8" + /> ) } +SectionTwo.displayName = 'SectionTwo' + export default SectionTwo diff --git a/src/components/minimal-tiptap/components/toolbar-section.tsx b/src/components/minimal-tiptap/components/toolbar-section.tsx new file mode 100644 index 0000000..7280929 --- /dev/null +++ b/src/components/minimal-tiptap/components/toolbar-section.tsx @@ -0,0 +1,111 @@ +import * as React from 'react' +import type { Editor } from '@tiptap/react' +import { cn } from '@/lib/utils' +import { CaretDownIcon } from '@radix-ui/react-icons' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' +import { ToolbarButton } from './toolbar-button' +import { ShortcutKey } from './shortcut-key' +import { getShortcutKey } from '../utils' + +export interface FormatAction { + label: string + icon?: React.ReactNode + action: (editor: Editor) => void + isActive: (editor: Editor) => boolean + canExecute: (editor: Editor) => boolean + shortcuts: string[] + value: string +} + +interface ToolbarSectionProps { + editor: Editor + actions: FormatAction[] + activeActions?: string[] + mainActionCount?: number + dropdownIcon?: React.ReactNode + dropdownTooltip?: string + dropdownClassName?: string +} + +export const ToolbarSection: React.FC<ToolbarSectionProps> = ({ + editor, + actions, + activeActions = actions.map(action => action.value), + mainActionCount = 0, + dropdownIcon, + dropdownTooltip = 'More options', + dropdownClassName = 'w-12' +}) => { + const { mainActions, dropdownActions } = React.useMemo(() => { + const sortedActions = actions + .filter(action => activeActions.includes(action.value)) + .sort((a, b) => activeActions.indexOf(a.value) - activeActions.indexOf(b.value)) + + return { + mainActions: sortedActions.slice(0, mainActionCount), + dropdownActions: sortedActions.slice(mainActionCount) + } + }, [actions, activeActions, mainActionCount]) + + const renderToolbarButton = React.useCallback( + (action: FormatAction) => ( + <ToolbarButton + key={action.label} + onClick={() => action.action(editor)} + disabled={!action.canExecute(editor)} + isActive={action.isActive(editor)} + tooltip={`${action.label} ${action.shortcuts.map(s => getShortcutKey(s).symbol).join(' ')}`} + aria-label={action.label} + > + {action.icon} + </ToolbarButton> + ), + [editor] + ) + + const renderDropdownMenuItem = React.useCallback( + (action: FormatAction) => ( + <DropdownMenuItem + key={action.label} + onClick={() => action.action(editor)} + disabled={!action.canExecute(editor)} + className={cn('flex flex-row items-center justify-between gap-4', { 'bg-accent': action.isActive(editor) })} + aria-label={action.label} + > + <span className="grow">{action.label}</span> + <ShortcutKey keys={action.shortcuts} /> + </DropdownMenuItem> + ), + [editor] + ) + + const isDropdownActive = React.useMemo( + () => dropdownActions.some(action => action.isActive(editor)), + [dropdownActions, editor] + ) + + return ( + <> + {mainActions.map(renderToolbarButton)} + {dropdownActions.length > 0 && ( + <DropdownMenu> + <DropdownMenuTrigger asChild> + <ToolbarButton + isActive={isDropdownActive} + tooltip={dropdownTooltip} + aria-label={dropdownTooltip} + className={cn(dropdownClassName)} + > + {dropdownIcon || <CaretDownIcon className="size-5" />} + </ToolbarButton> + </DropdownMenuTrigger> + <DropdownMenuContent align="start" className="w-full" onCloseAutoFocus={event => event.preventDefault()}> + {dropdownActions.map(renderDropdownMenuItem)} + </DropdownMenuContent> + </DropdownMenu> + )} + </> + ) +} + +export default ToolbarSection diff --git a/src/components/minimal-tiptap/extensions/index.ts b/src/components/minimal-tiptap/extensions/index.ts index 94bf309..63f21fa 100644 --- a/src/components/minimal-tiptap/extensions/index.ts +++ b/src/components/minimal-tiptap/extensions/index.ts @@ -5,3 +5,4 @@ export * from './image' export * from './link' export * from './selection' export * from './unset-all-marks' +export * from './reset-marks-on-enter' diff --git a/src/components/minimal-tiptap/extensions/reset-marks-on-enter/index.ts b/src/components/minimal-tiptap/extensions/reset-marks-on-enter/index.ts new file mode 100644 index 0000000..f514cdd --- /dev/null +++ b/src/components/minimal-tiptap/extensions/reset-marks-on-enter/index.ts @@ -0,0 +1 @@ +export * from './reset-marks-on-enter' diff --git a/src/components/minimal-tiptap/extensions/reset-marks-on-enter/reset-marks-on-enter.ts b/src/components/minimal-tiptap/extensions/reset-marks-on-enter/reset-marks-on-enter.ts new file mode 100644 index 0000000..e977071 --- /dev/null +++ b/src/components/minimal-tiptap/extensions/reset-marks-on-enter/reset-marks-on-enter.ts @@ -0,0 +1,25 @@ +import { Extension } from '@tiptap/core' + +export const ResetMarksOnEnter = Extension.create({ + name: 'resetMarksOnEnter', + + addKeyboardShortcuts() { + return { + Enter: ({ editor }) => { + if ( + editor.isActive('bold') || + editor.isActive('italic') || + editor.isActive('strike') || + editor.isActive('underline') || + editor.isActive('code') + ) { + editor.commands.splitBlock({ keepMarks: false }) + + return true + } + + return false + } + } + } +}) diff --git a/src/components/minimal-tiptap/hooks/use-minimal-tiptap.ts b/src/components/minimal-tiptap/hooks/use-minimal-tiptap.ts index 15cbfdd..bad9fc2 100644 --- a/src/components/minimal-tiptap/hooks/use-minimal-tiptap.ts +++ b/src/components/minimal-tiptap/hooks/use-minimal-tiptap.ts @@ -6,7 +6,16 @@ import type { Editor } from '@tiptap/core' import { Typography } from '@tiptap/extension-typography' import { Placeholder } from '@tiptap/extension-placeholder' import { TextStyle } from '@tiptap/extension-text-style' -import { Link, Image, HorizontalRule, CodeBlockLowlight, Selection, Color, UnsetAllMarks } from '../extensions' +import { + Link, + Image, + HorizontalRule, + CodeBlockLowlight, + Selection, + Color, + UnsetAllMarks, + ResetMarksOnEnter +} from '../extensions' import { cn } from '@/lib/utils' import { getOutput } from '../utils' import { useThrottle } from '../hooks/use-throttle' @@ -41,6 +50,7 @@ const createExtensions = (placeholder: string) => [ Typography, UnsetAllMarks, HorizontalRule, + ResetMarksOnEnter, CodeBlockLowlight, Placeholder.configure({ placeholder: () => placeholder }) ] diff --git a/src/components/minimal-tiptap/minimal-tiptap.tsx b/src/components/minimal-tiptap/minimal-tiptap.tsx index 5524b26..e9efdaf 100644 --- a/src/components/minimal-tiptap/minimal-tiptap.tsx +++ b/src/components/minimal-tiptap/minimal-tiptap.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import './styles/index.css' import { EditorContent } from '@tiptap/react' -import { Content, Editor } from '@tiptap/core' +import { Content, Editor } from '@tiptap/react' import { Separator } from '@/components/ui/separator' import { cn } from '@/lib/utils' import { SectionOne } from './components/section/one' @@ -24,15 +24,27 @@ export interface MinimalTiptapProps extends Omit<UseMinimalTiptapEditorProps, 'o const Toolbar = ({ editor }: { editor: Editor }) => ( <div className="border-b border-border p-2"> <div className="flex w-full flex-wrap items-center"> - <SectionOne editor={editor} /> + <SectionOne editor={editor} activeLevels={[1, 2, 3, 4, 5, 6]} /> + <Separator orientation="vertical" className="mx-2 h-7" /> - <SectionTwo editor={editor} /> + + <SectionTwo + editor={editor} + activeActions={['bold', 'italic', 'strikethrough', 'code', 'clearFormatting']} + mainActionCount={2} + /> + <Separator orientation="vertical" className="mx-2 h-7" /> + <SectionThree editor={editor} /> + <Separator orientation="vertical" className="mx-2 h-7" /> - <SectionFour editor={editor} /> + + <SectionFour editor={editor} activeActions={['orderedList', 'bulletList']} mainActionCount={0} /> + <Separator orientation="vertical" className="mx-2 h-7" /> - <SectionFive editor={editor} /> + + <SectionFive editor={editor} activeActions={['codeBlock', 'blockquote', 'horizontalRule']} mainActionCount={0} /> </div> </div> ) diff --git a/src/components/minimal-tiptap/styles/index.css b/src/components/minimal-tiptap/styles/index.css index 4649a32..7121c31 100644 --- a/src/components/minimal-tiptap/styles/index.css +++ b/src/components/minimal-tiptap/styles/index.css @@ -143,7 +143,7 @@ .minimal-tiptap-editor .ProseMirror blockquote::before, .minimal-tiptap-editor .ProseMirror blockquote.is-empty::before { - @apply absolute bottom-0 left-0 top-0 h-full w-1 rounded-sm bg-accent content-['']; + @apply absolute bottom-0 left-0 top-0 h-full w-1 rounded-sm bg-accent-foreground/15 content-['']; } .minimal-tiptap-editor .ProseMirror hr { diff --git a/src/components/minimal-tiptap/types.ts b/src/components/minimal-tiptap/types.ts index b519587..f70ae28 100644 --- a/src/components/minimal-tiptap/types.ts +++ b/src/components/minimal-tiptap/types.ts @@ -16,3 +16,12 @@ export interface ShouldShowProps { from: number to: number } + +export interface FormatAction { + label: string + icon?: React.ReactNode + action: (editor: Editor) => void + isActive: (editor: Editor) => boolean + canExecute: (editor: Editor) => boolean + shortcuts: string[] +}