brookmind-emails 0.1.11 → 0.1.13

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 (40) hide show
  1. package/dist/foodstudio/config.d.ts +11 -0
  2. package/dist/foodstudio/config.d.ts.map +1 -0
  3. package/dist/foodstudio/config.js +12 -0
  4. package/dist/foodstudio/index.d.ts +16 -0
  5. package/dist/foodstudio/index.d.ts.map +1 -0
  6. package/dist/foodstudio/index.js +43 -0
  7. package/dist/foodstudio/templates/GrantCreditsEmail.d.ts +10 -0
  8. package/dist/foodstudio/templates/GrantCreditsEmail.d.ts.map +1 -0
  9. package/dist/foodstudio/templates/GrantCreditsEmail.js +188 -0
  10. package/dist/foodstudio/templates/OtpEmail.d.ts +8 -0
  11. package/dist/foodstudio/templates/OtpEmail.d.ts.map +1 -0
  12. package/dist/foodstudio/templates/OtpEmail.js +144 -0
  13. package/dist/foodstudio/templates/PromoSubscriptionEmail.d.ts +11 -0
  14. package/dist/foodstudio/templates/PromoSubscriptionEmail.d.ts.map +1 -0
  15. package/dist/foodstudio/templates/PromoSubscriptionEmail.js +170 -0
  16. package/dist/foodstudio/templates/WelcomeEmail.d.ts +6 -0
  17. package/dist/foodstudio/templates/WelcomeEmail.d.ts.map +1 -0
  18. package/dist/foodstudio/templates/WelcomeEmail.js +155 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2 -0
  22. package/dist/modelfy/index.d.ts +4 -2
  23. package/dist/modelfy/index.d.ts.map +1 -1
  24. package/dist/modelfy/index.js +11 -1
  25. package/dist/modelfy/templates/FeedbackRequestEmail.d.ts +8 -0
  26. package/dist/modelfy/templates/FeedbackRequestEmail.d.ts.map +1 -0
  27. package/dist/modelfy/templates/FeedbackRequestEmail.js +208 -0
  28. package/dist/modelfy/templates/WelcomeEmail.js +1 -1
  29. package/eslint.config.js +25 -0
  30. package/package.json +10 -3
  31. package/src/foodstudio/config.ts +12 -0
  32. package/src/foodstudio/index.ts +71 -0
  33. package/src/foodstudio/templates/GrantCreditsEmail.tsx +352 -0
  34. package/src/foodstudio/templates/OtpEmail.tsx +273 -0
  35. package/src/foodstudio/templates/PromoSubscriptionEmail.tsx +344 -0
  36. package/src/foodstudio/templates/WelcomeEmail.tsx +293 -0
  37. package/src/index.ts +3 -0
  38. package/src/modelfy/index.ts +25 -2
  39. package/src/modelfy/templates/FeedbackRequestEmail.tsx +383 -0
  40. package/src/modelfy/templates/WelcomeEmail.tsx +1 -1
