diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1716d1d..4d6c88a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,5 +1,9 @@ name: UI CI -on: [push] +on: + push: + branches: + - main + - build env: IMAGE: saferwall/ui jobs: diff --git a/package.json b/package.json index 1d42e32..f9a3263 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ }, "dependencies": { "@tailwindcss/postcss7-compat": "^2.1.2", + "@tiptap/starter-kit": "^2.0.0-beta.112", + "@tiptap/vue-3": "^2.0.0-beta.64", "axios": "^0.21.1", "core-js": "^3.6.5", "dateformat": "^4.5.1", diff --git a/src/assets/images/logo.svg b/src/assets/images/logo.svg new file mode 100644 index 0000000..bb1cab9 --- /dev/null +++ b/src/assets/images/logo.svg @@ -0,0 +1,100 @@ + + + + + + t + + \ No newline at end of file diff --git a/src/common/components/Progress.vue b/src/common/components/Progress.vue index 3ab4287..797a179 100644 --- a/src/common/components/Progress.vue +++ b/src/common/components/Progress.vue @@ -1,149 +1,55 @@ \ No newline at end of file diff --git a/src/common/components/elements/Logo.vue b/src/common/components/elements/Logo.vue index d868ca0..cf50dc4 100644 --- a/src/common/components/elements/Logo.vue +++ b/src/common/components/elements/Logo.vue @@ -1,5 +1,12 @@ diff --git a/src/common/components/elements/activity/ShortFollower.vue b/src/common/components/elements/activity/ShortFollower.vue index dd71d18..882b01e 100644 --- a/src/common/components/elements/activity/ShortFollower.vue +++ b/src/common/components/elements/activity/ShortFollower.vue @@ -15,7 +15,7 @@
@@ -24,7 +24,7 @@ \ No newline at end of file diff --git a/src/common/components/partials/Footer.vue b/src/common/components/partials/Footer.vue index b6b6e57..ad19cea 100644 --- a/src/common/components/partials/Footer.vue +++ b/src/common/components/partials/Footer.vue @@ -6,23 +6,32 @@
-

Developed with ❤ by {{ name }}.

+

Developed with by {{ name }}.

- - + + - - +
@@ -62,5 +71,12 @@ footer { &.sactive .content { @apply w-full; } + + .love { + @apply text-red-500 font-extrabold; + } + .twitter { + @apply fill-blue-500; + } } \ No newline at end of file diff --git a/src/common/components/partials/Sidebar.vue b/src/common/components/partials/Sidebar.vue index db637a1..84d4533 100644 --- a/src/common/components/partials/Sidebar.vue +++ b/src/common/components/partials/Sidebar.vue @@ -139,6 +139,9 @@ Comments + {{ + (file && file.comments_count && `(${file.comments_count}) `) || "" + }} @@ -175,8 +178,8 @@ export default { }, }, async beforeMount() { - this.file = await this.getFileSummary; - this.hash = this.file.properties.SHA256; + this.file = await this.getFile; + this.hash = this.file.sha256; }, }; diff --git a/src/common/functions.js b/src/common/functions.js index 74d76e5..c2a1331 100644 --- a/src/common/functions.js +++ b/src/common/functions.js @@ -1,66 +1,5 @@ import { avgList } from '@/common/data/avg' -/** - * Get Time ago - * - * @param {object|string} dateParam - * @returns {string} - */ -export function timeAgo(dateParam) { - if (!dateParam) { - return null; - } - - const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam); - const DAY_IN_MS = 86400000; // 24 * 60 * 60 * 1000 - const today = new Date(); - const yesterday = new Date(today - DAY_IN_MS); - const seconds = Math.round((today - date) / 1000); - const minutes = Math.round(seconds / 60); - const isToday = today.toDateString() === date.toDateString(); - const isYesterday = yesterday.toDateString() === date.toDateString(); - - - if (seconds < 5) { - return 'now'; - } else if (seconds < 60) { - return `${seconds} seconds ago`; - } else if (seconds < 90) { - return 'about a minute ago'; - } else if (minutes < 60) { - return `${minutes} minutes ago`; - } else if (isToday) { - return 'Today' - } else if (isYesterday) { - return 'Yesterday' - } - return today.getFullYear(); -} - -/** - * Get time ago - * Return only one of : (year||month||day||hour||minute||second) - * - * @param {Number|String} dateParam - * @returns {string} - */ -export function timeAgoCounts(dateParam) { - const time = typeof dateParam === 'number' ? dateParam : Date.parse(dateParam); - - let seconds = Math.floor((Date.now() - time * 1000) / 1000); - - let intervals = { 'year': 31536000, 'month': 2592000, 'day': 86400, 'hours': 3600, 'minutes': 60, 'second': 1 }; - let interval = 0; - - let intkey = Object.keys(intervals).find(_key => { - interval = seconds / intervals[_key]; - return interval > 1; - }); - - let fi = Math.floor(interval); - return `${fi} ${intkey}${fi === 1 ? '' : 's'}`; -} - /** * Check if name in the list of avg * @param {String} name diff --git a/src/common/utils/date-format.js b/src/common/utils/date-format.js index 029caab..13e3518 100644 --- a/src/common/utils/date-format.js +++ b/src/common/utils/date-format.js @@ -4,4 +4,65 @@ export const DATE_FORMAT = "MMMM Do YYYY"; export function timestampToDate(timestamp) { return moment(timestamp * 1000).format(DATE_FORMAT); +} + +/** + * Get Time ago + * + * @param {object|string} dateParam + * @returns {string} + */ +export function timeAgo(dateParam) { + if (!dateParam) { + return null; + } + + const date = typeof dateParam === 'object' ? dateParam : new Date(dateParam); + const DAY_IN_MS = 86400000; // 24 * 60 * 60 * 1000 + const today = new Date(); + const yesterday = new Date(today - DAY_IN_MS); + const seconds = Math.round((today - date) / 1000); + const minutes = Math.round(seconds / 60); + const isToday = today.toDateString() === date.toDateString(); + const isYesterday = yesterday.toDateString() === date.toDateString(); + + + if (seconds < 5) { + return 'now'; + } else if (seconds < 60) { + return `${seconds} seconds ago`; + } else if (seconds < 90) { + return 'about a minute ago'; + } else if (minutes < 60) { + return `${minutes} minutes ago`; + } else if (isToday) { + return 'Today' + } else if (isYesterday) { + return 'Yesterday' + } + return today.getFullYear(); +} + +/** + * Get time ago + * Return only one of : (year||month||day||hour||minute||second) + * + * @param {Number|String} dateParam + * @returns {string} + */ +export function timeAgoCounts(dateParam) { + const time = typeof dateParam === 'number' ? dateParam : Date.parse(dateParam); + + let seconds = Math.floor((Date.now() - time * 1000) / 1000); + + let intervals = { 'year': 31536000, 'month': 2592000, 'day': 86400, 'hours': 3600, 'minutes': 60, 'second': 1 }; + let interval = 0; + + let intkey = Object.keys(intervals).find(_key => { + interval = seconds / intervals[_key]; + return interval > 1; + }); + + let fi = Math.floor(interval); + return `${fi} ${intkey}${fi === 1 ? '' : 's'}`; } \ No newline at end of file diff --git a/src/layouts/SidebarLayout.vue b/src/layouts/SidebarLayout.vue index 175cf8d..b86caef 100644 --- a/src/layouts/SidebarLayout.vue +++ b/src/layouts/SidebarLayout.vue @@ -12,6 +12,13 @@ > + + + + @@ -22,6 +29,7 @@ import BaseLayout from "@/layouts/BaseLayout.vue"; import Navbar from "@/common/components/partials/Navbar.vue"; import Sidebar from "@/common/components/partials/Sidebar.vue"; import Content from "@/common/components/content/PageContent.vue"; +import Footer from "@/common/components/partials/Footer.vue"; export default { components: { @@ -29,6 +37,7 @@ export default { Content, Sidebar, Navbar, + Footer, }, data: () => ({ title: "Summary", @@ -65,3 +74,20 @@ export default { @apply md:w-scontent md:m-0 md:ml-auto md:px-16; } + + diff --git a/src/middlewares/log.js b/src/middlewares/log.js new file mode 100644 index 0000000..ae73fdf --- /dev/null +++ b/src/middlewares/log.js @@ -0,0 +1,5 @@ +export default function log({ next, to }) { + console.log(to); + + return next(); +} \ No newline at end of file diff --git a/src/middlewares/scan.js b/src/middlewares/scan.js index b81c1fb..7203770 100644 --- a/src/middlewares/scan.js +++ b/src/middlewares/scan.js @@ -1,10 +1,12 @@ import { createToast } from 'mosha-vue-toastify'; export default async ({ store, to, next }) => { - let selectedFile = await store.getters['scan/getFileSummary']; + let fileHash = to.params.id; - if (!selectedFile) { - selectedFile = store.dispatch('scan/fetchFileSummary', to.params.id); + let selectedFile = await store.getters['scan/getFile']; + + if (!selectedFile || selectedFile.sha256 != fileHash) { + selectedFile = store.dispatch('scan/fetchFile', fileHash); await selectedFile.catch(err => { if (err) { diff --git a/src/modules/profile/components/ProfileBox.vue b/src/modules/profile/components/ProfileBox.vue index 3d2d9ef..d0cfdde 100644 --- a/src/modules/profile/components/ProfileBox.vue +++ b/src/modules/profile/components/ProfileBox.vue @@ -40,7 +40,7 @@ + + + \ No newline at end of file diff --git a/src/modules/scan/components/Tiptap.vue b/src/modules/scan/components/Tiptap.vue new file mode 100644 index 0000000..b4e6bde --- /dev/null +++ b/src/modules/scan/components/Tiptap.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/src/modules/scan/pages/Comments.vue b/src/modules/scan/pages/Comments.vue index 60ff4f7..98b84f3 100644 --- a/src/modules/scan/pages/Comments.vue +++ b/src/modules/scan/pages/Comments.vue @@ -1,5 +1,31 @@ \ No newline at end of file + + + diff --git a/src/router/routes.js b/src/router/routes.js index f934d25..5a14196 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -1,5 +1,6 @@ import authMiddleware, { noAuthMiddleware } from '@/middlewares/auth'; import scanMiddleware from '@/middlewares/scan'; +import logMiddleware from '@/middlewares/log'; /** * Tags Module routes @@ -29,6 +30,9 @@ const scanModuleRoutes = [ component: () => import('@/modules/scan/pages/Summary.vue'), meta: { title: 'File Summary', + middleware: [ + async ({ store, to, next }) => { await store.dispatch('scan/fetchFileSummary', to.params.id), next() } + ] } }, { @@ -77,6 +81,9 @@ const scanModuleRoutes = [ component: () => import('@/modules/scan/pages/Comments.vue'), meta: { title: 'Comments', + middleware: [ + async ({ store, to, next }) => { await store.dispatch('scan/fetchFileComments', to.params.id), next() } + ] } }, ].map(route => { @@ -85,9 +92,12 @@ const scanModuleRoutes = [ layout: 'SidebarLayout', ...route.meta, middleware: [ - scanMiddleware + logMiddleware, + scanMiddleware, + ...(route.meta && route.meta.middleware || []), ], } + return route; }); diff --git a/src/state/helpers.js b/src/state/helpers.js index 8004cb0..970b373 100644 --- a/src/state/helpers.js +++ b/src/state/helpers.js @@ -30,8 +30,8 @@ const followActions = mapActions('actions', ['doFollow', 'doUnFollow']); /** * Scan */ -const scanMethods = mapActions('scan', []); -const scanGetters = mapGetters('scan', ['getFileSummary']); +const scanMethods = mapActions('scan', ['fetchFileSummary', 'fetchFileComments']); +const scanGetters = mapGetters('scan', ['getFile', 'getFileSummary', 'getFileComments']); export { diff --git a/src/state/modules/scan.js b/src/state/modules/scan.js index 5ddc990..c575ea2 100644 --- a/src/state/modules/scan.js +++ b/src/state/modules/scan.js @@ -1,30 +1,56 @@ import axios from '@/services/axios' export const fields = { - summary: [ - - ] + file: ['sha256', 'size', 'comments_count', 'submissions'], + summary: [] } export const state = { - selectedFile: null + file: null, + summary: {}, + comments: [] } export const getters = { + getFile(state) { + return state.file; + }, getFileSummary(state) { - return state.selectedFile; + return state.summary; + }, + getFileComments(state) { + return state.comments; } } export const mutations = { + SET_FILE(state, file) { + state.file = file; + }, + SET_FILE_COMMENTS(state, comments) { + state.comments = comments; + }, SET_FILE_SUMMARY(state, file) { - state.selectedFile = file; + state.summary = file; } } export const actions = { + async fetchFile({ commit }, id) { + return axios.get(`/files/${id}?fields=` + fields.file.join(',')) + .then(res => { + let data = res.data; + data.lastupdate = (data.submissions || []).reduce((bg, sub) => { + if (sub.timestamp > bg) return sub.timestamp; + return bg; + }, 0); + + commit('SET_FILE', data); + return data; + }); + }, async fetchFileSummary({ commit }, id) { return axios.get(`/files/${id}/summary`) .then(res => { @@ -33,5 +59,14 @@ export const actions = { commit('SET_FILE_SUMMARY', data); return data; }); + }, + async fetchFileComments({ commit }, id) { + return axios.get(`/files/${id}/comments`) + .then(res => { + let data = res.data.items || []; + + commit('SET_FILE_COMMENTS', data); + return data; + }); } } diff --git a/tailwind.config.js b/tailwind.config.js index a59afd4..72069d7 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -56,10 +56,10 @@ module.exports = { 'scontent': 'calc(100% - 280px)', }, height: { - 'navbar': '4.6rem', + 'navbar': '4.3rem', }, inset: { - 'navbar': '4.6rem', + 'navbar': '4.3rem', }, }, minWidth: theme => ({ diff --git a/yarn.lock b/yarn.lock index e8f9d82..ea6b937 100644 --- a/yarn.lock +++ b/yarn.lock @@ -978,6 +978,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@popperjs/core@^2.8.3": + version "2.10.1" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be" + integrity sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw== + "@soda/friendly-errors-webpack-plugin@^1.7.1": version "1.8.0" resolved "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz" @@ -1033,6 +1038,192 @@ resolve "^1.20.0" tmp "^0.2.1" +"@tiptap/core@^2.0.0-beta.113": + version "2.0.0-beta.113" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.113.tgz#c0e475ea8f0f87ec79037b702e2f6c694be6a942" + integrity sha512-vKQ2gYIzimBOcOjZlc8CBKzSdKbZcVsa+r+t1Lvsbc6ynm7IFEbYhG1VPTV3S6DmFy+apLwhmXKbMCf8PN9xDQ== + dependencies: + "@types/prosemirror-commands" "^1.0.4" + "@types/prosemirror-inputrules" "^1.0.4" + "@types/prosemirror-keymap" "^1.0.4" + "@types/prosemirror-model" "^1.13.2" + "@types/prosemirror-schema-list" "^1.0.3" + "@types/prosemirror-state" "^1.2.7" + "@types/prosemirror-transform" "^1.1.4" + "@types/prosemirror-view" "^1.19.1" + prosemirror-commands "^1.1.10" + prosemirror-inputrules "^1.1.3" + prosemirror-keymap "^1.1.3" + prosemirror-model "^1.14.3" + prosemirror-schema-list "^1.1.6" + prosemirror-state "^1.3.4" + prosemirror-transform "^1.3.2" + prosemirror-view "^1.20.1" + +"@tiptap/extension-blockquote@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.15.tgz#40be203f7db47e027ea1a5ba42bbb0e33bb6c004" + integrity sha512-Cso44KsYsqKqaNveQmx5KVaLy9krq5AzE9WhGVDBSFqWhvuIJkQYrTRBbOTfUDs/st9VuwJrbjTDD65ow50wEw== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-bold@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.15.tgz#cf9ddb3fc316be9707753ad4e497bfb8a3ebb0c2" + integrity sha512-jKyV6iiwhxwa0+7uuKD74jNDVNLNOS1GmU14MgaA95pY5e1fyaRBPPX8Gtt89niz2CLOY711AV17RPZTe/e60w== + +"@tiptap/extension-bubble-menu@^2.0.0-beta.36": + version "2.0.0-beta.36" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.36.tgz#11da1dc733253f5ac4761a5da0ec56618914ddeb" + integrity sha512-z2l326tDGHlgF0yFMxqG6cSJALkP8nvVRJL8r2cRjs/DaYTCCyjSGiz1TSwZXuwLkEOt2zyR71IOE42m4bpcNA== + dependencies: + prosemirror-state "^1.3.4" + prosemirror-view "^1.20.1" + tippy.js "^6.3.1" + +"@tiptap/extension-bullet-list@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.15.tgz#74876851a8d227ba1a031d031631ed621c175e05" + integrity sha512-5i44JzsZOh8Ci6CuYRQy6W3jCpYgX0+VuJKeHvZ6Aomy4Qqrtc9Jk43PBmCj91lNUUtH6Io9l+kDrLCumEFnEg== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-code-block@^2.0.0-beta.18": + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.18.tgz#3b43730cfca1ba26171530951b3cc324a500cb11" + integrity sha512-E2gz7ovl9nXLZzheqLyN3hi7A10fCaodDn4DvIl4wiEbKZpF7WFBNeb+FQetWNay9UWNeDO94SCX9+rT9H+yHA== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-code@^2.0.0-beta.16": + version "2.0.0-beta.16" + resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.16.tgz#b258ff90ebe703a4d36ff0c650e6b2cab634028d" + integrity sha512-Kakg/RMiVrxjzIkLVDXtbCzRh/9W8dgSG04IhMZNOI8N9vWn8Z78jdUyxEEDTcL/JyWWcMxn9AsJw2U5ajO3pA== + +"@tiptap/extension-document@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.13.tgz#8cfb29d4de64bf4a790817f730c05b4f9b7167b2" + integrity sha512-nrufdKziA/wovaY4DjGkc8OGuIZi8CH8CW3+yYfeWbruwFKkyZHlZy9nplFWSEqBHPAeqD+px9r91yGMW3ontA== + +"@tiptap/extension-dropcursor@^2.0.0-beta.19": + version "2.0.0-beta.19" + resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.19.tgz#8a37ffe27e484eb44dd18297830d1fd8ce0c50ce" + integrity sha512-rslIcVvD42NNh5sEbkCkG03DWMFBrS5KoK+lDOdIcC1DjmTtpVgcLvvE01btzaB3ljx+UVqI2Zaxa6VOiTeEMw== + dependencies: + "@types/prosemirror-dropcursor" "^1.0.3" + prosemirror-dropcursor "^1.3.5" + +"@tiptap/extension-floating-menu@^2.0.0-beta.30": + version "2.0.0-beta.30" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.30.tgz#0da60ef7e417a8a0f367514bdf82306160942f75" + integrity sha512-/JEk9BCurglUQtL83UI6NNS2buBL0wnVKXPPFFqQJ+7YzrKLZnz/ZW180UdJ2hN0J2waLfr1F65OgyLCK4073A== + dependencies: + prosemirror-state "^1.3.4" + prosemirror-view "^1.20.1" + tippy.js "^6.3.1" + +"@tiptap/extension-gapcursor@^2.0.0-beta.21": + version "2.0.0-beta.21" + resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.21.tgz#7cd668d6ac1dd843a267194a1175646cb2d1b20a" + integrity sha512-CWOddG/Lt/0BcJ55TJrnOQdj84EAfumUPbGwmsAPsWX4WH7wTMNy6ET679K3/2EDpDDdrb8sOzsaDCtJhcD/vw== + dependencies: + "@types/prosemirror-gapcursor" "^1.0.4" + prosemirror-gapcursor "^1.2.0" + +"@tiptap/extension-hard-break@^2.0.0-beta.18": + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.18.tgz#b379bc8ac625fa886b40acd3edcdbbb94f7b0b19" + integrity sha512-9wXXAMGrD9bxcQYj74ps9G/dkbDhra5dU5fqZgw7C2Y6VtHdk350S5BMXm1LYez6rEBQWVZENeDEePe1fJHIgA== + +"@tiptap/extension-heading@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.15.tgz#d62f32a2ec8ce5a6d4e716aa7a45dfb707283848" + integrity sha512-UoXDwEdCV9KiPh0wj0jj2Jt6VDqkoTaSU3d9bmEBLwg1Gjgbuv39JDst7oxSqbf9rgbl3txbeOy35wVBKe9CqA== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-history@^2.0.0-beta.16": + version "2.0.0-beta.16" + resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.16.tgz#f40317bab795e2daf981aa1a01d6025f306be72c" + integrity sha512-nrNwV8a7zUt1t2I/kPX5Y6N9vZ8mrugimJIQmPGIp/4mmw1SEUzkaPpIsv6+ELmqMHSDktQ0ofb3pXeWDXWZvw== + dependencies: + "@types/prosemirror-history" "^1.0.3" + prosemirror-history "^1.2.0" + +"@tiptap/extension-horizontal-rule@^2.0.0-beta.19": + version "2.0.0-beta.19" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.19.tgz#d98d0070a2cead32a497b62586c0e259d31f3f2e" + integrity sha512-RrU7+inExgC+rRmFWoTxALbu/IgRGRik11LPhMhqrCB+n0XFRUMyVEb/jbfgHWVrPmTXq0MbSWW6LYw3iREzRA== + dependencies: + prosemirror-state "^1.3.4" + +"@tiptap/extension-italic@^2.0.0-beta.15": + version "2.0.0-beta.15" + resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.15.tgz#9a81f686cf221110478935596f0b47a76d4c2f45" + integrity sha512-ZCz1vCysLdvOUrwODuyBP0BDaemCLh6ib7qTYoSDKdive9kfn0Vc5Fg3o8xgHrtrUfwKIJz/sWOknjDEGIc9cw== + +"@tiptap/extension-list-item@^2.0.0-beta.14": + version "2.0.0-beta.14" + resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.14.tgz#65a9ff9daa11bc9ca8bc2989a891abe68081cfbd" + integrity sha512-t6xwEqP+d5443Ul2Jvqz9kXb3ro7bA7yY9HA0vskm3120WxxHW9jxgxZN+82Ot5Tm7nXOAlsN6vuqnt4idnxZQ== + +"@tiptap/extension-ordered-list@^2.0.0-beta.16": + version "2.0.0-beta.16" + resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.16.tgz#3ef25a8dd8ddbd2b1aa5ce89d5a2e5a3ecafcf4e" + integrity sha512-3n0h5FBfQqBrN/zqF/Ngoyd1bZxeIRLwWI7ak4KulpvOg5V/yw3sw5CSxr2f13ZI9AgGaTq8yOsTYs9dkCCnsQ== + dependencies: + prosemirror-inputrules "^1.1.3" + +"@tiptap/extension-paragraph@^2.0.0-beta.17": + version "2.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.17.tgz#f8f0263359b95dec9c10078699697908568d9be9" + integrity sha512-qCQVCf9c2hgaeIdfy22PaoZyW5Vare/1aGkOEAaZma5RjrUbV9hrRKwoW9LsDjnh1EN1fIeKdg02yEhnHWtG8A== + +"@tiptap/extension-strike@^2.0.0-beta.17": + version "2.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.17.tgz#2280ea4e8c50189c2729814d2ae484e58c712a36" + integrity sha512-+WRd0RuCK4+jFKNVN+4rHTa5VMqqGDO2uc+TknkqhFqWp/z96OAGlpHJOwPrnW1fLbpjEBBQIr1vVYSw6KgcZg== + +"@tiptap/extension-text@^2.0.0-beta.13": + version "2.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz#da0af8d9a3f149d20076e15d88c6af21fb6d940f" + integrity sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw== + +"@tiptap/starter-kit@^2.0.0-beta.112": + version "2.0.0-beta.112" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.112.tgz#3dddeab1d78b453cb0c36822a43c17df677ae352" + integrity sha512-PmGHd4dhtYbl3+lnFOs6slER2wwtscQkZHd7/e91Gpaow7C9KpZ6g589F6yyN9BNfoN4qJsEPUI4upZwhan0ZQ== + dependencies: + "@tiptap/core" "^2.0.0-beta.113" + "@tiptap/extension-blockquote" "^2.0.0-beta.15" + "@tiptap/extension-bold" "^2.0.0-beta.15" + "@tiptap/extension-bullet-list" "^2.0.0-beta.15" + "@tiptap/extension-code" "^2.0.0-beta.16" + "@tiptap/extension-code-block" "^2.0.0-beta.18" + "@tiptap/extension-document" "^2.0.0-beta.13" + "@tiptap/extension-dropcursor" "^2.0.0-beta.19" + "@tiptap/extension-gapcursor" "^2.0.0-beta.21" + "@tiptap/extension-hard-break" "^2.0.0-beta.18" + "@tiptap/extension-heading" "^2.0.0-beta.15" + "@tiptap/extension-history" "^2.0.0-beta.16" + "@tiptap/extension-horizontal-rule" "^2.0.0-beta.19" + "@tiptap/extension-italic" "^2.0.0-beta.15" + "@tiptap/extension-list-item" "^2.0.0-beta.14" + "@tiptap/extension-ordered-list" "^2.0.0-beta.16" + "@tiptap/extension-paragraph" "^2.0.0-beta.17" + "@tiptap/extension-strike" "^2.0.0-beta.17" + "@tiptap/extension-text" "^2.0.0-beta.13" + +"@tiptap/vue-3@^2.0.0-beta.64": + version "2.0.0-beta.64" + resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.0.0-beta.64.tgz#d181d9ccf8111a4d80f309458a8eafce232a638d" + integrity sha512-BT+DJaMthZpt1VSa74z/R3Pcii0fyKhuNEKhOGmEKlr8eypKcfhrnhENcyusM9ayVW8DGO01AFjQ/tZnY6i5rA== + dependencies: + "@tiptap/extension-bubble-menu" "^2.0.0-beta.36" + "@tiptap/extension-floating-menu" "^2.0.0-beta.30" + prosemirror-state "^1.3.4" + prosemirror-view "^1.20.1" + "@types/body-parser@*": version "1.19.1" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz" @@ -1130,11 +1321,107 @@ resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/orderedmap@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/orderedmap/-/orderedmap-1.0.0.tgz#807455a192bba52cbbb4517044bc82bdbfa8c596" + integrity sha512-dxKo80TqYx3YtBipHwA/SdFmMMyLCnP+5mkEqN0eMjcTBzHkiiX0ES118DsjDBjvD+zeSsSU9jULTZ+frog+Gw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prosemirror-commands@*", "@types/prosemirror-commands@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-commands/-/prosemirror-commands-1.0.4.tgz#d08551415127d93ae62e7239d30db0b5e7208e22" + integrity sha512-utDNYB3EXLjAfYIcRWJe6pn3kcQ5kG4RijbT/0Y/TFOm6yhvYS/D9eJVnijdg9LDjykapcezchxGRqFD5LcyaQ== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-dropcursor@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-dropcursor/-/prosemirror-dropcursor-1.0.3.tgz#49250849b8a0b86e8c29eb1ba70a463e53e46947" + integrity sha512-b0/8njnJ4lwyHKcGuCMf3x7r1KjxyugB1R/c2iMCjplsJHSC7UY9+OysqgJR5uUXRekUSGniiLgBtac/lvH6wg== + dependencies: + "@types/prosemirror-state" "*" + +"@types/prosemirror-gapcursor@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.4.tgz#7df7d373edb33ea8da12084bfd462cf84cd69761" + integrity sha512-9xKjFIG5947dzerFvkLWp6F53JwrUYoYwh3SgcTFEp8SbSfNNrez/PFYVZKPnoqPoaK5WtTdQTaMwpCV9rXQIg== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-history@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-history/-/prosemirror-history-1.0.3.tgz#f1110efbe758129b5475e466ff077f0a8d9b964f" + integrity sha512-5TloMDRavgLjOAKXp1Li8u0xcsspzbT1Cm9F2pwHOkgvQOz1jWQb2VIXO7RVNsFjLBZdIXlyfSLivro3DuMWXg== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-inputrules@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-inputrules/-/prosemirror-inputrules-1.0.4.tgz#4cb75054d954aa0f6f42099be05eb6c0e6958bae" + integrity sha512-lJIMpOjO47SYozQybUkpV6QmfuQt7GZKHtVrvS+mR5UekA8NMC5HRIVMyaIauJLWhKU6oaNjpVaXdw41kh165g== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-keymap@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-keymap/-/prosemirror-keymap-1.0.4.tgz#f73c79810e8d0e0a20d153d84f998f02e5afbc0c" + integrity sha512-ycevwkqUh+jEQtPwqO7sWGcm+Sybmhu8MpBsM8DlO3+YTKnXbKA6SDz/+q14q1wK3UA8lHJyfR+v+GPxfUSemg== + dependencies: + "@types/prosemirror-commands" "*" + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-model@*", "@types/prosemirror-model@^1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.2.tgz#2adad3ec478f83204f155d7fb94c9dfde2fc3296" + integrity sha512-a2rDB0aZ+7aIP7uBqQq1wLb4Hg4qqEvpkCqvhsgT/gG8IWC0peCAZfQ24sgTco0qSJLeDgIbtPeU6mgr869/kg== + dependencies: + "@types/orderedmap" "*" + +"@types/prosemirror-schema-list@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-schema-list/-/prosemirror-schema-list-1.0.3.tgz#bdf1893a7915fbdc5c49b3cac9368e96213d70de" + integrity sha512-uWybOf+M2Ea7rlbs0yLsS4YJYNGXYtn4N+w8HCw3Vvfl6wBAROzlMt0gV/D/VW/7J/LlAjwMezuGe8xi24HzXA== + dependencies: + "@types/orderedmap" "*" + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.7": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/prosemirror-state/-/prosemirror-state-1.2.7.tgz#cd55062e4043a31e3426f47668f1d7038b5d8dfb" + integrity sha512-clJf5uw3/XQnBJtl2RqYXoLMGBySnLYl43xtDvFfQZKkLnnYcM1SDU8dcz7lWjl2Dm+H98RpLOl44pp7DYT+wA== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-transform" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-transform@*", "@types/prosemirror-transform@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.4.tgz#c3565e81b2ef3ce3254e6927d6f63eb8d7bb20d0" + integrity sha512-HP1PauvkqSgDquZut8HaLOTUDQ6jja/LAy4OA7tTS1XG7wqRnX3gLUyEj0mD6vFd4y8BPkNddNdOh/BeGHlUjg== + dependencies: + "@types/prosemirror-model" "*" + +"@types/prosemirror-view@*", "@types/prosemirror-view@^1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.19.1.tgz#f12309ef07dfb701d20c2e4d0292d42ba34a081b" + integrity sha512-fyQ4NVxAdfISWrE2qT8cpZdosXoH/1JuVYMBs9CdaXPbvi/8R2L2tkkcMRM314piKrO8nfYH5OBZKzP2Ax3jtA== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-transform" "*" + "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" @@ -6312,6 +6599,11 @@ ora@^3.4.0: strip-ansi "^5.2.0" wcwidth "^1.0.1" +orderedmap@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789" + integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ== + original@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/original/-/original-1.0.2.tgz" @@ -7096,6 +7388,98 @@ promise-inflight@^1.0.1: resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prosemirror-commands@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.10.tgz#406a6589966e6cd80809cea2d801fb998639b37d" + integrity sha512-IWyBBXNAd44RM6NnBPljwq+/CM2oYCQJkF+YhKEAZNwzW0uFdGf4qComhjbKZzqFdu6Iub2ZhNsXgwPibA0lCQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.5.tgz#d2808c17089df0e441ad66016aecc2b6457c8a1f" + integrity sha512-tNUwcF2lPAkwKBZPZRtbxpwljnODRNZ3eiYloN1DSUqDjMT1nBZm0nejaEMS1TvNQ+3amibUSAiV4hX+jpASFA== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-gapcursor@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.0.tgz#28fb60bf3d9baf1f920907d2c3e613137204e8f3" + integrity sha512-yCLy5+0rVqLir/KcHFathQj4Rf8aRHi80FmEfKtM0JmyzvwdomslLzDZ/pX4oFhFKDgjl/WBBBFNqDyNifWg7g== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.2.0.tgz#04cc4df8d2f7b2a46651a2780de191ada6d465ea" + integrity sha512-B9v9xtf4fYbKxQwIr+3wtTDNLDZcmMMmGiI3TAPShnUzvo+Rmv1GiUrsQChY1meetHl7rhML2cppF3FTs7f7UQ== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.3.tgz#93f9199ca02473259c30d7e352e4c14022d54638" + integrity sha512-ZaHCLyBtvbyIHv0f5p6boQTIJjlD6o2NPZiEaZWT2DA+j591zS29QQEMT4lBqwcLW3qRSf7ZvoKNbf05YrsStw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz#8b481bf8389a5ac40d38dbd67ec3da2c7eac6a6d" + integrity sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.14.3: + version "1.14.3" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.3.tgz#a9c250d3c4023ddf10ecb41a0a7a130e9741d37e" + integrity sha512-yzZlBaSxfUPIIP6U5Edh5zKxJPZ5f7bwZRhiCuH3UYkWhj+P3d8swHsbuAMOu/iDatDc5J/Qs5Mb3++mZf+CvQ== + dependencies: + orderedmap "^1.1.0" + +prosemirror-schema-list@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz#c3e13fe2f74750e4a53ff88d798dc0c4ccca6707" + integrity sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.4.tgz#4c6b52628216e753fc901c6d2bfd84ce109e8952" + integrity sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz#5620ebe7379e6fae4f34ecc881886cb22ce96579" + integrity sha512-/G6d/u9Mf6Bv3H1XR8VxhpjmUO75LYmnvj+s3ZfZpakU1hnQbsvCEybml1B3f2IWUAAQRFkbO1PnsbFhLZsYsw== + dependencies: + prosemirror-model "^1.0.0" + +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.20.1.tgz#174ba8ca358c73cc05e9a92a3d252bcf181ea337" + integrity sha512-djWORhy3a706mUH4A2dgEEV0IPZqQd1tFyz/ZVHJNoqhSgq82FwG6dq7uqHeUB2KdVSNfI2yc3rwfqlC/ll2pA== + dependencies: + prosemirror-model "^1.14.3" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" @@ -7561,6 +7945,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rope-sequence@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b" + integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg== + run-async@^2.4.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" @@ -8364,6 +8753,13 @@ timsort@^0.3.0: resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tippy.js@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.1.tgz#3788a007be7015eee0fd589a66b98fb3f8f10181" + integrity sha512-JnFncCq+rF1dTURupoJ4yPie5Cof978inW6/4S6kmWV7LL9YOSEVMifED3KdrVPEG+Z/TFH2CDNJcQEfaeuQww== + dependencies: + "@popperjs/core" "^2.8.3" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -8840,6 +9236,11 @@ vuex@^4.0.0-0: dependencies: "@vue/devtools-api" "^6.0.0-beta.11" +w3c-keyname@^2.2.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" + integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw== + watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz"