<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: benngaihk</title>
    <description>The latest articles on DEV Community by benngaihk (@benngaihk).</description>
    <link>https://dev.to/benngaihk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3771128%2F8d6c2db7-e85a-40e8-b7de-ca8f9c290c05.png</url>
      <title>DEV Community: benngaihk</title>
      <link>https://dev.to/benngaihk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benngaihk"/>
    <language>en</language>
    <item>
      <title>I Built a Notion-like Editor for Vue 3 with AI, 5 Themes, and Real-time Collaboration — It's 100% Free</title>
      <dc:creator>benngaihk</dc:creator>
      <pubDate>Fri, 13 Feb 2026 14:30:46 +0000</pubDate>
      <link>https://dev.to/benngaihk/i-built-a-notion-like-editor-for-vue-3-with-ai-5-themes-and-real-time-collaboration-its-100-2pn6</link>
      <guid>https://dev.to/benngaihk/i-built-a-notion-like-editor-for-vue-3-with-ai-5-themes-and-real-time-collaboration-its-100-2pn6</guid>
      <description>&lt;p&gt;If you've ever tried to build a rich text editor in Vue, you know the pain.&lt;/p&gt;

&lt;p&gt;Tiptap is amazing — but it's &lt;strong&gt;headless&lt;/strong&gt;. You get a powerful ProseMirror engine with zero UI. That means you spend weeks building toolbars, menus, themes, and handling edge cases before you can even show it to your users.&lt;/p&gt;

&lt;p&gt;I spent months solving this problem, and today I'm releasing &lt;strong&gt;&lt;a href="https://github.com/benngaihk/Tiptap-UI-Kit" rel="noopener noreferrer"&gt;Tiptap UI Kit&lt;/a&gt;&lt;/strong&gt; — a fully-featured, production-ready editor component for Vue 3. Think of it as what Tiptap would look like if it shipped with a complete UI out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://tiptap-ui-kit.vercel.app" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://github.com/benngaihk/Tiptap-UI-Kit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; | &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/tiptap-ui-kit" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Here's what building a Tiptap editor from scratch looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up Tiptap with Vue 3 ✅ (easy, 30 min)&lt;/li&gt;
&lt;li&gt;Build a toolbar with 20+ formatting buttons 😅 (2 days)&lt;/li&gt;
&lt;li&gt;Handle active state tracking for every button 😰 (1 day)&lt;/li&gt;
&lt;li&gt;Make it look good 😤 (3 days)&lt;/li&gt;
&lt;li&gt;Add dark mode 🫠 (1 day)&lt;/li&gt;
&lt;li&gt;Make it responsive 💀 (1 day)&lt;/li&gt;
&lt;li&gt;Add i18n support ☠️ (1 day)&lt;/li&gt;
&lt;li&gt;Add AI features... 💸 (good luck)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the time you're done, you've written 5,000+ lines of UI code and your editor still doesn't look as polished as Notion or Google Docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add tiptap-ui-kit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt;
    &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;
    &lt;span class="na"&gt;theme=&lt;/span&gt;&lt;span class="s"&gt;"notion"&lt;/span&gt;
    &lt;span class="na"&gt;locale=&lt;/span&gt;&lt;span class="s"&gt;"en-US"&lt;/span&gt;
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TiptapProEditor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiptap-ui-kit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiptap-ui-kit/style.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;Hello World!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You get a full-featured editor with a Notion-like theme in 10 lines of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Five Professional Themes
&lt;/h3&gt;

&lt;p&gt;Every theme comes with full dark mode support:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Inspired By&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notion.so&lt;/td&gt;
&lt;td&gt;Note-taking, knowledge bases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Word&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Word&lt;/td&gt;
&lt;td&gt;Formal documents with A4 pagination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub markdown&lt;/td&gt;
&lt;td&gt;Technical documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typora editor&lt;/td&gt;
&lt;td&gt;Long-form writing, blogs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clean minimal&lt;/td&gt;
&lt;td&gt;General purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Word theme is particularly interesting — it renders your content on actual A4-sized pages with proper margins, headers, and page breaks. Perfect for document management systems.&lt;/p&gt;

