Add notes wysiwyg editor

This commit is contained in:
Gamebrary 2022-11-30 15:46:27 -07:00
parent 6c90bde3c6
commit bdd6848131
13 changed files with 400 additions and 197 deletions

View file

@ -21,6 +21,8 @@
"@milkdown/preset-commonmark": "^6.4.2",
"@milkdown/prose": "^6.4.1",
"@milkdown/theme-nord": "^6.4.1",
"@tiptap/starter-kit": "^2.0.0-beta.204",
"@tiptap/vue-2": "^2.0.0-beta.204",
"@vue-stripe/vue-stripe": "^4.4.2",
"axios": "^0.21.1",
"bootstrap": "^4.5.2",

View file

@ -1,8 +1,7 @@
<!-- TODO: load genres const response = await this.$store.dispatch('IGDB', { path: 'genres', data: 'fields *; limit 25;' }); -->
<!-- TODO: use https://github.com/twitchtv/igdb-api-node -->
<!-- TODO: create button component that handles loading and showing feedback -->
<!-- TODO: create tag component and standardize all instances -->
<!-- TODO: auto scroll to bottom after adding product -->
<!-- TODO: add markdown wysiwyg -->
<!-- TODO: add help section -->
<template>
<main

View file

@ -7,7 +7,7 @@
<portal to="pageTitle">{{ company.name }}</portal>
<p>{{ company.description }}</p>
<img
v-if="company.logo"
v-if="company.logo && company.logo.image_id"
:src="$options.getImageUrl(company.logo.image_id)"
alt="company.name"
width="100"
@ -25,7 +25,13 @@
lg="2"
>
<router-link :to="{ name: 'game', params: { id: game.id, slug: game.slug }}">
<b-img :src="$options.getImageUrl(game.cover.image_id)" alt="" fluid class="rounded" />
<b-img
v-if="game.cover && game.cover.image_id"
:src="$options.getImageUrl(game.cover.image_id)"
alt=""
fluid
class="rounded"
/>
<br />
<small>{{ game.name }}</small>
</router-link>
@ -44,7 +50,7 @@
lg="2"
>
<router-link :to="{ name: 'game', params: { id: game.id, slug: game.slug }}">
<b-img :src="$options.getImageUrl(game.cover.image_id)" alt="" fluid class="rounded" />
<b-img v-if="game.cover" :src="$options.getImageUrl(game.cover.image_id)" alt="" fluid class="rounded" />
<br />
<small>{{ game.name }}</small>
</router-link>

View file

@ -81,7 +81,7 @@
</span>
</div>
<!-- TODO: merge release Dates and platforms -->
<!-- TODO: restore release dates -->
<!-- <div class="pr-2 pb-2">
<strong>{{ $t('board.gameModal.releaseDate') }}</strong>
<ol v-if="releaseDates" class="list-unstyled mb-0">

View file

@ -5,15 +5,16 @@
v-for="({ imageUrl, isVideo, isCover }, index) in gameMedia"
:key="index"
>
<div
class="mr-2 align-items-center text-center mb-2 rounded cursor-pointer position-relative"
>
<div class="mr-2 align-items-center text-center mb-2 rounded cursor-pointer position-relative">
<i
v-if="isVideo"
class="fa-solid fa-play video-indicator position-absolute text-white"
/>
<div v-if="isCover" class="position-absolute cover-indicator text-light small w-100 bg-dark rounded-bottom">
<div
v-if="isCover"
class="position-absolute cover-indicator text-light small w-100 bg-dark rounded-bottom"
>
Cover
</div>

View file

