@kontakto/email-template-editor 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -7,7 +7,9 @@ var zod = require('zod');
7
7
  var server = require('react-dom/server');
8
8
  var Handlebars = require('handlebars');
9
9
  var styles = require('@mui/material/styles');
10
+ var react = require('@lingui/react');
10
11
  var material = require('@mui/material');
12
+ var core = require('@lingui/core');
11
13
  var zustand = require('zustand');
12
14
  var iconsMaterial = require('@mui/icons-material');
13
15
  var reactColorful = require('react-colorful');
@@ -2011,6 +2013,37 @@ var THEME = styles.createTheme(BASE_THEME, {
2011
2013
  ]
2012
2014
  });
2013
2015
  var theme_default = THEME;
2016
+
2017
+ // src/locales/en/messages.ts
2018
+ var messages = JSON.parse('{"drawer.library":["Library"],"drawer.new-sample":["New sample"],"drawer.new-template":["New template"],"drawer.no-samples":["No samples available"],"drawer.no-samples-match":["No samples match your filters"],"drawer.no-templates":["No saved templates yet"],"drawer.no-templates-match":["No templates match your filters"],"drawer.search-samples":["Search samples"],"drawer.search-templates":["Search templates"],"drawer.sort-by":["Sort by"],"drawer.tab.outline":["Outline"],"drawer.tab.samples":["Samples"],"drawer.tab.templates":["Templates"],"drawer.tag.all":["All"],"panel.avatar-block":["Avatar block"],"panel.button-block":["Button block"],"panel.columns-block":["Columns block"],"panel.container-block":["Container block"],"panel.divider-block":["Divider block"],"panel.editor-appearance":["Editor appearance"],"panel.export":["Export"],"panel.global":["Global"],"panel.heading-block":["Heading block"],"panel.html-block":["HTML block"],"panel.image-block":["Image block"],"panel.signature-block":["Signature block"],"panel.spacer-block":["Spacer block"],"panel.template":["Template"],"panel.text-block":["Text block"],"savebar.error-saving":["Error saving"],"savebar.new":["New"],"savebar.new-template-created":["New template created"],"savebar.sample-prefix":["Sample"],"savebar.sample-saved":["Sample saved"],"savebar.save":["Save"],"savebar.save-as":["Save as\u2026"],"savebar.save-as-new":["Save as new\u2026"],"savebar.save-as-new-template":["Save as a new template"],"savebar.save-changes":["Save changes"],"savebar.save-changes-to-sample":["Save changes to this sample"],"savebar.start-fresh":["Start a fresh template"],"savebar.template-saved":["Template saved"],"sort.last-updated":["Last updated"],"sort.name":["Name (A\u2013Z)"],"sort.recently-created":["Recently created"],"style.alignment":["Alignment"],"style.background-color":["Background color"],"style.border-color":["Border color"],"style.border-radius":["Border radius"],"style.font-family":["Font family"],"style.font-size":["Font size"],"style.font-weight":["Font weight"],"style.letter-spacing":["Letter spacing"],"style.line-height":["Line height"],"style.padding":["Padding"],"style.text-color":["Text color"],"toolbar.bold":["Bold"],"toolbar.bold-shortcut":["Bold (Cmd+B)"],"toolbar.italic":["Italic"],"toolbar.italic-shortcut":["Italic (Cmd+I)"],"toolbar.link":["Link"],"toolbar.link-shortcut":["Link (Cmd+K)"],"tune.copy":["Copy block"],"tune.delete":["Delete"],"tune.move-down":["Move down"],"tune.move-up":["Move up"]}');
2019
+
2020
+ // src/locales/fi/messages.ts
2021
+ var messages2 = JSON.parse('{"drawer.library":["Kirjasto"],"drawer.new-sample":["Uusi malli"],"drawer.new-template":["Uusi pohja"],"drawer.no-samples":["Ei malleja saatavilla"],"drawer.no-samples-match":["Mik\xE4\xE4n malli ei vastaa hakua"],"drawer.no-templates":["Ei tallennettuja pohjia"],"drawer.no-templates-match":["Mik\xE4\xE4n pohja ei vastaa hakua"],"drawer.search-samples":["Etsi malleja"],"drawer.search-templates":["Etsi pohjia"],"drawer.sort-by":["J\xE4rjestys"],"drawer.tab.outline":["Rakenne"],"drawer.tab.samples":["Mallit"],"drawer.tab.templates":["Pohjat"],"drawer.tag.all":["Kaikki"],"panel.avatar-block":["Avatarlohko"],"panel.button-block":["Painikelohko"],"panel.columns-block":["Sarakkeet"],"panel.container-block":["S\xE4ili\xF6lohko"],"panel.divider-block":["Erotin"],"panel.editor-appearance":["Editorin ulkoasu"],"panel.export":["Vienti"],"panel.global":["Yleiset"],"panel.heading-block":["Otsikkolohko"],"panel.html-block":["HTML-lohko"],"panel.image-block":["Kuvalohko"],"panel.signature-block":["Allekirjoituslohko"],"panel.spacer-block":["V\xE4lilohko"],"panel.template":["Pohja"],"panel.text-block":["Tekstilohko"],"savebar.error-saving":["Tallennus ep\xE4onnistui"],"savebar.new":["Uusi"],"savebar.new-template-created":["Uusi pohja luotu"],"savebar.sample-prefix":["Malli"],"savebar.sample-saved":["Malli tallennettu"],"savebar.save":["Tallenna"],"savebar.save-as":["Tallenna nimell\xE4\u2026"],"savebar.save-as-new":["Tallenna uutena\u2026"],"savebar.save-as-new-template":["Tallenna uutena pohjana"],"savebar.save-changes":["Tallenna muutokset"],"savebar.save-changes-to-sample":["Tallenna muutokset t\xE4h\xE4n malliin"],"savebar.start-fresh":["Aloita tyhj\xE4st\xE4 pohjasta"],"savebar.template-saved":["Pohja tallennettu"],"sort.last-updated":["Viimeksi p\xE4ivitetty"],"sort.name":["Nimi (A\u2013\xD6)"],"sort.recently-created":["\xC4skett\xE4in luotu"],"style.alignment":["Tasaus"],"style.background-color":["Taustav\xE4ri"],"style.border-color":["Reunan v\xE4ri"],"style.border-radius":["Reunan py\xF6ristys"],"style.font-family":["Fontti"],"style.font-size":["Fonttikoko"],"style.font-weight":["Fontin paksuus"],"style.letter-spacing":["Kirjainv\xE4li"],"style.line-height":["Rivikorkeus"],"style.padding":["T\xE4yte"],"style.text-color":["Tekstin v\xE4ri"],"toolbar.bold":["Lihavointi"],"toolbar.bold-shortcut":["Lihavointi (Cmd+B)"],"toolbar.italic":["Kursivointi"],"toolbar.italic-shortcut":["Kursivointi (Cmd+I)"],"toolbar.link":["Linkki"],"toolbar.link-shortcut":["Linkki (Cmd+K)"],"tune.copy":["Kopioi lohko"],"tune.delete":["Poista"],"tune.move-down":["Siirr\xE4 alas"],"tune.move-up":["Siirr\xE4 yl\xF6s"]}');
2022
+
2023
+ // src/locales/sv/messages.ts
2024
+ var messages3 = JSON.parse('{"drawer.library":["Bibliotek"],"drawer.new-sample":["Ny mall"],"drawer.new-template":["Ny e-postmall"],"drawer.no-samples":["Inga exempel tillg\xE4ngliga"],"drawer.no-samples-match":["Inga exempel matchar dina filter"],"drawer.no-templates":["Inga sparade mallar \xE4nnu"],"drawer.no-templates-match":["Inga mallar matchar dina filter"],"drawer.search-samples":["S\xF6k exempel"],"drawer.search-templates":["S\xF6k mallar"],"drawer.sort-by":["Sortera efter"],"drawer.tab.outline":["Struktur"],"drawer.tab.samples":["Exempel"],"drawer.tab.templates":["Mallar"],"drawer.tag.all":["Alla"],"panel.avatar-block":["Avatarblock"],"panel.button-block":["Knappblock"],"panel.columns-block":["Kolumner"],"panel.container-block":["Beh\xE5llarblock"],"panel.divider-block":["Avgr\xE4nsare"],"panel.editor-appearance":["Editorns utseende"],"panel.export":["Exportera"],"panel.global":["Allm\xE4nt"],"panel.heading-block":["Rubrikblock"],"panel.html-block":["HTML-block"],"panel.image-block":["Bildblock"],"panel.signature-block":["Signaturblock"],"panel.spacer-block":["Mellanrumsblock"],"panel.template":["Mall"],"panel.text-block":["Textblock"],"savebar.error-saving":["Fel vid sparande"],"savebar.new":["Ny"],"savebar.new-template-created":["Ny mall skapad"],"savebar.sample-prefix":["Exempel"],"savebar.sample-saved":["Exempel sparat"],"savebar.save":["Spara"],"savebar.save-as":["Spara som\u2026"],"savebar.save-as-new":["Spara som ny\u2026"],"savebar.save-as-new-template":["Spara som en ny mall"],"savebar.save-changes":["Spara \xE4ndringar"],"savebar.save-changes-to-sample":["Spara \xE4ndringar till detta exempel"],"savebar.start-fresh":["Starta en ny mall"],"savebar.template-saved":["Mall sparad"],"sort.last-updated":["Senast uppdaterad"],"sort.name":["Namn (A\u2013\xD6)"],"sort.recently-created":["Nyligen skapad"],"style.alignment":["Justering"],"style.background-color":["Bakgrundsf\xE4rg"],"style.border-color":["Kantf\xE4rg"],"style.border-radius":["Kantradie"],"style.font-family":["Typsnitt"],"style.font-size":["Typsnittsstorlek"],"style.font-weight":["Typsnittsvikt"],"style.letter-spacing":["Teckenavst\xE5nd"],"style.line-height":["Radh\xF6jd"],"style.padding":["Utrymme"],"style.text-color":["Textf\xE4rg"],"toolbar.bold":["Fet"],"toolbar.bold-shortcut":["Fet (Cmd+B)"],"toolbar.italic":["Kursiv"],"toolbar.italic-shortcut":["Kursiv (Cmd+I)"],"toolbar.link":["L\xE4nk"],"toolbar.link-shortcut":["L\xE4nk (Cmd+K)"],"tune.copy":["Kopiera block"],"tune.delete":["Ta bort"],"tune.move-down":["Flytta ner"],"tune.move-up":["Flytta upp"]}');
2025
+ var SUPPORTED_LOCALES = ["en", "sv", "fi"];
2026
+ var CATALOGS = {
2027
+ en: messages,
2028
+ sv: messages3,
2029
+ fi: messages2
2030
+ };
2031
+ var loaded = false;
2032
+ function activateLocale(locale) {
2033
+ const resolved = SUPPORTED_LOCALES.includes(locale != null ? locale : "") ? locale : "en";
2034
+ if (locale && resolved !== locale) {
2035
+ console.warn(`[email-template-editor] Unsupported locale "${locale}", falling back to "en".`);
2036
+ }
2037
+ if (!loaded) {
2038
+ core.i18n.load({ en: CATALOGS.en, sv: CATALOGS.sv, fi: CATALOGS.fi });
2039
+ loaded = true;
2040
+ }
2041
+ core.i18n.activate(resolved);
2042
+ return resolved;
2043
+ }
2044
+ function t(id, fallback) {
2045
+ return core.i18n._(id, {}, { message: fallback != null ? fallback : id });
2046
+ }
2014
2047
  var EMPTY_DOCUMENT = {
2015
2048
  root: {
2016
2049
  type: "EmailLayout",
@@ -2247,8 +2280,27 @@ function ImageCallbacksProvider({
2247
2280
  function useImageCallbacks() {
2248
2281
  return React57.useContext(ImageCallbacksContext);
2249
2282
  }
2283
+ var TITLE_KEYS = {
2284
+ "Editor appearance": "panel.editor-appearance",
2285
+ Template: "panel.template",
2286
+ Export: "panel.export",
2287
+ Global: "panel.global",
2288
+ "Text block": "panel.text-block",
2289
+ "Heading block": "panel.heading-block",
2290
+ "Button block": "panel.button-block",
2291
+ "Image block": "panel.image-block",
2292
+ "Avatar block": "panel.avatar-block",
2293
+ "Signature block": "panel.signature-block",
2294
+ "Spacer block": "panel.spacer-block",
2295
+ "Divider block": "panel.divider-block",
2296
+ "Columns block": "panel.columns-block",
2297
+ "Container block": "panel.container-block",
2298
+ "Html block": "panel.html-block"
2299
+ };
2250
2300
  function BaseSidebarPanel({ title, children }) {
2251
- return /* @__PURE__ */ React57__default.default.createElement(material.Box, { p: 2 }, /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "overline", color: "text.secondary", sx: { display: "block", mb: 2 } }, title), /* @__PURE__ */ React57__default.default.createElement(material.Stack, { spacing: 5, mb: 3 }, children));
2301
+ const key = TITLE_KEYS[title];
2302
+ const displayTitle = key ? t(key, title) : title;
2303
+ return /* @__PURE__ */ React57__default.default.createElement(material.Box, { p: 2 }, /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "overline", color: "text.secondary", sx: { display: "block", mb: 2 } }, displayTitle), /* @__PURE__ */ React57__default.default.createElement(material.Stack, { spacing: 5, mb: 3 }, children));
2252
2304
  }
