@learncard/email-templates 1.2.0 → 1.2.2

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/i18n.d.ts +15 -0
  2. package/dist/i18n.d.ts.map +1 -1
  3. package/dist/i18n.js +31 -0
  4. package/dist/i18n.js.map +1 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/previews/account-secured-scenarios.d.ts +6 -0
  9. package/dist/previews/account-secured-scenarios.d.ts.map +1 -0
  10. package/dist/previews/account-secured-scenarios.js +7 -0
  11. package/dist/previews/account-secured-scenarios.js.map +1 -0
  12. package/dist/previews/escrow-hold-cancelled-scenarios.d.ts +6 -0
  13. package/dist/previews/escrow-hold-cancelled-scenarios.d.ts.map +1 -0
  14. package/dist/previews/escrow-hold-cancelled-scenarios.js +7 -0
  15. package/dist/previews/escrow-hold-cancelled-scenarios.js.map +1 -0
  16. package/dist/previews/escrow-hold-released-scenarios.d.ts +6 -0
  17. package/dist/previews/escrow-hold-released-scenarios.d.ts.map +1 -0
  18. package/dist/previews/escrow-hold-released-scenarios.js +7 -0
  19. package/dist/previews/escrow-hold-released-scenarios.js.map +1 -0
  20. package/dist/previews/escrow-hold-reminder-scenarios.d.ts +6 -0
  21. package/dist/previews/escrow-hold-reminder-scenarios.d.ts.map +1 -0
  22. package/dist/previews/escrow-hold-reminder-scenarios.js +7 -0
  23. package/dist/previews/escrow-hold-reminder-scenarios.js.map +1 -0
  24. package/dist/previews/escrow-hold-started-scenarios.d.ts +6 -0
  25. package/dist/previews/escrow-hold-started-scenarios.d.ts.map +1 -0
  26. package/dist/previews/escrow-hold-started-scenarios.js +7 -0
  27. package/dist/previews/escrow-hold-started-scenarios.js.map +1 -0
  28. package/dist/previews/escrow-pin-locked-scenarios.d.ts +6 -0
  29. package/dist/previews/escrow-pin-locked-scenarios.d.ts.map +1 -0
  30. package/dist/previews/escrow-pin-locked-scenarios.js +7 -0
  31. package/dist/previews/escrow-pin-locked-scenarios.js.map +1 -0
  32. package/dist/previews/escrow-pin-sign-in-scenarios.d.ts +6 -0
  33. package/dist/previews/escrow-pin-sign-in-scenarios.d.ts.map +1 -0
  34. package/dist/previews/escrow-pin-sign-in-scenarios.js +7 -0
  35. package/dist/previews/escrow-pin-sign-in-scenarios.js.map +1 -0
  36. package/dist/render.d.ts +45 -0
  37. package/dist/render.d.ts.map +1 -1
  38. package/dist/render.js +67 -1
  39. package/dist/render.js.map +1 -1
  40. package/dist/templates/account-secured.d.ts +27 -0
  41. package/dist/templates/account-secured.d.ts.map +1 -0
  42. package/dist/templates/account-secured.js +118 -0
  43. package/dist/templates/account-secured.js.map +1 -0
  44. package/dist/templates/escrow-hold-cancelled.d.ts +23 -0
  45. package/dist/templates/escrow-hold-cancelled.d.ts.map +1 -0
  46. package/dist/templates/escrow-hold-cancelled.js +131 -0
  47. package/dist/templates/escrow-hold-cancelled.js.map +1 -0
  48. package/dist/templates/escrow-hold-released.d.ts +21 -0
  49. package/dist/templates/escrow-hold-released.d.ts.map +1 -0
  50. package/dist/templates/escrow-hold-released.js +92 -0
  51. package/dist/templates/escrow-hold-released.js.map +1 -0
  52. package/dist/templates/escrow-hold-reminder.d.ts +21 -0
  53. package/dist/templates/escrow-hold-reminder.d.ts.map +1 -0
  54. package/dist/templates/escrow-hold-reminder.js +92 -0
  55. package/dist/templates/escrow-hold-reminder.js.map +1 -0
  56. package/dist/templates/escrow-hold-started.d.ts +25 -0
  57. package/dist/templates/escrow-hold-started.d.ts.map +1 -0
  58. package/dist/templates/escrow-hold-started.js +96 -0
  59. package/dist/templates/escrow-hold-started.js.map +1 -0
  60. package/dist/templates/escrow-pin-locked.d.ts +24 -0
  61. package/dist/templates/escrow-pin-locked.d.ts.map +1 -0
  62. package/dist/templates/escrow-pin-locked.js +97 -0
  63. package/dist/templates/escrow-pin-locked.js.map +1 -0
  64. package/dist/templates/escrow-pin-sign-in.d.ts +24 -0
  65. package/dist/templates/escrow-pin-sign-in.d.ts.map +1 -0
  66. package/dist/templates/escrow-pin-sign-in.js +96 -0
  67. package/dist/templates/escrow-pin-sign-in.js.map +1 -0
  68. package/dist/templates/index.d.ts +21 -28
  69. package/dist/templates/index.d.ts.map +1 -1
  70. package/dist/templates/index.js +20 -9
  71. package/dist/templates/index.js.map +1 -1
  72. package/package.json +2 -2
  73. package/src/__tests__/i18n.test.ts +62 -1
  74. package/src/__tests__/render.test.ts +306 -0
  75. package/src/i18n.ts +33 -0
  76. package/src/index.ts +8 -0
  77. package/src/previews/account-secured-scenarios.tsx +41 -0
  78. package/src/previews/escrow-hold-cancelled-scenarios.tsx +79 -0
  79. package/src/previews/escrow-hold-released-scenarios.tsx +58 -0
  80. package/src/previews/escrow-hold-reminder-scenarios.tsx +52 -0
  81. package/src/previews/escrow-hold-started-scenarios.tsx +67 -0
  82. package/src/previews/escrow-pin-locked-scenarios.tsx +60 -0
  83. package/src/previews/escrow-pin-sign-in-scenarios.tsx +52 -0
  84. package/src/render.ts +162 -0
  85. package/src/templates/account-secured.tsx +236 -0
  86. package/src/templates/escrow-hold-cancelled.tsx +212 -0
  87. package/src/templates/escrow-hold-released.tsx +184 -0
  88. package/src/templates/escrow-hold-reminder.tsx +184 -0
  89. package/src/templates/escrow-hold-started.tsx +216 -0
  90. package/src/templates/escrow-pin-locked.tsx +233 -0
  91. package/src/templates/escrow-pin-sign-in.tsx +197 -0
  92. package/src/templates/index.ts +100 -25
