@xiwebdesign/xicms-core 6.1.1 → 6.2.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.
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Webwinkel-beheer: bestellingen, producten, categorieën, kortingscodes, e-mailtemplates,
3
- * winkel-instellingen en koppelingen (betaalprovider Stripe/Mollie). De mailprovider is
4
- * site-breed en staat onder Instellingen → E-mail (zie docs/SHARED-SETTINGS.md).
2
+ * Webwinkel-beheer: bestellingen, producten, categorieën, kortingscodes, winkel-instellingen en
3
+ * koppelingen (betaalprovider Stripe/Mollie). De mailprovider én de bewerkbare e-mailteksten zijn
4
+ * site-breed en staan onder Instellingen → E-mail / E-mailteksten (zie docs/SHARED-SETTINGS.md).
5
5
  */
6
6
  export declare function ShopPanel({ siteId }: {
7
7
  siteId: string;
@@ -5,7 +5,6 @@ import { ProductsTab } from "./ProductsTab";
5
5
  import { CategoriesTab } from "./CategoriesTab";
6
6
  import { OrdersTab } from "./OrdersTab";
7
7
  import { DiscountsTab } from "./DiscountsTab";
8
- import { EmailsTab } from "./EmailsTab";
9
8
  import { ShopSettingsTab } from "./ShopSettingsTab";
10
9
  import { ConnectionsTab } from "./ConnectionsTab";
11
10
  function ShopPanel({ siteId }) {
@@ -15,7 +14,6 @@ function ShopPanel({ siteId }) {
15
14
  /* @__PURE__ */ jsx(TabsTrigger, { value: "products", children: "Producten" }),
16
15
  /* @__PURE__ */ jsx(TabsTrigger, { value: "categories", children: "Categorie\xEBn" }),
17
16
  /* @__PURE__ */ jsx(TabsTrigger, { value: "discounts", children: "Kortingen" }),
18
- /* @__PURE__ */ jsx(TabsTrigger, { value: "emails", children: "E-mails" }),
19
17
  /* @__PURE__ */ jsx(TabsTrigger, { value: "settings", children: "Instellingen" }),
20
18
  /* @__PURE__ */ jsx(TabsTrigger, { value: "connections", children: "Koppelingen" })
21
19
  ] }),
@@ -23,7 +21,6 @@ function ShopPanel({ siteId }) {
23
21
  /* @__PURE__ */ jsx(TabsContent, { value: "products", children: /* @__PURE__ */ jsx(ProductsTab, { siteId }) }),
24
22
  /* @__PURE__ */ jsx(TabsContent, { value: "categories", children: /* @__PURE__ */ jsx(CategoriesTab, { siteId }) }),
25
23
  /* @__PURE__ */ jsx(TabsContent, { value: "discounts", children: /* @__PURE__ */ jsx(DiscountsTab, { siteId }) }),
26
- /* @__PURE__ */ jsx(TabsContent, { value: "emails", children: /* @__PURE__ */ jsx(EmailsTab, { siteId }) }),
27
24
  /* @__PURE__ */ jsx(TabsContent, { value: "settings", children: /* @__PURE__ */ jsx(ShopSettingsTab, { siteId }) }),
28
25
  /* @__PURE__ */ jsx(TabsContent, { value: "connections", children: /* @__PURE__ */ jsx(ConnectionsTab, { siteId }) })
29
26
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/shop/ShopPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../ui/tabs\";\nimport { ProductsTab } from \"./ProductsTab\";\nimport { CategoriesTab } from \"./CategoriesTab\";\nimport { OrdersTab } from \"./OrdersTab\";\nimport { DiscountsTab } from \"./DiscountsTab\";\nimport { EmailsTab } from \"./EmailsTab\";\nimport { ShopSettingsTab } from \"./ShopSettingsTab\";\nimport { ConnectionsTab } from \"./ConnectionsTab\";\n\n/**\n * Webwinkel-beheer: bestellingen, producten, categorieën, kortingscodes, e-mailtemplates,\n * winkel-instellingen en koppelingen (betaalprovider Stripe/Mollie). De mailprovider is\n * site-breed en staat onder Instellingen → E-mail (zie docs/SHARED-SETTINGS.md).\n */\nexport function ShopPanel({ siteId }: { siteId: string }) {\n return (\n <Tabs defaultValue=\"orders\">\n <TabsList>\n <TabsTrigger value=\"orders\">Bestellingen</TabsTrigger>\n <TabsTrigger value=\"products\">Producten</TabsTrigger>\n <TabsTrigger value=\"categories\">Categorieën</TabsTrigger>\n <TabsTrigger value=\"discounts\">Kortingen</TabsTrigger>\n <TabsTrigger value=\"emails\">E-mails</TabsTrigger>\n <TabsTrigger value=\"settings\">Instellingen</TabsTrigger>\n <TabsTrigger value=\"connections\">Koppelingen</TabsTrigger>\n </TabsList>\n <TabsContent value=\"orders\">\n <OrdersTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"products\">\n <ProductsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"categories\">\n <CategoriesTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"discounts\">\n <DiscountsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"emails\">\n <EmailsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"settings\">\n <ShopSettingsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"connections\">\n <ConnectionsTab siteId={siteId} />\n </TabsContent>\n </Tabs>\n );\n}\n"],"mappings":";AAmBM,SACE,KADF;AAjBN,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAOxB,SAAS,UAAU,EAAE,OAAO,GAAuB;AACxD,SACE,qBAAC,QAAK,cAAa,UACjB;AAAA,yBAAC,YACC;AAAA,0BAAC,eAAY,OAAM,UAAS,0BAAY;AAAA,MACxC,oBAAC,eAAY,OAAM,YAAW,uBAAS;AAAA,MACvC,oBAAC,eAAY,OAAM,cAAa,4BAAW;AAAA,MAC3C,oBAAC,eAAY,OAAM,aAAY,uBAAS;AAAA,MACxC,oBAAC,eAAY,OAAM,UAAS,qBAAO;AAAA,MACnC,oBAAC,eAAY,OAAM,YAAW,0BAAY;AAAA,MAC1C,oBAAC,eAAY,OAAM,eAAc,yBAAW;AAAA,OAC9C;AAAA,IACA,oBAAC,eAAY,OAAM,UACjB,8BAAC,aAAU,QAAgB,GAC7B;AAAA,IACA,oBAAC,eAAY,OAAM,YACjB,8BAAC,eAAY,QAAgB,GAC/B;AAAA,IACA,oBAAC,eAAY,OAAM,cACjB,8BAAC,iBAAc,QAAgB,GACjC;AAAA,IACA,oBAAC,eAAY,OAAM,aACjB,8BAAC,gBAAa,QAAgB,GAChC;AAAA,IACA,oBAAC,eAAY,OAAM,UACjB,8BAAC,aAAU,QAAgB,GAC7B;AAAA,IACA,oBAAC,eAAY,OAAM,YACjB,8BAAC,mBAAgB,QAAgB,GACnC;AAAA,IACA,oBAAC,eAAY,OAAM,eACjB,8BAAC,kBAAe,QAAgB,GAClC;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/shop/ShopPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../ui/tabs\";\nimport { ProductsTab } from \"./ProductsTab\";\nimport { CategoriesTab } from \"./CategoriesTab\";\nimport { OrdersTab } from \"./OrdersTab\";\nimport { DiscountsTab } from \"./DiscountsTab\";\nimport { ShopSettingsTab } from \"./ShopSettingsTab\";\nimport { ConnectionsTab } from \"./ConnectionsTab\";\n\n/**\n * Webwinkel-beheer: bestellingen, producten, categorieën, kortingscodes, winkel-instellingen en\n * koppelingen (betaalprovider Stripe/Mollie). De mailprovider én de bewerkbare e-mailteksten zijn\n * site-breed en staan onder Instellingen → E-mail / E-mailteksten (zie docs/SHARED-SETTINGS.md).\n */\nexport function ShopPanel({ siteId }: { siteId: string }) {\n return (\n <Tabs defaultValue=\"orders\">\n <TabsList>\n <TabsTrigger value=\"orders\">Bestellingen</TabsTrigger>\n <TabsTrigger value=\"products\">Producten</TabsTrigger>\n <TabsTrigger value=\"categories\">Categorieën</TabsTrigger>\n <TabsTrigger value=\"discounts\">Kortingen</TabsTrigger>\n <TabsTrigger value=\"settings\">Instellingen</TabsTrigger>\n <TabsTrigger value=\"connections\">Koppelingen</TabsTrigger>\n </TabsList>\n <TabsContent value=\"orders\">\n <OrdersTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"products\">\n <ProductsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"categories\">\n <CategoriesTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"discounts\">\n <DiscountsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"settings\">\n <ShopSettingsTab siteId={siteId} />\n </TabsContent>\n <TabsContent value=\"connections\">\n <ConnectionsTab siteId={siteId} />\n </TabsContent>\n </Tabs>\n );\n}\n"],"mappings":";AAkBM,SACE,KADF;AAhBN,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAOxB,SAAS,UAAU,EAAE,OAAO,GAAuB;AACxD,SACE,qBAAC,QAAK,cAAa,UACjB;AAAA,yBAAC,YACC;AAAA,0BAAC,eAAY,OAAM,UAAS,0BAAY;AAAA,MACxC,oBAAC,eAAY,OAAM,YAAW,uBAAS;AAAA,MACvC,oBAAC,eAAY,OAAM,cAAa,4BAAW;AAAA,MAC3C,oBAAC,eAAY,OAAM,aAAY,uBAAS;AAAA,MACxC,oBAAC,eAAY,OAAM,YAAW,0BAAY;AAAA,MAC1C,oBAAC,eAAY,OAAM,eAAc,yBAAW;AAAA,OAC9C;AAAA,IACA,oBAAC,eAAY,OAAM,UACjB,8BAAC,aAAU,QAAgB,GAC7B;AAAA,IACA,oBAAC,eAAY,OAAM,YACjB,8BAAC,eAAY,QAAgB,GAC/B;AAAA,IACA,oBAAC,eAAY,OAAM,cACjB,8BAAC,iBAAc,QAAgB,GACjC;AAAA,IACA,oBAAC,eAAY,OAAM,aACjB,8BAAC,gBAAa,QAAgB,GAChC;AAAA,IACA,oBAAC,eAAY,OAAM,YACjB,8BAAC,mBAAgB,QAAgB,GACnC;AAAA,IACA,oBAAC,eAAY,OAAM,eACjB,8BAAC,kBAAe,QAAgB,GAClC;AAAA,KACF;AAEJ;","names":[]}
package/dist/admin.css CHANGED
@@ -1 +1 @@
1
- .container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.xicms-admin .visible{visibility:visible}.xicms-admin .static{position:static}.xicms-admin .fixed{position:fixed}.xicms-admin .absolute{position:absolute}.xicms-admin .relative{position:relative}.xicms-admin .sticky{position:sticky}.xicms-admin .inset-0{inset:0}.xicms-admin .-right-2{right:-.5rem}.xicms-admin .-top-2{top:-.5rem}.xicms-admin .z-\[10010\]{z-index:10010}.xicms-admin .mb-1{margin-bottom:.25rem}.xicms-admin .mb-2{margin-bottom:.5rem}.xicms-admin .mb-3{margin-bottom:.75rem}.xicms-admin .ml-1{margin-left:.25rem}.xicms-admin .ml-auto{margin-left:auto}.xicms-admin .mr-1{margin-right:.25rem}.xicms-admin .mr-2{margin-right:.5rem}.xicms-admin .mt-1{margin-top:.25rem}.xicms-admin .mt-2{margin-top:.5rem}.xicms-admin .mt-3{margin-top:.75rem}.xicms-admin .mt-4{margin-top:1rem}.xicms-admin .mt-5{margin-top:1.25rem}.xicms-admin .\!block{display:block!important}.xicms-admin .block{display:block}.xicms-admin .inline{display:inline}.xicms-admin .flex{display:flex}.xicms-admin .inline-flex{display:inline-flex}.xicms-admin .table{display:table}.xicms-admin .grid{display:grid}.xicms-admin .hidden{display:none}.xicms-admin .aspect-square{aspect-ratio:1/1}.xicms-admin .h-10{height:2.5rem}.xicms-admin .h-14{height:3.5rem}.xicms-admin .h-16{height:4rem}.xicms-admin .h-28{height:7rem}.xicms-admin .h-32{height:8rem}.xicms-admin .h-5{height:1.25rem}.xicms-admin .h-6{height:1.5rem}.xicms-admin .h-8{height:2rem}.xicms-admin .h-9{height:2.25rem}.xicms-admin .h-fit{height:-moz-fit-content;height:fit-content}.xicms-admin .max-h-\[55vh\]{max-height:55vh}.xicms-admin .max-h-\[60vh\]{max-height:60vh}.xicms-admin .min-h-\[8rem\]{min-height:8rem}.xicms-admin .w-14{width:3.5rem}.xicms-admin .w-16{width:4rem}.xicms-admin .w-20{width:5rem}.xicms-admin .w-24{width:6rem}.xicms-admin .w-28{width:7rem}.xicms-admin .w-32{width:8rem}.xicms-admin .w-36{width:9rem}.xicms-admin .w-5{width:1.25rem}.xicms-admin .w-56{width:14rem}.xicms-admin .w-6{width:1.5rem}.xicms-admin .w-8{width:2rem}.xicms-admin .w-fit{width:-moz-fit-content;width:fit-content}.xicms-admin .w-full{width:100%}.xicms-admin .min-w-0{min-width:0}.xicms-admin .min-w-8{min-width:2rem}.xicms-admin .max-w-2xl{max-width:42rem}.xicms-admin .max-w-3xl{max-width:48rem}.xicms-admin .max-w-xl{max-width:36rem}.xicms-admin .max-w-xs{max-width:20rem}.xicms-admin .flex-1{flex:1 1 0%}.xicms-admin .shrink-0{flex-shrink:0}.xicms-admin .-translate-x-1\/2{--tw-translate-x:-50%}.xicms-admin .-translate-x-1\/2,.xicms-admin .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xicms-admin .cursor-pointer{cursor:pointer}.xicms-admin .resize{resize:both}.xicms-admin .list-decimal{list-style-type:decimal}.xicms-admin .list-disc{list-style-type:disc}.xicms-admin .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.xicms-admin .flex-col{flex-direction:column}.xicms-admin .flex-wrap{flex-wrap:wrap}.xicms-admin .place-items-center{place-items:center}.xicms-admin .items-start{align-items:flex-start}.xicms-admin .items-end{align-items:flex-end}.xicms-admin .items-center{align-items:center}.xicms-admin .justify-end{justify-content:flex-end}.xicms-admin .justify-center{justify-content:center}.xicms-admin .justify-between{justify-content:space-between}.xicms-admin .gap-0\.5{gap:.125rem}.xicms-admin .gap-1{gap:.25rem}.xicms-admin .gap-1\.5{gap:.375rem}.xicms-admin .gap-2{gap:.5rem}.xicms-admin .gap-3{gap:.75rem}.xicms-admin .gap-4{gap:1rem}.xicms-admin .gap-6{gap:1.5rem}.xicms-admin .self-end{align-self:flex-end}.xicms-admin .self-center{align-self:center}.xicms-admin .overflow-auto{overflow:auto}.xicms-admin .overflow-hidden{overflow:hidden}.xicms-admin .overflow-x-auto{overflow-x:auto}.xicms-admin .overflow-y-auto{overflow-y:auto}.xicms-admin .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xicms-admin .whitespace-pre-wrap{white-space:pre-wrap}.xicms-admin .rounded{border-radius:.25rem}.xicms-admin .rounded-full{border-radius:9999px}.xicms-admin .rounded-lg{border-radius:.5rem}.xicms-admin .rounded-md{border-radius:.375rem}.xicms-admin .rounded-xl{border-radius:.75rem}.xicms-admin .rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xicms-admin .rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xicms-admin .rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xicms-admin .border{border-width:1px}.xicms-admin .border-b{border-bottom-width:1px}.xicms-admin .border-t{border-top-width:1px}.xicms-admin .border-t-0{border-top-width:0}.xicms-admin .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.xicms-admin .border-brand-500{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.xicms-admin .border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.xicms-admin .border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.xicms-admin .border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.xicms-admin .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.xicms-admin .bg-black\/50{background-color:rgba(0,0,0,.5)}.xicms-admin .bg-brand-50{background-color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 12%,#fff)}.xicms-admin .bg-brand-500{background-color:var(--xicms-primary,#4f46e5)}.xicms-admin .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.xicms-admin .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.xicms-admin .object-cover{-o-object-fit:cover;object-fit:cover}.xicms-admin .p-0\.5{padding:.125rem}.xicms-admin .p-1{padding:.25rem}.xicms-admin .p-2{padding:.5rem}.xicms-admin .p-3{padding:.75rem}.xicms-admin .p-4{padding:1rem}.xicms-admin .p-5{padding:1.25rem}.xicms-admin .p-6{padding:1.5rem}.xicms-admin .px-1{padding-left:.25rem;padding-right:.25rem}.xicms-admin .px-2{padding-left:.5rem;padding-right:.5rem}.xicms-admin .px-3{padding-left:.75rem;padding-right:.75rem}.xicms-admin .px-4{padding-left:1rem;padding-right:1rem}.xicms-admin .py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.xicms-admin .py-1{padding-top:.25rem;padding-bottom:.25rem}.xicms-admin .py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.xicms-admin .py-2{padding-top:.5rem;padding-bottom:.5rem}.xicms-admin .py-3{padding-top:.75rem;padding-bottom:.75rem}.xicms-admin .py-8{padding-top:2rem;padding-bottom:2rem}.xicms-admin .pl-5{padding-left:1.25rem}.xicms-admin .pr-2{padding-right:.5rem}.xicms-admin .pt-4{padding-top:1rem}.xicms-admin .pt-5{padding-top:1.25rem}.xicms-admin .text-left{text-align:left}.xicms-admin .text-center{text-align:center}.xicms-admin .text-right{text-align:right}.xicms-admin .align-top{vertical-align:top}.xicms-admin .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.xicms-admin .text-3xl{font-size:1.875rem;line-height:2.25rem}.xicms-admin .text-base{font-size:1rem;line-height:1.5rem}.xicms-admin .text-lg{font-size:1.125rem;line-height:1.75rem}.xicms-admin .text-sm{font-size:.875rem;line-height:1.25rem}.xicms-admin .text-xl{font-size:1.25rem;line-height:1.75rem}.xicms-admin .text-xs{font-size:.75rem;line-height:1rem}.xicms-admin .font-bold{font-weight:700}.xicms-admin .font-medium{font-weight:500}.xicms-admin .font-semibold{font-weight:600}.xicms-admin .uppercase{text-transform:uppercase}.xicms-admin .italic{font-style:italic}.xicms-admin .tracking-wide{letter-spacing:.025em}.xicms-admin .text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.xicms-admin .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.xicms-admin .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.xicms-admin .text-brand-700{color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 82%,#000)}.xicms-admin .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.xicms-admin .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.xicms-admin .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.xicms-admin .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.xicms-admin .text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.xicms-admin .text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.xicms-admin .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.xicms-admin .underline{text-decoration-line:underline}.xicms-admin .opacity-70{opacity:.7}.xicms-admin .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.xicms-admin .shadow-sm,.xicms-admin .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xicms-admin .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.xicms-admin .outline-none{outline:2px solid transparent;outline-offset:2px}.xicms-admin .outline{outline-style:solid}.xicms-admin .blur{--tw-blur:blur(8px)}.xicms-admin .blur,.xicms-admin .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xicms-admin .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xicms-admin .transition-\[filter\]{transition-property:filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xicms-admin,.xicms-admin *,.xicms-admin :after,.xicms-admin :before{box-sizing:border-box}.xicms-admin{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#0f172a;line-height:1.5;-webkit-font-smoothing:antialiased;color-scheme:light;background:#fff;--color-background-body:#fff;--color-background-surface:#fff;--color-background-card:#fff;--color-background-muted:#f1f5f9;--color-text-primary:#0f172a;--color-text-secondary:#475569;--color-border:#e2e8f0;--color-accent:#4f46e5;--color-on-accent:#fff;--color-error:#dc2626}.xicms-admin figure,.xicms-admin h1,.xicms-admin h2,.xicms-admin h3,.xicms-admin p{margin:0}.xicms-admin button{font:inherit;cursor:pointer}.xicms-admin input,.xicms-admin select,.xicms-admin textarea{font:inherit;color:inherit}.xicms-admin .ProseMirror{min-height:8rem;outline:none}.xicms-admin .ProseMirror p{margin:0 0 .6rem}.xicms-admin .ProseMirror:focus{outline:none}@media (prefers-reduced-motion:reduce){.xicms-admin *,.xicms-admin :after,.xicms-admin :before,.xicms-ve *,.xicms-ve :after,.xicms-ve :before{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.xicms-admin .last\:border-0:last-child{border-width:0}.xicms-admin .hover\:border-brand-500:hover{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.xicms-admin .hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.xicms-admin .hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.xicms-admin .hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.xicms-admin .hover\:underline:hover{text-decoration-line:underline}.xicms-admin .hover\:brightness-95:hover{--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xicms-admin .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xicms-admin .focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xicms-admin .focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity,1))}.xicms-admin .focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.xicms-admin .focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xicms-admin .focus-visible\:ring-brand-500:focus-visible{--tw-ring-color:var(--xicms-primary,#4f46e5)}.xicms-admin .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.xicms-admin .disabled\:opacity-50:disabled{opacity:.5}.xicms-admin :is(.group:hover .group-hover\:opacity-80){opacity:.8}.xicms-admin .data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-width:2px}.xicms-admin .data-\[state\=active\]\:border-brand-600[data-state=active]{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .data-\[state\=active\]\:text-brand-700[data-state=active]{color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 82%,#000)}@media (min-width:640px){.xicms-admin .sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:768px){.xicms-admin .md\:col-span-5{grid-column:span 5/span 5}.xicms-admin .md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xicms-admin .md\:grid-cols-\[1fr_110px\]{grid-template-columns:1fr 110px}.xicms-admin .md\:grid-cols-\[1fr_130px_90px_110px_auto\]{grid-template-columns:1fr 130px 90px 110px auto}.xicms-admin .md\:grid-cols-\[1fr_1fr_140px_auto_auto\]{grid-template-columns:1fr 1fr 140px auto auto}.xicms-admin .md\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.xicms-admin .md\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr}.xicms-admin .md\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.xicms-admin .md\:grid-cols-\[340px_1fr\]{grid-template-columns:340px 1fr}}@media (min-width:1024px){.xicms-admin .lg\:col-span-2{grid-column:span 2/span 2}.xicms-admin .lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
1
+ .container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.xicms-admin .visible{visibility:visible}.xicms-admin .static{position:static}.xicms-admin .fixed{position:fixed}.xicms-admin .absolute{position:absolute}.xicms-admin .relative{position:relative}.xicms-admin .sticky{position:sticky}.xicms-admin .inset-0{inset:0}.xicms-admin .-right-2{right:-.5rem}.xicms-admin .-top-2{top:-.5rem}.xicms-admin .z-\[10010\]{z-index:10010}.xicms-admin .mb-1{margin-bottom:.25rem}.xicms-admin .mb-2{margin-bottom:.5rem}.xicms-admin .mb-3{margin-bottom:.75rem}.xicms-admin .ml-1{margin-left:.25rem}.xicms-admin .ml-auto{margin-left:auto}.xicms-admin .mr-1{margin-right:.25rem}.xicms-admin .mr-2{margin-right:.5rem}.xicms-admin .mt-1{margin-top:.25rem}.xicms-admin .mt-2{margin-top:.5rem}.xicms-admin .mt-3{margin-top:.75rem}.xicms-admin .mt-4{margin-top:1rem}.xicms-admin .mt-5{margin-top:1.25rem}.xicms-admin .\!block{display:block!important}.xicms-admin .block{display:block}.xicms-admin .inline{display:inline}.xicms-admin .flex{display:flex}.xicms-admin .inline-flex{display:inline-flex}.xicms-admin .table{display:table}.xicms-admin .grid{display:grid}.xicms-admin .hidden{display:none}.xicms-admin .aspect-square{aspect-ratio:1/1}.xicms-admin .h-10{height:2.5rem}.xicms-admin .h-14{height:3.5rem}.xicms-admin .h-16{height:4rem}.xicms-admin .h-28{height:7rem}.xicms-admin .h-32{height:8rem}.xicms-admin .h-5{height:1.25rem}.xicms-admin .h-6{height:1.5rem}.xicms-admin .h-8{height:2rem}.xicms-admin .h-9{height:2.25rem}.xicms-admin .h-\[70vh\]{height:70vh}.xicms-admin .h-fit{height:-moz-fit-content;height:fit-content}.xicms-admin .max-h-\[55vh\]{max-height:55vh}.xicms-admin .max-h-\[60vh\]{max-height:60vh}.xicms-admin .min-h-\[8rem\]{min-height:8rem}.xicms-admin .w-14{width:3.5rem}.xicms-admin .w-16{width:4rem}.xicms-admin .w-20{width:5rem}.xicms-admin .w-24{width:6rem}.xicms-admin .w-28{width:7rem}.xicms-admin .w-32{width:8rem}.xicms-admin .w-36{width:9rem}.xicms-admin .w-5{width:1.25rem}.xicms-admin .w-56{width:14rem}.xicms-admin .w-6{width:1.5rem}.xicms-admin .w-8{width:2rem}.xicms-admin .w-fit{width:-moz-fit-content;width:fit-content}.xicms-admin .w-full{width:100%}.xicms-admin .min-w-0{min-width:0}.xicms-admin .min-w-8{min-width:2rem}.xicms-admin .max-w-2xl{max-width:42rem}.xicms-admin .max-w-3xl{max-width:48rem}.xicms-admin .max-w-xl{max-width:36rem}.xicms-admin .max-w-xs{max-width:20rem}.xicms-admin .flex-1{flex:1 1 0%}.xicms-admin .shrink-0{flex-shrink:0}.xicms-admin .-translate-x-1\/2{--tw-translate-x:-50%}.xicms-admin .-translate-x-1\/2,.xicms-admin .transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xicms-admin .cursor-pointer{cursor:pointer}.xicms-admin .resize{resize:both}.xicms-admin .list-decimal{list-style-type:decimal}.xicms-admin .list-disc{list-style-type:disc}.xicms-admin .grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.xicms-admin .flex-col{flex-direction:column}.xicms-admin .flex-wrap{flex-wrap:wrap}.xicms-admin .place-items-center{place-items:center}.xicms-admin .items-start{align-items:flex-start}.xicms-admin .items-end{align-items:flex-end}.xicms-admin .items-center{align-items:center}.xicms-admin .justify-end{justify-content:flex-end}.xicms-admin .justify-center{justify-content:center}.xicms-admin .justify-between{justify-content:space-between}.xicms-admin .gap-0\.5{gap:.125rem}.xicms-admin .gap-1{gap:.25rem}.xicms-admin .gap-1\.5{gap:.375rem}.xicms-admin .gap-2{gap:.5rem}.xicms-admin .gap-3{gap:.75rem}.xicms-admin .gap-4{gap:1rem}.xicms-admin .gap-6{gap:1.5rem}.xicms-admin .self-end{align-self:flex-end}.xicms-admin .self-center{align-self:center}.xicms-admin .overflow-auto{overflow:auto}.xicms-admin .overflow-hidden{overflow:hidden}.xicms-admin .overflow-x-auto{overflow-x:auto}.xicms-admin .overflow-y-auto{overflow-y:auto}.xicms-admin .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xicms-admin .whitespace-pre-wrap{white-space:pre-wrap}.xicms-admin .rounded{border-radius:.25rem}.xicms-admin .rounded-full{border-radius:9999px}.xicms-admin .rounded-lg{border-radius:.5rem}.xicms-admin .rounded-md{border-radius:.375rem}.xicms-admin .rounded-xl{border-radius:.75rem}.xicms-admin .rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xicms-admin .rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xicms-admin .rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xicms-admin .border{border-width:1px}.xicms-admin .border-b{border-bottom-width:1px}.xicms-admin .border-t{border-top-width:1px}.xicms-admin .border-t-0{border-top-width:0}.xicms-admin .border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity,1))}.xicms-admin .border-brand-500{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity,1))}.xicms-admin .border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.xicms-admin .border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.xicms-admin .border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.xicms-admin .bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.xicms-admin .bg-black\/50{background-color:rgba(0,0,0,.5)}.xicms-admin .bg-brand-50{background-color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 12%,#fff)}.xicms-admin .bg-brand-500{background-color:var(--xicms-primary,#4f46e5)}.xicms-admin .bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.xicms-admin .bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.xicms-admin .bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.xicms-admin .object-cover{-o-object-fit:cover;object-fit:cover}.xicms-admin .p-0\.5{padding:.125rem}.xicms-admin .p-1{padding:.25rem}.xicms-admin .p-2{padding:.5rem}.xicms-admin .p-3{padding:.75rem}.xicms-admin .p-4{padding:1rem}.xicms-admin .p-5{padding:1.25rem}.xicms-admin .p-6{padding:1.5rem}.xicms-admin .px-1{padding-left:.25rem;padding-right:.25rem}.xicms-admin .px-2{padding-left:.5rem;padding-right:.5rem}.xicms-admin .px-3{padding-left:.75rem;padding-right:.75rem}.xicms-admin .px-4{padding-left:1rem;padding-right:1rem}.xicms-admin .py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.xicms-admin .py-1{padding-top:.25rem;padding-bottom:.25rem}.xicms-admin .py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.xicms-admin .py-2{padding-top:.5rem;padding-bottom:.5rem}.xicms-admin .py-3{padding-top:.75rem;padding-bottom:.75rem}.xicms-admin .py-8{padding-top:2rem;padding-bottom:2rem}.xicms-admin .pl-5{padding-left:1.25rem}.xicms-admin .pr-2{padding-right:.5rem}.xicms-admin .pt-4{padding-top:1rem}.xicms-admin .pt-5{padding-top:1.25rem}.xicms-admin .text-left{text-align:left}.xicms-admin .text-center{text-align:center}.xicms-admin .text-right{text-align:right}.xicms-admin .align-top{vertical-align:top}.xicms-admin .font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.xicms-admin .text-3xl{font-size:1.875rem;line-height:2.25rem}.xicms-admin .text-\[11px\]{font-size:11px}.xicms-admin .text-base{font-size:1rem;line-height:1.5rem}.xicms-admin .text-lg{font-size:1.125rem;line-height:1.75rem}.xicms-admin .text-sm{font-size:.875rem;line-height:1.25rem}.xicms-admin .text-xl{font-size:1.25rem;line-height:1.75rem}.xicms-admin .text-xs{font-size:.75rem;line-height:1rem}.xicms-admin .font-bold{font-weight:700}.xicms-admin .font-medium{font-weight:500}.xicms-admin .font-semibold{font-weight:600}.xicms-admin .uppercase{text-transform:uppercase}.xicms-admin .italic{font-style:italic}.xicms-admin .tracking-wide{letter-spacing:.025em}.xicms-admin .text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.xicms-admin .text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.xicms-admin .text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.xicms-admin .text-brand-700{color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 82%,#000)}.xicms-admin .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.xicms-admin .text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.xicms-admin .text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.xicms-admin .text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.xicms-admin .text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.xicms-admin .text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.xicms-admin .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.xicms-admin .underline{text-decoration-line:underline}.xicms-admin .opacity-70{opacity:.7}.xicms-admin .shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.xicms-admin .shadow-sm,.xicms-admin .shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xicms-admin .shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.xicms-admin .outline-none{outline:2px solid transparent;outline-offset:2px}.xicms-admin .outline{outline-style:solid}.xicms-admin .blur{--tw-blur:blur(8px)}.xicms-admin .blur,.xicms-admin .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xicms-admin .transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xicms-admin .transition-\[filter\]{transition-property:filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xicms-admin,.xicms-admin *,.xicms-admin :after,.xicms-admin :before{box-sizing:border-box}.xicms-admin{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#0f172a;line-height:1.5;-webkit-font-smoothing:antialiased;color-scheme:light;background:#fff;--color-background-body:#fff;--color-background-surface:#fff;--color-background-card:#fff;--color-background-muted:#f1f5f9;--color-text-primary:#0f172a;--color-text-secondary:#475569;--color-border:#e2e8f0;--color-accent:#4f46e5;--color-on-accent:#fff;--color-error:#dc2626}.xicms-admin figure,.xicms-admin h1,.xicms-admin h2,.xicms-admin h3,.xicms-admin p{margin:0}.xicms-admin button{font:inherit;cursor:pointer}.xicms-admin input,.xicms-admin select,.xicms-admin textarea{font:inherit;color:inherit}.xicms-admin .ProseMirror{min-height:8rem;outline:none}.xicms-admin .ProseMirror p{margin:0 0 .6rem}.xicms-admin .ProseMirror:focus{outline:none}@media (prefers-reduced-motion:reduce){.xicms-admin *,.xicms-admin :after,.xicms-admin :before,.xicms-ve *,.xicms-ve :after,.xicms-ve :before{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.xicms-admin .last\:border-0:last-child{border-width:0}.xicms-admin .hover\:border-brand-500:hover{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.xicms-admin .hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.xicms-admin .hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.xicms-admin .hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.xicms-admin .hover\:underline:hover{text-decoration-line:underline}.xicms-admin .hover\:brightness-95:hover{--tw-brightness:brightness(.95);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xicms-admin .focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xicms-admin .focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xicms-admin .focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity,1))}.xicms-admin .focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.xicms-admin .focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xicms-admin .focus-visible\:ring-brand-500:focus-visible{--tw-ring-color:var(--xicms-primary,#4f46e5)}.xicms-admin .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.xicms-admin .disabled\:opacity-50:disabled{opacity:.5}.xicms-admin :is(.group:hover .group-hover\:opacity-80){opacity:.8}.xicms-admin .data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-width:2px}.xicms-admin .data-\[state\=active\]\:border-brand-600[data-state=active]{border-color:var(--xicms-primary,#4f46e5)}.xicms-admin .data-\[state\=active\]\:text-brand-700[data-state=active]{color:color-mix(in srgb,var(--xicms-primary,#4f46e5) 82%,#000)}@media (min-width:640px){.xicms-admin .sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:768px){.xicms-admin .md\:col-span-5{grid-column:span 5/span 5}.xicms-admin .md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xicms-admin .md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xicms-admin .md\:grid-cols-\[1fr_110px\]{grid-template-columns:1fr 110px}.xicms-admin .md\:grid-cols-\[1fr_130px_90px_110px_auto\]{grid-template-columns:1fr 130px 90px 110px auto}.xicms-admin .md\:grid-cols-\[1fr_1fr_140px_auto_auto\]{grid-template-columns:1fr 1fr 140px auto auto}.xicms-admin .md\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.xicms-admin .md\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr}.xicms-admin .md\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.xicms-admin .md\:grid-cols-\[340px_1fr\]{grid-template-columns:340px 1fr}}@media (min-width:1024px){.xicms-admin .lg\:col-span-2{grid-column:span 2/span 2}.xicms-admin .lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xicms-admin .lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@@ -8,4 +8,5 @@ export * from "./settings";
8
8
  export * from "./blocks";
9
9
  export * from "./pages";
10
10
  export * from "./forms";
11
+ export * from "./mail";
11
12
  export { defineSiteConfig, SiteConfigSchema, validateSiteConfig, type SiteConfig, type SiteMode, } from "./siteConfig";
@@ -3,6 +3,7 @@ export * from "./settings";
3
3
  export * from "./blocks";
4
4
  export * from "./pages";
5
5
  export * from "./forms";
6
+ export * from "./mail";
6
7
  import {
7
8
  defineSiteConfig,
8
9
  SiteConfigSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["/**\n * @xiwebdesign/xicms-core/schema — pure Zod-schema's + types.\n * Geen React, geen Firebase: importeerbaar in server-componenten, de sitemap-route én\n * de Cloud Functions, zodat content-validatie overal dezelfde bron gebruikt.\n */\nexport * from \"./seo\";\nexport * from \"./settings\";\nexport * from \"./blocks\";\nexport * from \"./pages\";\nexport * from \"./forms\";\n// Shop-schema's zijn opt-in: importeer via \"schema/shop\" (direct), niet via deze\n// default-barrel — zo blijft /schema shop-vrij (tree-shaking-garantie, 6.0).\nexport {\n defineSiteConfig,\n SiteConfigSchema,\n validateSiteConfig,\n type SiteConfig,\n type SiteMode,\n} from \"./siteConfig\";\n"],"mappings":"AAKA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;","names":[]}
1
+ {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["/**\n * @xiwebdesign/xicms-core/schema — pure Zod-schema's + types.\n * Geen React, geen Firebase: importeerbaar in server-componenten, de sitemap-route én\n * de Cloud Functions, zodat content-validatie overal dezelfde bron gebruikt.\n */\nexport * from \"./seo\";\nexport * from \"./settings\";\nexport * from \"./blocks\";\nexport * from \"./pages\";\nexport * from \"./forms\";\nexport * from \"./mail\";\n// Shop-schema's zijn opt-in: importeer via \"schema/shop\" (direct), niet via deze\n// default-barrel — zo blijft /schema shop-vrij (tree-shaking-garantie, 6.0).\nexport {\n defineSiteConfig,\n SiteConfigSchema,\n validateSiteConfig,\n type SiteConfig,\n type SiteMode,\n} from \"./siteConfig\";\n"],"mappings":"AAKA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;","names":[]}
@@ -0,0 +1,155 @@
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
+ export declare const MailTemplateSchema: z.ZodObject<{
70
+ subject: z.ZodOptional<z.ZodString>;
71
+ bodyText: z.ZodOptional<z.ZodString>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ subject?: string | undefined;
74
+ bodyText?: string | undefined;
75
+ }, {
76
+ subject?: string | undefined;
77
+ bodyText?: string | undefined;
78
+ }>;
79
+ export declare const MailTemplatesSchema: z.ZodObject<Record<"formNotification" | "formConfirmation" | "orderConfirmation" | "shopkeeperNotification" | "orderShipped" | "orderCancelled" | "orderRefunded" | "donationThanks", z.ZodOptional<z.ZodObject<{
80
+ subject: z.ZodOptional<z.ZodString>;
81
+ bodyText: z.ZodOptional<z.ZodString>;
82
+ }, "strip", z.ZodTypeAny, {
83
+ subject?: string | undefined;
84
+ bodyText?: string | undefined;
85
+ }, {
86
+ subject?: string | undefined;
87
+ bodyText?: string | undefined;
88
+ }>>>, "strip", z.ZodTypeAny, {
89
+ formNotification?: {
90
+ subject?: string | undefined;
91
+ bodyText?: string | undefined;
92
+ } | undefined;
93
+ formConfirmation?: {
94
+ subject?: string | undefined;
95
+ bodyText?: string | undefined;
96
+ } | undefined;
97
+ orderConfirmation?: {
98
+ subject?: string | undefined;
99
+ bodyText?: string | undefined;
100
+ } | undefined;
101
+ shopkeeperNotification?: {
102
+ subject?: string | undefined;
103
+ bodyText?: string | undefined;
104
+ } | undefined;
105
+ orderShipped?: {
106
+ subject?: string | undefined;
107
+ bodyText?: string | undefined;
108
+ } | undefined;
109
+ orderCancelled?: {
110
+ subject?: string | undefined;
111
+ bodyText?: string | undefined;
112
+ } | undefined;
113
+ orderRefunded?: {
114
+ subject?: string | undefined;
115
+ bodyText?: string | undefined;
116
+ } | undefined;
117
+ donationThanks?: {
118
+ subject?: string | undefined;
119
+ bodyText?: string | undefined;
120
+ } | undefined;
121
+ }, {
122
+ formNotification?: {
123
+ subject?: string | undefined;
124
+ bodyText?: string | undefined;
125
+ } | undefined;
126
+ formConfirmation?: {
127
+ subject?: string | undefined;
128
+ bodyText?: string | undefined;
129
+ } | undefined;
130
+ orderConfirmation?: {
131
+ subject?: string | undefined;
132
+ bodyText?: string | undefined;
133
+ } | undefined;
134
+ shopkeeperNotification?: {
135
+ subject?: string | undefined;
136
+ bodyText?: string | undefined;
137
+ } | undefined;
138
+ orderShipped?: {
139
+ subject?: string | undefined;
140
+ bodyText?: string | undefined;
141
+ } | undefined;
142
+ orderCancelled?: {
143
+ subject?: string | undefined;
144
+ bodyText?: string | undefined;
145
+ } | undefined;
146
+ orderRefunded?: {
147
+ subject?: string | undefined;
148
+ bodyText?: string | undefined;
149
+ } | undefined;
150
+ donationThanks?: {
151
+ subject?: string | undefined;
152
+ bodyText?: string | undefined;
153
+ } | undefined;
154
+ }>;
155
+ export type MailTemplates = z.infer<typeof MailTemplatesSchema>;
@@ -0,0 +1,74 @@
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 MailTemplateSchema = z.object({
62
+ subject: z.string().max(200).optional(),
63
+ bodyText: z.string().max(1e4).optional()
64
+ });
65
+ const MailTemplatesSchema = z.object(
66
+ Object.fromEntries(MAIL_TEMPLATE_DEFS.map((d) => [d.key, MailTemplateSchema.optional()]))
67
+ );
68
+ export {
69
+ MAIL_TEMPLATE_DEFS,
70
+ MAIL_TEMPLATE_KEYS,
71
+ MailTemplateSchema,
72
+ MailTemplatesSchema
73
+ };
74
+ //# 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\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;AAG9D,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":"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","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":[]}