brookmind-emails 0.1.7 → 0.1.9

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.
@@ -1,83 +1,170 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Html, Head, Body, Container, Section, Text, Link, Preview, Font, } from "@react-email/components";
3
- import { Header, Footer, Button } from "../../shared/components/index.js";
2
+ import { Html, Head, Body, Container, Section, Text, Link, Preview, Font, Img, Button as ReactEmailButton, } from "@react-email/components";
4
3
  import { modelfyConfig } from "../config.js";
4
+ // Design System Colors - Matching Modelfy Landing
5
+ const colors = {
6
+ background: "#0d0d0d",
7
+ cardBg: "#121212",
8
+ primary: "#0a8f5a",
9
+ accent: "#f59e0b",
10
+ white: "#f2f2f2",
11
+ textSecondary: "rgba(242, 242, 242, 0.7)",
12
+ textMuted: "#8c8c8c",
13
+ border: "#262626",
14
+ };
5
15
  const styles = {
6
16
  body: {
7
17
  margin: 0,
8
18
  padding: 0,
9
- backgroundColor: "#F8FAFC",
10
- fontFamily: "'Outfit', Arial, sans-serif",
19
+ backgroundColor: colors.background,
20
+ fontFamily: "'Inter', 'Segoe UI', Arial, sans-serif",
11
21
  },
12
22
  container: {
13
- maxWidth: "560px",
14
- margin: "32px auto",
15
- backgroundColor: "#ffffff",
16
- border: "1px solid #E2E8F0",
17
- borderRadius: "16px",
18
- boxShadow: "0 24px 48px rgba(15, 23, 42, 0.08)",
19
- overflow: "hidden",
20
- },
21
- content: {
22
- padding: "32px 40px 24px",
23
- },
24
- heading: {
23
+ maxWidth: "600px",
24
+ margin: "0 auto",
25
+ backgroundColor: colors.background,
26
+ },
27
+ header: {
28
+ backgroundColor: colors.background,
29
+ padding: "40px 32px 24px",
30
+ textAlign: "center",
31
+ },
32
+ logo: {
33
+ display: "block",
34
+ margin: "0 auto",
35
+ },
36
+ heroSection: {
37
+ padding: "24px 32px 40px",
38
+ textAlign: "center",
39
+ },
40
+ heroTagline: {
41
+ margin: "0 0 12px",
42
+ fontSize: "13px",
43
+ fontWeight: 600,
44
+ color: colors.accent,
45
+ letterSpacing: "2px",
46
+ textTransform: "uppercase",
47
+ },
48
+ heroHeading: {
25
49
  margin: "0 0 16px",
26
- fontSize: "24px",
50
+ fontSize: "28px",
27
51
  fontWeight: 700,
28
- color: "#0F172A",
29
- textAlign: "center",
52
+ color: colors.white,
53
+ lineHeight: "1.3",
30
54
  },
31
55
  paragraph: {
32
- margin: "0 0 24px",
56
+ margin: "0 0 28px",
33
57
  fontSize: "16px",
34
58
  lineHeight: "1.6",
35
- color: "rgba(15, 23, 42, 0.72)",
59
+ color: colors.textSecondary,
60
+ textAlign: "center",
36
61
  },
37
62
  highlightBox: {
38
- backgroundColor: "rgba(99, 102, 241, 0.08)",
39
- border: "1px solid rgba(99, 102, 241, 0.24)",
63
+ backgroundColor: "rgba(245, 158, 11, 0.1)",
64
+ border: `1px solid rgba(245, 158, 11, 0.3)`,
40
65
  borderRadius: "12px",
41
66
  padding: "24px",
42
- marginBottom: "24px",
43
- },
44
- highlightRow: {
45
- display: "flex",
46
- justifyContent: "space-between",
47
- marginBottom: "12px",
67
+ marginBottom: "28px",
48
68
  },
49
69
  highlightLabel: {
50
- fontSize: "14px",
51
- color: "rgba(15, 23, 42, 0.6)",
52
- margin: 0,
70
+ fontSize: "13px",
71
+ color: colors.textMuted,
72
+ margin: "0 0 4px",
53
73
  },
54
74
  highlightValue: {
55
75
  fontSize: "16px",
56
76
  fontWeight: 600,
57
- color: "#0F172A",
77
+ color: colors.white,
58
78
  margin: 0,
59
79
  },
60
80
  buttonContainer: {
61
81
  textAlign: "center",
62
- marginBottom: "24px",
82
+ marginBottom: "28px",
83
+ },
84
+ ctaButton: {
85
+ display: "inline-block",
86
+ padding: "14px 36px",
87
+ fontSize: "15px",
88
+ fontWeight: 600,
89
+ textDecoration: "none",
90
+ borderRadius: "10px",
91
+ backgroundColor: colors.primary,
92
+ color: "#ffffff",
93
+ textAlign: "center",
94
+ },
95
+ contentSection: {
96
+ backgroundColor: colors.cardBg,
97
+ padding: "32px",
98
+ borderTop: `1px solid ${colors.border}`,
63
99
  },
64
100
  smallText: {
65
101
  margin: "0 0 12px",
66
102
  fontSize: "14px",
67
103
  lineHeight: "1.6",
68
- color: "rgba(15, 23, 42, 0.6)",
104
+ color: colors.textMuted,
105
+ textAlign: "center",
106
+ },
107
+ notesText: {
108
+ margin: "0 0 24px",
109
+ fontSize: "15px",
110
+ lineHeight: "1.6",
111
+ color: colors.textSecondary,
112
+ textAlign: "center",
113
+ fontStyle: "italic",
69
114
  },
70
115
  link: {
71
- color: "#6366F1",
116
+ color: colors.primary,
72
117
  textDecoration: "none",
73
118
  fontWeight: 600,
74
119
  },
120
+ footer: {
121
+ backgroundColor: colors.cardBg,
122
+ padding: "24px 32px",
123
+ textAlign: "center",
124
+ borderTop: `1px solid ${colors.border}`,
125
+ },
126
+ footerLogo: {
127
+ display: "block",
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",
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",
154
+ },
155
+ badge: {
156
+ display: "inline-block",
157
+ margin: "0 8px",
158
+ },
75
159
  };