@@ -0,0 +1,96 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EscrowHoldStarted — notifies a user that an account recovery request was
4
+ * started and gives them a way to cancel it if it wasn't them.
5
+ *
6
+ * Used by: lca-api recovery hold routes (templateId: 'escrow-hold-started')
7
+ */
8
+ import { Text, Section } from '@react-email/components';
9
+ import { DEFAULT_BRANDING } from '../branding';
10
+ import { Layout } from '../components/Layout';
11
+ import { EmailButton } from '../components/EmailButton';
12
+ import { LinkFallback } from '../components/LinkFallback';
13
+ import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
14
+ const EN = {
15
+ preview: 'Account recovery started',
16
+ heading: 'Account Recovery Started',
17
+ body: (requestedAt, releaseAfter) => (_jsxs(_Fragment, { children: ["Someone started recovering your account on ", _jsx("strong", { children: requestedAt }), ". Access will be restored on ", _jsx("strong", { children: releaseAfter }), " unless you cancel."] })),
18
+ deviceHint: hint => (_jsxs(_Fragment, { children: ["The request came from ", _jsx("strong", { children: hint }), "."] })),
19
+ warning: "If this wasn't you, cancel now.",
20
+ button: "This wasn't me \u2014 Cancel recovery",
21
+ sincerely: 'Sincerely,',
22
+ subject: 'Account recovery started',
23
+ };
24
+ const ES = {
25
+ preview: 'Se inició la recuperación de tu cuenta',
26
+ heading: 'Recuperación de Cuenta Iniciada',
27
+ body: (requestedAt, releaseAfter) => (_jsxs(_Fragment, { children: ["Alguien inici\u00F3 la recuperaci\u00F3n de tu cuenta el ", _jsx("strong", { children: requestedAt }), ". El acceso se restablecer\u00E1 el ", _jsx("strong", { children: releaseAfter }), " a menos que la canceles."] })),
28
+ deviceHint: hint => (_jsxs(_Fragment, { children: ["La solicitud provino de ", _jsx("strong", { children: hint }), "."] })),
29
+ warning: 'Si no fuiste tú, cancélalo ahora.',
30
+ button: 'No fui yo \u2014 Cancelar recuperación',
31
+ sincerely: 'Atentamente,',
32
+ subject: 'Se inició la recuperación de tu cuenta',
33
+ };
34
+ const FR = {
35
+ preview: 'La récupération de votre compte a commencé',
36
+ heading: 'Récupération de Compte Commencée',
37
+ body: (requestedAt, releaseAfter) => (_jsxs(_Fragment, { children: ["Quelqu\\u2019un a commenc\u00E9 \u00E0 r\u00E9cup\u00E9rer votre compte le ", _jsx("strong", { children: requestedAt }), ". L\\u2019acc\u00E8s sera r\u00E9tabli le ", _jsx("strong", { children: releaseAfter }), " sauf si vous annulez."] })),
38
+ deviceHint: hint => (_jsxs(_Fragment, { children: ["La demande provient de ", _jsx("strong", { children: hint }), "."] })),
39
+ warning: 'Si ce n\u2019était pas vous, annulez dès maintenant.',
40
+ button: 'Ce n\u2019était pas moi \u2014 Annuler la récupération',
41
+ sincerely: 'Cordialement,',
42
+ subject: 'La récupération de votre compte a commencé',
43
+ };
44
+ const AR = {
45
+ preview: 'بدأت عملية استعادة حسابك',
46
+ heading: 'بدأت استعادة الحساب',
47
+ body: (requestedAt, releaseAfter) => (_jsxs(_Fragment, { children: ["\u0628\u062F\u0623 \u0634\u062E\u0635 \u0645\u0627 \u0628\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A ", _jsx("strong", { children: requestedAt }), ". \u0633\u062A\u062A\u0645 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 \u0641\u064A", ' ', _jsx("strong", { children: releaseAfter }), " \u0645\u0627 \u0644\u0645 \u062A\u0642\u0645 \u0628\u0627\u0644\u0625\u0644\u063A\u0627\u0621."] })),
48
+ deviceHint: hint => (_jsxs(_Fragment, { children: ["\u062C\u0627\u0621 \u0627\u0644\u0637\u0644\u0628 \u0645\u0646 ", _jsx("strong", { children: hint }), "."] })),
49
+ warning: 'إذا لم يكن هذا أنت، ألغِ الطلب الآن.',
50
+ button: 'لم يكن أنا \u2014 إلغاء الاستعادة',
51
+ sincerely: 'مع التحيات،',
52
+ subject: 'بدأت عملية استعادة حسابك',
53
+ };
54
+ const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
55
+ export const EscrowHoldStarted = ({ branding, requestedAt, releaseAfter, cancelUrl, deviceHint, locale, }) => {
56
+ const s = STRINGS[resolveCatalogLocale(locale)];
57
+ return (_jsxs(Layout, { branding: branding, locale: locale, preview: s.preview, children: [_jsx(Text, { style: heading, children: s.heading }), _jsx(Text, { style: paragraph, children: s.body(requestedAt, releaseAfter) }), deviceHint && _jsx(Text, { style: paragraph, children: s.deviceHint(deviceHint) }), _jsx(Text, { style: warning, children: s.warning }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: cancelUrl, branding: branding, children: s.button }) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
58
+ brandName: branding.brandName,
59
+ })] }), _jsx(LinkFallback, { href: cancelUrl, locale: locale })] }));
60
+ };
61
+ export const getEscrowHoldStartedSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
62
+ // ---------------------------------------------------------------------------
63
+ // Styles
64
+ // ---------------------------------------------------------------------------
65
+ const heading = {
66
+ fontSize: 24,
67
+ fontWeight: 600,
68
+ color: '#111827',
69
+ margin: '0 0 24px',
70
+ };
71
+ const paragraph = {
72
+ fontSize: 16,
73
+ color: '#374151',
74
+ lineHeight: '24px',
75
+ margin: '0 0 24px',
76
+ };
77
+ const warning = {
78
+ ...paragraph,
79
+ fontWeight: 600,
80
+ };
81
+ const buttonWrapper = {
82
+ margin: '0 0 24px',
83
+ };
84
+ const signOff = {
85
+ fontSize: 14,
86
+ color: '#374151',
87
+ lineHeight: '20px',
88
+ margin: '24px 0 0',
89
+ };
90
+ // ---------------------------------------------------------------------------
91
+ // Preview
92
+ // ---------------------------------------------------------------------------
93
+ export default function Preview() {
94
+ return (_jsx(EscrowHoldStarted, { branding: DEFAULT_BRANDING, requestedAt: "September 25, 2026, 3:00 PM", releaseAfter: "October 2, 2026, 3:00 PM", cancelUrl: "https://learncard.app/recovery/cancel?token=abc123", deviceHint: "Chrome on Windows" }));
95
+ }
96
+ //# sourceMappingURL=escrow-hold-started.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-hold-started.js","sourceRoot":"","sources":["../../src/templates/escrow-hold-started.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * EscrowPinLocked — notifies a user that their recovery PIN has been disabled
3
+ * after too many incorrect attempts. The slower, waiting-period recovery path
4
+ * is unaffected and still available.
5
+ *
6
+ * Used by: lca-api recovery hold routes (templateId: 'escrow-pin-locked')
7
+ */
8
+ import * as React from 'react';
9
+ import type { TenantBranding } from '../branding';
10
+ export interface EscrowPinLockedProps {
11
+ branding: TenantBranding;
12
+ /** Human-readable timestamp the PIN was locked. */
13
+ lockedAt: string;
14
+ /** Human-readable timestamp the waiting-period recovery will complete, if one is pending. */
15
+ releaseAfter?: string;
16
+ /** Link that cancels a pending waiting-period recovery request, if one is pending. */
17
+ cancelUrl?: string;
18
+ /** Recipient locale (BCP-47). Defaults to English. */
19
+ locale?: string;
20
+ }
21
+ export declare const EscrowPinLocked: React.FC<EscrowPinLockedProps>;
22
+ export declare const getEscrowPinLockedSubject: (_branding: TenantBranding, locale?: string) => string;
23
+ export default function Preview(): React.JSX.Element;
24
+ //# sourceMappingURL=escrow-pin-locked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-pin-locked.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-pin-locked.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AA+GD,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwC1D,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MACtC,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAS9B"}
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EscrowPinLocked — notifies a user that their recovery PIN has been disabled
4
+ * after too many incorrect attempts. The slower, waiting-period recovery path
5
+ * is unaffected and still available.
6
+ *
7
+ * Used by: lca-api recovery hold routes (templateId: 'escrow-pin-locked')
8
+ */
9
+ import { Text, Section } from '@react-email/components';
10
+ import { DEFAULT_BRANDING } from '../branding';
11
+ import { Layout } from '../components/Layout';
12
+ import { EmailButton } from '../components/EmailButton';
13
+ import { LinkFallback } from '../components/LinkFallback';
14
+ import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
15
+ const EN = {
16
+ preview: 'Recovery PIN locked',
17
+ heading: 'Recovery PIN Locked',
18
+ body: lockedAt => (_jsxs(_Fragment, { children: ["Too many incorrect PIN attempts were made on ", _jsx("strong", { children: lockedAt }), ". The PIN is now disabled."] })),
19
+ fallbackAvailable: releaseAfter => releaseAfter ? (_jsxs(_Fragment, { children: ["The waiting-period recovery is still available and will complete on", ' ', _jsx("strong", { children: releaseAfter }), " unless you cancel it."] })) : (_jsx(_Fragment, { children: "The waiting-period recovery is still available." })),
20
+ warning: "If this wasn't you, cancel now.",
21
+ button: "This wasn't me \u2014 Cancel recovery",
22
+ sincerely: 'Sincerely,',
23
+ subject: 'Recovery PIN locked',
24
+ };
25
+ const ES = {
26
+ preview: 'PIN de recuperación bloqueado',
27
+ heading: 'PIN de Recuperación Bloqueado',
28
+ body: lockedAt => (_jsxs(_Fragment, { children: ["Se realizaron demasiados intentos incorrectos de PIN el ", _jsx("strong", { children: lockedAt }), ". El PIN est\u00E1 ahora deshabilitado."] })),
29
+ fallbackAvailable: releaseAfter => releaseAfter ? (_jsxs(_Fragment, { children: ["La recuperaci\u00F3n por periodo de espera sigue disponible y se completar\u00E1 el", ' ', _jsx("strong", { children: releaseAfter }), " a menos que la canceles."] })) : (_jsx(_Fragment, { children: "La recuperaci\u00F3n por periodo de espera sigue disponible." })),
30
+ warning: 'Si no fuiste tú, cancélalo ahora.',
31
+ button: 'No fui yo \u2014 Cancelar recuperación',
32
+ sincerely: 'Atentamente,',
33
+ subject: 'PIN de recuperación bloqueado',
34
+ };
35
+ const FR = {
36
+ preview: 'Code PIN de récupération verrouillé',
37
+ heading: 'Code PIN de Récupération Verrouillé',
38
+ body: lockedAt => (_jsxs(_Fragment, { children: ["Un trop grand nombre de tentatives de code PIN incorrectes ont eu lieu le", ' ', _jsx("strong", { children: lockedAt }), ". Le code PIN est d\u00E9sormais d\u00E9sactiv\u00E9."] })),
39
+ fallbackAvailable: releaseAfter => releaseAfter ? (_jsxs(_Fragment, { children: ["La r\u00E9cup\u00E9ration par d\u00E9lai d\\u2019attente reste disponible et se terminera le", ' ', _jsx("strong", { children: releaseAfter }), " sauf si vous l\\u2019annulez."] })) : (_jsx(_Fragment, { children: "La r\u00E9cup\u00E9ration par d\u00E9lai d\\u2019attente reste disponible." })),
40
+ warning: 'Si ce n\u2019était pas vous, annulez dès maintenant.',
41
+ button: 'Ce n\u2019était pas moi \u2014 Annuler la récupération',
42
+ sincerely: 'Cordialement,',
43
+ subject: 'Code PIN de récupération verrouillé',
44
+ };
45
+ const AR = {
46
+ preview: 'تم قفل رمز PIN الخاص بالاستعادة',
47
+ heading: 'تم قفل رمز PIN الخاص بالاستعادة',
48
+ body: lockedAt => (_jsxs(_Fragment, { children: ["\u062A\u0645 \u0625\u062C\u0631\u0627\u0621 \u0639\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0627\u062A \u062E\u0627\u0637\u0626\u0629 \u0644\u0625\u062F\u062E\u0627\u0644 \u0631\u0645\u0632 PIN \u0641\u064A ", _jsx("strong", { children: lockedAt }), ". \u062A\u0645 \u0627\u0644\u0622\u0646 \u062A\u0639\u0637\u064A\u0644 \u0631\u0645\u0632 PIN."] })),
49
+ fallbackAvailable: releaseAfter => releaseAfter ? (_jsxs(_Fragment, { children: ["\u0644\u0627 \u062A\u0632\u0627\u0644 \u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0628\u0641\u062A\u0631\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 \u0645\u062A\u0627\u062D\u0629 \u0648\u0633\u062A\u0643\u062A\u0645\u0644 \u0641\u064A ", _jsx("strong", { children: releaseAfter }), " \u0645\u0627 \u0644\u0645 \u062A\u0642\u0645 \u0628\u0625\u0644\u063A\u0627\u0626\u0647\u0627."] })) : (_jsx(_Fragment, { children: "\u0644\u0627 \u062A\u0632\u0627\u0644 \u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0628\u0641\u062A\u0631\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 \u0645\u062A\u0627\u062D\u0629." })),
50
+ warning: 'إذا لم يكن هذا أنت، ألغِ الطلب الآن.',
51
+ button: 'لم يكن أنا \u2014 إلغاء الاستعادة',
52
+ sincerely: 'مع التحيات،',
53
+ subject: 'تم قفل رمز PIN الخاص بالاستعادة',
54
+ };
55
+ const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
56
+ export const EscrowPinLocked = ({ branding, lockedAt, releaseAfter, cancelUrl, locale, }) => {
57
+ const s = STRINGS[resolveCatalogLocale(locale)];
58
+ return (_jsxs(Layout, { branding: branding, locale: locale, preview: s.preview, children: [_jsx(Text, { style: heading, children: s.heading }), _jsx(Text, { style: paragraph, children: s.body(lockedAt) }), _jsx(Text, { style: paragraph, children: s.fallbackAvailable(releaseAfter) }), cancelUrl && (_jsxs(_Fragment, { children: [_jsx(Text, { style: warning, children: s.warning }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: cancelUrl, branding: branding, children: s.button }) })] })), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
59
+ brandName: branding.brandName,
60
+ })] }), cancelUrl && _jsx(LinkFallback, { href: cancelUrl, locale: locale })] }));
61
+ };
62
+ export const getEscrowPinLockedSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
63
+ // ---------------------------------------------------------------------------
64
+ // Styles
65
+ // ---------------------------------------------------------------------------
66
+ const heading = {
67
+ fontSize: 24,
68
+ fontWeight: 600,
69
+ color: '#111827',
70
+ margin: '0 0 24px',
71
+ };
72
+ const paragraph = {
73
+ fontSize: 16,
74
+ color: '#374151',
75
+ lineHeight: '24px',
76
+ margin: '0 0 24px',
77
+ };
78
+ const warning = {
79
+ ...paragraph,
80
+ fontWeight: 600,
81
+ };
82
+ const buttonWrapper = {
83
+ margin: '0 0 24px',
84
+ };
85
+ const signOff = {
86
+ fontSize: 14,
87
+ color: '#374151',
88
+ lineHeight: '20px',
89
+ margin: '24px 0 0',
90
+ };
91
+ // ---------------------------------------------------------------------------
92
+ // Preview
93
+ // ---------------------------------------------------------------------------
94
+ export default function Preview() {
95
+ return (_jsx(EscrowPinLocked, { branding: DEFAULT_BRANDING, lockedAt: "September 25, 2026, 3:00 PM", releaseAfter: "October 2, 2026, 3:00 PM", cancelUrl: "https://learncard.app/recovery/cancel?token=abc123" }));
96
+ }
97
+ //# sourceMappingURL=escrow-pin-locked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-pin-locked.js","sourceRoot":"","sources":["../../src/templates/escrow-pin-locked.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAyBpE,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CACd,+EACiD,2BAAS,QAAQ,GAAU,kCAEzE,CACN;IACD,iBAAiB,EAAE,YAAY,CAAC,EAAE,CAC9B,YAAY,CAAC,CAAC,CAAC,CACX,qGACwE,GAAG,EACvE,2BAAS,YAAY,GAAU,8BAChC,CACN,CAAC,CAAC,CAAC,CACA,gFAAoD,CACvD;IACL,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,uCAAuC;IAC/C,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,qBAAqB;CACjC,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,+BAA+B;IACxC,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CACd,0FAC4D,2BAAS,QAAQ,GAAU,+CAEpF,CACN;IACD,iBAAiB,EAAE,YAAY,CAAC,EAAE,CAC9B,YAAY,CAAC,CAAC,CAAC,CACX,qHAC8E,GAAG,EAC7E,2BAAS,YAAY,GAAU,iCAChC,CACN,CAAC,CAAC,CAAC,CACA,6FAA4D,CAC/D;IACL,OAAO,EAAE,mCAAmC;IAC5C,MAAM,EAAE,wCAAwC;IAChD,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,+BAA+B;CAC3C,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,qCAAqC;IAC9C,OAAO,EAAE,qCAAqC;IAC9C,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CACd,2GAC8E,GAAG,EAC7E,2BAAS,QAAQ,GAAU,6DAC5B,CACN;IACD,iBAAiB,EAAE,YAAY,CAAC,EAAE,CAC9B,YAAY,CAAC,CAAC,CAAC,CACX,8HACiF,GAAG,EAChF,2BAAS,YAAY,GAAU,sCAChC,CACN,CAAC,CAAC,CAAC,CACA,2GAA+D,CAClE;IACL,OAAO,EAAE,sDAAsD;IAC/D,MAAM,EAAE,wDAAwD;IAChE,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,qCAAqC;CACjD,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,iCAAiC;IAC1C,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CACd,oPACiD,2BAAS,QAAQ,GAAU,sGAEzE,CACN;IACD,iBAAiB,EAAE,YAAY,CAAC,EAAE,CAC9B,YAAY,CAAC,CAAC,CAAC,CACX,sSACsD,2BAAS,YAAY,GAAU,uGAElF,CACN,CAAC,CAAC,CAAC,CACA,6OAA4C,CAC/C;IACL,OAAO,EAAE,sCAAsC;IAC/C,MAAM,EAAE,mCAAmC;IAC3C,SAAS,EAAE,aAAa;IACxB,OAAO,EAAE,iCAAiC;CAC7C,CAAC;AAEF,MAAM,OAAO,GAAwC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAExF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC5D,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,MAAM,GACT,EAAE,EAAE;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,OAAO,CACH,MAAC,MAAM,IAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,aAC1D,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,CAAC,CAAC,OAAO,GAAQ,EAExC,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAQ,EAEjD,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,GAAQ,EAEjE,SAAS,IAAI,CACV,8BACI,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,CAAC,CAAC,OAAO,GAAQ,EAExC,KAAC,OAAO,IAAC,KAAK,EAAE,aAAa,YACzB,KAAC,WAAW,IAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,YAC3C,CAAC,CAAC,MAAM,GACC,GACR,IACX,CACN,EAED,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,aACf,CAAC,CAAC,SAAS,EACZ,cAAM,EACL,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE;wBAC7D,SAAS,EAAE,QAAQ,CAAC,SAAS;qBAChC,CAAC,IACC,EAEN,SAAS,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAI,IAC1D,CACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAyB,EAAE,MAAe,EAAU,EAAE,CAC5F,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAElD,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,OAAO,GAAwB;IACjC,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,SAAS,GAAwB;IACnC,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,OAAO,GAAwB;IACjC,GAAG,SAAS;IACZ,UAAU,EAAE,GAAG;CAClB,CAAC;AAEF,MAAM,aAAa,GAAwB;IACvC,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,OAAO,GAAwB;IACjC,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,CAAC,OAAO,UAAU,OAAO;IAC3B,OAAO,CACH,KAAC,eAAe,IACZ,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAC,6BAA6B,EACtC,YAAY,EAAC,0BAA0B,EACvC,SAAS,EAAC,oDAAoD,GAChE,CACL,CAAC;AACN,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * EscrowPinSignIn — tells the account owner that a new device just signed in
3
+ * with their recovery PIN, and links to the in-app "Secure my account" action
4
+ * (which stops other devices and logins from signing in again and turns off the old
5
+ * recovery methods).
6
+ *
7
+ * Used by: lca-api `/keys/escrow/complete` for PIN releases
8
+ * (templateId: 'escrow-pin-sign-in')
9
+ */
10
+ import * as React from 'react';
11
+ import type { TenantBranding } from '../branding';
12
+ export interface EscrowPinSignInProps {
13
+ branding: TenantBranding;
14
+ /** ISO timestamp of the PIN sign-in (formatted per locale), or display text. */
15
+ signedInAt: string;
16
+ /** In-app link to the "Secure my account" action. */
17
+ secureUrl: string;
18
+ /** Recipient locale (BCP-47). Defaults to English. */
19
+ locale?: string;
20
+ }
21
+ export declare const EscrowPinSignIn: React.FC<EscrowPinSignInProps>;
22
+ export declare const getEscrowPinSignInSubject: (_branding: TenantBranding, locale?: string) => string;
23
+ export default function Preview(): React.JSX.Element;
24
+ //# sourceMappingURL=escrow-pin-sign-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-pin-sign-in.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-pin-sign-in.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclD,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AA0ED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoC1D,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MACtC,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAQ9B"}
@@ -0,0 +1,96 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * EscrowPinSignIn — tells the account owner that a new device just signed in
4
+ * with their recovery PIN, and links to the in-app "Secure my account" action
5
+ * (which stops other devices and logins from signing in again and turns off the old
6
+ * recovery methods).
7
+ *
8
+ * Used by: lca-api `/keys/escrow/complete` for PIN releases
9
+ * (templateId: 'escrow-pin-sign-in')
10
+ */
11
+ import { Text, Section } from '@react-email/components';
12
+ import { DEFAULT_BRANDING } from '../branding';
13
+ import { Layout } from '../components/Layout';
14
+ import { EmailButton } from '../components/EmailButton';
15
+ import { LinkFallback } from '../components/LinkFallback';
16
+ import { resolveCatalogLocale, interpolate, SHARED, formatNoticeTimestamp, localeProp, } from '../i18n';
17
+ const EN = {
18
+ preview: 'New device signed in with your PIN',
19
+ heading: 'New Device Signed In With Your PIN',
20
+ body: signedInAt => (_jsxs(_Fragment, { children: ["A new device signed in to your account with your recovery PIN on", ' ', _jsx("strong", { children: signedInAt }), "."] })),
21
+ warning: 'Not you? Secure your account.',
22
+ button: 'Secure my account',
23
+ sincerely: 'Sincerely,',
24
+ subject: 'New device signed in with your PIN',
25
+ };
26
+ const ES = {
27
+ preview: 'Un dispositivo nuevo inició sesión con tu PIN',
28
+ heading: 'Un Dispositivo Nuevo Inició Sesión con tu PIN',
29
+ body: signedInAt => (_jsxs(_Fragment, { children: ["Un dispositivo nuevo inici\u00F3 sesi\u00F3n en tu cuenta con tu PIN de recuperaci\u00F3n el", ' ', _jsx("strong", { children: signedInAt }), "."] })),
30
+ warning: '¿No fuiste tú? Protege tu cuenta.',
31
+ button: 'Proteger mi cuenta',
32
+ sincerely: 'Atentamente,',
33
+ subject: 'Un dispositivo nuevo inició sesión con tu PIN',
34
+ };
35
+ const FR = {
36
+ preview: 'Un nouvel appareil s’est connecté avec votre code PIN',
37
+ heading: 'Un Nouvel Appareil S’est Connecté avec Votre Code PIN',
38
+ body: signedInAt => (_jsxs(_Fragment, { children: ["Un nouvel appareil s\u2019est connect\u00E9 \u00E0 votre compte avec votre code PIN de r\u00E9cup\u00E9ration le", ' ', _jsx("strong", { children: signedInAt }), "."] })),
39
+ warning: 'Ce n’était pas vous ? Sécurisez votre compte.',
40
+ button: 'Sécuriser mon compte',
41
+ sincerely: 'Cordialement,',
42
+ subject: 'Un nouvel appareil s’est connecté avec votre code PIN',
43
+ };
44
+ const AR = {
45
+ preview: 'تم تسجيل الدخول من جهاز جديد باستخدام رمز PIN الخاص بك',
46
+ heading: 'تم تسجيل الدخول من جهاز جديد باستخدام رمز PIN الخاص بك',
47
+ body: signedInAt => (_jsxs(_Fragment, { children: ["\u0633\u062C\u0651\u0644 \u062C\u0647\u0627\u0632 \u062C\u062F\u064A\u062F \u0627\u0644\u062F\u062E\u0648\u0644 \u0625\u0644\u0649 \u062D\u0633\u0627\u0628\u0643 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0631\u0645\u0632 PIN \u0627\u0644\u062E\u0627\u0635 \u0628\u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0641\u064A", ' ', _jsx("strong", { children: signedInAt }), "."] })),
48
+ warning: 'لم يكن أنت؟ أمّن حسابك.',
49
+ button: 'تأمين حسابي',
50
+ sincerely: 'مع التحيات،',
51
+ subject: 'تم تسجيل الدخول من جهاز جديد باستخدام رمز PIN الخاص بك',
52
+ };
53
+ const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
54
+ export const EscrowPinSignIn = ({ branding, signedInAt, secureUrl, locale, }) => {
55
+ const catalogLocale = resolveCatalogLocale(locale);
56
+ const s = STRINGS[catalogLocale];
57
+ return (_jsxs(Layout, { branding: branding, preview: s.preview, ...localeProp(locale), children: [_jsx(Text, { style: heading, children: s.heading }), _jsx(Text, { style: paragraph, children: s.body(formatNoticeTimestamp(signedInAt, catalogLocale)) }), _jsx(Text, { style: warning, children: s.warning }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: secureUrl, branding: branding, children: s.button }) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[catalogLocale].teamSignature, {
58
+ brandName: branding.brandName,
59
+ })] }), _jsx(LinkFallback, { href: secureUrl, ...localeProp(locale) })] }));
60
+ };
61
+ export const getEscrowPinSignInSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
62
+ // ---------------------------------------------------------------------------
63
+ // Styles
64
+ // ---------------------------------------------------------------------------
65
+ const heading = {
66
+ fontSize: 24,
67
+ fontWeight: 600,
68
+ color: '#111827',
69
+ margin: '0 0 24px',
70
+ };
71
+ const paragraph = {
72
+ fontSize: 16,
73
+ color: '#374151',
74
+ lineHeight: '24px',
75
+ margin: '0 0 24px',
76
+ };
77
+ const warning = {
78
+ ...paragraph,
79
+ fontWeight: 600,
80
+ };
81
+ const buttonWrapper = {
82
+ margin: '0 0 24px',
83
+ };
84
+ const signOff = {
85
+ fontSize: 14,
86
+ color: '#374151',
87
+ lineHeight: '20px',
88
+ margin: '24px 0 0',
89
+ };
90
+ // ---------------------------------------------------------------------------
91
+ // Preview
92
+ // ---------------------------------------------------------------------------
93
+ export default function Preview() {
94
+ return (_jsx(EscrowPinSignIn, { branding: DEFAULT_BRANDING, signedInAt: "October 2, 2026, 3:00 PM", secureUrl: "https://learncard.app/account/secure" }));
95
+ }
96
+ //# sourceMappingURL=escrow-pin-sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-pin-sign-in.js","sourceRoot":"","sources":["../../src/templates/escrow-pin-sign-in.tsx"],"names":[],"mappings":"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"}
@@ -1,29 +1,22 @@
1
- export { VerificationCode, getVerificationCodeSubject } from './verification-code';
2
- export type { VerificationCodeProps, VerificationCodeVariant } from './verification-code';
3
- export { InboxClaim, getInboxClaimSubject } from './inbox-claim';
4
- export type { InboxClaimProps } from './inbox-claim';
5
- export { GuardianApproval, getGuardianApprovalSubject } from './guardian-approval';
6
- export type { GuardianApprovalProps } from './guardian-approval';
7
- export { AccountApproved, getAccountApprovedSubject } from './account-approved';
8
- export type { AccountApprovedProps } from './account-approved';
9
- export { RecoveryKey, getRecoveryKeySubject } from './recovery-key';
10
- export type { RecoveryKeyProps } from './recovery-key';
11
- export { EndorsementRequest, getEndorsementRequestSubject } from './endorsement-request';
12
- export type { EndorsementRequestProps } from './endorsement-request';
13
- export { CredentialAwaitingGuardian, getCredentialAwaitingGuardianSubject, } from './credential-awaiting-guardian';
14
- export type { CredentialAwaitingGuardianProps } from './credential-awaiting-guardian';
15
- export { GuardianApprovedClaim, getGuardianApprovedClaimSubject } from './guardian-approved-claim';
16
- export type { GuardianApprovedClaimProps } from './guardian-approved-claim';
17
- export { GuardianCredentialApproval, getGuardianCredentialApprovalSubject, } from './guardian-credential-approval';
18
- export type { GuardianCredentialApprovalProps } from './guardian-credential-approval';
19
- export { GuardianEmailOtp, getGuardianEmailOtpSubject } from './guardian-email-otp';
20
- export type { GuardianEmailOtpProps } from './guardian-email-otp';
21
- export { GuardianRejectedCredential, getGuardianRejectedCredentialSubject, } from './guardian-rejected-credential';
22
- export type { GuardianRejectedCredentialProps } from './guardian-rejected-credential';
23
- export { EmailVerification, getEmailVerificationSubject } from './email-verification';
24
- export type { EmailVerificationProps } from './email-verification';
25
- export { CredentialUpdated, getCredentialUpdatedSubject } from './credential-updated';
26
- export type { CredentialUpdatedProps } from './credential-updated';
27
- export { AccountSignInChanged, getAccountSignInChangedSubject } from './account-sign-in-changed';
28
- export type { AccountSignInChangedProps } from './account-sign-in-changed';
1
+ export { VerificationCode, getVerificationCodeSubject, type VerificationCodeProps, type VerificationCodeVariant, } from './verification-code';
2
+ export { InboxClaim, getInboxClaimSubject, type InboxClaimProps } from './inbox-claim';
3
+ export { GuardianApproval, getGuardianApprovalSubject, type GuardianApprovalProps, } from './guardian-approval';
4
+ export { AccountApproved, getAccountApprovedSubject, type AccountApprovedProps, } from './account-approved';
5
+ export { RecoveryKey, getRecoveryKeySubject, type RecoveryKeyProps } from './recovery-key';
6
+ export { EndorsementRequest, getEndorsementRequestSubject, type EndorsementRequestProps, } from './endorsement-request';
7
+ export { CredentialAwaitingGuardian, getCredentialAwaitingGuardianSubject, type CredentialAwaitingGuardianProps, } from './credential-awaiting-guardian';
8
+ export { GuardianApprovedClaim, getGuardianApprovedClaimSubject, type GuardianApprovedClaimProps, } from './guardian-approved-claim';
9
+ export { GuardianCredentialApproval, getGuardianCredentialApprovalSubject, type GuardianCredentialApprovalProps, } from './guardian-credential-approval';
10
+ export { GuardianEmailOtp, getGuardianEmailOtpSubject, type GuardianEmailOtpProps, } from './guardian-email-otp';
11
+ export { GuardianRejectedCredential, getGuardianRejectedCredentialSubject, type GuardianRejectedCredentialProps, } from './guardian-rejected-credential';
12
+ export { EmailVerification, getEmailVerificationSubject, type EmailVerificationProps, } from './email-verification';
13
+ export { CredentialUpdated, getCredentialUpdatedSubject, type CredentialUpdatedProps, } from './credential-updated';
14
+ export { AccountSignInChanged, getAccountSignInChangedSubject, type AccountSignInChangedProps, } from './account-sign-in-changed';
15
+ export { EscrowHoldStarted, getEscrowHoldStartedSubject, type EscrowHoldStartedProps, } from './escrow-hold-started';
16
+ export { EscrowHoldReminder, getEscrowHoldReminderSubject, type EscrowHoldReminderProps, } from './escrow-hold-reminder';
17
+ export { EscrowHoldReleased, getEscrowHoldReleasedSubject, type EscrowHoldReleasedProps, } from './escrow-hold-released';
18
+ export { EscrowHoldCancelled, getEscrowHoldCancelledSubject, type EscrowHoldCancelledProps, type EscrowHoldCancelledReason, } from './escrow-hold-cancelled';
19
+ export { EscrowPinLocked, getEscrowPinLockedSubject, type EscrowPinLockedProps, } from './escrow-pin-locked';
20
+ export { EscrowPinSignIn, getEscrowPinSignInSubject, type EscrowPinSignInProps, } from './escrow-pin-sign-in';
21
+ export { AccountSecured, getAccountSecuredSubject, type AccountSecuredProps, } from './account-secured';
29
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE1F,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEtF,OAAO,EAAE,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AACnG,YAAY,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AAEtF,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACtF,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACtF,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AACjG,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,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"}
@@ -1,15 +1,26 @@
1
- export { VerificationCode, getVerificationCodeSubject } from './verification-code';
1
+ // One export declaration per template module. Projects that resolve this package
2
+ // through its `development` condition (source) typecheck without `jsx`, and TypeScript
3
+ // reports TS6142 once per declaration that imports a .tsx module from this .ts file;
4
+ // a separate `export type` line for the same module would add a second report.
5
+ export { VerificationCode, getVerificationCodeSubject, } from './verification-code';
2
6
  export { InboxClaim, getInboxClaimSubject } from './inbox-claim';