2253
2305
  function RadioGroupInput({ label, children, defaultValue, onChange }) {
2254
2306
  const [value, setValue] = React57.useState(defaultValue);
@@ -2752,9 +2804,9 @@ function SingleStylePropertyPanel({ name, value, onChange }) {
2752
2804
  };
2753
2805
  switch (name) {
2754
2806
  case "backgroundColor":
2755
- return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: "Background color", defaultValue, onChange: handleChange });
2807
+ return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: t("style.background-color", "Background color"), defaultValue, onChange: handleChange });
2756
2808
  case "borderColor":
2757
- return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: "Border color", defaultValue, onChange: handleChange });
2809
+ return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: t("style.border-color", "Border color"), defaultValue, onChange: handleChange });
2758
2810
  case "borderRadius":
2759
2811
  return /* @__PURE__ */ React57__default.default.createElement(
2760
2812
  SliderInput,
@@ -2765,27 +2817,27 @@ function SingleStylePropertyPanel({ name, value, onChange }) {
2765
2817
  marks: true,
2766
2818
  min: 0,
2767
2819
  max: 48,
2768
- label: "Border radius",
2820
+ label: t("style.border-radius", "Border radius"),
2769
2821
  defaultValue,
2770
2822
  onChange: handleChange
2771
2823
  }
2772
2824
  );