76
- export function PromoSubscriptionEmail({ email, planName, durationDays, credits, expiresAt, notes, }) {
160
+ export function PromoSubscriptionEmail({ email = "user@example.com", planName = "Pro", durationDays = 30, credits = 500, expiresAt = "January 31, 2025", notes, }) {
77
161
  const safeCredits = Number.isFinite(credits) ? Number(credits) : 0;
78
- return (_jsxs(Html, { lang: "en", children: [_jsx(Head, { children: _jsx(Font, { fontFamily: "Outfit", fallbackFontFamily: "Arial", webFont: {
79
- url: "https://fonts.gstatic.com/s/outfit/v11/QGYyz_MVcBeNP4NjuGObqx1XmO1I4TC1C4G-EiAou6Y.woff2",
80
- format: "woff2",
81
- }, fontWeight: 400, fontStyle: "normal" }) }), _jsx(Preview, { children: `You've received a ${durationDays}-day ${planName} subscription!` }), _jsx(Body, { style: styles.body, children: _jsxs(Container, { style: styles.container, children: [_jsx(Header, { logoUrl: modelfyConfig.logoUrl, logoAlt: "Modelfy", subtitle: "Gift for you" }), _jsxs(Section, { style: styles.content, children: [_jsx(Text, { style: styles.heading, children: "You've Got a Gift!" }), _jsxs(Text, { style: styles.paragraph, children: ["Hi ", _jsx("strong", { children: email }), ", great news! You've been granted a promotional", " ", _jsx("strong", { children: planName }), " subscription."] }), _jsx("div", { style: styles.highlightBox, children: _jsxs("table", { width: "100%", cellPadding: 0, cellSpacing: 0, children: [_jsxs("tr", { children: [_jsxs("td", { style: { paddingBottom: "12px" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Plan" }), _jsx(Text, { style: styles.highlightValue, children: planName })] }), _jsxs("td", { style: { paddingBottom: "12px", textAlign: "right" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Duration" }), _jsxs(Text, { style: styles.highlightValue, children: [durationDays, " days"] })] })] }), _jsxs("tr", { children: [_jsxs("td", { children: [_jsx(Text, { style: styles.highlightLabel, children: "Credits Included" }), _jsx(Text, { style: styles.highlightValue, children: safeCredits.toLocaleString() })] }), _jsxs("td", { style: { textAlign: "right" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Expires" }), _jsx(Text, { style: styles.highlightValue, children: expiresAt })] })] })] }) }), notes && (_jsx(Text, { style: styles.paragraph, children: _jsxs("em", { children: ["\"", notes, "\""] }) })), _jsx("div", { style: styles.buttonContainer, children: _jsx(Button, { href: modelfyConfig.appUrl, children: "Open Modelfy" }) }), _jsx(Text, { style: styles.smallText, children: "This promotional subscription will not auto-renew. Enjoy your free access!" }), _jsxs(Text, { style: styles.smallText, children: ["Questions? Contact us at", " ", _jsx(Link, { href: `mailto:${modelfyConfig.supportEmail}`, style: styles.link, children: modelfyConfig.supportEmail })] })] }), _jsx(Footer, { companyName: modelfyConfig.companyName, message: "You received this email because you were granted a promotional subscription.", supportEmail: modelfyConfig.supportEmail })] }) })] }));
162
+ return (_jsxs(Html, { lang: "en", children: [_jsxs(Head, { children: [_jsx(Font, { fontFamily: "Inter", fallbackFontFamily: "Arial", webFont: {
163
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_0.woff2",
164
+ format: "woff2",
165
+ }, fontWeight: 400, fontStyle: "normal" }), _jsx(Font, { fontFamily: "Inter", fallbackFontFamily: "Arial", webFont: {
166
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYAZ9hjp-Ek-_0.woff2",
167
+ format: "woff2",
168
+ }, fontWeight: 700, fontStyle: "normal" })] }), _jsx(Preview, { children: `You've received a ${durationDays}-day ${planName} subscription!` }), _jsx(Body, { style: styles.body, children: _jsxs(Container, { style: styles.container, children: [_jsx(Section, { style: styles.header, children: _jsx(Img, { src: modelfyConfig.logoUrl, width: "130", height: "auto", alt: "Modelfy", style: styles.logo }) }), _jsxs(Section, { style: styles.heroSection, children: [_jsx(Text, { style: styles.heroTagline, children: "Gift for You" }), _jsx(Text, { style: styles.heroHeading, children: "You've Got a Gift!" }), _jsxs(Text, { style: { ...styles.paragraph, margin: "0 0 4px" }, children: ["Hi ", _jsx("span", { style: { color: colors.white, fontWeight: 600 }, children: email }), ", great news!"] }), _jsxs(Text, { style: styles.paragraph, children: ["You've been granted a promotional", " ", _jsx("span", { style: { color: colors.accent, fontWeight: 600 }, children: planName }), " subscription."] }), _jsx("div", { style: styles.highlightBox, children: _jsx("table", { width: "100%", cellPadding: 0, cellSpacing: 0, children: _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsxs("td", { style: { paddingBottom: "16px" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Plan" }), _jsx(Text, { style: styles.highlightValue, children: planName })] }), _jsxs("td", { style: { paddingBottom: "16px", textAlign: "right" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Duration" }), _jsxs(Text, { style: styles.highlightValue, children: [durationDays, " days"] })] })] }), _jsxs("tr", { children: [_jsxs("td", { children: [_jsx(Text, { style: styles.highlightLabel, children: "Credits Included" }), _jsx(Text, { style: styles.highlightValue, children: safeCredits.toLocaleString() })] }), _jsxs("td", { style: { textAlign: "right" }, children: [_jsx(Text, { style: styles.highlightLabel, children: "Expires" }), _jsx(Text, { style: styles.highlightValue, children: expiresAt })] })] })] }) }) }), notes && _jsxs(Text, { style: styles.notesText, children: ["\"", notes, "\""] }), _jsx("div", { style: styles.buttonContainer, children: _jsx(ReactEmailButton, { href: modelfyConfig.appUrl, style: styles.ctaButton, children: "Open Modelfy" }) })] }), _jsxs(Section, { style: styles.contentSection, children: [_jsx(Text, { style: styles.smallText, children: "This promotional subscription will not auto-renew. Enjoy your free access!" }), _jsxs(Text, { style: styles.smallText, children: ["Questions?", " ", _jsx(Link, { href: `mailto:${modelfyConfig.supportEmail}`, style: styles.link, children: modelfyConfig.supportEmail })] })] }), _jsxs(Section, { style: styles.downloadSection, children: [_jsx(Text, { style: styles.downloadText, children: "Get the Modelfy app" }), _jsxs("div", { style: styles.badgeContainer, children: [_jsx(Link, { href: modelfyConfig.appStoreUrl, style: styles.badge, children: _jsx(Img, { src: modelfyConfig.appStoreBadgeUrl, width: "120", height: "40", alt: "Download on the App Store" }) }), _jsx(Link, { href: modelfyConfig.playStoreUrl, style: styles.badge, children: _jsx(Img, { src: modelfyConfig.playStoreBadgeUrl, width: "135", height: "40", alt: "Get it on Google Play" }) })] })] }), _jsxs(Section, { style: styles.footer, children: [_jsx(Img, { src: modelfyConfig.logoUrl, width: "80", height: "auto", alt: "Modelfy", style: styles.footerLogo }), _jsxs(Text, { style: styles.footerText, children: ["\u00A9 ", new Date().getFullYear(), " ", modelfyConfig.companyName, ". All rights reserved."] }), _jsx(Text, { style: styles.footerText, children: "You received this email because you were granted a promotional subscription." }), _jsx(Text, { style: styles.footerText, children: _jsx(Link, { href: `${modelfyConfig.appUrl}/privacy`, style: styles.footerLink, children: "Privacy Policy" }) })] })] }) })] }));
82
169
  }
