Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Tiptap Editor Laravel Package

awcodes/filament-tiptap-editor

A TipTap-powered rich text editor for Filament. Adds a configurable WYSIWYG field with modern editing tools like formatting, links, lists, headings, code blocks, and more. Built to integrate cleanly with Filament forms and resources.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Pros:

    • Filament Integration: Seamlessly extends Filament’s form ecosystem, leveraging its existing resource/CRUD architecture. Aligns with Filament’s modular design (plugins, widgets, and form components).
    • Tiptap.js Backend: Uses ProseMirror (via Tiptap) for rich-text editing, offering extensibility (custom nodes, toolbars, etc.) without reinventing the wheel. Compatible with Laravel’s Eloquent/Query Builder for data persistence.
    • Headless CMS Potential: Enables structured content editing (e.g., markdown, JSON, or database-backed rich text) without coupling to a specific frontend framework.
    • MIT License: No legal barriers; ideal for open-source or commercial projects.
  • Cons:

    • Filament Dependency: Tight coupling to Filament’s form system may limit reuse in non-Filament contexts (e.g., standalone Blade/Livewire forms).
    • Tiptap.js Complexity: Customizing ProseMirror schemas or plugins requires JavaScript/TypeScript knowledge, adding cognitive load for backend-focused teams.
    • No Built-in Media Management: Relies on external assets (images, files) via Filament’s media library or custom upload handlers.

Integration Feasibility

  • Laravel Ecosystem Fit:
    • Forms/Resources: Drop-in replacement for Filament’s default text inputs in Form classes (e.g., Form\Components\TiptapEditor).
    • Validation: Supports Laravel’s validation rules (e.g., string, max) via Filament’s validation pipeline.
    • Database: Stores rich text as JSON (default) or plain text (via getState()/setState()), compatible with Eloquent’s json column type or text fields.
  • Frontend Stack:
    • Vite/Alpine.js: Tiptap.js is a modern JS library; ensure your Filament setup includes Vite for asset compilation.
    • Livewire/Inertia: Works with Filament’s Livewire backend but may require adjustments for Inertia.js (due to Tiptap’s DOM-centric nature).

Technical Risk

  • High:
    • Customization Overhead: Extending Tiptap’s schema (e.g., adding custom nodes like tables, embeds) requires JS expertise. Risk of breaking changes if Tiptap.js updates.
    • Performance: Large rich-text fields (e.g., long-form content) may impact Filament’s form rendering speed or database bloat.
    • Media Handling: No built-in support for drag-and-drop uploads; requires integration with Filament’s media library or Spatie’s media packages.
  • Medium:
    • Version Skew: Filament 3.x vs. 2.x compatibility; ensure the package supports your Filament version.
    • Caching: Tiptap’s client-side state may conflict with Filament’s form caching (e.g., Livewire’s wire:model).
  • Low:
    • Database Migration: JSON storage is straightforward; no schema changes needed for basic use.

Key Questions

  1. Use Case Alignment:
    • Is rich text primarily for admin panels (Filament’s strength) or user-facing content (e.g., CMS)? The latter may need additional routing/permissions.
  2. Customization Needs:
    • Will you extend Tiptap’s schema (e.g., custom nodes, toolbars)? If so, budget for JS development.
  3. Media Workflow:
    • How will users upload images/files? Will you use Filament’s media library, Spatie’s packages, or a third-party service (e.g., Cloudinary)?
  4. Data Structure:
    • Will rich text be stored as JSON (default) or plain text? JSON offers more flexibility (e.g., embedded metadata) but increases storage size.
  5. Performance:
    • What’s the expected average field size? Test with 10KB+ content to validate rendering/saving performance.
  6. Fallbacks:
    • Should the editor degrade gracefully for users with JS disabled? Filament’s forms may need a textarea fallback.

Integration Approach