2773
2825
  case "color":
2774
- return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: "Text color", defaultValue, onChange: handleChange });
2826
+ return /* @__PURE__ */ React57__default.default.createElement(NullableColorInput, { label: t("style.text-color", "Text color"), defaultValue, onChange: handleChange });
2775
2827
  case "fontFamily":
2776
- return /* @__PURE__ */ React57__default.default.createElement(NullableFontFamily, { label: "Font family", defaultValue, onChange: handleChange });
2828
+ return /* @__PURE__ */ React57__default.default.createElement(NullableFontFamily, { label: t("style.font-family", "Font family"), defaultValue, onChange: handleChange });
2777
2829
  case "fontSize":
2778
- return /* @__PURE__ */ React57__default.default.createElement(FontSizeInput, { label: "Font size", defaultValue, onChange: handleChange });
2830
+ return /* @__PURE__ */ React57__default.default.createElement(FontSizeInput, { label: t("style.font-size", "Font size"), defaultValue, onChange: handleChange });
2779
2831
  case "fontWeight":
2780
- return /* @__PURE__ */ React57__default.default.createElement(FontWeightInput, { label: "Font weight", defaultValue, onChange: handleChange });
2832
+ return /* @__PURE__ */ React57__default.default.createElement(FontWeightInput, { label: t("style.font-weight", "Font weight"), defaultValue, onChange: handleChange });
2781
2833
  case "lineHeight":
2782
- return /* @__PURE__ */ React57__default.default.createElement(LineHeightInput, { label: "Line height", defaultValue, onChange: handleChange });
2834
+ return /* @__PURE__ */ React57__default.default.createElement(LineHeightInput, { label: t("style.line-height", "Line height"), defaultValue, onChange: handleChange });
2783
2835
  case "letterSpacing":
2784
- return /* @__PURE__ */ React57__default.default.createElement(LetterSpacingInput, { label: "Letter spacing", defaultValue, onChange: handleChange });
2836
+ return /* @__PURE__ */ React57__default.default.createElement(LetterSpacingInput, { label: t("style.letter-spacing", "Letter spacing"), defaultValue, onChange: handleChange });
2785
2837
  case "textAlign":
2786
- return /* @__PURE__ */ React57__default.default.createElement(TextAlignInput, { label: "Alignment", defaultValue, onChange: handleChange });
2838
+ return /* @__PURE__ */ React57__default.default.createElement(TextAlignInput, { label: t("style.alignment", "Alignment"), defaultValue, onChange: handleChange });
2787
2839
  case "padding":
2788
- return /* @__PURE__ */ React57__default.default.createElement(PaddingInput, { label: "Padding", defaultValue, onChange: handleChange });
2840
+ return /* @__PURE__ */ React57__default.default.createElement(PaddingInput, { label: t("style.padding", "Padding"), defaultValue, onChange: handleChange });
2789
2841
  }
2790
2842
  }
2791
2843
 
