@learncard/email-templates 1.0.4 → 1.0.6
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/branding.d.ts.map +1 -1
- package/dist/components/Layout.d.ts +2 -0
- package/dist/components/Layout.d.ts.map +1 -1
- package/dist/components/Layout.js +6 -1
- package/dist/components/Layout.js.map +1 -1
- package/dist/components/LinkFallback.d.ts +2 -0
- package/dist/components/LinkFallback.d.ts.map +1 -1
- package/dist/components/LinkFallback.js +5 -1
- package/dist/components/LinkFallback.js.map +1 -1
- package/dist/i18n.d.ts +52 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +77 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +3 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +33 -30
- package/dist/render.js.map +1 -1
- package/dist/sms.d.ts +6 -3
- package/dist/sms.d.ts.map +1 -1
- package/dist/sms.js +43 -7
- package/dist/sms.js.map +1 -1
- package/dist/templates/account-approved.d.ts +3 -1
- package/dist/templates/account-approved.d.ts.map +1 -1
- package/dist/templates/account-approved.js +55 -5
- package/dist/templates/account-approved.js.map +1 -1
- package/dist/templates/credential-awaiting-guardian.d.ts +3 -1
- package/dist/templates/credential-awaiting-guardian.d.ts.map +1 -1
- package/dist/templates/credential-awaiting-guardian.js +54 -4
- package/dist/templates/credential-awaiting-guardian.js.map +1 -1
- package/dist/templates/email-verification.d.ts +3 -1
- package/dist/templates/email-verification.d.ts.map +1 -1
- package/dist/templates/email-verification.js +57 -4
- package/dist/templates/email-verification.js.map +1 -1
- package/dist/templates/endorsement-request.d.ts +3 -1
- package/dist/templates/endorsement-request.d.ts.map +1 -1
- package/dist/templates/endorsement-request.js +53 -5
- package/dist/templates/endorsement-request.js.map +1 -1
- package/dist/templates/guardian-approval.d.ts +3 -1
- package/dist/templates/guardian-approval.d.ts.map +1 -1
- package/dist/templates/guardian-approval.js +55 -5
- package/dist/templates/guardian-approval.js.map +1 -1
- package/dist/templates/guardian-approved-claim.d.ts +3 -1
- package/dist/templates/guardian-approved-claim.d.ts.map +1 -1
- package/dist/templates/guardian-approved-claim.js +50 -4
- package/dist/templates/guardian-approved-claim.js.map +1 -1
- package/dist/templates/guardian-credential-approval.d.ts +3 -1
- package/dist/templates/guardian-credential-approval.d.ts.map +1 -1
- package/dist/templates/guardian-credential-approval.js +50 -4
- package/dist/templates/guardian-credential-approval.js.map +1 -1
- package/dist/templates/guardian-email-otp.d.ts +3 -1
- package/dist/templates/guardian-email-otp.d.ts.map +1 -1
- package/dist/templates/guardian-email-otp.js +55 -5
- package/dist/templates/guardian-email-otp.js.map +1 -1
- package/dist/templates/guardian-rejected-credential.d.ts +3 -1
- package/dist/templates/guardian-rejected-credential.d.ts.map +1 -1
- package/dist/templates/guardian-rejected-credential.js +45 -3
- package/dist/templates/guardian-rejected-credential.js.map +1 -1
- package/dist/templates/inbox-claim.d.ts +3 -1
- package/dist/templates/inbox-claim.d.ts.map +1 -1
- package/dist/templates/inbox-claim.js +63 -11
- package/dist/templates/inbox-claim.js.map +1 -1
- package/dist/templates/recovery-key.d.ts +3 -1
- package/dist/templates/recovery-key.d.ts.map +1 -1
- package/dist/templates/recovery-key.js +59 -3
- package/dist/templates/recovery-key.js.map +1 -1
- package/dist/templates/verification-code.d.ts +3 -1
- package/dist/templates/verification-code.d.ts.map +1 -1
- package/dist/templates/verification-code.js +153 -17
- package/dist/templates/verification-code.js.map +1 -1
- package/dist/tenant-registry.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/__tests__/i18n.test.ts +329 -0
- package/src/components/Layout.tsx +69 -60
- package/src/components/LinkFallback.tsx +19 -11
- package/src/i18n.ts +110 -0
- package/src/index.ts +15 -2
- package/src/render.ts +47 -28
- package/src/sms.ts +61 -6
- package/src/templates/account-approved.tsx +82 -29
- package/src/templates/credential-awaiting-guardian.tsx +113 -19
- package/src/templates/email-verification.tsx +87 -16
- package/src/templates/endorsement-request.tsx +142 -17
- package/src/templates/guardian-approval.tsx +106 -16
- package/src/templates/guardian-approved-claim.tsx +137 -17
- package/src/templates/guardian-credential-approval.tsx +112 -17
- package/src/templates/guardian-email-otp.tsx +103 -25
- package/src/templates/guardian-rejected-credential.tsx +137 -15
- package/src/templates/inbox-claim.tsx +180 -29
- package/src/templates/recovery-key.tsx +126 -30
- package/src/templates/verification-code.tsx +204 -38
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* InboxClaim — email notifying a recipient they have a credential to claim.
|
|
4
4
|
*
|
|
@@ -10,21 +10,70 @@ import { Layout } from '../components/Layout';
|
|
|
10
10
|
import { EmailButton } from '../components/EmailButton';
|
|
11
11
|
import { IssuerLogo } from '../components/IssuerLogo';
|
|
12
12
|
import { LinkFallback } from '../components/LinkFallback';
|
|
13
|
-
|
|
13
|
+
import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
|
|
14
|
+
const ldquo = '\u201C';
|
|
15
|
+
const rdquo = '\u201D';
|
|
16
|
+
const mdash = '\u2014';
|
|
17
|
+
const EN = {
|
|
18
|
+
greeting: 'Hello,',
|
|
19
|
+
greetingName: 'Hello {name},',
|
|
20
|
+
heading: t => `Your digital ${t} is ready`,
|
|
21
|
+
preview: (t, issuer) => `Your digital ${t}${issuer ? ` from ${issuer}` : ''} is ready`,
|
|
22
|
+
intro: (issuerName, credentialName) => (_jsxs(_Fragment, { children: [issuerName ? (_jsxs(_Fragment, { children: [_jsx("strong", { children: issuerName }), " has sent you"] })) : (_jsx(_Fragment, { children: "You've received" })), ' ', "a secure, digital version of your", ' ', _jsx("strong", { children: credentialName ? `${ldquo}${credentialName}${rdquo}` : 'achievement' }), "."] })),
|
|
23
|
+
passport: (b, t) => (_jsxs(_Fragment, { children: [b, " is your private, digital passport for learning and work. It lets you securely collect and share your verified skills and achievements online. By claiming this item, you are saving a verifiable, official ", t, " to your personal passport", mdash, "one that only you control."] })),
|
|
24
|
+
button: 'Claim Your Record \u2192',
|
|
25
|
+
sincerely: 'Sincerely,',
|
|
26
|
+
subject: issuer => `Your digital record ${issuer ? `from ${issuer} ` : ''}is ready`,
|
|
27
|
+
};
|
|
28
|
+
const ES = {
|
|
29
|
+
greeting: 'Hola,',
|
|
30
|
+
greetingName: 'Hola {name},',
|
|
31
|
+
heading: t => `Tu ${t} digital está listo`,
|
|
32
|
+
preview: (t, issuer) => `Tu ${t} digital${issuer ? ` de ${issuer}` : ''} está listo`,
|
|
33
|
+
intro: (issuerName, credentialName) => (_jsxs(_Fragment, { children: [issuerName ? (_jsxs(_Fragment, { children: [_jsx("strong", { children: issuerName }), " te ha enviado"] })) : (_jsx(_Fragment, { children: "Has recibido" })), ' ', "una versi\u00F3n digital y segura de tu", ' ', _jsx("strong", { children: credentialName ? `${ldquo}${credentialName}${rdquo}` : 'logro' }), "."] })),
|
|
34
|
+
passport: (b, t) => (_jsxs(_Fragment, { children: [b, " es tu pasaporte digital y privado para el aprendizaje y el trabajo. Te permite recopilar y compartir de forma segura tus habilidades y logros verificados en l\u00EDnea. Al reclamar este elemento, est\u00E1s guardando un ", t, "verificable y oficial en tu pasaporte personal", mdash, "uno que solo t\u00FA controlas."] })),
|
|
35
|
+
button: 'Reclamar tu registro \u2192',
|
|
36
|
+
sincerely: 'Atentamente,',
|
|
37
|
+
subject: issuer => `Tu registro digital ${issuer ? `de ${issuer} ` : ''}está listo`,
|
|
38
|
+
};
|
|
39
|
+
const FR = {
|
|
40
|
+
greeting: 'Bonjour,',
|
|
41
|
+
greetingName: 'Bonjour {name},',
|
|
42
|
+
heading: t => `Votre ${t} numérique est prêt`,
|
|
43
|
+
preview: (t, issuer) => `Votre ${t} numérique${issuer ? ` de ${issuer}` : ''} est prêt`,
|
|
44
|
+
intro: (issuerName, credentialName) => (_jsxs(_Fragment, { children: [issuerName ? (_jsxs(_Fragment, { children: [_jsx("strong", { children: issuerName }), " vous a envoy\u00E9"] })) : (_jsx(_Fragment, { children: "Vous avez re\u00E7u" })), ' ', "une version num\u00E9rique et s\u00E9curis\u00E9e de votre", ' ', _jsx("strong", { children: credentialName ? `${ldquo}${credentialName}${rdquo}` : 'réalisation' }), "."] })),
|
|
45
|
+
passport: (b, t) => (_jsxs(_Fragment, { children: [b, " est votre passeport num\u00E9rique priv\u00E9 pour l\\u2019apprentissage et le travail. Il vous permet de collecter et de partager en toute s\u00E9curit\u00E9 vos comp\u00E9tences et r\u00E9alisations v\u00E9rifi\u00E9es en ligne. En r\u00E9clamant cet \u00E9l\u00E9ment, vous enregistrez un ", t, " v\u00E9rifiable et officiel dans votre passeport personnel", mdash, "que vous seul contr\u00F4lez."] })),
|
|
46
|
+
button: 'Réclamer votre titre \u2192',
|
|
47
|
+
sincerely: 'Cordialement,',
|
|
48
|
+
subject: issuer => `Votre titre numérique ${issuer ? `de ${issuer} ` : ''}est prêt`,
|
|
49
|
+
};
|
|
50
|
+
const AR = {
|
|
51
|
+
greeting: 'مرحبًا،',
|
|
52
|
+
greetingName: 'مرحبًا {name}،',
|
|
53
|
+
heading: t => `${t}ك الرقمي جاهز`,
|
|
54
|
+
preview: (t, issuer) => `${t}ك الرقمي${issuer ? ` من ${issuer}` : ''} جاهز`,
|
|
55
|
+
intro: (issuerName, credentialName) => (_jsxs(_Fragment, { children: [issuerName ? (_jsxs(_Fragment, { children: ["\u0623\u0631\u0633\u0644 \u0644\u0643 ", _jsx("strong", { children: issuerName })] })) : (_jsx(_Fragment, { children: "\u0644\u0642\u062F \u0627\u0633\u062A\u0644\u0645\u062A" })), ' ', "\u0646\u0633\u062E\u0629 \u0631\u0642\u0645\u064A\u0629 \u0648\u0622\u0645\u0646\u0629 \u0645\u0646", ' ', _jsx("strong", { children: credentialName ? `${ldquo}${credentialName}${rdquo}` : 'إنجازك' }), "."] })),
|
|
56
|
+
passport: (b, t) => (_jsxs(_Fragment, { children: [b, " \u0647\u0648 \u062C\u0648\u0627\u0632 \u0633\u0641\u0631\u0643 \u0627\u0644\u0631\u0642\u0645\u064A \u0648\u0627\u0644\u062E\u0627\u0635 \u0644\u0644\u062A\u0639\u0644\u0651\u0645 \u0648\u0627\u0644\u0639\u0645\u0644. \u064A\u062A\u064A\u062D \u0644\u0643 \u062C\u0645\u0639 \u0648\u0645\u0634\u0627\u0631\u0643\u0629 \u0645\u0647\u0627\u0631\u0627\u062A\u0643 \u0648\u0625\u0646\u062C\u0627\u0632\u0627\u062A\u0643 \u0627\u0644\u0645\u0648\u062B\u0651\u0642\u0629 \u0628\u0623\u0645\u0627\u0646 \u0639\u0628\u0631 \u0627\u0644\u0625\u0646\u062A\u0631\u0646\u062A. \u0645\u0646 \u062E\u0644\u0627\u0644 \u0627\u0644\u0645\u0637\u0627\u0644\u0628\u0629 \u0628\u0647\u0630\u0627 \u0627\u0644\u0639\u0646\u0635\u0631\u060C \u0641\u0623\u0646\u062A \u062A\u062D\u0641\u0638 ", t, "\u064B\u0627 \u0642\u0627\u0628\u0644\u0627\u064B \u0644\u0644\u062A\u062D\u0642\u0642 \u0648\u0631\u0633\u0645\u064A\u064B\u0627 \u0641\u064A \u062C\u0648\u0627\u0632 \u0633\u0641\u0631\u0643 \u0627\u0644\u0634\u062E\u0635\u064A", mdash, "\u0627\u0644\u0630\u064A \u062A\u062A\u062D\u0643\u0645 \u0641\u064A\u0647 \u0623\u0646\u062A \u0648\u062D\u062F\u0643."] })),
|
|
57
|
+
button: 'مطالبة سجلك ←',
|
|
58
|
+
sincerely: 'مع التحيات،',
|
|
59
|
+
subject: issuer => `سجلك الرقمي ${issuer ? `من ${issuer} ` : ''}جاهز`,
|
|
60
|
+
};
|
|
61
|
+
const STRINGS = { en: EN, es: ES, fr: FR, ar: AR };
|
|
62
|
+
export const InboxClaim = ({ branding, claimUrl, recipient, issuer, credential, locale, }) => {
|
|
63
|
+
const s = STRINGS[resolveCatalogLocale(locale)];
|
|
14
64
|
const credentialName = credential?.name;
|
|
15
65
|
const credentialType = credential?.type ?? 'record';
|
|
16
|
-
const greeting = recipient?.name ? `Hello ${recipient.name},` : 'Hello,';
|
|
17
66
|
const issuerName = issuer?.name;
|
|
18
67
|
const issuerLogo = issuer?.logoUrl;
|
|
19
68
|
const showHeaderLogo = !issuerLogo;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return `Your digital record ${issuerPart}is ready`;
|
|
69
|
+
const greeting = interpolate(recipient?.name ? s.greetingName : s.greeting, {
|
|
70
|
+
name: recipient?.name,
|
|
71
|
+
});
|
|
72
|
+
return (_jsxs(Layout, { branding: branding, locale: locale, preview: s.preview(credentialType, issuerName), showHeaderLogo: showHeaderLogo, children: [_jsx(IssuerLogo, { logoUrl: issuerLogo, alt: issuerName ? `${issuerName} logo` : undefined }), _jsx(Text, { style: heading, children: s.heading(credentialType) }), _jsx(Text, { style: paragraph, children: greeting }), _jsx(Text, { style: paragraph, children: s.intro(issuerName, credentialName) }), _jsx(Text, { style: paragraph, children: s.passport(branding.brandName, credentialType) }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: claimUrl, branding: branding, children: s.button }) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
73
|
+
brandName: branding.brandName,
|
|
74
|
+
})] }), _jsx(LinkFallback, { href: claimUrl, locale: locale })] }));
|
|
27
75
|
};
|
|
76
|
+
export const getInboxClaimSubject = (_branding, props, locale) => STRINGS[resolveCatalogLocale(locale)].subject(props.issuer?.name);
|
|
28
77
|
// ---------------------------------------------------------------------------
|
|
29
78
|
// Styles
|
|
30
79
|
// ---------------------------------------------------------------------------
|
|
@@ -53,6 +102,9 @@ const signOff = {
|
|
|
53
102
|
// Preview
|
|
54
103
|
// ---------------------------------------------------------------------------
|
|
55
104
|
export default function Preview() {
|
|
56
|
-
return (_jsx(InboxClaim, { branding: DEFAULT_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe' }, issuer: {
|
|
105
|
+
return (_jsx(InboxClaim, { branding: DEFAULT_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe' }, issuer: {
|
|
106
|
+
name: 'Acme University',
|
|
107
|
+
logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj',
|
|
108
|
+
}, credential: { name: 'Bachelor of Science', type: 'Achievement' } }));
|
|
57
109
|
}
|
|
58
110
|
//# sourceMappingURL=inbox-claim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-claim.js","sourceRoot":"","sources":["../../src/templates/inbox-claim.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;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,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-claim.js","sourceRoot":"","sources":["../../src/templates/inbox-claim.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,10 @@ import type { TenantBranding } from '../branding';
|
|
|
8
8
|
export interface RecoveryKeyProps {
|
|
9
9
|
branding: TenantBranding;
|
|
10
10
|
recoveryKey: string;
|
|
11
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
12
|
+
locale?: string;
|
|
11
13
|
}
|
|
12
14
|
export declare const RecoveryKey: React.FC<RecoveryKeyProps>;
|
|
13
|
-
export declare const getRecoveryKeySubject: (branding: TenantBranding) => string;
|
|
15
|
+
export declare const getRecoveryKeySubject: (branding: TenantBranding, locale?: string) => string;
|
|
14
16
|
export default function Preview(): React.JSX.Element;
|
|
15
17
|
//# sourceMappingURL=recovery-key.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-key.d.ts","sourceRoot":"","sources":["../../src/templates/recovery-key.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery-key.d.ts","sourceRoot":"","sources":["../../src/templates/recovery-key.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAkGD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA8BlD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,UAAU,cAAc,EAAE,SAAS,MAAM,KAAG,MACb,CAAC;AAsCtE,MAAM,CAAC,OAAO,UAAU,OAAO,sBAO9B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* RecoveryKey — email containing a user's account recovery key.
|
|
4
4
|
*
|
|
@@ -8,8 +8,64 @@ import { Text } from '@react-email/components';
|
|
|
8
8
|
import { DEFAULT_BRANDING } from '../branding';
|
|
9
9
|
import { Layout } from '../components/Layout';
|
|
10
10
|
import { CodeBlock } from '../components/CodeBlock';
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
|
|
12
|
+
const STRINGS = {
|
|
13
|
+
en: {
|
|
14
|
+
preview: b => `Your ${b} recovery key \u2014 keep this safe`,
|
|
15
|
+
heading: b => `Your ${b} Recovery Key`,
|
|
16
|
+
greeting: 'Hello,',
|
|
17
|
+
body: b => `Keep this email safe. You can use the recovery key below to regain access to your ${b} account if you lose your device.`,
|
|
18
|
+
codeLabel: 'Recovery Key \u2014 do NOT share this with anyone',
|
|
19
|
+
recoverInstruction: () => (_jsxs(_Fragment, { children: ["To recover your account, choose ", _jsx("strong", { children: "\u201CRecover via Email\u201D" }), " in the app and paste the recovery key above when prompted."] })),
|
|
20
|
+
notRequested: 'If you did not request this, you can safely ignore this email.',
|
|
21
|
+
passport: '{brandName} is your private, digital passport for learning and work. It lets you securely collect and share your verified skills and achievements online.',
|
|
22
|
+
sincerely: 'Sincerely,',
|
|
23
|
+
subject: b => `Your ${b} recovery key`,
|
|
24
|
+
},
|
|
25
|
+
es: {
|
|
26
|
+
preview: b => `Tu clave de recuperación de ${b} \u2014 guárdala en un lugar seguro`,
|
|
27
|
+
heading: b => `Tu clave de recuperación de ${b}`,
|
|
28
|
+
greeting: 'Hola,',
|
|
29
|
+
body: b => `Guarda este correo en un lugar seguro. Puedes usar la clave de recuperación siguiente para recuperar el acceso a tu cuenta de ${b} si pierdes tu dispositivo.`,
|
|
30
|
+
codeLabel: 'Clave de recuperación \u2014 NO la compartas con nadie',
|
|
31
|
+
recoverInstruction: () => (_jsxs(_Fragment, { children: ["Para recuperar tu cuenta, elige ", _jsx("strong", { children: "\u201CRecuperar por correo\u201D" }), ' ', "en la app y pega la clave de recuperaci\u00F3n anterior cuando se te solicite."] })),
|
|
32
|
+
notRequested: 'Si no solicitaste esto, puedes ignorar este correo con seguridad.',
|
|
33
|
+
passport: '{brandName} es tu pasaporte digital y privado para el aprendizaje y el trabajo. Te permite recopilar y compartir de forma segura tus habilidades y logros verificados en línea.',
|
|
34
|
+
sincerely: 'Atentamente,',
|
|
35
|
+
subject: b => `Tu clave de recuperación de ${b}`,
|
|
36
|
+
},
|
|
37
|
+
fr: {
|
|
38
|
+
preview: b => `Votre clé de récupération ${b} \u2014 conservez-la en sécurité`,
|
|
39
|
+
heading: b => `Votre clé de récupération ${b}`,
|
|
40
|
+
greeting: 'Bonjour,',
|
|
41
|
+
body: b => `Conservez cet e-mail en sécurité. Vous pouvez utiliser la clé de récupération ci-dessous pour retrouver l\u2019accès à votre compte ${b} si vous perdez votre appareil.`,
|
|
42
|
+
codeLabel: 'Clé de récupération \u2014 NE la partagez avec PERSONNE',
|
|
43
|
+
recoverInstruction: () => (_jsxs(_Fragment, { children: ["Pour r\u00E9cup\u00E9rer votre compte, choisissez", ' ', _jsx("strong", { children: "\u00AB\u00A0R\u00E9cup\u00E9rer par e-mail\u00A0\u00BB" }), " dans l\\u2019application et collez la cl\u00E9 de r\u00E9cup\u00E9ration ci-dessus lorsque cela vous est demand\u00E9."] })),
|
|
44
|
+
notRequested: 'Si vous n\u2019êtes pas à l\u2019origine de cette demande, vous pouvez ignorer cet e-mail en toute sécurité.',
|
|
45
|
+
passport: '{brandName} est votre passeport numérique privé pour l\u2019apprentissage et le travail. Il vous permet de collecter et de partager en toute sécurité vos compétences et réalisations vérifiées en ligne.',
|
|
46
|
+
sincerely: 'Cordialement,',
|
|
47
|
+
subject: b => `Votre clé de récupération ${b}`,
|
|
48
|
+
},
|
|
49
|
+
ar: {
|
|
50
|
+
preview: b => `مفتاح الاستعادة الخاص بك في ${b} \u2014 احتفظ به بأمان`,
|
|
51
|
+
heading: b => `مفتاح الاستعادة الخاص بك في ${b}`,
|
|
52
|
+
greeting: 'مرحبًا،',
|
|
53
|
+
body: b => `احتفظ بهذا البريد في مكان آمن. يمكنك استخدام مفتاح الاستعادة أدناه لاستعادة الوصول إلى حسابك في ${b} إذا فقدت جهازك.`,
|
|
54
|
+
codeLabel: 'مفتاح الاستعادة \u2014 لا تشاركه مع أي شخص إطلاقًا',
|
|
55
|
+
recoverInstruction: () => (_jsxs(_Fragment, { children: ["\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062D\u0633\u0627\u0628\u0643\u060C \u0627\u062E\u062A\u0631 ", _jsx("strong", { children: "\u00AB\u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0639\u0628\u0631 \u0627\u0644\u0628\u0631\u064A\u062F\u00BB" }), " \u0641\u064A \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0648\u0627\u0644\u0635\u0642 \u0645\u0641\u062A\u0627\u062D \u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0623\u0639\u0644\u0627\u0647 \u0639\u0646\u062F \u0627\u0644\u0645\u0637\u0627\u0644\u0628\u0629 \u0628\u0630\u0644\u0643."] })),
|
|
56
|
+
notRequested: 'إذا لم تطلب ذلك، يمكنك تجاهل هذه الرسالة بأمان.',
|
|
57
|
+
passport: '{brandName} هو جواز سفرك الرقمي والخاص للتعلّم والعمل. يتيح لك جمع ومشاركة مهاراتك وإنجازاتك الموثّقة بأمان عبر الإنترنت.',
|
|
58
|
+
sincerely: 'مع التحيات،',
|
|
59
|
+
subject: b => `مفتاح الاستعادة الخاص بك في ${b}`,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export const RecoveryKey = ({ branding, recoveryKey, locale }) => {
|
|
63
|
+
const s = STRINGS[resolveCatalogLocale(locale)];
|
|
64
|
+
return (_jsxs(Layout, { branding: branding, locale: locale, preview: s.preview(branding.brandName), children: [_jsx(Text, { style: heading, children: s.heading(branding.brandName) }), _jsx(Text, { style: paragraph, children: s.greeting }), _jsx(Text, { style: paragraph, children: s.body(branding.brandName) }), _jsx(CodeBlock, { code: recoveryKey, label: s.codeLabel, variant: "key" }), _jsx(Text, { style: paragraph, children: s.recoverInstruction() }), _jsx(Text, { style: muted, children: s.notRequested }), _jsx(Text, { style: paragraph, children: interpolate(s.passport, { brandName: branding.brandName }) }), _jsxs(Text, { style: signOff, children: [s.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
65
|
+
brandName: branding.brandName,
|
|
66
|
+
})] })] }));
|
|
67
|
+
};
|
|
68
|
+
export const getRecoveryKeySubject = (branding, locale) => STRINGS[resolveCatalogLocale(locale)].subject(branding.brandName);
|
|
13
69
|
// ---------------------------------------------------------------------------
|
|
14
70
|
// Styles
|
|
15
71
|
// ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery-key.js","sourceRoot":"","sources":["../../src/templates/recovery-key.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAI/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery-key.js","sourceRoot":"","sources":["../../src/templates/recovery-key.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,8 +17,10 @@ export interface VerificationCodeProps {
|
|
|
17
17
|
verificationCode: string;
|
|
18
18
|
verificationEmail?: string;
|
|
19
19
|
variant: VerificationCodeVariant;
|
|
20
|
+
/** Recipient locale (BCP-47). Defaults to English. */
|
|
21
|
+
locale?: string;
|
|
20
22
|
}
|
|
21
23
|
export declare const VerificationCode: React.FC<VerificationCodeProps>;
|
|
22
|
-
export declare const getVerificationCodeSubject: (branding: TenantBranding, variant: VerificationCodeVariant) => string;
|
|
24
|
+
export declare const getVerificationCodeSubject: (branding: TenantBranding, variant: VerificationCodeVariant, locale?: string) => string;
|
|
23
25
|
export default function Preview(): React.JSX.Element;
|
|
24
26
|
//# sourceMappingURL=verification-code.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-code.d.ts","sourceRoot":"","sources":["../../src/templates/verification-code.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-code.d.ts","sourceRoot":"","sources":["../../src/templates/verification-code.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,MAAM,uBAAuB,GAC7B,OAAO,GACP,gBAAgB,GAChB,oBAAoB,GACpB,gBAAgB,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,uBAAuB,CAAC;IACjC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAqMD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAyC5D,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACnC,UAAU,cAAc,EACxB,SAAS,uBAAuB,EAChC,SAAS,MAAM,KAChB,MAGF,CAAC;AAsCF,MAAM,CAAC,OAAO,UAAU,OAAO,sBAS9B"}
|
|
@@ -14,43 +14,179 @@ import { Text } from '@react-email/components';
|
|
|
14
14
|
import { DEFAULT_BRANDING } from '../branding';
|
|
15
15
|
import { Layout } from '../components/Layout';
|
|
16
16
|
import { CodeBlock } from '../components/CodeBlock';
|
|
17
|
-
|
|
17
|
+
import { resolveCatalogLocale, interpolate, SHARED } from '../i18n';
|
|
18
|
+
const EN = {
|
|
18
19
|
login: {
|
|
19
|
-
subject:
|
|
20
|
-
heading:
|
|
21
|
-
description: (
|
|
22
|
-
? `Here's your secure 6-digit code to log into ${b}`
|
|
23
|
-
: `Here's your secure 6-digit code to log into ${b}`,
|
|
20
|
+
subject: 'Your {brandName} login code',
|
|
21
|
+
heading: 'Your {brandName} Login Code',
|
|
22
|
+
description: (_email, b) => `Here's your secure 6-digit code to log into ${b}`,
|
|
24
23
|
expiry: 'This code will expire in 5 minutes. If you didn\u2019t request this, you can safely ignore this email.',
|
|
25
24
|
},
|
|
26
25
|
'recovery-email': {
|
|
27
|
-
subject:
|
|
28
|
-
heading:
|
|
26
|
+
subject: 'Verify your recovery email',
|
|
27
|
+
heading: 'Your {brandName} Verification Code',
|
|
29
28
|
description: (email, b) => email
|
|
30
29
|
? `Here's your secure 6-digit code to add ${email} as a recovery method for ${b}`
|
|
31
30
|
: `Here's your secure 6-digit code to add a recovery method for ${b}`,
|
|
32
31
|
expiry: 'This code will expire in 5 minutes. If you didn\u2019t request this, you can safely ignore this email.',
|
|
33
32
|
},
|
|
34
33
|
'embed-verification': {
|
|
35
|
-
subject:
|
|
36
|
-
heading:
|
|
34
|
+
subject: 'Your {brandName} verification code',
|
|
35
|
+
heading: 'Your {brandName} Verification Code',
|
|
37
36
|
description: email => email
|
|
38
37
|
? `Enter this code to verify ${email} and claim your credential:`
|
|
39
38
|
: 'Enter this code to verify your email address and claim your credential:',
|
|
40
39
|
expiry: 'This code will expire in 10 minutes. If you didn\u2019t request this, you can safely ignore this email.',
|
|
41
40
|
},
|
|
42
41
|
'contact-method': {
|
|
43
|
-
subject:
|
|
44
|
-
heading:
|
|
42
|
+
subject: 'Your {brandName} verification code',
|
|
43
|
+
heading: 'Your {brandName} Verification Code',
|
|
45
44
|
description: () => 'Enter this code in the app to verify your contact information.',
|
|
46
45
|
expiry: 'This code will expire in 24 hours. If you didn\u2019t request this, you can safely ignore this email.',
|
|
47
46
|
},
|
|
48
47
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
const ES = {
|
|
49
|
+
login: {
|
|
50
|
+
subject: 'Tu código de acceso a {brandName}',
|
|
51
|
+
heading: 'Tu código de acceso a {brandName}',
|
|
52
|
+
description: (_email, b) => `Aquí tienes tu código seguro de 6 dígitos para iniciar sesión en ${b}`,
|
|
53
|
+
expiry: 'Este código caducará en 5 minutos. Si no solicitaste esto, puedes ignorar este correo con seguridad.',
|
|
54
|
+
},
|
|
55
|
+
'recovery-email': {
|
|
56
|
+
subject: 'Verifica tu correo de recuperación',
|
|
57
|
+
heading: 'Tu código de verificación de {brandName}',
|
|
58
|
+
description: (email, b) => email
|
|
59
|
+
? `Aquí tienes tu código seguro de 6 dígitos para añadir ${email} como método de recuperación de ${b}`
|
|
60
|
+
: `Aquí tienes tu código seguro de 6 dígitos para añadir un método de recuperación de ${b}`,
|
|
61
|
+
expiry: 'Este código caducará en 5 minutos. Si no solicitaste esto, puedes ignorar este correo con seguridad.',
|
|
62
|
+
},
|
|
63
|
+
'embed-verification': {
|
|
64
|
+
subject: 'Tu código de verificación de {brandName}',
|
|
65
|
+
heading: 'Tu código de verificación de {brandName}',
|
|
66
|
+
description: email => email
|
|
67
|
+
? `Introduce este código para verificar ${email} y reclamar tu credencial:`
|
|
68
|
+
: 'Introduce este código para verificar tu dirección de correo y reclamar tu credencial:',
|
|
69
|
+
expiry: 'Este código caducará en 10 minutos. Si no solicitaste esto, puedes ignorar este correo con seguridad.',
|
|
70
|
+
},
|
|
71
|
+
'contact-method': {
|
|
72
|
+
subject: 'Tu código de verificación de {brandName}',
|
|
73
|
+
heading: 'Tu código de verificación de {brandName}',
|
|
74
|
+
description: () => 'Introduce este código en la app para verificar tu información de contacto.',
|
|
75
|
+
expiry: 'Este código caducará en 24 horas. Si no solicitaste esto, puedes ignorar este correo con seguridad.',
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const FR = {
|
|
79
|
+
login: {
|
|
80
|
+
subject: 'Votre code de connexion {brandName}',
|
|
81
|
+
heading: 'Votre code de connexion {brandName}',
|
|
82
|
+
description: (_email, b) => `Voici votre code sécurisé à 6 chiffres pour vous connecter à ${b}`,
|
|
83
|
+
expiry: 'Ce code expirera dans 5 minutes. Si vous n\u2019êtes pas à l\u2019origine de cette demande, vous pouvez ignorer cet e-mail en toute sécurité.',
|
|
84
|
+
},
|
|
85
|
+
'recovery-email': {
|
|
86
|
+
subject: 'Vérifiez votre e-mail de récupération',
|
|
87
|
+
heading: 'Votre code de vérification {brandName}',
|
|
88
|
+
description: (email, b) => email
|
|
89
|
+
? `Voici votre code sécurisé à 6 chiffres pour ajouter ${email} comme méthode de récupération à ${b}`
|
|
90
|
+
: `Voici votre code sécurisé à 6 chiffres pour ajouter une méthode de récupération à ${b}`,
|
|
91
|
+
expiry: 'Ce code expirera dans 5 minutes. Si vous n\u2019êtes pas à l\u2019origine de cette demande, vous pouvez ignorer cet e-mail en toute sécurité.',
|
|
92
|
+
},
|
|
93
|
+
'embed-verification': {
|
|
94
|
+
subject: 'Votre code de vérification {brandName}',
|
|
95
|
+
heading: 'Votre code de vérification {brandName}',
|
|
96
|
+
description: email => email
|
|
97
|
+
? `Saisissez ce code pour vérifier ${email} et réclamer votre titre :`
|
|
98
|
+
: 'Saisissez ce code pour vérifier votre adresse e-mail et réclamer votre titre :',
|
|
99
|
+
expiry: 'Ce code expirera dans 10 minutes. Si vous n\u2019êtes pas à l\u2019origine de cette demande, vous pouvez ignorer cet e-mail en toute sécurité.',
|
|
100
|
+
},
|
|
101
|
+
'contact-method': {
|
|
102
|
+
subject: 'Votre code de vérification {brandName}',
|
|
103
|
+
heading: 'Votre code de vérification {brandName}',
|
|
104
|
+
description: () => 'Saisissez ce code dans l\u2019application pour vérifier vos coordonnées.',
|
|
105
|
+
expiry: 'Ce code expirera dans 24 heures. Si vous n\u2019êtes pas à l\u2019origine de cette demande, vous pouvez ignorer cet e-mail en toute sécurité.',
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const AR = {
|
|
109
|
+
login: {
|
|
110
|
+
subject: 'رمز تسجيل الدخول إلى {brandName}',
|
|
111
|
+
heading: 'رمز تسجيل الدخول إلى {brandName}',
|
|
112
|
+
description: (_email, b) => `إليك رمزك الآمن المكوّن من 6 أرقام لتسجيل الدخول إلى ${b}`,
|
|
113
|
+
expiry: 'تنتهي صلاحية هذا الرمز خلال 5 دقائق. إذا لم تطلب ذلك، يمكنك تجاهل هذه الرسالة بأمان.',
|
|
114
|
+
},
|
|
115
|
+
'recovery-email': {
|
|
116
|
+
subject: 'تأكيد بريد الاستعادة الخاص بك',
|
|
117
|
+
heading: 'رمز التحقق الخاص بك في {brandName}',
|
|
118
|
+
description: (email, b) => email
|
|
119
|
+
? `إليك رمزك الآمن المكوّن من 6 أرقام لإضافة ${email} كطريقة استعادة في ${b}`
|
|
120
|
+
: `إليك رمزك الآمن المكوّن من 6 أرقام لإضافة طريقة استعادة في ${b}`,
|
|
121
|
+
expiry: 'تنتهي صلاحية هذا الرمز خلال 5 دقائق. إذا لم تطلب ذلك، يمكنك تجاهل هذه الرسالة بأمان.',
|
|
122
|
+
},
|
|
123
|
+
'embed-verification': {
|
|
124
|
+
subject: 'رمز التحقق الخاص بك في {brandName}',
|
|
125
|
+
heading: 'رمز التحقق الخاص بك في {brandName}',
|
|
126
|
+
description: email => email
|
|
127
|
+
? `أدخل هذا الرمز لتأكيد ${email} والمطالبة بشهادتك:`
|
|
128
|
+
: 'أدخل هذا الرمز لتأكيد عنوان بريدك الإلكتروني والمطالبة بشهادتك:',
|
|
129
|
+
expiry: 'تنتهي صلاحية هذا الرمز خلال 10 دقائق. إذا لم تطلب ذلك، يمكنك تجاهل هذه الرسالة بأمان.',
|
|
130
|
+
},
|
|
131
|
+
'contact-method': {
|
|
132
|
+
subject: 'رمز التحقق الخاص بك في {brandName}',
|
|
133
|
+
heading: 'رمز التحقق الخاص بك في {brandName}',
|
|
134
|
+
description: () => 'أدخل هذا الرمز في التطبيق لتأكيد معلومات الاتصال الخاصة بك.',
|
|
135
|
+
expiry: 'تنتهي صلاحية هذا الرمز خلال 24 ساعة. إذا لم تطلب ذلك، يمكنك تجاهل هذه الرسالة بأمان.',
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
const CATALOGS = {
|
|
139
|
+
en: EN,
|
|
140
|
+
es: ES,
|
|
141
|
+
fr: FR,
|
|
142
|
+
ar: AR,
|
|
143
|
+
};
|
|
144
|
+
/** Shared body strings (interpolates {brandName}). */
|
|
145
|
+
const BODY = {
|
|
146
|
+
en: {
|
|
147
|
+
preview: 'Your code: {code}',
|
|
148
|
+
greeting: 'Hello,',
|
|
149
|
+
passport: '{brandName} is your private, digital passport for learning and work. It lets you securely collect and share your verified skills and achievements online.',
|
|
150
|
+
sincerely: 'Sincerely,',
|
|
151
|
+
codeLabel: 'Verification code',
|
|
152
|
+
},
|
|
153
|
+
es: {
|
|
154
|
+
preview: 'Tu código: {code}',
|
|
155
|
+
greeting: 'Hola,',
|
|
156
|
+
passport: '{brandName} es tu pasaporte digital y privado para el aprendizaje y el trabajo. Te permite recopilar y compartir de forma segura tus habilidades y logros verificados en línea.',
|
|
157
|
+
sincerely: 'Atentamente,',
|
|
158
|
+
codeLabel: 'Código de verificación',
|
|
159
|
+
},
|
|
160
|
+
fr: {
|
|
161
|
+
preview: 'Votre code : {code}',
|
|
162
|
+
greeting: 'Bonjour,',
|
|
163
|
+
passport: '{brandName} est votre passeport numérique privé pour l\u2019apprentissage et le travail. Il vous permet de collecter et de partager en toute sécurité vos compétences et réalisations vérifiées en ligne.',
|
|
164
|
+
sincerely: 'Cordialement,',
|
|
165
|
+
codeLabel: 'Code de vérification',
|
|
166
|
+
},
|
|
167
|
+
ar: {
|
|
168
|
+
preview: 'رمزك: {code}',
|
|
169
|
+
greeting: 'مرحبًا،',
|
|
170
|
+
passport: '{brandName} هو جواز سفرك الرقمي والخاص للتعلّم والعمل. يتيح لك جمع ومشاركة مهاراتك وإنجازاتك الموثّقة بأمان عبر الإنترنت.',
|
|
171
|
+
sincerely: 'مع التحيات،',
|
|
172
|
+
codeLabel: 'رمز التحقق',
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
export const VerificationCode = ({ branding, verificationCode, verificationEmail, variant, locale, }) => {
|
|
176
|
+
const loc = resolveCatalogLocale(locale);
|
|
177
|
+
const config = CATALOGS[loc][variant];
|
|
178
|
+
const body = BODY[loc];
|
|
179
|
+
const heading = interpolate(config.heading, { brandName: branding.brandName });
|
|
180
|
+
const description = config.description(verificationEmail, branding.brandName);
|
|
181
|
+
const passport = interpolate(body.passport, { brandName: branding.brandName });
|
|
182
|
+
return (_jsxs(Layout, { branding: branding, locale: locale, preview: interpolate(body.preview, { code: verificationCode }), children: [_jsx(Text, { style: headingStyle, children: heading }), _jsx(Text, { style: paragraph, children: body.greeting }), _jsx(Text, { style: paragraph, children: description }), _jsx(CodeBlock, { code: verificationCode, label: body.codeLabel }), _jsx(Text, { style: muted, children: config.expiry }), _jsx(Text, { style: paragraph, children: passport }), _jsxs(Text, { style: signOff, children: [body.sincerely, _jsx("br", {}), interpolate(SHARED[resolveCatalogLocale(locale)].teamSignature, {
|
|
183
|
+
brandName: branding.brandName,
|
|
184
|
+
})] })] }));
|
|
185
|
+
};
|
|
186
|
+
export const getVerificationCodeSubject = (branding, variant, locale) => {
|
|
187
|
+
const config = CATALOGS[resolveCatalogLocale(locale)][variant];
|
|
188
|
+
return interpolate(config.subject, { brandName: branding.brandName });
|
|
52
189
|
};
|
|
53
|
-
export const getVerificationCodeSubject = (branding, variant) => VARIANT_CONFIG[variant].subject(branding.brandName);
|
|
54
190
|
// ---------------------------------------------------------------------------
|
|
55
191
|
// Styles
|
|
56
192
|
// ---------------------------------------------------------------------------
|
|
@@ -79,7 +215,7 @@ const signOff = {
|
|
|
79
215
|
margin: '24px 0 0',
|
|
80
216
|
};
|
|
81
217
|
// ---------------------------------------------------------------------------
|
|
82
|
-
// Preview (used by `
|
|
218
|
+
// Preview (used by `pnpm dev` / react-email dev server)
|
|
83
219
|
// ---------------------------------------------------------------------------
|
|
84
220
|
export default function Preview() {
|
|
85
221
|
return (_jsx(VerificationCode, { branding: DEFAULT_BRANDING, verificationCode: "847293", verificationEmail: "jane@example.com", variant: "login" }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-code.js","sourceRoot":"","sources":["../../src/templates/verification-code.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAI/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-code.js","sourceRoot":"","sources":["../../src/templates/verification-code.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-registry.d.ts","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC3B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IAEX,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvC,oEAAoE;IACpE,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC3B,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAqGD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"tenant-registry.d.ts","sourceRoot":"","sources":["../src/tenant-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,MAAM,WAAW,cAAc;IAC3B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IAEX,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvC,oEAAoE;IACpE,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC3B,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAqGD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACjC,SAAS,cAAc,EACvB,cAAc,MAAM,KACrB,cAgCF,CAAC;AAsBF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,EAAE,UAAU,MAAM,KAAG,IAE1E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAC/B,UAAU,MAAM,EAChB,UAAU,OAAO,CAAC,cAAc,CAAC,KAClC,IAKF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@learncard/email-templates",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
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",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"test": "vitest run",
|
|
15
15
|
"test:watch": "vitest",
|
|
16
16
|
"typecheck": "tsc --noEmit",
|
|
17
|
-
"build": "tsc"
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"test:coverage": "vitest run --coverage"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
21
|
"@react-email/components": "^0.0.36",
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
"@types/react": "^18.3.0",
|
|
26
27
|
"react-email": "^3.0.0",
|
|
27
28
|
"typescript": "^5.0.0",
|
|
28
|
-
"vitest": "
|
|
29
|
+
"vitest": "4.1.10"
|
|
29
30
|
},
|
|
30
31
|
"author": "Learning Economy Foundation (www.learningeconomy.io)",
|
|
31
32
|
"license": "MIT",
|