Stack Fit

  • Core Stack:
    • Backend: Laravel 10.x/11.x (Filament 3.x) with Eloquent/Query Builder.
    • Frontend: Filament’s Livewire-based admin panel (Vite for Tiptap.js assets).
    • Database: MySQL/PostgreSQL with json or text columns for rich text.
  • Extensions:
    • Media: Spatie Laravel Media Library or Filament’s built-in media manager.
    • Validation: Laravel’s built-in rules (e.g., max:10000 for JSON size).
    • Localization: Filament’s i18n support for multilingual content.

Migration Path

  1. Assessment Phase:
    • Audit existing text fields in Filament resources to identify candidates for replacement.
    • Test the package in a staging environment with a sample resource (e.g., Post).
  2. Incremental Rollout:
    • Phase 1: Replace simple TextInput fields with TiptapEditor in non-critical resources.
    • Phase 2: Add custom Tiptap extensions (e.g., tables, mentions) for advanced use cases.
    • Phase 3: Integrate media uploads and validate performance at scale.
  3. Data Migration:
    • For existing text fields, use Laravel’s DB::update to convert plain text to JSON (if needed):
      DB::table('posts')->update(['content' => DB::raw("CAST(content AS JSON)")]);
      

Compatibility

  • Filament Versions:
    • Verify compatibility with your Filament version (e.g., filament/filament: ^3.0). Check the package’s composer.json for constraints.
  • Tiptap.js:
    • Ensure your Vite/Laravel mix setup supports Tiptap’s dependencies (e.g., prosemirror-* packages).
  • Browser Support:
    • Tiptap.js supports modern browsers (Chrome 80+, Firefox 79+, Safari 14+). Test edge cases like mobile keyboards or slow connections.

Sequencing

  1. Prerequisites:
    • Install the package:
      composer require awcodes/filament-tiptap-editor
      
    • Publish and configure Tiptap’s assets (if not auto-detected by Filament).
  2. Basic Integration:
    • Replace a TextInput with TiptapEditor in a resource’s form:
      use Awcodes\FilamentTiptapEditor\Components\TiptapEditor;
      
      TiptapEditor::make('content')
          ->required()
          ->columnSpanFull(),
      
  3. Enhancements:
    • Customize the toolbar or schema via Filament’s getTiptapOptions() method.
    • Add media upload handlers using Filament’s UploadPreview or custom JS.
  4. Testing:
    • Validate rich text rendering, saving, and editing across browsers/devices.
    • Test edge cases: empty fields, large payloads, concurrent edits.

Operational Impact

Maintenance

  • Proactive Tasks:
    • Dependency Updates: Monitor Tiptap.js and ProseMirror for breaking changes (e.g., schema migrations).
    • Filament Updates: Test the package against new Filament minor/patch releases.
    • Asset Management: Clear Vite cache if Tiptap’s JS/CSS changes:
      npm run dev -- --clear
      
  • Reactive Tasks:
    • Custom Extensions: Maintain custom Tiptap plugins/schemas in version control.
    • Media Handling: Update upload logic if Filament’s media library changes.

Support

  • Troubleshooting:
    • Common Issues:
      • Tiptap not loading: Check Vite compilation and browser console for errors.
      • JSON serialization: Ensure Laravel’s json column type is used (or handle manual conversion).
      • Media uploads: Verify CORS and storage permissions.
    • Debugging Tools:
      • Tiptap’s devTools extension for inspecting the editor state.
      • Filament’s wire:log for Livewire communication issues.
  • Documentation:

Scaling

  • Performance:
    • Database: Large JSON fields may impact query performance. Consider:
      • Indexing json_extract fields (MySQL 5.7+) for search.
      • Archiving old content or using a dedicated CMS (e.g., Strapi) for high-volume text.
    • Frontend:
      • Lazy-load Tiptap’s heavy dependencies if used in non-critical forms.
      • Debounce form submissions for large fields to reduce server load.
  • Concurrency:
    • Tiptap’s collaborative editing (e.g., Yjs) is not built-in; implement optimistic locking via
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky