@learncard/email-templates 1.0.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/LICENSE +21 -0
- package/README.md +189 -0
- package/dist/branding.d.ts +36 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +28 -0
- package/dist/branding.js.map +1 -0
- package/dist/components/CodeBlock.d.ts +16 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +42 -0
- package/dist/components/CodeBlock.js.map +1 -0
- package/dist/components/EmailButton.d.ts +15 -0
- package/dist/components/EmailButton.d.ts.map +1 -0
- package/dist/components/EmailButton.js +20 -0
- package/dist/components/EmailButton.js.map +1 -0
- package/dist/components/IssuerLogo.d.ts +14 -0
- package/dist/components/IssuerLogo.d.ts.map +1 -0
- package/dist/components/IssuerLogo.js +23 -0
- package/dist/components/IssuerLogo.js.map +1 -0
- package/dist/components/Layout.d.ts +19 -0
- package/dist/components/Layout.d.ts.map +1 -0
- package/dist/components/Layout.js +95 -0
- package/dist/components/Layout.js.map +1 -0
- package/dist/components/LinkFallback.d.ts +12 -0
- package/dist/components/LinkFallback.d.ts.map +1 -0
- package/dist/components/LinkFallback.js +29 -0
- package/dist/components/LinkFallback.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/previews/_fixtures.d.ts +12 -0
- package/dist/previews/_fixtures.d.ts.map +1 -0
- package/dist/previews/_fixtures.js +34 -0
- package/dist/previews/_fixtures.js.map +1 -0
- package/dist/previews/account-approved-scenarios.d.ts +5 -0
- package/dist/previews/account-approved-scenarios.d.ts.map +1 -0
- package/dist/previews/account-approved-scenarios.js +7 -0
- package/dist/previews/account-approved-scenarios.js.map +1 -0
- package/dist/previews/endorsement-request-scenarios.d.ts +5 -0
- package/dist/previews/endorsement-request-scenarios.d.ts.map +1 -0
- package/dist/previews/endorsement-request-scenarios.js +7 -0
- package/dist/previews/endorsement-request-scenarios.js.map +1 -0
- package/dist/previews/guardian-approval-scenarios.d.ts +5 -0
- package/dist/previews/guardian-approval-scenarios.d.ts.map +1 -0
- package/dist/previews/guardian-approval-scenarios.js +7 -0
- package/dist/previews/guardian-approval-scenarios.js.map +1 -0
- package/dist/previews/guardian-credential-scenarios.d.ts +5 -0
- package/dist/previews/guardian-credential-scenarios.d.ts.map +1 -0
- package/dist/previews/guardian-credential-scenarios.js +11 -0
- package/dist/previews/guardian-credential-scenarios.js.map +1 -0
- package/dist/previews/inbox-claim-scenarios.d.ts +8 -0
- package/dist/previews/inbox-claim-scenarios.d.ts.map +1 -0
- package/dist/previews/inbox-claim-scenarios.js +7 -0
- package/dist/previews/inbox-claim-scenarios.js.map +1 -0
- package/dist/previews/recovery-key-scenarios.d.ts +5 -0
- package/dist/previews/recovery-key-scenarios.d.ts.map +1 -0
- package/dist/previews/recovery-key-scenarios.js +7 -0
- package/dist/previews/recovery-key-scenarios.js.map +1 -0
- package/dist/previews/verification-code-scenarios.d.ts +5 -0
- package/dist/previews/verification-code-scenarios.d.ts.map +1 -0
- package/dist/previews/verification-code-scenarios.js +7 -0
- package/dist/previews/verification-code-scenarios.js.map +1 -0
- package/dist/render.d.ts +185 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +153 -0
- package/dist/render.js.map +1 -0
- package/dist/sms.d.ts +34 -0
- package/dist/sms.d.ts.map +1 -0
- package/dist/sms.js +34 -0
- package/dist/sms.js.map +1 -0
- package/dist/templates/account-approved.d.ts +17 -0
- package/dist/templates/account-approved.d.ts.map +1 -0
- package/dist/templates/account-approved.js +46 -0
- package/dist/templates/account-approved.js.map +1 -0
- package/dist/templates/credential-awaiting-guardian.d.ts +25 -0
- package/dist/templates/credential-awaiting-guardian.d.ts.map +1 -0
- package/dist/templates/credential-awaiting-guardian.js +65 -0
- package/dist/templates/credential-awaiting-guardian.js.map +1 -0
- package/dist/templates/email-verification.d.ts +21 -0
- package/dist/templates/email-verification.d.ts.map +1 -0
- package/dist/templates/email-verification.js +51 -0
- package/dist/templates/email-verification.js.map +1 -0
- package/dist/templates/endorsement-request.d.ts +28 -0
- package/dist/templates/endorsement-request.d.ts.map +1 -0
- package/dist/templates/endorsement-request.js +67 -0
- package/dist/templates/endorsement-request.js.map +1 -0
- package/dist/templates/guardian-approval.d.ts +23 -0
- package/dist/templates/guardian-approval.d.ts.map +1 -0
- package/dist/templates/guardian-approval.js +50 -0
- package/dist/templates/guardian-approval.js.map +1 -0
- package/dist/templates/guardian-approved-claim.d.ts +22 -0
- package/dist/templates/guardian-approved-claim.d.ts.map +1 -0
- package/dist/templates/guardian-approved-claim.js +49 -0
- package/dist/templates/guardian-approved-claim.js.map +1 -0
- package/dist/templates/guardian-credential-approval.d.ts +27 -0
- package/dist/templates/guardian-credential-approval.d.ts.map +1 -0
- package/dist/templates/guardian-credential-approval.js +51 -0
- package/dist/templates/guardian-credential-approval.js.map +1 -0
- package/dist/templates/guardian-email-otp.d.ts +16 -0
- package/dist/templates/guardian-email-otp.d.ts.map +1 -0
- package/dist/templates/guardian-email-otp.js +49 -0
- package/dist/templates/guardian-email-otp.js.map +1 -0
- package/dist/templates/guardian-rejected-credential.d.ts +24 -0
- package/dist/templates/guardian-rejected-credential.d.ts.map +1 -0
- package/dist/templates/guardian-rejected-credential.js +44 -0
- package/dist/templates/guardian-rejected-credential.js.map +1 -0
- package/dist/templates/inbox-claim.d.ts +28 -0
- package/dist/templates/inbox-claim.d.ts.map +1 -0
- package/dist/templates/inbox-claim.js +58 -0
- package/dist/templates/inbox-claim.js.map +1 -0
- package/dist/templates/index.d.ts +25 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +13 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/recovery-key.d.ts +15 -0
- package/dist/templates/recovery-key.d.ts.map +1 -0
- package/dist/templates/recovery-key.js +46 -0
- package/dist/templates/recovery-key.js.map +1 -0
- package/dist/templates/verification-code.d.ts +24 -0
- package/dist/templates/verification-code.d.ts.map +1 -0
- package/dist/templates/verification-code.js +87 -0
- package/dist/templates/verification-code.js.map +1 -0
- package/dist/tenant-registry.d.ts +48 -0
- package/dist/tenant-registry.d.ts.map +1 -0
- package/dist/tenant-registry.js +146 -0
- package/dist/tenant-registry.js.map +1 -0
- package/package.json +40 -0
package/dist/render.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render.ts — the main rendering entry point.
|
|
3
|
+
*
|
|
4
|
+
* Consumers call `renderEmail(templateId, branding, data)` and get back
|
|
5
|
+
* `{ html, text, subject }` — ready to hand to any email provider.
|
|
6
|
+
*
|
|
7
|
+
* Template IDs map to the IDs used by brain-service and lca-api today,
|
|
8
|
+
* so migration can happen one template at a time.
|
|
9
|
+
*/
|
|
10
|
+
import { render } from '@react-email/render';
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import { resolveBranding } from './branding';
|
|
13
|
+
import { VerificationCode, getVerificationCodeSubject, InboxClaim, getInboxClaimSubject, GuardianApproval, getGuardianApprovalSubject, AccountApproved, getAccountApprovedSubject, RecoveryKey, getRecoveryKeySubject, EndorsementRequest, getEndorsementRequestSubject, CredentialAwaitingGuardian, getCredentialAwaitingGuardianSubject, GuardianApprovedClaim, getGuardianApprovedClaimSubject, GuardianCredentialApproval, getGuardianCredentialApprovalSubject, GuardianEmailOtp, getGuardianEmailOtpSubject, GuardianRejectedCredential, getGuardianRejectedCredentialSubject, EmailVerification, getEmailVerificationSubject, } from './templates';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// renderEmail()
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Render a fully branded email for the given template.
|
|
19
|
+
*
|
|
20
|
+
* @param templateId — one of the known template IDs
|
|
21
|
+
* @param branding — partial tenant branding (missing fields use LearnCard defaults)
|
|
22
|
+
* @param data — template-specific data
|
|
23
|
+
* @returns `{ html, text, subject }` ready for any email adapter
|
|
24
|
+
*/
|
|
25
|
+
export async function renderEmail(templateId, branding, data) {
|
|
26
|
+
const resolved = resolveBranding(branding);
|
|
27
|
+
const { element, subject } = buildElement(templateId, resolved, data);
|
|
28
|
+
const html = await render(element);
|
|
29
|
+
const text = await render(element, { plainText: true });
|
|
30
|
+
return { html, text, subject };
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Internal: build the React element + subject for a given template
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
function buildVerificationElement(branding, data, variant) {
|
|
36
|
+
return {
|
|
37
|
+
element: React.createElement(VerificationCode, {
|
|
38
|
+
branding,
|
|
39
|
+
verificationCode: data.verificationCode,
|
|
40
|
+
verificationEmail: data.verificationEmail,
|
|
41
|
+
variant,
|
|
42
|
+
}),
|
|
43
|
+
subject: getVerificationCodeSubject(branding, variant),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function buildElement(templateId, branding, data) {
|
|
47
|
+
switch (templateId) {
|
|
48
|
+
case 'embed-email-verification':
|
|
49
|
+
return buildVerificationElement(branding, data, 'embed-verification');
|
|
50
|
+
case 'contact-method-verification': {
|
|
51
|
+
const d = data;
|
|
52
|
+
const props = { branding, ...d };
|
|
53
|
+
return {
|
|
54
|
+
element: React.createElement(EmailVerification, props),
|
|
55
|
+
subject: getEmailVerificationSubject(branding),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case 'login-verification-code':
|
|
59
|
+
case 'contact-method-verification-1':
|
|
60
|
+
return buildVerificationElement(branding, data, 'login');
|
|
61
|
+
case 'recovery-email-code':
|
|
62
|
+
case 'recovery-email-verification':
|
|
63
|
+
return buildVerificationElement(branding, data, 'recovery-email');
|
|
64
|
+
case 'inbox-claim':
|
|
65
|
+
case 'universal-inbox-claim': {
|
|
66
|
+
const d = data;
|
|
67
|
+
const props = { branding, ...d };
|
|
68
|
+
return {
|
|
69
|
+
element: React.createElement(InboxClaim, props),
|
|
70
|
+
subject: getInboxClaimSubject(branding, props),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
case 'guardian-approval': {
|
|
74
|
+
const d = data;
|
|
75
|
+
const props = { branding, ...d };
|
|
76
|
+
return {
|
|
77
|
+
element: React.createElement(GuardianApproval, props),
|
|
78
|
+
subject: getGuardianApprovalSubject(branding, props),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
case 'account-approved':
|
|
82
|
+
case 'account-approved-email': {
|
|
83
|
+
const d = data;
|
|
84
|
+
return {
|
|
85
|
+
element: React.createElement(AccountApproved, { branding, ...d }),
|
|
86
|
+
subject: getAccountApprovedSubject(branding),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
case 'recovery-key':
|
|
90
|
+
case 'recovery-key-backup': {
|
|
91
|
+
const d = data;
|
|
92
|
+
const props = { branding, ...d };
|
|
93
|
+
return {
|
|
94
|
+
element: React.createElement(RecoveryKey, props),
|
|
95
|
+
subject: getRecoveryKeySubject(branding),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case 'endorsement-request':
|
|
99
|
+
case 'universal-inbox-claim-1': {
|
|
100
|
+
const d = data;
|
|
101
|
+
const props = { branding, ...d };
|
|
102
|
+
return {
|
|
103
|
+
element: React.createElement(EndorsementRequest, props),
|
|
104
|
+
subject: getEndorsementRequestSubject(branding, props),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
case 'credential-awaiting-guardian': {
|
|
108
|
+
const d = data;
|
|
109
|
+
const props = { branding, ...d };
|
|
110
|
+
return {
|
|
111
|
+
element: React.createElement(CredentialAwaitingGuardian, props),
|
|
112
|
+
subject: getCredentialAwaitingGuardianSubject(branding),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
case 'guardian-approved-claim': {
|
|
116
|
+
const d = data;
|
|
117
|
+
const props = { branding, ...d };
|
|
118
|
+
return {
|
|
119
|
+
element: React.createElement(GuardianApprovedClaim, props),
|
|
120
|
+
subject: getGuardianApprovedClaimSubject(branding),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
case 'guardian-credential-approval': {
|
|
124
|
+
const d = data;
|
|
125
|
+
const props = { branding, ...d };
|
|
126
|
+
return {
|
|
127
|
+
element: React.createElement(GuardianCredentialApproval, props),
|
|
128
|
+
subject: getGuardianCredentialApprovalSubject(branding),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
case 'guardian-email-otp': {
|
|
132
|
+
const d = data;
|
|
133
|
+
const props = { branding, ...d };
|
|
134
|
+
return {
|
|
135
|
+
element: React.createElement(GuardianEmailOtp, props),
|
|
136
|
+
subject: getGuardianEmailOtpSubject(branding),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
case 'guardian-rejected-credential': {
|
|
140
|
+
const d = data;
|
|
141
|
+
const props = { branding, ...d };
|
|
142
|
+
return {
|
|
143
|
+
element: React.createElement(GuardianRejectedCredential, props),
|
|
144
|
+
subject: getGuardianRejectedCredentialSubject(branding),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
default: {
|
|
148
|
+
const _exhaustive = templateId;
|
|
149
|
+
throw new Error(`Unknown template: ${_exhaustive}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/sms.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMS template rendering — tenant-aware replacement for sms.helpers.ts.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name.
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantBranding } from './branding';
|
|
7
|
+
export interface SmsInboxClaimData {
|
|
8
|
+
claimUrl: string;
|
|
9
|
+
recipient?: {
|
|
10
|
+
name?: string;
|
|
11
|
+
};
|
|
12
|
+
issuer?: {
|
|
13
|
+
name?: string;
|
|
14
|
+
};
|
|
15
|
+
credential?: {
|
|
16
|
+
name?: string;
|
|
17
|
+
type?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface SmsVerificationData {
|
|
21
|
+
verificationToken: string;
|
|
22
|
+
}
|
|
23
|
+
export type SmsTemplateId = 'inbox-claim' | 'contact-method-verification';
|
|
24
|
+
export interface SmsTemplateDataMap {
|
|
25
|
+
'inbox-claim': SmsInboxClaimData;
|
|
26
|
+
'contact-method-verification': SmsVerificationData;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Render a branded SMS body for the given template.
|
|
30
|
+
*
|
|
31
|
+
* @returns The SMS body string, or `undefined` if the templateId is unknown.
|
|
32
|
+
*/
|
|
33
|
+
export declare function renderSms<T extends SmsTemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: SmsTemplateDataMap[T]): string | undefined;
|
|
34
|
+
//# sourceMappingURL=sms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms.d.ts","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOjD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAChC,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,6BAA6B,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IAC/B,aAAa,EAAE,iBAAiB,CAAC;IACjC,6BAA6B,EAAE,mBAAmB,CAAC;CACtD;AAMD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC7C,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,EAClD,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,MAAM,GAAG,SAAS,CAuBpB"}
|
package/dist/sms.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMS template rendering — tenant-aware replacement for sms.helpers.ts.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the hardcoded "LearnCard" in SMS text with the tenant's brand name.
|
|
5
|
+
*/
|
|
6
|
+
import { resolveBranding } from './branding';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// renderSms()
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Render a branded SMS body for the given template.
|
|
12
|
+
*
|
|
13
|
+
* @returns The SMS body string, or `undefined` if the templateId is unknown.
|
|
14
|
+
*/
|
|
15
|
+
export function renderSms(templateId, branding, data) {
|
|
16
|
+
const resolved = resolveBranding(branding);
|
|
17
|
+
switch (templateId) {
|
|
18
|
+
case 'inbox-claim': {
|
|
19
|
+
const d = data;
|
|
20
|
+
const greeting = d.recipient?.name ? `Hello, ${d.recipient.name}! ` : '';
|
|
21
|
+
const credType = d.credential?.type ?? 'credential';
|
|
22
|
+
const credName = d.credential?.name ?? 'Unnamed Credential';
|
|
23
|
+
const issuerPart = d.issuer?.name ? ` from ${d.issuer.name}.` : '.';
|
|
24
|
+
return `${greeting}You have a new ${credType}, "${credName}"${issuerPart} Claim it here: ${d.claimUrl}`;
|
|
25
|
+
}
|
|
26
|
+
case 'contact-method-verification': {
|
|
27
|
+
const d = data;
|
|
28
|
+
return `Your ${resolved.brandName} verification code is: ${d.verificationToken}`;
|
|
29
|
+
}
|
|
30
|
+
default:
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sms.js.map
|
package/dist/sms.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms.js","sourceRoot":"","sources":["../src/sms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwB7C,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACrB,UAAa,EACb,QAAkD,EAClD,IAA2B;IAE3B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE3C,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,IAAyB,CAAC;YACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,IAAI,YAAY,CAAC;YACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,IAAI,oBAAoB,CAAC;YAC5D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAEpE,OAAO,GAAG,QAAQ,kBAAkB,QAAQ,MAAM,QAAQ,IAAI,UAAU,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5G,CAAC;QAED,KAAK,6BAA6B,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,IAA2B,CAAC;YAEtC,OAAO,QAAQ,QAAQ,CAAC,SAAS,0BAA0B,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACrF,CAAC;QAED;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AccountApproved — email sent when a user's account has been approved.
|
|
3
|
+
*
|
|
4
|
+
* Used by: brain-service inbox.ts (templateId: 'account-approved-email')
|
|
5
|
+
*/
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import type { TenantBranding } from '../branding';
|
|
8
|
+
export interface AccountApprovedProps {
|
|
9
|
+
branding: TenantBranding;
|
|
10
|
+
user?: {
|
|
11
|
+
displayName?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare const AccountApproved: React.FC<AccountApprovedProps>;
|
|
15
|
+
export declare const getAccountApprovedSubject: (branding: TenantBranding) => string;
|
|
16
|
+
export default function Preview(): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=account-approved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-approved.d.ts","sourceRoot":"","sources":["../../src/templates/account-approved.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACL;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAsC1D,CAAC;AAEF,eAAO,MAAM,yBAAyB,aAAc,cAAc,KAAG,MACX,CAAC;AAmC3D,MAAM,CAAC,OAAO,UAAU,OAAO,4CAO9B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* AccountApproved — email sent when a user's account has been approved.
|
|
4
|
+
*
|
|
5
|
+
* Used by: brain-service inbox.ts (templateId: 'account-approved-email')
|
|
6
|
+
*/
|
|
7
|
+
import { Text, Section } from '@react-email/components';
|
|
8
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
9
|
+
import { Layout } from '../components/Layout';
|
|
10
|
+
import { EmailButton } from '../components/EmailButton';
|
|
11
|
+
export const AccountApproved = ({ branding, user, }) => {
|
|
12
|
+
const name = user?.displayName ?? 'there';
|
|
13
|
+
return (_jsxs(Layout, { branding: branding, preview: `Your ${branding.brandName} account has been approved!`, children: [_jsxs(Text, { style: heading, children: ["Your ", branding.brandName, " account has been approved!"] }), _jsxs(Text, { style: paragraph, children: ["Hello ", name, ","] }), _jsxs(Text, { style: paragraph, children: ["Your ", branding.brandName, " account has been approved by your guardian/parent."] }), _jsxs(Text, { style: paragraph, children: [branding.brandName, " is a private, digital passport for learning and work. It lets users securely collect and share their verified skills and achievements online."] }), _jsx(Text, { style: paragraph, children: "Please click the button below to login to your account." }), _jsx(Section, { style: buttonWrapper, children: _jsxs(EmailButton, { href: branding.appUrl, branding: branding, children: ["Login to ", branding.brandName, " \u2192"] }) }), _jsxs(Text, { style: signOff, children: ["Thank you,", _jsx("br", {}), "The ", branding.brandName, " Team"] })] }));
|
|
14
|
+
};
|
|
15
|
+
export const getAccountApprovedSubject = (branding) => `Your ${branding.brandName} account has been approved`;
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Styles
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
const heading = {
|
|
20
|
+
fontSize: 24,
|
|
21
|
+
fontWeight: 600,
|
|
22
|
+
color: '#111827',
|
|
23
|
+
margin: '0 0 24px',
|
|
24
|
+
};
|
|
25
|
+
const paragraph = {
|
|
26
|
+
fontSize: 16,
|
|
27
|
+
color: '#374151',
|
|
28
|
+
lineHeight: '24px',
|
|
29
|
+
margin: '0 0 24px',
|
|
30
|
+
};
|
|
31
|
+
const buttonWrapper = {
|
|
32
|
+
margin: '0 0 24px',
|
|
33
|
+
};
|
|
34
|
+
const signOff = {
|
|
35
|
+
fontSize: 14,
|
|
36
|
+
color: '#374151',
|
|
37
|
+
lineHeight: '20px',
|
|
38
|
+
margin: '24px 0 0',
|
|
39
|
+
};
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Preview
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
export default function Preview() {
|
|
44
|
+
return (_jsx(AccountApproved, { branding: DEFAULT_BRANDING, user: { displayName: 'Jane Doe' } }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=account-approved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-approved.js","sourceRoot":"","sources":["../../src/templates/account-approved.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;AASxD,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC5D,QAAQ,EACR,IAAI,GACP,EAAE,EAAE;IACD,MAAM,IAAI,GAAG,IAAI,EAAE,WAAW,IAAI,OAAO,CAAC;IAE1C,OAAO,CACH,MAAC,MAAM,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,QAAQ,CAAC,SAAS,6BAA6B,aACxF,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,sBAAQ,QAAQ,CAAC,SAAS,mCAAmC,EAEjF,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,uBACX,IAAI,SACR,EAEP,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,sBACZ,QAAQ,CAAC,SAAS,2DACrB,EAEP,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,aACjB,QAAQ,CAAC,SAAS,sJAEhB,EAEP,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,wEAEf,EAEP,KAAC,OAAO,IAAC,KAAK,EAAE,aAAa,YACzB,MAAC,WAAW,IAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,0BACxC,QAAQ,CAAC,SAAS,eAClB,GACR,EAEV,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,2BACN,cAAM,UAAK,QAAQ,CAAC,SAAS,aACpC,IACF,CACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAwB,EAAU,EAAE,CAC1E,QAAQ,QAAQ,CAAC,SAAS,4BAA4B,CAAC;AAE3D,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,aAAa,GAAwB;IACvC,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,OAAO,GAAwB;IACjC,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,UAAU;CACrB,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,CAAC,OAAO,UAAU,OAAO;IAC3B,OAAO,CACH,KAAC,eAAe,IACZ,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,GACnC,CACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CredentialAwaitingGuardian — email sent to a student/recipient when their
|
|
3
|
+
* credential is pending guardian approval.
|
|
4
|
+
*
|
|
5
|
+
* Used by: brain-service (templateAlias: 'credential-awaiting-guardian')
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import type { TenantBranding } from '../branding';
|
|
9
|
+
export interface CredentialAwaitingGuardianProps {
|
|
10
|
+
branding: TenantBranding;
|
|
11
|
+
issuer?: {
|
|
12
|
+
name?: string;
|
|
13
|
+
logoUrl?: string;
|
|
14
|
+
};
|
|
15
|
+
credential?: {
|
|
16
|
+
name?: string;
|
|
17
|
+
};
|
|
18
|
+
recipient?: {
|
|
19
|
+
email?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare const CredentialAwaitingGuardian: React.FC<CredentialAwaitingGuardianProps>;
|
|
23
|
+
export declare const getCredentialAwaitingGuardianSubject: (_branding: TenantBranding) => string;
|
|
24
|
+
export default function Preview(): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=credential-awaiting-guardian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-awaiting-guardian.d.ts","sourceRoot":"","sources":["../../src/templates/credential-awaiting-guardian.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,WAAW,+BAA+B;IAC5C,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACL;AAED,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAwChF,CAAC;AAEF,eAAO,MAAM,oCAAoC,cAClC,cAAc,KAC1B,MAAwD,CAAC;AAsD5D,MAAM,CAAC,OAAO,UAAU,OAAO,4CAS9B"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* CredentialAwaitingGuardian — email sent to a student/recipient when their
|
|
4
|
+
* credential is pending guardian approval.
|
|
5
|
+
*
|
|
6
|
+
* Used by: brain-service (templateAlias: 'credential-awaiting-guardian')
|
|
7
|
+
*/
|
|
8
|
+
import { Text, Section } from '@react-email/components';
|
|
9
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
10
|
+
import { Layout } from '../components/Layout';
|
|
11
|
+
import { IssuerLogo } from '../components/IssuerLogo';
|
|
12
|
+
export const CredentialAwaitingGuardian = ({ branding, issuer, credential, }) => {
|
|
13
|
+
const issuerName = issuer?.name ?? 'An issuer';
|
|
14
|
+
const credentialName = credential?.name ?? 'a credential';
|
|
15
|
+
return (_jsxs(Layout, { branding: branding, preview: `Your credential "${credentialName}" is pending guardian approval`, showHeaderLogo: false, children: [_jsx(IssuerLogo, { logoUrl: issuer?.logoUrl, alt: issuerName ? `${issuerName} logo` : undefined }), _jsx(Text, { style: heading, children: "Pending guardian approval" }), _jsx(Text, { style: paragraph, children: "Hi there," }), _jsxs(Text, { style: paragraph, children: [_jsx("strong", { children: issuerName }), " has sent you the credential", ' ', _jsxs("strong", { children: ["\u201C", credentialName, "\u201D"] }), "."] }), _jsxs(Text, { style: paragraph, children: ["Before you can claim it, your guardian needs to review and approve it first. We've already sent them a notification \u2014 once they approve, you'll receive a follow-up email and the credential will appear in your ", branding.brandName, " account."] }), _jsx(Section, { style: statusBadge, children: _jsx(Text, { style: statusText, children: "Awaiting Guardian Approval" }) }), _jsx(Text, { style: muted, children: "No action is needed from you right now." }), _jsxs(Text, { style: signOff, children: ["Sincerely,", _jsx("br", {}), "The ", branding.brandName, " Team"] })] }));
|
|
16
|
+
};
|
|
17
|
+
export const getCredentialAwaitingGuardianSubject = (_branding) => 'Your Credential Is Pending Guardian Approval';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Styles
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const heading = {
|
|
22
|
+
fontSize: 24,
|
|
23
|
+
fontWeight: 600,
|
|
24
|
+
color: '#111827',
|
|
25
|
+
margin: '0 0 24px',
|
|
26
|
+
};
|
|
27
|
+
const paragraph = {
|
|
28
|
+
fontSize: 16,
|
|
29
|
+
color: '#374151',
|
|
30
|
+
lineHeight: '24px',
|
|
31
|
+
margin: '0 0 24px',
|
|
32
|
+
};
|
|
33
|
+
const statusBadge = {
|
|
34
|
+
backgroundColor: '#f5f3ff',
|
|
35
|
+
border: '1px solid #ddd6fe',
|
|
36
|
+
borderRadius: 8,
|
|
37
|
+
padding: '16px 24px',
|
|
38
|
+
margin: '20px 0',
|
|
39
|
+
textAlign: 'center',
|
|
40
|
+
};
|
|
41
|
+
const statusText = {
|
|
42
|
+
fontSize: 14,
|
|
43
|
+
fontWeight: 600,
|
|
44
|
+
color: '#6366f1',
|
|
45
|
+
margin: 0,
|
|
46
|
+
};
|
|
47
|
+
const muted = {
|
|
48
|
+
fontSize: 14,
|
|
49
|
+
color: '#6b7280',
|
|
50
|
+
lineHeight: '20px',
|
|
51
|
+
margin: '0 0 24px',
|
|
52
|
+
};
|
|
53
|
+
const signOff = {
|
|
54
|
+
fontSize: 14,
|
|
55
|
+
color: '#374151',
|
|
56
|
+
lineHeight: '20px',
|
|
57
|
+
margin: '24px 0 0',
|
|
58
|
+
};
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Preview
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
export default function Preview() {
|
|
63
|
+
return (_jsx(CredentialAwaitingGuardian, { branding: DEFAULT_BRANDING, issuer: { name: 'Springfield School District' }, credential: { name: 'Perfect Attendance Award' }, recipient: { email: 'student@example.com' } }));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=credential-awaiting-guardian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-awaiting-guardian.js","sourceRoot":"","sources":["../../src/templates/credential-awaiting-guardian.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmailVerification — link-based email verification (click a button to verify).
|
|
3
|
+
*
|
|
4
|
+
* Used by: brain-service contact-methods.ts (templateId: 'contact-method-verification')
|
|
5
|
+
*
|
|
6
|
+
* This is distinct from VerificationCode (which displays a 6-digit code).
|
|
7
|
+
* Here the user receives a UUID token embedded in a CTA link.
|
|
8
|
+
*/
|
|
9
|
+
import * as React from 'react';
|
|
10
|
+
import type { TenantBranding } from '../branding';
|
|
11
|
+
export interface EmailVerificationProps {
|
|
12
|
+
branding: TenantBranding;
|
|
13
|
+
verificationToken: string;
|
|
14
|
+
recipient?: {
|
|
15
|
+
name?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare const EmailVerification: React.FC<EmailVerificationProps>;
|
|
19
|
+
export declare const getEmailVerificationSubject: (_branding: TenantBranding) => string;
|
|
20
|
+
export default function Preview(): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=email-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-verification.d.ts","sourceRoot":"","sources":["../../src/templates/email-verification.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAoC9D,CAAC;AAEF,eAAO,MAAM,2BAA2B,cACzB,cAAc,KAC1B,MAA6B,CAAC;AAmCjC,MAAM,CAAC,OAAO,UAAU,OAAO,4CAQ9B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EmailVerification — link-based email verification (click a button to verify).
|
|
4
|
+
*
|
|
5
|
+
* Used by: brain-service contact-methods.ts (templateId: 'contact-method-verification')
|
|
6
|
+
*
|
|
7
|
+
* This is distinct from VerificationCode (which displays a 6-digit code).
|
|
8
|
+
* Here the user receives a UUID token embedded in a CTA link.
|
|
9
|
+
*/
|
|
10
|
+
import { Text, Section } from '@react-email/components';
|
|
11
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
12
|
+
import { Layout } from '../components/Layout';
|
|
13
|
+
import { EmailButton } from '../components/EmailButton';
|
|
14
|
+
import { LinkFallback } from '../components/LinkFallback';
|
|
15
|
+
export const EmailVerification = ({ branding, verificationToken, recipient, }) => {
|
|
16
|
+
const greeting = recipient?.name ? `Hello ${recipient.name},` : 'Hello,';
|
|
17
|
+
const verifyUrl = `${branding.appUrl}/verify-email?token=${verificationToken}`;
|
|
18
|
+
return (_jsxs(Layout, { branding: branding, preview: "Verify your email address", children: [_jsx(Text, { style: heading, children: "Verify Your Email" }), _jsx(Text, { style: paragraph, children: greeting }), _jsx(Text, { style: paragraph, children: "Please click the button below to verify your email address." }), _jsxs(Text, { style: paragraph, children: [branding.brandName, " is your private, digital passport for learning and work. It lets you securely collect and share your verified skills and achievements online."] }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: verifyUrl, branding: branding, children: "Verify Your Email \u2192" }) }), _jsxs(Text, { style: signOff, children: ["Sincerely,", _jsx("br", {}), "The ", branding.brandName, " Team"] }), _jsx(LinkFallback, { href: verifyUrl })] }));
|
|
19
|
+
};
|
|
20
|
+
export const getEmailVerificationSubject = (_branding) => 'Verify Your Email';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Styles
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const heading = {
|
|
25
|
+
fontSize: 24,
|
|
26
|
+
fontWeight: 600,
|
|
27
|
+
color: '#111827',
|
|
28
|
+
margin: '0 0 24px',
|
|
29
|
+
};
|
|
30
|
+
const paragraph = {
|
|
31
|
+
fontSize: 16,
|
|
32
|
+
color: '#374151',
|
|
33
|
+
lineHeight: '24px',
|
|
34
|
+
margin: '0 0 24px',
|
|
35
|
+
};
|
|
36
|
+
const buttonWrapper = {
|
|
37
|
+
margin: '0 0 24px',
|
|
38
|
+
};
|
|
39
|
+
const signOff = {
|
|
40
|
+
fontSize: 14,
|
|
41
|
+
color: '#374151',
|
|
42
|
+
lineHeight: '20px',
|
|
43
|
+
margin: '24px 0 0',
|
|
44
|
+
};
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Preview
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
export default function Preview() {
|
|
49
|
+
return (_jsx(EmailVerification, { branding: DEFAULT_BRANDING, verificationToken: "f47ac10b-58cc-4372-a567-0e02b2c3d479", recipient: { name: 'Jane Doe' } }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=email-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-verification.js","sourceRoot":"","sources":["../../src/templates/email-verification.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;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;AAU1D,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAChE,QAAQ,EACR,iBAAiB,EACjB,SAAS,GACZ,EAAE,EAAE;IACD,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzE,MAAM,SAAS,GAAG,GAAG,QAAQ,CAAC,MAAM,uBAAuB,iBAAiB,EAAE,CAAC;IAE/E,OAAO,CACH,MAAC,MAAM,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,2BAA2B,aAC3D,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,kCAA0B,EAE9C,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,QAAQ,GAAQ,EAEzC,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,4EAEf,EAEP,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,aACjB,QAAQ,CAAC,SAAS,sJAEhB,EAEP,KAAC,OAAO,IAAC,KAAK,EAAE,aAAa,YACzB,KAAC,WAAW,IAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,yCAElC,GACR,EAEV,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,2BACN,cAAM,UAAK,QAAQ,CAAC,SAAS,aACpC,EAEP,KAAC,YAAY,IAAC,IAAI,EAAE,SAAS,GAAI,IAC5B,CACZ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACvC,SAAyB,EACnB,EAAE,CAAC,mBAAmB,CAAC;AAEjC,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,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,iBAAiB,IACd,QAAQ,EAAE,gBAAgB,EAC1B,iBAAiB,EAAC,sCAAsC,EACxD,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GACjC,CACL,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EndorsementRequest — email asking someone to endorse a credential.
|
|
3
|
+
*
|
|
4
|
+
* Used by: lca-api credentials.ts (templateAlias: ENDORSEMENT_REQUEST_TEMPLATE_ALIAS)
|
|
5
|
+
*/
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import type { TenantBranding } from '../branding';
|
|
8
|
+
export interface EndorsementRequestProps {
|
|
9
|
+
branding: TenantBranding;
|
|
10
|
+
shareLink: string;
|
|
11
|
+
recipient?: {
|
|
12
|
+
name?: string;
|
|
13
|
+
email?: string;
|
|
14
|
+
};
|
|
15
|
+
issuer?: {
|
|
16
|
+
name?: string;
|
|
17
|
+
logoUrl?: string;
|
|
18
|
+
};
|
|
19
|
+
credential?: {
|
|
20
|
+
name?: string;
|
|
21
|
+
type?: string;
|
|
22
|
+
};
|
|
23
|
+
message?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const EndorsementRequest: React.FC<EndorsementRequestProps>;
|
|
26
|
+
export declare const getEndorsementRequestSubject: (_branding: TenantBranding, props: EndorsementRequestProps) => string;
|
|
27
|
+
export default function Preview(): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=endorsement-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endorsement-request.d.ts","sourceRoot":"","sources":["../../src/templates/endorsement-request.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,uBAAuB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmDhE,CAAC;AAEF,eAAO,MAAM,4BAA4B,cAC1B,cAAc,SAClB,uBAAuB,KAC/B,MAIF,CAAC;AAmDF,MAAM,CAAC,OAAO,UAAU,OAAO,4CAW9B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EndorsementRequest — email asking someone to endorse a credential.
|
|
4
|
+
*
|
|
5
|
+
* Used by: lca-api credentials.ts (templateAlias: ENDORSEMENT_REQUEST_TEMPLATE_ALIAS)
|
|
6
|
+
*/
|
|
7
|
+
import { Text, Section } from '@react-email/components';
|
|
8
|
+
import { DEFAULT_BRANDING } from '../branding';
|
|
9
|
+
import { Layout } from '../components/Layout';
|
|
10
|
+
import { EmailButton } from '../components/EmailButton';
|
|
11
|
+
import { IssuerLogo } from '../components/IssuerLogo';
|
|
12
|
+
import { LinkFallback } from '../components/LinkFallback';
|
|
13
|
+
export const EndorsementRequest = ({ branding, shareLink, recipient, issuer, credential, message, }) => {
|
|
14
|
+
const greeting = recipient?.name ? `Hello ${recipient.name},` : 'Hello,';
|
|
15
|
+
const issuerName = issuer?.name ?? 'Someone';
|
|
16
|
+
const credentialName = credential?.name;
|
|
17
|
+
return (_jsxs(Layout, { branding: branding, preview: `${issuerName} is requesting your endorsement`, showHeaderLogo: false, children: [_jsx(IssuerLogo, { logoUrl: issuer?.logoUrl, alt: issuerName ? `${issuerName} logo` : undefined }), _jsx(Text, { style: paragraph, children: greeting }), _jsxs(Text, { style: paragraph, children: [_jsx("strong", { children: issuerName }), " has requested an endorsement from you", credentialName ? _jsxs(_Fragment, { children: [" for ", _jsx("strong", { children: credentialName })] }) : '', "."] }), message && (_jsxs(Section, { style: messageBox, children: [_jsx(Text, { style: messageText, children: message }), issuer?.name && (_jsxs(Text, { style: messageSender, children: ["\u2014 ", issuer.name] }))] })), _jsxs(Text, { style: paragraph, children: [branding.brandName, " is your private, digital passport for learning and work. It lets you securely collect and share your verified skills and achievements online."] }), _jsx(Section, { style: buttonWrapper, children: _jsx(EmailButton, { href: shareLink, branding: branding, children: "Endorse \u2192" }) }), _jsxs(Text, { style: signOff, children: ["Sincerely,", _jsx("br", {}), "The ", branding.brandName, " Team"] }), _jsx(LinkFallback, { href: shareLink })] }));
|
|
18
|
+
};
|
|
19
|
+
export const getEndorsementRequestSubject = (_branding, props) => {
|
|
20
|
+
const issuerName = props.issuer?.name ?? 'Someone';
|
|
21
|
+
return `${issuerName} is requesting your endorsement`;
|
|
22
|
+
};
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Styles
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
const paragraph = {
|
|
27
|
+
fontSize: 16,
|
|
28
|
+
color: '#374151',
|
|
29
|
+
lineHeight: '24px',
|
|
30
|
+
margin: '0 0 24px',
|
|
31
|
+
};
|
|
32
|
+
const messageBox = {
|
|
33
|
+
backgroundColor: '#f6f6f9',
|
|
34
|
+
borderRadius: 8,
|
|
35
|
+
padding: '16px 20px',
|
|
36
|
+
margin: '16px 0',
|
|
37
|
+
borderLeft: '3px solid #C5C8D3',
|
|
38
|
+
};
|
|
39
|
+
const messageText = {
|
|
40
|
+
fontSize: 15,
|
|
41
|
+
color: '#111827',
|
|
42
|
+
lineHeight: '22px',
|
|
43
|
+
margin: 0,
|
|
44
|
+
textAlign: 'left',
|
|
45
|
+
};
|
|
46
|
+
const messageSender = {
|
|
47
|
+
fontSize: 14,
|
|
48
|
+
fontWeight: 600,
|
|
49
|
+
color: '#111827',
|
|
50
|
+
margin: '12px 0 0',
|
|
51
|
+
};
|
|
52
|
+
const buttonWrapper = {
|
|
53
|
+
margin: '0 0 24px',
|
|
54
|
+
};
|
|
55
|
+
const signOff = {
|
|
56
|
+
fontSize: 14,
|
|
57
|
+
color: '#374151',
|
|
58
|
+
lineHeight: '20px',
|
|
59
|
+
margin: '24px 0 0',
|
|
60
|
+
};
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Preview
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
export default function Preview() {
|
|
65
|
+
return (_jsx(EndorsementRequest, { branding: DEFAULT_BRANDING, shareLink: "https://learncard.app/share/xyz789", recipient: { name: 'Dr. Emily Chen' }, issuer: { name: 'John Doe' }, credential: { name: 'Professional Teaching Certificate' }, message: "I would greatly appreciate your endorsement of my teaching credential. We worked together at Springfield Academy for 3 years." }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=endorsement-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endorsement-request.js","sourceRoot":"","sources":["../../src/templates/endorsement-request.tsx"],"names":[],"mappings":"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"}
|