goldnead/statamic-email-templates
Statamic addon for managing email templates in the control panel. Create, edit, and organize reusable email layouts with variables, previews, and multilingual support, so transactional emails stay consistent without touching code.
This is a Statamic addon with two distinct surfaces: the Control Panel settings screen, and email rendering via EmailTemplates::resolve(). v2.9.0 changed the first (CP nav placement); v2.9.1 changed the second (an opt-out from the branded email shell). Neither touches front-end page rendering or headless/API-only setups.
Minimal steps:
branded => false opt-out, and statamic-brand-context 1.16+ for the nested settings nav introduced in v2.9.0. Use composer show or composer.lock.First use case to verify after upgrading: take a template that falls through to one of your fallbacks and is a complete HTML document (marketing/newsletter files carrying their own header and footer), with a branded layout configured. Send it to yourself and open it on a phone. Then add branded => false to the array that fallback returns and confirm: one header and footer (not two), and no horizontal scrolling on mobile.
The v2.9.1 change is a small contract addition to the fallback return array — a consume change for most teams, an author change if you own fallbacks.
branded => false is returned by the caller's fallback, so granularity lives in your resolution code. Complete documents (marketing templates, imported designs, anything with <html>/doctype and its own header+footer) opt out; transactional mail (order confirmations, password resets, receipts) should stay inside the branded shell for visual consistency and because that shell likely carries your footer, unsubscribe link, and postal address.str_contains($html, '<html') heuristic is a reasonable safety net for imported templates, but don't make it the primary rule — a fragment containing a stray <html-ish string shouldn't silently lose your footer.FullTemplate/BrandedTemplate value object) so branded is decided in one place. Scattered arrays are how you end up with one template double-framed and nobody noticing until a campaign ships.branded => false returns the body as-is: no wrapper header, and crucially no wrapper footer. If your unsubscribe link, preference centre link, or physical mailing address lived in the branded layout, an opted-out template now legally needs to carry its own. Marketing's files do; a hand-rolled fallback probably doesn't.config/statamic/* entry — there isn't one, and nothing needs migrating for either release. If a deploy checklist says to publish or migrate, the checklist is stale.branded. Verify on staging rather than assuming an older version ignores the key gracefully.settingsNavParent() is ignored below brand-context 1.16. If a stakeholder expects the nested CP layout and doesn't see it, check that version before debugging the addon.php artisan statamic:stache:clear and php artisan cache:clear before assuming failure. For email changes not appearing, clear compiled views (php artisan view:clear) and confirm which fallback actually resolved.[section, name] tuple in settingsNavParent() typically falls back to the shared Addon-Suite page rather than erroring — inspect the tuple against registered nav entries when a link lands somewhere unexpected.settingsNavParent() is now the idiomatic way to attach settings to your own nav entry instead of relying on the shared page — same brand-context version floor applies.How can I help you explore Laravel packages today?