HTML from a rich editor, printed unescaped — with TinyMCE and TipTap as the two engines.
Formatted prose: the text data type edited through rich_text. Same
data type as textarea, different promise — the value is
HTML, and the template prints it unescaped (<%- %>). That is why
this variant is a deliberate choice rather than a default: you are
granting the field markup.
HTML from the editor. The field is the trust boundary here, not the template — a rich-text field is a decision that this content may carry tags, made once at declaration time instead of at every print site.
| Label | Body |
| Key | body |
| Data type | text |
| Editor | rich_text |
| Setting | richTextEngine — see below |
<div class="prose"><%- cms.asset.content.body %></div>
The editor ships with a choice, set per field, because the right answer depends on what the field's existing content already contains:
| Engine | What it does | Choose it when |
|---|---|---|
| TinyMCE (default) | HTML-tolerant — keeps what it is given | the content uses tables, classes, or inline styles that must survive |
| TipTap | schema-constrained — keeps headings, lists, links, basic marks and drops the rest | you want clean, predictable markup and can accept the pruning |
Only the non-default is stored: a field with no richTextEngine setting
is TinyMCE, which is the conservative default on purpose — switching an
existing field to TipTap means its next save is judged by TipTap's
schema, and markup outside that schema does not come back.