/notes-novel-vue

Notion-style WYSIWYG editor with AI-powered autocompletion in Vue

Primary LanguageTypeScript

Novel Vue

Novel Vue is port of Novel

Introduction

Novel is a Notion-style WYSIWYG editor with AI-powered autocompletions.

Installation

To use Novel Vue in a project, you can run the following command to install the novel-vue NPM package:

npm i novel-vue

Then, you can use it in your code like this:

<template>
  <Editor />
</template>

<script setup lang="ts">
import { Editor } from "novel-vue";
import "novel-vue/dist/style.css";
</script>
Prop Type Description Default
blobApi String The API route to use for the Vercel Blob API. "/api/upload"
completionApi String The API route to use for the OpenAI completion API. "/api/generate"
className String Additional classes to add to the editor container. "relative min-h-500px] w-full mx-auto max-w-screen-lg border-stone-200 bg-white p-12 px-8 sm:mb-[calc(20vh)] sm:rounded-lg sm:border sm:px-12 sm:shadow-lg"
defaultValue JSONContent The default value to use for the editor. defaultEditorContent
extensions Extension[] A list of extensions to use for the editor, in addition to the default Novel extensions. []
editorProps EditorProps Props to pass to the underlying Tiptap editor, in addition to the default Novel editor props. {}
onUpdate Function A callback function that is called whenever the editor is updated. () => {}
onDebouncedUpdate Function A callback function that is called whenever the editor is updated, but only after the defined debounce duration. () => {}
debounceDuration Number The duration (in milliseconds) to debounce the onDebouncedUpdate callback. 750
storageKey String The key to use for storing the editor's value in local storage. "novel__content"

Note: Make sure to define an API endpoint that matches the completionApi prop (default is /api/generate). This is needed for the AI autocompletions to work. Here's an example: https://github.com/naveennaidu/novel-vue/blob/main/nuxt-server/server/api/generate.ts

You can get the editor instance of tiptap by using the editor ref.

For example, to set the content of the editor manually, you can do something like this:

<template>
  <button @click="setContent">Set Content</button>
  <Editor ref="editorRef" />
</template>

<script setup lang="ts">
import { Editor as EditorClass } from "@tiptap/core";
import { Editor } from "novel-vue";
import "novel-vue/dist/style.css";

const editorRef = ref<{ editor: EditorClass }>();

function setContent() {
  if (editorRef.value) {
    editorRef.value.editor.commands.setContent({
      type: "doc",
      content: [
        {
          type: "paragraph",
          content: [
            {
              type: "text",
              text: "Example Text",
            },
          ],
        },
      ],
    });
  }
}
</script>

Projects using Novel Vue

Novuel: Open Source AI Writing App built with Nuxt 3 and Nuxt UI