0.21.0
- Feature@templatical/core@templatical/editor@templatical/types
Open-source Saved Blocks — reusable groups of blocks users save and re-insert — backed by a consumer-supplied storage provider. Previously Cloud-only ("Saved Modules").
Templatical ships often. Every release is listed here with the packages it changed — all packages share one version number.
Open-source Saved Blocks — reusable groups of blocks users save and re-insert — backed by a consumer-supplied storage provider. Previously Cloud-only ("Saved Modules").
Add per-field color presets to custom-block color fields.
Add a fonts.builtIns option to restrict which of the seven built-in fonts the font picker offers.
Add a colors editor option for a preset color-picker palette.
Add a resolveImageUrl config option — a display-only resolver for image src values (#415).
Escape table cell content when rendering, and strip HTML from imported BeeFree table cells.
Add an opt-in htmlBlockPreview config option that renders HTML blocks as a live preview in the editor canvas.
Fix two shadow-DOM rendering bugs surfaced when the editor is embedded under a transformed ancestor
Add a per-section "Stack on mobile" control and make the mobile preview stack columns
The swatch-only color pickers (paragraph text color and highlight, plus the menu color control) now carry a manual hex field with an inline × clear inside the picker popover — the same control as the sidebar color pickers. You can type or paste an exact hex (applied on Enter/blur) and clear back to the inherited color with the ×. This restores the unset affordance that the move to the shared color picker had dropped, and adds precise hex entry that swatch-only mode previously lacked.
Point the default socialIconsBaseUrl at jsDelivr instead of unpkg (https://cdn.jsdelivr.net/npm/@templatical/renderer@<version>/assets/social). jsDelivr's multi-CDN backbone with automatic failover is a better fit for the social-icon PNGs embedded in archived emails, which recipients may open years after delivery. The URL stays version-pinned, so already-sent emails keep their existing unpkg URLs (still resolvable) and only new renders use jsDelivr. Consumers overriding socialIconsBaseUrl are unaffected.
Rich-text toolbar (text color + highlight) now uses the SDK's shared color picker — the same hex-wheel ColorPicker used everywhere else in the editor — instead of the native OS color input. The controls are unset-aware (an inherited-color selection shows the "not set" swatch, with the wheel seeded on the color the text actually renders in) and sized to match the toolbar. Adds size ("sm" | "md") and ariaLabel props to the internal ColorPicker.
Add per-link color for rich-text links
Add Spanish translations for the editor and media library.
Add Catalan translations for the editor and media library.
Add a document-level default text color with a full per-block cascade
Add document-level link color and underline controls
Fix es (Spanish) and ca (Catalan) translations not loading in the media library. The locale loader now auto-discovers every locale file via import.meta.glob (matching the editor) instead of a hardcoded supported-locales list that omitted them, so both languages resolve correctly instead of falling back to English.
Fix: clicking a link inside a rich-text block no longer opens it
Fix: editor primary buttons no longer render with a transparent background in bundled/CDN builds (#357)
Add type-ahead merge tag autocomplete to input and textarea fields
Fix: show merge tag labels in Button, Menu, Video and Image block canvas display
Add standalone logic tags — a control-flow feature separate from merge tags. Configure logicTags.tags (standalone tokens like {% else %}) and logicTags.pairs (open/close constructs like {% if %} … {% endif %}), or supply logicTags.onRequest to plug in your own picker (mirrors mergeTags.onRequest; precedence: onRequest → built-in picker). A dedicated "Insert logic" affordance appears in rich-text blocks and in merge-tag-enabled plain fields (button text, URLs, alt text). Standalone tags insert at the cursor; pairs wrap the current selection (or drop with the caret between them). The built-in picker is a single searchable list grouped by group — each group holds both its standalone tags and its open/close pairs, with keyword badges (one per tag, two per pair). Typed and pasted logic tags are still highlighted automatically, independent of this config. New exported types: LogicTagsConfig, LogicTag, LogicPair.
Add an optional outer frame to section blocks (section.wrapper) — a full-width band with its own background, padding, and corner radius that frames the section, rendered as an mj-wrapper around the section's mj-section. This makes the common "white card on a colored band" layout possible without nesting sections (which MJML forbids). Enable it from the section toolbar's Wrapper panel, or set createSectionBlock({ wrapper: { backgroundColor, padding, borderRadius } }); omit it and existing templates are unchanged. (#312)
Add an optional borderRadius (px) to section blocks. Set it from the section toolbar or via createSectionBlock({ borderRadius }); the renderer emits it as border-radius on the mj-section, so a section with a background color reads as a rounded card on a contrasting background. Omitted or 0 keeps square corners, so existing templates are unchanged. First step toward the framed "card on colored background" pattern. (#312)
Fix the editor allowing a section to be dropped into another section's column (dragged from the sidebar palette) and then silently losing it on export. MJML cannot nest mj-section inside mj-column, so renderToMjml() / editor.toMjml() dropped the nested section and all of its content. Dragging a section into a column is now rejected up front, and the core addBlock / moveBlock APIs refuse to nest a section into a column, so the invalid state can no longer be created. (#292)
Add drag-and-drop image upload (#229). Drag an image file from your computer onto an image block (empty or filled to replace), the sidebar image field, or a custom block's image field to set it — the editor forwards the dropped File to your onRequestMedia handler via the new optional MediaRequestContext.files, exactly like the Browse Media path (upload it and return the URL). In Cloud editors the dropped file is uploaded to your media library automatically. A file dropped anywhere else on the editor is ignored instead of navigating the browser away.
Fix block/section background color incorrectly showing #ffffff when no color is set. An unset color now reads as "Not set" (a slashed swatch) instead of a fake white, and picking a color equal to the default — e.g. white on a transparent background — now persists and renders correctly instead of being silently dropped. A clear (×) button resets a color back to unset. (#282)
Add a width option to button blocks: buttons can be set to a fixed pixel width or stretched to full width ('full'), independently of their label, instead of always shrinking to fit their content. Omitting width keeps the previous content-sized behavior, so existing templates are unaffected (#260).
Add website option to social icons
Allow entering a custom image width. The image width control now has a "Custom" option alongside the existing presets (Full width / 300 / 400 / 500) that reveals a pixel input, so images can be sized to any width instead of only the nearest preset (#259).
Fix the button settings panel laying out the Background and Text Color pickers side by side in a two-column grid too narrow to hold each picker's swatch + hex input, clipping the hex field. The two color fields now stack vertically (full width), matching the rest of the panel.
Centralize social-icon glyph data (SVG path + brand color) into a single SOCIAL_ICON_GLYPHS map in @templatical/types, shared by the editor's inline-SVG renderer and the renderer's PNG rasterizer (which previously each kept their own copy). Adding a platform to the SocialPlatform union is now a compile error until its glyph exists, so the editor and renderer can no longer drift out of sync. Social platform dropdown labels now resolve through i18n (social.platforms) instead of a hardcoded English name.
Prevent palette block from disappearing during drag and drop
Add a smallScreenNotice option (default true): on viewports narrower than ~768px the editor now shows a "use a larger screen" notice instead of a cramped, unusable drag-and-drop layout. The palette, canvas, and properties panel can't lay out on a phone and touch dragging is impractical, so this is the honest fallback. Opt out with smallScreenNotice: false to render the editor at any width if you handle small screens yourself. Applies to both the OSS and cloud editors (#235).
Add a paletteBlocks config option to reorder and filter the block palette (#232)
Fix the editor clipping its own content on short viewports. The block-types palette is now a scroll region, and the editor's min-height floor was lowered so it fills short containers instead of overflowing them — restoring access to the bottom of the palette, the footer, and the config panel's lower controls (#231).
Fix the global email background being hidden in the editor when a section has its own background. The background now renders in the gutters around the centered content, matching how it appears when the email is sent (#230).
Showing the 20 most recent releases.
The docs changelog carries the full history back to the first release, with the complete notes for every entry.