@xiwebdesign/xicms-core 6.1.1 → 6.3.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/forms/FormsPanel.js +59 -27
- package/dist/admin/forms/FormsPanel.js.map +1 -1
- package/dist/admin/settings/MailTemplates.d.ts +14 -0
- package/dist/admin/{shop/EmailsTab.js → settings/MailTemplates.js} +38 -31
- package/dist/admin/settings/MailTemplates.js.map +1 -0
- package/dist/admin/settings/SettingsPanel.js +13 -1
- package/dist/admin/settings/SettingsPanel.js.map +1 -1
- package/dist/admin/shop/OrdersTab.js +35 -8
- package/dist/admin/shop/OrdersTab.js.map +1 -1
- package/dist/admin/shop/ShopPanel.d.ts +3 -3
- package/dist/admin/shop/ShopPanel.js +3 -2
- package/dist/admin/shop/ShopPanel.js.map +1 -1
- package/dist/admin.css +1 -1
- package/dist/schema/forms.d.ts +8 -1
- package/dist/schema/forms.js +7 -2
- package/dist/schema/forms.js.map +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/mail.d.ts +159 -0
- package/dist/schema/mail.js +78 -0
- package/dist/schema/mail.js.map +1 -0
- package/dist/schema/settings.d.ts +16 -0
- package/dist/schema/settings.js +2 -0
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/shop.d.ts +1 -78
- package/dist/schema/shop.js +7 -15
- package/dist/schema/shop.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +9 -0
- package/package.json +1 -1
- package/dist/admin/shop/EmailsTab.d.ts +0 -8
- package/dist/admin/shop/EmailsTab.js.map +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* E-mailtemplates (site-breed, 3.7) — `sites/{siteId}/settings/mailTemplates`. Per template een
|
|
4
|
+
* onderwerp + platte-tekst-body met `{{placeholders}}`. Bewust géén HTML van beheerders; de
|
|
5
|
+
* huisstijl-opmaak komt in de mail-pipeline (functions `mailLayout.ts`) om de tekst heen.
|
|
6
|
+
*
|
|
7
|
+
* De keys zijn getagd met de module waartoe ze horen (`core`/`shop`), zodat de editor in /beheer
|
|
8
|
+
* shop-templates alleen toont op sites met de webwinkel. `core`-keys (formulieren) gelden altijd.
|
|
9
|
+
*/
|
|
10
|
+
export interface MailTemplateDef {
|
|
11
|
+
key: string;
|
|
12
|
+
label: string;
|
|
13
|
+
hint: string;
|
|
14
|
+
module: "core" | "shop";
|
|
15
|
+
/** Beschikbare invulvelden, als tonende hint in de editor. */
|
|
16
|
+
placeholders: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const MAIL_TEMPLATE_DEFS: readonly [{
|
|
19
|
+
readonly key: "formNotification";
|
|
20
|
+
readonly label: "Formulier-notificatie (naar jou)";
|
|
21
|
+
readonly hint: "Naar jou zodra iemand een formulier invult.";
|
|
22
|
+
readonly module: "core";
|
|
23
|
+
readonly placeholders: "{{sitenaam}} {{formulier}} {{regels}}";
|
|
24
|
+
}, {
|
|
25
|
+
readonly key: "formConfirmation";
|
|
26
|
+
readonly label: "Formulier-bevestiging (naar de inzender)";
|
|
27
|
+
readonly hint: "Ontvangstbevestiging naar wie het formulier invulde.";
|
|
28
|
+
readonly module: "core";
|
|
29
|
+
readonly placeholders: "{{sitenaam}} {{formulier}} {{regels}}";
|
|
30
|
+
}, {
|
|
31
|
+
readonly key: "orderConfirmation";
|
|
32
|
+
readonly label: "Bestelbevestiging";
|
|
33
|
+
readonly hint: "Naar de klant zodra de betaling binnen is — met factuur-PDF als bijlage.";
|
|
34
|
+
readonly module: "shop";
|
|
35
|
+
readonly placeholders: "{{naam}} {{ordernummer}} {{regels}} {{totaal}} {{verzendadres}} {{notitie}} {{sitenaam}}";
|
|
36
|
+
}, {
|
|
37
|
+
readonly key: "shopkeeperNotification";
|
|
38
|
+
readonly label: "Nieuwe-bestelling-notificatie (naar jou)";
|
|
39
|
+
readonly hint: "Naar jou bij elke nieuwe bestelling.";
|
|
40
|
+
readonly module: "shop";
|
|
41
|
+
readonly placeholders: "{{sitenaam}} {{ordernummer}} {{totaal}} {{klant}} {{regels}} {{verzendadres}} {{notitie}}";
|
|
42
|
+
}, {
|
|
43
|
+
readonly key: "orderShipped";
|
|
44
|
+
readonly label: "Bestelling verzonden";
|
|
45
|
+
readonly hint: "Naar de klant wanneer je de status op ‘verzonden’ zet.";
|
|
46
|
+
readonly module: "shop";
|
|
47
|
+
readonly placeholders: "{{naam}} {{ordernummer}} {{regels}} {{trackingUrl}} {{verzendadres}} {{sitenaam}}";
|
|
48
|
+
}, {
|
|
49
|
+
readonly key: "orderCancelled";
|
|
50
|
+
readonly label: "Bestelling geannuleerd";
|
|
51
|
+
readonly hint: "Naar de klant bij annulering.";
|
|
52
|
+
readonly module: "shop";
|
|
53
|
+
readonly placeholders: "{{naam}} {{ordernummer}} {{sitenaam}}";
|
|
54
|
+
}, {
|
|
55
|
+
readonly key: "orderRefunded";
|
|
56
|
+
readonly label: "Terugbetaald";
|
|
57
|
+
readonly hint: "Naar de klant na een terugbetaling.";
|
|
58
|
+
readonly module: "shop";
|
|
59
|
+
readonly placeholders: "{{naam}} {{ordernummer}} {{totaal}} {{sitenaam}}";
|
|
60
|
+
}, {
|
|
61
|
+
readonly key: "donationThanks";
|
|
62
|
+
readonly label: "Donatie-bedankje";
|
|
63
|
+
readonly hint: "Naar de gever na een donatie.";
|
|
64
|
+
readonly module: "shop";
|
|
65
|
+
readonly placeholders: "{{naam}} {{regels}} {{sitenaam}}";
|
|
66
|
+
}];
|
|
67
|
+
export declare const MAIL_TEMPLATE_KEYS: readonly MailTemplateKey[];
|
|
68
|
+
export type MailTemplateKey = (typeof MAIL_TEMPLATE_DEFS)[number]["key"];
|
|
69
|
+
/** Formulier-mails — bewerkbaar in het Formulieren-gedeelte. */
|
|
70
|
+
export declare const FORM_TEMPLATE_KEYS: readonly MailTemplateKey[];
|
|
71
|
+
/** Shop-mails — bewerkbaar in het Webwinkel-gedeelte. */
|
|
72
|
+
export declare const SHOP_TEMPLATE_KEYS: readonly MailTemplateKey[];
|
|
73
|
+
export declare const MailTemplateSchema: z.ZodObject<{
|
|
74
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
75
|
+
bodyText: z.ZodOptional<z.ZodString>;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
subject?: string | undefined;
|
|
78
|
+
bodyText?: string | undefined;
|
|
79
|
+
}, {
|
|
80
|
+
subject?: string | undefined;
|
|
81
|
+
bodyText?: string | undefined;
|
|
82
|
+
}>;
|
|
83
|
+
export declare const MailTemplatesSchema: z.ZodObject<Record<"formNotification" | "formConfirmation" | "orderConfirmation" | "shopkeeperNotification" | "orderShipped" | "orderCancelled" | "orderRefunded" | "donationThanks", z.ZodOptional<z.ZodObject<{
|
|
84
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
85
|
+
bodyText: z.ZodOptional<z.ZodString>;
|
|
86
|
+
}, "strip", z.ZodTypeAny, {
|
|
87
|
+
subject?: string | undefined;
|
|
88
|
+
bodyText?: string | undefined;
|
|
89
|
+
}, {
|
|
90
|
+
subject?: string | undefined;
|
|
91
|
+
bodyText?: string | undefined;
|
|
92
|
+
}>>>, "strip", z.ZodTypeAny, {
|
|
93
|
+
formNotification?: {
|
|
94
|
+
subject?: string | undefined;
|
|
95
|
+
bodyText?: string | undefined;
|
|
96
|
+
} | undefined;
|
|
97
|
+
formConfirmation?: {
|
|
98
|
+
subject?: string | undefined;
|
|
99
|
+
bodyText?: string | undefined;
|
|
100
|
+
} | undefined;
|
|
101
|
+
orderConfirmation?: {
|
|
102
|
+
subject?: string | undefined;
|
|
103
|
+
bodyText?: string | undefined;
|
|
104
|
+
} | undefined;
|
|
105
|
+
shopkeeperNotification?: {
|
|
106
|
+
subject?: string | undefined;
|
|
107
|
+
bodyText?: string | undefined;
|
|
108
|
+
} | undefined;
|
|
109
|
+
orderShipped?: {
|
|
110
|
+
subject?: string | undefined;
|
|
111
|
+
bodyText?: string | undefined;
|
|
112
|
+
} | undefined;
|
|
113
|
+
orderCancelled?: {
|
|
114
|
+
subject?: string | undefined;
|
|
115
|
+
bodyText?: string | undefined;
|
|
116
|
+
} | undefined;
|
|
117
|
+
orderRefunded?: {
|
|
118
|
+
subject?: string | undefined;
|
|
119
|
+
bodyText?: string | undefined;
|
|
120
|
+
} | undefined;
|
|
121
|
+
donationThanks?: {
|
|
122
|
+
subject?: string | undefined;
|
|
123
|
+
bodyText?: string | undefined;
|
|
124
|
+
} | undefined;
|
|
125
|
+
}, {
|
|
126
|
+
formNotification?: {
|
|
127
|
+
subject?: string | undefined;
|
|
128
|
+
bodyText?: string | undefined;
|
|
129
|
+
} | undefined;
|
|
130
|
+
formConfirmation?: {
|
|
131
|
+
subject?: string | undefined;
|
|
132
|
+
bodyText?: string | undefined;
|
|
133
|
+
} | undefined;
|
|
134
|
+
orderConfirmation?: {
|
|
135
|
+
subject?: string | undefined;
|
|
136
|
+
bodyText?: string | undefined;
|
|
137
|
+
} | undefined;
|
|
138
|
+
shopkeeperNotification?: {
|
|
139
|
+
subject?: string | undefined;
|
|
140
|
+
bodyText?: string | undefined;
|
|
141
|
+
} | undefined;
|
|
142
|
+
orderShipped?: {
|
|
143
|
+
subject?: string | undefined;
|
|
144
|
+
bodyText?: string | undefined;
|
|
145
|
+
} | undefined;
|
|
146
|
+
orderCancelled?: {
|
|
147
|
+
subject?: string | undefined;
|
|
148
|
+
bodyText?: string | undefined;
|
|
149
|
+
} | undefined;
|
|
150
|
+
orderRefunded?: {
|
|
151
|
+
subject?: string | undefined;
|
|
152
|
+
bodyText?: string | undefined;
|
|
153
|
+
} | undefined;
|
|
154
|
+
donationThanks?: {
|
|
155
|
+
subject?: string | undefined;
|
|
156
|
+
bodyText?: string | undefined;
|
|
157
|
+
} | undefined;
|
|
158
|
+
}>;
|
|
159
|
+
export type MailTemplates = z.infer<typeof MailTemplatesSchema>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const MAIL_TEMPLATE_DEFS = [
|
|
3
|
+
{
|
|
4
|
+
key: "formNotification",
|
|
5
|
+
label: "Formulier-notificatie (naar jou)",
|
|
6
|
+
hint: "Naar jou zodra iemand een formulier invult.",
|
|
7
|
+
module: "core",
|
|
8
|
+
placeholders: "{{sitenaam}} {{formulier}} {{regels}}"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "formConfirmation",
|
|
12
|
+
label: "Formulier-bevestiging (naar de inzender)",
|
|
13
|
+
hint: "Ontvangstbevestiging naar wie het formulier invulde.",
|
|
14
|
+
module: "core",
|
|
15
|
+
placeholders: "{{sitenaam}} {{formulier}} {{regels}}"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "orderConfirmation",
|
|
19
|
+
label: "Bestelbevestiging",
|
|
20
|
+
hint: "Naar de klant zodra de betaling binnen is \u2014 met factuur-PDF als bijlage.",
|
|
21
|
+
module: "shop",
|
|
22
|
+
placeholders: "{{naam}} {{ordernummer}} {{regels}} {{totaal}} {{verzendadres}} {{notitie}} {{sitenaam}}"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "shopkeeperNotification",
|
|
26
|
+
label: "Nieuwe-bestelling-notificatie (naar jou)",
|
|
27
|
+
hint: "Naar jou bij elke nieuwe bestelling.",
|
|
28
|
+
module: "shop",
|
|
29
|
+
placeholders: "{{sitenaam}} {{ordernummer}} {{totaal}} {{klant}} {{regels}} {{verzendadres}} {{notitie}}"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: "orderShipped",
|
|
33
|
+
label: "Bestelling verzonden",
|
|
34
|
+
hint: "Naar de klant wanneer je de status op \u2018verzonden\u2019 zet.",
|
|
35
|
+
module: "shop",
|
|
36
|
+
placeholders: "{{naam}} {{ordernummer}} {{regels}} {{trackingUrl}} {{verzendadres}} {{sitenaam}}"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: "orderCancelled",
|
|
40
|
+
label: "Bestelling geannuleerd",
|
|
41
|
+
hint: "Naar de klant bij annulering.",
|
|
42
|
+
module: "shop",
|
|
43
|
+
placeholders: "{{naam}} {{ordernummer}} {{sitenaam}}"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: "orderRefunded",
|
|
47
|
+
label: "Terugbetaald",
|
|
48
|
+
hint: "Naar de klant na een terugbetaling.",
|
|
49
|
+
module: "shop",
|
|
50
|
+
placeholders: "{{naam}} {{ordernummer}} {{totaal}} {{sitenaam}}"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "donationThanks",
|
|
54
|
+
label: "Donatie-bedankje",
|
|
55
|
+
hint: "Naar de gever na een donatie.",
|
|
56
|
+
module: "shop",
|
|
57
|
+
placeholders: "{{naam}} {{regels}} {{sitenaam}}"
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
const MAIL_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.map((d) => d.key);
|
|
61
|
+
const FORM_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.filter((d) => d.module === "core").map((d) => d.key);
|
|
62
|
+
const SHOP_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.filter((d) => d.module === "shop").map((d) => d.key);
|
|
63
|
+
const MailTemplateSchema = z.object({
|
|
64
|
+
subject: z.string().max(200).optional(),
|
|
65
|
+
bodyText: z.string().max(1e4).optional()
|
|
66
|
+
});
|
|
67
|
+
const MailTemplatesSchema = z.object(
|
|
68
|
+
Object.fromEntries(MAIL_TEMPLATE_DEFS.map((d) => [d.key, MailTemplateSchema.optional()]))
|
|
69
|
+
);
|
|
70
|
+
export {
|
|
71
|
+
FORM_TEMPLATE_KEYS,
|
|
72
|
+
MAIL_TEMPLATE_DEFS,
|
|
73
|
+
MAIL_TEMPLATE_KEYS,
|
|
74
|
+
MailTemplateSchema,
|
|
75
|
+
MailTemplatesSchema,
|
|
76
|
+
SHOP_TEMPLATE_KEYS
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=mail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/schema/mail.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * E-mailtemplates (site-breed, 3.7) — `sites/{siteId}/settings/mailTemplates`. Per template een\n * onderwerp + platte-tekst-body met `{{placeholders}}`. Bewust géén HTML van beheerders; de\n * huisstijl-opmaak komt in de mail-pipeline (functions `mailLayout.ts`) om de tekst heen.\n *\n * De keys zijn getagd met de module waartoe ze horen (`core`/`shop`), zodat de editor in /beheer\n * shop-templates alleen toont op sites met de webwinkel. `core`-keys (formulieren) gelden altijd.\n */\n\nexport interface MailTemplateDef {\n key: string;\n label: string;\n hint: string;\n module: \"core\" | \"shop\";\n /** Beschikbare invulvelden, als tonende hint in de editor. */\n placeholders: string;\n}\n\nexport const MAIL_TEMPLATE_DEFS = [\n {\n key: \"formNotification\",\n label: \"Formulier-notificatie (naar jou)\",\n hint: \"Naar jou zodra iemand een formulier invult.\",\n module: \"core\",\n placeholders: \"{{sitenaam}} {{formulier}} {{regels}}\",\n },\n {\n key: \"formConfirmation\",\n label: \"Formulier-bevestiging (naar de inzender)\",\n hint: \"Ontvangstbevestiging naar wie het formulier invulde.\",\n module: \"core\",\n placeholders: \"{{sitenaam}} {{formulier}} {{regels}}\",\n },\n {\n key: \"orderConfirmation\",\n label: \"Bestelbevestiging\",\n hint: \"Naar de klant zodra de betaling binnen is — met factuur-PDF als bijlage.\",\n module: \"shop\",\n placeholders: \"{{naam}} {{ordernummer}} {{regels}} {{totaal}} {{verzendadres}} {{notitie}} {{sitenaam}}\",\n },\n {\n key: \"shopkeeperNotification\",\n label: \"Nieuwe-bestelling-notificatie (naar jou)\",\n hint: \"Naar jou bij elke nieuwe bestelling.\",\n module: \"shop\",\n placeholders: \"{{sitenaam}} {{ordernummer}} {{totaal}} {{klant}} {{regels}} {{verzendadres}} {{notitie}}\",\n },\n {\n key: \"orderShipped\",\n label: \"Bestelling verzonden\",\n hint: \"Naar de klant wanneer je de status op ‘verzonden’ zet.\",\n module: \"shop\",\n placeholders: \"{{naam}} {{ordernummer}} {{regels}} {{trackingUrl}} {{verzendadres}} {{sitenaam}}\",\n },\n {\n key: \"orderCancelled\",\n label: \"Bestelling geannuleerd\",\n hint: \"Naar de klant bij annulering.\",\n module: \"shop\",\n placeholders: \"{{naam}} {{ordernummer}} {{sitenaam}}\",\n },\n {\n key: \"orderRefunded\",\n label: \"Terugbetaald\",\n hint: \"Naar de klant na een terugbetaling.\",\n module: \"shop\",\n placeholders: \"{{naam}} {{ordernummer}} {{totaal}} {{sitenaam}}\",\n },\n {\n key: \"donationThanks\",\n label: \"Donatie-bedankje\",\n hint: \"Naar de gever na een donatie.\",\n module: \"shop\",\n placeholders: \"{{naam}} {{regels}} {{sitenaam}}\",\n },\n] as const satisfies readonly MailTemplateDef[];\n\nexport const MAIL_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.map((d) => d.key) as unknown as readonly MailTemplateKey[];\nexport type MailTemplateKey = (typeof MAIL_TEMPLATE_DEFS)[number][\"key\"];\n\n/** Formulier-mails — bewerkbaar in het Formulieren-gedeelte. */\nexport const FORM_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.filter((d) => d.module === \"core\").map((d) => d.key) as readonly MailTemplateKey[];\n/** Shop-mails — bewerkbaar in het Webwinkel-gedeelte. */\nexport const SHOP_TEMPLATE_KEYS = MAIL_TEMPLATE_DEFS.filter((d) => d.module === \"shop\").map((d) => d.key) as readonly MailTemplateKey[];\n\nexport const MailTemplateSchema = z.object({\n subject: z.string().max(200).optional(),\n bodyText: z.string().max(10_000).optional(),\n});\nexport const MailTemplatesSchema = z.object(\n Object.fromEntries(MAIL_TEMPLATE_DEFS.map((d) => [d.key, MailTemplateSchema.optional()])) as Record<\n MailTemplateKey,\n z.ZodOptional<typeof MailTemplateSchema>\n >,\n);\nexport type MailTemplates = z.infer<typeof MailTemplatesSchema>;\n"],"mappings":"AAAA,SAAS,SAAS;AAoBX,MAAM,qBAAqB;AAAA,EAChC;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACF;AAEO,MAAM,qBAAqB,mBAAmB,IAAI,CAAC,MAAM,EAAE,GAAG;AAI9D,MAAM,qBAAqB,mBAAmB,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAEjG,MAAM,qBAAqB,mBAAmB,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAEjG,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACtC,UAAU,EAAE,OAAO,EAAE,IAAI,GAAM,EAAE,SAAS;AAC5C,CAAC;AACM,MAAM,sBAAsB,EAAE;AAAA,EACnC,OAAO,YAAY,mBAAmB,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,mBAAmB,SAAS,CAAC,CAAC,CAAC;AAI1F;","names":[]}
|
|
@@ -15,6 +15,8 @@ export type NavItem = z.infer<typeof NavItemSchema>;
|
|
|
15
15
|
export declare const ThemeSchema: z.ZodObject<{
|
|
16
16
|
primary: z.ZodString;
|
|
17
17
|
accent: z.ZodOptional<z.ZodString>;
|
|
18
|
+
/** Logo-URL (absoluut, https) — gebruikt in de mail-header en op de factuur-PDF. */
|
|
19
|
+
logo: z.ZodOptional<z.ZodString>;
|
|
18
20
|
background: z.ZodOptional<z.ZodString>;
|
|
19
21
|
foreground: z.ZodOptional<z.ZodString>;
|
|
20
22
|
fontFamily: z.ZodOptional<z.ZodString>;
|
|
@@ -99,6 +101,7 @@ export declare const ThemeSchema: z.ZodObject<{
|
|
|
99
101
|
xs?: string | undefined;
|
|
100
102
|
} | undefined;
|
|
101
103
|
accent?: string | undefined;
|
|
104
|
+
logo?: string | undefined;
|
|
102
105
|
foreground?: string | undefined;
|
|
103
106
|
fontFamily?: string | undefined;
|
|
104
107
|
headingFont?: string | undefined;
|
|
@@ -129,6 +132,7 @@ export declare const ThemeSchema: z.ZodObject<{
|
|
|
129
132
|
xs?: string | undefined;
|
|
130
133
|
} | undefined;
|
|
131
134
|
accent?: string | undefined;
|
|
135
|
+
logo?: string | undefined;
|
|
132
136
|
foreground?: string | undefined;
|
|
133
137
|
fontFamily?: string | undefined;
|
|
134
138
|
headingFont?: string | undefined;
|
|
@@ -315,6 +319,8 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
315
319
|
theme: z.ZodOptional<z.ZodObject<{
|
|
316
320
|
primary: z.ZodString;
|
|
317
321
|
accent: z.ZodOptional<z.ZodString>;
|
|
322
|
+
/** Logo-URL (absoluut, https) — gebruikt in de mail-header en op de factuur-PDF. */
|
|
323
|
+
logo: z.ZodOptional<z.ZodString>;
|
|
318
324
|
background: z.ZodOptional<z.ZodString>;
|
|
319
325
|
foreground: z.ZodOptional<z.ZodString>;
|
|
320
326
|
fontFamily: z.ZodOptional<z.ZodString>;
|
|
@@ -399,6 +405,7 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
399
405
|
xs?: string | undefined;
|
|
400
406
|
} | undefined;
|
|
401
407
|
accent?: string | undefined;
|
|
408
|
+
logo?: string | undefined;
|
|
402
409
|
foreground?: string | undefined;
|
|
403
410
|
fontFamily?: string | undefined;
|
|
404
411
|
headingFont?: string | undefined;
|
|
@@ -429,6 +436,7 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
429
436
|
xs?: string | undefined;
|
|
430
437
|
} | undefined;
|
|
431
438
|
accent?: string | undefined;
|
|
439
|
+
logo?: string | undefined;
|
|
432
440
|
foreground?: string | undefined;
|
|
433
441
|
fontFamily?: string | undefined;
|
|
434
442
|
headingFont?: string | undefined;
|
|
@@ -605,6 +613,7 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
605
613
|
xs?: string | undefined;
|
|
606
614
|
} | undefined;
|
|
607
615
|
accent?: string | undefined;
|
|
616
|
+
logo?: string | undefined;
|
|
608
617
|
foreground?: string | undefined;
|
|
609
618
|
fontFamily?: string | undefined;
|
|
610
619
|
headingFont?: string | undefined;
|
|
@@ -677,6 +686,7 @@ export declare const SiteSettingsSchema: z.ZodObject<{
|
|
|
677
686
|
xs?: string | undefined;
|
|
678
687
|
} | undefined;
|
|
679
688
|
accent?: string | undefined;
|
|
689
|
+
logo?: string | undefined;
|
|
680
690
|
foreground?: string | undefined;
|
|
681
691
|
fontFamily?: string | undefined;
|
|
682
692
|
headingFont?: string | undefined;
|
|
@@ -729,6 +739,8 @@ export declare const PublicSiteSettingsSchema: z.ZodObject<{
|
|
|
729
739
|
theme: z.ZodOptional<z.ZodObject<{
|
|
730
740
|
primary: z.ZodString;
|
|
731
741
|
accent: z.ZodOptional<z.ZodString>;
|
|
742
|
+
/** Logo-URL (absoluut, https) — gebruikt in de mail-header en op de factuur-PDF. */
|
|
743
|
+
logo: z.ZodOptional<z.ZodString>;
|
|
732
744
|
background: z.ZodOptional<z.ZodString>;
|
|
733
745
|
foreground: z.ZodOptional<z.ZodString>;
|
|
734
746
|
fontFamily: z.ZodOptional<z.ZodString>;
|
|
@@ -813,6 +825,7 @@ export declare const PublicSiteSettingsSchema: z.ZodObject<{
|
|
|
813
825
|
xs?: string | undefined;
|
|
814
826
|
} | undefined;
|
|
815
827
|
accent?: string | undefined;
|
|
828
|
+
logo?: string | undefined;
|
|
816
829
|
foreground?: string | undefined;
|
|
817
830
|
fontFamily?: string | undefined;
|
|
818
831
|
headingFont?: string | undefined;
|
|
@@ -843,6 +856,7 @@ export declare const PublicSiteSettingsSchema: z.ZodObject<{
|
|
|
843
856
|
xs?: string | undefined;
|
|
844
857
|
} | undefined;
|
|
845
858
|
accent?: string | undefined;
|
|
859
|
+
logo?: string | undefined;
|
|
846
860
|
foreground?: string | undefined;
|
|
847
861
|
fontFamily?: string | undefined;
|
|
848
862
|
headingFont?: string | undefined;
|
|
@@ -999,6 +1013,7 @@ export declare const PublicSiteSettingsSchema: z.ZodObject<{
|
|
|
999
1013
|
xs?: string | undefined;
|
|
1000
1014
|
} | undefined;
|
|
1001
1015
|
accent?: string | undefined;
|
|
1016
|
+
logo?: string | undefined;
|
|
1002
1017
|
foreground?: string | undefined;
|
|
1003
1018
|
fontFamily?: string | undefined;
|
|
1004
1019
|
headingFont?: string | undefined;
|
|
@@ -1063,6 +1078,7 @@ export declare const PublicSiteSettingsSchema: z.ZodObject<{
|
|
|
1063
1078
|
xs?: string | undefined;
|
|
1064
1079
|
} | undefined;
|
|
1065
1080
|
accent?: string | undefined;
|
|
1081
|
+
logo?: string | undefined;
|
|
1066
1082
|
foreground?: string | undefined;
|
|
1067
1083
|
fontFamily?: string | undefined;
|
|
1068
1084
|
headingFont?: string | undefined;
|
package/dist/schema/settings.js
CHANGED
|
@@ -7,6 +7,8 @@ const NavItemSchema = z.object({
|
|
|
7
7
|
const ThemeSchema = z.object({
|
|
8
8
|
primary: z.string().max(40),
|
|
9
9
|
accent: z.string().max(40).optional(),
|
|
10
|
+
/** Logo-URL (absoluut, https) — gebruikt in de mail-header en op de factuur-PDF. */
|
|
11
|
+
logo: z.string().max(500).optional(),
|
|
10
12
|
background: z.string().max(40).optional(),
|
|
11
13
|
foreground: z.string().max(40).optional(),
|
|
12
14
|
fontFamily: z.string().max(200).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/settings.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { SeoSchema } from \"./seo\";\n\n/** Eén navigatie-item. */\nexport const NavItemSchema = z.object({\n label: z.string().min(1).max(80),\n href: z.string().min(1).max(2000),\n});\nexport type NavItem = z.infer<typeof NavItemSchema>;\n\n/** Huisstijl-tokens (worden CSS custom properties). Alle uitbreidingen zijn optioneel/update-veilig. */\nexport const ThemeSchema = z.object({\n primary: z.string().max(40),\n accent: z.string().max(40).optional(),\n background: z.string().max(40).optional(),\n foreground: z.string().max(40).optional(),\n fontFamily: z.string().max(200).optional(),\n /** Optioneel apart lettertype voor koppen (display/serif), voor een elegantere typografie. */\n headingFont: z.string().max(200).optional(),\n /** Optionele stylesheet-URL voor het lettertype (bv. een Google Fonts CSS-link). */\n fontUrl: z.string().max(500).optional(),\n /** Afrondingsschaal (sm/md/lg). */\n radius: z.object({ sm: z.string().max(20).optional(), md: z.string().max(20).optional(), lg: z.string().max(20).optional() }).optional(),\n /** Ruimteschaal voor block-padding (xs..xl). */\n spacing: z\n .object({\n xs: z.string().max(20).optional(),\n sm: z.string().max(20).optional(),\n md: z.string().max(20).optional(),\n lg: z.string().max(20).optional(),\n xl: z.string().max(20).optional(),\n })\n .optional(),\n /** Maximale container-breedte + horizontale padding. */\n container: z.object({ maxWidth: z.string().max(20).optional(), padding: z.string().max(20).optional() }).optional(),\n /** Optionele donkere modus (volgt het systeem als `auto`). */\n dark: z\n .object({\n auto: z.boolean().default(false),\n background: z.string().max(40).optional(),\n foreground: z.string().max(40).optional(),\n primary: z.string().max(40).optional(),\n })\n .optional(),\n});\nexport type ThemeTokens = z.infer<typeof ThemeSchema>;\n\n/**\n * Voegt live thema-instellingen (uit `settings/public.theme`, /beheer) per token samen met het\n * statische SiteConfig-thema. Firestore wint per veld waar gezet; geneste schalen (radius/spacing/\n * container/dark) mergen per subveld, zodat een klant die alleen kleuren wijzigt de fonts/radius\n * uit de repo behoudt. Puur (geen React) — gedeeld door provider en `useMergedSiteConfig`.\n */\nexport function mergeThemeTokens(base: ThemeTokens, override?: ThemeTokens): ThemeTokens {\n if (!override) return base;\n const merged: ThemeTokens = { ...base, ...override };\n for (const key of [\"radius\", \"spacing\", \"container\", \"dark\"] as const) {\n if (base[key] && override[key]) {\n merged[key] = { ...base[key], ...override[key] } as never;\n } else if (base[key] && !override[key]) {\n merged[key] = base[key] as never;\n }\n }\n return merged;\n}\n\n/**\n * Afzender-instelling voor formulier-e-mail. Een provider mag alleen versturen vanaf een\n * geverifieerd domein, dus dit is per site instelbaar:\n * - mode \"xicms\": from = verifiedSender (XiCMS-domein), replyTo = inzender/klant. Werkt direct.\n * - mode \"client\": from = het geverifieerde eigen domein van de klant.\n */\nexport const FormsSenderSchema = z.object({\n mode: z.enum([\"xicms\", \"client\"]).default(\"xicms\"),\n /** Geverifieerd from-adres (verplicht ongeacht mode; bij \"client\" het klant-domein). */\n fromEmail: z.string().email().optional(),\n fromName: z.string().max(120).optional(),\n /** Waar notificaties heen gaan (meestal het klant-mailadres). */\n notifyTo: z.string().email().optional(),\n});\nexport type FormsSender = z.infer<typeof FormsSenderSchema>;\n\n/** Eén social-link (platform + url). */\nexport const SocialLinkSchema = z.object({\n platform: z.string().min(1).max(40),\n href: z.string().min(1).max(2000),\n});\nexport type SocialLink = z.infer<typeof SocialLinkSchema>;\n\n/** Eén footer-kolom: kop + links. */\nexport const FooterColumnSchema = z.object({\n heading: z.string().max(120).optional(),\n links: z.array(NavItemSchema).max(20).default([]),\n});\n\n/** Bewerkbare footer (klant past dit aan in /beheer; core levert de unstyled `SiteFooter`). */\nexport const FooterSettingsSchema = z.object({\n columns: z.array(FooterColumnSchema).max(6).optional(),\n social: z.array(SocialLinkSchema).max(12).optional(),\n copyright: z.string().max(300).optional(),\n /** Toon de \"Beheer\"-link in de footer (default: aan). */\n showAdminLink: z.boolean().optional(),\n});\nexport type FooterSettings = z.infer<typeof FooterSettingsSchema>;\n\n/** Per-module activatie/instellingen (spiegelt ModulesSiteConfig; permissief gehouden). */\nexport const ModulesSettingsSchema = z.record(\n z.string(),\n z.union([\n z.boolean(),\n z.object({ enabled: z.boolean().optional(), config: z.record(z.string(), z.unknown()).optional() }),\n ]),\n);\n\n/** Het `sites/{siteId}/settings/site`-document: alle bewerkbare site-instellingen. */\nexport const SiteSettingsSchema = z.object({\n name: z.string().min(1).max(160).optional(),\n // Zelfde hostname-regel als SiteConfigSchema.domain (geen protocol/pad).\n domain: z\n .string()\n .max(255)\n .regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i, \"alleen een hostname, bv. 'www.klant.nl' (zonder https:// of pad)\")\n .optional()\n .or(z.literal(\"\")),\n contactEmail: z.string().email().optional(),\n nav: z.array(NavItemSchema).max(50).optional(),\n theme: ThemeSchema.optional(),\n seoDefaults: SeoSchema.optional(),\n forms: FormsSenderSchema.optional(),\n footer: FooterSettingsSchema.optional(),\n modules: ModulesSettingsSchema.optional(),\n});\nexport type SiteSettings = z.infer<typeof SiteSettingsSchema>;\n\n/**\n * Publiek-veilige presentatie-instellingen (`sites/{siteId}/settings/public`): wordt door de live\n * site gelezen (footer, thema, nav, modules) zónder de gevoelige velden (e-mailafzender, contact)\n * uit `settings/site` bloot te geven.\n */\nexport const PublicSiteSettingsSchema = z.object({\n name: z.string().max(160).optional(),\n nav: z.array(NavItemSchema).max(50).optional(),\n theme: ThemeSchema.optional(),\n seoDefaults: SeoSchema.optional(),\n footer: FooterSettingsSchema.optional(),\n modules: ModulesSettingsSchema.optional(),\n});\nexport type PublicSiteSettings = z.infer<typeof PublicSiteSettingsSchema>;\n\n/** Haalt de publiek-veilige subset uit de volledige settings (voor het `settings/public`-doc). */\nexport function toPublicSettings(s: SiteSettings): PublicSiteSettings {\n return {\n name: s.name,\n nav: s.nav,\n theme: s.theme,\n seoDefaults: s.seoDefaults,\n footer: s.footer,\n modules: s.modules,\n };\n}\n"],"mappings":"AAAA,SAAS,SAAS;AAClB,SAAS,iBAAiB;AAGnB,MAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC/B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAClC,CAAC;AAIM,MAAM,cAAc,EAAE,OAAO;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;AAAA,EAC1B,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACpC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACxC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACxC,YAAY,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAEzC,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAE1C,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAEtC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA;AAAA,EAEvI,SAAS,EACN,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAChC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAChC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAChC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAChC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAClC,CAAC,EACA,SAAS;AAAA;AAAA,EAEZ,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS;AAAA;AAAA,EAElH,MAAM,EACH,OAAO;AAAA,IACN,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAC/B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IACxC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IACxC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,SAAS;AACd,CAAC;AASM,SAAS,iBAAiB,MAAmB,UAAqC;AACvF,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAsB,EAAE,GAAG,MAAM,GAAG,SAAS;AACnD,aAAW,OAAO,CAAC,UAAU,WAAW,aAAa,MAAM,GAAY;AACrE,QAAI,KAAK,GAAG,KAAK,SAAS,GAAG,GAAG;AAC9B,aAAO,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,SAAS,GAAG,EAAE;AAAA,IACjD,WAAW,KAAK,GAAG,KAAK,CAAC,SAAS,GAAG,GAAG;AACtC,aAAO,GAAG,IAAI,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAQO,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,MAAM,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO;AAAA;AAAA,EAEjD,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EACvC,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAEvC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AACxC,CAAC;AAIM,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAClC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAClC,CAAC;AAIM,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACtC,OAAO,EAAE,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAGM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,SAAS,EAAE,MAAM,kBAAkB,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrD,QAAQ,EAAE,MAAM,gBAAgB,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACnD,WAAW,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAExC,eAAe,EAAE,QAAQ,EAAE,SAAS;AACtC,CAAC;AAIM,MAAM,wBAAwB,EAAE;AAAA,EACrC,EAAE,OAAO;AAAA,EACT,EAAE,MAAM;AAAA,IACN,EAAE,QAAQ;AAAA,IACV,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,EACpG,CAAC;AACH;AAGO,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EAE1C,QAAQ,EACL,OAAO,EACP,IAAI,GAAG,EACP,MAAM,sEAAsE,kEAAkE,EAC9I,SAAS,EACT,GAAG,EAAE,QAAQ,EAAE,CAAC;AAAA,EACnB,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,EAC1C,KAAK,EAAE,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAC7C,OAAO,YAAY,SAAS;AAAA,EAC5B,aAAa,UAAU,SAAS;AAAA,EAChC,OAAO,kBAAkB,SAAS;AAAA,EAClC,QAAQ,qBAAqB,SAAS;AAAA,EACtC,SAAS,sBAAsB,SAAS;AAC1C,CAAC;AAQM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,MAAM,aAAa,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAC7C,OAAO,YAAY,SAAS;AAAA,EAC5B,aAAa,UAAU,SAAS;AAAA,EAChC,QAAQ,qBAAqB,SAAS;AAAA,EACtC,SAAS,sBAAsB,SAAS;AAC1C,CAAC;AAIM,SAAS,iBAAiB,GAAqC;AACpE,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,IACV,SAAS,EAAE;AAAA,EACb;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/schema/settings.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { SeoSchema } from \"./seo\";\n\n/** Eén navigatie-item. */\nexport const NavItemSchema = z.object({\n label: z.string().min(1).max(80),\n href: z.string().min(1).max(2000),\n});\nexport type NavItem = z.infer<typeof NavItemSchema>;\n\n/** Huisstijl-tokens (worden CSS custom properties). Alle uitbreidingen zijn optioneel/update-veilig. */\nexport const ThemeSchema = z.object({\n primary: z.string().max(40),\n accent: z.string().max(40).optional(),\n /** Logo-URL (absoluut, https) — gebruikt in de mail-header en op de factuur-PDF. */\n logo: z.string().max(500).optional(),\n background: z.string().max(40).optional(),\n foreground: z.string().max(40).optional(),\n fontFamily: z.string().max(200).optional(),\n /** Optioneel apart lettertype voor koppen (display/serif), voor een elegantere typografie. */\n headingFont: z.string().max(200).optional(),\n /** Optionele stylesheet-URL voor het lettertype (bv. een Google Fonts CSS-link). */\n fontUrl: z.string().max(500).optional(),\n /** Afrondingsschaal (sm/md/lg). */\n radius: z.object({ sm: z.string().max(20).optional(), md: z.string().max(20).optional(), lg: z.string().max(20).optional() }).optional(),\n /** Ruimteschaal voor block-padding (xs..xl). */\n spacing: z\n .object({\n xs: z.string().max(20).optional(),\n sm: z.string().max(20).optional(),\n md: z.string().max(20).optional(),\n lg: z.string().max(20).optional(),\n xl: z.string().max(20).optional(),\n })\n .optional(),\n /** Maximale container-breedte + horizontale padding. */\n container: z.object({ maxWidth: z.string().max(20).optional(), padding: z.string().max(20).optional() }).optional(),\n /** Optionele donkere modus (volgt het systeem als `auto`). */\n dark: z\n .object({\n auto: z.boolean().default(false),\n background: z.string().max(40).optional(),\n foreground: z.string().max(40).optional(),\n primary: z.string().max(40).optional(),\n })\n .optional(),\n});\nexport type ThemeTokens = z.infer<typeof ThemeSchema>;\n\n/**\n * Voegt live thema-instellingen (uit `settings/public.theme`, /beheer) per token samen met het\n * statische SiteConfig-thema. Firestore wint per veld waar gezet; geneste schalen (radius/spacing/\n * container/dark) mergen per subveld, zodat een klant die alleen kleuren wijzigt de fonts/radius\n * uit de repo behoudt. Puur (geen React) — gedeeld door provider en `useMergedSiteConfig`.\n */\nexport function mergeThemeTokens(base: ThemeTokens, override?: ThemeTokens): ThemeTokens {\n if (!override) return base;\n const merged: ThemeTokens = { ...base, ...override };\n for (const key of [\"radius\", \"spacing\", \"container\", \"dark\"] as const) {\n if (base[key] && override[key]) {\n merged[key] = { ...base[key], ...override[key] } as never;\n } else if (base[key] && !override[key]) {\n merged[key] = base[key] as never;\n }\n }\n return merged;\n}\n\n/**\n * Afzender-instelling voor formulier-e-mail. Een provider mag alleen versturen vanaf een\n * geverifieerd domein, dus dit is per site instelbaar:\n * - mode \"xicms\": from = verifiedSender (XiCMS-domein), replyTo = inzender/klant. Werkt direct.\n * - mode \"client\": from = het geverifieerde eigen domein van de klant.\n */\nexport const FormsSenderSchema = z.object({\n mode: z.enum([\"xicms\", \"client\"]).default(\"xicms\"),\n /** Geverifieerd from-adres (verplicht ongeacht mode; bij \"client\" het klant-domein). */\n fromEmail: z.string().email().optional(),\n fromName: z.string().max(120).optional(),\n /** Waar notificaties heen gaan (meestal het klant-mailadres). */\n notifyTo: z.string().email().optional(),\n});\nexport type FormsSender = z.infer<typeof FormsSenderSchema>;\n\n/** Eén social-link (platform + url). */\nexport const SocialLinkSchema = z.object({\n platform: z.string().min(1).max(40),\n href: z.string().min(1).max(2000),\n});\nexport type SocialLink = z.infer<typeof SocialLinkSchema>;\n\n/** Eén footer-kolom: kop + links. */\nexport const FooterColumnSchema = z.object({\n heading: z.string().max(120).optional(),\n links: z.array(NavItemSchema).max(20).default([]),\n});\n\n/** Bewerkbare footer (klant past dit aan in /beheer; core levert de unstyled `SiteFooter`). */\nexport const FooterSettingsSchema = z.object({\n columns: z.array(FooterColumnSchema).max(6).optional(),\n social: z.array(SocialLinkSchema).max(12).optional(),\n copyright: z.string().max(300).optional(),\n /** Toon de \"Beheer\"-link in de footer (default: aan). */\n showAdminLink: z.boolean().optional(),\n});\nexport type FooterSettings = z.infer<typeof FooterSettingsSchema>;\n\n/** Per-module activatie/instellingen (spiegelt ModulesSiteConfig; permissief gehouden). */\nexport const ModulesSettingsSchema = z.record(\n z.string(),\n z.union([\n z.boolean(),\n z.object({ enabled: z.boolean().optional(), config: z.record(z.string(), z.unknown()).optional() }),\n ]),\n);\n\n/** Het `sites/{siteId}/settings/site`-document: alle bewerkbare site-instellingen. */\nexport const SiteSettingsSchema = z.object({\n name: z.string().min(1).max(160).optional(),\n // Zelfde hostname-regel als SiteConfigSchema.domain (geen protocol/pad).\n domain: z\n .string()\n .max(255)\n .regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/i, \"alleen een hostname, bv. 'www.klant.nl' (zonder https:// of pad)\")\n .optional()\n .or(z.literal(\"\")),\n contactEmail: z.string().email().optional(),\n nav: z.array(NavItemSchema).max(50).optional(),\n theme: ThemeSchema.optional(),\n seoDefaults: SeoSchema.optional(),\n forms: FormsSenderSchema.optional(),\n footer: FooterSettingsSchema.optional(),\n modules: ModulesSettingsSchema.optional(),\n});\nexport type SiteSettings = z.infer<typeof SiteSettingsSchema>;\n\n/**\n * Publiek-veilige presentatie-instellingen (`sites/{siteId}/settings/public`): wordt door de live\n * site gelezen (footer, thema, nav, modules) zónder de gevoelige velden (e-mailafzender, contact)\n * uit `settings/site` bloot te geven.\n */\nexport const PublicSiteSettingsSchema = z.object({\n name: z.string().max(160).optional(),\n nav: z.array(NavItemSchema).max(50).optional(),\n theme: ThemeSchema.optional(),\n seoDefaults: SeoSchema.optional(),\n footer: FooterSettingsSchema.optional(),\n modules: ModulesSettingsSchema.optional(),\n});\nexport type PublicSiteSettings = z.infer<typeof PublicSiteSettingsSchema>;\n\n/** Haalt de publiek-veilige subset uit de volledige settings (voor het `settings/public`-doc). */\nexport function toPublicSettings(s: SiteSettings): PublicSiteSettings {\n return {\n name: s.name,\n nav: s.nav,\n theme: s.theme,\n seoDefaults: s.seoDefaults,\n footer: s.footer,\n modules: s.modules,\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/schema/shop.d.ts
CHANGED
|
@@ -333,84 +333,7 @@ export declare const DiscountCodeSchema: z.ZodObject<{
|
|
|
333
333
|
usedCount?: number | undefined;
|
|
334
334
|
}>;
|
|
335
335
|
export type DiscountCode = z.infer<typeof DiscountCodeSchema>;
|
|
336
|
-
export
|
|
337
|
-
export type MailTemplateKey = (typeof MAIL_TEMPLATE_KEYS)[number];
|
|
338
|
-
/**
|
|
339
|
-
* `sites/{siteId}/settings/mailTemplates` — per template onderwerp + platte tekst met
|
|
340
|
-
* `{{placeholders}}` ({{naam}}, {{ordernummer}}, {{regels}}, {{totaal}}, {{verzendadres}},
|
|
341
|
-
* {{trackingUrl}}, {{sitenaam}}, {{notitie}}). Ontbrekend veld → ingebouwde default.
|
|
342
|
-
*/
|
|
343
|
-
export declare const MailTemplateSchema: z.ZodObject<{
|
|
344
|
-
subject: z.ZodOptional<z.ZodString>;
|
|
345
|
-
bodyText: z.ZodOptional<z.ZodString>;
|
|
346
|
-
}, "strip", z.ZodTypeAny, {
|
|
347
|
-
subject?: string | undefined;
|
|
348
|
-
bodyText?: string | undefined;
|
|
349
|
-
}, {
|
|
350
|
-
subject?: string | undefined;
|
|
351
|
-
bodyText?: string | undefined;
|
|
352
|
-
}>;
|
|
353
|
-
export declare const MailTemplatesSchema: z.ZodObject<Record<"orderConfirmation" | "orderShipped" | "orderCancelled" | "orderRefunded" | "donationThanks" | "formConfirmation", z.ZodOptional<z.ZodObject<{
|
|
354
|
-
subject: z.ZodOptional<z.ZodString>;
|
|
355
|
-
bodyText: z.ZodOptional<z.ZodString>;
|
|
356
|
-
}, "strip", z.ZodTypeAny, {
|
|
357
|
-
subject?: string | undefined;
|
|
358
|
-
bodyText?: string | undefined;
|
|
359
|
-
}, {
|
|
360
|
-
subject?: string | undefined;
|
|
361
|
-
bodyText?: string | undefined;
|
|
362
|
-
}>>>, "strip", z.ZodTypeAny, {
|
|
363
|
-
orderConfirmation?: {
|
|
364
|
-
subject?: string | undefined;
|
|
365
|
-
bodyText?: string | undefined;
|
|
366
|
-
} | undefined;
|
|
367
|
-
orderShipped?: {
|
|
368
|
-
subject?: string | undefined;
|
|
369
|
-
bodyText?: string | undefined;
|
|
370
|
-
} | undefined;
|
|
371
|
-
orderCancelled?: {
|
|
372
|
-
subject?: string | undefined;
|
|
373
|
-
bodyText?: string | undefined;
|
|
374
|
-
} | undefined;
|
|
375
|
-
orderRefunded?: {
|
|
376
|
-
subject?: string | undefined;
|
|
377
|
-
bodyText?: string | undefined;
|
|
378
|
-
} | undefined;
|
|
379
|
-
donationThanks?: {
|
|
380
|
-
subject?: string | undefined;
|
|
381
|
-
bodyText?: string | undefined;
|
|
382
|
-
} | undefined;
|
|
383
|
-
formConfirmation?: {
|
|
384
|
-
subject?: string | undefined;
|
|
385
|
-
bodyText?: string | undefined;
|
|
386
|
-
} | undefined;
|
|
387
|
-
}, {
|
|
388
|
-
orderConfirmation?: {
|
|
389
|
-
subject?: string | undefined;
|
|
390
|
-
bodyText?: string | undefined;
|
|
391
|
-
} | undefined;
|
|
392
|
-
orderShipped?: {
|
|
393
|
-
subject?: string | undefined;
|
|
394
|
-
bodyText?: string | undefined;
|
|
395
|
-
} | undefined;
|
|
396
|
-
orderCancelled?: {
|
|
397
|
-
subject?: string | undefined;
|
|
398
|
-
bodyText?: string | undefined;
|
|
399
|
-
} | undefined;
|
|
400
|
-
orderRefunded?: {
|
|
401
|
-
subject?: string | undefined;
|
|
402
|
-
bodyText?: string | undefined;
|
|
403
|
-
} | undefined;
|
|
404
|
-
donationThanks?: {
|
|
405
|
-
subject?: string | undefined;
|
|
406
|
-
bodyText?: string | undefined;
|
|
407
|
-
} | undefined;
|
|
408
|
-
formConfirmation?: {
|
|
409
|
-
subject?: string | undefined;
|
|
410
|
-
bodyText?: string | undefined;
|
|
411
|
-
} | undefined;
|
|
412
|
-
}>;
|
|
413
|
-
export type MailTemplates = z.infer<typeof MailTemplatesSchema>;
|
|
336
|
+
export { MAIL_TEMPLATE_KEYS, MAIL_TEMPLATE_DEFS, MailTemplateSchema, MailTemplatesSchema, type MailTemplateKey, type MailTemplates, } from "./mail";
|
|
414
337
|
export declare const OrderStatusSchema: z.ZodEnum<["pending", "paid", "shipped", "cancelled", "refunded"]>;
|
|
415
338
|
export type OrderStatus = z.infer<typeof OrderStatusSchema>;
|
|
416
339
|
/** Orderregel: snapshot van naam/prijs op besteldatum — blijft kloppen als het product wijzigt. */
|
package/dist/schema/shop.js
CHANGED
|
@@ -93,21 +93,12 @@ const DiscountCodeSchema = z.object({
|
|
|
93
93
|
maxUses: z.number().int().min(0).max(1e6).default(0),
|
|
94
94
|
usedCount: z.number().int().min(0).default(0)
|
|
95
95
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"formConfirmation"
|
|
103
|
-
];
|
|
104
|
-
const MailTemplateSchema = z.object({
|
|
105
|
-
subject: z.string().max(200).optional(),
|
|
106
|
-
bodyText: z.string().max(1e4).optional()
|
|
107
|
-
});
|
|
108
|
-
const MailTemplatesSchema = z.object(
|
|
109
|
-
Object.fromEntries(MAIL_TEMPLATE_KEYS.map((k) => [k, MailTemplateSchema.optional()]))
|
|
110
|
-
);
|
|
96
|
+
import {
|
|
97
|
+
MAIL_TEMPLATE_KEYS,
|
|
98
|
+
MAIL_TEMPLATE_DEFS,
|
|
99
|
+
MailTemplateSchema,
|
|
100
|
+
MailTemplatesSchema
|
|
101
|
+
} from "./mail";
|
|
111
102
|
const OrderStatusSchema = z.enum(["pending", "paid", "shipped", "cancelled", "refunded"]);
|
|
112
103
|
const OrderItemSchema = z.object({
|
|
113
104
|
kind: z.enum(["product", "donation"]).default("product"),
|
|
@@ -271,6 +262,7 @@ export {
|
|
|
271
262
|
CreateOrderItemInputSchema,
|
|
272
263
|
DiscountCodeSchema,
|
|
273
264
|
DonationBlockSchema,
|
|
265
|
+
MAIL_TEMPLATE_DEFS,
|
|
274
266
|
MAIL_TEMPLATE_KEYS,
|
|
275
267
|
MailTemplateSchema,
|
|
276
268
|
MailTemplatesSchema,
|