@learncard/email-templates 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Layout.d.ts +1 -0
- package/dist/components/Layout.d.ts.map +1 -1
- package/dist/components/Layout.js +2 -2
- package/dist/components/Layout.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +9 -9
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +12 -0
- package/dist/render.js.map +1 -1
- package/dist/templates/announcement.d.ts +13 -0
- package/dist/templates/announcement.d.ts.map +1 -0
- package/dist/templates/announcement.js +34 -0
- package/dist/templates/announcement.js.map +1 -0
- package/dist/templates/index.d.ts +1 -0
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +1 -0
- package/dist/templates/index.js.map +1 -1
- package/dist/tenant-registry.d.ts +2 -2
- package/dist/tenant-registry.d.ts.map +1 -1
- package/dist/tenant-registry.js +2 -3
- package/dist/tenant-registry.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/i18n.test.ts +7 -0
- package/src/__tests__/render.test.ts +39 -0
- package/src/__tests__/tenant-registry.test.ts +2 -2
- package/src/components/Layout.tsx +4 -1
- package/src/index.ts +2 -0
- package/src/render.ts +22 -0
- package/src/templates/announcement.tsx +100 -0
- package/src/templates/index.ts +2 -0
- package/src/tenant-registry.ts +3 -4
|
@@ -9,6 +9,7 @@ import type { TenantBranding } from '../branding';
|
|
|
9
9
|
interface LayoutProps {
|
|
10
10
|
branding: TenantBranding;
|
|
11
11
|
preview: string;
|
|
12
|
+
disclaimer?: string;
|
|
12
13
|
children: React.ReactNode;
|
|
13
14
|
/** Show the brand icon at the top of the card. Defaults to true.
|
|
14
15
|
* Set to false when the template already has an IssuerLogo. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,WAAW;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;oEACgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,WAAW;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;oEACgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAoExC,CAAC"}
|
|
@@ -7,9 +7,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
7
7
|
*/
|
|
8
8
|
import { Html, Head, Body, Container, Section, Img, Text, Link, Preview, } from '@react-email/components';
|
|
9
9
|
import { SHARED, htmlLang, htmlDir, interpolate, resolveCatalogLocale } from '../i18n';
|
|
10
|
-
export const Layout = ({ branding, preview, children, showHeaderLogo = true, locale, }) => {
|
|
10
|
+
export const Layout = ({ branding, preview, disclaimer, children, showHeaderLogo = true, locale, }) => {
|
|
11
11
|
const chrome = SHARED[resolveCatalogLocale(locale)];
|
|
12
|
-
const disclaimerText = interpolate(chrome.footerDisclaimer, { brandName: branding.brandName });
|
|
12
|
+
const disclaimerText = disclaimer ?? interpolate(chrome.footerDisclaimer, { brandName: branding.brandName });
|
|
13
13
|
return (_jsxs(Html, { lang: htmlLang(locale), dir: htmlDir(locale), children: [_jsx(Head, {}), _jsx(Preview, { children: preview }), _jsxs(Body, { style: body, children: [_jsx("div", { style: topSpacer, children: "\u00A0" }), _jsx(Container, { style: wordmarkContainer, children: _jsx(Text, { style: wordmark, children: _jsx(Link, { href: branding.websiteUrl, style: wordmarkLink, children: branding.brandName.toUpperCase() }) }) }), _jsxs(Container, { style: container, children: [showHeaderLogo && (_jsx(Section, { style: headerLogo, children: _jsx(Img, { src: branding.logoUrl, alt: branding.logoAlt, width: 80, height: 80, style: logoImg }) })), _jsx(Section, { style: showHeaderLogo ? contentAfterLogo : content, children: children })] }), _jsxs(Container, { style: footerContainer, children: [_jsx(Text, { style: footerDisclaimer, children: disclaimerText }), _jsxs(Text, { style: footerCopyright, children: [branding.copyrightHolder, " \u00A9 ", new Date().getFullYear()] }), _jsx(Text, { style: footerLinks, children: _jsx(Link, { href: `mailto:${branding.supportEmail}`, style: footerLink, children: chrome.contactSupport }) })] })] })] }));
|
|
14
14
|
};
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EACH,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,OAAO,GACV,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ export { renderSms } from './sms';
|
|
|
24
24
|
export type { SmsTemplateId, SmsTemplateDataMap, SmsInboxClaimData, SmsVerificationData, } from './sms';
|
|
25
25
|
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding, } from './tenant-registry';
|
|
26
26
|
export type { ResolvedTenant, RequestHeaders } from './tenant-registry';
|
|
27
|
+
export type { AnnouncementData } from './render';
|
|
27
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EACR,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAGnF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EACR,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,OAAO,CAAC;AAGf,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EACR,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAGnF,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EACR,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,OAAO,CAAC;AAGf,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQxE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,9 +22,4 @@ export { renderEmail } from './render';
|
|
|
22
22
|
export { renderSms } from './sms';
|
|
23
23
|
// Server-side tenant resolution
|
|
24
24
|
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding, } from './tenant-registry';
|
|
25
|
-
// Template components are intentionally NOT re-exported from the barrel.
|
|
26
|
-
// They contain JSX (.tsx) and would force every transitive consumer to
|
|
27
|
-
// configure `jsx` in their tsconfig. Use renderEmail() / renderSms() instead.
|
|
28
|
-
// For direct component access (testing / preview), import from
|
|
29
|
-
// '@learncard/email-templates/src/templates' explicitly.
|
|
30
25
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,iBAAiB;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA2BvC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQlC,gCAAgC;AAChC,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,iBAAiB;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA2BvC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQlC,gCAAgC;AAChC,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC"}
|
package/dist/render.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* render.ts — the main rendering entry point.
|
|
3
|
-
*
|
|
4
|
-
* Consumers call `renderEmail(templateId, branding, data)` and get back
|
|
5
|
-
* `{ html, text, subject }` — ready to hand to any email provider.
|
|
6
|
-
*
|
|
7
|
-
* Template IDs map to the IDs used by brain-service and lca-api today,
|
|
8
|
-
* so migration can happen one template at a time.
|
|
9
|
-
*/
|
|
10
1
|
import type { TenantBranding } from './branding';
|
|
11
2
|
import type { EscrowHoldCancelledReason } from './templates';
|
|
12
3
|
export interface RenderedEmail {
|
|
@@ -21,7 +12,16 @@ export interface RenderedEmail {
|
|
|
21
12
|
* This provides full type safety: `renderEmail('inbox-claim', branding, data)` will
|
|
22
13
|
* require `data` to match `InboxClaimData`.
|
|
23
14
|
*/
|
|
15
|
+
export interface AnnouncementData {
|
|
16
|
+
title: string;
|
|
17
|
+
body: string;
|
|
18
|
+
heroImageUrl?: string;
|
|
19
|
+
ctaLabel: string;
|
|
20
|
+
ctaUrl?: string;
|
|
21
|
+
unsubscribeUrl: string;
|
|
22
|
+
}
|
|
24
23
|
export interface TemplateDataMap {
|
|
24
|
+
announcement: AnnouncementData;
|
|
25
25
|
/** brain-service: contact-methods.ts, embed flow */
|
|
26
26
|
'embed-email-verification': VerificationCodeData;
|
|
27
27
|
/** brain-service: contact-methods.ts — link-based email verification */
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgDjD,OAAO,KAAK,EAkBR,yBAAyB,EAI5B,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,gBAAgB,CAAC;IAG/B,oDAAoD;IACpD,0BAA0B,EAAE,oBAAoB,CAAC;IAEjD,wEAAwE;IACxE,6BAA6B,EAAE,qBAAqB,CAAC;IAErD,sCAAsC;IACtC,yBAAyB,EAAE,oBAAoB,CAAC;IAEhD,iDAAiD;IACjD,+BAA+B,EAAE,oBAAoB,CAAC;IAEtD,mDAAmD;IACnD,qBAAqB,EAAE,oBAAoB,CAAC;IAE5C,6CAA6C;IAC7C,6BAA6B,EAAE,oBAAoB,CAAC;IAIpD,sCAAsC;IACtC,aAAa,EAAE,cAAc,CAAC;IAE9B,qCAAqC;IACrC,uBAAuB,EAAE,cAAc,CAAC;IAIxC,8BAA8B;IAC9B,mBAAmB,EAAE,oBAAoB,CAAC;IAI1C,8BAA8B;IAC9B,kBAAkB,EAAE,mBAAmB,CAAC;IAExC,0CAA0C;IAC1C,wBAAwB,EAAE,mBAAmB,CAAC;IAI9C,uBAAuB;IACvB,cAAc,EAAE,eAAe,CAAC;IAEhC,sCAAsC;IACtC,qBAAqB,EAAE,eAAe,CAAC;IAIvC,8BAA8B;IAC9B,qBAAqB,EAAE,sBAAsB,CAAC;IAE9C,6CAA6C;IAC7C,yBAAyB,EAAE,sBAAsB,CAAC;IAIlD,4DAA4D;IAC5D,8BAA8B,EAAE,8BAA8B,CAAC;IAE/D,oDAAoD;IACpD,yBAAyB,EAAE,yBAAyB,CAAC;IAErD,8DAA8D;IAC9D,8BAA8B,EAAE,8BAA8B,CAAC;IAE/D,sDAAsD;IACtD,oBAAoB,EAAE,oBAAoB,CAAC;IAE3C,oDAAoD;IACpD,8BAA8B,EAAE,8BAA8B,CAAC;IAE/D,wEAAwE;IACxE,oBAAoB,EAAE,qBAAqB,CAAC;IAC5C,gEAAgE;IAChE,yBAAyB,EAAE,wBAAwB,CAAC;IAIpD,8DAA8D;IAC9D,qBAAqB,EAAE,qBAAqB,CAAC;IAE7C,uEAAuE;IACvE,sBAAsB,EAAE,sBAAsB,CAAC;IAE/C,+DAA+D;IAC/D,sBAAsB,EAAE,sBAAsB,CAAC;IAE/C,gFAAgF;IAChF,uBAAuB,EAAE,uBAAuB,CAAC;IAEjD,kEAAkE;IAClE,mBAAmB,EAAE,mBAAmB,CAAC;IAEzC,2FAA2F;IAC3F,oBAAoB,EAAE,mBAAmB,CAAC;IAE1C,2EAA2E;IAC3E,iBAAiB,EAAE,kBAAkB,CAAC;CACzC;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC3C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACtC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED,MAAM,WAAW,8BAA8B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC3C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,kEAAkE;IAClE,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,CAAC,SAAS,UAAU,EAClD,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,EAClD,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;AACxB,sDAAsD;AACtD,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CASxB"}
|
package/dist/render.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Announcement, getAnnouncementSubject } from './templates/announcement';
|
|
1
2
|
/**
|
|
2
3
|
* render.ts — the main rendering entry point.
|
|
3
4
|
*
|
|
@@ -148,6 +149,17 @@ function buildElement(templateId, branding, data, locale) {
|
|
|
148
149
|
subject: getGuardianRejectedCredentialSubject(branding, locale),
|
|
149
150
|
};
|
|
150
151
|
}
|
|
152
|
+
case 'announcement': {
|
|
153
|
+
const d = data;
|
|
154
|
+
return {
|
|
155
|
+
element: React.createElement(Announcement, {
|
|
156
|
+
branding,
|
|
157
|
+
...d,
|
|
158
|
+
...(locale === undefined ? {} : { locale }),
|
|
159
|
+
}),
|
|
160
|
+
subject: getAnnouncementSubject(d),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
151
163
|
case 'credential-updated': {
|
|
152
164
|
const d = data;
|
|
153
165
|
const props = { branding, ...d, locale };
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,EACf,yBAAyB,EACzB,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,oCAAoC,EACpC,qBAAqB,EACrB,+BAA+B,EAC/B,0BAA0B,EAC1B,oCAAoC,EACpC,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,oCAAoC,EACpC,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,8BAA8B,EAC9B,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAClB,4BAA4B,EAC5B,kBAAkB,EAClB,4BAA4B,EAC5B,mBAAmB,EACnB,6BAA6B,EAC7B,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AAyBrB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAChF;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,EACf,yBAAyB,EACzB,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,oCAAoC,EACpC,qBAAqB,EACrB,+BAA+B,EAC/B,0BAA0B,EAC1B,oCAAoC,EACpC,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,oCAAoC,EACpC,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,8BAA8B,EAC9B,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAClB,4BAA4B,EAC5B,kBAAkB,EAClB,4BAA4B,EAC5B,mBAAmB,EACnB,6BAA6B,EAC7B,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AAyBrB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA8PpC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,UAAa,EACb,QAAkD,EAClD,IAAwB;AACxB,sDAAsD;AACtD,MAAe;IAEf,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE9E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E,SAAS,wBAAwB,CAC7B,QAAwB,EACxB,IAA0B,EAC1B,OAAgC,EAChC,MAAe;IAEf,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE;YAC3C,QAAQ;YACR,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,OAAO;YACP,MAAM;SACT,CAAC;QACF,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;KACjE,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CACjB,UAAsB,EACtB,QAAwB,EACxB,IAAiC,EACjC,MAAe;IAEf,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,0BAA0B;YAC3B,OAAO,wBAAwB,CAC3B,QAAQ,EACR,IAA4B,EAC5B,oBAAoB,EACpB,MAAM,CACT,CAAC;QAEN,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,IAA6B,CAAC;YACxC,MAAM,KAAK,GAA2B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEjE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBACtD,OAAO,EAAE,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;aACzD,CAAC;QACN,CAAC;QAED,KAAK,yBAAyB,CAAC;QAC/B,KAAK,+BAA+B;YAChC,OAAO,wBAAwB,CAC3B,QAAQ,EACR,IAA4B,EAC5B,OAAO,EACP,MAAM,CACT,CAAC;QAEN,KAAK,qBAAqB,CAAC;QAC3B,KAAK,6BAA6B;YAC9B,OAAO,wBAAwB,CAC3B,QAAQ,EACR,IAA4B,EAC5B,gBAAgB,EAChB,MAAM,CACT,CAAC;QAEN,KAAK,aAAa,CAAC;QACnB,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAsB,CAAC;YACjC,MAAM,KAAK,GAAoB,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE1D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;gBAC/C,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;aACzD,CAAC;QACN,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,IAA4B,CAAC;YACvC,MAAM,KAAK,GAA0B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEhE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBACrD,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;aAC/D,CAAC;QACN,CAAC;QAED,KAAK,kBAAkB,CAAC;QACxB,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,IAA2B,CAAC;YAEtC,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;gBACzE,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;aACvD,CAAC;QACN,CAAC;QAED,KAAK,cAAc,CAAC;QACpB,KAAK,qBAAqB,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,IAAuB,CAAC;YAClC,MAAM,KAAK,GAAqB,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE3D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC;gBAChD,OAAO,EAAE,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC;aACnD,CAAC;QACN,CAAC;QAED,KAAK,qBAAqB,CAAC;QAC3B,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,IAA8B,CAAC;YACzC,MAAM,KAAK,GAA4B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBACvD,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;aACjE,CAAC;QACN,CAAC;QAED,KAAK,8BAA8B,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,IAAsC,CAAC;YACjD,MAAM,KAAK,GAAoC,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE1E,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC;aAClE,CAAC;QACN,CAAC;QAED,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,IAAiC,CAAC;YAC5C,MAAM,KAAK,GAA+B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAErE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,KAAK,CAAC;gBAC1D,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC7D,CAAC;QACN,CAAC;QAED,KAAK,8BAA8B,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,IAAsC,CAAC;YACjD,MAAM,KAAK,GAAoC,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE1E,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC;aAClE,CAAC;QACN,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,IAA4B,CAAC;YACvC,MAAM,KAAK,GAA0B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEhE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBACrD,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC;aACxD,CAAC;QACN,CAAC;QAED,KAAK,8BAA8B,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,IAAsC,CAAC;YACjD,MAAM,KAAK,GAAoC,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE1E,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,EAAE,MAAM,CAAC;aAClE,CAAC;QACN,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,GAAG,IAAwB,CAAC;YACnC,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE;oBACvC,QAAQ;oBACR,GAAG,CAAC;oBACJ,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;iBAC9C,CAAC;gBACF,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC;aACrC,CAAC;QACN,CAAC;QACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,IAA6B,CAAC;YACxC,MAAM,KAAK,GAA2B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEjE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBACtD,OAAO,EAAE,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;aACzD,CAAC;QACN,CAAC;QAED,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC7B,MAAM,KAAK,GAA8B,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAE9D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC;gBACzD,OAAO,EAAE,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC5D,CAAC;QACN,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,IAA6B,CAAC;YACxC,MAAM,KAAK,GAA2B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEjE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBACtD,OAAO,EAAE,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC;aACzD,CAAC;QACN,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,IAA8B,CAAC;YACzC,MAAM,KAAK,GAA4B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBACvD,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC1D,CAAC;QACN,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,IAA8B,CAAC;YACzC,MAAM,KAAK,GAA4B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBACvD,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC1D,CAAC;QACN,CAAC;QAED,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,MAAM,KAAK,GAA6B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAEnE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE,KAAK,CAAC;gBACxD,OAAO,EAAE,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC3D,CAAC;QACN,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,IAA2B,CAAC;YACtC,MAAM,KAAK,GAAyB,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAE/D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC;gBACpD,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;aACvD,CAAC;QACN,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,IAA2B,CAAC;YACtC,MAAM,KAAK,GAAyB;gBAChC,QAAQ;gBACR,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,GAAG,UAAU,CAAC,MAAM,CAAC;aACxB,CAAC;YAEF,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC;gBACpD,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;aACvD,CAAC;QACN,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,IAA0B,CAAC;YACrC,MAAM,KAAK,GAAwB;gBAC/B,QAAQ;gBACR,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,GAAG,UAAU,CAAC,MAAM,CAAC;aACxB,CAAC;YAEF,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;gBACnD,OAAO,EAAE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC;aACtD,CAAC;QACN,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAU,UAAU,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type TenantBranding } from '../branding';
|
|
3
|
+
import type { AnnouncementData } from '../render';
|
|
4
|
+
/** Plain-text authored announcement content, escaped by React. */
|
|
5
|
+
export interface AnnouncementProps extends AnnouncementData {
|
|
6
|
+
branding: TenantBranding;
|
|
7
|
+
locale?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const Announcement: React.FC<AnnouncementProps>;
|
|
10
|
+
/** Default subject; services may supply the separately authored campaign subject. */
|
|
11
|
+
export declare const getAnnouncementSubject: (data: AnnouncementData) => string;
|
|
12
|
+
export default function Preview(): React.ReactElement;
|
|
13
|
+
//# sourceMappingURL=announcement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcement.d.ts","sourceRoot":"","sources":["../../src/templates/announcement.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAIpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAqBlD,kEAAkE;AAClE,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiDpD,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,GAAI,MAAM,gBAAgB,KAAG,MAAoB,CAAC;AAErF,MAAM,CAAC,OAAO,UAAU,OAAO,IAAI,KAAK,CAAC,YAAY,CAWpD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SHARED, interpolate, resolveCatalogLocale } from '../i18n';
|
|
3
|
+
import { Img, Link, Section, Text } from '@react-email/components';
|
|
4
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
5
|
+
import { Layout } from '../components/Layout';
|
|
6
|
+
import { EmailButton } from '../components/EmailButton';
|
|
7
|
+
import { LinkFallback } from '../components/LinkFallback';
|
|
8
|
+
const announcementChrome = {
|
|
9
|
+
en: {
|
|
10
|
+
disclaimer: 'Manage product announcements in your privacy settings.',
|
|
11
|
+
unsubscribe: 'Unsubscribe from product announcements',
|
|
12
|
+
},
|
|
13
|
+
es: {
|
|
14
|
+
disclaimer: 'Gestiona los anuncios del producto en tus ajustes de privacidad.',
|
|
15
|
+
unsubscribe: 'Cancelar la suscripción a los anuncios del producto',
|
|
16
|
+
},
|
|
17
|
+
fr: {
|
|
18
|
+
disclaimer: 'Gérez les annonces du produit dans vos paramètres de confidentialité.',
|
|
19
|
+
unsubscribe: 'Se désinscrire des annonces du produit',
|
|
20
|
+
},
|
|
21
|
+
ar: {
|
|
22
|
+
disclaimer: 'يمكنك إدارة إعلانات المنتج في إعدادات الخصوصية.',
|
|
23
|
+
unsubscribe: 'إلغاء الاشتراك في إعلانات المنتج',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
export const Announcement = ({ branding, locale, title, body, heroImageUrl, ctaLabel, ctaUrl, unsubscribeUrl, }) => (_jsxs(Layout, { branding: branding, ...(locale === undefined ? {} : { locale }), preview: title, disclaimer: announcementChrome[resolveCatalogLocale(locale)].disclaimer, children: [heroImageUrl && (_jsx(Img, { src: heroImageUrl, alt: "", width: "520", style: { width: '100%', height: 'auto', marginBottom: 24 } })), _jsx(Text, { style: { fontSize: 24, fontWeight: 600, color: '#111827' }, children: title }), _jsx(Text, { style: { fontSize: 16, lineHeight: '24px', whiteSpace: 'pre-line', color: '#374151' }, children: body }), ctaUrl && (_jsx(Section, { style: { margin: '24px 0' }, children: _jsx(EmailButton, { href: ctaUrl, branding: branding, children: ctaLabel }) })), _jsx(Text, { children: interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
27
|
+
brandName: branding.brandName,
|
|
28
|
+
}) }), ctaUrl && _jsx(LinkFallback, { href: ctaUrl, ...(locale === undefined ? {} : { locale }) }), _jsx(Text, { style: { fontSize: 14, color: '#6b7280' }, children: _jsx(Link, { href: unsubscribeUrl, children: announcementChrome[resolveCatalogLocale(locale)].unsubscribe }) })] }));
|
|
29
|
+
/** Default subject; services may supply the separately authored campaign subject. */
|
|
30
|
+
export const getAnnouncementSubject = (data) => data.title;
|
|
31
|
+
export default function Preview() {
|
|
32
|
+
return (_jsx(Announcement, { branding: DEFAULT_BRANDING, title: "Explore what\u2019s new", body: "Discover new ways to share your learning.", ctaLabel: "Explore", ctaUrl: "https://learncard.app/m/new-features", unsubscribeUrl: "https://learncard.app/unsubscribe?token=preview" }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=announcement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announcement.js","sourceRoot":"","sources":["../../src/templates/announcement.tsx"],"names":[],"mappings":"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"}
|
|
@@ -19,4 +19,5 @@ export { EscrowHoldCancelled, getEscrowHoldCancelledSubject, type EscrowHoldCanc
|
|
|
19
19
|
export { EscrowPinLocked, getEscrowPinLockedSubject, type EscrowPinLockedProps, } from './escrow-pin-locked';
|
|
20
20
|
export { EscrowPinSignIn, getEscrowPinSignInSubject, type EscrowPinSignInProps, } from './escrow-pin-sign-in';
|
|
21
21
|
export { AccountSecured, getAccountSecuredSubject, type AccountSecuredProps, } from './account-secured';
|
|
22
|
+
export { Announcement, getAnnouncementSubject, type AnnouncementProps } from './announcement';
|
|
22
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC/B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,0BAA0B,GAClC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,oBAAoB,EACpB,8BAA8B,EAC9B,KAAK,yBAAyB,GACjC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,mBAAmB,EACnB,6BAA6B,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GACjC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,cAAc,EACd,wBAAwB,EACxB,KAAK,mBAAmB,GAC3B,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC/B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,0BAA0B,GAClC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,gBAAgB,EAChB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,+BAA+B,GACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,oBAAoB,EACpB,8BAA8B,EAC9B,KAAK,yBAAyB,GACjC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,kBAAkB,EAClB,4BAA4B,EAC5B,KAAK,uBAAuB,GAC/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,mBAAmB,EACnB,6BAA6B,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,GACjC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,EACzB,KAAK,oBAAoB,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,cAAc,EACd,wBAAwB,EACxB,KAAK,mBAAmB,GAC3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/templates/index.js
CHANGED
|
@@ -23,4 +23,5 @@ export { EscrowHoldCancelled, getEscrowHoldCancelledSubject, } from './escrow-ho
|
|
|
23
23
|
export { EscrowPinLocked, getEscrowPinLockedSubject, } from './escrow-pin-locked';
|
|
24
24
|
export { EscrowPinSignIn, getEscrowPinSignInSubject, } from './escrow-pin-sign-in';
|
|
25
25
|
export { AccountSecured, getAccountSecuredSubject, } from './account-secured';
|
|
26
|
+
export { Announcement, getAnnouncementSubject } from './announcement';
|
|
26
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uFAAuF;AACvF,qFAAqF;AACrF,+EAA+E;AAE/E,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAG7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAwB,MAAM,eAAe,CAAC;AAEvF,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAE7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAyB,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,qBAAqB,EACrB,+BAA+B,GAElC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAE7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,oBAAoB,EACpB,8BAA8B,GAEjC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,mBAAmB,EACnB,6BAA6B,GAGhC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,cAAc,EACd,wBAAwB,GAE3B,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,uFAAuF;AACvF,qFAAqF;AACrF,+EAA+E;AAE/E,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAG7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAwB,MAAM,eAAe,CAAC;AAEvF,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAE7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAyB,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,qBAAqB,EACrB,+BAA+B,GAElC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,gBAAgB,EAChB,0BAA0B,GAE7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GAEvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,oBAAoB,EACpB,8BAA8B,GAEjC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACH,iBAAiB,EACjB,2BAA2B,GAE9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,kBAAkB,EAClB,4BAA4B,GAE/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACH,mBAAmB,EACnB,6BAA6B,GAGhC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,eAAe,EACf,yBAAyB,GAE5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,cAAc,EACd,wBAAwB,GAE3B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAA0B,MAAM,gBAAgB,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Resolution order (first match wins):
|
|
5
5
|
* 1. Explicit `X-Tenant-Id` header — native apps, any client that knows its tenant
|
|
6
|
-
* 2. `Origin` / `Referer` header hostname — web apps (e.g.
|
|
6
|
+
* 2. `Origin` / `Referer` header hostname — web apps (e.g. staging.vetpass.app → vetpass)
|
|
7
7
|
* 3. `DEFAULT_TENANT_ID` env var — per-tenant deploys, cron jobs, server-to-server
|
|
8
8
|
* 4. Fallback to 'learncard'
|
|
9
9
|
*
|
|
@@ -22,7 +22,7 @@ export interface ResolvedTenant {
|
|
|
22
22
|
export interface RequestHeaders {
|
|
23
23
|
/** Value of the X-Tenant-Id header. */
|
|
24
24
|
'x-tenant-id'?: string | undefined;
|
|
25
|
-
/** Origin header (e.g. "https://
|
|
25
|
+
/** Origin header (e.g. "https://staging.vetpass.app"). */
|
|
26
26
|
origin?: string | undefined;
|
|
27
27
|
/** Referer header (fallback for Origin). */
|
|
28
28
|
referer?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-registry.d.ts","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC3B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IAEX,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvC,oEAAoE;IACpE,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC3B,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC,
|
|
1
|
+
{"version":3,"file":"tenant-registry.d.ts","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC3B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IAEX,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvC,oEAAoE;IACpE,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC3B,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAoGD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACjC,SAAS,cAAc,EACvB,cAAc,MAAM,KACrB,cAgCF,CAAC;AAsBF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,EAAE,UAAU,MAAM,KAAG,IAE1E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAC/B,UAAU,MAAM,EAChB,UAAU,OAAO,CAAC,cAAc,CAAC,KAClC,IAKF,CAAC"}
|
package/dist/tenant-registry.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Resolution order (first match wins):
|
|
5
5
|
* 1. Explicit `X-Tenant-Id` header — native apps, any client that knows its tenant
|
|
6
|
-
* 2. `Origin` / `Referer` header hostname — web apps (e.g.
|
|
6
|
+
* 2. `Origin` / `Referer` header hostname — web apps (e.g. staging.vetpass.app → vetpass)
|
|
7
7
|
* 3. `DEFAULT_TENANT_ID` env var — per-tenant deploys, cron jobs, server-to-server
|
|
8
8
|
* 4. Fallback to 'learncard'
|
|
9
9
|
*
|
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
const ORIGIN_MAP = {
|
|
20
20
|
// VetPass
|
|
21
21
|
'vetpass.app': 'vetpass',
|
|
22
|
-
'alpha.vetpass.app': 'vetpass',
|
|
23
22
|
'staging.vetpass.app': 'vetpass',
|
|
24
23
|
// ScoutPass
|
|
25
24
|
'scout.org': 'scoutpass',
|
|
@@ -87,7 +86,7 @@ const extractHostname = (urlString) => {
|
|
|
87
86
|
const tenantIdFromHostname = (hostname) => {
|
|
88
87
|
if (ORIGIN_MAP[hostname])
|
|
89
88
|
return ORIGIN_MAP[hostname];
|
|
90
|
-
// Strip subdomains: "
|
|
89
|
+
// Strip subdomains: "preview.vetpass.app" → "vetpass.app"
|
|
91
90
|
const parts = hostname.split('.');
|
|
92
91
|
for (let i = 1; i < parts.length - 1; i++) {
|
|
93
92
|
const parent = parts.slice(i).join('.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-registry.js","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgCH,8EAA8E;AAC9E,6BAA6B;AAC7B,EAAE;AACF,uDAAuD;AACvD,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,UAAU,GAA2B;IACvC,UAAU;IACV,aAAa,EAAE,SAAS;IACxB,
|
|
1
|
+
{"version":3,"file":"tenant-registry.js","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgCH,8EAA8E;AAC9E,6BAA6B;AAC7B,EAAE;AACF,uDAAuD;AACvD,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,UAAU,GAA2B;IACvC,UAAU;IACV,aAAa,EAAE,SAAS;IACxB,qBAAqB,EAAE,SAAS;IAEhC,YAAY;IACZ,WAAW,EAAE,WAAW;IACxB,eAAe,EAAE,WAAW;IAC5B,gBAAgB,EAAE,WAAW;IAC7B,wBAAwB,EAAE,WAAW;IAErC,YAAY;IACZ,eAAe,EAAE,WAAW;IAC5B,uBAAuB,EAAE,WAAW;IACpC,mBAAmB,EAAE,WAAW;IAEhC,YAAY;IACZ,WAAW,EAAE,WAAW;CAC3B,CAAC;AAEF,8EAA8E;AAC9E,iCAAiC;AACjC,EAAE;AACF,4DAA4D;AAC5D,gEAAgE;AAChE,8EAA8E;AAE9E,MAAM,qBAAqB,GAA4C;IACnE,SAAS,EAAE,EAAE;IAEb,OAAO,EAAE;QACL,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,0CAA0C;QACnD,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,SAAS;QACvB,gBAAgB,EAAE,SAAS;QAC3B,YAAY,EAAE,qBAAqB;QACnC,UAAU,EAAE,yBAAyB;QACrC,MAAM,EAAE,qBAAqB;QAC7B,UAAU,EAAE,aAAa;QACzB,eAAe,EAAE,SAAS;KAC7B;IAED,SAAS,EAAE;QACP,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,6CAA6C;QACtD,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,SAAS;QACvB,gBAAgB,EAAE,SAAS;QAC3B,YAAY,EAAE,mBAAmB;QACjC,UAAU,EAAE,6BAA6B;QACzC,MAAM,EAAE,wBAAwB;QAChC,UAAU,EAAE,kBAAkB;QAC9B,eAAe,EAAE,WAAW;KAC/B;CACJ,CAAC;AAEF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAsB,EAAE;IAC9D,IAAI,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAsB,EAAE;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEtD,0DAA0D;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACpC,OAAuB,EACvB,WAAoB,EACN,EAAE;IAChB,oEAAoE;IACpE,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAEzD,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,wCAAwC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnF,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAE/C,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAEhE,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,kBAAkB;IAClB,OAAO,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,eAAe,GAAG,CAAC,KAAoC,EAAsB,EAAE;IACjF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1C,OAAO,KAAK,IAAI,SAAS,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,WAA0C,EAAkB,EAAE,CAAC,CAAC;IAC7F,EAAE;IACF,aAAa,EAAE,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE;IAC9C,WAAW;CACd,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAQ,EAAE;IAC9E,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AACpC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAClC,QAAgB,EAChB,QAAiC,EAC7B,EAAE;IACN,qBAAqB,CAAC,QAAQ,CAAC,GAAG;QAC9B,GAAG,qBAAqB,CAAC,QAAQ,CAAC;QAClC,GAAG,QAAQ;KACd,CAAC;AACN,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -21,6 +21,13 @@ const LOCALES: NotificationLocale[] = ['en', 'es', 'fr', 'ar'];
|
|
|
21
21
|
|
|
22
22
|
// Minimal valid data for every template ID.
|
|
23
23
|
const FIXTURES: { [K in TemplateId]: TemplateDataMap[K] } = {
|
|
24
|
+
announcement: {
|
|
25
|
+
title: 'News',
|
|
26
|
+
body: 'New programs',
|
|
27
|
+
ctaLabel: 'View',
|
|
28
|
+
ctaUrl: 'https://learncard.app/m/news',
|
|
29
|
+
unsubscribeUrl: 'https://learncard.app/unsubscribe?token=test',
|
|
30
|
+
},
|
|
24
31
|
'embed-email-verification': {
|
|
25
32
|
verificationCode: '123456',
|
|
26
33
|
verificationEmail: 'test@example.com',
|
|
@@ -28,6 +28,13 @@ const VETPASS_BRANDING: Partial<TenantBranding> = {
|
|
|
28
28
|
* produce output without throwing.
|
|
29
29
|
*/
|
|
30
30
|
const TEMPLATE_FIXTURES: { [K in TemplateId]: TemplateDataMap[K] } = {
|
|
31
|
+
announcement: {
|
|
32
|
+
title: 'New learning opportunities',
|
|
33
|
+
body: 'Explore the latest programs.',
|
|
34
|
+
ctaLabel: 'Explore',
|
|
35
|
+
ctaUrl: 'https://learncard.app/m/programs?utm_source=email',
|
|
36
|
+
unsubscribeUrl: 'https://learncard.app/unsubscribe?token=example',
|
|
37
|
+
},
|
|
31
38
|
'embed-email-verification': {
|
|
32
39
|
verificationCode: '123456',
|
|
33
40
|
verificationEmail: 'test@example.com',
|
|
@@ -861,3 +868,35 @@ describe('renderEmail — edge cases', () => {
|
|
|
861
868
|
expect(html).toContain('no-recipient-token');
|
|
862
869
|
});
|
|
863
870
|
});
|
|
871
|
+
|
|
872
|
+
describe('announcement', () => {
|
|
873
|
+
it('omits the button and fallback in HTML and text when no campaign destination exists', async () => {
|
|
874
|
+
const { ctaUrl, ...content } = TEMPLATE_FIXTURES.announcement;
|
|
875
|
+
const data = { ...content, ctaLabel: 'Unique campaign action' };
|
|
876
|
+
const { html, text } = await renderEmail('announcement', VETPASS_BRANDING, data);
|
|
877
|
+
for (const output of [html, text]) {
|
|
878
|
+
expect(output).not.toContain(ctaUrl);
|
|
879
|
+
expect(output).not.toContain(data.ctaLabel);
|
|
880
|
+
expect(output).not.toContain('/m/');
|
|
881
|
+
expect(output).toContain(data.body);
|
|
882
|
+
expect(output).toContain(data.unsubscribeUrl);
|
|
883
|
+
}
|
|
884
|
+
});
|
|
885
|
+
|
|
886
|
+
it('renders escaped authored copy, CTA and unsubscribe in HTML and text', async () => {
|
|
887
|
+
const data = {
|
|
888
|
+
...TEMPLATE_FIXTURES.announcement,
|
|
889
|
+
body: '<script>alert(1)</script>\nSecond line',
|
|
890
|
+
};
|
|
891
|
+
const { html, text, subject } = await renderEmail('announcement', VETPASS_BRANDING, data);
|
|
892
|
+
expect(subject).toBe(data.title);
|
|
893
|
+
expect(html).toContain('VetPass');
|
|
894
|
+
expect(html).not.toContain('<script>alert');
|
|
895
|
+
expect(html).toContain('<script>');
|
|
896
|
+
for (const output of [html, text]) {
|
|
897
|
+
expect(output).toContain(data.ctaUrl);
|
|
898
|
+
expect(output).toContain(data.unsubscribeUrl);
|
|
899
|
+
expect(output).toContain('Second line');
|
|
900
|
+
}
|
|
901
|
+
});
|
|
902
|
+
});
|
|
@@ -70,8 +70,8 @@ describe('resolveTenantFromRequest', () => {
|
|
|
70
70
|
expect(result.resolvedVia).toBe('origin');
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
it('resolves vetpass
|
|
74
|
-
const headers: RequestHeaders = { origin: 'https://
|
|
73
|
+
it('resolves an unlisted vetpass subdomain via its parent domain', () => {
|
|
74
|
+
const headers: RequestHeaders = { origin: 'https://preview.vetpass.app' };
|
|
75
75
|
const result = resolveTenantFromRequest(headers);
|
|
76
76
|
|
|
77
77
|
expect(result.id).toBe('vetpass');
|
|
@@ -24,6 +24,7 @@ import { SHARED, htmlLang, htmlDir, interpolate, resolveCatalogLocale } from '..
|
|
|
24
24
|
interface LayoutProps {
|
|
25
25
|
branding: TenantBranding;
|
|
26
26
|
preview: string;
|
|
27
|
+
disclaimer?: string;
|
|
27
28
|
children: React.ReactNode;
|
|
28
29
|
/** Show the brand icon at the top of the card. Defaults to true.
|
|
29
30
|
* Set to false when the template already has an IssuerLogo. */
|
|
@@ -35,12 +36,14 @@ interface LayoutProps {
|
|
|
35
36
|
export const Layout: React.FC<LayoutProps> = ({
|
|
36
37
|
branding,
|
|
37
38
|
preview,
|
|
39
|
+
disclaimer,
|
|
38
40
|
children,
|
|
39
41
|
showHeaderLogo = true,
|
|
40
42
|
locale,
|
|
41
43
|
}) => {
|
|
42
44
|
const chrome = SHARED[resolveCatalogLocale(locale)];
|
|
43
|
-
const disclaimerText =
|
|
45
|
+
const disclaimerText =
|
|
46
|
+
disclaimer ?? interpolate(chrome.footerDisclaimer, { brandName: branding.brandName });
|
|
44
47
|
|
|
45
48
|
return (
|
|
46
49
|
<Html lang={htmlLang(locale)} dir={htmlDir(locale)}>
|
package/src/index.ts
CHANGED
|
@@ -71,3 +71,5 @@ export type { ResolvedTenant, RequestHeaders } from './tenant-registry';
|
|
|
71
71
|
// configure `jsx` in their tsconfig. Use renderEmail() / renderSms() instead.
|
|
72
72
|
// For direct component access (testing / preview), import from
|
|
73
73
|
// '@learncard/email-templates/src/templates' explicitly.
|
|
74
|
+
|
|
75
|
+
export type { AnnouncementData } from './render';
|
package/src/render.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Announcement, getAnnouncementSubject } from './templates/announcement';
|
|
1
2
|
/**
|
|
2
3
|
* render.ts — the main rendering entry point.
|
|
3
4
|
*
|
|
@@ -101,7 +102,17 @@ export interface RenderedEmail {
|
|
|
101
102
|
* This provides full type safety: `renderEmail('inbox-claim', branding, data)` will
|
|
102
103
|
* require `data` to match `InboxClaimData`.
|
|
103
104
|
*/
|
|
105
|
+
export interface AnnouncementData {
|
|
106
|
+
title: string;
|
|
107
|
+
body: string;
|
|
108
|
+
heroImageUrl?: string;
|
|
109
|
+
ctaLabel: string;
|
|
110
|
+
ctaUrl?: string;
|
|
111
|
+
unsubscribeUrl: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
104
114
|
export interface TemplateDataMap {
|
|
115
|
+
announcement: AnnouncementData;
|
|
105
116
|
// -- Verification code variants ------------------------------------------
|
|
106
117
|
|
|
107
118
|
/** brain-service: contact-methods.ts, embed flow */
|
|
@@ -523,6 +534,17 @@ function buildElement(
|
|
|
523
534
|
};
|
|
524
535
|
}
|
|
525
536
|
|
|
537
|
+
case 'announcement': {
|
|
538
|
+
const d = data as AnnouncementData;
|
|
539
|
+
return {
|
|
540
|
+
element: React.createElement(Announcement, {
|
|
541
|
+
branding,
|
|
542
|
+
...d,
|
|
543
|
+
...(locale === undefined ? {} : { locale }),
|
|
544
|
+
}),
|
|
545
|
+
subject: getAnnouncementSubject(d),
|
|
546
|
+
};
|
|
547
|
+
}
|
|
526
548
|
case 'credential-updated': {
|
|
527
549
|
const d = data as CredentialUpdatedData;
|
|
528
550
|
const props: CredentialUpdatedProps = { branding, ...d, locale };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { SHARED, interpolate, resolveCatalogLocale } from '../i18n';
|
|
2
|
+
import { Img, Link, Section, Text } from '@react-email/components';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { DEFAULT_BRANDING, type TenantBranding } from '../branding';
|
|
5
|
+
import { Layout } from '../components/Layout';
|
|
6
|
+
import { EmailButton } from '../components/EmailButton';
|
|
7
|
+
import { LinkFallback } from '../components/LinkFallback';
|
|
8
|
+
import type { AnnouncementData } from '../render';
|
|
9
|
+
|
|
10
|
+
const announcementChrome = {
|
|
11
|
+
en: {
|
|
12
|
+
disclaimer: 'Manage product announcements in your privacy settings.',
|
|
13
|
+
unsubscribe: 'Unsubscribe from product announcements',
|
|
14
|
+
},
|
|
15
|
+
es: {
|
|
16
|
+
disclaimer: 'Gestiona los anuncios del producto en tus ajustes de privacidad.',
|
|
17
|
+
unsubscribe: 'Cancelar la suscripción a los anuncios del producto',
|
|
18
|
+
},
|
|
19
|
+
fr: {
|
|
20
|
+
disclaimer: 'Gérez les annonces du produit dans vos paramètres de confidentialité.',
|
|
21
|
+
unsubscribe: 'Se désinscrire des annonces du produit',
|
|
22
|
+
},
|
|
23
|
+
ar: {
|
|
24
|
+
disclaimer: 'يمكنك إدارة إعلانات المنتج في إعدادات الخصوصية.',
|
|
25
|
+
unsubscribe: 'إلغاء الاشتراك في إعلانات المنتج',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Plain-text authored announcement content, escaped by React. */
|
|
30
|
+
export interface AnnouncementProps extends AnnouncementData {
|
|
31
|
+
branding: TenantBranding;
|
|
32
|
+
locale?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const Announcement: React.FC<AnnouncementProps> = ({
|
|
36
|
+
branding,
|
|
37
|
+
locale,
|
|
38
|
+
title,
|
|
39
|
+
body,
|
|
40
|
+
heroImageUrl,
|
|
41
|
+
ctaLabel,
|
|
42
|
+
ctaUrl,
|
|
43
|
+
unsubscribeUrl,
|
|
44
|
+
}) => (
|
|
45
|
+
<Layout
|
|
46
|
+
branding={branding}
|
|
47
|
+
{...(locale === undefined ? {} : { locale })}
|
|
48
|
+
preview={title}
|
|
49
|
+
disclaimer={announcementChrome[resolveCatalogLocale(locale)].disclaimer}
|
|
50
|
+
>
|
|
51
|
+
{heroImageUrl && (
|
|
52
|
+
<Img
|
|
53
|
+
src={heroImageUrl}
|
|
54
|
+
alt=""
|
|
55
|
+
width="520"
|
|
56
|
+
style={{ width: '100%', height: 'auto', marginBottom: 24 }}
|
|
57
|
+
/>
|
|
58
|
+
)}
|
|
59
|
+
<Text style={{ fontSize: 24, fontWeight: 600, color: '#111827' }}>{title}</Text>
|
|
60
|
+
<Text
|
|
61
|
+
style={{ fontSize: 16, lineHeight: '24px', whiteSpace: 'pre-line', color: '#374151' }}
|
|
62
|
+
>
|
|
63
|
+
{body}
|
|
64
|
+
</Text>
|
|
65
|
+
{ctaUrl && (
|
|
66
|
+
<Section style={{ margin: '24px 0' }}>
|
|
67
|
+
<EmailButton href={ctaUrl} branding={branding}>
|
|
68
|
+
{ctaLabel}
|
|
69
|
+
</EmailButton>
|
|
70
|
+
</Section>
|
|
71
|
+
)}
|
|
72
|
+
<Text>
|
|
73
|
+
{interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
74
|
+
brandName: branding.brandName,
|
|
75
|
+
})}
|
|
76
|
+
</Text>
|
|
77
|
+
{ctaUrl && <LinkFallback href={ctaUrl} {...(locale === undefined ? {} : { locale })} />}
|
|
78
|
+
<Text style={{ fontSize: 14, color: '#6b7280' }}>
|
|
79
|
+
<Link href={unsubscribeUrl}>
|
|
80
|
+
{announcementChrome[resolveCatalogLocale(locale)].unsubscribe}
|
|
81
|
+
</Link>
|
|
82
|
+
</Text>
|
|
83
|
+
</Layout>
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
/** Default subject; services may supply the separately authored campaign subject. */
|
|
87
|
+
export const getAnnouncementSubject = (data: AnnouncementData): string => data.title;
|
|
88
|
+
|
|
89
|
+
export default function Preview(): React.ReactElement {
|
|
90
|
+
return (
|
|
91
|
+
<Announcement
|
|
92
|
+
branding={DEFAULT_BRANDING}
|
|
93
|
+
title="Explore what’s new"
|
|
94
|
+
body="Discover new ways to share your learning."
|
|
95
|
+
ctaLabel="Explore"
|
|
96
|
+
ctaUrl="https://learncard.app/m/new-features"
|
|
97
|
+
unsubscribeUrl="https://learncard.app/unsubscribe?token=preview"
|
|
98
|
+
/>
|
|
99
|
+
);
|
|
100
|
+
}
|
package/src/templates/index.ts
CHANGED
package/src/tenant-registry.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Resolution order (first match wins):
|
|
5
5
|
* 1. Explicit `X-Tenant-Id` header — native apps, any client that knows its tenant
|
|
6
|
-
* 2. `Origin` / `Referer` header hostname — web apps (e.g.
|
|
6
|
+
* 2. `Origin` / `Referer` header hostname — web apps (e.g. staging.vetpass.app → vetpass)
|
|
7
7
|
* 3. `DEFAULT_TENANT_ID` env var — per-tenant deploys, cron jobs, server-to-server
|
|
8
8
|
* 4. Fallback to 'learncard'
|
|
9
9
|
*
|
|
@@ -32,7 +32,7 @@ export interface RequestHeaders {
|
|
|
32
32
|
/** Value of the X-Tenant-Id header. */
|
|
33
33
|
'x-tenant-id'?: string | undefined;
|
|
34
34
|
|
|
35
|
-
/** Origin header (e.g. "https://
|
|
35
|
+
/** Origin header (e.g. "https://staging.vetpass.app"). */
|
|
36
36
|
origin?: string | undefined;
|
|
37
37
|
|
|
38
38
|
/** Referer header (fallback for Origin). */
|
|
@@ -51,7 +51,6 @@ export interface RequestHeaders {
|
|
|
51
51
|
const ORIGIN_MAP: Record<string, string> = {
|
|
52
52
|
// VetPass
|
|
53
53
|
'vetpass.app': 'vetpass',
|
|
54
|
-
'alpha.vetpass.app': 'vetpass',
|
|
55
54
|
'staging.vetpass.app': 'vetpass',
|
|
56
55
|
|
|
57
56
|
// ScoutPass
|
|
@@ -128,7 +127,7 @@ const extractHostname = (urlString: string): string | undefined => {
|
|
|
128
127
|
const tenantIdFromHostname = (hostname: string): string | undefined => {
|
|
129
128
|
if (ORIGIN_MAP[hostname]) return ORIGIN_MAP[hostname];
|
|
130
129
|
|
|
131
|
-
// Strip subdomains: "
|
|
130
|
+
// Strip subdomains: "preview.vetpass.app" → "vetpass.app"
|
|
132
131
|
const parts = hostname.split('.');
|
|
133
132
|
|
|
134
133
|
for (let i = 1; i < parts.length - 1; i++) {
|