@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.
- package/dist/i18n.d.ts +15 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +31 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/previews/account-secured-scenarios.d.ts +6 -0
- package/dist/previews/account-secured-scenarios.d.ts.map +1 -0
- package/dist/previews/account-secured-scenarios.js +7 -0
- package/dist/previews/account-secured-scenarios.js.map +1 -0
- package/dist/previews/escrow-hold-cancelled-scenarios.d.ts +6 -0
- package/dist/previews/escrow-hold-cancelled-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-hold-cancelled-scenarios.js +7 -0
- package/dist/previews/escrow-hold-cancelled-scenarios.js.map +1 -0
- package/dist/previews/escrow-hold-released-scenarios.d.ts +6 -0
- package/dist/previews/escrow-hold-released-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-hold-released-scenarios.js +7 -0
- package/dist/previews/escrow-hold-released-scenarios.js.map +1 -0
- package/dist/previews/escrow-hold-reminder-scenarios.d.ts +6 -0
- package/dist/previews/escrow-hold-reminder-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-hold-reminder-scenarios.js +7 -0
- package/dist/previews/escrow-hold-reminder-scenarios.js.map +1 -0
- package/dist/previews/escrow-hold-started-scenarios.d.ts +6 -0
- package/dist/previews/escrow-hold-started-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-hold-started-scenarios.js +7 -0
- package/dist/previews/escrow-hold-started-scenarios.js.map +1 -0
- package/dist/previews/escrow-pin-locked-scenarios.d.ts +6 -0
- package/dist/previews/escrow-pin-locked-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-pin-locked-scenarios.js +7 -0
- package/dist/previews/escrow-pin-locked-scenarios.js.map +1 -0
- package/dist/previews/escrow-pin-sign-in-scenarios.d.ts +6 -0
- package/dist/previews/escrow-pin-sign-in-scenarios.d.ts.map +1 -0
- package/dist/previews/escrow-pin-sign-in-scenarios.js +7 -0
- package/dist/previews/escrow-pin-sign-in-scenarios.js.map +1 -0
- package/dist/render.d.ts +45 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +67 -1
- package/dist/render.js.map +1 -1
- package/dist/templates/account-secured.d.ts +27 -0
- package/dist/templates/account-secured.d.ts.map +1 -0
- package/dist/templates/account-secured.js +118 -0
- package/dist/templates/account-secured.js.map +1 -0
- package/dist/templates/escrow-hold-cancelled.d.ts +23 -0
- package/dist/templates/escrow-hold-cancelled.d.ts.map +1 -0
- package/dist/templates/escrow-hold-cancelled.js +131 -0
- package/dist/templates/escrow-hold-cancelled.js.map +1 -0
- package/dist/templates/escrow-hold-released.d.ts +21 -0
- package/dist/templates/escrow-hold-released.d.ts.map +1 -0
- package/dist/templates/escrow-hold-released.js +92 -0
- package/dist/templates/escrow-hold-released.js.map +1 -0
- package/dist/templates/escrow-hold-reminder.d.ts +21 -0
- package/dist/templates/escrow-hold-reminder.d.ts.map +1 -0
- package/dist/templates/escrow-hold-reminder.js +92 -0
- package/dist/templates/escrow-hold-reminder.js.map +1 -0
- package/dist/templates/escrow-hold-started.d.ts +25 -0
- package/dist/templates/escrow-hold-started.d.ts.map +1 -0
- package/dist/templates/escrow-hold-started.js +96 -0
- package/dist/templates/escrow-hold-started.js.map +1 -0
- package/dist/templates/escrow-pin-locked.d.ts +24 -0
- package/dist/templates/escrow-pin-locked.d.ts.map +1 -0
- package/dist/templates/escrow-pin-locked.js +97 -0
- package/dist/templates/escrow-pin-locked.js.map +1 -0
- package/dist/templates/escrow-pin-sign-in.d.ts +24 -0
- package/dist/templates/escrow-pin-sign-in.d.ts.map +1 -0
- package/dist/templates/escrow-pin-sign-in.js +96 -0
- package/dist/templates/escrow-pin-sign-in.js.map +1 -0
- package/dist/templates/index.d.ts +21 -28
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +20 -9
- package/dist/templates/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/i18n.test.ts +62 -1
- package/src/__tests__/render.test.ts +306 -0
- package/src/i18n.ts +33 -0
- package/src/index.ts +8 -0
- package/src/previews/account-secured-scenarios.tsx +41 -0
- package/src/previews/escrow-hold-cancelled-scenarios.tsx +79 -0
- package/src/previews/escrow-hold-released-scenarios.tsx +58 -0
- package/src/previews/escrow-hold-reminder-scenarios.tsx +52 -0
- package/src/previews/escrow-hold-started-scenarios.tsx +67 -0
- package/src/previews/escrow-pin-locked-scenarios.tsx +60 -0
- package/src/previews/escrow-pin-sign-in-scenarios.tsx +52 -0
- package/src/render.ts +162 -0
- package/src/templates/account-secured.tsx +236 -0
- package/src/templates/escrow-hold-cancelled.tsx +212 -0
- package/src/templates/escrow-hold-released.tsx +184 -0
- package/src/templates/escrow-hold-reminder.tsx +184 -0
- package/src/templates/escrow-hold-started.tsx +216 -0
- package/src/templates/escrow-pin-locked.tsx +233 -0
- package/src/templates/escrow-pin-sign-in.tsx +197 -0
- package/src/templates/index.ts +100 -25
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* AccountSecured — tells the account owner that "Secure my account" ran: every other
|
|
4
|
+
* device and login was signed out and the recovery methods have to be set up again.
|
|
5
|
+
*
|
|
6
|
+
* The recipient may be an owner who did NOT do this (someone with their login and
|
|
7
|
+
* PIN ran it first) and whose own login was unlinked. So the copy never relies on the
|
|
8
|
+
* in-app "Secure my account" link. It also does not offer the app's lost-login path
|
|
9
|
+
* as the way back: the revoke itself returned every recovery method to pending and
|
|
10
|
+
* removed automatic recovery, so that path usually has nothing left to use. It sends
|
|
11
|
+
* the owner to the tenant's support address, or, when the tenant has none, to the
|
|
12
|
+
* organization that gave them access (no address is made up).
|
|
13
|
+
*
|
|
14
|
+
* Used by: lca-api `POST /keys/revoke-other-devices` (templateId: 'account-secured')
|
|
15
|
+
*/
|
|
16
|
+
import { Text, Section } from '@react-email/components';
|
|
17
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
18
|
+
import { Layout } from '../components/Layout';
|
|
19
|
+
import { EmailButton } from '../components/EmailButton';
|
|
20
|
+
import { LinkFallback } from '../components/LinkFallback';
|
|
21
|
+
import { resolveCatalogLocale, interpolate, SHARED, formatNoticeTimestamp, localeProp, } from '../i18n';
|
|
22
|
+
const EN = {
|
|
23
|
+
preview: 'Other devices were signed out of your account',
|
|
24
|
+
heading: 'Your Account Was Secured',
|
|
25
|
+
body: (securedAt, brandName) => (_jsxs(_Fragment, { children: ["On ", _jsx("strong", { children: securedAt }), ", someone signed in to your ", brandName, " account signed out every other device and login. The account\u2019s recovery methods now need to be set up again."] })),
|
|
26
|
+
ifYou: 'If this was you, there is nothing else to do here. Finish setting up your recovery methods in the app.',
|
|
27
|
+
notYouWarning: 'If this wasn’t you, someone else may have access to your account, and your own sign-in may have been removed.',
|
|
28
|
+
resetWarning: 'Securing the account also reset its recovery methods, so your recovery phrase, backup, passkey or recovery PIN may no longer get you back in.',
|
|
29
|
+
support: 'Contact {supportEmail} right away for help getting back into your account.',
|
|
30
|
+
supportFallback: 'Contact the organization that gave you access to {brandName} right away for help getting back into your account.',
|
|
31
|
+
button: 'Open {brandName}',
|
|
32
|
+
sincerely: 'Sincerely,',
|
|
33
|
+
subject: 'Other devices were signed out of your account',
|
|
34
|
+
};
|
|
35
|
+
const ES = {
|
|
36
|
+
preview: 'Se cerró la sesión de otros dispositivos en tu cuenta',
|
|
37
|
+
heading: 'Tu Cuenta Fue Protegida',
|
|
38
|
+
body: (securedAt, brandName) => (_jsxs(_Fragment, { children: ["El ", _jsx("strong", { children: securedAt }), ", alguien con sesi\u00F3n iniciada en tu cuenta de ", brandName, ' ', "cerr\u00F3 la sesi\u00F3n de todos los dem\u00E1s dispositivos e inicios de sesi\u00F3n. Ahora hay que volver a configurar los m\u00E9todos de recuperaci\u00F3n de la cuenta."] })),
|
|
39
|
+
ifYou: 'Si fuiste tú, no tienes que hacer nada más aquí. Termina de configurar tus métodos de recuperación en la aplicación.',
|
|
40
|
+
notYouWarning: 'Si no fuiste tú, es posible que otra persona tenga acceso a tu cuenta y que se haya eliminado tu propio inicio de sesión.',
|
|
41
|
+
resetWarning: 'Al proteger la cuenta también se restablecieron sus métodos de recuperación, así que es posible que tu frase de recuperación, copia de seguridad, llave de acceso o PIN de recuperación ya no te permitan volver a entrar.',
|
|
42
|
+
support: 'Escribe cuanto antes a {supportEmail} para que te ayuden a recuperar el acceso a tu cuenta.',
|
|
43
|
+
supportFallback: 'Comunícate cuanto antes con la organización que te dio acceso a {brandName} para que te ayuden a recuperar el acceso a tu cuenta.',
|
|
44
|
+
button: 'Abrir {brandName}',
|
|
45
|
+
sincerely: 'Atentamente,',
|
|
46
|
+
subject: 'Se cerró la sesión de otros dispositivos en tu cuenta',
|
|
47
|
+
};
|
|
48
|
+
const FR = {
|
|
49
|
+
preview: 'Les autres appareils ont été déconnectés de votre compte',
|
|
50
|
+
heading: 'Votre Compte a Été Sécurisé',
|
|
51
|
+
body: (securedAt, brandName) => (_jsxs(_Fragment, { children: ["Le ", _jsx("strong", { children: securedAt }), ", une personne connect\u00E9e \u00E0 votre compte ", brandName, " a d\u00E9connect\u00E9 tous les autres appareils et connexions. Les m\u00E9thodes de r\u00E9cup\u00E9ration du compte doivent maintenant \u00EAtre configur\u00E9es \u00E0 nouveau."] })),
|
|
52
|
+
ifYou: 'Si c’était vous, vous n’avez rien d’autre à faire ici. Terminez la configuration de vos méthodes de récupération dans l’application.',
|
|
53
|
+
notYouWarning: 'Si ce n’était pas vous, quelqu’un d’autre a peut-être accès à votre compte, et votre propre connexion a peut-être été supprimée.',
|
|
54
|
+
resetWarning: 'La sécurisation du compte a aussi réinitialisé ses méthodes de récupération : votre phrase de récupération, votre sauvegarde, votre clé d’accès ou votre code PIN de récupération ne vous permettront peut-être plus de vous reconnecter.',
|
|
55
|
+
support: 'Écrivez sans attendre à {supportEmail} pour obtenir de l’aide afin de récupérer l’accès à votre compte.',
|
|
56
|
+
supportFallback: 'Contactez sans attendre l’organisation qui vous a donné accès à {brandName} pour obtenir de l’aide afin de récupérer l’accès à votre compte.',
|
|
57
|
+
button: 'Ouvrir {brandName}',
|
|
58
|
+
sincerely: 'Cordialement,',
|
|
59
|
+
subject: 'Les autres appareils ont été déconnectés de votre compte',
|
|
60
|
+
};
|
|
61
|
+
const AR = {
|
|
62
|
+
preview: 'تم تسجيل خروج الأجهزة الأخرى من حسابك',
|
|
63
|
+
heading: 'تم تأمين حسابك',
|
|
64
|
+
body: (securedAt, brandName) => (_jsxs(_Fragment, { children: ["\u0641\u064A ", _jsx("strong", { children: securedAt }), "\u060C \u0642\u0627\u0645 \u0634\u062E\u0635 \u0645\u0633\u062C\u0651\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0625\u0644\u0649 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A ", brandName, " \u0628\u062A\u0633\u062C\u064A\u0644 \u062E\u0631\u0648\u062C \u062C\u0645\u064A\u0639 \u0627\u0644\u0623\u062C\u0647\u0632\u0629 \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0627\u0644\u0623\u062E\u0631\u0649. \u064A\u062C\u0628 \u0627\u0644\u0622\u0646 \u0625\u0639\u062F\u0627\u062F \u0637\u0631\u0642 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u062D\u0633\u0627\u0628 \u0645\u0646 \u062C\u062F\u064A\u062F."] })),
|
|
65
|
+
ifYou: 'إذا كنت أنت، فلا داعي لفعل أي شيء آخر هنا. أكمل إعداد طرق الاستعادة في التطبيق.',
|
|
66
|
+
notYouWarning: 'إذا لم تكن أنت، فقد يكون لدى شخص آخر حق الوصول إلى حسابك، وربما تمت إزالة تسجيل الدخول الخاص بك.',
|
|
67
|
+
resetWarning: 'أدى تأمين الحساب أيضًا إلى إعادة تعيين طرق استعادته، لذلك قد لا تتمكن بعد الآن من العودة إلى حسابك باستخدام عبارة الاستعادة أو النسخة الاحتياطية أو مفتاح المرور أو رمز PIN للاستعادة.',
|
|
68
|
+
support: 'راسل {supportEmail} فورًا للحصول على مساعدة في استعادة الوصول إلى حسابك.',
|
|
69
|
+
supportFallback: 'تواصل فورًا مع الجهة التي منحتك الوصول إلى {brandName} للحصول على مساعدة في استعادة الوصول إلى حسابك.',
|
|
70
|
+
button: 'فتح {brandName}',
|
|
71
|
+
sincerely: 'مع التحيات،',
|
|
72
|
+
subject: 'تم تسجيل خروج الأجهزة الأخرى من حسابك',
|
|
73
|
+
};
|
|
74
|
+
const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
|
|
75
|
+
export const AccountSecured = ({ branding, securedAt, locale }) => {
|
|
76
|
+
const catalogLocale = resolveCatalogLocale(locale);
|
|
77
|
+
const s = STRINGS[catalogLocale];
|
|
78
|
+
const { brandName, supportEmail, appUrl } = branding;
|
|
79
|
+
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(securedAt, catalogLocale), brandName) }), _jsx(Text, { style: paragraph, children: s.ifYou }), _jsx(Text, { style: warning, children: s.notYouWarning }), _jsx(Text, { style: paragraph, children: s.resetWarning }), _jsx(Text, { style: paragraph, children: supportEmail
|
|
80
|
+
? interpolate(s.support, { supportEmail })
|
|
81
|
+
: interpolate(s.supportFallback, { brandName }) }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: appUrl, branding: branding, children: interpolate(s.button, { brandName }) }) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[catalogLocale].teamSignature, { brandName })] }), _jsx(LinkFallback, { href: appUrl, ...localeProp(locale) })] }));
|
|
82
|
+
};
|
|
83
|
+
export const getAccountSecuredSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Styles
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
const heading = {
|
|
88
|
+
fontSize: 24,
|
|
89
|
+
fontWeight: 600,
|
|
90
|
+
color: '#111827',
|
|
91
|
+
margin: '0 0 24px',
|
|
92
|
+
};
|
|
93
|
+
const paragraph = {
|
|
94
|
+
fontSize: 16,
|
|
95
|
+
color: '#374151',
|
|
96
|
+
lineHeight: '24px',
|
|
97
|
+
margin: '0 0 24px',
|
|
98
|
+
};
|
|
99
|
+
const warning = {
|
|
100
|
+
...paragraph,
|
|
101
|
+
fontWeight: 600,
|
|
102
|
+
};
|
|
103
|
+
const buttonWrapper = {
|
|
104
|
+
margin: '0 0 24px',
|
|
105
|
+
};
|
|
106
|
+
const signOff = {
|
|
107
|
+
fontSize: 14,
|
|
108
|
+
color: '#374151',
|
|
109
|
+
lineHeight: '20px',
|
|
110
|
+
margin: '24px 0 0',
|
|
111
|
+
};
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Preview
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
export default function Preview() {
|
|
116
|
+
return _jsx(AccountSecured, { branding: DEFAULT_BRANDING, securedAt: "October 2, 2026, 3:00 PM" });
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=account-secured.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-secured.js","sourceRoot":"","sources":["../../src/templates/account-secured.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscrowHoldCancelled — confirms that a pending account recovery request was
|
|
3
|
+
* cancelled and no further action will be taken.
|
|
4
|
+
*
|
|
5
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-cancelled')
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import type { TenantBranding } from '../branding';
|
|
9
|
+
/** Why the pending recovery request was cancelled. */
|
|
10
|
+
export type EscrowHoldCancelledReason = 'user' | 'superseded' | 'pin-locked' | 'release-failed';
|
|
11
|
+
export interface EscrowHoldCancelledProps {
|
|
12
|
+
branding: TenantBranding;
|
|
13
|
+
/** Human-readable timestamp the request was cancelled. */
|
|
14
|
+
cancelledAt: string;
|
|
15
|
+
/** Why the request was cancelled. Omit for a generic message. */
|
|
16
|
+
reason?: EscrowHoldCancelledReason;
|
|
17
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
18
|
+
locale?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const EscrowHoldCancelled: React.FC<EscrowHoldCancelledProps>;
|
|
21
|
+
export declare const getEscrowHoldCancelledSubject: (_branding: TenantBranding, locale?: string) => string;
|
|
22
|
+
export default function Preview(): React.JSX.Element;
|
|
23
|
+
//# sourceMappingURL=escrow-hold-cancelled.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-cancelled.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-hold-cancelled.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,sDAAsD;AACtD,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACrC,QAAQ,EAAE,cAAc,CAAC;IACzB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAqHD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAyBlE,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MAC1C,CAAC;AA+BlD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAQ9B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EscrowHoldCancelled — confirms that a pending account recovery request was
|
|
4
|
+
* cancelled and no further action will be taken.
|
|
5
|
+
*
|
|
6
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-cancelled')
|
|
7
|
+
*/
|
|
8
|
+
import { Text } from '@react-email/components';
|
|
9
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
10
|
+
import { Layout } from '../components/Layout';
|
|
11
|
+
import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
|
|
12
|
+
const EN = {
|
|
13
|
+
preview: 'Your recovery request was cancelled',
|
|
14
|
+
heading: 'Recovery Request Cancelled',
|
|
15
|
+
body: cancelledAt => (_jsxs(_Fragment, { children: ["Your account recovery request was cancelled on ", _jsx("strong", { children: cancelledAt }), "."] })),
|
|
16
|
+
reasonText: reason => {
|
|
17
|
+
switch (reason) {
|
|
18
|
+
case 'user':
|
|
19
|
+
return 'You cancelled this request. No further action is needed.';
|
|
20
|
+
case 'superseded':
|
|
21
|
+
return 'A newer recovery request replaced this one.';
|
|
22
|
+
case 'pin-locked':
|
|
23
|
+
return 'This request was cancelled after too many incorrect PIN attempts.';
|
|
24
|
+
case 'release-failed':
|
|
25
|
+
return 'This request could not be completed and was cancelled automatically.';
|
|
26
|
+
default:
|
|
27
|
+
return 'No further action is needed.';
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
sincerely: 'Sincerely,',
|
|
31
|
+
subject: 'Recovery request cancelled',
|
|
32
|
+
};
|
|
33
|
+
const ES = {
|
|
34
|
+
preview: 'Se canceló tu solicitud de recuperación',
|
|
35
|
+
heading: 'Solicitud de Recuperación Cancelada',
|
|
36
|
+
body: cancelledAt => (_jsxs(_Fragment, { children: ["Tu solicitud de recuperaci\u00F3n de cuenta se cancel\u00F3 el ", _jsx("strong", { children: cancelledAt }), "."] })),
|
|
37
|
+
reasonText: reason => {
|
|
38
|
+
switch (reason) {
|
|
39
|
+
case 'user':
|
|
40
|
+
return 'Cancelaste esta solicitud. No se requiere ninguna otra acción.';
|
|
41
|
+
case 'superseded':
|
|
42
|
+
return 'Una solicitud de recuperación más reciente reemplazó a esta.';
|
|
43
|
+
case 'pin-locked':
|
|
44
|
+
return 'Esta solicitud se canceló tras demasiados intentos incorrectos de PIN.';
|
|
45
|
+
case 'release-failed':
|
|
46
|
+
return 'Esta solicitud no pudo completarse y se canceló automáticamente.';
|
|
47
|
+
default:
|
|
48
|
+
return 'No se requiere ninguna otra acción.';
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
sincerely: 'Atentamente,',
|
|
52
|
+
subject: 'Solicitud de recuperación cancelada',
|
|
53
|
+
};
|
|
54
|
+
const FR = {
|
|
55
|
+
preview: 'Votre demande de récupération a été annulée',
|
|
56
|
+
heading: 'Demande de Récupération Annulée',
|
|
57
|
+
body: cancelledAt => (_jsxs(_Fragment, { children: ["Votre demande de r\u00E9cup\u00E9ration de compte a \u00E9t\u00E9 annul\u00E9e le ", _jsx("strong", { children: cancelledAt }), "."] })),
|
|
58
|
+
reasonText: reason => {
|
|
59
|
+
switch (reason) {
|
|
60
|
+
case 'user':
|
|
61
|
+
return 'Vous avez annulé cette demande. Aucune autre action n\u2019est nécessaire.';
|
|
62
|
+
case 'superseded':
|
|
63
|
+
return 'Une demande de récupération plus récente a remplacé celle-ci.';
|
|
64
|
+
case 'pin-locked':
|
|
65
|
+
return 'Cette demande a été annulée après trop de tentatives de code PIN incorrectes.';
|
|
66
|
+
case 'release-failed':
|
|
67
|
+
return 'Cette demande n\u2019a pas pu aboutir et a été annulée automatiquement.';
|
|
68
|
+
default:
|
|
69
|
+
return 'Aucune autre action n\u2019est nécessaire.';
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
sincerely: 'Cordialement,',
|
|
73
|
+
subject: 'Demande de récupération annulée',
|
|
74
|
+
};
|
|
75
|
+
const AR = {
|
|
76
|
+
preview: 'تم إلغاء طلب الاستعادة الخاص بك',
|
|
77
|
+
heading: 'تم إلغاء طلب الاستعادة',
|
|
78
|
+
body: cancelledAt => (_jsxs(_Fragment, { children: ["\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0637\u0644\u0628 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A ", _jsx("strong", { children: cancelledAt }), "."] })),
|
|
79
|
+
reasonText: reason => {
|
|
80
|
+
switch (reason) {
|
|
81
|
+
case 'user':
|
|
82
|
+
return 'لقد ألغيت هذا الطلب. لا حاجة لأي إجراء آخر.';
|
|
83
|
+
case 'superseded':
|
|
84
|
+
return 'حلّ طلب استعادة أحدث محل هذا الطلب.';
|
|
85
|
+
case 'pin-locked':
|
|
86
|
+
return 'تم إلغاء هذا الطلب بعد عدة محاولات خاطئة لإدخال رمز PIN.';
|
|
87
|
+
case 'release-failed':
|
|
88
|
+
return 'تعذّر إكمال هذا الطلب وتم إلغاؤه تلقائيًا.';
|
|
89
|
+
default:
|
|
90
|
+
return 'لا حاجة لأي إجراء آخر.';
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
sincerely: 'مع التحيات،',
|
|
94
|
+
subject: 'تم إلغاء طلب الاستعادة',
|
|
95
|
+
};
|
|
96
|
+
const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
|
|
97
|
+
export const EscrowHoldCancelled = ({ branding, cancelledAt, reason, locale, }) => {
|
|
98
|
+
const s = STRINGS[resolveCatalogLocale(locale)];
|
|
99
|
+
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(cancelledAt) }), _jsx(Text, { style: paragraph, children: s.reasonText(reason) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
100
|
+
brandName: branding.brandName,
|
|
101
|
+
})] })] }));
|
|
102
|
+
};
|
|
103
|
+
export const getEscrowHoldCancelledSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// Styles
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
const heading = {
|
|
108
|
+
fontSize: 24,
|
|
109
|
+
fontWeight: 600,
|
|
110
|
+
color: '#111827',
|
|
111
|
+
margin: '0 0 24px',
|
|
112
|
+
};
|
|
113
|
+
const paragraph = {
|
|
114
|
+
fontSize: 16,
|
|
115
|
+
color: '#374151',
|
|
116
|
+
lineHeight: '24px',
|
|
117
|
+
margin: '0 0 24px',
|
|
118
|
+
};
|
|
119
|
+
const signOff = {
|
|
120
|
+
fontSize: 14,
|
|
121
|
+
color: '#374151',
|
|
122
|
+
lineHeight: '20px',
|
|
123
|
+
margin: '24px 0 0',
|
|
124
|
+
};
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Preview
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
export default function Preview() {
|
|
129
|
+
return (_jsx(EscrowHoldCancelled, { branding: DEFAULT_BRANDING, cancelledAt: "September 26, 2026, 9:15 AM", reason: "user" }));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=escrow-hold-cancelled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-cancelled.js","sourceRoot":"","sources":["../../src/templates/escrow-hold-cancelled.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscrowHoldReleased — confirms that a previously requested account recovery
|
|
3
|
+
* has completed and access has been restored.
|
|
4
|
+
*
|
|
5
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-released')
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import type { TenantBranding } from '../branding';
|
|
9
|
+
export interface EscrowHoldReleasedProps {
|
|
10
|
+
branding: TenantBranding;
|
|
11
|
+
/** Human-readable timestamp access was restored. */
|
|
12
|
+
completedAt: string;
|
|
13
|
+
/** Optional support link shown as a CTA (falls back to the footer's mailto link). */
|
|
14
|
+
supportUrl?: string;
|
|
15
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
16
|
+
locale?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const EscrowHoldReleased: React.FC<EscrowHoldReleasedProps>;
|
|
19
|
+
export declare const getEscrowHoldReleasedSubject: (_branding: TenantBranding, locale?: string) => string;
|
|
20
|
+
export default function Preview(): React.JSX.Element;
|
|
21
|
+
//# sourceMappingURL=escrow-hold-released.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-released.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-hold-released.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAuED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmChE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MACzC,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAQ9B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EscrowHoldReleased — confirms that a previously requested account recovery
|
|
4
|
+
* has completed and access has been restored.
|
|
5
|
+
*
|
|
6
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-released')
|
|
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: 'Your account was recovered',
|
|
16
|
+
heading: 'Your Account Was Recovered',
|
|
17
|
+
body: completedAt => (_jsxs(_Fragment, { children: ["Access to your account was restored on ", _jsx("strong", { children: completedAt }), "."] })),
|
|
18
|
+
warning: "If this wasn't you, contact support immediately.",
|
|
19
|
+
button: 'Contact Support',
|
|
20
|
+
sincerely: 'Sincerely,',
|
|
21
|
+
subject: 'Your account was recovered',
|
|
22
|
+
};
|
|
23
|
+
const ES = {
|
|
24
|
+
preview: 'Tu cuenta fue recuperada',
|
|
25
|
+
heading: 'Tu Cuenta Fue Recuperada',
|
|
26
|
+
body: completedAt => (_jsxs(_Fragment, { children: ["Se restableci\u00F3 el acceso a tu cuenta el ", _jsx("strong", { children: completedAt }), "."] })),
|
|
27
|
+
warning: 'Si no fuiste tú, comunícate con soporte de inmediato.',
|
|
28
|
+
button: 'Contactar con soporte',
|
|
29
|
+
sincerely: 'Atentamente,',
|
|
30
|
+
subject: 'Tu cuenta fue recuperada',
|
|
31
|
+
};
|
|
32
|
+
const FR = {
|
|
33
|
+
preview: 'Votre compte a été récupéré',
|
|
34
|
+
heading: 'Votre Compte a Été Récupéré',
|
|
35
|
+
body: completedAt => (_jsxs(_Fragment, { children: ["L\\u2019acc\u00E8s \u00E0 votre compte a \u00E9t\u00E9 r\u00E9tabli le ", _jsx("strong", { children: completedAt }), "."] })),
|
|
36
|
+
warning: 'Si vous n\u2019êtes pas à l\u2019origine de cette action, contactez immédiatement l\u2019assistance.',
|
|
37
|
+
button: 'Contacter le support',
|
|
38
|
+
sincerely: 'Cordialement,',
|
|
39
|
+
subject: 'Votre compte a été récupéré',
|
|
40
|
+
};
|
|
41
|
+
const AR = {
|
|
42
|
+
preview: 'تمت استعادة حسابك',
|
|
43
|
+
heading: 'تمت استعادة حسابك',
|
|
44
|
+
body: completedAt => (_jsxs(_Fragment, { children: ["\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A ", _jsx("strong", { children: completedAt }), "."] })),
|
|
45
|
+
warning: 'إذا لم يكن هذا أنت، فتواصل مع الدعم فورًا.',
|
|
46
|
+
button: 'تواصل مع الدعم',
|
|
47
|
+
sincerely: 'مع التحيات،',
|
|
48
|
+
subject: 'تمت استعادة حسابك',
|
|
49
|
+
};
|
|
50
|
+
const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
|
|
51
|
+
export const EscrowHoldReleased = ({ branding, completedAt, supportUrl, locale, }) => {
|
|
52
|
+
const s = STRINGS[resolveCatalogLocale(locale)];
|
|
53
|
+
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(completedAt) }), _jsx(Text, { style: warning, children: s.warning }), supportUrl && (_jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: supportUrl, branding: branding, children: s.button }) })), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
54
|
+
brandName: branding.brandName,
|
|
55
|
+
})] }), supportUrl && _jsx(LinkFallback, { href: supportUrl, locale: locale })] }));
|
|
56
|
+
};
|
|
57
|
+
export const getEscrowHoldReleasedSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Styles
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
const heading = {
|
|
62
|
+
fontSize: 24,
|
|
63
|
+
fontWeight: 600,
|
|
64
|
+
color: '#111827',
|
|
65
|
+
margin: '0 0 24px',
|
|
66
|
+
};
|
|
67
|
+
const paragraph = {
|
|
68
|
+
fontSize: 16,
|
|
69
|
+
color: '#374151',
|
|
70
|
+
lineHeight: '24px',
|
|
71
|
+
margin: '0 0 24px',
|
|
72
|
+
};
|
|
73
|
+
const warning = {
|
|
74
|
+
...paragraph,
|
|
75
|
+
fontWeight: 600,
|
|
76
|
+
};
|
|
77
|
+
const buttonWrapper = {
|
|
78
|
+
margin: '0 0 24px',
|
|
79
|
+
};
|
|
80
|
+
const signOff = {
|
|
81
|
+
fontSize: 14,
|
|
82
|
+
color: '#374151',
|
|
83
|
+
lineHeight: '20px',
|
|
84
|
+
margin: '24px 0 0',
|
|
85
|
+
};
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Preview
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
export default function Preview() {
|
|
90
|
+
return (_jsx(EscrowHoldReleased, { branding: DEFAULT_BRANDING, completedAt: "October 2, 2026, 3:00 PM", supportUrl: "https://learncard.app/support" }));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=escrow-hold-released.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-released.js","sourceRoot":"","sources":["../../src/templates/escrow-hold-released.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;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;AAsBpE,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,4BAA4B;IACrC,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CACjB,yEAC2C,2BAAS,WAAW,GAAU,SACtE,CACN;IACD,OAAO,EAAE,kDAAkD;IAC3D,MAAM,EAAE,iBAAiB;IACzB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,4BAA4B;CACxC,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,0BAA0B;IACnC,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CACjB,+EAC4C,2BAAS,WAAW,GAAU,SACvE,CACN;IACD,OAAO,EAAE,uDAAuD;IAChE,MAAM,EAAE,uBAAuB;IAC/B,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,0BAA0B;CACtC,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,6BAA6B;IACtC,OAAO,EAAE,6BAA6B;IACtC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CACjB,yGACiD,2BAAS,WAAW,GAAU,SAC5E,CACN;IACD,OAAO,EACH,sGAAsG;IAC1G,MAAM,EAAE,sBAAsB;IAC9B,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,6BAA6B;CACzC,CAAC;AAEF,MAAM,EAAE,GAAY;IAChB,OAAO,EAAE,mBAAmB;IAC5B,OAAO,EAAE,mBAAmB;IAC5B,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CACjB,oMACoC,2BAAS,WAAW,GAAU,SAC/D,CACN;IACD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,aAAa;IACxB,OAAO,EAAE,mBAAmB;CAC/B,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,kBAAkB,GAAsC,CAAC,EAClE,QAAQ,EACR,WAAW,EACX,UAAU,EACV,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,WAAW,CAAC,GAAQ,EAEpD,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,CAAC,CAAC,OAAO,GAAQ,EAEvC,UAAU,IAAI,CACX,KAAC,OAAO,IAAC,KAAK,EAAE,aAAa,YACzB,KAAC,WAAW,IAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,YAC5C,CAAC,CAAC,MAAM,GACC,GACR,CACb,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,UAAU,IAAI,KAAC,YAAY,IAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAI,IAC5D,CACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,SAAyB,EAAE,MAAe,EAAU,EAAE,CAC/F,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,kBAAkB,IACf,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAC,0BAA0B,EACtC,UAAU,EAAC,+BAA+B,GAC5C,CACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscrowHoldReminder — reminds a user that a pending account recovery request
|
|
3
|
+
* is about to complete, and gives them one more chance to cancel it.
|
|
4
|
+
*
|
|
5
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-reminder')
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import type { TenantBranding } from '../branding';
|
|
9
|
+
export interface EscrowHoldReminderProps {
|
|
10
|
+
branding: TenantBranding;
|
|
11
|
+
/** Human-readable timestamp access will be restored, unless cancelled. */
|
|
12
|
+
releaseAfter: string;
|
|
13
|
+
/** Link that cancels the pending recovery request. */
|
|
14
|
+
cancelUrl: string;
|
|
15
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
16
|
+
locale?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const EscrowHoldReminder: React.FC<EscrowHoldReminderProps>;
|
|
19
|
+
export declare const getEscrowHoldReminderSubject: (_branding: TenantBranding, locale?: string) => string;
|
|
20
|
+
export default function Preview(): React.JSX.Element;
|
|
21
|
+
//# sourceMappingURL=escrow-hold-reminder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-reminder.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-hold-reminder.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAyED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAiChE,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MACzC,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAQ9B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EscrowHoldReminder — reminds a user that a pending account recovery request
|
|
4
|
+
* is about to complete, and gives them one more chance to cancel it.
|
|
5
|
+
*
|
|
6
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-reminder')
|
|
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: 'Recovery completes tomorrow',
|
|
16
|
+
heading: 'Recovery Completes Tomorrow',
|
|
17
|
+
body: releaseAfter => (_jsxs(_Fragment, { children: ["Your account recovery will complete on ", _jsx("strong", { children: releaseAfter }), " unless you cancel it."] })),
|
|
18
|
+
warning: "If this wasn't you, cancel now.",
|
|
19
|
+
button: "This wasn't me \u2014 Cancel recovery",
|
|
20
|
+
sincerely: 'Sincerely,',
|
|
21
|
+
subject: 'Recovery completes tomorrow',
|
|
22
|
+
};
|
|
23
|
+
const ES = {
|
|
24
|
+
preview: 'La recuperación se completa mañana',
|
|
25
|
+
heading: 'La Recuperación se Completa Mañana',
|
|
26
|
+
body: releaseAfter => (_jsxs(_Fragment, { children: ["La recuperaci\u00F3n de tu cuenta se completar\u00E1 el ", _jsx("strong", { children: releaseAfter }), " a menos que la canceles."] })),
|
|
27
|
+
warning: 'Si no fuiste tú, cancélalo ahora.',
|
|
28
|
+
button: 'No fui yo \u2014 Cancelar recuperación',
|
|
29
|
+
sincerely: 'Atentamente,',
|
|
30
|
+
subject: 'La recuperación se completa mañana',
|
|
31
|
+
};
|
|
32
|
+
const FR = {
|
|
33
|
+
preview: 'La récupération se termine demain',
|
|
34
|
+
heading: 'La Récupération se Termine Demain',
|
|
35
|
+
body: releaseAfter => (_jsxs(_Fragment, { children: ["La r\u00E9cup\u00E9ration de votre compte sera termin\u00E9e le ", _jsx("strong", { children: releaseAfter }), " sauf si vous l\\u2019annulez."] })),
|
|
36
|
+
warning: 'Si ce n\u2019était pas vous, annulez dès maintenant.',
|
|
37
|
+
button: 'Ce n\u2019était pas moi \u2014 Annuler la récupération',
|
|
38
|
+
sincerely: 'Cordialement,',
|
|
39
|
+
subject: 'La récupération se termine demain',
|
|
40
|
+
};
|
|
41
|
+
const AR = {
|
|
42
|
+
preview: 'تكتمل الاستعادة غدًا',
|
|
43
|
+
heading: 'تكتمل الاستعادة غدًا',
|
|
44
|
+
body: releaseAfter => (_jsxs(_Fragment, { children: ["\u0633\u062A\u0643\u062A\u0645\u0644 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A ", _jsx("strong", { children: releaseAfter }), " \u0645\u0627 \u0644\u0645 \u062A\u0642\u0645 \u0628\u0625\u0644\u063A\u0627\u0626\u0647\u0627."] })),
|
|
45
|
+
warning: 'إذا لم يكن هذا أنت، ألغِ الطلب الآن.',
|
|
46
|
+
button: 'لم يكن أنا \u2014 إلغاء الاستعادة',
|
|
47
|
+
sincerely: 'مع التحيات،',
|
|
48
|
+
subject: 'تكتمل الاستعادة غدًا',
|
|
49
|
+
};
|
|
50
|
+
const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
|
|
51
|
+
export const EscrowHoldReminder = ({ branding, releaseAfter, cancelUrl, locale, }) => {
|
|
52
|
+
const s = STRINGS[resolveCatalogLocale(locale)];
|
|
53
|
+
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(releaseAfter) }), _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, {
|
|
54
|
+
brandName: branding.brandName,
|
|
55
|
+
})] }), _jsx(LinkFallback, { href: cancelUrl, locale: locale })] }));
|
|
56
|
+
};
|
|
57
|
+
export const getEscrowHoldReminderSubject = (_branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject;
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Styles
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
const heading = {
|
|
62
|
+
fontSize: 24,
|
|
63
|
+
fontWeight: 600,
|
|
64
|
+
color: '#111827',
|
|
65
|
+
margin: '0 0 24px',
|
|
66
|
+
};
|
|
67
|
+
const paragraph = {
|
|
68
|
+
fontSize: 16,
|
|
69
|
+
color: '#374151',
|
|
70
|
+
lineHeight: '24px',
|
|
71
|
+
margin: '0 0 24px',
|
|
72
|
+
};
|
|
73
|
+
const warning = {
|
|
74
|
+
...paragraph,
|
|
75
|
+
fontWeight: 600,
|
|
76
|
+
};
|
|
77
|
+
const buttonWrapper = {
|
|
78
|
+
margin: '0 0 24px',
|
|
79
|
+
};
|
|
80
|
+
const signOff = {
|
|
81
|
+
fontSize: 14,
|
|
82
|
+
color: '#374151',
|
|
83
|
+
lineHeight: '20px',
|
|
84
|
+
margin: '24px 0 0',
|
|
85
|
+
};
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Preview
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
export default function Preview() {
|
|
90
|
+
return (_jsx(EscrowHoldReminder, { branding: DEFAULT_BRANDING, releaseAfter: "October 2, 2026, 3:00 PM", cancelUrl: "https://learncard.app/recovery/cancel?token=abc123" }));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=escrow-hold-reminder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-reminder.js","sourceRoot":"","sources":["../../src/templates/escrow-hold-reminder.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscrowHoldStarted — notifies a user that an account recovery request was
|
|
3
|
+
* started and gives them a way to cancel it if it wasn't them.
|
|
4
|
+
*
|
|
5
|
+
* Used by: lca-api recovery hold routes (templateId: 'escrow-hold-started')
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import type { TenantBranding } from '../branding';
|
|
9
|
+
export interface EscrowHoldStartedProps {
|
|
10
|
+
branding: TenantBranding;
|
|
11
|
+
/** Human-readable timestamp the recovery request was made. */
|
|
12
|
+
requestedAt: string;
|
|
13
|
+
/** Human-readable timestamp access will be restored, unless cancelled. */
|
|
14
|
+
releaseAfter: string;
|
|
15
|
+
/** Link that cancels the pending recovery request. */
|
|
16
|
+
cancelUrl: string;
|
|
17
|
+
/** Optional human-readable hint about where the request came from (e.g. browser/OS). */
|
|
18
|
+
deviceHint?: string;
|
|
19
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
20
|
+
locale?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const EscrowHoldStarted: React.FC<EscrowHoldStartedProps>;
|
|
23
|
+
export declare const getEscrowHoldStartedSubject: (_branding: TenantBranding, locale?: string) => string;
|
|
24
|
+
export default function Preview(): React.JSX.Element;
|
|
25
|
+
//# sourceMappingURL=escrow-hold-started.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escrow-hold-started.d.ts","sourceRoot":"","sources":["../../src/templates/escrow-hold-started.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AA+FD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAqC9D,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,WAAW,cAAc,EAAE,SAAS,MAAM,KAAG,MACxC,CAAC;AAwClD,MAAM,CAAC,OAAO,UAAU,OAAO,sBAU9B"}
|