@headless-lms/adapter-email-templates 0.2.4 โ 0.3.0
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.js +94 -82
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -62,7 +62,10 @@ function Paragraph({ children }) {
|
|
|
62
62
|
const PREVIEW_CTX = {
|
|
63
63
|
brandName: "Acme LMS",
|
|
64
64
|
baseUrl: "http://localhost:8001",
|
|
65
|
-
|
|
65
|
+
hosts: {
|
|
66
|
+
courses: "http://localhost:8002",
|
|
67
|
+
community: "http://localhost:8002"
|
|
68
|
+
}
|
|
66
69
|
};
|
|
67
70
|
//#endregion
|
|
68
71
|
//#region src/emails/magic-link.tsx
|
|
@@ -203,82 +206,16 @@ EmailVerification.PreviewProps = {
|
|
|
203
206
|
params: { verifyUrl: "http://localhost:8002/verify?token=demo" }
|
|
204
207
|
};
|
|
205
208
|
//#endregion
|
|
206
|
-
//#region src/emails/
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
download: "downloads",
|
|
211
|
-
community: "communities",
|
|
212
|
-
event: "events"
|
|
213
|
-
};
|
|
214
|
-
const BUTTON = {
|
|
215
|
-
course: "Start learning",
|
|
216
|
-
download: "View download",
|
|
217
|
-
community: "Open community",
|
|
218
|
-
event: "Open event",
|
|
219
|
-
bundle: "Open your library"
|
|
220
|
-
};
|
|
221
|
-
function hrefOf(ctx, params) {
|
|
222
|
-
return params.contentType === "bundle" ? ctx.studentPortalUrl : `${ctx.studentPortalUrl}/${PORTAL_PATH[params.contentType]}/${params.contentId}`;
|
|
223
|
-
}
|
|
224
|
-
function AccessGranted({ ctx, params }) {
|
|
225
|
-
return /* @__PURE__ */ jsxs(Layout, {
|
|
226
|
-
ctx,
|
|
227
|
-
heading: `${params.contentTitle} is ready for you`,
|
|
228
|
-
children: [/* @__PURE__ */ jsx(Paragraph, { children: params.contentType === "bundle" ? "You've been granted access to everything it includes. Jump in whenever you're ready." : "You've been granted access. Jump in whenever you're ready." }), /* @__PURE__ */ jsx(EmailButton, {
|
|
229
|
-
href: hrefOf(ctx, params),
|
|
230
|
-
children: BUTTON[params.contentType]
|
|
231
|
-
})]
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
AccessGranted.PreviewProps = {
|
|
235
|
-
ctx: PREVIEW_CTX,
|
|
236
|
-
params: {
|
|
237
|
-
contentTitle: "Fly Tying 101",
|
|
238
|
-
contentId: "demo",
|
|
239
|
-
contentType: "course"
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
//#endregion
|
|
243
|
-
//#region src/emails/access-revoked.tsx
|
|
244
|
-
const subject$1 = (_ctx, params) => `Your access to ${params.contentTitle} has ended`;
|
|
245
|
-
function AccessRevoked({ ctx, params }) {
|
|
246
|
-
return /* @__PURE__ */ jsx(Layout, {
|
|
247
|
-
ctx,
|
|
248
|
-
heading: "Access ended",
|
|
249
|
-
children: /* @__PURE__ */ jsxs(Paragraph, { children: [
|
|
250
|
-
"Your access to ",
|
|
251
|
-
params.contentTitle,
|
|
252
|
-
" has ended. If you think this is a mistake, reply to this email."
|
|
253
|
-
] })
|
|
254
|
-
});
|
|
209
|
+
//#region src/emails/community.tsx
|
|
210
|
+
function hostsOf(ctx) {
|
|
211
|
+
if (!ctx.hosts) throw new Error("This email links to an organization's apps and was sent without one");
|
|
212
|
+
return ctx.hosts;
|
|
255
213
|
}
|
|
256
|
-
|
|
257
|
-
ctx
|
|
258
|
-
params: { contentTitle: "Fly Tying 101" }
|
|
259
|
-
};
|
|
260
|
-
//#endregion
|
|
261
|
-
//#region src/emails/course-completed.tsx
|
|
262
|
-
const subject = (_ctx, params) => `You completed ${params.courseTitle} ๐`;
|
|
263
|
-
function CourseCompleted({ ctx, params }) {
|
|
264
|
-
return /* @__PURE__ */ jsx(Layout, {
|
|
265
|
-
ctx,
|
|
266
|
-
heading: "Congratulations!",
|
|
267
|
-
children: /* @__PURE__ */ jsxs(Paragraph, { children: [
|
|
268
|
-
"You've completed ",
|
|
269
|
-
params.courseTitle,
|
|
270
|
-
". Nice work."
|
|
271
|
-
] })
|
|
272
|
-
});
|
|
214
|
+
function communityApp(ctx, path) {
|
|
215
|
+
return `${hostsOf(ctx).community}${path}`;
|
|
273
216
|
}
|
|
274
|
-
|
|
275
|
-
ctx
|
|
276
|
-
params: { courseTitle: "Fly Tying 101" }
|
|
277
|
-
};
|
|
278
|
-
//#endregion
|
|
279
|
-
//#region src/emails/community.tsx
|
|
280
|
-
function portal(ctx, path) {
|
|
281
|
-
return `${ctx.studentPortalUrl}${path}`;
|
|
217
|
+
function courseApp(ctx, path) {
|
|
218
|
+
return `${hostsOf(ctx).courses}${path}`;
|
|
282
219
|
}
|
|
283
220
|
function defineEmail(opts) {
|
|
284
221
|
function Component({ ctx, params }) {
|
|
@@ -301,11 +238,11 @@ function defineEmail(opts) {
|
|
|
301
238
|
Component
|
|
302
239
|
};
|
|
303
240
|
}
|
|
304
|
-
const community = (ctx, id) =>
|
|
305
|
-
const space = (ctx, communityId, spaceId) =>
|
|
306
|
-
const post = (ctx, communityId, postId) =>
|
|
241
|
+
const community = (ctx, id) => communityApp(ctx, `/communities/${id}`);
|
|
242
|
+
const space = (ctx, communityId, spaceId) => communityApp(ctx, `/communities/${communityId}/spaces/${spaceId}`);
|
|
243
|
+
const post = (ctx, communityId, postId) => communityApp(ctx, `/communities/${communityId}/posts/${postId}`);
|
|
307
244
|
const comment = (ctx, communityId, postId, commentId) => `${post(ctx, communityId, postId)}#${commentId}`;
|
|
308
|
-
const chat = (ctx, communityId, chatId) =>
|
|
245
|
+
const chat = (ctx, communityId, chatId) => communityApp(ctx, `/communities/${communityId}/chats/${chatId}`);
|
|
309
246
|
function accessEnds(value) {
|
|
310
247
|
const date = new Date(value);
|
|
311
248
|
if (Number.isNaN(date.getTime())) return value;
|
|
@@ -357,7 +294,7 @@ const membershipEnded = defineEmail({
|
|
|
357
294
|
href: community(ctx, only.communityId),
|
|
358
295
|
label: "Renew"
|
|
359
296
|
} : {
|
|
360
|
-
href:
|
|
297
|
+
href: communityApp(ctx, "/communities"),
|
|
361
298
|
label: "Open communities"
|
|
362
299
|
};
|
|
363
300
|
},
|
|
@@ -755,8 +692,83 @@ const messageReacted = defineEmail({
|
|
|
755
692
|
}
|
|
756
693
|
});
|
|
757
694
|
//#endregion
|
|
695
|
+
//#region src/emails/access-granted.tsx
|
|
696
|
+
const subject$2 = (_ctx, params) => `You now have access to ${params.contentTitle}`;
|
|
697
|
+
const PORTAL_PATH = {
|
|
698
|
+
course: "courses",
|
|
699
|
+
download: "downloads",
|
|
700
|
+
community: "communities",
|
|
701
|
+
event: "events"
|
|
702
|
+
};
|
|
703
|
+
const BUTTON = {
|
|
704
|
+
course: "Start learning",
|
|
705
|
+
download: "View download",
|
|
706
|
+
community: "Open community",
|
|
707
|
+
event: "Open event",
|
|
708
|
+
bundle: "Open your library"
|
|
709
|
+
};
|
|
710
|
+
function hrefOf(ctx, params) {
|
|
711
|
+
if (params.contentType === "bundle") return courseApp(ctx, "");
|
|
712
|
+
const path = `/${PORTAL_PATH[params.contentType]}/${params.contentId}`;
|
|
713
|
+
return params.contentType === "community" || params.contentType === "event" ? communityApp(ctx, path) : courseApp(ctx, path);
|
|
714
|
+
}
|
|
715
|
+
function AccessGranted({ ctx, params }) {
|
|
716
|
+
return /* @__PURE__ */ jsxs(Layout, {
|
|
717
|
+
ctx,
|
|
718
|
+
heading: `${params.contentTitle} is ready for you`,
|
|
719
|
+
children: [/* @__PURE__ */ jsx(Paragraph, { children: params.contentType === "bundle" ? "You've been granted access to everything it includes. Jump in whenever you're ready." : "You've been granted access. Jump in whenever you're ready." }), /* @__PURE__ */ jsx(EmailButton, {
|
|
720
|
+
href: hrefOf(ctx, params),
|
|
721
|
+
children: BUTTON[params.contentType]
|
|
722
|
+
})]
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
AccessGranted.PreviewProps = {
|
|
726
|
+
ctx: PREVIEW_CTX,
|
|
727
|
+
params: {
|
|
728
|
+
contentTitle: "Fly Tying 101",
|
|
729
|
+
contentId: "demo",
|
|
730
|
+
contentType: "course"
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
//#endregion
|
|
734
|
+
//#region src/emails/access-revoked.tsx
|
|
735
|
+
const subject$1 = (_ctx, params) => `Your access to ${params.contentTitle} has ended`;
|
|
736
|
+
function AccessRevoked({ ctx, params }) {
|
|
737
|
+
return /* @__PURE__ */ jsx(Layout, {
|
|
738
|
+
ctx,
|
|
739
|
+
heading: "Access ended",
|
|
740
|
+
children: /* @__PURE__ */ jsxs(Paragraph, { children: [
|
|
741
|
+
"Your access to ",
|
|
742
|
+
params.contentTitle,
|
|
743
|
+
" has ended. If you think this is a mistake, reply to this email."
|
|
744
|
+
] })
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
AccessRevoked.PreviewProps = {
|
|
748
|
+
ctx: PREVIEW_CTX,
|
|
749
|
+
params: { contentTitle: "Fly Tying 101" }
|
|
750
|
+
};
|
|
751
|
+
//#endregion
|
|
752
|
+
//#region src/emails/course-completed.tsx
|
|
753
|
+
const subject = (_ctx, params) => `You completed ${params.courseTitle} ๐`;
|
|
754
|
+
function CourseCompleted({ ctx, params }) {
|
|
755
|
+
return /* @__PURE__ */ jsx(Layout, {
|
|
756
|
+
ctx,
|
|
757
|
+
heading: "Congratulations!",
|
|
758
|
+
children: /* @__PURE__ */ jsxs(Paragraph, { children: [
|
|
759
|
+
"You've completed ",
|
|
760
|
+
params.courseTitle,
|
|
761
|
+
". Nice work."
|
|
762
|
+
] })
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
CourseCompleted.PreviewProps = {
|
|
766
|
+
ctx: PREVIEW_CTX,
|
|
767
|
+
params: { courseTitle: "Fly Tying 101" }
|
|
768
|
+
};
|
|
769
|
+
//#endregion
|
|
758
770
|
//#region src/emails/course-activity.tsx
|
|
759
|
-
const activity = (ctx, courseId, activityId) =>
|
|
771
|
+
const activity = (ctx, courseId, activityId) => courseApp(ctx, `/courses/${courseId}?activity=${activityId}`);
|
|
760
772
|
const courseActivityAdded = defineEmail({
|
|
761
773
|
subject: (_ctx, params) => `New in ${params.courseTitle}: ${params.activityTitle}`,
|
|
762
774
|
heading: (params) => params.activityTitle,
|
|
@@ -881,7 +893,7 @@ const PREVIEW_EVENT = {
|
|
|
881
893
|
timeZone: "Europe/London"
|
|
882
894
|
};
|
|
883
895
|
function eventPage(ctx, eventId) {
|
|
884
|
-
return
|
|
896
|
+
return communityApp(ctx, `/events/${eventId}`);
|
|
885
897
|
}
|
|
886
898
|
function formatIn(value, timeZone, options) {
|
|
887
899
|
const date = new Date(value);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["subject","subject","subject","subject","subject","subject","subject","subject","magicLink","studentInvite","memberInvite","passwordReset","passwordChanged","emailVerification","accessGranted","accessRevoked","courseCompleted"],"sources":["../src/emails/layout.tsx","../src/emails/magic-link.tsx","../src/emails/student-invite.tsx","../src/emails/member-invite.tsx","../src/emails/password-reset.tsx","../src/emails/password-changed.tsx","../src/emails/email-verification.tsx","../src/emails/access-granted.tsx","../src/emails/access-revoked.tsx","../src/emails/course-completed.tsx","../src/emails/community.tsx","../src/emails/course-activity.tsx","../src/emails/events.tsx","../src/index.tsx"],"sourcesContent":["import {\n Body,\n Button,\n Column,\n Container,\n Head,\n Heading,\n Hr,\n Html,\n Img,\n Link,\n Row,\n Section,\n Tailwind,\n Text,\n} from \"@react-email/components\";\nimport type { ReactNode } from \"react\";\nimport type { TemplateContext } from \"@headless-lms/core/types\";\n\nconst LOGO_URL = \"https://headless-lms.dev/logo.png\";\nconst ICON_URL = \"https://headless-lms.dev/apple-icon\";\n\nexport function Layout({\n ctx,\n heading,\n children,\n}: {\n ctx: TemplateContext;\n heading: string;\n children: ReactNode;\n}) {\n return (\n <Html>\n <Tailwind>\n <Head />\n <Body className=\"bg-white font-sans\">\n <Container className=\"mx-auto max-w-[560px] px-6 pt-5 pb-12\">\n <Img src={LOGO_URL} alt={ctx.brandName} height={32} className=\"h-[32px]\" />\n <Heading className=\"mt-[28px] mb-0 text-[24px] font-normal leading-[1.3] tracking-[-0.5px] text-[#484848]\">\n {heading}\n </Heading>\n <Section>{children}</Section>\n <Hr className=\"mt-[42px] mb-[26px] border-[#dfe1e4]\" />\n <Row>\n <Column className=\"w-[24px]\">\n <Img src={ICON_URL} alt=\"\" width={24} height={24} className=\"rounded-[6px]\" />\n </Column>\n <Column className=\"pl-[8px]\">\n <Link href={ctx.baseUrl} className=\"text-[14px] text-[#b4becc]\">\n {ctx.brandName}\n </Link>\n </Column>\n </Row>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nexport function EmailButton({ href, children }: { href: string; children: ReactNode }) {\n return (\n <Section className=\"py-[20px]\">\n <Button\n href={href}\n className=\"rounded-[3px] bg-[#18181b] px-[23px] py-[11px] text-[15px] font-semibold text-white no-underline\"\n >\n {children}\n </Button>\n </Section>\n );\n}\n\nexport function Paragraph({ children }: { children: ReactNode }) {\n return <Text className=\"my-[15px] text-[15px] leading-[1.4] text-[#3c4149]\">{children}</Text>;\n}\n\nexport const PREVIEW_CTX: TemplateContext = {\n brandName: \"Acme LMS\",\n baseUrl: \"http://localhost:8001\",\n studentPortalUrl: \"http://localhost:8002\",\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"magicLink\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) => `Sign in to ${ctx.brandName}`;\n\nexport default function MagicLink({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Sign in\">\n <Paragraph>\n Click the button below to sign in. This link is valid once and expires shortly.\n </Paragraph>\n <EmailButton href={params.url}>Sign in to {ctx.brandName}</EmailButton>\n <Paragraph>If you did not request this, you can ignore this email.</Paragraph>\n </Layout>\n );\n}\n\nMagicLink.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { url: \"http://localhost:8002/magic?token=demo\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"studentInvite\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `You're invited to ${ctx.brandName}`;\n\nexport default function StudentInvite({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Welcome\">\n <Paragraph>\n {params.studentName}, you've been invited to {ctx.brandName}. Create your account to get\n started.\n </Paragraph>\n <EmailButton href={params.inviteUrl}>Create your account</EmailButton>\n <Paragraph>This invitation link is personal โ please don't forward it.</Paragraph>\n </Layout>\n );\n}\n\nStudentInvite.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n inviteUrl: \"http://localhost:8002/welcome?token=demo\",\n studentName: \"Sam\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"memberInvite\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `You've been invited to join ${ctx.brandName}`;\n\nexport default function MemberInvite({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading={`Join ${ctx.brandName}`}>\n <Paragraph>\n {params.inviterName} invited you to join {ctx.brandName} as {params.role}.\n </Paragraph>\n <EmailButton href={params.inviteUrl}>Accept invitation</EmailButton>\n <Paragraph>If you weren't expecting this invitation, you can ignore this email.</Paragraph>\n </Layout>\n );\n}\n\nMemberInvite.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n inviteUrl: \"http://localhost:8001/invite?token=demo\",\n inviterName: \"Ann\",\n role: \"Admin\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"passwordReset\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Reset your ${ctx.brandName} password`;\n\nexport default function PasswordReset({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Reset your password\">\n <Paragraph>\n Click the button below to choose a new password. The link expires shortly.\n </Paragraph>\n <EmailButton href={params.resetUrl}>Reset password</EmailButton>\n <Paragraph>\n If you did not request a reset, your password is unchanged and you can ignore this email.\n </Paragraph>\n </Layout>\n );\n}\n\nPasswordReset.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { resetUrl: \"http://localhost:8002/reset?token=demo\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"passwordChanged\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Your ${ctx.brandName} password was changed`;\n\nexport default function PasswordChanged({ ctx }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Your password was changed\">\n <Paragraph>The password for your {ctx.brandName} account was just changed.</Paragraph>\n <Paragraph>If you didn't make this change, reply to this email right away.</Paragraph>\n </Layout>\n );\n}\n\nPasswordChanged.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {},\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"emailVerification\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Verify your email for ${ctx.brandName}`;\n\nexport default function EmailVerification({\n ctx,\n params,\n}: {\n ctx: TemplateContext;\n params: Params;\n}) {\n return (\n <Layout ctx={ctx} heading=\"Verify your email\">\n <Paragraph>Confirm this is your email address to finish setting up your account.</Paragraph>\n <EmailButton href={params.verifyUrl}>Verify email</EmailButton>\n </Layout>\n );\n}\n\nEmailVerification.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { verifyUrl: \"http://localhost:8002/verify?token=demo\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"accessGranted\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `You now have access to ${params.contentTitle}`;\n\nconst PORTAL_PATH: Record<Exclude<Params[\"contentType\"], \"bundle\">, string> = {\n course: \"courses\",\n download: \"downloads\",\n community: \"communities\",\n event: \"events\",\n};\n\nconst BUTTON: Record<Params[\"contentType\"], string> = {\n course: \"Start learning\",\n download: \"View download\",\n community: \"Open community\",\n event: \"Open event\",\n bundle: \"Open your library\",\n};\n\nfunction hrefOf(ctx: TemplateContext, params: Params): string {\n return params.contentType === \"bundle\"\n ? ctx.studentPortalUrl\n : `${ctx.studentPortalUrl}/${PORTAL_PATH[params.contentType]}/${params.contentId}`;\n}\n\nexport default function AccessGranted({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading={`${params.contentTitle} is ready for you`}>\n <Paragraph>\n {params.contentType === \"bundle\"\n ? \"You've been granted access to everything it includes. Jump in whenever you're ready.\"\n : \"You've been granted access. Jump in whenever you're ready.\"}\n </Paragraph>\n <EmailButton href={hrefOf(ctx, params)}>{BUTTON[params.contentType]}</EmailButton>\n </Layout>\n );\n}\n\nAccessGranted.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n contentTitle: \"Fly Tying 101\",\n contentId: \"demo\",\n contentType: \"course\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"accessRevoked\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `Your access to ${params.contentTitle} has ended`;\n\nexport default function AccessRevoked({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Access ended\">\n <Paragraph>\n Your access to {params.contentTitle} has ended. If you think this is a mistake, reply to\n this email.\n </Paragraph>\n </Layout>\n );\n}\n\nAccessRevoked.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n contentTitle: \"Fly Tying 101\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"courseCompleted\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `You completed ${params.courseTitle} ๐`;\n\nexport default function CourseCompleted({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Congratulations!\">\n <Paragraph>You've completed {params.courseTitle}. Nice work.</Paragraph>\n </Layout>\n );\n}\n\nCourseCompleted.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n courseTitle: \"Fly Tying 101\",\n },\n};\n","import type { JSX } from \"react\";\nimport type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Link, Section, Text } from \"@react-email/components\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\nexport function portal(ctx: TemplateContext, path: string): string {\n return `${ctx.studentPortalUrl}${path}`;\n}\n\nexport function defineEmail<K extends keyof EmailTemplateParams>(opts: {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n heading: (params: EmailTemplateParams[K]) => string;\n lines: (params: EmailTemplateParams[K]) => string[];\n button?: (\n ctx: TemplateContext,\n params: EmailTemplateParams[K],\n ) => { href: string; label: string };\n preview: EmailTemplateParams[K];\n}): {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n Component: (props: { ctx: TemplateContext; params: EmailTemplateParams[K] }) => JSX.Element;\n} {\n function Component({ ctx, params }: { ctx: TemplateContext; params: EmailTemplateParams[K] }) {\n const button = opts.button?.(ctx, params);\n return (\n <Layout ctx={ctx} heading={opts.heading(params)}>\n {opts.lines(params).map((line, index) => (\n <Paragraph key={index}>{line}</Paragraph>\n ))}\n {button ? <EmailButton href={button.href}>{button.label}</EmailButton> : null}\n </Layout>\n );\n }\n Component.PreviewProps = { ctx: PREVIEW_CTX, params: opts.preview };\n return { subject: opts.subject, Component };\n}\n\nconst community = (ctx: TemplateContext, id: string) => portal(ctx, `/communities/${id}`);\nconst space = (ctx: TemplateContext, communityId: string, spaceId: string) =>\n portal(ctx, `/communities/${communityId}/spaces/${spaceId}`);\nconst post = (ctx: TemplateContext, communityId: string, postId: string) =>\n portal(ctx, `/communities/${communityId}/posts/${postId}`);\nconst comment = (ctx: TemplateContext, communityId: string, postId: string, commentId: string) =>\n `${post(ctx, communityId, postId)}#${commentId}`;\nconst chat = (ctx: TemplateContext, communityId: string, chatId: string) =>\n portal(ctx, `/communities/${communityId}/chats/${chatId}`);\n\nfunction accessEnds(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n }).format(date);\n}\n\nexport const welcomeToCommunity = defineEmail<\"welcomeToCommunity\">({\n subject: (_ctx, params) => `Welcome to ${params.communityTitle}`,\n heading: (params) => params.communityTitle,\n lines: (params) => [\n params.spaceNames.length > 0\n ? `You can open ${params.spaceNames.join(\", \")}.`\n : \"You're a member.\",\n ],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Open community\" }),\n preview: { communityTitle: \"Founders\", communityId: \"cmy_1\", spaceNames: [\"Announcements\"] },\n});\n\nexport const membershipEndingSoon = defineEmail<\"membershipEndingSoon\">({\n subject: (_ctx, params) => `${params.communityTitle} ends soon`,\n heading: (params) => `${params.communityTitle} ends soon`,\n lines: (params) => [`Your access ends ${accessEnds(params.expiresAt)}.`],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Renew\" }),\n preview: {\n communityTitle: \"Founders\",\n communityId: \"cmy_1\",\n expiresAt: \"2026-10-28T00:00:00.000Z\",\n },\n});\n\nfunction communityTitles(params: EmailTemplateParams[\"membershipEnded\"]): string {\n return params.communities.map((item) => item.communityTitle).join(\", \");\n}\n\nexport const membershipEnded = defineEmail<\"membershipEnded\">({\n subject: (_ctx, params) => `${communityTitles(params)} has ended`,\n heading: (params) => `${communityTitles(params)} has ended`,\n lines: (params) => [\n params.communities.length === 1\n ? \"Your access to this community has ended.\"\n : \"Your access to these communities has ended.\",\n ],\n button: (ctx, params) => {\n const [only] = params.communities;\n return params.communities.length === 1 && only\n ? { href: community(ctx, only.communityId), label: \"Renew\" }\n : { href: portal(ctx, \"/communities\"), label: \"Open communities\" };\n },\n preview: { communities: [{ communityId: \"cmy_1\", communityTitle: \"Founders\" }] },\n});\n\nexport const newPostInSpace = defineEmail<\"newPostInSpace\">({\n subject: (_ctx, params) => `${params.authorName} posted in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.authorName} in ${params.spaceName}`, params.excerpt],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"Read post\",\n }),\n preview: {\n spaceName: \"Announcements\",\n postTitle: \"Hello\",\n authorName: \"Ann\",\n excerpt: \"A short note\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourPostWasPublished = defineEmail<\"yourPostWasPublished\">({\n subject: (_ctx, params) => `Your post was published in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`It's live in ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: {\n postTitle: \"Hello\",\n spaceName: \"Announcements\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourPostWasRemoved = defineEmail<\"yourPostWasRemoved\">({\n subject: (_ctx, params) => `Your post was removed from ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`It was removed from ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Open space\",\n }),\n preview: {\n postTitle: \"Hello\",\n spaceName: \"Announcements\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const newCommentOnPost = defineEmail<\"newCommentOnPost\">({\n subject: (_ctx, params) => `${params.commenterName} commented on ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: (params) => [params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View comment\",\n }),\n preview: {\n postTitle: \"Hello\",\n commenterName: \"Sam\",\n excerpt: \"Nice\",\n commentId: \"cmt_1\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const replyToYourComment = defineEmail<\"replyToYourComment\">({\n subject: (_ctx, params) => `${params.commenterName} replied on ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: (params) => [params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View reply\",\n }),\n preview: {\n postTitle: \"Hello\",\n commenterName: \"Sam\",\n excerpt: \"Thanks\",\n commentId: \"cmt_2\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourCommentWasRemoved = defineEmail<\"yourCommentWasRemoved\">({\n subject: (_ctx, params) => `Your comment was removed from ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: () => [\"Your comment was removed.\"],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: { postTitle: \"Hello\", postId: \"pst_1\", communityId: \"cmy_1\" },\n});\n\nexport const requestApproved = defineEmail<\"requestApproved\">({\n subject: (_ctx, params) => `You're in ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`Your request to join ${params.spaceName} was approved.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Open space\",\n }),\n preview: { spaceName: \"SaaS\", spaceId: \"spc_1\", communityId: \"cmy_1\" },\n});\n\nexport const requestDeclined = defineEmail<\"requestDeclined\">({\n subject: (_ctx, params) => `Request declined for ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`Your request to join ${params.spaceName} was declined.`],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Open community\" }),\n preview: { spaceName: \"SaaS\", communityId: \"cmy_1\" },\n});\n\nexport const invitedToSpace = defineEmail<\"invitedToSpace\">({\n subject: (_ctx, params) => `${params.inviterName} invited you to ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`${params.inviterName} invited you.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Accept\",\n }),\n preview: {\n spaceName: \"SaaS\",\n inviterName: \"Ann\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const messageRequest = defineEmail<\"messageRequest\">({\n subject: (_ctx, params) => `${params.senderName} sent a message request`,\n heading: (params) => params.senderName,\n lines: (params) => [params.excerpt],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"View request\",\n }),\n preview: { senderName: \"Ann\", excerpt: \"Hello\", chatId: \"cht_1\", communityId: \"cmy_1\" },\n});\n\nexport const newMessage = defineEmail<\"newMessage\">({\n subject: (_ctx, params) => `${params.senderName} in ${params.chatTitle}`,\n heading: (params) => params.chatTitle,\n lines: (params) => [`${params.senderName}: ${params.excerpt}`],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n senderName: \"Ann\",\n chatTitle: \"Group chat\",\n excerpt: \"Hello\",\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const addedToGroupChat = defineEmail<\"addedToGroupChat\">({\n subject: (_ctx, params) => `${params.adderName} added you to a chat`,\n heading: () => \"You were added to a chat\",\n lines: (params) => [`${params.adderName} added you.`, params.participantNames.join(\", \")],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n adderName: \"Ann\",\n participantNames: [\"Ann\", \"Sam\"],\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n\nconst ROLE_PATH: Record<string, string> = {\n course: \"courses\",\n download: \"downloads\",\n community: \"communities\",\n event: \"events\",\n};\n\nexport const roleAssigned = defineEmail<\"roleAssigned\">({\n subject: (_ctx, params) => `You are now ${params.roleName} ${params.place}`,\n heading: (params) => `You are now ${params.roleName}`,\n lines: (params) => [`You are now ${params.roleName} ${params.place}.`],\n button: (ctx, params) =>\n params.contentId !== null && params.contentType !== null\n ? {\n href: `${ctx.baseUrl}/${ROLE_PATH[params.contentType] ?? \"\"}/${params.contentId}`,\n label: \"Open\",\n }\n : { href: ctx.baseUrl, label: \"Open\" },\n preview: {\n roleName: \"Moderator\",\n place: \"of Founders\",\n contentId: \"cmy_1\",\n contentType: \"community\",\n },\n});\n\ntype DigestParams = EmailTemplateParams[\"digest\"];\n\nfunction commentsLabel(count: number): string {\n return count === 1 ? \"1 comment\" : `${count} comments`;\n}\n\nfunction Digest({ ctx, params }: { ctx: TemplateContext; params: DigestParams }) {\n return (\n <Layout ctx={ctx} heading={`${params.communityTitle} digest`}>\n <Paragraph>{\"Here's what you haven't seen.\"}</Paragraph>\n {params.posts.map((item) => (\n <Section key={item.postId} className=\"my-[12px]\">\n <Link\n href={post(ctx, params.communityId, item.postId)}\n className=\"text-[16px] font-semibold text-[#18181b]\"\n >\n {item.title}\n </Link>\n <Text className=\"my-[2px] text-[14px] leading-[1.4] text-[#6b7280]\">\n {`${item.authorName} in ${item.spaceName} ยท ${commentsLabel(item.commentCount)}`}\n </Text>\n </Section>\n ))}\n <EmailButton href={community(ctx, params.communityId)}>Open community</EmailButton>\n </Layout>\n );\n}\n\nDigest.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n communityTitle: \"Founders\",\n communityId: \"cmy_1\",\n from: \"2026-10-29T07:00:00.000Z\",\n to: \"2026-11-05T07:00:00.000Z\",\n posts: [\n {\n postId: \"pst_1\",\n title: \"Welcome, everyone\",\n authorName: \"Sam\",\n spaceName: \"Announcements\",\n commentCount: 4,\n },\n ],\n },\n};\n\nexport const digest = {\n subject: (_ctx: TemplateContext, params: DigestParams) => `${params.communityTitle} digest`,\n Component: Digest,\n};\n\nexport const postAwaitingReview = defineEmail<\"postAwaitingReview\">({\n subject: (_ctx, params) => `Post awaiting review in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.authorName} submitted a post in ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review\",\n }),\n preview: {\n spaceName: \"Announcements\",\n postTitle: \"Hello\",\n authorName: \"Sam\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const joinRequest = defineEmail<\"joinRequest\">({\n subject: (_ctx, params) => `${params.memberName} requested ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`${params.memberName} asked to join. Seats left: ${params.seatsLeft}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review request\",\n }),\n preview: {\n spaceName: \"SaaS\",\n memberName: \"Sam\",\n seatsLeft: \"3\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const somethingWasFlagged = defineEmail<\"somethingWasFlagged\">({\n subject: (_ctx, params) => `Something was flagged in ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [params.reason, params.excerpt],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review\",\n }),\n preview: {\n spaceName: \"Announcements\",\n excerpt: \"Hello\",\n reason: \"Spam\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const messageWasFlagged = defineEmail<\"messageWasFlagged\">({\n subject: () => \"A message was flagged\",\n heading: () => \"A message was flagged\",\n lines: (params) => [params.reason],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Review\" }),\n preview: { reason: \"Spam\", communityId: \"cmy_1\" },\n});\n\nexport const postReacted = defineEmail<\"postReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your post`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to your post.`],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: {\n postTitle: \"Hello\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const commentReacted = defineEmail<\"commentReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your comment`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View comment\",\n }),\n preview: {\n postTitle: \"Hello\",\n excerpt: \"Nice\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n commentId: \"cmt_1\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nfunction mentionedIn(params: EmailTemplateParams[\"mention\"]): string {\n return \"postTitle\" in params ? params.postTitle : params.chatTitle;\n}\n\nexport const mention = defineEmail<\"mention\">({\n subject: (_ctx, params) => `${params.authorName} mentioned you in ${mentionedIn(params)}`,\n heading: (params) => mentionedIn(params),\n lines: (params) => [params.authorName, params.excerpt],\n button: (ctx, params) =>\n \"postTitle\" in params\n ? {\n href: params.commentId\n ? comment(ctx, params.communityId, params.postId, params.commentId)\n : post(ctx, params.communityId, params.postId),\n label: \"View\",\n }\n : { href: chat(ctx, params.communityId, params.chatId), label: \"Open chat\" },\n preview: {\n authorName: \"Sam\",\n excerpt: \"Thanks @Ann\",\n communityId: \"cmy_1\",\n postTitle: \"Hello\",\n postId: \"pst_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const messageReacted = defineEmail<\"messageReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your message`,\n heading: () => \"A reaction to your message\",\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n excerpt: \"Hello\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n","import type { TemplateContext } from \"@headless-lms/core/types\";\nimport { defineEmail, portal } from \"./community.js\";\n\nconst activity = (ctx: TemplateContext, courseId: string, activityId: string) =>\n portal(ctx, `/courses/${courseId}?activity=${activityId}`);\n\nexport const courseActivityAdded = defineEmail<\"courseActivityAdded\">({\n subject: (_ctx, params) => `New in ${params.courseTitle}: ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`${params.courseTitle}, ${params.moduleTitle}`],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Open lesson\",\n }),\n preview: {\n courseTitle: \"Fly Tying 101\",\n moduleTitle: \"Basics\",\n activityTitle: \"Choosing hooks\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityCommentCreated = defineEmail<\"activityCommentCreated\">({\n subject: (_ctx, params) => `${params.commenterName} commented on ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View comment\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n commenterName: \"Sam\",\n excerpt: \"Nice\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const activityCommentRemoved = defineEmail<\"activityCommentRemoved\">({\n subject: (_ctx, params) => `Your comment was removed from ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`Your comment in ${params.courseTitle} was removed.`],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Open lesson\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityCommentReacted = defineEmail<\"activityCommentReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your comment`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View comment\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n excerpt: \"Nice\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const activityCommentFlagged = defineEmail<\"activityCommentFlagged\">({\n subject: (_ctx, params) => `A comment was flagged in ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.reason, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Review\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n excerpt: \"Hello\",\n reason: \"Spam\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityMention = defineEmail<\"activityMention\">({\n subject: (_ctx, params) => `${params.authorName} mentioned you in ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.authorName, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View\",\n }),\n preview: {\n authorName: \"Sam\",\n excerpt: \"Thanks @Ann\",\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n","import type {\n EmailTemplateParams,\n EventEmailParams,\n TemplateContext,\n} from \"@headless-lms/core/types\";\nimport { Link, Section } from \"@react-email/components\";\nimport { defineEmail, portal } from \"./community.js\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\nconst PREVIEW_EVENT: EventEmailParams = {\n eventId: \"evn_1\",\n eventTitle: \"Conversation practice\",\n startsAt: \"2026-05-12T16:00:00.000Z\",\n endsAt: \"2026-05-12T17:00:00.000Z\",\n timeZone: \"Europe/London\",\n};\n\nexport function eventPage(ctx: TemplateContext, eventId: string): string {\n return portal(ctx, `/events/${eventId}`);\n}\n\nfunction formatIn(value: string, timeZone: string, options: Intl.DateTimeFormatOptions): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n try {\n return new Intl.DateTimeFormat(\"en-US\", { ...options, timeZone }).format(date);\n } catch {\n return new Intl.DateTimeFormat(\"en-US\", { ...options, timeZone: \"UTC\" }).format(date);\n }\n}\n\nexport function eventWhen(params: EventEmailParams): string {\n const day = formatIn(params.startsAt, params.timeZone, {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n const time = { hour: \"numeric\", minute: \"2-digit\" } as const;\n const from = formatIn(params.startsAt, params.timeZone, time);\n const to = formatIn(params.endsAt, params.timeZone, time);\n return `${day}, ${from} โ ${to} (${params.timeZone})`;\n}\n\nfunction calendarStamp(value: string): string {\n return new Date(value)\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d{3}/, \"\");\n}\n\nexport function googleCalendarUrl(ctx: TemplateContext, params: EventEmailParams): string {\n const query = new URLSearchParams({\n action: \"TEMPLATE\",\n text: params.eventTitle,\n dates: `${calendarStamp(params.startsAt)}/${calendarStamp(params.endsAt)}`,\n details: eventPage(ctx, params.eventId),\n ctz: params.timeZone,\n });\n return `https://calendar.google.com/calendar/render?${query.toString()}`;\n}\n\nexport function outlookCalendarUrl(ctx: TemplateContext, params: EventEmailParams): string {\n const query = new URLSearchParams({\n path: \"/calendar/action/compose\",\n rru: \"addevent\",\n subject: params.eventTitle,\n startdt: new Date(params.startsAt).toISOString(),\n enddt: new Date(params.endsAt).toISOString(),\n body: eventPage(ctx, params.eventId),\n });\n return `https://outlook.live.com/calendar/0/action/compose?${query.toString()}`;\n}\n\ntype Granted = EmailTemplateParams[\"eventGranted\"];\n\nfunction EventGranted({ ctx, params }: { ctx: TemplateContext; params: Granted }) {\n return (\n <Layout ctx={ctx} heading={`You're going to ${params.eventTitle}`}>\n <Paragraph>{eventWhen(params)}</Paragraph>\n <EmailButton href={eventPage(ctx, params.eventId)}>Open event</EmailButton>\n <Section>\n <Paragraph>\n <Link href={googleCalendarUrl(ctx, params)}>Add to Google Calendar</Link>\n {\" ยท \"}\n <Link href={outlookCalendarUrl(ctx, params)}>Add to Outlook</Link>\n </Paragraph>\n </Section>\n </Layout>\n );\n}\n\nEventGranted.PreviewProps = { ctx: PREVIEW_CTX, params: PREVIEW_EVENT };\n\nexport const eventGranted = {\n subject: (_ctx: TemplateContext, params: Granted) => `You're going to ${params.eventTitle}`,\n Component: EventGranted,\n};\n\nconst CHANGED: Record<EmailTemplateParams[\"eventChanged\"][\"changed\"], string> = {\n time: \"The time has changed.\",\n location: \"The location has changed. Open the event for the new details.\",\n time_and_location: \"The time and the location have changed. Open the event for the new details.\",\n};\n\nconst open = (ctx: TemplateContext, params: EventEmailParams) => ({\n href: eventPage(ctx, params.eventId),\n label: \"Open event\",\n});\n\nexport const eventStartingSoon = defineEmail<\"eventStartingSoon\">({\n subject: (_ctx, params) => `${params.eventTitle} starts in ${params.leadText}`,\n heading: (params) => `${params.eventTitle} starts in ${params.leadText}`,\n lines: (params) => [eventWhen(params), \"Open the event for the link.\"],\n button: open,\n preview: { ...PREVIEW_EVENT, leadText: \"1 hour\" },\n});\n\nexport const eventChanged = defineEmail<\"eventChanged\">({\n subject: (_ctx, params) => `${params.eventTitle} has changed`,\n heading: (params) => `${params.eventTitle} has changed`,\n lines: (params) => [CHANGED[params.changed], eventWhen(params)],\n button: open,\n preview: { ...PREVIEW_EVENT, changed: \"time\" },\n});\n\nexport const eventCanceled = defineEmail<\"eventCanceled\">({\n subject: (_ctx, params) => `${params.eventTitle} was canceled`,\n heading: (params) => `${params.eventTitle} was canceled`,\n lines: (params) => [`It was planned for ${eventWhen(params)}.`],\n button: open,\n preview: PREVIEW_EVENT,\n});\n\nexport const eventRevoked = defineEmail<\"eventRevoked\">({\n subject: (_ctx, params) => `You're no longer going to ${params.eventTitle}`,\n heading: (params) => `You're no longer going to ${params.eventTitle}`,\n lines: (params) => [`You've been removed from the event on ${eventWhen(params)}.`],\n button: open,\n preview: PREVIEW_EVENT,\n});\n","// Default TemplateRenderer: react-email components rendered at call time.\nimport { render } from \"@react-email/render\";\nimport type { JSX } from \"react\";\nimport type {\n EmailContent,\n EmailTemplateId,\n EmailTemplateParams,\n TemplateContext,\n TemplateRenderer,\n} from \"@headless-lms/core/types\";\nimport MagicLink, { subject as magicLink } from \"./emails/magic-link.js\";\nimport StudentInvite, { subject as studentInvite } from \"./emails/student-invite.js\";\nimport MemberInvite, { subject as memberInvite } from \"./emails/member-invite.js\";\nimport PasswordReset, { subject as passwordReset } from \"./emails/password-reset.js\";\nimport PasswordChanged, { subject as passwordChanged } from \"./emails/password-changed.js\";\nimport EmailVerification, { subject as emailVerification } from \"./emails/email-verification.js\";\nimport AccessGranted, { subject as accessGranted } from \"./emails/access-granted.js\";\nimport AccessRevoked, { subject as accessRevoked } from \"./emails/access-revoked.js\";\nimport CourseCompleted, { subject as courseCompleted } from \"./emails/course-completed.js\";\nimport {\n addedToGroupChat,\n commentReacted,\n digest,\n invitedToSpace,\n joinRequest,\n membershipEnded,\n membershipEndingSoon,\n mention,\n messageReacted,\n messageRequest,\n messageWasFlagged,\n newCommentOnPost,\n newMessage,\n newPostInSpace,\n postAwaitingReview,\n postReacted,\n replyToYourComment,\n requestApproved,\n requestDeclined,\n somethingWasFlagged,\n welcomeToCommunity,\n roleAssigned,\n yourCommentWasRemoved,\n yourPostWasPublished,\n yourPostWasRemoved,\n} from \"./emails/community.js\";\nimport {\n activityCommentCreated,\n activityCommentFlagged,\n activityCommentReacted,\n activityCommentRemoved,\n activityMention,\n courseActivityAdded,\n} from \"./emails/course-activity.js\";\nimport {\n eventCanceled,\n eventChanged,\n eventGranted,\n eventRevoked,\n eventStartingSoon,\n} from \"./emails/events.js\";\n\ninterface Entry<K extends EmailTemplateId> {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n Component: (props: { ctx: TemplateContext; params: EmailTemplateParams[K] }) => JSX.Element;\n}\n\n// The catalog is closed: a missing key here is a compile error.\nconst registry: { [K in EmailTemplateId]: Entry<K> } = {\n magicLink: { subject: magicLink, Component: MagicLink },\n studentInvite: { subject: studentInvite, Component: StudentInvite },\n memberInvite: { subject: memberInvite, Component: MemberInvite },\n passwordReset: { subject: passwordReset, Component: PasswordReset },\n passwordChanged: { subject: passwordChanged, Component: PasswordChanged },\n emailVerification: { subject: emailVerification, Component: EmailVerification },\n accessGranted: { subject: accessGranted, Component: AccessGranted },\n accessRevoked: { subject: accessRevoked, Component: AccessRevoked },\n courseCompleted: { subject: courseCompleted, Component: CourseCompleted },\n welcomeToCommunity: {\n subject: welcomeToCommunity.subject,\n Component: welcomeToCommunity.Component,\n },\n membershipEndingSoon: {\n subject: membershipEndingSoon.subject,\n Component: membershipEndingSoon.Component,\n },\n membershipEnded: { subject: membershipEnded.subject, Component: membershipEnded.Component },\n newPostInSpace: { subject: newPostInSpace.subject, Component: newPostInSpace.Component },\n yourPostWasPublished: {\n subject: yourPostWasPublished.subject,\n Component: yourPostWasPublished.Component,\n },\n yourPostWasRemoved: {\n subject: yourPostWasRemoved.subject,\n Component: yourPostWasRemoved.Component,\n },\n newCommentOnPost: { subject: newCommentOnPost.subject, Component: newCommentOnPost.Component },\n replyToYourComment: {\n subject: replyToYourComment.subject,\n Component: replyToYourComment.Component,\n },\n yourCommentWasRemoved: {\n subject: yourCommentWasRemoved.subject,\n Component: yourCommentWasRemoved.Component,\n },\n requestApproved: { subject: requestApproved.subject, Component: requestApproved.Component },\n requestDeclined: { subject: requestDeclined.subject, Component: requestDeclined.Component },\n invitedToSpace: { subject: invitedToSpace.subject, Component: invitedToSpace.Component },\n messageRequest: { subject: messageRequest.subject, Component: messageRequest.Component },\n newMessage: { subject: newMessage.subject, Component: newMessage.Component },\n addedToGroupChat: { subject: addedToGroupChat.subject, Component: addedToGroupChat.Component },\n roleAssigned: { subject: roleAssigned.subject, Component: roleAssigned.Component },\n digest: { subject: digest.subject, Component: digest.Component },\n postAwaitingReview: {\n subject: postAwaitingReview.subject,\n Component: postAwaitingReview.Component,\n },\n joinRequest: { subject: joinRequest.subject, Component: joinRequest.Component },\n somethingWasFlagged: {\n subject: somethingWasFlagged.subject,\n Component: somethingWasFlagged.Component,\n },\n messageWasFlagged: {\n subject: messageWasFlagged.subject,\n Component: messageWasFlagged.Component,\n },\n postReacted: { subject: postReacted.subject, Component: postReacted.Component },\n commentReacted: { subject: commentReacted.subject, Component: commentReacted.Component },\n mention: { subject: mention.subject, Component: mention.Component },\n messageReacted: { subject: messageReacted.subject, Component: messageReacted.Component },\n courseActivityAdded: {\n subject: courseActivityAdded.subject,\n Component: courseActivityAdded.Component,\n },\n activityCommentCreated: {\n subject: activityCommentCreated.subject,\n Component: activityCommentCreated.Component,\n },\n activityCommentRemoved: {\n subject: activityCommentRemoved.subject,\n Component: activityCommentRemoved.Component,\n },\n activityCommentReacted: {\n subject: activityCommentReacted.subject,\n Component: activityCommentReacted.Component,\n },\n activityCommentFlagged: {\n subject: activityCommentFlagged.subject,\n Component: activityCommentFlagged.Component,\n },\n activityMention: { subject: activityMention.subject, Component: activityMention.Component },\n eventGranted: { subject: eventGranted.subject, Component: eventGranted.Component },\n eventStartingSoon: {\n subject: eventStartingSoon.subject,\n Component: eventStartingSoon.Component,\n },\n eventChanged: { subject: eventChanged.subject, Component: eventChanged.Component },\n eventCanceled: { subject: eventCanceled.subject, Component: eventCanceled.Component },\n eventRevoked: { subject: eventRevoked.subject, Component: eventRevoked.Component },\n};\n\nexport class ReactEmailTemplateRenderer implements TemplateRenderer {\n async render<K extends EmailTemplateId>(\n id: K,\n ctx: TemplateContext,\n params: EmailTemplateParams[K],\n ): Promise<EmailContent> {\n const entry = registry[id] as Entry<K>;\n const element = <entry.Component ctx={ctx} params={params} />;\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { subject: entry.subject(ctx, params), html, text };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["subject","subject","subject","subject","subject","subject","subject","subject","magicLink","studentInvite","memberInvite","passwordReset","passwordChanged","emailVerification","accessGranted","accessRevoked","courseCompleted"],"sources":["../src/emails/layout.tsx","../src/emails/magic-link.tsx","../src/emails/student-invite.tsx","../src/emails/member-invite.tsx","../src/emails/password-reset.tsx","../src/emails/password-changed.tsx","../src/emails/email-verification.tsx","../src/emails/community.tsx","../src/emails/access-granted.tsx","../src/emails/access-revoked.tsx","../src/emails/course-completed.tsx","../src/emails/course-activity.tsx","../src/emails/events.tsx","../src/index.tsx"],"sourcesContent":["import {\n Body,\n Button,\n Column,\n Container,\n Head,\n Heading,\n Hr,\n Html,\n Img,\n Link,\n Row,\n Section,\n Tailwind,\n Text,\n} from \"@react-email/components\";\nimport type { ReactNode } from \"react\";\nimport type { TemplateContext } from \"@headless-lms/core/types\";\n\nconst LOGO_URL = \"https://headless-lms.dev/logo.png\";\nconst ICON_URL = \"https://headless-lms.dev/apple-icon\";\n\nexport function Layout({\n ctx,\n heading,\n children,\n}: {\n ctx: TemplateContext;\n heading: string;\n children: ReactNode;\n}) {\n return (\n <Html>\n <Tailwind>\n <Head />\n <Body className=\"bg-white font-sans\">\n <Container className=\"mx-auto max-w-[560px] px-6 pt-5 pb-12\">\n <Img src={LOGO_URL} alt={ctx.brandName} height={32} className=\"h-[32px]\" />\n <Heading className=\"mt-[28px] mb-0 text-[24px] font-normal leading-[1.3] tracking-[-0.5px] text-[#484848]\">\n {heading}\n </Heading>\n <Section>{children}</Section>\n <Hr className=\"mt-[42px] mb-[26px] border-[#dfe1e4]\" />\n <Row>\n <Column className=\"w-[24px]\">\n <Img src={ICON_URL} alt=\"\" width={24} height={24} className=\"rounded-[6px]\" />\n </Column>\n <Column className=\"pl-[8px]\">\n <Link href={ctx.baseUrl} className=\"text-[14px] text-[#b4becc]\">\n {ctx.brandName}\n </Link>\n </Column>\n </Row>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nexport function EmailButton({ href, children }: { href: string; children: ReactNode }) {\n return (\n <Section className=\"py-[20px]\">\n <Button\n href={href}\n className=\"rounded-[3px] bg-[#18181b] px-[23px] py-[11px] text-[15px] font-semibold text-white no-underline\"\n >\n {children}\n </Button>\n </Section>\n );\n}\n\nexport function Paragraph({ children }: { children: ReactNode }) {\n return <Text className=\"my-[15px] text-[15px] leading-[1.4] text-[#3c4149]\">{children}</Text>;\n}\n\nexport const PREVIEW_CTX: TemplateContext = {\n brandName: \"Acme LMS\",\n baseUrl: \"http://localhost:8001\",\n hosts: { courses: \"http://localhost:8002\", community: \"http://localhost:8002\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"magicLink\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) => `Sign in to ${ctx.brandName}`;\n\nexport default function MagicLink({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Sign in\">\n <Paragraph>\n Click the button below to sign in. This link is valid once and expires shortly.\n </Paragraph>\n <EmailButton href={params.url}>Sign in to {ctx.brandName}</EmailButton>\n <Paragraph>If you did not request this, you can ignore this email.</Paragraph>\n </Layout>\n );\n}\n\nMagicLink.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { url: \"http://localhost:8002/magic?token=demo\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"studentInvite\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `You're invited to ${ctx.brandName}`;\n\nexport default function StudentInvite({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Welcome\">\n <Paragraph>\n {params.studentName}, you've been invited to {ctx.brandName}. Create your account to get\n started.\n </Paragraph>\n <EmailButton href={params.inviteUrl}>Create your account</EmailButton>\n <Paragraph>This invitation link is personal โ please don't forward it.</Paragraph>\n </Layout>\n );\n}\n\nStudentInvite.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n inviteUrl: \"http://localhost:8002/welcome?token=demo\",\n studentName: \"Sam\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"memberInvite\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `You've been invited to join ${ctx.brandName}`;\n\nexport default function MemberInvite({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading={`Join ${ctx.brandName}`}>\n <Paragraph>\n {params.inviterName} invited you to join {ctx.brandName} as {params.role}.\n </Paragraph>\n <EmailButton href={params.inviteUrl}>Accept invitation</EmailButton>\n <Paragraph>If you weren't expecting this invitation, you can ignore this email.</Paragraph>\n </Layout>\n );\n}\n\nMemberInvite.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n inviteUrl: \"http://localhost:8001/invite?token=demo\",\n inviterName: \"Ann\",\n role: \"Admin\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"passwordReset\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Reset your ${ctx.brandName} password`;\n\nexport default function PasswordReset({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Reset your password\">\n <Paragraph>\n Click the button below to choose a new password. The link expires shortly.\n </Paragraph>\n <EmailButton href={params.resetUrl}>Reset password</EmailButton>\n <Paragraph>\n If you did not request a reset, your password is unchanged and you can ignore this email.\n </Paragraph>\n </Layout>\n );\n}\n\nPasswordReset.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { resetUrl: \"http://localhost:8002/reset?token=demo\" },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"passwordChanged\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Your ${ctx.brandName} password was changed`;\n\nexport default function PasswordChanged({ ctx }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Your password was changed\">\n <Paragraph>The password for your {ctx.brandName} account was just changed.</Paragraph>\n <Paragraph>If you didn't make this change, reply to this email right away.</Paragraph>\n </Layout>\n );\n}\n\nPasswordChanged.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {},\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"emailVerification\"];\n\nexport const subject = (ctx: TemplateContext, _params: Params) =>\n `Verify your email for ${ctx.brandName}`;\n\nexport default function EmailVerification({\n ctx,\n params,\n}: {\n ctx: TemplateContext;\n params: Params;\n}) {\n return (\n <Layout ctx={ctx} heading=\"Verify your email\">\n <Paragraph>Confirm this is your email address to finish setting up your account.</Paragraph>\n <EmailButton href={params.verifyUrl}>Verify email</EmailButton>\n </Layout>\n );\n}\n\nEmailVerification.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: { verifyUrl: \"http://localhost:8002/verify?token=demo\" },\n};\n","import type { JSX } from \"react\";\nimport type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Link, Section, Text } from \"@react-email/components\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\nfunction hostsOf(ctx: TemplateContext) {\n if (!ctx.hosts) {\n throw new Error(\"This email links to an organization's apps and was sent without one\");\n }\n return ctx.hosts;\n}\n\nexport function communityApp(ctx: TemplateContext, path: string): string {\n return `${hostsOf(ctx).community}${path}`;\n}\n\nexport function courseApp(ctx: TemplateContext, path: string): string {\n return `${hostsOf(ctx).courses}${path}`;\n}\n\nexport function defineEmail<K extends keyof EmailTemplateParams>(opts: {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n heading: (params: EmailTemplateParams[K]) => string;\n lines: (params: EmailTemplateParams[K]) => string[];\n button?: (\n ctx: TemplateContext,\n params: EmailTemplateParams[K],\n ) => { href: string; label: string };\n preview: EmailTemplateParams[K];\n}): {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n Component: (props: { ctx: TemplateContext; params: EmailTemplateParams[K] }) => JSX.Element;\n} {\n function Component({ ctx, params }: { ctx: TemplateContext; params: EmailTemplateParams[K] }) {\n const button = opts.button?.(ctx, params);\n return (\n <Layout ctx={ctx} heading={opts.heading(params)}>\n {opts.lines(params).map((line, index) => (\n <Paragraph key={index}>{line}</Paragraph>\n ))}\n {button ? <EmailButton href={button.href}>{button.label}</EmailButton> : null}\n </Layout>\n );\n }\n Component.PreviewProps = { ctx: PREVIEW_CTX, params: opts.preview };\n return { subject: opts.subject, Component };\n}\n\nconst community = (ctx: TemplateContext, id: string) => communityApp(ctx, `/communities/${id}`);\nconst space = (ctx: TemplateContext, communityId: string, spaceId: string) =>\n communityApp(ctx, `/communities/${communityId}/spaces/${spaceId}`);\nconst post = (ctx: TemplateContext, communityId: string, postId: string) =>\n communityApp(ctx, `/communities/${communityId}/posts/${postId}`);\nconst comment = (ctx: TemplateContext, communityId: string, postId: string, commentId: string) =>\n `${post(ctx, communityId, postId)}#${commentId}`;\nconst chat = (ctx: TemplateContext, communityId: string, chatId: string) =>\n communityApp(ctx, `/communities/${communityId}/chats/${chatId}`);\n\nfunction accessEnds(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n }).format(date);\n}\n\nexport const welcomeToCommunity = defineEmail<\"welcomeToCommunity\">({\n subject: (_ctx, params) => `Welcome to ${params.communityTitle}`,\n heading: (params) => params.communityTitle,\n lines: (params) => [\n params.spaceNames.length > 0\n ? `You can open ${params.spaceNames.join(\", \")}.`\n : \"You're a member.\",\n ],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Open community\" }),\n preview: { communityTitle: \"Founders\", communityId: \"cmy_1\", spaceNames: [\"Announcements\"] },\n});\n\nexport const membershipEndingSoon = defineEmail<\"membershipEndingSoon\">({\n subject: (_ctx, params) => `${params.communityTitle} ends soon`,\n heading: (params) => `${params.communityTitle} ends soon`,\n lines: (params) => [`Your access ends ${accessEnds(params.expiresAt)}.`],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Renew\" }),\n preview: {\n communityTitle: \"Founders\",\n communityId: \"cmy_1\",\n expiresAt: \"2026-10-28T00:00:00.000Z\",\n },\n});\n\nfunction communityTitles(params: EmailTemplateParams[\"membershipEnded\"]): string {\n return params.communities.map((item) => item.communityTitle).join(\", \");\n}\n\nexport const membershipEnded = defineEmail<\"membershipEnded\">({\n subject: (_ctx, params) => `${communityTitles(params)} has ended`,\n heading: (params) => `${communityTitles(params)} has ended`,\n lines: (params) => [\n params.communities.length === 1\n ? \"Your access to this community has ended.\"\n : \"Your access to these communities has ended.\",\n ],\n button: (ctx, params) => {\n const [only] = params.communities;\n return params.communities.length === 1 && only\n ? { href: community(ctx, only.communityId), label: \"Renew\" }\n : { href: communityApp(ctx, \"/communities\"), label: \"Open communities\" };\n },\n preview: { communities: [{ communityId: \"cmy_1\", communityTitle: \"Founders\" }] },\n});\n\nexport const newPostInSpace = defineEmail<\"newPostInSpace\">({\n subject: (_ctx, params) => `${params.authorName} posted in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.authorName} in ${params.spaceName}`, params.excerpt],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"Read post\",\n }),\n preview: {\n spaceName: \"Announcements\",\n postTitle: \"Hello\",\n authorName: \"Ann\",\n excerpt: \"A short note\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourPostWasPublished = defineEmail<\"yourPostWasPublished\">({\n subject: (_ctx, params) => `Your post was published in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`It's live in ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: {\n postTitle: \"Hello\",\n spaceName: \"Announcements\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourPostWasRemoved = defineEmail<\"yourPostWasRemoved\">({\n subject: (_ctx, params) => `Your post was removed from ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`It was removed from ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Open space\",\n }),\n preview: {\n postTitle: \"Hello\",\n spaceName: \"Announcements\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const newCommentOnPost = defineEmail<\"newCommentOnPost\">({\n subject: (_ctx, params) => `${params.commenterName} commented on ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: (params) => [params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View comment\",\n }),\n preview: {\n postTitle: \"Hello\",\n commenterName: \"Sam\",\n excerpt: \"Nice\",\n commentId: \"cmt_1\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const replyToYourComment = defineEmail<\"replyToYourComment\">({\n subject: (_ctx, params) => `${params.commenterName} replied on ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: (params) => [params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View reply\",\n }),\n preview: {\n postTitle: \"Hello\",\n commenterName: \"Sam\",\n excerpt: \"Thanks\",\n commentId: \"cmt_2\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const yourCommentWasRemoved = defineEmail<\"yourCommentWasRemoved\">({\n subject: (_ctx, params) => `Your comment was removed from ${params.postTitle}`,\n heading: (params) => params.postTitle,\n lines: () => [\"Your comment was removed.\"],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: { postTitle: \"Hello\", postId: \"pst_1\", communityId: \"cmy_1\" },\n});\n\nexport const requestApproved = defineEmail<\"requestApproved\">({\n subject: (_ctx, params) => `You're in ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`Your request to join ${params.spaceName} was approved.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Open space\",\n }),\n preview: { spaceName: \"SaaS\", spaceId: \"spc_1\", communityId: \"cmy_1\" },\n});\n\nexport const requestDeclined = defineEmail<\"requestDeclined\">({\n subject: (_ctx, params) => `Request declined for ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`Your request to join ${params.spaceName} was declined.`],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Open community\" }),\n preview: { spaceName: \"SaaS\", communityId: \"cmy_1\" },\n});\n\nexport const invitedToSpace = defineEmail<\"invitedToSpace\">({\n subject: (_ctx, params) => `${params.inviterName} invited you to ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`${params.inviterName} invited you.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Accept\",\n }),\n preview: {\n spaceName: \"SaaS\",\n inviterName: \"Ann\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const messageRequest = defineEmail<\"messageRequest\">({\n subject: (_ctx, params) => `${params.senderName} sent a message request`,\n heading: (params) => params.senderName,\n lines: (params) => [params.excerpt],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"View request\",\n }),\n preview: { senderName: \"Ann\", excerpt: \"Hello\", chatId: \"cht_1\", communityId: \"cmy_1\" },\n});\n\nexport const newMessage = defineEmail<\"newMessage\">({\n subject: (_ctx, params) => `${params.senderName} in ${params.chatTitle}`,\n heading: (params) => params.chatTitle,\n lines: (params) => [`${params.senderName}: ${params.excerpt}`],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n senderName: \"Ann\",\n chatTitle: \"Group chat\",\n excerpt: \"Hello\",\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const addedToGroupChat = defineEmail<\"addedToGroupChat\">({\n subject: (_ctx, params) => `${params.adderName} added you to a chat`,\n heading: () => \"You were added to a chat\",\n lines: (params) => [`${params.adderName} added you.`, params.participantNames.join(\", \")],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n adderName: \"Ann\",\n participantNames: [\"Ann\", \"Sam\"],\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n\nconst ROLE_PATH: Record<string, string> = {\n course: \"courses\",\n download: \"downloads\",\n community: \"communities\",\n event: \"events\",\n};\n\nexport const roleAssigned = defineEmail<\"roleAssigned\">({\n subject: (_ctx, params) => `You are now ${params.roleName} ${params.place}`,\n heading: (params) => `You are now ${params.roleName}`,\n lines: (params) => [`You are now ${params.roleName} ${params.place}.`],\n button: (ctx, params) =>\n params.contentId !== null && params.contentType !== null\n ? {\n href: `${ctx.baseUrl}/${ROLE_PATH[params.contentType] ?? \"\"}/${params.contentId}`,\n label: \"Open\",\n }\n : { href: ctx.baseUrl, label: \"Open\" },\n preview: {\n roleName: \"Moderator\",\n place: \"of Founders\",\n contentId: \"cmy_1\",\n contentType: \"community\",\n },\n});\n\ntype DigestParams = EmailTemplateParams[\"digest\"];\n\nfunction commentsLabel(count: number): string {\n return count === 1 ? \"1 comment\" : `${count} comments`;\n}\n\nfunction Digest({ ctx, params }: { ctx: TemplateContext; params: DigestParams }) {\n return (\n <Layout ctx={ctx} heading={`${params.communityTitle} digest`}>\n <Paragraph>{\"Here's what you haven't seen.\"}</Paragraph>\n {params.posts.map((item) => (\n <Section key={item.postId} className=\"my-[12px]\">\n <Link\n href={post(ctx, params.communityId, item.postId)}\n className=\"text-[16px] font-semibold text-[#18181b]\"\n >\n {item.title}\n </Link>\n <Text className=\"my-[2px] text-[14px] leading-[1.4] text-[#6b7280]\">\n {`${item.authorName} in ${item.spaceName} ยท ${commentsLabel(item.commentCount)}`}\n </Text>\n </Section>\n ))}\n <EmailButton href={community(ctx, params.communityId)}>Open community</EmailButton>\n </Layout>\n );\n}\n\nDigest.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n communityTitle: \"Founders\",\n communityId: \"cmy_1\",\n from: \"2026-10-29T07:00:00.000Z\",\n to: \"2026-11-05T07:00:00.000Z\",\n posts: [\n {\n postId: \"pst_1\",\n title: \"Welcome, everyone\",\n authorName: \"Sam\",\n spaceName: \"Announcements\",\n commentCount: 4,\n },\n ],\n },\n};\n\nexport const digest = {\n subject: (_ctx: TemplateContext, params: DigestParams) => `${params.communityTitle} digest`,\n Component: Digest,\n};\n\nexport const postAwaitingReview = defineEmail<\"postAwaitingReview\">({\n subject: (_ctx, params) => `Post awaiting review in ${params.spaceName}`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.authorName} submitted a post in ${params.spaceName}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review\",\n }),\n preview: {\n spaceName: \"Announcements\",\n postTitle: \"Hello\",\n authorName: \"Sam\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const joinRequest = defineEmail<\"joinRequest\">({\n subject: (_ctx, params) => `${params.memberName} requested ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [`${params.memberName} asked to join. Seats left: ${params.seatsLeft}.`],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review request\",\n }),\n preview: {\n spaceName: \"SaaS\",\n memberName: \"Sam\",\n seatsLeft: \"3\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const somethingWasFlagged = defineEmail<\"somethingWasFlagged\">({\n subject: (_ctx, params) => `Something was flagged in ${params.spaceName}`,\n heading: (params) => params.spaceName,\n lines: (params) => [params.reason, params.excerpt],\n button: (ctx, params) => ({\n href: space(ctx, params.communityId, params.spaceId),\n label: \"Review\",\n }),\n preview: {\n spaceName: \"Announcements\",\n excerpt: \"Hello\",\n reason: \"Spam\",\n spaceId: \"spc_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const messageWasFlagged = defineEmail<\"messageWasFlagged\">({\n subject: () => \"A message was flagged\",\n heading: () => \"A message was flagged\",\n lines: (params) => [params.reason],\n button: (ctx, params) => ({ href: community(ctx, params.communityId), label: \"Review\" }),\n preview: { reason: \"Spam\", communityId: \"cmy_1\" },\n});\n\nexport const postReacted = defineEmail<\"postReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your post`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to your post.`],\n button: (ctx, params) => ({\n href: post(ctx, params.communityId, params.postId),\n label: \"View post\",\n }),\n preview: {\n postTitle: \"Hello\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nexport const commentReacted = defineEmail<\"commentReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your comment`,\n heading: (params) => params.postTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: comment(ctx, params.communityId, params.postId, params.commentId),\n label: \"View comment\",\n }),\n preview: {\n postTitle: \"Hello\",\n excerpt: \"Nice\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n commentId: \"cmt_1\",\n postId: \"pst_1\",\n communityId: \"cmy_1\",\n },\n});\n\nfunction mentionedIn(params: EmailTemplateParams[\"mention\"]): string {\n return \"postTitle\" in params ? params.postTitle : params.chatTitle;\n}\n\nexport const mention = defineEmail<\"mention\">({\n subject: (_ctx, params) => `${params.authorName} mentioned you in ${mentionedIn(params)}`,\n heading: (params) => mentionedIn(params),\n lines: (params) => [params.authorName, params.excerpt],\n button: (ctx, params) =>\n \"postTitle\" in params\n ? {\n href: params.commentId\n ? comment(ctx, params.communityId, params.postId, params.commentId)\n : post(ctx, params.communityId, params.postId),\n label: \"View\",\n }\n : { href: chat(ctx, params.communityId, params.chatId), label: \"Open chat\" },\n preview: {\n authorName: \"Sam\",\n excerpt: \"Thanks @Ann\",\n communityId: \"cmy_1\",\n postTitle: \"Hello\",\n postId: \"pst_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const messageReacted = defineEmail<\"messageReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your message`,\n heading: () => \"A reaction to your message\",\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: chat(ctx, params.communityId, params.chatId),\n label: \"Open chat\",\n }),\n preview: {\n excerpt: \"Hello\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n chatId: \"cht_1\",\n communityId: \"cmy_1\",\n },\n});\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { communityApp, courseApp } from \"./community.js\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"accessGranted\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `You now have access to ${params.contentTitle}`;\n\nconst PORTAL_PATH: Record<Exclude<Params[\"contentType\"], \"bundle\">, string> = {\n course: \"courses\",\n download: \"downloads\",\n community: \"communities\",\n event: \"events\",\n};\n\nconst BUTTON: Record<Params[\"contentType\"], string> = {\n course: \"Start learning\",\n download: \"View download\",\n community: \"Open community\",\n event: \"Open event\",\n bundle: \"Open your library\",\n};\n\nfunction hrefOf(ctx: TemplateContext, params: Params): string {\n if (params.contentType === \"bundle\") {\n return courseApp(ctx, \"\");\n }\n const path = `/${PORTAL_PATH[params.contentType]}/${params.contentId}`;\n return params.contentType === \"community\" || params.contentType === \"event\"\n ? communityApp(ctx, path)\n : courseApp(ctx, path);\n}\n\nexport default function AccessGranted({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading={`${params.contentTitle} is ready for you`}>\n <Paragraph>\n {params.contentType === \"bundle\"\n ? \"You've been granted access to everything it includes. Jump in whenever you're ready.\"\n : \"You've been granted access. Jump in whenever you're ready.\"}\n </Paragraph>\n <EmailButton href={hrefOf(ctx, params)}>{BUTTON[params.contentType]}</EmailButton>\n </Layout>\n );\n}\n\nAccessGranted.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n contentTitle: \"Fly Tying 101\",\n contentId: \"demo\",\n contentType: \"course\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"accessRevoked\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `Your access to ${params.contentTitle} has ended`;\n\nexport default function AccessRevoked({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Access ended\">\n <Paragraph>\n Your access to {params.contentTitle} has ended. If you think this is a mistake, reply to\n this email.\n </Paragraph>\n </Layout>\n );\n}\n\nAccessRevoked.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n contentTitle: \"Fly Tying 101\",\n },\n};\n","import type { EmailTemplateParams, TemplateContext } from \"@headless-lms/core/types\";\nimport { Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\ntype Params = EmailTemplateParams[\"courseCompleted\"];\n\nexport const subject = (_ctx: TemplateContext, params: Params) =>\n `You completed ${params.courseTitle} ๐`;\n\nexport default function CourseCompleted({ ctx, params }: { ctx: TemplateContext; params: Params }) {\n return (\n <Layout ctx={ctx} heading=\"Congratulations!\">\n <Paragraph>You've completed {params.courseTitle}. Nice work.</Paragraph>\n </Layout>\n );\n}\n\nCourseCompleted.PreviewProps = {\n ctx: PREVIEW_CTX,\n params: {\n courseTitle: \"Fly Tying 101\",\n },\n};\n","import type { TemplateContext } from \"@headless-lms/core/types\";\nimport { courseApp, defineEmail } from \"./community.js\";\n\nconst activity = (ctx: TemplateContext, courseId: string, activityId: string) =>\n courseApp(ctx, `/courses/${courseId}?activity=${activityId}`);\n\nexport const courseActivityAdded = defineEmail<\"courseActivityAdded\">({\n subject: (_ctx, params) => `New in ${params.courseTitle}: ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`${params.courseTitle}, ${params.moduleTitle}`],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Open lesson\",\n }),\n preview: {\n courseTitle: \"Fly Tying 101\",\n moduleTitle: \"Basics\",\n activityTitle: \"Choosing hooks\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityCommentCreated = defineEmail<\"activityCommentCreated\">({\n subject: (_ctx, params) => `${params.commenterName} commented on ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.commenterName, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View comment\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n commenterName: \"Sam\",\n excerpt: \"Nice\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const activityCommentRemoved = defineEmail<\"activityCommentRemoved\">({\n subject: (_ctx, params) => `Your comment was removed from ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`Your comment in ${params.courseTitle} was removed.`],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Open lesson\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityCommentReacted = defineEmail<\"activityCommentReacted\">({\n subject: (_ctx, params) => `${params.reactorName} reacted to your comment`,\n heading: (params) => params.activityTitle,\n lines: (params) => [`${params.reactorName} reacted ${params.reaction} to:`, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View comment\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n excerpt: \"Nice\",\n reactorName: \"Sam\",\n reaction: \"๐\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n commentId: \"cmt_1\",\n },\n});\n\nexport const activityCommentFlagged = defineEmail<\"activityCommentFlagged\">({\n subject: (_ctx, params) => `A comment was flagged in ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.reason, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"Review\",\n }),\n preview: {\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n excerpt: \"Hello\",\n reason: \"Spam\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n\nexport const activityMention = defineEmail<\"activityMention\">({\n subject: (_ctx, params) => `${params.authorName} mentioned you in ${params.activityTitle}`,\n heading: (params) => params.activityTitle,\n lines: (params) => [params.courseTitle, params.authorName, params.excerpt],\n button: (ctx, params) => ({\n href: activity(ctx, params.courseId, params.activityId),\n label: \"View\",\n }),\n preview: {\n authorName: \"Sam\",\n excerpt: \"Thanks @Ann\",\n activityTitle: \"Choosing hooks\",\n courseTitle: \"Fly Tying 101\",\n courseId: \"crs_1\",\n activityId: \"act_1\",\n },\n});\n","import type {\n EmailTemplateParams,\n EventEmailParams,\n TemplateContext,\n} from \"@headless-lms/core/types\";\nimport { Link, Section } from \"@react-email/components\";\nimport { communityApp, defineEmail } from \"./community.js\";\nimport { EmailButton, Layout, Paragraph, PREVIEW_CTX } from \"./layout.js\";\n\nconst PREVIEW_EVENT: EventEmailParams = {\n eventId: \"evn_1\",\n eventTitle: \"Conversation practice\",\n startsAt: \"2026-05-12T16:00:00.000Z\",\n endsAt: \"2026-05-12T17:00:00.000Z\",\n timeZone: \"Europe/London\",\n};\n\nexport function eventPage(ctx: TemplateContext, eventId: string): string {\n return communityApp(ctx, `/events/${eventId}`);\n}\n\nfunction formatIn(value: string, timeZone: string, options: Intl.DateTimeFormatOptions): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n try {\n return new Intl.DateTimeFormat(\"en-US\", { ...options, timeZone }).format(date);\n } catch {\n return new Intl.DateTimeFormat(\"en-US\", { ...options, timeZone: \"UTC\" }).format(date);\n }\n}\n\nexport function eventWhen(params: EventEmailParams): string {\n const day = formatIn(params.startsAt, params.timeZone, {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n const time = { hour: \"numeric\", minute: \"2-digit\" } as const;\n const from = formatIn(params.startsAt, params.timeZone, time);\n const to = formatIn(params.endsAt, params.timeZone, time);\n return `${day}, ${from} โ ${to} (${params.timeZone})`;\n}\n\nfunction calendarStamp(value: string): string {\n return new Date(value)\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d{3}/, \"\");\n}\n\nexport function googleCalendarUrl(ctx: TemplateContext, params: EventEmailParams): string {\n const query = new URLSearchParams({\n action: \"TEMPLATE\",\n text: params.eventTitle,\n dates: `${calendarStamp(params.startsAt)}/${calendarStamp(params.endsAt)}`,\n details: eventPage(ctx, params.eventId),\n ctz: params.timeZone,\n });\n return `https://calendar.google.com/calendar/render?${query.toString()}`;\n}\n\nexport function outlookCalendarUrl(ctx: TemplateContext, params: EventEmailParams): string {\n const query = new URLSearchParams({\n path: \"/calendar/action/compose\",\n rru: \"addevent\",\n subject: params.eventTitle,\n startdt: new Date(params.startsAt).toISOString(),\n enddt: new Date(params.endsAt).toISOString(),\n body: eventPage(ctx, params.eventId),\n });\n return `https://outlook.live.com/calendar/0/action/compose?${query.toString()}`;\n}\n\ntype Granted = EmailTemplateParams[\"eventGranted\"];\n\nfunction EventGranted({ ctx, params }: { ctx: TemplateContext; params: Granted }) {\n return (\n <Layout ctx={ctx} heading={`You're going to ${params.eventTitle}`}>\n <Paragraph>{eventWhen(params)}</Paragraph>\n <EmailButton href={eventPage(ctx, params.eventId)}>Open event</EmailButton>\n <Section>\n <Paragraph>\n <Link href={googleCalendarUrl(ctx, params)}>Add to Google Calendar</Link>\n {\" ยท \"}\n <Link href={outlookCalendarUrl(ctx, params)}>Add to Outlook</Link>\n </Paragraph>\n </Section>\n </Layout>\n );\n}\n\nEventGranted.PreviewProps = { ctx: PREVIEW_CTX, params: PREVIEW_EVENT };\n\nexport const eventGranted = {\n subject: (_ctx: TemplateContext, params: Granted) => `You're going to ${params.eventTitle}`,\n Component: EventGranted,\n};\n\nconst CHANGED: Record<EmailTemplateParams[\"eventChanged\"][\"changed\"], string> = {\n time: \"The time has changed.\",\n location: \"The location has changed. Open the event for the new details.\",\n time_and_location: \"The time and the location have changed. Open the event for the new details.\",\n};\n\nconst open = (ctx: TemplateContext, params: EventEmailParams) => ({\n href: eventPage(ctx, params.eventId),\n label: \"Open event\",\n});\n\nexport const eventStartingSoon = defineEmail<\"eventStartingSoon\">({\n subject: (_ctx, params) => `${params.eventTitle} starts in ${params.leadText}`,\n heading: (params) => `${params.eventTitle} starts in ${params.leadText}`,\n lines: (params) => [eventWhen(params), \"Open the event for the link.\"],\n button: open,\n preview: { ...PREVIEW_EVENT, leadText: \"1 hour\" },\n});\n\nexport const eventChanged = defineEmail<\"eventChanged\">({\n subject: (_ctx, params) => `${params.eventTitle} has changed`,\n heading: (params) => `${params.eventTitle} has changed`,\n lines: (params) => [CHANGED[params.changed], eventWhen(params)],\n button: open,\n preview: { ...PREVIEW_EVENT, changed: \"time\" },\n});\n\nexport const eventCanceled = defineEmail<\"eventCanceled\">({\n subject: (_ctx, params) => `${params.eventTitle} was canceled`,\n heading: (params) => `${params.eventTitle} was canceled`,\n lines: (params) => [`It was planned for ${eventWhen(params)}.`],\n button: open,\n preview: PREVIEW_EVENT,\n});\n\nexport const eventRevoked = defineEmail<\"eventRevoked\">({\n subject: (_ctx, params) => `You're no longer going to ${params.eventTitle}`,\n heading: (params) => `You're no longer going to ${params.eventTitle}`,\n lines: (params) => [`You've been removed from the event on ${eventWhen(params)}.`],\n button: open,\n preview: PREVIEW_EVENT,\n});\n","// Default TemplateRenderer: react-email components rendered at call time.\nimport { render } from \"@react-email/render\";\nimport type { JSX } from \"react\";\nimport type {\n EmailContent,\n EmailTemplateId,\n EmailTemplateParams,\n TemplateContext,\n TemplateRenderer,\n} from \"@headless-lms/core/types\";\nimport MagicLink, { subject as magicLink } from \"./emails/magic-link.js\";\nimport StudentInvite, { subject as studentInvite } from \"./emails/student-invite.js\";\nimport MemberInvite, { subject as memberInvite } from \"./emails/member-invite.js\";\nimport PasswordReset, { subject as passwordReset } from \"./emails/password-reset.js\";\nimport PasswordChanged, { subject as passwordChanged } from \"./emails/password-changed.js\";\nimport EmailVerification, { subject as emailVerification } from \"./emails/email-verification.js\";\nimport AccessGranted, { subject as accessGranted } from \"./emails/access-granted.js\";\nimport AccessRevoked, { subject as accessRevoked } from \"./emails/access-revoked.js\";\nimport CourseCompleted, { subject as courseCompleted } from \"./emails/course-completed.js\";\nimport {\n addedToGroupChat,\n commentReacted,\n digest,\n invitedToSpace,\n joinRequest,\n membershipEnded,\n membershipEndingSoon,\n mention,\n messageReacted,\n messageRequest,\n messageWasFlagged,\n newCommentOnPost,\n newMessage,\n newPostInSpace,\n postAwaitingReview,\n postReacted,\n replyToYourComment,\n requestApproved,\n requestDeclined,\n somethingWasFlagged,\n welcomeToCommunity,\n roleAssigned,\n yourCommentWasRemoved,\n yourPostWasPublished,\n yourPostWasRemoved,\n} from \"./emails/community.js\";\nimport {\n activityCommentCreated,\n activityCommentFlagged,\n activityCommentReacted,\n activityCommentRemoved,\n activityMention,\n courseActivityAdded,\n} from \"./emails/course-activity.js\";\nimport {\n eventCanceled,\n eventChanged,\n eventGranted,\n eventRevoked,\n eventStartingSoon,\n} from \"./emails/events.js\";\n\ninterface Entry<K extends EmailTemplateId> {\n subject: (ctx: TemplateContext, params: EmailTemplateParams[K]) => string;\n Component: (props: { ctx: TemplateContext; params: EmailTemplateParams[K] }) => JSX.Element;\n}\n\n// The catalog is closed: a missing key here is a compile error.\nconst registry: { [K in EmailTemplateId]: Entry<K> } = {\n magicLink: { subject: magicLink, Component: MagicLink },\n studentInvite: { subject: studentInvite, Component: StudentInvite },\n memberInvite: { subject: memberInvite, Component: MemberInvite },\n passwordReset: { subject: passwordReset, Component: PasswordReset },\n passwordChanged: { subject: passwordChanged, Component: PasswordChanged },\n emailVerification: { subject: emailVerification, Component: EmailVerification },\n accessGranted: { subject: accessGranted, Component: AccessGranted },\n accessRevoked: { subject: accessRevoked, Component: AccessRevoked },\n courseCompleted: { subject: courseCompleted, Component: CourseCompleted },\n welcomeToCommunity: {\n subject: welcomeToCommunity.subject,\n Component: welcomeToCommunity.Component,\n },\n membershipEndingSoon: {\n subject: membershipEndingSoon.subject,\n Component: membershipEndingSoon.Component,\n },\n membershipEnded: { subject: membershipEnded.subject, Component: membershipEnded.Component },\n newPostInSpace: { subject: newPostInSpace.subject, Component: newPostInSpace.Component },\n yourPostWasPublished: {\n subject: yourPostWasPublished.subject,\n Component: yourPostWasPublished.Component,\n },\n yourPostWasRemoved: {\n subject: yourPostWasRemoved.subject,\n Component: yourPostWasRemoved.Component,\n },\n newCommentOnPost: { subject: newCommentOnPost.subject, Component: newCommentOnPost.Component },\n replyToYourComment: {\n subject: replyToYourComment.subject,\n Component: replyToYourComment.Component,\n },\n yourCommentWasRemoved: {\n subject: yourCommentWasRemoved.subject,\n Component: yourCommentWasRemoved.Component,\n },\n requestApproved: { subject: requestApproved.subject, Component: requestApproved.Component },\n requestDeclined: { subject: requestDeclined.subject, Component: requestDeclined.Component },\n invitedToSpace: { subject: invitedToSpace.subject, Component: invitedToSpace.Component },\n messageRequest: { subject: messageRequest.subject, Component: messageRequest.Component },\n newMessage: { subject: newMessage.subject, Component: newMessage.Component },\n addedToGroupChat: { subject: addedToGroupChat.subject, Component: addedToGroupChat.Component },\n roleAssigned: { subject: roleAssigned.subject, Component: roleAssigned.Component },\n digest: { subject: digest.subject, Component: digest.Component },\n postAwaitingReview: {\n subject: postAwaitingReview.subject,\n Component: postAwaitingReview.Component,\n },\n joinRequest: { subject: joinRequest.subject, Component: joinRequest.Component },\n somethingWasFlagged: {\n subject: somethingWasFlagged.subject,\n Component: somethingWasFlagged.Component,\n },\n messageWasFlagged: {\n subject: messageWasFlagged.subject,\n Component: messageWasFlagged.Component,\n },\n postReacted: { subject: postReacted.subject, Component: postReacted.Component },\n commentReacted: { subject: commentReacted.subject, Component: commentReacted.Component },\n mention: { subject: mention.subject, Component: mention.Component },\n messageReacted: { subject: messageReacted.subject, Component: messageReacted.Component },\n courseActivityAdded: {\n subject: courseActivityAdded.subject,\n Component: courseActivityAdded.Component,\n },\n activityCommentCreated: {\n subject: activityCommentCreated.subject,\n Component: activityCommentCreated.Component,\n },\n activityCommentRemoved: {\n subject: activityCommentRemoved.subject,\n Component: activityCommentRemoved.Component,\n },\n activityCommentReacted: {\n subject: activityCommentReacted.subject,\n Component: activityCommentReacted.Component,\n },\n activityCommentFlagged: {\n subject: activityCommentFlagged.subject,\n Component: activityCommentFlagged.Component,\n },\n activityMention: { subject: activityMention.subject, Component: activityMention.Component },\n eventGranted: { subject: eventGranted.subject, Component: eventGranted.Component },\n eventStartingSoon: {\n subject: eventStartingSoon.subject,\n Component: eventStartingSoon.Component,\n },\n eventChanged: { subject: eventChanged.subject, Component: eventChanged.Component },\n eventCanceled: { subject: eventCanceled.subject, Component: eventCanceled.Component },\n eventRevoked: { subject: eventRevoked.subject, Component: eventRevoked.Component },\n};\n\nexport class ReactEmailTemplateRenderer implements TemplateRenderer {\n async render<K extends EmailTemplateId>(\n id: K,\n ctx: TemplateContext,\n params: EmailTemplateParams[K],\n ): Promise<EmailContent> {\n const entry = registry[id] as Entry<K>;\n const element = <entry.Component ctx={ctx} params={params} />;\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { subject: entry.subject(ctx, params), html, text };\n }\n}\n"],"mappings":";;;;AAmBA,MAAM,WAAW;AACjB,MAAM,WAAW;AAEjB,SAAgB,OAAO,EACrB,KACA,SACA,YAKC;CACD,OACE,oBAAC,MAAD,EAAA,UACE,qBAAC,UAAD,EAAA,UAAA,CACE,oBAAC,MAAD,CAAO,CAAA,GACP,oBAAC,MAAD;EAAM,WAAU;EACd,UAAA,qBAAC,WAAD;GAAW,WAAU;GAArB,UAAA;IACE,oBAAC,KAAD;KAAK,KAAK;KAAU,KAAK,IAAI;KAAW,QAAQ;KAAI,WAAU;IAAY,CAAA;IAC1E,oBAAC,SAAD;KAAS,WAAU;KAChB,UAAA;IACM,CAAA;IACT,oBAAC,SAAD,EAAU,SAAkB,CAAA;IAC5B,oBAAC,IAAD,EAAI,WAAU,uCAAwC,CAAA;IACtD,qBAAC,KAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KAAQ,WAAU;KAChB,UAAA,oBAAC,KAAD;MAAK,KAAK;MAAU,KAAI;MAAG,OAAO;MAAI,QAAQ;MAAI,WAAU;KAAiB,CAAA;IACvE,CAAA,GACR,oBAAC,QAAD;KAAQ,WAAU;KAChB,UAAA,oBAAC,MAAD;MAAM,MAAM,IAAI;MAAS,WAAU;MAChC,UAAA,IAAI;KACD,CAAA;IACA,CAAA,CACL,EAAA,CAAA;GACI;;CACP,CAAA,CACE,EAAA,CAAA,EACN,CAAA;AAEV;AAEA,SAAgB,YAAY,EAAE,MAAM,YAAmD;CACrF,OACE,oBAAC,SAAD;EAAS,WAAU;EACjB,UAAA,oBAAC,QAAD;GACQ;GACN,WAAU;GAET;EACK,CAAA;CACD,CAAA;AAEb;AAEA,SAAgB,UAAU,EAAE,YAAqC;CAC/D,OAAO,oBAAC,MAAD;EAAM,WAAU;EAAsD;CAAe,CAAA;AAC9F;AAEA,MAAa,cAA+B;CAC1C,WAAW;CACX,SAAS;CACT,OAAO;EAAE,SAAS;EAAyB,WAAW;CAAwB;AAChF;;;AC5EA,MAAaA,aAAW,KAAsB,YAAoB,cAAc,IAAI;AAEpF,SAAwB,UAAU,EAAE,KAAK,UAAoD;CAC3F,OACE,qBAAC,QAAD;EAAa;EAAK,SAAQ;EAA1B,UAAA;GACE,oBAAC,WAAD,EAAA,UAAW,kFAEA,CAAA;GACX,qBAAC,aAAD;IAAa,MAAM,OAAO;IAA1B,UAAA,CAA+B,eAAY,IAAI,SAAuB;;GACtE,oBAAC,WAAD,EAAA,UAAW,0DAAkE,CAAA;EACvE;;AAEZ;AAEA,UAAU,eAAe;CACvB,KAAK;CACL,QAAQ,EAAE,KAAK,yCAAyC;AAC1D;;;ACjBA,MAAaC,aAAW,KAAsB,YAC5C,qBAAqB,IAAI;AAE3B,SAAwB,cAAc,EAAE,KAAK,UAAoD;CAC/F,OACE,qBAAC,QAAD;EAAa;EAAK,SAAQ;EAA1B,UAAA;GACE,qBAAC,WAAD,EAAA,UAAA;IACG,OAAO;IAAY;IAA0B,IAAI;IAAU;GAEnD,EAAA,CAAA;GACX,oBAAC,aAAD;IAAa,MAAM,OAAO;IAAW,UAAA;GAAgC,CAAA;GACrE,oBAAC,WAAD,EAAA,UAAW,8DAAsE,CAAA;EAC3E;;AAEZ;AAEA,cAAc,eAAe;CAC3B,KAAK;CACL,QAAQ;EACN,WAAW;EACX,aAAa;CACf;AACF;;;ACtBA,MAAaC,aAAW,KAAsB,YAC5C,+BAA+B,IAAI;AAErC,SAAwB,aAAa,EAAE,KAAK,UAAoD;CAC9F,OACE,qBAAC,QAAD;EAAa;EAAK,SAAS,QAAQ,IAAI;EAAvC,UAAA;GACE,qBAAC,WAAD,EAAA,UAAA;IACG,OAAO;IAAY;IAAsB,IAAI;IAAU;IAAK,OAAO;IAAK;GAChE,EAAA,CAAA;GACX,oBAAC,aAAD;IAAa,MAAM,OAAO;IAAW,UAAA;GAA8B,CAAA;GACnE,oBAAC,WAAD,EAAA,UAAW,uEAA+E,CAAA;EACpF;;AAEZ;AAEA,aAAa,eAAe;CAC1B,KAAK;CACL,QAAQ;EACN,WAAW;EACX,aAAa;EACb,MAAM;CACR;AACF;;;ACtBA,MAAaC,aAAW,KAAsB,YAC5C,cAAc,IAAI,UAAU;AAE9B,SAAwB,cAAc,EAAE,KAAK,UAAoD;CAC/F,OACE,qBAAC,QAAD;EAAa;EAAK,SAAQ;EAA1B,UAAA;GACE,oBAAC,WAAD,EAAA,UAAW,6EAEA,CAAA;GACX,oBAAC,aAAD;IAAa,MAAM,OAAO;IAAU,UAAA;GAA2B,CAAA;GAC/D,oBAAC,WAAD,EAAA,UAAW,4FAEA,CAAA;EACL;;AAEZ;AAEA,cAAc,eAAe;CAC3B,KAAK;CACL,QAAQ,EAAE,UAAU,yCAAyC;AAC/D;;;ACpBA,MAAaC,aAAW,KAAsB,YAC5C,QAAQ,IAAI,UAAU;AAExB,SAAwB,gBAAgB,EAAE,OAAiD;CACzF,OACE,qBAAC,QAAD;EAAa;EAAK,SAAQ;EAA1B,UAAA,CACE,qBAAC,WAAD,EAAA,UAAA;GAAW;GAAuB,IAAI;GAAU;EAAqC,EAAA,CAAA,GACrF,oBAAC,WAAD,EAAA,UAAW,kEAA0E,CAAA,CAC/E;;AAEZ;AAEA,gBAAgB,eAAe;CAC7B,KAAK;CACL,QAAQ,CAAC;AACX;;;ACfA,MAAaC,aAAW,KAAsB,YAC5C,yBAAyB,IAAI;AAE/B,SAAwB,kBAAkB,EACxC,KACA,UAIC;CACD,OACE,qBAAC,QAAD;EAAa;EAAK,SAAQ;EAA1B,UAAA,CACE,oBAAC,WAAD,EAAA,UAAW,wEAAgF,CAAA,GAC3F,oBAAC,aAAD;GAAa,MAAM,OAAO;GAAW,UAAA;EAAyB,CAAA,CACxD;;AAEZ;AAEA,kBAAkB,eAAe;CAC/B,KAAK;CACL,QAAQ,EAAE,WAAW,0CAA0C;AACjE;;;ACrBA,SAAS,QAAQ,KAAsB;CACrC,IAAI,CAAC,IAAI,OACP,MAAM,IAAI,MAAM,qEAAqE;CAEvF,OAAO,IAAI;AACb;AAEA,SAAgB,aAAa,KAAsB,MAAsB;CACvE,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,YAAY;AACrC;AAEA,SAAgB,UAAU,KAAsB,MAAsB;CACpE,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,UAAU;AACnC;AAEA,SAAgB,YAAiD,MAY/D;CACA,SAAS,UAAU,EAAE,KAAK,UAAoE;EAC5F,MAAM,SAAS,KAAK,SAAS,KAAK,MAAM;EACxC,OACE,qBAAC,QAAD;GAAa;GAAK,SAAS,KAAK,QAAQ,MAAM;GAA9C,UAAA,CACG,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,UAC7B,oBAAC,WAAD,EAAA,UAAwB,KAAgB,GAAxB,KAAwB,CACzC,GACA,SAAS,oBAAC,aAAD;IAAa,MAAM,OAAO;IAAO,UAAA,OAAO;GAAmB,CAAA,IAAI,IACnE;;CAEZ;CACA,UAAU,eAAe;EAAE,KAAK;EAAa,QAAQ,KAAK;CAAQ;CAClE,OAAO;EAAE,SAAS,KAAK;EAAS;CAAU;AAC5C;AAEA,MAAM,aAAa,KAAsB,OAAe,aAAa,KAAK,gBAAgB,IAAI;AAC9F,MAAM,SAAS,KAAsB,aAAqB,YACxD,aAAa,KAAK,gBAAgB,YAAY,UAAU,SAAS;AACnE,MAAM,QAAQ,KAAsB,aAAqB,WACvD,aAAa,KAAK,gBAAgB,YAAY,SAAS,QAAQ;AACjE,MAAM,WAAW,KAAsB,aAAqB,QAAgB,cAC1E,GAAG,KAAK,KAAK,aAAa,MAAM,EAAE,GAAG;AACvC,MAAM,QAAQ,KAAsB,aAAqB,WACvD,aAAa,KAAK,gBAAgB,YAAY,SAAS,QAAQ;AAEjE,SAAS,WAAW,OAAuB;CACzC,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAC7B,OAAO;CAET,OAAO,IAAI,KAAK,eAAe,SAAS;EACtC,KAAK;EACL,OAAO;EACP,MAAM;EACN,UAAU;CACZ,CAAC,CAAC,CAAC,OAAO,IAAI;AAChB;AAEA,MAAa,qBAAqB,YAAkC;CAClE,UAAU,MAAM,WAAW,cAAc,OAAO;CAChD,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CACjB,OAAO,WAAW,SAAS,IACvB,gBAAgB,OAAO,WAAW,KAAK,IAAI,EAAE,KAC7C,kBACN;CACA,SAAS,KAAK,YAAY;EAAE,MAAM,UAAU,KAAK,OAAO,WAAW;EAAG,OAAO;CAAiB;CAC9F,SAAS;EAAE,gBAAgB;EAAY,aAAa;EAAS,YAAY,CAAC,eAAe;CAAE;AAC7F,CAAC;AAED,MAAa,uBAAuB,YAAoC;CACtE,UAAU,MAAM,WAAW,GAAG,OAAO,eAAe;CACpD,UAAU,WAAW,GAAG,OAAO,eAAe;CAC9C,QAAQ,WAAW,CAAC,oBAAoB,WAAW,OAAO,SAAS,EAAE,EAAE;CACvE,SAAS,KAAK,YAAY;EAAE,MAAM,UAAU,KAAK,OAAO,WAAW;EAAG,OAAO;CAAQ;CACrF,SAAS;EACP,gBAAgB;EAChB,aAAa;EACb,WAAW;CACb;AACF,CAAC;AAED,SAAS,gBAAgB,QAAwD;CAC/E,OAAO,OAAO,YAAY,KAAK,SAAS,KAAK,cAAc,CAAC,CAAC,KAAK,IAAI;AACxE;AAEA,MAAa,kBAAkB,YAA+B;CAC5D,UAAU,MAAM,WAAW,GAAG,gBAAgB,MAAM,EAAE;CACtD,UAAU,WAAW,GAAG,gBAAgB,MAAM,EAAE;CAChD,QAAQ,WAAW,CACjB,OAAO,YAAY,WAAW,IAC1B,6CACA,6CACN;CACA,SAAS,KAAK,WAAW;EACvB,MAAM,CAAC,QAAQ,OAAO;EACtB,OAAO,OAAO,YAAY,WAAW,KAAK,OACtC;GAAE,MAAM,UAAU,KAAK,KAAK,WAAW;GAAG,OAAO;EAAQ,IACzD;GAAE,MAAM,aAAa,KAAK,cAAc;GAAG,OAAO;EAAmB;CAC3E;CACA,SAAS,EAAE,aAAa,CAAC;EAAE,aAAa;EAAS,gBAAgB;CAAW,CAAC,EAAE;AACjF,CAAC;AAED,MAAa,iBAAiB,YAA8B;CAC1D,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,aAAa,OAAO;CACpE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,WAAW,MAAM,OAAO,aAAa,OAAO,OAAO;CACjF,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,WAAW;EACX,YAAY;EACZ,SAAS;EACT,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,uBAAuB,YAAoC;CACtE,UAAU,MAAM,WAAW,8BAA8B,OAAO;CAChE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,gBAAgB,OAAO,UAAU,EAAE;CACvD,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,WAAW;EACX,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,qBAAqB,YAAkC;CAClE,UAAU,MAAM,WAAW,8BAA8B,OAAO;CAChE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,uBAAuB,OAAO,UAAU,EAAE;CAC9D,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,WAAW;EACX,SAAS;EACT,aAAa;CACf;AACF,CAAC;AAED,MAAa,mBAAmB,YAAgC;CAC9D,UAAU,MAAM,WAAW,GAAG,OAAO,cAAc,gBAAgB,OAAO;CAC1E,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,OAAO,eAAe,OAAO,OAAO;CACxD,SAAS,KAAK,YAAY;EACxB,MAAM,QAAQ,KAAK,OAAO,aAAa,OAAO,QAAQ,OAAO,SAAS;EACtE,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,eAAe;EACf,SAAS;EACT,WAAW;EACX,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,qBAAqB,YAAkC;CAClE,UAAU,MAAM,WAAW,GAAG,OAAO,cAAc,cAAc,OAAO;CACxE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,OAAO,eAAe,OAAO,OAAO;CACxD,SAAS,KAAK,YAAY;EACxB,MAAM,QAAQ,KAAK,OAAO,aAAa,OAAO,QAAQ,OAAO,SAAS;EACtE,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,eAAe;EACf,SAAS;EACT,WAAW;EACX,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,wBAAwB,YAAqC;CACxE,UAAU,MAAM,WAAW,iCAAiC,OAAO;CACnE,UAAU,WAAW,OAAO;CAC5B,aAAa,CAAC,2BAA2B;CACzC,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EAAE,WAAW;EAAS,QAAQ;EAAS,aAAa;CAAQ;AACvE,CAAC;AAED,MAAa,kBAAkB,YAA+B;CAC5D,UAAU,MAAM,WAAW,aAAa,OAAO;CAC/C,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,wBAAwB,OAAO,UAAU,eAAe;CAC5E,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EAAE,WAAW;EAAQ,SAAS;EAAS,aAAa;CAAQ;AACvE,CAAC;AAED,MAAa,kBAAkB,YAA+B;CAC5D,UAAU,MAAM,WAAW,wBAAwB,OAAO;CAC1D,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,wBAAwB,OAAO,UAAU,eAAe;CAC5E,SAAS,KAAK,YAAY;EAAE,MAAM,UAAU,KAAK,OAAO,WAAW;EAAG,OAAO;CAAiB;CAC9F,SAAS;EAAE,WAAW;EAAQ,aAAa;CAAQ;AACrD,CAAC;AAED,MAAa,iBAAiB,YAA8B;CAC1D,UAAU,MAAM,WAAW,GAAG,OAAO,YAAY,kBAAkB,OAAO;CAC1E,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,cAAc;CACxD,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,aAAa;EACb,SAAS;EACT,aAAa;CACf;AACF,CAAC;AAED,MAAa,iBAAiB,YAA8B;CAC1D,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW;CAChD,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,OAAO,OAAO;CAClC,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EAAE,YAAY;EAAO,SAAS;EAAS,QAAQ;EAAS,aAAa;CAAQ;AACxF,CAAC;AAED,MAAa,aAAa,YAA0B;CAClD,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,MAAM,OAAO;CAC7D,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,WAAW,IAAI,OAAO,SAAS;CAC7D,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,YAAY;EACZ,WAAW;EACX,SAAS;EACT,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,mBAAmB,YAAgC;CAC9D,UAAU,MAAM,WAAW,GAAG,OAAO,UAAU;CAC/C,eAAe;CACf,QAAQ,WAAW,CAAC,GAAG,OAAO,UAAU,cAAc,OAAO,iBAAiB,KAAK,IAAI,CAAC;CACxF,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,kBAAkB,CAAC,OAAO,KAAK;EAC/B,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAM,YAAoC;CACxC,QAAQ;CACR,UAAU;CACV,WAAW;CACX,OAAO;AACT;AAEA,MAAa,eAAe,YAA4B;CACtD,UAAU,MAAM,WAAW,eAAe,OAAO,SAAS,GAAG,OAAO;CACpE,UAAU,WAAW,eAAe,OAAO;CAC3C,QAAQ,WAAW,CAAC,eAAe,OAAO,SAAS,GAAG,OAAO,MAAM,EAAE;CACrE,SAAS,KAAK,WACZ,OAAO,cAAc,QAAQ,OAAO,gBAAgB,OAChD;EACE,MAAM,GAAG,IAAI,QAAQ,GAAG,UAAU,OAAO,gBAAgB,GAAG,GAAG,OAAO;EACtE,OAAO;CACT,IACA;EAAE,MAAM,IAAI;EAAS,OAAO;CAAO;CACzC,SAAS;EACP,UAAU;EACV,OAAO;EACP,WAAW;EACX,aAAa;CACf;AACF,CAAC;AAID,SAAS,cAAc,OAAuB;CAC5C,OAAO,UAAU,IAAI,cAAc,GAAG,MAAM;AAC9C;AAEA,SAAS,OAAO,EAAE,KAAK,UAA0D;CAC/E,OACE,qBAAC,QAAD;EAAa;EAAK,SAAS,GAAG,OAAO,eAAe;EAApD,UAAA;GACE,oBAAC,WAAD,EAAA,UAAY,gCAA2C,CAAA;GACtD,OAAO,MAAM,KAAK,SACjB,qBAAC,SAAD;IAA2B,WAAU;IAArC,UAAA,CACE,oBAAC,MAAD;KACE,MAAM,KAAK,KAAK,OAAO,aAAa,KAAK,MAAM;KAC/C,WAAU;KAET,UAAA,KAAK;IACF,CAAA,GACN,oBAAC,MAAD;KAAM,WAAU;KACb,UAAA,GAAG,KAAK,WAAW,MAAM,KAAK,UAAU,KAAK,cAAc,KAAK,YAAY;IACzE,CAAA,CACC;GAVK,GAAA,KAAK,MAUV,CACV;GACD,oBAAC,aAAD;IAAa,MAAM,UAAU,KAAK,OAAO,WAAW;IAAG,UAAA;GAA2B,CAAA;EAC5E;;AAEZ;AAEA,OAAO,eAAe;CACpB,KAAK;CACL,QAAQ;EACN,gBAAgB;EAChB,aAAa;EACb,MAAM;EACN,IAAI;EACJ,OAAO,CACL;GACE,QAAQ;GACR,OAAO;GACP,YAAY;GACZ,WAAW;GACX,cAAc;EAChB,CACF;CACF;AACF;AAEA,MAAa,SAAS;CACpB,UAAU,MAAuB,WAAyB,GAAG,OAAO,eAAe;CACnF,WAAW;AACb;AAEA,MAAa,qBAAqB,YAAkC;CAClE,UAAU,MAAM,WAAW,2BAA2B,OAAO;CAC7D,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,WAAW,uBAAuB,OAAO,UAAU,EAAE;CACnF,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,WAAW;EACX,YAAY;EACZ,SAAS;EACT,aAAa;CACf;AACF,CAAC;AAED,MAAa,cAAc,YAA2B;CACpD,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,aAAa,OAAO;CACpE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,WAAW,8BAA8B,OAAO,UAAU,EAAE;CAC1F,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,YAAY;EACZ,WAAW;EACX,SAAS;EACT,aAAa;CACf;AACF,CAAC;AAED,MAAa,sBAAsB,YAAmC;CACpE,UAAU,MAAM,WAAW,4BAA4B,OAAO;CAC9D,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,OAAO,QAAQ,OAAO,OAAO;CACjD,SAAS,KAAK,YAAY;EACxB,MAAM,MAAM,KAAK,OAAO,aAAa,OAAO,OAAO;EACnD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,SAAS;EACT,QAAQ;EACR,SAAS;EACT,aAAa;CACf;AACF,CAAC;AAED,MAAa,oBAAoB,YAAiC;CAChE,eAAe;CACf,eAAe;CACf,QAAQ,WAAW,CAAC,OAAO,MAAM;CACjC,SAAS,KAAK,YAAY;EAAE,MAAM,UAAU,KAAK,OAAO,WAAW;EAAG,OAAO;CAAS;CACtF,SAAS;EAAE,QAAQ;EAAQ,aAAa;CAAQ;AAClD,CAAC;AAED,MAAa,cAAc,YAA2B;CACpD,UAAU,MAAM,WAAW,GAAG,OAAO,YAAY;CACjD,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,WAAW,OAAO,SAAS,eAAe;CACpF,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,aAAa;EACb,UAAU;EACV,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,MAAa,iBAAiB,YAA8B;CAC1D,UAAU,MAAM,WAAW,GAAG,OAAO,YAAY;CACjD,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,WAAW,OAAO,SAAS,OAAO,OAAO,OAAO;CAC1F,SAAS,KAAK,YAAY;EACxB,MAAM,QAAQ,KAAK,OAAO,aAAa,OAAO,QAAQ,OAAO,SAAS;EACtE,OAAO;CACT;CACA,SAAS;EACP,WAAW;EACX,SAAS;EACT,aAAa;EACb,UAAU;EACV,WAAW;EACX,QAAQ;EACR,aAAa;CACf;AACF,CAAC;AAED,SAAS,YAAY,QAAgD;CACnE,OAAO,eAAe,SAAS,OAAO,YAAY,OAAO;AAC3D;AAEA,MAAa,UAAU,YAAuB;CAC5C,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,oBAAoB,YAAY,MAAM;CACtF,UAAU,WAAW,YAAY,MAAM;CACvC,QAAQ,WAAW,CAAC,OAAO,YAAY,OAAO,OAAO;CACrD,SAAS,KAAK,WACZ,eAAe,SACX;EACE,MAAM,OAAO,YACT,QAAQ,KAAK,OAAO,aAAa,OAAO,QAAQ,OAAO,SAAS,IAChE,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EAC/C,OAAO;CACT,IACA;EAAE,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EAAG,OAAO;CAAY;CAC/E,SAAS;EACP,YAAY;EACZ,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ;EACR,WAAW;CACb;AACF,CAAC;AAED,MAAa,iBAAiB,YAA8B;CAC1D,UAAU,MAAM,WAAW,GAAG,OAAO,YAAY;CACjD,eAAe;CACf,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,WAAW,OAAO,SAAS,OAAO,OAAO,OAAO;CAC1F,SAAS,KAAK,YAAY;EACxB,MAAM,KAAK,KAAK,OAAO,aAAa,OAAO,MAAM;EACjD,OAAO;CACT;CACA,SAAS;EACP,SAAS;EACT,aAAa;EACb,UAAU;EACV,QAAQ;EACR,aAAa;CACf;AACF,CAAC;;;ACrfD,MAAaC,aAAW,MAAuB,WAC7C,0BAA0B,OAAO;AAEnC,MAAM,cAAwE;CAC5E,QAAQ;CACR,UAAU;CACV,WAAW;CACX,OAAO;AACT;AAEA,MAAM,SAAgD;CACpD,QAAQ;CACR,UAAU;CACV,WAAW;CACX,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,OAAO,KAAsB,QAAwB;CAC5D,IAAI,OAAO,gBAAgB,UACzB,OAAO,UAAU,KAAK,EAAE;CAE1B,MAAM,OAAO,IAAI,YAAY,OAAO,aAAa,GAAG,OAAO;CAC3D,OAAO,OAAO,gBAAgB,eAAe,OAAO,gBAAgB,UAChE,aAAa,KAAK,IAAI,IACtB,UAAU,KAAK,IAAI;AACzB;AAEA,SAAwB,cAAc,EAAE,KAAK,UAAoD;CAC/F,OACE,qBAAC,QAAD;EAAa;EAAK,SAAS,GAAG,OAAO,aAAa;EAAlD,UAAA,CACE,oBAAC,WAAD,EAAA,UACG,OAAO,gBAAgB,WACpB,yFACA,6DACK,CAAA,GACX,oBAAC,aAAD;GAAa,MAAM,OAAO,KAAK,MAAM;GAAI,UAAA,OAAO,OAAO;EAA0B,CAAA,CAC3E;;AAEZ;AAEA,cAAc,eAAe;CAC3B,KAAK;CACL,QAAQ;EACN,cAAc;EACd,WAAW;EACX,aAAa;CACf;AACF;;;ACjDA,MAAaC,aAAW,MAAuB,WAC7C,kBAAkB,OAAO,aAAa;AAExC,SAAwB,cAAc,EAAE,KAAK,UAAoD;CAC/F,OACE,oBAAC,QAAD;EAAa;EAAK,SAAQ;EACxB,UAAA,qBAAC,WAAD,EAAA,UAAA;GAAW;GACO,OAAO;GAAa;EAE3B,EAAA,CAAA;CACL,CAAA;AAEZ;AAEA,cAAc,eAAe;CAC3B,KAAK;CACL,QAAQ,EACN,cAAc,gBAChB;AACF;;;ACnBA,MAAa,WAAW,MAAuB,WAC7C,iBAAiB,OAAO,YAAY;AAEtC,SAAwB,gBAAgB,EAAE,KAAK,UAAoD;CACjG,OACE,oBAAC,QAAD;EAAa;EAAK,SAAQ;EACxB,UAAA,qBAAC,WAAD,EAAA,UAAA;GAAW;GAAkB,OAAO;GAAY;EAAuB,EAAA,CAAA;CACjE,CAAA;AAEZ;AAEA,gBAAgB,eAAe;CAC7B,KAAK;CACL,QAAQ,EACN,aAAa,gBACf;AACF;;;AClBA,MAAM,YAAY,KAAsB,UAAkB,eACxD,UAAU,KAAK,YAAY,SAAS,YAAY,YAAY;AAE9D,MAAa,sBAAsB,YAAmC;CACpE,UAAU,MAAM,WAAW,UAAU,OAAO,YAAY,IAAI,OAAO;CACnE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,IAAI,OAAO,aAAa;CAClE,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,aAAa;EACb,aAAa;EACb,eAAe;EACf,UAAU;EACV,YAAY;CACd;AACF,CAAC;AAED,MAAa,yBAAyB,YAAsC;CAC1E,UAAU,MAAM,WAAW,GAAG,OAAO,cAAc,gBAAgB,OAAO;CAC1E,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW;EAAC,OAAO;EAAa,OAAO;EAAe,OAAO;CAAO;CAC5E,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,eAAe;EACf,aAAa;EACb,eAAe;EACf,SAAS;EACT,UAAU;EACV,YAAY;EACZ,WAAW;CACb;AACF,CAAC;AAED,MAAa,yBAAyB,YAAsC;CAC1E,UAAU,MAAM,WAAW,iCAAiC,OAAO;CACnE,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,mBAAmB,OAAO,YAAY,cAAc;CACxE,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,eAAe;EACf,aAAa;EACb,UAAU;EACV,YAAY;CACd;AACF,CAAC;AAED,MAAa,yBAAyB,YAAsC;CAC1E,UAAU,MAAM,WAAW,GAAG,OAAO,YAAY;CACjD,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW,CAAC,GAAG,OAAO,YAAY,WAAW,OAAO,SAAS,OAAO,OAAO,OAAO;CAC1F,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,eAAe;EACf,aAAa;EACb,SAAS;EACT,aAAa;EACb,UAAU;EACV,UAAU;EACV,YAAY;EACZ,WAAW;CACb;AACF,CAAC;AAED,MAAa,yBAAyB,YAAsC;CAC1E,UAAU,MAAM,WAAW,4BAA4B,OAAO;CAC9D,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW;EAAC,OAAO;EAAa,OAAO;EAAQ,OAAO;CAAO;CACrE,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,eAAe;EACf,aAAa;EACb,SAAS;EACT,QAAQ;EACR,UAAU;EACV,YAAY;CACd;AACF,CAAC;AAED,MAAa,kBAAkB,YAA+B;CAC5D,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,oBAAoB,OAAO;CAC3E,UAAU,WAAW,OAAO;CAC5B,QAAQ,WAAW;EAAC,OAAO;EAAa,OAAO;EAAY,OAAO;CAAO;CACzE,SAAS,KAAK,YAAY;EACxB,MAAM,SAAS,KAAK,OAAO,UAAU,OAAO,UAAU;EACtD,OAAO;CACT;CACA,SAAS;EACP,YAAY;EACZ,SAAS;EACT,eAAe;EACf,aAAa;EACb,UAAU;EACV,YAAY;CACd;AACF,CAAC;;;ACvGD,MAAM,gBAAkC;CACtC,SAAS;CACT,YAAY;CACZ,UAAU;CACV,QAAQ;CACR,UAAU;AACZ;AAEA,SAAgB,UAAU,KAAsB,SAAyB;CACvE,OAAO,aAAa,KAAK,WAAW,SAAS;AAC/C;AAEA,SAAS,SAAS,OAAe,UAAkB,SAA6C;CAC9F,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAC7B,OAAO;CAET,IAAI;EACF,OAAO,IAAI,KAAK,eAAe,SAAS;GAAE,GAAG;GAAS;EAAS,CAAC,CAAC,CAAC,OAAO,IAAI;CAC/E,QAAQ;EACN,OAAO,IAAI,KAAK,eAAe,SAAS;GAAE,GAAG;GAAS,UAAU;EAAM,CAAC,CAAC,CAAC,OAAO,IAAI;CACtF;AACF;AAEA,SAAgB,UAAU,QAAkC;CAC1D,MAAM,MAAM,SAAS,OAAO,UAAU,OAAO,UAAU;EACrD,SAAS;EACT,KAAK;EACL,OAAO;EACP,MAAM;CACR,CAAC;CACD,MAAM,OAAO;EAAE,MAAM;EAAW,QAAQ;CAAU;CAGlD,OAAO,GAAG,IAAI,IAFD,SAAS,OAAO,UAAU,OAAO,UAAU,IAEnC,EAAE,KADZ,SAAS,OAAO,QAAQ,OAAO,UAAU,IACvB,EAAE,IAAI,OAAO,SAAS;AACrD;AAEA,SAAS,cAAc,OAAuB;CAC5C,OAAO,IAAI,KAAK,KAAK,CAAC,CACnB,YAAY,CAAC,CACb,QAAQ,SAAS,EAAE,CAAC,CACpB,QAAQ,WAAW,EAAE;AAC1B;AAEA,SAAgB,kBAAkB,KAAsB,QAAkC;CAQxF,OAAO,+CAA+C,IAPpC,gBAAgB;EAChC,QAAQ;EACR,MAAM,OAAO;EACb,OAAO,GAAG,cAAc,OAAO,QAAQ,EAAE,GAAG,cAAc,OAAO,MAAM;EACvE,SAAS,UAAU,KAAK,OAAO,OAAO;EACtC,KAAK,OAAO;CACd,CAC0D,CAAC,CAAC,SAAS;AACvE;AAEA,SAAgB,mBAAmB,KAAsB,QAAkC;CASzF,OAAO,sDAAsD,IAR3C,gBAAgB;EAChC,MAAM;EACN,KAAK;EACL,SAAS,OAAO;EAChB,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC,CAAC,YAAY;EAC/C,OAAO,IAAI,KAAK,OAAO,MAAM,CAAC,CAAC,YAAY;EAC3C,MAAM,UAAU,KAAK,OAAO,OAAO;CACrC,CACiE,CAAC,CAAC,SAAS;AAC9E;AAIA,SAAS,aAAa,EAAE,KAAK,UAAqD;CAChF,OACE,qBAAC,QAAD;EAAa;EAAK,SAAS,mBAAmB,OAAO;EAArD,UAAA;GACE,oBAAC,WAAD,EAAA,UAAY,UAAU,MAAM,EAAa,CAAA;GACzC,oBAAC,aAAD;IAAa,MAAM,UAAU,KAAK,OAAO,OAAO;IAAG,UAAA;GAAuB,CAAA;GAC1E,oBAAC,SAAD,EAAA,UACE,qBAAC,WAAD,EAAA,UAAA;IACE,oBAAC,MAAD;KAAM,MAAM,kBAAkB,KAAK,MAAM;KAAG,UAAA;IAA4B,CAAA;IACvE;IACD,oBAAC,MAAD;KAAM,MAAM,mBAAmB,KAAK,MAAM;KAAG,UAAA;IAAoB,CAAA;GACxD,EAAA,CAAA,EACJ,CAAA;EACH;;AAEZ;AAEA,aAAa,eAAe;CAAE,KAAK;CAAa,QAAQ;AAAc;AAEtE,MAAa,eAAe;CAC1B,UAAU,MAAuB,WAAoB,mBAAmB,OAAO;CAC/E,WAAW;AACb;AAEA,MAAM,UAA0E;CAC9E,MAAM;CACN,UAAU;CACV,mBAAmB;AACrB;AAEA,MAAM,QAAQ,KAAsB,YAA8B;CAChE,MAAM,UAAU,KAAK,OAAO,OAAO;CACnC,OAAO;AACT;AAEA,MAAa,oBAAoB,YAAiC;CAChE,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW,aAAa,OAAO;CACpE,UAAU,WAAW,GAAG,OAAO,WAAW,aAAa,OAAO;CAC9D,QAAQ,WAAW,CAAC,UAAU,MAAM,GAAG,8BAA8B;CACrE,QAAQ;CACR,SAAS;EAAE,GAAG;EAAe,UAAU;CAAS;AAClD,CAAC;AAED,MAAa,eAAe,YAA4B;CACtD,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW;CAChD,UAAU,WAAW,GAAG,OAAO,WAAW;CAC1C,QAAQ,WAAW,CAAC,QAAQ,OAAO,UAAU,UAAU,MAAM,CAAC;CAC9D,QAAQ;CACR,SAAS;EAAE,GAAG;EAAe,SAAS;CAAO;AAC/C,CAAC;AAED,MAAa,gBAAgB,YAA6B;CACxD,UAAU,MAAM,WAAW,GAAG,OAAO,WAAW;CAChD,UAAU,WAAW,GAAG,OAAO,WAAW;CAC1C,QAAQ,WAAW,CAAC,sBAAsB,UAAU,MAAM,EAAE,EAAE;CAC9D,QAAQ;CACR,SAAS;AACX,CAAC;AAED,MAAa,eAAe,YAA4B;CACtD,UAAU,MAAM,WAAW,6BAA6B,OAAO;CAC/D,UAAU,WAAW,6BAA6B,OAAO;CACzD,QAAQ,WAAW,CAAC,yCAAyC,UAAU,MAAM,EAAE,EAAE;CACjF,QAAQ;CACR,SAAS;AACX,CAAC;;;AC1ED,MAAM,WAAiD;CACrD,WAAW;EAAE,SAASC;EAAW,WAAW;CAAU;CACtD,eAAe;EAAE,SAASC;EAAe,WAAW;CAAc;CAClE,cAAc;EAAE,SAASC;EAAc,WAAW;CAAa;CAC/D,eAAe;EAAE,SAASC;EAAe,WAAW;CAAc;CAClE,iBAAiB;EAAE,SAASC;EAAiB,WAAW;CAAgB;CACxE,mBAAmB;EAAE,SAASC;EAAmB,WAAW;CAAkB;CAC9E,eAAe;EAAE,SAASC;EAAe,WAAW;CAAc;CAClE,eAAe;EAAE,SAASC;EAAe,WAAW;CAAc;CAClE,iBAAiB;EAAWC;EAAiB,WAAW;CAAgB;CACxE,oBAAoB;EAClB,SAAS,mBAAmB;EAC5B,WAAW,mBAAmB;CAChC;CACA,sBAAsB;EACpB,SAAS,qBAAqB;EAC9B,WAAW,qBAAqB;CAClC;CACA,iBAAiB;EAAE,SAAS,gBAAgB;EAAS,WAAW,gBAAgB;CAAU;CAC1F,gBAAgB;EAAE,SAAS,eAAe;EAAS,WAAW,eAAe;CAAU;CACvF,sBAAsB;EACpB,SAAS,qBAAqB;EAC9B,WAAW,qBAAqB;CAClC;CACA,oBAAoB;EAClB,SAAS,mBAAmB;EAC5B,WAAW,mBAAmB;CAChC;CACA,kBAAkB;EAAE,SAAS,iBAAiB;EAAS,WAAW,iBAAiB;CAAU;CAC7F,oBAAoB;EAClB,SAAS,mBAAmB;EAC5B,WAAW,mBAAmB;CAChC;CACA,uBAAuB;EACrB,SAAS,sBAAsB;EAC/B,WAAW,sBAAsB;CACnC;CACA,iBAAiB;EAAE,SAAS,gBAAgB;EAAS,WAAW,gBAAgB;CAAU;CAC1F,iBAAiB;EAAE,SAAS,gBAAgB;EAAS,WAAW,gBAAgB;CAAU;CAC1F,gBAAgB;EAAE,SAAS,eAAe;EAAS,WAAW,eAAe;CAAU;CACvF,gBAAgB;EAAE,SAAS,eAAe;EAAS,WAAW,eAAe;CAAU;CACvF,YAAY;EAAE,SAAS,WAAW;EAAS,WAAW,WAAW;CAAU;CAC3E,kBAAkB;EAAE,SAAS,iBAAiB;EAAS,WAAW,iBAAiB;CAAU;CAC7F,cAAc;EAAE,SAAS,aAAa;EAAS,WAAW,aAAa;CAAU;CACjF,QAAQ;EAAE,SAAS,OAAO;EAAS,WAAW,OAAO;CAAU;CAC/D,oBAAoB;EAClB,SAAS,mBAAmB;EAC5B,WAAW,mBAAmB;CAChC;CACA,aAAa;EAAE,SAAS,YAAY;EAAS,WAAW,YAAY;CAAU;CAC9E,qBAAqB;EACnB,SAAS,oBAAoB;EAC7B,WAAW,oBAAoB;CACjC;CACA,mBAAmB;EACjB,SAAS,kBAAkB;EAC3B,WAAW,kBAAkB;CAC/B;CACA,aAAa;EAAE,SAAS,YAAY;EAAS,WAAW,YAAY;CAAU;CAC9E,gBAAgB;EAAE,SAAS,eAAe;EAAS,WAAW,eAAe;CAAU;CACvF,SAAS;EAAE,SAAS,QAAQ;EAAS,WAAW,QAAQ;CAAU;CAClE,gBAAgB;EAAE,SAAS,eAAe;EAAS,WAAW,eAAe;CAAU;CACvF,qBAAqB;EACnB,SAAS,oBAAoB;EAC7B,WAAW,oBAAoB;CACjC;CACA,wBAAwB;EACtB,SAAS,uBAAuB;EAChC,WAAW,uBAAuB;CACpC;CACA,wBAAwB;EACtB,SAAS,uBAAuB;EAChC,WAAW,uBAAuB;CACpC;CACA,wBAAwB;EACtB,SAAS,uBAAuB;EAChC,WAAW,uBAAuB;CACpC;CACA,wBAAwB;EACtB,SAAS,uBAAuB;EAChC,WAAW,uBAAuB;CACpC;CACA,iBAAiB;EAAE,SAAS,gBAAgB;EAAS,WAAW,gBAAgB;CAAU;CAC1F,cAAc;EAAE,SAAS,aAAa;EAAS,WAAW,aAAa;CAAU;CACjF,mBAAmB;EACjB,SAAS,kBAAkB;EAC3B,WAAW,kBAAkB;CAC/B;CACA,cAAc;EAAE,SAAS,aAAa;EAAS,WAAW,aAAa;CAAU;CACjF,eAAe;EAAE,SAAS,cAAc;EAAS,WAAW,cAAc;CAAU;CACpF,cAAc;EAAE,SAAS,aAAa;EAAS,WAAW,aAAa;CAAU;AACnF;AAEA,IAAa,6BAAb,MAAoE;CAClE,MAAM,OACJ,IACA,KACA,QACuB;EACvB,MAAM,QAAQ,SAAS;EACvB,MAAM,UAAU,oBAAC,MAAM,WAAP;GAAsB;GAAa;EAAS,CAAA;EAC5D,MAAM,CAAC,MAAM,QAAQ,MAAM,QAAQ,IAAI,CAAC,OAAO,OAAO,GAAG,OAAO,SAAS,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC;EAC9F,OAAO;GAAE,SAAS,MAAM,QAAQ,KAAK,MAAM;GAAG;GAAM;EAAK;CAC3D;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@headless-lms/adapter-email-templates",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@react-email/render": "^2.1.0",
|
|
16
16
|
"react": "19.2.4",
|
|
17
17
|
"react-dom": "19.2.4",
|
|
18
|
-
"@headless-lms/core": "0.
|
|
18
|
+
"@headless-lms/core": "0.10.0"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@react-email/ui": "6.9.0",
|