@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.
@@ -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;
@@ -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":[]}
@@ -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 declare const MAIL_TEMPLATE_KEYS: readonly ["orderConfirmation", "orderShipped", "orderCancelled", "orderRefunded", "donationThanks", "formConfirmation"];
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. */
@@ -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
- const MAIL_TEMPLATE_KEYS = [
97
- "orderConfirmation",
98
- "orderShipped",
99
- "orderCancelled",
100
- "orderRefunded",
101
- "donationThanks",
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,