Angular Tiptap Editor

July 30, 2026 Β· View on GitHub

Important

^v3.0.0 uses Tiptap v3. If you need to stay on Tiptap v2, please use version ^2.4.1.

A modern, customizable Angular rich-text editor, built with Tiptap.

NPM Version Demo Try it on StackBlitz

High-performance Angular WYSIWYG editor. Built on top of Tiptap and powered by a native Signals architecture, it features a polished, professional design that feels, I think, clean and modern out of the box. Yet, I've worked to keep it fully customizable: you can easily configure the editor, tweak the UI, or even embed your own Angular components as interactive nodes.


✨ Features

  • ⚑ Signal-Based: Native performance with ChangeDetectionStrategy.OnPush.
  • πŸ“‹ Table of Contents: Notion-style floating or inline TOC component with level-adapted dash collapse.
  • πŸ—‚οΈ Global Editor Registry: Centralized AteEditorRegistry service to track, control, and switch between multi-editor instances.
  • 🧩 Angular Nodes: Embed any Angular component as an interactive editor node.
  • ⌨️ UX First: Slash commands (/) and context-aware bubble menus (Notion-like).
  • πŸ“Š Table Power: Advanced management with cell selection and merging.
  • πŸ–ΌοΈ Pro Media: Image resizing, auto-compression, and custom uploaders.
  • 🌍 Built-in i18n: Support for English, French, and German out of the box.
  • πŸ“Ž Office-Ready: Clean pasting from Word and Excel.
  • 🎨 Highly Customizable: Easily configure toolbars, bubble menus, and slash command items.
  • πŸ› οΈ Extensible: Easily add custom Tiptap extensions and reactive state calculators.
  • 🧩 Angular 18+ Support: Uses Angular 18's signals and esbuild for optimal performance.

πŸ“¦ Installation

npm install @flogeez/angular-tiptap-editor

Add the styles to your angular.json:

{
  "styles": [
    ...
    "node_modules/@fontsource/material-symbols-outlined/index.css",
    "node_modules/@flogeez/angular-tiptap-editor/styles/index.css",
    ...
  ]
}

πŸš€ Quick Start

1. Global Setup

Initialize the library in app.config.ts:

export const appConfig: ApplicationConfig = {
  providers: [provideAteEditor()],
};

2. Basic Usage

import { AngularTiptapEditorComponent } from "@flogeez/angular-tiptap-editor";

@Component({
  selector: "app-example",
  standalone: true,
  imports: [AngularTiptapEditorComponent],
  template: `<angular-tiptap-editor
    [content]="content"
    (contentChange)="onContentChange($event)" />`,
})
export class ExampleComponent {
  content = "<p>Hello World!</p>";
  onContentChange(html: string) {
    console.log(html);
  }
}

3. Reactive Forms Integration

import { FormControl, ReactiveFormsModule } from "@angular/forms";

@Component({
  standalone: true,
  imports: [AngularTiptapEditorComponent, ReactiveFormsModule],
  template: ` <angular-tiptap-editor [formControl]="contentControl" /> `,
})
export class FormComponent {
  contentControl = new FormControl("<p>Initial content</p>");
}

βš™οΈ Configuration

The editor is fully configurable via the [config] input:

editorConfig: AteEditorConfig = {
  locale: "fr",
  placeholder: "Commencez Γ  rΓ©diger...",
  toolbar: { ...ATE_DEFAULT_TOOLBAR_CONFIG, highlight: true },
  slashCommands: { heading1: true, table: true },
};
InputTypeDescription
[config]AteEditorConfigGlobal config object (recommended)
[content]stringInitial HTML content
[editable]booleanRead-only toggle
[disabled]booleanDisabled toggle

See the API reference for the full list of inputs and configuration options.

🧩 Advanced Features

Image Upload Handler

Avoid base64 by providing a custom uploader (S3, Cloudinary, etc.):

The same handler is used for all file-based image insertions: toolbar picker, drag-and-drop, and clipboard paste.

uploadHandler: AteImageUploadHandler = ctx => {
  return this.http.post<any>("/api/upload", ctx.file).pipe(map(res => ({ src: res.url })));
};

πŸš€ More Advanced Capabilities

Looking for deeper integration patterns? Explore our Advanced Usage Guide:

🌍 i18n & 🎨 Styling

  • Languages: English, French, and German built-in. Detects browser language automatically. Extend with AteI18nService.addTranslations().
  • Styling: Customize via CSS variables (e.g., --ate-primary, --ate-border-radius, and much more).
  • Dark Mode: Works natively by adding .dark or [data-theme="dark"].

πŸ”§ Development

npm install
npm run build:lib  # Build library
npm start          # Run demo

πŸ“ License

MIT License - see LICENSE file for details.

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Made with ❀️ by FloGeez