@learncard/email-templates 1.2.0 → 1.2.1
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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- 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/render.d.ts +34 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +41 -1
- package/dist/render.js.map +1 -1
- 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/index.d.ts +10 -0
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +5 -0
- package/dist/templates/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/i18n.test.ts +30 -0
- package/src/__tests__/render.test.ts +191 -0
- package/src/index.ts +6 -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/render.ts +111 -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/index.ts +15 -0
|
@@ -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":"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"}
|
|
@@ -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"}
|
|
@@ -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":"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"}
|
|
@@ -26,4 +26,14 @@ export { CredentialUpdated, getCredentialUpdatedSubject } from './credential-upd
|
|
|
26
26
|
export type { CredentialUpdatedProps } from './credential-updated';
|
|
27
27
|
export { AccountSignInChanged, getAccountSignInChangedSubject } from './account-sign-in-changed';
|
|
28
28
|
export type { AccountSignInChangedProps } from './account-sign-in-changed';
|
|
29
|
+
export { EscrowHoldStarted, getEscrowHoldStartedSubject } from './escrow-hold-started';
|
|
30
|
+
export type { EscrowHoldStartedProps } from './escrow-hold-started';
|
|
31
|
+
export { EscrowHoldReminder, getEscrowHoldReminderSubject } from './escrow-hold-reminder';
|
|
32
|
+
export type { EscrowHoldReminderProps } from './escrow-hold-reminder';
|
|
33
|
+
export { EscrowHoldReleased, getEscrowHoldReleasedSubject } from './escrow-hold-released';
|
|
34
|
+
export type { EscrowHoldReleasedProps } from './escrow-hold-released';
|
|
35
|
+
export { EscrowHoldCancelled, getEscrowHoldCancelledSubject } from './escrow-hold-cancelled';
|
|
36
|
+
export type { EscrowHoldCancelledProps, EscrowHoldCancelledReason } from './escrow-hold-cancelled';
|
|
37
|
+
export { EscrowPinLocked, getEscrowPinLockedSubject } from './escrow-pin-locked';
|
|
38
|
+
export type { EscrowPinLockedProps } from './escrow-pin-locked';
|
|
29
39
|
//# 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":"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;AAE3E,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACvF,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAC1F,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAC1F,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAC7F,YAAY,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACjF,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/templates/index.js
CHANGED
|
@@ -12,4 +12,9 @@ export { GuardianRejectedCredential, getGuardianRejectedCredentialSubject, } fro
|
|
|
12
12
|
export { EmailVerification, getEmailVerificationSubject } from './email-verification';
|
|
13
13
|
export { CredentialUpdated, getCredentialUpdatedSubject } from './credential-updated';
|
|
14
14
|
export { AccountSignInChanged, getAccountSignInChangedSubject } from './account-sign-in-changed';
|
|
15
|
+
export { EscrowHoldStarted, getEscrowHoldStartedSubject } from './escrow-hold-started';
|
|
16
|
+
export { EscrowHoldReminder, getEscrowHoldReminderSubject } from './escrow-hold-reminder';
|
|
17
|
+
export { EscrowHoldReleased, getEscrowHoldReleasedSubject } from './escrow-hold-released';
|
|
18
|
+
export { EscrowHoldCancelled, getEscrowHoldCancelledSubject } from './escrow-hold-cancelled';
|
|
19
|
+
export { EscrowPinLocked, getEscrowPinLockedSubject } from './escrow-pin-locked';
|
|
15
20
|
//# 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,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;AAGjG,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAG1F,OAAO,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAG1F,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7F,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -92,6 +92,34 @@ 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
|
+
},
|
|
95
123
|
};
|
|
96
124
|
|
|
97
125
|
const ALL_TEMPLATE_IDS = Object.keys(FIXTURES) as TemplateId[];
|
|
@@ -132,6 +160,8 @@ describe('i18n — non-EN locales localize content', () => {
|
|
|
132
160
|
'guardian-credential-approval',
|
|
133
161
|
'guardian-email-otp',
|
|
134
162
|
'credential-awaiting-guardian',
|
|
163
|
+
'escrow-hold-started',
|
|
164
|
+
'escrow-hold-cancelled',
|
|
135
165
|
];
|
|
136
166
|
|
|
137
167
|
for (const templateId of SAMPLES) {
|