@kontakto/email-template-editor 2.2.2 → 2.3.1
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/README.md +28 -0
- package/dist/index.cjs +1841 -873
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -6
- package/dist/index.d.ts +34 -6
- package/dist/index.js +1666 -701
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import DOMPurify from 'dompurify';
|
|
2
2
|
import { marked, Renderer } from 'marked';
|
|
3
|
-
import
|
|
3
|
+
import React62, { createContext, forwardRef, useRef, useEffect, useImperativeHandle, useMemo, useContext, useState, useCallback, useLayoutEffect, Fragment } from 'react';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { renderToStaticMarkup as renderToStaticMarkup$1 } from 'react-dom/server';
|
|
6
|
+
import Handlebars from 'handlebars';
|
|
6
7
|
import { createTheme, alpha, lighten, darken } from '@mui/material/styles';
|
|
7
|
-
import { MenuItem, Stack, ThemeProvider, CssBaseline, useTheme, Drawer, Box, Tabs, Tab, Typography, Tooltip, IconButton, TextField, InputAdornment, Chip, CircularProgress, Alert,
|
|
8
|
+
import { MenuItem, Stack, ThemeProvider, CssBaseline, useTheme, Drawer, Box, Tabs, Tab, Typography, Tooltip, IconButton, TextField, InputAdornment, Chip, CircularProgress, Alert, ToggleButtonGroup, ToggleButton, Snackbar, Menu, ListItemIcon, ListItemText, Divider as Divider$1, Dialog, DialogTitle, DialogContent, Button as Button$1, DialogActions, List, ListItemButton, InputBase, AlertTitle, FormControlLabel, Switch, InputLabel, Slider, ButtonBase, Popper, Paper, Fade } from '@mui/material';
|
|
8
9
|
import { create } from 'zustand';
|
|
9
|
-
import { AddOutlined, SearchOutlined, MonitorOutlined, PhoneIphoneOutlined,
|
|
10
|
+
import { AddOutlined, SearchOutlined, MonitorOutlined, PhoneIphoneOutlined, MoreVertOutlined, DriveFileRenameOutlineOutlined, ContentCopyOutlined, LibraryAddOutlined, FileUploadOutlined, FileDownloadOutlined, DeleteOutlined, InsertDriveFileOutlined, DescriptionOutlined, EditOutlined, PreviewOutlined, CodeOutlined, SubjectOutlined, DataObjectOutlined, LastPageOutlined, AppRegistrationOutlined, CloudUploadOutlined, SaveOutlined, SaveAsOutlined, ViewColumnSharp, ExpandMore, ChevronRight, KeyboardArrowUp, KeyboardArrowDown, FirstPageOutlined, MenuOutlined, GridOnOutlined, SquareOutlined, InputOutlined, DeleteOutline, RoundedCornerOutlined, AspectRatioOutlined, HeightOutlined, CollectionsOutlined, ErrorOutlineOutlined, VerticalAlignTopOutlined, VerticalAlignCenterOutlined, VerticalAlignBottomOutlined, SpaceBarOutlined, BusinessOutlined, ViewColumnOutlined, HtmlOutlined, Crop32Outlined, HorizontalRuleOutlined, ContactMailOutlined, AccountCircleOutlined, ImageOutlined, SmartButtonOutlined, NotesOutlined, HMobiledataOutlined, DashboardOutlined, CloseOutlined, AlignVerticalTopOutlined, AlignVerticalBottomOutlined, AlignHorizontalLeftOutlined, AlignHorizontalRightOutlined, FormatAlignLeftOutlined, FormatAlignCenterOutlined, FormatAlignRightOutlined, FormatLineSpacingOutlined, TextFieldsOutlined, FormatBoldOutlined, FormatItalicOutlined, LinkOutlined, ArrowUpwardOutlined, ArrowDownwardOutlined } from '@mui/icons-material';
|
|
10
11
|
import { HexColorPicker, HexColorInput } from 'react-colorful';
|
|
11
12
|
import hljs from 'highlight.js';
|
|
12
13
|
import jsonHighlighter from 'highlight.js/lib/languages/json';
|
|
@@ -180,7 +181,7 @@ function renderInlineMarkdownString(str) {
|
|
|
180
181
|
function EmailMarkdown(_a) {
|
|
181
182
|
var _b = _a, { markdown } = _b, props = __objRest(_b, ["markdown"]);
|
|
182
183
|
const data = useMemo(() => renderMarkdownString(markdown), [markdown]);
|
|
183
|
-
return /* @__PURE__ */
|
|
184
|
+
return /* @__PURE__ */ React62.createElement("div", __spreadProps(__spreadValues({}, props), { dangerouslySetInnerHTML: { __html: data } }));
|
|
184
185
|
}
|
|
185
186
|
var FONT_FAMILY_SCHEMA = z.enum([
|
|
186
187
|
"MODERN_SANS",
|
|
@@ -260,9 +261,9 @@ function Text({ style, props }) {
|
|
|
260
261
|
};
|
|
261
262
|
const text = (_g = props == null ? void 0 : props.text) != null ? _g : TextPropsDefaults.text;
|
|
262
263
|
if (props == null ? void 0 : props.markdown) {
|
|
263
|
-
return /* @__PURE__ */
|
|
264
|
+
return /* @__PURE__ */ React62.createElement(EmailMarkdown, { style: wStyle, markdown: text });
|
|
264
265
|
}
|
|
265
|
-
return /* @__PURE__ */
|
|
266
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wStyle }, text);
|
|
266
267
|
}
|
|
267
268
|
var PADDING_SCHEMA2 = z.object({
|
|
268
269
|
top: z.number(),
|
|
@@ -311,7 +312,7 @@ function Avatar({ style, props }) {
|
|
|
311
312
|
textAlign: (_e = style == null ? void 0 : style.textAlign) != null ? _e : void 0,
|
|
312
313
|
padding: getPadding2(style == null ? void 0 : style.padding)
|
|
313
314
|
};
|
|
314
|
-
return /* @__PURE__ */
|
|
315
|
+
return /* @__PURE__ */ React62.createElement("div", { style: sectionStyle }, /* @__PURE__ */ React62.createElement(
|
|
315
316
|
"img",
|
|
316
317
|
{
|
|
317
318
|
alt,
|
|
@@ -463,14 +464,14 @@ function Button({ style, props }) {
|
|
|
463
464
|
padding: `${padding[0]}px ${padding[1]}px`,
|
|
464
465
|
textDecoration: "none"
|
|
465
466
|
};
|
|
466
|
-
return /* @__PURE__ */
|
|
467
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, /* @__PURE__ */ React62.createElement("a", { href: url, style: linkStyle, target: "_blank" }, /* @__PURE__ */ React62.createElement(
|
|
467
468
|
"span",
|
|
468
469
|
{
|
|
469
470
|
dangerouslySetInnerHTML: {
|
|
470
471
|
__html: `<!--[if mso]><i style="letter-spacing: ${padding[1]}px;mso-font-width:-100%;mso-text-raise:${textRaise}" hidden> </i><![endif]-->`
|
|
471
472
|
}
|
|
472
473
|
}
|
|
473
|
-
), /* @__PURE__ */
|
|
474
|
+
), /* @__PURE__ */ React62.createElement("span", null, text), /* @__PURE__ */ React62.createElement(
|
|
474
475
|
"span",
|
|
475
476
|
{
|
|
476
477
|
dangerouslySetInnerHTML: {
|
|
@@ -519,7 +520,7 @@ function ColumnsContainer({ style, columns, props }) {
|
|
|
519
520
|
contentAlignment: (_d = props == null ? void 0 : props.contentAlignment) != null ? _d : ColumnsContainerPropsDefaults.contentAlignment,
|
|
520
521
|
fixedWidths: props == null ? void 0 : props.fixedWidths
|
|
521
522
|
};
|
|
522
|
-
return /* @__PURE__ */
|
|
523
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wStyle }, /* @__PURE__ */ React62.createElement(
|
|
523
524
|
"table",
|
|
524
525
|
{
|
|
525
526
|
align: "center",
|
|
@@ -528,7 +529,7 @@ function ColumnsContainer({ style, columns, props }) {
|
|
|
528
529
|
border: 0,
|
|
529
530
|
style: { tableLayout: "fixed", borderCollapse: "collapse" }
|
|
530
531
|
},
|
|
531
|
-
/* @__PURE__ */
|
|
532
|
+
/* @__PURE__ */ React62.createElement("tbody", { style: { width: "100%" } }, /* @__PURE__ */ React62.createElement("tr", { style: { width: "100%" } }, /* @__PURE__ */ React62.createElement(TableCell, { index: 0, props: blockProps, columns }), /* @__PURE__ */ React62.createElement(TableCell, { index: 1, props: blockProps, columns }), /* @__PURE__ */ React62.createElement(TableCell, { index: 2, props: blockProps, columns })))
|
|
532
533
|
));
|
|
533
534
|
}
|
|
534
535
|
function TableCell({ index, props, columns }) {
|
|
@@ -546,7 +547,7 @@ function TableCell({ index, props, columns }) {
|
|
|
546
547
|
width: (_d = (_c = props.fixedWidths) == null ? void 0 : _c[index]) != null ? _d : void 0
|
|
547
548
|
};
|
|
548
549
|
const children = (_e = columns && columns[index]) != null ? _e : null;
|
|
549
|
-
return /* @__PURE__ */
|
|
550
|
+
return /* @__PURE__ */ React62.createElement("td", { style }, children);
|
|
550
551
|
}
|
|
551
552
|
function getPaddingBefore(index, { columnsGap, columnsCount }) {
|
|
552
553
|
if (index === 0) {
|
|
@@ -608,9 +609,9 @@ function Container({ style, children }) {
|
|
|
608
609
|
padding: getPadding5(style == null ? void 0 : style.padding)
|
|
609
610
|
};
|
|
610
611
|
if (!children) {
|
|
611
|
-
return /* @__PURE__ */
|
|
612
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wStyle });
|
|
612
613
|
}
|
|
613
|
-
return /* @__PURE__ */
|
|
614
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wStyle }, children);
|
|
614
615
|
}
|
|
615
616
|
var container_default = Container;
|
|
616
617
|
var COLOR_SCHEMA5 = z.string().regex(/^#[0-9a-fA-F]{6}$/).nullable().optional();
|
|
@@ -644,7 +645,7 @@ function Divider({ style, props }) {
|
|
|
644
645
|
};
|
|
645
646
|
const borderTopWidth = (_b = props == null ? void 0 : props.lineHeight) != null ? _b : DividerPropsDefaults.lineHeight;
|
|
646
647
|
const borderTopColor = (_c = props == null ? void 0 : props.lineColor) != null ? _c : DividerPropsDefaults.lineColor;
|
|
647
|
-
return /* @__PURE__ */
|
|
648
|
+
return /* @__PURE__ */ React62.createElement("div", { style: st }, /* @__PURE__ */ React62.createElement(
|
|
648
649
|
"hr",
|
|
649
650
|
{
|
|
650
651
|
style: {
|
|
@@ -742,11 +743,11 @@ function Heading({ props, style }) {
|
|
|
742
743
|
const renderProps = isMarkdown ? { style: hStyle, dangerouslySetInnerHTML: { __html: html2 != null ? html2 : "" } } : { style: hStyle, children: text };
|
|
743
744
|
switch (level) {
|
|
744
745
|
case "h1":
|
|
745
|
-
return /* @__PURE__ */
|
|
746
|
+
return /* @__PURE__ */ React62.createElement("h1", __spreadValues({}, renderProps));
|
|
746
747
|
case "h2":
|
|
747
|
-
return /* @__PURE__ */
|
|
748
|
+
return /* @__PURE__ */ React62.createElement("h2", __spreadValues({}, renderProps));
|
|
748
749
|
case "h3":
|
|
749
|
-
return /* @__PURE__ */
|
|
750
|
+
return /* @__PURE__ */ React62.createElement("h3", __spreadValues({}, renderProps));
|
|
750
751
|
}
|
|
751
752
|
}
|
|
752
753
|
function getFontSize(level) {
|
|
@@ -828,9 +829,9 @@ function Html({ style, props }) {
|
|
|
828
829
|
padding: getPadding8(style == null ? void 0 : style.padding)
|
|
829
830
|
};
|
|
830
831
|
if (!children) {
|
|
831
|
-
return /* @__PURE__ */
|
|
832
|
+
return /* @__PURE__ */ React62.createElement("div", { style: cssStyle });
|
|
832
833
|
}
|
|
833
|
-
return /* @__PURE__ */
|
|
834
|
+
return /* @__PURE__ */ React62.createElement("div", { style: cssStyle, dangerouslySetInnerHTML: { __html: children } });
|
|
834
835
|
}
|
|
835
836
|
var html_default = Html;
|
|
836
837
|
var PADDING_SCHEMA9 = z.object({
|
|
@@ -866,7 +867,7 @@ function Image({ style, props }) {
|
|
|
866
867
|
const linkHref = (_c = props == null ? void 0 : props.linkHref) != null ? _c : null;
|
|
867
868
|
const width = (_d = props == null ? void 0 : props.width) != null ? _d : void 0;
|
|
868
869
|
const height = (_e = props == null ? void 0 : props.height) != null ? _e : void 0;
|
|
869
|
-
const imageElement = /* @__PURE__ */
|
|
870
|
+
const imageElement = /* @__PURE__ */ React62.createElement(
|
|
870
871
|
"img",
|
|
871
872
|
{
|
|
872
873
|
alt: (_f = props == null ? void 0 : props.alt) != null ? _f : "",
|
|
@@ -886,9 +887,9 @@ function Image({ style, props }) {
|
|
|
886
887
|
}
|
|
887
888
|
);
|
|
888
889
|
if (!linkHref) {
|
|
889
|
-
return /* @__PURE__ */
|
|
890
|
+
return /* @__PURE__ */ React62.createElement("div", { style: sectionStyle }, imageElement);
|
|
890
891
|
}
|
|
891
|
-
return /* @__PURE__ */
|
|
892
|
+
return /* @__PURE__ */ React62.createElement("div", { style: sectionStyle }, /* @__PURE__ */ React62.createElement("a", { href: linkHref, style: { textDecoration: "none" }, target: "_blank" }, imageElement));
|
|
892
893
|
}
|
|
893
894
|
var image_default = Image;
|
|
894
895
|
var FONT_FAMILY_SCHEMA5 = z.enum([
|
|
@@ -1034,7 +1035,7 @@ function Signature({ style, props }) {
|
|
|
1034
1035
|
color: linkColor,
|
|
1035
1036
|
textDecoration: "none"
|
|
1036
1037
|
};
|
|
1037
|
-
const imageElement = imageUrl ? /* @__PURE__ */
|
|
1038
|
+
const imageElement = imageUrl ? /* @__PURE__ */ React62.createElement(
|
|
1038
1039
|
"img",
|
|
1039
1040
|
{
|
|
1040
1041
|
src: imageUrl,
|
|
@@ -1053,18 +1054,18 @@ function Signature({ style, props }) {
|
|
|
1053
1054
|
}
|
|
1054
1055
|
) : null;
|
|
1055
1056
|
const contactParts = [];
|
|
1056
|
-
if (email) contactParts.push(/* @__PURE__ */
|
|
1057
|
-
if (phone) contactParts.push(/* @__PURE__ */
|
|
1057
|
+
if (email) contactParts.push(/* @__PURE__ */ React62.createElement("a", { key: "email", href: `mailto:${email}`, style: linkStyle }, email));
|
|
1058
|
+
if (phone) contactParts.push(/* @__PURE__ */ React62.createElement("a", { key: "phone", href: `tel:${phone}`, style: linkStyle }, phone));
|
|
1058
1059
|
if (website) {
|
|
1059
1060
|
const href = website.startsWith("http") ? website : `https://${website}`;
|
|
1060
|
-
contactParts.push(/* @__PURE__ */
|
|
1061
|
+
contactParts.push(/* @__PURE__ */ React62.createElement("a", { key: "website", href, style: linkStyle, target: "_blank" }, website));
|
|
1061
1062
|
}
|
|
1062
|
-
const textContent = /* @__PURE__ */
|
|
1063
|
-
const greetingElement = greeting ? /* @__PURE__ */
|
|
1063
|
+
const textContent = /* @__PURE__ */ React62.createElement("div", null, name && /* @__PURE__ */ React62.createElement("p", { style: nameStyle }, name), title && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, title), company && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, company), address && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, address), contactParts.length > 0 && /* @__PURE__ */ React62.createElement("p", { style: __spreadProps(__spreadValues({}, detailStyle), { marginTop: 4 }) }, contactParts.map((part, i) => /* @__PURE__ */ React62.createElement(React62.Fragment, { key: i }, i > 0 && /* @__PURE__ */ React62.createElement("span", { style: detailStyle }, " \xB7 "), part))));
|
|
1064
|
+
const greetingElement = greeting ? /* @__PURE__ */ React62.createElement("p", { style: greetingStyle }, greeting) : null;
|
|
1064
1065
|
if (layout === "vertical") {
|
|
1065
|
-
return /* @__PURE__ */
|
|
1066
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, greetingElement, imageElement && /* @__PURE__ */ React62.createElement("div", { style: { marginBottom: 12 } }, imageElement), textContent);
|
|
1066
1067
|
}
|
|
1067
|
-
return /* @__PURE__ */
|
|
1068
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, greetingElement, /* @__PURE__ */ React62.createElement("table", { cellPadding: "0", cellSpacing: "0", border: 0, role: "presentation" }, /* @__PURE__ */ React62.createElement("tbody", null, /* @__PURE__ */ React62.createElement("tr", null, imageElement && /* @__PURE__ */ React62.createElement("td", { style: { verticalAlign: "middle", paddingRight: 16 } }, imageElement), /* @__PURE__ */ React62.createElement("td", { style: { verticalAlign: "middle" } }, textContent)))));
|
|
1068
1069
|
}
|
|
1069
1070
|
var signature_default = Signature;
|
|
1070
1071
|
var SpacerPropsSchema = z.object({
|
|
@@ -1081,13 +1082,13 @@ function Spacer({ props }) {
|
|
|
1081
1082
|
const style = {
|
|
1082
1083
|
height: (_a = props == null ? void 0 : props.height) != null ? _a : SpacerPropsDefaults.height
|
|
1083
1084
|
};
|
|
1084
|
-
return /* @__PURE__ */
|
|
1085
|
+
return /* @__PURE__ */ React62.createElement("div", { style });
|
|
1085
1086
|
}
|
|
1086
1087
|
var spacer_default = Spacer;
|
|
1087
1088
|
function buildBlockComponent(blocks) {
|
|
1088
1089
|
return function BlockComponent({ type, data }) {
|
|
1089
1090
|
const Component = blocks[type].Component;
|
|
1090
|
-
return /* @__PURE__ */
|
|
1091
|
+
return /* @__PURE__ */ React62.createElement(Component, __spreadValues({}, data));
|
|
1091
1092
|
};
|
|
1092
1093
|
}
|
|
1093
1094
|
function buildBlockConfigurationSchema(blocks) {
|
|
@@ -1108,6 +1109,38 @@ function buildBlockConfigurationDictionary(blocks) {
|
|
|
1108
1109
|
// src/core/utils.ts
|
|
1109
1110
|
var DocumentBlocksDictionary = "DocumentBlocksDictionary";
|
|
1110
1111
|
var BlockConfiguration = "BlockConfiguration";
|
|
1112
|
+
var editorHandlebars = Handlebars.create();
|
|
1113
|
+
editorHandlebars.registerHelper("formatDate", function(value, format) {
|
|
1114
|
+
if (value === null || value === void 0 || value === "") return "";
|
|
1115
|
+
const date = value instanceof Date ? value : new Date(String(value));
|
|
1116
|
+
if (Number.isNaN(date.getTime())) return String(value);
|
|
1117
|
+
const spec = typeof format === "string" ? format : void 0;
|
|
1118
|
+
if (!spec || spec === "iso") return date.toISOString();
|
|
1119
|
+
if (spec === "date") return date.toLocaleDateString();
|
|
1120
|
+
if (spec === "time") return date.toLocaleTimeString();
|
|
1121
|
+
if (spec === "datetime") return date.toLocaleString();
|
|
1122
|
+
return date.toLocaleDateString(void 0, { dateStyle: spec });
|
|
1123
|
+
});
|
|
1124
|
+
editorHandlebars.registerHelper("formatNumber", function(value, options) {
|
|
1125
|
+
if (value === null || value === void 0 || value === "") return "";
|
|
1126
|
+
const num = typeof value === "number" ? value : Number(value);
|
|
1127
|
+
if (Number.isNaN(num)) return String(value);
|
|
1128
|
+
const hashOpts = options && typeof options === "object" && "hash" in options ? options.hash : {};
|
|
1129
|
+
try {
|
|
1130
|
+
return new Intl.NumberFormat(void 0, {
|
|
1131
|
+
style: hashOpts.style,
|
|
1132
|
+
currency: hashOpts.currency,
|
|
1133
|
+
minimumFractionDigits: hashOpts.minimumFractionDigits,
|
|
1134
|
+
maximumFractionDigits: hashOpts.maximumFractionDigits
|
|
1135
|
+
}).format(num);
|
|
1136
|
+
} catch (e) {
|
|
1137
|
+
return String(num);
|
|
1138
|
+
}
|
|
1139
|
+
});
|
|
1140
|
+
function evaluateHandlebars(source, context) {
|
|
1141
|
+
const template = editorHandlebars.compile(source, { strict: false, noEscape: false });
|
|
1142
|
+
return template(context);
|
|
1143
|
+
}
|
|
1111
1144
|
var BasePropsShape = ColumnsContainerPropsSchema.shape.props.unwrap().unwrap().shape;
|
|
1112
1145
|
var ColumnsContainerPropsSchema2 = z.object({
|
|
1113
1146
|
style: ColumnsContainerPropsSchema.shape.style,
|
|
@@ -1124,9 +1157,9 @@ function ColumnsContainerReader({ style, props }) {
|
|
|
1124
1157
|
const _a = props != null ? props : {}, { columns } = _a, restProps = __objRest(_a, ["columns"]);
|
|
1125
1158
|
let cols = void 0;
|
|
1126
1159
|
if (columns) {
|
|
1127
|
-
cols = columns.map((col) => col.childrenIds.map((childId) => /* @__PURE__ */
|
|
1160
|
+
cols = columns.map((col) => col.childrenIds.map((childId) => /* @__PURE__ */ React62.createElement(ReaderBlock, { key: childId, id: childId })));
|
|
1128
1161
|
}
|
|
1129
|
-
return /* @__PURE__ */
|
|
1162
|
+
return /* @__PURE__ */ React62.createElement(columns_container_default, { props: restProps, columns: cols, style });
|
|
1130
1163
|
}
|
|
1131
1164
|
var ContainerPropsSchema2 = z.object({
|
|
1132
1165
|
style: ContainerPropsSchema.shape.style,
|
|
@@ -1137,7 +1170,7 @@ var ContainerPropsSchema2 = z.object({
|
|
|
1137
1170
|
function ContainerReader({ style, props }) {
|
|
1138
1171
|
var _a;
|
|
1139
1172
|
const childrenIds = (_a = props == null ? void 0 : props.childrenIds) != null ? _a : [];
|
|
1140
|
-
return /* @__PURE__ */
|
|
1173
|
+
return /* @__PURE__ */ React62.createElement(container_default, { style }, childrenIds.map((childId) => /* @__PURE__ */ React62.createElement(ReaderBlock, { key: childId, id: childId })));
|
|
1141
1174
|
}
|
|
1142
1175
|
var COLOR_SCHEMA9 = z.string().regex(/^#[0-9a-fA-F]{6}$/).nullable().optional();
|
|
1143
1176
|
var FONT_FAMILY_SCHEMA6 = z.enum([
|
|
@@ -1210,9 +1243,9 @@ function EmailLayoutReader(props) {
|
|
|
1210
1243
|
margin: "0"
|
|
1211
1244
|
};
|
|
1212
1245
|
if (props.backdropDisabled) {
|
|
1213
|
-
return /* @__PURE__ */
|
|
1246
|
+
return /* @__PURE__ */ React62.createElement("div", { style: baseStyle }, childrenIds.map((childId) => /* @__PURE__ */ React62.createElement(ReaderBlock, { key: childId, id: childId })));
|
|
1214
1247
|
}
|
|
1215
|
-
return /* @__PURE__ */
|
|
1248
|
+
return /* @__PURE__ */ React62.createElement(
|
|
1216
1249
|
"div",
|
|
1217
1250
|
{
|
|
1218
1251
|
style: __spreadProps(__spreadValues({}, baseStyle), {
|
|
@@ -1222,7 +1255,7 @@ function EmailLayoutReader(props) {
|
|
|
1222
1255
|
width: "100%"
|
|
1223
1256
|
})
|
|
1224
1257
|
},
|
|
1225
|
-
/* @__PURE__ */
|
|
1258
|
+
/* @__PURE__ */ React62.createElement(
|
|
1226
1259
|
"table",
|
|
1227
1260
|
{
|
|
1228
1261
|
align: "center",
|
|
@@ -1240,7 +1273,7 @@ function EmailLayoutReader(props) {
|
|
|
1240
1273
|
cellPadding: "0",
|
|
1241
1274
|
border: 0
|
|
1242
1275
|
},
|
|
1243
|
-
/* @__PURE__ */
|
|
1276
|
+
/* @__PURE__ */ React62.createElement("tbody", null, /* @__PURE__ */ React62.createElement("tr", { style: { width: "100%" } }, /* @__PURE__ */ React62.createElement("td", null, childrenIds.map((childId) => /* @__PURE__ */ React62.createElement(ReaderBlock, { key: childId, id: childId })))))
|
|
1244
1277
|
)
|
|
1245
1278
|
);
|
|
1246
1279
|
}
|
|
@@ -1252,7 +1285,7 @@ function useReaderDocument() {
|
|
|
1252
1285
|
}
|
|
1253
1286
|
function ReaderBlock({ id }) {
|
|
1254
1287
|
const document2 = useReaderDocument();
|
|
1255
|
-
return document2[id] ? /* @__PURE__ */
|
|
1288
|
+
return document2[id] ? /* @__PURE__ */ React62.createElement(BaseReaderBlock, __spreadValues({}, document2[id])) : null;
|
|
1256
1289
|
}
|
|
1257
1290
|
var READER_DICTIONARY = buildBlockConfigurationDictionary({
|
|
1258
1291
|
ColumnsContainer: {
|
|
@@ -1309,21 +1342,25 @@ var ReaderBlockSchema = buildBlockConfigurationSchema(READER_DICTIONARY);
|
|
|
1309
1342
|
var ReaderDocumentSchema = z.record(z.string(), ReaderBlockSchema);
|
|
1310
1343
|
var BaseReaderBlock = buildBlockComponent(READER_DICTIONARY);
|
|
1311
1344
|
function Reader({ document: document2, rootBlockId }) {
|
|
1312
|
-
return /* @__PURE__ */
|
|
1345
|
+
return /* @__PURE__ */ React62.createElement(ReaderContext.Provider, { value: document2 }, /* @__PURE__ */ React62.createElement(ReaderBlock, { id: rootBlockId }));
|
|
1313
1346
|
}
|
|
1314
1347
|
|
|
1315
1348
|
// src/email-builder/renderers/render-to-static-markup.tsx
|
|
1316
|
-
function renderToStaticMarkup(document2, { rootBlockId }) {
|
|
1317
|
-
|
|
1318
|
-
/* @__PURE__ */
|
|
1349
|
+
function renderToStaticMarkup(document2, { rootBlockId, variables }) {
|
|
1350
|
+
const html2 = "<!DOCTYPE html>" + renderToStaticMarkup$1(
|
|
1351
|
+
/* @__PURE__ */ React62.createElement("html", null, /* @__PURE__ */ React62.createElement("body", null, /* @__PURE__ */ React62.createElement(Reader, { document: document2, rootBlockId })))
|
|
1319
1352
|
);
|
|
1353
|
+
if (!variables) return html2;
|
|
1354
|
+
return evaluateHandlebars(html2, variables);
|
|
1320
1355
|
}
|
|
1321
1356
|
|
|
1322
1357
|
// src/email-builder/renderers/render-to-text.ts
|
|
1323
|
-
function renderToText(document2, { rootBlockId }) {
|
|
1358
|
+
function renderToText(document2, { rootBlockId, variables }) {
|
|
1324
1359
|
const lines = [];
|
|
1325
1360
|
renderBlock(document2, rootBlockId, lines);
|
|
1326
|
-
|
|
1361
|
+
const text = lines.join("\n").replace(/\n{3,}/g, "\n\n").trim() + "\n";
|
|
1362
|
+
if (!variables) return text;
|
|
1363
|
+
return evaluateHandlebars(text, variables);
|
|
1327
1364
|
}
|
|
1328
1365
|
function renderBlock(document2, blockId, lines) {
|
|
1329
1366
|
var _a;
|
|
@@ -1984,7 +2021,10 @@ var editorStateStore = create(() => ({
|
|
|
1984
2021
|
inspectorDrawerOpen: true,
|
|
1985
2022
|
samplesDrawerOpen: true,
|
|
1986
2023
|
persistenceEnabled: false,
|
|
1987
|
-
lastFocusedEditable: null
|
|
2024
|
+
lastFocusedEditable: null,
|
|
2025
|
+
hoveredBlockId: null,
|
|
2026
|
+
draggingBlock: null,
|
|
2027
|
+
workspaceBackground: "checkerboard"
|
|
1988
2028
|
}));
|
|
1989
2029
|
function useDocument() {
|
|
1990
2030
|
return editorStateStore((s) => s.document);
|
|
@@ -2063,6 +2103,27 @@ function useLastFocusedEditable() {
|
|
|
2063
2103
|
function getLastFocusedEditable() {
|
|
2064
2104
|
return editorStateStore.getState().lastFocusedEditable;
|
|
2065
2105
|
}
|
|
2106
|
+
function useHoveredBlockId() {
|
|
2107
|
+
return editorStateStore((s) => s.hoveredBlockId);
|
|
2108
|
+
}
|
|
2109
|
+
function setHoveredBlockId(hoveredBlockId) {
|
|
2110
|
+
return editorStateStore.setState({ hoveredBlockId });
|
|
2111
|
+
}
|
|
2112
|
+
function useDraggingBlock() {
|
|
2113
|
+
return editorStateStore((s) => s.draggingBlock);
|
|
2114
|
+
}
|
|
2115
|
+
function getDraggingBlock() {
|
|
2116
|
+
return editorStateStore.getState().draggingBlock;
|
|
2117
|
+
}
|
|
2118
|
+
function setDraggingBlock(draggingBlock) {
|
|
2119
|
+
return editorStateStore.setState({ draggingBlock });
|
|
2120
|
+
}
|
|
2121
|
+
function useWorkspaceBackground() {
|
|
2122
|
+
return editorStateStore((s) => s.workspaceBackground);
|
|
2123
|
+
}
|
|
2124
|
+
function setWorkspaceBackground(workspaceBackground) {
|
|
2125
|
+
return editorStateStore.setState({ workspaceBackground });
|
|
2126
|
+
}
|
|
2066
2127
|
function setLastFocusedEditable(lastFocusedEditable) {
|
|
2067
2128
|
return editorStateStore.setState({ lastFocusedEditable });
|
|
2068
2129
|
}
|
|
@@ -2137,7 +2198,7 @@ var EmailEditorProvider = ({
|
|
|
2137
2198
|
registerSaveListener,
|
|
2138
2199
|
setCurrentTemplate
|
|
2139
2200
|
}), [currentTemplateId, currentTemplateName, currentTemplateKind, saveTemplate, loadTemplate, registerSaveListener, setCurrentTemplate]);
|
|
2140
|
-
return /* @__PURE__ */
|
|
2201
|
+
return /* @__PURE__ */ React62.createElement(EmailEditorContext.Provider, { value }, children);
|
|
2141
2202
|
};
|
|
2142
2203
|
var useEmailEditor = () => {
|
|
2143
2204
|
const context = useContext(EmailEditorContext);
|
|
@@ -2151,20 +2212,20 @@ function ImageCallbacksProvider({
|
|
|
2151
2212
|
callbacks,
|
|
2152
2213
|
children
|
|
2153
2214
|
}) {
|
|
2154
|
-
return /* @__PURE__ */
|
|
2215
|
+
return /* @__PURE__ */ React62.createElement(ImageCallbacksContext.Provider, { value: callbacks }, children);
|
|
2155
2216
|
}
|
|
2156
2217
|
function useImageCallbacks() {
|
|
2157
2218
|
return useContext(ImageCallbacksContext);
|
|
2158
2219
|
}
|
|
2159
2220
|
function BaseSidebarPanel({ title, children }) {
|
|
2160
|
-
return /* @__PURE__ */
|
|
2221
|
+
return /* @__PURE__ */ React62.createElement(Box, { p: 2 }, /* @__PURE__ */ React62.createElement(Typography, { variant: "overline", color: "text.secondary", sx: { display: "block", mb: 2 } }, title), /* @__PURE__ */ React62.createElement(Stack, { spacing: 5, mb: 3 }, children));
|
|
2161
2222
|
}
|
|
2162
2223
|
function RadioGroupInput({ label, children, defaultValue, onChange }) {
|
|
2163
2224
|
const [value, setValue] = useState(defaultValue);
|
|
2164
2225
|
useEffect(() => {
|
|
2165
2226
|
setValue(defaultValue);
|
|
2166
2227
|
}, [defaultValue]);
|
|
2167
|
-
return /* @__PURE__ */
|
|
2228
|
+
return /* @__PURE__ */ React62.createElement(Stack, { alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2168
2229
|
ToggleButtonGroup,
|
|
2169
2230
|
{
|
|
2170
2231
|
exclusive: true,
|
|
@@ -2184,7 +2245,7 @@ function RadioGroupInput({ label, children, defaultValue, onChange }) {
|
|
|
2184
2245
|
}
|
|
2185
2246
|
function RawSliderInput(_a) {
|
|
2186
2247
|
var _b = _a, { iconLabel, value, setValue, units } = _b, props = __objRest(_b, ["iconLabel", "value", "setValue", "units"]);
|
|
2187
|
-
return /* @__PURE__ */
|
|
2248
|
+
return /* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "center", spacing: 2, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React62.createElement(Box, { sx: { minWidth: 24, lineHeight: 1, flexShrink: 0 } }, iconLabel), /* @__PURE__ */ React62.createElement(
|
|
2188
2249
|
Slider,
|
|
2189
2250
|
__spreadProps(__spreadValues({}, props), {
|
|
2190
2251
|
value,
|
|
@@ -2195,14 +2256,14 @@ function RawSliderInput(_a) {
|
|
|
2195
2256
|
setValue(value2);
|
|
2196
2257
|
}
|
|
2197
2258
|
})
|
|
2198
|
-
), /* @__PURE__ */
|
|
2259
|
+
), /* @__PURE__ */ React62.createElement(Box, { sx: { minWidth: 32, textAlign: "right", flexShrink: 0 } }, /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", color: "text.secondary", sx: { lineHeight: 1 } }, value, units)));
|
|
2199
2260
|
}
|
|
2200
2261
|
|
|
2201
2262
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/inputs/slider-input.tsx
|
|
2202
2263
|
function SliderInput(_a) {
|
|
2203
2264
|
var _b = _a, { label, defaultValue, onChange } = _b, props = __objRest(_b, ["label", "defaultValue", "onChange"]);
|
|
2204
2265
|
const [value, setValue] = useState(defaultValue);
|
|
2205
|
-
return /* @__PURE__ */
|
|
2266
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 1, alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2206
2267
|
RawSliderInput,
|
|
2207
2268
|
__spreadValues({
|
|
2208
2269
|
value,
|
|
@@ -2219,7 +2280,7 @@ function TextInput({ helperText, label, placeholder, rows, InputProps: InputProp
|
|
|
2219
2280
|
useEffect(() => {
|
|
2220
2281
|
setValue(defaultValue);
|
|
2221
2282
|
}, [defaultValue]);
|
|
2222
|
-
return /* @__PURE__ */
|
|
2283
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2223
2284
|
TextField,
|
|
2224
2285
|
{
|
|
2225
2286
|
fullWidth: true,
|
|
@@ -2245,7 +2306,7 @@ var TILE_BUTTON = {
|
|
|
2245
2306
|
};
|
|
2246
2307
|
function Swatch({ paletteColors, value, onChange }) {
|
|
2247
2308
|
const renderButton2 = (colorValue) => {
|
|
2248
|
-
return /* @__PURE__ */
|
|
2309
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2249
2310
|
Button$1,
|
|
2250
2311
|
{
|
|
2251
2312
|
key: colorValue,
|
|
@@ -2264,7 +2325,7 @@ function Swatch({ paletteColors, value, onChange }) {
|
|
|
2264
2325
|
}
|
|
2265
2326
|
);
|
|
2266
2327
|
};
|
|
2267
|
-
return /* @__PURE__ */
|
|
2328
|
+
return /* @__PURE__ */ React62.createElement(Box, { width: "100%", sx: { display: "grid", gap: 1, gridTemplateColumns: "1fr 1fr 1fr 1fr 1fr 1fr" } }, paletteColors.map((c) => renderButton2(c)));
|
|
2268
2329
|
}
|
|
2269
2330
|
|
|
2270
2331
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/inputs/color-input/picker.tsx
|
|
@@ -2331,7 +2392,7 @@ var SX = {
|
|
|
2331
2392
|
}
|
|
2332
2393
|
};
|
|
2333
2394
|
function Picker({ value, onChange }) {
|
|
2334
|
-
return /* @__PURE__ */
|
|
2395
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 1, sx: SX }, /* @__PURE__ */ React62.createElement(HexColorPicker, { color: value, onChange }), /* @__PURE__ */ React62.createElement(Swatch, { paletteColors: DEFAULT_PRESET_COLORS, value, onChange }), /* @__PURE__ */ React62.createElement(Box, { pt: 1 }, /* @__PURE__ */ React62.createElement(HexColorInput, { prefixed: true, color: value, onChange })));
|
|
2335
2396
|
}
|
|
2336
2397
|
|
|
2337
2398
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/inputs/color-input/base-color-input.tsx
|
|
@@ -2356,7 +2417,7 @@ function ColorInput({ label, defaultValue, onChange, nullable }) {
|
|
|
2356
2417
|
if (typeof value !== "string" || value.trim().length === 0) {
|
|
2357
2418
|
return null;
|
|
2358
2419
|
}
|
|
2359
|
-
return /* @__PURE__ */
|
|
2420
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2360
2421
|
ButtonBase,
|
|
2361
2422
|
{
|
|
2362
2423
|
onClick: () => {
|
|
@@ -2364,16 +2425,16 @@ function ColorInput({ label, defaultValue, onChange, nullable }) {
|
|
|
2364
2425
|
onChange(null);
|
|
2365
2426
|
}
|
|
2366
2427
|
},
|
|
2367
|
-
/* @__PURE__ */
|
|
2428
|
+
/* @__PURE__ */ React62.createElement(CloseOutlined, { fontSize: "small", sx: { color: "grey.600" } })
|
|
2368
2429
|
);
|
|
2369
2430
|
};
|
|
2370
2431
|
const renderOpenButton = () => {
|
|
2371
2432
|
if (value) {
|
|
2372
|
-
return /* @__PURE__ */
|
|
2433
|
+
return /* @__PURE__ */ React62.createElement(ButtonBase, { onClick: handleClickOpen, sx: __spreadProps(__spreadValues({}, BUTTON_SX), { bgcolor: value }) });
|
|
2373
2434
|
}
|
|
2374
|
-
return /* @__PURE__ */
|
|
2435
|
+
return /* @__PURE__ */ React62.createElement(ButtonBase, { onClick: handleClickOpen, sx: __spreadValues({}, BUTTON_SX) }, /* @__PURE__ */ React62.createElement(AddOutlined, { fontSize: "small" }));
|
|
2375
2436
|
};
|
|
2376
|
-
return /* @__PURE__ */
|
|
2437
|
+
return /* @__PURE__ */ React62.createElement(Stack, { alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { sx: { mb: 0.5 } }, label), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 1 }, renderOpenButton(), renderResetButton()), /* @__PURE__ */ React62.createElement(
|
|
2377
2438
|
Menu,
|
|
2378
2439
|
{
|
|
2379
2440
|
anchorEl,
|
|
@@ -2383,7 +2444,7 @@ function ColorInput({ label, defaultValue, onChange, nullable }) {
|
|
|
2383
2444
|
sx: { height: "auto", padding: 0 }
|
|
2384
2445
|
}
|
|
2385
2446
|
},
|
|
2386
|
-
/* @__PURE__ */
|
|
2447
|
+
/* @__PURE__ */ React62.createElement(
|
|
2387
2448
|
Picker,
|
|
2388
2449
|
{
|
|
2389
2450
|
value: value || "",
|
|
@@ -2398,10 +2459,10 @@ function ColorInput({ label, defaultValue, onChange, nullable }) {
|
|
|
2398
2459
|
|
|
2399
2460
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/inputs/color-input/index.tsx
|
|
2400
2461
|
function ColorInput2(props) {
|
|
2401
|
-
return /* @__PURE__ */
|
|
2462
|
+
return /* @__PURE__ */ React62.createElement(ColorInput, __spreadProps(__spreadValues({}, props), { nullable: false }));
|
|
2402
2463
|
}
|
|
2403
2464
|
function NullableColorInput(props) {
|
|
2404
|
-
return /* @__PURE__ */
|
|
2465
|
+
return /* @__PURE__ */ React62.createElement(ColorInput, __spreadProps(__spreadValues({}, props), { nullable: true }));
|
|
2405
2466
|
}
|
|
2406
2467
|
|
|
2407
2468
|
// src/editor/blocks/helpers/font-family.ts
|
|
@@ -2454,13 +2515,13 @@ var FONT_FAMILIES = [
|
|
|
2454
2515
|
];
|
|
2455
2516
|
|
|
2456
2517
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/inputs/font-family.tsx
|
|
2457
|
-
var OPTIONS = FONT_FAMILIES.map((option) => /* @__PURE__ */
|
|
2518
|
+
var OPTIONS = FONT_FAMILIES.map((option) => /* @__PURE__ */ React62.createElement(MenuItem, { key: option.key, value: option.key, sx: { fontFamily: option.value } }, option.label));
|
|
2458
2519
|
function NullableFontFamily({ label, onChange, defaultValue }) {
|
|
2459
2520
|
const [value, setValue] = useState(defaultValue != null ? defaultValue : "inherit");
|
|
2460
2521
|
useEffect(() => {
|
|
2461
2522
|
setValue(defaultValue != null ? defaultValue : "inherit");
|
|
2462
2523
|
}, [defaultValue]);
|
|
2463
|
-
return /* @__PURE__ */
|
|
2524
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2464
2525
|
TextField,
|
|
2465
2526
|
{
|
|
2466
2527
|
select: true,
|
|
@@ -2473,7 +2534,7 @@ function NullableFontFamily({ label, onChange, defaultValue }) {
|
|
|
2473
2534
|
onChange(v === null ? null : v);
|
|
2474
2535
|
}
|
|
2475
2536
|
},
|
|
2476
|
-
/* @__PURE__ */
|
|
2537
|
+
/* @__PURE__ */ React62.createElement(MenuItem, { value: "inherit" }, "Match email settings"),
|
|
2477
2538
|
OPTIONS
|
|
2478
2539
|
);
|
|
2479
2540
|
}
|
|
@@ -2486,10 +2547,10 @@ function FontSizeInput({ label, defaultValue, onChange }) {
|
|
|
2486
2547
|
setValue(value2);
|
|
2487
2548
|
onChange(value2);
|
|
2488
2549
|
};
|
|
2489
|
-
return /* @__PURE__ */
|
|
2550
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 1, alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2490
2551
|
RawSliderInput,
|
|
2491
2552
|
{
|
|
2492
|
-
iconLabel: /* @__PURE__ */
|
|
2553
|
+
iconLabel: /* @__PURE__ */ React62.createElement(TextFieldsOutlined, { sx: { fontSize: 16 } }),
|
|
2493
2554
|
value,
|
|
2494
2555
|
setValue: handleChange,
|
|
2495
2556
|
units: "px",
|
|
@@ -2504,7 +2565,7 @@ function FontWeightInput({ label, defaultValue, onChange }) {
|
|
|
2504
2565
|
useEffect(() => {
|
|
2505
2566
|
setValue(defaultValue);
|
|
2506
2567
|
}, [defaultValue]);
|
|
2507
|
-
return /* @__PURE__ */
|
|
2568
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2508
2569
|
RadioGroupInput,
|
|
2509
2570
|
{
|
|
2510
2571
|
label,
|
|
@@ -2514,8 +2575,8 @@ function FontWeightInput({ label, defaultValue, onChange }) {
|
|
|
2514
2575
|
onChange(fontWeight);
|
|
2515
2576
|
}
|
|
2516
2577
|
},
|
|
2517
|
-
/* @__PURE__ */
|
|
2518
|
-
/* @__PURE__ */
|
|
2578
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "normal" }, "Regular"),
|
|
2579
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "bold" }, "Bold")
|
|
2519
2580
|
);
|
|
2520
2581
|
}
|
|
2521
2582
|
function LetterSpacingInput({ label, defaultValue, onChange }) {
|
|
@@ -2527,10 +2588,10 @@ function LetterSpacingInput({ label, defaultValue, onChange }) {
|
|
|
2527
2588
|
setValue(v);
|
|
2528
2589
|
onChange(v === 0 ? null : v);
|
|
2529
2590
|
};
|
|
2530
|
-
return /* @__PURE__ */
|
|
2591
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 1, alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2531
2592
|
RawSliderInput,
|
|
2532
2593
|
{
|
|
2533
|
-
iconLabel: /* @__PURE__ */
|
|
2594
|
+
iconLabel: /* @__PURE__ */ React62.createElement(SpaceBarOutlined, { sx: { fontSize: 16 } }),
|
|
2534
2595
|
value,
|
|
2535
2596
|
setValue: handleChange,
|
|
2536
2597
|
units: "px",
|
|
@@ -2549,10 +2610,10 @@ function LineHeightInput({ label, defaultValue, onChange }) {
|
|
|
2549
2610
|
setValue(v);
|
|
2550
2611
|
onChange(v === 0 ? null : v);
|
|
2551
2612
|
};
|
|
2552
|
-
return /* @__PURE__ */
|
|
2613
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 1, alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2553
2614
|
RawSliderInput,
|
|
2554
2615
|
{
|
|
2555
|
-
iconLabel: /* @__PURE__ */
|
|
2616
|
+
iconLabel: /* @__PURE__ */ React62.createElement(FormatLineSpacingOutlined, { sx: { fontSize: 16 } }),
|
|
2556
2617
|
value,
|
|
2557
2618
|
setValue: handleChange,
|
|
2558
2619
|
units: "",
|
|
@@ -2581,10 +2642,10 @@ function PaddingInput({ label, defaultValue, onChange }) {
|
|
|
2581
2642
|
setValue(v);
|
|
2582
2643
|
onChange(v);
|
|
2583
2644
|
}
|
|
2584
|
-
return /* @__PURE__ */
|
|
2645
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 2, alignItems: "flex-start", pb: 1 }, /* @__PURE__ */ React62.createElement(InputLabel, { shrink: true }, label), /* @__PURE__ */ React62.createElement(
|
|
2585
2646
|
RawSliderInput,
|
|
2586
2647
|
{
|
|
2587
|
-
iconLabel: /* @__PURE__ */
|
|
2648
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AlignVerticalTopOutlined, { sx: { fontSize: 16 } }),
|
|
2588
2649
|
value: value.top,
|
|
2589
2650
|
setValue: (num) => handleChange("top", num),
|
|
2590
2651
|
units: "px",
|
|
@@ -2593,10 +2654,10 @@ function PaddingInput({ label, defaultValue, onChange }) {
|
|
|
2593
2654
|
max: 80,
|
|
2594
2655
|
marks: true
|
|
2595
2656
|
}
|
|
2596
|
-
), /* @__PURE__ */
|
|
2657
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2597
2658
|
RawSliderInput,
|
|
2598
2659
|
{
|
|
2599
|
-
iconLabel: /* @__PURE__ */
|
|
2660
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AlignVerticalBottomOutlined, { sx: { fontSize: 16 } }),
|
|
2600
2661
|
value: value.bottom,
|
|
2601
2662
|
setValue: (num) => handleChange("bottom", num),
|
|
2602
2663
|
units: "px",
|
|
@@ -2605,10 +2666,10 @@ function PaddingInput({ label, defaultValue, onChange }) {
|
|
|
2605
2666
|
max: 80,
|
|
2606
2667
|
marks: true
|
|
2607
2668
|
}
|
|
2608
|
-
), /* @__PURE__ */
|
|
2669
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2609
2670
|
RawSliderInput,
|
|
2610
2671
|
{
|
|
2611
|
-
iconLabel: /* @__PURE__ */
|
|
2672
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AlignHorizontalLeftOutlined, { sx: { fontSize: 16 } }),
|
|
2612
2673
|
value: value.left,
|
|
2613
2674
|
setValue: (num) => handleChange("left", num),
|
|
2614
2675
|
units: "px",
|
|
@@ -2617,10 +2678,10 @@ function PaddingInput({ label, defaultValue, onChange }) {
|
|
|
2617
2678
|
max: 80,
|
|
2618
2679
|
marks: true
|
|
2619
2680
|
}
|
|
2620
|
-
), /* @__PURE__ */
|
|
2681
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2621
2682
|
RawSliderInput,
|
|
2622
2683
|
{
|
|
2623
|
-
iconLabel: /* @__PURE__ */
|
|
2684
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AlignHorizontalRightOutlined, { sx: { fontSize: 16 } }),
|
|
2624
2685
|
value: value.right,
|
|
2625
2686
|
setValue: (num) => handleChange("right", num),
|
|
2626
2687
|
units: "px",
|
|
@@ -2636,7 +2697,7 @@ function TextAlignInput({ label, defaultValue, onChange }) {
|
|
|
2636
2697
|
useEffect(() => {
|
|
2637
2698
|
setValue(defaultValue != null ? defaultValue : "left");
|
|
2638
2699
|
}, [defaultValue]);
|
|
2639
|
-
return /* @__PURE__ */
|
|
2700
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2640
2701
|
RadioGroupInput,
|
|
2641
2702
|
{
|
|
2642
2703
|
label,
|
|
@@ -2646,9 +2707,9 @@ function TextAlignInput({ label, defaultValue, onChange }) {
|
|
|
2646
2707
|
onChange(value2);
|
|
2647
2708
|
}
|
|
2648
2709
|
},
|
|
2649
|
-
/* @__PURE__ */
|
|
2650
|
-
/* @__PURE__ */
|
|
2651
|
-
/* @__PURE__ */
|
|
2710
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "left" }, /* @__PURE__ */ React62.createElement(FormatAlignLeftOutlined, { fontSize: "small" })),
|
|
2711
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "center" }, /* @__PURE__ */ React62.createElement(FormatAlignCenterOutlined, { fontSize: "small" })),
|
|
2712
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "right" }, /* @__PURE__ */ React62.createElement(FormatAlignRightOutlined, { fontSize: "small" }))
|
|
2652
2713
|
);
|
|
2653
2714
|
}
|
|
2654
2715
|
|
|
@@ -2661,14 +2722,14 @@ function SingleStylePropertyPanel({ name, value, onChange }) {
|
|
|
2661
2722
|
};
|
|
2662
2723
|
switch (name) {
|
|
2663
2724
|
case "backgroundColor":
|
|
2664
|
-
return /* @__PURE__ */
|
|
2725
|
+
return /* @__PURE__ */ React62.createElement(NullableColorInput, { label: "Background color", defaultValue, onChange: handleChange });
|
|
2665
2726
|
case "borderColor":
|
|
2666
|
-
return /* @__PURE__ */
|
|
2727
|
+
return /* @__PURE__ */ React62.createElement(NullableColorInput, { label: "Border color", defaultValue, onChange: handleChange });
|
|
2667
2728
|
case "borderRadius":
|
|
2668
|
-
return /* @__PURE__ */
|
|
2729
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2669
2730
|
SliderInput,
|
|
2670
2731
|
{
|
|
2671
|
-
iconLabel: /* @__PURE__ */
|
|
2732
|
+
iconLabel: /* @__PURE__ */ React62.createElement(RoundedCornerOutlined, null),
|
|
2672
2733
|
units: "px",
|
|
2673
2734
|
step: 4,
|
|
2674
2735
|
marks: true,
|
|
@@ -2680,27 +2741,27 @@ function SingleStylePropertyPanel({ name, value, onChange }) {
|
|
|
2680
2741
|
}
|
|
2681
2742
|
);
|
|
2682
2743
|
case "color":
|
|
2683
|
-
return /* @__PURE__ */
|
|
2744
|
+
return /* @__PURE__ */ React62.createElement(NullableColorInput, { label: "Text color", defaultValue, onChange: handleChange });
|
|
2684
2745
|
case "fontFamily":
|
|
2685
|
-
return /* @__PURE__ */
|
|
2746
|
+
return /* @__PURE__ */ React62.createElement(NullableFontFamily, { label: "Font family", defaultValue, onChange: handleChange });
|
|
2686
2747
|
case "fontSize":
|
|
2687
|
-
return /* @__PURE__ */
|
|
2748
|
+
return /* @__PURE__ */ React62.createElement(FontSizeInput, { label: "Font size", defaultValue, onChange: handleChange });
|
|
2688
2749
|
case "fontWeight":
|
|
2689
|
-
return /* @__PURE__ */
|
|
2750
|
+
return /* @__PURE__ */ React62.createElement(FontWeightInput, { label: "Font weight", defaultValue, onChange: handleChange });
|
|
2690
2751
|
case "lineHeight":
|
|
2691
|
-
return /* @__PURE__ */
|
|
2752
|
+
return /* @__PURE__ */ React62.createElement(LineHeightInput, { label: "Line height", defaultValue, onChange: handleChange });
|
|
2692
2753
|
case "letterSpacing":
|
|
2693
|
-
return /* @__PURE__ */
|
|
2754
|
+
return /* @__PURE__ */ React62.createElement(LetterSpacingInput, { label: "Letter spacing", defaultValue, onChange: handleChange });
|
|
2694
2755
|
case "textAlign":
|
|
2695
|
-
return /* @__PURE__ */
|
|
2756
|
+
return /* @__PURE__ */ React62.createElement(TextAlignInput, { label: "Alignment", defaultValue, onChange: handleChange });
|
|
2696
2757
|
case "padding":
|
|
2697
|
-
return /* @__PURE__ */
|
|
2758
|
+
return /* @__PURE__ */ React62.createElement(PaddingInput, { label: "Padding", defaultValue, onChange: handleChange });
|
|
2698
2759
|
}
|
|
2699
2760
|
}
|
|
2700
2761
|
|
|
2701
2762
|
// src/app/inspector-drawer/configuration-panel/input-panels/helpers/style-inputs/multi-style-property-panel.tsx
|
|
2702
2763
|
function MultiStylePropertyPanel({ names, value, onChange }) {
|
|
2703
|
-
return /* @__PURE__ */
|
|
2764
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, names.map((name) => /* @__PURE__ */ React62.createElement(SingleStylePropertyPanel, { key: name, name, value: value || {}, onChange })));
|
|
2704
2765
|
}
|
|
2705
2766
|
|
|
2706
2767
|
// src/app/inspector-drawer/configuration-panel/input-panels/avatar-sidebar-panel.tsx
|
|
@@ -2720,11 +2781,11 @@ function AvatarSidebarPanel({ data, setData }) {
|
|
|
2720
2781
|
const imageUrl = (_d = (_c = data.props) == null ? void 0 : _c.imageUrl) != null ? _d : AvatarPropsDefaults.imageUrl;
|
|
2721
2782
|
const alt = (_f = (_e = data.props) == null ? void 0 : _e.alt) != null ? _f : AvatarPropsDefaults.alt;
|
|
2722
2783
|
const shape = (_h = (_g = data.props) == null ? void 0 : _g.shape) != null ? _h : AvatarPropsDefaults.shape;
|
|
2723
|
-
return /* @__PURE__ */
|
|
2784
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Avatar block" }, /* @__PURE__ */ React62.createElement(
|
|
2724
2785
|
SliderInput,
|
|
2725
2786
|
{
|
|
2726
2787
|
label: "Size",
|
|
2727
|
-
iconLabel: /* @__PURE__ */
|
|
2788
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AspectRatioOutlined, { sx: { color: "text.secondary" } }),
|
|
2728
2789
|
units: "px",
|
|
2729
2790
|
step: 3,
|
|
2730
2791
|
min: 32,
|
|
@@ -2734,7 +2795,7 @@ function AvatarSidebarPanel({ data, setData }) {
|
|
|
2734
2795
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { size: size2 }) }));
|
|
2735
2796
|
}
|
|
2736
2797
|
}
|
|
2737
|
-
), /* @__PURE__ */
|
|
2798
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2738
2799
|
RadioGroupInput,
|
|
2739
2800
|
{
|
|
2740
2801
|
label: "Shape",
|
|
@@ -2743,10 +2804,10 @@ function AvatarSidebarPanel({ data, setData }) {
|
|
|
2743
2804
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { shape: shape2 }) }));
|
|
2744
2805
|
}
|
|
2745
2806
|
},
|
|
2746
|
-
/* @__PURE__ */
|
|
2747
|
-
/* @__PURE__ */
|
|
2748
|
-
/* @__PURE__ */
|
|
2749
|
-
), /* @__PURE__ */
|
|
2807
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "circle" }, "Circle"),
|
|
2808
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "square" }, "Square"),
|
|
2809
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "rounded" }, "Rounded")
|
|
2810
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2750
2811
|
TextInput,
|
|
2751
2812
|
{
|
|
2752
2813
|
label: "Image URL",
|
|
@@ -2755,7 +2816,7 @@ function AvatarSidebarPanel({ data, setData }) {
|
|
|
2755
2816
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { imageUrl: imageUrl2 }) }));
|
|
2756
2817
|
}
|
|
2757
2818
|
}
|
|
2758
|
-
), /* @__PURE__ */
|
|
2819
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2759
2820
|
TextInput,
|
|
2760
2821
|
{
|
|
2761
2822
|
label: "Alt text",
|
|
@@ -2764,7 +2825,7 @@ function AvatarSidebarPanel({ data, setData }) {
|
|
|
2764
2825
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { alt: alt2 }) }));
|
|
2765
2826
|
}
|
|
2766
2827
|
}
|
|
2767
|
-
), /* @__PURE__ */
|
|
2828
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2768
2829
|
MultiStylePropertyPanel,
|
|
2769
2830
|
{
|
|
2770
2831
|
names: ["textAlign", "padding"],
|
|
@@ -2792,65 +2853,65 @@ function ButtonSidebarPanel({ data, setData }) {
|
|
|
2792
2853
|
const buttonStyle = (_j = (_i = data.props) == null ? void 0 : _i.buttonStyle) != null ? _j : ButtonPropsDefaults.buttonStyle;
|
|
2793
2854
|
const buttonTextColor = (_l = (_k = data.props) == null ? void 0 : _k.buttonTextColor) != null ? _l : ButtonPropsDefaults.buttonTextColor;
|
|
2794
2855
|
const buttonBackgroundColor = (_n = (_m = data.props) == null ? void 0 : _m.buttonBackgroundColor) != null ? _n : ButtonPropsDefaults.buttonBackgroundColor;
|
|
2795
|
-
return /* @__PURE__ */
|
|
2856
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Button block" }, /* @__PURE__ */ React62.createElement(
|
|
2796
2857
|
TextInput,
|
|
2797
2858
|
{
|
|
2798
2859
|
label: "Text",
|
|
2799
2860
|
defaultValue: text,
|
|
2800
2861
|
onChange: (text2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { text: text2 }) }))
|
|
2801
2862
|
}
|
|
2802
|
-
), /* @__PURE__ */
|
|
2863
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2803
2864
|
TextInput,
|
|
2804
2865
|
{
|
|
2805
2866
|
label: "Url",
|
|
2806
2867
|
defaultValue: url,
|
|
2807
2868
|
onChange: (url2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { url: url2 }) }))
|
|
2808
2869
|
}
|
|
2809
|
-
), /* @__PURE__ */
|
|
2870
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2810
2871
|
RadioGroupInput,
|
|
2811
2872
|
{
|
|
2812
2873
|
label: "Width",
|
|
2813
2874
|
defaultValue: fullWidth ? "FULL_WIDTH" : "AUTO",
|
|
2814
2875
|
onChange: (v) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { fullWidth: v === "FULL_WIDTH" }) }))
|
|
2815
2876
|
},
|
|
2816
|
-
/* @__PURE__ */
|
|
2817
|
-
/* @__PURE__ */
|
|
2818
|
-
), /* @__PURE__ */
|
|
2877
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "FULL_WIDTH" }, "Full"),
|
|
2878
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "AUTO" }, "Auto")
|
|
2879
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2819
2880
|
RadioGroupInput,
|
|
2820
2881
|
{
|
|
2821
2882
|
label: "Size",
|
|
2822
2883
|
defaultValue: size,
|
|
2823
2884
|
onChange: (size2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { size: size2 }) }))
|
|
2824
2885
|
},
|
|
2825
|
-
/* @__PURE__ */
|
|
2826
|
-
/* @__PURE__ */
|
|
2827
|
-
/* @__PURE__ */
|
|
2828
|
-
/* @__PURE__ */
|
|
2829
|
-
), /* @__PURE__ */
|
|
2886
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "x-small" }, "Xs"),
|
|
2887
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "small" }, "Sm"),
|
|
2888
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "medium" }, "Md"),
|
|
2889
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "large" }, "Lg")
|
|
2890
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2830
2891
|
RadioGroupInput,
|
|
2831
2892
|
{
|
|
2832
2893
|
label: "Style",
|
|
2833
2894
|
defaultValue: buttonStyle,
|
|
2834
2895
|
onChange: (buttonStyle2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { buttonStyle: buttonStyle2 }) }))
|
|
2835
2896
|
},
|
|
2836
|
-
/* @__PURE__ */
|
|
2837
|
-
/* @__PURE__ */
|
|
2838
|
-
/* @__PURE__ */
|
|
2839
|
-
), /* @__PURE__ */
|
|
2897
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "rectangle" }, "Rectangle"),
|
|
2898
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "rounded" }, "Rounded"),
|
|
2899
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "pill" }, "Pill")
|
|
2900
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2840
2901
|
ColorInput2,
|
|
2841
2902
|
{
|
|
2842
2903
|
label: "Text color",
|
|
2843
2904
|
defaultValue: buttonTextColor,
|
|
2844
2905
|
onChange: (buttonTextColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { buttonTextColor: buttonTextColor2 }) }))
|
|
2845
2906
|
}
|
|
2846
|
-
), /* @__PURE__ */
|
|
2907
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2847
2908
|
ColorInput2,
|
|
2848
2909
|
{
|
|
2849
2910
|
label: "Button color",
|
|
2850
2911
|
defaultValue: buttonBackgroundColor,
|
|
2851
2912
|
onChange: (buttonBackgroundColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { buttonBackgroundColor: buttonBackgroundColor2 }) }))
|
|
2852
2913
|
}
|
|
2853
|
-
), /* @__PURE__ */
|
|
2914
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2854
2915
|
MultiStylePropertyPanel,
|
|
2855
2916
|
{
|
|
2856
2917
|
names: [
|
|
@@ -2885,7 +2946,7 @@ function TextDimensionInput({ label, defaultValue, onChange }) {
|
|
|
2885
2946
|
const value = parseInt(ev.target.value);
|
|
2886
2947
|
onChange(isNaN(value) ? null : value);
|
|
2887
2948
|
};
|
|
2888
|
-
return /* @__PURE__ */
|
|
2949
|
+
return /* @__PURE__ */ React62.createElement(
|
|
2889
2950
|
TextField,
|
|
2890
2951
|
{
|
|
2891
2952
|
fullWidth: true,
|
|
@@ -2896,7 +2957,7 @@ function TextDimensionInput({ label, defaultValue, onChange }) {
|
|
|
2896
2957
|
placeholder: "auto",
|
|
2897
2958
|
size: "small",
|
|
2898
2959
|
InputProps: {
|
|
2899
|
-
endAdornment: /* @__PURE__ */
|
|
2960
|
+
endAdornment: /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", color: "text.secondary" }, "px")
|
|
2900
2961
|
}
|
|
2901
2962
|
}
|
|
2902
2963
|
);
|
|
@@ -2918,7 +2979,7 @@ function ColumnWidthsInput({ defaultValue, onChange }) {
|
|
|
2918
2979
|
};
|
|
2919
2980
|
let column3 = null;
|
|
2920
2981
|
{
|
|
2921
|
-
column3 = /* @__PURE__ */
|
|
2982
|
+
column3 = /* @__PURE__ */ React62.createElement(
|
|
2922
2983
|
TextDimensionInput,
|
|
2923
2984
|
{
|
|
2924
2985
|
label: "Column 3",
|
|
@@ -2929,7 +2990,7 @@ function ColumnWidthsInput({ defaultValue, onChange }) {
|
|
|
2929
2990
|
}
|
|
2930
2991
|
);
|
|
2931
2992
|
}
|
|
2932
|
-
return /* @__PURE__ */
|
|
2993
|
+
return /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 1 }, /* @__PURE__ */ React62.createElement(
|
|
2933
2994
|
TextDimensionInput,
|
|
2934
2995
|
{
|
|
2935
2996
|
label: "Column 1",
|
|
@@ -2938,7 +2999,7 @@ function ColumnWidthsInput({ defaultValue, onChange }) {
|
|
|
2938
2999
|
setIndexValue(0, v);
|
|
2939
3000
|
}
|
|
2940
3001
|
}
|
|
2941
|
-
), /* @__PURE__ */
|
|
3002
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2942
3003
|
TextDimensionInput,
|
|
2943
3004
|
{
|
|
2944
3005
|
label: "Column 2",
|
|
@@ -2963,7 +3024,7 @@ function ColumnsContainerPanel({ data, setData }) {
|
|
|
2963
3024
|
setErrors(res.error);
|
|
2964
3025
|
}
|
|
2965
3026
|
};
|
|
2966
|
-
return /* @__PURE__ */
|
|
3027
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Columns block" }, /* @__PURE__ */ React62.createElement(
|
|
2967
3028
|
RadioGroupInput,
|
|
2968
3029
|
{
|
|
2969
3030
|
label: "Number of columns",
|
|
@@ -2972,9 +3033,9 @@ function ColumnsContainerPanel({ data, setData }) {
|
|
|
2972
3033
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { columnsCount: v === "2" ? 2 : 3 }) }));
|
|
2973
3034
|
}
|
|
2974
3035
|
},
|
|
2975
|
-
/* @__PURE__ */
|
|
2976
|
-
/* @__PURE__ */
|
|
2977
|
-
), /* @__PURE__ */
|
|
3036
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "2" }, "2"),
|
|
3037
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "3" }, "3")
|
|
3038
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2978
3039
|
ColumnWidthsInput,
|
|
2979
3040
|
{
|
|
2980
3041
|
defaultValue: (_b = data.props) == null ? void 0 : _b.fixedWidths,
|
|
@@ -2982,11 +3043,11 @@ function ColumnsContainerPanel({ data, setData }) {
|
|
|
2982
3043
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { fixedWidths }) }));
|
|
2983
3044
|
}
|
|
2984
3045
|
}
|
|
2985
|
-
), /* @__PURE__ */
|
|
3046
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2986
3047
|
SliderInput,
|
|
2987
3048
|
{
|
|
2988
3049
|
label: "Columns gap",
|
|
2989
|
-
iconLabel: /* @__PURE__ */
|
|
3050
|
+
iconLabel: /* @__PURE__ */ React62.createElement(SpaceBarOutlined, { sx: { color: "text.secondary" } }),
|
|
2990
3051
|
units: "px",
|
|
2991
3052
|
step: 4,
|
|
2992
3053
|
marks: true,
|
|
@@ -2995,7 +3056,7 @@ function ColumnsContainerPanel({ data, setData }) {
|
|
|
2995
3056
|
defaultValue: (_d = (_c = data.props) == null ? void 0 : _c.columnsGap) != null ? _d : 0,
|
|
2996
3057
|
onChange: (columnsGap) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { columnsGap }) }))
|
|
2997
3058
|
}
|
|
2998
|
-
), /* @__PURE__ */
|
|
3059
|
+
), /* @__PURE__ */ React62.createElement(
|
|
2999
3060
|
RadioGroupInput,
|
|
3000
3061
|
{
|
|
3001
3062
|
label: "Alignment",
|
|
@@ -3004,10 +3065,10 @@ function ColumnsContainerPanel({ data, setData }) {
|
|
|
3004
3065
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { contentAlignment }) }));
|
|
3005
3066
|
}
|
|
3006
3067
|
},
|
|
3007
|
-
/* @__PURE__ */
|
|
3008
|
-
/* @__PURE__ */
|
|
3009
|
-
/* @__PURE__ */
|
|
3010
|
-
), /* @__PURE__ */
|
|
3068
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "top" }, /* @__PURE__ */ React62.createElement(VerticalAlignTopOutlined, { fontSize: "small" })),
|
|
3069
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "middle" }, /* @__PURE__ */ React62.createElement(VerticalAlignCenterOutlined, { fontSize: "small" })),
|
|
3070
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "bottom" }, /* @__PURE__ */ React62.createElement(VerticalAlignBottomOutlined, { fontSize: "small" }))
|
|
3071
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3011
3072
|
MultiStylePropertyPanel,
|
|
3012
3073
|
{
|
|
3013
3074
|
names: ["backgroundColor", "padding"],
|
|
@@ -3036,7 +3097,7 @@ function ContainerSidebarPanel({ data, setData }) {
|
|
|
3036
3097
|
setErrors(res.error);
|
|
3037
3098
|
}
|
|
3038
3099
|
};
|
|
3039
|
-
return /* @__PURE__ */
|
|
3100
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Container block" }, /* @__PURE__ */ React62.createElement(
|
|
3040
3101
|
MultiStylePropertyPanel,
|
|
3041
3102
|
{
|
|
3042
3103
|
names: ["backgroundColor", "borderColor", "borderRadius", "padding"],
|
|
@@ -3059,18 +3120,18 @@ function DividerSidebarPanel({ data, setData }) {
|
|
|
3059
3120
|
};
|
|
3060
3121
|
const lineColor = (_b = (_a = data.props) == null ? void 0 : _a.lineColor) != null ? _b : DividerPropsDefaults.lineColor;
|
|
3061
3122
|
const lineHeight = (_d = (_c = data.props) == null ? void 0 : _c.lineHeight) != null ? _d : DividerPropsDefaults.lineHeight;
|
|
3062
|
-
return /* @__PURE__ */
|
|
3123
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Divider block" }, /* @__PURE__ */ React62.createElement(
|
|
3063
3124
|
ColorInput2,
|
|
3064
3125
|
{
|
|
3065
3126
|
label: "Color",
|
|
3066
3127
|
defaultValue: lineColor,
|
|
3067
3128
|
onChange: (lineColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { lineColor: lineColor2 }) }))
|
|
3068
3129
|
}
|
|
3069
|
-
), /* @__PURE__ */
|
|
3130
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3070
3131
|
SliderInput,
|
|
3071
3132
|
{
|
|
3072
3133
|
label: "Height",
|
|
3073
|
-
iconLabel: /* @__PURE__ */
|
|
3134
|
+
iconLabel: /* @__PURE__ */ React62.createElement(HeightOutlined, { sx: { color: "text.secondary" } }),
|
|
3074
3135
|
units: "px",
|
|
3075
3136
|
step: 1,
|
|
3076
3137
|
min: 1,
|
|
@@ -3078,7 +3139,7 @@ function DividerSidebarPanel({ data, setData }) {
|
|
|
3078
3139
|
defaultValue: lineHeight,
|
|
3079
3140
|
onChange: (lineHeight2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { lineHeight: lineHeight2 }) }))
|
|
3080
3141
|
}
|
|
3081
|
-
), /* @__PURE__ */
|
|
3142
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3082
3143
|
MultiStylePropertyPanel,
|
|
3083
3144
|
{
|
|
3084
3145
|
names: ["backgroundColor", "padding"],
|
|
@@ -3122,11 +3183,11 @@ function BooleanInput({ label, defaultValue, onChange }) {
|
|
|
3122
3183
|
useEffect(() => {
|
|
3123
3184
|
setValue(defaultValue);
|
|
3124
3185
|
}, [defaultValue]);
|
|
3125
|
-
return /* @__PURE__ */
|
|
3186
|
+
return /* @__PURE__ */ React62.createElement(
|
|
3126
3187
|
FormControlLabel,
|
|
3127
3188
|
{
|
|
3128
3189
|
label,
|
|
3129
|
-
control: /* @__PURE__ */
|
|
3190
|
+
control: /* @__PURE__ */ React62.createElement(
|
|
3130
3191
|
Switch,
|
|
3131
3192
|
{
|
|
3132
3193
|
checked: value,
|
|
@@ -3154,38 +3215,38 @@ function EmailLayoutSidebarFields({ data, setData }) {
|
|
|
3154
3215
|
}
|
|
3155
3216
|
};
|
|
3156
3217
|
const backdropDisabled = (_a = data.backdropDisabled) != null ? _a : false;
|
|
3157
|
-
return /* @__PURE__ */
|
|
3218
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Global" }, /* @__PURE__ */ React62.createElement(
|
|
3158
3219
|
BooleanInput,
|
|
3159
3220
|
{
|
|
3160
3221
|
label: "Disable backdrop",
|
|
3161
3222
|
defaultValue: backdropDisabled,
|
|
3162
3223
|
onChange: (backdropDisabled2) => updateData(__spreadProps(__spreadValues({}, data), { backdropDisabled: backdropDisabled2 }))
|
|
3163
3224
|
}
|
|
3164
|
-
), !backdropDisabled && /* @__PURE__ */
|
|
3225
|
+
), !backdropDisabled && /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
3165
3226
|
ColorInput2,
|
|
3166
3227
|
{
|
|
3167
3228
|
label: "Backdrop color",
|
|
3168
3229
|
defaultValue: (_b = data.backdropColor) != null ? _b : "#F5F5F5",
|
|
3169
3230
|
onChange: (backdropColor) => updateData(__spreadProps(__spreadValues({}, data), { backdropColor }))
|
|
3170
3231
|
}
|
|
3171
|
-
), /* @__PURE__ */
|
|
3232
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3172
3233
|
ColorInput2,
|
|
3173
3234
|
{
|
|
3174
3235
|
label: "Canvas color",
|
|
3175
3236
|
defaultValue: (_c = data.canvasColor) != null ? _c : "#FFFFFF",
|
|
3176
3237
|
onChange: (canvasColor) => updateData(__spreadProps(__spreadValues({}, data), { canvasColor }))
|
|
3177
3238
|
}
|
|
3178
|
-
), /* @__PURE__ */
|
|
3239
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3179
3240
|
NullableColorInput,
|
|
3180
3241
|
{
|
|
3181
3242
|
label: "Canvas border color",
|
|
3182
3243
|
defaultValue: (_d = data.borderColor) != null ? _d : null,
|
|
3183
3244
|
onChange: (borderColor) => updateData(__spreadProps(__spreadValues({}, data), { borderColor }))
|
|
3184
3245
|
}
|
|
3185
|
-
), /* @__PURE__ */
|
|
3246
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3186
3247
|
SliderInput,
|
|
3187
3248
|
{
|
|
3188
|
-
iconLabel: /* @__PURE__ */
|
|
3249
|
+
iconLabel: /* @__PURE__ */ React62.createElement(RoundedCornerOutlined, null),
|
|
3189
3250
|
units: "px",
|
|
3190
3251
|
step: 4,
|
|
3191
3252
|
marks: true,
|
|
@@ -3195,14 +3256,14 @@ function EmailLayoutSidebarFields({ data, setData }) {
|
|
|
3195
3256
|
defaultValue: (_e = data.borderRadius) != null ? _e : 0,
|
|
3196
3257
|
onChange: (borderRadius) => updateData(__spreadProps(__spreadValues({}, data), { borderRadius }))
|
|
3197
3258
|
}
|
|
3198
|
-
)), /* @__PURE__ */
|
|
3259
|
+
)), /* @__PURE__ */ React62.createElement(
|
|
3199
3260
|
NullableFontFamily,
|
|
3200
3261
|
{
|
|
3201
3262
|
label: "Font family",
|
|
3202
3263
|
defaultValue: "MODERN_SANS",
|
|
3203
3264
|
onChange: (fontFamily) => updateData(__spreadProps(__spreadValues({}, data), { fontFamily }))
|
|
3204
3265
|
}
|
|
3205
|
-
), /* @__PURE__ */
|
|
3266
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3206
3267
|
ColorInput2,
|
|
3207
3268
|
{
|
|
3208
3269
|
label: "Text color",
|
|
@@ -3223,7 +3284,7 @@ function HeadingSidebarPanel({ data, setData }) {
|
|
|
3223
3284
|
setErrors(res.error);
|
|
3224
3285
|
}
|
|
3225
3286
|
};
|
|
3226
|
-
return /* @__PURE__ */
|
|
3287
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Heading block" }, /* @__PURE__ */ React62.createElement(
|
|
3227
3288
|
TextInput,
|
|
3228
3289
|
{
|
|
3229
3290
|
label: "Content",
|
|
@@ -3233,7 +3294,7 @@ function HeadingSidebarPanel({ data, setData }) {
|
|
|
3233
3294
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { text }) }));
|
|
3234
3295
|
}
|
|
3235
3296
|
}
|
|
3236
|
-
), /* @__PURE__ */
|
|
3297
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3237
3298
|
RadioGroupInput,
|
|
3238
3299
|
{
|
|
3239
3300
|
label: "Level",
|
|
@@ -3242,10 +3303,10 @@ function HeadingSidebarPanel({ data, setData }) {
|
|
|
3242
3303
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { level }) }));
|
|
3243
3304
|
}
|
|
3244
3305
|
},
|
|
3245
|
-
/* @__PURE__ */
|
|
3246
|
-
/* @__PURE__ */
|
|
3247
|
-
/* @__PURE__ */
|
|
3248
|
-
), /* @__PURE__ */
|
|
3306
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "h1" }, "H1"),
|
|
3307
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "h2" }, "H2"),
|
|
3308
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "h3" }, "H3")
|
|
3309
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3249
3310
|
MultiStylePropertyPanel,
|
|
3250
3311
|
{
|
|
3251
3312
|
names: [
|
|
@@ -3275,7 +3336,7 @@ function HtmlSidebarPanel({ data, setData }) {
|
|
|
3275
3336
|
setErrors(res.error);
|
|
3276
3337
|
}
|
|
3277
3338
|
};
|
|
3278
|
-
return /* @__PURE__ */
|
|
3339
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Html block" }, /* @__PURE__ */ React62.createElement(
|
|
3279
3340
|
TextInput,
|
|
3280
3341
|
{
|
|
3281
3342
|
label: "Content",
|
|
@@ -3283,7 +3344,7 @@ function HtmlSidebarPanel({ data, setData }) {
|
|
|
3283
3344
|
defaultValue: (_b = (_a = data.props) == null ? void 0 : _a.contents) != null ? _b : "",
|
|
3284
3345
|
onChange: (contents) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { contents }) }))
|
|
3285
3346
|
}
|
|
3286
|
-
), /* @__PURE__ */
|
|
3347
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3287
3348
|
MultiStylePropertyPanel,
|
|
3288
3349
|
{
|
|
3289
3350
|
names: ["color", "backgroundColor", "fontFamily", "fontSize", "textAlign", "padding"],
|
|
@@ -3340,7 +3401,7 @@ function ImageLibraryDialog({ open, onClose, onPick }) {
|
|
|
3340
3401
|
setBusy(false);
|
|
3341
3402
|
}
|
|
3342
3403
|
});
|
|
3343
|
-
return /* @__PURE__ */
|
|
3404
|
+
return /* @__PURE__ */ React62.createElement(Dialog, { open, onClose, maxWidth: "md", fullWidth: true }, /* @__PURE__ */ React62.createElement(DialogTitle, null, "Image library"), /* @__PURE__ */ React62.createElement(DialogContent, { dividers: true }, /* @__PURE__ */ React62.createElement(
|
|
3344
3405
|
TextField,
|
|
3345
3406
|
{
|
|
3346
3407
|
fullWidth: true,
|
|
@@ -3350,11 +3411,11 @@ function ImageLibraryDialog({ open, onClose, onPick }) {
|
|
|
3350
3411
|
onChange: (e) => setQuery(e.target.value),
|
|
3351
3412
|
autoFocus: true,
|
|
3352
3413
|
InputProps: {
|
|
3353
|
-
startAdornment: /* @__PURE__ */
|
|
3414
|
+
startAdornment: /* @__PURE__ */ React62.createElement(InputAdornment, { position: "start" }, /* @__PURE__ */ React62.createElement(SearchOutlined, { fontSize: "small" }))
|
|
3354
3415
|
},
|
|
3355
3416
|
sx: { mb: 2 }
|
|
3356
3417
|
}
|
|
3357
|
-
), error && /* @__PURE__ */
|
|
3418
|
+
), error && /* @__PURE__ */ React62.createElement(Alert, { severity: "error", sx: { mb: 2 } }, error), busy && !images && /* @__PURE__ */ React62.createElement(Stack, { alignItems: "center", sx: { py: 4 } }, /* @__PURE__ */ React62.createElement(CircularProgress, { size: 28 })), filtered && filtered.length === 0 && /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", sx: { color: "text.secondary", textAlign: "center", py: 4 } }, query ? "No images match your search." : "No images in the library yet."), filtered && filtered.length > 0 && /* @__PURE__ */ React62.createElement(
|
|
3358
3419
|
Box,
|
|
3359
3420
|
{
|
|
3360
3421
|
sx: {
|
|
@@ -3363,7 +3424,7 @@ function ImageLibraryDialog({ open, onClose, onPick }) {
|
|
|
3363
3424
|
gap: 1.5
|
|
3364
3425
|
}
|
|
3365
3426
|
},
|
|
3366
|
-
filtered.map((img) => /* @__PURE__ */
|
|
3427
|
+
filtered.map((img) => /* @__PURE__ */ React62.createElement(
|
|
3367
3428
|
ImageTile,
|
|
3368
3429
|
{
|
|
3369
3430
|
key: img.url,
|
|
@@ -3372,7 +3433,7 @@ function ImageLibraryDialog({ open, onClose, onPick }) {
|
|
|
3372
3433
|
onDelete: deleteImage ? () => handleDelete(img.url) : void 0
|
|
3373
3434
|
}
|
|
3374
3435
|
))
|
|
3375
|
-
)), /* @__PURE__ */
|
|
3436
|
+
)), /* @__PURE__ */ React62.createElement(DialogActions, null, /* @__PURE__ */ React62.createElement(Button$1, { onClick: onClose }, "Close")));
|
|
3376
3437
|
}
|
|
3377
3438
|
function ImageTile({
|
|
3378
3439
|
image,
|
|
@@ -3382,7 +3443,7 @@ function ImageTile({
|
|
|
3382
3443
|
var _a, _b;
|
|
3383
3444
|
const src = (_a = image.thumbnailUrl) != null ? _a : image.url;
|
|
3384
3445
|
const label = image.alt || image.url.split("/").pop() || "image";
|
|
3385
|
-
return /* @__PURE__ */
|
|
3446
|
+
return /* @__PURE__ */ React62.createElement(
|
|
3386
3447
|
Box,
|
|
3387
3448
|
{
|
|
3388
3449
|
sx: {
|
|
@@ -3398,7 +3459,7 @@ function ImageTile({
|
|
|
3398
3459
|
},
|
|
3399
3460
|
onClick: onPick
|
|
3400
3461
|
},
|
|
3401
|
-
/* @__PURE__ */
|
|
3462
|
+
/* @__PURE__ */ React62.createElement(
|
|
3402
3463
|
Box,
|
|
3403
3464
|
{
|
|
3404
3465
|
component: "img",
|
|
@@ -3407,8 +3468,8 @@ function ImageTile({
|
|
|
3407
3468
|
sx: { display: "block", width: "100%", aspectRatio: "1 / 1", objectFit: "cover", backgroundColor: "#f5f5f5" }
|
|
3408
3469
|
}
|
|
3409
3470
|
),
|
|
3410
|
-
/* @__PURE__ */
|
|
3411
|
-
onDelete && /* @__PURE__ */
|
|
3471
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { p: 0.75, fontSize: 11, color: "text.secondary", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" } }, label),
|
|
3472
|
+
onDelete && /* @__PURE__ */ React62.createElement(Tooltip, { title: "Delete from library" }, /* @__PURE__ */ React62.createElement(
|
|
3412
3473
|
IconButton,
|
|
3413
3474
|
{
|
|
3414
3475
|
size: "small",
|
|
@@ -3428,7 +3489,7 @@ function ImageTile({
|
|
|
3428
3489
|
},
|
|
3429
3490
|
"aria-label": "Delete image"
|
|
3430
3491
|
},
|
|
3431
|
-
/* @__PURE__ */
|
|
3492
|
+
/* @__PURE__ */ React62.createElement(DeleteOutline, { fontSize: "small" })
|
|
3432
3493
|
))
|
|
3433
3494
|
);
|
|
3434
3495
|
}
|
|
@@ -3481,13 +3542,13 @@ function ImageSidebarPanel({ data, setData }) {
|
|
|
3481
3542
|
});
|
|
3482
3543
|
const url = (_b = (_a = data.props) == null ? void 0 : _a.url) != null ? _b : "";
|
|
3483
3544
|
const showHttpWarning = isHttpUrl(url);
|
|
3484
|
-
return /* @__PURE__ */
|
|
3545
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Image block" }, (uploadImage || loadImages) && /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 1 }, uploadImage && /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
3485
3546
|
Button$1,
|
|
3486
3547
|
{
|
|
3487
3548
|
fullWidth: true,
|
|
3488
3549
|
variant: "outlined",
|
|
3489
3550
|
size: "small",
|
|
3490
|
-
startIcon: uploading ? /* @__PURE__ */
|
|
3551
|
+
startIcon: uploading ? /* @__PURE__ */ React62.createElement(CircularProgress, { size: 14 }) : /* @__PURE__ */ React62.createElement(CloudUploadOutlined, { fontSize: "small" }),
|
|
3491
3552
|
disabled: uploading,
|
|
3492
3553
|
onClick: () => {
|
|
3493
3554
|
var _a2;
|
|
@@ -3495,7 +3556,7 @@ function ImageSidebarPanel({ data, setData }) {
|
|
|
3495
3556
|
}
|
|
3496
3557
|
},
|
|
3497
3558
|
uploading ? "Uploading\u2026" : "Upload"
|
|
3498
|
-
), /* @__PURE__ */
|
|
3559
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3499
3560
|
"input",
|
|
3500
3561
|
{
|
|
3501
3562
|
ref: fileInputRef,
|
|
@@ -3509,17 +3570,17 @@ function ImageSidebarPanel({ data, setData }) {
|
|
|
3509
3570
|
if (file) yield handleFile(file);
|
|
3510
3571
|
})
|
|
3511
3572
|
}
|
|
3512
|
-
)), loadImages && /* @__PURE__ */
|
|
3573
|
+
)), loadImages && /* @__PURE__ */ React62.createElement(
|
|
3513
3574
|
Button$1,
|
|
3514
3575
|
{
|
|
3515
3576
|
fullWidth: true,
|
|
3516
3577
|
variant: "outlined",
|
|
3517
3578
|
size: "small",
|
|
3518
|
-
startIcon: /* @__PURE__ */
|
|
3579
|
+
startIcon: /* @__PURE__ */ React62.createElement(CollectionsOutlined, { fontSize: "small" }),
|
|
3519
3580
|
onClick: () => setLibraryOpen(true)
|
|
3520
3581
|
},
|
|
3521
3582
|
"Library"
|
|
3522
|
-
)), uploadError && /* @__PURE__ */
|
|
3583
|
+
)), uploadError && /* @__PURE__ */ React62.createElement(Alert, { severity: "error", onClose: () => setUploadError(null), sx: { mt: 1 } }, uploadError), /* @__PURE__ */ React62.createElement(
|
|
3523
3584
|
TextInput,
|
|
3524
3585
|
{
|
|
3525
3586
|
label: "Source URL",
|
|
@@ -3529,14 +3590,14 @@ function ImageSidebarPanel({ data, setData }) {
|
|
|
3529
3590
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { url: next }) }));
|
|
3530
3591
|
}
|
|
3531
3592
|
}
|
|
3532
|
-
), showHttpWarning && /* @__PURE__ */
|
|
3593
|
+
), showHttpWarning && /* @__PURE__ */ React62.createElement(Box, { sx: { mt: -1, mb: 1, display: "flex", alignItems: "flex-start", gap: 0.75 } }, /* @__PURE__ */ React62.createElement(ErrorOutlineOutlined, { fontSize: "small", sx: { color: "warning.main", mt: "2px" } }), /* @__PURE__ */ React62.createElement(Box, { sx: { fontSize: 12, color: "warning.dark" } }, "Non-HTTPS URL: Gmail and other clients strip mixed content. Use https:// for reliable delivery.")), /* @__PURE__ */ React62.createElement(
|
|
3533
3594
|
TextInput,
|
|
3534
3595
|
{
|
|
3535
3596
|
label: "Alt text",
|
|
3536
3597
|
defaultValue: (_d = (_c = data.props) == null ? void 0 : _c.alt) != null ? _d : "",
|
|
3537
3598
|
onChange: (alt) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { alt }) }))
|
|
3538
3599
|
}
|
|
3539
|
-
), /* @__PURE__ */
|
|
3600
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3540
3601
|
TextInput,
|
|
3541
3602
|
{
|
|
3542
3603
|
label: "Click through URL",
|
|
@@ -3546,38 +3607,38 @@ function ImageSidebarPanel({ data, setData }) {
|
|
|
3546
3607
|
updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { linkHref }) }));
|
|
3547
3608
|
}
|
|
3548
3609
|
}
|
|
3549
|
-
), /* @__PURE__ */
|
|
3610
|
+
), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 2 }, /* @__PURE__ */ React62.createElement(
|
|
3550
3611
|
TextDimensionInput,
|
|
3551
3612
|
{
|
|
3552
3613
|
label: "Width",
|
|
3553
3614
|
defaultValue: (_g = data.props) == null ? void 0 : _g.width,
|
|
3554
3615
|
onChange: (width) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { width }) }))
|
|
3555
3616
|
}
|
|
3556
|
-
), /* @__PURE__ */
|
|
3617
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3557
3618
|
TextDimensionInput,
|
|
3558
3619
|
{
|
|
3559
3620
|
label: "Height",
|
|
3560
3621
|
defaultValue: (_h = data.props) == null ? void 0 : _h.height,
|
|
3561
3622
|
onChange: (height) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { height }) }))
|
|
3562
3623
|
}
|
|
3563
|
-
)), /* @__PURE__ */
|
|
3624
|
+
)), /* @__PURE__ */ React62.createElement(
|
|
3564
3625
|
RadioGroupInput,
|
|
3565
3626
|
{
|
|
3566
3627
|
label: "Alignment",
|
|
3567
3628
|
defaultValue: (_j = (_i = data.props) == null ? void 0 : _i.contentAlignment) != null ? _j : "middle",
|
|
3568
3629
|
onChange: (contentAlignment) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { contentAlignment }) }))
|
|
3569
3630
|
},
|
|
3570
|
-
/* @__PURE__ */
|
|
3571
|
-
/* @__PURE__ */
|
|
3572
|
-
/* @__PURE__ */
|
|
3573
|
-
), /* @__PURE__ */
|
|
3631
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "top" }, /* @__PURE__ */ React62.createElement(VerticalAlignTopOutlined, { fontSize: "small" })),
|
|
3632
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "middle" }, /* @__PURE__ */ React62.createElement(VerticalAlignCenterOutlined, { fontSize: "small" })),
|
|
3633
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "bottom" }, /* @__PURE__ */ React62.createElement(VerticalAlignBottomOutlined, { fontSize: "small" }))
|
|
3634
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3574
3635
|
MultiStylePropertyPanel,
|
|
3575
3636
|
{
|
|
3576
3637
|
names: ["backgroundColor", "textAlign", "padding"],
|
|
3577
3638
|
value: data.style,
|
|
3578
3639
|
onChange: (style) => updateData(__spreadProps(__spreadValues({}, data), { style }))
|
|
3579
3640
|
}
|
|
3580
|
-
), loadImages && /* @__PURE__ */
|
|
3641
|
+
), loadImages && /* @__PURE__ */ React62.createElement(
|
|
3581
3642
|
ImageLibraryDialog,
|
|
3582
3643
|
{
|
|
3583
3644
|
open: libraryOpen,
|
|
@@ -3616,74 +3677,74 @@ function SignatureSidebarPanel({ data, setData }) {
|
|
|
3616
3677
|
const nameColor = (_z = (_y = data.props) == null ? void 0 : _y.nameColor) != null ? _z : SignaturePropsDefaults.nameColor;
|
|
3617
3678
|
const textColor = (_B = (_A = data.props) == null ? void 0 : _A.textColor) != null ? _B : SignaturePropsDefaults.textColor;
|
|
3618
3679
|
const linkColor = (_D = (_C = data.props) == null ? void 0 : _C.linkColor) != null ? _D : SignaturePropsDefaults.linkColor;
|
|
3619
|
-
return /* @__PURE__ */
|
|
3680
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Signature block" }, /* @__PURE__ */ React62.createElement(
|
|
3620
3681
|
TextInput,
|
|
3621
3682
|
{
|
|
3622
3683
|
label: "Greeting",
|
|
3623
3684
|
defaultValue: greeting,
|
|
3624
3685
|
onChange: (greeting2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { greeting: greeting2 }) }))
|
|
3625
3686
|
}
|
|
3626
|
-
), /* @__PURE__ */
|
|
3687
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3627
3688
|
TextInput,
|
|
3628
3689
|
{
|
|
3629
3690
|
label: "Name",
|
|
3630
3691
|
defaultValue: name,
|
|
3631
3692
|
onChange: (name2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { name: name2 }) }))
|
|
3632
3693
|
}
|
|
3633
|
-
), /* @__PURE__ */
|
|
3694
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3634
3695
|
TextInput,
|
|
3635
3696
|
{
|
|
3636
3697
|
label: "Title",
|
|
3637
3698
|
defaultValue: title,
|
|
3638
3699
|
onChange: (title2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { title: title2 }) }))
|
|
3639
3700
|
}
|
|
3640
|
-
), /* @__PURE__ */
|
|
3701
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3641
3702
|
TextInput,
|
|
3642
3703
|
{
|
|
3643
3704
|
label: "Company",
|
|
3644
3705
|
defaultValue: company,
|
|
3645
3706
|
onChange: (company2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { company: company2 }) }))
|
|
3646
3707
|
}
|
|
3647
|
-
), /* @__PURE__ */
|
|
3708
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3648
3709
|
TextInput,
|
|
3649
3710
|
{
|
|
3650
3711
|
label: "Address",
|
|
3651
3712
|
defaultValue: address,
|
|
3652
3713
|
onChange: (address2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { address: address2 }) }))
|
|
3653
3714
|
}
|
|
3654
|
-
), /* @__PURE__ */
|
|
3715
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3655
3716
|
TextInput,
|
|
3656
3717
|
{
|
|
3657
3718
|
label: "Email",
|
|
3658
3719
|
defaultValue: email,
|
|
3659
3720
|
onChange: (email2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { email: email2 }) }))
|
|
3660
3721
|
}
|
|
3661
|
-
), /* @__PURE__ */
|
|
3722
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3662
3723
|
TextInput,
|
|
3663
3724
|
{
|
|
3664
3725
|
label: "Phone",
|
|
3665
3726
|
defaultValue: phone,
|
|
3666
3727
|
onChange: (phone2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { phone: phone2 }) }))
|
|
3667
3728
|
}
|
|
3668
|
-
), /* @__PURE__ */
|
|
3729
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3669
3730
|
TextInput,
|
|
3670
3731
|
{
|
|
3671
3732
|
label: "Website",
|
|
3672
3733
|
defaultValue: website,
|
|
3673
3734
|
onChange: (website2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { website: website2 }) }))
|
|
3674
3735
|
}
|
|
3675
|
-
), /* @__PURE__ */
|
|
3736
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3676
3737
|
TextInput,
|
|
3677
3738
|
{
|
|
3678
3739
|
label: "Image URL",
|
|
3679
3740
|
defaultValue: imageUrl,
|
|
3680
3741
|
onChange: (imageUrl2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { imageUrl: imageUrl2 }) }))
|
|
3681
3742
|
}
|
|
3682
|
-
), /* @__PURE__ */
|
|
3743
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3683
3744
|
SliderInput,
|
|
3684
3745
|
{
|
|
3685
3746
|
label: "Image size",
|
|
3686
|
-
iconLabel: /* @__PURE__ */
|
|
3747
|
+
iconLabel: /* @__PURE__ */ React62.createElement(AspectRatioOutlined, { sx: { color: "text.secondary" } }),
|
|
3687
3748
|
units: "px",
|
|
3688
3749
|
step: 4,
|
|
3689
3750
|
min: 32,
|
|
@@ -3691,47 +3752,47 @@ function SignatureSidebarPanel({ data, setData }) {
|
|
|
3691
3752
|
defaultValue: imageSize,
|
|
3692
3753
|
onChange: (imageSize2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { imageSize: imageSize2 }) }))
|
|
3693
3754
|
}
|
|
3694
|
-
), /* @__PURE__ */
|
|
3755
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3695
3756
|
RadioGroupInput,
|
|
3696
3757
|
{
|
|
3697
3758
|
label: "Image shape",
|
|
3698
3759
|
defaultValue: imageShape,
|
|
3699
3760
|
onChange: (imageShape2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { imageShape: imageShape2 }) }))
|
|
3700
3761
|
},
|
|
3701
|
-
/* @__PURE__ */
|
|
3702
|
-
/* @__PURE__ */
|
|
3703
|
-
/* @__PURE__ */
|
|
3704
|
-
), /* @__PURE__ */
|
|
3762
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "circle" }, "Circle"),
|
|
3763
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "square" }, "Square"),
|
|
3764
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "rounded" }, "Rounded")
|
|
3765
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3705
3766
|
RadioGroupInput,
|
|
3706
3767
|
{
|
|
3707
3768
|
label: "Layout",
|
|
3708
3769
|
defaultValue: layout,
|
|
3709
3770
|
onChange: (layout2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { layout: layout2 }) }))
|
|
3710
3771
|
},
|
|
3711
|
-
/* @__PURE__ */
|
|
3712
|
-
/* @__PURE__ */
|
|
3713
|
-
), /* @__PURE__ */
|
|
3772
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "horizontal" }, "Horizontal"),
|
|
3773
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "vertical" }, "Vertical")
|
|
3774
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3714
3775
|
ColorInput2,
|
|
3715
3776
|
{
|
|
3716
3777
|
label: "Name color",
|
|
3717
3778
|
defaultValue: nameColor,
|
|
3718
3779
|
onChange: (nameColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { nameColor: nameColor2 }) }))
|
|
3719
3780
|
}
|
|
3720
|
-
), /* @__PURE__ */
|
|
3781
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3721
3782
|
ColorInput2,
|
|
3722
3783
|
{
|
|
3723
3784
|
label: "Text color",
|
|
3724
3785
|
defaultValue: textColor,
|
|
3725
3786
|
onChange: (textColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { textColor: textColor2 }) }))
|
|
3726
3787
|
}
|
|
3727
|
-
), /* @__PURE__ */
|
|
3788
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3728
3789
|
ColorInput2,
|
|
3729
3790
|
{
|
|
3730
3791
|
label: "Link color",
|
|
3731
3792
|
defaultValue: linkColor,
|
|
3732
3793
|
onChange: (linkColor2) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { linkColor: linkColor2 }) }))
|
|
3733
3794
|
}
|
|
3734
|
-
), /* @__PURE__ */
|
|
3795
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3735
3796
|
MultiStylePropertyPanel,
|
|
3736
3797
|
{
|
|
3737
3798
|
names: ["backgroundColor", "fontFamily", "padding"],
|
|
@@ -3752,11 +3813,11 @@ function SpacerSidebarPanel({ data, setData }) {
|
|
|
3752
3813
|
setErrors(res.error);
|
|
3753
3814
|
}
|
|
3754
3815
|
};
|
|
3755
|
-
return /* @__PURE__ */
|
|
3816
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Spacer block" }, /* @__PURE__ */ React62.createElement(
|
|
3756
3817
|
SliderInput,
|
|
3757
3818
|
{
|
|
3758
3819
|
label: "Height",
|
|
3759
|
-
iconLabel: /* @__PURE__ */
|
|
3820
|
+
iconLabel: /* @__PURE__ */ React62.createElement(HeightOutlined, { sx: { color: "text.secondary" } }),
|
|
3760
3821
|
units: "px",
|
|
3761
3822
|
step: 4,
|
|
3762
3823
|
min: 4,
|
|
@@ -3778,7 +3839,7 @@ function TextSidebarPanel({ data, setData }) {
|
|
|
3778
3839
|
setErrors(res.error);
|
|
3779
3840
|
}
|
|
3780
3841
|
};
|
|
3781
|
-
return /* @__PURE__ */
|
|
3842
|
+
return /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Text block" }, /* @__PURE__ */ React62.createElement(
|
|
3782
3843
|
TextInput,
|
|
3783
3844
|
{
|
|
3784
3845
|
label: "Content",
|
|
@@ -3786,14 +3847,14 @@ function TextSidebarPanel({ data, setData }) {
|
|
|
3786
3847
|
defaultValue: (_b = (_a = data.props) == null ? void 0 : _a.text) != null ? _b : "",
|
|
3787
3848
|
onChange: (text) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { text }) }))
|
|
3788
3849
|
}
|
|
3789
|
-
), /* @__PURE__ */
|
|
3850
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3790
3851
|
BooleanInput,
|
|
3791
3852
|
{
|
|
3792
3853
|
label: "Markdown",
|
|
3793
3854
|
defaultValue: (_d = (_c = data.props) == null ? void 0 : _c.markdown) != null ? _d : false,
|
|
3794
3855
|
onChange: (markdown) => updateData(__spreadProps(__spreadValues({}, data), { props: __spreadProps(__spreadValues({}, data.props), { markdown }) }))
|
|
3795
3856
|
}
|
|
3796
|
-
), /* @__PURE__ */
|
|
3857
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3797
3858
|
MultiStylePropertyPanel,
|
|
3798
3859
|
{
|
|
3799
3860
|
names: [
|
|
@@ -3815,7 +3876,7 @@ function TextSidebarPanel({ data, setData }) {
|
|
|
3815
3876
|
|
|
3816
3877
|
// src/app/inspector-drawer/configuration-panel/index.tsx
|
|
3817
3878
|
function renderMessage(val) {
|
|
3818
|
-
return /* @__PURE__ */
|
|
3879
|
+
return /* @__PURE__ */ React62.createElement(Box, { sx: { m: 3, p: 1, border: "1px dashed", borderColor: "divider" } }, /* @__PURE__ */ React62.createElement(Typography, { color: "text.secondary" }, val));
|
|
3819
3880
|
}
|
|
3820
3881
|
function ConfigurationPanel() {
|
|
3821
3882
|
const document2 = useDocument();
|
|
@@ -3831,55 +3892,55 @@ function ConfigurationPanel() {
|
|
|
3831
3892
|
const { data, type } = block;
|
|
3832
3893
|
switch (type) {
|
|
3833
3894
|
case "Avatar":
|
|
3834
|
-
return /* @__PURE__ */
|
|
3895
|
+
return /* @__PURE__ */ React62.createElement(AvatarSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3835
3896
|
case "Button":
|
|
3836
|
-
return /* @__PURE__ */
|
|
3897
|
+
return /* @__PURE__ */ React62.createElement(ButtonSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3837
3898
|
case "ColumnsContainer":
|
|
3838
|
-
return /* @__PURE__ */
|
|
3899
|
+
return /* @__PURE__ */ React62.createElement(ColumnsContainerPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3839
3900
|
case "Container":
|
|
3840
|
-
return /* @__PURE__ */
|
|
3901
|
+
return /* @__PURE__ */ React62.createElement(ContainerSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3841
3902
|
case "Divider":
|
|
3842
|
-
return /* @__PURE__ */
|
|
3903
|
+
return /* @__PURE__ */ React62.createElement(DividerSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3843
3904
|
case "Heading":
|
|
3844
|
-
return /* @__PURE__ */
|
|
3905
|
+
return /* @__PURE__ */ React62.createElement(HeadingSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3845
3906
|
case "Html":
|
|
3846
|
-
return /* @__PURE__ */
|
|
3907
|
+
return /* @__PURE__ */ React62.createElement(HtmlSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3847
3908
|
case "Image":
|
|
3848
|
-
return /* @__PURE__ */
|
|
3909
|
+
return /* @__PURE__ */ React62.createElement(ImageSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3849
3910
|
case "EmailLayout":
|
|
3850
|
-
return /* @__PURE__ */
|
|
3911
|
+
return /* @__PURE__ */ React62.createElement(EmailLayoutSidebarFields, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3851
3912
|
case "Spacer":
|
|
3852
|
-
return /* @__PURE__ */
|
|
3913
|
+
return /* @__PURE__ */ React62.createElement(SpacerSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3853
3914
|
case "Signature":
|
|
3854
|
-
return /* @__PURE__ */
|
|
3915
|
+
return /* @__PURE__ */ React62.createElement(SignatureSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3855
3916
|
case "Text":
|
|
3856
|
-
return /* @__PURE__ */
|
|
3917
|
+
return /* @__PURE__ */ React62.createElement(TextSidebarPanel, { key: selectedBlockId, data, setData: (data2) => setBlock({ type, data: data2 }) });
|
|
3857
3918
|
default:
|
|
3858
|
-
return /* @__PURE__ */
|
|
3919
|
+
return /* @__PURE__ */ React62.createElement("pre", null, JSON.stringify(block, null, " "));
|
|
3859
3920
|
}
|
|
3860
3921
|
}
|
|
3861
3922
|
function StylesPanel() {
|
|
3862
3923
|
const block = useDocument().root;
|
|
3863
3924
|
if (!block) {
|
|
3864
|
-
return /* @__PURE__ */
|
|
3925
|
+
return /* @__PURE__ */ React62.createElement("p", null, "Block not found");
|
|
3865
3926
|
}
|
|
3866
3927
|
const { data, type } = block;
|
|
3867
3928
|
if (type !== "EmailLayout") {
|
|
3868
3929
|
throw new Error('Expected "root" element to be of type EmailLayout');
|
|
3869
3930
|
}
|
|
3870
|
-
return /* @__PURE__ */
|
|
3931
|
+
return /* @__PURE__ */ React62.createElement(EmailLayoutSidebarFields, { key: "root", data, setData: (data2) => setDocument({ root: { type, data: data2 } }) });
|
|
3871
3932
|
}
|
|
3872
3933
|
function TemplateDownloadButton() {
|
|
3873
3934
|
const doc = useDocument();
|
|
3874
3935
|
const href = useMemo(() => {
|
|
3875
3936
|
return `data:text/plain,${encodeURIComponent(JSON.stringify(doc, null, " "))}`;
|
|
3876
3937
|
}, [doc]);
|
|
3877
|
-
return /* @__PURE__ */
|
|
3938
|
+
return /* @__PURE__ */ React62.createElement(
|
|
3878
3939
|
Button$1,
|
|
3879
3940
|
{
|
|
3880
3941
|
variant: "outlined",
|
|
3881
3942
|
color: "primary",
|
|
3882
|
-
startIcon: /* @__PURE__ */
|
|
3943
|
+
startIcon: /* @__PURE__ */ React62.createElement(FileDownloadOutlined, null),
|
|
3883
3944
|
href,
|
|
3884
3945
|
download: "emailTemplate.json",
|
|
3885
3946
|
fullWidth: true
|
|
@@ -3893,6 +3954,7 @@ function TemplatePanel({ deleteTemplate, copyTemplate }) {
|
|
|
3893
3954
|
const { currentTemplateId, currentTemplateName } = useEmailEditor();
|
|
3894
3955
|
const document2 = useDocument();
|
|
3895
3956
|
const persistenceEnabled = usePersistenceEnabled();
|
|
3957
|
+
const workspaceBackground = useWorkspaceBackground();
|
|
3896
3958
|
const handleDelete = () => {
|
|
3897
3959
|
if (!currentTemplateId || !window.confirm("Are you sure you want to delete this template?")) {
|
|
3898
3960
|
return;
|
|
@@ -3910,10 +3972,21 @@ function TemplatePanel({ deleteTemplate, copyTemplate }) {
|
|
|
3910
3972
|
window.alert("Template copied successfully!");
|
|
3911
3973
|
}
|
|
3912
3974
|
};
|
|
3975
|
+
const workspaceToggle = /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Editor appearance" }, /* @__PURE__ */ React62.createElement(Stack, { spacing: 1 }, /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.secondary" } }, "Workspace background"), /* @__PURE__ */ React62.createElement(
|
|
3976
|
+
ToggleButtonGroup,
|
|
3977
|
+
{
|
|
3978
|
+
value: workspaceBackground,
|
|
3979
|
+
exclusive: true,
|
|
3980
|
+
size: "small",
|
|
3981
|
+
onChange: (_, v) => v && setWorkspaceBackground(v)
|
|
3982
|
+
},
|
|
3983
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "checkerboard", sx: { textTransform: "none", gap: 0.75 } }, /* @__PURE__ */ React62.createElement(GridOnOutlined, { fontSize: "small" }), "Checkerboard"),
|
|
3984
|
+
/* @__PURE__ */ React62.createElement(ToggleButton, { value: "solid", sx: { textTransform: "none", gap: 0.75 } }, /* @__PURE__ */ React62.createElement(SquareOutlined, { fontSize: "small" }), "Solid")
|
|
3985
|
+
), /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.disabled" } }, "Editor-only \u2014 never reaches the rendered email.")));
|
|
3913
3986
|
if (!currentTemplateId) {
|
|
3914
|
-
return /* @__PURE__ */
|
|
3987
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Template" }, "No template selected"), workspaceToggle);
|
|
3915
3988
|
}
|
|
3916
|
-
return /* @__PURE__ */
|
|
3989
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Template" }, /* @__PURE__ */ React62.createElement(Stack, { spacing: 2 }, !persistenceEnabled && /* @__PURE__ */ React62.createElement(
|
|
3917
3990
|
Typography,
|
|
3918
3991
|
{
|
|
3919
3992
|
variant: "body2",
|
|
@@ -3926,29 +3999,29 @@ function TemplatePanel({ deleteTemplate, copyTemplate }) {
|
|
|
3926
3999
|
}
|
|
3927
4000
|
},
|
|
3928
4001
|
"Save functionality is disabled. To enable saving, provide the necessary callback functions."
|
|
3929
|
-
), persistenceEnabled && /* @__PURE__ */
|
|
4002
|
+
), persistenceEnabled && /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
3930
4003
|
Button$1,
|
|
3931
4004
|
{
|
|
3932
4005
|
variant: "outlined",
|
|
3933
4006
|
color: "primary",
|
|
3934
|
-
startIcon: /* @__PURE__ */
|
|
4007
|
+
startIcon: /* @__PURE__ */ React62.createElement(ContentCopyOutlined, null),
|
|
3935
4008
|
onClick: handleCopyToSamples,
|
|
3936
4009
|
fullWidth: true,
|
|
3937
4010
|
disabled: !copyTemplate
|
|
3938
4011
|
},
|
|
3939
4012
|
"Save as Sample Template"
|
|
3940
|
-
), /* @__PURE__ */
|
|
4013
|
+
), /* @__PURE__ */ React62.createElement(
|
|
3941
4014
|
Button$1,
|
|
3942
4015
|
{
|
|
3943
4016
|
variant: "outlined",
|
|
3944
4017
|
color: "error",
|
|
3945
|
-
startIcon: /* @__PURE__ */
|
|
4018
|
+
startIcon: /* @__PURE__ */ React62.createElement(DeleteOutlined, null),
|
|
3946
4019
|
onClick: handleDelete,
|
|
3947
4020
|
fullWidth: true,
|
|
3948
4021
|
disabled: !deleteTemplate
|
|
3949
4022
|
},
|
|
3950
4023
|
"Delete Template"
|
|
3951
|
-
)))), persistenceEnabled && /* @__PURE__ */
|
|
4024
|
+
)))), persistenceEnabled && /* @__PURE__ */ React62.createElement(BaseSidebarPanel, { title: "Export" }, /* @__PURE__ */ React62.createElement(Stack, { spacing: 2 }, /* @__PURE__ */ React62.createElement(TemplateDownloadButton, null))), workspaceToggle);
|
|
3952
4025
|
}
|
|
3953
4026
|
|
|
3954
4027
|
// src/app/variables/variable-utils.ts
|
|
@@ -4122,7 +4195,7 @@ function VariablesPanel() {
|
|
|
4122
4195
|
const lastFocused = useLastFocusedEditable();
|
|
4123
4196
|
const root = document2.root;
|
|
4124
4197
|
if (!root || root.type !== "EmailLayout") {
|
|
4125
|
-
return /* @__PURE__ */
|
|
4198
|
+
return /* @__PURE__ */ React62.createElement(Box, { p: 2 }, /* @__PURE__ */ React62.createElement(Alert, { severity: "info" }, "Open a template to manage variables."));
|
|
4126
4199
|
}
|
|
4127
4200
|
const data = root.data;
|
|
4128
4201
|
const variables = ((_a = data.variables) != null ? _a : []).map((v) => {
|
|
@@ -4217,7 +4290,7 @@ function VariablesPanel() {
|
|
|
4217
4290
|
} catch (e) {
|
|
4218
4291
|
}
|
|
4219
4292
|
});
|
|
4220
|
-
return /* @__PURE__ */
|
|
4293
|
+
return /* @__PURE__ */ React62.createElement(Box, { p: 2 }, /* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "center", justifyContent: "space-between", sx: { mb: 1 } }, /* @__PURE__ */ React62.createElement(Typography, { variant: "subtitle1", sx: { fontWeight: 600 } }, "Variables"), /* @__PURE__ */ React62.createElement(Tooltip, { title: "Add variable" }, /* @__PURE__ */ React62.createElement(IconButton, { size: "small", onClick: add, "aria-label": "Add variable" }, /* @__PURE__ */ React62.createElement(AddOutlined, { fontSize: "small" })))), /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.secondary", display: "block", mb: 2 } }, "Declared variables travel with the template. Reference them in subject and body as", " ", /* @__PURE__ */ React62.createElement(Box, { component: "code", sx: { fontFamily: "monospace" } }, "{{name}}"), ". In Preview mode, tokens render with the sample values below."), undeclared.length > 0 && /* @__PURE__ */ React62.createElement(Alert, { severity: "warning", sx: { mb: 2 } }, /* @__PURE__ */ React62.createElement(AlertTitle, { sx: { fontSize: 13 } }, "Undeclared in body"), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.5, useFlexGap: true, flexWrap: "wrap" }, undeclared.map((name) => /* @__PURE__ */ React62.createElement(
|
|
4221
4294
|
Chip,
|
|
4222
4295
|
{
|
|
4223
4296
|
key: name,
|
|
@@ -4225,12 +4298,12 @@ function VariablesPanel() {
|
|
|
4225
4298
|
label: name,
|
|
4226
4299
|
onClick: () => addFromToken(name),
|
|
4227
4300
|
onDelete: () => addFromToken(name),
|
|
4228
|
-
deleteIcon: /* @__PURE__ */
|
|
4301
|
+
deleteIcon: /* @__PURE__ */ React62.createElement(AddOutlined, null),
|
|
4229
4302
|
sx: { fontFamily: "monospace" }
|
|
4230
4303
|
}
|
|
4231
|
-
))), /* @__PURE__ */
|
|
4304
|
+
))), /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.secondary", display: "block", mt: 0.5 } }, "Click a token to declare it.")), variables.length === 0 ? /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", sx: { color: "text.secondary" } }, "No variables declared. Click + to add one.") : /* @__PURE__ */ React62.createElement(Stack, { spacing: 2 }, variables.map((v, i) => {
|
|
4232
4305
|
var _a2;
|
|
4233
|
-
return /* @__PURE__ */
|
|
4306
|
+
return /* @__PURE__ */ React62.createElement(
|
|
4234
4307
|
VariableRow,
|
|
4235
4308
|
{
|
|
4236
4309
|
key: i,
|
|
@@ -4281,7 +4354,7 @@ function VariableRow({
|
|
|
4281
4354
|
onCommitRename(draftName.trim());
|
|
4282
4355
|
}
|
|
4283
4356
|
};
|
|
4284
|
-
return /* @__PURE__ */
|
|
4357
|
+
return /* @__PURE__ */ React62.createElement(Stack, { spacing: 0.75, sx: { pb: 1, borderBottom: 1, borderColor: "divider" } }, /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 1, alignItems: "flex-start" }, /* @__PURE__ */ React62.createElement(
|
|
4285
4358
|
TextField,
|
|
4286
4359
|
{
|
|
4287
4360
|
label: "Name",
|
|
@@ -4306,7 +4379,7 @@ function VariableRow({
|
|
|
4306
4379
|
error: Boolean(nameError),
|
|
4307
4380
|
helperText: nameError != null ? nameError : " "
|
|
4308
4381
|
}
|
|
4309
|
-
), /* @__PURE__ */
|
|
4382
|
+
), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.25, sx: { mt: 0.5 } }, /* @__PURE__ */ React62.createElement(Tooltip, { title: "Copy {{name}}" }, /* @__PURE__ */ React62.createElement("span", null, /* @__PURE__ */ React62.createElement(
|
|
4310
4383
|
IconButton,
|
|
4311
4384
|
{
|
|
4312
4385
|
size: "small",
|
|
@@ -4314,8 +4387,8 @@ function VariableRow({
|
|
|
4314
4387
|
disabled: !hasName,
|
|
4315
4388
|
"aria-label": `Copy ${variable.name || "variable"} token`
|
|
4316
4389
|
},
|
|
4317
|
-
/* @__PURE__ */
|
|
4318
|
-
))), /* @__PURE__ */
|
|
4390
|
+
/* @__PURE__ */ React62.createElement(ContentCopyOutlined, { fontSize: "small" })
|
|
4391
|
+
))), /* @__PURE__ */ React62.createElement(Tooltip, { title: canInsert ? "Insert at cursor" : "Focus a text field first" }, /* @__PURE__ */ React62.createElement("span", null, /* @__PURE__ */ React62.createElement(
|
|
4319
4392
|
IconButton,
|
|
4320
4393
|
{
|
|
4321
4394
|
size: "small",
|
|
@@ -4323,16 +4396,16 @@ function VariableRow({
|
|
|
4323
4396
|
disabled: !hasName || !canInsert,
|
|
4324
4397
|
"aria-label": `Insert ${variable.name || "variable"} at cursor`
|
|
4325
4398
|
},
|
|
4326
|
-
/* @__PURE__ */
|
|
4327
|
-
))), /* @__PURE__ */
|
|
4399
|
+
/* @__PURE__ */ React62.createElement(InputOutlined, { fontSize: "small" })
|
|
4400
|
+
))), /* @__PURE__ */ React62.createElement(Tooltip, { title: "Remove" }, /* @__PURE__ */ React62.createElement(
|
|
4328
4401
|
IconButton,
|
|
4329
4402
|
{
|
|
4330
4403
|
size: "small",
|
|
4331
4404
|
onClick: onRemove,
|
|
4332
4405
|
"aria-label": `Remove ${variable.name || "variable"}`
|
|
4333
4406
|
},
|
|
4334
|
-
/* @__PURE__ */
|
|
4335
|
-
)))), /* @__PURE__ */
|
|
4407
|
+
/* @__PURE__ */ React62.createElement(DeleteOutline, { fontSize: "small" })
|
|
4408
|
+
)))), /* @__PURE__ */ React62.createElement(
|
|
4336
4409
|
TextField,
|
|
4337
4410
|
{
|
|
4338
4411
|
label: "Description",
|
|
@@ -4342,7 +4415,7 @@ function VariableRow({
|
|
|
4342
4415
|
onChange: (e) => onChangeDescription(e.target.value),
|
|
4343
4416
|
placeholder: "Optional"
|
|
4344
4417
|
}
|
|
4345
|
-
), /* @__PURE__ */
|
|
4418
|
+
), /* @__PURE__ */ React62.createElement(
|
|
4346
4419
|
TextField,
|
|
4347
4420
|
{
|
|
4348
4421
|
label: "Sample value",
|
|
@@ -4352,7 +4425,7 @@ function VariableRow({
|
|
|
4352
4425
|
onChange: (e) => onChangeSampleValue(e.target.value),
|
|
4353
4426
|
placeholder: "Shown in Preview mode",
|
|
4354
4427
|
InputProps: {
|
|
4355
|
-
startAdornment: /* @__PURE__ */
|
|
4428
|
+
startAdornment: /* @__PURE__ */ React62.createElement(
|
|
4356
4429
|
DataObjectOutlined,
|
|
4357
4430
|
{
|
|
4358
4431
|
fontSize: "small",
|
|
@@ -4361,7 +4434,7 @@ function VariableRow({
|
|
|
4361
4434
|
)
|
|
4362
4435
|
}
|
|
4363
4436
|
}
|
|
4364
|
-
), /* @__PURE__ */
|
|
4437
|
+
), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.5, sx: { pt: 0.25 } }, hasName && (unused ? /* @__PURE__ */ React62.createElement(Chip, { size: "small", color: "warning", variant: "outlined", label: "Unused in body" }) : /* @__PURE__ */ React62.createElement(
|
|
4365
4438
|
Chip,
|
|
4366
4439
|
{
|
|
4367
4440
|
size: "small",
|
|
@@ -4385,13 +4458,13 @@ function InspectorDrawer({
|
|
|
4385
4458
|
const renderCurrentSidebarPanel = () => {
|
|
4386
4459
|
switch (selectedSidebarTab) {
|
|
4387
4460
|
case "block-configuration":
|
|
4388
|
-
return /* @__PURE__ */
|
|
4461
|
+
return /* @__PURE__ */ React62.createElement(ConfigurationPanel, null);
|
|
4389
4462
|
case "styles":
|
|
4390
|
-
return /* @__PURE__ */
|
|
4463
|
+
return /* @__PURE__ */ React62.createElement(StylesPanel, null);
|
|
4391
4464
|
case "variables":
|
|
4392
|
-
return /* @__PURE__ */
|
|
4465
|
+
return /* @__PURE__ */ React62.createElement(VariablesPanel, null);
|
|
4393
4466
|
case "template-settings":
|
|
4394
|
-
return /* @__PURE__ */
|
|
4467
|
+
return /* @__PURE__ */ React62.createElement(
|
|
4395
4468
|
TemplatePanel,
|
|
4396
4469
|
{
|
|
4397
4470
|
deleteTemplate,
|
|
@@ -4400,7 +4473,7 @@ function InspectorDrawer({
|
|
|
4400
4473
|
);
|
|
4401
4474
|
}
|
|
4402
4475
|
};
|
|
4403
|
-
return /* @__PURE__ */
|
|
4476
|
+
return /* @__PURE__ */ React62.createElement(
|
|
4404
4477
|
Drawer,
|
|
4405
4478
|
{
|
|
4406
4479
|
variant: "persistent",
|
|
@@ -4422,7 +4495,7 @@ function InspectorDrawer({
|
|
|
4422
4495
|
width: inspectorDrawerOpen ? INSPECTOR_DRAWER_WIDTH : 0
|
|
4423
4496
|
}
|
|
4424
4497
|
},
|
|
4425
|
-
/* @__PURE__ */
|
|
4498
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { width: INSPECTOR_DRAWER_WIDTH, height: 49, borderBottom: 1, borderColor: "divider" } }, /* @__PURE__ */ React62.createElement(Box, { px: 1 }, /* @__PURE__ */ React62.createElement(
|
|
4426
4499
|
Tabs,
|
|
4427
4500
|
{
|
|
4428
4501
|
value: selectedSidebarTab,
|
|
@@ -4430,12 +4503,12 @@ function InspectorDrawer({
|
|
|
4430
4503
|
variant: "fullWidth",
|
|
4431
4504
|
sx: { "& .MuiTab-root": { minWidth: 0, px: 1, fontSize: 13 } }
|
|
4432
4505
|
},
|
|
4433
|
-
/* @__PURE__ */
|
|
4434
|
-
/* @__PURE__ */
|
|
4435
|
-
/* @__PURE__ */
|
|
4436
|
-
/* @__PURE__ */
|
|
4506
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "styles", label: "Styles" }),
|
|
4507
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "block-configuration", label: "Inspect" }),
|
|
4508
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "variables", label: "Variables" }),
|
|
4509
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "template-settings", label: "Settings" })
|
|
4437
4510
|
))),
|
|
4438
|
-
/* @__PURE__ */
|
|
4511
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { width: INSPECTOR_DRAWER_WIDTH, height: "calc(100% - 49px)", overflow: "auto" } }, renderCurrentSidebarPanel())
|
|
4439
4512
|
);
|
|
4440
4513
|
}
|
|
4441
4514
|
var SnackbarContext = createContext(null);
|
|
@@ -4456,7 +4529,7 @@ function SnackbarProvider({ children }) {
|
|
|
4456
4529
|
const handleClose = () => {
|
|
4457
4530
|
setMessage(null);
|
|
4458
4531
|
};
|
|
4459
|
-
return /* @__PURE__ */
|
|
4532
|
+
return /* @__PURE__ */ React62.createElement(SnackbarContext.Provider, { value: { showMessage } }, children, /* @__PURE__ */ React62.createElement(
|
|
4460
4533
|
Snackbar,
|
|
4461
4534
|
{
|
|
4462
4535
|
anchorOrigin: { vertical: "top", horizontal: "center" },
|
|
@@ -4504,6 +4577,16 @@ function TemplateRow({
|
|
|
4504
4577
|
}) {
|
|
4505
4578
|
const { setCurrentTemplate } = useEmailEditor();
|
|
4506
4579
|
const [hover, setHover] = useState(false);
|
|
4580
|
+
const [menuAnchor, setMenuAnchor] = useState(null);
|
|
4581
|
+
const closeMenu = () => setMenuAnchor(null);
|
|
4582
|
+
const openMenu = (e) => {
|
|
4583
|
+
e.stopPropagation();
|
|
4584
|
+
setMenuAnchor(e.currentTarget);
|
|
4585
|
+
};
|
|
4586
|
+
const runAction = (fn) => () => {
|
|
4587
|
+
closeMenu();
|
|
4588
|
+
fn == null ? void 0 : fn();
|
|
4589
|
+
};
|
|
4507
4590
|
const handleClick = () => __async(null, null, function* () {
|
|
4508
4591
|
try {
|
|
4509
4592
|
const content = yield templateLoader();
|
|
@@ -4522,7 +4605,7 @@ function TemplateRow({
|
|
|
4522
4605
|
const hasActions = Boolean(
|
|
4523
4606
|
onDuplicate || onRename || onDelete || onPromote || onDemote || onDuplicateAsTemplate
|
|
4524
4607
|
);
|
|
4525
|
-
return /* @__PURE__ */
|
|
4608
|
+
return /* @__PURE__ */ React62.createElement(
|
|
4526
4609
|
Box,
|
|
4527
4610
|
{
|
|
4528
4611
|
role: "button",
|
|
@@ -4548,7 +4631,7 @@ function TemplateRow({
|
|
|
4548
4631
|
"&:focus-visible": { outline: "2px solid", outlineColor: "primary.main" }
|
|
4549
4632
|
}
|
|
4550
4633
|
},
|
|
4551
|
-
/* @__PURE__ */
|
|
4634
|
+
/* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "flex-start", spacing: 1 }, /* @__PURE__ */ React62.createElement(Box, { sx: { flexGrow: 1, minWidth: 0, pr: hasActions ? 3 : 0 } }, /* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "baseline", spacing: 1, sx: { minWidth: 0 } }, /* @__PURE__ */ React62.createElement(
|
|
4552
4635
|
Typography,
|
|
4553
4636
|
{
|
|
4554
4637
|
variant: "body2",
|
|
@@ -4562,14 +4645,14 @@ function TemplateRow({
|
|
|
4562
4645
|
title: template.slug
|
|
4563
4646
|
},
|
|
4564
4647
|
template.slug
|
|
4565
|
-
), updated && /* @__PURE__ */
|
|
4648
|
+
), updated && !hasActions && /* @__PURE__ */ React62.createElement(
|
|
4566
4649
|
Typography,
|
|
4567
4650
|
{
|
|
4568
4651
|
variant: "caption",
|
|
4569
4652
|
sx: { color: "text.secondary", flexShrink: 0, fontSize: "0.7rem" }
|
|
4570
4653
|
},
|
|
4571
4654
|
updated
|
|
4572
|
-
)), template.description && /* @__PURE__ */
|
|
4655
|
+
)), template.description && /* @__PURE__ */ React62.createElement(
|
|
4573
4656
|
Typography,
|
|
4574
4657
|
{
|
|
4575
4658
|
variant: "caption",
|
|
@@ -4583,7 +4666,7 @@ function TemplateRow({
|
|
|
4583
4666
|
}
|
|
4584
4667
|
},
|
|
4585
4668
|
template.description
|
|
4586
|
-
), template.tags && template.tags.length > 0 && /* @__PURE__ */
|
|
4669
|
+
), template.tags && template.tags.length > 0 && /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.5, sx: { mt: 0.5, flexWrap: "wrap", gap: 0.5 } }, template.tags.map((tag) => /* @__PURE__ */ React62.createElement(
|
|
4587
4670
|
Chip,
|
|
4588
4671
|
{
|
|
4589
4672
|
key: tag,
|
|
@@ -4592,164 +4675,807 @@ function TemplateRow({
|
|
|
4592
4675
|
sx: { height: 18, fontSize: "0.65rem", "& .MuiChip-label": { px: 0.75 } }
|
|
4593
4676
|
}
|
|
4594
4677
|
))))),
|
|
4595
|
-
hasActions &&
|
|
4596
|
-
|
|
4678
|
+
hasActions && /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(Tooltip, { title: "More" }, /* @__PURE__ */ React62.createElement(
|
|
4679
|
+
IconButton,
|
|
4597
4680
|
{
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4681
|
+
size: "small",
|
|
4682
|
+
onClick: openMenu,
|
|
4683
|
+
"aria-label": "Row actions",
|
|
4684
|
+
"aria-haspopup": "menu",
|
|
4685
|
+
"aria-expanded": Boolean(menuAnchor) || void 0,
|
|
4601
4686
|
sx: {
|
|
4602
4687
|
position: "absolute",
|
|
4603
4688
|
top: 4,
|
|
4604
4689
|
right: 4,
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
boxShadow: 1,
|
|
4608
|
-
p: 0.25
|
|
4690
|
+
opacity: hover || isCurrent || Boolean(menuAnchor) ? 1 : 0.45,
|
|
4691
|
+
transition: "opacity 120ms"
|
|
4609
4692
|
}
|
|
4610
4693
|
},
|
|
4611
|
-
|
|
4612
|
-
|
|
4613
|
-
|
|
4614
|
-
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
4619
|
-
},
|
|
4620
|
-
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
},
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4694
|
+
/* @__PURE__ */ React62.createElement(MoreVertOutlined, { fontSize: "small" })
|
|
4695
|
+
)), /* @__PURE__ */ React62.createElement(
|
|
4696
|
+
Menu,
|
|
4697
|
+
{
|
|
4698
|
+
anchorEl: menuAnchor,
|
|
4699
|
+
open: Boolean(menuAnchor),
|
|
4700
|
+
onClose: closeMenu,
|
|
4701
|
+
onClick: stop,
|
|
4702
|
+
anchorOrigin: { vertical: "bottom", horizontal: "right" },
|
|
4703
|
+
transformOrigin: { vertical: "top", horizontal: "right" },
|
|
4704
|
+
slotProps: { paper: { sx: { minWidth: 200 } } }
|
|
4705
|
+
},
|
|
4706
|
+
onRename && /* @__PURE__ */ React62.createElement(MenuItem, { onClick: runAction(onRename) }, /* @__PURE__ */ React62.createElement(ListItemIcon, null, /* @__PURE__ */ React62.createElement(DriveFileRenameOutlineOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Edit name & tags\u2026")),
|
|
4707
|
+
onDuplicate && /* @__PURE__ */ React62.createElement(MenuItem, { onClick: runAction(onDuplicate) }, /* @__PURE__ */ React62.createElement(ListItemIcon, null, /* @__PURE__ */ React62.createElement(ContentCopyOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Duplicate")),
|
|
4708
|
+
onDuplicateAsTemplate && /* @__PURE__ */ React62.createElement(MenuItem, { onClick: runAction(onDuplicateAsTemplate) }, /* @__PURE__ */ React62.createElement(ListItemIcon, null, /* @__PURE__ */ React62.createElement(LibraryAddOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Duplicate as template")),
|
|
4709
|
+
onPromote && /* @__PURE__ */ React62.createElement(MenuItem, { onClick: runAction(onPromote) }, /* @__PURE__ */ React62.createElement(ListItemIcon, null, /* @__PURE__ */ React62.createElement(FileUploadOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Promote to sample")),
|
|
4710
|
+
onDemote && /* @__PURE__ */ React62.createElement(MenuItem, { onClick: runAction(onDemote) }, /* @__PURE__ */ React62.createElement(ListItemIcon, null, /* @__PURE__ */ React62.createElement(FileDownloadOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Demote to template")),
|
|
4711
|
+
onDelete && [
|
|
4712
|
+
/* @__PURE__ */ React62.createElement(Divider$1, { key: "divider" }),
|
|
4713
|
+
/* @__PURE__ */ React62.createElement(MenuItem, { key: "delete", onClick: runAction(onDelete), sx: { color: "error.main" } }, /* @__PURE__ */ React62.createElement(ListItemIcon, { sx: { color: "error.main" } }, /* @__PURE__ */ React62.createElement(DeleteOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(ListItemText, null, "Delete"))
|
|
4714
|
+
]
|
|
4715
|
+
))
|
|
4716
|
+
);
|
|
4717
|
+
}
|
|
4718
|
+
|
|
4719
|
+
// src/editor/blocks/helpers/move-block.ts
|
|
4720
|
+
function sameParent(a, b) {
|
|
4721
|
+
if (a.kind !== b.kind || a.parentId !== b.parentId) return false;
|
|
4722
|
+
if (a.kind === "ColumnsContainer" && b.kind === "ColumnsContainer") {
|
|
4723
|
+
return a.columnIndex === b.columnIndex;
|
|
4724
|
+
}
|
|
4725
|
+
return true;
|
|
4726
|
+
}
|
|
4727
|
+
function getChildrenIds(doc, ref) {
|
|
4728
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
4729
|
+
const block = doc[ref.parentId];
|
|
4730
|
+
if (!block) return [];
|
|
4731
|
+
if (ref.kind === "EmailLayout") return (_b = (_a = block.data) == null ? void 0 : _a.childrenIds) != null ? _b : [];
|
|
4732
|
+
if (ref.kind === "Container") return (_e = (_d = (_c = block.data) == null ? void 0 : _c.props) == null ? void 0 : _d.childrenIds) != null ? _e : [];
|
|
4733
|
+
const col = (_h = (_g = (_f = block.data) == null ? void 0 : _f.props) == null ? void 0 : _g.columns) == null ? void 0 : _h[ref.columnIndex];
|
|
4734
|
+
return (_i = col == null ? void 0 : col.childrenIds) != null ? _i : [];
|
|
4735
|
+
}
|
|
4736
|
+
function patchChildrenIds(block, ref, newIds) {
|
|
4737
|
+
var _a, _b, _c;
|
|
4738
|
+
if (ref.kind === "EmailLayout") {
|
|
4739
|
+
return __spreadProps(__spreadValues({}, block), { data: __spreadProps(__spreadValues({}, block.data), { childrenIds: newIds }) });
|
|
4740
|
+
}
|
|
4741
|
+
if (ref.kind === "Container") {
|
|
4742
|
+
return __spreadProps(__spreadValues({}, block), {
|
|
4743
|
+
data: __spreadProps(__spreadValues({}, block.data), { props: __spreadProps(__spreadValues({}, block.data.props), { childrenIds: newIds }) })
|
|
4744
|
+
});
|
|
4745
|
+
}
|
|
4746
|
+
const columns = ((_c = (_b = (_a = block.data) == null ? void 0 : _a.props) == null ? void 0 : _b.columns) != null ? _c : []).map(
|
|
4747
|
+
(c, i) => i === ref.columnIndex ? __spreadProps(__spreadValues({}, c), { childrenIds: newIds }) : c
|
|
4748
|
+
);
|
|
4749
|
+
return __spreadProps(__spreadValues({}, block), { data: __spreadProps(__spreadValues({}, block.data), { props: __spreadProps(__spreadValues({}, block.data.props), { columns }) }) });
|
|
4750
|
+
}
|
|
4751
|
+
function isDescendant(doc, ancestorId, candidateId) {
|
|
4752
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
4753
|
+
if (ancestorId === candidateId) return true;
|
|
4754
|
+
const block = doc[ancestorId];
|
|
4755
|
+
if (!block) return false;
|
|
4756
|
+
const direct = [];
|
|
4757
|
+
if (block.type === "EmailLayout") direct.push(...(_b = (_a = block.data) == null ? void 0 : _a.childrenIds) != null ? _b : []);
|
|
4758
|
+
if (block.type === "Container") direct.push(...(_e = (_d = (_c = block.data) == null ? void 0 : _c.props) == null ? void 0 : _d.childrenIds) != null ? _e : []);
|
|
4759
|
+
if (block.type === "ColumnsContainer") {
|
|
4760
|
+
for (const col of (_h = (_g = (_f = block.data) == null ? void 0 : _f.props) == null ? void 0 : _g.columns) != null ? _h : []) {
|
|
4761
|
+
direct.push(...(_i = col.childrenIds) != null ? _i : []);
|
|
4762
|
+
}
|
|
4763
|
+
}
|
|
4764
|
+
for (const childId of direct) {
|
|
4765
|
+
if (isDescendant(doc, childId, candidateId)) return true;
|
|
4766
|
+
}
|
|
4767
|
+
return false;
|
|
4768
|
+
}
|
|
4769
|
+
function buildMovePatch(doc, sourceId, sourceParent, targetParent, targetIndex) {
|
|
4770
|
+
var _a, _b, _c;
|
|
4771
|
+
if (isDescendant(doc, sourceId, targetParent.parentId)) return null;
|
|
4772
|
+
const srcIds = getChildrenIds(doc, sourceParent);
|
|
4773
|
+
const sourceIndex = srcIds.indexOf(sourceId);
|
|
4774
|
+
if (sourceIndex < 0) return null;
|
|
4775
|
+
if (sameParent(sourceParent, targetParent)) {
|
|
4776
|
+
const arr = [...srcIds];
|
|
4777
|
+
arr.splice(sourceIndex, 1);
|
|
4778
|
+
let insertAt2 = targetIndex;
|
|
4779
|
+
if (insertAt2 > sourceIndex) insertAt2 -= 1;
|
|
4780
|
+
if (insertAt2 < 0) insertAt2 = 0;
|
|
4781
|
+
if (insertAt2 > arr.length) insertAt2 = arr.length;
|
|
4782
|
+
arr.splice(insertAt2, 0, sourceId);
|
|
4783
|
+
if (arr.every((id, i) => id === srcIds[i])) return null;
|
|
4784
|
+
const sourceBlock2 = doc[sourceParent.parentId];
|
|
4785
|
+
return {
|
|
4786
|
+
[sourceParent.parentId]: patchChildrenIds(sourceBlock2, sourceParent, arr)
|
|
4787
|
+
};
|
|
4788
|
+
}
|
|
4789
|
+
const newSrcIds = [...srcIds];
|
|
4790
|
+
newSrcIds.splice(sourceIndex, 1);
|
|
4791
|
+
const tgtIds = getChildrenIds(doc, targetParent);
|
|
4792
|
+
const newTgtIds = [...tgtIds];
|
|
4793
|
+
let insertAt = targetIndex;
|
|
4794
|
+
if (insertAt < 0) insertAt = 0;
|
|
4795
|
+
if (insertAt > newTgtIds.length) insertAt = newTgtIds.length;
|
|
4796
|
+
newTgtIds.splice(insertAt, 0, sourceId);
|
|
4797
|
+
if (sourceParent.parentId === targetParent.parentId) {
|
|
4798
|
+
const block = doc[sourceParent.parentId];
|
|
4799
|
+
const columns = ((_c = (_b = (_a = block.data) == null ? void 0 : _a.props) == null ? void 0 : _b.columns) != null ? _c : []).map((c, i) => {
|
|
4800
|
+
if (sourceParent.kind === "ColumnsContainer" && i === sourceParent.columnIndex) {
|
|
4801
|
+
return __spreadProps(__spreadValues({}, c), { childrenIds: newSrcIds });
|
|
4802
|
+
}
|
|
4803
|
+
if (targetParent.kind === "ColumnsContainer" && i === targetParent.columnIndex) {
|
|
4804
|
+
return __spreadProps(__spreadValues({}, c), { childrenIds: newTgtIds });
|
|
4805
|
+
}
|
|
4806
|
+
return c;
|
|
4807
|
+
});
|
|
4808
|
+
return {
|
|
4809
|
+
[sourceParent.parentId]: __spreadProps(__spreadValues({}, block), {
|
|
4810
|
+
data: __spreadProps(__spreadValues({}, block.data), { props: __spreadProps(__spreadValues({}, block.data.props), { columns }) })
|
|
4811
|
+
})
|
|
4812
|
+
};
|
|
4813
|
+
}
|
|
4814
|
+
const sourceBlock = doc[sourceParent.parentId];
|
|
4815
|
+
const targetBlock = doc[targetParent.parentId];
|
|
4816
|
+
return {
|
|
4817
|
+
[sourceParent.parentId]: patchChildrenIds(sourceBlock, sourceParent, newSrcIds),
|
|
4818
|
+
[targetParent.parentId]: patchChildrenIds(targetBlock, targetParent, newTgtIds)
|
|
4819
|
+
};
|
|
4820
|
+
}
|
|
4821
|
+
|
|
4822
|
+
// src/app/templates-drawer/outline-panel.tsx
|
|
4823
|
+
var ROOT_BLOCK_ID2 = "root";
|
|
4824
|
+
var PREVIEW_MAX = 36;
|
|
4825
|
+
function iconForType(type) {
|
|
4826
|
+
switch (type) {
|
|
4827
|
+
case "EmailLayout":
|
|
4828
|
+
return /* @__PURE__ */ React62.createElement(DashboardOutlined, { fontSize: "small" });
|
|
4829
|
+
case "Heading":
|
|
4830
|
+
return /* @__PURE__ */ React62.createElement(HMobiledataOutlined, { fontSize: "small" });
|
|
4831
|
+
case "Text":
|
|
4832
|
+
return /* @__PURE__ */ React62.createElement(NotesOutlined, { fontSize: "small" });
|
|
4833
|
+
case "Button":
|
|
4834
|
+
return /* @__PURE__ */ React62.createElement(SmartButtonOutlined, { fontSize: "small" });
|
|
4835
|
+
case "Image":
|
|
4836
|
+
return /* @__PURE__ */ React62.createElement(ImageOutlined, { fontSize: "small" });
|
|
4837
|
+
case "Avatar":
|
|
4838
|
+
return /* @__PURE__ */ React62.createElement(AccountCircleOutlined, { fontSize: "small" });
|
|
4839
|
+
case "Signature":
|
|
4840
|
+
return /* @__PURE__ */ React62.createElement(ContactMailOutlined, { fontSize: "small" });
|
|
4841
|
+
case "Divider":
|
|
4842
|
+
return /* @__PURE__ */ React62.createElement(HorizontalRuleOutlined, { fontSize: "small" });
|
|
4843
|
+
case "Spacer":
|
|
4844
|
+
return /* @__PURE__ */ React62.createElement(Crop32Outlined, { fontSize: "small" });
|
|
4845
|
+
case "Html":
|
|
4846
|
+
return /* @__PURE__ */ React62.createElement(HtmlOutlined, { fontSize: "small" });
|
|
4847
|
+
case "Container":
|
|
4848
|
+
return /* @__PURE__ */ React62.createElement(LibraryAddOutlined, { fontSize: "small" });
|
|
4849
|
+
case "ColumnsContainer":
|
|
4850
|
+
return /* @__PURE__ */ React62.createElement(ViewColumnOutlined, { fontSize: "small" });
|
|
4851
|
+
default:
|
|
4852
|
+
return /* @__PURE__ */ React62.createElement(BusinessOutlined, { fontSize: "small" });
|
|
4853
|
+
}
|
|
4854
|
+
}
|
|
4855
|
+
function previewText(text) {
|
|
4856
|
+
if (!text) return void 0;
|
|
4857
|
+
const trimmed = text.trim().replace(/\s+/g, " ");
|
|
4858
|
+
if (!trimmed) return void 0;
|
|
4859
|
+
return trimmed.length > PREVIEW_MAX ? trimmed.slice(0, PREVIEW_MAX - 1) + "\u2026" : trimmed;
|
|
4860
|
+
}
|
|
4861
|
+
function buildNode(id, doc, ctx) {
|
|
4862
|
+
var _a, _b, _c, _d, _e, _f;
|
|
4863
|
+
const block = doc[id];
|
|
4864
|
+
if (!block) return null;
|
|
4865
|
+
const type = block.type;
|
|
4866
|
+
const data = (_a = block.data) != null ? _a : {};
|
|
4867
|
+
const props = (_b = data.props) != null ? _b : {};
|
|
4868
|
+
const baseMeta = ctx ? { parent: ctx.parent, indexInParent: ctx.indexInParent, siblingsCount: ctx.siblingsCount } : {};
|
|
4869
|
+
switch (type) {
|
|
4870
|
+
case "EmailLayout": {
|
|
4871
|
+
const ids = (_c = data.childrenIds) != null ? _c : [];
|
|
4872
|
+
const parentForChildren = { kind: "EmailLayout", parentId: "root" };
|
|
4873
|
+
const children = ids.map(
|
|
4874
|
+
(childId, i) => buildNode(childId, doc, {
|
|
4875
|
+
parent: parentForChildren,
|
|
4876
|
+
indexInParent: i,
|
|
4877
|
+
siblingsCount: ids.length
|
|
4878
|
+
})
|
|
4879
|
+
).filter((n) => n !== null);
|
|
4880
|
+
return {
|
|
4881
|
+
id,
|
|
4882
|
+
label: "Canvas",
|
|
4883
|
+
icon: iconForType("EmailLayout"),
|
|
4884
|
+
children,
|
|
4885
|
+
containerChildrenRef: parentForChildren
|
|
4886
|
+
};
|
|
4887
|
+
}
|
|
4888
|
+
case "Container": {
|
|
4889
|
+
const ids = (_d = props.childrenIds) != null ? _d : [];
|
|
4890
|
+
const parentForChildren = { kind: "Container", parentId: id };
|
|
4891
|
+
const children = ids.map(
|
|
4892
|
+
(childId, i) => buildNode(childId, doc, {
|
|
4893
|
+
parent: parentForChildren,
|
|
4894
|
+
indexInParent: i,
|
|
4895
|
+
siblingsCount: ids.length
|
|
4896
|
+
})
|
|
4897
|
+
).filter((n) => n !== null);
|
|
4898
|
+
const count = children.length;
|
|
4899
|
+
return __spreadValues({
|
|
4900
|
+
id,
|
|
4901
|
+
label: "Container",
|
|
4902
|
+
preview: count === 1 ? "1 child" : `${count} children`,
|
|
4903
|
+
icon: iconForType("Container"),
|
|
4904
|
+
children,
|
|
4905
|
+
containerChildrenRef: parentForChildren
|
|
4906
|
+
}, baseMeta);
|
|
4907
|
+
}
|
|
4908
|
+
case "ColumnsContainer": {
|
|
4909
|
+
const columns = (_e = props.columns) != null ? _e : [];
|
|
4910
|
+
const children = [];
|
|
4911
|
+
columns.forEach((col, colIdx) => {
|
|
4912
|
+
var _a2;
|
|
4913
|
+
const colIds = (_a2 = col.childrenIds) != null ? _a2 : [];
|
|
4914
|
+
const parentForCol = {
|
|
4915
|
+
kind: "ColumnsContainer",
|
|
4916
|
+
parentId: id,
|
|
4917
|
+
columnIndex: colIdx
|
|
4918
|
+
};
|
|
4919
|
+
const colChildren = colIds.map(
|
|
4920
|
+
(childId, i) => buildNode(childId, doc, {
|
|
4921
|
+
parent: parentForCol,
|
|
4922
|
+
indexInParent: i,
|
|
4923
|
+
siblingsCount: colIds.length
|
|
4924
|
+
})
|
|
4925
|
+
).filter((n) => n !== null);
|
|
4926
|
+
children.push({
|
|
4927
|
+
id: `${id}::col${colIdx}`,
|
|
4928
|
+
label: `Column ${colIdx + 1}`,
|
|
4929
|
+
preview: colChildren.length === 1 ? "1 child" : `${colChildren.length} children`,
|
|
4930
|
+
icon: /* @__PURE__ */ React62.createElement(ViewColumnSharp, { fontSize: "small", sx: { opacity: 0.6 } }),
|
|
4931
|
+
children: colChildren,
|
|
4932
|
+
containerChildrenRef: parentForCol
|
|
4933
|
+
});
|
|
4934
|
+
});
|
|
4935
|
+
return __spreadValues({
|
|
4936
|
+
id,
|
|
4937
|
+
label: "Columns",
|
|
4938
|
+
preview: `${columns.length} columns`,
|
|
4939
|
+
icon: iconForType("ColumnsContainer"),
|
|
4940
|
+
children
|
|
4941
|
+
}, baseMeta);
|
|
4942
|
+
}
|
|
4943
|
+
case "Text":
|
|
4944
|
+
case "Heading":
|
|
4945
|
+
case "Button":
|
|
4946
|
+
return __spreadValues({ id, label: type, preview: previewText(props.text), icon: iconForType(type) }, baseMeta);
|
|
4947
|
+
case "Html":
|
|
4948
|
+
return __spreadValues({ id, label: "Html", preview: previewText(props.contents), icon: iconForType("Html") }, baseMeta);
|
|
4949
|
+
case "Image":
|
|
4950
|
+
return __spreadValues({
|
|
4951
|
+
id,
|
|
4952
|
+
label: "Image",
|
|
4953
|
+
preview: (_f = previewText(props.alt)) != null ? _f : previewText(props.url),
|
|
4954
|
+
icon: iconForType("Image")
|
|
4955
|
+
}, baseMeta);
|
|
4956
|
+
case "Avatar":
|
|
4957
|
+
return __spreadValues({ id, label: "Avatar", preview: previewText(props.imageUrl), icon: iconForType("Avatar") }, baseMeta);
|
|
4958
|
+
case "Divider":
|
|
4959
|
+
return __spreadValues({ id, label: "Divider", icon: iconForType("Divider") }, baseMeta);
|
|
4960
|
+
case "Spacer":
|
|
4961
|
+
return __spreadValues({
|
|
4962
|
+
id,
|
|
4963
|
+
label: "Spacer",
|
|
4964
|
+
preview: props.height ? `${props.height}px` : void 0,
|
|
4965
|
+
icon: iconForType("Spacer")
|
|
4966
|
+
}, baseMeta);
|
|
4967
|
+
case "Signature":
|
|
4968
|
+
return __spreadValues({ id, label: "Signature", preview: previewText(props.name), icon: iconForType("Signature") }, baseMeta);
|
|
4969
|
+
default:
|
|
4970
|
+
return __spreadValues({ id, label: type, icon: iconForType(type) }, baseMeta);
|
|
4971
|
+
}
|
|
4972
|
+
}
|
|
4973
|
+
var DRAG_MIME = "application/x-email-editor-block";
|
|
4974
|
+
function OutlinePanel() {
|
|
4975
|
+
const document2 = useDocument();
|
|
4976
|
+
const selectedBlockId = useSelectedBlockId();
|
|
4977
|
+
const [dragging, setDragging] = useState(null);
|
|
4978
|
+
const tree = buildNode(ROOT_BLOCK_ID2, document2);
|
|
4979
|
+
const performMove = (payload, targetParent, targetIndex) => {
|
|
4980
|
+
const patch = buildMovePatch(
|
|
4981
|
+
document2,
|
|
4982
|
+
payload.sourceId,
|
|
4983
|
+
payload.sourceParent,
|
|
4984
|
+
targetParent,
|
|
4985
|
+
targetIndex
|
|
4986
|
+
);
|
|
4987
|
+
if (patch) {
|
|
4988
|
+
setDocument(patch);
|
|
4989
|
+
setSelectedBlockId(payload.sourceId);
|
|
4990
|
+
}
|
|
4991
|
+
};
|
|
4992
|
+
return /* @__PURE__ */ React62.createElement(Box, null, /* @__PURE__ */ React62.createElement(Typography, { variant: "subtitle2", component: "h2", sx: { fontWeight: "bold", mb: 0.5, px: 0.5 } }, "Outline"), /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { display: "block", color: "text.secondary", px: 0.5, mb: 1 } }, "Click a row to select. Drag a row to reorder or move it into a container."), tree ? /* @__PURE__ */ React62.createElement(
|
|
4993
|
+
OutlineRow,
|
|
4994
|
+
{
|
|
4995
|
+
node: tree,
|
|
4996
|
+
depth: 0,
|
|
4997
|
+
selectedBlockId,
|
|
4998
|
+
document: document2,
|
|
4999
|
+
dragging,
|
|
5000
|
+
setDragging,
|
|
5001
|
+
performMove
|
|
5002
|
+
}
|
|
5003
|
+
) : /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", sx: { color: "text.secondary", px: 0.5 } }, "Nothing to outline."));
|
|
5004
|
+
}
|
|
5005
|
+
function OutlineRow({
|
|
5006
|
+
node,
|
|
5007
|
+
depth,
|
|
5008
|
+
selectedBlockId,
|
|
5009
|
+
document: document2,
|
|
5010
|
+
dragging,
|
|
5011
|
+
setDragging,
|
|
5012
|
+
performMove
|
|
5013
|
+
}) {
|
|
5014
|
+
const [expanded, setExpanded] = useState(true);
|
|
5015
|
+
const [dropPos, setDropPos] = useState(null);
|
|
5016
|
+
const hasChildren = Boolean(node.children && node.children.length > 0);
|
|
5017
|
+
const isSelectable = !node.id.includes("::");
|
|
5018
|
+
const isSelected = isSelectable && selectedBlockId === node.id;
|
|
5019
|
+
const canMove = isSelectable && node.parent !== void 0 && node.indexInParent !== void 0 && node.siblingsCount !== void 0;
|
|
5020
|
+
const canMoveUp = canMove && node.indexInParent > 0;
|
|
5021
|
+
const canMoveDown = canMove && node.indexInParent < node.siblingsCount - 1;
|
|
5022
|
+
const isDragSource = (dragging == null ? void 0 : dragging.sourceId) === node.id;
|
|
5023
|
+
const draggable = canMove;
|
|
5024
|
+
const handleDragStart = (e) => {
|
|
5025
|
+
if (!draggable || !node.parent) return;
|
|
5026
|
+
const payload = { sourceId: node.id, sourceParent: node.parent };
|
|
5027
|
+
e.dataTransfer.setData(DRAG_MIME, JSON.stringify(payload));
|
|
5028
|
+
e.dataTransfer.setData("text/plain", node.label);
|
|
5029
|
+
e.dataTransfer.effectAllowed = "move";
|
|
5030
|
+
setDragging(payload);
|
|
5031
|
+
};
|
|
5032
|
+
const handleDragEnd = () => setDragging(null);
|
|
5033
|
+
const computeDropPos = (e) => {
|
|
5034
|
+
if (!dragging) return null;
|
|
5035
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
5036
|
+
const y = e.clientY - rect.top;
|
|
5037
|
+
const h = rect.height || 28;
|
|
5038
|
+
const canDropInside = Boolean(node.containerChildrenRef);
|
|
5039
|
+
if (canDropInside && y > h * 0.25 && y < h * 0.75) return "inside";
|
|
5040
|
+
if (y < h * 0.5) return "before";
|
|
5041
|
+
return "after";
|
|
5042
|
+
};
|
|
5043
|
+
const handleDragOver = (e) => {
|
|
5044
|
+
if (!dragging) return;
|
|
5045
|
+
if (dragging.sourceId === node.id) {
|
|
5046
|
+
setDropPos(null);
|
|
5047
|
+
return;
|
|
5048
|
+
}
|
|
5049
|
+
if (node.containerChildrenRef && isDescendant(document2, dragging.sourceId, node.id)) {
|
|
5050
|
+
setDropPos(null);
|
|
5051
|
+
return;
|
|
5052
|
+
}
|
|
5053
|
+
const pos = computeDropPos(e);
|
|
5054
|
+
if (!pos) {
|
|
5055
|
+
setDropPos(null);
|
|
5056
|
+
return;
|
|
5057
|
+
}
|
|
5058
|
+
if ((pos === "before" || pos === "after") && !node.parent) {
|
|
5059
|
+
setDropPos(null);
|
|
5060
|
+
return;
|
|
5061
|
+
}
|
|
5062
|
+
e.preventDefault();
|
|
5063
|
+
e.dataTransfer.dropEffect = "move";
|
|
5064
|
+
setDropPos(pos);
|
|
5065
|
+
};
|
|
5066
|
+
const handleDragLeave = () => setDropPos(null);
|
|
5067
|
+
const handleDrop = (e) => {
|
|
5068
|
+
if (!dragging || !dropPos) return;
|
|
5069
|
+
e.preventDefault();
|
|
5070
|
+
let targetParent;
|
|
5071
|
+
let targetIndex = 0;
|
|
5072
|
+
if (dropPos === "inside" && node.containerChildrenRef) {
|
|
5073
|
+
targetParent = node.containerChildrenRef;
|
|
5074
|
+
targetIndex = Number.MAX_SAFE_INTEGER;
|
|
5075
|
+
} else if ((dropPos === "before" || dropPos === "after") && node.parent) {
|
|
5076
|
+
targetParent = node.parent;
|
|
5077
|
+
targetIndex = node.indexInParent + (dropPos === "after" ? 1 : 0);
|
|
5078
|
+
}
|
|
5079
|
+
if (targetParent) performMove(dragging, targetParent, targetIndex);
|
|
5080
|
+
setDropPos(null);
|
|
5081
|
+
setDragging(null);
|
|
5082
|
+
};
|
|
5083
|
+
const handleMove = (delta) => {
|
|
5084
|
+
if (!canMove || !node.parent) return;
|
|
5085
|
+
const nextIndex = node.indexInParent + delta;
|
|
5086
|
+
const patch = buildMovePatch(document2, node.id, node.parent, node.parent, nextIndex + (delta > 0 ? 1 : 0));
|
|
5087
|
+
if (patch) setDocument(patch);
|
|
5088
|
+
};
|
|
5089
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(Box, { sx: { position: "relative" } }, dropPos === "before" && /* @__PURE__ */ React62.createElement(DropLine, { depth }), /* @__PURE__ */ React62.createElement(
|
|
5090
|
+
Stack,
|
|
5091
|
+
{
|
|
5092
|
+
direction: "row",
|
|
5093
|
+
alignItems: "center",
|
|
5094
|
+
spacing: 0.5,
|
|
5095
|
+
draggable,
|
|
5096
|
+
onDragStart: handleDragStart,
|
|
5097
|
+
onDragEnd: handleDragEnd,
|
|
5098
|
+
onDragOver: handleDragOver,
|
|
5099
|
+
onDragLeave: handleDragLeave,
|
|
5100
|
+
onDrop: handleDrop,
|
|
5101
|
+
onClick: () => isSelectable && setSelectedBlockId(node.id),
|
|
5102
|
+
onMouseEnter: () => isSelectable && !dragging && setHoveredBlockId(node.id),
|
|
5103
|
+
onMouseLeave: () => isSelectable && setHoveredBlockId(null),
|
|
5104
|
+
sx: {
|
|
5105
|
+
pl: `${depth * 12 + 4}px`,
|
|
5106
|
+
pr: 0.5,
|
|
5107
|
+
py: 0.25,
|
|
5108
|
+
minHeight: 28,
|
|
5109
|
+
borderRadius: 0.75,
|
|
5110
|
+
cursor: isSelectable ? draggable ? "grab" : "pointer" : "default",
|
|
5111
|
+
backgroundColor: isSelected ? "action.selected" : dropPos === "inside" ? "rgba(25, 118, 210, 0.12)" : "transparent",
|
|
5112
|
+
opacity: isDragSource ? 0.5 : 1,
|
|
5113
|
+
outline: dropPos === "inside" ? "1.5px solid rgba(25, 118, 210, 0.7)" : void 0,
|
|
5114
|
+
transition: "background-color 80ms, outline-color 80ms",
|
|
5115
|
+
"&:hover": {
|
|
5116
|
+
backgroundColor: isSelected ? "action.selected" : "action.hover"
|
|
4641
5117
|
},
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
5118
|
+
"&:hover .outline-move-btns": { opacity: 1 },
|
|
5119
|
+
userSelect: "none"
|
|
5120
|
+
}
|
|
5121
|
+
},
|
|
5122
|
+
hasChildren ? /* @__PURE__ */ React62.createElement(
|
|
5123
|
+
Box,
|
|
5124
|
+
{
|
|
5125
|
+
role: "button",
|
|
5126
|
+
"aria-label": expanded ? "Collapse" : "Expand",
|
|
5127
|
+
onClick: (e) => {
|
|
5128
|
+
e.stopPropagation();
|
|
5129
|
+
setExpanded((v) => !v);
|
|
4652
5130
|
},
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
5131
|
+
sx: { display: "flex", alignItems: "center", cursor: "pointer" }
|
|
5132
|
+
},
|
|
5133
|
+
expanded ? /* @__PURE__ */ React62.createElement(ExpandMore, { fontSize: "small" }) : /* @__PURE__ */ React62.createElement(ChevronRight, { fontSize: "small" })
|
|
5134
|
+
) : /* @__PURE__ */ React62.createElement(Box, { sx: { width: 20 } }),
|
|
5135
|
+
/* @__PURE__ */ React62.createElement(
|
|
5136
|
+
Box,
|
|
5137
|
+
{
|
|
5138
|
+
sx: {
|
|
5139
|
+
display: "flex",
|
|
5140
|
+
alignItems: "center",
|
|
5141
|
+
color: isSelected ? "primary.main" : "text.secondary",
|
|
5142
|
+
flexShrink: 0
|
|
5143
|
+
}
|
|
5144
|
+
},
|
|
5145
|
+
node.icon
|
|
5146
|
+
),
|
|
5147
|
+
/* @__PURE__ */ React62.createElement(
|
|
5148
|
+
Typography,
|
|
5149
|
+
{
|
|
5150
|
+
variant: "body2",
|
|
5151
|
+
sx: {
|
|
5152
|
+
fontWeight: 600,
|
|
5153
|
+
color: isSelected ? "primary.main" : "text.primary",
|
|
5154
|
+
flexShrink: 0
|
|
5155
|
+
}
|
|
5156
|
+
},
|
|
5157
|
+
node.label
|
|
5158
|
+
),
|
|
5159
|
+
node.preview && /* @__PURE__ */ React62.createElement(
|
|
5160
|
+
Typography,
|
|
5161
|
+
{
|
|
5162
|
+
variant: "body2",
|
|
5163
|
+
sx: {
|
|
5164
|
+
color: "text.secondary",
|
|
5165
|
+
overflow: "hidden",
|
|
5166
|
+
textOverflow: "ellipsis",
|
|
5167
|
+
whiteSpace: "nowrap",
|
|
5168
|
+
flex: 1,
|
|
5169
|
+
minWidth: 0
|
|
5170
|
+
}
|
|
5171
|
+
},
|
|
5172
|
+
"\u2014 ",
|
|
5173
|
+
node.preview
|
|
5174
|
+
),
|
|
5175
|
+
canMove && /* @__PURE__ */ React62.createElement(
|
|
5176
|
+
Box,
|
|
5177
|
+
{
|
|
5178
|
+
className: "outline-move-btns",
|
|
5179
|
+
sx: {
|
|
5180
|
+
display: "flex",
|
|
5181
|
+
ml: "auto",
|
|
5182
|
+
opacity: isSelected ? 1 : 0,
|
|
5183
|
+
transition: "opacity 120ms"
|
|
5184
|
+
}
|
|
5185
|
+
},
|
|
5186
|
+
/* @__PURE__ */ React62.createElement(Tooltip, { title: "Move up" }, /* @__PURE__ */ React62.createElement("span", null, /* @__PURE__ */ React62.createElement(
|
|
4656
5187
|
IconButton,
|
|
4657
5188
|
{
|
|
4658
5189
|
size: "small",
|
|
5190
|
+
disabled: !canMoveUp,
|
|
4659
5191
|
onClick: (e) => {
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
}
|
|
5192
|
+
e.stopPropagation();
|
|
5193
|
+
handleMove(-1);
|
|
5194
|
+
},
|
|
5195
|
+
"aria-label": `Move ${node.label} up`,
|
|
5196
|
+
sx: { p: 0.25 }
|
|
4663
5197
|
},
|
|
4664
|
-
/* @__PURE__ */
|
|
4665
|
-
)),
|
|
4666
|
-
|
|
5198
|
+
/* @__PURE__ */ React62.createElement(KeyboardArrowUp, { fontSize: "small" })
|
|
5199
|
+
))),
|
|
5200
|
+
/* @__PURE__ */ React62.createElement(Tooltip, { title: "Move down" }, /* @__PURE__ */ React62.createElement("span", null, /* @__PURE__ */ React62.createElement(
|
|
4667
5201
|
IconButton,
|
|
4668
5202
|
{
|
|
4669
5203
|
size: "small",
|
|
5204
|
+
disabled: !canMoveDown,
|
|
4670
5205
|
onClick: (e) => {
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
}
|
|
5206
|
+
e.stopPropagation();
|
|
5207
|
+
handleMove(1);
|
|
5208
|
+
},
|
|
5209
|
+
"aria-label": `Move ${node.label} down`,
|
|
5210
|
+
sx: { p: 0.25 }
|
|
4674
5211
|
},
|
|
4675
|
-
/* @__PURE__ */
|
|
4676
|
-
))
|
|
5212
|
+
/* @__PURE__ */ React62.createElement(KeyboardArrowDown, { fontSize: "small" })
|
|
5213
|
+
)))
|
|
5214
|
+
)
|
|
5215
|
+
), dropPos === "after" && /* @__PURE__ */ React62.createElement(DropLine, { depth })), hasChildren && expanded && /* @__PURE__ */ React62.createElement(Box, null, node.children.map((child) => /* @__PURE__ */ React62.createElement(
|
|
5216
|
+
OutlineRow,
|
|
5217
|
+
{
|
|
5218
|
+
key: child.id,
|
|
5219
|
+
node: child,
|
|
5220
|
+
depth: depth + 1,
|
|
5221
|
+
selectedBlockId,
|
|
5222
|
+
document: document2,
|
|
5223
|
+
dragging,
|
|
5224
|
+
setDragging,
|
|
5225
|
+
performMove
|
|
5226
|
+
}
|
|
5227
|
+
))));
|
|
5228
|
+
}
|
|
5229
|
+
function DropLine({ depth }) {
|
|
5230
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5231
|
+
Box,
|
|
5232
|
+
{
|
|
5233
|
+
sx: {
|
|
5234
|
+
position: "relative",
|
|
5235
|
+
height: 0
|
|
5236
|
+
}
|
|
5237
|
+
},
|
|
5238
|
+
/* @__PURE__ */ React62.createElement(
|
|
5239
|
+
Box,
|
|
5240
|
+
{
|
|
5241
|
+
sx: {
|
|
5242
|
+
position: "absolute",
|
|
5243
|
+
left: `${depth * 12 + 24}px`,
|
|
5244
|
+
right: 4,
|
|
5245
|
+
top: -1,
|
|
5246
|
+
height: 2,
|
|
5247
|
+
backgroundColor: "primary.main",
|
|
5248
|
+
borderRadius: 1,
|
|
5249
|
+
pointerEvents: "none"
|
|
5250
|
+
}
|
|
5251
|
+
}
|
|
4677
5252
|
)
|
|
4678
5253
|
);
|
|
4679
5254
|
}
|
|
5255
|
+
function NewTemplatePickerDialog({
|
|
5256
|
+
open,
|
|
5257
|
+
kind,
|
|
5258
|
+
samples,
|
|
5259
|
+
existingSlugs,
|
|
5260
|
+
defaultName,
|
|
5261
|
+
onClose,
|
|
5262
|
+
onCreate
|
|
5263
|
+
}) {
|
|
5264
|
+
const [name, setName] = useState("");
|
|
5265
|
+
const [selectedStarter, setSelectedStarter] = useState(null);
|
|
5266
|
+
const [error, setError] = useState(null);
|
|
5267
|
+
const [busy, setBusy] = useState(false);
|
|
5268
|
+
useEffect(() => {
|
|
5269
|
+
if (open) {
|
|
5270
|
+
setName(defaultName != null ? defaultName : kind === "sample" ? "New sample" : "New template");
|
|
5271
|
+
setSelectedStarter(null);
|
|
5272
|
+
setError(null);
|
|
5273
|
+
setBusy(false);
|
|
5274
|
+
}
|
|
5275
|
+
}, [open, defaultName, kind]);
|
|
5276
|
+
const validate = () => {
|
|
5277
|
+
const trimmed = name.trim();
|
|
5278
|
+
if (!trimmed) return "Name is required";
|
|
5279
|
+
if (existingSlugs.some((s) => s.toLowerCase() === trimmed.toLowerCase())) {
|
|
5280
|
+
return kind === "sample" ? "A sample with this name already exists" : "A template with this name already exists";
|
|
5281
|
+
}
|
|
5282
|
+
return null;
|
|
5283
|
+
};
|
|
5284
|
+
const handleCreate = () => __async(null, null, function* () {
|
|
5285
|
+
const err = validate();
|
|
5286
|
+
if (err) {
|
|
5287
|
+
setError(err);
|
|
5288
|
+
return;
|
|
5289
|
+
}
|
|
5290
|
+
setBusy(true);
|
|
5291
|
+
try {
|
|
5292
|
+
const ok = yield onCreate(name.trim(), selectedStarter);
|
|
5293
|
+
if (ok) onClose();
|
|
5294
|
+
} finally {
|
|
5295
|
+
setBusy(false);
|
|
5296
|
+
}
|
|
5297
|
+
});
|
|
5298
|
+
const pickable = samples.filter((s) => s.id !== "empty-email");
|
|
5299
|
+
return /* @__PURE__ */ React62.createElement(Dialog, { open, onClose: busy ? void 0 : onClose, maxWidth: "sm", fullWidth: true }, /* @__PURE__ */ React62.createElement(DialogTitle, null, kind === "sample" ? "New sample" : "New template"), /* @__PURE__ */ React62.createElement(DialogContent, { dividers: true }, /* @__PURE__ */ React62.createElement(Typography, { variant: "subtitle2", sx: { mb: 1 } }, "Start from"), /* @__PURE__ */ React62.createElement(
|
|
5300
|
+
List,
|
|
5301
|
+
{
|
|
5302
|
+
dense: true,
|
|
5303
|
+
sx: {
|
|
5304
|
+
mb: 2,
|
|
5305
|
+
border: 1,
|
|
5306
|
+
borderColor: "divider",
|
|
5307
|
+
borderRadius: 1,
|
|
5308
|
+
py: 0,
|
|
5309
|
+
maxHeight: 260,
|
|
5310
|
+
overflowY: "auto"
|
|
5311
|
+
}
|
|
5312
|
+
},
|
|
5313
|
+
/* @__PURE__ */ React62.createElement(
|
|
5314
|
+
ListItemButton,
|
|
5315
|
+
{
|
|
5316
|
+
selected: selectedStarter === null,
|
|
5317
|
+
onClick: () => setSelectedStarter(null)
|
|
5318
|
+
},
|
|
5319
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { display: "flex", alignItems: "center", gap: 1.5, flex: 1 } }, /* @__PURE__ */ React62.createElement(InsertDriveFileOutlined, { fontSize: "small", sx: { color: "text.secondary" } }), /* @__PURE__ */ React62.createElement(ListItemText, { primary: "Blank", secondary: "Start from an empty email" }))
|
|
5320
|
+
),
|
|
5321
|
+
pickable.map((s) => /* @__PURE__ */ React62.createElement(
|
|
5322
|
+
ListItemButton,
|
|
5323
|
+
{
|
|
5324
|
+
key: s.id,
|
|
5325
|
+
selected: selectedStarter === s.id,
|
|
5326
|
+
onClick: () => setSelectedStarter(s.id)
|
|
5327
|
+
},
|
|
5328
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { display: "flex", alignItems: "center", gap: 1.5, flex: 1 } }, /* @__PURE__ */ React62.createElement(DescriptionOutlined, { fontSize: "small", sx: { color: "text.secondary" } }), /* @__PURE__ */ React62.createElement(ListItemText, { primary: s.slug, secondary: s.description }))
|
|
5329
|
+
))
|
|
5330
|
+
), /* @__PURE__ */ React62.createElement(
|
|
5331
|
+
TextField,
|
|
5332
|
+
{
|
|
5333
|
+
autoFocus: true,
|
|
5334
|
+
fullWidth: true,
|
|
5335
|
+
size: "small",
|
|
5336
|
+
label: "Name",
|
|
5337
|
+
value: name,
|
|
5338
|
+
onChange: (e) => {
|
|
5339
|
+
setName(e.target.value);
|
|
5340
|
+
if (error) setError(null);
|
|
5341
|
+
},
|
|
5342
|
+
onKeyDown: (e) => {
|
|
5343
|
+
if (e.key === "Enter" && !busy) void handleCreate();
|
|
5344
|
+
},
|
|
5345
|
+
error: Boolean(error),
|
|
5346
|
+
helperText: error != null ? error : " ",
|
|
5347
|
+
disabled: busy
|
|
5348
|
+
}
|
|
5349
|
+
)), /* @__PURE__ */ React62.createElement(DialogActions, null, /* @__PURE__ */ React62.createElement(Button$1, { onClick: onClose, disabled: busy }, "Cancel"), /* @__PURE__ */ React62.createElement(Button$1, { variant: "contained", onClick: handleCreate, disabled: busy }, busy ? "Creating\u2026" : `Create ${kind}`)));
|
|
5350
|
+
}
|
|
4680
5351
|
function RenameDialog({
|
|
4681
5352
|
open,
|
|
4682
5353
|
currentSlug,
|
|
5354
|
+
currentTags = [],
|
|
4683
5355
|
existingSlugs,
|
|
4684
5356
|
onClose,
|
|
4685
5357
|
onSubmit
|
|
4686
5358
|
}) {
|
|
4687
|
-
const [
|
|
5359
|
+
const [slug, setSlug] = useState(currentSlug);
|
|
5360
|
+
const [tags, setTags] = useState(currentTags);
|
|
5361
|
+
const [tagInput, setTagInput] = useState("");
|
|
4688
5362
|
const [error, setError] = useState(null);
|
|
4689
5363
|
const [submitting, setSubmitting] = useState(false);
|
|
4690
5364
|
useEffect(() => {
|
|
4691
5365
|
if (open) {
|
|
4692
|
-
|
|
5366
|
+
setSlug(currentSlug);
|
|
5367
|
+
setTags(currentTags);
|
|
5368
|
+
setTagInput("");
|
|
4693
5369
|
setError(null);
|
|
4694
5370
|
setSubmitting(false);
|
|
4695
5371
|
}
|
|
4696
|
-
}, [open, currentSlug]);
|
|
4697
|
-
const
|
|
4698
|
-
|
|
4699
|
-
|
|
5372
|
+
}, [open, currentSlug, currentTags]);
|
|
5373
|
+
const addTag = () => {
|
|
5374
|
+
const trimmed = tagInput.trim();
|
|
5375
|
+
if (!trimmed) return;
|
|
5376
|
+
if (tags.some((t) => t.toLowerCase() === trimmed.toLowerCase())) {
|
|
5377
|
+
setTagInput("");
|
|
5378
|
+
return;
|
|
5379
|
+
}
|
|
5380
|
+
setTags([...tags, trimmed]);
|
|
5381
|
+
setTagInput("");
|
|
4700
5382
|
};
|
|
5383
|
+
const removeTag = (tag) => setTags(tags.filter((t) => t !== tag));
|
|
5384
|
+
const tagsUnchanged = tags.length === currentTags.length && tags.every((t, i) => t === currentTags[i]);
|
|
4701
5385
|
const handleSubmit = () => __async(null, null, function* () {
|
|
4702
|
-
const
|
|
4703
|
-
if (!
|
|
5386
|
+
const trimmedSlug = slug.trim();
|
|
5387
|
+
if (!trimmedSlug) {
|
|
4704
5388
|
setError("Please enter a name");
|
|
4705
5389
|
return;
|
|
4706
5390
|
}
|
|
4707
|
-
|
|
4708
|
-
|
|
5391
|
+
const slugChanged = trimmedSlug !== currentSlug;
|
|
5392
|
+
if (slugChanged && existingSlugs.some((s) => s.toLowerCase() === trimmedSlug.toLowerCase())) {
|
|
5393
|
+
setError("A template with this name already exists");
|
|
4709
5394
|
return;
|
|
4710
5395
|
}
|
|
4711
|
-
if (
|
|
4712
|
-
|
|
5396
|
+
if (!slugChanged && tagsUnchanged) {
|
|
5397
|
+
onClose();
|
|
4713
5398
|
return;
|
|
4714
5399
|
}
|
|
4715
5400
|
setSubmitting(true);
|
|
4716
5401
|
try {
|
|
4717
|
-
yield onSubmit(
|
|
5402
|
+
yield onSubmit(trimmedSlug, { tags });
|
|
4718
5403
|
onClose();
|
|
4719
5404
|
} catch (e) {
|
|
4720
|
-
console.error("Error
|
|
4721
|
-
setError("Failed to
|
|
5405
|
+
console.error("Error updating template details:", e);
|
|
5406
|
+
setError("Failed to update template details");
|
|
4722
5407
|
} finally {
|
|
4723
5408
|
setSubmitting(false);
|
|
4724
5409
|
}
|
|
4725
5410
|
});
|
|
4726
|
-
return /* @__PURE__ */
|
|
5411
|
+
return /* @__PURE__ */ React62.createElement(Dialog, { open, onClose: submitting ? void 0 : onClose, maxWidth: "sm", fullWidth: true }, /* @__PURE__ */ React62.createElement(DialogTitle, null, "Edit details"), /* @__PURE__ */ React62.createElement(DialogContent, null, /* @__PURE__ */ React62.createElement(
|
|
4727
5412
|
TextField,
|
|
4728
5413
|
{
|
|
4729
5414
|
autoFocus: true,
|
|
4730
5415
|
margin: "dense",
|
|
4731
|
-
label: "
|
|
5416
|
+
label: "Name",
|
|
4732
5417
|
fullWidth: true,
|
|
4733
5418
|
variant: "outlined",
|
|
4734
|
-
value,
|
|
4735
|
-
onChange:
|
|
5419
|
+
value: slug,
|
|
5420
|
+
onChange: (e) => {
|
|
5421
|
+
setSlug(e.target.value);
|
|
5422
|
+
setError(null);
|
|
5423
|
+
},
|
|
4736
5424
|
error: !!error,
|
|
4737
|
-
helperText: error,
|
|
5425
|
+
helperText: error != null ? error : " ",
|
|
4738
5426
|
disabled: submitting,
|
|
4739
5427
|
onKeyPress: (e) => {
|
|
4740
|
-
if (e.key === "Enter" && !submitting)
|
|
4741
|
-
|
|
5428
|
+
if (e.key === "Enter" && !submitting) handleSubmit();
|
|
5429
|
+
}
|
|
5430
|
+
}
|
|
5431
|
+
), /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.secondary", display: "block", mt: 1, mb: 0.5 } }, "Tags"), tags.length > 0 ? /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.5, sx: { flexWrap: "wrap", gap: 0.5, mb: 1 } }, tags.map((tag) => /* @__PURE__ */ React62.createElement(
|
|
5432
|
+
Chip,
|
|
5433
|
+
{
|
|
5434
|
+
key: tag,
|
|
5435
|
+
label: tag,
|
|
5436
|
+
size: "small",
|
|
5437
|
+
onDelete: submitting ? void 0 : () => removeTag(tag)
|
|
5438
|
+
}
|
|
5439
|
+
))) : /* @__PURE__ */ React62.createElement(Typography, { variant: "caption", sx: { color: "text.disabled", display: "block", mb: 1 } }, "No tags yet. Suggested: ", /* @__PURE__ */ React62.createElement("i", null, "transactional"), ", ", /* @__PURE__ */ React62.createElement("i", null, "marketing"), "."), /* @__PURE__ */ React62.createElement(
|
|
5440
|
+
TextField,
|
|
5441
|
+
{
|
|
5442
|
+
size: "small",
|
|
5443
|
+
fullWidth: true,
|
|
5444
|
+
placeholder: "Add a tag and press Enter",
|
|
5445
|
+
value: tagInput,
|
|
5446
|
+
onChange: (e) => setTagInput(e.target.value),
|
|
5447
|
+
disabled: submitting,
|
|
5448
|
+
onKeyDown: (e) => {
|
|
5449
|
+
if (e.key === "Enter" || e.key === ",") {
|
|
5450
|
+
e.preventDefault();
|
|
5451
|
+
addTag();
|
|
5452
|
+
} else if (e.key === "Backspace" && !tagInput && tags.length > 0) {
|
|
5453
|
+
e.preventDefault();
|
|
5454
|
+
removeTag(tags[tags.length - 1]);
|
|
4742
5455
|
}
|
|
5456
|
+
},
|
|
5457
|
+
InputProps: {
|
|
5458
|
+
endAdornment: /* @__PURE__ */ React62.createElement(InputAdornment, { position: "end" }, /* @__PURE__ */ React62.createElement(
|
|
5459
|
+
Button$1,
|
|
5460
|
+
{
|
|
5461
|
+
size: "small",
|
|
5462
|
+
onClick: addTag,
|
|
5463
|
+
disabled: !tagInput.trim() || submitting,
|
|
5464
|
+
startIcon: /* @__PURE__ */ React62.createElement(AddOutlined, { fontSize: "small" }),
|
|
5465
|
+
sx: { textTransform: "none" }
|
|
5466
|
+
},
|
|
5467
|
+
"Add"
|
|
5468
|
+
))
|
|
4743
5469
|
}
|
|
4744
5470
|
}
|
|
4745
|
-
)), /* @__PURE__ */
|
|
5471
|
+
), /* @__PURE__ */ React62.createElement(Box, { sx: { minHeight: 8 } })), /* @__PURE__ */ React62.createElement(DialogActions, null, /* @__PURE__ */ React62.createElement(Button$1, { onClick: onClose, disabled: submitting }, "Cancel"), /* @__PURE__ */ React62.createElement(
|
|
4746
5472
|
Button$1,
|
|
4747
5473
|
{
|
|
4748
5474
|
onClick: handleSubmit,
|
|
4749
5475
|
variant: "contained",
|
|
4750
|
-
disabled: !
|
|
5476
|
+
disabled: !slug.trim() || submitting
|
|
4751
5477
|
},
|
|
4752
|
-
submitting ? "
|
|
5478
|
+
submitting ? "Saving\u2026" : "Save"
|
|
4753
5479
|
)));
|
|
4754
5480
|
}
|
|
4755
5481
|
function SaveTemplateDialog({
|
|
@@ -4811,7 +5537,7 @@ function SaveTemplateDialog({
|
|
|
4811
5537
|
setInternalError("");
|
|
4812
5538
|
onClose();
|
|
4813
5539
|
};
|
|
4814
|
-
return /* @__PURE__ */
|
|
5540
|
+
return /* @__PURE__ */ React62.createElement(
|
|
4815
5541
|
Dialog,
|
|
4816
5542
|
{
|
|
4817
5543
|
open,
|
|
@@ -4819,8 +5545,8 @@ function SaveTemplateDialog({
|
|
|
4819
5545
|
maxWidth: "sm",
|
|
4820
5546
|
fullWidth: true
|
|
4821
5547
|
},
|
|
4822
|
-
/* @__PURE__ */
|
|
4823
|
-
/* @__PURE__ */
|
|
5548
|
+
/* @__PURE__ */ React62.createElement(DialogTitle, null, "Save Email Template"),
|
|
5549
|
+
/* @__PURE__ */ React62.createElement(DialogContent, null, /* @__PURE__ */ React62.createElement(Box, { sx: { pt: 1 } }, /* @__PURE__ */ React62.createElement(
|
|
4824
5550
|
TextField,
|
|
4825
5551
|
{
|
|
4826
5552
|
autoFocus: true,
|
|
@@ -4842,7 +5568,7 @@ function SaveTemplateDialog({
|
|
|
4842
5568
|
disabled: isSubmitting
|
|
4843
5569
|
}
|
|
4844
5570
|
))),
|
|
4845
|
-
/* @__PURE__ */
|
|
5571
|
+
/* @__PURE__ */ React62.createElement(DialogActions, null, /* @__PURE__ */ React62.createElement(Button$1, { onClick: handleCancel, disabled: isSubmitting }, "Cancel"), /* @__PURE__ */ React62.createElement(
|
|
4846
5572
|
Button$1,
|
|
4847
5573
|
{
|
|
4848
5574
|
onClick: handleSave,
|
|
@@ -4908,7 +5634,7 @@ function SamplesDrawer({
|
|
|
4908
5634
|
setTemplateKind,
|
|
4909
5635
|
saveAs
|
|
4910
5636
|
}) {
|
|
4911
|
-
var _a;
|
|
5637
|
+
var _a, _b;
|
|
4912
5638
|
const samplesDrawerOpen = useSamplesDrawerOpen();
|
|
4913
5639
|
const { setCurrentTemplate, loadTemplate: ctxLoadTemplate } = useEmailEditor();
|
|
4914
5640
|
const { showMessage } = useSnackbar();
|
|
@@ -4917,12 +5643,14 @@ function SamplesDrawer({
|
|
|
4917
5643
|
const [loadingSamples, setLoadingSamples] = useState(false);
|
|
4918
5644
|
const [loadingTemplates, setLoadingTemplates] = useState(false);
|
|
4919
5645
|
const [templatesError, setTemplatesError] = useState(null);
|
|
5646
|
+
const [activeLeftTab, setActiveLeftTab] = useState("templates");
|
|
4920
5647
|
const [search, setSearch] = useState("");
|
|
4921
5648
|
const [sortKey, setSortKey] = useState("updatedAt");
|
|
4922
5649
|
const [activeTags, setActiveTags] = useState([]);
|
|
4923
5650
|
const [renameTarget, setRenameTarget] = useState(null);
|
|
4924
5651
|
const [pendingSaveAs, setPendingSaveAs] = useState(null);
|
|
4925
5652
|
const [newError, setNewError] = useState(null);
|
|
5653
|
+
const [pickerKind, setPickerKind] = useState(null);
|
|
4926
5654
|
const handleLoadTemplate = (templateId) => __async(null, null, function* () {
|
|
4927
5655
|
if (templateId === "empty-email") {
|
|
4928
5656
|
return empty_email_message_default;
|
|
@@ -4959,6 +5687,15 @@ function SamplesDrawer({
|
|
|
4959
5687
|
setLoadingTemplates(false);
|
|
4960
5688
|
}
|
|
4961
5689
|
});
|
|
5690
|
+
const ensureRowPresent = (id, slug, kind, tags) => {
|
|
5691
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
5692
|
+
const row = { id, slug, kind, tags, createdAt: now, updatedAt: now };
|
|
5693
|
+
if (kind === "sample") {
|
|
5694
|
+
setSamples((prev) => prev.some((t) => t.id === id) ? prev : [...prev, row]);
|
|
5695
|
+
} else {
|
|
5696
|
+
setTemplates((prev) => prev.some((t) => t.id === id) ? prev : [...prev, row]);
|
|
5697
|
+
}
|
|
5698
|
+
};
|
|
4962
5699
|
useEffect(() => {
|
|
4963
5700
|
if (!enabled || !loadTemplates) return;
|
|
4964
5701
|
refreshTemplates();
|
|
@@ -4982,27 +5719,34 @@ function SamplesDrawer({
|
|
|
4982
5719
|
};
|
|
4983
5720
|
}, [samples, templates]);
|
|
4984
5721
|
const allTags = useMemo(() => {
|
|
4985
|
-
var _a2;
|
|
5722
|
+
var _a2, _b2;
|
|
4986
5723
|
const set = /* @__PURE__ */ new Set();
|
|
4987
|
-
for (const t of templateRows)
|
|
4988
|
-
|
|
4989
|
-
}
|
|
5724
|
+
for (const t of templateRows) (_a2 = t.tags) == null ? void 0 : _a2.forEach((tag) => set.add(tag));
|
|
5725
|
+
for (const s of sampleRows) (_b2 = s.tags) == null ? void 0 : _b2.forEach((tag) => set.add(tag));
|
|
4990
5726
|
return Array.from(set).sort();
|
|
4991
|
-
}, [templateRows]);
|
|
4992
|
-
const
|
|
5727
|
+
}, [templateRows, sampleRows]);
|
|
5728
|
+
const matchesSearchAndTags = useMemo(() => {
|
|
4993
5729
|
const term = search.trim().toLowerCase();
|
|
4994
|
-
|
|
4995
|
-
if (
|
|
4996
|
-
|
|
4997
|
-
|
|
4998
|
-
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
|
|
5002
|
-
|
|
5730
|
+
return (t) => {
|
|
5731
|
+
if (term) {
|
|
5732
|
+
const haystack = [t.slug, t.description, t.subject].filter(Boolean).join(" ").toLowerCase();
|
|
5733
|
+
if (!haystack.includes(term)) return false;
|
|
5734
|
+
}
|
|
5735
|
+
if (activeTags.length > 0) {
|
|
5736
|
+
if (!t.tags || t.tags.length === 0) return false;
|
|
5737
|
+
if (!activeTags.every((tag) => t.tags.includes(tag))) return false;
|
|
5738
|
+
}
|
|
5739
|
+
return true;
|
|
5003
5740
|
};
|
|
5004
|
-
|
|
5005
|
-
|
|
5741
|
+
}, [search, activeTags]);
|
|
5742
|
+
const filteredTemplates = useMemo(
|
|
5743
|
+
() => templateRows.filter(matchesSearchAndTags).slice().sort((a, b) => compareTemplates(a, b, sortKey)),
|
|
5744
|
+
[templateRows, matchesSearchAndTags, sortKey]
|
|
5745
|
+
);
|
|
5746
|
+
const filteredSamples = useMemo(
|
|
5747
|
+
() => sampleRows.filter(matchesSearchAndTags).slice().sort((a, b) => compareTemplates(a, b, sortKey)),
|
|
5748
|
+
[sampleRows, matchesSearchAndTags, sortKey]
|
|
5749
|
+
);
|
|
5006
5750
|
const toggleTag = (tag) => {
|
|
5007
5751
|
setActiveTags((prev) => prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag]);
|
|
5008
5752
|
};
|
|
@@ -5029,16 +5773,19 @@ function SamplesDrawer({
|
|
|
5029
5773
|
deleteTemplate(template.id);
|
|
5030
5774
|
showMessage("Template deleted");
|
|
5031
5775
|
};
|
|
5032
|
-
const handleRenameSubmit = (newSlug) => __async(null, null, function* () {
|
|
5776
|
+
const handleRenameSubmit = (newSlug, opts) => __async(null, null, function* () {
|
|
5033
5777
|
if (!renameTarget || !renameTemplate) return;
|
|
5034
|
-
yield renameTemplate(renameTarget.id, newSlug);
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5778
|
+
yield renameTemplate(renameTarget.id, newSlug, opts);
|
|
5779
|
+
const patch = (t) => {
|
|
5780
|
+
var _a2;
|
|
5781
|
+
return t.id === renameTarget.id ? __spreadProps(__spreadValues({}, t), { slug: newSlug, tags: (_a2 = opts == null ? void 0 : opts.tags) != null ? _a2 : t.tags }) : t;
|
|
5782
|
+
};
|
|
5783
|
+
setTemplates((prev) => prev.map(patch));
|
|
5784
|
+
setSamples((prev) => prev.map(patch));
|
|
5038
5785
|
if (currentTemplateId === renameTarget.id) {
|
|
5039
5786
|
setCurrentTemplate(renameTarget.id, newSlug);
|
|
5040
5787
|
}
|
|
5041
|
-
showMessage("
|
|
5788
|
+
showMessage("Details saved");
|
|
5042
5789
|
});
|
|
5043
5790
|
const flipKindLocally = (id, kind) => {
|
|
5044
5791
|
setTemplates((prev) => prev.map((t) => t.id === id ? __spreadProps(__spreadValues({}, t), { kind }) : t));
|
|
@@ -5093,6 +5840,7 @@ function SamplesDrawer({
|
|
|
5093
5840
|
showMessage("New template created!");
|
|
5094
5841
|
window.location.hash = `#template/${id}`;
|
|
5095
5842
|
yield refreshTemplates();
|
|
5843
|
+
ensureRowPresent(id, slug, "template");
|
|
5096
5844
|
return true;
|
|
5097
5845
|
} catch (e) {
|
|
5098
5846
|
console.error("Error creating template:", e);
|
|
@@ -5100,15 +5848,49 @@ function SamplesDrawer({
|
|
|
5100
5848
|
return false;
|
|
5101
5849
|
}
|
|
5102
5850
|
});
|
|
5103
|
-
const
|
|
5104
|
-
|
|
5105
|
-
setPendingSaveAs({ content: empty_email_message_default, defaultName: "New Template" });
|
|
5851
|
+
const openNewPicker = (kind) => {
|
|
5852
|
+
setPickerKind(kind);
|
|
5106
5853
|
};
|
|
5854
|
+
const handleCreateFromPicker = (name, starterId) => __async(null, null, function* () {
|
|
5855
|
+
if (!saveAs) return false;
|
|
5856
|
+
const kind = pickerKind != null ? pickerKind : "template";
|
|
5857
|
+
try {
|
|
5858
|
+
let content = empty_email_message_default;
|
|
5859
|
+
if (starterId !== null) {
|
|
5860
|
+
content = yield handleLoadTemplate(starterId);
|
|
5861
|
+
if (!content) {
|
|
5862
|
+
showMessage("Could not load the selected sample");
|
|
5863
|
+
return false;
|
|
5864
|
+
}
|
|
5865
|
+
}
|
|
5866
|
+
const { id, slug } = yield saveAs(name, buildSavePayload(content));
|
|
5867
|
+
if (kind === "sample" && setTemplateKind) {
|
|
5868
|
+
try {
|
|
5869
|
+
yield setTemplateKind(id, "sample");
|
|
5870
|
+
flipKindLocally(id, "sample");
|
|
5871
|
+
} catch (e) {
|
|
5872
|
+
console.error("Failed to mark new row as sample:", e);
|
|
5873
|
+
}
|
|
5874
|
+
}
|
|
5875
|
+
resetDocument(content);
|
|
5876
|
+
setCurrentTemplate(id, slug, kind);
|
|
5877
|
+
ctxLoadTemplate(content, id, slug, kind);
|
|
5878
|
+
showMessage(kind === "sample" ? "New sample created" : "New template created");
|
|
5879
|
+
window.location.hash = `#template/${id}`;
|
|
5880
|
+
yield refreshTemplates();
|
|
5881
|
+
ensureRowPresent(id, slug, kind);
|
|
5882
|
+
return true;
|
|
5883
|
+
} catch (e) {
|
|
5884
|
+
console.error("Error creating:", e);
|
|
5885
|
+
showMessage("Error creating");
|
|
5886
|
+
return false;
|
|
5887
|
+
}
|
|
5888
|
+
});
|
|
5107
5889
|
if (!enabled) {
|
|
5108
5890
|
return null;
|
|
5109
5891
|
}
|
|
5110
5892
|
const existingSlugs = templates.map((t) => t.slug);
|
|
5111
|
-
return /* @__PURE__ */
|
|
5893
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
5112
5894
|
Drawer,
|
|
5113
5895
|
{
|
|
5114
5896
|
variant: "persistent",
|
|
@@ -5123,7 +5905,7 @@ function SamplesDrawer({
|
|
|
5123
5905
|
transitionDuration: { enter: enterDuration, exit: exitDuration },
|
|
5124
5906
|
sx: { width: samplesDrawerOpen ? SAMPLES_DRAWER_WIDTH : 0 }
|
|
5125
5907
|
},
|
|
5126
|
-
/* @__PURE__ */
|
|
5908
|
+
/* @__PURE__ */ React62.createElement(
|
|
5127
5909
|
Stack,
|
|
5128
5910
|
{
|
|
5129
5911
|
py: 1,
|
|
@@ -5133,27 +5915,39 @@ function SamplesDrawer({
|
|
|
5133
5915
|
spacing: 1.5,
|
|
5134
5916
|
sx: { overflowY: "auto" }
|
|
5135
5917
|
},
|
|
5136
|
-
/* @__PURE__ */
|
|
5918
|
+
/* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "center", justifyContent: "space-between", sx: { pt: 1 } }, /* @__PURE__ */ React62.createElement(Typography, { variant: "h6", component: "h1" }, "Library"), saveAs && (activeLeftTab === "templates" || activeLeftTab === "samples") && /* @__PURE__ */ React62.createElement(Tooltip, { title: activeLeftTab === "samples" ? "New sample" : "New template" }, /* @__PURE__ */ React62.createElement(
|
|
5137
5919
|
IconButton,
|
|
5138
5920
|
{
|
|
5139
5921
|
size: "small",
|
|
5140
|
-
onClick:
|
|
5141
|
-
"aria-label": "New template"
|
|
5922
|
+
onClick: () => openNewPicker(activeLeftTab === "samples" ? "sample" : "template"),
|
|
5923
|
+
"aria-label": activeLeftTab === "samples" ? "New sample" : "New template"
|
|
5142
5924
|
},
|
|
5143
|
-
/* @__PURE__ */
|
|
5925
|
+
/* @__PURE__ */ React62.createElement(AddOutlined, { fontSize: "small" })
|
|
5144
5926
|
))),
|
|
5145
|
-
|
|
5927
|
+
/* @__PURE__ */ React62.createElement(
|
|
5928
|
+
Tabs,
|
|
5929
|
+
{
|
|
5930
|
+
value: activeLeftTab,
|
|
5931
|
+
onChange: (_, v) => setActiveLeftTab(v),
|
|
5932
|
+
variant: "fullWidth",
|
|
5933
|
+
sx: { minHeight: 36, "& .MuiTab-root": { minHeight: 36, minWidth: 0, px: 1, fontSize: 13 } }
|
|
5934
|
+
},
|
|
5935
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "templates", label: "Templates", disabled: !loadTemplates }),
|
|
5936
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "samples", label: "Samples" }),
|
|
5937
|
+
/* @__PURE__ */ React62.createElement(Tab, { value: "outline", label: "Outline" })
|
|
5938
|
+
),
|
|
5939
|
+
activeLeftTab === "outline" ? /* @__PURE__ */ React62.createElement(OutlinePanel, null) : /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
5146
5940
|
TextField,
|
|
5147
5941
|
{
|
|
5148
5942
|
size: "small",
|
|
5149
|
-
placeholder: "Search templates",
|
|
5943
|
+
placeholder: activeLeftTab === "templates" ? "Search templates" : "Search samples",
|
|
5150
5944
|
value: search,
|
|
5151
5945
|
onChange: (e) => setSearch(e.target.value),
|
|
5152
5946
|
InputProps: {
|
|
5153
|
-
startAdornment: /* @__PURE__ */
|
|
5947
|
+
startAdornment: /* @__PURE__ */ React62.createElement(InputAdornment, { position: "start" }, /* @__PURE__ */ React62.createElement(SearchOutlined, { fontSize: "small" }))
|
|
5154
5948
|
}
|
|
5155
5949
|
}
|
|
5156
|
-
), /* @__PURE__ */
|
|
5950
|
+
), /* @__PURE__ */ React62.createElement(
|
|
5157
5951
|
TextField,
|
|
5158
5952
|
{
|
|
5159
5953
|
select: true,
|
|
@@ -5162,8 +5956,18 @@ function SamplesDrawer({
|
|
|
5162
5956
|
value: sortKey,
|
|
5163
5957
|
onChange: (e) => setSortKey(e.target.value)
|
|
5164
5958
|
},
|
|
5165
|
-
SORT_OPTIONS.map((opt) => /* @__PURE__ */
|
|
5166
|
-
), allTags.length > 0 && /* @__PURE__ */
|
|
5959
|
+
SORT_OPTIONS.map((opt) => /* @__PURE__ */ React62.createElement(MenuItem, { key: opt.value, value: opt.value }, opt.label))
|
|
5960
|
+
), allTags.length > 0 && /* @__PURE__ */ React62.createElement(Stack, { direction: "row", sx: { flexWrap: "wrap", gap: 0.5 } }, /* @__PURE__ */ React62.createElement(
|
|
5961
|
+
Chip,
|
|
5962
|
+
{
|
|
5963
|
+
label: "All",
|
|
5964
|
+
size: "small",
|
|
5965
|
+
clickable: true,
|
|
5966
|
+
color: activeTags.length === 0 ? "primary" : "default",
|
|
5967
|
+
variant: activeTags.length === 0 ? "filled" : "outlined",
|
|
5968
|
+
onClick: () => setActiveTags([])
|
|
5969
|
+
}
|
|
5970
|
+
), allTags.map((tag) => /* @__PURE__ */ React62.createElement(
|
|
5167
5971
|
Chip,
|
|
5168
5972
|
{
|
|
5169
5973
|
key: tag,
|
|
@@ -5174,7 +5978,7 @@ function SamplesDrawer({
|
|
|
5174
5978
|
variant: activeTags.includes(tag) ? "filled" : "outlined",
|
|
5175
5979
|
onClick: () => toggleTag(tag)
|
|
5176
5980
|
}
|
|
5177
|
-
))),
|
|
5981
|
+
))), activeLeftTab === "templates" ? /* @__PURE__ */ React62.createElement(Box, null, loadingTemplates ? /* @__PURE__ */ React62.createElement(Stack, { alignItems: "center", width: "100%", py: 2 }, /* @__PURE__ */ React62.createElement(CircularProgress, { size: 24 })) : templatesError ? /* @__PURE__ */ React62.createElement(Alert, { severity: "error", sx: { my: 1 } }, templatesError) : filteredTemplates.length > 0 ? /* @__PURE__ */ React62.createElement(Stack, { spacing: 0.25, sx: { width: "100%" } }, filteredTemplates.map((template) => /* @__PURE__ */ React62.createElement(
|
|
5178
5982
|
TemplateRow,
|
|
5179
5983
|
{
|
|
5180
5984
|
key: template.id,
|
|
@@ -5186,8 +5990,7 @@ function SamplesDrawer({
|
|
|
5186
5990
|
onDelete: deleteTemplate ? () => handleDelete(template) : void 0,
|
|
5187
5991
|
onPromote: setTemplateKind ? () => handleSetKind(template, "sample") : void 0
|
|
5188
5992
|
}
|
|
5189
|
-
))) : /* @__PURE__ */
|
|
5190
|
-
/* @__PURE__ */ React58.createElement(Box, null, /* @__PURE__ */ React58.createElement(Typography, { variant: "subtitle2", component: "h2", sx: { fontWeight: "bold", mb: 0.5 } }, "Sample Templates"), loadingSamples ? /* @__PURE__ */ React58.createElement(Stack, { alignItems: "center", width: "100%", py: 2 }, /* @__PURE__ */ React58.createElement(CircularProgress, { size: 24 })) : sampleRows.length > 0 ? /* @__PURE__ */ React58.createElement(Stack, { spacing: 0.25, sx: { width: "100%" } }, sampleRows.map((sample) => /* @__PURE__ */ React58.createElement(
|
|
5993
|
+
))) : /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, templateRows.length === 0 ? "No saved templates yet" : "No templates match your filters")) : /* @__PURE__ */ React62.createElement(Box, null, loadingSamples ? /* @__PURE__ */ React62.createElement(Stack, { alignItems: "center", width: "100%", py: 2 }, /* @__PURE__ */ React62.createElement(CircularProgress, { size: 24 })) : filteredSamples.length > 0 ? /* @__PURE__ */ React62.createElement(Stack, { spacing: 0.25, sx: { width: "100%" } }, filteredSamples.map((sample) => /* @__PURE__ */ React62.createElement(
|
|
5191
5994
|
TemplateRow,
|
|
5192
5995
|
{
|
|
5193
5996
|
key: sample.id,
|
|
@@ -5195,20 +5998,23 @@ function SamplesDrawer({
|
|
|
5195
5998
|
isCurrent: currentTemplateId === sample.id,
|
|
5196
5999
|
templateLoader: () => handleLoadTemplate(sample.id),
|
|
5197
6000
|
onDuplicateAsTemplate: saveAs ? () => handleDuplicateAsTemplate(sample) : void 0,
|
|
5198
|
-
|
|
6001
|
+
onRename: renameTemplate ? () => setRenameTarget(sample) : void 0,
|
|
6002
|
+
onDelete: deleteTemplate ? () => handleDelete(sample) : void 0,
|
|
6003
|
+
onDemote: setTemplateKind ? () => handleSetKind(sample, "template") : void 0
|
|
5199
6004
|
}
|
|
5200
|
-
))) : /* @__PURE__ */
|
|
6005
|
+
))) : /* @__PURE__ */ React62.createElement(Typography, { variant: "body2", sx: { color: "text.secondary", py: 1 } }, sampleRows.length === 0 ? "No samples available" : "No samples match your filters")))
|
|
5201
6006
|
)
|
|
5202
|
-
), renameTarget && /* @__PURE__ */
|
|
6007
|
+
), renameTarget && /* @__PURE__ */ React62.createElement(
|
|
5203
6008
|
RenameDialog,
|
|
5204
6009
|
{
|
|
5205
6010
|
open: !!renameTarget,
|
|
5206
6011
|
currentSlug: renameTarget.slug,
|
|
6012
|
+
currentTags: (_a = renameTarget.tags) != null ? _a : [],
|
|
5207
6013
|
existingSlugs: existingSlugs.filter((s) => s !== renameTarget.slug),
|
|
5208
6014
|
onClose: () => setRenameTarget(null),
|
|
5209
6015
|
onSubmit: handleRenameSubmit
|
|
5210
6016
|
}
|
|
5211
|
-
), /* @__PURE__ */
|
|
6017
|
+
), /* @__PURE__ */ React62.createElement(
|
|
5212
6018
|
SaveTemplateDialog,
|
|
5213
6019
|
{
|
|
5214
6020
|
open: !!pendingSaveAs,
|
|
@@ -5218,9 +6024,19 @@ function SamplesDrawer({
|
|
|
5218
6024
|
},
|
|
5219
6025
|
onSave: handleSaveAsSubmit,
|
|
5220
6026
|
onNameChange: () => setNewError(null),
|
|
5221
|
-
defaultName: (
|
|
6027
|
+
defaultName: (_b = pendingSaveAs == null ? void 0 : pendingSaveAs.defaultName) != null ? _b : "New Template",
|
|
5222
6028
|
error: newError
|
|
5223
6029
|
}
|
|
6030
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6031
|
+
NewTemplatePickerDialog,
|
|
6032
|
+
{
|
|
6033
|
+
open: pickerKind !== null,
|
|
6034
|
+
kind: pickerKind != null ? pickerKind : "template",
|
|
6035
|
+
samples: sampleRows,
|
|
6036
|
+
existingSlugs: pickerKind === "sample" ? sampleRows.map((s) => s.slug) : templateRows.map((t) => t.slug),
|
|
6037
|
+
onClose: () => setPickerKind(null),
|
|
6038
|
+
onCreate: handleCreateFromPicker
|
|
6039
|
+
}
|
|
5224
6040
|
));
|
|
5225
6041
|
}
|
|
5226
6042
|
var BUTTON_SX2 = { p: 1.5, display: "flex", flexDirection: "column" };
|
|
@@ -5235,7 +6051,7 @@ var ICON_SX = {
|
|
|
5235
6051
|
borderColor: "cadet.300"
|
|
5236
6052
|
};
|
|
5237
6053
|
function BlockTypeButton({ label, icon, onClick }) {
|
|
5238
|
-
return /* @__PURE__ */
|
|
6054
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5239
6055
|
Button$1,
|
|
5240
6056
|
{
|
|
5241
6057
|
sx: BUTTON_SX2,
|
|
@@ -5244,14 +6060,14 @@ function BlockTypeButton({ label, icon, onClick }) {
|
|
|
5244
6060
|
onClick();
|
|
5245
6061
|
}
|
|
5246
6062
|
},
|
|
5247
|
-
/* @__PURE__ */
|
|
5248
|
-
/* @__PURE__ */
|
|
6063
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: ICON_SX }, icon),
|
|
6064
|
+
/* @__PURE__ */ React62.createElement(Typography, { variant: "body2" }, label)
|
|
5249
6065
|
);
|
|
5250
6066
|
}
|
|
5251
6067
|
var BUTTONS = [
|
|
5252
6068
|
{
|
|
5253
6069
|
label: "Heading",
|
|
5254
|
-
icon: /* @__PURE__ */
|
|
6070
|
+
icon: /* @__PURE__ */ React62.createElement(HMobiledataOutlined, null),
|
|
5255
6071
|
block: () => ({
|
|
5256
6072
|
type: "Heading",
|
|
5257
6073
|
data: {
|
|
@@ -5264,7 +6080,7 @@ var BUTTONS = [
|
|
|
5264
6080
|
},
|
|
5265
6081
|
{
|
|
5266
6082
|
label: "Text",
|
|
5267
|
-
icon: /* @__PURE__ */
|
|
6083
|
+
icon: /* @__PURE__ */ React62.createElement(NotesOutlined, null),
|
|
5268
6084
|
block: () => ({
|
|
5269
6085
|
type: "Text",
|
|
5270
6086
|
data: {
|
|
@@ -5278,7 +6094,7 @@ var BUTTONS = [
|
|
|
5278
6094
|
},
|
|
5279
6095
|
{
|
|
5280
6096
|
label: "Button",
|
|
5281
|
-
icon: /* @__PURE__ */
|
|
6097
|
+
icon: /* @__PURE__ */ React62.createElement(SmartButtonOutlined, null),
|
|
5282
6098
|
block: () => ({
|
|
5283
6099
|
type: "Button",
|
|
5284
6100
|
data: {
|
|
@@ -5292,7 +6108,7 @@ var BUTTONS = [
|
|
|
5292
6108
|
},
|
|
5293
6109
|
{
|
|
5294
6110
|
label: "Image",
|
|
5295
|
-
icon: /* @__PURE__ */
|
|
6111
|
+
icon: /* @__PURE__ */ React62.createElement(ImageOutlined, null),
|
|
5296
6112
|
block: () => ({
|
|
5297
6113
|
type: "Image",
|
|
5298
6114
|
data: {
|
|
@@ -5308,7 +6124,7 @@ var BUTTONS = [
|
|
|
5308
6124
|
},
|
|
5309
6125
|
{
|
|
5310
6126
|
label: "Avatar",
|
|
5311
|
-
icon: /* @__PURE__ */
|
|
6127
|
+
icon: /* @__PURE__ */ React62.createElement(AccountCircleOutlined, null),
|
|
5312
6128
|
block: () => ({
|
|
5313
6129
|
type: "Avatar",
|
|
5314
6130
|
data: {
|
|
@@ -5322,7 +6138,7 @@ var BUTTONS = [
|
|
|
5322
6138
|
},
|
|
5323
6139
|
{
|
|
5324
6140
|
label: "Personal Signature",
|
|
5325
|
-
icon: /* @__PURE__ */
|
|
6141
|
+
icon: /* @__PURE__ */ React62.createElement(ContactMailOutlined, null),
|
|
5326
6142
|
block: () => ({
|
|
5327
6143
|
type: "Signature",
|
|
5328
6144
|
data: {
|
|
@@ -5344,7 +6160,7 @@ var BUTTONS = [
|
|
|
5344
6160
|
},
|
|
5345
6161
|
{
|
|
5346
6162
|
label: "Company Signature",
|
|
5347
|
-
icon: /* @__PURE__ */
|
|
6163
|
+
icon: /* @__PURE__ */ React62.createElement(BusinessOutlined, null),
|
|
5348
6164
|
block: () => ({
|
|
5349
6165
|
type: "Signature",
|
|
5350
6166
|
data: {
|
|
@@ -5364,7 +6180,7 @@ var BUTTONS = [
|
|
|
5364
6180
|
},
|
|
5365
6181
|
{
|
|
5366
6182
|
label: "Divider",
|
|
5367
|
-
icon: /* @__PURE__ */
|
|
6183
|
+
icon: /* @__PURE__ */ React62.createElement(HorizontalRuleOutlined, null),
|
|
5368
6184
|
block: () => ({
|
|
5369
6185
|
type: "Divider",
|
|
5370
6186
|
data: {
|
|
@@ -5377,7 +6193,7 @@ var BUTTONS = [
|
|
|
5377
6193
|
},
|
|
5378
6194
|
{
|
|
5379
6195
|
label: "Spacer",
|
|
5380
|
-
icon: /* @__PURE__ */
|
|
6196
|
+
icon: /* @__PURE__ */ React62.createElement(Crop32Outlined, null),
|
|
5381
6197
|
block: () => ({
|
|
5382
6198
|
type: "Spacer",
|
|
5383
6199
|
data: {}
|
|
@@ -5385,7 +6201,7 @@ var BUTTONS = [
|
|
|
5385
6201
|
},
|
|
5386
6202
|
{
|
|
5387
6203
|
label: "Html",
|
|
5388
|
-
icon: /* @__PURE__ */
|
|
6204
|
+
icon: /* @__PURE__ */ React62.createElement(HtmlOutlined, null),
|
|
5389
6205
|
block: () => ({
|
|
5390
6206
|
type: "Html",
|
|
5391
6207
|
data: {
|
|
@@ -5400,7 +6216,7 @@ var BUTTONS = [
|
|
|
5400
6216
|
},
|
|
5401
6217
|
{
|
|
5402
6218
|
label: "Columns",
|
|
5403
|
-
icon: /* @__PURE__ */
|
|
6219
|
+
icon: /* @__PURE__ */ React62.createElement(ViewColumnOutlined, null),
|
|
5404
6220
|
block: () => ({
|
|
5405
6221
|
type: "ColumnsContainer",
|
|
5406
6222
|
data: {
|
|
@@ -5415,7 +6231,7 @@ var BUTTONS = [
|
|
|
5415
6231
|
},
|
|
5416
6232
|
{
|
|
5417
6233
|
label: "Container",
|
|
5418
|
-
icon: /* @__PURE__ */
|
|
6234
|
+
icon: /* @__PURE__ */ React62.createElement(LibraryAddOutlined, null),
|
|
5419
6235
|
block: () => ({
|
|
5420
6236
|
type: "Container",
|
|
5421
6237
|
data: {
|
|
@@ -5439,7 +6255,7 @@ function BlocksMenu({ anchorEl, setAnchorEl, onSelect }) {
|
|
|
5439
6255
|
if (anchorEl === null) {
|
|
5440
6256
|
return null;
|
|
5441
6257
|
}
|
|
5442
|
-
return /* @__PURE__ */
|
|
6258
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5443
6259
|
Menu,
|
|
5444
6260
|
{
|
|
5445
6261
|
open: true,
|
|
@@ -5448,7 +6264,7 @@ function BlocksMenu({ anchorEl, setAnchorEl, onSelect }) {
|
|
|
5448
6264
|
anchorOrigin: { vertical: "bottom", horizontal: "center" },
|
|
5449
6265
|
transformOrigin: { vertical: "top", horizontal: "center" }
|
|
5450
6266
|
},
|
|
5451
|
-
/* @__PURE__ */
|
|
6267
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { p: 1, display: "grid", gridTemplateColumns: "1fr 1fr 1fr 1fr" } }, BUTTONS.map((k, i) => /* @__PURE__ */ React62.createElement(BlockTypeButton, { key: i, label: k.label, icon: k.icon, onClick: () => onClick(k.block()) })))
|
|
5452
6268
|
);
|
|
5453
6269
|
}
|
|
5454
6270
|
function DividerButton({ buttonElement, onClick }) {
|
|
@@ -5475,7 +6291,7 @@ function DividerButton({ buttonElement, onClick }) {
|
|
|
5475
6291
|
window.removeEventListener("mousemove", listener);
|
|
5476
6292
|
};
|
|
5477
6293
|
}, [buttonElement, setVisible]);
|
|
5478
|
-
return /* @__PURE__ */
|
|
6294
|
+
return /* @__PURE__ */ React62.createElement(Fade, { in: visible }, /* @__PURE__ */ React62.createElement(
|
|
5479
6295
|
IconButton,
|
|
5480
6296
|
{
|
|
5481
6297
|
size: "small",
|
|
@@ -5498,11 +6314,11 @@ function DividerButton({ buttonElement, onClick }) {
|
|
|
5498
6314
|
onClick();
|
|
5499
6315
|
}
|
|
5500
6316
|
},
|
|
5501
|
-
/* @__PURE__ */
|
|
6317
|
+
/* @__PURE__ */ React62.createElement(AddOutlined, { fontSize: "small" })
|
|
5502
6318
|
));
|
|
5503
6319
|
}
|
|
5504
6320
|
function PlaceholderButton({ onClick }) {
|
|
5505
|
-
return /* @__PURE__ */
|
|
6321
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5506
6322
|
ButtonBase,
|
|
5507
6323
|
{
|
|
5508
6324
|
onClick: (ev) => {
|
|
@@ -5518,7 +6334,7 @@ function PlaceholderButton({ onClick }) {
|
|
|
5518
6334
|
bgcolor: "rgba(0,0,0, 0.05)"
|
|
5519
6335
|
}
|
|
5520
6336
|
},
|
|
5521
|
-
/* @__PURE__ */
|
|
6337
|
+
/* @__PURE__ */ React62.createElement(
|
|
5522
6338
|
AddOutlined,
|
|
5523
6339
|
{
|
|
5524
6340
|
sx: {
|
|
@@ -5542,19 +6358,29 @@ function AddBlockButton({ onSelect, placeholder }) {
|
|
|
5542
6358
|
};
|
|
5543
6359
|
const renderButton2 = () => {
|
|
5544
6360
|
if (placeholder) {
|
|
5545
|
-
return /* @__PURE__ */
|
|
6361
|
+
return /* @__PURE__ */ React62.createElement(PlaceholderButton, { onClick: handleButtonClick });
|
|
5546
6362
|
} else {
|
|
5547
|
-
return /* @__PURE__ */
|
|
6363
|
+
return /* @__PURE__ */ React62.createElement(DividerButton, { buttonElement, onClick: handleButtonClick });
|
|
5548
6364
|
}
|
|
5549
6365
|
};
|
|
5550
|
-
return /* @__PURE__ */
|
|
6366
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement("div", { ref: setButtonElement, style: { position: "relative" } }, renderButton2()), /* @__PURE__ */ React62.createElement(BlocksMenu, { anchorEl: menuAnchorEl, setAnchorEl: setMenuAnchorEl, onSelect }));
|
|
6367
|
+
}
|
|
6368
|
+
var BlockParentContext = createContext(null);
|
|
6369
|
+
function BlockParentProvider({
|
|
6370
|
+
info,
|
|
6371
|
+
children
|
|
6372
|
+
}) {
|
|
6373
|
+
return /* @__PURE__ */ React62.createElement(BlockParentContext.Provider, { value: info }, children);
|
|
6374
|
+
}
|
|
6375
|
+
function useBlockParent() {
|
|
6376
|
+
return useContext(BlockParentContext);
|
|
5551
6377
|
}
|
|
5552
6378
|
|
|
5553
6379
|
// src/editor/blocks/helpers/editor-children-ids/index.tsx
|
|
5554
6380
|
function generateId() {
|
|
5555
6381
|
return `block-${Date.now()}`;
|
|
5556
6382
|
}
|
|
5557
|
-
function EditorChildrenIds({ childrenIds, onChange }) {
|
|
6383
|
+
function EditorChildrenIds({ childrenIds, onChange, parentRef }) {
|
|
5558
6384
|
const appendBlock = (block) => {
|
|
5559
6385
|
const blockId = generateId();
|
|
5560
6386
|
return onChange({
|
|
@@ -5574,9 +6400,62 @@ function EditorChildrenIds({ childrenIds, onChange }) {
|
|
|
5574
6400
|
});
|
|
5575
6401
|
};
|
|
5576
6402
|
if (!childrenIds || childrenIds.length === 0) {
|
|
5577
|
-
return /* @__PURE__ */
|
|
6403
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(AddBlockButton, { placeholder: true, onSelect: appendBlock }), parentRef && /* @__PURE__ */ React62.createElement(CanvasDropZone, { parentRef, targetIndex: 0, placeholder: true }));
|
|
5578
6404
|
}
|
|
5579
|
-
return /* @__PURE__ */
|
|
6405
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, childrenIds.map((childId, i) => /* @__PURE__ */ React62.createElement(Fragment, { key: childId }, /* @__PURE__ */ React62.createElement(AddBlockButton, { onSelect: (block) => insertBlock(block, i) }), parentRef && /* @__PURE__ */ React62.createElement(CanvasDropZone, { parentRef, targetIndex: i }), parentRef ? /* @__PURE__ */ React62.createElement(BlockParentProvider, { info: { parent: parentRef, indexInParent: i } }, /* @__PURE__ */ React62.createElement(EditorBlock, { id: childId })) : /* @__PURE__ */ React62.createElement(EditorBlock, { id: childId }))), /* @__PURE__ */ React62.createElement(AddBlockButton, { onSelect: appendBlock }), parentRef && /* @__PURE__ */ React62.createElement(CanvasDropZone, { parentRef, targetIndex: childrenIds.length }));
|
|
6406
|
+
}
|
|
6407
|
+
function CanvasDropZone({
|
|
6408
|
+
parentRef,
|
|
6409
|
+
targetIndex,
|
|
6410
|
+
placeholder = false
|
|
6411
|
+
}) {
|
|
6412
|
+
const document2 = useDocument();
|
|
6413
|
+
const dragging = useDraggingBlock();
|
|
6414
|
+
const [over, setOver] = useState(false);
|
|
6415
|
+
if (!dragging) return null;
|
|
6416
|
+
if (isDescendant(document2, dragging.sourceId, parentRef.parentId)) return null;
|
|
6417
|
+
const handleDragOver = (e) => {
|
|
6418
|
+
e.preventDefault();
|
|
6419
|
+
e.dataTransfer.dropEffect = "move";
|
|
6420
|
+
setOver(true);
|
|
6421
|
+
};
|
|
6422
|
+
const handleDragLeave = () => setOver(false);
|
|
6423
|
+
const handleDrop = (e) => {
|
|
6424
|
+
e.preventDefault();
|
|
6425
|
+
e.stopPropagation();
|
|
6426
|
+
setOver(false);
|
|
6427
|
+
const payload = getDraggingBlock();
|
|
6428
|
+
if (!payload) return;
|
|
6429
|
+
const patch = buildMovePatch(
|
|
6430
|
+
document2,
|
|
6431
|
+
payload.sourceId,
|
|
6432
|
+
payload.sourceParent,
|
|
6433
|
+
parentRef,
|
|
6434
|
+
targetIndex
|
|
6435
|
+
);
|
|
6436
|
+
if (patch) {
|
|
6437
|
+
setDocument(patch);
|
|
6438
|
+
setSelectedBlockId(payload.sourceId);
|
|
6439
|
+
}
|
|
6440
|
+
setDraggingBlock(null);
|
|
6441
|
+
};
|
|
6442
|
+
return /* @__PURE__ */ React62.createElement(
|
|
6443
|
+
Box,
|
|
6444
|
+
{
|
|
6445
|
+
onDragOver: handleDragOver,
|
|
6446
|
+
onDragLeave: handleDragLeave,
|
|
6447
|
+
onDrop: handleDrop,
|
|
6448
|
+
sx: {
|
|
6449
|
+
height: placeholder ? 64 : over ? 16 : 8,
|
|
6450
|
+
mx: placeholder ? 2 : 3,
|
|
6451
|
+
my: placeholder ? 0 : over ? 0.5 : 0,
|
|
6452
|
+
borderRadius: 1,
|
|
6453
|
+
backgroundColor: over ? "rgba(25, 118, 210, 0.16)" : "transparent",
|
|
6454
|
+
outline: over ? "1.5px dashed rgba(25, 118, 210, 0.8)" : void 0,
|
|
6455
|
+
transition: "height 80ms, background-color 80ms, outline-color 80ms"
|
|
6456
|
+
}
|
|
6457
|
+
}
|
|
6458
|
+
);
|
|
5580
6459
|
}
|
|
5581
6460
|
|
|
5582
6461
|
// src/editor/blocks/columns-container/columns-container-editor.tsx
|
|
@@ -5603,15 +6482,36 @@ function ColumnsContainerEditor({ style, props }) {
|
|
|
5603
6482
|
});
|
|
5604
6483
|
setSelectedBlockId(blockId);
|
|
5605
6484
|
};
|
|
5606
|
-
return /* @__PURE__ */
|
|
6485
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5607
6486
|
columns_container_default,
|
|
5608
6487
|
{
|
|
5609
6488
|
props: restProps,
|
|
5610
6489
|
style,
|
|
5611
6490
|
columns: [
|
|
5612
|
-
/* @__PURE__ */
|
|
5613
|
-
|
|
5614
|
-
|
|
6491
|
+
/* @__PURE__ */ React62.createElement(
|
|
6492
|
+
EditorChildrenIds,
|
|
6493
|
+
{
|
|
6494
|
+
childrenIds: (_b = columns == null ? void 0 : columns[0]) == null ? void 0 : _b.childrenIds,
|
|
6495
|
+
parentRef: { kind: "ColumnsContainer", parentId: currentBlockId, columnIndex: 0 },
|
|
6496
|
+
onChange: (change) => updateColumn(0, change)
|
|
6497
|
+
}
|
|
6498
|
+
),
|
|
6499
|
+
/* @__PURE__ */ React62.createElement(
|
|
6500
|
+
EditorChildrenIds,
|
|
6501
|
+
{
|
|
6502
|
+
childrenIds: (_c = columns == null ? void 0 : columns[1]) == null ? void 0 : _c.childrenIds,
|
|
6503
|
+
parentRef: { kind: "ColumnsContainer", parentId: currentBlockId, columnIndex: 1 },
|
|
6504
|
+
onChange: (change) => updateColumn(1, change)
|
|
6505
|
+
}
|
|
6506
|
+
),
|
|
6507
|
+
/* @__PURE__ */ React62.createElement(
|
|
6508
|
+
EditorChildrenIds,
|
|
6509
|
+
{
|
|
6510
|
+
childrenIds: (_d = columns == null ? void 0 : columns[2]) == null ? void 0 : _d.childrenIds,
|
|
6511
|
+
parentRef: { kind: "ColumnsContainer", parentId: currentBlockId, columnIndex: 2 },
|
|
6512
|
+
onChange: (change) => updateColumn(2, change)
|
|
6513
|
+
}
|
|
6514
|
+
)
|
|
5615
6515
|
]
|
|
5616
6516
|
}
|
|
5617
6517
|
);
|
|
@@ -5621,10 +6521,11 @@ function ContainerEditor({ style, props }) {
|
|
|
5621
6521
|
const childrenIds = (_a = props == null ? void 0 : props.childrenIds) != null ? _a : [];
|
|
5622
6522
|
const document2 = useDocument();
|
|
5623
6523
|
const currentBlockId = useCurrentBlockId();
|
|
5624
|
-
return /* @__PURE__ */
|
|
6524
|
+
return /* @__PURE__ */ React62.createElement(container_default, { style }, /* @__PURE__ */ React62.createElement(
|
|
5625
6525
|
EditorChildrenIds,
|
|
5626
6526
|
{
|
|
5627
6527
|
childrenIds,
|
|
6528
|
+
parentRef: { kind: "Container", parentId: currentBlockId },
|
|
5628
6529
|
onChange: ({ block, blockId, childrenIds: childrenIds2 }) => {
|
|
5629
6530
|
setDocument({
|
|
5630
6531
|
[blockId]: block,
|
|
@@ -5821,10 +6722,11 @@ function EmailLayoutEditor(props) {
|
|
|
5821
6722
|
lineHeight: "1.5",
|
|
5822
6723
|
margin: "0"
|
|
5823
6724
|
};
|
|
5824
|
-
const editorChildren = /* @__PURE__ */
|
|
6725
|
+
const editorChildren = /* @__PURE__ */ React62.createElement(
|
|
5825
6726
|
EditorChildrenIds,
|
|
5826
6727
|
{
|
|
5827
6728
|
childrenIds,
|
|
6729
|
+
parentRef: { kind: "EmailLayout", parentId: "root" },
|
|
5828
6730
|
onChange: ({ block, blockId, childrenIds: childrenIds2 }) => {
|
|
5829
6731
|
setDocument({
|
|
5830
6732
|
[blockId]: block,
|
|
@@ -5839,61 +6741,87 @@ function EmailLayoutEditor(props) {
|
|
|
5839
6741
|
}
|
|
5840
6742
|
}
|
|
5841
6743
|
);
|
|
6744
|
+
const WORKSPACE_BG = "#e7e8ec";
|
|
6745
|
+
const CARD_MAX_WIDTH = 664;
|
|
6746
|
+
const cardStyle = {
|
|
6747
|
+
maxWidth: CARD_MAX_WIDTH,
|
|
6748
|
+
margin: "0 auto",
|
|
6749
|
+
borderRadius: 12,
|
|
6750
|
+
boxShadow: "0 1px 2px rgba(33, 36, 67, 0.05), 0 8px 24px rgba(33, 36, 67, 0.08)"
|
|
6751
|
+
};
|
|
5842
6752
|
if (props.backdropDisabled) {
|
|
5843
|
-
return /* @__PURE__ */
|
|
6753
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5844
6754
|
"div",
|
|
5845
6755
|
{
|
|
5846
6756
|
onClick: () => {
|
|
5847
6757
|
setSelectedBlockId(null);
|
|
5848
6758
|
},
|
|
5849
6759
|
style: __spreadProps(__spreadValues({}, baseStyle), {
|
|
5850
|
-
backgroundColor:
|
|
6760
|
+
backgroundColor: WORKSPACE_BG,
|
|
5851
6761
|
padding: "32px",
|
|
5852
6762
|
width: "100%",
|
|
5853
6763
|
minHeight: "100%"
|
|
5854
6764
|
})
|
|
5855
6765
|
},
|
|
5856
|
-
/* @__PURE__ */
|
|
6766
|
+
/* @__PURE__ */ React62.createElement(
|
|
6767
|
+
"div",
|
|
6768
|
+
{
|
|
6769
|
+
style: __spreadProps(__spreadValues({}, cardStyle), {
|
|
6770
|
+
backgroundColor: "#F5F5F5",
|
|
6771
|
+
padding: "32px"
|
|
6772
|
+
})
|
|
6773
|
+
},
|
|
6774
|
+
/* @__PURE__ */ React62.createElement("div", { style: { maxWidth: "600px", margin: "0 auto" } }, editorChildren)
|
|
6775
|
+
)
|
|
5857
6776
|
);
|
|
5858
6777
|
}
|
|
5859
|
-
return /* @__PURE__ */
|
|
6778
|
+
return /* @__PURE__ */ React62.createElement(
|
|
5860
6779
|
"div",
|
|
5861
6780
|
{
|
|
5862
6781
|
onClick: () => {
|
|
5863
6782
|
setSelectedBlockId(null);
|
|
5864
6783
|
},
|
|
5865
6784
|
style: __spreadProps(__spreadValues({}, baseStyle), {
|
|
5866
|
-
backgroundColor:
|
|
5867
|
-
padding: "32px
|
|
6785
|
+
backgroundColor: WORKSPACE_BG,
|
|
6786
|
+
padding: "32px 16px",
|
|
5868
6787
|
width: "100%",
|
|
5869
6788
|
minHeight: "100%"
|
|
5870
6789
|
})
|
|
5871
6790
|
},
|
|
5872
|
-
/* @__PURE__ */
|
|
5873
|
-
"
|
|
6791
|
+
/* @__PURE__ */ React62.createElement(
|
|
6792
|
+
"div",
|
|
5874
6793
|
{
|
|
5875
|
-
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
maxWidth: "600px",
|
|
5880
|
-
backgroundColor: (_d = props.canvasColor) != null ? _d : "#FFFFFF",
|
|
5881
|
-
borderRadius: (_e = props.borderRadius) != null ? _e : void 0,
|
|
5882
|
-
overflow: props.borderRadius ? "hidden" : void 0,
|
|
5883
|
-
border: (() => {
|
|
5884
|
-
const v = props.borderColor;
|
|
5885
|
-
if (!v) {
|
|
5886
|
-
return void 0;
|
|
5887
|
-
}
|
|
5888
|
-
return `1px solid ${v}`;
|
|
5889
|
-
})()
|
|
5890
|
-
},
|
|
5891
|
-
role: "presentation",
|
|
5892
|
-
cellSpacing: "0",
|
|
5893
|
-
cellPadding: "0",
|
|
5894
|
-
border: 0
|
|
6794
|
+
style: __spreadProps(__spreadValues({}, cardStyle), {
|
|
6795
|
+
backgroundColor: (_c = props.backdropColor) != null ? _c : "#F5F5F5",
|
|
6796
|
+
padding: "32px 0"
|
|
6797
|
+
})
|
|
5895
6798
|
},
|
|
5896
|
-
/* @__PURE__ */
|
|
6799
|
+
/* @__PURE__ */ React62.createElement(
|
|
6800
|
+
"table",
|
|
6801
|
+
{
|
|
6802
|
+
align: "center",
|
|
6803
|
+
width: "100%",
|
|
6804
|
+
style: {
|
|
6805
|
+
margin: "0 auto",
|
|
6806
|
+
maxWidth: "600px",
|
|
6807
|
+
backgroundColor: (_d = props.canvasColor) != null ? _d : "#FFFFFF",
|
|
6808
|
+
borderRadius: (_e = props.borderRadius) != null ? _e : void 0,
|
|
6809
|
+
overflow: props.borderRadius ? "hidden" : void 0,
|
|
6810
|
+
border: (() => {
|
|
6811
|
+
const v = props.borderColor;
|
|
6812
|
+
if (!v) {
|
|
6813
|
+
return void 0;
|
|
6814
|
+
}
|
|
6815
|
+
return `1px solid ${v}`;
|
|
6816
|
+
})()
|
|
6817
|
+
},
|
|
6818
|
+
role: "presentation",
|
|
6819
|
+
cellSpacing: "0",
|
|
6820
|
+
cellPadding: "0",
|
|
6821
|
+
border: 0
|
|
6822
|
+
},
|
|
6823
|
+
/* @__PURE__ */ React62.createElement("tbody", null, /* @__PURE__ */ React62.createElement("tr", { style: { width: "100%" } }, /* @__PURE__ */ React62.createElement("td", null, editorChildren)))
|
|
6824
|
+
)
|
|
5897
6825
|
)
|
|
5898
6826
|
);
|
|
5899
6827
|
}
|
|
@@ -6052,34 +6980,54 @@ function TuneMenu({ blockId }) {
|
|
|
6052
6980
|
resetDocument(nDocument);
|
|
6053
6981
|
setSelectedBlockId(blockId);
|
|
6054
6982
|
};
|
|
6055
|
-
return /* @__PURE__ */
|
|
6983
|
+
return /* @__PURE__ */ React62.createElement(Paper, { sx, onClick: (ev) => ev.stopPropagation() }, /* @__PURE__ */ React62.createElement(Stack, null, /* @__PURE__ */ React62.createElement(Tooltip, { title: "Move up", placement: "left-start" }, /* @__PURE__ */ React62.createElement(IconButton, { onClick: () => handleMoveClick("up"), sx: { color: "text.primary" } }, /* @__PURE__ */ React62.createElement(ArrowUpwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React62.createElement(Tooltip, { title: "Move down", placement: "left-start" }, /* @__PURE__ */ React62.createElement(IconButton, { onClick: () => handleMoveClick("down"), sx: { color: "text.primary" } }, /* @__PURE__ */ React62.createElement(ArrowDownwardOutlined, { fontSize: "small" }))), /* @__PURE__ */ React62.createElement(Tooltip, { title: "Copy block", placement: "left-start" }, /* @__PURE__ */ React62.createElement(IconButton, { onClick: handleCopyClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React62.createElement(ContentCopyOutlined, { fontSize: "small" }))), /* @__PURE__ */ React62.createElement(Tooltip, { title: "Delete", placement: "left-start" }, /* @__PURE__ */ React62.createElement(IconButton, { onClick: handleDeleteClick, sx: { color: "text.primary" } }, /* @__PURE__ */ React62.createElement(DeleteOutlined, { fontSize: "small" })))));
|
|
6056
6984
|
}
|
|
6057
6985
|
|
|
6058
6986
|
// src/editor/blocks/helpers/block-wrappers/editor-block-wrapper.tsx
|
|
6059
6987
|
function EditorBlockWrapper({ children }) {
|
|
6060
6988
|
const selectedBlockId = useSelectedBlockId();
|
|
6989
|
+
const hoveredBlockId = useHoveredBlockId();
|
|
6990
|
+
const draggingBlock = useDraggingBlock();
|
|
6991
|
+
const blockParent = useBlockParent();
|
|
6061
6992
|
const [mouseInside, setMouseInside] = useState(false);
|
|
6062
6993
|
const blockId = useCurrentBlockId();
|
|
6994
|
+
const isBeingDragged = (draggingBlock == null ? void 0 : draggingBlock.sourceId) === blockId;
|
|
6063
6995
|
let outline;
|
|
6064
6996
|
if (selectedBlockId === blockId) {
|
|
6065
6997
|
outline = "2px solid rgba(0,121,204, 1)";
|
|
6066
|
-
} else if (mouseInside) {
|
|
6998
|
+
} else if (mouseInside && !draggingBlock || hoveredBlockId === blockId) {
|
|
6067
6999
|
outline = "2px solid rgba(0,121,204, 0.3)";
|
|
6068
7000
|
}
|
|
6069
7001
|
const renderMenu = () => {
|
|
6070
7002
|
if (selectedBlockId !== blockId) {
|
|
6071
7003
|
return null;
|
|
6072
7004
|
}
|
|
6073
|
-
return /* @__PURE__ */
|
|
7005
|
+
return /* @__PURE__ */ React62.createElement(TuneMenu, { blockId });
|
|
7006
|
+
};
|
|
7007
|
+
const draggable = Boolean(blockParent) && selectedBlockId !== blockId;
|
|
7008
|
+
const handleDragStart = (e) => {
|
|
7009
|
+
if (!blockParent) return;
|
|
7010
|
+
e.stopPropagation();
|
|
7011
|
+
e.dataTransfer.effectAllowed = "move";
|
|
7012
|
+
e.dataTransfer.setData("text/plain", blockId);
|
|
7013
|
+
setDraggingBlock({ sourceId: blockId, sourceParent: blockParent.parent });
|
|
7014
|
+
};
|
|
7015
|
+
const handleDragEnd = () => {
|
|
7016
|
+
setDraggingBlock(null);
|
|
6074
7017
|
};
|
|
6075
|
-
return /* @__PURE__ */
|
|
7018
|
+
return /* @__PURE__ */ React62.createElement(
|
|
6076
7019
|
Box,
|
|
6077
7020
|
{
|
|
7021
|
+
draggable,
|
|
7022
|
+
onDragStart: handleDragStart,
|
|
7023
|
+
onDragEnd: handleDragEnd,
|
|
6078
7024
|
sx: {
|
|
6079
7025
|
position: "relative",
|
|
6080
7026
|
maxWidth: "100%",
|
|
6081
7027
|
outlineOffset: "-1px",
|
|
6082
|
-
outline
|
|
7028
|
+
outline,
|
|
7029
|
+
opacity: isBeingDragged ? 0.4 : 1,
|
|
7030
|
+
cursor: draggable ? draggingBlock ? "grabbing" : "default" : "default"
|
|
6083
7031
|
},
|
|
6084
7032
|
onMouseEnter: (ev) => {
|
|
6085
7033
|
setMouseInside(true);
|
|
@@ -6212,7 +7160,7 @@ function ButtonEditor({ style, props }) {
|
|
|
6212
7160
|
selectionEnd: (_b2 = el.selectionEnd) != null ? _b2 : el.value.length
|
|
6213
7161
|
});
|
|
6214
7162
|
};
|
|
6215
|
-
return /* @__PURE__ */
|
|
7163
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, /* @__PURE__ */ React62.createElement(
|
|
6216
7164
|
"input",
|
|
6217
7165
|
{
|
|
6218
7166
|
type: "text",
|
|
@@ -6229,7 +7177,7 @@ function ButtonEditor({ style, props }) {
|
|
|
6229
7177
|
}
|
|
6230
7178
|
));
|
|
6231
7179
|
}
|
|
6232
|
-
return /* @__PURE__ */
|
|
7180
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, /* @__PURE__ */ React62.createElement("span", { style: linkStyle }, /* @__PURE__ */ React62.createElement("span", null, text)));
|
|
6233
7181
|
}
|
|
6234
7182
|
function useMarkdownToolbar({ text, isSelected, commitText, trackSelection }) {
|
|
6235
7183
|
const textareaRef = useRef(null);
|
|
@@ -6373,7 +7321,7 @@ function InlineFormattingToolbar({
|
|
|
6373
7321
|
}
|
|
6374
7322
|
}, [linkPrompt]);
|
|
6375
7323
|
const preventBlur = (e) => e.preventDefault();
|
|
6376
|
-
return /* @__PURE__ */
|
|
7324
|
+
return /* @__PURE__ */ React62.createElement(Popper, { open: visible, anchorEl, placement: "top-start", style: { zIndex: 1300 } }, /* @__PURE__ */ React62.createElement(Paper, { elevation: 4, sx: { px: 0.5, py: 0.25, mb: 0.5 }, onMouseDown: preventBlur }, linkPrompt ? /* @__PURE__ */ React62.createElement(Stack, { direction: "row", alignItems: "center", spacing: 0.5, sx: { px: 0.5 } }, /* @__PURE__ */ React62.createElement(
|
|
6377
7325
|
TextField,
|
|
6378
7326
|
{
|
|
6379
7327
|
inputRef,
|
|
@@ -6395,7 +7343,7 @@ function InlineFormattingToolbar({
|
|
|
6395
7343
|
},
|
|
6396
7344
|
sx: { width: 220 }
|
|
6397
7345
|
}
|
|
6398
|
-
)) : /* @__PURE__ */
|
|
7346
|
+
)) : /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 0.25 }, /* @__PURE__ */ React62.createElement(IconButton, { size: "small", onClick: onBold, title: "Bold (Cmd+B)", "aria-label": "Bold" }, /* @__PURE__ */ React62.createElement(FormatBoldOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(IconButton, { size: "small", onClick: onItalic, title: "Italic (Cmd+I)", "aria-label": "Italic" }, /* @__PURE__ */ React62.createElement(FormatItalicOutlined, { fontSize: "small" })), /* @__PURE__ */ React62.createElement(IconButton, { size: "small", onClick: onLinkRequest, title: "Link (Cmd+K)", "aria-label": "Link" }, /* @__PURE__ */ React62.createElement(LinkOutlined, { fontSize: "small" })))));
|
|
6399
7347
|
}
|
|
6400
7348
|
|
|
6401
7349
|
// src/editor/blocks/heading/heading-editor.tsx
|
|
@@ -6550,7 +7498,7 @@ function HeadingEditor({ style, props }) {
|
|
|
6550
7498
|
if (textareaRef.current) adjustTextareaHeight(textareaRef.current);
|
|
6551
7499
|
}, [localText, isSelected]);
|
|
6552
7500
|
if (isSelected) {
|
|
6553
|
-
return /* @__PURE__ */
|
|
7501
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
6554
7502
|
"textarea",
|
|
6555
7503
|
{
|
|
6556
7504
|
ref: textareaRef,
|
|
@@ -6568,7 +7516,7 @@ function HeadingEditor({ style, props }) {
|
|
|
6568
7516
|
rows: 1,
|
|
6569
7517
|
onInput: (e) => adjustTextareaHeight(e.target)
|
|
6570
7518
|
}
|
|
6571
|
-
), /* @__PURE__ */
|
|
7519
|
+
), /* @__PURE__ */ React62.createElement(InlineFormattingToolbar, __spreadValues({ anchorEl: textareaRef.current }, toolbarProps)));
|
|
6572
7520
|
}
|
|
6573
7521
|
const headingProps = isMarkdown ? {
|
|
6574
7522
|
ref: displayRef,
|
|
@@ -6577,11 +7525,11 @@ function HeadingEditor({ style, props }) {
|
|
|
6577
7525
|
} : { ref: displayRef, style: hStyle, children: textContent };
|
|
6578
7526
|
switch (level) {
|
|
6579
7527
|
case "h1":
|
|
6580
|
-
return /* @__PURE__ */
|
|
7528
|
+
return /* @__PURE__ */ React62.createElement("h1", __spreadValues({}, headingProps));
|
|
6581
7529
|
case "h2":
|
|
6582
|
-
return /* @__PURE__ */
|
|
7530
|
+
return /* @__PURE__ */ React62.createElement("h2", __spreadValues({}, headingProps));
|
|
6583
7531
|
case "h3":
|
|
6584
|
-
return /* @__PURE__ */
|
|
7532
|
+
return /* @__PURE__ */ React62.createElement("h3", __spreadValues({}, headingProps));
|
|
6585
7533
|
}
|
|
6586
7534
|
}
|
|
6587
7535
|
function HtmlEditor({ style, props }) {
|
|
@@ -6646,7 +7594,7 @@ function HtmlEditor({ style, props }) {
|
|
|
6646
7594
|
selectionEnd: (_b2 = el.selectionEnd) != null ? _b2 : el.value.length
|
|
6647
7595
|
});
|
|
6648
7596
|
};
|
|
6649
|
-
return /* @__PURE__ */
|
|
7597
|
+
return /* @__PURE__ */ React62.createElement("div", { style: cssStyle }, /* @__PURE__ */ React62.createElement(
|
|
6650
7598
|
"textarea",
|
|
6651
7599
|
{
|
|
6652
7600
|
value: localContents,
|
|
@@ -6666,9 +7614,9 @@ function HtmlEditor({ style, props }) {
|
|
|
6666
7614
|
));
|
|
6667
7615
|
}
|
|
6668
7616
|
if (!contents) {
|
|
6669
|
-
return /* @__PURE__ */
|
|
7617
|
+
return /* @__PURE__ */ React62.createElement("div", { style: cssStyle });
|
|
6670
7618
|
}
|
|
6671
|
-
return /* @__PURE__ */
|
|
7619
|
+
return /* @__PURE__ */ React62.createElement("div", { style: cssStyle, dangerouslySetInnerHTML: { __html: contents } });
|
|
6672
7620
|
}
|
|
6673
7621
|
function getImageBorderRadius2(shape, size) {
|
|
6674
7622
|
switch (shape) {
|
|
@@ -6783,7 +7731,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6783
7731
|
backgroundColor: (_p = style == null ? void 0 : style.backgroundColor) != null ? _p : void 0,
|
|
6784
7732
|
padding: (style == null ? void 0 : style.padding) ? `${style.padding.top}px ${style.padding.right}px ${style.padding.bottom}px ${style.padding.left}px` : void 0
|
|
6785
7733
|
};
|
|
6786
|
-
const imageElement = imageUrl ? /* @__PURE__ */
|
|
7734
|
+
const imageElement = imageUrl ? /* @__PURE__ */ React62.createElement(
|
|
6787
7735
|
"img",
|
|
6788
7736
|
{
|
|
6789
7737
|
src: imageUrl,
|
|
@@ -6801,7 +7749,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6801
7749
|
}
|
|
6802
7750
|
}
|
|
6803
7751
|
) : null;
|
|
6804
|
-
const greetingElement = isSelected ? /* @__PURE__ */
|
|
7752
|
+
const greetingElement = isSelected ? /* @__PURE__ */ React62.createElement("div", { onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React62.createElement(
|
|
6805
7753
|
"input",
|
|
6806
7754
|
{
|
|
6807
7755
|
value: localGreeting,
|
|
@@ -6812,8 +7760,8 @@ function SignatureEditor({ style, props }) {
|
|
|
6812
7760
|
placeholder: "Greeting (e.g. Best regards,)",
|
|
6813
7761
|
style: __spreadValues(__spreadValues({}, inputBase), greetingStyle)
|
|
6814
7762
|
}
|
|
6815
|
-
)) : greeting ? /* @__PURE__ */
|
|
6816
|
-
const textContent = isSelected ? /* @__PURE__ */
|
|
7763
|
+
)) : greeting ? /* @__PURE__ */ React62.createElement("p", { style: greetingStyle }, greeting) : null;
|
|
7764
|
+
const textContent = isSelected ? /* @__PURE__ */ React62.createElement("div", { onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React62.createElement(
|
|
6817
7765
|
"input",
|
|
6818
7766
|
{
|
|
6819
7767
|
value: localName,
|
|
@@ -6824,7 +7772,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6824
7772
|
placeholder: "Name",
|
|
6825
7773
|
style: __spreadValues(__spreadValues({}, inputBase), nameStyle)
|
|
6826
7774
|
}
|
|
6827
|
-
), /* @__PURE__ */
|
|
7775
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6828
7776
|
"input",
|
|
6829
7777
|
{
|
|
6830
7778
|
value: localTitle,
|
|
@@ -6835,7 +7783,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6835
7783
|
placeholder: "Title",
|
|
6836
7784
|
style: __spreadValues(__spreadValues({}, inputBase), detailStyle)
|
|
6837
7785
|
}
|
|
6838
|
-
), /* @__PURE__ */
|
|
7786
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6839
7787
|
"input",
|
|
6840
7788
|
{
|
|
6841
7789
|
value: localCompany,
|
|
@@ -6846,7 +7794,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6846
7794
|
placeholder: "Company",
|
|
6847
7795
|
style: __spreadValues(__spreadValues({}, inputBase), detailStyle)
|
|
6848
7796
|
}
|
|
6849
|
-
), /* @__PURE__ */
|
|
7797
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6850
7798
|
"input",
|
|
6851
7799
|
{
|
|
6852
7800
|
value: localAddress,
|
|
@@ -6857,7 +7805,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6857
7805
|
placeholder: "Address",
|
|
6858
7806
|
style: __spreadValues(__spreadValues({}, inputBase), detailStyle)
|
|
6859
7807
|
}
|
|
6860
|
-
), /* @__PURE__ */
|
|
7808
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6861
7809
|
"input",
|
|
6862
7810
|
{
|
|
6863
7811
|
value: localEmail,
|
|
@@ -6868,7 +7816,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6868
7816
|
placeholder: "Email",
|
|
6869
7817
|
style: __spreadProps(__spreadValues(__spreadValues({}, inputBase), linkStyle), { marginTop: 4, display: "block" })
|
|
6870
7818
|
}
|
|
6871
|
-
), /* @__PURE__ */
|
|
7819
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6872
7820
|
"input",
|
|
6873
7821
|
{
|
|
6874
7822
|
value: localPhone,
|
|
@@ -6879,7 +7827,7 @@ function SignatureEditor({ style, props }) {
|
|
|
6879
7827
|
placeholder: "Phone",
|
|
6880
7828
|
style: __spreadProps(__spreadValues(__spreadValues({}, inputBase), linkStyle), { display: "block" })
|
|
6881
7829
|
}
|
|
6882
|
-
), /* @__PURE__ */
|
|
7830
|
+
), /* @__PURE__ */ React62.createElement(
|
|
6883
7831
|
"input",
|
|
6884
7832
|
{
|
|
6885
7833
|
value: localWebsite,
|
|
@@ -6890,11 +7838,11 @@ function SignatureEditor({ style, props }) {
|
|
|
6890
7838
|
placeholder: "Website",
|
|
6891
7839
|
style: __spreadProps(__spreadValues(__spreadValues({}, inputBase), linkStyle), { display: "block" })
|
|
6892
7840
|
}
|
|
6893
|
-
)) : /* @__PURE__ */
|
|
7841
|
+
)) : /* @__PURE__ */ React62.createElement("div", null, name && /* @__PURE__ */ React62.createElement("p", { style: nameStyle }, name), title && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, title), company && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, company), address && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, address), (email || phone || website) && /* @__PURE__ */ React62.createElement("p", { style: __spreadProps(__spreadValues({}, detailStyle), { marginTop: 4 }) }, email && /* @__PURE__ */ React62.createElement("span", { style: linkStyle }, email), email && (phone || website) && /* @__PURE__ */ React62.createElement("span", { style: detailStyle }, " \xB7 "), phone && /* @__PURE__ */ React62.createElement("span", { style: linkStyle }, phone), phone && website && /* @__PURE__ */ React62.createElement("span", { style: detailStyle }, " \xB7 "), website && /* @__PURE__ */ React62.createElement("span", { style: linkStyle }, website)), !name && !title && !company && !email && !phone && !website && /* @__PURE__ */ React62.createElement("p", { style: detailStyle }, "Click to edit signature"));
|
|
6894
7842
|
if (layout === "vertical") {
|
|
6895
|
-
return /* @__PURE__ */
|
|
7843
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, greetingElement, imageElement && /* @__PURE__ */ React62.createElement("div", { style: { marginBottom: 12 } }, imageElement), textContent);
|
|
6896
7844
|
}
|
|
6897
|
-
return /* @__PURE__ */
|
|
7845
|
+
return /* @__PURE__ */ React62.createElement("div", { style: wrapperStyle }, greetingElement, /* @__PURE__ */ React62.createElement("table", { cellPadding: "0", cellSpacing: "0", border: 0, role: "presentation" }, /* @__PURE__ */ React62.createElement("tbody", null, /* @__PURE__ */ React62.createElement("tr", null, imageElement && /* @__PURE__ */ React62.createElement("td", { style: { verticalAlign: "middle", paddingRight: 16 } }, imageElement), /* @__PURE__ */ React62.createElement("td", { style: { verticalAlign: "middle" } }, textContent)))));
|
|
6898
7846
|
}
|
|
6899
7847
|
function getFontFamily10(fontFamily) {
|
|
6900
7848
|
switch (fontFamily) {
|
|
@@ -7038,7 +7986,7 @@ function TextEditor({ style, props }) {
|
|
|
7038
7986
|
if (textareaRef.current) adjustTextareaHeight(textareaRef.current);
|
|
7039
7987
|
}, [localText, isSelected]);
|
|
7040
7988
|
if (isSelected) {
|
|
7041
|
-
return /* @__PURE__ */
|
|
7989
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
7042
7990
|
"textarea",
|
|
7043
7991
|
{
|
|
7044
7992
|
ref: textareaRef,
|
|
@@ -7056,10 +8004,10 @@ function TextEditor({ style, props }) {
|
|
|
7056
8004
|
rows: 1,
|
|
7057
8005
|
onInput: (e) => adjustTextareaHeight(e.target)
|
|
7058
8006
|
}
|
|
7059
|
-
), /* @__PURE__ */
|
|
8007
|
+
), /* @__PURE__ */ React62.createElement(InlineFormattingToolbar, __spreadValues({ anchorEl: textareaRef.current }, toolbarProps)));
|
|
7060
8008
|
}
|
|
7061
8009
|
if (isMarkdown) {
|
|
7062
|
-
return /* @__PURE__ */
|
|
8010
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7063
8011
|
"div",
|
|
7064
8012
|
{
|
|
7065
8013
|
ref: displayRef,
|
|
@@ -7068,34 +8016,34 @@ function TextEditor({ style, props }) {
|
|
|
7068
8016
|
}
|
|
7069
8017
|
);
|
|
7070
8018
|
}
|
|
7071
|
-
return /* @__PURE__ */
|
|
8019
|
+
return /* @__PURE__ */ React62.createElement("div", { ref: displayRef, style: wStyle }, textContent);
|
|
7072
8020
|
}
|
|
7073
8021
|
|
|
7074
8022
|
// src/editor/core.tsx
|
|
7075
8023
|
var EDITOR_DICTIONARY = buildBlockConfigurationDictionary({
|
|
7076
8024
|
Avatar: {
|
|
7077
8025
|
schema: AvatarPropsSchema,
|
|
7078
|
-
Component: (props) => /* @__PURE__ */
|
|
8026
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(avatar_default, __spreadValues({}, props)))
|
|
7079
8027
|
},
|
|
7080
8028
|
Button: {
|
|
7081
8029
|
schema: ButtonPropsSchema,
|
|
7082
|
-
Component: (props) => /* @__PURE__ */
|
|
8030
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(ButtonEditor, __spreadValues({}, props)))
|
|
7083
8031
|
},
|
|
7084
8032
|
Container: {
|
|
7085
8033
|
schema: container_props_schema_default,
|
|
7086
|
-
Component: (props) => /* @__PURE__ */
|
|
8034
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(ContainerEditor, __spreadValues({}, props)))
|
|
7087
8035
|
},
|
|
7088
8036
|
ColumnsContainer: {
|
|
7089
8037
|
schema: columns_container_props_schema_default2,
|
|
7090
|
-
Component: (props) => /* @__PURE__ */
|
|
8038
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(ColumnsContainerEditor, __spreadValues({}, props)))
|
|
7091
8039
|
},
|
|
7092
8040
|
Heading: {
|
|
7093
8041
|
schema: HeadingPropsSchema,
|
|
7094
|
-
Component: (props) => /* @__PURE__ */
|
|
8042
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(HeadingEditor, __spreadValues({}, props)))
|
|
7095
8043
|
},
|
|
7096
8044
|
Html: {
|
|
7097
8045
|
schema: HtmlPropsSchema,
|
|
7098
|
-
Component: (props) => /* @__PURE__ */
|
|
8046
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(HtmlEditor, __spreadValues({}, props)))
|
|
7099
8047
|
},
|
|
7100
8048
|
Image: {
|
|
7101
8049
|
schema: ImagePropsSchema,
|
|
@@ -7107,28 +8055,28 @@ var EDITOR_DICTIONARY = buildBlockConfigurationDictionary({
|
|
|
7107
8055
|
linkHref: null
|
|
7108
8056
|
})
|
|
7109
8057
|
});
|
|
7110
|
-
return /* @__PURE__ */
|
|
8058
|
+
return /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(image_default, __spreadValues({}, props)));
|
|
7111
8059
|
}
|
|
7112
8060
|
},
|
|
7113
8061
|
Text: {
|
|
7114
8062
|
schema: TextPropsSchema,
|
|
7115
|
-
Component: (props) => /* @__PURE__ */
|
|
8063
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(TextEditor, __spreadValues({}, props)))
|
|
7116
8064
|
},
|
|
7117
8065
|
EmailLayout: {
|
|
7118
8066
|
schema: email_layout_props_schema_default,
|
|
7119
|
-
Component: (p) => /* @__PURE__ */
|
|
8067
|
+
Component: (p) => /* @__PURE__ */ React62.createElement(EmailLayoutEditor, __spreadValues({}, p))
|
|
7120
8068
|
},
|
|
7121
8069
|
Spacer: {
|
|
7122
8070
|
schema: SpacerPropsSchema,
|
|
7123
|
-
Component: (props) => /* @__PURE__ */
|
|
8071
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(spacer_default, __spreadValues({}, props)))
|
|
7124
8072
|
},
|
|
7125
8073
|
Divider: {
|
|
7126
8074
|
schema: DividerPropsSchema,
|
|
7127
|
-
Component: (props) => /* @__PURE__ */
|
|
8075
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(divider_default, __spreadValues({}, props)))
|
|
7128
8076
|
},
|
|
7129
8077
|
Signature: {
|
|
7130
8078
|
schema: SignaturePropsSchema,
|
|
7131
|
-
Component: (props) => /* @__PURE__ */
|
|
8079
|
+
Component: (props) => /* @__PURE__ */ React62.createElement(EditorBlockWrapper, null, /* @__PURE__ */ React62.createElement(SignatureEditor, __spreadValues({}, props)))
|
|
7132
8080
|
}
|
|
7133
8081
|
});
|
|
7134
8082
|
var EditorBlock2 = buildBlockComponent(EDITOR_DICTIONARY);
|
|
@@ -7144,7 +8092,7 @@ function EditorBlock({ id }) {
|
|
|
7144
8092
|
if (!block) {
|
|
7145
8093
|
throw new Error("Could not find block");
|
|
7146
8094
|
}
|
|
7147
|
-
return /* @__PURE__ */
|
|
8095
|
+
return /* @__PURE__ */ React62.createElement(EditorBlockContext.Provider, { value: id }, /* @__PURE__ */ React62.createElement(EditorBlock2, __spreadValues({}, block)));
|
|
7148
8096
|
}
|
|
7149
8097
|
function ToggleInspectorPanelButton() {
|
|
7150
8098
|
const inspectorDrawerOpen = useInspectorDrawerOpen();
|
|
@@ -7152,20 +8100,20 @@ function ToggleInspectorPanelButton() {
|
|
|
7152
8100
|
toggleInspectorDrawerOpen();
|
|
7153
8101
|
};
|
|
7154
8102
|
if (inspectorDrawerOpen) {
|
|
7155
|
-
return /* @__PURE__ */
|
|
8103
|
+
return /* @__PURE__ */ React62.createElement(IconButton, { onClick: handleClick }, /* @__PURE__ */ React62.createElement(LastPageOutlined, { fontSize: "small" }));
|
|
7156
8104
|
}
|
|
7157
|
-
return /* @__PURE__ */
|
|
8105
|
+
return /* @__PURE__ */ React62.createElement(IconButton, { onClick: handleClick }, /* @__PURE__ */ React62.createElement(AppRegistrationOutlined, { fontSize: "small" }));
|
|
7158
8106
|
}
|
|
7159
8107
|
function useIcon() {
|
|
7160
8108
|
const samplesDrawerOpen = useSamplesDrawerOpen();
|
|
7161
8109
|
if (samplesDrawerOpen) {
|
|
7162
|
-
return /* @__PURE__ */
|
|
8110
|
+
return /* @__PURE__ */ React62.createElement(FirstPageOutlined, { fontSize: "small" });
|
|
7163
8111
|
}
|
|
7164
|
-
return /* @__PURE__ */
|
|
8112
|
+
return /* @__PURE__ */ React62.createElement(MenuOutlined, { fontSize: "small" });
|
|
7165
8113
|
}
|
|
7166
8114
|
function ToggleSamplesPanelButton() {
|
|
7167
8115
|
const icon = useIcon();
|
|
7168
|
-
return /* @__PURE__ */
|
|
8116
|
+
return /* @__PURE__ */ React62.createElement(IconButton, { onClick: toggleSamplesDrawerOpen }, icon);
|
|
7169
8117
|
}
|
|
7170
8118
|
function formatHtml(html2, spaces = 2) {
|
|
7171
8119
|
try {
|
|
@@ -7227,7 +8175,7 @@ function HighlightedCodePanel({ type, value }) {
|
|
|
7227
8175
|
if (code === null) {
|
|
7228
8176
|
return null;
|
|
7229
8177
|
}
|
|
7230
|
-
return /* @__PURE__ */
|
|
8178
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7231
8179
|
"pre",
|
|
7232
8180
|
{
|
|
7233
8181
|
style: {
|
|
@@ -7253,17 +8201,17 @@ function HighlightedCodePanel({ type, value }) {
|
|
|
7253
8201
|
function HtmlPanel() {
|
|
7254
8202
|
const document2 = useDocument();
|
|
7255
8203
|
const code = useMemo(() => renderToStaticMarkup(document2, { rootBlockId: "root" }), [document2]);
|
|
7256
|
-
return /* @__PURE__ */
|
|
8204
|
+
return /* @__PURE__ */ React62.createElement(HighlightedCodePanel, { type: "html", value: code });
|
|
7257
8205
|
}
|
|
7258
8206
|
function JsonPanel() {
|
|
7259
8207
|
const document2 = useDocument();
|
|
7260
8208
|
const code = useMemo(() => JSON.stringify(document2, null, " "), [document2]);
|
|
7261
|
-
return /* @__PURE__ */
|
|
8209
|
+
return /* @__PURE__ */ React62.createElement(HighlightedCodePanel, { type: "json", value: code });
|
|
7262
8210
|
}
|
|
7263
8211
|
function TextPanel() {
|
|
7264
8212
|
const document2 = useDocument();
|
|
7265
8213
|
const text = useMemo(() => renderToText(document2, { rootBlockId: "root" }), [document2]);
|
|
7266
|
-
return /* @__PURE__ */
|
|
8214
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7267
8215
|
"pre",
|
|
7268
8216
|
{
|
|
7269
8217
|
style: {
|
|
@@ -7299,185 +8247,184 @@ function MainTabsGroup() {
|
|
|
7299
8247
|
setSelectedMainTab("editor");
|
|
7300
8248
|
}
|
|
7301
8249
|
};
|
|
7302
|
-
return /* @__PURE__ */
|
|
8250
|
+
return /* @__PURE__ */ React62.createElement(Tabs, { value: selectedMainTab, onChange: handleChange }, /* @__PURE__ */ React62.createElement(
|
|
7303
8251
|
Tab,
|
|
7304
8252
|
{
|
|
7305
8253
|
value: "editor",
|
|
7306
|
-
label: /* @__PURE__ */
|
|
8254
|
+
label: /* @__PURE__ */ React62.createElement(Tooltip, { title: "Edit" }, /* @__PURE__ */ React62.createElement(EditOutlined, { fontSize: "small" }))
|
|
7307
8255
|
}
|
|
7308
|
-
), /* @__PURE__ */
|
|
8256
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7309
8257
|
Tab,
|
|
7310
8258
|
{
|
|
7311
8259
|
value: "preview",
|
|
7312
|
-
label: /* @__PURE__ */
|
|
8260
|
+
label: /* @__PURE__ */ React62.createElement(Tooltip, { title: "Preview" }, /* @__PURE__ */ React62.createElement(PreviewOutlined, { fontSize: "small" }))
|
|
7313
8261
|
}
|
|
7314
|
-
), /* @__PURE__ */
|
|
8262
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7315
8263
|
Tab,
|
|
7316
8264
|
{
|
|
7317
8265
|
value: "html",
|
|
7318
|
-
label: /* @__PURE__ */
|
|
8266
|
+
label: /* @__PURE__ */ React62.createElement(Tooltip, { title: "HTML output" }, /* @__PURE__ */ React62.createElement(CodeOutlined, { fontSize: "small" }))
|
|
7319
8267
|
}
|
|
7320
|
-
), /* @__PURE__ */
|
|
8268
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7321
8269
|
Tab,
|
|
7322
8270
|
{
|
|
7323
8271
|
value: "text",
|
|
7324
|
-
label: /* @__PURE__ */
|
|
8272
|
+
label: /* @__PURE__ */ React62.createElement(Tooltip, { title: "Plain text output" }, /* @__PURE__ */ React62.createElement(SubjectOutlined, { fontSize: "small" }))
|
|
7325
8273
|
}
|
|
7326
|
-
), /* @__PURE__ */
|
|
8274
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7327
8275
|
Tab,
|
|
7328
8276
|
{
|
|
7329
8277
|
value: "json",
|
|
7330
|
-
label: /* @__PURE__ */
|
|
8278
|
+
label: /* @__PURE__ */ React62.createElement(Tooltip, { title: "JSON output" }, /* @__PURE__ */ React62.createElement(DataObjectOutlined, { fontSize: "small" }))
|
|
7331
8279
|
}
|
|
7332
8280
|
));
|
|
7333
8281
|
}
|
|
7334
|
-
function
|
|
7335
|
-
const {
|
|
8282
|
+
function SaveBar({ loadTemplates, saveAs }) {
|
|
8283
|
+
const {
|
|
8284
|
+
saveTemplate,
|
|
8285
|
+
currentTemplateId,
|
|
8286
|
+
currentTemplateName,
|
|
8287
|
+
currentTemplateKind,
|
|
8288
|
+
setCurrentTemplate,
|
|
8289
|
+
loadTemplate: ctxLoadTemplate
|
|
8290
|
+
} = useEmailEditor();
|
|
7336
8291
|
const { showMessage } = useSnackbar();
|
|
7337
|
-
const [saveDialogOpen, setSaveDialogOpen] = useState(false);
|
|
7338
8292
|
const document2 = useDocument();
|
|
8293
|
+
const [dialogMode, setDialogMode] = useState(null);
|
|
8294
|
+
const [nameError, setNameError] = useState(null);
|
|
8295
|
+
const hasOpenRow = Boolean(currentTemplateId);
|
|
7339
8296
|
const isSample = currentTemplateKind === "sample";
|
|
7340
|
-
const
|
|
8297
|
+
const primaryLabel = hasOpenRow ? "Save" : "Save as new\u2026";
|
|
8298
|
+
const handlePrimary = () => __async(null, null, function* () {
|
|
7341
8299
|
try {
|
|
7342
|
-
if (!
|
|
7343
|
-
|
|
8300
|
+
if (!hasOpenRow) {
|
|
8301
|
+
setNameError(null);
|
|
8302
|
+
setDialogMode("save-as");
|
|
7344
8303
|
return;
|
|
7345
8304
|
}
|
|
7346
8305
|
saveTemplate();
|
|
7347
|
-
showMessage("
|
|
7348
|
-
if (loadTemplates)
|
|
7349
|
-
|
|
7350
|
-
|
|
7351
|
-
|
|
7352
|
-
console.error("Error saving template:", error);
|
|
7353
|
-
showMessage("Error saving template");
|
|
8306
|
+
showMessage(isSample ? "Sample saved" : "Template saved");
|
|
8307
|
+
if (loadTemplates) yield loadTemplates();
|
|
8308
|
+
} catch (e) {
|
|
8309
|
+
console.error("Error saving:", e);
|
|
8310
|
+
showMessage("Error saving");
|
|
7354
8311
|
}
|
|
7355
8312
|
});
|
|
7356
|
-
const handleSaveAs = (
|
|
8313
|
+
const handleSaveAs = (name) => __async(null, null, function* () {
|
|
8314
|
+
if (!saveAs) return false;
|
|
7357
8315
|
try {
|
|
7358
|
-
|
|
7359
|
-
|
|
7360
|
-
|
|
7361
|
-
|
|
7362
|
-
|
|
7363
|
-
|
|
7364
|
-
|
|
7365
|
-
|
|
7366
|
-
|
|
7367
|
-
|
|
7368
|
-
|
|
7369
|
-
|
|
7370
|
-
} catch (error) {
|
|
7371
|
-
console.error("Error saving template:", error);
|
|
7372
|
-
showMessage("Error saving template");
|
|
8316
|
+
const starterContent = dialogMode === "new-blank" ? empty_email_message_default : document2;
|
|
8317
|
+
const { id, slug } = yield saveAs(name, buildSavePayload(starterContent));
|
|
8318
|
+
resetDocument(starterContent);
|
|
8319
|
+
setCurrentTemplate(id, slug, "template");
|
|
8320
|
+
ctxLoadTemplate(starterContent, id, slug, "template");
|
|
8321
|
+
if (loadTemplates) yield loadTemplates();
|
|
8322
|
+
showMessage(dialogMode === "new-blank" ? "New template created" : "Template saved");
|
|
8323
|
+
window.location.hash = `#template/${id}`;
|
|
8324
|
+
return true;
|
|
8325
|
+
} catch (e) {
|
|
8326
|
+
console.error("Error in saveAs:", e);
|
|
8327
|
+
showMessage("Error saving");
|
|
7373
8328
|
return false;
|
|
7374
8329
|
}
|
|
7375
8330
|
});
|
|
7376
|
-
return /* @__PURE__ */
|
|
7377
|
-
|
|
8331
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
8332
|
+
Box,
|
|
7378
8333
|
{
|
|
7379
|
-
onClick: handleSave,
|
|
7380
8334
|
sx: {
|
|
7381
|
-
|
|
7382
|
-
|
|
7383
|
-
|
|
7384
|
-
|
|
8335
|
+
position: "sticky",
|
|
8336
|
+
bottom: 0,
|
|
8337
|
+
display: "flex",
|
|
8338
|
+
justifyContent: "center",
|
|
8339
|
+
pointerEvents: "none",
|
|
8340
|
+
zIndex: 2,
|
|
8341
|
+
pb: 3
|
|
7385
8342
|
}
|
|
7386
8343
|
},
|
|
7387
|
-
/* @__PURE__ */
|
|
7388
|
-
|
|
7389
|
-
|
|
7390
|
-
|
|
7391
|
-
|
|
7392
|
-
|
|
7393
|
-
|
|
7394
|
-
|
|
7395
|
-
|
|
7396
|
-
|
|
7397
|
-
|
|
7398
|
-
|
|
7399
|
-
|
|
7400
|
-
const { showMessage } = useSnackbar();
|
|
7401
|
-
const [saveDialogOpen, setSaveDialogOpen] = useState(false);
|
|
7402
|
-
const [templates, setTemplates] = useState([]);
|
|
7403
|
-
const [nameError, setNameError] = useState(null);
|
|
7404
|
-
const fetchTemplates = () => __async(null, null, function* () {
|
|
7405
|
-
if (loadTemplates) {
|
|
7406
|
-
try {
|
|
7407
|
-
const result = yield loadTemplates();
|
|
7408
|
-
setTemplates(result);
|
|
7409
|
-
return result;
|
|
7410
|
-
} catch (error) {
|
|
7411
|
-
console.error("Error loading templates:", error);
|
|
7412
|
-
}
|
|
7413
|
-
}
|
|
7414
|
-
return [];
|
|
7415
|
-
});
|
|
7416
|
-
const handleNewTemplate = () => __async(null, null, function* () {
|
|
7417
|
-
yield fetchTemplates();
|
|
7418
|
-
setNameError(null);
|
|
7419
|
-
setSaveDialogOpen(true);
|
|
7420
|
-
});
|
|
7421
|
-
const validateTemplateName = (name) => {
|
|
7422
|
-
const nameExists = templates.some(
|
|
7423
|
-
(template) => template.slug.toLowerCase() === name.toLowerCase()
|
|
7424
|
-
);
|
|
7425
|
-
if (nameExists) {
|
|
7426
|
-
setNameError("A template with this name already exists");
|
|
7427
|
-
return false;
|
|
7428
|
-
}
|
|
7429
|
-
setNameError(null);
|
|
7430
|
-
return true;
|
|
7431
|
-
};
|
|
7432
|
-
const handleNameChange = () => {
|
|
7433
|
-
setNameError(null);
|
|
7434
|
-
};
|
|
7435
|
-
const handleCreateTemplate = (templateName) => __async(null, null, function* () {
|
|
7436
|
-
if (!validateTemplateName(templateName)) {
|
|
7437
|
-
return false;
|
|
7438
|
-
}
|
|
7439
|
-
try {
|
|
7440
|
-
if (saveAs) {
|
|
7441
|
-
const { id: templateId, slug } = yield saveAs(templateName, buildSavePayload(empty_email_message_default));
|
|
7442
|
-
resetDocument(empty_email_message_default);
|
|
7443
|
-
setCurrentTemplate(templateId, slug, "template");
|
|
7444
|
-
loadTemplate(empty_email_message_default, templateId, slug, "template");
|
|
7445
|
-
if (loadTemplates) {
|
|
7446
|
-
yield loadTemplates();
|
|
7447
|
-
}
|
|
7448
|
-
showMessage("New template created!");
|
|
7449
|
-
window.location.hash = `#template/${templateId}`;
|
|
7450
|
-
return true;
|
|
7451
|
-
}
|
|
7452
|
-
} catch (error) {
|
|
7453
|
-
console.error("Error creating template:", error);
|
|
7454
|
-
showMessage("Error creating template");
|
|
7455
|
-
}
|
|
7456
|
-
return false;
|
|
7457
|
-
});
|
|
7458
|
-
return /* @__PURE__ */ React58.createElement(React58.Fragment, null, /* @__PURE__ */ React58.createElement(
|
|
7459
|
-
IconButton,
|
|
7460
|
-
{
|
|
7461
|
-
onClick: handleNewTemplate,
|
|
7462
|
-
sx: {
|
|
7463
|
-
backgroundColor: "grey.100",
|
|
7464
|
-
"&:hover": {
|
|
7465
|
-
backgroundColor: "grey.200"
|
|
8344
|
+
/* @__PURE__ */ React62.createElement(
|
|
8345
|
+
Box,
|
|
8346
|
+
{
|
|
8347
|
+
sx: {
|
|
8348
|
+
pointerEvents: "auto",
|
|
8349
|
+
display: "inline-flex",
|
|
8350
|
+
alignItems: "center",
|
|
8351
|
+
gap: 1.25,
|
|
8352
|
+
px: 2,
|
|
8353
|
+
py: 1.25,
|
|
8354
|
+
backgroundColor: "background.paper",
|
|
8355
|
+
borderRadius: 999,
|
|
8356
|
+
boxShadow: "0 2px 6px rgba(33, 36, 67, 0.06), 0 16px 40px rgba(33, 36, 67, 0.14)"
|
|
7466
8357
|
}
|
|
7467
|
-
}
|
|
7468
|
-
|
|
7469
|
-
|
|
7470
|
-
|
|
8358
|
+
},
|
|
8359
|
+
hasOpenRow && currentTemplateName && /* @__PURE__ */ React62.createElement(
|
|
8360
|
+
Box,
|
|
8361
|
+
{
|
|
8362
|
+
sx: {
|
|
8363
|
+
pl: 1,
|
|
8364
|
+
pr: 1,
|
|
8365
|
+
fontSize: 14,
|
|
8366
|
+
color: "text.secondary",
|
|
8367
|
+
maxWidth: 220,
|
|
8368
|
+
whiteSpace: "nowrap",
|
|
8369
|
+
overflow: "hidden",
|
|
8370
|
+
textOverflow: "ellipsis"
|
|
8371
|
+
},
|
|
8372
|
+
title: currentTemplateName
|
|
8373
|
+
},
|
|
8374
|
+
isSample ? "Sample \xB7 " : "",
|
|
8375
|
+
/* @__PURE__ */ React62.createElement(Box, { component: "span", sx: { color: "text.primary", fontWeight: 600 } }, currentTemplateName)
|
|
8376
|
+
),
|
|
8377
|
+
/* @__PURE__ */ React62.createElement(Tooltip, { title: hasOpenRow ? `Save changes${isSample ? " to this sample" : ""}` : "Save as a new template" }, /* @__PURE__ */ React62.createElement(
|
|
8378
|
+
Button$1,
|
|
8379
|
+
{
|
|
8380
|
+
variant: "contained",
|
|
8381
|
+
size: "large",
|
|
8382
|
+
startIcon: /* @__PURE__ */ React62.createElement(SaveOutlined, null),
|
|
8383
|
+
onClick: handlePrimary,
|
|
8384
|
+
sx: { borderRadius: 999, textTransform: "none", px: 2.5, fontSize: 15, fontWeight: 600 }
|
|
8385
|
+
},
|
|
8386
|
+
primaryLabel
|
|
8387
|
+
)),
|
|
8388
|
+
hasOpenRow && saveAs && /* @__PURE__ */ React62.createElement(Tooltip, { title: "Save as a new template" }, /* @__PURE__ */ React62.createElement(
|
|
8389
|
+
Button$1,
|
|
8390
|
+
{
|
|
8391
|
+
variant: "outlined",
|
|
8392
|
+
size: "large",
|
|
8393
|
+
startIcon: /* @__PURE__ */ React62.createElement(SaveAsOutlined, null),
|
|
8394
|
+
onClick: () => {
|
|
8395
|
+
setNameError(null);
|
|
8396
|
+
setDialogMode("save-as");
|
|
8397
|
+
},
|
|
8398
|
+
sx: { borderRadius: 999, textTransform: "none", px: 2, fontSize: 14 }
|
|
8399
|
+
},
|
|
8400
|
+
"Save as\u2026"
|
|
8401
|
+
)),
|
|
8402
|
+
saveAs && /* @__PURE__ */ React62.createElement(Tooltip, { title: "Start a fresh template" }, /* @__PURE__ */ React62.createElement(
|
|
8403
|
+
Button$1,
|
|
8404
|
+
{
|
|
8405
|
+
variant: "text",
|
|
8406
|
+
size: "large",
|
|
8407
|
+
startIcon: /* @__PURE__ */ React62.createElement(AddOutlined, null),
|
|
8408
|
+
onClick: () => {
|
|
8409
|
+
setNameError(null);
|
|
8410
|
+
setDialogMode("new-blank");
|
|
8411
|
+
},
|
|
8412
|
+
sx: { borderRadius: 999, textTransform: "none", px: 2, fontSize: 14, color: "text.secondary" }
|
|
8413
|
+
},
|
|
8414
|
+
"New"
|
|
8415
|
+
))
|
|
8416
|
+
)
|
|
8417
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7471
8418
|
SaveTemplateDialog,
|
|
7472
8419
|
{
|
|
7473
|
-
open:
|
|
8420
|
+
open: dialogMode !== null,
|
|
7474
8421
|
onClose: () => {
|
|
7475
|
-
|
|
8422
|
+
setDialogMode(null);
|
|
7476
8423
|
setNameError(null);
|
|
7477
8424
|
},
|
|
7478
|
-
onSave:
|
|
7479
|
-
onNameChange:
|
|
7480
|
-
defaultName: "New Template",
|
|
8425
|
+
onSave: handleSaveAs,
|
|
8426
|
+
onNameChange: () => setNameError(null),
|
|
8427
|
+
defaultName: dialogMode === "new-blank" ? "New Template" : currentTemplateName ? `${currentTemplateName} (Copy)` : "New Template",
|
|
7481
8428
|
error: nameError
|
|
7482
8429
|
}
|
|
7483
8430
|
));
|
|
@@ -7505,7 +8452,7 @@ function SubjectInput() {
|
|
|
7505
8452
|
selectionEnd: (_b = target.selectionEnd) != null ? _b : target.value.length
|
|
7506
8453
|
});
|
|
7507
8454
|
};
|
|
7508
|
-
return /* @__PURE__ */
|
|
8455
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7509
8456
|
Box,
|
|
7510
8457
|
{
|
|
7511
8458
|
sx: {
|
|
@@ -7522,8 +8469,8 @@ function SubjectInput() {
|
|
|
7522
8469
|
gap: 1.5
|
|
7523
8470
|
}
|
|
7524
8471
|
},
|
|
7525
|
-
/* @__PURE__ */
|
|
7526
|
-
/* @__PURE__ */
|
|
8472
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { color: "text.secondary", fontSize: 13, fontWeight: 600, minWidth: 56 } }, "Subject"),
|
|
8473
|
+
/* @__PURE__ */ React62.createElement(
|
|
7527
8474
|
InputBase,
|
|
7528
8475
|
{
|
|
7529
8476
|
fullWidth: true,
|
|
@@ -7549,7 +8496,7 @@ function SubjectPreview() {
|
|
|
7549
8496
|
if (!subject) return null;
|
|
7550
8497
|
const samples = buildSampleValueMap((_b = data.variables) != null ? _b : []);
|
|
7551
8498
|
const rendered = substituteSampleValues(subject, samples);
|
|
7552
|
-
return /* @__PURE__ */
|
|
8499
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7553
8500
|
Box,
|
|
7554
8501
|
{
|
|
7555
8502
|
sx: {
|
|
@@ -7566,8 +8513,8 @@ function SubjectPreview() {
|
|
|
7566
8513
|
gap: 1.5
|
|
7567
8514
|
}
|
|
7568
8515
|
},
|
|
7569
|
-
/* @__PURE__ */
|
|
7570
|
-
/* @__PURE__ */
|
|
8516
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { color: "text.secondary", fontSize: 13, fontWeight: 600, minWidth: 56 } }, "Subject"),
|
|
8517
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { fontSize: 14 } }, rendered)
|
|
7571
8518
|
);
|
|
7572
8519
|
}
|
|
7573
8520
|
function generateId3() {
|
|
@@ -7640,7 +8587,7 @@ function ImageDropPasteHandler({ enabled, children }) {
|
|
|
7640
8587
|
window.addEventListener("paste", handlePaste);
|
|
7641
8588
|
return () => window.removeEventListener("paste", handlePaste);
|
|
7642
8589
|
}, [active, uploadImage]);
|
|
7643
|
-
if (!active) return /* @__PURE__ */
|
|
8590
|
+
if (!active) return /* @__PURE__ */ React62.createElement(React62.Fragment, null, children);
|
|
7644
8591
|
const onDragEnter = (e) => {
|
|
7645
8592
|
var _a, _b;
|
|
7646
8593
|
if (!Array.from((_b = (_a = e.dataTransfer) == null ? void 0 : _a.items) != null ? _b : []).some((i) => i.kind === "file")) return;
|
|
@@ -7673,7 +8620,7 @@ function ImageDropPasteHandler({ enabled, children }) {
|
|
|
7673
8620
|
setUploading(false);
|
|
7674
8621
|
}
|
|
7675
8622
|
});
|
|
7676
|
-
return /* @__PURE__ */
|
|
8623
|
+
return /* @__PURE__ */ React62.createElement(
|
|
7677
8624
|
Box,
|
|
7678
8625
|
{
|
|
7679
8626
|
ref: wrapperRef,
|
|
@@ -7684,7 +8631,7 @@ function ImageDropPasteHandler({ enabled, children }) {
|
|
|
7684
8631
|
sx: { position: "relative" }
|
|
7685
8632
|
},
|
|
7686
8633
|
children,
|
|
7687
|
-
(dragging || uploading) && /* @__PURE__ */
|
|
8634
|
+
(dragging || uploading) && /* @__PURE__ */ React62.createElement(
|
|
7688
8635
|
Box,
|
|
7689
8636
|
{
|
|
7690
8637
|
sx: {
|
|
@@ -7703,17 +8650,20 @@ function ImageDropPasteHandler({ enabled, children }) {
|
|
|
7703
8650
|
zIndex: 10
|
|
7704
8651
|
}
|
|
7705
8652
|
},
|
|
7706
|
-
/* @__PURE__ */
|
|
8653
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { display: "flex", alignItems: "center", gap: 1, fontWeight: 600, fontSize: 14 } }, /* @__PURE__ */ React62.createElement(CloudUploadOutlined, null), uploading ? "Uploading\u2026" : "Drop image to insert")
|
|
7707
8654
|
)
|
|
7708
8655
|
);
|
|
7709
8656
|
}
|
|
7710
8657
|
|
|
7711
8658
|
// src/app/email-canvas/index.tsx
|
|
8659
|
+
var WORKSPACE_SOLID = "#e7e8ec";
|
|
8660
|
+
var WORKSPACE_CHECKERBOARD = "repeating-conic-gradient(#eceef2 0% 25%, #dfe1e6 0% 50%) 50% / 24px 24px";
|
|
7712
8661
|
function TemplatePanel2({ loadTemplates, saveAs, samplesDrawerEnabled = true }) {
|
|
7713
8662
|
const document2 = useDocument();
|
|
7714
8663
|
const selectedMainTab = useSelectedMainTab();
|
|
7715
8664
|
const selectedScreenSize = useSelectedScreenSize();
|
|
7716
8665
|
const persistenceEnabled = usePersistenceEnabled();
|
|
8666
|
+
const workspaceBackground = useWorkspaceBackground();
|
|
7717
8667
|
let mainBoxSx = {
|
|
7718
8668
|
height: "100%"
|
|
7719
8669
|
};
|
|
@@ -7740,7 +8690,7 @@ function TemplatePanel2({ loadTemplates, saveAs, samplesDrawerEnabled = true })
|
|
|
7740
8690
|
var _a;
|
|
7741
8691
|
switch (selectedMainTab) {
|
|
7742
8692
|
case "editor":
|
|
7743
|
-
return /* @__PURE__ */
|
|
8693
|
+
return /* @__PURE__ */ React62.createElement(Box, { sx: mainBoxSx }, /* @__PURE__ */ React62.createElement(EditorBlock, { id: "root" }));
|
|
7744
8694
|
case "preview": {
|
|
7745
8695
|
const rootBlock = document2.root;
|
|
7746
8696
|
const layoutData = rootBlock && rootBlock.type === "EmailLayout" ? rootBlock.data : void 0;
|
|
@@ -7748,18 +8698,18 @@ function TemplatePanel2({ loadTemplates, saveAs, samplesDrawerEnabled = true })
|
|
|
7748
8698
|
(_a = layoutData == null ? void 0 : layoutData.variables) != null ? _a : []
|
|
7749
8699
|
);
|
|
7750
8700
|
const previewDoc = applySampleValuesToDocument(document2, samples);
|
|
7751
|
-
return /* @__PURE__ */
|
|
8701
|
+
return /* @__PURE__ */ React62.createElement(Box, { sx: mainBoxSx }, /* @__PURE__ */ React62.createElement(Reader, { document: previewDoc, rootBlockId: "root" }));
|
|
7752
8702
|
}
|
|
7753
8703
|
case "html":
|
|
7754
|
-
return /* @__PURE__ */
|
|
8704
|
+
return /* @__PURE__ */ React62.createElement(HtmlPanel, null);
|
|
7755
8705
|
case "text":
|
|
7756
|
-
return /* @__PURE__ */
|
|
8706
|
+
return /* @__PURE__ */ React62.createElement(TextPanel, null);
|
|
7757
8707
|
case "json":
|
|
7758
|
-
return /* @__PURE__ */
|
|
8708
|
+
return /* @__PURE__ */ React62.createElement(JsonPanel, null);
|
|
7759
8709
|
}
|
|
7760
8710
|
};
|
|
7761
8711
|
const showSaveButtons = persistenceEnabled;
|
|
7762
|
-
return /* @__PURE__ */
|
|
8712
|
+
return /* @__PURE__ */ React62.createElement(React62.Fragment, null, /* @__PURE__ */ React62.createElement(
|
|
7763
8713
|
Stack,
|
|
7764
8714
|
{
|
|
7765
8715
|
sx: {
|
|
@@ -7776,13 +8726,28 @@ function TemplatePanel2({ loadTemplates, saveAs, samplesDrawerEnabled = true })
|
|
|
7776
8726
|
justifyContent: "space-between",
|
|
7777
8727
|
alignItems: "center"
|
|
7778
8728
|
},
|
|
7779
|
-
samplesDrawerEnabled && /* @__PURE__ */
|
|
7780
|
-
/* @__PURE__ */
|
|
7781
|
-
/* @__PURE__ */
|
|
7782
|
-
), selectedMainTab === "editor" && /* @__PURE__ */
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
8729
|
+
samplesDrawerEnabled && /* @__PURE__ */ React62.createElement(ToggleSamplesPanelButton, null),
|
|
8730
|
+
/* @__PURE__ */ React62.createElement(Stack, { px: 2, direction: "row", gap: 2, width: "100%", justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 2 }, /* @__PURE__ */ React62.createElement(MainTabsGroup, null)), /* @__PURE__ */ React62.createElement(Stack, { direction: "row", spacing: 2 }, /* @__PURE__ */ React62.createElement(ToggleButtonGroup, { value: selectedScreenSize, exclusive: true, size: "small", onChange: handleScreenSizeChange }, /* @__PURE__ */ React62.createElement(ToggleButton, { value: "desktop" }, /* @__PURE__ */ React62.createElement(Tooltip, { title: "Desktop view" }, /* @__PURE__ */ React62.createElement(MonitorOutlined, { fontSize: "small" }))), /* @__PURE__ */ React62.createElement(ToggleButton, { value: "mobile" }, /* @__PURE__ */ React62.createElement(Tooltip, { title: "Mobile view" }, /* @__PURE__ */ React62.createElement(PhoneIphoneOutlined, { fontSize: "small" })))))),
|
|
8731
|
+
/* @__PURE__ */ React62.createElement(ToggleInspectorPanelButton, null)
|
|
8732
|
+
), selectedMainTab === "editor" && /* @__PURE__ */ React62.createElement(SubjectInput, null), selectedMainTab === "preview" && /* @__PURE__ */ React62.createElement(SubjectPreview, null), /* @__PURE__ */ React62.createElement(ImageDropPasteHandler, { enabled: selectedMainTab === "editor" }, /* @__PURE__ */ React62.createElement(
|
|
8733
|
+
Box,
|
|
8734
|
+
{
|
|
8735
|
+
sx: {
|
|
8736
|
+
flexGrow: 1,
|
|
8737
|
+
display: "flex",
|
|
8738
|
+
flexDirection: "column",
|
|
8739
|
+
paddingBottom: "16px",
|
|
8740
|
+
minWidth: 370,
|
|
8741
|
+
// Fills to the bottom of the viewport in editor mode so the
|
|
8742
|
+
// workspace gray doesn't end midway under a short email.
|
|
8743
|
+
// 49px toolbar + 49px subject bar = 98px fixed chrome above.
|
|
8744
|
+
minHeight: selectedMainTab === "editor" ? "calc(100vh - 98px)" : void 0,
|
|
8745
|
+
background: selectedMainTab === "editor" ? workspaceBackground === "checkerboard" ? WORKSPACE_CHECKERBOARD : WORKSPACE_SOLID : void 0
|
|
8746
|
+
}
|
|
8747
|
+
},
|
|
8748
|
+
/* @__PURE__ */ React62.createElement(Box, { sx: { flexGrow: 1 } }, renderMainPanel()),
|
|
8749
|
+
showSaveButtons && selectedMainTab === "editor" && /* @__PURE__ */ React62.createElement(SaveBar, { loadTemplates, saveAs })
|
|
8750
|
+
)));
|
|
7786
8751
|
}
|
|
7787
8752
|
|
|
7788
8753
|
// src/app/index.tsx
|
|
@@ -7863,7 +8828,7 @@ var EmailEditorInternal = forwardRef((props, ref) => {
|
|
|
7863
8828
|
return getDocument();
|
|
7864
8829
|
}
|
|
7865
8830
|
}));
|
|
7866
|
-
return /* @__PURE__ */
|
|
8831
|
+
return /* @__PURE__ */ React62.createElement(Stack, { position: "relative", id: "drawer-container", sx: { minHeight } }, /* @__PURE__ */ React62.createElement(
|
|
7867
8832
|
InspectorDrawer,
|
|
7868
8833
|
{
|
|
7869
8834
|
enterDuration: drawerEnterDuration,
|
|
@@ -7871,7 +8836,7 @@ var EmailEditorInternal = forwardRef((props, ref) => {
|
|
|
7871
8836
|
deleteTemplate,
|
|
7872
8837
|
copyTemplate
|
|
7873
8838
|
}
|
|
7874
|
-
), /* @__PURE__ */
|
|
8839
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7875
8840
|
SamplesDrawer,
|
|
7876
8841
|
{
|
|
7877
8842
|
enterDuration: drawerEnterDuration,
|
|
@@ -7887,7 +8852,7 @@ var EmailEditorInternal = forwardRef((props, ref) => {
|
|
|
7887
8852
|
setTemplateKind,
|
|
7888
8853
|
saveAs
|
|
7889
8854
|
}
|
|
7890
|
-
), /* @__PURE__ */
|
|
8855
|
+
), /* @__PURE__ */ React62.createElement(
|
|
7891
8856
|
Stack,
|
|
7892
8857
|
{
|
|
7893
8858
|
sx: {
|
|
@@ -7896,7 +8861,7 @@ var EmailEditorInternal = forwardRef((props, ref) => {
|
|
|
7896
8861
|
transition: [marginLeftTransition, marginRightTransition].join(", ")
|
|
7897
8862
|
}
|
|
7898
8863
|
},
|
|
7899
|
-
/* @__PURE__ */
|
|
8864
|
+
/* @__PURE__ */ React62.createElement(TemplatePanel2, { loadTemplates, saveAs, samplesDrawerEnabled })
|
|
7900
8865
|
));
|
|
7901
8866
|
});
|
|
7902
8867
|
var EmailEditor = forwardRef((props, ref) => {
|
|
@@ -7940,7 +8905,7 @@ var EmailEditor = forwardRef((props, ref) => {
|
|
|
7940
8905
|
() => ({ uploadImage, loadImages, deleteImage }),
|
|
7941
8906
|
[uploadImage, loadImages, deleteImage]
|
|
7942
8907
|
);
|
|
7943
|
-
return /* @__PURE__ */
|
|
8908
|
+
return /* @__PURE__ */ React62.createElement(ThemeProvider, { theme: theme || theme_default }, /* @__PURE__ */ React62.createElement(CssBaseline, null), /* @__PURE__ */ React62.createElement("div", { style: { height: "100%", overflow: "auto" } }, /* @__PURE__ */ React62.createElement(SnackbarProvider, null, /* @__PURE__ */ React62.createElement(ImageCallbacksProvider, { callbacks: imageCallbacks }, /* @__PURE__ */ React62.createElement(
|
|
7944
8909
|
EmailEditorProvider,
|
|
7945
8910
|
{
|
|
7946
8911
|
initialTemplate: resolvedTemplate,
|
|
@@ -7949,7 +8914,7 @@ var EmailEditor = forwardRef((props, ref) => {
|
|
|
7949
8914
|
onSave,
|
|
7950
8915
|
onChange
|
|
7951
8916
|
},
|
|
7952
|
-
/* @__PURE__ */
|
|
8917
|
+
/* @__PURE__ */ React62.createElement(
|
|
7953
8918
|
EmailEditorInternal,
|
|
7954
8919
|
{
|
|
7955
8920
|
ref,
|
|
@@ -7973,6 +8938,6 @@ var EmailEditor = forwardRef((props, ref) => {
|
|
|
7973
8938
|
EmailEditor.displayName = "EmailEditor";
|
|
7974
8939
|
EmailEditorInternal.displayName = "EmailEditorInternal";
|
|
7975
8940
|
|
|
7976
|
-
export { avatar_default as Avatar, AvatarProps, AvatarPropsDefaults, AvatarPropsSchema, BlockConfiguration, button_default as Button, ButtonProps, ButtonPropsDefaults, ButtonPropsSchema, columns_container_default as ColumnsContainer, ColumnsContainerProps, ColumnsContainerPropsSchema, ColumnsContainerReader, container_default as Container, ContainerProps, ContainerPropsSchema, ContainerReader, divider_default as Divider, DividerProps, DividerPropsDefaults, DividerPropsSchema, DocumentBlocksDictionary, EmailEditor, EmailEditorProvider, EmailLayoutPropsSchema, EmailLayoutReader, EmailMarkdown, heading_default as Heading, HeadingProps, HeadingPropsDefaults, HeadingPropsSchema, html_default as Html, HtmlProps, HtmlPropsSchema, image_default as Image, ImageProps, ImagePropsSchema, Reader, ReaderBlock, ReaderBlockSchema, ReaderDocumentSchema, signature_default as Signature, SignatureProps, SignaturePropsDefaults, SignaturePropsSchema, spacer_default as Spacer, SpacerProps, SpacerPropsDefaults, SpacerPropsSchema, TemplateVariableSchema, Text, TextProps, TextPropsDefaults, TextPropsSchema, buildBlockComponent, buildBlockConfigurationDictionary, buildBlockConfigurationSchema, htmlToEditorConfig, renderToStaticMarkup, renderToText, theme_default as theme, useEmailEditor };
|
|
8941
|
+
export { avatar_default as Avatar, AvatarProps, AvatarPropsDefaults, AvatarPropsSchema, BlockConfiguration, button_default as Button, ButtonProps, ButtonPropsDefaults, ButtonPropsSchema, columns_container_default as ColumnsContainer, ColumnsContainerProps, ColumnsContainerPropsSchema, ColumnsContainerReader, container_default as Container, ContainerProps, ContainerPropsSchema, ContainerReader, divider_default as Divider, DividerProps, DividerPropsDefaults, DividerPropsSchema, DocumentBlocksDictionary, EmailEditor, EmailEditorProvider, EmailLayoutPropsSchema, EmailLayoutReader, EmailMarkdown, heading_default as Heading, HeadingProps, HeadingPropsDefaults, HeadingPropsSchema, html_default as Html, HtmlProps, HtmlPropsSchema, image_default as Image, ImageProps, ImagePropsSchema, Reader, ReaderBlock, ReaderBlockSchema, ReaderDocumentSchema, signature_default as Signature, SignatureProps, SignaturePropsDefaults, SignaturePropsSchema, spacer_default as Spacer, SpacerProps, SpacerPropsDefaults, SpacerPropsSchema, TemplateVariableSchema, Text, TextProps, TextPropsDefaults, TextPropsSchema, buildBlockComponent, buildBlockConfigurationDictionary, buildBlockConfigurationSchema, editorHandlebars, evaluateHandlebars, htmlToEditorConfig, renderToStaticMarkup, renderToText, theme_default as theme, useEmailEditor };
|
|
7977
8942
|
//# sourceMappingURL=index.js.map
|
|
7978
8943
|
//# sourceMappingURL=index.js.map
|