@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 +122 -65
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +122 -66
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
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
|
-
|
|
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((
|
|
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((
|
|
4103
|
-
const dirty = name !== currentName || tags.length !== currentTags.length || tags.some((
|
|
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((
|
|
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((
|
|
5539
|
-
const tagsUnchanged = tags.length === currentTags.length && tags.every((
|
|
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",
|
|
5764
|
-
{ value: "createdAt",
|
|
5765
|
-
{ value: "slug",
|
|
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((
|
|
5901
|
+
setSamples((prev) => prev.some((t2) => t2.id === id) ? prev : [...prev, row]);
|
|
5850
5902
|
} else {
|
|
5851
|
-
setTemplates((prev) => prev.some((
|
|
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
|
|
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((
|
|
5873
|
-
sampleRows: all.filter((
|
|
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
|
|
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 (
|
|
5937
|
+
return (t2) => {
|
|
5886
5938
|
if (term) {
|
|
5887
|
-
const haystack = [
|
|
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 (!
|
|
5892
|
-
if (!activeTags.every((tag) =>
|
|
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((
|
|
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 = (
|
|
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((
|
|
5946
|
-
setSamples((prev) => prev.map((
|
|
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((
|
|
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((
|
|
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.
|
|
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((
|
|
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(
|
|
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 ?
|
|
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;
|