@@ -0,0 +1,344 @@
1
+ import {
2
+ Html,
3
+ Head,
4
+ Body,
5
+ Container,
6
+ Section,
7
+ Text,
8
+ Link,
9
+ Preview,
10
+ Font,
11
+ Img,
12
+ Button as ReactEmailButton,
13
+ } from "@react-email/components";
14
+ import { foodstudioConfig } from "../config.js";
15
+
16
+ export interface PromoSubscriptionEmailProps {
17
+ email: string;
18
+ planName: string;
19
+ durationDays: number;
20
+ credits?: number;
21
+ expiresAt: string;
22
+ notes?: string;
23
+ }
24
+
25
+ // Design System Colors - Matching FoodStudio Landing
26
+ const colors = {
27
+ background: "#0d0d0d",
28
+ cardBg: "#121212",
29
+ primary: "#ea580c",
30
+ accent: "#ea580c",
31
+ white: "#f2f2f2",
32
+ textSecondary: "rgba(242, 242, 242, 0.7)",
33
+ textMuted: "#8c8c8c",
34
+ border: "#262626",
35
+ };
36
+
37
+ const styles = {
38
+ body: {
39
+ margin: 0,
40
+ padding: 0,
41
+ backgroundColor: colors.background,
42
+ fontFamily: "'Inter', 'Segoe UI', Arial, sans-serif",
43
+ },
44
+ container: {
45
+ maxWidth: "600px",
46
+ margin: "0 auto",
47
+ backgroundColor: colors.background,
48
+ },
49
+ header: {
50
+ backgroundColor: colors.background,
51
+ padding: "40px 32px 24px",
52
+ textAlign: "center" as const,
53
+ },
54
+ logo: {
55
+ display: "block" as const,
56
+ margin: "0 auto",
57
+ },
58
+ heroSection: {
59
+ padding: "24px 32px 40px",
60
+ textAlign: "center" as const,
61
+ },
62
+ heroTagline: {
63
+ margin: "0 0 12px",
64
+ fontSize: "13px",
65
+ fontWeight: 600,
66
+ color: colors.accent,
67
+ letterSpacing: "2px",
68
+ textTransform: "uppercase" as const,
69
+ },
70
+ heroHeading: {
71
+ margin: "0 0 16px",
72
+ fontSize: "28px",
73
+ fontWeight: 700,
74
+ color: colors.white,
75
+ lineHeight: "1.3",
76
+ },
77
+ paragraph: {
78
+ margin: "0 0 28px",
79
+ fontSize: "16px",
80
+ lineHeight: "1.6",
81
+ color: colors.textSecondary,
82
+ textAlign: "center" as const,
83
+ },
84
+ highlightBox: {
85
+ backgroundColor: "rgba(234, 88, 12, 0.15)",
86
+ border: `1px solid rgba(234, 88, 12, 0.3)`,
87
+ borderRadius: "12px",
88
+ padding: "24px",
89
+ marginBottom: "28px",
90
+ },
91
+ highlightLabel: {
92
+ fontSize: "13px",
93
+ color: colors.textMuted,
94
+ margin: "0 0 4px",
95
+ },
96
+ highlightValue: {
97
+ fontSize: "16px",
98
+ fontWeight: 600,
99
+ color: colors.white,
100
+ margin: 0,
101
+ },
102
+ buttonContainer: {
103
+ textAlign: "center" as const,
104
+ marginBottom: "28px",
105
+ },
106
+ ctaButton: {
107
+ display: "inline-block",
108
+ padding: "14px 36px",
109
+ fontSize: "15px",
110
+ fontWeight: 600,
111
+ textDecoration: "none",
112
+ borderRadius: "10px",
113
+ backgroundColor: colors.primary,
114
+ color: "#ffffff",
115
+ textAlign: "center" as const,
116
+ },
117
+ contentSection: {
118
+ backgroundColor: colors.cardBg,
119
+ padding: "32px",
120
+ borderTop: `1px solid ${colors.border}`,
121
+ },
122
+ smallText: {
123
+ margin: "0 0 12px",
124
+ fontSize: "14px",
125
+ lineHeight: "1.6",
126
+ color: colors.textMuted,
127
+ textAlign: "center" as const,
128
+ },
129
+ notesText: {
130
+ margin: "0 0 24px",
131
+ fontSize: "15px",
132
+ lineHeight: "1.6",
133
+ color: colors.textSecondary,
134
+ textAlign: "center" as const,
135
+ fontStyle: "italic" as const,
136
+ },
137
+ link: {
138
+ color: colors.primary,
139
+ textDecoration: "none",
140
+ fontWeight: 600,
141
+ },
142
+ footer: {
143
+ backgroundColor: colors.cardBg,
144
+ padding: "24px 32px",
145
+ textAlign: "center" as const,
146
+ borderTop: `1px solid ${colors.border}`,
147
+ },
148
+ footerLogo: {
149
+ display: "block" as const,
150
+ margin: "0 auto 12px",
151
+ opacity: 0.6,
152
+ },
153
+ footerText: {
154
+ margin: "0 0 4px",
155
+ fontSize: "11px",
156
+ color: colors.textMuted,
157
+ lineHeight: "1.6",
158
+ },
159
+ footerLink: {
160
+ color: colors.textMuted,
161
+ textDecoration: "underline",
162
+ },
163
+ downloadSection: {
164
+ backgroundColor: colors.cardBg,
165
+ padding: "24px 32px",
166
+ textAlign: "center" as const,
167
+ borderTop: `1px solid ${colors.border}`,
168
+ },
169
+ downloadText: {
170
+ margin: "0 0 16px",
171
+ fontSize: "14px",
172
+ color: colors.white,
173
+ },
174
+ badgeContainer: {
175
+ textAlign: "center" as const,
176
+ },
177
+ badge: {
178
+ display: "inline-block",
179
+ margin: "0 8px",
180
+ },
181
+ };
182
+
183
+ export function PromoSubscriptionEmail({
184
+ email = "user@example.com",
185
+ planName = "Pro",
186
+ durationDays = 30,
187
+ credits = 500,
188
+ expiresAt = "January 31, 2025",
189
+ notes,
190
+ }: PromoSubscriptionEmailProps): React.ReactElement {
191
+ const safeCredits = Number.isFinite(credits) ? Number(credits) : 0;
192
+
193
+ return (
194
+ <Html lang="en">
195
+ <Head>
196
+ <Font
197
+ fontFamily="Inter"
198
+ fallbackFontFamily="Arial"
199
+ webFont={{
200
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_0.woff2",
201
+ format: "woff2",
202
+ }}
203
+ fontWeight={400}
204
+ fontStyle="normal"
205
+ />
206
+ <Font
207
+ fontFamily="Inter"
208
+ fallbackFontFamily="Arial"
209
+ webFont={{
210
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYAZ9hjp-Ek-_0.woff2",
211
+ format: "woff2",
212
+ }}
213
+ fontWeight={700}
214
+ fontStyle="normal"
215
+ />
216
+ </Head>
217
+ <Preview>
218
+ {`You've received a ${durationDays}-day ${planName} subscription!`}
219
+ </Preview>
220
+ <Body style={styles.body}>
221
+ <Container style={styles.container}>
222
+ {/* Header */}
223
+ <Section style={styles.header}>
224
+ <Img
225
+ src={foodstudioConfig.logoUrl}
226
+ width="130"
227
+ height="auto"
228
+ alt="FoodStudio"
229
+ style={styles.logo}
230
+ />
231
+ </Section>
232
+
233
+ {/* Hero Section */}
234
+ <Section style={styles.heroSection}>
235
+ <Text style={styles.heroTagline}>Gift for You</Text>
236
+ <Text style={styles.heroHeading}>You've Got a Gift!</Text>
237
+ <Text style={{ ...styles.paragraph, margin: "0 0 4px" }}>
238
+ Hi <span style={{ color: colors.white, fontWeight: 600 }}>{email}</span>, great news!
239
+ </Text>
240
+ <Text style={styles.paragraph}>
241
+ You've been granted a promotional{" "}
242
+ <span style={{ color: colors.accent, fontWeight: 600 }}>{planName}</span> subscription.
243
+ </Text>
244
+
245
+ <div style={styles.highlightBox}>
246
+ <table width="100%" cellPadding={0} cellSpacing={0}>
247
+ <tbody>
248
+ <tr>
249
+ <td style={{ paddingBottom: "16px" }}>
250
+ <Text style={styles.highlightLabel}>Plan</Text>
251
+ <Text style={styles.highlightValue}>{planName}</Text>
252
+ </td>
253
+ <td style={{ paddingBottom: "16px", textAlign: "right" as const }}>
254
+ <Text style={styles.highlightLabel}>Duration</Text>
255
+ <Text style={styles.highlightValue}>{durationDays} days</Text>
256
+ </td>
257
+ </tr>
258
+ <tr>
259
+ <td>
260
+ <Text style={styles.highlightLabel}>Credits Included</Text>
261
+ <Text style={styles.highlightValue}>{safeCredits.toLocaleString()}</Text>
262
+ </td>
263
+ <td style={{ textAlign: "right" as const }}>
264
+ <Text style={styles.highlightLabel}>Expires</Text>
265
+ <Text style={styles.highlightValue}>{expiresAt}</Text>
266
+ </td>
267
+ </tr>
268
+ </tbody>
269
+ </table>
270
+ </div>
271
+
272
+ {notes && <Text style={styles.notesText}>"{notes}"</Text>}
273
+
274
+ <div style={styles.buttonContainer}>
275
+ <ReactEmailButton href={foodstudioConfig.appUrl} style={styles.ctaButton}>
276
+ Open FoodStudio
277
+ </ReactEmailButton>
278
+ </div>
279
+ </Section>
280
+
281
+ {/* Content Section */}
282
+ <Section style={styles.contentSection}>
283
+ <Text style={styles.smallText}>
284
+ This promotional subscription will not auto-renew. Enjoy your free access!
285
+ </Text>
286
+ <Text style={styles.smallText}>
287
+ Questions?{" "}
288
+ <Link href={`mailto:${foodstudioConfig.supportEmail}`} style={styles.link}>
289
+ {foodstudioConfig.supportEmail}
290
+ </Link>
291
+ </Text>
292
+ </Section>
293
+
294
+ {/* Download App Section */}
295
+ <Section style={styles.downloadSection}>
296
+ <Text style={styles.downloadText}>Get the FoodStudio app</Text>
297
+ <div style={styles.badgeContainer}>
298
+ <Link href={foodstudioConfig.appStoreUrl} style={styles.badge}>
299
+ <Img
300
+ src={foodstudioConfig.appStoreBadgeUrl}
301
+ width="120"
302
+ height="40"
303
+ alt="Download on the App Store"
304
+ />
305
+ </Link>
306
+ <Link href={foodstudioConfig.playStoreUrl} style={styles.badge}>
307
+ <Img
308
+ src={foodstudioConfig.playStoreBadgeUrl}
309
+ width="135"
310
+ height="40"
311
+ alt="Get it on Google Play"
312
+ />
313
+ </Link>
314
+ </div>
315
+ </Section>
316
+
317
+ {/* Footer */}
318
+ <Section style={styles.footer}>
319
+ <Img
320
+ src={foodstudioConfig.logoUrl}
321
+ width="80"
322
+ height="auto"
323
+ alt="FoodStudio"
324
+ style={styles.footerLogo}
325
+ />
326
+ <Text style={styles.footerText}>
327
+ © {new Date().getFullYear()} {foodstudioConfig.companyName}. All rights reserved.
328
+ </Text>
329
+ <Text style={styles.footerText}>
330
+ You received this email because you were granted a promotional subscription.
331
+ </Text>
332
+ <Text style={styles.footerText}>
333
+ <Link href={`${foodstudioConfig.appUrl}/privacy`} style={styles.footerLink}>
334
+ Privacy Policy
335
+ </Link>
336
+ </Text>
337
+ </Section>
338
+ </Container>
339
+ </Body>
340
+ </Html>
341
+ );
342
+ }
343
+
344
+ export default PromoSubscriptionEmail;
@@ -0,0 +1,293 @@
1
+ import {
2
+ Html,
3
+ Head,
4
+ Body,
5
+ Container,
6
+ Section,
7
+ Text,
8
+ Link,
9
+ Preview,
10
+ Font,
11
+ Img,
12
+ Button as ReactEmailButton,
13
+ } from "@react-email/components";
14
+ import { foodstudioConfig } from "../config.js";
15
+
16
+ export interface WelcomeEmailProps {
17
+ email: string;
18
+ }
19
+
20
+ // Design System Colors - Matching FoodStudio Landing
21
+ const colors = {
22
+ background: "#0d0d0d",
23
+ cardBg: "#121212",
24
+ primary: "#ea580c",
25
+ white: "#f2f2f2",
26
+ textSecondary: "rgba(242, 242, 242, 0.7)",
27
+ textMuted: "#8c8c8c",
28
+ border: "#262626",
29
+ };
30
+
31
+ const styles = {
32
+ body: {
33
+ margin: 0,
34
+ padding: 0,
35
+ backgroundColor: colors.background,
36
+ fontFamily: "'Inter', 'Segoe UI', Arial, sans-serif",
37
+ },
38
+ container: {
39
+ maxWidth: "600px",
40
+ margin: "0 auto",
41
+ backgroundColor: colors.background,
42
+ },
43
+ header: {
44
+ backgroundColor: colors.background,
45
+ padding: "40px 32px 24px",
46
+ textAlign: "center" as const,
47
+ },
48
+ logo: {
49
+ display: "block" as const,
50
+ margin: "0 auto",
51
+ },
52
+ heroSection: {
53
+ padding: "24px 32px 40px",
54
+ textAlign: "center" as const,
55
+ },
56
+ heroTagline: {
57
+ margin: "0 0 12px",
58
+ fontSize: "13px",
59
+ fontWeight: 600,
60
+ color: colors.primary,
61
+ letterSpacing: "2px",
62
+ textTransform: "uppercase" as const,
63
+ },
64
+ heroHeading: {
65
+ margin: "0 0 16px",
66
+ fontSize: "28px",
67
+ fontWeight: 700,
68
+ color: colors.white,
69
+ lineHeight: "1.3",
70
+ },
71
+ heroSubheading: {
72
+ margin: "0 0 28px",
73
+ fontSize: "16px",
74
+ lineHeight: "1.6",
75
+ color: colors.textSecondary,
76
+ },
77
+ heroCta: {
78
+ display: "inline-block",
79
+ padding: "14px 36px",
80
+ fontSize: "15px",
81
+ fontWeight: 600,
82
+ textDecoration: "none",
83
+ borderRadius: "10px",
84
+ backgroundColor: colors.primary,
85
+ color: "#ffffff",
86
+ textAlign: "center" as const,
87
+ },
88
+ welcomeSection: {
89
+ backgroundColor: colors.cardBg,
90
+ padding: "32px",
91
+ textAlign: "center" as const,
92
+ borderTop: `1px solid ${colors.border}`,
93
+ borderBottom: `1px solid ${colors.border}`,
94
+ },
95
+ welcomeText: {
96
+ margin: "0 0 16px",
97
+ fontSize: "16px",
98
+ lineHeight: "1.6",
99
+ color: colors.textSecondary,
100
+ },
101
+ welcomeEmail: {
102
+ color: colors.white,
103
+ fontWeight: 600,
104
+ },
105
+ supportSection: {
106
+ backgroundColor: colors.background,
107
+ padding: "32px",
108
+ textAlign: "center" as const,
109
+ },
110
+ supportText: {
111
+ margin: "0 0 4px",
112
+ fontSize: "13px",
113
+ color: colors.textMuted,
114
+ },
115
+ supportLink: {
116
+ color: colors.primary,
117
+ textDecoration: "none",
118
+ fontWeight: 600,
119
+ },
120
+ footer: {
121
+ backgroundColor: colors.cardBg,
122
+ padding: "24px 32px",
123
+ textAlign: "center" as const,
124
+ borderTop: `1px solid ${colors.border}`,
125
+ },
126
+ footerLogo: {
127
+ display: "block" as const,
128
+ margin: "0 auto 12px",
129
+ opacity: 0.6,
130
+ },
131
+ footerText: {
132
+ margin: "0 0 4px",
133
+ fontSize: "11px",
134
+ color: colors.textMuted,
135
+ lineHeight: "1.6",
136
+ },
137
+ footerLink: {
138
+ color: colors.textMuted,
139
+ textDecoration: "underline",
140
+ },
141
+ downloadSection: {
142
+ backgroundColor: colors.cardBg,
143
+ padding: "24px 32px",
144
+ textAlign: "center" as const,
145
+ borderTop: `1px solid ${colors.border}`,
146
+ },
147
+ downloadText: {
148
+ margin: "0 0 16px",
149
+ fontSize: "14px",
150
+ color: colors.white,
151
+ },
152
+ badgeContainer: {
153
+ textAlign: "center" as const,
154
+ },
155
+ badge: {
156
+ display: "inline-block",
157
+ margin: "0 8px",
158
+ },
159
+ };
160
+
161
+ export function WelcomeEmail({ email = "user@example.com" }: WelcomeEmailProps): React.ReactElement {
162
+ return (
163
+ <Html lang="en">
164
+ <Head>
165
+ <Font
166
+ fontFamily="Inter"
167
+ fallbackFontFamily="Arial"
168
+ webFont={{
169
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_0.woff2",
170
+ format: "woff2",
171
+ }}
172
+ fontWeight={400}
173
+ fontStyle="normal"
174
+ />
175
+ <Font
176
+ fontFamily="Inter"
177
+ fallbackFontFamily="Arial"
178
+ webFont={{
179
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fAZ9hjp-Ek-_0.woff2",
180
+ format: "woff2",
181
+ }}
182
+ fontWeight={600}
183
+ fontStyle="normal"
184
+ />
185
+ <Font
186
+ fontFamily="Inter"
187
+ fallbackFontFamily="Arial"
188
+ webFont={{
189
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYAZ9hjp-Ek-_0.woff2",
190
+ format: "woff2",
191
+ }}
192
+ fontWeight={700}
193
+ fontStyle="normal"
194
+ />
195
+ </Head>
196
+ <Preview>Welcome to FoodStudio</Preview>
197
+ <Body style={styles.body}>
198
+ <Container style={styles.container}>
199
+ {/* Header */}
200
+ <Section style={styles.header}>
201
+ <Img
202
+ src={foodstudioConfig.logoUrl}
203
+ width="130"
204
+ height="auto"
205
+ alt="FoodStudio"
206
+ style={styles.logo}
207
+ />
208
+ </Section>
209
+
210
+ {/* Hero Section */}
211
+ <Section style={styles.heroSection}>
212
+ <Text style={styles.heroTagline}>Welcome to FoodStudio</Text>
213
+ <Text style={styles.heroHeading}>
214
+ Your Account is Ready!
215
+ </Text>
216
+ <Text style={styles.heroSubheading}>
217
+ We're excited to have you on board. Start exploring FoodStudio and discover all the amazing features waiting for you.
218
+ </Text>
219
+ <ReactEmailButton href={foodstudioConfig.appUrl} style={styles.heroCta}>
220
+ Get Started
221
+ </ReactEmailButton>
222
+ </Section>
223
+
224
+ {/* Welcome Message */}
225
+ <Section style={styles.welcomeSection}>
226
+ <Text style={styles.welcomeText}>
227
+ Hi <span style={styles.welcomeEmail}>{email}</span>, your account is ready.
228
+ <br />
229
+ You now have access to the complete FoodStudio platform.
230
+ </Text>
231
+ </Section>
232
+
233
+ {/* Support Section */}
234
+ <Section style={styles.supportSection}>
235
+ <Text style={styles.supportText}>Need help getting started?</Text>
236
+ <Text style={styles.supportText}>
237
+ <Link href={`mailto:${foodstudioConfig.supportEmail}`} style={styles.supportLink}>
238
+ {foodstudioConfig.supportEmail}
239
+ </Link>
240
+ </Text>
241
+ </Section>
242
+
243
+ {/* Download App Section */}
244
+ <Section style={styles.downloadSection}>
245
+ <Text style={styles.downloadText}>Get the FoodStudio app</Text>
246
+ <div style={styles.badgeContainer}>
247
+ <Link href={foodstudioConfig.appStoreUrl} style={styles.badge}>
248
+ <Img
249
+ src={foodstudioConfig.appStoreBadgeUrl}
250
+ width="120"
251
+ height="40"
252
+ alt="Download on the App Store"
253
+ />
254
+ </Link>
255
+ <Link href={foodstudioConfig.playStoreUrl} style={styles.badge}>
256
+ <Img
257
+ src={foodstudioConfig.playStoreBadgeUrl}
258
+ width="135"
259
+ height="40"
260
+ alt="Get it on Google Play"
261
+ />
262
+ </Link>
263
+ </div>
264
+ </Section>
265
+
266
+ {/* Footer */}
267
+ <Section style={styles.footer}>
268
+ <Img
269
+ src={foodstudioConfig.logoUrl}
270
+ width="80"
271
+ height="auto"
272
+ alt="FoodStudio"
273
+ style={styles.footerLogo}
274
+ />
275
+ <Text style={styles.footerText}>
276
+ © {new Date().getFullYear()} {foodstudioConfig.companyName}. All rights reserved.
277
+ </Text>
278
+ <Text style={styles.footerText}>
279
+ You received this email because you signed up for FoodStudio.
280
+ </Text>
281
+ <Text style={styles.footerText}>
282
+ <Link href={`${foodstudioConfig.appUrl}/privacy`} style={styles.footerLink}>
283
+ Privacy Policy
284
+ </Link>
285
+ </Text>
286
+ </Section>
287
+ </Container>
288
+ </Body>
289
+ </Html>
290
+ );
291
+ }
292
+
293
+ export default WelcomeEmail;
package/src/index.ts CHANGED
@@ -3,3 +3,6 @@ export * from "./shared/index.js";
3
3
 
