@resq-systems/email-templates 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/lib/contract.d.ts +56 -43
  2. package/lib/contract.d.ts.map +1 -1
  3. package/lib/contract.js +12 -1
  4. package/lib/contract.js.map +1 -1
  5. package/lib/emails/incident-alert.d.ts +1 -0
  6. package/lib/emails/incident-alert.d.ts.map +1 -1
  7. package/lib/emails/incident-alert.js.map +1 -1
  8. package/lib/emails/index.d.ts +1 -1
  9. package/lib/emails/mission-approval.d.ts +1 -0
  10. package/lib/emails/mission-approval.d.ts.map +1 -1
  11. package/lib/emails/mission-approval.js.map +1 -1
  12. package/lib/emails/new-device-login.d.ts +1 -0
  13. package/lib/emails/new-device-login.d.ts.map +1 -1
  14. package/lib/emails/new-device-login.js.map +1 -1
  15. package/lib/emails/notification.d.ts +1 -0
  16. package/lib/emails/notification.d.ts.map +1 -1
  17. package/lib/emails/notification.js.map +1 -1
  18. package/lib/emails/org-invitation.d.ts +1 -0
  19. package/lib/emails/org-invitation.d.ts.map +1 -1
  20. package/lib/emails/org-invitation.js.map +1 -1
  21. package/lib/emails/otp.d.ts +1 -0
  22. package/lib/emails/otp.d.ts.map +1 -1
  23. package/lib/emails/otp.js.map +1 -1
  24. package/lib/emails/password-changed.d.ts +1 -0
  25. package/lib/emails/password-changed.d.ts.map +1 -1
  26. package/lib/emails/password-changed.js.map +1 -1
  27. package/lib/emails/password-reset.d.ts +1 -0
  28. package/lib/emails/password-reset.d.ts.map +1 -1
  29. package/lib/emails/password-reset.js.map +1 -1
  30. package/lib/emails/primitives.d.ts.map +1 -1
  31. package/lib/emails/primitives.js +7 -0
  32. package/lib/emails/primitives.js.map +1 -1
  33. package/lib/emails/theme.d.ts +86 -8
  34. package/lib/emails/theme.d.ts.map +1 -1
  35. package/lib/emails/theme.js +51 -3
  36. package/lib/emails/theme.js.map +1 -1
  37. package/lib/emails/tokens.d.ts +2 -1
  38. package/lib/emails/tokens.d.ts.map +1 -1
  39. package/lib/emails/tokens.js +7 -0
  40. package/lib/emails/tokens.js.map +1 -1
  41. package/lib/emails/welcome.d.ts +1 -0
  42. package/lib/emails/welcome.d.ts.map +1 -1
  43. package/lib/emails/welcome.js.map +1 -1
  44. package/lib/index.d.ts +1 -1
  45. package/lib/mailer.d.ts +118 -11
  46. package/lib/mailer.d.ts.map +1 -1
  47. package/lib/mailer.js +48 -2
  48. package/lib/mailer.js.map +1 -1
  49. package/lib/node_modules/@react-email/tailwind/dist/index.d.ts +1 -1
  50. package/lib/node_modules/{tailwindcss → @react-email/tailwind/node_modules/tailwindcss}/dist/colors.d.ts +1 -1
  51. package/lib/node_modules/@react-email/tailwind/node_modules/tailwindcss/dist/colors.d.ts.map +1 -0
  52. package/lib/node_modules/{tailwindcss → @react-email/tailwind/node_modules/tailwindcss}/dist/lib.d.ts +1 -1
  53. package/lib/node_modules/@react-email/tailwind/node_modules/tailwindcss/dist/lib.d.ts.map +1 -0
  54. package/lib/node_modules/{tailwindcss → @react-email/tailwind/node_modules/tailwindcss}/dist/resolve-config-QUZ9b-Gn.d.ts +1 -1
  55. package/lib/node_modules/@react-email/tailwind/node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.ts.map +1 -0
  56. package/lib/node_modules/{tailwindcss → @react-email/tailwind/node_modules/tailwindcss}/dist/types-DWdTiksJ.d.ts +1 -1
  57. package/lib/node_modules/@react-email/tailwind/node_modules/tailwindcss/dist/types-DWdTiksJ.d.ts.map +1 -0
  58. package/lib/registry.d.ts.map +1 -1
  59. package/lib/registry.js +6 -0
  60. package/lib/registry.js.map +1 -1
  61. package/lib/render.d.ts +9 -2
  62. package/lib/render.d.ts.map +1 -1
  63. package/lib/render.js +16 -2
  64. package/lib/render.js.map +1 -1
  65. package/lib/schemas.d.ts +9 -0
  66. package/lib/schemas.d.ts.map +1 -1
  67. package/lib/schemas.js +16 -0
  68. package/lib/schemas.js.map +1 -1
  69. package/lib/send/index.d.ts +1 -1
  70. package/lib/send/resend-sender.d.ts +11 -0
  71. package/lib/send/resend-sender.d.ts.map +1 -1
  72. package/lib/send/resend-sender.js +17 -0
  73. package/lib/send/resend-sender.js.map +1 -1
  74. package/lib/send/send-email.d.ts +21 -0
  75. package/lib/send/send-email.d.ts.map +1 -1
  76. package/lib/send/send-email.js +26 -0
  77. package/lib/send/send-email.js.map +1 -1
  78. package/lib/send/sender.d.ts +26 -2
  79. package/lib/send/sender.d.ts.map +1 -1
  80. package/lib/suite.d.ts.map +1 -1
  81. package/lib/suite.js +7 -0
  82. package/lib/suite.js.map +1 -1
  83. package/lib/templates.d.ts +9 -0
  84. package/lib/templates.d.ts.map +1 -1
  85. package/lib/templates.js +16 -0
  86. package/lib/templates.js.map +1 -1
  87. package/package.json +6 -6
  88. package/lib/node_modules/tailwindcss/dist/colors.d.ts.map +0 -1
  89. package/lib/node_modules/tailwindcss/dist/lib.d.ts.map +0 -1
  90. package/lib/node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.ts.map +0 -1
  91. package/lib/node_modules/tailwindcss/dist/types-DWdTiksJ.d.ts.map +0 -1
package/lib/contract.d.ts CHANGED
@@ -4,56 +4,57 @@ import { resqMailer } from "./suite.js";
4
4
  //#region src/contract.d.ts
5
5
  /** Effect Schema union for every built-in ResQ Systems email `{ name, to, data }`. */
6
6
  declare const EmailPayload: import("effect/Schema").Top;
7
- /** The validated payload type for the built-in ResQ Systems templates. */
7
+ /**
8
+ * The validated payload type for the built-in ResQ Systems templates — the
9
+ * discriminated `{ name, to, data, category?, unsubscribeUrl? }` union, keyed by
10
+ * {@link EmailName}. Narrow on `name` to recover the matching `data` shape.
11
+ */
8
12
  type EmailPayload = ReturnType<typeof resqMailer.decode>;
9
- /** Every built-in template name (the union discriminant). */
13
+ /** Every built-in template name (the {@link EmailPayload} union discriminant). */
10
14
  type EmailName = EmailPayload["name"];
11
- /** The `data` shape for a given built-in template name. */
15
+ /**
16
+ * The `data` shape for a given built-in template name — the `data` field of the
17
+ * {@link EmailPayload} variant whose discriminant equals `N`.
18
+ *
19
+ * @template N - The template name selecting a single variant's `data` shape.
20
+ */
12
21
  type EmailTemplateData<N extends EmailName> = Extract<EmailPayload, {
13
22
  name: N;
14
23
  }>["data"];
15
24
  /**
16
25
  * Validate an untrusted `{ name, to, data }` payload at the system boundary.
17
- * Throws {@link EmailValidationError} on failure.
26
+ *
27
+ * @param input - Untrusted value to validate against the built-in contract.
28
+ * @returns The validated, branded {@link EmailPayload}.
29
+ * @throws {EmailValidationError} If `input` matches no built-in template variant —
30
+ * unknown `name`, malformed/header-injecting `to`, or `data` failing its schema.
18
31
  */
