@learncard/email-templates 1.0.4 → 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.
Files changed (92) hide show
  1. package/dist/components/Layout.d.ts +2 -0
  2. package/dist/components/Layout.d.ts.map +1 -1
  3. package/dist/components/Layout.js +6 -1
  4. package/dist/components/Layout.js.map +1 -1
  5. package/dist/components/LinkFallback.d.ts +2 -0
  6. package/dist/components/LinkFallback.d.ts.map +1 -1
  7. package/dist/components/LinkFallback.js +5 -1
  8. package/dist/components/LinkFallback.js.map +1 -1
  9. package/dist/i18n.d.ts +52 -0
  10. package/dist/i18n.d.ts.map +1 -0
  11. package/dist/i18n.js +77 -0
  12. package/dist/i18n.js.map +1 -0
  13. package/dist/index.d.ts +4 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/render.d.ts +3 -1
  18. package/dist/render.d.ts.map +1 -1
  19. package/dist/render.js +33 -30
  20. package/dist/render.js.map +1 -1
  21. package/dist/sms.d.ts +6 -3
  22. package/dist/sms.d.ts.map +1 -1
  23. package/dist/sms.js +43 -7
  24. package/dist/sms.js.map +1 -1
  25. package/dist/templates/account-approved.d.ts +3 -1
  26. package/dist/templates/account-approved.d.ts.map +1 -1
  27. package/dist/templates/account-approved.js +55 -5
  28. package/dist/templates/account-approved.js.map +1 -1
  29. package/dist/templates/credential-awaiting-guardian.d.ts +3 -1
  30. package/dist/templates/credential-awaiting-guardian.d.ts.map +1 -1
  31. package/dist/templates/credential-awaiting-guardian.js +54 -4
  32. package/dist/templates/credential-awaiting-guardian.js.map +1 -1
  33. package/dist/templates/email-verification.d.ts +3 -1
  34. package/dist/templates/email-verification.d.ts.map +1 -1
  35. package/dist/templates/email-verification.js +57 -4
  36. package/dist/templates/email-verification.js.map +1 -1
  37. package/dist/templates/endorsement-request.d.ts +3 -1
  38. package/dist/templates/endorsement-request.d.ts.map +1 -1
  39. package/dist/templates/endorsement-request.js +53 -5
  40. package/dist/templates/endorsement-request.js.map +1 -1
  41. package/dist/templates/guardian-approval.d.ts +3 -1
  42. package/dist/templates/guardian-approval.d.ts.map +1 -1
  43. package/dist/templates/guardian-approval.js +55 -5
  44. package/dist/templates/guardian-approval.js.map +1 -1
  45. package/dist/templates/guardian-approved-claim.d.ts +3 -1
  46. package/dist/templates/guardian-approved-claim.d.ts.map +1 -1
  47. package/dist/templates/guardian-approved-claim.js +50 -4
  48. package/dist/templates/guardian-approved-claim.js.map +1 -1
  49. package/dist/templates/guardian-credential-approval.d.ts +3 -1
  50. package/dist/templates/guardian-credential-approval.d.ts.map +1 -1
  51. package/dist/templates/guardian-credential-approval.js +50 -4
  52. package/dist/templates/guardian-credential-approval.js.map +1 -1
  53. package/dist/templates/guardian-email-otp.d.ts +3 -1
  54. package/dist/templates/guardian-email-otp.d.ts.map +1 -1
  55. package/dist/templates/guardian-email-otp.js +55 -5
  56. package/dist/templates/guardian-email-otp.js.map +1 -1
  57. package/dist/templates/guardian-rejected-credential.d.ts +3 -1
  58. package/dist/templates/guardian-rejected-credential.d.ts.map +1 -1
  59. package/dist/templates/guardian-rejected-credential.js +45 -3
  60. package/dist/templates/guardian-rejected-credential.js.map +1 -1
  61. package/dist/templates/inbox-claim.d.ts +3 -1
  62. package/dist/templates/inbox-claim.d.ts.map +1 -1
  63. package/dist/templates/inbox-claim.js +63 -11
  64. package/dist/templates/inbox-claim.js.map +1 -1
  65. package/dist/templates/recovery-key.d.ts +3 -1
  66. package/dist/templates/recovery-key.d.ts.map +1 -1
  67. package/dist/templates/recovery-key.js +59 -3
  68. package/dist/templates/recovery-key.js.map +1 -1
  69. package/dist/templates/verification-code.d.ts +3 -1
  70. package/dist/templates/verification-code.d.ts.map +1 -1
  71. package/dist/templates/verification-code.js +153 -17
  72. package/dist/templates/verification-code.js.map +1 -1
  73. package/package.json +1 -1
  74. package/src/__tests__/i18n.test.ts +329 -0
  75. package/src/components/Layout.tsx +69 -60
  76. package/src/components/LinkFallback.tsx +19 -11
  77. package/src/i18n.ts +110 -0
  78. package/src/index.ts +15 -2
  79. package/src/render.ts +47 -28
  80. package/src/sms.ts +61 -6
  81. package/src/templates/account-approved.tsx +82 -29
  82. package/src/templates/credential-awaiting-guardian.tsx +113 -19
  83. package/src/templates/email-verification.tsx +87 -16
  84. package/src/templates/endorsement-request.tsx +142 -17
  85. package/src/templates/guardian-approval.tsx +106 -16
  86. package/src/templates/guardian-approved-claim.tsx +137 -17
  87. package/src/templates/guardian-credential-approval.tsx +112 -17
  88. package/src/templates/guardian-email-otp.tsx +103 -25
  89. package/src/templates/guardian-rejected-credential.tsx +137 -15
  90. package/src/templates/inbox-claim.tsx +180 -29
  91. package/src/templates/recovery-key.tsx +126 -30
  92. package/src/templates/verification-code.tsx +204 -38
