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,383 @@
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 { modelfyConfig } from "../config.js";
15
+
16
+ export interface FeedbackRequestEmailProps {
17
+ email: string;
18
+ planName: string;
19
+ subscriptionEndDate: string;
20
+ }
21
+
22
+ // Design System Colors - Matching Modelfy Landing
23
+ const colors = {
24
+ background: "#0d0d0d",
25
+ cardBg: "#121212",
26
+ primary: "#0a8f5a",
27
+ white: "#f2f2f2",
28
+ textSecondary: "rgba(242, 242, 242, 0.7)",
29
+ textMuted: "#8c8c8c",
30
+ border: "#262626",
31
+ };
32
+
33
+ const styles = {
34
+ body: {
35
+ margin: 0,
36
+ padding: 0,
37
+ backgroundColor: colors.background,
38
+ fontFamily: "'Inter', 'Segoe UI', Arial, sans-serif",
39
+ },
40
+ container: {
41
+ maxWidth: "600px",
42
+ margin: "0 auto",
43
+ backgroundColor: colors.background,
44
+ },
45
+ header: {
46
+ backgroundColor: colors.background,
47
+ padding: "40px 32px 24px",
48
+ textAlign: "center" as const,
49
+ },
50
+ logo: {
51
+ display: "block" as const,
52
+ margin: "0 auto",
53
+ },
54
+ heroSection: {
55
+ padding: "24px 32px 16px",
56
+ textAlign: "center" as const,
57
+ },
58
+ heroTagline: {
59
+ margin: "0 0 12px",
60
+ fontSize: "13px",
61
+ fontWeight: 600,
62
+ color: colors.primary,
63
+ letterSpacing: "2px",
64
+ textTransform: "uppercase" as const,
65
+ },
66
+ heroHeading: {
67
+ margin: "0 0 16px",
68
+ fontSize: "28px",
69
+ fontWeight: 700,
70
+ color: colors.white,
71
+ lineHeight: "1.3",
72
+ },
73
+ heroSubheading: {
74
+ margin: "0",
75
+ fontSize: "16px",
76
+ lineHeight: "1.6",
77
+ color: colors.textSecondary,
78
+ },
79
+ feedbackSection: {
80
+ backgroundColor: colors.cardBg,
81
+ padding: "32px",
82
+ borderTop: `1px solid ${colors.border}`,
83
+ borderBottom: `1px solid ${colors.border}`,
84
+ },
85
+ feedbackText: {
86
+ margin: "0 0 20px",
87
+ fontSize: "15px",
88
+ lineHeight: "1.6",
89
+ color: colors.textSecondary,
90
+ textAlign: "center" as const,
91
+ },
92
+ feedbackBox: {
93
+ backgroundColor: "rgba(10, 143, 90, 0.1)",
94
+ border: `1px solid rgba(10, 143, 90, 0.3)`,
95
+ borderRadius: "12px",
96
+ padding: "20px 24px",
97
+ marginBottom: "24px",
98
+ },
99
+ feedbackBoxText: {
100
+ margin: 0,
101
+ fontSize: "14px",
102
+ lineHeight: "1.6",
103
+ color: colors.textSecondary,
104
+ textAlign: "center" as const,
105
+ },
106
+ questionsSection: {
107
+ backgroundColor: colors.background,
108
+ padding: "32px",
109
+ },
110
+ questionsSectionTitle: {
111
+ margin: "0 0 20px",
112
+ fontSize: "14px",
113
+ fontWeight: 600,
114
+ color: colors.white,
115
+ textAlign: "center" as const,
116
+ },
117
+ questionsList: {
118
+ margin: "0 auto",
119
+ padding: "0 20px",
120
+ maxWidth: "400px",
121
+ },
122
+ questionItem: {
123
+ margin: "0 0 12px",
124
+ fontSize: "14px",
125
+ lineHeight: "1.5",
126
+ color: colors.textMuted,
127
+ },
128
+ questionBullet: {
129
+ color: colors.primary,
130
+ marginRight: "8px",
131
+ },
132
+ ctaSection: {
133
+ backgroundColor: colors.cardBg,
134
+ padding: "32px",
135
+ textAlign: "center" as const,
136
+ borderTop: `1px solid ${colors.border}`,
137
+ },
138
+ ctaButton: {
139
+ display: "inline-block",
140
+ padding: "14px 36px",
141
+ fontSize: "15px",
142
+ fontWeight: 600,
143
+ textDecoration: "none",
144
+ borderRadius: "10px",
145
+ backgroundColor: colors.primary,
146
+ color: "#ffffff",
147
+ textAlign: "center" as const,
148
+ },
149
+ winbackSection: {
150
+ backgroundColor: colors.background,
151
+ padding: "32px",
152
+ textAlign: "center" as const,
153
+ },
154
+ winbackText: {
155
+ margin: "0 0 8px",
156
+ fontSize: "14px",
157
+ lineHeight: "1.6",
158
+ color: colors.textMuted,
159
+ textAlign: "center" as const,
160
+ },
161
+ winbackLink: {
162
+ color: colors.primary,
163
+ textDecoration: "none",
164
+ fontWeight: 600,
165
+ },
166
+ downloadSection: {
167
+ backgroundColor: colors.cardBg,
168
+ padding: "24px 32px",
169
+ textAlign: "center" as const,
170
+ borderTop: `1px solid ${colors.border}`,
171
+ },
172
+ downloadText: {
173
+ margin: "0 0 16px",
174
+ fontSize: "14px",
175
+ color: colors.white,
176
+ },
177
+ badgeContainer: {
178
+ textAlign: "center" as const,
179
+ },
180
+ badge: {
181
+ display: "inline-block",
182
+ margin: "0 8px",
183
+ },
184
+ footer: {
185
+ backgroundColor: colors.cardBg,
186
+ padding: "24px 32px",
187
+ textAlign: "center" as const,
188
+ borderTop: `1px solid ${colors.border}`,
189
+ },
190
+ footerLogo: {
191
+ display: "block" as const,
192
+ margin: "0 auto 12px",
193
+ opacity: 0.6,
194
+ },
195
+ footerText: {
196
+ margin: "0 0 4px",
197
+ fontSize: "11px",
198
+ color: colors.textMuted,
199
+ lineHeight: "1.6",
200
+ },
201
+ footerLink: {
202
+ color: colors.textMuted,
203
+ textDecoration: "underline",
204
+ },
205
+ };
206
+
207
+ const feedbackReasons = [
208
+ "The pricing didn't fit my budget",
209
+ "I found an alternative solution",
210
+ "The features didn't meet my needs",
211
+ "I experienced technical issues",
212
+ "I didn't use the product enough",
213
+ "Other reasons",
214
+ ];
215
+
216
+ export function FeedbackRequestEmail({
217
+ email = "user@example.com",
218
+ planName = "Pro",
219
+ subscriptionEndDate = "January 1, 2025",
220
+ }: FeedbackRequestEmailProps): React.ReactElement {
221
+ const feedbackMailto = `mailto:${modelfyConfig.supportEmail}?subject=Feedback%20on%20my%20Modelfy%20subscription&body=Hi%20Modelfy%20team%2C%0A%0AI%27m%20sharing%20feedback%20about%20my%20${encodeURIComponent(planName)}%20subscription%20that%20ended%20on%20${encodeURIComponent(subscriptionEndDate)}.%0A%0A`;
222
+
223
+ return (
224
+ <Html lang="en">
225
+ <Head>
226
+ <Font
227
+ fontFamily="Inter"
228
+ fallbackFontFamily="Arial"
229
+ webFont={{
230
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_0.woff2",
231
+ format: "woff2",
232
+ }}
233
+ fontWeight={400}
234
+ fontStyle="normal"
235
+ />
236
+ <Font
237
+ fontFamily="Inter"
238
+ fallbackFontFamily="Arial"
239
+ webFont={{
240
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fAZ9hjp-Ek-_0.woff2",
241
+ format: "woff2",
242
+ }}
243
+ fontWeight={600}
244
+ fontStyle="normal"
245
+ />
246
+ <Font
247
+ fontFamily="Inter"
248
+ fallbackFontFamily="Arial"
249
+ webFont={{
250
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYAZ9hjp-Ek-_0.woff2",
251
+ format: "woff2",
252
+ }}
253
+ fontWeight={700}
254
+ fontStyle="normal"
255
+ />
256
+ </Head>
257
+ <Preview>We'd love your feedback on Modelfy - Help us improve</Preview>
258
+ <Body style={styles.body}>
259
+ <Container style={styles.container}>
260
+ {/* Header */}
261
+ <Section style={styles.header}>
262
+ <Img
263
+ src={modelfyConfig.logoUrl}
264
+ width="130"
265
+ height="auto"
266
+ alt="Modelfy"
267
+ style={styles.logo}
268
+ />
269
+ </Section>
270
+
271
+ {/* Hero Section */}
272
+ <Section style={styles.heroSection}>
273
+ <Text style={styles.heroTagline}>We'd Love Your Feedback</Text>
274
+ <Text style={styles.heroHeading}>We're Sorry to See You Go</Text>
275
+ <Text style={styles.heroSubheading}>
276
+ Hi <span style={{ color: colors.white, fontWeight: 600 }}>{email}</span>, your{" "}
277
+ <span style={{ color: colors.white, fontWeight: 600 }}>{planName}</span> subscription
278
+ ended on{" "}
279
+ <span style={{ color: colors.white, fontWeight: 600 }}>{subscriptionEndDate}</span>.
280
+ Your feedback would help us improve Modelfy for everyone.
281
+ </Text>
282
+ </Section>
283
+
284
+ {/* Feedback Explanation */}
285
+ <Section style={styles.feedbackSection}>
286
+ <Text style={styles.feedbackText}>
287
+ We'd genuinely appreciate hearing about your experience.
288
+ Just reply to this email or click the button below.
289
+ </Text>
290
+ <div style={styles.feedbackBox}>
291
+ <Text style={styles.feedbackBoxText}>
292
+ Simply hit reply and let us know what we could do better.
293
+ <br />
294
+ All feedback goes directly to our team.
295
+ </Text>
296
+ </div>
297
+ </Section>
298
+
299
+ {/* Quick Questions */}
300
+ <Section style={styles.questionsSection}>
301
+ <Text style={styles.questionsSectionTitle}>
302
+ Some things we'd love to know:
303
+ </Text>
304
+ <div style={styles.questionsList}>
305
+ {feedbackReasons.map((reason, index) => (
306
+ <Text key={index} style={styles.questionItem}>
307
+ <span style={styles.questionBullet}>•</span>
308
+ {reason}
309
+ </Text>
310
+ ))}
311
+ </div>
312
+ </Section>
313
+
314
+ {/* CTA Section */}
315
+ <Section style={styles.ctaSection}>
316
+ <ReactEmailButton href={feedbackMailto} style={styles.ctaButton}>
317
+ Share Your Feedback
318
+ </ReactEmailButton>
319
+ </Section>
320
+
321
+ {/* Win-back Section */}
322
+ <Section style={styles.winbackSection}>
323
+ <Text style={styles.winbackText}>
324
+ Changed your mind? Your account is still here waiting for you.
325
+ </Text>
326
+ <Text style={styles.winbackText}>
327
+ <Link href={modelfyConfig.appUrl} style={styles.winbackLink}>
328
+ Reactivate your subscription
329
+ </Link>
330
+ </Text>
331
+ </Section>
332
+
333
+ {/* Download App Section */}
334
+ <Section style={styles.downloadSection}>
335
+ <Text style={styles.downloadText}>Get the Modelfy app</Text>
336
+ <div style={styles.badgeContainer}>
337
+ <Link href={modelfyConfig.appStoreUrl} style={styles.badge}>
338
+ <Img
339
+ src={modelfyConfig.appStoreBadgeUrl}
340
+ width="120"
341
+ height="40"
342
+ alt="Download on the App Store"
343
+ />
344
+ </Link>
345
+ <Link href={modelfyConfig.playStoreUrl} style={styles.badge}>
346
+ <Img
347
+ src={modelfyConfig.playStoreBadgeUrl}
348
+ width="135"
349
+ height="40"
350
+ alt="Get it on Google Play"
351
+ />
352
+ </Link>
353
+ </div>
354
+ </Section>
355
+
356
+ {/* Footer */}
357
+ <Section style={styles.footer}>
358
+ <Img
359
+ src={modelfyConfig.logoUrl}
360
+ width="80"
361
+ height="auto"
362
+ alt="Modelfy"
363
+ style={styles.footerLogo}
364
+ />
365
+ <Text style={styles.footerText}>
366
+ © {new Date().getFullYear()} {modelfyConfig.companyName}. All rights reserved.
367
+ </Text>
368
+ <Text style={styles.footerText}>
369
+ You received this email because your Modelfy subscription has ended.
370
+ </Text>
371
+ <Text style={styles.footerText}>
372
+ <Link href={`${modelfyConfig.appUrl}/privacy`} style={styles.footerLink}>
373
+ Privacy Policy
374
+ </Link>
375
+ </Text>
376
+ </Section>
377
+ </Container>
378
+ </Body>
379
+ </Html>
380
+ );
381
+ }
382
+
383
+ export default FeedbackRequestEmail;
@@ -274,7 +274,7 @@ const campaignImages = Array.from(
274
274
  { length: 33 },
275
275
  (_, i) => `https://bucket.modelfy.ai/app-media/campaign/campaign${i + 1}.jpeg`
276
276
  );
277
- const campaignProImages = Array.from(
277
+ const _campaignProImages = Array.from(
278
278
  { length: 15 },
279
279
  (_, i) => `https://bucket.modelfy.ai/app-media/campaign-pro/campaign-pro-${i + 1}.jpg`
280
280
  );