├── examples ├── public │ ├── CNAME │ ├── favicon.png │ ├── github.png │ ├── index.html │ ├── build │ │ ├── examples │ │ │ └── public │ │ │ │ └── build │ │ │ │ ├── bundle.css │ │ │ │ └── bundle.css.map │ │ ├── bundle.css │ │ └── bundle.css.map │ └── global.css └── src │ ├── components │ ├── SvelteLogo.svelte │ ├── ProsemirrorLogo.svelte │ ├── PlainTextEditor.svelte │ ├── RichTextEditor_101.svelte │ ├── RIchTextEditor_104.svelte │ ├── RichTextEditor_105.svelte │ ├── RichTextEditor_103.svelte │ └── RichTextEditor_102.svelte │ ├── main.js │ └── App.svelte ├── helpers ├── index.js ├── plugins.js ├── parsing.js └── keymap.js ├── .gitignore ├── state ├── index.js ├── schemas.js ├── serialize.js ├── create.js └── transform.js ├── LICENSE ├── package.json ├── rollup.config.js ├── ProsemirrorEditor.svelte ├── README.md └── yarn.lock /examples/public/CNAME: -------------------------------------------------------------------------------- 1 | prosemirror-svelte.surge.sh 2 | -------------------------------------------------------------------------------- /helpers/index.js: -------------------------------------------------------------------------------- 1 | export * from './plugins'; 2 | export * from './parsing'; 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | .DS_Store 3 | .idea 4 | yarn-error.log 5 | package-lock.json 6 | -------------------------------------------------------------------------------- /examples/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christianheine/prosemirror-svelte/HEAD/examples/public/favicon.png -------------------------------------------------------------------------------- /examples/public/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christianheine/prosemirror-svelte/HEAD/examples/public/github.png -------------------------------------------------------------------------------- /examples/src/components/SvelteLogo.svelte: -------------------------------------------------------------------------------- 1 | Svelte logo 2 | -------------------------------------------------------------------------------- /state/index.js: -------------------------------------------------------------------------------- 1 | export * from './create.js'; 2 | export * from './serialize.js'; 3 | export * from './transform.js'; 4 | export * from './schemas.js'; 5 | -------------------------------------------------------------------------------- /examples/src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | 3 | const root = document.querySelector("#root"); 4 | 5 | const app = new App({ 6 | target: root, 7 | props: {} 8 | }); 9 | 10 | export default app; 11 | -------------------------------------------------------------------------------- /helpers/plugins.js: -------------------------------------------------------------------------------- 1 | import { keymap } from "prosemirror-keymap"; 2 | import { baseKeymap } from "prosemirror-commands"; 3 | import { history, redo, undo } from "prosemirror-history"; 4 | import { dropCursor } from "prosemirror-dropcursor" 5 | import { gapCursor } from "prosemirror-gapcursor" 6 | 7 | import { richTextKeyMapPlugin } from "./keymap"; 8 | 9 | export { dropCursor, gapCursor, richTextKeyMapPlugin }; 10 | 11 | /** 12 | * Core plugins which will be passed by default to each editor state instance 13 | * @type {*[]} 14 | */ 15 | export const corePlugins = [ 16 | history(), 17 | keymap({"Mod-z": undo, "Mod-y": redo, "Mod-Shift-z": redo}), 18 | keymap(baseKeymap), 19 | ]; 20 | 21 | export const richTextPlugins = [ 22 | dropCursor(), 23 | gapCursor(), 24 | richTextKeyMapPlugin 25 | ]; 26 | -------------------------------------------------------------------------------- /examples/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Svelte Prosemirror Editor 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | Github repository - including documentation 23 | 24 |
25 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /state/schemas.js: -------------------------------------------------------------------------------- 1 | import { Schema } from 'prosemirror-model'; 2 | import { nodes, marks } from 'prosemirror-schema-basic'; 3 | 4 | /** 5 | * Schema to represent a single line of plain text 6 | * @type {Schema} 7 | */ 8 | export const singleLineSchema = new Schema({ 9 | nodes: { 10 | doc: {content: "text*"}, 11 | text: {inline: true} 12 | } 13 | }); 14 | 15 | /** 16 | * Schema to represent multiple lines of plain text 17 | * @type {Schema} 18 | */ 19 | export const multiLineSchema = new Schema({ 20 | nodes: { 21 | doc: { 22 | content: "paragraph+" 23 | }, 24 | paragraph: { 25 | content: "text*", 26 | parseDOM: [{tag: "p"}], 27 | toDOM: () => ["p", 0] 28 | }, 29 | text: { 30 | inline: true 31 | } 32 | } 33 | }); 34 | 35 | /** 36 | * Schema to represent rich text 37 | * @type {Schema} 38 | */ 39 | export const richTextSchema = new Schema({ 40 | nodes, 41 | marks 42 | }); 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 Christian Heine 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE 8 | -------------------------------------------------------------------------------- /examples/src/components/ProsemirrorLogo.svelte: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /examples/public/build/examples/public/build/bundle.css: -------------------------------------------------------------------------------- 1 | body{--ui-color-placeholder:#AAAAAA}.ProseMirror{position:relative}.ProseMirror{word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:"";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}.ProseMirror .empty-node::before{position:absolute;color:#aaa;cursor:text}.ProseMirror .empty-node:hover::before{color:#777}.ProseMirror.editor_empty::before{position:absolute;content:attr(data-placeholder);pointer-events:none;color:var(--ui-color-placeholder)} 2 | .header.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:1em}.subheader.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.select_example.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;justify-content:space-between}main.svelte-d26rw2{padding:1em;max-width:48em;margin:0 auto}h4.svelte-d26rw2{margin-bottom:1em}label.svelte-d26rw2{margin:0 0 0 1em} 3 | pre.svelte-16nlmh3{padding:.5em} 4 | button.svelte-ofepr8,input.svelte-ofepr8{margin:.5em}input.svelte-ofepr8{outline:none}.ui-editor img{max-width:300px} 5 | 6 | /*# sourceMappingURL=bundle.css.map */ -------------------------------------------------------------------------------- /examples/public/build/bundle.css: -------------------------------------------------------------------------------- 1 | .header.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:1em}.subheader.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.select_example.svelte-d26rw2{display:flex;flex-direction:row;align-items:center;justify-content:space-between}main.svelte-d26rw2{padding:1em;max-width:48em;margin:0 auto}h4.svelte-d26rw2{margin-bottom:1em}label.svelte-d26rw2{margin:0 0 0 1em} 2 | button.svelte-ofepr8,input.svelte-ofepr8{margin:.5em}input.svelte-ofepr8{outline:none}.ui-editor img{max-width:300px} 3 | pre.svelte-16nlmh3{padding:.5em} 4 | body{--ui-color-placeholder:#AAAAAA}.ProseMirror{position:relative}.ProseMirror{word-wrap:break-word;white-space:pre-wrap;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:"";position:absolute;left:-32px;right:-2px;top:-2px;bottom:-2px;border:2px solid #8cf;pointer-events:none}.ProseMirror .empty-node::before{position:absolute;color:#aaa;cursor:text}.ProseMirror .empty-node:hover::before{color:#777}.ProseMirror.editor_empty::before{position:absolute;content:attr(data-placeholder);pointer-events:none;color:var(--ui-color-placeholder)} 5 | 6 | /*# sourceMappingURL=bundle.css.map */ -------------------------------------------------------------------------------- /examples/src/components/PlainTextEditor.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 45 | 46 |
47 | 48 | 49 | 50 | 51 |
52 | 53 |
Current plain text content of the editor: "{textContent}"
54 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prosemirror-svelte", 3 | "version": "0.2.4", 4 | "description": "Svelte bindings for the ProseMirror editor", 5 | "author": "Christian Heine", 6 | "license": "MIT", 7 | "main": "ProsemirrorEditor.svelte", 8 | "svelte": "ProsemirrorEditor.svelte", 9 | "files": [ 10 | "helpers/*", 11 | "state/*", 12 | "ProsemirrorEditor.svelte", 13 | "LICENSE" 14 | ], 15 | "scripts": { 16 | "build": "rollup -c", 17 | "dev": "rollup -c -w", 18 | "start": "sirv examples/public", 19 | "test": "echo \"No tests specified (yet)\"" 20 | }, 21 | "repository": "https://github.com/christianheine/prosemirror-svelte", 22 | "bugs": { 23 | "url": "https://github.com/christianheine/prosemirror-svelte/issues" 24 | }, 25 | "keywords": [ 26 | "svelte", 27 | "prosemirror", 28 | "editor" 29 | ], 30 | "dependencies": { 31 | "prosemirror-commands": "^1.1.2", 32 | "prosemirror-dropcursor": "^1.3.2", 33 | "prosemirror-gapcursor": "^1.1.2", 34 | "prosemirror-history": "^1.1.3", 35 | "prosemirror-inputrules": "^1.1.2", 36 | "prosemirror-keymap": "^1.1.3", 37 | "prosemirror-model": "^1.8.2", 38 | "prosemirror-schema-basic": "^1.1.2", 39 | "prosemirror-schema-list": "^1.1.2", 40 | "prosemirror-state": "^1.3.2", 41 | "prosemirror-view": "^1.13.7" 42 | }, 43 | "devDependencies": { 44 | "@rollup/plugin-commonjs": "^11.0.0", 45 | "@rollup/plugin-node-resolve": "^6.0.0", 46 | "prosemirror-example-setup": "^1.1.2", 47 | "rollup": "^1.20.0", 48 | "rollup-plugin-css-only": "^2.0.0", 49 | "rollup-plugin-livereload": "^1.0.0", 50 | "rollup-plugin-svelte": "^6.0.3", 51 | "rollup-plugin-terser": "^5.1.2", 52 | "sirv-cli": "^0.4.4", 53 | "svelte": "^3.0.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /examples/src/components/RichTextEditor_101.svelte: -------------------------------------------------------------------------------- 1 | 45 | 46 | 51 | 52 |
53 | 54 | 55 | 56 | 57 |
58 | -------------------------------------------------------------------------------- /helpers/parsing.js: -------------------------------------------------------------------------------- 1 | import { EditorState } from "prosemirror-state" 2 | import { Mark, NodeType } from "prosemirror-model" 3 | 4 | const mapFromMarks = marks => { 5 | if(!marks) return null 6 | 7 | const map = {} 8 | for (let i = 0; i < marks.length; i++) { 9 | map[marks[i].type.name] = marks[i] 10 | } 11 | return map 12 | } 13 | 14 | const getMarksForResolvedPosition = resolvedPosition => { 15 | const marks = resolvedPosition.marks() 16 | return mapFromMarks(marks) 17 | } 18 | 19 | /** 20 | * Get an array of the current active marks 21 | * @param editorState {EditorState} 22 | * @return {{activeMarks: Object, marksInSelection: Object,, marksAtHead: Object, storedMarks: Object}} 23 | */ 24 | export const getCurrentMarks = (editorState) => { 25 | const {$head, empty, from, to} = editorState.selection 26 | 27 | let marksInSelection = {} 28 | 29 | const storedMarks = mapFromMarks(editorState.storedMarks) 30 | const marksAtHead = getMarksForResolvedPosition($head) 31 | 32 | if (!empty) { 33 | editorState.doc.nodesBetween(from, to, (node) => { 34 | node.marks.forEach((mark) => { 35 | marksInSelection[mark.type.name] = mark 36 | }) 37 | }) 38 | } 39 | 40 | const activeMarks = storedMarks ? storedMarks : Object.assign({}, marksInSelection, marksAtHead) 41 | 42 | return { 43 | activeMarks, 44 | marksInSelection, 45 | marksAtHead, 46 | storedMarks 47 | } 48 | } 49 | 50 | /** 51 | * Get the type of node at the selection head 52 | * @param editorState {EditorState} 53 | * @returns {{type: NodeType, attrs: Object}} 54 | */ 55 | export const getNodeTypeAtSelectionHead = (editorState) => { 56 | const {$head} = editorState.selection 57 | const node = $head.node() 58 | 59 | return { 60 | type: node.type, 61 | attrs: node.attrs 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /examples/src/components/RIchTextEditor_104.svelte: -------------------------------------------------------------------------------- 1 | 53 | 54 | 59 | 60 |
61 | 62 | 63 |
64 | 65 |

Last paste event:

66 |
67 |     {pasteData || 'Nothing pasted yet'}
68 | 
69 | 70 |

Total pastes: {numberOfPastes}

71 | 72 | 77 | -------------------------------------------------------------------------------- /state/serialize.js: -------------------------------------------------------------------------------- 1 | import { EditorState } from "prosemirror-state"; 2 | import { DOMSerializer } from "prosemirror-model"; 3 | import { corePlugins } from "../helpers"; 4 | import { multiLineSchema } from "./schemas"; 5 | 6 | /** 7 | * Deserialize an editor state from a JSON object 8 | * @param json JSON representation of the editor state 9 | * @param schema Related schema (defaults to multiline) 10 | * @param plugins Additional plugins 11 | * @returns {instance|EditorState} 12 | */ 13 | export const fromJSON = (json, schema = multiLineSchema, plugins = []) => { 14 | return EditorState.fromJSON({ 15 | schema, plugins: [ 16 | ...corePlugins, 17 | ...plugins 18 | ] 19 | }, json); 20 | } 21 | 22 | /** 23 | * Serialize an editor state to JSON 24 | * @param editorState {EditorState} 25 | * @returns Object 26 | */ 27 | export const toJSON = (editorState) => { 28 | return editorState ? editorState.toJSON() : null; 29 | } 30 | 31 | /** 32 | * Converts editor state to an HTML string 33 | * @param editorState {EditorState} 34 | * @returns {string} 35 | */ 36 | export const toHTML = (editorState) => { 37 | const serializer = DOMSerializer.fromSchema(editorState.schema); 38 | const fragment = serializer.serializeFragment(editorState.doc.content); 39 | const node = document.createElement('div'); 40 | node.append(fragment); 41 | return node.innerHTML; 42 | } 43 | 44 | /** 45 | * Converts the editor state to plain text 46 | * @param editorState {EditorState} 47 | * @return {string} 48 | */ 49 | export const toPlainText = editorState => { 50 | if (editorState.doc.childCount === 0) { 51 | return ''; 52 | } else if (editorState.doc.childCount === 1) { 53 | return editorState.doc.textContent; 54 | } else { 55 | let paragraphs = []; 56 | for (let i = 0; i < editorState.doc.childCount; i++) { 57 | paragraphs.push(editorState.doc.child(i).textContent); 58 | } 59 | return paragraphs.join('\n'); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /examples/src/components/RichTextEditor_105.svelte: -------------------------------------------------------------------------------- 1 | 42 | 43 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 | 59 | 72 | -------------------------------------------------------------------------------- /examples/src/components/RichTextEditor_103.svelte: -------------------------------------------------------------------------------- 1 | 58 | 59 | 64 | 65 |
66 | 67 | 68 | 69 | 70 |
71 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import livereload from 'rollup-plugin-livereload'; 5 | import { terser } from 'rollup-plugin-terser'; 6 | // import css_only from 'rollup-plugin-css-only'; 7 | 8 | const production = !process.env.ROLLUP_WATCH; 9 | 10 | export default { 11 | input: 'examples/src/main.js', 12 | output: { 13 | sourcemap: true, 14 | format: 'iife', 15 | name: 'app', 16 | file: 'examples/public/build/bundle.js' 17 | }, 18 | plugins: [ 19 | // css_only({output: 'example/public/editor.css'}), 20 | 21 | svelte({ 22 | // enable run-time checks when not in production 23 | dev: !production, 24 | // we'll extract any component CSS out into 25 | // a separate file — better for performance 26 | css: css => { 27 | css.write('examples/public/build/bundle.css'); 28 | } 29 | }), 30 | 31 | // If you have external dependencies installed from 32 | // npm, you'll most likely need these plugins. In 33 | // some cases you'll need additional configuration — 34 | // consult the documentation for details: 35 | // https://github.com/rollup/rollup-plugin-commonjs 36 | resolve({ 37 | browser: true, 38 | dedupe: importee => importee === 'svelte' || importee.startsWith('svelte/') 39 | }), 40 | commonjs(), 41 | 42 | // In dev mode, call `npm run start` once 43 | // the bundle has been generated 44 | !production && serve(), 45 | 46 | // Watch the `public` directory and refresh the 47 | // browser on changes when not in production 48 | !production && livereload('examples/public'), 49 | 50 | // If we're building for production (npm run build 51 | // instead of npm run dev), minify 52 | production && terser() 53 | ], 54 | watch: { 55 | clearScreen: false 56 | } 57 | }; 58 | 59 | function serve() { 60 | let started = false; 61 | 62 | return { 63 | writeBundle() { 64 | if (!started) { 65 | started = true; 66 | 67 | require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { 68 | stdio: ['ignore', 'inherit', 'inherit'], 69 | shell: true 70 | }); 71 | } 72 | } 73 | }; 74 | } 75 | -------------------------------------------------------------------------------- /state/create.js: -------------------------------------------------------------------------------- 1 | import { EditorState, TextSelection } from "prosemirror-state"; 2 | import { DOMParser, DOMSerializer } from "prosemirror-model"; 3 | import { singleLineSchema, multiLineSchema, richTextSchema } from "./schemas"; 4 | import { corePlugins } from '../helpers/plugins'; 5 | import { richTextPlugins } from "../helpers" 6 | 7 | /** 8 | * Create an empty editor state, for a single-line editor schema 9 | * @return {EditorState} 10 | */ 11 | export const createSingleLineEditor = (content = "", plugins = []) => { 12 | 13 | const doc = content ? singleLineSchema.node("doc", null, [ 14 | singleLineSchema.text(content) 15 | ]) : undefined; 16 | 17 | const selection = doc ? TextSelection.atEnd(doc) : undefined; 18 | 19 | return EditorState.create({ 20 | schema: singleLineSchema, 21 | doc, 22 | selection, 23 | plugins: [ 24 | ...plugins, 25 | ...corePlugins 26 | ] 27 | }); 28 | } 29 | 30 | /** 31 | * Create an empty editor state, for a multi-line editor schema 32 | * @param content {string} 33 | * @param plugins {array} 34 | * @return {EditorState} 35 | */ 36 | export const createMultiLineEditor = (content = "", plugins = []) => { 37 | let doc, selection; 38 | 39 | if (content) { 40 | const paragraphs = content.split('\n'); 41 | doc = multiLineSchema.node("doc", null, 42 | paragraphs.map(paragraph => { 43 | return multiLineSchema.node("paragraph", null, 44 | paragraph ? [multiLineSchema.text(paragraph)] : null 45 | ) 46 | }) 47 | ); 48 | selection = TextSelection.atEnd(doc); 49 | } 50 | 51 | return EditorState.create({ 52 | schema: multiLineSchema, 53 | doc, 54 | selection, 55 | plugins: [ 56 | ...corePlugins, 57 | ...plugins 58 | ] 59 | }); 60 | } 61 | 62 | /** 63 | * Parses an html string to create a document from it 64 | * @param schema {Schema} 65 | * @param html {string} 66 | * @returns {Document} 67 | */ 68 | const createDocumentFromHtml = (schema, html) => { 69 | const parser = DOMParser.fromSchema(schema); 70 | const node = document.createElement('div'); 71 | node.innerHTML = html; 72 | return parser.parse(node); 73 | } 74 | 75 | /** 76 | * Create an empty editor state with rich text editing capabilities 77 | * @param html {string} 78 | * @param plugins {array} 79 | * @return {EditorState} 80 | */ 81 | export const createRichTextEditor = (html = "", plugins = []) => { 82 | let doc, selection; 83 | 84 | if (html) { 85 | doc = createDocumentFromHtml(richTextSchema, html); 86 | selection = TextSelection.atEnd(doc); 87 | } 88 | 89 | return EditorState.create({ 90 | schema: richTextSchema, 91 | doc, 92 | selection, 93 | plugins: [ 94 | ...corePlugins, 95 | ...richTextPlugins, 96 | ...plugins 97 | ] 98 | }); 99 | } 100 | -------------------------------------------------------------------------------- /examples/public/global.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | body { 8 | color: rgb(68, 68, 68); 9 | margin: 0; 10 | padding: 8px; 11 | box-sizing: border-box; 12 | font-family: "Overpass Light", sans-serif; 13 | font-weight: lighter; 14 | } 15 | 16 | h1, h2, h3, h4, h5, h6 { 17 | margin: 0; 18 | } 19 | 20 | h1 { 21 | font-size: 1.8em; 22 | font-weight: normal; 23 | text-transform: uppercase; 24 | } 25 | 26 | h2 { 27 | font-size: 1.3em; 28 | font-weight: normal; 29 | } 30 | 31 | h3 { 32 | font-size: 1.25em; 33 | font-weight: bold; 34 | border-bottom: 1px solid orangered; 35 | } 36 | 37 | h4 { 38 | font-size: .9em; 39 | font-weight: normal; 40 | color: #adadad; 41 | } 42 | 43 | p { 44 | margin: .75em 0 .5em; 45 | } 46 | 47 | p:first-child { 48 | margin-top: 0; 49 | margin-block-start: 0; 50 | } 51 | 52 | p:last-child { 53 | margin-bottom: 0; 54 | margin-block-end: 0; 55 | } 56 | 57 | a { 58 | color: orangered; 59 | text-decoration: none; 60 | } 61 | 62 | a:hover { 63 | text-decoration: underline; 64 | } 65 | 66 | a:visited { 67 | } 68 | 69 | label { 70 | display: block; 71 | } 72 | 73 | input, button, select, textarea { 74 | font-family: inherit; 75 | font-size: inherit; 76 | padding: 0.4em; 77 | margin: 0 0 0.5em 0; 78 | box-sizing: border-box; 79 | border: 1px solid #ccc; 80 | border-radius: 2px; 81 | } 82 | 83 | input:disabled { 84 | color: #ccc; 85 | } 86 | 87 | input[type="range"] { 88 | height: 0; 89 | } 90 | 91 | button { 92 | color: rgba(255, 255, 255, .7); 93 | background-color: orangered; 94 | outline: none; 95 | border: none; 96 | border-radius: .25em; 97 | padding: .25em .5em; 98 | } 99 | 100 | button:not(:disabled):active { 101 | } 102 | 103 | button:hover { 104 | color: white; 105 | cursor: pointer; 106 | } 107 | 108 | button:focus { 109 | color: white; 110 | } 111 | 112 | button:disabled { 113 | color: #adadad; 114 | background-color: #777; 115 | cursor: auto; 116 | } 117 | 118 | button.editor { 119 | background-color: white; 120 | color: rgb(68, 68, 68); 121 | } 122 | 123 | button.editor:hover { 124 | color: rgb(68, 68, 68); 125 | cursor: pointer; 126 | } 127 | 128 | button.editor:focus { 129 | color: rgb(68, 68, 68); 130 | } 131 | 132 | button.editor.active { 133 | color: steelblue; 134 | } 135 | 136 | div.controls { 137 | margin: 1em .5em 1em; 138 | } 139 | 140 | div.mirror { 141 | margin-top: 1em; 142 | white-space: pre-line; 143 | overflow-wrap: break-spaces; 144 | } 145 | 146 | label { 147 | margin-top: .5em; 148 | } 149 | 150 | pre { 151 | max-height: 20em; 152 | overflow-y: auto; 153 | overflow-x: hidden; 154 | border-bottom: 2px solid orangered; 155 | border-top: 2px solid orangered; 156 | } 157 | 158 | .ui-editor { 159 | box-sizing: border-box; 160 | background-color: transparent; 161 | padding: 1em; 162 | border: 1px solid #efefef; 163 | border-radius: .5em; 164 | display: inline-block; 165 | font: inherit; 166 | text-rendering: optimizeLegibility; 167 | white-space: pre-line; 168 | overflow-wrap: break-spaces; 169 | vertical-align: top; 170 | width: 100%; 171 | min-height: 1.25rem; 172 | outline: none; 173 | } 174 | -------------------------------------------------------------------------------- /examples/src/App.svelte: -------------------------------------------------------------------------------- 1 | 55 | 56 |
57 | 58 |
59 |

Prosemirror-Svelte

60 | 61 |
62 | 63 | ProseMirror bindings for 64 | 65 |
66 |
67 | 68 |
69 | 70 |

{examples[selectedExample].title}

71 | 72 | 79 | 80 |
81 | 82 |

{examples[selectedExample].subtitle}

83 | 84 | 85 | 86 |
87 | 88 | 132 | -------------------------------------------------------------------------------- /examples/src/components/RichTextEditor_102.svelte: -------------------------------------------------------------------------------- 1 | 63 | 64 | 69 | 70 |
71 | 72 | 73 | 74 | 77 | 78 | 82 | 83 | 86 | 87 | 90 | 91 | 94 | 95 |
96 | 97 |
98 | 99 | Additional information about the current editor instance: 100 | 101 |
    102 | 103 | 104 |
  • Active marks: {activeMarks && activeMarks.length ? activeMarks.toString() : 'none'}
  • 105 | 106 | 107 |
  • 108 | Type of node at selection head: {activeBlockType} 109 |
  • 110 | 111 |
112 | 113 |

114 | 117 |

118 | 119 |
120 | 121 | {#if showEditorState} 122 |
{JSON.stringify(toJSON(editorState), null, 2)}
123 | {/if} 124 | 125 | -------------------------------------------------------------------------------- /helpers/keymap.js: -------------------------------------------------------------------------------- 1 | import { 2 | wrapIn, setBlockType, chainCommands, toggleMark, exitCode, 3 | joinUp, joinDown, lift, selectParentNode 4 | } from "prosemirror-commands"; 5 | import { wrapInList, splitListItem, liftListItem, sinkListItem } from "prosemirror-schema-list"; 6 | import { undo, redo } from "prosemirror-history"; 7 | import { undoInputRule } from "prosemirror-inputrules"; 8 | import { richTextSchema } from "../state/schemas" 9 | import { keymap } from "prosemirror-keymap" 10 | 11 | const mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; 12 | 13 | const addKey = (keyMap, name, combo, command) => { 14 | if (!keyMap[name]) keyMap[name] = []; 15 | keyMap[name].push({combo, command}); 16 | } 17 | 18 | const createKeyMapConfiguration = (schema) => { 19 | let config = {} 20 | 21 | addKey(config, 'undo', "Mod-z", undo) 22 | 23 | addKey(config, "redo", "Shift-Mod-z", redo); 24 | addKey(config, "undoInputRule", "Backspace", undoInputRule); 25 | 26 | if (!mac) addKey(config, "redo", "Mod-y", redo); 27 | 28 | addKey(config, "joinUp", "Alt-ArrowUp", joinUp); 29 | addKey(config, "joinDown", "Alt-ArrowDown", joinDown); 30 | addKey(config, "lift", "Mod-BracketLeft", lift); 31 | addKey(config, "selectParentNode", "Escape", selectParentNode); 32 | 33 | if (!!schema.marks.strong) { 34 | addKey(config, "toggleMarkStrong", "Mod-b", toggleMark(schema.marks.strong)); 35 | addKey(config, "toggleMarkStrong", "Mod-B", toggleMark(schema.marks.strong)); 36 | } 37 | 38 | if (!!schema.marks.em) { 39 | addKey(config, "toggleMarkEm", "Mod-i", toggleMark(schema.marks.em)); 40 | addKey(config, "toggleMarkEm", "Mod-I", toggleMark(schema.marks.em)); 41 | } 42 | if (!!schema.marks.code) 43 | addKey(config, "toggleMarkCode", "Mod-`", toggleMark(schema.marks.code)); 44 | 45 | if (!!schema.nodes.bullet_list) 46 | addKey(config, "wrapInListUnordered", "Shift-Ctrl-8", wrapInList(schema.nodes.bullet_list)); 47 | 48 | if (!!schema.nodes.ordered_list) 49 | addKey(config, "wrapInListOrdered", "Shift-Ctrl-9", wrapInList(schema.nodes.ordered_list)); 50 | 51 | if (!!schema.nodes.blockquote) 52 | addKey(config, "wrapInBlockquote", "Ctrl->", wrapIn(schema.nodes.blockquote)); 53 | 54 | if (!!schema.nodes.hard_break) { 55 | let br = schema.nodes.hard_break 56 | const cmd = chainCommands(exitCode, (state, dispatch) => { 57 | dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView()) 58 | return true 59 | }) 60 | 61 | addKey(config, "hardBreak", "Mod-Enter", cmd); 62 | addKey(config, "hardBreak", "Shift-Enter", cmd); 63 | if (mac) addKey(config, "hardBreak", "Ctrl-Enter", cmd); 64 | } 65 | 66 | if (!!schema.nodes.list_item) { 67 | addKey(config, "splitListItem", "Enter", splitListItem(schema.nodes.list_item)); 68 | addKey(config, "liftListItem", "Mod-[", liftListItem(schema.nodes.list_item)); 69 | addKey(config, "sinkListItem", "Mod-]", sinkListItem(schema.nodes.list_item)); 70 | } 71 | if (!!schema.nodes.paragraph) 72 | addKey(config, "setBlockTypeParagraph", "Shift-Ctrl-0", setBlockType(schema.nodes.paragraph)); 73 | 74 | if (!!schema.nodes.code_block) 75 | addKey(config, "setBlockTypeCode", "Shift-Ctrl-\\", setBlockType(schema.nodes.code_block)); 76 | 77 | if (!!schema.nodes.heading) 78 | for (let i = 1; i <= 6; i++) { 79 | addKey(config, `setHeading${i}`, `Shift-Ctrl-${i}`, setBlockType(schema.nodes.heading, {level: i})); 80 | } 81 | 82 | if (!!schema.nodes.horizontal_rule) { 83 | addKey(config, "insertHorizontalRuler", "Mod-_", (state, dispatch) => { 84 | let hr = schema.nodes.horizontal_rule; 85 | dispatch(state.tr.replaceSelectionWith(hr.create()).scrollIntoView()); 86 | return true; 87 | }) 88 | } 89 | 90 | return config 91 | } 92 | 93 | const getKeyMapFromConfig = (config) => { 94 | const keys = Object.keys(config); 95 | let bindings = {}; 96 | keys.forEach(key => { 97 | config[key].forEach(entry => { 98 | bindings[entry.combo] = entry.command; 99 | }) 100 | }) 101 | return keymap(bindings); 102 | } 103 | 104 | const richTextKeyMapConfiguration = createKeyMapConfiguration(richTextSchema); 105 | export const richTextKeyMapPlugin = getKeyMapFromConfig(richTextKeyMapConfiguration); 106 | -------------------------------------------------------------------------------- /state/transform.js: -------------------------------------------------------------------------------- 1 | import {EditorState, TextSelection, AllSelection} from "prosemirror-state"; 2 | import * as commands from "prosemirror-commands"; 3 | 4 | /** 5 | * Basic implementation to split the editor state at the current selection 6 | * @param editorState 7 | * @return {EditorState} 8 | */ 9 | export const split = editorState => { 10 | const transaction = editorState.tr; 11 | 12 | transaction.split(editorState.selection.from); 13 | 14 | // if text is selected split before and after the text 15 | if (!editorState.selection.empty) { 16 | transaction.split(transaction.mapping.map(editorState.selection.to)); 17 | } 18 | 19 | return editorState.apply(transaction); 20 | }; 21 | 22 | /** 23 | * Apply a selection to the editor state 24 | * @param editorState {EditorState} 25 | * @param from {number} 26 | * @param to {number} 27 | */ 28 | export const selectText = (editorState, from, to) => { 29 | const selection = TextSelection.create(editorState.doc, from, to); 30 | const transaction = editorState.tr; 31 | transaction.setSelection(selection); 32 | return editorState.apply(transaction); 33 | }; 34 | 35 | /** 36 | * Clear the given editor state (keeping the history) 37 | * @param editorState 38 | * @returns {EditorState} 39 | */ 40 | export const clear = (editorState) => { 41 | const selection = new AllSelection(editorState.doc); 42 | const transaction = editorState.tr; 43 | transaction.setSelection(selection); 44 | transaction.deleteSelection().scrollIntoView(); 45 | return editorState.apply(transaction); 46 | }; 47 | 48 | /** 49 | * Select all content of the given editor state 50 | * @param editorState 51 | * @returns {EditorState} 52 | */ 53 | export const selectAll = (editorState) => { 54 | const selection = new AllSelection(editorState.doc); 55 | const transaction = editorState.tr; 56 | transaction.setSelection(selection); 57 | return editorState.apply(transaction); 58 | }; 59 | 60 | /** 61 | * Delete the current selection 62 | * @param editorState 63 | * @returns {EditorState} 64 | */ 65 | export const deleteSelection = (editorState) => { 66 | if (editorState.selection.empty) return editorState; 67 | const transaction = editorState.tr; 68 | transaction.deleteSelection().scrollIntoView(); 69 | return editorState.apply(transaction); 70 | }; 71 | 72 | /** 73 | * Replace text at the given positions with a new text 74 | * @param editorState {EditorState} The current editor state 75 | * @param from {number} Start position for replacing the text 76 | * @param to {number} End position for replacing the text 77 | * @param newText {string} New text to insert 78 | * @param setSelection {boolean} Update the selection to select the changed content 79 | * @return {EditorState} 80 | */ 81 | export const replaceTextAtPosition = (editorState, from, to, newText, setSelection = false) => { 82 | const transaction = editorState.tr; 83 | 84 | transaction.replaceWith(from, to, editorState.schema.text(newText)); 85 | 86 | if (setSelection) { 87 | const selection = TextSelection.create(transaction.doc, from, from + newText.length); 88 | transaction.setSelection(selection); 89 | } 90 | 91 | return editorState.apply(transaction); 92 | }; 93 | 94 | /** 95 | * Toggle the Mark for the given editor state 96 | * @param editorState {EditorState} 97 | * @param type {String} 98 | * @param attrs {Object} 99 | * @returns {EditorState} 100 | */ 101 | export const toggleMark = (editorState, type, attrs = null) => { 102 | let newEditorState; 103 | 104 | const markType = editorState.schema.marks[type]; 105 | const dispatch = tr => newEditorState = editorState.apply(tr); 106 | 107 | if (commands.toggleMark(markType, attrs)(editorState, dispatch)) return newEditorState; 108 | else return editorState; 109 | }; 110 | 111 | /** 112 | * Toggle the bold (strong) Mark for the given editor state 113 | * @param editorState {EditorState} 114 | * @returns {EditorState} 115 | */ 116 | export const toggleBold = (editorState) => { 117 | return toggleMark(editorState, "strong", null); 118 | }; 119 | 120 | /** 121 | * Toggle the italic (em) Mark for the given editor state 122 | * @param editorState {EditorState} 123 | * @returns {EditorState} 124 | */ 125 | export const toggleItalic = (editorState) => { 126 | return toggleMark(editorState, "em", null); 127 | }; 128 | 129 | /** 130 | * Set the block type for the given editor state 131 | * @param editorState {EditorState} 132 | * @param type {String} 133 | * @param attrs {Object} 134 | * @returns {EditorState} 135 | */ 136 | export const setBlockType = (editorState, type, attrs) => { 137 | let newEditorState; 138 | 139 | const nodeType = editorState.schema.nodes[type]; 140 | const dispatch = tr => newEditorState = editorState.apply(tr); 141 | 142 | if (commands.setBlockType(nodeType, attrs)(editorState, dispatch)) return newEditorState; 143 | else return editorState; 144 | }; 145 | 146 | /** 147 | * 148 | * @param editorState {EditorState} 149 | * @param attrs {Object} 150 | * @param from {number|null} 151 | * @param to {number|null} 152 | * @returns {EditorState} 153 | */ 154 | export const insertImage = (editorState, attrs, from = null, to = null) => { 155 | 156 | if (from === null) from = editorState.selection.anchor; 157 | if (to === null) to = editorState.selection.head; 158 | 159 | const imageNode = editorState.schema.nodes.image.create(attrs); 160 | 161 | const transaction = editorState.tr; 162 | transaction.replaceWith(from, to, imageNode); 163 | 164 | return editorState.apply(transaction); 165 | }; 166 | -------------------------------------------------------------------------------- /ProsemirrorEditor.svelte: -------------------------------------------------------------------------------- 1 | 107 | 108 |
118 | 119 | 195 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Prosemirror Svelte 2 | [Svelte](https://svelte.dev) bindings for the [Prosemirror editor](https://prosemirror.net/). 3 | 4 | The key motivation of this component is to provide a gentle wrapper around prosemirror - while trying to embrace its 5 | core concept (such as the EditorState and Transactions). 6 | 7 | If you only need a basic editor you can use the included helpers to create your editor state (see below). They will get you started with a working single-line or multi-line editor. 8 | If you are in need of rich-text editing, I strongly recommend to implement you custom schema. You may 9 | also use the schema provided by prosemirror-basic-schema, of course. In case you are just getting started with Prosemirror and want to see a working implementation, have a look at the [examples](examples). 10 | 11 | Note: Before the release of version 1.0, the API (especially of the helpers) will be undergoing changes. The same applies to this documentation. 12 | 13 | ## Installation 14 | 15 | ```bash 16 | yarn add prosemirror-svelte 17 | ``` 18 | 19 | or 20 | ```bash 21 | npm install --save prosemirror-svelte 22 | ``` 23 | 24 | ## Essential usage 25 | 26 | ```html 27 | 46 | 47 | 52 | ``` 53 | 54 | ## Props 55 | - **editorState** [[EditorState](https://prosemirror.net/docs/ref/#state.EditorState)]: 56 | The state of the editor. If no state is provided, the component will create a very basic single-line editor state with some core plugins (e.g. key bindings) 57 | - **placeholder** [String]: Placeholder text which is shown if the editor is empty 58 | - **className** [String]: CSS class to be used for the container div on which the Prosemirror editor will be mounted. Defaults to "ui-editor". 59 | - **debounceChangeEventsInterval** [Number]: Advanced setting to set how often change events are emitted. In milliseconds. Defaults to 50(ms). 60 | 61 | ## Props intended to be bound 62 | The following two props are intended to be used with bind:editor={yourVariable}. Don't change them in your code. 63 | - **view** [[EditorView](https://prosemirror.net/docs/ref/#view.EditorView)]: reference to the Prosemirror editor view 64 | - **editor** [HTMLDivElement]: Reference to the DOM element on which the prosemirror editor is mounted 65 | 66 | ## Instance functions 67 | - **focus**: Focus the editor. It's recommended to use this function instead of focusing the DOM node directly (to ensure the proper selection is applied to your editor) 68 | - **blur**: Blur the editor 69 | 70 | ## Events 71 | - **change**: Emitted when the content of the editor has changed (not when the selection changes). Also, by default, it is debounced by 50ms. This behavior can be altered with the "debounceChangeEventsInterval" prop. 72 | The new state of the editor can be found in event.detail.editorState 73 | - **transaction**: Emitted whenever a transaction is executed on the editor view. This includes changes to the selection. event.detail contains four fields: 74 | - view [EditorView]: Reference to the editor view 75 | - editorState [EditorState]: Reference to the new editor state 76 | - isDirty [boolean]: Whether the component has changes which need to be dispatched via change event 77 | - contentHasChanged[boolean]: Whether the document content has changed (via !editorState.doc.eq(view.state.doc)) 78 | - **focus**: (Forwarded) focus event 79 | - **blur**: (Forwarded) blur event 80 | - **keydown**: (Forwarded) keydown event 81 | 82 | To support the plugin system provided by Prosemirror, the component also listens for events of type "custom". If such an event is submitted by a plugin, the component will look for a "type" attribute on the event.detail and then dispatch a new event of that type (essentially forwarding the event from native DOM into the Svelte world). 83 | 84 | ## Example 85 | The example app which is included in the repository can be also be found here: http://prosemirror-svelte.surge.sh 86 | 87 | ## State helper methods 88 | ```JS 89 | import { ... } from 'prosemirror-svelte/state'; 90 | ``` 91 | ### Creating and serializing editor state 92 | - **createSingleLineEditor** [(content = "", plugins = []) -> EditorState]: Creates an editor state with a single-line schema and optional text content 93 | - **createMultiLineEditor** [(content = "", plugins = []) -> EditorState]: Creates an editor state with a multi-line schema and optional text content 94 | - **createRichTextEditor** [(html = "", plugins = []) -> EditorState]: Creates an editor state with a rich text schema which can be initialized with HTML content 95 | - **toHTML** [(EditorState)->String]: Returns the HTML representation of the given editor state 96 | - **toPlainText** [(EditorState)->String]: Returns the plain text representation of the given editor state 97 | - **toJSON** [(EditorState)->Object]: Serialize the editor state as JSON 98 | - **fromJSON** [(json, schema = multiLineSchema, plugins = corePlugins)]: Create editor state from a JSON object 99 | 100 | ### Modifying editor state 101 | - **split** [(EditorState) -> EditorState]: splits the text at the current selection. If the selection is not collapsed, it will be split around it. 102 | - **selectText** [(editorState: EditorState, from: number, to: number) => EditorState]: returns a new editor state with the the selection around from and to. 103 | - **clear** [(EditorState) -> EditorState]: returns a new editor state where all content was removed. 104 | - **selectAll** [(EditorState) -> EditorState]: returns a new editor state with all text selected. 105 | - **deleteSelection** [(EditorState) -> EditorState]: returns a new editor state where the selection was deleted. 106 | - **replaceTextAtPosition** [(editorState: EditorState, from: Number, to: Number, newText: String, setSelection: Boolean = false) -> EditorState]: returns a new editor state where the text between "from" and "to" was replaced by a new one, optionally setting a selection for that inserted text. 107 | - **toggleMark** [(editorState: EditorState, type: String, attrs) -> EditorState]: Toggle the mark of the given type for the current selection (or sets the stored marks if the selection is collapsed) 108 | - **toggleBold** [(EditorState) -> EditorState]: Specialized version of toggleMark to toggle the "strong" mark 109 | - **toggleItalic** [(EditorState) -> EditorState]: Specialized version of toggleMark to toggle the "em" mark 110 | - **setBlockType** [(editorState: EditorState, type: String, attrs: Object) -> EditorState]: Set the block type for the current selection 111 | 112 | ## General helpers 113 | ```JS 114 | import { ... } from 'prosemirror-svelte/helpers'; 115 | ``` 116 | 117 | ### Getting meta information about the current state 118 | - **getNodeTypeAtSelectionHead** [(editorState: EditorState)->{type:NodeType, attrs: Object}]: Returns the type of node at the head of the current selection, e.g. for activating menu buttons 119 | - **getCurrentMarks** [(editorState: EditorState)-> {{activeMarks: Object, marksInSelection: Object, marksAtHead: Object, storedMarks: Object}}]: Returns information about the marks inside the current selection (i.e. whether the text is marked as bold or italic). *Active marks* is what you might want to use for setting menu buttons active/inactive. Have a look at the examples to guide you in the right direction. 120 | 121 | ### Plugins 122 | - **corePlugins** 123 | - **richTextKeyMapPlugin** 124 | 125 | ## License 126 | [MIT](LICENSE) 127 | -------------------------------------------------------------------------------- /examples/public/build/examples/public/build/bundle.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "bundle.css", 4 | "sources": [ 5 | "../../../ProsemirrorEditor.svelte", 6 | "../../../App.svelte", 7 | "../../../RichTextEditor_104.svelte", 8 | "../../../RichTextEditor_105.svelte" 9 | ], 10 | "sourcesContent": [ 11 | "\n\n
\n\n\n", 12 | "\n\n
\n\n
\n

Prosemirror-Svelte

\n\n
\n \n ProseMirror bindings for\n \n
\n
\n\n
\n\n

{examples[selectedExample].title}

\n\n \n\n
\n\n

{examples[selectedExample].subtitle}

\n\n \n\n
\n\n\n", 13 | "\n\n\n\n
\n \n \n
\n\n

Last paste event:

\n
\n    {pasteData || 'Nothing pasted yet'}\n
\n\n

Total pastes: {numberOfPastes}

\n\n\n", 14 | "\n\n\n\n
\n \n \n\n \n\n \n\n
\n\n\n" 15 | ], 16 | "names": [], 17 | "mappings": "AAwHU,IAAI,AAAE,CAAC,AACb,sBAAsB,CAAE,OAAO,AACjC,CAAC,AAEO,YAAY,AAAE,CAAC,AACrB,QAAQ,CAAE,QAAQ,AACpB,CAAC,AAEO,YAAY,AAAE,CAAC,AACrB,SAAS,CAAE,UAAU,CACrB,WAAW,CAAE,QAAQ,CACrB,8BAA8B,CAAE,IAAI,CACpC,sBAAsB,CAAE,IAAI,AAC9B,CAAC,AAUO,uCAAuC,AAAE,CAAC,AAChD,UAAU,CAAE,WAAW,AACzB,CAAC,AAEO,4CAA4C,AAAE,CAAC,AACrD,UAAU,CAAE,WAAW,AACzB,CAAC,AAEO,0BAA0B,AAAE,CAAC,AACnC,WAAW,CAAE,WAAW,AAC1B,CAAC,AAEO,yBAAyB,AAAE,CAAC,AAClC,OAAO,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,AACzB,CAAC,AAIO,2BAA2B,AAAE,CAAC,AACpC,OAAO,CAAE,IAAI,AACf,CAAC,AAEO,iCAAiC,AAAE,CAAC,AAC1C,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,KAAK,CACX,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CACT,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CACtB,cAAc,CAAE,IAAI,AACtB,CAAC,AAEO,gCAAgC,AAAE,CAAC,AACzC,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,AACd,CAAC,AAEO,sCAAsC,AAAE,CAAC,AAC/C,KAAK,CAAE,IAAI,AACb,CAAC,AAEO,iCAAiC,AAAE,CAAC,AAC1C,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,gBAAgB,CAAC,CAC/B,cAAc,CAAE,IAAI,CACpB,KAAK,CAAE,IAAI,sBAAsB,CAAC,AACpC,CAAC;ACtGD,OAAO,cAAC,CAAC,AACP,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,aAAa,CAC9B,SAAS,CAAE,IAAI,CACf,aAAa,CAAE,GAAG,AACpB,CAAC,AAED,UAAU,cAAC,CAAC,AACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,SAAS,CAAE,MAAM,AACnB,CAAC,AAED,eAAe,cAAC,CAAC,AACf,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,aAAa,AAChC,CAAC,AAED,IAAI,cAAC,CAAC,AACJ,OAAO,CAAE,GAAG,CACZ,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,CAAC,CAAC,IAAI,AAChB,CAAC,AAMD,EAAE,cAAC,CAAC,AACF,aAAa,CAAE,GAAG,AACpB,CAAC,AAED,KAAK,cAAC,CAAC,AACL,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,AACnB,CAAC;ACxDD,GAAG,eAAC,CAAC,AACH,OAAO,CAAE,IAAI,AACf,CAAC;ACfD,oBAAM,CAAE,KAAK,cAAC,CAAC,AACb,MAAM,CAAE,IAAI,AACd,CAAC,AAED,KAAK,cAAC,CAAC,AACL,OAAO,CAAE,IAAI,AACf,CAAC,AAEO,cAAc,AAAE,CAAC,AACvB,SAAS,CAAE,KAAK,AAClB,CAAC" 18 | } -------------------------------------------------------------------------------- /examples/public/build/bundle.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "bundle.css", 4 | "sources": [ 5 | "../../../App.svelte", 6 | "../../../RichTextEditor_105.svelte", 7 | "../../../RichTextEditor_104.svelte", 8 | "../../../ProsemirrorEditor.svelte" 9 | ], 10 | "sourcesContent": [ 11 | "\n\n
\n\n
\n

Prosemirror-Svelte

\n\n
\n \n ProseMirror bindings for\n \n
\n
\n\n
\n\n

{examples[selectedExample].title}

\n\n \n\n
\n\n

{examples[selectedExample].subtitle}

\n\n \n\n
\n\n\n", 12 | "\n\n\n\n
\n \n \n\n \n\n \n\n
\n\n\n", 13 | "\n\n\n\n
\n \n \n
\n\n

Last paste event:

\n
\n    {pasteData || 'Nothing pasted yet'}\n
\n\n

Total pastes: {numberOfPastes}

\n\n\n", 14 | "\n\n
\n\n\n" 15 | ], 16 | "names": [], 17 | "mappings": "AAyFE,OAAO,cAAC,CAAC,AACP,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,aAAa,CAC9B,SAAS,CAAE,IAAI,CACf,aAAa,CAAE,GAAG,AACpB,CAAC,AAED,UAAU,cAAC,CAAC,AACV,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,SAAS,CAAE,MAAM,AACnB,CAAC,AAED,eAAe,cAAC,CAAC,AACf,OAAO,CAAE,IAAI,CACb,cAAc,CAAE,GAAG,CACnB,WAAW,CAAE,MAAM,CACnB,eAAe,CAAE,aAAa,AAChC,CAAC,AAED,IAAI,cAAC,CAAC,AACJ,OAAO,CAAE,GAAG,CACZ,SAAS,CAAE,IAAI,CACf,MAAM,CAAE,CAAC,CAAC,IAAI,AAChB,CAAC,AAMD,EAAE,cAAC,CAAC,AACF,aAAa,CAAE,GAAG,AACpB,CAAC,AAED,KAAK,cAAC,CAAC,AACL,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,AACnB,CAAC;ACrED,oBAAM,CAAE,KAAK,cAAC,CAAC,AACb,MAAM,CAAE,IAAI,AACd,CAAC,AAED,KAAK,cAAC,CAAC,AACL,OAAO,CAAE,IAAI,AACf,CAAC,AAEO,cAAc,AAAE,CAAC,AACvB,SAAS,CAAE,KAAK,AAClB,CAAC;ACGD,GAAG,eAAC,CAAC,AACH,OAAO,CAAE,IAAI,AACf,CAAC;AC0CO,IAAI,AAAE,CAAC,AACb,sBAAsB,CAAE,OAAO,AACjC,CAAC,AAEO,YAAY,AAAE,CAAC,AACrB,QAAQ,CAAE,QAAQ,AACpB,CAAC,AAEO,YAAY,AAAE,CAAC,AACrB,SAAS,CAAE,UAAU,CACrB,WAAW,CAAE,QAAQ,CACrB,8BAA8B,CAAE,IAAI,CACpC,sBAAsB,CAAE,IAAI,AAC9B,CAAC,AAEO,YAAY,AAAC,CAAC,GAAG,AAAC,CAAC,AACzB,WAAW,CAAE,QAAQ,AACvB,CAAC,AAEO,YAAY,AAAC,CAAC,EAAE,AAAC,CAAC,AACxB,QAAQ,CAAE,QAAQ,AACpB,CAAC,AAEO,uCAAuC,AAAE,CAAC,AAChD,UAAU,CAAE,WAAW,AACzB,CAAC,AAEO,4CAA4C,AAAE,CAAC,AACrD,UAAU,CAAE,WAAW,AACzB,CAAC,AAEO,0BAA0B,AAAE,CAAC,AACnC,WAAW,CAAE,WAAW,AAC1B,CAAC,AAEO,yBAAyB,AAAE,CAAC,AAClC,OAAO,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,AACzB,CAAC,AAIO,2BAA2B,AAAE,CAAC,AACpC,OAAO,CAAE,IAAI,AACf,CAAC,AAEO,iCAAiC,AAAE,CAAC,AAC1C,OAAO,CAAE,EAAE,CACX,QAAQ,CAAE,QAAQ,CAClB,IAAI,CAAE,KAAK,CACX,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CACT,MAAM,CAAE,IAAI,CACZ,MAAM,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CACtB,cAAc,CAAE,IAAI,AACtB,CAAC,AAEO,gCAAgC,AAAE,CAAC,AACzC,QAAQ,CAAE,QAAQ,CAClB,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,AACd,CAAC,AAEO,sCAAsC,AAAE,CAAC,AAC/C,KAAK,CAAE,IAAI,AACb,CAAC,AAEO,iCAAiC,AAAE,CAAC,AAC1C,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,gBAAgB,CAAC,CAC/B,cAAc,CAAE,IAAI,CACpB,KAAK,CAAE,IAAI,sBAAsB,CAAC,AACpC,CAAC" 18 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.5.5": 6 | version "7.14.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" 8 | integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== 9 | dependencies: 10 | "@babel/highlight" "^7.14.5" 11 | 12 | "@babel/helper-validator-identifier@^7.14.5": 13 | version "7.15.7" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" 15 | integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== 16 | 17 | "@babel/highlight@^7.14.5": 18 | version "7.14.5" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" 20 | integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.14.5" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@polka/url@^0.5.0": 27 | version "0.5.0" 28 | resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" 29 | integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== 30 | 31 | "@rollup/plugin-commonjs@^11.0.0": 32 | version "11.1.0" 33 | resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz#60636c7a722f54b41e419e1709df05c7234557ef" 34 | integrity sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA== 35 | dependencies: 36 | "@rollup/pluginutils" "^3.0.8" 37 | commondir "^1.0.1" 38 | estree-walker "^1.0.1" 39 | glob "^7.1.2" 40 | is-reference "^1.1.2" 41 | magic-string "^0.25.2" 42 | resolve "^1.11.0" 43 | 44 | "@rollup/plugin-node-resolve@^6.0.0": 45 | version "6.1.0" 46 | resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz#0d2909f4bf606ae34d43a9bc8be06a9b0c850cf0" 47 | integrity sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA== 48 | dependencies: 49 | "@rollup/pluginutils" "^3.0.0" 50 | "@types/resolve" "0.0.8" 51 | builtin-modules "^3.1.0" 52 | is-module "^1.0.0" 53 | resolve "^1.11.1" 54 | 55 | "@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.0.8": 56 | version "3.1.0" 57 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" 58 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== 59 | dependencies: 60 | "@types/estree" "0.0.39" 61 | estree-walker "^1.0.1" 62 | picomatch "^2.2.2" 63 | 64 | "@types/estree@*": 65 | version "0.0.50" 66 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" 67 | integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== 68 | 69 | "@types/estree@0.0.39": 70 | version "0.0.39" 71 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 72 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== 73 | 74 | "@types/node@*": 75 | version "16.10.2" 76 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" 77 | integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== 78 | 79 | "@types/resolve@0.0.8": 80 | version "0.0.8" 81 | resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" 82 | integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== 83 | dependencies: 84 | "@types/node" "*" 85 | 86 | acorn@^7.1.0: 87 | version "7.4.1" 88 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 89 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 90 | 91 | ansi-styles@^3.2.1: 92 | version "3.2.1" 93 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 94 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 95 | dependencies: 96 | color-convert "^1.9.0" 97 | 98 | anymatch@~3.1.2: 99 | version "3.1.2" 100 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 101 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 102 | dependencies: 103 | normalize-path "^3.0.0" 104 | picomatch "^2.0.4" 105 | 106 | at-least-node@^1.0.0: 107 | version "1.0.0" 108 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 109 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 110 | 111 | balanced-match@^1.0.0: 112 | version "1.0.2" 113 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 114 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 115 | 116 | binary-extensions@^2.0.0: 117 | version "2.2.0" 118 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 119 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 120 | 121 | brace-expansion@^1.1.7: 122 | version "1.1.11" 123 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 124 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 125 | dependencies: 126 | balanced-match "^1.0.0" 127 | concat-map "0.0.1" 128 | 129 | braces@~3.0.2: 130 | version "3.0.2" 131 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 132 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 133 | dependencies: 134 | fill-range "^7.0.1" 135 | 136 | buffer-from@^1.0.0: 137 | version "1.1.2" 138 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 139 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 140 | 141 | builtin-modules@^3.1.0: 142 | version "3.2.0" 143 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" 144 | integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== 145 | 146 | chalk@^2.0.0: 147 | version "2.4.2" 148 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 149 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 150 | dependencies: 151 | ansi-styles "^3.2.1" 152 | escape-string-regexp "^1.0.5" 153 | supports-color "^5.3.0" 154 | 155 | chokidar@^3.5.0: 156 | version "3.5.2" 157 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 158 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 159 | dependencies: 160 | anymatch "~3.1.2" 161 | braces "~3.0.2" 162 | glob-parent "~5.1.2" 163 | is-binary-path "~2.1.0" 164 | is-glob "~4.0.1" 165 | normalize-path "~3.0.0" 166 | readdirp "~3.6.0" 167 | optionalDependencies: 168 | fsevents "~2.3.2" 169 | 170 | color-convert@^1.9.0: 171 | version "1.9.3" 172 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 173 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 174 | dependencies: 175 | color-name "1.1.3" 176 | 177 | color-name@1.1.3: 178 | version "1.1.3" 179 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 180 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 181 | 182 | commander@^2.20.0: 183 | version "2.20.3" 184 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 185 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 186 | 187 | commondir@^1.0.1: 188 | version "1.0.1" 189 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 190 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 191 | 192 | concat-map@0.0.1: 193 | version "0.0.1" 194 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 195 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 196 | 197 | console-clear@^1.1.0: 198 | version "1.1.1" 199 | resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7" 200 | integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ== 201 | 202 | crelt@^1.0.0: 203 | version "1.0.5" 204 | resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" 205 | integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== 206 | 207 | escape-string-regexp@^1.0.5: 208 | version "1.0.5" 209 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 210 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 211 | 212 | estree-walker@^0.6.1: 213 | version "0.6.1" 214 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" 215 | integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== 216 | 217 | estree-walker@^1.0.1: 218 | version "1.0.1" 219 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" 220 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== 221 | 222 | fill-range@^7.0.1: 223 | version "7.0.1" 224 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 225 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 226 | dependencies: 227 | to-regex-range "^5.0.1" 228 | 229 | fs-extra@^9.0.0: 230 | version "9.1.0" 231 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 232 | integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 233 | dependencies: 234 | at-least-node "^1.0.0" 235 | graceful-fs "^4.2.0" 236 | jsonfile "^6.0.1" 237 | universalify "^2.0.0" 238 | 239 | fs.realpath@^1.0.0: 240 | version "1.0.0" 241 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 242 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 243 | 244 | fsevents@~2.3.2: 245 | version "2.3.2" 246 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 247 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 248 | 249 | function-bind@^1.1.1: 250 | version "1.1.1" 251 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 252 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 253 | 254 | get-port@^3.2.0: 255 | version "3.2.0" 256 | resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" 257 | integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= 258 | 259 | glob-parent@~5.1.2: 260 | version "5.1.2" 261 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 262 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 263 | dependencies: 264 | is-glob "^4.0.1" 265 | 266 | glob@^7.1.2: 267 | version "7.2.0" 268 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 269 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 270 | dependencies: 271 | fs.realpath "^1.0.0" 272 | inflight "^1.0.4" 273 | inherits "2" 274 | minimatch "^3.0.4" 275 | once "^1.3.0" 276 | path-is-absolute "^1.0.0" 277 | 278 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 279 | version "4.2.8" 280 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 281 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== 282 | 283 | has-flag@^3.0.0: 284 | version "3.0.0" 285 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 286 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 287 | 288 | has@^1.0.3: 289 | version "1.0.3" 290 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 291 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 292 | dependencies: 293 | function-bind "^1.1.1" 294 | 295 | inflight@^1.0.4: 296 | version "1.0.6" 297 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 298 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 299 | dependencies: 300 | once "^1.3.0" 301 | wrappy "1" 302 | 303 | inherits@2: 304 | version "2.0.4" 305 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 306 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 307 | 308 | is-binary-path@~2.1.0: 309 | version "2.1.0" 310 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 311 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 312 | dependencies: 313 | binary-extensions "^2.0.0" 314 | 315 | is-core-module@^2.2.0: 316 | version "2.7.0" 317 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" 318 | integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== 319 | dependencies: 320 | has "^1.0.3" 321 | 322 | is-extglob@^2.1.1: 323 | version "2.1.1" 324 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 325 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 326 | 327 | is-glob@^4.0.1, is-glob@~4.0.1: 328 | version "4.0.3" 329 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 330 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 331 | dependencies: 332 | is-extglob "^2.1.1" 333 | 334 | is-module@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 337 | integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= 338 | 339 | is-number@^7.0.0: 340 | version "7.0.0" 341 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 342 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 343 | 344 | is-reference@^1.1.2: 345 | version "1.2.1" 346 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" 347 | integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== 348 | dependencies: 349 | "@types/estree" "*" 350 | 351 | jest-worker@^24.9.0: 352 | version "24.9.0" 353 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" 354 | integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== 355 | dependencies: 356 | merge-stream "^2.0.0" 357 | supports-color "^6.1.0" 358 | 359 | js-tokens@^4.0.0: 360 | version "4.0.0" 361 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 362 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 363 | 364 | jsonfile@^6.0.1: 365 | version "6.1.0" 366 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" 367 | integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== 368 | dependencies: 369 | universalify "^2.0.0" 370 | optionalDependencies: 371 | graceful-fs "^4.1.6" 372 | 373 | kleur@^3.0.0: 374 | version "3.0.3" 375 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" 376 | integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== 377 | 378 | livereload-js@^3.3.1: 379 | version "3.3.2" 380 | resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.2.tgz#c88b009c6e466b15b91faa26fd7c99d620e12651" 381 | integrity sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA== 382 | 383 | livereload@^0.9.1: 384 | version "0.9.3" 385 | resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" 386 | integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== 387 | dependencies: 388 | chokidar "^3.5.0" 389 | livereload-js "^3.3.1" 390 | opts ">= 1.2.0" 391 | ws "^7.4.3" 392 | 393 | local-access@^1.0.1: 394 | version "1.1.0" 395 | resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.1.0.tgz#e007c76ba2ca83d5877ba1a125fc8dfe23ba4798" 396 | integrity sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw== 397 | 398 | magic-string@^0.25.2: 399 | version "0.25.7" 400 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 401 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 402 | dependencies: 403 | sourcemap-codec "^1.4.4" 404 | 405 | merge-stream@^2.0.0: 406 | version "2.0.0" 407 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 408 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 409 | 410 | mime@^2.3.1: 411 | version "2.5.2" 412 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" 413 | integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== 414 | 415 | minimatch@^3.0.4: 416 | version "3.0.4" 417 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 418 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 419 | dependencies: 420 | brace-expansion "^1.1.7" 421 | 422 | mri@^1.1.0: 423 | version "1.2.0" 424 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 425 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 426 | 427 | normalize-path@^3.0.0, normalize-path@~3.0.0: 428 | version "3.0.0" 429 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 430 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 431 | 432 | once@^1.3.0: 433 | version "1.4.0" 434 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 435 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 436 | dependencies: 437 | wrappy "1" 438 | 439 | "opts@>= 1.2.0": 440 | version "2.0.2" 441 | resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" 442 | integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== 443 | 444 | orderedmap@^1.1.0: 445 | version "1.1.1" 446 | resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789" 447 | integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ== 448 | 449 | path-is-absolute@^1.0.0: 450 | version "1.0.1" 451 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 452 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 453 | 454 | path-parse@^1.0.6: 455 | version "1.0.7" 456 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 457 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 458 | 459 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: 460 | version "2.3.0" 461 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 462 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 463 | 464 | prosemirror-commands@^1.0.0, prosemirror-commands@^1.1.2: 465 | version "1.1.10" 466 | resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.10.tgz#406a6589966e6cd80809cea2d801fb998639b37d" 467 | integrity sha512-IWyBBXNAd44RM6NnBPljwq+/CM2oYCQJkF+YhKEAZNwzW0uFdGf4qComhjbKZzqFdu6Iub2ZhNsXgwPibA0lCQ== 468 | dependencies: 469 | prosemirror-model "^1.0.0" 470 | prosemirror-state "^1.0.0" 471 | prosemirror-transform "^1.0.0" 472 | 473 | prosemirror-dropcursor@^1.0.0, prosemirror-dropcursor@^1.3.2: 474 | version "1.3.5" 475 | resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.5.tgz#d2808c17089df0e441ad66016aecc2b6457c8a1f" 476 | integrity sha512-tNUwcF2lPAkwKBZPZRtbxpwljnODRNZ3eiYloN1DSUqDjMT1nBZm0nejaEMS1TvNQ+3amibUSAiV4hX+jpASFA== 477 | dependencies: 478 | prosemirror-state "^1.0.0" 479 | prosemirror-transform "^1.1.0" 480 | prosemirror-view "^1.1.0" 481 | 482 | prosemirror-example-setup@^1.1.2: 483 | version "1.1.2" 484 | resolved "https://registry.yarnpkg.com/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz#0df63d14a26b174933345814cb6503ad72a4ccdb" 485 | integrity sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ== 486 | dependencies: 487 | prosemirror-commands "^1.0.0" 488 | prosemirror-dropcursor "^1.0.0" 489 | prosemirror-gapcursor "^1.0.0" 490 | prosemirror-history "^1.0.0" 491 | prosemirror-inputrules "^1.0.0" 492 | prosemirror-keymap "^1.0.0" 493 | prosemirror-menu "^1.0.0" 494 | prosemirror-schema-list "^1.0.0" 495 | prosemirror-state "^1.0.0" 496 | 497 | prosemirror-gapcursor@^1.0.0, prosemirror-gapcursor@^1.1.2: 498 | version "1.2.0" 499 | resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.0.tgz#28fb60bf3d9baf1f920907d2c3e613137204e8f3" 500 | integrity sha512-yCLy5+0rVqLir/KcHFathQj4Rf8aRHi80FmEfKtM0JmyzvwdomslLzDZ/pX4oFhFKDgjl/WBBBFNqDyNifWg7g== 501 | dependencies: 502 | prosemirror-keymap "^1.0.0" 503 | prosemirror-model "^1.0.0" 504 | prosemirror-state "^1.0.0" 505 | prosemirror-view "^1.0.0" 506 | 507 | prosemirror-history@^1.0.0, prosemirror-history@^1.1.3: 508 | version "1.2.0" 509 | resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.2.0.tgz#04cc4df8d2f7b2a46651a2780de191ada6d465ea" 510 | integrity sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ== 511 | dependencies: 512 | prosemirror-state "^1.2.2" 513 | prosemirror-transform "^1.0.0" 514 | rope-sequence "^1.3.0" 515 | 516 | prosemirror-inputrules@^1.0.0, prosemirror-inputrules@^1.1.2: 517 | version "1.1.3" 518 | resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz#93f9199ca02473259c30d7e352e4c14022d54638" 519 | integrity sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw== 520 | dependencies: 521 | prosemirror-state "^1.0.0" 522 | prosemirror-transform "^1.0.0" 523 | 524 | prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.3: 525 | version "1.1.4" 526 | resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz#8b481bf8389a5ac40d38dbd67ec3da2c7eac6a6d" 527 | integrity sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg== 528 | dependencies: 529 | prosemirror-state "^1.0.0" 530 | w3c-keyname "^2.2.0" 531 | 532 | prosemirror-menu@^1.0.0: 533 | version "1.1.4" 534 | resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.1.4.tgz#a845ae0e14ce1f92dd39d7f23caa6063265cd98c" 535 | integrity sha512-2ROsji/X9ciDnVSRvSTqFygI34GEdHfQSsK4zBKjPxSEroeiHHcdRMS1ofNIf2zM0Vpp5/YqfpxynElymQkqzg== 536 | dependencies: 537 | crelt "^1.0.0" 538 | prosemirror-commands "^1.0.0" 539 | prosemirror-history "^1.0.0" 540 | prosemirror-state "^1.0.0" 541 | 542 | prosemirror-model@^1.0.0, prosemirror-model@^1.14.3, prosemirror-model@^1.2.0, prosemirror-model@^1.8.2: 543 | version "1.14.3" 544 | resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.3.tgz#a9c250d3c4023ddf10ecb41a0a7a130e9741d37e" 545 | integrity sha512-yzZlBaSxfUPIIP6U5Edh5zKxJPZ5f7bwZRhiCuH3UYkWhj+P3d8swHsbuAMOu/iDatDc5J/Qs5Mb3++mZf+CvQ== 546 | dependencies: 547 | orderedmap "^1.1.0" 548 | 549 | prosemirror-schema-basic@^1.1.2: 550 | version "1.1.2" 551 | resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.1.2.tgz#4bde5c339c845e0d08ec8fe473064e372ca51ae3" 552 | integrity sha512-G4q8WflNsR1Q33QAV4MQO0xWrHLOJ+BQcKswGXMy626wlQj6c/1n1v4eC9ns+h2y1r/fJHZEgSZnsNhm9lbrDw== 553 | dependencies: 554 | prosemirror-model "^1.2.0" 555 | 556 | prosemirror-schema-list@^1.0.0, prosemirror-schema-list@^1.1.2: 557 | version "1.1.6" 558 | resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz#c3e13fe2f74750e4a53ff88d798dc0c4ccca6707" 559 | integrity sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw== 560 | dependencies: 561 | prosemirror-model "^1.0.0" 562 | prosemirror-transform "^1.0.0" 563 | 564 | prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.2: 565 | version "1.3.4" 566 | resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.4.tgz#4c6b52628216e753fc901c6d2bfd84ce109e8952" 567 | integrity sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA== 568 | dependencies: 569 | prosemirror-model "^1.0.0" 570 | prosemirror-transform "^1.0.0" 571 | 572 | prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0: 573 | version "1.3.3" 574 | resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.3.tgz#5f6712b0577a119cc418686fe7588b6dd9b7464d" 575 | integrity sha512-9NLVXy1Sfa2G6qPqhWMkEvwQQMTw7OyTqOZbJaGQWsCeH3hH5Cw+c5eNaLM1Uu75EyKLsEZhJ93XpHJBa6RX8A== 576 | dependencies: 577 | prosemirror-model "^1.0.0" 578 | 579 | prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.7: 580 | version "1.20.1" 581 | resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.20.1.tgz#174ba8ca358c73cc05e9a92a3d252bcf181ea337" 582 | integrity sha512-djWORhy3a706mUH4A2dgEEV0IPZqQd1tFyz/ZVHJNoqhSgq82FwG6dq7uqHeUB2KdVSNfI2yc3rwfqlC/ll2pA== 583 | dependencies: 584 | prosemirror-model "^1.14.3" 585 | prosemirror-state "^1.0.0" 586 | prosemirror-transform "^1.1.0" 587 | 588 | randombytes@^2.1.0: 589 | version "2.1.0" 590 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 591 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 592 | dependencies: 593 | safe-buffer "^5.1.0" 594 | 595 | readdirp@~3.6.0: 596 | version "3.6.0" 597 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 598 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 599 | dependencies: 600 | picomatch "^2.2.1" 601 | 602 | require-relative@^0.8.7: 603 | version "0.8.7" 604 | resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" 605 | integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= 606 | 607 | resolve@^1.11.0, resolve@^1.11.1: 608 | version "1.20.0" 609 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 610 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 611 | dependencies: 612 | is-core-module "^2.2.0" 613 | path-parse "^1.0.6" 614 | 615 | rollup-plugin-css-only@^2.0.0: 616 | version "2.1.0" 617 | resolved "https://registry.yarnpkg.com/rollup-plugin-css-only/-/rollup-plugin-css-only-2.1.0.tgz#b9e8505eb01c5257b5eab65bd51eec9050bed9a3" 618 | integrity sha512-pfdcqAWEmRMFy+ABXAQPA/DKyPqLuBTOf+lWSOgtrVs1v/q7DSXzYa9QZg4myd8/1F7NHcdvPkWnfWqMxq9vrw== 619 | dependencies: 620 | "@rollup/pluginutils" "^3.0.0" 621 | fs-extra "^9.0.0" 622 | 623 | rollup-plugin-livereload@^1.0.0: 624 | version "1.3.0" 625 | resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz#8da90df13df6502b9d982997d6ac871092f15fdd" 626 | integrity sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw== 627 | dependencies: 628 | livereload "^0.9.1" 629 | 630 | rollup-plugin-svelte@^6.0.3: 631 | version "6.1.1" 632 | resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz#66362cf0500fb7a848283ebcf19d289a60ef0871" 633 | integrity sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow== 634 | dependencies: 635 | require-relative "^0.8.7" 636 | rollup-pluginutils "^2.8.2" 637 | sourcemap-codec "^1.4.8" 638 | 639 | rollup-plugin-terser@^5.1.2: 640 | version "5.3.1" 641 | resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" 642 | integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== 643 | dependencies: 644 | "@babel/code-frame" "^7.5.5" 645 | jest-worker "^24.9.0" 646 | rollup-pluginutils "^2.8.2" 647 | serialize-javascript "^4.0.0" 648 | terser "^4.6.2" 649 | 650 | rollup-pluginutils@^2.8.2: 651 | version "2.8.2" 652 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" 653 | integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== 654 | dependencies: 655 | estree-walker "^0.6.1" 656 | 657 | rollup@^1.20.0: 658 | version "1.32.1" 659 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" 660 | integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== 661 | dependencies: 662 | "@types/estree" "*" 663 | "@types/node" "*" 664 | acorn "^7.1.0" 665 | 666 | rope-sequence@^1.3.0: 667 | version "1.3.2" 668 | resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b" 669 | integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg== 670 | 671 | sade@^1.4.0: 672 | version "1.7.4" 673 | resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691" 674 | integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA== 675 | dependencies: 676 | mri "^1.1.0" 677 | 678 | safe-buffer@^5.1.0: 679 | version "5.2.1" 680 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 681 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 682 | 683 | serialize-javascript@^4.0.0: 684 | version "4.0.0" 685 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" 686 | integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== 687 | dependencies: 688 | randombytes "^2.1.0" 689 | 690 | sirv-cli@^0.4.4: 691 | version "0.4.6" 692 | resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-0.4.6.tgz#c28ab20deb3b34637f5a60863dc350f055abca04" 693 | integrity sha512-/Vj85/kBvPL+n9ibgX6FicLE8VjidC1BhlX67PYPBfbBAphzR6i0k0HtU5c2arejfU3uzq8l3SYPCwl1x7z6Ww== 694 | dependencies: 695 | console-clear "^1.1.0" 696 | get-port "^3.2.0" 697 | kleur "^3.0.0" 698 | local-access "^1.0.1" 699 | sade "^1.4.0" 700 | sirv "^0.4.6" 701 | tinydate "^1.0.0" 702 | 703 | sirv@^0.4.6: 704 | version "0.4.6" 705 | resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.4.6.tgz#185e44eb93d24009dd183b7494285c5180b81f22" 706 | integrity sha512-rYpOXlNbpHiY4nVXxuDf4mXPvKz1reZGap/LkWp9TvcZ84qD/nPBjjH/6GZsgIjVMbOslnY8YYULAyP8jMn1GQ== 707 | dependencies: 708 | "@polka/url" "^0.5.0" 709 | mime "^2.3.1" 710 | 711 | source-map-support@~0.5.12: 712 | version "0.5.20" 713 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" 714 | integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== 715 | dependencies: 716 | buffer-from "^1.0.0" 717 | source-map "^0.6.0" 718 | 719 | source-map@^0.6.0, source-map@~0.6.1: 720 | version "0.6.1" 721 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 722 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 723 | 724 | sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: 725 | version "1.4.8" 726 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 727 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 728 | 729 | supports-color@^5.3.0: 730 | version "5.5.0" 731 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 732 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 733 | dependencies: 734 | has-flag "^3.0.0" 735 | 736 | supports-color@^6.1.0: 737 | version "6.1.0" 738 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 739 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 740 | dependencies: 741 | has-flag "^3.0.0" 742 | 743 | svelte@^3.0.0: 744 | version "3.43.0" 745 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.43.0.tgz#d28d06ec523bf0cea3de15558a3241c339a85762" 746 | integrity sha512-T2pMPHrxXp+SM8pLLUXLQgkdo+JhTls7aqj9cD7z8wT2ccP+OrCAmtQS7h6pvMjitaZhXFNnCK582NxDpy8HSw== 747 | 748 | terser@^4.6.2: 749 | version "4.8.0" 750 | resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" 751 | integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== 752 | dependencies: 753 | commander "^2.20.0" 754 | source-map "~0.6.1" 755 | source-map-support "~0.5.12" 756 | 757 | tinydate@^1.0.0: 758 | version "1.3.0" 759 | resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb" 760 | integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w== 761 | 762 | to-regex-range@^5.0.1: 763 | version "5.0.1" 764 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 765 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 766 | dependencies: 767 | is-number "^7.0.0" 768 | 769 | universalify@^2.0.0: 770 | version "2.0.0" 771 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 772 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 773 | 774 | w3c-keyname@^2.2.0: 775 | version "2.2.4" 776 | resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" 777 | integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw== 778 | 779 | wrappy@1: 780 | version "1.0.2" 781 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 782 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 783 | 784 | ws@^7.4.3: 785 | version "7.5.5" 786 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" 787 | integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== 788 | --------------------------------------------------------------------------------