arm092 / laravel-rich-text-editor
A modern, secure rich text editor for Laravel, Alpine.js, Tailwind CSS, and Livewire.
Package info
github.com/arm092/laravel-rich-text-editor
Language:TypeScript
pkg:composer/arm092/laravel-rich-text-editor
Requires
- php: ^8.1
- ext-dom: *
- illuminate/contracts: ^10.0|^11.0|^12.0|^13.0
- illuminate/database: ^10.0|^11.0|^12.0|^13.0
- illuminate/support: ^10.0|^11.0|^12.0|^13.0
- illuminate/validation: ^10.0|^11.0|^12.0|^13.0
- illuminate/view: ^10.0|^11.0|^12.0|^13.0
- symfony/html-sanitizer: ^6.4|^7.0|^8.0
Requires (Dev)
- livewire/livewire: ^3.8|^4.3
- orchestra/testbench: ^8.0|^9.0|^10.0|^11.0
- phpunit/phpunit: ^10.5|^11.0|^12.0
Suggests
- livewire/livewire: Required only when binding the editor to Livewire 3 or 4 components.
README
A modern, secure rich text editor for Laravel forms, Alpine.js, Tailwind CSS, and Livewire. It stores semantic HTML, ships with its browser assets, provides responsive images and tables, and includes both Basic and Enhanced code view.
This README is the express guide. See the full documentation for every option, integration, and security detail.
Requirements
- PHP 8.1 or newer
- Laravel 10, 11, 12, or 13
- Livewire 3 or 4 when Livewire binding is needed
- A modern evergreen browser
Install
composer require arm092/laravel-rich-text-editor php artisan rich-text-editor:publish
The publish command copies the configuration and prebuilt assets. Use --force after upgrades when you intentionally want to refresh published files.
Blade in one minute
<x-rich-text-editor name="content" :value="old('content', $post->content)" label="Content" />
The submitted content value is HTML. For safe persistence, add the package cast:
use Arm092\RichTextEditor\Casts\RichTextCast; protected function casts(): array { return [ 'content' => RichTextCast::class, ]; }
Laravel 10 applications should place the same entry in the model's protected
$casts property.
Render saved content through the defensive renderer:
<x-rich-text-content :content="$post->content" />
Livewire
<x-rich-text-editor wire:model="form.content" label="Content" />
The component synchronizes through a native textarea and isolates the editor-managed DOM with wire:ignore. Default, .live, .blur, and .change model modifiers pass through unchanged.
Standalone JavaScript
Basic code view:
<script src="/vendor/rich-text-editor/rich-text-editor.js" defer></script> <div data-rich-text-editor></div>
Enhanced code view:
<script src="/vendor/rich-text-editor/rich-text-editor-with-code.js" defer></script> <div id="editor"></div> <script> document.addEventListener('DOMContentLoaded', () => { window.editor = RichTextEditor.create('#editor') }) </script>
Both files expose the same API: create, scan, destroy, getHTML, setHTML, focus, setReadOnly, and instance destroy.
Common configuration
| Option | Default | Purpose |
|---|---|---|
default_profile |
standard |
Selects the formatting and sanitizer profile. |
code_view.enabled |
true |
Shows the HTML code-view command. |
code_view.enhanced |
true |
Loads the enhanced or basic browser bundle. |
assets.auto |
true |
Lets the Blade component include published assets once. |
profiles.*.headings |
[2, 3, 4] |
Restricts heading levels. |
profiles.*.font_sizes |
[] |
Enables only named, allowlisted text sizes. |
profiles.*.images.resize |
20–100, step 5 |
Controls safe responsive image resizing. |
profiles.*.tables.enabled |
true in standard |
Enables responsive tables and their toolbar. |
profiles.*.tables.palette |
Eight theme tokens | Restricts cell text and background colors. |
Roadmap
- Visual-editor dark theme with
light,dark, andautomodes - Additional interface translations
- npm publishing with ESM modules
- A documented extension registry
See the full roadmap for scope notes and exclusions.
Documentation
- Installation and updates
- Blade and Livewire
- Standalone JavaScript
- Configuration and profiles
- Code view
- Security, casting, and rendering
- JavaScript API and events
- Troubleshooting
License
Laravel Rich Text Editor is open-source software released under the MIT License.