3
- export { GuardianApproval, getGuardianApprovalSubject } from './guardian-approval';
4
- export { AccountApproved, getAccountApprovedSubject } from './account-approved';
7
+ export { GuardianApproval, getGuardianApprovalSubject, } from './guardian-approval';
8
+ export { AccountApproved, getAccountApprovedSubject, } from './account-approved';
5
9
  export { RecoveryKey, getRecoveryKeySubject } from './recovery-key';
6
- export { EndorsementRequest, getEndorsementRequestSubject } from './endorsement-request';
10
+ export { EndorsementRequest, getEndorsementRequestSubject, } from './endorsement-request';
7
11
  export { CredentialAwaitingGuardian, getCredentialAwaitingGuardianSubject, } from './credential-awaiting-guardian';
8
- export { GuardianApprovedClaim, getGuardianApprovedClaimSubject } from './guardian-approved-claim';
12
+ export { GuardianApprovedClaim, getGuardianApprovedClaimSubject, } from './guardian-approved-claim';
9
13
  export { GuardianCredentialApproval, getGuardianCredentialApprovalSubject, } from './guardian-credential-approval';
10
- export { GuardianEmailOtp, getGuardianEmailOtpSubject } from './guardian-email-otp';
14
+ export { GuardianEmailOtp, getGuardianEmailOtpSubject, } from './guardian-email-otp';
11
15
  export { GuardianRejectedCredential, getGuardianRejectedCredentialSubject, } from './guardian-rejected-credential';
