Installation
composer require wabsa/laravel-tiptap
yarn add laravel-tiptap
Publish the package assets (if needed):
php artisan vendor:publish --provider="Wabsa\LaravelTiptap\LaravelTiptapServiceProvider"
Initialize Alpine.js
In resources/js/app.js:
import Alpine from 'alpinejs'
import LaravelTiptap from 'laravel-tiptap'
Alpine.data('tiptapEditor', LaravelTiptap)
Alpine.start()
First Usage Add the editor component to a Blade file:
<x-tiptap-editor />
<x-tiptap-editor /> in a form to replace a standard <textarea>.wire:model (Livewire) or x-model (Alpine):
<x-tiptap-editor wire:model="post.content" />
Livewire Integration
wire:model to sync editor content with Livewire properties:
<x-tiptap-editor wire:model="article.body" />
$this->article->body in Livewire.Alpine.js Standalone
<x-tiptap-editor x-model="editorContent" />
editorContent in your Alpine component.Form Submission
fillable fields in models):
// Model
protected $fillable = ['content'];
Custom Extensions
extensions prop:
<x-tiptap-editor :extensions="['strike', 'codeBlock']" />
<x-tiptap-editor :config="{
extensions: [
Strikethrough.extend(),
CodeBlock.extend()
]
}" />
Image Uploads
<x-tiptap-editor enable-image-upload />.uploadImage endpoint is set up (see Gotchas).Toolbar Customization
toolbar prop:
<x-tiptap-editor :toolbar="[
['bold', 'italic'],
['bulletList', 'orderedList'],
['cleanBlocks']
]" />
Model Binding with Livewire
<x-tiptap-editor wire:model="post.sections.0.content" />
public $post = [
'sections' => [['content' => '']],
];
Image Uploads Not Working
config/filesystems.php).uploadImage endpoint is accessible (the package expects a route at /upload-image).HTML Sanitization Issues
// In your Alpine component
sanitize: (html) => {
return DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['b', 'i', 'u', 'img', 'a'],
ALLOWED_ATTR: ['href', 'src', 'class']
});
}
Tailwind CSS Purge
purge: [
'./resources/**/*.blade.php',
'./vendor/wabsa/laravel-tiptap/resources/views/**/*.blade.php',
]
Livewire Property Updates
wire:model is correctly bound.Check Console Logs
console.log to the Alpine component to verify data binding:
Alpine.data('tiptapEditor', (props) => ({
init() {
console.log('Editor initialized with props:', props);
},
// ...
}));
Inspect Network Requests
Disable Sanitization Temporarily
<x-tiptap-editor sanitize="false" />
Custom Endpoints
uploadImage endpoint by passing a custom URL:
<x-tiptap-editor upload-url="/custom-upload-endpoint" />
Pre-configured Extensions
php artisan vendor:publish --tag="laravel-tiptap-config"
config/tiptap.php to add/remove extensions.Alpine Component Overrides
php artisan vendor:publish --tag="laravel-tiptap-views"
resources/views/vendor/laravel-tiptap/editor.blade.php.How can I help you explore Laravel packages today?