19
32
  declare const decodeEmailPayload: (input: unknown) => {
20
- readonly name: "incident-alert";
33
+ readonly name: "otp";
21
34
  readonly to: EmailAddress;
22
35
  readonly data: {
23
- readonly incidentId: string;
24
- readonly title: string;
25
- readonly severity: "critical" | "info" | "warning";
26
- readonly summary: string;
27
- readonly location?: string | undefined;
28
- readonly detectedAt?: string | undefined;
29
- readonly dashboardUrl: string;
36
+ readonly code: string;
37
+ readonly firstName?: string | undefined;
38
+ readonly expiresInMinutes?: number | undefined;
30
39
  };
31
40
  readonly category?: "transactional" | "marketing";
32
41
  readonly unsubscribeUrl?: string;
33
42
  } | {
34
- readonly name: "mission-approval";
43
+ readonly name: "welcome";
35
44
  readonly to: EmailAddress;
36
45
  readonly data: {
37
- readonly missionId: string;
38
- readonly title: string;
39
- readonly summary?: string | undefined;
40
- readonly requestedBy?: string | undefined;
41
- readonly severity?: "critical" | "info" | "warning" | undefined;
42
- readonly approveUrl: string;
43
- readonly expiresInMinutes?: number | undefined;
46
+ readonly firstName: string;
47
+ readonly verifyUrl?: string | undefined;
44
48
  };
45
49
  readonly category?: "transactional" | "marketing";
46
50
  readonly unsubscribeUrl?: string;
47
51
  } | {
48
- readonly name: "new-device-login";
52
+ readonly name: "password-reset";
49
53
  readonly to: EmailAddress;
50
54
  readonly data: {
51
55
  readonly firstName?: string | undefined;
52
- readonly device?: string | undefined;
53
- readonly location?: string | undefined;
54
- readonly ipAddress?: string | undefined;
55
- readonly at?: string | undefined;
56
- readonly secureAccountUrl?: string | undefined;
56
+ readonly resetUrl: string;
57
+ readonly expiresInMinutes?: number | undefined;
57
58
  };
58
59
  readonly category?: "transactional" | "marketing";
59
60
  readonly unsubscribeUrl?: string;
@@ -70,53 +71,65 @@ declare const decodeEmailPayload: (input: unknown) => {
70
71
  readonly category?: "transactional" | "marketing";
71
72
  readonly unsubscribeUrl?: string;
72
73
  } | {
73
- readonly name: "org-invitation";
74
+ readonly name: "incident-alert";
74
75
  readonly to: EmailAddress;
75
76
  readonly data: {
76
- readonly orgName: string;
77
- readonly inviterName?: string | undefined;
78
- readonly orgRole?: string | undefined;
79
- readonly acceptUrl: string;
80
- readonly expiresInDays?: number | undefined;
77
+ readonly incidentId: string;
78
+ readonly title: string;
79
+ readonly severity: "critical" | "info" | "warning";
80
+ readonly summary: string;
81
+ readonly location?: string | undefined;
82
+ readonly detectedAt?: string | undefined;
83
+ readonly dashboardUrl: string;
81
84
  };
82
85
  readonly category?: "transactional" | "marketing";
83
86
  readonly unsubscribeUrl?: string;
84
87
  } | {
85
- readonly name: "otp";
88
+ readonly name: "password-changed";
86
89
  readonly to: EmailAddress;
87
90
  readonly data: {
88
- readonly code: string;
89
91
  readonly firstName?: string | undefined;
90
- readonly expiresInMinutes?: number | undefined;
92
+ readonly changedAt?: string | undefined;
93
+ readonly secureAccountUrl?: string | undefined;
91
94
  };
92
95
  readonly category?: "transactional" | "marketing";
93
96
  readonly unsubscribeUrl?: string;
94
97
  } | {
95
- readonly name: "password-changed";
98
+ readonly name: "new-device-login";
96
99
  readonly to: EmailAddress;
97
100
  readonly data: {
98
101
  readonly firstName?: string | undefined;
99
- readonly changedAt?: string | undefined;
102
+ readonly device?: string | undefined;
103
+ readonly location?: string | undefined;
104
+ readonly ipAddress?: string | undefined;
105
+ readonly at?: string | undefined;
100
106
  readonly secureAccountUrl?: string | undefined;
101
107
  };
102
108
  readonly category?: "transactional" | "marketing";
103
109
  readonly unsubscribeUrl?: string;
104
110
  } | {
105
- readonly name: "password-reset";
111
+ readonly name: "mission-approval";
106
112
  readonly to: EmailAddress;
107
113
  readonly data: {
108
- readonly firstName?: string | undefined;
109
- readonly resetUrl: string;
114
+ readonly missionId: string;
115
+ readonly title: string;
116
+ readonly summary?: string | undefined;
117
+ readonly requestedBy?: string | undefined;
118
+ readonly severity?: "critical" | "info" | "warning" | undefined;
119
+ readonly approveUrl: string;
110
120
  readonly expiresInMinutes?: number | undefined;
111
121
  };
112
122
  readonly category?: "transactional" | "marketing";
113
123
  readonly unsubscribeUrl?: string;
114
124
  } | {
115
- readonly name: "welcome";
125
+ readonly name: "org-invitation";
116
126
  readonly to: EmailAddress;
117
127
  readonly data: {
118
- readonly firstName: string;
119
- readonly verifyUrl?: string | undefined;
128
+ readonly orgName: string;
129
+ readonly inviterName?: string | undefined;
130
+ readonly orgRole?: string | undefined;
131
+ readonly acceptUrl: string;
132
+ readonly expiresInDays?: number | undefined;
120
133
  };
121
134
  readonly category?: "transactional" | "marketing";
122
135
  readonly unsubscribeUrl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","names":[],"sources":["../src/contract.ts"],"mappings":";;;;;cAqBa,sCAAY;;KAGb,eAAe,kBAAkB,WAAW;;KAG5C,YAAY;;KAGZ,kBAAkB,UAAU,aAAa,QAAQ;EAAgB,MAAM;;;;;;cAMtE,qBAAkB;;eAAlB"}
1
+ {"version":3,"file":"contract.d.ts","names":[],"sources":["../src/contract.ts"],"mappings":";;;;;cA6Ba,sCAAY;;;;;;KAOb,eAAe,kBAAkB,WAAW;;KAG5C,YAAY;;;;;;;KAQZ,kBAAkB,UAAU,aAAa,QAAQ;EAAgB,MAAM;;;;;;;;;;cAUtE,qBAAkB;;eAAlB"}
package/lib/contract.js CHANGED
@@ -16,11 +16,22 @@ import { resqMailer } from "./suite.js";
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
+ /**
20
+ * @fileoverview Public payload contract for the built-in email templates — the
21
+ * validated `{ name, to, data }` union plus name/data type helpers and the boundary
22
+ * decoder.
23
+ *
24
+ * @module @resq-systems/email-templates/contract
25
+ */
19
26
  /** Effect Schema union for every built-in ResQ Systems email `{ name, to, data }`. */
20
27
  const EmailPayload = resqMailer.schema;
21
28
  /**
22
29
  * Validate an untrusted `{ name, to, data }` payload at the system boundary.
23
- * Throws {@link EmailValidationError} on failure.
30
+ *
31
+ * @param input - Untrusted value to validate against the built-in contract.
32
+ * @returns The validated, branded {@link EmailPayload}.
33
+ * @throws {EmailValidationError} If `input` matches no built-in template variant —
34
+ * unknown `name`, malformed/header-injecting `to`, or `data` failing its schema.
24
35
  */
25
36
  const decodeEmailPayload = resqMailer.decode;
26
37
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","names":[],"sources":["../src/contract.ts"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resqMailer } from \"./suite.js\";\n\nexport { EmailValidationError } from \"./mailer.js\";\n\n/** Effect Schema union for every built-in ResQ Systems email `{ name, to, data }`. */\nexport const EmailPayload = resqMailer.schema;\n\n/** The validated payload type for the built-in ResQ Systems templates. */\nexport type EmailPayload = ReturnType<typeof resqMailer.decode>;\n\n/** Every built-in template name (the union discriminant). */\nexport type EmailName = EmailPayload[\"name\"];\n\n/** The `data` shape for a given built-in template name. */\nexport type EmailTemplateData<N extends EmailName> = Extract<EmailPayload, { name: N }>[\"data\"];\n\n/**\n * Validate an untrusted `{ name, to, data }` payload at the system boundary.\n * Throws {@link EmailValidationError} on failure.\n */\nexport const decodeEmailPayload = resqMailer.decode;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,MAAa,eAAe,WAAW;;;;;AAevC,MAAa,qBAAqB,WAAW"}
1
+ {"version":3,"file":"contract.js","names":[],"sources":["../src/contract.ts"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Public payload contract for the built-in email templates — the\n * validated `{ name, to, data }` union plus name/data type helpers and the boundary\n * decoder.\n *\n * @module @resq-systems/email-templates/contract\n */\n\nimport { resqMailer } from \"./suite.js\";\n\nexport { EmailValidationError } from \"./mailer.js\";\n\n/** Effect Schema union for every built-in ResQ Systems email `{ name, to, data }`. */\nexport const EmailPayload = resqMailer.schema;\n\n/**\n * The validated payload type for the built-in ResQ Systems templates — the\n * discriminated `{ name, to, data, category?, unsubscribeUrl? }` union, keyed by\n * {@link EmailName}. Narrow on `name` to recover the matching `data` shape.\n */\nexport type EmailPayload = ReturnType<typeof resqMailer.decode>;\n\n/** Every built-in template name (the {@link EmailPayload} union discriminant). */\nexport type EmailName = EmailPayload[\"name\"];\n\n/**\n * The `data` shape for a given built-in template name — the `data` field of the\n * {@link EmailPayload} variant whose discriminant equals `N`.\n *\n * @template N - The template name selecting a single variant's `data` shape.\n */\nexport type EmailTemplateData<N extends EmailName> = Extract<EmailPayload, { name: N }>[\"data\"];\n\n/**\n * Validate an untrusted `{ name, to, data }` payload at the system boundary.\n *\n * @param input - Untrusted value to validate against the built-in contract.\n * @returns The validated, branded {@link EmailPayload}.\n * @throws {EmailValidationError} If `input` matches no built-in template variant —\n * unknown `name`, malformed/header-injecting `to`, or `data` failing its schema.\n */\nexport const decodeEmailPayload = resqMailer.decode;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAa,eAAe,WAAW;;;;;;;;;AA4BvC,MAAa,qBAAqB,WAAW"}
@@ -1,5 +1,6 @@
1
1
  import { IncidentAlertData } from "../schemas.js";
2
2
  //#region src/emails/incident-alert.d.ts
3
+ /** Props for {@link IncidentAlertEmail} — the incident-alert template's validated `data`. */
3
4
  type IncidentAlertEmailProps = IncidentAlertData;
4
5
  /** Incident / dispatch alert for ResQ Systems disaster-response operators. */
5
6
  declare function IncidentAlertEmail({ incidentId, title, severity, summary, location, detectedAt, dashboardUrl }: IncidentAlertEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"incident-alert.d.ts","names":[],"sources":["../../src/emails/incident-alert.tsx"],"mappings":";;KAmBY,0BAA0B;;iBAStB,qBACf,YACA,OACA,UACA,SACA,UACA,YACA,gBACE,0CAAuB,IAAA"}
1
+ {"version":3,"file":"incident-alert.d.ts","names":[],"sources":["../../src/emails/incident-alert.tsx"],"mappings":";;;KA2BY,0BAA0B;;iBAStB,qBACf,YACA,OACA,UACA,SACA,UACA,YACA,gBACE,0CAAuB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"incident-alert.js","names":[],"sources":["../../src/emails/incident-alert.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { IncidentAlertData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type IncidentAlertEmailProps = IncidentAlertData;\n\nconst severityClass: Record<\"info\" | \"warning\" | \"critical\", string> = {\n\tinfo: \"text-info\",\n\twarning: \"text-warning\",\n\tcritical: \"text-danger\",\n};\n\n/** Incident / dispatch alert for ResQ Systems disaster-response operators. */\nexport function IncidentAlertEmail({\n\tincidentId,\n\ttitle,\n\tseverity = \"warning\",\n\tsummary,\n\tlocation,\n\tdetectedAt,\n\tdashboardUrl = \"https://app.resq.software/incidents\",\n}: IncidentAlertEmailProps) {\n\tconst meta = [`Incident ${incidentId}`, location, detectedAt].filter(Boolean).join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview={`[${severity.toUpperCase()}] ${title}`}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Text\n\t\t\t\tclassName={`mb-2 font-mono text-xs font-medium uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t>\n\t\t\t\t{severity} incident\n\t\t\t</Email.Text>\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>{summary}</Email.Paragraph>\n\t\t\t<Email.Text className=\"mb-2 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t{meta}\n\t\t\t</Email.Text>\n\t\t\t<Email.CTA href={dashboardUrl}>Open incident dashboard</Email.CTA>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this alert because you are on-call for ResQ Systems disaster response.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AAqBA,MAAM,gBAAiE;CACtE,MAAM;CACN,SAAS;CACT,UAAU;AACX;;AAGA,SAAgB,mBAAmB,EAClC,YACA,OACA,WAAW,WACX,SACA,UACA,YACA,eAAe,yCACY;CAC3B,MAAM,OAAO;EAAC,YAAY;EAAc;EAAU;CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;CAExF,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,IAAI,SAAS,YAAY,EAAE,IAAI;YAArD;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,qBAAC,MAAM,MAAP;IACC,WAAW,8DAA8D,cAAc;cADxF,CAGE,UAAS,WACC;;GACZ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAkB,QAAyB,CAAA;GAC3C,oBAAC,MAAM,MAAP;IAAY,WAAU;cACpB;GACU,CAAA;GACZ,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAc;GAAkC,CAAA;GACjE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"incident-alert.js","names":[],"sources":["../../src/emails/incident-alert.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Incident / dispatch alert email component for ResQ Systems\n * disaster-response operators.\n *\n * @module @resq-systems/email-templates/emails/incident-alert\n */\n\nimport type { IncidentAlertData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link IncidentAlertEmail} — the incident-alert template's validated `data`. */\nexport type IncidentAlertEmailProps = IncidentAlertData;\n\nconst severityClass: Record<\"info\" | \"warning\" | \"critical\", string> = {\n\tinfo: \"text-info\",\n\twarning: \"text-warning\",\n\tcritical: \"text-danger\",\n};\n\n/** Incident / dispatch alert for ResQ Systems disaster-response operators. */\nexport function IncidentAlertEmail({\n\tincidentId,\n\ttitle,\n\tseverity = \"warning\",\n\tsummary,\n\tlocation,\n\tdetectedAt,\n\tdashboardUrl = \"https://app.resq.software/incidents\",\n}: IncidentAlertEmailProps) {\n\tconst meta = [`Incident ${incidentId}`, location, detectedAt].filter(Boolean).join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview={`[${severity.toUpperCase()}] ${title}`}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Text\n\t\t\t\tclassName={`mb-2 font-mono text-xs font-medium uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t>\n\t\t\t\t{severity} incident\n\t\t\t</Email.Text>\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>{summary}</Email.Paragraph>\n\t\t\t<Email.Text className=\"mb-2 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t{meta}\n\t\t\t</Email.Text>\n\t\t\t<Email.CTA href={dashboardUrl}>Open incident dashboard</Email.CTA>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this alert because you are on-call for ResQ Systems disaster response.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AA6BA,MAAM,gBAAiE;CACtE,MAAM;CACN,SAAS;CACT,UAAU;AACX;;AAGA,SAAgB,mBAAmB,EAClC,YACA,OACA,WAAW,WACX,SACA,UACA,YACA,eAAe,yCACY;CAC3B,MAAM,OAAO;EAAC,YAAY;EAAc;EAAU;CAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;CAExF,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,IAAI,SAAS,YAAY,EAAE,IAAI;EAArD,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,qBAAC,MAAM,MAAP;IACC,WAAW,8DAA8D,cAAc;IADxF,UAAA,CAGE,UAAS,WACC;;GACZ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAkB,QAAyB,CAAA;GAC3C,oBAAC,MAAM,MAAP;IAAY,WAAU;IACpB,UAAA;GACU,CAAA;GACZ,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAc,UAAA;GAAkC,CAAA;GACjE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -10,4 +10,4 @@ import { PasswordChangedEmail, PasswordChangedEmailProps } from "./password-chan
10
10
  import { NewDeviceLoginEmail, NewDeviceLoginEmailProps } from "./new-device-login.js";
11
11
  import { MissionApprovalEmail, MissionApprovalEmailProps } from "./mission-approval.js";
12
12
  import { OrgInvitationEmail, OrgInvitationEmailProps } from "./org-invitation.js";
13
- export { Email, EmailColorToken, EmailMessage, EmailMessageContext, EmailOrgIdentity, EmailTheme, EmailThemeContext, EmailThemeFonts, EmailThemeOverride, IncidentAlertEmail, IncidentAlertEmailProps, MissionApprovalEmail, MissionApprovalEmailProps, NewDeviceLoginEmail, NewDeviceLoginEmailProps, NotificationEmail, NotificationEmailProps, OrgInvitationEmail, OrgInvitationEmailProps, OtpEmail, OtpEmailProps, PasswordChangedEmail, PasswordChangedEmailProps, PasswordResetEmail, PasswordResetEmailProps, WelcomeEmail, WelcomeEmailProps, buildTailwindConfig, defaultEmailTheme, emailColors, emailFonts, emailOrg, mergeEmailTheme, resolveEmailTheme, withEmailMessage, withEmailTheme };
13
+ export { Email, type EmailColorToken, type EmailMessage, EmailMessageContext, type EmailOrgIdentity, type EmailTheme, EmailThemeContext, type EmailThemeFonts, type EmailThemeOverride, IncidentAlertEmail, type IncidentAlertEmailProps, MissionApprovalEmail, type MissionApprovalEmailProps, NewDeviceLoginEmail, type NewDeviceLoginEmailProps, NotificationEmail, type NotificationEmailProps, OrgInvitationEmail, type OrgInvitationEmailProps, OtpEmail, type OtpEmailProps, PasswordChangedEmail, type PasswordChangedEmailProps, PasswordResetEmail, type PasswordResetEmailProps, WelcomeEmail, type WelcomeEmailProps, buildTailwindConfig, defaultEmailTheme, emailColors, emailFonts, emailOrg, mergeEmailTheme, resolveEmailTheme, withEmailMessage, withEmailTheme };
@@ -1,5 +1,6 @@
1
1
  import { MissionApprovalData } from "../schemas.js";
2
2
  //#region src/emails/mission-approval.d.ts
3
+ /** Props for {@link MissionApprovalEmail} — the mission-approval template's validated `data`. */
3
4
  type MissionApprovalEmailProps = MissionApprovalData;
4
5
  /** Approver sign-off request for a ResQ Systems mission / plan execution. */
5
6
  declare function MissionApprovalEmail({ missionId, title, summary, requestedBy, severity, approveUrl, expiresInMinutes }: MissionApprovalEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"mission-approval.d.ts","names":[],"sources":["../../src/emails/mission-approval.tsx"],"mappings":";;KAmBY,4BAA4B;;iBASxB,uBACf,WACA,OACA,SACA,aACA,UACA,YACA,oBACE,4CAAyB,IAAA"}
1
+ {"version":3,"file":"mission-approval.d.ts","names":[],"sources":["../../src/emails/mission-approval.tsx"],"mappings":";;;KA0BY,4BAA4B;;iBASxB,uBACf,WACA,OACA,SACA,aACA,UACA,YACA,oBACE,4CAAyB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"mission-approval.js","names":[],"sources":["../../src/emails/mission-approval.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { MissionApprovalData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type MissionApprovalEmailProps = MissionApprovalData;\n\nconst severityClass: Record<\"info\" | \"warning\" | \"critical\", string> = {\n\tinfo: \"text-info\",\n\twarning: \"text-warning\",\n\tcritical: \"text-danger\",\n};\n\n/** Approver sign-off request for a ResQ Systems mission / plan execution. */\nexport function MissionApprovalEmail({\n\tmissionId,\n\ttitle,\n\tsummary,\n\trequestedBy,\n\tseverity,\n\tapproveUrl = \"https://app.example.com/missions/approve\",\n\texpiresInMinutes,\n}: MissionApprovalEmailProps) {\n\tconst meta = [`Mission ${missionId}`, requestedBy ? `Requested by ${requestedBy}` : null]\n\t\t.filter(Boolean)\n\t\t.join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview={`Mission approval needed: ${title}`}>\n\t\t\t<Email.Header />\n\t\t\t{severity ? (\n\t\t\t\t<Email.Text\n\t\t\t\t\tclassName={`mb-2 font-mono text-xs font-medium uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t\t>\n\t\t\t\t\t{severity} priority\n\t\t\t\t</Email.Text>\n\t\t\t) : null}\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>A mission needs your sign-off before it can execute.</Email.Paragraph>\n\t\t\t{summary ? <Email.Paragraph>{summary}</Email.Paragraph> : null}\n\t\t\t<Email.Text className=\"mb-2 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t{meta}\n\t\t\t</Email.Text>\n\t\t\t<Email.CTA href={approveUrl}>Review &amp; approve</Email.CTA>\n\t\t\t{expiresInMinutes ? (\n\t\t\t\t<Email.Paragraph>\n\t\t\t\t\tThis approval request expires in {expiresInMinutes} minutes.\n\t\t\t\t</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because you are an approver for ResQ Systems mission operations.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AAqBA,MAAM,gBAAiE;CACtE,MAAM;CACN,SAAS;CACT,UAAU;AACX;;AAGA,SAAgB,qBAAqB,EACpC,WACA,OACA,SACA,aACA,UACA,aAAa,4CACb,oBAC6B;CAC7B,MAAM,OAAO,CAAC,WAAW,aAAa,cAAc,gBAAgB,gBAAgB,IAAI,CAAC,CACvF,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;CAEZ,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,4BAA4B;YAAlD;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACd,WACA,qBAAC,MAAM,MAAP;IACC,WAAW,8DAA8D,cAAc;cADxF,CAGE,UAAS,WACC;QACT;GACJ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAiB,uDAAqE,CAAA;GACrF,UAAU,oBAAC,MAAM,WAAP,EAAA,UAAkB,QAAyB,CAAA,IAAI;GAC1D,oBAAC,MAAM,MAAP;IAAY,WAAU;cACpB;GACU,CAAA;GACZ,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAY;GAA+B,CAAA;GAC3D,mBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACkB;IAAiB;GACnC,EAAA,CAAA,IACd;GACJ,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"mission-approval.js","names":[],"sources":["../../src/emails/mission-approval.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Approver sign-off request email component for a ResQ Systems mission.\n *\n * @module @resq-systems/email-templates/emails/mission-approval\n */\n\nimport type { MissionApprovalData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link MissionApprovalEmail} — the mission-approval template's validated `data`. */\nexport type MissionApprovalEmailProps = MissionApprovalData;\n\nconst severityClass: Record<\"info\" | \"warning\" | \"critical\", string> = {\n\tinfo: \"text-info\",\n\twarning: \"text-warning\",\n\tcritical: \"text-danger\",\n};\n\n/** Approver sign-off request for a ResQ Systems mission / plan execution. */\nexport function MissionApprovalEmail({\n\tmissionId,\n\ttitle,\n\tsummary,\n\trequestedBy,\n\tseverity,\n\tapproveUrl = \"https://app.example.com/missions/approve\",\n\texpiresInMinutes,\n}: MissionApprovalEmailProps) {\n\tconst meta = [`Mission ${missionId}`, requestedBy ? `Requested by ${requestedBy}` : null]\n\t\t.filter(Boolean)\n\t\t.join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview={`Mission approval needed: ${title}`}>\n\t\t\t<Email.Header />\n\t\t\t{severity ? (\n\t\t\t\t<Email.Text\n\t\t\t\t\tclassName={`mb-2 font-mono text-xs font-medium uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t\t>\n\t\t\t\t\t{severity} priority\n\t\t\t\t</Email.Text>\n\t\t\t) : null}\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>A mission needs your sign-off before it can execute.</Email.Paragraph>\n\t\t\t{summary ? <Email.Paragraph>{summary}</Email.Paragraph> : null}\n\t\t\t<Email.Text className=\"mb-2 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t{meta}\n\t\t\t</Email.Text>\n\t\t\t<Email.CTA href={approveUrl}>Review &amp; approve</Email.CTA>\n\t\t\t{expiresInMinutes ? (\n\t\t\t\t<Email.Paragraph>\n\t\t\t\t\tThis approval request expires in {expiresInMinutes} minutes.\n\t\t\t\t</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because you are an approver for ResQ Systems mission operations.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AA4BA,MAAM,gBAAiE;CACtE,MAAM;CACN,SAAS;CACT,UAAU;AACX;;AAGA,SAAgB,qBAAqB,EACpC,WACA,OACA,SACA,aACA,UACA,aAAa,4CACb,oBAC6B;CAC7B,MAAM,OAAO,CAAC,WAAW,aAAa,cAAc,gBAAgB,gBAAgB,IAAI,CAAC,CACvF,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;CAEZ,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,4BAA4B;EAAlD,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACd,WACA,qBAAC,MAAM,MAAP;IACC,WAAW,8DAA8D,cAAc;IADxF,UAAA,CAGE,UAAS,WACC;GACT,CAAA,IAAA;GACJ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAiB,uDAAqE,CAAA;GACrF,UAAU,oBAAC,MAAM,WAAP,EAAA,UAAkB,QAAyB,CAAA,IAAI;GAC1D,oBAAC,MAAM,MAAP;IAAY,WAAU;IACpB,UAAA;GACU,CAAA;GACZ,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAY,UAAA;GAA+B,CAAA;GAC3D,mBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACkB;IAAiB;GACnC,EAAA,CAAA,IACd;GACJ,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { NewDeviceLoginData } from "../schemas.js";
2
2
  //#region src/emails/new-device-login.d.ts
3
+ /** Props for {@link NewDeviceLoginEmail} — the new-device-login template's validated `data`. */
3
4
  type NewDeviceLoginEmailProps = NewDeviceLoginData;
4
5
  /** Security alert: a new device or location signed in to the account. */
5
6
  declare function NewDeviceLoginEmail({ firstName, device, location, ipAddress, at, secureAccountUrl }: NewDeviceLoginEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"new-device-login.d.ts","names":[],"sources":["../../src/emails/new-device-login.tsx"],"mappings":";;KAmBY,2BAA2B;;iBAGvB,sBACf,WACA,QACA,UACA,WACA,IACA,oBACE,2CAAwB,IAAA"}
1
+ {"version":3,"file":"new-device-login.d.ts","names":[],"sources":["../../src/emails/new-device-login.tsx"],"mappings":";;;KA0BY,2BAA2B;;iBAGvB,sBACf,WACA,QACA,UACA,WACA,IACA,oBACE,2CAAwB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"new-device-login.js","names":[],"sources":["../../src/emails/new-device-login.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { NewDeviceLoginData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type NewDeviceLoginEmailProps = NewDeviceLoginData;\n\n/** Security alert: a new device or location signed in to the account. */\nexport function NewDeviceLoginEmail({\n\tfirstName,\n\tdevice,\n\tlocation,\n\tipAddress,\n\tat,\n\tsecureAccountUrl,\n}: NewDeviceLoginEmailProps) {\n\tconst meta = [device, location, ipAddress, at].filter(Boolean).join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview=\"New sign-in to your ResQ Systems account\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>New sign-in to your account</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>We noticed a new sign-in to your ResQ Systems account.</Email.Paragraph>\n\t\t\t{meta ? (\n\t\t\t\t<Email.Text className=\"mb-4 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t\t{meta}\n\t\t\t\t</Email.Text>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tIf this was you, no action is needed.{\" \"}\n\t\t\t\t{secureAccountUrl\n\t\t\t\t\t? \"If you don't recognize this sign-in, secure your account now.\"\n\t\t\t\t\t: \"If you don't recognize this sign-in, please contact support immediately.\"}\n\t\t\t</Email.Paragraph>\n\t\t\t{secureAccountUrl ? <Email.CTA href={secureAccountUrl}>Secure your account</Email.CTA> : null}\n\t\t\t<Email.SupportLine>Don't recognize this sign-in?</Email.SupportLine>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because a new sign-in to your ResQ Systems account was detected.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AAsBA,SAAgB,oBAAoB,EACnC,WACA,QACA,UACA,WACA,IACA,oBAC4B;CAC5B,MAAM,OAAO;EAAC;EAAQ;EAAU;EAAW;CAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;CAEzE,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;YAArB;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,8BAAwC,CAAA;GACpD,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,yDAAuE,CAAA;GACvF,OACA,oBAAC,MAAM,MAAP;IAAY,WAAU;cACpB;GACU,CAAA,IACT;GACJ,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACsB;IACrC,mBACE,kEACA;GACa,EAAA,CAAA;GAChB,mBAAmB,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAkB;GAA8B,CAAA,IAAI;GACzF,oBAAC,MAAM,aAAP,EAAA,UAAmB,gCAAgD,CAAA;GACnE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"new-device-login.js","names":[],"sources":["../../src/emails/new-device-login.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Security-alert email component for a new device or location signing in.\n *\n * @module @resq-systems/email-templates/emails/new-device-login\n */\n\nimport type { NewDeviceLoginData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link NewDeviceLoginEmail} — the new-device-login template's validated `data`. */\nexport type NewDeviceLoginEmailProps = NewDeviceLoginData;\n\n/** Security alert: a new device or location signed in to the account. */\nexport function NewDeviceLoginEmail({\n\tfirstName,\n\tdevice,\n\tlocation,\n\tipAddress,\n\tat,\n\tsecureAccountUrl,\n}: NewDeviceLoginEmailProps) {\n\tconst meta = [device, location, ipAddress, at].filter(Boolean).join(\" · \");\n\n\treturn (\n\t\t<Email.Shell preview=\"New sign-in to your ResQ Systems account\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>New sign-in to your account</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>We noticed a new sign-in to your ResQ Systems account.</Email.Paragraph>\n\t\t\t{meta ? (\n\t\t\t\t<Email.Text className=\"mb-4 font-mono text-xs uppercase tracking-wide text-muted\">\n\t\t\t\t\t{meta}\n\t\t\t\t</Email.Text>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tIf this was you, no action is needed.{\" \"}\n\t\t\t\t{secureAccountUrl\n\t\t\t\t\t? \"If you don't recognize this sign-in, secure your account now.\"\n\t\t\t\t\t: \"If you don't recognize this sign-in, please contact support immediately.\"}\n\t\t\t</Email.Paragraph>\n\t\t\t{secureAccountUrl ? <Email.CTA href={secureAccountUrl}>Secure your account</Email.CTA> : null}\n\t\t\t<Email.SupportLine>Don't recognize this sign-in?</Email.SupportLine>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because a new sign-in to your ResQ Systems account was detected.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AA6BA,SAAgB,oBAAoB,EACnC,WACA,QACA,UACA,WACA,IACA,oBAC4B;CAC5B,MAAM,OAAO;EAAC;EAAQ;EAAU;EAAW;CAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;CAEzE,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;EAArB,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,8BAAwC,CAAA;GACpD,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,yDAAuE,CAAA;GACvF,OACA,oBAAC,MAAM,MAAP;IAAY,WAAU;IACpB,UAAA;GACU,CAAA,IACT;GACJ,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACsB;IACrC,mBACE,kEACA;GACa,EAAA,CAAA;GAChB,mBAAmB,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAkB,UAAA;GAA8B,CAAA,IAAI;GACzF,oBAAC,MAAM,aAAP,EAAA,UAAmB,gCAAgD,CAAA;GACnE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { NotificationData } from "../schemas.js";
2
2
  //#region src/emails/notification.d.ts
3
+ /** Props for {@link NotificationEmail} — the notification template's validated `data`. */
3
4
  type NotificationEmailProps = NotificationData;
4
5
  /** Generic notification / alert email with an optional call-to-action. */
5
6
  declare function NotificationEmail({ title, body, severity, actionUrl, actionLabel }: NotificationEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"notification.d.ts","names":[],"sources":["../../src/emails/notification.tsx"],"mappings":";;KAmBY,yBAAyB;;iBAUrB,oBACf,OACA,MACA,UACA,WACA,eACE,yCAAsB,IAAA"}
1
+ {"version":3,"file":"notification.d.ts","names":[],"sources":["../../src/emails/notification.tsx"],"mappings":";;;KA2BY,yBAAyB;;iBAUrB,oBACf,OACA,MACA,UACA,WACA,eACE,yCAAsB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"notification.js","names":[],"sources":["../../src/emails/notification.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { NotificationData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type NotificationEmailProps = NotificationData;\n\nconst severityClass: Record<\"info\" | \"success\" | \"warning\" | \"error\", string> = {\n\tinfo: \"text-info\",\n\tsuccess: \"text-success\",\n\twarning: \"text-warning\",\n\terror: \"text-danger\",\n};\n\n/** Generic notification / alert email with an optional call-to-action. */\nexport function NotificationEmail({\n\ttitle,\n\tbody,\n\tseverity = \"info\",\n\tactionUrl,\n\tactionLabel,\n}: NotificationEmailProps) {\n\treturn (\n\t\t<Email.Shell preview={title}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Text\n\t\t\t\tclassName={`mb-2 text-xs font-bold uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t>\n\t\t\t\t{severity}\n\t\t\t</Email.Text>\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>{body}</Email.Paragraph>\n\t\t\t{actionUrl ? <Email.CTA href={actionUrl}>{actionLabel ?? \"View details\"}</Email.CTA> : null}\n\t\t\t<Email.LegalFooter reason=\"You are receiving this notification because of recent activity on your ResQ Systems account.\" />\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AAqBA,MAAM,gBAA0E;CAC/E,MAAM;CACN,SAAS;CACT,SAAS;CACT,OAAO;AACR;;AAGA,SAAgB,kBAAkB,EACjC,OACA,MACA,WAAW,QACX,WACA,eAC0B;CAC1B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS;YAAtB;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,MAAP;IACC,WAAW,kDAAkD,cAAc;cAE1E;GACU,CAAA;GACZ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAkB,KAAsB,CAAA;GACvC,YAAY,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAY,eAAe;GAA0B,CAAA,IAAI;GACvF,oBAAC,MAAM,aAAP,EAAmB,QAAO,+FAAgG,CAAA;EAC9G;;AAEf"}
1
+ {"version":3,"file":"notification.js","names":[],"sources":["../../src/emails/notification.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Generic notification / alert email component with an optional\n * call-to-action and severity-colored eyebrow.\n *\n * @module @resq-systems/email-templates/emails/notification\n */\n\nimport type { NotificationData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link NotificationEmail} — the notification template's validated `data`. */\nexport type NotificationEmailProps = NotificationData;\n\nconst severityClass: Record<\"info\" | \"success\" | \"warning\" | \"error\", string> = {\n\tinfo: \"text-info\",\n\tsuccess: \"text-success\",\n\twarning: \"text-warning\",\n\terror: \"text-danger\",\n};\n\n/** Generic notification / alert email with an optional call-to-action. */\nexport function NotificationEmail({\n\ttitle,\n\tbody,\n\tseverity = \"info\",\n\tactionUrl,\n\tactionLabel,\n}: NotificationEmailProps) {\n\treturn (\n\t\t<Email.Shell preview={title}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Text\n\t\t\t\tclassName={`mb-2 text-xs font-bold uppercase tracking-wide ${severityClass[severity]}`}\n\t\t\t>\n\t\t\t\t{severity}\n\t\t\t</Email.Text>\n\t\t\t<Email.Title>{title}</Email.Title>\n\t\t\t<Email.Paragraph>{body}</Email.Paragraph>\n\t\t\t{actionUrl ? <Email.CTA href={actionUrl}>{actionLabel ?? \"View details\"}</Email.CTA> : null}\n\t\t\t<Email.LegalFooter reason=\"You are receiving this notification because of recent activity on your ResQ Systems account.\" />\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;AA6BA,MAAM,gBAA0E;CAC/E,MAAM;CACN,SAAS;CACT,SAAS;CACT,OAAO;AACR;;AAGA,SAAgB,kBAAkB,EACjC,OACA,MACA,WAAW,QACX,WACA,eAC0B;CAC1B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS;EAAtB,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,MAAP;IACC,WAAW,kDAAkD,cAAc;IAE1E,UAAA;GACU,CAAA;GACZ,oBAAC,MAAM,OAAP,EAAA,UAAc,MAAmB,CAAA;GACjC,oBAAC,MAAM,WAAP,EAAA,UAAkB,KAAsB,CAAA;GACvC,YAAY,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAY,UAAA,eAAe;GAA0B,CAAA,IAAI;GACvF,oBAAC,MAAM,aAAP,EAAmB,QAAO,+FAAgG,CAAA;EAC9G;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { OrgInvitationData } from "../schemas.js";
2
2
  //#region src/emails/org-invitation.d.ts
3
+ /** Props for {@link OrgInvitationEmail} — the org-invitation template's validated `data`. */
3
4
  type OrgInvitationEmailProps = OrgInvitationData;
4
5
  /** Invitation to join a ResQ Systems organization / team. */
5
6
  declare function OrgInvitationEmail({ orgName, inviterName, orgRole, acceptUrl, expiresInDays }: OrgInvitationEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"org-invitation.d.ts","names":[],"sources":["../../src/emails/org-invitation.tsx"],"mappings":";;KAmBY,0BAA0B;;iBAGtB,qBACf,SACA,aACA,SACA,WACA,iBACE,0CAAuB,IAAA"}
1
+ {"version":3,"file":"org-invitation.d.ts","names":[],"sources":["../../src/emails/org-invitation.tsx"],"mappings":";;;KA0BY,0BAA0B;;iBAGtB,qBACf,SACA,aACA,SACA,WACA,iBACE,0CAAuB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"org-invitation.js","names":[],"sources":["../../src/emails/org-invitation.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { OrgInvitationData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type OrgInvitationEmailProps = OrgInvitationData;\n\n/** Invitation to join a ResQ Systems organization / team. */\nexport function OrgInvitationEmail({\n\torgName,\n\tinviterName,\n\torgRole,\n\tacceptUrl = \"https://app.resq.software/invitations/accept\",\n\texpiresInDays,\n}: OrgInvitationEmailProps) {\n\tconst inviterPhrase = inviterName ? `${inviterName} invited you` : \"You have been invited\";\n\tconst reason = inviterName\n\t\t? `You are receiving this email because ${inviterName} invited you to join ${orgName} on ResQ Systems.`\n\t\t: `You are receiving this email because you were invited to join ${orgName} on ResQ Systems.`;\n\n\treturn (\n\t\t<Email.Shell preview={`You're invited to join ${orgName} on ResQ Systems`}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>You're invited to join {orgName}</Email.Title>\n\t\t\t<Email.Paragraph>\n\t\t\t\t{inviterPhrase} to join {orgName} on ResQ Systems{orgRole ? ` as ${orgRole}` : \"\"}.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.CTA href={acceptUrl}>Accept invitation</Email.CTA>\n\t\t\t{expiresInDays ? (\n\t\t\t\t<Email.Paragraph>This invitation expires in {expiresInDays} days.</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>Weren't expecting this? You can safely ignore this email.</Email.Paragraph>\n\t\t\t<Email.LegalFooter category=\"transactional\" reason={reason} />\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AAsBA,SAAgB,mBAAmB,EAClC,SACA,aACA,SACA,YAAY,gDACZ,iBAC2B;CAC3B,MAAM,gBAAgB,cAAc,GAAG,YAAY,gBAAgB;CACnE,MAAM,SAAS,cACZ,wCAAwC,YAAY,uBAAuB,QAAQ,qBACnF,iEAAiE,QAAQ;CAE5E,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,0BAA0B,QAAQ;YAAxD;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,qBAAC,MAAM,OAAP,EAAA,UAAA,CAAa,2BAAwB,OAAqB,EAAA,CAAA;GAC1D,qBAAC,MAAM,WAAP,EAAA,UAAA;IACE;IAAc;IAAU;IAAQ;IAAiB,UAAU,OAAO,YAAY;IAAG;GAClE,EAAA,CAAA;GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAW;GAA4B,CAAA;GACvD,gBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAA4B;IAAc;GAAuB,EAAA,CAAA,IAC/E;GACJ,oBAAC,MAAM,WAAP,EAAA,UAAiB,4DAA0E,CAAA;GAC3F,oBAAC,MAAM,aAAP;IAAmB,UAAS;IAAwB;GAAS,CAAA;EACjD;;AAEf"}
1
+ {"version":3,"file":"org-invitation.js","names":[],"sources":["../../src/emails/org-invitation.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Organization / team invitation email component.\n *\n * @module @resq-systems/email-templates/emails/org-invitation\n */\n\nimport type { OrgInvitationData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link OrgInvitationEmail} — the org-invitation template's validated `data`. */\nexport type OrgInvitationEmailProps = OrgInvitationData;\n\n/** Invitation to join a ResQ Systems organization / team. */\nexport function OrgInvitationEmail({\n\torgName,\n\tinviterName,\n\torgRole,\n\tacceptUrl = \"https://app.resq.software/invitations/accept\",\n\texpiresInDays,\n}: OrgInvitationEmailProps) {\n\tconst inviterPhrase = inviterName ? `${inviterName} invited you` : \"You have been invited\";\n\tconst reason = inviterName\n\t\t? `You are receiving this email because ${inviterName} invited you to join ${orgName} on ResQ Systems.`\n\t\t: `You are receiving this email because you were invited to join ${orgName} on ResQ Systems.`;\n\n\treturn (\n\t\t<Email.Shell preview={`You're invited to join ${orgName} on ResQ Systems`}>\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>You're invited to join {orgName}</Email.Title>\n\t\t\t<Email.Paragraph>\n\t\t\t\t{inviterPhrase} to join {orgName} on ResQ Systems{orgRole ? ` as ${orgRole}` : \"\"}.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.CTA href={acceptUrl}>Accept invitation</Email.CTA>\n\t\t\t{expiresInDays ? (\n\t\t\t\t<Email.Paragraph>This invitation expires in {expiresInDays} days.</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>Weren't expecting this? You can safely ignore this email.</Email.Paragraph>\n\t\t\t<Email.LegalFooter category=\"transactional\" reason={reason} />\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AA6BA,SAAgB,mBAAmB,EAClC,SACA,aACA,SACA,YAAY,gDACZ,iBAC2B;CAC3B,MAAM,gBAAgB,cAAc,GAAG,YAAY,gBAAgB;CACnE,MAAM,SAAS,cACZ,wCAAwC,YAAY,uBAAuB,QAAQ,qBACnF,iEAAiE,QAAQ;CAE5E,OACC,qBAAC,MAAM,OAAP;EAAa,SAAS,0BAA0B,QAAQ;EAAxD,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,qBAAC,MAAM,OAAP,EAAA,UAAA,CAAa,2BAAwB,OAAqB,EAAA,CAAA;GAC1D,qBAAC,MAAM,WAAP,EAAA,UAAA;IACE;IAAc;IAAU;IAAQ;IAAiB,UAAU,OAAO,YAAY;IAAG;GAClE,EAAA,CAAA;GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAW,UAAA;GAA4B,CAAA;GACvD,gBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAA4B;IAAc;GAAuB,EAAA,CAAA,IAC/E;GACJ,oBAAC,MAAM,WAAP,EAAA,UAAiB,4DAA0E,CAAA;GAC3F,oBAAC,MAAM,aAAP;IAAmB,UAAS;IAAwB;GAAS,CAAA;EACjD;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { OtpData } from "../schemas.js";
2
2
  //#region src/emails/otp.d.ts
3
+ /** Props for {@link OtpEmail} — the OTP template's validated `data`. */
3
4
  type OtpEmailProps = OtpData;
4
5
  /**
5
6
  * One-time verification code email. Default prop values make it previewable via
@@ -1 +1 @@
1
- {"version":3,"file":"otp.d.ts","names":[],"sources":["../../src/emails/otp.tsx"],"mappings":";;KAmBY,gBAAgB;;;;;iBAMZ,WAAW,MAAiB,WAAW,oBAAyB,gCAAa,IAAA"}
1
+ {"version":3,"file":"otp.d.ts","names":[],"sources":["../../src/emails/otp.tsx"],"mappings":";;;KA0BY,gBAAgB;;;;;iBAMZ,WAAW,MAAiB,WAAW,oBAAyB,gCAAa,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"otp.js","names":[],"sources":["../../src/emails/otp.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { OtpData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type OtpEmailProps = OtpData;\n\n/**\n * One-time verification code email. Default prop values make it previewable via\n * `email dev`.\n */\nexport function OtpEmail({ code = \"123456\", firstName, expiresInMinutes = 10 }: OtpEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Your ResQ Systems verification code\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Verification code</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>Use this one-time code to continue.</Email.Paragraph>\n\t\t\t<Email.Code>{code}</Email.Code>\n\t\t\t{expiresInMinutes ? (\n\t\t\t\t<Email.Paragraph>This code expires in {expiresInMinutes} minutes.</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>If you didn't request this code, ignore this email.</Email.Paragraph>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You received this email because a verification code was requested for your account.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;;;;AAyBA,SAAgB,SAAS,EAAE,OAAO,UAAU,WAAW,mBAAmB,MAAqB;CAC9F,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;YAArB;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,oBAA8B,CAAA;GAC1C,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,sCAAoD,CAAA;GACrE,oBAAC,MAAM,MAAP,EAAA,UAAa,KAAiB,CAAA;GAC7B,mBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAsB;IAAiB;GAA0B,EAAA,CAAA,IAC/E;GACJ,oBAAC,MAAM,WAAP,EAAA,UAAiB,sDAAoE,CAAA;GACrF,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"otp.js","names":[],"sources":["../../src/emails/otp.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview One-time verification code (OTP) email component.\n *\n * @module @resq-systems/email-templates/emails/otp\n */\n\nimport type { OtpData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link OtpEmail} — the OTP template's validated `data`. */\nexport type OtpEmailProps = OtpData;\n\n/**\n * One-time verification code email. Default prop values make it previewable via\n * `email dev`.\n */\nexport function OtpEmail({ code = \"123456\", firstName, expiresInMinutes = 10 }: OtpEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Your ResQ Systems verification code\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Verification code</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>Use this one-time code to continue.</Email.Paragraph>\n\t\t\t<Email.Code>{code}</Email.Code>\n\t\t\t{expiresInMinutes ? (\n\t\t\t\t<Email.Paragraph>This code expires in {expiresInMinutes} minutes.</Email.Paragraph>\n\t\t\t) : null}\n\t\t\t<Email.Paragraph>If you didn't request this code, ignore this email.</Email.Paragraph>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You received this email because a verification code was requested for your account.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;;;;AAgCA,SAAgB,SAAS,EAAE,OAAO,UAAU,WAAW,mBAAmB,MAAqB;CAC9F,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;EAArB,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,oBAA8B,CAAA;GAC1C,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,sCAAoD,CAAA;GACrE,oBAAC,MAAM,MAAP,EAAA,UAAa,KAAiB,CAAA;GAC7B,mBACA,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAsB;IAAiB;GAA0B,EAAA,CAAA,IAC/E;GACJ,oBAAC,MAAM,WAAP,EAAA,UAAiB,sDAAoE,CAAA;GACrF,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { PasswordChangedData } from "../schemas.js";
2
2
  //#region src/emails/password-changed.d.ts
3
+ /** Props for {@link PasswordChangedEmail} — the password-changed template's validated `data`. */
3
4
  type PasswordChangedEmailProps = PasswordChangedData;
4
5
  /** Security notice confirming the account password was changed. */
5
6
  declare function PasswordChangedEmail({ firstName, changedAt, secureAccountUrl }: PasswordChangedEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"password-changed.d.ts","names":[],"sources":["../../src/emails/password-changed.tsx"],"mappings":";;KAmBY,4BAA4B;;iBAGxB,uBACf,WACA,WACA,oBACE,4CAAyB,IAAA"}
1
+ {"version":3,"file":"password-changed.d.ts","names":[],"sources":["../../src/emails/password-changed.tsx"],"mappings":";;;KA0BY,4BAA4B;;iBAGxB,uBACf,WACA,WACA,oBACE,4CAAyB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"password-changed.js","names":[],"sources":["../../src/emails/password-changed.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PasswordChangedData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type PasswordChangedEmailProps = PasswordChangedData;\n\n/** Security notice confirming the account password was changed. */\nexport function PasswordChangedEmail({\n\tfirstName,\n\tchangedAt,\n\tsecureAccountUrl,\n}: PasswordChangedEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Your ResQ Systems password was changed\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Your password was changed</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tThe password on your ResQ Systems account was changed{changedAt ? ` on ${changedAt}` : \"\"}.\n\t\t\t\tIf you made this change, no further action is needed.\n\t\t\t</Email.Paragraph>\n\t\t\t{secureAccountUrl ? (\n\t\t\t\t<>\n\t\t\t\t\t<Email.Paragraph>\n\t\t\t\t\t\tIf you didn't change your password, your account may be at risk — secure it now.\n\t\t\t\t\t</Email.Paragraph>\n\t\t\t\t\t<Email.CTA href={secureAccountUrl}>Secure your account</Email.CTA>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<Email.Paragraph>\n\t\t\t\t\tIf you didn't change your password, your account may be at risk. Please contact support\n\t\t\t\t\timmediately.\n\t\t\t\t</Email.Paragraph>\n\t\t\t)}\n\t\t\t<Email.SupportLine>Didn't change your password?</Email.SupportLine>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because the password on your ResQ Systems account was changed.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AAsBA,SAAgB,qBAAqB,EACpC,WACA,WACA,oBAC6B;CAC7B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;YAArB;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,4BAAsC,CAAA;GAClD,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACsC,YAAY,OAAO,cAAc;IAAG;GAE1E,EAAA,CAAA;GAChB,mBACA,qBAAA,UAAA,EAAA,UAAA,CACC,oBAAC,MAAM,WAAP,EAAA,UAAiB,mFAEA,CAAA,GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAkB;GAA8B,CAAA,CAChE,EAAA,CAAA,IAEF,oBAAC,MAAM,WAAP,EAAA,UAAiB,uGAGA,CAAA;GAElB,oBAAC,MAAM,aAAP,EAAA,UAAmB,+BAA+C,CAAA;GAClE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"password-changed.js","names":[],"sources":["../../src/emails/password-changed.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Security-notice email component confirming an account password change.\n *\n * @module @resq-systems/email-templates/emails/password-changed\n */\n\nimport type { PasswordChangedData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link PasswordChangedEmail} — the password-changed template's validated `data`. */\nexport type PasswordChangedEmailProps = PasswordChangedData;\n\n/** Security notice confirming the account password was changed. */\nexport function PasswordChangedEmail({\n\tfirstName,\n\tchangedAt,\n\tsecureAccountUrl,\n}: PasswordChangedEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Your ResQ Systems password was changed\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Your password was changed</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tThe password on your ResQ Systems account was changed{changedAt ? ` on ${changedAt}` : \"\"}.\n\t\t\t\tIf you made this change, no further action is needed.\n\t\t\t</Email.Paragraph>\n\t\t\t{secureAccountUrl ? (\n\t\t\t\t<>\n\t\t\t\t\t<Email.Paragraph>\n\t\t\t\t\t\tIf you didn't change your password, your account may be at risk — secure it now.\n\t\t\t\t\t</Email.Paragraph>\n\t\t\t\t\t<Email.CTA href={secureAccountUrl}>Secure your account</Email.CTA>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<Email.Paragraph>\n\t\t\t\t\tIf you didn't change your password, your account may be at risk. Please contact support\n\t\t\t\t\timmediately.\n\t\t\t\t</Email.Paragraph>\n\t\t\t)}\n\t\t\t<Email.SupportLine>Didn't change your password?</Email.SupportLine>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You are receiving this email because the password on your ResQ Systems account was changed.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AA6BA,SAAgB,qBAAqB,EACpC,WACA,WACA,oBAC6B;CAC7B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;EAArB,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,4BAAsC,CAAA;GAClD,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IACsC,YAAY,OAAO,cAAc;IAAG;GAE1E,EAAA,CAAA;GAChB,mBACA,qBAAA,UAAA,EAAA,UAAA,CACC,oBAAC,MAAM,WAAP,EAAA,UAAiB,mFAEA,CAAA,GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAkB,UAAA;GAA8B,CAAA,CAChE,EAAA,CAAA,IAEF,oBAAC,MAAM,WAAP,EAAA,UAAiB,uGAGA,CAAA;GAElB,oBAAC,MAAM,aAAP,EAAA,UAAmB,+BAA+C,CAAA;GAClE,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -1,5 +1,6 @@
1
1
  import { PasswordResetData } from "../schemas.js";
2
2
  //#region src/emails/password-reset.d.ts
3
+ /** Props for {@link PasswordResetEmail} — the password-reset template's validated `data`. */
3
4
  type PasswordResetEmailProps = PasswordResetData;
4
5
  /** Password reset email with a single call-to-action link. */
5
6
  declare function PasswordResetEmail({ firstName, resetUrl, expiresInMinutes }: PasswordResetEmailProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset.d.ts","names":[],"sources":["../../src/emails/password-reset.tsx"],"mappings":";;KAmBY,0BAA0B;;iBAGtB,qBACf,WACA,UACA,oBACE,0CAAuB,IAAA"}
1
+ {"version":3,"file":"password-reset.d.ts","names":[],"sources":["../../src/emails/password-reset.tsx"],"mappings":";;;KA0BY,0BAA0B;;iBAGtB,qBACf,WACA,UACA,oBACE,0CAAuB,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset.js","names":[],"sources":["../../src/emails/password-reset.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { PasswordResetData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\nexport type PasswordResetEmailProps = PasswordResetData;\n\n/** Password reset email with a single call-to-action link. */\nexport function PasswordResetEmail({\n\tfirstName,\n\tresetUrl = \"https://app.resq.example/reset\",\n\texpiresInMinutes = 30,\n}: PasswordResetEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Reset your password\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Reset your password</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tSomeone requested a password reset for your account. Use the button below to choose a new\n\t\t\t\tpassword.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.CTA href={resetUrl}>Reset password</Email.CTA>\n\t\t\t<Email.Paragraph>This link expires in {expiresInMinutes} minutes.</Email.Paragraph>\n\t\t\t<Email.Paragraph>\n\t\t\t\tIf you didn't request this, your password is unchanged and you can ignore this email. If\n\t\t\t\tyou're concerned about unauthorized access, reset your password to secure your account.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You're receiving this email because a password reset was requested for your account.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AAsBA,SAAgB,mBAAmB,EAClC,WACA,WAAW,kCACX,mBAAmB,MACQ;CAC3B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;YAArB;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,sBAAgC,CAAA;GAC5C,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,sGAGA,CAAA;GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;cAAU;GAAyB,CAAA;GACpD,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAsB;IAAiB;GAA0B,EAAA,CAAA;GAClF,oBAAC,MAAM,WAAP,EAAA,UAAiB,mLAGA,CAAA;GACjB,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
1
+ {"version":3,"file":"password-reset.js","names":[],"sources":["../../src/emails/password-reset.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Password-reset email component with a single call-to-action link.\n *\n * @module @resq-systems/email-templates/emails/password-reset\n */\n\nimport type { PasswordResetData } from \"../schemas.js\";\nimport { Email } from \"./primitives.js\";\n\n/** Props for {@link PasswordResetEmail} — the password-reset template's validated `data`. */\nexport type PasswordResetEmailProps = PasswordResetData;\n\n/** Password reset email with a single call-to-action link. */\nexport function PasswordResetEmail({\n\tfirstName,\n\tresetUrl = \"https://app.resq.example/reset\",\n\texpiresInMinutes = 30,\n}: PasswordResetEmailProps) {\n\treturn (\n\t\t<Email.Shell preview=\"Reset your password\">\n\t\t\t<Email.Header />\n\t\t\t<Email.Title>Reset your password</Email.Title>\n\t\t\t{firstName ? <Email.Paragraph>Hi {firstName},</Email.Paragraph> : null}\n\t\t\t<Email.Paragraph>\n\t\t\t\tSomeone requested a password reset for your account. Use the button below to choose a new\n\t\t\t\tpassword.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.CTA href={resetUrl}>Reset password</Email.CTA>\n\t\t\t<Email.Paragraph>This link expires in {expiresInMinutes} minutes.</Email.Paragraph>\n\t\t\t<Email.Paragraph>\n\t\t\t\tIf you didn't request this, your password is unchanged and you can ignore this email. If\n\t\t\t\tyou're concerned about unauthorized access, reset your password to secure your account.\n\t\t\t</Email.Paragraph>\n\t\t\t<Email.LegalFooter\n\t\t\t\tcategory=\"transactional\"\n\t\t\t\treason=\"You're receiving this email because a password reset was requested for your account.\"\n\t\t\t/>\n\t\t</Email.Shell>\n\t);\n}\n"],"mappings":";;;;AA6BA,SAAgB,mBAAmB,EAClC,WACA,WAAW,kCACX,mBAAmB,MACQ;CAC3B,OACC,qBAAC,MAAM,OAAP;EAAa,SAAQ;EAArB,UAAA;GACC,oBAAC,MAAM,QAAP,CAAe,CAAA;GACf,oBAAC,MAAM,OAAP,EAAA,UAAa,sBAAgC,CAAA;GAC5C,YAAY,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAI;IAAU;GAAkB,EAAA,CAAA,IAAI;GAClE,oBAAC,MAAM,WAAP,EAAA,UAAiB,sGAGA,CAAA;GACjB,oBAAC,MAAM,KAAP;IAAW,MAAM;IAAU,UAAA;GAAyB,CAAA;GACpD,qBAAC,MAAM,WAAP,EAAA,UAAA;IAAiB;IAAsB;IAAiB;GAA0B,EAAA,CAAA;GAClF,oBAAC,MAAM,WAAP,EAAA,UAAiB,mLAGA,CAAA;GACjB,oBAAC,MAAM,aAAP;IACC,UAAS;IACT,QAAO;GACP,CAAA;EACW;;AAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.d.ts","names":[],"sources":["../../src/emails/primitives.tsx"],"mappings":";;;;;UAyCU;EACT;;EAEA,QAAQ;EACR,UAAU;;;iBAIF,QAAQ,SAAS,OAAO,YAAY,6BAAU,IAAA;;iBAwB9C,0BAAM,IAAA;iBAkBN,QAAQ;EAAc,UAAU;oBAAW,IAAA;iBAQ3C,YAAY;EAAc,UAAU;oBAAW,IAAA;;;;;;iBAW/C,YAAY;EAAc,WAAW;oBAAW,IAAA;;;;;;iBAchD,cAAc;EAAc,WAAW;oBAAW,IAAA;;iBAclD,OAAO;EAAc,UAAU;oBAAW,IAAA;;;;;iBAc1C,eAAe;EAAU;oBAAc,IAAA;;iBAavC,MACR,MACA,UACA;EAEA;EACA,UAAU;;EAEV;oBACA,IAAA;iBAcQ,SAAS;EAAc,UAAU;oBAAW,IAAA;;;;;;;iBAe5C,cAAc,QAAQ;EAAc,SAAS;EAAW,WAAW;oBAAe,IAAA;;;;;;;cA6C9E;WACH,cAAc;WACd,eAAe;WACf,cAAc;WACd,kBAAkB;WAClB,kBAAkB;WAClB,oBAAoB;WACpB,aAAa;WACb,YAAY;WACZ,qBAAqB;WACrB,eAAe;WACf,oBAAoB;WACpB,gBAAgB;WAChB,aAAa;WACb,aAAa;WACb,WAAW"}
1
+ {"version":3,"file":"primitives.d.ts","names":[],"sources":["../../src/emails/primitives.tsx"],"mappings":";;;;;UAmDU;EACT;;EAEA,QAAQ;EACR,UAAU;;;iBAIF,QAAQ,SAAS,OAAO,YAAY,6BAAU,IAAA;;iBAwB9C,0BAAM,IAAA;iBAkBN,QAAQ;EAAc,UAAU;oBAAW,IAAA;iBAQ3C,YAAY;EAAc,UAAU;oBAAW,IAAA;;;;;;iBAW/C,YAAY;EAAc,WAAW;oBAAW,IAAA;;;;;;iBAchD,cAAc;EAAc,WAAW;oBAAW,IAAA;;iBAclD,OAAO;EAAc,UAAU;oBAAW,IAAA;;;;;iBAc1C,eAAe;EAAU;oBAAc,IAAA;;iBAavC,MACR,MACA,UACA;EAEA;EACA,UAAU;;EAEV;oBACA,IAAA;iBAcQ,SAAS;EAAc,UAAU;oBAAW,IAAA;;;;;;;iBAe5C,cAAc,QAAQ;EAAc,SAAS;EAAW,WAAW;oBAAe,IAAA;;;;;;;cAiD9E;WACH,cAAc;WACd,eAAe;WACf,cAAc;WACd,kBAAkB;WAClB,kBAAkB;WAClB,oBAAoB;WACpB,aAAa;WACb,YAAY;WACZ,qBAAqB;WACrB,eAAe;WACf,oBAAoB;WACpB,gBAAgB;WAChB,aAAa;WACb,aAAa;WACb,WAAW"}
@@ -18,6 +18,13 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
18
18
  * See the License for the specific language governing permissions and
19
19
  * limitations under the License.
20
20
  */
21
+ /**
22
+ * @fileoverview Compound email primitives — theme-driven, client-safe building blocks
23
+ * (shell, header, CTA, legal footer, and more) that every template composes from,
24
+ * exposed as a single `Email` namespace object.
25
+ *
26
+ * @module @resq-systems/email-templates/emails/primitives
27
+ */
21
28
  /** Outer document, resolved theme, preview text, and a single bordered card. */
22
29
  function Shell({ preview, theme, children }) {
23
30
  const resolved = resolveEmailTheme(useContext(EmailThemeContext), theme);
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.js","names":[],"sources":["../../src/emails/primitives.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n\tBody,\n\tButton,\n\tContainer,\n\tHead,\n\tHeading,\n\tHr,\n\tHtml,\n\tImg,\n\tLink,\n\tPreview,\n\tSection,\n\tTailwind,\n\tText,\n} from \"@react-email/components\";\nimport { type ReactNode, useContext } from \"react\";\nimport type { EmailCategory } from \"../schemas.js\";\nimport {\n\tEmailMessageContext,\n\tEmailThemeContext,\n\ttype EmailThemeOverride,\n\tbuildTailwindConfig,\n\tresolveEmailTheme,\n} from \"./theme.js\";\n\ninterface ShellProps {\n\tpreview: string;\n\t/** Per-render brand override, merged over the active theme (context or default). */\n\ttheme?: EmailThemeOverride;\n\tchildren: ReactNode;\n}\n\n/** Outer document, resolved theme, preview text, and a single bordered card. */\nfunction Shell({ preview, theme, children }: ShellProps) {\n\tconst resolved = resolveEmailTheme(useContext(EmailThemeContext), theme);\n\tconst config = buildTailwindConfig(resolved);\n\n\treturn (\n\t\t<Html lang=\"en\">\n\t\t\t<Head>\n\t\t\t\t<meta name=\"color-scheme\" content=\"dark\" />\n\t\t\t\t<meta name=\"supported-color-schemes\" content=\"dark\" />\n\t\t\t\t{resolved.fontsHref ? <link href={resolved.fontsHref} rel=\"stylesheet\" /> : null}\n\t\t\t</Head>\n\t\t\t<Tailwind config={config}>\n\t\t\t\t<Preview>{preview}</Preview>\n\t\t\t\t<Body className=\"bg-background font-sans text-foreground\">\n\t\t\t\t\t<Container className=\"mx-auto my-10 max-w-xl rounded-xl border border-solid border-border bg-surface p-10\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Container>\n\t\t\t\t</Body>\n\t\t\t</Tailwind>\n\t\t</Html>\n\t);\n}\n\n/** Brand lockup (logo + product wordmark) rendered at the top of the card. */\nfunction Header() {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Section className=\"mb-8\">\n\t\t\t<Img\n\t\t\t\tsrc={org.logoUrl}\n\t\t\t\twidth=\"40\"\n\t\t\t\theight=\"40\"\n\t\t\t\talt={org.productName}\n\t\t\t\tclassName=\"inline-block align-middle\"\n\t\t\t/>\n\t\t\t<Text className=\"ml-3 inline-block align-middle font-display text-lg font-bold tracking-tight text-foreground\">\n\t\t\t\t{org.productName}\n\t\t\t</Text>\n\t\t</Section>\n\t);\n}\n\nfunction Title({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Heading className=\"mb-4 font-display text-2xl font-bold tracking-tight text-foreground\">\n\t\t\t{children}\n\t\t</Heading>\n\t);\n}\n\nfunction Paragraph({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Text className=\"mb-4 font-sans text-base leading-relaxed text-foreground\">{children}</Text>\n\t);\n}\n\n/**\n * Role-based sign-off. Defaults to \"— The {brand} team\", derived from the active\n * theme's org so a rebrand flows through. Keep copy neutral: no first-person\n * promises or commitments (per the content & legal guide).\n */\nfunction Signature({ children }: { children?: ReactNode }) {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Text className=\"mt-6 font-sans text-sm leading-relaxed text-muted\">\n\t\t\t{children ?? `— The ${org.brandName} team`}\n\t\t</Text>\n\t);\n}\n\n/**\n * Muted support-contact line for security notices, sourced from\n * `theme.org.supportEmail` so there is always an actionable path even when a\n * template's optional CTA is absent. `children` overrides the lead-in prompt.\n */\nfunction SupportLine({ children }: { children?: ReactNode }) {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Text className=\"mb-4 font-sans text-sm leading-relaxed text-muted\">\n\t\t\t{children ?? \"Didn't do this?\"} Contact us at{\" \"}\n\t\t\t<Link href={`mailto:${org.supportEmail}`} className=\"text-primary underline\">\n\t\t\t\t{org.supportEmail}\n\t\t\t</Link>\n\t\t\t.\n\t\t</Text>\n\t);\n}\n\n/** A large, letter-spaced code block for OTP / verification codes. */\nfunction Code({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Section className=\"my-6 rounded-md border border-solid border-border bg-background py-4 text-center\">\n\t\t\t<Text className=\"font-mono text-3xl font-medium tracking-[8px] text-foreground\">\n\t\t\t\t{children}\n\t\t\t</Text>\n\t\t</Section>\n\t);\n}\n\n/**\n * Plain-text fallback for a link/button — improves deliverability and works in\n * clients that strip buttons. Renders the raw URL so it stays copy-pasteable.\n */\nfunction FallbackLink({ href }: { href: string }) {\n\treturn (\n\t\t<Text className=\"mt-4 font-sans text-xs leading-relaxed text-muted\">\n\t\t\tOr paste this link into your browser:\n\t\t\t<br />\n\t\t\t<Link href={href} className=\"break-all text-primary\">\n\t\t\t\t{href}\n\t\t\t</Link>\n\t\t</Text>\n\t);\n}\n\n/** Primary call-to-action — brand primary, mono, uppercase, tracked (per style guide). */\nfunction CTA({\n\thref,\n\tchildren,\n\tfallback = true,\n}: {\n\thref: string;\n\tchildren: ReactNode;\n\t/** Render a copy-pasteable {@link FallbackLink} below the button (default `true`). */\n\tfallback?: boolean;\n}) {\n\treturn (\n\t\t<Section className=\"my-6\">\n\t\t\t<Button\n\t\t\t\thref={href}\n\t\t\t\tclassName=\"box-border block rounded-md bg-primary px-8 py-3.5 text-center font-mono text-sm font-medium uppercase tracking-wide text-white no-underline\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t\t{fallback ? <FallbackLink href={href} /> : null}\n\t\t</Section>\n\t);\n}\n\nfunction Footer({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<>\n\t\t\t<Hr className=\"my-6 border-border\" />\n\t\t\t<Text className=\"font-sans text-xs leading-relaxed text-muted\">{children}</Text>\n\t\t</>\n\t);\n}\n\n/**\n * Compliance footer: legal entity + registered postal address, Terms/Privacy\n * links, and — for `marketing` sends only — an unsubscribe affordance. The\n * effective category is the `category` prop, falling back to the active\n * {@link EmailMessageContext}. All copy is small and muted.\n */\nfunction LegalFooter({ reason, category }: { reason?: ReactNode; category?: EmailCategory }) {\n\tconst { org } = useContext(EmailThemeContext);\n\tconst message = useContext(EmailMessageContext);\n\tconst effectiveCategory = category ?? message.category;\n\t// CAN-SPAM/GDPR: the homepage is not a valid opt-out, so never fall back to\n\t// `org.websiteUrl`. Marketing sends without a real `unsubscribeUrl` simply\n\t// omit the affordance (and are effectively transactional).\n\tconst unsubscribeHref = message.unsubscribeUrl;\n\treturn (\n\t\t<>\n\t\t\t<Hr className=\"my-6 border-border\" />\n\t\t\t{reason ? (\n\t\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">{reason}</Text>\n\t\t\t) : null}\n\t\t\t{/* `registeredAddress` already leads with the legal entity name, so it is a\n\t\t\t complete CAN-SPAM postal line on its own — no separate `legalName`. */}\n\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t{org.registeredAddress}\n\t\t\t</Text>\n\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t<Link href={org.termsUrl} className=\"text-muted underline\">\n\t\t\t\t\tTerms\n\t\t\t\t</Link>\n\t\t\t\t{\" · \"}\n\t\t\t\t<Link href={org.privacyUrl} className=\"text-muted underline\">\n\t\t\t\t\tPrivacy\n\t\t\t\t</Link>\n\t\t\t</Text>\n\t\t\t{effectiveCategory === \"marketing\" && unsubscribeHref ? (\n\t\t\t\t<Text className=\"font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t\t<Link href={unsubscribeHref} className=\"text-muted underline\">\n\t\t\t\t\t\tUnsubscribe or manage preferences\n\t\t\t\t\t</Link>\n\t\t\t\t</Text>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n\n/**\n * Compound email primitives. Templates compose only from these so styling stays\n * consistent, theme-driven, and email-client safe. The raw react-email\n * `Section`, `Text`, `Link`, and `Hr` are re-exported for templates that need\n * finer control.\n */\nexport const Email: {\n\treadonly Shell: typeof Shell;\n\treadonly Header: typeof Header;\n\treadonly Title: typeof Title;\n\treadonly Paragraph: typeof Paragraph;\n\treadonly Signature: typeof Signature;\n\treadonly SupportLine: typeof SupportLine;\n\treadonly Code: typeof Code;\n\treadonly CTA: typeof CTA;\n\treadonly FallbackLink: typeof FallbackLink;\n\treadonly Footer: typeof Footer;\n\treadonly LegalFooter: typeof LegalFooter;\n\treadonly Section: typeof Section;\n\treadonly Text: typeof Text;\n\treadonly Link: typeof Link;\n\treadonly Hr: typeof Hr;\n} = {\n\tShell,\n\tHeader,\n\tTitle,\n\tParagraph,\n\tSignature,\n\tSupportLine,\n\tCode,\n\tCTA,\n\tFallbackLink,\n\tFooter,\n\tLegalFooter,\n\tSection,\n\tText,\n\tLink,\n\tHr,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiDA,SAAS,MAAM,EAAE,SAAS,OAAO,YAAwB;CACxD,MAAM,WAAW,kBAAkB,WAAW,iBAAiB,GAAG,KAAK;CACvE,MAAM,SAAS,oBAAoB,QAAQ;CAE3C,OACC,qBAAC,MAAD;EAAM,MAAK;YAAX,CACC,qBAAC,MAAD,EAAA,UAAA;GACC,oBAAC,QAAD;IAAM,MAAK;IAAe,SAAQ;GAAQ,CAAA;GAC1C,oBAAC,QAAD;IAAM,MAAK;IAA0B,SAAQ;GAAQ,CAAA;GACpD,SAAS,YAAY,oBAAC,QAAD;IAAM,MAAM,SAAS;IAAW,KAAI;GAAc,CAAA,IAAI;EACvE,EAAA,CAAA,GACN,qBAAC,UAAD;GAAkB;aAAlB,CACC,oBAAC,SAAD,EAAA,UAAU,QAAiB,CAAA,GAC3B,oBAAC,MAAD;IAAM,WAAU;cACf,oBAAC,WAAD;KAAW,WAAU;KACnB;IACS,CAAA;GACN,CAAA,CACG;IACL;;AAER;;AAGA,SAAS,SAAS;CACjB,MAAM,EAAE,QAAQ,WAAW,iBAAiB;CAC5C,OACC,qBAAC,SAAD;EAAS,WAAU;YAAnB,CACC,oBAAC,KAAD;GACC,KAAK,IAAI;GACT,OAAM;GACN,QAAO;GACP,KAAK,IAAI;GACT,WAAU;EACV,CAAA,GACD,oBAAC,MAAD;GAAM,WAAU;aACd,IAAI;EACA,CAAA,CACE;;AAEX;AAEA,SAAS,MAAM,EAAE,YAAqC;CACrD,OACC,oBAAC,SAAD;EAAS,WAAU;EACjB;CACO,CAAA;AAEX;AAEA,SAAS,UAAU,EAAE,YAAqC;CACzD,OACC,oBAAC,MAAD;EAAM,WAAU;EAA4D;CAAe,CAAA;AAE7F;;;;;;AAOA,SAAS,UAAU,EAAE,YAAsC;CAC1D,MAAM,EAAE,QAAQ,WAAW,iBAAiB;CAC5C,OACC,oBAAC,MAAD;EAAM,WAAU;YACd,YAAY,SAAS,IAAI,UAAU;CAC/B,CAAA;AAER;;;;;;AAOA,SAAS,YAAY,EAAE,YAAsC;CAC5D,MAAM,EAAE,QAAQ,WAAW,iBAAiB;CAC5C,OACC,qBAAC,MAAD;EAAM,WAAU;YAAhB;GACE,YAAY;GAAkB;GAAe;GAC9C,oBAAC,MAAD;IAAM,MAAM,UAAU,IAAI;IAAgB,WAAU;cAClD,IAAI;GACA,CAAA;GAAC;EAEF;;AAER;;AAGA,SAAS,KAAK,EAAE,YAAqC;CACpD,OACC,oBAAC,SAAD;EAAS,WAAU;YAClB,oBAAC,MAAD;GAAM,WAAU;GACd;EACI,CAAA;CACE,CAAA;AAEX;;;;;AAMA,SAAS,aAAa,EAAE,QAA0B;CACjD,OACC,qBAAC,MAAD;EAAM,WAAU;YAAhB;GAAoE;GAEnE,oBAAC,MAAD,CAAK,CAAA;GACL,oBAAC,MAAD;IAAY;IAAM,WAAU;cAC1B;GACI,CAAA;EACD;;AAER;;AAGA,SAAS,IAAI,EACZ,MACA,UACA,WAAW,QAMT;CACF,OACC,qBAAC,SAAD;EAAS,WAAU;YAAnB,CACC,oBAAC,QAAD;GACO;GACN,WAAU;GAET;EACM,CAAA,GACP,WAAW,oBAAC,cAAD,EAAoB,KAAO,CAAA,IAAI,IACnC;;AAEX;AAEA,SAAS,OAAO,EAAE,YAAqC;CACtD,OACC,qBAAA,UAAA,EAAA,UAAA,CACC,oBAAC,IAAD,EAAI,WAAU,qBAAsB,CAAA,GACpC,oBAAC,MAAD;EAAM,WAAU;EAAgD;CAAe,CAAA,CAC9E,EAAA,CAAA;AAEJ;;;;;;;AAQA,SAAS,YAAY,EAAE,QAAQ,YAA8D;CAC5F,MAAM,EAAE,QAAQ,WAAW,iBAAiB;CAC5C,MAAM,UAAU,WAAW,mBAAmB;CAC9C,MAAM,oBAAoB,YAAY,QAAQ;CAI9C,MAAM,kBAAkB,QAAQ;CAChC,OACC,qBAAA,UAAA,EAAA,UAAA;EACC,oBAAC,IAAD,EAAI,WAAU,qBAAsB,CAAA;EACnC,SACA,oBAAC,MAAD;GAAM,WAAU;aAAqD;EAAa,CAAA,IAC/E;EAGJ,oBAAC,MAAD;GAAM,WAAU;aACd,IAAI;EACA,CAAA;EACN,qBAAC,MAAD;GAAM,WAAU;aAAhB;IACC,oBAAC,MAAD;KAAM,MAAM,IAAI;KAAU,WAAU;eAAuB;IAErD,CAAA;IACL;IACD,oBAAC,MAAD;KAAM,MAAM,IAAI;KAAY,WAAU;eAAuB;IAEvD,CAAA;GACD;;EACL,sBAAsB,eAAe,kBACrC,oBAAC,MAAD;GAAM,WAAU;aACf,oBAAC,MAAD;IAAM,MAAM;IAAiB,WAAU;cAAuB;GAExD,CAAA;EACD,CAAA,IACH;CACH,EAAA,CAAA;AAEJ;;;;;;;AAQA,MAAa,QAgBT;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD"}
1
+ {"version":3,"file":"primitives.js","names":[],"sources":["../../src/emails/primitives.tsx"],"sourcesContent":["/**\n * Copyright 2026 ResQ Systems, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Compound email primitives — theme-driven, client-safe building blocks\n * (shell, header, CTA, legal footer, and more) that every template composes from,\n * exposed as a single `Email` namespace object.\n *\n * @module @resq-systems/email-templates/emails/primitives\n */\n\nimport {\n\tBody,\n\tButton,\n\tContainer,\n\tHead,\n\tHeading,\n\tHr,\n\tHtml,\n\tImg,\n\tLink,\n\tPreview,\n\tSection,\n\tTailwind,\n\tText,\n} from \"@react-email/components\";\nimport { type ReactNode, useContext } from \"react\";\nimport type { EmailCategory } from \"../schemas.js\";\nimport {\n\tEmailMessageContext,\n\tEmailThemeContext,\n\ttype EmailThemeOverride,\n\tbuildTailwindConfig,\n\tresolveEmailTheme,\n} from \"./theme.js\";\n\n//#region Internal\n\ninterface ShellProps {\n\tpreview: string;\n\t/** Per-render brand override, merged over the active theme (context or default). */\n\ttheme?: EmailThemeOverride;\n\tchildren: ReactNode;\n}\n\n/** Outer document, resolved theme, preview text, and a single bordered card. */\nfunction Shell({ preview, theme, children }: ShellProps) {\n\tconst resolved = resolveEmailTheme(useContext(EmailThemeContext), theme);\n\tconst config = buildTailwindConfig(resolved);\n\n\treturn (\n\t\t<Html lang=\"en\">\n\t\t\t<Head>\n\t\t\t\t<meta name=\"color-scheme\" content=\"dark\" />\n\t\t\t\t<meta name=\"supported-color-schemes\" content=\"dark\" />\n\t\t\t\t{resolved.fontsHref ? <link href={resolved.fontsHref} rel=\"stylesheet\" /> : null}\n\t\t\t</Head>\n\t\t\t<Tailwind config={config}>\n\t\t\t\t<Preview>{preview}</Preview>\n\t\t\t\t<Body className=\"bg-background font-sans text-foreground\">\n\t\t\t\t\t<Container className=\"mx-auto my-10 max-w-xl rounded-xl border border-solid border-border bg-surface p-10\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Container>\n\t\t\t\t</Body>\n\t\t\t</Tailwind>\n\t\t</Html>\n\t);\n}\n\n/** Brand lockup (logo + product wordmark) rendered at the top of the card. */\nfunction Header() {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Section className=\"mb-8\">\n\t\t\t<Img\n\t\t\t\tsrc={org.logoUrl}\n\t\t\t\twidth=\"40\"\n\t\t\t\theight=\"40\"\n\t\t\t\talt={org.productName}\n\t\t\t\tclassName=\"inline-block align-middle\"\n\t\t\t/>\n\t\t\t<Text className=\"ml-3 inline-block align-middle font-display text-lg font-bold tracking-tight text-foreground\">\n\t\t\t\t{org.productName}\n\t\t\t</Text>\n\t\t</Section>\n\t);\n}\n\nfunction Title({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Heading className=\"mb-4 font-display text-2xl font-bold tracking-tight text-foreground\">\n\t\t\t{children}\n\t\t</Heading>\n\t);\n}\n\nfunction Paragraph({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Text className=\"mb-4 font-sans text-base leading-relaxed text-foreground\">{children}</Text>\n\t);\n}\n\n/**\n * Role-based sign-off. Defaults to \"— The {brand} team\", derived from the active\n * theme's org so a rebrand flows through. Keep copy neutral: no first-person\n * promises or commitments (per the content & legal guide).\n */\nfunction Signature({ children }: { children?: ReactNode }) {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Text className=\"mt-6 font-sans text-sm leading-relaxed text-muted\">\n\t\t\t{children ?? `— The ${org.brandName} team`}\n\t\t</Text>\n\t);\n}\n\n/**\n * Muted support-contact line for security notices, sourced from\n * `theme.org.supportEmail` so there is always an actionable path even when a\n * template's optional CTA is absent. `children` overrides the lead-in prompt.\n */\nfunction SupportLine({ children }: { children?: ReactNode }) {\n\tconst { org } = useContext(EmailThemeContext);\n\treturn (\n\t\t<Text className=\"mb-4 font-sans text-sm leading-relaxed text-muted\">\n\t\t\t{children ?? \"Didn't do this?\"} Contact us at{\" \"}\n\t\t\t<Link href={`mailto:${org.supportEmail}`} className=\"text-primary underline\">\n\t\t\t\t{org.supportEmail}\n\t\t\t</Link>\n\t\t\t.\n\t\t</Text>\n\t);\n}\n\n/** A large, letter-spaced code block for OTP / verification codes. */\nfunction Code({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<Section className=\"my-6 rounded-md border border-solid border-border bg-background py-4 text-center\">\n\t\t\t<Text className=\"font-mono text-3xl font-medium tracking-[8px] text-foreground\">\n\t\t\t\t{children}\n\t\t\t</Text>\n\t\t</Section>\n\t);\n}\n\n/**\n * Plain-text fallback for a link/button — improves deliverability and works in\n * clients that strip buttons. Renders the raw URL so it stays copy-pasteable.\n */\nfunction FallbackLink({ href }: { href: string }) {\n\treturn (\n\t\t<Text className=\"mt-4 font-sans text-xs leading-relaxed text-muted\">\n\t\t\tOr paste this link into your browser:\n\t\t\t<br />\n\t\t\t<Link href={href} className=\"break-all text-primary\">\n\t\t\t\t{href}\n\t\t\t</Link>\n\t\t</Text>\n\t);\n}\n\n/** Primary call-to-action — brand primary, mono, uppercase, tracked (per style guide). */\nfunction CTA({\n\thref,\n\tchildren,\n\tfallback = true,\n}: {\n\thref: string;\n\tchildren: ReactNode;\n\t/** Render a copy-pasteable {@link FallbackLink} below the button (default `true`). */\n\tfallback?: boolean;\n}) {\n\treturn (\n\t\t<Section className=\"my-6\">\n\t\t\t<Button\n\t\t\t\thref={href}\n\t\t\t\tclassName=\"box-border block rounded-md bg-primary px-8 py-3.5 text-center font-mono text-sm font-medium uppercase tracking-wide text-white no-underline\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Button>\n\t\t\t{fallback ? <FallbackLink href={href} /> : null}\n\t\t</Section>\n\t);\n}\n\nfunction Footer({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<>\n\t\t\t<Hr className=\"my-6 border-border\" />\n\t\t\t<Text className=\"font-sans text-xs leading-relaxed text-muted\">{children}</Text>\n\t\t</>\n\t);\n}\n\n/**\n * Compliance footer: legal entity + registered postal address, Terms/Privacy\n * links, and — for `marketing` sends only — an unsubscribe affordance. The\n * effective category is the `category` prop, falling back to the active\n * {@link EmailMessageContext}. All copy is small and muted.\n */\nfunction LegalFooter({ reason, category }: { reason?: ReactNode; category?: EmailCategory }) {\n\tconst { org } = useContext(EmailThemeContext);\n\tconst message = useContext(EmailMessageContext);\n\tconst effectiveCategory = category ?? message.category;\n\t// CAN-SPAM/GDPR: the homepage is not a valid opt-out, so never fall back to\n\t// `org.websiteUrl`. Marketing sends without a real `unsubscribeUrl` simply\n\t// omit the affordance (and are effectively transactional).\n\tconst unsubscribeHref = message.unsubscribeUrl;\n\treturn (\n\t\t<>\n\t\t\t<Hr className=\"my-6 border-border\" />\n\t\t\t{reason ? (\n\t\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">{reason}</Text>\n\t\t\t) : null}\n\t\t\t{/* `registeredAddress` already leads with the legal entity name, so it is a\n\t\t\t complete CAN-SPAM postal line on its own — no separate `legalName`. */}\n\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t{org.registeredAddress}\n\t\t\t</Text>\n\t\t\t<Text className=\"mb-2 font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t<Link href={org.termsUrl} className=\"text-muted underline\">\n\t\t\t\t\tTerms\n\t\t\t\t</Link>\n\t\t\t\t{\" · \"}\n\t\t\t\t<Link href={org.privacyUrl} className=\"text-muted underline\">\n\t\t\t\t\tPrivacy\n\t\t\t\t</Link>\n\t\t\t</Text>\n\t\t\t{effectiveCategory === \"marketing\" && unsubscribeHref ? (\n\t\t\t\t<Text className=\"font-sans text-xs leading-relaxed text-muted\">\n\t\t\t\t\t<Link href={unsubscribeHref} className=\"text-muted underline\">\n\t\t\t\t\t\tUnsubscribe or manage preferences\n\t\t\t\t\t</Link>\n\t\t\t\t</Text>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n\n//#endregion\n\n//#region Public API\n\n/**\n * Compound email primitives. Templates compose only from these so styling stays\n * consistent, theme-driven, and email-client safe. The raw react-email\n * `Section`, `Text`, `Link`, and `Hr` are re-exported for templates that need\n * finer control.\n */\nexport const Email: {\n\treadonly Shell: typeof Shell;\n\treadonly Header: typeof Header;\n\treadonly Title: typeof Title;\n\treadonly Paragraph: typeof Paragraph;\n\treadonly Signature: typeof Signature;\n\treadonly SupportLine: typeof SupportLine;\n\treadonly Code: typeof Code;\n\treadonly CTA: typeof CTA;\n\treadonly FallbackLink: typeof FallbackLink;\n\treadonly Footer: typeof Footer;\n\treadonly LegalFooter: typeof LegalFooter;\n\treadonly Section: typeof Section;\n\treadonly Text: typeof Text;\n\treadonly Link: typeof Link;\n\treadonly Hr: typeof Hr;\n} = {\n\tShell,\n\tHeader,\n\tTitle,\n\tParagraph,\n\tSignature,\n\tSupportLine,\n\tCode,\n\tCTA,\n\tFallbackLink,\n\tFooter,\n\tLegalFooter,\n\tSection,\n\tText,\n\tLink,\n\tHr,\n};\n\n//#endregion\n"],"mappings":"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"}