12
- export { EmailVerification, getEmailVerificationSubject } from './email-verification';
13
- export { CredentialUpdated, getCredentialUpdatedSubject } from './credential-updated';
14
- export { AccountSignInChanged, getAccountSignInChangedSubject } from './account-sign-in-changed';
16
+ export { EmailVerification, getEmailVerificationSubject, } from './email-verification';
17
+ export { CredentialUpdated, getCredentialUpdatedSubject, } from './credential-updated';
18
+ export { AccountSignInChanged, getAccountSignInChangedSubject, } from './account-sign-in-changed';
19
+ export { EscrowHoldStarted, getEscrowHoldStartedSubject, } from './escrow-hold-started';
20
+ export { EscrowHoldReminder, getEscrowHoldReminderSubject, } from './escrow-hold-reminder';
21
+ export { EscrowHoldReleased, getEscrowHoldReleasedSubject, } from './escrow-hold-released';
22
+ export { EscrowHoldCancelled, getEscrowHoldCancelledSubject, } from './escrow-hold-cancelled';
23
+ export { EscrowPinLocked, getEscrowPinLockedSubject, } from './escrow-pin-locked';
24
+ export { EscrowPinSignIn, getEscrowPinSignInSubject, } from './escrow-pin-sign-in';
25
+ export { AccountSecured, getAccountSecuredSubject, } from './account-secured';
15
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAGzF,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAGnG,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAGpF,OAAO,EACH,0BAA0B,EAC1B,oCAAoC,GACvC,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@learncard/email-templates",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Git-managed, tenant-branded email and SMS templates for LearnCard services",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@react-email/components": "^0.0.36",
22
- "@react-email/render": "^1.0.5",
22
+ "@react-email/render": "^2.2.0",
23
23
  "react": "^18.3.1"