@ -1,6 +1,6 @@
<template lang="html">
<section v-if="similarGames.length" class="my-5 bg-secondary rounded p-3">
<h2 class="text-center mb-3">You may also like</h2>
<section v-if="similarGames.length" class="my-5 bg-light p-3">
<h4 class="text-center mb-3">You may also like</h4>
<div class="similar-games">
<router-link
@ -11,7 +11,7 @@
<b-img
fluid
rounded
:src="$options.getImageUrl(game.cover.image_id, 't_cover_small_2x')"
:src="$options.getImageUrl(game.cover.image_id, 't_cover_big_2x')"
:alt="game.name"
img-top
/>
@ -58,9 +58,13 @@ export default {
<style lang="scss" rel="stylesheet/scss" scoped>
.similar-games {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-columns: repeat(10, 1fr);
grid-gap: 1rem;
@media(max-width: 1024px) {
grid-template-columns: repeat(5, 1fr);
}
@media(max-width: 780px) {
grid-template-columns: repeat(3, 1fr);
}

View file

@ -55,8 +55,6 @@
<small>{{ name }}</small>
</b-badge>
</template>
<!-- TODO: show release dates -->
</b-card-body>
</b-col>
</b-form-row>

View file

@ -1,75 +0,0 @@
<template lang="html">
<div class="note mb-3 rounded" role="main">
<header />
<div
class="note-content"
v-html="formattedNote"
/>
</div>
</template>
<script>
import { marked } from 'marked';
export default {
props: {
note: {
type: [Object, String],
default: '',
},
},
computed: {
formattedNote() {
const note = this.note?.note || this.note;
return typeof note === 'object'
? marked(note.note)
: marked(note);
},
},
};
</script>
<style lang="scss" rel="stylesheet/scss" scoped>
.note {
font-family: 'Gochi Hand', cursive;
max-width: 100%;
max-height: 80vh;
overflow-y: auto;
background-color: #fdf5ad;
display: flex;
flex-direction: column;
border-bottom: 2px solid #d5cb74;
}
header {
background-image: linear-gradient(90deg, transparent 30px, #ec7063 30px, #ec7063 33px, transparent 33px);
background-size: 100% 1.2em;
padding-left: 2.5rem;
padding-right: 1rem;
padding-top: 1rem;
display: flex;
justify-content: space-between;
}
.note-content {
background-image: linear-gradient(90deg, transparent 30px, #ec7063 30px, #ec7063 33px, transparent 33px), linear-gradient(#85c1e9 .1em, transparent .1em);
background-size: 100% 1.2em;
padding-bottom: 1rem;
flex-grow: 8;
padding-top: .2rem;
padding-left: 3rem;
line-height: 1.3;
}
</style>
<style lang="scss" rel="stylesheet/scss">
.note-content {
img {
max-width: calc(100% - 16px);
border-radius: .25rem;
}
}
</style>

View file

@ -29,73 +29,130 @@
</b-button>
</portal>
<b-col cols="12" sm="6">
<div ref="editor" />
<game-note
v-if="showPreview"
:note="{ note }"
class="mt-3 mt-sm-0"
/>
<b-col cols="12" sm="3">
<router-link
v-else-if="game"
:to="{ name: 'game', params: { id: game.id, slug: game.slug }}"
class="float-right"
>
<b-img :src="$options.getImageUrl(game.cover.image_id, 't_cover_small_2x')" fluid rounded />
<b-img
:src="$options.getImageUrl(game.cover.image_id, 't_cover_big_2x')"
fluid
rounded
/>
</router-link>
</b-col>
<b-col cols="12" sm="6">
<form class="mt-3 mt-sm-0 mb-3 field">
<b-form-textarea
v-model.trim="note"
placeholder="Type note here"
rows="3"
max-rows="20"
/>
<b-col cols="12" sm="9">
<b-button-toolbar
v-if="editor"
key-nav
class="mb-3"
aria-label="Toolbar with button groups"
>
<b-button-group>
<b-button
@click="editor.chain().focus().toggleHeading({ level: 1 }).run()"
v-b-tooltip.hover
title="1"
:variant="editor.isActive('heading', { level: 1 }) ? 'dark' : 'light'"
>
<span class="fa-layers fa-fw">
<i class="fa-solid fa-heading fa-fw" />
<i class="fa-solid fa-1" />
</span>
</b-button>
<b-link
class="small"
variant="link"
v-b-modal.markdown-cheatsheet
<b-button
@click="editor.chain().focus().toggleHeading({ level: 2 }).run()"
v-b-tooltip.hover
title="2"
:variant="editor.isActive('heading', { level: 2 }) ? 'dark' : 'light'"
>
<span class="fa-layers fa-fw">
<i class="fa-solid fa-heading fa-fw" />
<i class="fa-solid fa-2" />
</span>
</b-button>
<b-button
@click="editor.chain().focus().toggleHeading({ level: 3 }).run()"
v-b-tooltip.hover
title="3"
:variant="editor.isActive('heading', { level: 3 }) ? 'dark' : 'light'"
>
<span class="fa-layers fa-fw">
<i class="fa-solid fa-heading fa-fw" />
<i class="fa-solid fa-3" />
</span>
</b-button>
</b-button-group>
<b-button-group class="mx-1">
<b-button
@click="editor.chain().focus().setParagraph().run()"
v-b-tooltip.hover
title="Paragraph"
:class="{ 'is-active': editor.isActive('paragraph') }"
>
<i class="fa-solid fa-paragraph fa-fw" />
</b-button>
<b-button
@click="editor.chain().focus().toggleBold().run()"
v-b-tooltip.hover
title="Bold"
:variant="editor.isActive('bold') ? 'dark' : 'light'"
>
<i class="fa-solid fa-bold fa-fw" />
</b-button>
<b-button
@click="editor.chain().focus().toggleItalic().run()"
v-b-tooltip.hover
title="Italic"
:variant="editor.isActive('italic') ? 'dark' : 'light'"
>
<i class="fa-solid fa-italic fa-fw" />
</b-button>
<b-button
@click="editor.chain().focus().toggleStrike().run()"
v-b-tooltip.hover
title="Strikethrough"
:variant="editor.isActive('strike') ? 'dark' : 'light'"
>
<i class="fa-solid fa-strikethrough fa-fw" />
</b-button>
</b-button-group>
</b-button-toolbar>
<editor-content :editor="editor" />
<b-link
class="small"
variant="link"
v-b-modal.markdown-cheatsheet
>
<i class="fab fa-markdown fa-fw" />
Markdown supported
</b-link>
<footer class="mt-2 d-flex">
<b-button
variant="primary"
:disabled="saving"
@click="saveNote"
>
<i class="fab fa-markdown fa-fw" />
Markdown supported
</b-link>
<b-spinner small v-if="saving" />
<span v-else>{{ $t('global.save') }}</span>
</b-button>
<footer class="mt-2 d-flex">
<b-button
variant="primary"
:disabled="saving"
@click="saveNote"
>
<b-spinner small v-if="saving" />
<span v-else>{{ $t('global.save') }}</span>
</b-button>
<b-button
variant="danger"
class="ml-2"
v-if="!saving"
:disabled="deleting"
@click="deleteNote"
>
<b-spinner small v-if="deleting" />
<i v-else class="fas fa-trash fa-fw" aria-hidden />
</b-button>
<b-button
variant="light"
class="ml-auto"
@click="showPreview = !showPreview"
>
<i class="fas fa-eye fa-fw" aria-hidden />
Toggle preview
</b-button>
</footer>
</form>
<b-button
variant="danger"
class="ml-2"
v-if="!saving"
:disabled="deleting"
@click="deleteNote"
>
<b-spinner small v-if="deleting" />
<i v-else class="fas fa-trash fa-fw" aria-hidden />
</b-button>
</footer>
</b-col>
</b-row>
</b-container>
@ -105,14 +162,15 @@
<script>
import { mapState } from 'vuex';
import GameNote from '@/components/GameNote';
import { getImageUrl } from '@/utils';
import { Editor, EditorContent } from '@tiptap/vue-2';
import StarterKit from '@tiptap/starter-kit';
export default {
getImageUrl,
components: {
GameNote,
EditorContent,
},
data() {
@ -121,7 +179,7 @@ export default {
note: '',
loading: false,
deleting: false,
showPreview: false,
editor: null,
};
},
@ -133,6 +191,10 @@ export default {
this.loadGame();
},
beforeDestroy() {
this.editor.destroy()
},
methods: {
async loadGame() {
const gameCached = this.game?.id == this.$route?.params?.id;
@ -155,6 +217,20 @@ export default {
setNote() {
this.note = this.notes[this.$route.params?.id] || '';
this.editor = new Editor({
content: this.note,
extensions: [StarterKit],
editorProps: {
attributes: {
class: 'border rounded p-3',
},
},
onUpdate: () => {
this.note = this.editor.getHTML();
},
})
},
async saveNote() {
@ -193,3 +269,9 @@ export default {
},
};
</script>
<style>
.ProseMirror {
min-height: 50vh;
}
</style>

View file

@ -1,3 +1,6 @@
<!-- TODO: add ports -->
<!-- TODO: add franchises -->
<!-- TODO: add bundles -->
<!-- TODO: improve text contrast when dark theme or bg is on -->
<!-- TODO: load game franchises -->
<!-- TODO: integrate with twitch -->
@ -10,12 +13,12 @@
<!-- TODO: optimize backdrop styling -->
<template lang="html">
<section>
<div v-if="backdrop" class="backdrop d-none d-sm-block" :style="`background-image: url('${backdrop.url}'); height: 500px; margin-top: -54px`" />
<b-spinner v-if="loading" class="spinner-centered" />
<b-container>
<b-spinner v-if="loading" class="spinner-centered" />
<template v-else-if="game">
<div v-if="backdrop" class="backdrop d-none d-sm-block" :style="`background-image: url('${backdrop.url}'); height: 500px; margin-top: -54px`" />
<template v-else-if="game">
<b-container>
<portal to="pageTitle">
<span
v-if="showHeaderTitle"
@ -107,16 +110,6 @@
xl="9"
>
<article :class="darkTheme || hasWallpaper ? 'text-light' : ''">
<aside class="supplemental-info field float-right ml-5 pb-2">
<game-details />
<game-note
v-if="note"
:note="note"
class="cursor-pointer mt-3 d-none d-md-block"
@click.native="$router.push({ name: 'game.notes', params: { id: game.id, slug: game.slug } })"
/>
</aside>
<div class="d-flex justify-content-between" v-b-visible="visibleHandler">
<h2 :class="{ 'mt-3': backdrop }">{{ game.name }}</h2>
@ -124,6 +117,16 @@
<game-description />
<b-alert
v-if="note"
v-html="note"
show
class="cursor-pointer"
variant="warning"
@click.native="$router.push({ name: 'game.notes', params: { id: game.id, slug: game.slug } })"
/>
<game-details />
<p>Alternative names:</p>
<div
@ -154,26 +157,26 @@
</b-row>
<game-media />
<similar-games />
</template>
<!-- <timeline
v-if="twitterHandle"
:id="twitterHandle"
sourceType="profile"
>
loading...
</timeline> -->
</b-container>
<div class="pt-5" v-else>
<div class="d-flex justify-content-center align-items-center" id="main">
<h1 class="mr-3 pr-3 align-top border-right inline-block align-content-center">404</h1>
<div class="inline-block align-middle">
<h2 class="font-weight-normal lead" id="desc">Game was not found.</h2>
</div>
<similar-games />
</template>
<div class="pt-5" v-else>
<div class="d-flex justify-content-center align-items-center" id="main">
<h1 class="mr-3 pr-3 align-top border-right inline-block align-content-center">404</h1>
<div class="inline-block align-middle">
<h2 class="font-weight-normal lead" id="desc">Game was not found.</h2>
</div>
</div>
<!-- <timeline
v-if="twitterHandle"
:id="twitterHandle"
sourceType="profile"
>
loading...
</timeline> -->
</b-container>
</div>
</section>
</template>
@ -188,7 +191,6 @@ import GameRatings from '@/components/Game/GameRatings';
import GameDescription from '@/components/Game/GameDescription';
import SimilarGames from '@/components/Game/SimilarGames';
// import GameSpeedruns from '@/components/Game/GameSpeedruns';
import GameNote from '@/components/GameNote';
import { STEAM_CATEGORY_ID, GOG_CATEGORY_ID, TWITTER_CATEGORY_ID } from '@/constants';
import { getImageUrl } from '@/utils';
@ -197,7 +199,6 @@ export default {
components: {
// AmazonLinks,
GameNote,
GameDescription,
GameDetails,
GameMedia,
@ -404,14 +405,6 @@ export default {
top: calc(50% - 25px);
}
.supplemental-info {
width: 40%;
@media(max-width: 780px) {
width: 100%;
}
}
.backdrop {
height: 300px;
background-size: cover;

View file

@ -30,7 +30,7 @@ Object.defineProperties(Vue.prototype, {
},
});
Vue.use(VueShortKey, { prevent: ['input', 'textarea'] });
Vue.use(VueShortKey, { prevent: ['input', 'textarea', '.ProseMirror'] });
Vue.use(PortalVue);
Vue.use(BootstrapVue, bootstrapSettings);
Vue.use(VueAnalytics, { id: 'UA-120053966-1', router });

View file

@ -76,9 +76,7 @@
</div>
</b-button>
<p class="note-text text-muted small" v-if="note">
{{ note }}
</p>
<p class="note-text text-muted small" v-if="note" v-html="note" />
</b-card-text>
</b-card>
</b-card-group>

195
yarn.lock
View file

@ -1984,6 +1984,11 @@
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
"@popperjs/core@^2.9.0":
version "2.11.6"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
@ -2135,6 +2140,171 @@
magic-string "^0.25.0"
string.prototype.matchall "^4.0.6"
"@tiptap/core@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.204.tgz#ec37e333718ed21b399e394cea06b7ab4653bbd3"
integrity sha512-MH4LQE6rvX+DAy83tZH5E6gaA/hO5A6F/w5ZM6En5PcRhNsgpfQl+kjRfeVQYahxouc1mzetayhRe4XQ8PAwng==
dependencies:
prosemirror-commands "^1.3.1"
prosemirror-keymap "^1.2.0"
prosemirror-model "^1.18.1"
prosemirror-schema-list "^1.2.2"
prosemirror-state "^1.4.1"
prosemirror-transform "^1.7.0"
prosemirror-view "^1.28.2"
"@tiptap/extension-blockquote@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.204.tgz#afded2b41c7385a2cbbc01fd68bc9daa75f66289"
integrity sha512-B26qM1rChbanQ4PwCpT8M1OKH27ZDFr2vUwQZosWZMRe9W5ivj9zhMGfWKDmIuKI5KwQ87y7sjcqmNEB61v81w==
"@tiptap/extension-bold@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.204.tgz#6ac7f931c5478afc30f2e203f967e47ee71c6fca"
integrity sha512-IZh7BXM6we4zwEwsjsyVdb2q/Op/IOAvBBxvD6lhuE/Fmm2tWprRt2Tb9YB+IMLlH5ouiqKG1Jtk7D520ijoFg==
"@tiptap/extension-bubble-menu@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.204.tgz#481209921e360cfc53215f3539b7f9e9ba54356f"
integrity sha512-rDBId9MePh5vuxStCfBQTXMvRy2kaadl76xL5jscqpOlCRVJO77IEZLNI8I/zyguDKdClw1x/zdEXBcBV3YuZQ==
dependencies:
prosemirror-state "^1.4.1"
prosemirror-view "^1.28.2"
tippy.js "^6.3.7"
"@tiptap/extension-bullet-list@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.204.tgz#6f96a1fcb7131f5f55c60633b2deb3d6ff7271c7"
integrity sha512-q8TtC+6wHG5bJ4Fj6h+7rIB5aL+G5214woEKRZNmRpcW4y4ZI2tTwNgxLy9cgEHgV31FwL6j6wpzYxRWwJwbeQ==
"@tiptap/extension-code-block@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.204.tgz#7609190a42534b30c0c3c041edcbd72bd1427d5d"
integrity sha512-IIkZsBT7rxhK7yHnM2LRQfS6i+HNQxU+E6tRtPYF40YSg1xMZSC/xDy0k+NEU/xM6ZVesRofW3voB6svFPPDtw==
dependencies:
prosemirror-state "^1.4.1"
"@tiptap/extension-code@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.204.tgz#886e68a618b7a11a4d4f79734b4720c4c72e162e"
integrity sha512-uEirc6xaSRikYFrVPfqIc/q9eSx9ULmHeFIqeFtIb9omX4NSDdEQpiu6D4yylaZV1p+ZsCeBq9tE3zupCKTdlw==
"@tiptap/extension-document@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.204.tgz#746d1b84ae3d47b6b4073fd3378dde4ff93434ce"
integrity sha512-1WrL8MWGJ8CCHIg6wZNI6mZ44BNiJYfiZnNPZia/dZlp+B/XxvBHoFuPOGWl7kw0Ow135NUaS8kxfEewtSJUDA==
"@tiptap/extension-dropcursor@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.204.tgz#ace4b43135b3593aff7f41011644223f41cc308c"
integrity sha512-M5XT+JhxYylqYL27Tldtun8RNDa0rrLYlPeMNQECWOl9iOBNM1y37/CnX8X7YGfJu5cXKCpIZ4fuKbmnN4Ekeg==
dependencies:
prosemirror-dropcursor "1.5.0"
"@tiptap/extension-floating-menu@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.204.tgz#45913d5ddd9b01cfd0104e762736e3e175e1a2ad"
integrity sha512-8CycAaQd3nNq251YO7kmFXDXTjlga0vU+W42K33VzscaiVzowrdfZZ3IN9Ezn3Q5v25sWbu2b9b+yVv2McNm/A==
dependencies:
prosemirror-state "^1.4.1"
prosemirror-view "^1.28.2"
tippy.js "^6.3.7"
"@tiptap/extension-gapcursor@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.204.tgz#23b6a4eb1d21bd039599b5c38f6bc917b85c35a2"
integrity sha512-gqnpGFkMXeFOvmyPy8kJ/i2DrzwdSm1Mwjustl/cASIRcu1Gp4l6pImdW+Gdh6gwhSEsuPctK/L5hSQvKGGKZg==
dependencies:
prosemirror-gapcursor "^1.3.1"
"@tiptap/extension-hard-break@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.204.tgz#d0cf4957249652afbfbe380c81793ca1b22d698c"
integrity sha512-UIrIlEgcwlPcku6f4QCQZRPjAMwiPyWPT0wnL4QowoX3ddrmmzOW2WCttGulpCCcFSvD/9Vgxd3QGQ0AbjyB4g==
"@tiptap/extension-heading@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.204.tgz#788b05538c5e3ab9e2431cf64d80046f73c18ef3"
integrity sha512-myb3O/IvdZ3E6aQhFUI4NkO8no4jXZGRFqjtPYwX6Vw72iHcy2ubY7EMR4k5hHxAvRbjbccpq8yAkvRHVmh/BQ==
"@tiptap/extension-history@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.204.tgz#4de0a951d5e8f350a1d07f88ea625cb953478c74"
integrity sha512-Dk64Nu2bnPutLV0Fd2H1c5ffGE+bQ2eVyWUrAGodAhZJINouN8EF7T0pZLSo0YaIlLMWsl23fImGtBEyVYQUKw==
dependencies:
prosemirror-history "^1.3.0"
"@tiptap/extension-horizontal-rule@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.204.tgz#4b88c5ddb1baa0c83bf2d3a95008d149defca424"
integrity sha512-nluilG/AwPENvZMlCWDYFAI6ZNhKZ9eivItYFt5uKD388rIuXHyhU8N2lqIvVDZWADHyRcTm2Gs2cTM+wV5V7A==
dependencies:
prosemirror-state "^1.4.1"
"@tiptap/extension-italic@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.204.tgz#42aa3c7e08211e3d0b9587fef9bdb0dd0c9fff85"
integrity sha512-aGKJNNbiDc9HGwCgSW4KMWjPPoI4L6RTUqzaGLbetO6WGShaSSPhGE8HiD0kLSfr6H+/cvuX3iwHjWUbgIbbcw==
"@tiptap/extension-list-item@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.204.tgz#c7ee6954794e963d578d6e1cf96599d184b25b33"
integrity sha512-L4blRuqQJCwwkqnB0We5SQsWVCIFAFqZyGXuRNLaKYQgxNDkvsq/xpgFf5qyX2jONK32Ke29DKURnrTy/SHDCQ==
"@tiptap/extension-ordered-list@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.204.tgz#ca1f98aea9fff881e6ca5e49a54c7fac32eabd81"
integrity sha512-5oySkWZq/Qf62Vde6KLGiW0pNnhIShKhvT1W796Hg4BxN6jvr9WT8iQQyrLNqth9ljo00wXd7V5P9qm9YWVmQw==
"@tiptap/extension-paragraph@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.204.tgz#e5b86793752223054e0b1768315c213e1c1937cd"
integrity sha512-Vdo0qKsD3TjgiJlVUqyV/lkFH2MlmMPt3q0+qHqoQhG/Rirm4vzrStHfZmX6nASbXSiQJvKEVoQ18+Nk739jsA==
"@tiptap/extension-strike@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.204.tgz#65277e131b417959c1006b236e0976d74fc1bb55"
integrity sha512-KwcKmpl4IIiKMlmvxc9+120tTtICwDDI20ExcFfoT0cCjrM8TA88H/xdw9Paj5Eofs7ODa75zPudKwoL3qhRZg==
"@tiptap/extension-text@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.204.tgz#07dc68c02402eac3b3d580bae278d3d3630ad705"
integrity sha512-YTUlmhdiaTRvsbxTa1VUZ2BNgsaud1OF2nSC6a3kEplREoVzJW+pbJxc1sdM5yhOW3JdXMJVTl56H30Cos4tAA==
"@tiptap/starter-kit@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.204.tgz#12fb0701d7c37f022b94042f430f1518beeea072"
integrity sha512-VTjQFKyByBpCXk6k8s/o/xO5m98oJ/raLvDt3XLCehjMgqyePfv0tKjIg2MlPKe/Bbog1RgEix1O1RJy9vL4xw==
dependencies:
"@tiptap/core" "^2.0.0-beta.204"
"@tiptap/extension-blockquote" "^2.0.0-beta.204"
"@tiptap/extension-bold" "^2.0.0-beta.204"
"@tiptap/extension-bullet-list" "^2.0.0-beta.204"
"@tiptap/extension-code" "^2.0.0-beta.204"
"@tiptap/extension-code-block" "^2.0.0-beta.204"
"@tiptap/extension-document" "^2.0.0-beta.204"
"@tiptap/extension-dropcursor" "^2.0.0-beta.204"
"@tiptap/extension-gapcursor" "^2.0.0-beta.204"
"@tiptap/extension-hard-break" "^2.0.0-beta.204"
"@tiptap/extension-heading" "^2.0.0-beta.204"
"@tiptap/extension-history" "^2.0.0-beta.204"
"@tiptap/extension-horizontal-rule" "^2.0.0-beta.204"
"@tiptap/extension-italic" "^2.0.0-beta.204"
"@tiptap/extension-list-item" "^2.0.0-beta.204"
"@tiptap/extension-ordered-list" "^2.0.0-beta.204"
"@tiptap/extension-paragraph" "^2.0.0-beta.204"
"@tiptap/extension-strike" "^2.0.0-beta.204"
"@tiptap/extension-text" "^2.0.0-beta.204"
"@tiptap/vue-2@^2.0.0-beta.204":
version "2.0.0-beta.204"
resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.204.tgz#0eb899e309878cf6a721b350b5dd1ccf4099698c"
integrity sha512-1J7L7MV9d/R3i93y11Rstf7e4nMi8gmDZa88TyTmrjpLT7HqyuiDGM2bYrTY2JdaD4ispjmdoiF7Y0oW5pg93g==
dependencies:
"@tiptap/extension-bubble-menu" "^2.0.0-beta.204"
"@tiptap/extension-floating-menu" "^2.0.0-beta.204"
prosemirror-view "^1.28.2"
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@ -8983,6 +9153,15 @@ prosemirror-commands@^1.3.1:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.0.0"
prosemirror-dropcursor@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.5.0.tgz#edbc61d6f71f9f924130eec8e85b0861357957c9"
integrity sha512-vy7i77ddKyXlu8kKBB3nlxLBnsWyKUmQIPB5x8RkYNh01QNp/qqGmdd5yZefJs0s3rtv5r7Izfu2qbtr+tYAMQ==
dependencies:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
prosemirror-dropcursor@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.0.tgz#35b891224f79319755cadbec0e075bba8e95a0a3"
@ -9067,6 +9246,15 @@ prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.28.0:
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
prosemirror-view@^1.28.2:
version "1.29.1"
resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.29.1.tgz#9a4938d1a863ca76e23c6573d30e3ece2b17d9a0"
integrity sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==
dependencies:
prosemirror-model "^1.16.0"
prosemirror-state "^1.0.0"
prosemirror-transform "^1.1.0"
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
@ -10398,6 +10586,13 @@ thunky@^1.0.2:
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
tippy.js@^6.3.7:
version "6.3.7"
resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c"
integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==
dependencies:
"@popperjs/core" "^2.9.0"
tmp@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"