tiptap/demos/src/Extensions/FileHandler/Vue/index.vue
bdbch f6f6158696
open source pro extensions (main) (#6465)
* open source pro extensions

* added changeset

* fix import for serializeForClipboard

* use serializeForClipboard from view

* improve type checking for validPosition
2025-06-20 11:04:09 +02:00

106 lines
2.4 KiB
Vue

<template>
<editor-content :editor="editor" />
</template>
<script>
import Document from '@tiptap/extension-document'
import FileHandler from '@tiptap/extension-file-handler'
import Heading from '@tiptap/extension-heading'
import Image from '@tiptap/extension-image'
import Paragraph from '@tiptap/extension-paragraph'
import Text from '@tiptap/extension-text'
import { Editor, EditorContent } from '@tiptap/vue-3'
import { defineComponent } from 'vue'
export default defineComponent({
components: {
EditorContent,
},
data() {
return {
editor: null,
}
},
mounted() {
this.editor = new Editor({
extensions: [
Document,
Heading,
Paragraph,
Text,
Image,
FileHandler.configure({
allowedMimeTypes: ['image/png', 'image/jpeg', 'image/gif', 'image/webp'],
onDrop: (currentEditor, files, pos) => {
files.forEach(file => {
const fileReader = new FileReader()
fileReader.readAsDataURL(file)
fileReader.onload = () => {
currentEditor.chain().insertContentAt(pos, {
type: 'image',
attrs: {
src: fileReader.result,
},
}).focus().run()
}
})
},
onPaste: (currentEditor, files) => {
files.forEach(file => {
const fileReader = new FileReader()
fileReader.readAsDataURL(file)
fileReader.onload = () => {
currentEditor.chain().insertContentAt(currentEditor.state.selection.anchor, {
type: 'image',
attrs: {
src: fileReader.result,
},
}).focus().run()
}
})
},
}),
],
content: `
<h1>
Try to paste or drop files into this editor
</h1>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
`,
})
},
beforeUnmount() {
this.editor.destroy()
},
})
</script>
<style lang="scss">
/* Basic editor styles */
.tiptap {
:first-child {
margin-top: 0;
}
img {
display: block;
height: auto;
margin: 1.5rem 0;
max-width: 100%;
&.ProseMirror-selectednode {
outline: 3px solid var(--purple);
}
}
}
</style>