@@ -4092,15 +4144,15 @@ function DetailsEditor({ templateId, currentName, currentTags, canEdit, onSave }
4092
4144
  const addTag = () => {
4093
4145
  const trimmed = tagInput.trim();
4094
4146
  if (!trimmed) return;
4095
- if (tags.some((t) => t.toLowerCase() === trimmed.toLowerCase())) {
4147
+ if (tags.some((t2) => t2.toLowerCase() === trimmed.toLowerCase())) {
4096
4148
  setTagInput("");
4097
4149
  return;
4098
4150
  }
4099
4151
  setTags([...tags, trimmed]);
4100
4152
  setTagInput("");
4101
4153
  };
4102
- const removeTag = (tag) => setTags(tags.filter((t) => t !== tag));
4103
- const dirty = name !== currentName || tags.length !== currentTags.length || tags.some((t, i) => t !== currentTags[i]);
4154
+ const removeTag = (tag) => setTags(tags.filter((t2) => t2 !== tag));
4155
+ const dirty = name !== currentName || tags.length !== currentTags.length || tags.some((t2, i) => t2 !== currentTags[i]);
4104
4156
  const handleSave = () => __async(null, null, function* () {
4105
4157
  if (!canEdit || !dirty || !name.trim()) return;
4106
4158
  setSaving(true);
@@ -5528,15 +5580,15 @@ function RenameDialog({
5528
5580
  const addTag = () => {
5529
5581
  const trimmed = tagInput.trim();
5530
5582
  if (!trimmed) return;
5531
- if (tags.some((t) => t.toLowerCase() === trimmed.toLowerCase())) {
5583
+ if (tags.some((t2) => t2.toLowerCase() === trimmed.toLowerCase())) {
5532
5584
  setTagInput("");
5533
5585
  return;
5534
5586
  }
5535
5587
  setTags([...tags, trimmed]);
5536
5588
  setTagInput("");
5537
5589
  };
5538
- const removeTag = (tag) => setTags(tags.filter((t) => t !== tag));
5539
- const tagsUnchanged = tags.length === currentTags.length && tags.every((t, i) => t === currentTags[i]);
5590
+ const removeTag = (tag) => setTags(tags.filter((t2) => t2 !== tag));
5591
+ const tagsUnchanged = tags.length === currentTags.length && tags.every((t2, i) => t2 === currentTags[i]);
5540
5592
  const handleSubmit = () => __async(null, null, function* () {
5541
5593
  const trimmedSlug = slug.trim();
5542
5594
  if (!trimmedSlug) {
@@ -5760,9 +5812,9 @@ var EMPTY_TEMPLATE = {
5760
5812
  description: "A blank email template to start from scratch"
5761
5813
  };
5762
5814
  var SORT_OPTIONS = [
5763
- { value: "updatedAt", label: "Last updated" },
5764
- { value: "createdAt", label: "Recently created" },
5765
- { value: "slug", label: "Name (A\u2013Z)" }
5815
+ { value: "updatedAt", labelKey: "sort.last-updated", fallback: "Last updated" },
5816
+ { value: "createdAt", labelKey: "sort.recently-created", fallback: "Recently created" },
5817
+ { value: "slug", labelKey: "sort.name", fallback: "Name (A\u2013Z)" }
5766
5818
  ];
5767
5819
  function compareTemplates(a, b, key) {
5768
5820
  if (key === "slug") {
@@ -5846,9 +5898,9 @@ function SamplesDrawer({
5846
5898
  const now = (/* @__PURE__ */ new Date()).toISOString();
5847
5899
  const row = { id, slug, kind, tags, createdAt: now, updatedAt: now };
5848
5900
  if (kind === "sample") {
5849
- setSamples((prev) => prev.some((t) => t.id === id) ? prev : [...prev, row]);
5901
+ setSamples((prev) => prev.some((t2) => t2.id === id) ? prev : [...prev, row]);
5850
5902
  } else {
5851
- setTemplates((prev) => prev.some((t) => t.id === id) ? prev : [...prev, row]);
5903
+ setTemplates((prev) => prev.some((t2) => t2.id === id) ? prev : [...prev, row]);
5852
5904
  }
5853
5905
  };
5854
5906
  React57.useEffect(() => {
@@ -5866,30 +5918,30 @@ function SamplesDrawer({
5866
5918
  const { templateRows, sampleRows } = React57.useMemo(() => {
5867
5919
  const byId = /* @__PURE__ */ new Map();
5868
5920
  for (const s of samples) byId.set(s.id, s);
5869
- for (const t of templates) byId.set(t.id, t);
5921
+ for (const t2 of templates) byId.set(t2.id, t2);
5870
5922
  const all = Array.from(byId.values());
5871
5923
  return {
5872
- templateRows: all.filter((t) => t.kind === "template"),
5873
- sampleRows: all.filter((t) => t.kind === "sample")
5924
+ templateRows: all.filter((t2) => t2.kind === "template"),
5925
+ sampleRows: all.filter((t2) => t2.kind === "sample")
5874
5926
  };
5875
5927
  }, [samples, templates]);
5876
5928
  const allTags = React57.useMemo(() => {
5877
5929
  var _a2, _b2;
5878
5930
  const set = /* @__PURE__ */ new Set();
5879
- for (const t of templateRows) (_a2 = t.tags) == null ? void 0 : _a2.forEach((tag) => set.add(tag));
5931
+ for (const t2 of templateRows) (_a2 = t2.tags) == null ? void 0 : _a2.forEach((tag) => set.add(tag));
5880
5932
  for (const s of sampleRows) (_b2 = s.tags) == null ? void 0 : _b2.forEach((tag) => set.add(tag));
5881
5933
  return Array.from(set).sort();
5882
5934
  }, [templateRows, sampleRows]);
5883
5935
  const matchesSearchAndTags = React57.useMemo(() => {
5884
5936
  const term = search.trim().toLowerCase();
5885
- return (t) => {
5937
+ return (t2) => {
5886
5938
  if (term) {
5887
- const haystack = [t.slug, t.description, t.subject].filter(Boolean).join(" ").toLowerCase();
5939
+ const haystack = [t2.slug, t2.description, t2.subject].filter(Boolean).join(" ").toLowerCase();
5888
5940
  if (!haystack.includes(term)) return false;
5889
5941
  }
5890
5942
  if (activeTags.length > 0) {
5891
- if (!t.tags || t.tags.length === 0) return false;
5892
- if (!activeTags.every((tag) => t.tags.includes(tag))) return false;
5943
+ if (!t2.tags || t2.tags.length === 0) return false;
5944
+ if (!activeTags.every((tag) => t2.tags.includes(tag))) return false;
5893
5945
  }
5894
5946
  return true;
5895
5947
  };
@@ -5903,7 +5955,7 @@ function SamplesDrawer({
5903
5955
  [sampleRows, matchesSearchAndTags, sortKey]
5904
5956
  );
5905
5957
  const toggleTag = (tag) => {
5906
- setActiveTags((prev) => prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag]);
5958
+ setActiveTags((prev) => prev.includes(tag) ? prev.filter((t2) => t2 !== tag) : [...prev, tag]);
5907
5959
  };
5908
5960
  const handleDuplicate = (template) => {
5909
5961
  if (!copyTemplate) return;
@@ -5933,7 +5985,7 @@ function SamplesDrawer({
5933
5985
  if (!renameTarget || !renameTemplate) return;
5934
5986
  yield renameTemplate(renameTarget.id, newSlug, opts);
5935
5987
  const newTags = (_b2 = (_a2 = opts == null ? void 0 : opts.tags) != null ? _a2 : renameTarget.tags) != null ? _b2 : [];
5936
- const patch = (t) => t.id === renameTarget.id ? __spreadProps(__spreadValues({}, t), { slug: newSlug, tags: newTags }) : t;
5988
+ const patch = (t2) => t2.id === renameTarget.id ? __spreadProps(__spreadValues({}, t2), { slug: newSlug, tags: newTags }) : t2;
5937
5989
  setTemplates((prev) => prev.map(patch));
5938
5990
  setSamples((prev) => prev.map(patch));
5939
5991
  if (currentTemplateId === renameTarget.id) {
@@ -5942,8 +5994,8 @@ function SamplesDrawer({
5942
5994
  showMessage("Details saved");
5943
5995
  });
5944
5996
  const flipKindLocally = (id, kind) => {
5945
- setTemplates((prev) => prev.map((t) => t.id === id ? __spreadProps(__spreadValues({}, t), { kind }) : t));
5946
- setSamples((prev) => prev.map((t) => t.id === id ? __spreadProps(__spreadValues({}, t), { kind }) : t));
5997
+ setTemplates((prev) => prev.map((t2) => t2.id === id ? __spreadProps(__spreadValues({}, t2), { kind }) : t2));
5998
+ setSamples((prev) => prev.map((t2) => t2.id === id ? __spreadProps(__spreadValues({}, t2), { kind }) : t2));
5947
5999
  };
5948
6000
  const handleSetKind = (template, kind) => {
5949
6001
  if (!setTemplateKind) return;
@@ -5980,7 +6032,7 @@ function SamplesDrawer({
5980
6032
  };
5981
6033
  const handleSaveAsSubmit = (templateName) => __async(null, null, function* () {
5982
6034
  if (!saveAs || !pendingSaveAs) return false;
5983
- const taken = templateRows.some((t) => t.slug.toLowerCase() === templateName.toLowerCase());
6035
+ const taken = templateRows.some((t2) => t2.slug.toLowerCase() === templateName.toLowerCase());
5984
6036
  if (taken) {
5985
6037
  setNewError("A template with this name already exists");
5986
6038
  return false;
@@ -6043,7 +6095,7 @@ function SamplesDrawer({
6043
6095
  if (!enabled) {
6044
6096
  return null;
6045
6097
  }
6046
- const existingSlugs = templates.map((t) => t.slug);
6098
+ const existingSlugs = templates.map((t2) => t2.slug);
6047
6099
  return /* @__PURE__ */ React57__default.default.createElement(React57__default.default.Fragment, null, /* @__PURE__ */ React57__default.default.createElement(
6048
6100
  material.Drawer,
6049
6101
  {
@@ -6069,12 +6121,12 @@ function SamplesDrawer({
6069
6121
  spacing: 1.5,
6070
6122
  sx: { overflowY: "auto" }
6071
6123
  },
6072
- /* @__PURE__ */ React57__default.default.createElement(material.Stack, { direction: "row", alignItems: "center", justifyContent: "space-between", sx: { pt: 1 } }, /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "h6", component: "h1" }, "Library"), saveAs && (activeLeftTab === "templates" || activeLeftTab === "samples") && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: activeLeftTab === "samples" ? "New sample" : "New template" }, /* @__PURE__ */ React57__default.default.createElement(
6124
+ /* @__PURE__ */ React57__default.default.createElement(material.Stack, { direction: "row", alignItems: "center", justifyContent: "space-between", sx: { pt: 1 } }, /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "h6", component: "h1" }, /* @__PURE__ */ React57__default.default.createElement(react.Trans, { id: "drawer.library" }, "Library")), saveAs && (activeLeftTab === "templates" || activeLeftTab === "samples") && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: activeLeftTab === "samples" ? t("drawer.new-sample", "New sample") : t("drawer.new-template", "New template") }, /* @__PURE__ */ React57__default.default.createElement(
6073
6125
  material.IconButton,
6074
6126
  {
6075
6127
  size: "small",
6076
6128
  onClick: () => openNewPicker(activeLeftTab === "samples" ? "sample" : "template"),
6077
- "aria-label": activeLeftTab === "samples" ? "New sample" : "New template"
6129
+ "aria-label": activeLeftTab === "samples" ? t("drawer.new-sample", "New sample") : t("drawer.new-template", "New template")
6078
6130
  },
6079
6131
  /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.AddOutlined, { fontSize: "small" })
6080
6132
  ))),
@@ -6086,15 +6138,15 @@ function SamplesDrawer({
6086
6138
  variant: "fullWidth",
6087
6139
  sx: { minHeight: 36, "& .MuiTab-root": { minHeight: 36, minWidth: 0, px: 1, fontSize: 13 } }
6088
6140
  },
6089
- /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "templates", label: "Templates", disabled: !loadTemplates }),
6090
- /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "samples", label: "Samples" }),
6091
- /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "outline", label: "Outline" })
6141
+ /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "templates", label: t("drawer.tab.templates", "Templates"), disabled: !loadTemplates }),
6142
+ /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "samples", label: t("drawer.tab.samples", "Samples") }),
6143
+ /* @__PURE__ */ React57__default.default.createElement(material.Tab, { value: "outline", label: t("drawer.tab.outline", "Outline") })
6092
6144
  ),
6093
6145
  activeLeftTab === "outline" ? /* @__PURE__ */ React57__default.default.createElement(OutlinePanel, null) : /* @__PURE__ */ React57__default.default.createElement(React57__default.default.Fragment, null, /* @__PURE__ */ React57__default.default.createElement(
6094
6146
  material.TextField,
6095
6147
  {
6096
6148
  size: "small",
6097
- placeholder: activeLeftTab === "templates" ? "Search templates" : "Search samples",
6149
+ placeholder: activeLeftTab === "templates" ? t("drawer.search-templates", "Search templates") : t("drawer.search-samples", "Search samples"),
6098
6150
  value: search,
6099
6151
  onChange: (e) => setSearch(e.target.value),
6100
6152
  InputProps: {
@@ -6106,15 +6158,15 @@ function SamplesDrawer({
6106
6158
  {
6107
6159
  select: true,
6108
6160
  size: "small",
6109
- label: "Sort by",
6161
+ label: t("drawer.sort-by", "Sort by"),
6110
6162
  value: sortKey,
6111
6163
  onChange: (e) => setSortKey(e.target.value)
6112
6164
  },
6113
- SORT_OPTIONS.map((opt) => /* @__PURE__ */ React57__default.default.createElement(material.MenuItem, { key: opt.value, value: opt.value }, opt.label))
6165
+ SORT_OPTIONS.map((opt) => /* @__PURE__ */ React57__default.default.createElement(material.MenuItem, { key: opt.value, value: opt.value }, t(opt.labelKey, opt.fallback)))
6114
6166
  ), allTags.length > 0 && /* @__PURE__ */ React57__default.default.createElement(material.Stack, { direction: "row", sx: { flexWrap: "wrap", gap: 0.5 } }, /* @__PURE__ */ React57__default.default.createElement(
6115
6167
  material.Chip,
6116
6168
  {
6117
- label: "All",
6169
+ label: t("drawer.tag.all", "All"),
6118
6170
  size: "small",
6119
6171
  clickable: true,
6120
6172
  color: activeTags.length === 0 ? "primary" : "default",
@@ -6144,7 +6196,7 @@ function SamplesDrawer({
6144
6196
  onDelete: deleteTemplate ? () => handleDelete(template) : void 0,
6145
6197
  onPromote: setTemplateKind ? () => handleSetKind(template, "sample") : void 0
6146
6198
  }
6147
- ))) : /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, templateRows.length === 0 ? "No saved templates yet" : "No templates match your filters")) : /* @__PURE__ */ React57__default.default.createElement(material.Box, null, loadingSamples ? /* @__PURE__ */ React57__default.default.createElement(material.Stack, { alignItems: "center", width: "100%", py: 2 }, /* @__PURE__ */ React57__default.default.createElement(material.CircularProgress, { size: 24 })) : filteredSamples.length > 0 ? /* @__PURE__ */ React57__default.default.createElement(material.Stack, { spacing: 0.25, sx: { width: "100%" } }, filteredSamples.map((sample) => /* @__PURE__ */ React57__default.default.createElement(
6199
+ ))) : /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, templateRows.length === 0 ? t("drawer.no-templates", "No saved templates yet") : t("drawer.no-templates-match", "No templates match your filters"))) : /* @__PURE__ */ React57__default.default.createElement(material.Box, null, loadingSamples ? /* @__PURE__ */ React57__default.default.createElement(material.Stack, { alignItems: "center", width: "100%", py: 2 }, /* @__PURE__ */ React57__default.default.createElement(material.CircularProgress, { size: 24 })) : filteredSamples.length > 0 ? /* @__PURE__ */ React57__default.default.createElement(material.Stack, { spacing: 0.25, sx: { width: "100%" } }, filteredSamples.map((sample) => /* @__PURE__ */ React57__default.default.createElement(
6148
6200
  TemplateRow,
6149
6201
  {
6150
6202
  key: sample.id,
@@ -6156,7 +6208,7 @@ function SamplesDrawer({
6156
6208
  onDelete: deleteTemplate ? () => handleDelete(sample) : void 0,
6157
6209
  onDemote: setTemplateKind ? () => handleSetKind(sample, "template") : void 0
6158
6210
  }
6159
- ))) : /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, sampleRows.length === 0 ? "No samples available" : "No samples match your filters")))
6211
+ ))) : /* @__PURE__ */ React57__default.default.createElement(material.Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, sampleRows.length === 0 ? t("drawer.no-samples", "No samples available") : t("drawer.no-samples-match", "No samples match your filters"))))
6160
6212
  )
6161
6213
  ), renameTarget && /* @__PURE__ */ React57__default.default.createElement(
6162
6214
  RenameDialog,
@@ -6187,7 +6239,7 @@ function SamplesDrawer({
6187
6239
  open: pickerKind !== null,
6188
6240
  kind: pickerKind != null ? pickerKind : "template",
6189
6241
  samples: sampleRows,
6190
- existingSlugs: pickerKind === "sample" ? sampleRows.map((s) => s.slug) : templateRows.map((t) => t.slug),
6242
+ existingSlugs: pickerKind === "sample" ? sampleRows.map((s) => s.slug) : templateRows.map((t2) => t2.slug),
6191
6243
  onClose: () => setPickerKind(null),
6192
6244
  onCreate: handleCreateFromPicker
6193
6245
  }
@@ -7134,7 +7186,7 @@ function TuneMenu({ blockId }) {
7134
7186
  resetDocument(nDocument);
7135
7187
  setSelectedBlockId(blockId);
7136
7188
  };
7137
- return /* @__PURE__ */ React57__default.default.createElement(material.Paper, { sx, onClick: (ev) => ev.stopPropagation() }, /* @__PURE__ */ React57__default.default.createElement(material.Stack, null, /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Move up", placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { onClick: () => handleMoveClick("up"), sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ArrowUpwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Move down", placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { onClick: () => handleMoveClick("down"), sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ArrowDownwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Copy block", placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { onClick: handleCopyClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ContentCopyOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Delete", placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { onClick: handleDeleteClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.DeleteOutlined, { fontSize: "small" })))));
7189
+ return /* @__PURE__ */ React57__default.default.createElement(material.Paper, { sx, onClick: (ev) => ev.stopPropagation() }, /* @__PURE__ */ React57__default.default.createElement(material.Stack, null, /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("tune.move-up", "Move up"), placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { "aria-label": t("tune.move-up", "Move up"), onClick: () => handleMoveClick("up"), sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ArrowUpwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("tune.move-down", "Move down"), placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { "aria-label": t("tune.move-down", "Move down"), onClick: () => handleMoveClick("down"), sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ArrowDownwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("tune.copy", "Copy block"), placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { "aria-label": t("tune.copy", "Copy block"), onClick: handleCopyClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.ContentCopyOutlined, { fontSize: "small" }))), /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("tune.delete", "Delete"), placement: "left-start" }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { "aria-label": t("tune.delete", "Delete"), onClick: handleDeleteClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.DeleteOutlined, { fontSize: "small" })))));
7138
7190
  }
7139
7191
 
7140
7192
  // src/editor/blocks/helpers/block-wrappers/editor-block-wrapper.tsx
@@ -7497,7 +7549,7 @@ function InlineFormattingToolbar({
7497
7549
  },
7498
7550
  sx: { width: 220 }
7499
7551
  }
7500
- )) : /* @__PURE__ */ React57__default.default.createElement(material.Stack, { direction: "row", spacing: 0.25 }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onBold, title: "Bold (Cmd+B)", "aria-label": "Bold" }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.FormatBoldOutlined, { fontSize: "small" })), /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onItalic, title: "Italic (Cmd+I)", "aria-label": "Italic" }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.FormatItalicOutlined, { fontSize: "small" })), /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onLinkRequest, title: "Link (Cmd+K)", "aria-label": "Link" }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.LinkOutlined, { fontSize: "small" })))));
7552
+ )) : /* @__PURE__ */ React57__default.default.createElement(material.Stack, { direction: "row", spacing: 0.25 }, /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onBold, title: t("toolbar.bold-shortcut", "Bold (Cmd+B)"), "aria-label": t("toolbar.bold", "Bold") }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.FormatBoldOutlined, { fontSize: "small" })), /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onItalic, title: t("toolbar.italic-shortcut", "Italic (Cmd+I)"), "aria-label": t("toolbar.italic", "Italic") }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.FormatItalicOutlined, { fontSize: "small" })), /* @__PURE__ */ React57__default.default.createElement(material.IconButton, { size: "small", onClick: onLinkRequest, title: t("toolbar.link-shortcut", "Link (Cmd+K)"), "aria-label": t("toolbar.link", "Link") }, /* @__PURE__ */ React57__default.default.createElement(iconsMaterial.LinkOutlined, { fontSize: "small" })))));
7501
7553
  }