24
24
  },
25
25
  "devDependencies": {
@@ -13,7 +13,7 @@ import { describe, it, expect } from 'vitest';
13
13
  import { renderEmail } from '../render';
14
14
  import { renderSms } from '../sms';
15
15
  import { DEFAULT_BRANDING } from '../branding';
16
- import { resolveCatalogLocale, htmlDir } from '../i18n';
16
+ import { resolveCatalogLocale, htmlDir, localeProp } from '../i18n';
17
17
  import type { NotificationLocale } from '../i18n';
18
18
  import type { TemplateId, TemplateDataMap } from '../render';
19
19
 
@@ -92,6 +92,39 @@ const FIXTURES: { [K in TemplateId]: TemplateDataMap[K] } = {
92
92
  recipient: { email: 'student@example.com' },
93
93
  },
94
94
  'account-sign-in-changed': {},
95
+
96
+ 'escrow-hold-started': {
97
+ requestedAt: 'September 25, 2026, 3:00 PM',
98
+ releaseAfter: 'October 2, 2026, 3:00 PM',
99
+ cancelUrl: 'https://learncard.app/recovery/cancel?token=abc123',
100
+ deviceHint: 'Chrome on Windows',
101
+ },
102
+
103
+ 'escrow-hold-reminder': {
104
+ releaseAfter: 'October 2, 2026, 3:00 PM',
105
+ cancelUrl: 'https://learncard.app/recovery/cancel?token=abc123',
106
+ },
107
+
108
+ 'escrow-hold-released': {
109
+ completedAt: 'October 2, 2026, 3:00 PM',
110
+ supportUrl: 'https://learncard.app/support',
111
+ },
112
+
113
+ 'escrow-hold-cancelled': {
114
+ cancelledAt: 'September 26, 2026, 9:15 AM',
115
+ reason: 'user',
116
+ },
117
+
118
+ 'escrow-pin-locked': {
119
+ lockedAt: 'September 25, 2026, 3:00 PM',
120
+ releaseAfter: 'October 2, 2026, 3:00 PM',
121
+ cancelUrl: 'https://learncard.app/recovery/cancel?token=abc123',
122
+ },
123
+ 'escrow-pin-sign-in': {
124
+ signedInAt: 'October 2, 2026, 3:00 PM',
125
+ secureUrl: 'https://learncard.app/account/secure',
126
+ },
127
+ 'account-secured': { securedAt: 'October 2, 2026, 3:00 PM' },
95
128
  };
