aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Corentin Thomasset <corentin.thomasset74@gmail.com> 2023-03-26 19:04:42 +0200
committerGravatar Corentin THOMASSET <corentin.thomasset74@gmail.com> 2023-03-26 20:21:00 +0200
commitf3b1863f093124309963c3ad7c275142cd370b0f (patch)
treec8dd861e9d5d253bcb655c2c055965fae7f952c5
parentb1d6bfd2dcb718b486dcd708adcdea65341b3d16 (diff)
downloadit-tools-f3b1863f093124309963c3ad7c275142cd370b0f.tar.gz
it-tools-f3b1863f093124309963c3ad7c275142cd370b0f.tar.zst
it-tools-f3b1863f093124309963c3ad7c275142cd370b0f.zip
feat(new-tool): html wysiwyg editor
-rw-r--r--package.json4
-rw-r--r--pnpm-lock.yaml555
-rw-r--r--src/tools/html-wysiwyg-editor/editor/editor.vue135
-rw-r--r--src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue22
-rw-r--r--src/tools/html-wysiwyg-editor/editor/menu-bar.vue171
-rw-r--r--src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue17
-rw-r--r--src/tools/html-wysiwyg-editor/index.ts11
-rw-r--r--src/tools/index.ts2
8 files changed, 911 insertions, 6 deletions
diff --git a/package.json b/package.json
index 95079eb..810f3e3 100644
--- a/package.json
+++ b/package.json
@@ -34,6 +34,9 @@
"@it-tools/bip39": "^0.0.4",
"@it-tools/oggen": "^1.3.0",
"@sindresorhus/slugify": "^2.2.0",
+ "@tiptap/pm": "2.0.0-beta.220",
+ "@tiptap/starter-kit": "2.0.0-beta.220",
+ "@tiptap/vue-3": "2.0.0-beta.220",
"@vicons/material": "^0.12.0",
"@vicons/tabler": "^0.12.0",
"@vueuse/core": "^8.9.4",
@@ -75,6 +78,7 @@
"@types/mime-types": "^2.1.1",
"@types/node": "^16.18.16",
"@types/node-forge": "^1.3.1",
+ "@types/prettier": "^2.7.2",
"@types/qrcode": "^1.5.0",
"@types/randombytes": "^2.0.0",
"@types/uuid": "^8.3.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7864ba7..0e5f8ce 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,6 +5,9 @@ specifiers:
'@it-tools/oggen': ^1.3.0
'@rushstack/eslint-patch': ^1.2.0
'@sindresorhus/slugify': ^2.2.0
+ '@tiptap/pm': 2.0.0-beta.220
+ '@tiptap/starter-kit': 2.0.0-beta.220
+ '@tiptap/vue-3': 2.0.0-beta.220
'@types/bcryptjs': ^2.4.2
'@types/crypto-js': ^4.1.1
'@types/jsdom': ^16.2.15
@@ -12,6 +15,7 @@ specifiers:
'@types/mime-types': ^2.1.1
'@types/node': ^16.18.16
'@types/node-forge': ^1.3.1
+ '@types/prettier': ^2.7.2
'@types/qrcode': ^1.5.0
'@types/randombytes': ^2.0.0
'@types/uuid': ^8.3.4
@@ -77,6 +81,9 @@ dependencies:
'@it-tools/bip39': 0.0.4
'@it-tools/oggen': 1.3.0
'@sindresorhus/slugify': 2.2.0
+ '@tiptap/pm': 2.0.0-beta.220
+ '@tiptap/starter-kit': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/vue-3': 2.0.0-beta.220_htj2fswe27wsqb7rziordzcpiq
'@vicons/material': 0.12.0
'@vicons/tabler': 0.12.0
'@vueuse/core': 8.9.4_vue@3.2.47
@@ -118,6 +125,7 @@ devDependencies:
'@types/mime-types': 2.1.1
'@types/node': 16.18.16
'@types/node-forge': 1.3.1
+ '@types/prettier': 2.7.2
'@types/qrcode': 1.5.0
'@types/randombytes': 2.0.0
'@types/uuid': 8.3.4
@@ -1545,6 +1553,10 @@ packages:
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
dev: false
+ /@linaria/core/3.0.0-beta.13:
+ resolution: {integrity: sha512-3zEi5plBCOsEzUneRVuQb+2SAx3qaC1dj0FfFAI6zIJQoDWu0dlSwKijMRack7oO9tUWrchfj3OkKQAd1LBdVg==}
+ dev: false
+
/@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -1578,6 +1590,42 @@ packages:
tslib: 2.5.0
dev: true
+ /@popperjs/core/2.11.7:
+ resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==}
+ dev: false
+
+ /@remirror/core-constants/2.0.0:
+ resolution: {integrity: sha512-vpePPMecHJllBqCWXl6+FIcZqS+tRUM2kSCCKFeEo1H3XUEv3ocijBIPhnlSAa7g6maX+12ATTgxrOsLpWVr2g==}
+ dependencies:
+ '@babel/runtime': 7.21.0
+ dev: false
+
+ /@remirror/core-helpers/2.0.1:
+ resolution: {integrity: sha512-s8M1pn33aBUhduvD1QR02uUQMegnFkGaTr4c1iBzxTTyg0rbQstzuQ7Q8TkL6n64JtgCdJS9jLz2dONb2meBKQ==}
+ dependencies:
+ '@babel/runtime': 7.21.0
+ '@linaria/core': 3.0.0-beta.13
+ '@remirror/core-constants': 2.0.0
+ '@remirror/types': 1.0.0
+ '@types/object.omit': 3.0.0
+ '@types/object.pick': 1.3.2
+ '@types/throttle-debounce': 2.1.0
+ case-anything: 2.1.10
+ dash-get: 1.0.2
+ deepmerge: 4.3.1
+ fast-deep-equal: 3.1.3
+ make-error: 1.3.6
+ object.omit: 3.0.0
+ object.pick: 1.3.0
+ throttle-debounce: 3.0.1
+ dev: false
+
+ /@remirror/types/1.0.0:
+ resolution: {integrity: sha512-7HQbW7k8VxrAtfzs9FxwO6XSDabn8tSFDi1wwzShOnU+cvaYpfxu0ygyTk3TpXsag1hgFKY3ZIlAfB4WVz2LkQ==}
+ dependencies:
+ type-fest: 2.19.0
+ dev: false
+
/@rollup/plugin-babel/5.3.1_hqhlikriuul7byjexqnpgcmenu:
resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
engines: {node: '>= 10.0.0'}
@@ -1682,6 +1730,253 @@ packages:
string.prototype.matchall: 4.0.8
dev: true
+ /@tiptap/core/2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220:
+ resolution: {integrity: sha512-F2Q666xJqijBU5o+GqekqseNgIEMTs6BhsLDaf9DwThhljGLS8RXKnSvQxrxLNrYEPpw39n/G3Qt8YAOk5qR6w==}
+ peerDependencies:
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-blockquote/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-uE1VRU/doQzXsfsZ/JqsbSbXeZYTJnyQkSfHYA2ZYhbEM2XqDEsYkgcmZEJgunUZJpERf+3ZTfTpqaHq29iMMg==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.1
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-bold/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-KcEuKI85Drug/cCWbDy+HxhYrD+rLXHEBG10DmKPvgPpKHG/2wOau6LwUwyV4muWR8CR2mIO+mEc3yVBD8nNwQ==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-bubble-menu/2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220:
+ resolution: {integrity: sha512-wthyec7s0vZlTSEAAZEgoFfx/1Arwg1zxDUrrE+YAost/Yn+w4xQksz/ts5Bx90iOk2qsJ+jzzttLRV17Ku7lA==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/pm': 2.0.0-beta.220
+ lodash: 4.17.21
+ tippy.js: 6.3.7
+ dev: false
+
+ /@tiptap/extension-bullet-list/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-QQ/0ZlYy6Hgb+UAc79V+fxvI+AaQf20cbKtBXaR8TIZ0x4FotSma89bKh+CIXMhFiBGXTcYBaYhl7OwACsKtxw==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-code-block/2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky:
+ resolution: {integrity: sha512-fgA7yTfHqhBtMJF7I9FPJ6UWuZPtxOQiN45Iv9LNmFIB6YRucdpmF+daZ27sElu0a+eICZyXwVn4w4iJphifuw==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-code/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-JKKDZoceagqVXeC1XF/gOkKhLtsbYJYV+MRDorLnQVz4tXcg/SMs5Ez7OM9MxSSior8fIbUFMNsj1/UNlG+tFw==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-document/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-2sja4ZvOb4iynHrzinnclCSFgLyo6fJc1fBV5fIYaOgZOYcvz9KK8fgKiq+wIpG58sJEmQ5kcwwBlkXv+NTK+g==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-dropcursor/2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky:
+ resolution: {integrity: sha512-BIaA4Lvb3xL9KFN+K6SO2IHqLO6hDmGN2/rGKHFaU3Eh+oiXM2G73KTSS5KIP1u872zY1RpAtswSc4kjv3cuVw==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-floating-menu/2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220:
+ resolution: {integrity: sha512-+WfcBEedm82ntaVIEQAGz0Om96Rpav7a+4f7e8N4PrLKm6nZ3gBaEkZVQ6vjJ6S/1htiWCv1XosYIwRboPBG0w==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/pm': 2.0.0-beta.220
+ tippy.js: 6.3.7
+ dev: false
+
+ /@tiptap/extension-gapcursor/2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky:
+ resolution: {integrity: sha512-W5N2Ey+thufUOrs2TFGpEGBGue7ZEhcUXvxcsZlGbrjVa9Y+4rEp68Du4y7yM0hCeSj2GGwiV+uPzkc0CSDE/g==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-hard-break/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-oY3454o53YNFbuokzyGzG4PdMHkIYreY3nrALioZ0SwYeoFNcGA6Zcn4rDRfdp+QvbbiHfeBTR/CpWF13HZYTg==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-heading/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-7mrHRj++UaZ26C2Gjwb0WKWAzpiKb8TOYkVC2uMaCwaNhLDXpFEwZ7RtJRSTNBHkIGnMO46BH8Z0qlkFMmk9Jw==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-history/2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky:
+ resolution: {integrity: sha512-qNL2a9UhnlmCs4y2iQYrfeMB8vEX3bHozBJanHu0PWNQJcj90R5xqorBp/bRcqZdi0kuQfxcTnGHtLUpN/U0TA==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-horizontal-rule/2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky:
+ resolution: {integrity: sha512-XMIs4R+4BoH5LpIxey513mZuus0XLHqjVayqtf03enmjBTLWzkixvvWLPLw4a47FJL5Q8l4REFHxjNifRzOKkg==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-italic/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-aWAgqoR8fql9fJ7T/ZrEqovkEjZXbUpvlvWEvdBDMG3id8ZTGNDpdDKdvI6J/Rl5ZGPIg1TpHJtd+UixheWQsQ==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-list-item/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-+O0ivwxPP2l/m9PAowb2ytDT/cM5kwu0s1W5MUsHPIqf+M6ahnl4ESjhWZfDHUzvjqPq6MTbqoQLHbB1KS/N7w==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-ordered-list/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-j3DmxJfwmNxFfMnvO7glmGlhYeZSIUnRrKnZu2KkpD6OcGJSh9y/yfnYwcuK80XbzEG/jKKIw0M2yRveOvyVwA==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-paragraph/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-ZGCzNGFYV4wa3l1nXtDIaYp7O6f0DrGTSl3alKkDTQe3SOmzXS2HjgWl9yPw8VXpU9W5mMGhXd+nGn/jUk+f/A==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-strike/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-cIM2ma6mzk08pijOn+KS3ZoHWaUVsVT+OF3m6xewjwJdC0ILg9nApEOhPFrhbeDcxcPmJMlgBl/xeUrEu1HQMg==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/extension-text/2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q:
+ resolution: {integrity: sha512-3tnffc2YMjNyv7Lbad6fx9wYDE/Buz8vhx76M2AOSrjYbzmTJf7mLkgdlPM0VTy7FGZD5CGgHJAgYNt5HIqPkQ==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ dev: false
+
+ /@tiptap/pm/2.0.0-beta.220:
+ resolution: {integrity: sha512-O9mGcmwUpEr630HY9RylIyZJKnpXi3xWINWNiAEfRJ1br5j5pHRoVRJQ1HzU+6+Z+i/8qp3zRHGLTBqihaZETA==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ dependencies:
+ prosemirror-changeset: 2.2.0
+ prosemirror-collab: 1.3.0
+ prosemirror-commands: 1.5.1
+ prosemirror-dropcursor: 1.7.1
+ prosemirror-gapcursor: 1.3.1
+ prosemirror-history: 1.3.0
+ prosemirror-inputrules: 1.2.0
+ prosemirror-keymap: 1.2.1
+ prosemirror-markdown: 1.10.1
+ prosemirror-menu: 1.2.1
+ prosemirror-model: 1.19.0
+ prosemirror-schema-basic: 1.2.1
+ prosemirror-schema-list: 1.2.2
+ prosemirror-state: 1.4.2
+ prosemirror-tables: 1.3.2
+ prosemirror-trailing-node: 2.0.3_neynaodr6b5iulsm3pf65djexu
+ prosemirror-transform: 1.7.1
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /@tiptap/starter-kit/2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220:
+ resolution: {integrity: sha512-3992NxY5sEp5xmLE/qv/yt1YkgpSpJiUlDRj02isJ0Xsxa4G6bNq+N+tN2rHB0Y8dtYVBSX2vV/DZYVX8O+Gpg==}
+ dependencies:
+ '@tiptap/core': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/extension-blockquote': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-bold': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-bullet-list': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-code': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-code-block': 2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky
+ '@tiptap/extension-document': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-dropcursor': 2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky
+ '@tiptap/extension-gapcursor': 2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky
+ '@tiptap/extension-hard-break': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-heading': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-history': 2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky
+ '@tiptap/extension-horizontal-rule': 2.0.0-beta.220_ohumfzynigfck3hzagxvh2a4ky
+ '@tiptap/extension-italic': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-list-item': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-ordered-list': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-paragraph': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-strike': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ '@tiptap/extension-text': 2.0.0-beta.220_7w7m52asdh3tod4ocz57yex63q
+ transitivePeerDependencies:
+ - '@tiptap/pm'
+ dev: false
+
+ /@tiptap/vue-3/2.0.0-beta.220_htj2fswe27wsqb7rziordzcpiq:
+ resolution: {integrity: sha512-rhSKUECLE6NOjTYZHheXAGpyIqruhxkU/9YfWNLWNFIHHW9wHO+t/B3XMJAWBwgkUvRRepU5JmBBIfYd8RgqTA==}
+ peerDependencies:
+ '@tiptap/core': ^2.0.0-beta.209
+ '@tiptap/pm': ^2.0.0-beta.209
+ vue: ^3.0.0
+ dependencies:
+ '@tiptap/extension-bubble-menu': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/extension-floating-menu': 2.0.0-beta.220_@tiptap+pm@2.0.0-beta.220
+ '@tiptap/pm': 2.0.0-beta.220
+ vue: 3.2.47
+ dev: false
+
/@tootallnate/once/2.0.0:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@@ -1784,10 +2079,22 @@ packages:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
dev: true
+ /@types/object.omit/3.0.0:
+ resolution: {integrity: sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==}
+ dev: false
+
+ /@types/object.pick/1.3.2:
+ resolution: {integrity: sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==}
+ dev: false
+
/@types/parse5/6.0.3:
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
dev: true
+ /@types/prettier/2.7.2:
+ resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==}
+ dev: true
+
/@types/qrcode/1.5.0:
resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==}
dependencies:
@@ -1810,6 +2117,10 @@ packages:
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
dev: true
+ /@types/throttle-debounce/2.1.0:
+ resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==}
+ dev: false
+
/@types/tough-cookie/4.0.2:
resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
dev: true
@@ -2666,6 +2977,11 @@ packages:
upper-case-first: 2.0.2
dev: false
+ /case-anything/2.1.10:
+ resolution: {integrity: sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==}
+ engines: {node: '>=12.13'}
+ dev: false
+
/chai/4.3.7:
resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
engines: {node: '>=4'}
@@ -3020,6 +3336,10 @@ packages:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
+ /crelt/1.0.5:
+ resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==}
+ dev: false
+
/cron-validator/1.3.1:
resolution: {integrity: sha512-C1HsxuPCY/5opR55G5/WNzyEGDWFVG+6GLrA+fW/sCTcP6A6NTjUP2AK7B8n2PyFs90kDG2qzwm8LMheADku6A==}
dev: false
@@ -3117,6 +3437,10 @@ packages:
engines: {node: '>=8'}
dev: true
+ /dash-get/1.0.2:
+ resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==}
+ dev: false
+
/data-urls/3.0.2:
resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
engines: {node: '>=12'}
@@ -3195,7 +3519,6 @@ packages:
/deepmerge/4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
- dev: true
/define-lazy-prop/2.0.0:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
@@ -3369,7 +3692,6 @@ packages:
/entities/3.0.1:
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
engines: {node: '>=0.12'}
- dev: true
/errno/0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
@@ -3676,7 +3998,6 @@ packages:
/escape-string-regexp/4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- dev: true
/escape-string-regexp/5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
@@ -4008,7 +4329,6 @@ packages:
/fast-deep-equal/3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- dev: true
/fast-diff/1.2.0:
resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
@@ -4667,6 +4987,13 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /is-extendable/1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ dev: false
+
/is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -4724,6 +5051,13 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /is-plain-object/2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: false
+
/is-potential-custom-element-name/1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true
@@ -4813,6 +5147,11 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
+ /isobject/3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/istanbul-lib-coverage/3.2.0:
resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
engines: {node: '>=8'}
@@ -5102,6 +5441,12 @@ packages:
uc.micro: 1.0.6
dev: true
+ /linkify-it/4.0.1:
+ resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
+ dependencies:
+ uc.micro: 1.0.6
+ dev: false
+
/load-json-file/4.0.0:
resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
engines: {node: '>=4'}
@@ -5223,6 +5568,10 @@ packages:
semver: 6.3.0
dev: true
+ /make-error/1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: false
+
/map-obj/1.0.1:
resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
engines: {node: '>=0.10.0'}
@@ -5248,6 +5597,17 @@ packages:
uc.micro: 1.0.6
dev: true
+ /markdown-it/13.0.1:
+ resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ entities: 3.0.1
+ linkify-it: 4.0.1
+ mdurl: 1.0.1
+ uc.micro: 1.0.6
+ dev: false
+
/mathjs/10.6.4:
resolution: {integrity: sha512-omQyvRE1jIy+3k2qsqkWASOcd45aZguXZDckr3HtnTYyXk5+2xpVfC3kATgbO2Srjxlqww3TVdhD0oUdZ/hiFA==}
engines: {node: '>= 14'}
@@ -5270,7 +5630,6 @@ packages:
/mdurl/1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
- dev: true
/meow/8.1.2:
resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
@@ -5514,6 +5873,20 @@ packages:
object-keys: 1.1.1
dev: true
+ /object.omit/3.0.0:
+ resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 1.0.1
+ dev: false
+
+ /object.pick/1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: false
+
/object.values/1.1.6:
resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
engines: {node: '>= 0.4'}
@@ -5569,6 +5942,10 @@ packages:
word-wrap: 1.2.3
dev: true
+ /orderedmap/2.1.0:
+ resolution: {integrity: sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==}
+ dev: false
+
/p-limit/1.3.0:
resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
engines: {node: '>=4'}
@@ -5831,6 +6208,149 @@ packages:
asap: 2.0.6
dev: true
+ /prosemirror-changeset/2.2.0:
+ resolution: {integrity: sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==}
+ dependencies:
+ prosemirror-transform: 1.7.1
+ dev: false
+
+ /prosemirror-collab/1.3.0:
+ resolution: {integrity: sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA==}
+ dependencies:
+ prosemirror-state: 1.4.2
+ dev: false
+
+ /prosemirror-commands/1.5.1:
+ resolution: {integrity: sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ dev: false
+
+ /prosemirror-dropcursor/1.7.1:
+ resolution: {integrity: sha512-GmWk9bAwhfHwA8xmJhBFjPcebxUG9zAPYtqpIr7NTDigWZZEJCgUYyUQeqgyscLr8ZHoh9aeprX9kW7BihUT+w==}
+ dependencies:
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /prosemirror-gapcursor/1.3.1:
+ resolution: {integrity: sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==}
+ dependencies:
+ prosemirror-keymap: 1.2.1
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /prosemirror-history/1.3.0:
+ resolution: {integrity: sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==}
+ dependencies:
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ rope-sequence: 1.3.3
+ dev: false
+
+ /prosemirror-inputrules/1.2.0:
+ resolution: {integrity: sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==}
+ dependencies:
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ dev: false
+
+ /prosemirror-keymap/1.2.1:
+ resolution: {integrity: sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==}
+ dependencies:
+ prosemirror-state: 1.4.2
+ w3c-keyname: 2.2.6
+ dev: false
+
+ /prosemirror-markdown/1.10.1:
+ resolution: {integrity: sha512-s7iaTLiX+qO5z8kF2NcMmy2T7mIlxzkS4Sp3vTKSYChPtbMpg6YxFkU0Y06rUg2WtKlvBu7v1bXzlGBkfjUWAA==}
+ dependencies:
+ markdown-it: 13.0.1
+ prosemirror-model: 1.19.0
+ dev: false
+
+ /prosemirror-menu/1.2.1:
+ resolution: {integrity: sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==}
+ dependencies:
+ crelt: 1.0.5
+ prosemirror-commands: 1.5.1
+ prosemirror-history: 1.3.0
+ prosemirror-state: 1.4.2
+ dev: false
+
+ /prosemirror-model/1.19.0:
+ resolution: {integrity: sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==}
+ dependencies:
+ orderedmap: 2.1.0
+ dev: false
+
+ /prosemirror-schema-basic/1.2.1:
+ resolution: {integrity: sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ dev: false
+
+ /prosemirror-schema-list/1.2.2:
+ resolution: {integrity: sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ dev: false
+
+ /prosemirror-state/1.4.2:
+ resolution: {integrity: sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ prosemirror-transform: 1.7.1
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /prosemirror-tables/1.3.2:
+ resolution: {integrity: sha512-/9JTeN6s58Zq66HXaxP6uf8PAmc7XXKZFPlOGVtLvxEd6xBP6WtzaJB9wBjiGUzwbdhdMEy7V62yuHqk/3VrnQ==}
+ dependencies:
+ prosemirror-keymap: 1.2.1
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /prosemirror-trailing-node/2.0.3_neynaodr6b5iulsm3pf65djexu:
+ resolution: {integrity: sha512-lGrjMrn97KWkjQSW/FjdvnhJmqFACmQIyr6lKYApvHitDnKsCoZz6XzrHB7RZYHni/0NxQmZ01p/2vyK2SkvaA==}
+ peerDependencies:
+ prosemirror-model: ^1
+ prosemirror-state: ^1
+ prosemirror-view: ^1
+ dependencies:
+ '@babel/runtime': 7.21.0
+ '@remirror/core-constants': 2.0.0
+ '@remirror/core-helpers': 2.0.1
+ escape-string-regexp: 4.0.0
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-view: 1.30.2
+ dev: false
+
+ /prosemirror-transform/1.7.1:
+ resolution: {integrity: sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ dev: false
+
+ /prosemirror-view/1.30.2:
+ resolution: {integrity: sha512-nTNzZvalQf9kHeEyO407LiV6DoOs/pXsid88UqW9Vvybo4ozJW2PJhkfZUxCUF1hR/9vJLdhxX84wuw9P9HsXA==}
+ dependencies:
+ prosemirror-model: 1.19.0
+ prosemirror-state: 1.4.2
+ prosemirror-transform: 1.7.1
+ dev: false
+
/proto-list/1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
dev: true
@@ -6171,6 +6691,10 @@ packages:
fsevents: 2.3.2
dev: true
+ /rope-sequence/1.3.3:
+ resolution: {integrity: sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==}
+ dev: false
+
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
@@ -6645,6 +7169,11 @@ packages:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
dev: true
+ /throttle-debounce/3.0.1:
+ resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
+ engines: {node: '>=10'}
+ dev: false
+
/through/2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true
@@ -6683,6 +7212,12 @@ packages:
engines: {node: '>=14.0.0'}
dev: true
+ /tippy.js/6.3.7:
+ resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==}
+ dependencies:
+ '@popperjs/core': 2.11.7
+ dev: false
+
/to-fast-properties/2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
@@ -6804,6 +7339,11 @@ packages:
engines: {node: '>=8'}
dev: true
+ /type-fest/2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: false
+
/typed-array-length/1.0.4:
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
dependencies:
@@ -6828,7 +7368,6 @@ packages:
/uc.micro/1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
- dev: true
/uglify-js/3.17.4:
resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
@@ -7274,6 +7813,10 @@ packages:
browser-process-hrtime: 1.0.0
dev: true
+ /w3c-keyname/2.2.6:
+ resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==}
+ dev: false
+
/w3c-xmlserializer/3.0.0:
resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==}
engines: {node: '>=12'}
diff --git a/src/tools/html-wysiwyg-editor/editor/editor.vue b/src/tools/html-wysiwyg-editor/editor/editor.vue
new file mode 100644
index 0000000..346cb10
--- /dev/null
+++ b/src/tools/html-wysiwyg-editor/editor/editor.vue
@@ -0,0 +1,135 @@
+<template>
+ <n-card v-if="editor" class="editor">
+ <template #header>
+ <menu-bar class="editor-header" :editor="editor" />
+ <n-divider style="margin-top: 0" />
+ </template>
+
+ <editor-content class="editor-content" :editor="editor" />
+ </n-card>
+</template>
+
+<script setup lang="ts">
+import { tryOnBeforeUnmount, useVModel } from '@vueuse/core';
+import { Editor, EditorContent } from '@tiptap/vue-3';
+import StarterKit from '@tiptap/starter-kit';
+import { useThemeVars } from 'naive-ui';
+import MenuBar from './menu-bar.vue';
+
+const themeVars = useThemeVars();
+const props = defineProps<{ html: string }>();
+const emit = defineEmits(['update:html']);
+const html = useVModel(props, 'html', emit);
+
+const editor = new Editor({
+ content: html.value,
+ extensions: [StarterKit],
+});
+
+editor.on('update', ({ editor }) => emit('update:html', editor.getHTML()));
+
+tryOnBeforeUnmount(() => {
+ editor.destroy();
+});
+</script>
+
+<style scoped lang="less">
+::v-deep(.n-card-header) {
+ padding: 0;
+}
+
+::v-deep(.ProseMirror-focused) {
+ outline: none;
+}
+</style>
+
+<style scoped lang="less">
+::v-deep(.ProseMirror) {
+ > * + * {
+ margin-top: 0.75em;
+ }
+
+ p {
+ margin: 0;
+ }
+
+ ul,
+ ol {
+ padding: 0 1rem;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ line-height: 1.1;
+ }
+
+ code {
+ background-color: v-bind('themeVars.codeColor');
+ padding: 2px 4px;
+ border-radius: 5px;
+ font-size: 85%;
+ }
+
+ pre {
+ background: v-bind('themeVars.codeColor');
+ font-family: monospace;
+ padding: 0.75rem 1rem;
+ border-radius: 0.5rem;
+
+ code {
+ color: inherit;
+ padding: 0;
+ background: none;
+ font-size: 0.8rem;
+ }
+ }
+
+ mark {
+ background-color: #faf594;
+ }
+
+ img {
+ max-width: 100%;
+ height: auto;
+ }
+
+ hr {
+ margin: 1rem 0;
+ }
+
+ blockquote {
+ padding-left: 1rem;
+ border-left: 2px solid rgba(#0d0d0d, 0.1);
+ }
+
+ hr {
+ border: none;
+ border-top: 2px solid rgba(#0d0d0d, 0.1);
+ margin: 2rem 0;
+ }
+
+ ul[data-type='taskList'] {
+ list-style: none;
+ padding: 0;
+
+ li {
+ display: flex;
+ align-items: center;
+
+ > label {
+ flex: 0 0 auto;
+ margin-right: 0.5rem;
+ user-select: none;
+ }
+
+ > div {
+ flex: 1 1 auto;
+ }
+ }
+ }
+}
+</style>
diff --git a/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue b/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue
new file mode 100644
index 0000000..52bc0d2
--- /dev/null
+++ b/src/tools/html-wysiwyg-editor/editor/menu-bar-item.vue
@@ -0,0 +1,22 @@
+<template>
+ <n-tooltip trigger="hover">
+ <template #trigger>
+ <n-button circle quaternary :type="isActive?.() ? 'primary' : 'default'" @click="action">
+ <template #icon>
+ <n-icon :component="icon" />
+ </template>
+ </n-button>
+ </template>
+
+ {{ title }}
+ </n-tooltip>
+</template>
+
+<script setup lang="ts">
+import { toRefs, type Component } from 'vue';
+
+const props = defineProps<{ icon: Component; title: string; action: () => void; isActive?: () => boolean }>();
+const { icon, title, action, isActive } = toRefs(props);
+</script>
+
+<style scoped></style>
diff --git a/src/tools/html-wysiwyg-editor/editor/menu-bar.vue b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue
new file mode 100644
index 0000000..5304cd3
--- /dev/null
+++ b/src/tools/html-wysiwyg-editor/editor/menu-bar.vue
@@ -0,0 +1,171 @@
+<template>
+ <n-space align="center" :size="0">
+ <template v-for="(item, index) in items">
+ <n-divider v-if="item.type === 'divider'" :key="`divider${index}`" vertical />
+ <menu-bar-item v-else-if="item.type === 'button'" :key="index" v-bind="item" />
+ </template>
+ </n-space>
+</template>
+
+<script setup lang="ts">
+import type { Editor } from '@tiptap/vue-3';
+import {
+ ArrowBack,
+ ArrowForwardUp,
+ Blockquote,
+ Bold,
+ ClearFormatting,
+ Code,
+ CodePlus,
+ H1,
+ H2,
+ H3,
+ H4,
+ Italic,
+ Link,
+ List,
+ ListNumbers,
+ Separator,
+ Strikethrough,
+ TextWrap,
+} from '@vicons/tabler';
+import { toRefs, type Component } from 'vue';
+import MenuBarItem from './menu-bar-item.vue';
+
+const props = defineProps<{ editor: Editor }>();
+const { editor } = toRefs(props);
+
+type MenuItem =
+ | {
+ icon: Component;
+ title: string;
+ action: () => void;
+ isActive?: () => boolean;
+ type: 'button';
+ }
+ | { type: 'divider' };
+
+const items: MenuItem[] = [
+ {
+ type: 'button',
+ icon: Bold,
+ title: 'Bold',
+ action: () => editor.value.chain().focus().toggleBold().run(),
+ isActive: () => editor.value.isActive('bold'),
+ },
+ {
+ type: 'button',
+ icon: Italic,
+ title: 'Italic',
+ action: () => editor.value.chain().focus().toggleItalic().run(),
+ isActive: () => editor.value.isActive('italic'),
+ },
+ {
+ type: 'button',
+ icon: Strikethrough,
+ title: 'Strike',
+ action: () => editor.value.chain().focus().toggleStrike().run(),
+ isActive: () => editor.value.isActive('strike'),
+ },
+ {
+ type: 'button',
+ icon: Code,
+ title: 'Inline code',
+ action: () => editor.value.chain().focus().toggleCode().run(),
+ isActive: () => editor.value.isActive('code'),
+ },
+ {
+ type: 'divider',
+ },
+ {
+ type: 'button',
+ icon: H1,
+ title: 'Heading 1',
+ action: () => editor.value.chain().focus().toggleHeading({ level: 1 }).run(),
+ isActive: () => editor.value.isActive('heading', { level: 1 }),
+ },
+ {
+ type: 'button',
+ icon: H2,
+ title: 'Heading 2',
+ action: () => editor.value.chain().focus().toggleHeading({ level: 2 }).run(),
+ isActive: () => editor.value.isActive('heading', { level: 2 }),
+ },
+ {
+ type: 'button',
+ icon: H3,
+ title: 'Heading 3',
+ action: () => editor.value.chain().focus().toggleHeading({ level: 4 }).run(),
+ isActive: () => editor.value.isActive('heading', { level: 4 }),
+ },
+ {
+ type: 'button',
+ icon: H4,
+ title: 'Heading 4',
+ action: () => editor.value.chain().focus().toggleHeading({ level: 4 }).run(),
+ isActive: () => editor.value.isActive('heading', { level: 4 }),
+ },
+ {
+ type: 'divider',
+ },
+ {
+ type: 'button',
+ icon: List,
+ title: 'Bullet list',
+ action: () => editor.value.chain().focus().toggleBulletList().run(),
+ isActive: () => editor.value.isActive('bulletList'),
+ },
+ {
+ type: 'button',
+ icon: ListNumbers,
+ title: 'Ordered list',
+ action: () => editor.value.chain().focus().toggleOrderedList().run(),
+ isActive: () => editor.value.isActive('orderedList'),
+ },
+ {
+ type: 'button',
+ icon: CodePlus,
+ title: 'Code block',
+ action: () => editor.value.chain().focus().toggleCodeBlock().run(),
+ isActive: () => editor.value.isActive('codeBlock'),
+ },
+
+ {
+ type: 'button',
+ icon: Blockquote,
+ title: 'Blockquote',
+ action: () => editor.value.chain().focus().toggleBlockquote().run(),
+ isActive: () => editor.value.isActive('blockquote'),
+ },
+ {
+ type: 'divider',
+ },
+ {
+ type: 'button',
+ icon: TextWrap,
+ title: 'Hard break',
+ action: () => editor.value.chain().focus().setHardBreak().run(),
+ },
+ {
+ type: 'button',
+ icon: ClearFormatting,
+ title: 'Clear format',
+ action: () => editor.value.chain().focus().clearNodes().unsetAllMarks().run(),
+ },
+
+ {
+ type: 'button',
+ icon: ArrowBack,
+ title: 'Undo',
+ action: () => editor.value.chain().focus().undo().run(),
+ },
+ {
+ type: 'button',
+ icon: ArrowForwardUp,
+ title: 'Redo',
+ action: () => editor.value.chain().focus().redo().run(),
+ },
+];
+</script>
+
+<style scoped></style>
diff --git a/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue b/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue
new file mode 100644
index 0000000..b153769
--- /dev/null
+++ b/src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue
@@ -0,0 +1,17 @@
+<template>
+ <editor v-model:html="html" />
+ <textarea-copyable :value="format(html, { parser: 'html', plugins: [htmlParser] })" language="html" />
+</template>
+
+<script setup lang="ts">
+import TextareaCopyable from '@/components/TextareaCopyable.vue';
+import { ref } from 'vue';
+import { format } from 'prettier';
+import htmlParser from 'prettier/parser-html';
+import { useStorage } from '@vueuse/core';
+import Editor from './editor/editor.vue';
+
+const html = useStorage('html-wysiwyg-editor--html', '<h1>Hey!</h1><p>Welcome to this html wysiwyg editor</p>');
+</script>
+
+<style lang="less" scoped></style>
diff --git a/src/tools/html-wysiwyg-editor/index.ts b/src/tools/html-wysiwyg-editor/index.ts
new file mode 100644
index 0000000..985f3c1
--- /dev/null
+++ b/src/tools/html-wysiwyg-editor/index.ts
@@ -0,0 +1,11 @@
+import { Edit } from '@vicons/tabler';
+import { defineTool } from '../tool';
+
+export const tool = defineTool({
+ name: 'Html wysiwyg editor',
+ path: '/html-wysiwyg-editor',
+ description: 'Online HTML editor with feature-rich WYSIWYG editor, get the source code of the content immediately.',
+ keywords: ['html', 'wysiwyg', 'editor', 'p', 'ul', 'ol', 'converter', 'live'],
+ component: () => import('./html-wysiwyg-editor.vue'),
+ icon: Edit,
+});
diff --git a/src/tools/index.ts b/src/tools/index.ts
index 18208dd..4b4ff22 100644
--- a/src/tools/index.ts
+++ b/src/tools/index.ts
@@ -1,6 +1,7 @@
import { tool as base64FileConverter } from './base64-file-converter';
import { tool as base64StringConverter } from './base64-string-converter';
import { tool as basicAuthGenerator } from './basic-auth-generator';
+import { tool as htmlWysiwygEditor } from './html-wysiwyg-editor';
import { tool as rsaKeyPairGenerator } from './rsa-key-pair-generator';
import { tool as textToNatoAlphabet } from './text-to-nato-alphabet';
import { tool as slugifyString } from './slugify-string';
@@ -74,6 +75,7 @@ export const toolsByCategory: ToolCategory[] = [
jwtParser,
keycodeInfo,
slugifyString,
+ htmlWysiwygEditor,
],
},
{