7502
7554
 
7503
7555
  // src/editor/blocks/heading/heading-editor.tsx
@@ -8448,7 +8500,7 @@ function SaveBar({ loadTemplates, saveAs }) {
8448
8500
  const [nameError, setNameError] = React57.useState(null);
8449
8501
  const hasOpenRow = Boolean(currentTemplateId);
8450
8502
  const isSample = currentTemplateKind === "sample";
8451
- const primaryLabel = hasOpenRow ? "Save" : "Save as new\u2026";
8503
+ const primaryLabel = hasOpenRow ? t("savebar.save", "Save") : t("savebar.save-as-new", "Save as new\u2026");
8452
8504
  const handlePrimary = () => __async(null, null, function* () {
8453
8505
  try {
8454
8506
  if (!hasOpenRow) {
@@ -8457,11 +8509,11 @@ function SaveBar({ loadTemplates, saveAs }) {
8457
8509
  return;
8458
8510
  }
8459
8511
  saveTemplate();
8460
- showMessage(isSample ? "Sample saved" : "Template saved");
8512
+ showMessage(isSample ? t("savebar.sample-saved", "Sample saved") : t("savebar.template-saved", "Template saved"));
8461
8513
  if (loadTemplates) yield loadTemplates();
8462
8514
  } catch (e) {
8463
8515
  console.error("Error saving:", e);
8464
- showMessage("Error saving");
8516
+ showMessage(t("savebar.error-saving", "Error saving"));
8465
8517
  }
8466
8518
  });
8467
8519
  const handleSaveAs = (name) => __async(null, null, function* () {
@@ -8473,12 +8525,14 @@ function SaveBar({ loadTemplates, saveAs }) {
8473
8525
  setCurrentTemplate(id, slug, "template");
8474
8526
  ctxLoadTemplate(starterContent, id, slug, "template");
8475
8527
  if (loadTemplates) yield loadTemplates();
8476
- showMessage(dialogMode === "new-blank" ? "New template created" : "Template saved");
8528
+ showMessage(
8529
+ dialogMode === "new-blank" ? t("savebar.new-template-created", "New template created") : t("savebar.template-saved", "Template saved")
8530
+ );
8477
8531
  window.location.hash = `#template/${id}`;
8478
8532
  return true;
8479
8533
  } catch (e) {
8480
8534
  console.error("Error in saveAs:", e);
8481
- showMessage("Error saving");
8535
+ showMessage(t("savebar.error-saving", "Error saving"));
8482
8536
  return false;
8483
8537
  }
8484
8538
  });
@@ -8525,10 +8579,10 @@ function SaveBar({ loadTemplates, saveAs }) {
8525
8579
  },
8526
8580
  title: currentTemplateName
8527
8581
  },
8528
- isSample ? "Sample \xB7 " : "",
8582
+ isSample ? `${t("savebar.sample-prefix", "Sample")} \xB7 ` : "",
8529
8583
  /* @__PURE__ */ React57__default.default.createElement(material.Box, { component: "span", sx: { color: "text.primary", fontWeight: 600 } }, currentTemplateName)
8530
8584
  ),