96
129
 
97
130
  const ALL_TEMPLATE_IDS = Object.keys(FIXTURES) as TemplateId[];
@@ -132,6 +165,9 @@ describe('i18n — non-EN locales localize content', () => {
132
165
  'guardian-credential-approval',
133
166
  'guardian-email-otp',
134
167
  'credential-awaiting-guardian',
168
+ 'escrow-hold-started',
169
+ 'escrow-hold-cancelled',
170
+ 'account-secured',
135
171
  ];
136
172
 
137
173
  for (const templateId of SAMPLES) {
@@ -333,4 +369,29 @@ describe('i18n — renderSms localizes', () => {
333
369
  expect(es).toContain('Tu código de verificación de LearnCard es:');
334
370
  expect(en).toContain('999222');
335
371
  });
372
+
373
+ it('localeProp omits an absent locale instead of passing undefined', () => {
374
+ expect(localeProp(undefined)).toEqual({});
375
+ expect(localeProp(null)).toEqual({});
376
+ expect('locale' in localeProp(undefined)).toBe(false);
377
+ expect(localeProp('fr')).toEqual({ locale: 'fr' });
378
+ });
379
+
380
+ it('PIN sign-in and account-secured notices are unchanged for EN vs undefined', async () => {
381
+ for (const [id, data] of [
382
+ [
383
+ 'escrow-pin-sign-in',
384
+ {
385
+ signedInAt: 'October 2, 2026',
386
+ secureUrl: 'https://learncard.app/account/secure',
387
+ },
388
+ ],
389
+ ['account-secured', { securedAt: 'October 2, 2026' }],
390
+ ] as const) {
391
+ const en = await renderEmail(id, DEFAULT_BRANDING, data, 'en');
392
+ const none = await renderEmail(id, DEFAULT_BRANDING, data);
393
+ expect(none.html).toBe(en.html);
394
+ expect(none.subject).toBe(en.subject);
395
+ }
396
+ });
336
397
  });