{"id":"6a68f292c451e9238bed89df","title":"2026 07 28","path":"how-to/committee/release-notes/2026-07-28","contentMarkdown":"# 28-Jul-2026 — H1–H6 headings and extract TipTap/composer helpers [ref #303](https://github.com/nbarrett/ngx-ramblers/issues/303)\n\n## [build 801](https://github.com/nbarrett/ngx-ramblers/actions/runs/30386038443) — [commit 004a302](https://github.com/nbarrett/ngx-ramblers/commit/004a3023a1b1b252905ac9fc9f7eb2185ec2b662)\n\n_____\n\n## What's new\n\nThe shared TipTap editor now supports the full set of heading levels used on the site (Heading 1 through Heading 6), so existing content and paste that use any of those levels keep working in the toolbar and in the document. Styles for the editor live in a dedicated stylesheet next to the component, and paste clean-up helpers are shared pure functions rather than buried in the component class.\n\nEmail composer helpers that used to sit in the model file (merge-field labels, example values, divider HTML, default fragment order, and related builders) now live under `functions/`, so the model keeps types, enums and catalogues only.\n\n## At a glance\n\n- Toolbar offers Heading 1–6 plus Normal text\n- TipTap StarterKit accepts heading levels 1–6 (matches content already stored on sites)\n- Editor styles moved out of the TypeScript file into `tiptap-markdown-editor.sass`\n- Paste sanitisation for HTML and markdown is in `tiptap-paste.ts`\n- Merge-field brace stripping is shared (`stripMergeFieldBraces`) so insert and edit paths stay consistent\n- Friendly labels and example values for merge fields and link tokens come from `functions/merge-fields.ts`\n- Divider HTML, fragment builders, recycled-tracking URL scan and default composer state come from `functions/email-composer.ts`\n- Fragment-order state fields are named via `EmailComposerFragmentOrderField` instead of an ad hoc string union","contentHtml":"<h1>28-Jul-2026 — H1–H6 headings and extract TipTap/composer helpers <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/303\">ref #303</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/30386038443\">build 801</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/004a3023a1b1b252905ac9fc9f7eb2185ec2b662\">commit 004a302</a></h2>\n<hr>\n<h2>What&#39;s new</h2>\n<p>The shared TipTap editor now supports the full set of heading levels used on the site (Heading 1 through Heading 6), so existing content and paste that use any of those levels keep working in the toolbar and in the document. Styles for the editor live in a dedicated stylesheet next to the component, and paste clean-up helpers are shared pure functions rather than buried in the component class.</p>\n<p>Email composer helpers that used to sit in the model file (merge-field labels, example values, divider HTML, default fragment order, and related builders) now live under <code>functions/</code>, so the model keeps types, enums and catalogues only.</p>\n<h2>At a glance</h2>\n<ul>\n<li>Toolbar offers Heading 1–6 plus Normal text</li>\n<li>TipTap StarterKit accepts heading levels 1–6 (matches content already stored on sites)</li>\n<li>Editor styles moved out of the TypeScript file into <code>tiptap-markdown-editor.sass</code></li>\n<li>Paste sanitisation for HTML and markdown is in <code>tiptap-paste.ts</code></li>\n<li>Merge-field brace stripping is shared (<code>stripMergeFieldBraces</code>) so insert and edit paths stay consistent</li>\n<li>Friendly labels and example values for merge fields and link tokens come from <code>functions/merge-fields.ts</code></li>\n<li>Divider HTML, fragment builders, recycled-tracking URL scan and default composer state come from <code>functions/email-composer.ts</code></li>\n<li>Fragment-order state fields are named via <code>EmailComposerFragmentOrderField</code> instead of an ad hoc string union</li>\n</ul>\n"}