Migrating to v1

Upgrade from Echo Editor 0.x (Tiptap 2) to 1.x (Tiptap 3).

Version 1.0 moves Echo Editor to Tiptap 3 and modernises the build. Most apps only need to bump the package; custom extensions and deep integrations may need the changes below.

TL;DR

npm
pnpm
bun
yarn
npm i vue-echo-editor@^1
  • Your <EchoEditor> usage, props, v-model and built-in extensions keep working.
  • If you wrote custom Tiptap extensions, follow the Tiptap v2 → v3 upgrade guide.
  • The default UI language is now English — call locale.setLang('zhHans') for Chinese.

Breaking changes

Tiptap 3

All @tiptap/* packages are now v3. The most common changes for custom code:

- import TableRow from '@tiptap/extension-table-row'
+ import { TableRow } from '@tiptap/extension-table'

- import BulletList from '@tiptap/extension-bullet-list'
+ import { BulletList } from '@tiptap/extension-list'

- import Placeholder from '@tiptap/extension-placeholder'
+ import { Placeholder } from '@tiptap/extensions'

- editor.commands.setContent(html, false)
+ editor.commands.setContent(html, { emitUpdate: false })

- const pos = getPos()
+ const pos = getPos()
+ if (typeof pos !== 'number') return   // getPos() can now return undefined

Echo Editor re-exports TableRow, TableCell, TableHeader and TableCellBackground for convenience.

tippy.js → Floating UI

tippy.js was removed. Every popup (bubble menus, slash menu, drag handle) now uses Floating UI.

If you imported the internal DragHandlePlugin, rename tippyOptions to computePositionConfig:

  DragHandlePlugin({
    editor,
    element,
-   tippyOptions: { placement: 'left-start' },
+   computePositionConfig: { placement: 'left-start' },
  })

Build output

0.x1.x
lib/echo-editor.es.jslib/echo-editor.js
lib/echo-editor.umd.jslib/echo-editor.cjs (UMD removed, like Tiptap 3)
Tiptap bundled insideTiptap installed as a dependency and shared with your app

Imports through the package name (import … from 'vue-echo-editor') are unaffected.

Default language

The default language changed from zhHans to en, and locale.setLang() is now async because additional languages are lazy-loaded:

import { locale } from 'vue-echo-editor'

await locale.setLang('zhHans')

Per-editor UI state

Fullscreen, preview, source-code, AI-menu and other UI state used to be global, so two editors on one page affected each other. It is now per editor. If you called useTiptapStore() outside a component, pass the editor:

- const { toggleFullscreen } = useTiptapStore()
+ const { toggleFullscreen } = useTiptapStore(editor)

History

History is now built on Tiptap's UndoRedo extension (still named history, also exported as UndoRedo). The default depth increased from 10 to 100.

Icons

Icons moved from lucide-vue-next to its successor @lucide/vue. This only matters if you passed Lucide components to custom buttons.

Fixed in 1.0

These worked incorrectly in 0.x and may change behaviour you relied on:

  • @enter never fired — it now does (Shift+Enter still inserts a new line).
  • Ordered list styles (roman, latin …) were lost when loading HTML.
  • Popover toolbar buttons rendered a <button> inside a <button>.
  • The AI prompt form reloaded the page on submit.

New in 1.0

  • Markdown v-model and editor.getMarkdown()
  • Export to PDF, Markdown, HTML, RTF, text and JSON
  • Collaboration via vue-echo-editor/collaboration
  • Plugins with definePlugin()
  • 9 new languages and RTL support
  • useEditorState() for building fast custom UI
  • New props label, autofocus, editorProps and events create, focus, blur