4
4
  // Modelfy emails
5
5
  export * as modelfy from "./modelfy/index.js";
6
+
7
+ // FoodStudio emails
8
+ export * as foodstudio from "./foodstudio/index.js";
@@ -6,12 +6,22 @@ import {
6
6
  } from "./templates/PromoSubscriptionEmail.js";
7
7
  import { GrantCreditsEmail, type GrantCreditsEmailProps } from "./templates/GrantCreditsEmail.js";
8
8
  import { WelcomeEmail, type WelcomeEmailProps } from "./templates/WelcomeEmail.js";
9
+ import {
10
+ FeedbackRequestEmail,
11
+ type FeedbackRequestEmailProps,
12
+ } from "./templates/FeedbackRequestEmail.js";
9
13
 
10
14
  // Re-export types
11
- export type { OtpEmailProps, PromoSubscriptionEmailProps, GrantCreditsEmailProps, WelcomeEmailProps };
15
+ export type {
16
+ OtpEmailProps,
17
+ PromoSubscriptionEmailProps,
18
+ GrantCreditsEmailProps,
19
+ WelcomeEmailProps,
20
+ FeedbackRequestEmailProps,
21
+ };
12
22
 
13
23
  // Re-export components for preview
14
- export { OtpEmail, PromoSubscriptionEmail, GrantCreditsEmail, WelcomeEmail };
24
+ export { OtpEmail, PromoSubscriptionEmail, GrantCreditsEmail, WelcomeEmail, FeedbackRequestEmail };
15
25
 
16
26
  // Render functions
17
27
  export interface RenderResult {
@@ -69,3 +79,16 @@ export async function renderWelcomeEmail(
69
79
  text,
70
80
  };
71
81
  }
82
+
83
+ export async function renderFeedbackRequestEmail(
84
+ props: FeedbackRequestEmailProps
85
+ ): Promise<RenderResult> {
86
+ const html = await render(FeedbackRequestEmail(props));
87
+ const text = await render(FeedbackRequestEmail(props), { plainText: true });
88
+
89
+ return {
90
+ subject: "We'd love your feedback on Modelfy",
91
+ html,
92
+ text,
93
+ };
94
+ }