{"id":15663459,"url":"https://github.com/rawilk/filament-quill","last_synced_at":"2026-07-02T01:02:09.976Z","repository":{"id":213321605,"uuid":"731159152","full_name":"rawilk/filament-quill","owner":"rawilk","description":"Quill rich text editor for Filament.","archived":false,"fork":false,"pushed_at":"2025-03-10T22:52:21.000Z","size":912,"stargazers_count":28,"open_issues_count":3,"forks_count":7,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-03-31T14:14:17.910Z","etag":null,"topics":["filament","filament-plugin","forms","quill","rich-text"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rawilk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"rawilk"}},"created_at":"2023-12-13T13:38:29.000Z","updated_at":"2025-03-27T03:50:32.000Z","dependencies_parsed_at":"2024-04-01T23:26:38.352Z","dependency_job_id":"d527ff54-1cc9-497a-947c-1fd6b5d1a8d0","html_url":"https://github.com/rawilk/filament-quill","commit_stats":{"total_commits":94,"total_committers":2,"mean_commits":47.0,"dds":"0.43617021276595747","last_synced_commit":"d852302eb0d55511004ed9ca7455c5c8fc2aff9e"},"previous_names":["rawilk/filament-quill"],"tags_count":4,"template":false,"template_full_name":"rawilk/package-skeleton-laravel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rawilk%2Ffilament-quill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rawilk%2Ffilament-quill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rawilk%2Ffilament-quill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rawilk%2Ffilament-quill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rawilk","download_url":"https://codeload.github.com/rawilk/filament-quill/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247685634,"owners_count":20979085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["filament","filament-plugin","forms","quill","rich-text"],"created_at":"2024-10-03T13:37:33.057Z","updated_at":"2026-07-02T01:02:09.964Z","avatar_url":"https://github.com/rawilk.png","language":"PHP","funding_links":["https://github.com/sponsors/rawilk"],"categories":[],"sub_categories":[],"readme":"# filament-quill\n\n[![Latest Version on Packagist](https://img.shields.io/packagist/v/rawilk/filament-quill.svg?style=flat-square)](https://packagist.org/packages/rawilk/filament-quill)\n![Tests](https://github.com/rawilk/filament-quill/workflows/Tests/badge.svg?style=flat-square)\n[![Total Downloads](https://img.shields.io/packagist/dt/rawilk/filament-quill.svg?style=flat-square)](https://packagist.org/packages/rawilk/filament-quill)\n[![PHP from Packagist](https://img.shields.io/packagist/php-v/rawilk/filament-quill?style=flat-square)](https://packagist.org/packages/rawilk/filament-quill)\n[![License](https://img.shields.io/github/license/rawilk/filament-quill?style=flat-square)](https://github.com/rawilk/filament-quill/blob/main/LICENSE.md)\n\n![social image](https://github.com/rawilk/filament-quill/blob/main/art/social-image.png?raw=true)\n\n`filament-quill` offers a [Quill](https://quilljs.com) rich text editor integration for filament admin panels and forms.\n\n## Requirements\n\n- PHP 8.3 or higher\n- Laravel 12 or higher\n- Filament 5 (should work with Filament 4 too)\n\n## Installation\n\nYou can install the package via composer:\n\n```bash\ncomposer require rawilk/filament-quill\n```\n\nYou can publish the config file with:\n\n```bash\nphp artisan vendor:publish --tag=\"filament-quill-config\"\n```\n\nYou can view the default configuration here: https://github.com/rawilk/filament-quill/blob/main/config/filament-quill.php\n\nIf you need to, you can publish the views and translations with:\n\n```bash\nphp artisan vendor:publish --tag=\"filament-quill-views\"\nphp artisan vendor:publish --tag=\"filament-quill-translations\"\n```\n\nFor more information on setup necessary to render editor content, see the [Rendering Content](#rendering-content) section.\n\n## Upgrading\n\nUpgrading from a v1.x? See the [upgrade guide](UPGRADE.md).\n\n## Usage\n\nThe editor has been set up to behave like and have a similar api to the rich text editor component provided by Filament. One major difference between Filament's editor and the package's editor is Filament is using Tiptap for the editor, while this package is using Quill.\n\nHere's a quick example of how to use the editor in a filament form:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content'),\n```\n\nThis will provide an editor that will look like this in your form:\n\n![basic example](https://github.com/rawilk/filament-quill/blob/main/art/basic.png?raw=true)\n\n## Toolbar Buttons\n\nThe editor ships with a default toolbar. Please consult the `ToolbarButton` enum for a full list of available toolbar buttons. These are the defaults:\n\n```php\nuse Rawilk\\FilamentQuill\\Enums\\ToolbarButton;\n\n[\n    ToolbarButton::Font,\n    ToolbarButton::Size,\n    ToolbarButton::Bold,\n    ToolbarButton::Italic,\n    ToolbarButton::Underline,\n    ToolbarButton::Strike,\n    ToolbarButton::BlockQuote,\n    ToolbarButton::OrderedList,\n    ToolbarButton::UnorderedList,\n    ToolbarButton::Indent,\n    ToolbarButton::Link,\n    ToolbarButton::Image,\n    ToolbarButton::Scripts,\n    ToolbarButton::TextAlign,\n    ToolbarButton::TextColor,\n    ToolbarButton::BackgroundColor,\n    ToolbarButton::Undo,\n    ToolbarButton::Redo,\n    ToolbarButton::ClearFormat,\n    ToolbarButton::Header,\n]\n```\n\nYou may alternatively use the `disableToolbarButtons()` method to disable specific buttons:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\nuse Rawilk\\FilamentQuill\\Enums\\ToolbarButton;\n\nQuillEditor::make('content')\n    -\u003edisableToolbarButtons([\n        ToolbarButton::BlockQuote,\n        ToolbarButton::Font,\n    ])\n```\n\nYou can also enable specific toolbar buttons using the `enableToolbarButtons()` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\nuse Rawilk\\FilamentQuill\\Enums\\ToolbarButton;\n\nQuillEditor::make('content')\n    -\u003eenableToolbarButtons([\n        ToolbarButton::CodeBlock,\n    ])\n```\n\n## Placeholders\n\nA requirement I often have for rich text editors is the ability to provide a list of placeholder variables that an end-user can select and insert into the editor. My most common use case for this is for email templates. I've made it simple to do this in this package. All you need to do is provide an array of placeholders to the component.\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eplaceholders([\n        'USER_NAME',\n        'USER_EMAIL',\n        'CURRENT_DATE',\n    ])\n```\n\n![placeholders example](https://github.com/rawilk/filament-quill/blob/main/art/placeholders.png?raw=true)\n\nAs you can see, we take care of adding the toolbar button and registering a [Handler](#handlers) to insert the placeholder variable into the editor for you. The editor will surround the variable with the `[` and `]` characters before the variable is inserted, however these characters can be [customized](#surrounding-characters).\n\n**Note:** Parsing and replacing your variables in your content is outside the scope of this form component. You will need to handle that part yourself.\n\n### Surrounding Characters\n\nBy default, we will surround a variable with `[` and `]` before it's inserted into the editor, so a the `USER_NAME` variable would become `[USER_NAME]` when we insert it.\n\nTo change these characters, you can use the `surroundPlaceholdersWith()` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eplaceholders([\n        'USER_NAME',\n        'USER_EMAIL',\n        'CURRENT_DATE',\n    ])\n    -\u003esurroundPlaceholdersWith(start: '{{ ', end: ' }}')\n```\n\nNow when a variable is inserted, it will look like `{{ USER_NAME }}` instead.\n\n### Placeholder Button Label\n\nTo change the text on the placeholder button, you can either modify the `filament-quill::quill.placeholders.label` translation, or you can pass in a label via the `placeholderButtonLabel()` method.\n\n## Handlers\n\nIf you want to override a handler for an existing toolbar button, you can define your custom JavaScript [handlers](https://quilljs.com/docs/modules/toolbar/#handlers) using the `handlers()` method. Here's an example of how to use your own handler for the `bold` toolbar button:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003ehandlers([\n        'bold' =\u003e \u003c\u003c\u003c'JS'\n        function (value) {\n            if (value) {\n                // this.quill.format(...);\n            }\n        }\n        JS,\n    ])\n```\n\n\u003e Note: Inside your callback functions, you will have access to the quill editor instance via `this.quill` as long as you don't use an arrow function.\n\n## Custom Toolbar Buttons\n\nTo add your own toolbar buttons, you can use the `addToolbarButton()` method. You will need to provide a name, a label, and a JavaScript handler for the button. If you need a dropdown instead, you will need to provide an array of options as well.\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eaddToolbarButton(\n        name: 'custom',\n        label: 'Custom button',\n        handler: \u003c\u003c\u003c'JS'\n        function (value) {\n            console.log(value);\n            // this.quill.insertText(0, value);\n        },\n        JS,\n        // options: ['option 1', 'option 2'],\n        // showSelectedOption: true,\n    )\n```\n\nThe last parameter, `showSelectedOption` only applies to dropdown buttons. When set to true, when a user clicks on an option, it will show the selected option's text as the dropdown label, just like the font family or font size toolbar buttons do.\n\n## Uploading Images\n\nWhen the `ToolbarButton::Image` button is enabled, a user will be able to insert an image into the editor. Similar to filament's rich text editor, we will upload the image to the server and use that image's url on the server instead of storing it as a base64 encoded image in the content. You can customize how and where the images are stored on the server using these methods:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003efileAttachmentsDisk('s3')\n    -\u003efileAttachmentsDirectory('attachments')\n    -\u003efileAttachmentsVisibility('private')\n```\n\nNote: We do not handle tracking and managing the uploaded images. For example, if an image is deleted from the content, we will not remove it from the server, so images have a high probability of becoming orphaned. We will dispatch a `quill-image-uploaded` alpine event when we upload an image, and a `quill-images-deleted` alpine event when our JavaScript detects an image has been removed from the content. Both of these events will receive the fully qualified urls of the relevant images, and the name of the field the event was dispatched from. You could listen for these events and track the absolute urls of the images:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eextraAlpineAttributes([\n        '@quill-image-uploaded' =\u003e \u003c\u003c\u003c'JS'\n        ({ detail: { url, statePath } }) =\u003e {\n            // handle the upload here.\n            // console.log(url);\n        }\n        JS,\n        '@quill-images-deleted' =\u003e \u003c\u003c\u003c'JS'\n        ({ detail: { urls, statePath } }) =\u003e {\n            // handle the event here.\n        }\n        JS,\n    ])\n```\n\nYou could alternatively provide a callback to the `saveUploadedFileAttachmentsUsing()` method on the editor to help you track the files, however that route may require more work on your end.\n\n**Note:** You may want to delay deleting the images from the server when listening to the `quill-images-deleted` event until the user triggers a save, and/or you reset the [history](#history) state of the editor.\n\n## Image Resizing\n\nImages inside the editor can optionally be resized with drag handles and aligned (left, center, or right) using an overlay toolbar. This is disabled by default; enable it per-editor with the `allowImageResizing()` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eallowImageResizing()\n```\n\nYou may also enable it globally for every editor by setting `allow_image_resizing` to `true` in the published `config/filament-quill.php` file. The per-editor method always takes precedence over the config value, so you can opt a single editor out again with `-\u003eallowImageResizing(false)`.\n\nResized dimensions are saved as `width` and `height` attributes on the `\u003cimg\u003e` tag, and alignment is saved as a `data-align` attribute — no inline styles are added, so the stored HTML stays clean and the values are preserved when the content is loaded back into the editor. The alignment is rendered from the package's `content.css` styles, so make sure those styles are loaded both in the editor and wherever you [render the content](#rendering-content).\n\n## Rendering Content\n\nTo match the formatting you will see in the editor, wrap your user-generated content inside a container with the `quill-content prose max-w-none` classes on it. You will also need to load the package's content styles wherever you render saved editor HTML. We've extracted those styles into a separate stylesheet, called `content.css`. If you haven't set up a custom theme and are using a panel, follow the [Filament docs](https://filamentphp.com/docs/5.x/styling/overview) first.\n\nThe following will apply in both a panel and standalone as well.\n\n1. In your Tailwind CSS 4 theme stylesheet, register the package views as a source and import the content styles:\n\n```css\n@import \"tailwindcss\";\n\n@source \"\u003cpath-to-vendor\u003e/rawilk/filament-quill/resources/**/*.blade.php\";\n@source inline(\"quill-content prose max-w-none dark:prose-invert\");\n\n@import \"\u003cpath-to-vendor\u003e/rawilk/filament-quill/resources/css/content.css\";\n```\n\nIf your theme stylesheet already imports Tailwind, add the package `@source` rules and `content.css` import to that same file instead of creating a second Tailwind entrypoint.\n\n2. If you use the `prose` classes shown below, make sure your theme includes Tailwind's typography plugin:\n\n```css\n@plugin \"@tailwindcss/typography\";\n```\n\n3. If you need to load all package styles manually, you can import `app.css` instead. This is usually not recommended for normal Filament fields because the package loads the editor styles for you.\n\n```css\n@import \"\u003cpath-to-vendor\u003e/rawilk/filament-quill/resources/css/app.css\";\n```\n\n4. If your app is still migrating to Tailwind CSS 4, make sure your PostCSS setup uses the Tailwind 4 plugin:\n\n```js\nmodule.exports = {\n    plugins: {\n        \"postcss-import\": {},\n        \"@tailwindcss/postcss\": {},\n        autoprefixer: {},\n    },\n};\n```\n\n5. Rebuild your custom theme.\n\n```bash\nnpm run build\n```\n\n6. Render the content\n\n```html\n@use(Illuminate\\Support\\HtmlString)\n\n\u003cdiv\n    class=\"quill-content prose max-w-none\"\n    @style([\n        // Adjust or omit as necessary depending on your default\n        // font size for editor content.\n        '--ql-default-size: 14px',\n    ])\n\u003e\n    {{ new HtmlString($yourContent) }}\n\u003c/div\u003e\n```\n\nYou can also add `dark:prose-invert` to your container if you're supporting dark mode for the content rendering.\n\nIt's also generally a good idea to run your content through a html purifier, however that is outside the scope of these docs.\n\n### Custom Fonts\n\nIf you have the `ToolbarButton::Font` button enabled, we will render a dropdown allowing the user to format their content with `Sans Serif`, `Serif`, or `Monospaced` font families. You will need to pull in and register those font families manually, however. In a panel, you could take advantage of the `panels::head.start` [Render Hook](https://filamentphp.com/docs/5.x/advanced/render-hooks) to accomplish this.\n\nIn the code below, we're going to pull in `Fira Code` and `PT Serif` monospace and serif fonts to use, however the process is similar to custom fonts as well.\n\n```html\n\u003clink\n    href=\"https://fonts.bunny.net/css?family=fira-code:300,400,500,600,700|pt-serif:400,400i,700,700i\u0026display=swap\"\n    rel=\"stylesheet\"\n/\u003e\n\n\u003cstyle\u003e\n    :root {\n        --font-serif-family: \"PT Serif\";\n        --font-mono-family: \"Fira Code\";\n    }\n\u003c/style\u003e\n```\n\n#### Registering the font families\n\nIn the package's stylesheet, we configure monospace and serif font families to look for the `--font-serif-family` and `--font-mono-family` css variables in the editor area. When rendering your own content independently, you can register those fonts in your theme stylesheet with Tailwind's CSS configuration syntax.\n\n```css\n@theme {\n    --font-quill-serif:\n        var(--font-serif-family), ui-serif, Georgia, Cambria, \"Times New Roman\",\n        Times, serif;\n    --font-quill-mono:\n        var(--font-mono-family), ui-monospace, SFMono-Regular, Menlo, Monaco,\n        Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n```\n\n#### Using custom font families\n\nIf you want to use custom font families, like \"Times New Roman\", or something like that, you can use the `useFonts()` method on the component:\n\n\u003e Be sure to follow the [Rendering Content](#rendering-content) section first to make sure you have everything setup for this.\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003euseFonts([\n        'Times New Roman',\n    ])\n```\n\nBased on the [registering the font families](#registering-the-font-families) section, you will need to register the font in your stylesheet. We will map each font family value to a slug, so the \"Times New Roman\" font above will be mapped to \"times-new-roman\".\n\n```css\n@theme {\n    --font-quill-times: \"Times New Roman\", Times, serif;\n}\n```\n\nIn a custom stylesheet, you will need to target the areas of the content that are formatted with this font:\n\n```css\n.quill-content {\n    \u0026,\n    .ql-editor {\n        .ql-times-new-roman,\n        .ql-editor .ql-times-new-roman {\n            @apply font-quill-times;\n        }\n    }\n}\n```\n\nBe sure to replace `.ql-times-new-roman` and `font-quill-times` with your actual font names.\n\n### Custom font sizes\n\nWhen the `ToolbarButton::Size` button is enabled, we will show a dropdown of font sizes the user can use to format their content with. Like with the [font families](#custom-fonts), you are free to define your own sizes. You can pass an array of font sizes to the `fontSizes` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003efontSizes([\n        '10px',\n        '12px',\n        '14px',\n        '20px',\n    ])\n```\n\nWhen you provide actual CSS size units, Quill will inline the text size right on the content, so no additional styling will be required. However, if you provide non-standard sizes, like \"Small\" or \"Large\", you will need to target those selectors in your css. The selectors follow a scheme of: `ql-size-{size}`.\n\n```css\n.ql-size-small,\n.ql-editor .ql-size-small {\n    font-size: 0.75rem;\n}\n```\n\n### Custom colors\n\nWhen you have the `ToolbarButton::TextColor` and `ToolbarButton::BackgroundColor` buttons enabled, you are free to specify your own color pallet using css hex color codes.\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\n$colors = [\n    '#fff',\n    '#ff0000',\n    '#333',\n    // ...\n];\n\nQuillEditor::make('content')\n    -\u003etextColors($colors)\n    -\u003ebackgroundColors($colors)\n```\n\n## History\n\nBy default, the editor includes toolbar buttons for undo/redo history actions. When dealing with [Images](#uploading-images) or some other use-cases, you may want to reset the history state of the editor so the user can't \"undo\" a change back to a broken image if you removed it from the server. This can easily be accomplished by calling the `clearHistory` method on the component from an action, for example.\n\nHere's an example of resetting the history state on an edit resource page form using the `afterSave` hook:\n\n```php\nuse Filament\\Forms\\Components\\Component;\n\nprotected function afterSave(): void\n{\n    $component = $this-\u003eform-\u003egetComponent('data.content');\n\n    $component-\u003eclearHistory();\n}\n```\n\nBehind the scenes, the editor component will dispatch the `quill-history-clear` browser event, which our javascript will be listening for. If you aren't able to get a component instance, you can manually dispatch the event yourself. You will just need to know the state path for the component (typically `data.your_field_name`).\n\n```php\n$this-\u003edispatch('quill-history-clear', id: 'data.content');\n```\n\n## Other Callbacks\n\n### onInit\n\nUsing the `onInit` callback, you are able to register additional handlers or callbacks on the quill editor instance, and more. This can be a great place to register your own [Event](https://quilljs.com/docs/api/#events) handlers on the editor instance. All you need to do is provide a JavaScript callback to the `onInit()` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eonInit(\u003c\u003c\u003c'JS'\n    function (quill, alpineInstance) {\n        // quill.on('selection-change', function (range, oldRange, source) {\n            // do stuff\n        // )};\n    }\n    JS)\n```\n\nOur JavaScript will pass your callback an instance of the quill editor, as well as the alpine component instance.\n\n### Text Changed\n\nIf you just want to hook into the `text-changed` event that is dispatched from quill, you can use the `onTextChange` method:\n\n```php\nuse Rawilk\\FilamentQuill\\Filament\\Forms\\Components\\QuillEditor;\n\nQuillEditor::make('content')\n    -\u003eonTextChange(\u003c\u003c\u003c'JS'\n    function (delta, oldDelta, source, alpineInstance) {\n        // handle it\n    },\n    JS)\n```\n\nNote that we're using a regular function here, and not an arrow function. This is so you can use `this.quill` for the editor instance.\n\nIn addition to the normal arguments that Quill provides, we also provide your callback an instance of the alpine component if you need it. You can prevent any processing of this event by our JavaScript if you return `false` from your callback.\n\n## Scripts\n\n### Setup\n\nFor convenience, you can run the setup bin script for easy installation for local development.\n\n```bash\n./bin/setup.sh\n```\n\n### Formatting\n\nAlthough formatting is done automatically via workflow, you can format php code locally before committing with a composer script:\n\n```bash\ncomposer format\n```\n\n## Testing\n\n```bash\ncomposer test\n```\n\nThe test suite includes Pest Browser coverage for the editor. When running the same split as CI, run regular tests in parallel and browser tests serially:\n\n```bash\nvendor/bin/pest --parallel --exclude-group=browser\nvendor/bin/pest --group=browser\n```\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Contributing\n\nPlease see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.\n\n## Security\n\nPlease review [my security policy](.github/SECURITY.md) on how to report security vulnerabilities.\n\n## Credits\n\n- [Randall Wilk](https://github.com/rawilk)\n- [All Contributors](../../contributors)\n\n## Alternatives\n\n- [Filament's Rich Editor](https://filamentphp.com/docs/5.x/forms/rich-editor)\n- [Filament Tiptap Editor](https://github.com/awcodes/filament-tiptap-editor)\n- [Filament Forms TinyEditor](https://github.com/mohamedsabil83/filament-forms-tinyeditor)\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frawilk%2Ffilament-quill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frawilk%2Ffilament-quill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frawilk%2Ffilament-quill/lists"}