&lt;p&gt;Switching themes is a single prop change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt; &lt;span class="na"&gt;theme=&lt;/span&gt;&lt;span class="s"&gt;"word"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- or --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt; &lt;span class="na"&gt;theme=&lt;/span&gt;&lt;span class="s"&gt;"notion"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All themes are implemented with CSS variables, so you can easily customize colors, fonts, and spacing without touching the component internals.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI-Powered Writing Assistance
&lt;/h3&gt;

&lt;p&gt;This is the feature I'm most proud of. The editor has built-in AI capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continue Writing&lt;/strong&gt; — Select text and AI continues your thought&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish&lt;/strong&gt; — Improve grammar, clarity, and style&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate&lt;/strong&gt; — 14+ languages with one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarize&lt;/strong&gt; — Extract key points from long text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Commands&lt;/strong&gt; — Define your own AI prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI works with &lt;strong&gt;any OpenAI-compatible API&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt;
  &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;
  &lt;span class="na"&gt;:ai-config=&lt;/span&gt;&lt;span class="s"&gt;"{
    provider: 'openai',
    apiKey: 'your-key',
    model: 'gpt-4o-mini'
  }"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supported providers out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; (GPT-4, GPT-4o)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aliyun Qianwen&lt;/strong&gt; (阿里云通义千问)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; (run models locally!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI suggestions appear inline with a clean accept/reject UI — no modal popups, no context switching. It feels native.&lt;/p&gt;

&lt;p&gt;Under the hood, it uses streaming responses so you see the AI "type" in real-time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// How AI streaming works internally&lt;/span&gt;
&lt;span class="nx"&gt;aiApiService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;continueWriting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectedText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;onStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;showHighlight&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;appendToSuggestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;onStop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;showAcceptRejectUI&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleGracefully&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can also configure their own API keys through a built-in settings modal — no environment variables needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Real-time Collaboration
&lt;/h3&gt;

&lt;p&gt;Multi-user editing powered by &lt;a href="https://github.com/yjs/yjs" rel="noopener noreferrer"&gt;Yjs&lt;/a&gt;, the battle-tested CRDT library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple users editing simultaneously&lt;/li&gt;
&lt;li&gt;Live cursor positions with user names and colors&lt;/li&gt;
&lt;li&gt;Online user presence indicator&lt;/li&gt;
&lt;li&gt;Conflict-free resolution (CRDT, not OT)&lt;/li&gt;
&lt;li&gt;Smart document initialization that handles race conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The collaboration system intelligently decides how to initialize content based on the current state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is document empty? → Use initial content
Only one user online? → Use initial content
Multiple users online? → Preserve Yjs state (don't overwrite!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents the classic "user A's content overwrites user B's edits" problem that plagues naive collaboration implementations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Everything Else
&lt;/h3&gt;

&lt;p&gt;The editor also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich text formatting&lt;/strong&gt; — Bold, italic, underline, strikethrough, highlight, subscript, superscript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structure&lt;/strong&gt; — Headings (H1-H6), ordered/unordered lists, task lists, blockquotes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; — Full table support with merge, split, and cell styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code blocks&lt;/strong&gt; — Syntax highlighting powered by Lowlight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math formulas&lt;/strong&gt; — KaTeX-powered inline and block equations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt; — Upload, resize, and drag-to-adjust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links&lt;/strong&gt; — Smart editing with preview bubbles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search &amp;amp; Replace&lt;/strong&gt; — Find and replace across the document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format Painter&lt;/strong&gt; — Copy formatting like in Word&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag &amp;amp; Drop&lt;/strong&gt; — Reorder content blocks visually&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard Shortcuts&lt;/strong&gt; — Full set of productivity shortcuts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zoom&lt;/strong&gt; — 50% to 200% scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word Import/Export&lt;/strong&gt; — Import &lt;code&gt;.docx&lt;/code&gt; files and export back&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Architecture Decisions
&lt;/h2&gt;

&lt;p&gt;A few design choices worth sharing:&lt;/p&gt;

&lt;h3&gt;
  
  
  Modular by Default
&lt;/h3&gt;

&lt;p&gt;You don't have to use everything. Features are controlled via props:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt;
  &lt;span class="na"&gt;:features=&lt;/span&gt;&lt;span class="s"&gt;"{
    table: true,
    collaboration: false,
    ai: true,
    dragHandle: true
  }"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps your bundle size reasonable — unused features don't ship to the client.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Variables for Theming
&lt;/h3&gt;