8531
- /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: hasOpenRow ? `Save changes${isSample ? " to this sample" : ""}` : "Save as a new template" }, /* @__PURE__ */ React57__default.default.createElement(
8585
+ /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: hasOpenRow ? isSample ? t("savebar.save-changes-to-sample", "Save changes to this sample") : t("savebar.save-changes", "Save changes") : t("savebar.save-as-new-template", "Save as a new template") }, /* @__PURE__ */ React57__default.default.createElement(
8532
8586
  material.Button,
8533
8587
  {
8534
8588
  variant: "contained",
@@ -8539,7 +8593,7 @@ function SaveBar({ loadTemplates, saveAs }) {
8539
8593
  },
8540
8594
  primaryLabel
8541
8595
  )),
8542
- hasOpenRow && saveAs && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Save as a new template" }, /* @__PURE__ */ React57__default.default.createElement(
8596
+ hasOpenRow && saveAs && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("savebar.save-as-new-template", "Save as a new template") }, /* @__PURE__ */ React57__default.default.createElement(
8543
8597
  material.Button,
8544
8598
  {
8545
8599
  variant: "outlined",
@@ -8551,9 +8605,9 @@ function SaveBar({ loadTemplates, saveAs }) {
8551
8605
  },
8552
8606
  sx: { borderRadius: 999, textTransform: "none", px: 2, fontSize: 14 }
8553
8607
  },
8554
- "Save as\u2026"
8608
+ t("savebar.save-as", "Save as\u2026")
8555
8609
  )),
