diff --git a/components/Collaborate/CollabEditor.js b/components/Collaborate/CollabEditor.js index 136a5632..b1b69671 100644 --- a/components/Collaborate/CollabEditor.js +++ b/components/Collaborate/CollabEditor.js @@ -13,7 +13,6 @@ import { Button, Typography } from '@material-ui/core'; import { TranscribePenIcon } from 'components/icons'; import { useProseMirror, ProseMirror } from 'use-prosemirror'; import { schema } from './Schema'; -import { exampleSetup } from 'prosemirror-example-setup'; import { keymap } from 'prosemirror-keymap'; import { useState, useRef, useEffect } from 'react'; import { makeStyles } from '@material-ui/core/styles'; @@ -112,9 +111,14 @@ const Editor = ({ provider, currentUser, className, innerRef, onUnmount }) => { 'Mod-z': undo, 'Mod-y': redo, 'Mod-Shift-z': redo, + Enter: (state, dispatch) => { + // Insert \n on enter + dispatch(state.tr.insertText('\n').scrollIntoView()); + return true; + }, }), PlaceholderPlugin(t`Input transcript`), - ].concat(exampleSetup({ schema, menuBar: false })), + ], }); return ( diff --git a/components/Collaborate/CollabHistory.js b/components/Collaborate/CollabHistory.js index 83851719..9540ae4d 100644 --- a/components/Collaborate/CollabHistory.js +++ b/components/Collaborate/CollabHistory.js @@ -3,7 +3,6 @@ import * as Y from 'yjs'; import { ySyncPlugin, ySyncPluginKey } from 'y-prosemirror'; import { useProseMirror, ProseMirror } from 'use-prosemirror'; import { schema } from './Schema'; -import { exampleSetup } from 'prosemirror-example-setup'; import { useState, useRef, useEffect, forwardRef, useCallback } from 'react'; import { Button, Modal, Box, Typography } from '@material-ui/core'; import { ToggleButtonGroup, ToggleButton } from '@material-ui/lab'; @@ -172,7 +171,7 @@ const CustomModalContent = forwardRef(function CustomModalContent( permanentUserData, onFirstRender, }), - ].concat(exampleSetup({ schema, menuBar: false })), + ], }); return ( diff --git a/components/Collaborate/Prosemirror.css b/components/Collaborate/Prosemirror.css index 5a6cb6ec..10cb0160 100644 --- a/components/Collaborate/Prosemirror.css +++ b/components/Collaborate/Prosemirror.css @@ -68,29 +68,6 @@ li.ProseMirror-selectednode:after { .ProseMirror-focused .ProseMirror-gapcursor { display: block; } -/* Add space around the hr to make clicking it easier */ - -.ProseMirror-example-setup-style hr { - padding: 2px 10px; - border: none; - margin: 1em 0; -} - -.ProseMirror-example-setup-style hr:after { - content: ""; - display: block; - height: 1px; - background-color: silver; - line-height: 2px; -} - -.ProseMirror ul, .ProseMirror ol { - padding-left: 30px; -} - -.ProseMirror-example-setup-style img { - cursor: default; -} .ProseMirror-prompt { background: white; @@ -134,16 +111,6 @@ li.ProseMirror-selectednode:after { display: none; } -.ProseMirror p:first-child, -.ProseMirror h1:first-child, -.ProseMirror h2:first-child, -.ProseMirror h3:first-child, -.ProseMirror h4:first-child, -.ProseMirror h5:first-child, -.ProseMirror h6:first-child { - margin-top: 10px; -} - .ProseMirror { padding: 4px 8px 4px 14px; line-height: 1.2; diff --git a/components/Collaborate/Schema.js b/components/Collaborate/Schema.js index 0c5b5ddb..8dd06aad 100644 --- a/components/Collaborate/Schema.js +++ b/components/Collaborate/Schema.js @@ -2,8 +2,6 @@ // import { Schema } from 'prosemirror-model'; -const brDOM = ['br']; - const calcYChangeStyle = ychange => { switch (ychange.type) { case 'removed': @@ -63,15 +61,13 @@ const hoverWrapper = (ychange, els) => { export const nodes = { // :: NodeSpec The top level document node. doc: { - content: 'block+', + content: 'paragraph+', }, - // :: NodeSpec A plain paragraph textblock. Represented in the DOM - // as a `

` element. paragraph: { attrs: { ychange: { default: null } }, - content: 'inline*', - group: 'block', + content: 'text*', + code: true, parseDOM: [{ tag: 'p' }], toDOM(node) { // only render changes if no child nodes @@ -87,209 +83,12 @@ export const nodes = { }, }, - // :: NodeSpec A blockquote (`

`) wrapping one or more blocks. - blockquote: { - attrs: { ychange: { default: null } }, - content: 'block+', - group: 'block', - defining: true, - parseDOM: [{ tag: 'blockquote' }], - toDOM(node) { - return [ - 'blockquote', - calcYchangeDomAttrs(node.attrs), - ...hoverWrapper(node.attrs.ychange, [0]), - ]; - }, - }, - - // :: NodeSpec A horizontal rule (`
`). - horizontal_rule: { - attrs: { ychange: { default: null } }, - group: 'block', - parseDOM: [{ tag: 'hr' }], - toDOM(node) { - return [ - 'hr', - calcYchangeDomAttrs(node.attrs), - ...hoverWrapper(node.attrs.ychange, []), - ]; - }, - }, - - // :: NodeSpec A heading textblock, with a `level` attribute that - // should hold the number 1 to 6. Parsed and serialized as `

` to - // `

` elements. - heading: { - attrs: { - level: { default: 1 }, - ychange: { default: null }, - }, - content: 'inline*', - group: 'block', - defining: true, - parseDOM: [ - { tag: 'h1', attrs: { level: 1 } }, - { tag: 'h2', attrs: { level: 2 } }, - { tag: 'h3', attrs: { level: 3 } }, - { tag: 'h4', attrs: { level: 4 } }, - { tag: 'h5', attrs: { level: 5 } }, - { tag: 'h6', attrs: { level: 6 } }, - ], - toDOM(node) { - return [ - 'h' + node.attrs.level, - calcYchangeDomAttrs(node.attrs), - ...hoverWrapper(node.attrs.ychange, [0]), - ]; - }, - }, - - // :: NodeSpec A code listing. Disallows marks or non-text inline - // nodes by default. Represented as a `
` element with a
-  // `` element inside of it.
-  code_block: {
-    attrs: { ychange: { default: null } },
-    content: 'text*',
-    marks: '',
-    group: 'block',
-    code: true,
-    defining: true,
-    parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],
-    toDOM(node) {
-      return [
-        'pre',
-        calcYchangeDomAttrs(node.attrs),
-        ...hoverWrapper(node.attrs.ychange, [['code', 0]]),
-      ];
-    },
-  },
-
   // :: NodeSpec The text node.
-  text: {
-    group: 'inline',
-  },
-
-  // :: NodeSpec An inline image (``) node. Supports `src`,
-  // `alt`, and `href` attributes. The latter two default to the empty
-  // string.
-  image: {
-    inline: true,
-    attrs: {
-      ychange: { default: null },
-      src: {},
-      alt: { default: null },
-      title: { default: null },
-    },
-    group: 'inline',
-    draggable: true,
-    parseDOM: [
-      {
-        tag: 'img[src]',
-        getAttrs(dom) {
-          return {
-            src: dom.getAttribute('src'),
-            title: dom.getAttribute('title'),
-            alt: dom.getAttribute('alt'),
-          };
-        },
-      },
-    ],
-    toDOM(node) {
-      const domAttrs = {
-        src: node.attrs.src,
-        title: node.attrs.title,
-        alt: node.attrs.alt,
-      };
-      return [
-        'img',
-        calcYchangeDomAttrs(node.attrs, domAttrs),
-        ...hoverWrapper(node.attrs.ychange, []),
-      ];
-    },
-  },
-
-  // :: NodeSpec A hard line break, represented in the DOM as `
`. - hard_break: { - inline: true, - group: 'inline', - selectable: false, - parseDOM: [{ tag: 'br' }], - toDOM() { - return brDOM; - }, - }, + text: {}, }; -const emDOM = ['em', 0]; -const strongDOM = ['strong', 0]; -const codeDOM = ['code', 0]; - // :: Object [Specs](#model.MarkSpec) for the marks in the schema. export const marks = { - // :: MarkSpec A link. Has `href` and `title` attributes. `title` - // defaults to the empty string. Rendered and parsed as an `` - // element. - link: { - attrs: { - href: {}, - title: { default: null }, - }, - inclusive: false, - parseDOM: [ - { - tag: 'a[href]', - getAttrs(dom) { - return { - href: dom.getAttribute('href'), - title: dom.getAttribute('title'), - }; - }, - }, - ], - toDOM(node) { - return ['a', node.attrs, 0]; - }, - }, - - // :: MarkSpec An emphasis mark. Rendered as an `` element. - // Has parse rules that also match `` and `font-style: italic`. - em: { - parseDOM: [{ tag: 'i' }, { tag: 'em' }, { style: 'font-style=italic' }], - toDOM() { - return emDOM; - }, - }, - - // :: MarkSpec A strong mark. Rendered as ``, parse rules - // also match `` and `font-weight: bold`. - strong: { - parseDOM: [ - { tag: 'strong' }, - // This works around a Google Docs misbehavior where - // pasted content will be inexplicably wrapped in `` - // tags with a font-weight normal. - { - tag: 'b', - getAttrs: node => node.style.fontWeight !== 'normal' && null, - }, - { - style: 'font-weight', - getAttrs: value => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null, - }, - ], - toDOM() { - return strongDOM; - }, - }, - - // :: MarkSpec Code font mark. Represented as a `` element. - code: { - parseDOM: [{ tag: 'code' }], - toDOM() { - return codeDOM; - }, - }, ychange: { attrs: { user: { default: null }, diff --git a/package-lock.json b/package-lock.json index 1a8a06ad..ff11fb92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "next": "^9.3.2", "next-apollo": "^3.1.5", "pm2": "^4.2.3", - "prosemirror-example-setup": "^1.1.2", + "prosemirror-keymap": "^1.2.2", "prosemirror-model": "^1.13.1", "prosemirror-schema-basic": "^1.2.2", "prosemirror-state": "^1.3.4", @@ -12902,11 +12902,6 @@ "dev": true, "peer": true }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, "node_modules/cron": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", @@ -26771,73 +26766,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", - "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-example-setup": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.2.tgz", - "integrity": "sha512-pHJc656IgYm249RNp0eQaWNmnyWGk6OrzysWfYI4+NwE14HQ7YNYOlRBLErUS6uCAHIYJLNXf0/XCmf1OCtNbQ==", - "dependencies": { - "prosemirror-commands": "^1.0.0", - "prosemirror-dropcursor": "^1.0.0", - "prosemirror-gapcursor": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-inputrules": "^1.0.0", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.0.0", - "prosemirror-schema-list": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz", - "integrity": "sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, "node_modules/prosemirror-keymap": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", @@ -26847,17 +26775,6 @@ "w3c-keyname": "^2.2.0" } }, - "node_modules/prosemirror-menu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.2.tgz", - "integrity": "sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw==", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, "node_modules/prosemirror-model": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.2.tgz", @@ -26874,16 +26791,6 @@ "prosemirror-model": "^1.19.0" } }, - "node_modules/prosemirror-schema-list": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", - "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, "node_modules/prosemirror-state": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", @@ -28442,11 +28349,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=" }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" - }, "node_modules/rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", @@ -43528,11 +43430,6 @@ "dev": true, "peer": true }, - "crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, "cron": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", @@ -54391,73 +54288,6 @@ "xtend": "^4.0.0" } }, - "prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-dropcursor": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", - "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "prosemirror-example-setup": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.2.2.tgz", - "integrity": "sha512-pHJc656IgYm249RNp0eQaWNmnyWGk6OrzysWfYI4+NwE14HQ7YNYOlRBLErUS6uCAHIYJLNXf0/XCmf1OCtNbQ==", - "requires": { - "prosemirror-commands": "^1.0.0", - "prosemirror-dropcursor": "^1.0.0", - "prosemirror-gapcursor": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-inputrules": "^1.0.0", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.0.0", - "prosemirror-schema-list": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "prosemirror-gapcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", - "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", - "requires": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "prosemirror-inputrules": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz", - "integrity": "sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, "prosemirror-keymap": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", @@ -54467,17 +54297,6 @@ "w3c-keyname": "^2.2.0" } }, - "prosemirror-menu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.2.tgz", - "integrity": "sha512-437HIWTq4F9cTX+kPfqZWWm+luJm95Aut/mLUy+9OMrOml0bmWDS26ceC6SNfb2/S94et1sZ186vLO7pDHzxSw==", - "requires": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, "prosemirror-model": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.2.tgz", @@ -54494,16 +54313,6 @@ "prosemirror-model": "^1.19.0" } }, - "prosemirror-schema-list": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz", - "integrity": "sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, "prosemirror-state": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", @@ -55757,11 +55566,6 @@ } } }, - "rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" - }, "rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", diff --git a/package.json b/package.json index f80e2b2b..b1d47bcd 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "next": "^9.3.2", "next-apollo": "^3.1.5", "pm2": "^4.2.3", - "prosemirror-example-setup": "^1.1.2", + "prosemirror-keymap": "^1.2.2", "prosemirror-model": "^1.13.1", "prosemirror-schema-basic": "^1.2.2", "prosemirror-state": "^1.3.4",