83
170
  export default PromoSubscriptionEmail;
@@ -0,0 +1,6 @@
1
+ export interface WelcomeEmailProps {
2
+ email: string;
3
+ }
4
+ export declare function WelcomeEmail({ email }: WelcomeEmailProps): import("react/jsx-runtime").JSX.Element;
5
+ export default WelcomeEmail;
6
+ //# sourceMappingURL=WelcomeEmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeEmail.d.ts","sourceRoot":"","sources":["../../../src/modelfy/templates/WelcomeEmail.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAwVD,wBAAgB,YAAY,CAAC,EAAE,KAA0B,EAAE,EAAE,iBAAiB,2CA+P7E;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,377 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Html, Head, Body, Container, Section, Text, Link, Preview, Font, Img, Button as ReactEmailButton, } from "@react-email/components";
3
+ import { modelfyConfig } from "../config.js";
4
+ // Design System Colors - Matching Modelfy Landing
5
+ const colors = {
6
+ background: "#0d0d0d",
7
+ cardBg: "#121212",
8
+ primary: "#0a8f5a",
9
+ primaryLight: "#10b981",
10
+ accent: "#f59e0b",
11
+ accentDark: "#d97706",
12
+ white: "#f2f2f2",
13
+ textSecondary: "rgba(242, 242, 242, 0.7)",
14
+ textMuted: "#8c8c8c",
15
+ border: "#262626",
16
+ };
17
+ const styles = {
18
+ body: {
19
+ margin: 0,
20
+ padding: 0,
21
+ backgroundColor: colors.background,
22
+ fontFamily: "'Inter', 'Segoe UI', Arial, sans-serif",
23
+ },
24
+ container: {
25
+ maxWidth: "600px",
26
+ margin: "0 auto",
27
+ backgroundColor: colors.background,
28
+ },
29
+ header: {
30
+ backgroundColor: colors.background,
31
+ padding: "40px 32px 24px",
32
+ textAlign: "center",
33
+ },
34
+ logo: {
35
+ display: "block",
36
+ margin: "0 auto",
37
+ },
38
+ heroSection: {
39
+ padding: "24px 32px 40px",
40
+ textAlign: "center",
41
+ },
42
+ heroTagline: {
43
+ margin: "0 0 12px",
44
+ fontSize: "13px",
45
+ fontWeight: 600,
46
+ color: colors.primary,
47
+ letterSpacing: "2px",
48
+ textTransform: "uppercase",
49
+ },
50
+ heroHeading: {
51
+ margin: "0 0 16px",
52
+ fontSize: "28px",
53
+ fontWeight: 700,
54
+ color: colors.white,
55
+ lineHeight: "1.3",
56
+ },
57
+ heroSubheading: {
58
+ margin: "0 0 28px",
59
+ fontSize: "16px",
60
+ lineHeight: "1.6",
61
+ color: colors.textSecondary,
62
+ },
63
+ heroCta: {
64
+ display: "inline-block",
65
+ padding: "14px 36px",
66
+ fontSize: "15px",
67
+ fontWeight: 600,
68
+ textDecoration: "none",
69
+ borderRadius: "10px",
70
+ backgroundColor: colors.primary,
71
+ color: "#ffffff",
72
+ textAlign: "center",
73
+ },
74
+ welcomeSection: {
75
+ backgroundColor: colors.cardBg,
76
+ padding: "32px",
77
+ textAlign: "center",
78
+ borderTop: `1px solid ${colors.border}`,
79
+ borderBottom: `1px solid ${colors.border}`,
80
+ },
81
+ welcomeText: {
82
+ margin: "0 0 16px",
83
+ fontSize: "16px",
84
+ lineHeight: "1.6",
85
+ color: colors.textSecondary,
86
+ },
87
+ welcomeEmail: {
88
+ color: colors.white,
89
+ fontWeight: 600,
90
+ },
91
+ creditsBox: {
92
+ display: "inline-block",
93
+ backgroundColor: "rgba(10, 143, 90, 0.15)",
94
+ border: `1px solid rgba(10, 143, 90, 0.3)`,
95
+ borderRadius: "8px",
96
+ padding: "10px 20px",
97
+ },
98
+ creditsText: {
99
+ margin: 0,
100
+ fontSize: "14px",
101
+ color: colors.white,
102
+ fontWeight: 600,
103
+ },
104
+ featuresSection: {
105
+ backgroundColor: colors.background,
106
+ padding: "40px 24px",
107
+ },
108
+ featuresSectionTitle: {
109
+ margin: "0 0 8px",
110
+ fontSize: "12px",
111
+ fontWeight: 600,
112
+ color: colors.primary,
113
+ letterSpacing: "2px",
114
+ textTransform: "uppercase",
115
+ textAlign: "center",
116
+ },
117
+ featuresSectionHeading: {
118
+ margin: "0 0 32px",
119
+ fontSize: "22px",
120
+ fontWeight: 700,
121
+ color: colors.white,
122
+ textAlign: "center",
123
+ lineHeight: "1.4",
124
+ },
125
+ goldenGradient: {
126
+ background: "linear-gradient(135deg, #f59e0b, #d97706)",
127
+ WebkitBackgroundClip: "text",
128
+ WebkitTextFillColor: "transparent",
129
+ backgroundClip: "text",
130
+ },
131
+ featureRow: {
132
+ marginBottom: "20px",
133
+ backgroundColor: colors.cardBg,
134
+ borderRadius: "12px",
135
+ overflow: "hidden",
136
+ border: `1px solid ${colors.border}`,
137
+ },
138
+ featureImage: {
139
+ width: "100%",
140
+ height: "auto",
141
+ display: "block",
142
+ },
143
+ featureContent: {
144
+ padding: "20px",
145
+ verticalAlign: "middle",
146
+ },
147
+ featureEyebrow: {
148
+ margin: "0 0 6px",
149
+ fontSize: "11px",
150
+ fontWeight: 600,
151
+ color: colors.primary,
152
+ letterSpacing: "1.5px",
153
+ textTransform: "uppercase",
154
+ },
155
+ featureTitle: {
156
+ margin: "0 0 8px",
157
+ fontSize: "18px",
158
+ fontWeight: 700,
159
+ color: colors.white,
160
+ lineHeight: "1.2",
161
+ },
162
+ featureTitleHighlight: {
163
+ color: colors.primary,
164
+ },
165
+ featureDescription: {
166
+ margin: 0,
167
+ fontSize: "13px",
168
+ lineHeight: "1.5",
169
+ color: colors.textMuted,
170
+ },
171
+ ctaSection: {
172
+ backgroundColor: colors.cardBg,
173
+ padding: "40px 32px",
174
+ textAlign: "center",
175
+ borderTop: `1px solid ${colors.border}`,
176
+ },
177
+ ctaHeading: {
178
+ margin: "0 0 12px",
179
+ fontSize: "22px",
180
+ fontWeight: 700,
181
+ color: colors.white,
182
+ },
183
+ ctaSubheading: {
184
+ margin: "0 0 24px",
185
+ fontSize: "15px",
186
+ color: colors.textSecondary,
187
+ },
188
+ ctaButton: {
189
+ display: "inline-block",
190
+ padding: "16px 48px",
191
+ fontSize: "15px",
192
+ fontWeight: 600,
193
+ textDecoration: "none",
194
+ borderRadius: "10px",
195
+ backgroundColor: colors.primary,
196
+ color: "#ffffff",
197
+ textAlign: "center",
198
+ },
199
+ supportSection: {
200
+ backgroundColor: colors.background,
201
+ padding: "32px",
202
+ textAlign: "center",
203
+ },
204
+ supportText: {
205
+ margin: "0 0 4px",
206
+ fontSize: "13px",
207
+ color: colors.textMuted,
208
+ },
209
+ supportLink: {
210
+ color: colors.primary,
211
+ textDecoration: "none",
212
+ fontWeight: 600,
213
+ },
214
+ footer: {
215
+ backgroundColor: colors.cardBg,
216
+ padding: "24px 32px",
217
+ textAlign: "center",
218
+ borderTop: `1px solid ${colors.border}`,
219
+ },
220
+ footerLogo: {
221
+ display: "block",
222
+ margin: "0 auto 12px",
223
+ opacity: 0.6,
224
+ },
225
+ footerText: {
226
+ margin: "0 0 4px",
227
+ fontSize: "11px",
228
+ color: colors.textMuted,
229
+ lineHeight: "1.6",
230
+ },
231
+ footerLink: {
232
+ color: colors.textMuted,
233
+ textDecoration: "underline",
234
+ },
235
+ downloadSection: {
236
+ backgroundColor: colors.cardBg,
237
+ padding: "24px 32px",
238
+ textAlign: "center",
239
+ borderTop: `1px solid ${colors.border}`,
240
+ },
241
+ downloadText: {
242
+ margin: "0 0 16px",
243
+ fontSize: "14px",
244
+ color: colors.white,
245
+ },
246
+ badgeContainer: {
247
+ textAlign: "center",
248
+ },
249
+ badge: {
250
+ display: "inline-block",
251
+ margin: "0 8px",
252
+ },
253
+ };
254
+ // Image pools for random selection
255
+ const campaignImages = Array.from({ length: 33 }, (_, i) => `https://bucket.modelfy.ai/app-media/campaign/campaign${i + 1}.jpeg`);
256
+ const campaignProImages = Array.from({ length: 15 }, (_, i) => `https://bucket.modelfy.ai/app-media/campaign-pro/campaign-pro-${i + 1}.jpg`);
257
+ const colorSwapImages = Array.from({ length: 10 }, (_, i) => `https://modelfy.ai/images/color-swap/studio-color-change${i + 1}.jpg`);
258
+ const modelImages = [
259
+ "https://modelfy.ai/images/result-model-1.jpg",
260
+ "https://modelfy.ai/images/result-model-2.jpg",
261
+ "https://modelfy.ai/images/result-model-3.jpg",
262
+ ];
263
+ function getRandomImage(images) {
264
+ return images[Math.floor(Math.random() * images.length)];
265
+ }
266
+ const features = [
267
+ {
268
+ eyebrow: "AI MODELS",
269
+ titleBefore: "Create your own",
270
+ titleHighlight: "AI Models",
271
+ titleAfter: "",
272
+ description: "Build custom AI models that capture your brand's unique aesthetic. Train once, use across every campaign.",
273
+ getImage: () => getRandomImage(modelImages),
274
+ isVideo: false,
275
+ },
276
+ {
277
+ eyebrow: "CAMPAIGNS",
278
+ titleBefore: "Professional",
279
+ titleHighlight: "Campaign",
280
+ titleAfter: "Photography",
281
+ description: "Place your products in any scene imaginable. Rooftop nights, city streets, beach sunsets, or fully custom environments.",
282
+ getImage: () => getRandomImage(campaignImages),
283
+ isVideo: false,
284
+ },
285
+ {
286
+ eyebrow: "STUDIO",
287
+ titleBefore: "Studio-Quality",
288
+ titleHighlight: "Product",
289
+ titleAfter: "Shots",
290
+ description: "Clean backgrounds, perfect lighting. E-commerce ready in seconds.",
291
+ getImage: () => getRandomImage(campaignProImages),
292
+ isVideo: false,
293
+ },
294
+ {
295
+ eyebrow: "COLOR SWAP",
296
+ titleBefore: "Instant",
297
+ titleHighlight: "Color",
298
+ titleAfter: "Variations",
299
+ description: "Generate every color variant your product comes in. One shoot, unlimited colors.",
300
+ getImage: () => getRandomImage(colorSwapImages),
301
+ isVideo: false,
302
+ },
303
+ {
304
+ eyebrow: "VIDEO",
305
+ titleBefore: "Create",
306
+ titleHighlight: "Videos",
307
+ titleAfter: "with Audio",
308
+ description: "Create stunning product videos with AI-generated audio, music, and voiceovers.",
309
+ getImage: () => getRandomImage(campaignImages),
310
+ isVideo: true,
311
+ videoLink: "https://modelfy.ai/#features",
312
+ },
313
+ {
314
+ eyebrow: "SUBTITLES",
315
+ titleBefore: "Auto-Generate",
316
+ titleHighlight: "Subtitles",
317
+ titleAfter: "",
318
+ description: "Auto-generate customizable subtitles for social media videos. Upload, generate, customize, download.",
319
+ getImage: () => "https://bucket.modelfy.ai/app-media/emails/subtitles.png",
320
+ isVideo: false,
321
+ },
322
+ {
323
+ eyebrow: "EXPORT",
324
+ titleBefore: "Every",
325
+ titleHighlight: "Format",
326
+ titleAfter: "You Need",
327
+ description: "Stories, Reels, Posts, Square, Landscape, Portrait. Up to 4K resolution.",
328
+ getImage: () => getRandomImage(campaignProImages),
329
+ isVideo: false,
330
+ },
331
+ ];
332
+ export function WelcomeEmail({ email = "user@example.com" }) {
333
+ return (_jsxs(Html, { lang: "en", children: [_jsxs(Head, { children: [_jsx(Font, { fontFamily: "Inter", fallbackFontFamily: "Arial", webFont: {
334
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuLyfAZ9hjp-Ek-_0.woff2",
335
+ format: "woff2",
336
+ }, fontWeight: 400, fontStyle: "normal" }), _jsx(Font, { fontFamily: "Inter", fallbackFontFamily: "Arial", webFont: {
337
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuI6fAZ9hjp-Ek-_0.woff2",
338
+ format: "woff2",
339
+ }, fontWeight: 600, fontStyle: "normal" }), _jsx(Font, { fontFamily: "Inter", fallbackFontFamily: "Arial", webFont: {
340
+ url: "https://fonts.gstatic.com/s/inter/v13/UcCO3FwrK3iLTeHuS_fvQtMwCp50KnMw2boKoduKmMEVuFuYAZ9hjp-Ek-_0.woff2",
341
+ format: "woff2",
342
+ }, fontWeight: 700, fontStyle: "normal" })] }), _jsx(Preview, { children: "Welcome to Modelfy - Transform your product photography with AI" }), _jsx(Body, { style: styles.body, children: _jsxs(Container, { style: styles.container, children: [_jsx(Section, { style: styles.header, children: _jsx(Img, { src: modelfyConfig.logoUrl, width: "130", height: "auto", alt: "Modelfy", style: styles.logo }) }), _jsxs(Section, { style: styles.heroSection, children: [_jsx(Text, { style: styles.heroTagline, children: "Welcome to Modelfy" }), _jsx(Text, { style: styles.heroHeading, children: "Turn Your Product Photos Into Endless Professional Content" }), _jsxs(Text, { style: styles.heroSubheading, children: ["From one product photo to AI-powered professional campaigns, lifestyle content, and social posts.", " ", _jsx("span", { style: { color: colors.white }, children: "No photographers, no models, no reshoots." })] }), _jsx(ReactEmailButton, { href: modelfyConfig.appUrl, style: styles.heroCta, children: "Start Creating" })] }), _jsxs(Section, { style: styles.welcomeSection, children: [_jsxs(Text, { style: styles.welcomeText, children: ["Hi ", _jsx("span", { style: styles.welcomeEmail, children: email }), ", your account is ready.", _jsx("br", {}), "You now have access to the complete Modelfy platform."] }), _jsx("div", { style: styles.creditsBox, children: _jsx(Text, { style: styles.creditsText, children: "2 Free Generations Included" }) })] }), _jsxs(Section, { style: styles.featuresSection, children: [_jsx(Text, { style: styles.featuresSectionTitle, children: "Features" }), _jsxs(Text, { style: styles.featuresSectionHeading, children: ["Everything you need to create", " ", _jsx("span", { style: { color: colors.accent }, children: "stunning" }), " ", "marketing, social, and e-commerce content"] }), features.map((feature, index) => {
343
+ const isReversed = index % 2 === 1;
344
+ const imageContent = feature.isVideo ? (_jsx(Link, { href: feature.videoLink || modelfyConfig.appUrl, style: { display: "block", position: "relative" }, children: _jsxs("div", { style: { position: "relative" }, children: [_jsx(Img, { src: feature.getImage(), alt: feature.titleHighlight, width: "100%", style: {
345
+ ...styles.featureImage,
346
+ aspectRatio: "3/4",
347
+ objectFit: "cover",
348
+ } }), _jsx("div", { style: {
349
+ position: "absolute",
350
+ top: "50%",
351
+ left: "50%",
352
+ transform: "translate(-50%, -50%)",
353
+ width: "60px",
354
+ height: "60px",
355
+ backgroundColor: "rgba(0, 0, 0, 0.7)",
356
+ borderRadius: "50%",
357
+ display: "flex",
358
+ alignItems: "center",
359
+ justifyContent: "center",
360
+ }, children: _jsx("div", { style: {
361
+ width: "0",
362
+ height: "0",
363
+ borderTop: "12px solid transparent",
364
+ borderBottom: "12px solid transparent",
365
+ borderLeft: "20px solid white",
366
+ marginLeft: "4px",
367
+ } }) })] }) })) : (_jsx(Img, { src: feature.getImage(), alt: feature.titleHighlight, width: "100%", style: {
368
+ ...styles.featureImage,
369
+ aspectRatio: "3/4",
370
+ objectFit: "cover",
371
+ } }));
372
+ const imageCell = (_jsx("td", { style: { width: "45%", verticalAlign: "top" }, children: imageContent }));
373
+ const contentCell = (_jsxs("td", { style: { ...styles.featureContent, width: "55%" }, children: [_jsx(Text, { style: styles.featureEyebrow, children: feature.eyebrow }), _jsxs(Text, { style: styles.featureTitle, children: [feature.titleBefore, " ", _jsx("span", { style: styles.featureTitleHighlight, children: feature.titleHighlight }), feature.titleAfter && ` ${feature.titleAfter}`] }), _jsx(Text, { style: styles.featureDescription, children: feature.description })] }));
374
+ return (_jsx("div", { style: styles.featureRow, children: _jsx("table", { cellPadding: 0, cellSpacing: 0, style: { width: "100%" }, children: _jsx("tbody", { children: _jsx("tr", { children: isReversed ? (_jsxs(_Fragment, { children: [contentCell, imageCell] })) : (_jsxs(_Fragment, { children: [imageCell, contentCell] })) }) }) }) }, index));
375
+ })] }), _jsxs(Section, { style: styles.ctaSection, children: [_jsx(Text, { style: styles.ctaHeading, children: "Ready to Transform Your Content?" }), _jsx(Text, { style: styles.ctaSubheading, children: "Upload your first product photo and see the magic happen." }), _jsx(ReactEmailButton, { href: modelfyConfig.appUrl, style: styles.ctaButton, children: "Get Started Free" })] }), _jsxs(Section, { style: styles.supportSection, children: [_jsx(Text, { style: styles.supportText, children: "Need help getting started?" }), _jsx(Text, { style: styles.supportText, children: _jsx(Link, { href: `mailto:${modelfyConfig.supportEmail}`, style: styles.supportLink, children: modelfyConfig.supportEmail }) })] }), _jsxs(Section, { style: styles.downloadSection, children: [_jsx(Text, { style: styles.downloadText, children: "Get the Modelfy app" }), _jsxs("div", { style: styles.badgeContainer, children: [_jsx(Link, { href: modelfyConfig.appStoreUrl, style: styles.badge, children: _jsx(Img, { src: modelfyConfig.appStoreBadgeUrl, width: "120", height: "40", alt: "Download on the App Store" }) }), _jsx(Link, { href: modelfyConfig.playStoreUrl, style: styles.badge, children: _jsx(Img, { src: modelfyConfig.playStoreBadgeUrl, width: "135", height: "40", alt: "Get it on Google Play" }) })] })] }), _jsxs(Section, { style: styles.footer, children: [_jsx(Img, { src: modelfyConfig.logoUrl, width: "80", height: "auto", alt: "Modelfy", style: styles.footerLogo }), _jsxs(Text, { style: styles.footerText, children: ["\u00A9 ", new Date().getFullYear(), " ", modelfyConfig.companyName, ". All rights reserved."] }), _jsx(Text, { style: styles.footerText, children: "You received this email because you signed up for Modelfy." }), _jsx(Text, { style: styles.footerText, children: _jsx(Link, { href: `${modelfyConfig.appUrl}/privacy`, style: styles.footerLink, children: "Privacy Policy" }) })] })] }) })] }));
376
+ }
377
+ export default WelcomeEmail;
@@ -1,4 +1,5 @@
1
1
  export { OtpEmail, type OtpEmailProps } from "./OtpEmail.js";