8556
- saveAs && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: "Start a fresh template" }, /* @__PURE__ */ React57__default.default.createElement(
8610
+ saveAs && /* @__PURE__ */ React57__default.default.createElement(material.Tooltip, { title: t("savebar.start-fresh", "Start a fresh template") }, /* @__PURE__ */ React57__default.default.createElement(
8557
8611
  material.Button,
8558
8612
  {
8559
8613
  variant: "text",
@@ -8565,7 +8619,7 @@ function SaveBar({ loadTemplates, saveAs }) {
8565
8619
  },
8566
8620
  sx: { borderRadius: 999, textTransform: "none", px: 2, fontSize: 14, color: "text.secondary" }
8567
8621
  },
8568
- "New"
8622
+ t("savebar.new", "New")
8569
8623
  ))
8570
8624
  )
8571
8625
  ), /* @__PURE__ */ React57__default.default.createElement(
@@ -9042,8 +9096,10 @@ var EmailEditor = React57.forwardRef((props, ref) => {
9042
9096
  uploadImage,
9043
9097
  loadImages,
9044
9098
  deleteImage,
9045
- theme
9099
+ theme,
9100
+ locale
9046
9101
  } = props;
9102
+ activateLocale(locale);
9047
9103
  const resolvedTemplate = React57.useMemo(
9048
9104
  () => typeof initialTemplateProp === "string" ? htmlToEditorConfig(initialTemplateProp) : initialTemplateProp,
9049
9105
  [initialTemplateProp]
@@ -9060,7 +9116,7 @@ var EmailEditor = React57.forwardRef((props, ref) => {
9060
9116
  () => ({ uploadImage, loadImages, deleteImage }),
9061
9117
  [uploadImage, loadImages, deleteImage]
9062
9118
  );
9063
- return /* @__PURE__ */ React57__default.default.createElement(material.ThemeProvider, { theme: theme || theme_default }, /* @__PURE__ */ React57__default.default.createElement(material.CssBaseline, null), /* @__PURE__ */ React57__default.default.createElement("div", { style: { height: "100%", overflow: "auto" } }, /* @__PURE__ */ React57__default.default.createElement(SnackbarProvider, null, /* @__PURE__ */ React57__default.default.createElement(ImageCallbacksProvider, { callbacks: imageCallbacks }, /* @__PURE__ */ React57__default.default.createElement(
9119
+ return /* @__PURE__ */ React57__default.default.createElement(react.I18nProvider, { i18n: core.i18n }, /* @__PURE__ */ React57__default.default.createElement(material.ThemeProvider, { theme: theme || theme_default }, /* @__PURE__ */ React57__default.default.createElement(material.CssBaseline, null), /* @__PURE__ */ React57__default.default.createElement("div", { style: { height: "100%", overflow: "auto" } }, /* @__PURE__ */ React57__default.default.createElement(SnackbarProvider, null, /* @__PURE__ */ React57__default.default.createElement(ImageCallbacksProvider, { callbacks: imageCallbacks }, /* @__PURE__ */ React57__default.default.createElement(
9064
9120
  EmailEditorProvider,
9065
9121
  {
9066
9122
  initialTemplate: resolvedTemplate,
@@ -9088,7 +9144,7 @@ var EmailEditor = React57.forwardRef((props, ref) => {
9088
9144
  onChange
9089
9145
  }
9090
9146
  )
9091
- )))));
9147
+ ))))));
9092
9148
  });
9093
9149
  EmailEditor.displayName = "EmailEditor";
9094
9150
  EmailEditorInternal.displayName = "EmailEditorInternal";
@@ -9134,6 +9190,7 @@ exports.Reader = Reader;
9134
9190
  exports.ReaderBlock = ReaderBlock;
9135
9191
  exports.ReaderBlockSchema = ReaderBlockSchema;
9136
9192
  exports.ReaderDocumentSchema = ReaderDocumentSchema;
9193
+ exports.SUPPORTED_LOCALES = SUPPORTED_LOCALES;
9137
9194
  exports.Signature = signature_default;
9138
9195
  exports.SignatureProps = SignatureProps;
9139
9196
  exports.SignaturePropsDefaults = SignaturePropsDefaults;