editor

g.editor — WYSIWYG fields over a hidden textarea

The standard field — basic toolbar, validated

The full toolbar — headings, alignment, quotes, code

The TipTap flavor — same contract, our toolbar

Disabled follows the textarea

Save

What the form holds — textarea.value, live

(edit something)

The rules

  • The route declares 'vendors' => ['quill'] + 'libs' => ['editor']; the field is a <textarea editor> keeping its name and validate-* rules; the value is CLEAN HTML, '' while empty.
  • Toolbar presets: basic (default — inline marks, lists, link) and full (+ headings, alignment, quote, code). The preset is also the paste whitelist.
  • Two engines, one contract: editor (Quill, default) and editor="tiptap" (headless, framework toolbar). Same value, same validation, same server whitelist — pick per page, never mix within a form without reason.
  • Validation runs on the plain TEXT (required / min-length / max-length count what the user reads); former fills/collects the HTML like any field.
  • The SAVE route declares 'html' => ['body'] — the API reduces those keys to the editor whitelist before the function runs; render stored values with |noescape.
  • Docs: templates/app/docs/libs/editor.md; the harness: /tests/editor.