@@ -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;AAElD,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;CAC5B;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA2DxC,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
- export const Layout = ({ branding, preview, children, showHeaderLogo = true }) => (_jsxs(Html, { lang: "en", 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: [_jsxs(Text, { style: footerDisclaimer, children: ["You received this email because someone requested to add this email to their ", branding.brandName, " account. Please ignore this email if this was not you."] }), _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: "Contact Support" }) })] })] })] }));
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":"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"}
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../src/components/Layout.tsx"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  import * as React from 'react';
7
7
  interface LinkFallbackProps {
8
8
  href: string;
9
+ /** Recipient locale (BCP-47). Defaults to English. */
10
+ locale?: string;
9
11
  }
10
12
  export declare const LinkFallback: React.FC<LinkFallbackProps>;
11
13
  export {};
@@ -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;AAE/B,UAAU,iBAAiB;IACvB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAYpD,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
- export const LinkFallback = ({ href }) => (_jsxs(_Fragment, { children: [_jsx(Hr, { style: divider }), _jsx(Text, { style: hint, children: "If you have trouble with the button above, copy and paste this link into your browser:" }), _jsx(Text, { style: linkText, children: _jsx(Link, { href: href, style: link, children: href }) })] }));
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;AAOzD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACnE,8BACI,KAAC,EAAE,IAAC,KAAK,EAAE,OAAO,GAAI,EAEtB,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,uGAEV,EAEP,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,YACjB,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,YAAG,IAAI,GAAQ,GACzC,IACR,CACN,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"}
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
@@ -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
@@ -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,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGvG,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC5G,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,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;AAGlC,gCAAgC;AAChC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG5G,yEAAyE;AACzE,uEAAuE;AACvE,8EAA8E;AAC9E,+DAA+D;AAC/D,yDAAyD"}
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]): Promise<RenderedEmail>;
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
@@ -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: {
@@ -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;IAExB,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEtE,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;IAEhC,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;SACV,CAAC;QACF,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC;KACzD,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CACjB,UAAsB,EACtB,QAAwB,EACxB,IAAiC;IAGjC,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,0BAA0B;YAC3B,OAAO,wBAAwB,CAAC,QAAQ,EAAE,IAA4B,EAAE,oBAAoB,CAAC,CAAC;QAElG,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,IAA6B,CAAC;YACxC,MAAM,KAAK,GAA2B,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;YAEzD,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBACtD,OAAO,EAAE,2BAA2B,CAAC,QAAQ,CAAC;aACjD,CAAC;QACN,CAAC;QAED,KAAK,yBAAyB,CAAC;QAC/B,KAAK,+BAA+B;YAChC,OAAO,wBAAwB,CAAC,QAAQ,EAAE,IAA4B,EAAE,OAAO,CAAC,CAAC;QAErF,KAAK,qBAAqB,CAAC;QAC3B,KAAK,6BAA6B;YAC9B,OAAO,wBAAwB,CAAC,QAAQ,EAAE,IAA4B,EAAE,gBAAgB,CAAC,CAAC;QAE9F,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,CAAC;YAElD,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;gBAC/C,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC;aACjD,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,CAAC;YAExD,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBACrD,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,KAAK,CAAC;aACvD,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,CAAC;gBACjE,OAAO,EAAE,yBAAyB,CAAC,QAAQ,CAAC;aAC/C,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,CAAC;YAEnD,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC;gBAChD,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC;aAC3C,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,CAAC;YAE1D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBACvD,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC;aACzD,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,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,CAAC;aAC1D,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,CAAC;YAE7D,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE,KAAK,CAAC;gBAC1D,OAAO,EAAE,+BAA+B,CAAC,QAAQ,CAAC;aACrD,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,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,CAAC;aAC1D,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,CAAC;YAExD,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC;gBACrD,OAAO,EAAE,0BAA0B,CAAC,QAAQ,CAAC;aAChD,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,CAAC;YAElE,OAAO;gBACH,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAC/D,OAAO,EAAE,oCAAoC,CAAC,QAAQ,CAAC;aAC1D,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"}
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]): string | undefined;
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;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOjD,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;AAMD;;;;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,GAC5B,MAAM,GAAG,SAAS,CAuBpB"}
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 greeting = d.recipient?.name ? `Hello, ${d.recipient.name}! ` : '';
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
- const issuerPart = d.issuer?.name ? ` from ${d.issuer.name}.` : '.';
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 `Your ${resolved.brandName} verification code is: ${d.verificationToken}`;
64
+ return `${VERIFICATION[loc](resolved.brandName)} ${d.verificationToken}`;
29
65
  }
30
66
  default:
31
67
  return undefined;