&lt;p&gt;Instead of CSS-in-JS or scoped styles, all theming is done through CSS custom properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Notion theme uses warm grays */&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#37352&lt;/span&gt;&lt;span class="nt"&gt;f&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-primary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#2&lt;/span&gt;&lt;span class="nt"&gt;eaadc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-border&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;rgba&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;55&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;53&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;47&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;09&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c"&gt;/* Word theme uses Microsoft blue */&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#333333&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-primary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#0078&lt;/span&gt;&lt;span class="nt"&gt;d4&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--tiptap-font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Calibri'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;'Segoe UI'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;Arial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means you can create your own theme in minutes by overriding a handful of variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type-Safe i18n
&lt;/h3&gt;

&lt;p&gt;All translations are fully typed with TypeScript. Add a new translation key and the compiler will yell at you if you miss a language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Supports: en-US, zh-CN, zh-TW&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TiptapProEditor&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zh-CN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;I built this for developers who need a &lt;strong&gt;production-ready editor&lt;/strong&gt; without spending weeks on UI work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a &lt;strong&gt;CMS&lt;/strong&gt; or admin panel&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;knowledge base&lt;/strong&gt; (like Notion)&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;document management system&lt;/strong&gt; (like Google Docs)&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;note-taking app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;blog platform&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;Vue 3 app&lt;/strong&gt; that needs rich text editing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're starting a project and thinking "I need a Tiptap Vue 3 template" — this is it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add tiptap-ui-kit

&lt;span class="c"&gt;# Peer dependencies&lt;/span&gt;
pnpm add @tiptap/core @tiptap/pm @tiptap/starter-kit @tiptap/vue-3 vue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt;
    &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;
    &lt;span class="na"&gt;:theme=&lt;/span&gt;&lt;span class="s"&gt;"theme"&lt;/span&gt;
    &lt;span class="na"&gt;:locale=&lt;/span&gt;&lt;span class="s"&gt;"locale"&lt;/span&gt;
    &lt;span class="na"&gt;:dark-mode=&lt;/span&gt;&lt;span class="s"&gt;"isDark"&lt;/span&gt;
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TiptapProEditor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiptap-ui-kit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiptap-ui-kit/style.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;Start writing...&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With AI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;TiptapProEditor&lt;/span&gt;
  &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;
  &lt;span class="na"&gt;theme=&lt;/span&gt;&lt;span class="s"&gt;"notion"&lt;/span&gt;
  &lt;span class="na"&gt;:ai-config=&lt;/span&gt;&lt;span class="s"&gt;"{
    provider: 'openai',
    apiKey: import.meta.env.VITE_AI_API_KEY,
    model: 'gpt-4o-mini'
  }"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comparison with Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Tiptap UI Kit&lt;/th&gt;
&lt;th&gt;Raw Tiptap&lt;/th&gt;
&lt;th&gt;Quill&lt;/th&gt;
&lt;th&gt;TinyMCE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vue 3 native&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Theme presets&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI writing&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collaboration&lt;/td&gt;
&lt;td&gt;Yes (free)&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark mode&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;3 langs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIT License&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;BSD&lt;/td&gt;
&lt;td&gt;LGPL/Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free/Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This is v0.1.0. Here's what's coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More themes (Google Docs, Confluence)&lt;/li&gt;
&lt;li&gt;More languages (Japanese, Korean, Spanish, French)&lt;/li&gt;
&lt;li&gt;Plugin system for third-party extensions&lt;/li&gt;
&lt;li&gt;Vue component slots for toolbar customization&lt;/li&gt;
&lt;li&gt;Mobile-optimized UI&lt;/li&gt;
&lt;li&gt;Export to PDF&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://tiptap-ui-kit.vercel.app" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt; — Try all 5 themes and AI features&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/benngaihk/Tiptap-UI-Kit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; — Star the repo if you find it useful!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add tiptap-ui-kit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire project is &lt;strong&gt;MIT licensed&lt;/strong&gt; — free for personal and commercial use. No catch, no freemium, no "contact sales."&lt;/p&gt;

&lt;p&gt;If this saves you time, consider giving it a star on GitHub. It really helps with discoverability and motivates me to keep improving it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Vue 3, Tiptap 3, TypeScript, and a lot of coffee.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions or feedback? &lt;a href="https://github.com/benngaihk/Tiptap-UI-Kit/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt; or find me on &lt;a href="https://github.com/benngaihk" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