2
2
  export { PromoSubscriptionEmail, type PromoSubscriptionEmailProps } from "./PromoSubscriptionEmail.js";
3
3
  export { GrantCreditsEmail, type GrantCreditsEmailProps } from "./GrantCreditsEmail.js";
4
+ export { WelcomeEmail, type WelcomeEmailProps } from "./WelcomeEmail.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modelfy/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modelfy/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { OtpEmail } from "./OtpEmail.js";
2
2
  export { PromoSubscriptionEmail } from "./PromoSubscriptionEmail.js";
3
3
  export { GrantCreditsEmail } from "./GrantCreditsEmail.js";
4
+ export { WelcomeEmail } from "./WelcomeEmail.js";
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "brookmind-emails",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "Email templates for Brookmind projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "require": "./dist/index.js",
10
11
  "import": "./dist/index.js",
11
12
  "types": "./dist/index.d.ts"
12
13
  },
13
14
  "./modelfy": {
15
+ "require": "./dist/modelfy/index.js",
14
16
  "import": "./dist/modelfy/index.js",
15
17
  "types": "./dist/modelfy/index.d.ts"
16
18
  }
@@ -3,4 +3,10 @@ export const modelfyConfig = {
3
3
  companyName: "Modelfy",
4
4
  supportEmail: "support@modelfy.ai",
5
5
  appUrl: "https://modelfy.ai",
6
+ // App Store links
7
+ appStoreUrl: "https://apps.apple.com/app/id6753621155",
8
+ playStoreUrl: "https://play.google.com/store/apps/details?id=com.brookmind.modelfy",
9
+ // Badge images (using landing page assets)
10
+ appStoreBadgeUrl: "https://modelfy.ai/images/appstore.svg",
11
+ playStoreBadgeUrl: "https://modelfy.ai/images/googleplay.svg",
6
12
  };