@rovela-ai/sdk 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/api/emails.d.ts +17 -0
- package/dist/admin/api/emails.d.ts.map +1 -0
- package/dist/admin/api/emails.js +214 -0
- package/dist/admin/api/emails.js.map +1 -0
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +1 -0
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/EmailsManager.d.ts +5 -0
- package/dist/admin/components/EmailsManager.d.ts.map +1 -0
- package/dist/admin/components/EmailsManager.js +306 -0
- package/dist/admin/components/EmailsManager.js.map +1 -0
- package/dist/admin/components/index.d.ts +2 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +1 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +26 -3
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +124 -0
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +173 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +22 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/emails/config.d.ts.map +1 -1
- package/dist/emails/config.js +5 -0
- package/dist/emails/config.js.map +1 -1
- package/dist/emails/index.d.ts +6 -0
- package/dist/emails/index.d.ts.map +1 -1
- package/dist/emails/index.js +4 -0
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/overrides.d.ts +40 -0
- package/dist/emails/overrides.d.ts.map +1 -0
- package/dist/emails/overrides.js +70 -0
- package/dist/emails/overrides.js.map +1 -0
- package/dist/emails/registry.d.ts +40 -0
- package/dist/emails/registry.d.ts.map +1 -0
- package/dist/emails/registry.js +270 -0
- package/dist/emails/registry.js.map +1 -0
- package/dist/emails/send/auth.d.ts.map +1 -1
- package/dist/emails/send/auth.js +38 -3
- package/dist/emails/send/auth.js.map +1 -1
- package/dist/emails/send/orders.d.ts.map +1 -1
- package/dist/emails/send/orders.js +86 -6
- package/dist/emails/send/orders.js.map +1 -1
- package/dist/emails/templates/base.d.ts +30 -12
- package/dist/emails/templates/base.d.ts.map +1 -1
- package/dist/emails/templates/base.js +51 -8
- package/dist/emails/templates/base.js.map +1 -1
- package/dist/emails/theme.d.ts +65 -0
- package/dist/emails/theme.d.ts.map +1 -0
- package/dist/emails/theme.js +173 -0
- package/dist/emails/theme.js.map +1 -0
- package/dist/emails/types.d.ts +2 -0
- package/dist/emails/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Send functions for order-related emails.
|
|
5
5
|
*/
|
|
6
6
|
import { sendEmail } from '../sender';
|
|
7
|
+
import { prepareEmail, applyEmailVars } from '../overrides';
|
|
8
|
+
import { getEmailRegistryEntry } from '../registry';
|
|
7
9
|
import { getEmailConfig, getStoreName } from '../config';
|
|
8
10
|
import { renderOrderConfirmation, getOrderConfirmationSubject, renderOrderShipped, getOrderShippedSubject, renderOrderReadyForPickup, getOrderReadyForPickupSubject, renderOrderDelivered, getOrderDeliveredSubject, renderOrderCancelled, getOrderCancelledSubject, renderRefundProcessed, getRefundProcessedSubject, } from '../templates';
|
|
9
11
|
/** Templates prefix '#' themselves — strip any caller-supplied hash so
|
|
@@ -39,6 +41,13 @@ export async function sendOrderConfirmation(params) {
|
|
|
39
41
|
getEmailConfig(),
|
|
40
42
|
getStoreName(),
|
|
41
43
|
]);
|
|
44
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
45
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
46
|
+
const prep = await prepareEmail('order-confirmation', params.locale, getEmailRegistryEntry('order-confirmation')?.canDisable ?? false);
|
|
47
|
+
if (!prep.enabled) {
|
|
48
|
+
console.log('[Email] order-confirmation disabled in admin — skipped for:', params.to);
|
|
49
|
+
return { success: true, skipped: true };
|
|
50
|
+
}
|
|
42
51
|
const html = renderOrderConfirmation({
|
|
43
52
|
config,
|
|
44
53
|
pickup: params.pickup,
|
|
@@ -62,7 +71,13 @@ export async function sendOrderConfirmation(params) {
|
|
|
62
71
|
return sendEmail({
|
|
63
72
|
locale: params.locale,
|
|
64
73
|
to: params.to,
|
|
65
|
-
subject:
|
|
74
|
+
subject: prep.subjectOverride
|
|
75
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
76
|
+
storeName,
|
|
77
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
78
|
+
customerName: params.customerName,
|
|
79
|
+
})
|
|
80
|
+
: getOrderConfirmationSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
66
81
|
html,
|
|
67
82
|
});
|
|
68
83
|
}
|
|
@@ -99,6 +114,13 @@ export async function sendOrderShipped(params) {
|
|
|
99
114
|
getEmailConfig(),
|
|
100
115
|
getStoreName(),
|
|
101
116
|
]);
|
|
117
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
118
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
119
|
+
const prep = await prepareEmail('order-shipped', params.locale, getEmailRegistryEntry('order-shipped')?.canDisable ?? false);
|
|
120
|
+
if (!prep.enabled) {
|
|
121
|
+
console.log('[Email] order-shipped disabled in admin — skipped for:', params.to);
|
|
122
|
+
return { success: true, skipped: true };
|
|
123
|
+
}
|
|
102
124
|
const html = renderOrderShipped({
|
|
103
125
|
config,
|
|
104
126
|
customerName: params.customerName,
|
|
@@ -113,7 +135,13 @@ export async function sendOrderShipped(params) {
|
|
|
113
135
|
return sendEmail({
|
|
114
136
|
locale: params.locale,
|
|
115
137
|
to: params.to,
|
|
116
|
-
subject:
|
|
138
|
+
subject: prep.subjectOverride
|
|
139
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
140
|
+
storeName,
|
|
141
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
142
|
+
customerName: params.customerName,
|
|
143
|
+
})
|
|
144
|
+
: getOrderShippedSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
117
145
|
html,
|
|
118
146
|
});
|
|
119
147
|
}
|
|
@@ -134,6 +162,13 @@ export async function sendOrderReadyForPickup(params) {
|
|
|
134
162
|
getEmailConfig(),
|
|
135
163
|
getStoreName(),
|
|
136
164
|
]);
|
|
165
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
166
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
167
|
+
const prep = await prepareEmail('order-ready-for-pickup', params.locale, getEmailRegistryEntry('order-ready-for-pickup')?.canDisable ?? false);
|
|
168
|
+
if (!prep.enabled) {
|
|
169
|
+
console.log('[Email] order-ready-for-pickup disabled in admin — skipped for:', params.to);
|
|
170
|
+
return { success: true, skipped: true };
|
|
171
|
+
}
|
|
137
172
|
const html = renderOrderReadyForPickup({
|
|
138
173
|
config,
|
|
139
174
|
customerName: params.customerName,
|
|
@@ -149,7 +184,13 @@ export async function sendOrderReadyForPickup(params) {
|
|
|
149
184
|
return sendEmail({
|
|
150
185
|
locale: params.locale,
|
|
151
186
|
to: params.to,
|
|
152
|
-
subject:
|
|
187
|
+
subject: prep.subjectOverride
|
|
188
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
189
|
+
storeName,
|
|
190
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
191
|
+
customerName: params.customerName,
|
|
192
|
+
})
|
|
193
|
+
: getOrderReadyForPickupSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
153
194
|
html,
|
|
154
195
|
});
|
|
155
196
|
}
|
|
@@ -179,6 +220,13 @@ export async function sendOrderDelivered(params) {
|
|
|
179
220
|
getEmailConfig(),
|
|
180
221
|
getStoreName(),
|
|
181
222
|
]);
|
|
223
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
224
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
225
|
+
const prep = await prepareEmail('order-delivered', params.locale, getEmailRegistryEntry('order-delivered')?.canDisable ?? false);
|
|
226
|
+
if (!prep.enabled) {
|
|
227
|
+
console.log('[Email] order-delivered disabled in admin — skipped for:', params.to);
|
|
228
|
+
return { success: true, skipped: true };
|
|
229
|
+
}
|
|
182
230
|
const html = renderOrderDelivered({
|
|
183
231
|
config,
|
|
184
232
|
customerName: params.customerName,
|
|
@@ -193,7 +241,13 @@ export async function sendOrderDelivered(params) {
|
|
|
193
241
|
return sendEmail({
|
|
194
242
|
locale: params.locale,
|
|
195
243
|
to: params.to,
|
|
196
|
-
subject:
|
|
244
|
+
subject: prep.subjectOverride
|
|
245
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
246
|
+
storeName,
|
|
247
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
248
|
+
customerName: params.customerName,
|
|
249
|
+
})
|
|
250
|
+
: getOrderDeliveredSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
197
251
|
html,
|
|
198
252
|
});
|
|
199
253
|
}
|
|
@@ -227,6 +281,13 @@ export async function sendOrderCancelled(params) {
|
|
|
227
281
|
getEmailConfig(),
|
|
228
282
|
getStoreName(),
|
|
229
283
|
]);
|
|
284
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
285
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
286
|
+
const prep = await prepareEmail('order-cancelled', params.locale, getEmailRegistryEntry('order-cancelled')?.canDisable ?? false);
|
|
287
|
+
if (!prep.enabled) {
|
|
288
|
+
console.log('[Email] order-cancelled disabled in admin — skipped for:', params.to);
|
|
289
|
+
return { success: true, skipped: true };
|
|
290
|
+
}
|
|
230
291
|
const html = renderOrderCancelled({
|
|
231
292
|
config,
|
|
232
293
|
customerName: params.customerName,
|
|
@@ -239,7 +300,13 @@ export async function sendOrderCancelled(params) {
|
|
|
239
300
|
return sendEmail({
|
|
240
301
|
locale: params.locale,
|
|
241
302
|
to: params.to,
|
|
242
|
-
subject:
|
|
303
|
+
subject: prep.subjectOverride
|
|
304
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
305
|
+
storeName,
|
|
306
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
307
|
+
customerName: params.customerName,
|
|
308
|
+
})
|
|
309
|
+
: getOrderCancelledSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
243
310
|
html,
|
|
244
311
|
});
|
|
245
312
|
}
|
|
@@ -275,6 +342,13 @@ export async function sendRefundProcessed(params) {
|
|
|
275
342
|
getEmailConfig(),
|
|
276
343
|
getStoreName(),
|
|
277
344
|
]);
|
|
345
|
+
// Phase D — merchant customization (theme applies via getEmailConfig;
|
|
346
|
+
// prepareEmail stages intro/outro + resolves the subject override).
|
|
347
|
+
const prep = await prepareEmail('refund-processed', params.locale, getEmailRegistryEntry('refund-processed')?.canDisable ?? false);
|
|
348
|
+
if (!prep.enabled) {
|
|
349
|
+
console.log('[Email] refund-processed disabled in admin — skipped for:', params.to);
|
|
350
|
+
return { success: true, skipped: true };
|
|
351
|
+
}
|
|
278
352
|
const html = renderRefundProcessed({
|
|
279
353
|
config,
|
|
280
354
|
customerName: params.customerName,
|
|
@@ -289,7 +363,13 @@ export async function sendRefundProcessed(params) {
|
|
|
289
363
|
return sendEmail({
|
|
290
364
|
locale: params.locale,
|
|
291
365
|
to: params.to,
|
|
292
|
-
subject:
|
|
366
|
+
subject: prep.subjectOverride
|
|
367
|
+
? applyEmailVars(prep.subjectOverride, {
|
|
368
|
+
storeName,
|
|
369
|
+
orderNumber: bareOrderNumber(params.orderNumber),
|
|
370
|
+
customerName: params.customerName,
|
|
371
|
+
})
|
|
372
|
+
: getRefundProcessedSubject(storeName, bareOrderNumber(params.orderNumber)),
|
|
293
373
|
html,
|
|
294
374
|
});
|
|
295
375
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/emails/send/orders.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxD,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC7B,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAErB;wCACwC;AACxC,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAC7B,CAAC;AAiCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAmC;IAEnC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5C,cAAc,EAAE;QAChB,YAAY,EAAE;KACf,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACnC,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa,EAAE,MAAM,CAAC,EAAE;QACxB,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC;QAChD,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;KAChD,CAAC,CAAA;IAEF,OAAO,SAAS,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,2BAA2B,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/emails/send/orders.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,23 +8,41 @@
|
|
|
8
8
|
* Email clients have limited CSS support, so we use reliable fallback colors.
|
|
9
9
|
*/
|
|
10
10
|
import type { EmailConfig } from '../types';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
export interface EmailStyles {
|
|
12
|
+
fontFamily: string;
|
|
13
|
+
fontName: string;
|
|
14
|
+
backgroundColor: string;
|
|
15
|
+
cardBackground: string;
|
|
16
|
+
cardBorder: string;
|
|
17
|
+
footerBackground: string;
|
|
18
|
+
primaryColor: string;
|
|
19
|
+
textPrimary: string;
|
|
20
|
+
textSecondary: string;
|
|
21
|
+
textMuted: string;
|
|
22
|
+
/** Button corner radius (px value with unit, e.g. '12px' | '9999px'). */
|
|
23
|
+
buttonRadius: string;
|
|
24
|
+
/** Outer card corner radius. */
|
|
25
|
+
cardRadius: string;
|
|
26
|
+
/** Extra merchant footer line (legal, tagline) — empty = omitted. */
|
|
27
|
+
footerNote: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const DEFAULT_EMAIL_STYLES: EmailStyles;
|
|
30
|
+
/**
|
|
31
|
+
* The ACTIVE styles every template + helper reads. Mutable on purpose:
|
|
32
|
+
* branch-per-store means one store per process, so the email theme is
|
|
33
|
+
* process-global by construction. `applyEmailStyles` (emails/theme.ts)
|
|
34
|
+
* Object.assigns the store's resolved brand theme over these before each
|
|
35
|
+
* render — the 11 templates and 14 helpers below need zero changes.
|
|
36
|
+
*/
|
|
37
|
+
declare const STYLES: EmailStyles;
|
|
38
|
+
/** Overwrite the active styles in place (imports keep the same reference). */
|
|
39
|
+
export declare function setEmailStyles(next: Partial<EmailStyles>): void;
|
|
23
40
|
export interface BaseLayoutOptions {
|
|
24
41
|
config: EmailConfig;
|
|
25
42
|
title: string;
|
|
26
43
|
content: string;
|
|
27
44
|
}
|
|
45
|
+
export declare function setEmailCustomBlocks(intro: string | null, outro: string | null): void;
|
|
28
46
|
/**
|
|
29
47
|
* Wrap email content in the base layout.
|
|
30
48
|
* All email templates should use this function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/emails/templates/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AA4D3C,QAAA,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/emails/templates/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,10 +54,7 @@ function hexToRgba(hex, opacity) {
|
|
|
54
54
|
const b = parseInt(result[3], 16);
|
|
55
55
|
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
// Styles
|
|
59
|
-
// =============================================================================
|
|
60
|
-
const STYLES = {
|
|
57
|
+
export const DEFAULT_EMAIL_STYLES = {
|
|
61
58
|
fontFamily: THEME.fontFamily,
|
|
62
59
|
fontName: THEME.fontName,
|
|
63
60
|
backgroundColor: '#F7F7F7',
|
|
@@ -68,7 +65,22 @@ const STYLES = {
|
|
|
68
65
|
textPrimary: THEME.colors.neutral900,
|
|
69
66
|
textSecondary: THEME.colors.neutral500,
|
|
70
67
|
textMuted: THEME.colors.neutral800,
|
|
68
|
+
buttonRadius: '12px',
|
|
69
|
+
cardRadius: '24px',
|
|
70
|
+
footerNote: '',
|
|
71
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* The ACTIVE styles every template + helper reads. Mutable on purpose:
|
|
74
|
+
* branch-per-store means one store per process, so the email theme is
|
|
75
|
+
* process-global by construction. `applyEmailStyles` (emails/theme.ts)
|
|
76
|
+
* Object.assigns the store's resolved brand theme over these before each
|
|
77
|
+
* render — the 11 templates and 14 helpers below need zero changes.
|
|
78
|
+
*/
|
|
79
|
+
const STYLES = { ...DEFAULT_EMAIL_STYLES };
|
|
80
|
+
/** Overwrite the active styles in place (imports keep the same reference). */
|
|
81
|
+
export function setEmailStyles(next) {
|
|
82
|
+
Object.assign(STYLES, DEFAULT_EMAIL_STYLES, next);
|
|
83
|
+
}
|
|
72
84
|
// =============================================================================
|
|
73
85
|
// Layout Components
|
|
74
86
|
// =============================================================================
|
|
@@ -111,10 +123,35 @@ function renderFooter(config) {
|
|
|
111
123
|
<p style="margin: 0; font-family: ${STYLES.fontFamily}; font-size: 14px; font-weight: 400; line-height: 1.5; color: ${STYLES.textSecondary}; text-align: center;">
|
|
112
124
|
Need help? Contact us at <a href="mailto:${escapeHtml(config.supportEmail)}" style="color: ${STYLES.primaryColor}; text-decoration: none; font-weight: 500;">${escapeHtml(config.supportEmail)}</a>
|
|
113
125
|
</p>
|
|
126
|
+
${STYLES.footerNote
|
|
127
|
+
? `<p style="margin: 16px 0 0 0; font-family: ${STYLES.fontFamily}; font-size: 12px; font-weight: 400; line-height: 1.5; color: ${STYLES.textSecondary}; text-align: center;">${escapeHtml(STYLES.footerNote)}</p>`
|
|
128
|
+
: ''}
|
|
114
129
|
</td>
|
|
115
130
|
</tr>
|
|
116
131
|
`;
|
|
117
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Per-send custom blocks (Phase D overrides). Set by prepareEmail() right
|
|
135
|
+
* before a render, CONSUMED (and cleared) by the next baseLayout call —
|
|
136
|
+
* single-use so a send that never sets them can't inherit a previous
|
|
137
|
+
* send's blocks. Rendering is synchronous, so set → render can't interleave.
|
|
138
|
+
*/
|
|
139
|
+
let pendingIntro = null;
|
|
140
|
+
let pendingOutro = null;
|
|
141
|
+
export function setEmailCustomBlocks(intro, outro) {
|
|
142
|
+
pendingIntro = intro;
|
|
143
|
+
pendingOutro = outro;
|
|
144
|
+
}
|
|
145
|
+
/** Multiline merchant text → escaped paragraphs (blank line = new paragraph). */
|
|
146
|
+
function customBlock(text) {
|
|
147
|
+
const paragraphs = text
|
|
148
|
+
.split(/\n{2,}/)
|
|
149
|
+
.map((p) => p.trim())
|
|
150
|
+
.filter(Boolean)
|
|
151
|
+
.map((p) => `<p style="margin: 0 0 16px 0; font-family: ${STYLES.fontFamily}; font-size: 16px; font-weight: 400; line-height: 1.625; color: ${STYLES.textSecondary}; text-align: center;">${escapeHtml(p).replace(/\n/g, '<br>')}</p>`)
|
|
152
|
+
.join('');
|
|
153
|
+
return `<div style="margin: 0 0 16px 0;">${paragraphs}</div>`;
|
|
154
|
+
}
|
|
118
155
|
/**
|
|
119
156
|
* Wrap email content in the base layout.
|
|
120
157
|
* All email templates should use this function.
|
|
@@ -129,6 +166,12 @@ function renderFooter(config) {
|
|
|
129
166
|
* ```
|
|
130
167
|
*/
|
|
131
168
|
export function baseLayout({ config, title, content }) {
|
|
169
|
+
// Consume (and clear) any per-send custom blocks — single-use by contract.
|
|
170
|
+
const intro = pendingIntro;
|
|
171
|
+
const outro = pendingOutro;
|
|
172
|
+
pendingIntro = null;
|
|
173
|
+
pendingOutro = null;
|
|
174
|
+
const wrappedContent = `${intro ? customBlock(intro) : ''}${content}${outro ? customBlock(outro) : ''}`;
|
|
132
175
|
// Build Google Fonts URL with dynamic font name
|
|
133
176
|
const fontNameEncoded = STYLES.fontName.replace(/ /g, '+');
|
|
134
177
|
const googleFontsUrl = `https://fonts.googleapis.com/css2?family=${fontNameEncoded}:wght@400;500;600;700&display=swap`;
|
|
@@ -146,11 +189,11 @@ export function baseLayout({ config, title, content }) {
|
|
|
146
189
|
<table width="100%" cellpadding="0" cellspacing="0" style="background-color: ${STYLES.backgroundColor}; padding: 40px 0;">
|
|
147
190
|
<tr>
|
|
148
191
|
<td align="center">
|
|
149
|
-
<table width="600" cellpadding="0" cellspacing="0" style="background-color: ${STYLES.cardBackground}; border-radius:
|
|
192
|
+
<table width="600" cellpadding="0" cellspacing="0" style="background-color: ${STYLES.cardBackground}; border-radius: ${STYLES.cardRadius}; overflow: hidden; border: 1px solid ${STYLES.cardBorder};">
|
|
150
193
|
${renderHeader(config.logoUrl)}
|
|
151
194
|
<tr>
|
|
152
195
|
<td style="padding: 0 48px 48px 48px;">
|
|
153
|
-
${
|
|
196
|
+
${wrappedContent}
|
|
154
197
|
</td>
|
|
155
198
|
</tr>
|
|
156
199
|
${renderFooter(config)}
|
|
@@ -172,7 +215,7 @@ export function primaryButton(text, href) {
|
|
|
172
215
|
<table width="100%" cellpadding="0" cellspacing="0" style="margin: 0 0 32px 0;">
|
|
173
216
|
<tr>
|
|
174
217
|
<td align="center">
|
|
175
|
-
<a href="${escapeHtml(href)}" style="display: inline-block; padding: 12px 32px; background-color: ${STYLES.primaryColor}; color: #FFFFFF; text-decoration: none; border-radius:
|
|
218
|
+
<a href="${escapeHtml(href)}" style="display: inline-block; padding: 12px 32px; background-color: ${STYLES.primaryColor}; color: #FFFFFF; text-decoration: none; border-radius: ${STYLES.buttonRadius}; font-family: ${STYLES.fontFamily}; font-size: 16px; font-weight: 600;">${escapeHtml(text)}</a>
|
|
176
219
|
</td>
|
|
177
220
|
</tr>
|
|
178
221
|
</table>
|
|
@@ -304,7 +347,7 @@ export function secondaryButton(text, href) {
|
|
|
304
347
|
<table width="100%" cellpadding="0" cellspacing="0">
|
|
305
348
|
<tr>
|
|
306
349
|
<td align="center">
|
|
307
|
-
<a href="${escapeHtml(href)}" style="display: inline-block; padding: 12px 32px; background-color: transparent; color: ${STYLES.primaryColor}; text-decoration: none; border-radius:
|
|
350
|
+
<a href="${escapeHtml(href)}" style="display: inline-block; padding: 12px 32px; background-color: transparent; color: ${STYLES.primaryColor}; text-decoration: none; border-radius: ${STYLES.buttonRadius}; border: 1px solid ${hexToRgba(STYLES.primaryColor, 0.3)}; font-family: ${STYLES.fontFamily}; font-size: 16px; font-weight: 600;">${escapeHtml(text)}</a>
|
|
308
351
|
</td>
|
|
309
352
|
</tr>
|
|
310
353
|
</table>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/emails/templates/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;CACb,CAAA;AAEV;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,mBAAmB;CACrB,CAAA;AAEV;;;GAGG;AACH,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,kBAAkB,CAAC,UAAU;IACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ;CAC7B,CAAA;AAEV,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,OAAe;IAC7C,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,iBAAiB,OAAO,GAAG,CAAA;IAE/C,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEjC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,GAAG,CAAA;AAC7C,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/emails/templates/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;CACb,CAAA;AAEV;;GAEG;AACH,MAAM,kBAAkB,GAAG;IACzB,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,mBAAmB;CACrB,CAAA;AAEV;;;GAGG;AACH,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,kBAAkB,CAAC,UAAU;IACzC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ;CAC7B,CAAA;AAEV,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,OAAe;IAC7C,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpE,IAAI,CAAC,MAAM;QAAE,OAAO,iBAAiB,OAAO,GAAG,CAAA;IAE/C,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEjC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,GAAG,CAAA;AAC7C,CAAC;AAyBD,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,UAAU,EAAE,KAAK,CAAC,UAAU;IAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;IACnC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;IACxC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;IAClC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;IACpC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;IACtC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;IAClC,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,EAAE;CACf,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,GAAgB,EAAE,GAAG,oBAAoB,EAAE,CAAA;AAEvD,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,IAA0B;IACvD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAA;AACnD,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,mDAAmD;QACnD,OAAO;;;;GAIR,CAAA;IACD,CAAC;IAED,OAAO;;;oBAGW,UAAU,CAAC,OAAO,CAAC;;;GAGpC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAmB;IACvC,OAAO;;yDAEgD,MAAM,CAAC,gBAAgB,2BAA2B,MAAM,CAAC,UAAU;oDACxE,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,SAAS;YAC1I,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;;UAG9B,MAAM,CAAC,YAAY;QACjB,CAAC,CAAC,8CAA8C,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa;cACpJ,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;eAC9B;QACH,CAAC,CAAC,EACN;4CACoC,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa;qDAC7F,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,mBAAmB,MAAM,CAAC,YAAY,+CAA+C,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC;;UAG9L,MAAM,CAAC,UAAU;QACf,CAAC,CAAC,8CAA8C,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa,0BAA0B,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM;QACnN,CAAC,CAAC,EACN;;;GAGL,CAAA;AACH,CAAC;AAYD;;;;;GAKG;AACH,IAAI,YAAY,GAAkB,IAAI,CAAA;AACtC,IAAI,YAAY,GAAkB,IAAI,CAAA;AAEtC,MAAM,UAAU,oBAAoB,CAAC,KAAoB,EAAE,KAAoB;IAC7E,YAAY,GAAG,KAAK,CAAA;IACpB,YAAY,GAAG,KAAK,CAAA;AACtB,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,UAAU,GAAG,IAAI;SACpB,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,8CAA8C,MAAM,CAAC,UAAU,mEAAmE,MAAM,CAAC,aAAa,0BAA0B,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAC7N;SACA,IAAI,CAAC,EAAE,CAAC,CAAA;IACX,OAAO,oCAAoC,UAAU,QAAQ,CAAA;AAC/D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAqB;IACtE,2EAA2E;IAC3E,MAAM,KAAK,GAAG,YAAY,CAAA;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAA;IAC1B,YAAY,GAAG,IAAI,CAAA;IACnB,YAAY,GAAG,IAAI,CAAA;IACnB,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IAEvG,gDAAgD;IAChD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,cAAc,GAAG,4CAA4C,eAAe,oCAAoC,CAAA;IAEtH,OAAO;;;;;WAKE,UAAU,CAAC,KAAK,CAAC;;;gBAGZ,cAAc;;mDAEqB,MAAM,CAAC,UAAU,uBAAuB,MAAM,CAAC,eAAe;iFAChC,MAAM,CAAC,eAAe;;;sFAGjB,MAAM,CAAC,cAAc,oBAAoB,MAAM,CAAC,UAAU,yCAAyC,MAAM,CAAC,UAAU;YAC9L,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;;;gBAGxB,cAAc;;;YAGlB,YAAY,CAAC,MAAM,CAAC;;;;;;QAMxB,CAAA;AACR,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IACtD,OAAO;;;;qBAIY,UAAU,CAAC,IAAI,CAAC,yEAAyE,MAAM,CAAC,YAAY,2DAA2D,MAAM,CAAC,YAAY,kBAAkB,MAAM,CAAC,UAAU,yCAAyC,UAAU,CAAC,IAAI,CAAC;;;;GAIxS,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,+CAA+C,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,4CAA4C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAA;AAC7M,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,eAAuB,MAAM;IACnE,OAAO,yBAAyB,YAAY,oBAAoB,MAAM,CAAC,UAAU,mEAAmE,MAAM,CAAC,aAAa,MAAM,IAAI,MAAM,CAAA;AAC1L,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO;mDAC0C,MAAM,CAAC,gBAAgB,4CAA4C,MAAM,CAAC,UAAU;0CAC7F,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa;UACtI,OAAO;;;GAGd,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,OAAO,CAAC;;eAEF,UAAU,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,oDAAoD,UAAU,CAAC,IAAI,CAAC;GACtI,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAa,EACb,OAAgD;IAEhD,MAAM,WAAW,GAAG,OAAO;SACxB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC;kDACqC,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa;gCACxH,MAAM,CAAC,SAAS,MAAM,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;;KAErG,CACA;SACA,IAAI,CAAC,EAAE,CAAC,CAAA;IAEX,OAAO;mDAC0C,MAAM,CAAC,gBAAgB,4CAA4C,MAAM,CAAC,UAAU;oDACnF,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,MAAM,UAAU,CAAC,KAAK,CAAC;QACrJ,WAAW;;GAEhB,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAc;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAA;IAC5D,OAAO;;;;oFAI2E,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,8CAA8C,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;wCAChK,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,YAAY,MAAM,UAAU,CAAC,WAAW,CAAC;;;;;GAKrJ,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,KAAa,EACb,UAKI,EAAE;IAEN,MAAM,EACJ,UAAU,GAAG,MAAM,CAAC,WAAW,EAC/B,SAAS,GAAG,MAAM,EAClB,SAAS,GAAG,KAAK,EACjB,YAAY,GAAG,KAAK,GACrB,GAAG,OAAO,CAAA;IAEX,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,4CAA4C,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IACxG,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAA;IAErE,OAAO;;mBAEU,cAAc,IAAI,iBAAiB;oDACF,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,aAAa,yDAAyD,UAAU,CAAC,KAAK,CAAC;4CACtK,MAAM,CAAC,UAAU,gBAAgB,SAAS,8BAA8B,UAAU,MAAM,UAAU,CAAC,KAAK,CAAC;;;GAGlJ,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAsC,EACtC,KAAuC,EACvC,YAAsB;IAEtB,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAA;IAE/D,OAAO;;mBAEU,WAAW;oDACsB,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,aAAa,yDAAyD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;4CAC3K,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;iCAEzH,WAAW;oDACQ,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,aAAa,yDAAyD,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;4CAC5K,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,MAAM,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;;;GAGxJ,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO;mDAC0C,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,4CAA4C,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;QAC9J,OAAO;;GAEZ,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,OAAO;;;;qBAIY,UAAU,CAAC,IAAI,CAAC,6FAA6F,MAAM,CAAC,YAAY,2CAA2C,MAAM,CAAC,YAAY,uBAAuB,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,yCAAyC,UAAU,CAAC,IAAI,CAAC;;;;GAItW,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,WAAmB;IAC/D,OAAO;;oDAE2C,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,MAAM,UAAU,CAAC,KAAK,CAAC;0CACnH,MAAM,CAAC,UAAU,iEAAiE,MAAM,CAAC,aAAa;UACtI,WAAW;;;GAGlB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,+CAA+C,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,WAAW,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAA;AACvK,CAAC;AAED,iDAAiD;AACjD,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/emails/theme
|
|
3
|
+
*
|
|
4
|
+
* The shared email theme (Phase D). One theme styles ALL transactional
|
|
5
|
+
* emails — they render through the single base layout, so one change here
|
|
6
|
+
* restyles every email at once.
|
|
7
|
+
*
|
|
8
|
+
* Resolution order (highest wins), cached briefly per process:
|
|
9
|
+
* 1. store_settings.email_theme (admin "Emails → Theme" panel)
|
|
10
|
+
* 2. brand-derived defaults (blueprint primary color + body font)
|
|
11
|
+
* 3. the shipped defaults (DEFAULT_EMAIL_STYLES)
|
|
12
|
+
*
|
|
13
|
+
* Branch-per-store means one store per process, so applying the theme via
|
|
14
|
+
* Object.assign on the shared STYLES object (setEmailStyles) is correct by
|
|
15
|
+
* construction — no per-request threading through templates.
|
|
16
|
+
*
|
|
17
|
+
* Fail-open everywhere: any resolution failure keeps the previous styles;
|
|
18
|
+
* an email is never blocked or broken by theming.
|
|
19
|
+
*/
|
|
20
|
+
export type EmailButtonRadius = 'sm' | 'md' | 'full';
|
|
21
|
+
export interface EmailTheme {
|
|
22
|
+
/** Buttons, links, badges, highlights. Hex like '#1C5BA8'. */
|
|
23
|
+
primaryColor?: string;
|
|
24
|
+
/** One of EMAIL_FONTS — email-safe Google fonts with system fallbacks. */
|
|
25
|
+
fontName?: string;
|
|
26
|
+
/** Button corner shape. */
|
|
27
|
+
buttonRadius?: EmailButtonRadius;
|
|
28
|
+
/** Outer background behind the card. Hex. */
|
|
29
|
+
backgroundColor?: string;
|
|
30
|
+
/** Extra footer line (legal notice, tagline). */
|
|
31
|
+
footerNote?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Curated email-safe fonts. Each loads as a Google Font (honored by Apple
|
|
35
|
+
* Mail and some clients) with a resilient system fallback stack everywhere
|
|
36
|
+
* else — the same progressive strategy the templates always used.
|
|
37
|
+
*/
|
|
38
|
+
export declare const EMAIL_FONTS: Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
stack: string;
|
|
41
|
+
}>;
|
|
42
|
+
export declare function isValidEmailTheme(raw: unknown): raw is EmailTheme;
|
|
43
|
+
/** Sanitize an incoming theme (admin writes) — keeps only valid fields. */
|
|
44
|
+
export declare function sanitizeEmailTheme(raw: unknown): EmailTheme;
|
|
45
|
+
/**
|
|
46
|
+
* Derive the theme from the store's brand: blueprint primary color + body
|
|
47
|
+
* font (when that font is in the email-safe list). This is what makes every
|
|
48
|
+
* store's emails brand-matched with no merchant action.
|
|
49
|
+
*/
|
|
50
|
+
export declare function deriveBrandEmailTheme(): EmailTheme;
|
|
51
|
+
/**
|
|
52
|
+
* The effective theme: brand-derived defaults with the merchant's saved
|
|
53
|
+
* theme layered on top. Cached briefly; call invalidateEmailTheme() after
|
|
54
|
+
* an admin save.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveEmailTheme(): Promise<EmailTheme>;
|
|
57
|
+
/** Invalidate after an admin theme save so the next send picks it up. */
|
|
58
|
+
export declare function invalidateEmailTheme(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the store's theme and apply it to the shared STYLES object every
|
|
61
|
+
* template reads. Called from getEmailConfig() — the one call every sender
|
|
62
|
+
* already makes before rendering. Never throws.
|
|
63
|
+
*/
|
|
64
|
+
export declare function applyEmailTheme(overrideTheme?: EmailTheme): Promise<void>;
|
|
65
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/emails/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AAEpD,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAS9D,CAAA;AAUD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CASjE;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAY3D;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAmBlD;AAyBD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,CAe7D;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,aAAa,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/E"}
|