@learncard/email-templates 1.0.3 → 1.0.5
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 +2 -0
- package/dist/components/Layout.d.ts.map +1 -1
- package/dist/components/Layout.js +6 -1
- package/dist/components/Layout.js.map +1 -1
- package/dist/components/LinkFallback.d.ts +2 -0
- package/dist/components/LinkFallback.d.ts.map +1 -1
- package/dist/components/LinkFallback.js +5 -1
- package/dist/components/LinkFallback.js.map +1 -1
- package/dist/i18n.d.ts +52 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +77 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +3 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +33 -30
- package/dist/render.js.map +1 -1
- package/dist/sms.d.ts +6 -3
- package/dist/sms.d.ts.map +1 -1
- package/dist/sms.js +43 -7
- package/dist/sms.js.map +1 -1
- package/dist/templates/account-approved.d.ts +3 -1
- package/dist/templates/account-approved.d.ts.map +1 -1
- package/dist/templates/account-approved.js +55 -5
- package/dist/templates/account-approved.js.map +1 -1
- package/dist/templates/credential-awaiting-guardian.d.ts +3 -1
- package/dist/templates/credential-awaiting-guardian.d.ts.map +1 -1
- package/dist/templates/credential-awaiting-guardian.js +54 -4
- package/dist/templates/credential-awaiting-guardian.js.map +1 -1
- package/dist/templates/email-verification.d.ts +3 -1
- package/dist/templates/email-verification.d.ts.map +1 -1
- package/dist/templates/email-verification.js +57 -4
- package/dist/templates/email-verification.js.map +1 -1
- package/dist/templates/endorsement-request.d.ts +3 -1
- package/dist/templates/endorsement-request.d.ts.map +1 -1
- package/dist/templates/endorsement-request.js +53 -5
- package/dist/templates/endorsement-request.js.map +1 -1
- package/dist/templates/guardian-approval.d.ts +3 -1
- package/dist/templates/guardian-approval.d.ts.map +1 -1
- package/dist/templates/guardian-approval.js +55 -5
- package/dist/templates/guardian-approval.js.map +1 -1
- package/dist/templates/guardian-approved-claim.d.ts +3 -1
- package/dist/templates/guardian-approved-claim.d.ts.map +1 -1
- package/dist/templates/guardian-approved-claim.js +50 -4
- package/dist/templates/guardian-approved-claim.js.map +1 -1
- package/dist/templates/guardian-credential-approval.d.ts +3 -1
- package/dist/templates/guardian-credential-approval.d.ts.map +1 -1
- package/dist/templates/guardian-credential-approval.js +50 -4
- package/dist/templates/guardian-credential-approval.js.map +1 -1
- package/dist/templates/guardian-email-otp.d.ts +3 -1
- package/dist/templates/guardian-email-otp.d.ts.map +1 -1
- package/dist/templates/guardian-email-otp.js +55 -5
- package/dist/templates/guardian-email-otp.js.map +1 -1
- package/dist/templates/guardian-rejected-credential.d.ts +3 -1
- package/dist/templates/guardian-rejected-credential.d.ts.map +1 -1
- package/dist/templates/guardian-rejected-credential.js +45 -3
- package/dist/templates/guardian-rejected-credential.js.map +1 -1
- package/dist/templates/inbox-claim.d.ts +3 -1
- package/dist/templates/inbox-claim.d.ts.map +1 -1
- package/dist/templates/inbox-claim.js +63 -11
- package/dist/templates/inbox-claim.js.map +1 -1
- package/dist/templates/recovery-key.d.ts +3 -1
- package/dist/templates/recovery-key.d.ts.map +1 -1
- package/dist/templates/recovery-key.js +59 -3
- package/dist/templates/recovery-key.js.map +1 -1
- package/dist/templates/verification-code.d.ts +3 -1
- package/dist/templates/verification-code.d.ts.map +1 -1
- package/dist/templates/verification-code.js +153 -17
- package/dist/templates/verification-code.js.map +1 -1
- package/dist/tenant-registry.d.ts.map +1 -1
- package/dist/tenant-registry.js +17 -0
- package/dist/tenant-registry.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/i18n.test.ts +329 -0
- package/src/__tests__/tenant-registry.test.ts +24 -0
- package/src/components/Layout.tsx +69 -60
- package/src/components/LinkFallback.tsx +19 -11
- package/src/i18n.ts +110 -0
- package/src/index.ts +15 -2
- package/src/render.ts +47 -28
- package/src/sms.ts +61 -6
- package/src/templates/account-approved.tsx +82 -29
- package/src/templates/credential-awaiting-guardian.tsx +113 -19
- package/src/templates/email-verification.tsx +87 -16
- package/src/templates/endorsement-request.tsx +142 -17
- package/src/templates/guardian-approval.tsx +106 -16
- package/src/templates/guardian-approved-claim.tsx +137 -17
- package/src/templates/guardian-credential-approval.tsx +112 -17
- package/src/templates/guardian-email-otp.tsx +103 -25
- package/src/templates/guardian-rejected-credential.tsx +137 -15
- package/src/templates/inbox-claim.tsx +180 -29
- package/src/templates/recovery-key.tsx +126 -30
- package/src/templates/verification-code.tsx +204 -38
- package/src/tenant-registry.ts +24 -2
|
@@ -13,6 +13,8 @@ interface LayoutProps {
|
|
|
13
13
|
/** Show the brand icon at the top of the card. Defaults to true.
|
|
14
14
|
* Set to false when the template already has an IssuerLogo. */
|
|
15
15
|
showHeaderLogo?: boolean;
|
|
16
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
17
|
+
locale?: string;
|
|
16
18
|
}
|
|
17
19
|
export declare const Layout: React.FC<LayoutProps>;
|
|
18
20
|
export {};
|
|
@@ -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;
|
|
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,CAkExC,CAAC"}
|
|
@@ -6,7 +6,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* is consistent across all tenant emails.
|
|
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, }) => {
|
|
11
|
+
const chrome = SHARED[resolveCatalogLocale(locale)];
|
|
12
|
+
const disclaimerText = interpolate(chrome.footerDisclaimer, { brandName: branding.brandName });
|
|
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
|
+
};
|
|
10
15
|
// ---------------------------------------------------------------------------
|
|
11
16
|
// Styles (inline for email compatibility)
|
|
12
17
|
// ---------------------------------------------------------------------------
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkFallback.d.ts","sourceRoot":"","sources":["../../src/components/LinkFallback.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LinkFallback.d.ts","sourceRoot":"","sources":["../../src/components/LinkFallback.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,iBAAiB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC"}
|
|
@@ -5,7 +5,11 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
5
5
|
* Mirrors the fallback link pattern used in the original Postmark templates.
|
|
6
6
|
*/
|
|
7
7
|
import { Text, Link, Hr } from '@react-email/components';
|
|
8
|
-
|
|
8
|
+
import { SHARED, resolveCatalogLocale } from '../i18n';
|
|
9
|
+
export const LinkFallback = ({ href, locale }) => {
|
|
10
|
+
const chrome = SHARED[resolveCatalogLocale(locale)];
|
|
11
|
+
return (_jsxs(_Fragment, { children: [_jsx(Hr, { style: divider }), _jsx(Text, { style: hint, children: chrome.linkFallbackHint }), _jsx(Text, { style: linkText, children: _jsx(Link, { href: href, style: link, children: href }) })] }));
|
|
12
|
+
};
|
|
9
13
|
const divider = {
|
|
10
14
|
borderColor: '#e5e7eb',
|
|
11
15
|
margin: '24px 0 16px',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkFallback.js","sourceRoot":"","sources":["../../src/components/LinkFallback.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"LinkFallback.js","sourceRoot":"","sources":["../../src/components/LinkFallback.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQvD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpD,OAAO,CACH,8BACI,KAAC,EAAE,IAAC,KAAK,EAAE,OAAO,GAAI,EAEtB,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,YAAG,MAAM,CAAC,gBAAgB,GAAQ,EAEnD,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,YACjB,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,YACxB,IAAI,GACF,GACJ,IACR,CACN,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,OAAO,GAAwB;IACjC,WAAW,EAAE,SAAS;IACtB,MAAM,EAAE,aAAa;CACxB,CAAC;AAEF,MAAM,IAAI,GAAwB;IAC9B,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,SAAS;CACpB,CAAC;AAEF,MAAM,QAAQ,GAAwB;IAClC,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,WAAoB;CAClC,CAAC;AAEF,MAAM,IAAI,GAAwB;IAC9B,KAAK,EAAE,SAAS;IAChB,cAAc,EAAE,MAAM;CACzB,CAAC"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n foundation for @learncard/email-templates (LC-1902, workstream C1).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the dependency-free per-locale dictionary pattern used by the C2
|
|
5
|
+
* notification catalog (`brain-service/src/helpers/notificationMessages.ts`).
|
|
6
|
+
*
|
|
7
|
+
* This module owns:
|
|
8
|
+
* - `NotificationLocale` — the union of supported locales (en/es/fr/ar).
|
|
9
|
+
* - `resolveCatalogLocale()` — narrow a runtime BCP-47 string to a supported
|
|
10
|
+
* locale, falling back to `'en'`. Never throws.
|
|
11
|
+
* - `SHARED` — strings shared across templates via the `Layout` /
|
|
12
|
+
* `LinkFallback` chrome (footer disclaimer, "Contact Support", the
|
|
13
|
+
* link-fallback hint). Keeps the shared chrome DRY.
|
|
14
|
+
*
|
|
15
|
+
* Brand values (`brandName`, `appUrl`, `copyrightHolder`, …) are intentionally
|
|
16
|
+
* NOT in this catalog — they stay interpolated from `TenantBranding`.
|
|
17
|
+
*/
|
|
18
|
+
/** Locales supported by the email/SMS catalogs. */
|
|
19
|
+
export type NotificationLocale = 'en' | 'es' | 'fr' | 'ar';
|
|
20
|
+
/**
|
|
21
|
+
* Narrow an arbitrary runtime locale string (BCP-47, e.g. `es`, `es-MX`) down
|
|
22
|
+
* to one of the supported catalog locales. Falls back to `'en'`.
|
|
23
|
+
*
|
|
24
|
+
* Accepts `string | undefined` so callers can pass through optional values
|
|
25
|
+
* (e.g. a missing recipient locale) without a guard.
|
|
26
|
+
*/
|
|
27
|
+
export declare const resolveCatalogLocale: (locale?: string | null) => NotificationLocale;
|
|
28
|
+
/**
|
|
29
|
+
* Map a supported locale to the value for the top-level `<Html lang>`
|
|
30
|
+
* attribute. BCP-47 base tag is sufficient for email clients / RTL handling.
|
|
31
|
+
*/
|
|
32
|
+
export declare const htmlLang: (locale?: string | null) => string;
|
|
33
|
+
/**
|
|
34
|
+
* Text direction for the top-level `<Html dir>` attribute. Arabic renders
|
|
35
|
+
* right-to-left; everything else left-to-right. Email clients need an explicit
|
|
36
|
+
* `dir="rtl"` to flip alignment, punctuation, and layout for RTL languages.
|
|
37
|
+
*/
|
|
38
|
+
export declare const htmlDir: (locale?: string | null) => "ltr" | "rtl";
|
|
39
|
+
export interface SharedChromeStrings {
|
|
40
|
+
/** Footer disclaimer shown on every email (uses {brandName}). */
|
|
41
|
+
footerDisclaimer: string;
|
|
42
|
+
/** "Contact Support" link text in the footer. */
|
|
43
|
+
contactSupport: string;
|
|
44
|
+
/** Hint above the copy/paste link fallback. */
|
|
45
|
+
linkFallbackHint: string;
|
|
46
|
+
/** Sign-off line at the end of every email body (uses {brandName}). */
|
|
47
|
+
teamSignature: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const SHARED: Record<NotificationLocale, SharedChromeStrings>;
|
|
50
|
+
/** Replace `{var}` placeholders in `template` with values from `params`. */
|
|
51
|
+
export declare const interpolate: (template: string, params: Record<string, string | undefined>) => string;
|
|
52
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAM3D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,YAAa,MAAM,GAAG,IAAI,KAAG,kBAI7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,YAAa,MAAM,GAAG,IAAI,KAAG,MAAsC,CAAC;AAKzF;;;;GAIG;AACH,eAAO,MAAM,OAAO,YAAa,MAAM,GAAG,IAAI,KAAG,KAAK,GAAG,KACQ,CAAC;AAMlE,MAAM,WAAW,mBAAmB;IAChC,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAgClE,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,aAAc,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAG,MAIrF,CAAC"}
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* i18n foundation for @learncard/email-templates (LC-1902, workstream C1).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the dependency-free per-locale dictionary pattern used by the C2
|
|
5
|
+
* notification catalog (`brain-service/src/helpers/notificationMessages.ts`).
|
|
6
|
+
*
|
|
7
|
+
* This module owns:
|
|
8
|
+
* - `NotificationLocale` — the union of supported locales (en/es/fr/ar).
|
|
9
|
+
* - `resolveCatalogLocale()` — narrow a runtime BCP-47 string to a supported
|
|
10
|
+
* locale, falling back to `'en'`. Never throws.
|
|
11
|
+
* - `SHARED` — strings shared across templates via the `Layout` /
|
|
12
|
+
* `LinkFallback` chrome (footer disclaimer, "Contact Support", the
|
|
13
|
+
* link-fallback hint). Keeps the shared chrome DRY.
|
|
14
|
+
*
|
|
15
|
+
* Brand values (`brandName`, `appUrl`, `copyrightHolder`, …) are intentionally
|
|
16
|
+
* NOT in this catalog — they stay interpolated from `TenantBranding`.
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_LOCALE = 'en';
|
|
19
|
+
const SUPPORTED_LOCALES = new Set(['en', 'es', 'fr', 'ar']);
|
|
20
|
+
/**
|
|
21
|
+
* Narrow an arbitrary runtime locale string (BCP-47, e.g. `es`, `es-MX`) down
|
|
22
|
+
* to one of the supported catalog locales. Falls back to `'en'`.
|
|
23
|
+
*
|
|
24
|
+
* Accepts `string | undefined` so callers can pass through optional values
|
|
25
|
+
* (e.g. a missing recipient locale) without a guard.
|
|
26
|
+
*/
|
|
27
|
+
export const resolveCatalogLocale = (locale) => {
|
|
28
|
+
if (typeof locale !== 'string' || locale.length === 0)
|
|
29
|
+
return DEFAULT_LOCALE;
|
|
30
|
+
const base = locale.toLowerCase().split('-')[0];
|
|
31
|
+
return SUPPORTED_LOCALES.has(base) ? base : DEFAULT_LOCALE;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Map a supported locale to the value for the top-level `<Html lang>`
|
|
35
|
+
* attribute. BCP-47 base tag is sufficient for email clients / RTL handling.
|
|
36
|
+
*/
|
|
37
|
+
export const htmlLang = (locale) => resolveCatalogLocale(locale);
|
|
38
|
+
/** Locales that render right-to-left. */
|
|
39
|
+
const RTL_LOCALES = new Set(['ar']);
|
|
40
|
+
/**
|
|
41
|
+
* Text direction for the top-level `<Html dir>` attribute. Arabic renders
|
|
42
|
+
* right-to-left; everything else left-to-right. Email clients need an explicit
|
|
43
|
+
* `dir="rtl"` to flip alignment, punctuation, and layout for RTL languages.
|
|
44
|
+
*/
|
|
45
|
+
export const htmlDir = (locale) => RTL_LOCALES.has(resolveCatalogLocale(locale)) ? 'rtl' : 'ltr';
|
|
46
|
+
export const SHARED = {
|
|
47
|
+
en: {
|
|
48
|
+
footerDisclaimer: 'You received this email because someone requested to add this email to their {brandName} account. Please ignore this email if this was not you.',
|
|
49
|
+
contactSupport: 'Contact Support',
|
|
50
|
+
linkFallbackHint: 'If you have trouble with the button above, copy and paste this link into your browser:',
|
|
51
|
+
teamSignature: 'The {brandName} Team',
|
|
52
|
+
},
|
|
53
|
+
es: {
|
|
54
|
+
footerDisclaimer: 'Recibiste este correo porque alguien solicitó añadir este correo a su cuenta de {brandName}. Ignora este mensaje si no fuiste tú.',
|
|
55
|
+
contactSupport: 'Contactar con soporte',
|
|
56
|
+
linkFallbackHint: 'Si tienes problemas con el botón anterior, copia y pega este enlace en tu navegador:',
|
|
57
|
+
teamSignature: 'El equipo de {brandName}',
|
|
58
|
+
},
|
|
59
|
+
fr: {
|
|
60
|
+
footerDisclaimer: 'Vous avez reçu cet e-mail car quelqu\u2019un a demandé à ajouter cette adresse e-mail à son compte {brandName}. Veuillez ignorer cet e-mail si vous n\u2019êtes pas à l\u2019origine de cette demande.',
|
|
61
|
+
contactSupport: 'Contacter le support',
|
|
62
|
+
linkFallbackHint: 'Si le bouton ci-dessus ne fonctionne pas, copiez et collez ce lien dans votre navigateur :',
|
|
63
|
+
teamSignature: 'L’équipe {brandName}',
|
|
64
|
+
},
|
|
65
|
+
ar: {
|
|
66
|
+
footerDisclaimer: 'لقد تلقيت هذه الرسالة لأن أحدهم طلب إضافة هذا البريد إلى حسابه في {brandName}. يرجى تجاهل هذه الرسالة إذا لم تكن أنت.',
|
|
67
|
+
contactSupport: 'تواصل مع الدعم',
|
|
68
|
+
linkFallbackHint: 'إذا واجهت مشكلة مع الزر أعلاه، انسخ هذا الرابط والصقه في متصفحك:',
|
|
69
|
+
teamSignature: 'فريق {brandName}',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
/** Replace `{var}` placeholders in `template` with values from `params`. */
|
|
73
|
+
export const interpolate = (template, params) => template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
74
|
+
const value = params[key];
|
|
75
|
+
return value === undefined ? match : value;
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,cAAc,GAAuB,IAAI,CAAC;AAEhD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAsB,EAAsB,EAAE;IAC/E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAuB,CAAC;IACtE,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;AAC/D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAU,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEzF,yCAAyC;AACzC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAiB,EAAE,CAC7D,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAiBlE,MAAM,CAAC,MAAM,MAAM,GAAoD;IACnE,EAAE,EAAE;QACA,gBAAgB,EACZ,iJAAiJ;QACrJ,cAAc,EAAE,iBAAiB;QACjC,gBAAgB,EACZ,wFAAwF;QAC5F,aAAa,EAAE,sBAAsB;KACxC;IACD,EAAE,EAAE;QACA,gBAAgB,EACZ,mIAAmI;QACvI,cAAc,EAAE,uBAAuB;QACvC,gBAAgB,EACZ,sFAAsF;QAC1F,aAAa,EAAE,0BAA0B;KAC5C;IACD,EAAE,EAAE;QACA,gBAAgB,EACZ,wMAAwM;QAC5M,cAAc,EAAE,sBAAsB;QACtC,gBAAgB,EACZ,4FAA4F;QAChG,aAAa,EAAE,sBAAsB;KACxC;IACD,EAAE,EAAE;QACA,gBAAgB,EACZ,uHAAuH;QAC3H,cAAc,EAAE,gBAAgB;QAChC,gBAAgB,EAAE,kEAAkE;QACpF,aAAa,EAAE,kBAAkB;KACpC;CACJ,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,MAA0C,EAAU,EAAE,CAChG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
*/
|
|
15
15
|
export { resolveBranding, DEFAULT_BRANDING } from './branding';
|
|
16
16
|
export type { TenantBranding } from './branding';
|
|
17
|
+
export { resolveCatalogLocale } from './i18n';
|
|
18
|
+
export type { NotificationLocale } from './i18n';
|
|
17
19
|
export { renderEmail } from './render';
|
|
18
20
|
export type { RenderedEmail, TemplateId, TemplateDataMap } from './render';
|
|
19
21
|
export type { VerificationCodeData, EmailVerificationData, InboxClaimData, GuardianApprovalData, AccountApprovedData, RecoveryKeyData, EndorsementRequestData, CredentialAwaitingGuardianData, GuardianApprovedClaimData, GuardianCredentialApprovalData, GuardianEmailOtpData, GuardianRejectedCredentialData, } from './render';
|
|
20
22
|
export { renderSms } from './sms';
|
|
21
|
-
export type { SmsTemplateId, SmsTemplateDataMap, SmsInboxClaimData, SmsVerificationData } from './sms';
|
|
22
|
-
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding } from './tenant-registry';
|
|
23
|
+
export type { SmsTemplateId, SmsTemplateDataMap, SmsInboxClaimData, SmsVerificationData, } from './sms';
|
|
24
|
+
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding, } from './tenant-registry';
|
|
23
25
|
export type { ResolvedTenant, RequestHeaders } from './tenant-registry';
|
|
24
26
|
//# 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,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,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,
|
|
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,GACjC,MAAM,UAAU,CAAC;AAGlB,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"}
|
package/dist/index.js
CHANGED
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
*/
|
|
15
15
|
// Branding
|
|
16
16
|
export { resolveBranding, DEFAULT_BRANDING } from './branding';
|
|
17
|
+
// i18n (LC-1902)
|
|
18
|
+
export { resolveCatalogLocale } from './i18n';
|
|
17
19
|
// Email rendering
|
|
18
20
|
export { renderEmail } from './render';
|
|
19
21
|
// SMS rendering
|
|
20
22
|
export { renderSms } from './sms';
|
|
21
23
|
// Server-side tenant resolution
|
|
22
|
-
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding } from './tenant-registry';
|
|
24
|
+
export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding, } from './tenant-registry';
|
|
23
25
|
// Template components are intentionally NOT re-exported from the barrel.
|
|
24
26
|
// They contain JSX (.tsx) and would force every transitive consumer to
|
|
25
27
|
// configure `jsx` in their tsconfig. Use renderEmail() / renderSms() instead.
|
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,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAiBvC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,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;AAiBvC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQlC,gCAAgC;AAChC,OAAO,EACH,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,yEAAyE;AACzE,uEAAuE;AACvE,8EAA8E;AAC9E,+DAA+D;AAC/D,yDAAyD"}
|
package/dist/render.d.ts
CHANGED
|
@@ -181,5 +181,7 @@ export interface GuardianRejectedCredentialData {
|
|
|
181
181
|
* @param data — template-specific data
|
|
182
182
|
* @returns `{ html, text, subject }` ready for any email adapter
|
|
183
183
|
*/
|
|
184
|
-
export declare function renderEmail<T extends TemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: TemplateDataMap[T]
|
|
184
|
+
export declare function renderEmail<T extends TemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: TemplateDataMap[T],
|
|
185
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
186
|
+
locale?: string): Promise<RenderedEmail>;
|
|
185
187
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/render.js
CHANGED
|
@@ -22,9 +22,11 @@ import { VerificationCode, getVerificationCodeSubject, InboxClaim, getInboxClaim
|
|
|
22
22
|
* @param data — template-specific data
|
|
23
23
|
* @returns `{ html, text, subject }` ready for any email adapter
|
|
24
24
|
*/
|
|
25
|
-
export async function renderEmail(templateId, branding, data
|
|
25
|
+
export async function renderEmail(templateId, branding, data,
|
|
26
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
27
|
+
locale) {
|
|
26
28
|
const resolved = resolveBranding(branding);
|
|
27
|
-
const { element, subject } = buildElement(templateId, resolved, data);
|
|
29
|
+
const { element, subject } = buildElement(templateId, resolved, data, locale);
|
|
28
30
|
const html = await render(element);
|
|
29
31
|
const text = await render(element, { plainText: true });
|
|
30
32
|
return { html, text, subject };
|
|
@@ -32,116 +34,117 @@ export async function renderEmail(templateId, branding, data) {
|
|
|
32
34
|
// ---------------------------------------------------------------------------
|
|
33
35
|
// Internal: build the React element + subject for a given template
|
|
34
36
|
// ---------------------------------------------------------------------------
|
|
35
|
-
function buildVerificationElement(branding, data, variant) {
|
|
37
|
+
function buildVerificationElement(branding, data, variant, locale) {
|
|
36
38
|
return {
|
|
37
39
|
element: React.createElement(VerificationCode, {
|
|
38
40
|
branding,
|
|
39
41
|
verificationCode: data.verificationCode,
|
|
40
42
|
verificationEmail: data.verificationEmail,
|
|
41
43
|
variant,
|
|
44
|
+
locale,
|
|
42
45
|
}),
|
|
43
|
-
subject: getVerificationCodeSubject(branding, variant),
|
|
46
|
+
subject: getVerificationCodeSubject(branding, variant, locale),
|
|
44
47
|
};
|
|
45
48
|
}
|
|
46
|
-
function buildElement(templateId, branding, data) {
|
|
49
|
+
function buildElement(templateId, branding, data, locale) {
|
|
47
50
|
switch (templateId) {
|
|
48
51
|
case 'embed-email-verification':
|
|
49
|
-
return buildVerificationElement(branding, data, 'embed-verification');
|
|
52
|
+
return buildVerificationElement(branding, data, 'embed-verification', locale);
|
|
50
53
|
case 'contact-method-verification': {
|
|
51
54
|
const d = data;
|
|
52
|
-
const props = { branding, ...d };
|
|
55
|
+
const props = { branding, ...d, locale };
|
|
53
56
|
return {
|
|
54
57
|
element: React.createElement(EmailVerification, props),
|
|
55
|
-
subject: getEmailVerificationSubject(branding),
|
|
58
|
+
subject: getEmailVerificationSubject(branding, locale),
|
|
56
59
|
};
|
|
57
60
|
}
|
|
58
61
|
case 'login-verification-code':
|
|
59
62
|
case 'contact-method-verification-1':
|
|
60
|
-
return buildVerificationElement(branding, data, 'login');
|
|
63
|
+
return buildVerificationElement(branding, data, 'login', locale);
|
|
61
64
|
case 'recovery-email-code':
|
|
62
65
|
case 'recovery-email-verification':
|
|
63
|
-
return buildVerificationElement(branding, data, 'recovery-email');
|
|
66
|
+
return buildVerificationElement(branding, data, 'recovery-email', locale);
|
|
64
67
|
case 'inbox-claim':
|
|
65
68
|
case 'universal-inbox-claim': {
|
|
66
69
|
const d = data;
|
|
67
|
-
const props = { branding, ...d };
|
|
70
|
+
const props = { branding, ...d, locale };
|
|
68
71
|
return {
|
|
69
72
|
element: React.createElement(InboxClaim, props),
|
|
70
|
-
subject: getInboxClaimSubject(branding, props),
|
|
73
|
+
subject: getInboxClaimSubject(branding, props, locale),
|
|
71
74
|
};
|
|
72
75
|
}
|
|
73
76
|
case 'guardian-approval': {
|
|
74
77
|
const d = data;
|
|
75
|
-
const props = { branding, ...d };
|
|
78
|
+
const props = { branding, ...d, locale };
|
|
76
79
|
return {
|
|
77
80
|
element: React.createElement(GuardianApproval, props),
|
|
78
|
-
subject: getGuardianApprovalSubject(branding, props),
|
|
81
|
+
subject: getGuardianApprovalSubject(branding, props, locale),
|
|
79
82
|
};
|
|
80
83
|
}
|
|
81
84
|
case 'account-approved':
|
|
82
85
|
case 'account-approved-email': {
|
|
83
86
|
const d = data;
|
|
84
87
|
return {
|
|
85
|
-
element: React.createElement(AccountApproved, { branding, ...d }),
|
|
86
|
-
subject: getAccountApprovedSubject(branding),
|
|
88
|
+
element: React.createElement(AccountApproved, { branding, ...d, locale }),
|
|
89
|
+
subject: getAccountApprovedSubject(branding, locale),
|
|
87
90
|
};
|
|
88
91
|
}
|
|
89
92
|
case 'recovery-key':
|
|
90
93
|
case 'recovery-key-backup': {
|
|
91
94
|
const d = data;
|
|
92
|
-
const props = { branding, ...d };
|
|
95
|
+
const props = { branding, ...d, locale };
|
|
93
96
|
return {
|
|
94
97
|
element: React.createElement(RecoveryKey, props),
|
|
95
|
-
subject: getRecoveryKeySubject(branding),
|
|
98
|
+
subject: getRecoveryKeySubject(branding, locale),
|
|
96
99
|
};
|
|
97
100
|
}
|
|
98
101
|
case 'endorsement-request':
|
|
99
102
|
case 'universal-inbox-claim-1': {
|
|
100
103
|
const d = data;
|
|
101
|
-
const props = { branding, ...d };
|
|
104
|
+
const props = { branding, ...d, locale };
|
|
102
105
|
return {
|
|
103
106
|
element: React.createElement(EndorsementRequest, props),
|
|
104
|
-
subject: getEndorsementRequestSubject(branding, props),
|
|
107
|
+
subject: getEndorsementRequestSubject(branding, props, locale),
|
|
105
108
|
};
|
|
106
109
|
}
|
|
107
110
|
case 'credential-awaiting-guardian': {
|
|
108
111
|
const d = data;
|
|
109
|
-
const props = { branding, ...d };
|
|
112
|
+
const props = { branding, ...d, locale };
|
|
110
113
|
return {
|
|
111
114
|
element: React.createElement(CredentialAwaitingGuardian, props),
|
|
112
|
-
subject: getCredentialAwaitingGuardianSubject(branding),
|
|
115
|
+
subject: getCredentialAwaitingGuardianSubject(branding, locale),
|
|
113
116
|
};
|
|
114
117
|
}
|
|
115
118
|
case 'guardian-approved-claim': {
|
|
116
119
|
const d = data;
|
|
117
|
-
const props = { branding, ...d };
|
|
120
|
+
const props = { branding, ...d, locale };
|
|
118
121
|
return {
|
|
119
122
|
element: React.createElement(GuardianApprovedClaim, props),
|
|
120
|
-
subject: getGuardianApprovedClaimSubject(branding),
|
|
123
|
+
subject: getGuardianApprovedClaimSubject(branding, locale),
|
|
121
124
|
};
|
|
122
125
|
}
|
|
123
126
|
case 'guardian-credential-approval': {
|
|
124
127
|
const d = data;
|
|
125
|
-
const props = { branding, ...d };
|
|
128
|
+
const props = { branding, ...d, locale };
|
|
126
129
|
return {
|
|
127
130
|
element: React.createElement(GuardianCredentialApproval, props),
|
|
128
|
-
subject: getGuardianCredentialApprovalSubject(branding),
|
|
131
|
+
subject: getGuardianCredentialApprovalSubject(branding, locale),
|
|
129
132
|
};
|
|
130
133
|
}
|
|
131
134
|
case 'guardian-email-otp': {
|
|
132
135
|
const d = data;
|
|
133
|
-
const props = { branding, ...d };
|
|
136
|
+
const props = { branding, ...d, locale };
|
|
134
137
|
return {
|
|
135
138
|
element: React.createElement(GuardianEmailOtp, props),
|
|
136
|
-
subject: getGuardianEmailOtpSubject(branding),
|
|
139
|
+
subject: getGuardianEmailOtpSubject(branding, locale),
|
|
137
140
|
};
|
|
138
141
|
}
|
|
139
142
|
case 'guardian-rejected-credential': {
|
|
140
143
|
const d = data;
|
|
141
|
-
const props = { branding, ...d };
|
|
144
|
+
const props = { branding, ...d, locale };
|
|
142
145
|
return {
|
|
143
146
|
element: React.createElement(GuardianRejectedCredential, props),
|
|
144
|
-
subject: getGuardianRejectedCredentialSubject(branding),
|
|
147
|
+
subject: getGuardianRejectedCredentialSubject(branding, locale),
|
|
145
148
|
};
|
|
146
149
|
}
|
|
147
150
|
default: {
|
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,GAC9B,MAAM,aAAa,CAAC;AAwLrB,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,UAAa,EACb,QAAkD,EAClD,IAAwB;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/sms.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMS template rendering — tenant-aware replacement for sms.helpers.ts.
|
|
3
3
|
*
|
|
4
|
-
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name
|
|
4
|
+
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name
|
|
5
|
+
* and renders localized SMS bodies (LC-1902, workstream C1).
|
|
5
6
|
*/
|
|
6
7
|
import type { TenantBranding } from './branding';
|
|
7
8
|
export interface SmsInboxClaimData {
|
|
@@ -26,9 +27,11 @@ export interface SmsTemplateDataMap {
|
|
|
26
27
|
'contact-method-verification': SmsVerificationData;
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
|
-
* Render a branded SMS body for the given template.
|
|
30
|
+
* Render a branded, localized SMS body for the given template.
|
|
30
31
|
*
|
|
31
32
|
* @returns The SMS body string, or `undefined` if the templateId is unknown.
|
|
32
33
|
*/
|
|
33
|
-
export declare function renderSms<T extends SmsTemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: SmsTemplateDataMap[T]
|
|
34
|
+
export declare function renderSms<T extends SmsTemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: SmsTemplateDataMap[T],
|
|
35
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
36
|
+
locale?: string): string | undefined;
|
|
34
37
|
//# sourceMappingURL=sms.d.ts.map
|
package/dist/sms.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sms.d.ts","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sms.d.ts","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAChC,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,6BAA6B,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IAC/B,aAAa,EAAE,iBAAiB,CAAC;IACjC,6BAA6B,EAAE,mBAAmB,CAAC;CACtD;AAqDD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC7C,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,EAClD,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC3B,sDAAsD;AACtD,MAAM,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CA0BpB"}
|
package/dist/sms.js
CHANGED
|
@@ -1,31 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMS template rendering — tenant-aware replacement for sms.helpers.ts.
|
|
3
3
|
*
|
|
4
|
-
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name
|
|
4
|
+
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name
|
|
5
|
+
* and renders localized SMS bodies (LC-1902, workstream C1).
|
|
5
6
|
*/
|
|
6
7
|
import { resolveBranding } from './branding';
|
|
8
|
+
import { resolveCatalogLocale } from './i18n';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Per-locale SMS copy. EN values byte-match the originals in sms.helpers.ts.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const INBOX_CLAIM = {
|
|
13
|
+
en: {
|
|
14
|
+
greetingName: name => `Hello, ${name}! `,
|
|
15
|
+
body: (credType, credName, issuerName) => `You have a new ${credType}, "${credName}"${issuerName ? ` from ${issuerName}.` : '.'}`,
|
|
16
|
+
cta: 'Claim it here:',
|
|
17
|
+
},
|
|
18
|
+
es: {
|
|
19
|
+
greetingName: name => `¡Hola, ${name}! `,
|
|
20
|
+
body: (credType, credName, issuerName) => `Tienes un nuevo ${credType}, "${credName}"${issuerName ? ` de ${issuerName}.` : '.'}`,
|
|
21
|
+
cta: 'Reclámalo aquí:',
|
|
22
|
+
},
|
|
23
|
+
fr: {
|
|
24
|
+
greetingName: name => `Bonjour ${name} ! `,
|
|
25
|
+
body: (credType, credName, issuerName) => `Vous avez un nouveau ${credType}, « ${credName} »${issuerName ? ` de ${issuerName}.` : '.'}`,
|
|
26
|
+
cta: 'Réclamez-le ici :',
|
|
27
|
+
},
|
|
28
|
+
ar: {
|
|
29
|
+
greetingName: name => `مرحبًا ${name}! `,
|
|
30
|
+
body: (credType, credName, issuerName) => `لديك ${credType} جديد، "${credName}"${issuerName ? ` من ${issuerName}.` : '.'}`,
|
|
31
|
+
cta: 'طالب به هنا:',
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const VERIFICATION = {
|
|
35
|
+
en: b => `Your ${b} verification code is:`,
|
|
36
|
+
es: b => `Tu código de verificación de ${b} es:`,
|
|
37
|
+
fr: b => `Votre code de vérification ${b} est :`,
|
|
38
|
+
ar: b => `رمز التحقق الخاص بك في ${b} هو:`,
|
|
39
|
+
};
|
|
7
40
|
// ---------------------------------------------------------------------------
|
|
8
41
|
// renderSms()
|
|
9
42
|
// ---------------------------------------------------------------------------
|
|
10
43
|
/**
|
|
11
|
-
* Render a branded SMS body for the given template.
|
|
44
|
+
* Render a branded, localized SMS body for the given template.
|
|
12
45
|
*
|
|
13
46
|
* @returns The SMS body string, or `undefined` if the templateId is unknown.
|
|
14
47
|
*/
|
|
15
|
-
export function renderSms(templateId, branding, data
|
|
48
|
+
export function renderSms(templateId, branding, data,
|
|
49
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
50
|
+
locale) {
|
|
16
51
|
const resolved = resolveBranding(branding);
|
|
52
|
+
const loc = resolveCatalogLocale(locale);
|
|
17
53
|
switch (templateId) {
|
|
18
54
|
case 'inbox-claim': {
|
|
19
55
|
const d = data;
|
|
20
|
-
const
|
|
56
|
+
const s = INBOX_CLAIM[loc];
|
|
57
|
+
const greeting = d.recipient?.name ? s.greetingName(d.recipient.name) : '';
|
|
21
58
|
const credType = d.credential?.type ?? 'credential';
|
|
22
59
|
const credName = d.credential?.name ?? 'Unnamed Credential';
|
|
23
|
-
|
|
24
|
-
return `${greeting}You have a new ${credType}, "${credName}"${issuerPart} Claim it here: ${d.claimUrl}`;
|
|
60
|
+
return `${greeting}${s.body(credType, credName, d.issuer?.name)} ${s.cta} ${d.claimUrl}`;
|
|
25
61
|
}
|
|
26
62
|
case 'contact-method-verification': {
|
|
27
63
|
const d = data;
|
|
28
|
-
return
|
|
64
|
+
return `${VERIFICATION[loc](resolved.brandName)} ${d.verificationToken}`;
|
|
29
65
|
}
|
|
30
66
|
default:
|
|
31
67
|
return undefined;
|