@dev.smartpricing/message-composer-utils 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/types/api/aiIntegration.js +7 -0
- package/dist/types/api/aiIntegration.js.map +1 -0
- package/dist/types/api/apiMessages.js +2 -0
- package/dist/types/api/apiMessages.js.map +1 -0
- package/dist/types/api/index.js +3 -0
- package/dist/types/api/index.js.map +1 -0
- package/dist/types/app.js +23 -0
- package/dist/types/app.js.map +1 -0
- package/dist/types/brand.js +31 -0
- package/dist/types/brand.js.map +1 -0
- package/dist/types/dynamic-values.js +5 -0
- package/dist/types/dynamic-values.js.map +1 -0
- package/dist/types/emailblocks.v1.defaults.js +83 -0
- package/dist/types/emailblocks.v1.defaults.js.map +1 -0
- package/dist/types/emailblocks.v1.js +339 -0
- package/dist/types/emailblocks.v1.js.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/kafka-events.js +2 -0
- package/dist/types/kafka-events.js.map +1 -0
- package/dist/types/language.js +2 -0
- package/dist/types/language.js.map +1 -0
- package/dist/types/media.js +6 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/message.js +41 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/meta-template.js +2 -0
- package/dist/types/meta-template.js.map +1 -0
- package/dist/types/meta-webhook.js +2 -0
- package/dist/types/meta-webhook.js.map +1 -0
- package/dist/types/submission-job.js +2 -0
- package/dist/types/submission-job.js.map +1 -0
- package/dist/types/tag.js +2 -0
- package/dist/types/tag.js.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types/whatsappblocks.v1.js +24 -0
- package/dist/types/whatsappblocks.v1.js.map +1 -0
- package/dist/utils/array.js +26 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/async.js +22 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/date.js +37 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/index.js +34 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/intl.js +37 -0
- package/dist/utils/intl.js.map +1 -0
- package/dist/utils/meta-status.js +21 -0
- package/dist/utils/meta-status.js.map +1 -0
- package/dist/utils/number.js +24 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/object.js +87 -0
- package/dist/utils/object.js.map +1 -0
- package/dist/utils/string.js +22 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/utils/templates/brand-cascade.js +116 -0
- package/dist/utils/templates/brand-cascade.js.map +1 -0
- package/dist/utils/templates/email-compiler.js +126 -0
- package/dist/utils/templates/email-compiler.js.map +1 -0
- package/dist/utils/templates/email-mjml.js +444 -0
- package/dist/utils/templates/email-mjml.js.map +1 -0
- package/dist/utils/templates/email.js +580 -0
- package/dist/utils/templates/email.js.map +1 -0
- package/dist/utils/templates/html-sanitizer.js +95 -0
- package/dist/utils/templates/html-sanitizer.js.map +1 -0
- package/dist/utils/templates/messages.js +33 -0
- package/dist/utils/templates/messages.js.map +1 -0
- package/dist/utils/templates/meta.js +246 -0
- package/dist/utils/templates/meta.js.map +1 -0
- package/dist/utils/templates/tiptap.js +167 -0
- package/dist/utils/templates/tiptap.js.map +1 -0
- package/dist/utils/templates/whatsapp-compiler.js +168 -0
- package/dist/utils/templates/whatsapp-compiler.js.map +1 -0
- package/dist/utils/templates/whatsapp.js +329 -0
- package/dist/utils/templates/whatsapp.js.map +1 -0
- package/dist/utils/validations.js +39 -0
- package/dist/utils/validations.js.map +1 -0
- package/package.json +43 -0
- package/src/types/api/aiIntegration.ts +59 -0
- package/src/types/api/apiMessages.ts +22 -0
- package/src/types/api/index.ts +2 -0
- package/src/types/app.ts +76 -0
- package/src/types/brand.ts +80 -0
- package/src/types/dynamic-values.ts +47 -0
- package/src/types/emailblocks.v1.defaults.ts +123 -0
- package/src/types/emailblocks.v1.ts +655 -0
- package/src/types/index.ts +15 -0
- package/src/types/kafka-events.ts +46 -0
- package/src/types/language.ts +9 -0
- package/src/types/media.ts +26 -0
- package/src/types/message.ts +635 -0
- package/src/types/meta-template.ts +50 -0
- package/src/types/meta-webhook.ts +32 -0
- package/src/types/submission-job.ts +30 -0
- package/src/types/tag.ts +8 -0
- package/src/types/utils.ts +14 -0
- package/src/types/whatsappblocks.v1.ts +102 -0
- package/src/utils/array.ts +33 -0
- package/src/utils/async.ts +30 -0
- package/src/utils/date.ts +39 -0
- package/src/utils/index.ts +44 -0
- package/src/utils/intl.ts +51 -0
- package/src/utils/meta-status.ts +24 -0
- package/src/utils/number.ts +36 -0
- package/src/utils/object.ts +101 -0
- package/src/utils/string.ts +24 -0
- package/src/utils/templates/brand-cascade.ts +156 -0
- package/src/utils/templates/email-compiler.ts +155 -0
- package/src/utils/templates/email-mjml.ts +602 -0
- package/src/utils/templates/email.ts +713 -0
- package/src/utils/templates/html-sanitizer.ts +121 -0
- package/src/utils/templates/messages.ts +44 -0
- package/src/utils/templates/meta.ts +336 -0
- package/src/utils/templates/tiptap.ts +247 -0
- package/src/utils/templates/whatsapp-compiler.ts +212 -0
- package/src/utils/templates/whatsapp.ts +408 -0
- package/src/utils/validations.ts +49 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MessageFromDb,
|
|
3
|
+
MessageGroupFromDb,
|
|
4
|
+
MessageStatus,
|
|
5
|
+
RenderType,
|
|
6
|
+
} from "../message.js";
|
|
7
|
+
|
|
8
|
+
export type MessageGroupWithMessages = MessageGroupFromDb & {
|
|
9
|
+
messages: MessageFromDb[];
|
|
10
|
+
tags: string[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type MessageGroupWithMessageSummary = MessageGroupFromDb & {
|
|
14
|
+
messages: Array<{
|
|
15
|
+
id: string;
|
|
16
|
+
language: string;
|
|
17
|
+
status: MessageStatus;
|
|
18
|
+
preview: string;
|
|
19
|
+
render_type: RenderType;
|
|
20
|
+
}>;
|
|
21
|
+
tags: string[];
|
|
22
|
+
};
|
package/src/types/app.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export const errorCodes = {
|
|
2
|
+
INTERNAL_SERVER_ERROR: "INTERNAL_SERVER_ERROR",
|
|
3
|
+
UNAUTHORIZED: "UNAUTHORIZED",
|
|
4
|
+
NOT_FOUND: "NOT_FOUND",
|
|
5
|
+
BAD_REQUEST: "BAD_REQUEST",
|
|
6
|
+
FORBIDDEN: "FORBIDDEN",
|
|
7
|
+
CONFLICT: "CONFLICT",
|
|
8
|
+
META_CONFIG_MISSING: "META_CONFIG_MISSING",
|
|
9
|
+
META_TEMPLATE_MISSING: "META_TEMPLATE_MISSING",
|
|
10
|
+
META_TEMPLATE_SUBMISSION_FAILED: "META_TEMPLATE_SUBMISSION_FAILED",
|
|
11
|
+
META_TEMPLATE_DELETION_FAILED: "META_TEMPLATE_DELETION_FAILED",
|
|
12
|
+
META_TEMPLATE_DELETION_NOT_FOUND: "META_TEMPLATE_DELETION_NOT_FOUND",
|
|
13
|
+
META_TEMPLATE_DELETION_NOT_ALLOWED: "META_TEMPLATE_DELETION_NOT_ALLOWED",
|
|
14
|
+
TEMPLATE_NOT_EDITABLE: "TEMPLATE_NOT_EDITABLE",
|
|
15
|
+
LANGUAGE_NOT_FOUND: "LANGUAGE_NOT_FOUND",
|
|
16
|
+
TEMPLATE_NOT_APPROVED: "TEMPLATE_NOT_APPROVED",
|
|
17
|
+
TEMPLATE_NOT_SUBMITTED: "TEMPLATE_NOT_SUBMITTED",
|
|
18
|
+
MISSING_PARAMETERS: "MISSING_PARAMETERS",
|
|
19
|
+
UNSUPPORTED_RENDER_TYPE: "UNSUPPORTED_RENDER_TYPE",
|
|
20
|
+
NOT_IMPLEMENTED: "NOT_IMPLEMENTED",
|
|
21
|
+
} as const;
|
|
22
|
+
|
|
23
|
+
type ErrorCode = keyof typeof errorCodes;
|
|
24
|
+
|
|
25
|
+
export interface AppError {
|
|
26
|
+
statusCode: number;
|
|
27
|
+
code: ErrorCode;
|
|
28
|
+
error: string;
|
|
29
|
+
message: string;
|
|
30
|
+
details?: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface AppContextConfig {
|
|
34
|
+
authenticationToken: string;
|
|
35
|
+
product?: "connect" | "chat" | "pms" | "pricing" | "browser";
|
|
36
|
+
strategy?: "embed" | "native";
|
|
37
|
+
channels?: Array<"email" | "whatsapp">;
|
|
38
|
+
languages?: string[];
|
|
39
|
+
mainLanguage?: string;
|
|
40
|
+
metaWabaId?: string;
|
|
41
|
+
metaAccessToken?: string;
|
|
42
|
+
owner_id?: string;
|
|
43
|
+
default_tags?: string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface AppContextState extends AppContextConfig {
|
|
47
|
+
initializationSource:
|
|
48
|
+
| "query"
|
|
49
|
+
| "postMessage"
|
|
50
|
+
| "cookies"
|
|
51
|
+
| "injection"
|
|
52
|
+
| null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ContextSource {
|
|
56
|
+
name: string;
|
|
57
|
+
priority: number;
|
|
58
|
+
extract: () => Promise<Partial<AppContextConfig>>;
|
|
59
|
+
watch?: (
|
|
60
|
+
callback: (context: Partial<AppContextConfig>) => void,
|
|
61
|
+
) => () => void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type ParentNotificationType =
|
|
65
|
+
| "TEMPLATE_SAVED_DRAFT"
|
|
66
|
+
| "TEMPLATE_SAVED"
|
|
67
|
+
| "TEMPLATE_DELETED"
|
|
68
|
+
| "TEMPLATE_PUBLISHED"
|
|
69
|
+
| "TEMPLATE_UNPUBLISHED"
|
|
70
|
+
| "TEMPLATE_DUPLICATED"
|
|
71
|
+
| "TEMPLATE_CANCELLED"
|
|
72
|
+
| "TEMPLATE_APPROVAL_REQUESTED"
|
|
73
|
+
| "TEMPLATE_SAVED_AS_NEW";
|
|
74
|
+
|
|
75
|
+
export const managedLocales = ["en", "de", "fr", "it", "es"] as const;
|
|
76
|
+
export type ManagedLocales = (typeof managedLocales)[number];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DbEntity, WithDbTimestamps } from "./utils.js";
|
|
3
|
+
import type { SocialPlatform } from "./emailblocks.v1.js";
|
|
4
|
+
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// SCHEMAS (single source of truth for BE validation + FE form validation)
|
|
7
|
+
// ============================================================================
|
|
8
|
+
|
|
9
|
+
export const brandDefaultEmailSettingsSchema = z.object({
|
|
10
|
+
backgroundColor: z.string().optional(),
|
|
11
|
+
contentBackgroundColor: z.string().optional(),
|
|
12
|
+
textColor: z.string().optional(),
|
|
13
|
+
fontFamily: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const brandDefaultButtonSettingsSchema = z.object({
|
|
17
|
+
textColor: z.string().optional(),
|
|
18
|
+
backgroundColor: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/** Brand socials: platform → URL. Absent key = not configured. */
|
|
22
|
+
export const brandSocialsSchema = z
|
|
23
|
+
.record(z.string(), z.string())
|
|
24
|
+
.nullable()
|
|
25
|
+
.optional();
|
|
26
|
+
|
|
27
|
+
export type BrandSocials = Partial<Record<SocialPlatform, string>>;
|
|
28
|
+
|
|
29
|
+
export const brandBodySchema = z.object({
|
|
30
|
+
name: z.string().min(1),
|
|
31
|
+
organization_id: z.uuid().nullable().optional(),
|
|
32
|
+
logo_media_id: z.uuid().nullable().optional(),
|
|
33
|
+
colors: z.array(z.string()).optional(),
|
|
34
|
+
default_email_settings: brandDefaultEmailSettingsSchema.optional(),
|
|
35
|
+
default_button_settings: brandDefaultButtonSettingsSchema.optional(),
|
|
36
|
+
default_socials: brandSocialsSchema,
|
|
37
|
+
property_ids: z.array(z.uuid()).optional(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const brandUpdateSchema = brandBodySchema.partial();
|
|
41
|
+
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// TYPES (inferred from schemas)
|
|
44
|
+
// ============================================================================
|
|
45
|
+
|
|
46
|
+
export type BrandDefaultEmailSettings = z.infer<
|
|
47
|
+
typeof brandDefaultEmailSettingsSchema
|
|
48
|
+
>;
|
|
49
|
+
export type BrandDefaultButtonSettings = z.infer<
|
|
50
|
+
typeof brandDefaultButtonSettingsSchema
|
|
51
|
+
>;
|
|
52
|
+
export type BrandCreateBody = z.infer<typeof brandBodySchema>;
|
|
53
|
+
export type BrandUpdateBody = z.infer<typeof brandUpdateSchema>;
|
|
54
|
+
|
|
55
|
+
export interface Brand extends DbEntity {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
organization_id: string | null;
|
|
59
|
+
owner: string | null;
|
|
60
|
+
user_id: string;
|
|
61
|
+
logo_media_id: string | null;
|
|
62
|
+
colors: string[];
|
|
63
|
+
default_email_settings: BrandDefaultEmailSettings;
|
|
64
|
+
default_button_settings: BrandDefaultButtonSettings;
|
|
65
|
+
default_socials: BrandSocials | null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type BrandFromDb = WithDbTimestamps<Brand> & {
|
|
69
|
+
logo_url: string | null;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export interface BrandProperty {
|
|
73
|
+
brand_id: string;
|
|
74
|
+
property_id: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface Property {
|
|
78
|
+
id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// CONFIG TYPES (backend config files, multi-language)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
/** A single dynamic value field with multi-language labels and descriptions. */
|
|
6
|
+
export interface DynamicValueFieldConfig {
|
|
7
|
+
value: string;
|
|
8
|
+
label: Record<string, string>;
|
|
9
|
+
description: Record<string, string>;
|
|
10
|
+
default?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** A context with its own description and array of fields. */
|
|
14
|
+
export interface DynamicValuesContextConfig {
|
|
15
|
+
description: Record<string, string>;
|
|
16
|
+
fields: DynamicValueFieldConfig[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Product config shape: context key -> context config. */
|
|
20
|
+
export type DynamicValuesProductConfig = Record<
|
|
21
|
+
string,
|
|
22
|
+
DynamicValuesContextConfig
|
|
23
|
+
>;
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// API RESPONSE TYPES (language-resolved, returned by endpoint)
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
/** A resolved dynamic value field (single language). */
|
|
30
|
+
export interface DynamicValueField {
|
|
31
|
+
value: string;
|
|
32
|
+
label: string;
|
|
33
|
+
description: string;
|
|
34
|
+
default?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A resolved context (single language). */
|
|
38
|
+
export interface DynamicValuesContextResponse {
|
|
39
|
+
description: string;
|
|
40
|
+
fields: DynamicValueField[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** API response: { [contextKey]: DynamicValuesContextResponse } */
|
|
44
|
+
export type DynamicValuesResponse = Record<
|
|
45
|
+
string,
|
|
46
|
+
DynamicValuesContextResponse
|
|
47
|
+
>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// DEFAULT SETTINGS FOR EACH EMAIL BLOCK TYPE
|
|
3
|
+
// Used by emptyBlock functions and frontend reset logic
|
|
4
|
+
// ============================================================================
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
ButtonBlock,
|
|
8
|
+
DiscountBlock,
|
|
9
|
+
DividerBlock,
|
|
10
|
+
FooterBlock,
|
|
11
|
+
GridBlock,
|
|
12
|
+
HeaderBlock,
|
|
13
|
+
HeadingBlock,
|
|
14
|
+
ParagraphBlock,
|
|
15
|
+
SpacerBlock,
|
|
16
|
+
TopProductsBlock,
|
|
17
|
+
UnsubscribeLinkBlock,
|
|
18
|
+
} from "./emailblocks.v1.js";
|
|
19
|
+
|
|
20
|
+
export const DEFAULT_SPACER_SETTINGS: SpacerBlock["settings"] = {
|
|
21
|
+
customSize: false,
|
|
22
|
+
height: 40,
|
|
23
|
+
backgroundColor: "transparent",
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
export const DEFAULT_DIVIDER_SETTINGS: DividerBlock["settings"] = {
|
|
27
|
+
style: "solid" as const,
|
|
28
|
+
thickness: 1,
|
|
29
|
+
width: 100,
|
|
30
|
+
color: "#E5E7EB",
|
|
31
|
+
backgroundColor: "transparent",
|
|
32
|
+
} as const;
|
|
33
|
+
|
|
34
|
+
export const DEFAULT_HEADING_SETTINGS: Omit<
|
|
35
|
+
HeadingBlock["settings"],
|
|
36
|
+
"content"
|
|
37
|
+
> = {
|
|
38
|
+
tag: "h1",
|
|
39
|
+
fontFamily: undefined,
|
|
40
|
+
fontSize: 24,
|
|
41
|
+
textColor: undefined,
|
|
42
|
+
backgroundColor: "transparent",
|
|
43
|
+
} as const;
|
|
44
|
+
|
|
45
|
+
export const DEFAULT_PARAGRAPH_SETTINGS: Omit<
|
|
46
|
+
ParagraphBlock["settings"],
|
|
47
|
+
"content"
|
|
48
|
+
> = {
|
|
49
|
+
tag: "p" as const,
|
|
50
|
+
fontFamily: undefined,
|
|
51
|
+
fontSize: 16,
|
|
52
|
+
textColor: undefined,
|
|
53
|
+
backgroundColor: "transparent",
|
|
54
|
+
} as const;
|
|
55
|
+
|
|
56
|
+
export const DEFAULT_BUTTON_SETTINGS: Omit<ButtonBlock["settings"], "content"> =
|
|
57
|
+
{
|
|
58
|
+
linkType: "web" as const,
|
|
59
|
+
url: "",
|
|
60
|
+
fontFamily: undefined,
|
|
61
|
+
fontSize: 16,
|
|
62
|
+
shape: "rounded" as const,
|
|
63
|
+
width: "fit_to_text" as const,
|
|
64
|
+
alignment: "center" as const,
|
|
65
|
+
textColor: undefined,
|
|
66
|
+
backgroundColor: undefined,
|
|
67
|
+
backgroundBlock: "transparent",
|
|
68
|
+
} as const;
|
|
69
|
+
|
|
70
|
+
export const DEFAULT_GRID_SETTINGS: Omit<GridBlock["settings"], "columnData"> =
|
|
71
|
+
{
|
|
72
|
+
columns: 2,
|
|
73
|
+
backgroundColor: "transparent",
|
|
74
|
+
} as const;
|
|
75
|
+
|
|
76
|
+
export const DEFAULT_DISCOUNT_SETTINGS: Omit<
|
|
77
|
+
DiscountBlock["settings"],
|
|
78
|
+
"content"
|
|
79
|
+
> = {
|
|
80
|
+
tag: "h3" as const,
|
|
81
|
+
fontFamily: undefined,
|
|
82
|
+
fontSize: 16,
|
|
83
|
+
style: "square" as const,
|
|
84
|
+
textColor: undefined,
|
|
85
|
+
backgroundComponent: "#F3F4F6",
|
|
86
|
+
backgroundBlock: "transparent",
|
|
87
|
+
width: "fit_to_text" as const,
|
|
88
|
+
} as const;
|
|
89
|
+
|
|
90
|
+
export const DEFAULT_HEADER_SETTINGS: Omit<HeaderBlock["settings"], "content"> =
|
|
91
|
+
{
|
|
92
|
+
src: "",
|
|
93
|
+
alt: "",
|
|
94
|
+
width: 200,
|
|
95
|
+
alignment: "center" as const,
|
|
96
|
+
backgroundColor: "transparent",
|
|
97
|
+
} as const;
|
|
98
|
+
|
|
99
|
+
export const DEFAULT_FOOTER_SETTINGS: Omit<FooterBlock["settings"], "content"> =
|
|
100
|
+
{
|
|
101
|
+
fontSize: 12,
|
|
102
|
+
fontFamily: undefined,
|
|
103
|
+
textColor: undefined,
|
|
104
|
+
backgroundColor: "transparent",
|
|
105
|
+
alignment: "center" as const,
|
|
106
|
+
} as const;
|
|
107
|
+
|
|
108
|
+
export const DEFAULT_TOP_PRODUCTS_SETTINGS: TopProductsBlock["settings"] = {
|
|
109
|
+
storeId: "",
|
|
110
|
+
maxProducts: 4,
|
|
111
|
+
backgroundColor: "#F1F0EF",
|
|
112
|
+
} as const;
|
|
113
|
+
|
|
114
|
+
export const DEFAULT_UNSUBSCRIBE_LINK_SETTINGS: Omit<
|
|
115
|
+
UnsubscribeLinkBlock["settings"],
|
|
116
|
+
"content"
|
|
117
|
+
> = {
|
|
118
|
+
fontFamily: undefined,
|
|
119
|
+
fontSize: 12,
|
|
120
|
+
textColor: undefined,
|
|
121
|
+
backgroundColor: "transparent",
|
|
122
|
+
alignment: "center" as const,
|
|
123
|
+
} as const;
|