easy-email-pro-theme 1.50.2 → 1.50.3

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/lib/index.js CHANGED
@@ -63,7 +63,7 @@ import { cloneDeep, get, isEqual, set, omit as omit$2, merge as merge$1, debounc
63
63
  import { Editor, Range, Node, Transforms, Path, Text as Text$2, createEditor } from "slate";
64
64
  import { nanoid } from "nanoid";
65
65
  import { Form, Input, Modal, Collapse, Space, Empty, Card, Grid, Button as Button$2, Drawer, Switch, Typography as Typography$1, Tabs, Radio, Divider as Divider$2, Alert, Popconfirm, Tooltip, Message, PageHeader, Spin, Layout as Layout$2, Popover, Select as Select$1, Slider, InputNumber, Tag, Link as Link$3, List as List$1, Skeleton, Trigger } from "@arco-design/web-react";
66
- import { IconPlus, IconDelete, IconEdit, IconLeft, IconCopy, IconUndo, IconRedo, IconMinus, IconEye, IconSubscribeAdd, IconClose, IconCheckCircleFill, IconDragArrow, IconLock, IconUnlock, IconQuestionCircle, IconLink, IconCloud, IconSend, IconDown } from "@arco-design/web-react/icon";
66
+ import { IconPlus, IconDelete, IconEdit, IconLeft, IconCopy, IconUndo, IconRedo, IconMinus, IconEye, IconSubscribeAdd, IconClose, IconCheckCircleFill, IconDragArrow, IconLock, IconUnlock, IconQuestionCircle, IconLink, IconCloud, IconDragDotVertical, IconSend, IconDown } from "@arco-design/web-react/icon";
67
67
  import { unstable_batchedUpdates, createPortal } from "react-dom";
68
68
  import mjml from "mjml-browser";
69
69
  import { HistoryEditor } from "slate-history";
@@ -29936,6 +29936,7 @@ var FieldType = /* @__PURE__ */ ((FieldType2) => {
29936
29936
  FieldType2["IMAGE"] = "image";
29937
29937
  FieldType2["SLIDER"] = "slider";
29938
29938
  FieldType2["RICHTEXT"] = "richtext";
29939
+ FieldType2["SWITCH"] = "switch";
29939
29940
  return FieldType2;
29940
29941
  })(FieldType || {});
29941
29942
  const getFieldByType = (type) => {
@@ -29946,7 +29947,8 @@ const getFieldByType = (type) => {
29946
29947
  [FieldType.COLOR]: AttributeField.ColorPickerField,
29947
29948
  [FieldType.IMAGE]: AttributeField.ImageUrl,
29948
29949
  [FieldType.PIXEL]: AttributeField.PixelField,
29949
- [FieldType.SLIDER]: AttributeField.SliderField
29950
+ [FieldType.SLIDER]: AttributeField.SliderField,
29951
+ [FieldType.SWITCH]: AttributeField.SwitchField
29950
29952
  }[type];
29951
29953
  };
29952
29954
  function FieldItem(props) {
@@ -32371,7 +32373,8 @@ const WidgetTypeOptions = [
32371
32373
  { value: FieldType.NUMBER, label: "Number" },
32372
32374
  { value: FieldType.ENUM, label: "Enum" },
32373
32375
  { value: FieldType.COLOR, label: "Color" },
32374
- { value: FieldType.IMAGE, label: "Image" }
32376
+ { value: FieldType.IMAGE, label: "Image" },
32377
+ { value: FieldType.SWITCH, label: "Switch" }
32375
32378
  // { value: FieldType.SLIDER, label: "Slider" },
32376
32379
  // { value: FieldType.PIXEL_AND_PERCENT, label: "Pixel and percent" },
32377
32380
  ];
@@ -32392,6 +32395,21 @@ const formItemStyle = {
32392
32395
  function FieldConfigItem(props) {
32393
32396
  const { getFieldValue } = useEditorContext();
32394
32397
  const keyField = getFieldValue(null, props.name);
32398
+ const {
32399
+ attributes,
32400
+ listeners,
32401
+ setNodeRef,
32402
+ transform,
32403
+ transition,
32404
+ isDragging
32405
+ } = useSortable({
32406
+ id: props.id
32407
+ });
32408
+ const style = {
32409
+ transform: CSS.Transform.toString(transform),
32410
+ transition,
32411
+ opacity: isDragging ? 0 : 1
32412
+ };
32395
32413
  const onHandleRemove = (e) => {
32396
32414
  e.preventDefault();
32397
32415
  e.stopPropagation();
@@ -32400,10 +32418,16 @@ function FieldConfigItem(props) {
32400
32418
  return /* @__PURE__ */ React__default.createElement(
32401
32419
  Collapse.Item,
32402
32420
  {
32403
- style: { backgroundColor: "#fff" },
32421
+ ref: setNodeRef,
32422
+ style: __spreadValues({ backgroundColor: "#fff" }, style),
32404
32423
  name: props.name,
32405
32424
  header: props.label,
32406
- extra: /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconDelete, null), onClick: onHandleRemove }),
32425
+ extra: /* @__PURE__ */ React__default.createElement(Space, null, /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconDelete, null), onClick: onHandleRemove }), /* @__PURE__ */ React__default.createElement(
32426
+ Button$2,
32427
+ __spreadValues(__spreadValues({
32428
+ icon: /* @__PURE__ */ React__default.createElement(IconDragDotVertical, null)
32429
+ }, listeners), attributes)
32430
+ )),
32407
32431
  contentStyle: { width: "100%", padding: "20px 16px" }
32408
32432
  },
32409
32433
  /* @__PURE__ */ React__default.createElement(Grid.Row, null, /* @__PURE__ */ React__default.createElement(Grid.Col, { span: 22, offset: 0 }, /* @__PURE__ */ React__default.createElement(Space, { direction: "vertical", style: { width: "100%" } }, /* @__PURE__ */ React__default.createElement(
@@ -32458,6 +32482,8 @@ function WidgetConfigPanel({
32458
32482
  containerHeight
32459
32483
  }) {
32460
32484
  const { values, setFieldValue, getFieldValue } = useEditorContext();
32485
+ const idsMap = useRef(/* @__PURE__ */ new Map());
32486
+ const [draggingItem, setDraggingItem] = useState(null);
32461
32487
  const widgetElement = values.widgetElement;
32462
32488
  if (!widgetElement) {
32463
32489
  throw new Error(`Invalid widgetElement`);
@@ -32491,175 +32517,243 @@ function WidgetConfigPanel({
32491
32517
  },
32492
32518
  [setFieldValue, widgetElement]
32493
32519
  );
32520
+ const items = useMemo(() => {
32521
+ return widgetElement.data.config.map((item2, index2) => {
32522
+ let id = idsMap.current.get(item2);
32523
+ if (!id) {
32524
+ id = nanoid();
32525
+ idsMap.current.set(item2, id);
32526
+ }
32527
+ return { id, item: item2 };
32528
+ });
32529
+ }, [widgetElement.data.config]);
32530
+ const itemIds = useMemo(() => {
32531
+ return items.map((item2) => item2.id);
32532
+ }, [items]);
32533
+ const onDragStart = useCallback(
32534
+ (event) => {
32535
+ setActiveTab([]);
32536
+ const matchItem = items.find((item2) => {
32537
+ const activeId = event.active.id.toString();
32538
+ return activeId === item2.id;
32539
+ });
32540
+ if (matchItem) {
32541
+ setDraggingItem(matchItem.item);
32542
+ }
32543
+ },
32544
+ [items]
32545
+ );
32546
+ const onDragEnd = useCallback(
32547
+ ({ active, over }) => {
32548
+ if (!active.id || !over) {
32549
+ return;
32550
+ }
32551
+ const activeId = active.id.toString();
32552
+ const overId = over.id.toString();
32553
+ if (activeId !== overId) {
32554
+ const oldIndex = items.findIndex((item2) => item2.id === activeId);
32555
+ const newIndex = items.findIndex((item2) => item2.id === overId);
32556
+ const newConfig = arrayMove(
32557
+ widgetElement.data.config,
32558
+ oldIndex,
32559
+ newIndex
32560
+ );
32561
+ const cloneWidgetElement = cloneDeep(widgetElement);
32562
+ cloneWidgetElement.data.config = cloneDeep(newConfig);
32563
+ setFieldValue(null, `widgetElement`, cloneWidgetElement);
32564
+ }
32565
+ },
32566
+ [items, setFieldValue, widgetElement]
32567
+ );
32494
32568
  const contentEditable = getFieldValue(
32495
32569
  null,
32496
32570
  `widgetElement.data.contentEditable`
32497
32571
  );
32498
- console.log("contentEditable", contentEditable);
32572
+ const overlayContent = useMemo(() => {
32573
+ return /* @__PURE__ */ React__default.createElement(
32574
+ Collapse.Item,
32575
+ {
32576
+ header: draggingItem == null ? void 0 : draggingItem.label,
32577
+ name: "overlayContent",
32578
+ extra: /* @__PURE__ */ React__default.createElement(Space, null, /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconDelete, null) }), /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconDragDotVertical, null) }))
32579
+ }
32580
+ );
32581
+ }, [draggingItem == null ? void 0 : draggingItem.label]);
32499
32582
  return /* @__PURE__ */ React__default.createElement(AttributesPanelWrapper, null, /* @__PURE__ */ React__default.createElement(
32500
- Tabs,
32583
+ DndContext,
32501
32584
  {
32502
- defaultActiveTab: "Setting",
32503
- renderTabHeader: (_, DefaultHeader) => /* @__PURE__ */ React__default.createElement(
32504
- "div",
32505
- {
32506
- className: styles.largeTabsHeader,
32507
- style: { display: "flex", alignItems: "center" }
32508
- },
32509
- /* @__PURE__ */ React__default.createElement(DefaultHeader, { style: { flex: 1 } })
32510
- )
32585
+ collisionDetection: closestCenter,
32586
+ onDragStart,
32587
+ onDragEnd,
32588
+ modifiers: [restrictToVerticalAxis]
32511
32589
  },
32512
- /* @__PURE__ */ React__default.createElement(
32513
- Tabs.TabPane,
32590
+ /* @__PURE__ */ React__default.createElement(SortableContext, { items: itemIds, strategy: verticalListSortingStrategy }, /* @__PURE__ */ React__default.createElement(
32591
+ Tabs,
32514
32592
  {
32515
- key: "Setting",
32516
- style: { padding: 10 },
32517
- title: /* @__PURE__ */ React__default.createElement("div", { style: { height: 40, lineHeight: "40px" } }, "Setting")
32593
+ defaultActiveTab: "Setting",
32594
+ renderTabHeader: (_, DefaultHeader) => /* @__PURE__ */ React__default.createElement(
32595
+ "div",
32596
+ {
32597
+ className: styles.largeTabsHeader,
32598
+ style: { display: "flex", alignItems: "center" }
32599
+ },
32600
+ /* @__PURE__ */ React__default.createElement(DefaultHeader, { style: { flex: 1 } })
32601
+ )
32518
32602
  },
32519
- /* @__PURE__ */ React__default.createElement(Grid.Row, { style: { paddingTop: 20 } }, /* @__PURE__ */ React__default.createElement(Grid.Col, { span: 22, offset: 1 }, /* @__PURE__ */ React__default.createElement(
32520
- AttributeField.TextField,
32603
+ /* @__PURE__ */ React__default.createElement(
32604
+ Tabs.TabPane,
32521
32605
  {
32522
- name: "widgetElement.title",
32523
- label: "Title",
32524
- path: null,
32525
- formItem: {
32526
- layout: "vertical",
32527
- labelCol: {},
32528
- wrapperCol: {}
32606
+ key: "Setting",
32607
+ style: { padding: 10 },
32608
+ title: /* @__PURE__ */ React__default.createElement("div", { style: { height: 40, lineHeight: "40px" } }, "Setting")
32609
+ },
32610
+ /* @__PURE__ */ React__default.createElement(Grid.Row, { style: { paddingTop: 20 } }, /* @__PURE__ */ React__default.createElement(Grid.Col, { span: 22, offset: 1 }, /* @__PURE__ */ React__default.createElement(
32611
+ AttributeField.TextField,
32612
+ {
32613
+ name: "widgetElement.title",
32614
+ label: "Title",
32615
+ path: null,
32616
+ formItem: {
32617
+ layout: "vertical",
32618
+ labelCol: {},
32619
+ wrapperCol: {}
32620
+ }
32529
32621
  }
32530
- }
32531
- ), /* @__PURE__ */ React__default.createElement(
32532
- AttributeField.TextAreaField,
32533
- {
32534
- rows: 3,
32535
- name: "widgetElement.data.description",
32536
- label: "Description",
32537
- fallbackValue: "",
32538
- path: null,
32539
- formItem: {
32540
- layout: "vertical",
32541
- labelCol: {},
32542
- wrapperCol: {}
32543
- }
32544
- }
32545
- ))),
32546
- /* @__PURE__ */ React__default.createElement(Divider$2, null),
32547
- /* @__PURE__ */ React__default.createElement(Grid.Row, null, /* @__PURE__ */ React__default.createElement(Grid.Col, { span: 22, offset: 1 }, /* @__PURE__ */ React__default.createElement(
32548
- AttributeField.SwitchField,
32549
- {
32550
- name: "widgetElement.data.contentEditable",
32551
- label: /* @__PURE__ */ React__default.createElement(Space, null, t("Content editable"), /* @__PURE__ */ React__default.createElement(
32552
- Tooltip,
32553
- {
32554
- content: t(
32555
- `Once enabled, the widget's text and button blocks will be editable directly in the editor`
32556
- )
32557
- },
32558
- /* @__PURE__ */ React__default.createElement(IconQuestionCircle, { style: { fontSize: 16 } })
32559
- )),
32560
- path: null,
32561
- style: { position: "relative", top: 0 },
32562
- formItem: {
32563
- layout: "inline",
32564
- labelCol: {
32565
- span: 10,
32566
- style: {
32567
- textAlign: "left"
32568
- }
32569
- },
32570
- wrapperCol: {
32571
- span: 12,
32572
- style: {
32573
- textAlign: "left"
32574
- }
32622
+ ), /* @__PURE__ */ React__default.createElement(
32623
+ AttributeField.TextAreaField,
32624
+ {
32625
+ rows: 3,
32626
+ name: "widgetElement.data.description",
32627
+ label: "Description",
32628
+ fallbackValue: "",
32629
+ path: null,
32630
+ formItem: {
32631
+ layout: "vertical",
32632
+ labelCol: {},
32633
+ wrapperCol: {}
32575
32634
  }
32576
32635
  }
32577
- }
32578
- ), !contentEditable && /* @__PURE__ */ React__default.createElement(
32579
- AttributeField.SwitchField,
32580
- {
32581
- name: "widgetElement.data.staticLogicEnabled",
32582
- label: /* @__PURE__ */ React__default.createElement(Space, null, t("Static logic enabled"), /* @__PURE__ */ React__default.createElement(
32583
- Tooltip,
32584
- {
32585
- content: t(
32586
- `If enabled, only the input value will be used as the data for dynamic rendering`
32587
- )
32588
- },
32589
- /* @__PURE__ */ React__default.createElement(IconQuestionCircle, { style: { fontSize: 16 } })
32590
- )),
32591
- path: null,
32592
- style: { position: "relative", top: 0, marginBottom: 0 },
32593
- formItem: {
32594
- style: {},
32595
- layout: "inline",
32596
- labelCol: {
32597
- span: 10,
32598
- style: {
32599
- textAlign: "left",
32600
- paddingBottom: 50
32601
- }
32602
- },
32603
- wrapperCol: {
32604
- span: 12,
32605
- style: {
32606
- textAlign: "left"
32636
+ ))),
32637
+ /* @__PURE__ */ React__default.createElement(Divider$2, null),
32638
+ /* @__PURE__ */ React__default.createElement(Grid.Row, null, /* @__PURE__ */ React__default.createElement(Grid.Col, { span: 22, offset: 1 }, /* @__PURE__ */ React__default.createElement(
32639
+ AttributeField.SwitchField,
32640
+ {
32641
+ name: "widgetElement.data.contentEditable",
32642
+ label: /* @__PURE__ */ React__default.createElement(Space, null, t("Content editable"), /* @__PURE__ */ React__default.createElement(
32643
+ Tooltip,
32644
+ {
32645
+ content: t(
32646
+ `Once enabled, the widget's text and button blocks will be editable directly in the editor`
32647
+ )
32648
+ },
32649
+ /* @__PURE__ */ React__default.createElement(IconQuestionCircle, { style: { fontSize: 16 } })
32650
+ )),
32651
+ path: null,
32652
+ style: { position: "relative", top: 0 },
32653
+ formItem: {
32654
+ layout: "inline",
32655
+ labelCol: {
32656
+ span: 10,
32657
+ style: {
32658
+ textAlign: "left"
32659
+ }
32660
+ },
32661
+ wrapperCol: {
32662
+ span: 12,
32663
+ style: {
32664
+ textAlign: "left"
32665
+ }
32607
32666
  }
32608
32667
  }
32609
32668
  }
32610
- }
32611
- )))
32612
- ),
32613
- /* @__PURE__ */ React__default.createElement(
32614
- Tabs.TabPane,
32615
- {
32616
- key: "Input",
32617
- title: /* @__PURE__ */ React__default.createElement(
32618
- "div",
32669
+ ), !contentEditable && /* @__PURE__ */ React__default.createElement(
32670
+ AttributeField.SwitchField,
32619
32671
  {
32620
- style: {
32621
- height: 40,
32622
- lineHeight: "40px",
32623
- paddingLeft: 10,
32624
- paddingRight: 10
32672
+ name: "widgetElement.data.staticLogicEnabled",
32673
+ label: /* @__PURE__ */ React__default.createElement(Space, null, t("Static logic enabled"), /* @__PURE__ */ React__default.createElement(
32674
+ Tooltip,
32675
+ {
32676
+ content: t(
32677
+ `If enabled, only the input value will be used as the data for dynamic rendering`
32678
+ )
32679
+ },
32680
+ /* @__PURE__ */ React__default.createElement(IconQuestionCircle, { style: { fontSize: 16 } })
32681
+ )),
32682
+ path: null,
32683
+ style: { position: "relative", top: 0, marginBottom: 0 },
32684
+ formItem: {
32685
+ style: {},
32686
+ layout: "inline",
32687
+ labelCol: {
32688
+ span: 10,
32689
+ style: {
32690
+ textAlign: "left",
32691
+ paddingBottom: 50
32692
+ }
32693
+ },
32694
+ wrapperCol: {
32695
+ span: 12,
32696
+ style: {
32697
+ textAlign: "left"
32698
+ }
32699
+ }
32625
32700
  }
32626
- },
32627
- /* @__PURE__ */ React__default.createElement(Grid.Row, { justify: "space-between", align: "center" }, /* @__PURE__ */ React__default.createElement("span", null), /* @__PURE__ */ React__default.createElement("span", null, "Input"), /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconPlus, null), onClick: onAdd }))
32628
- )
32629
- },
32701
+ }
32702
+ )))
32703
+ ),
32630
32704
  /* @__PURE__ */ React__default.createElement(
32631
- Collapse,
32705
+ Tabs.TabPane,
32632
32706
  {
32633
- bordered: false,
32634
- activeKey: activeTab,
32635
- onChange: (key2, keys2) => setActiveTab(keys2)
32707
+ key: "Input",
32708
+ title: /* @__PURE__ */ React__default.createElement(
32709
+ "div",
32710
+ {
32711
+ style: {
32712
+ height: 40,
32713
+ lineHeight: "40px",
32714
+ paddingLeft: 10,
32715
+ paddingRight: 10
32716
+ }
32717
+ },
32718
+ /* @__PURE__ */ React__default.createElement(Grid.Row, { justify: "space-between", align: "center" }, /* @__PURE__ */ React__default.createElement("span", null), /* @__PURE__ */ React__default.createElement("span", null, "Input"), /* @__PURE__ */ React__default.createElement(Button$2, { icon: /* @__PURE__ */ React__default.createElement(IconPlus, null), onClick: onAdd }))
32719
+ )
32636
32720
  },
32637
- /* @__PURE__ */ React__default.createElement(Card, { title: "Attributes", bodyStyle: { padding: 0 } }, /* @__PURE__ */ React__default.createElement(
32638
- FullHeightOverlayScrollbars,
32721
+ /* @__PURE__ */ React__default.createElement(
32722
+ Collapse,
32639
32723
  {
32640
- height: `calc(${containerHeight} - 110px)`
32724
+ bordered: false,
32725
+ activeKey: activeTab,
32726
+ onChange: (key2, keys2) => setActiveTab(keys2)
32641
32727
  },
32642
- (widgetElement.data.config || []).map((item2, index2) => /* @__PURE__ */ React__default.createElement(
32643
- FieldConfigItem,
32644
- __spreadProps(__spreadValues({
32645
- path: null,
32646
- key: index2
32647
- }, item2), {
32648
- name: `widgetElement.data.config.${index2}`,
32649
- onRemove: () => onRemove(index2)
32650
- })
32651
- )),
32652
- /* @__PURE__ */ React__default.createElement(
32653
- Collapse.Item,
32728
+ /* @__PURE__ */ React__default.createElement(Card, { title: "Attributes", bodyStyle: { padding: 0 } }, /* @__PURE__ */ React__default.createElement(
32729
+ FullHeightOverlayScrollbars,
32654
32730
  {
32655
- header: "",
32656
- name: "hidden",
32657
- style: { display: "none" }
32658
- }
32659
- )
32660
- ))
32731
+ height: `calc(${containerHeight} - 110px)`
32732
+ },
32733
+ (widgetElement.data.config || []).map((item2, index2) => /* @__PURE__ */ React__default.createElement(
32734
+ FieldConfigItem,
32735
+ __spreadProps(__spreadValues({
32736
+ path: null,
32737
+ key: idsMap.current.get(item2)
32738
+ }, item2), {
32739
+ id: idsMap.current.get(item2),
32740
+ name: `widgetElement.data.config.${index2}`,
32741
+ onRemove: () => onRemove(index2)
32742
+ })
32743
+ )),
32744
+ /* @__PURE__ */ React__default.createElement(
32745
+ Collapse.Item,
32746
+ {
32747
+ header: "",
32748
+ name: "hidden",
32749
+ style: { display: "none" }
32750
+ }
32751
+ )
32752
+ ))
32753
+ )
32661
32754
  )
32662
- )
32755
+ )),
32756
+ /* @__PURE__ */ React__default.createElement(DragOverlay, null, overlayContent)
32663
32757
  ));
32664
32758
  }
32665
32759
  const styleText$a = ".MergeTagComponent-image {\n max-width: 150px;\n}";
@@ -7,4 +7,5 @@ export declare function FieldConfigItem(props: {
7
7
  type: string;
8
8
  path: Path | null;
9
9
  onRemove: () => void;
10
+ id: string;
10
11
  }): React.JSX.Element;
@@ -7,5 +7,6 @@ export declare const enum FieldType {
7
7
  COLOR = "color",
8
8
  IMAGE = "image",
9
9
  SLIDER = "slider",
10
- RICHTEXT = "richtext"
10
+ RICHTEXT = "richtext",
11
+ SWITCH = "switch"
11
12
  }
@@ -7,7 +7,7 @@ export declare const getFieldByType: (type: string) => ((props: EnhancerProps &
7
7
  value: boolean;
8
8
  onChange: (val: boolean) => void;
9
9
  showLimit?: boolean | undefined;
10
- }, "onChange" | "value">) => React.JSX.Element) | typeof import("../../AttributeField/PixelAndPercentField").PixelAndPercentField | typeof import("../../AttributeField/ImageUrl").ImageUrl | undefined;
10
+ }, "onChange" | "value">) => React.JSX.Element) | ((props: EnhancerProps & Omit<import("@arco-design/web-react").SwitchProps & React.RefAttributes<unknown>, "onChange" | "value">) => React.JSX.Element) | typeof import("../../AttributeField/PixelAndPercentField").PixelAndPercentField | typeof import("../../AttributeField/ImageUrl").ImageUrl | undefined;
11
11
  export declare function FieldItem(props: {
12
12
  name: string;
13
13
  label: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easy-email-pro-theme",
3
- "version": "1.50.2",
3
+ "version": "1.50.3",
4
4
  "description": "",
5
5
  "files": [
6
6
  "lib"