@useinsider/guido 1.0.0-beta.b8ba815 → 1.0.0-beta.c2acdd4

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.
Files changed (30) hide show
  1. package/README.md +9 -0
  2. package/dist/components/Guido.vue.js +8 -8
  3. package/dist/components/Guido.vue2.js +36 -32
  4. package/dist/components/organisms/header/RightSlot.vue.js +5 -5
  5. package/dist/components/organisms/header/RightSlot.vue2.js +19 -17
  6. package/dist/components/organisms/save-template/SaveTemplateModal.vue.d.ts +16 -0
  7. package/dist/components/organisms/save-template/SaveTemplateModal.vue.js +20 -0
  8. package/dist/components/organisms/save-template/SaveTemplateModal.vue2.js +78 -0
  9. package/dist/components/wrappers/ModalWrapper.vue.d.ts +72 -0
  10. package/dist/components/wrappers/ModalWrapper.vue.js +19 -0
  11. package/dist/components/wrappers/ModalWrapper.vue2.js +43 -0
  12. package/dist/composables/useActionsApi.d.ts +2 -1
  13. package/dist/composables/useActionsApi.js +45 -35
  14. package/dist/composables/useHttp.js +23 -21
  15. package/dist/composables/useSaveAsTemplate.d.ts +7 -0
  16. package/dist/composables/useSaveAsTemplate.js +51 -0
  17. package/dist/composables/useTemplateNameValidation.d.ts +7 -0
  18. package/dist/composables/useTemplateNameValidation.js +33 -0
  19. package/dist/guido.css +1 -1
  20. package/dist/mock/api/template-library.d.ts +2 -0
  21. package/dist/stores/editor.d.ts +1 -0
  22. package/dist/stores/editor.js +2 -1
  23. package/dist/stores/template-categories.d.ts +41 -0
  24. package/dist/stores/template-categories.js +91 -0
  25. package/dist/utils/base64.d.ts +2 -0
  26. package/dist/utils/base64.js +14 -0
  27. package/dist/utils/generic.d.ts +1 -0
  28. package/dist/utils/generic.js +7 -0
  29. package/dist/utils/textUtil.d.ts +2 -0
  30. package/package.json +1 -3
package/README.md CHANGED
@@ -118,6 +118,15 @@ export default {
118
118
  | `html` | `string` | ⚪ | `''` | Initial HTML content for the template |
119
119
  | `css` | `string` | ⚪ | `''` | Initial CSS styles for the template |
120
120
 
121
+ ### Guido Component Events
122
+
123
+ | Event | Payload | Description |
124
+ |-------|---------|-------------|
125
+ | `dynamic-content:open` | `DynamicContent \| null` | Fired when user requests to insert dynamic content |
126
+ | `back` | - | Fired when user clicks the back button |
127
+ | `save:start` | - | Fired when the save process begins |
128
+ | `save:complete` | `Omit<Template, 'forceRecreate'>` | Fired when template is successfully saved |
129
+
121
130
  ### Guido Exposed Methods
122
131
  ```typescript
123
132
  dynamicContent.insert(DynamicContent);
@@ -1,18 +1,18 @@
1
1
  import o from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import i from "../_virtual/_plugin-vue2_normalizer.js";
3
+ import a from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var s = function() {
5
- var e = this, r = e._self._c, t = e._self._setupProxy;
6
- return r("div", { staticClass: "guido-editor__wrapper" }, [r(t.HeaderWrapper), r("div", { staticClass: "guido-editor__container", attrs: { id: "guido-editor" } })], 1);
7
- }, _ = [], a = /* @__PURE__ */ i(
5
+ var t = this, e = t._self._c, r = t._self._setupProxy;
6
+ return e("div", { staticClass: "guido-editor__wrapper" }, [e(r.HeaderWrapper), e("div", { staticClass: "guido-editor__container", attrs: { id: "guido-editor" } }), e(r.SaveTemplateModal, { attrs: { "is-open": r.editorStore.isSaveTemplateModalOpen }, on: { close: r.handleCloseSaveTemplateModal } })], 1);
7
+ }, i = [], n = /* @__PURE__ */ a(
8
8
  o,
9
9
  s,
10
- _,
10
+ i,
11
11
  !1,
12
12
  null,
13
- "89bedf08"
13
+ "66fa3f35"
14
14
  );
15
- const f = a.exports;
15
+ const c = n.exports;
16
16
  export {
17
- f as default
17
+ c as default
18
18
  };
@@ -1,11 +1,13 @@
1
- import { defineComponent as h, onMounted as w } from "vue";
2
- import { provideGuidoActions as D } from "../composables/useGuidoActions.js";
3
- import { usePartner as E } from "../composables/usePartner.js";
4
- import { useStripo as S } from "../composables/useStripo.js";
5
- import { DefaultUsername as _, DefaultGuidoConfig as G } from "../enums/defaults.js";
6
- import I from "./organisms/header/HeaderWrapper.vue.js";
7
- import { useStripoApi as k } from "../services/stripoApi.js";
8
- const B = /* @__PURE__ */ h({
1
+ import { defineComponent as w, onMounted as E } from "vue";
2
+ import { provideGuidoActions as T } from "../composables/useGuidoActions.js";
3
+ import { usePartner as D } from "../composables/usePartner.js";
4
+ import { useStripo as _ } from "../composables/useStripo.js";
5
+ import { DefaultUsername as G, DefaultGuidoConfig as I } from "../enums/defaults.js";
6
+ import k from "./organisms/header/HeaderWrapper.vue.js";
7
+ import M from "./organisms/save-template/SaveTemplateModal.vue.js";
8
+ import { useStripoApi as P } from "../services/stripoApi.js";
9
+ import { useEditorStore as N } from "../stores/editor.js";
10
+ const O = /* @__PURE__ */ w({
9
11
  __name: "Guido",
10
12
  props: {
11
13
  templateId: null,
@@ -18,63 +20,65 @@ const B = /* @__PURE__ */ h({
18
20
  guidoConfig: null
19
21
  },
20
22
  emits: ["dynamic-content:open", "back", "save:start", "save:complete"],
21
- setup(C, { expose: b, emit: t }) {
22
- const o = C, { getPartnerName: n, getProductType: a } = E(), {
23
+ setup(b, { expose: S, emit: o }) {
24
+ const t = b, { getPartnerName: n, getProductType: a } = D(), {
23
25
  templateId: c,
24
26
  userId: s,
25
- guidoConfig: i,
26
- html: r = "",
27
+ guidoConfig: r,
28
+ html: i = "",
27
29
  css: l = "",
28
30
  partnerName: d = n(),
29
- productType: u = a(),
30
- username: m = _
31
- } = o;
31
+ productType: m = a(),
32
+ username: u = G
33
+ } = t;
32
34
  window.GuidoConfig = {
33
- ...G,
34
- ...i
35
+ ...I,
36
+ ...r
35
37
  };
36
- const { initPlugin: p } = S({ emailId: c, userId: s, username: m, partnerName: d, productType: u }), { getDefaultTemplate: g } = k();
37
- D({
38
+ const { initPlugin: p } = _({ emailId: c, userId: s, username: u, partnerName: d, productType: m }), { getDefaultTemplate: f } = P();
39
+ T({
38
40
  onBack: () => {
39
- console.debug("guido:back"), t("back");
41
+ console.debug("guido:back"), o("back");
40
42
  },
41
43
  onSaveStart: () => {
42
- console.debug("guido:save:start"), t("save:start");
44
+ console.debug("guido:save:start"), o("save:start");
43
45
  },
44
46
  onSaveComplete: (e) => {
45
- console.debug("guido:save:complete", e), t("save:complete", e);
47
+ console.debug("guido:save:complete", e), o("save:complete", e);
46
48
  }
47
49
  });
48
- const f = (e) => {
50
+ const g = N(), h = () => {
51
+ g.isSaveTemplateModalOpen = !1;
52
+ }, v = (e) => {
49
53
  console.debug("dynamic-content:close", e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
50
54
  }, y = () => {
51
55
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
52
56
  };
53
- return w(async () => {
57
+ return E(async () => {
54
58
  console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
55
59
  try {
56
60
  let e = {
57
- html: r,
61
+ html: i,
58
62
  css: l,
59
63
  forceRecreate: !0
60
64
  // TODO: It should be false for old templates. We will communicate with Stripo
61
65
  };
62
- e.html || (e = await g()), await p(e);
66
+ e.html || (e = await f()), await p(e);
63
67
  } catch (e) {
64
68
  console.error("Failed to initialize Stripo editor:", e);
65
69
  }
66
70
  document.addEventListener("dynamic-content:open", (e) => {
67
- const v = e;
68
- console.debug("dynamic-content:open", v.detail), t("dynamic-content:open", v.detail);
71
+ const C = e;
72
+ console.debug("dynamic-content:open", C.detail), o("dynamic-content:open", C.detail);
69
73
  });
70
- }), b({
74
+ }), S({
71
75
  dynamicContent: {
72
- insert: f,
76
+ insert: v,
73
77
  close: y
74
78
  }
75
- }), { __sfc: !0, props: o, getPartnerName: n, getProductType: a, templateId: c, userId: s, guidoConfig: i, html: r, css: l, partnerName: d, productType: u, username: m, emit: t, initPlugin: p, getDefaultTemplate: g, insertDynamicContent: f, closeDynamicContent: y, HeaderWrapper: I };
79
+ }), { __sfc: !0, props: t, getPartnerName: n, getProductType: a, templateId: c, userId: s, guidoConfig: r, html: i, css: l, partnerName: d, productType: m, username: u, emit: o, initPlugin: p, getDefaultTemplate: f, editorStore: g, handleCloseSaveTemplateModal: h, insertDynamicContent: v, closeDynamicContent: y, HeaderWrapper: k, SaveTemplateModal: M };
76
80
  }
77
81
  });
78
82
  export {
79
- B as default
83
+ O as default
80
84
  };
@@ -2,16 +2,16 @@ import o from "./RightSlot.vue2.js";
2
2
  import i from "../../../_virtual/_plugin-vue2_normalizer.js";
3
3
  var n = function() {
4
4
  var s = this, e = s._self._c, t = s._self._setupProxy;
5
- return e("div", { staticClass: "d-f" }, [e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleVersionHistory } }), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 }, on: { click: t.exportHtml } }), e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 } }), e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 } }), e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleSave } })], 1);
6
- }, r = [], a = /* @__PURE__ */ i(
5
+ return e("div", { staticClass: "d-f" }, [e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleVersionHistory } }), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 }, on: { click: t.exportHtml } }), e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 }, on: { click: t.handleSaveAsTemplate } }), e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 } }), e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleSave } })], 1);
6
+ }, a = [], r = /* @__PURE__ */ i(
7
7
  o,
8
8
  n,
9
- r,
9
+ a,
10
10
  !1,
11
11
  null,
12
12
  null
13
13
  );
14
- const c = a.exports;
14
+ const u = r.exports;
15
15
  export {
16
- c as default
16
+ u as default
17
17
  };
@@ -1,35 +1,37 @@
1
1
  import { defineComponent as m } from "vue";
2
2
  import { useActionsApi as p } from "../../../composables/useActionsApi.js";
3
- import { useExport as c } from "../../../composables/useExport.js";
4
- import { useSaveStart as l, useSaveComplete as f } from "../../../composables/useGuidoActions.js";
5
- import { useVersionHistoryApi as u } from "../../../composables/useVersionHistoryApi.js";
6
- import { useEditorStore as d } from "../../../stores/editor.js";
3
+ import { useExport as l } from "../../../composables/useExport.js";
4
+ import { useSaveStart as c, useSaveComplete as d } from "../../../composables/useGuidoActions.js";
5
+ import { useVersionHistoryApi as f } from "../../../composables/useVersionHistoryApi.js";
6
+ import { useEditorStore as u } from "../../../stores/editor.js";
7
7
  import { InButtonV2 as S } from "@useinsider/design-system-vue";
8
- const E = /* @__PURE__ */ m({
8
+ const T = /* @__PURE__ */ m({
9
9
  __name: "RightSlot",
10
10
  setup(h) {
11
- const { exportHtml: a } = c(), { getCompiledEmail: t } = p(), e = l(), r = f(), { openVersionHistory: s, closeVersionHistory: n } = u(), i = d();
12
- return { __sfc: !0, exportHtml: a, getCompiledEmail: t, saveStart: e, saveComplete: r, openVersionHistory: s, closeVersionHistory: n, editorStore: i, handleVersionHistory: () => {
13
- if (i.isVersionHistoryOpen) {
14
- n();
11
+ const { exportHtml: i } = l(), { getCompiledEmail: o } = p(), r = c(), s = d(), { openVersionHistory: n, closeVersionHistory: a } = f(), e = u();
12
+ return { __sfc: !0, exportHtml: i, getCompiledEmail: o, saveStart: r, saveComplete: s, openVersionHistory: n, closeVersionHistory: a, editorStore: e, handleVersionHistory: () => {
13
+ if (e.isVersionHistoryOpen) {
14
+ a();
15
15
  return;
16
16
  }
17
- s();
17
+ n();
18
+ }, handleSaveAsTemplate: async () => {
19
+ e.isSaveTemplateModalOpen = !0;
18
20
  }, handleSave: async () => {
19
- e();
21
+ r();
20
22
  try {
21
- const { html: o } = await t();
22
- r({
23
- html: o || "",
23
+ const { html: t } = await o();
24
+ s({
25
+ html: t || "",
24
26
  css: ""
25
27
  // CSS is embedded in HTML from Stripo
26
28
  });
27
- } catch (o) {
28
- console.error("Failed to get template data for save:", o);
29
+ } catch (t) {
30
+ console.error("Failed to get template data for save:", t);
29
31
  }
30
32
  }, InButtonV2: S };
31
33
  }
32
34
  });
33
35
  export {
34
- E as default
36
+ T as default
35
37
  };
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ isOpen: boolean;
3
+ }
4
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
5
+ close: () => void;
6
+ }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
7
+ export default _default;
8
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
9
+ type __VLS_TypePropsToOption<T> = {
10
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
11
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
12
+ } : {
13
+ type: import('vue').PropType<T[K]>;
14
+ required: true;
15
+ };
16
+ };
@@ -0,0 +1,20 @@
1
+ import s from "./SaveTemplateModal.vue2.js";
2
+ import r from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var o = function() {
4
+ var a = this, t = a._self._c, e = a._self._setupProxy;
5
+ return t(e.ModalWrapper, { attrs: { "cancel-button-text": e.trans("products.cancel"), description: e.trans("newsletter.save-template-description"), "is-open": e.props.isOpen, "primary-button-loading": e.saveState.saving, "primary-button-text": e.trans(e.saveState.saving ? "newsletter.saving" : "products.save"), title: e.trans("products.save-template") }, on: { cancel: e.closeModal, close: e.closeModal, save: e.saveTemplate } }, [t(e.InBasicTextInput, { staticClass: "mb-5 w-1", attrs: { id: "template-name-input", name: "templateName", "character-counter-status": !1, "disabled-status": e.saveState.saving, "label-text": e.trans("products.template-name"), "placeholder-text": e.trans("newsletter.enter-template-name"), "state-message": e.getValidationMessage(), states: e.hasError() ? "error" : "", "tooltip-status": !1, value: e.templateName }, on: { input: e.templateNameInputHandler } }), t(e.InMultiSelect, { staticClass: "template-category-dropdown mb-5 w-1", attrs: { "create-option-status": "", "search-status": "", "button-status": !1, "character-limit-validation-text": e.trans("validation-v2.duration-value", {
6
+ min: 1,
7
+ max: e.templateCategorySearchInputLimit
8
+ }), "create-button-label": e.trans("products.create-new-category"), "disabled-status": e.saveState.saving, "label-text": e.trans("products.template-category"), "loading-state": e.categoriesStore.loading || e.categoriesStore.loadingCreate, "max-character-limit": e.templateCategorySearchInputLimit, options: e.categoriesStore.mappedCategories, "placeholder-text": e.trans("products.select-template-category"), value: e.categoriesStore.selectedCategories }, on: { addOption: e.addOption, change: e.categoriesStore.setSelectedCategories, resetAllOptions: e.categoriesStore.setSelectedCategories, selectAllOptions: e.categoriesStore.setSelectedCategories } })], 1);
9
+ }, n = [], l = /* @__PURE__ */ r(
10
+ s,
11
+ o,
12
+ n,
13
+ !1,
14
+ null,
15
+ null
16
+ );
17
+ const d = l.exports;
18
+ export {
19
+ d as default
20
+ };
@@ -0,0 +1,78 @@
1
+ import { defineComponent as b, ref as u, computed as A, watch as H } from "vue";
2
+ import L from "../../wrappers/ModalWrapper.vue.js";
3
+ import { useActionsApi as N } from "../../../composables/useActionsApi.js";
4
+ import { useToaster as V } from "../../../composables/useToaster.js";
5
+ import { useTranslations as j } from "../../../composables/useTranslations.js";
6
+ import { useTemplateCategoriesStore as x } from "../../../stores/template-categories.js";
7
+ import { InMultiSelect as B, InBasicTextInput as P } from "@useinsider/design-system-vue";
8
+ import { useSaveAsTemplate as E } from "../../../composables/useSaveAsTemplate.js";
9
+ import { useTemplateNameValidation as R } from "../../../composables/useTemplateNameValidation.js";
10
+ const U = /* @__PURE__ */ b({
11
+ __name: "SaveTemplateModal",
12
+ props: {
13
+ isOpen: { type: Boolean }
14
+ },
15
+ emits: ["close"],
16
+ setup(S, { emit: p }) {
17
+ const v = S, n = j(), { showToaster: c } = V(), { getRawTemplateData: f } = N(), a = x(), {
18
+ state: t,
19
+ saveTemplate: d
20
+ } = E(), {
21
+ templateName: s,
22
+ getValidationMessage: I,
23
+ hasError: w,
24
+ validateInputs: g,
25
+ resetValidation: i
26
+ } = R(), l = u(!1), o = u(""), r = u(""), C = 40, y = A(() => t.saving || l.value || a.loading || a.loadingCreate), m = () => {
27
+ s.value = "", o.value = "", r.value = "", a.resetSelection(), i();
28
+ }, M = (e) => {
29
+ s.value = e, i();
30
+ }, T = () => {
31
+ m(), p("close");
32
+ }, _ = async () => {
33
+ if (!y.value) {
34
+ if (t.saving = !0, !await g()) {
35
+ t.saving = !1;
36
+ return;
37
+ }
38
+ try {
39
+ await d({
40
+ name: s.value,
41
+ htmlContent: o.value,
42
+ categoryIds: a.getSelectedCategoryIds,
43
+ css: r.value
44
+ }) && (t.saving = !1, c({
45
+ message: n("journey-builder.template-saved-successfully", { name: s.value }),
46
+ type: "success"
47
+ }), T());
48
+ } catch {
49
+ t.saving = !1, c({
50
+ message: n("journey-builder.template-save-error", { name: s.value }),
51
+ type: "error"
52
+ });
53
+ }
54
+ }
55
+ }, h = async () => {
56
+ l.value = !0;
57
+ try {
58
+ const { html: e, css: O } = await f();
59
+ r.value = O || "", o.value = e || "";
60
+ } catch {
61
+ o.value = "", r.value = "";
62
+ } finally {
63
+ l.value = !1;
64
+ }
65
+ }, D = async (e) => {
66
+ await a.createCategory(e);
67
+ };
68
+ return H(() => v.isOpen, async (e) => {
69
+ e ? await Promise.all([
70
+ h(),
71
+ a.fetchCategories()
72
+ ]) : m();
73
+ }), { __sfc: !0, props: v, emit: p, trans: n, showToaster: c, getRawTemplateData: f, categoriesStore: a, saveState: t, saveTemplateToLibrary: d, templateName: s, getValidationMessage: I, hasError: w, validateInputs: g, resetValidation: i, isLoadingHtml: l, htmlData: o, cssData: r, templateCategorySearchInputLimit: C, isOperationInProgress: y, resetModalState: m, templateNameInputHandler: M, closeModal: T, saveTemplate: _, fetchHtmlData: h, addOption: D, ModalWrapper: L, InBasicTextInput: P, InMultiSelect: B };
74
+ }
75
+ });
76
+ export {
77
+ U as default
78
+ };
@@ -0,0 +1,72 @@
1
+ interface ModalWrapperProps {
2
+ isOpen: boolean;
3
+ title: string;
4
+ description?: string;
5
+ size?: 'small' | 'medium' | 'large';
6
+ primaryButtonText?: string;
7
+ primaryButtonDisabled?: boolean;
8
+ primaryButtonLoading?: boolean;
9
+ cancelButtonText?: string;
10
+ showCancelButton?: boolean;
11
+ className?: string;
12
+ }
13
+ declare var __VLS_12: {};
14
+ type __VLS_Slots = {} & {
15
+ default?: (props: typeof __VLS_12) => any;
16
+ };
17
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<ModalWrapperProps>, {
18
+ description: string;
19
+ size: string;
20
+ primaryButtonText: string;
21
+ primaryButtonDisabled: boolean;
22
+ primaryButtonLoading: boolean;
23
+ cancelButtonText: string;
24
+ showCancelButton: boolean;
25
+ className: string;
26
+ }>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
27
+ close: () => void;
28
+ save: () => void;
29
+ cancel: () => void;
30
+ }, string, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<ModalWrapperProps>, {
31
+ description: string;
32
+ size: string;
33
+ primaryButtonText: string;
34
+ primaryButtonDisabled: boolean;
35
+ primaryButtonLoading: boolean;
36
+ cancelButtonText: string;
37
+ showCancelButton: boolean;
38
+ className: string;
39
+ }>>>, {
40
+ className: string;
41
+ size: "small" | "medium" | "large";
42
+ description: string;
43
+ primaryButtonText: string;
44
+ primaryButtonDisabled: boolean;
45
+ primaryButtonLoading: boolean;
46
+ cancelButtonText: string;
47
+ showCancelButton: boolean;
48
+ }>;
49
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
50
+ export default _default;
51
+ type __VLS_WithDefaults<P, D> = {
52
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
53
+ default: D[K];
54
+ }> : P[K];
55
+ };
56
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
57
+ type __VLS_TypePropsToOption<T> = {
58
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
59
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
60
+ } : {
61
+ type: import('vue').PropType<T[K]>;
62
+ required: true;
63
+ };
64
+ };
65
+ type __VLS_WithSlots<T, S> = T & {
66
+ new (): {
67
+ $scopedSlots: S;
68
+ };
69
+ };
70
+ type __VLS_PrettifyLocal<T> = {
71
+ [K in keyof T]: T[K];
72
+ } & {};
@@ -0,0 +1,19 @@
1
+ import r from "./ModalWrapper.vue2.js";
2
+ import o from "../../_virtual/_plugin-vue2_normalizer.js";
3
+ var s = function() {
4
+ var t = this, n = t._self._c, e = t._self._setupProxy;
5
+ return n(e.InDrawer, { attrs: { id: "modal-wrapper", "description-text": t.description, "footer-button-group-options": e.drawerFooterOptions, size: t.size, status: t.isOpen, "title-text": t.title }, on: { cancelOrBackButtonEvent: e.handleCancel, onCloseEvent: e.handleClose, primaryButtonEvent: e.handleSave }, scopedSlots: t._u([{ key: "contentSlot", fn: function() {
6
+ return [n("div", { staticClass: "modal-content-wrapper", class: t.className }, [t._t("default")], 2)];
7
+ }, proxy: !0 }], null, !0) });
8
+ }, a = [], l = /* @__PURE__ */ o(
9
+ r,
10
+ s,
11
+ a,
12
+ !1,
13
+ null,
14
+ null
15
+ );
16
+ const u = l.exports;
17
+ export {
18
+ u as default
19
+ };
@@ -0,0 +1,43 @@
1
+ import { defineComponent as o, computed as l } from "vue";
2
+ import { InDrawer as s } from "@useinsider/design-system-vue";
3
+ const i = /* @__PURE__ */ o({
4
+ __name: "ModalWrapper",
5
+ props: {
6
+ isOpen: { type: Boolean },
7
+ title: null,
8
+ description: { default: "" },
9
+ size: { default: "small" },
10
+ primaryButtonText: { default: "" },
11
+ primaryButtonDisabled: { type: Boolean, default: !1 },
12
+ primaryButtonLoading: { type: Boolean, default: !1 },
13
+ cancelButtonText: { default: "" },
14
+ showCancelButton: { type: Boolean, default: !0 },
15
+ className: { default: "" }
16
+ },
17
+ emits: ["close", "save", "cancel"],
18
+ setup(a, { emit: t }) {
19
+ const e = a, n = l(() => ({
20
+ primaryButton: {
21
+ styling: "solid",
22
+ type: "primary",
23
+ labelText: e.primaryButtonText,
24
+ disabledStatus: e.primaryButtonDisabled || e.primaryButtonLoading
25
+ },
26
+ cancelOrBackButton: e.showCancelButton ? {
27
+ type: "secondary",
28
+ styling: "ghost",
29
+ labelText: e.cancelButtonText
30
+ } : void 0
31
+ }));
32
+ return { __sfc: !0, props: e, emit: t, drawerFooterOptions: n, handleClose: () => {
33
+ t("close");
34
+ }, handleSave: () => {
35
+ t("save");
36
+ }, handleCancel: () => {
37
+ t("cancel");
38
+ }, InDrawer: s };
39
+ }
40
+ });
41
+ export {
42
+ i as default
43
+ };
@@ -1,5 +1,6 @@
1
- import { GetCompiledEmailOptions, CompiledEmailResult } from '@@/Types/actions-api';
1
+ import { GetCompiledEmailOptions, CompiledEmailResult, TemplateDataResult } from '@@/Types/actions-api';
2
2
  export declare const useActionsApi: () => {
3
3
  getCompiledEmail: (options?: GetCompiledEmailOptions) => Promise<CompiledEmailResult>;
4
+ getRawTemplateData: () => Promise<TemplateDataResult>;
4
5
  activateCustomViewStyles: (isActive?: boolean) => void;
5
6
  };
@@ -1,38 +1,48 @@
1
- const g = () => ({ getCompiledEmail: (t = {}) => new Promise((i, a) => {
2
- const s = { ...{
3
- minimize: !0,
4
- utmEntity: {
5
- utmSource: "",
6
- utmMedium: "",
7
- utmCampaign: "",
8
- utmContent: "",
9
- utmTerm: "",
10
- customUtms: [
11
- {
12
- name1: "val1",
13
- name2: "val2"
14
- }
15
- ]
16
- },
17
- mergeTags: ["Tag1", "Tag2"],
18
- forseAmp: !1,
19
- resetDataSavedFlag: !1,
20
- disableLineHeightsReplace: !0
21
- }, ...t }, o = {
22
- callback: (e, m, l, n, c) => {
23
- e ? a(e) : i({
24
- html: m,
25
- ampHtml: l,
26
- ampErrors: n,
27
- displayConditions: c
28
- });
29
- },
30
- ...s
31
- };
32
- window.StripoEditorApi.actionsApi.compileEmail(o);
33
- }), activateCustomViewStyles: (t = !0) => {
34
- window.StripoEditorApi.actionsApi.activateCustomViewStyles(t);
35
- } });
1
+ const g = () => ({
2
+ getCompiledEmail: (t = {}) => new Promise((e, a) => {
3
+ const o = {
4
+ ...{ ...{
5
+ minimize: !0,
6
+ utmEntity: {
7
+ utmSource: "",
8
+ utmMedium: "",
9
+ utmCampaign: "",
10
+ utmContent: "",
11
+ utmTerm: "",
12
+ customUtms: [
13
+ {
14
+ name1: "val1",
15
+ name2: "val2"
16
+ }
17
+ ]
18
+ },
19
+ mergeTags: ["Tag1", "Tag2"],
20
+ forseAmp: !1,
21
+ resetDataSavedFlag: !1,
22
+ disableLineHeightsReplace: !0
23
+ }, ...t },
24
+ callback: (i, s, m, n, l) => {
25
+ i ? a(i) : e({
26
+ html: s,
27
+ ampHtml: m,
28
+ ampErrors: n,
29
+ displayConditions: l
30
+ });
31
+ }
32
+ };
33
+ window.StripoEditorApi.actionsApi.compileEmail(o);
34
+ }),
35
+ getRawTemplateData: () => new Promise((t) => {
36
+ window.StripoEditorApi.actionsApi.getTemplateData(
37
+ (e) => {
38
+ t(e);
39
+ }
40
+ );
41
+ }),
42
+ activateCustomViewStyles: (t = !0) => {
43
+ window.StripoEditorApi.actionsApi.activateCustomViewStyles(t);
44
+ }
45
+ });
36
46
  export {
37
47
  g as useActionsApi
38
48
  };
@@ -1,18 +1,20 @@
1
- import { ref as p, computed as v } from "vue";
2
- const j = (y = {}) => {
3
- const h = p(!1), a = p(null), u = p(null), E = v(() => h.value), g = v(() => a.value !== null), T = {
1
+ import { ref as p, computed as T } from "vue";
2
+ import { getCsrfToken as H } from "../utils/generic.js";
3
+ const k = (b = {}) => {
4
+ const h = p(!1), a = p(null), u = p(null), g = T(() => h.value), y = T(() => a.value !== null), v = {
4
5
  baseURL: "",
5
6
  timeout: 1e4,
6
7
  retry: 0,
7
8
  retryDelay: 1e3,
8
9
  headers: {
9
- "Content-Type": "application/json"
10
+ "Content-Type": "application/json",
11
+ "X-CSRF-TOKEN": H()
10
12
  },
11
- ...y
13
+ ...b
12
14
  }, w = (e, s) => {
13
15
  if (e.startsWith("http://") || e.startsWith("https://"))
14
16
  return e;
15
- const t = s || T.baseURL || "";
17
+ const t = s || v.baseURL || "";
16
18
  return t.endsWith("/") && e.startsWith("/") ? `${t}${e.slice(1)}` : t.endsWith("/") || e.startsWith("/") ? `${t}${e}` : `${t}/${e}`;
17
19
  }, P = (e) => new Promise((s, t) => {
18
20
  setTimeout(() => {
@@ -22,20 +24,20 @@ const j = (y = {}) => {
22
24
  setTimeout(s, e);
23
25
  }), i = async (e, s, t, D = {}) => {
24
26
  a.value = null, h.value = !0, u.value = new AbortController();
25
- const n = { ...T, ...D }, L = w(s, n.baseURL), c = {
27
+ const n = { ...v, ...D }, L = w(s, n.baseURL), c = {
26
28
  method: e,
27
29
  headers: { ...n.headers },
28
30
  signal: u.value.signal,
29
31
  ...n
30
32
  };
31
33
  t && ["POST", "PUT", "PATCH"].includes(e) && (t instanceof FormData ? (delete c.headers["Content-Type"], c.body = t) : c.body = JSON.stringify(t));
32
- const b = async (m = 0) => {
34
+ const E = async (m = 0) => {
33
35
  try {
34
36
  const o = [fetch(L, c)];
35
37
  n.timeout && o.push(P(n.timeout));
36
38
  const r = await Promise.race(o);
37
39
  if (!r.ok) {
38
- const H = `HTTP Error: ${r.status} ${r.statusText}`, d = new Error(H);
40
+ const O = `HTTP Error: ${r.status} ${r.statusText}`, d = new Error(O);
39
41
  throw d.status = r.status, d.statusText = r.statusText, d.response = r, d;
40
42
  }
41
43
  let f;
@@ -49,36 +51,36 @@ const j = (y = {}) => {
49
51
  } catch (o) {
50
52
  const r = o instanceof Error && o.name === "AbortError";
51
53
  if (m < (n.retry || 0) && !r)
52
- return await x(n.retryDelay || 1e3), b(m + 1);
54
+ return await x(n.retryDelay || 1e3), E(m + 1);
53
55
  throw o instanceof Error ? o.name === "AbortError" ? a.value = { message: "Request was cancelled" } : a.value = { message: o.message } : a.value = o, o;
54
56
  }
55
57
  };
56
58
  try {
57
- return await b();
59
+ return await E();
58
60
  } finally {
59
61
  h.value = !1, u.value = null;
60
62
  }
61
- }, $ = (e, s) => i("GET", e, void 0, s), C = (e, s, t) => i("POST", e, s, t), U = (e, s, t) => i("PUT", e, s, t), A = (e, s, t) => i("PATCH", e, s, t), R = (e, s) => i("DELETE", e, void 0, s), W = (e) => {
63
+ }, C = (e, s) => i("GET", e, void 0, s), $ = (e, s, t) => i("POST", e, s, t), R = (e, s, t) => i("PUT", e, s, t), U = (e, s, t) => i("PATCH", e, s, t), A = (e, s) => i("DELETE", e, void 0, s), W = (e) => {
62
64
  u.value && u.value.abort(e);
63
65
  }, q = () => {
64
66
  a.value = null;
65
67
  };
66
68
  return {
67
69
  // State
68
- loading: E,
69
- error: v(() => a.value),
70
- hasError: g,
70
+ loading: g,
71
+ error: T(() => a.value),
72
+ hasError: y,
71
73
  // Methods
72
74
  request: i,
73
- get: $,
74
- post: C,
75
- put: U,
76
- patch: A,
77
- delete: R,
75
+ get: C,
76
+ post: $,
77
+ put: R,
78
+ patch: U,
79
+ delete: A,
78
80
  cancel: W,
79
81
  clearError: q
80
82
  };
81
83
  };
82
84
  export {
83
- j as useHttp
85
+ k as useHttp
84
86
  };
@@ -0,0 +1,7 @@
1
+ import type { SaveTemplatePayload } from '@@/Types/save-as-template';
2
+ export declare const useSaveAsTemplate: () => {
3
+ state: {
4
+ saving: boolean;
5
+ };
6
+ saveTemplate: (data: SaveTemplatePayload) => Promise<boolean>;
7
+ };
@@ -0,0 +1,51 @@
1
+ import { useHttp as m } from "./useHttp.js";
2
+ import { base64EncodeWithSpecialChars as t } from "../utils/base64.js";
3
+ import { reactive as a } from "vue";
4
+ const u = () => {
5
+ const { post: o } = m(), n = a({
6
+ saving: !1
7
+ });
8
+ return {
9
+ state: n,
10
+ saveTemplate: async (e) => {
11
+ n.saving = !0;
12
+ const i = {
13
+ editor: "stripo",
14
+ html: t(e.htmlContent),
15
+ css: t(e.css)
16
+ }, c = t(JSON.stringify(i ?? ""));
17
+ try {
18
+ const s = {
19
+ name: e.name,
20
+ categories: e.categoryIds,
21
+ productId: 60,
22
+ editorType: 2,
23
+ messageType: 2,
24
+ stripoConfig: c,
25
+ content: t(e.htmlContent),
26
+ unsubscriptionPreferencePages: [],
27
+ unsubscriptionPreferencePageStatus: !1
28
+ };
29
+ e.css && (s.css = t(e.css)), e.stripoConfig && (s.stripoConfig = t(
30
+ JSON.stringify(e.stripoConfig)
31
+ )), e.recommendationConfigs && (s.recommendationConfigs = t(
32
+ JSON.stringify(e.recommendationConfigs)
33
+ )), e.recommendationCampaignUrls && (s.recommendationCampaignUrls = t(
34
+ JSON.stringify(e.recommendationCampaignUrls)
35
+ ));
36
+ const r = await o(
37
+ "/newsletter/template-library/create-template",
38
+ s
39
+ );
40
+ return !(!r.data || r.data.type === "error");
41
+ } catch {
42
+ return !1;
43
+ } finally {
44
+ n.saving = !1;
45
+ }
46
+ }
47
+ };
48
+ };
49
+ export {
50
+ u as useSaveAsTemplate
51
+ };
@@ -0,0 +1,7 @@
1
+ export declare function useTemplateNameValidation(): {
2
+ templateName: import("vue").Ref<string>;
3
+ getValidationMessage: () => string;
4
+ hasError: () => boolean;
5
+ validateInputs: () => Promise<boolean>;
6
+ resetValidation: () => void;
7
+ };
@@ -0,0 +1,33 @@
1
+ import { ref as r } from "vue";
2
+ import { useHttp as i } from "./useHttp.js";
3
+ import { useTranslations as m } from "./useTranslations.js";
4
+ const o = 255;
5
+ function h() {
6
+ const n = r(""), e = r(""), t = m();
7
+ return {
8
+ templateName: n,
9
+ getValidationMessage: () => e.value,
10
+ hasError: () => !!e.value.length,
11
+ validateInputs: async () => {
12
+ const a = n.value.trim();
13
+ if (!a)
14
+ return e.value = t("whatsapp-business.template-name-required"), !1;
15
+ if (a.length > o)
16
+ return e.value = t("validations.enter-up-to-x-characters", {
17
+ article: "a",
18
+ field: t("products.template-name"),
19
+ max: o
20
+ }), !1;
21
+ const l = encodeURIComponent(a), { data: s = {} } = await i().get(
22
+ `/newsletter/template-library/template-name-exists?name=${l}`
23
+ );
24
+ return s != null && s.status ? (e.value = t("whatsapp-business.template-name-exists"), !1) : !0;
25
+ },
26
+ resetValidation: () => {
27
+ e.value = "";
28
+ }
29
+ };
30
+ }
31
+ export {
32
+ h as useTemplateNameValidation
33
+ };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history-wrapper[data-v-52a77eec]{gap:8px}[data-v-6a2bde67] .guido__verion-history-view-option-selection-desktop svg,[data-v-6a2bde67] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6a2bde67] .in-segments-wrapper__button_selected,[data-v-6a2bde67] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-0fff376c] .guido__view-option-selection-desktop svg,[data-v-0fff376c] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-0fff376c] .in-segments-wrapper__button_selected,[data-v-0fff376c] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.guido-editor__wrapper[data-v-89bedf08],.guido-editor__container[data-v-89bedf08]{width:100%;height:calc(100vh - 75px)}
1
+ .version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history-wrapper[data-v-52a77eec]{gap:8px}[data-v-6a2bde67] .guido__verion-history-view-option-selection-desktop svg,[data-v-6a2bde67] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6a2bde67] .in-segments-wrapper__button_selected,[data-v-6a2bde67] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-0fff376c] .guido__view-option-selection-desktop svg,[data-v-0fff376c] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-0fff376c] .in-segments-wrapper__button_selected,[data-v-0fff376c] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.guido-editor__wrapper[data-v-66fa3f35],.guido-editor__container[data-v-66fa3f35]{width:100%;height:calc(100vh - 75px)}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("msw").HttpHandler[];
2
+ export default _default;
@@ -2,4 +2,5 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"editor", {
2
2
  isCodeEditorOpen: boolean;
3
3
  isVersionHistoryOpen: boolean;
4
4
  editorVisualMode: string;
5
+ isSaveTemplateModalOpen: boolean;
5
6
  }, {}, {}>;
@@ -3,7 +3,8 @@ const t = e("editor", {
3
3
  state: () => ({
4
4
  isCodeEditorOpen: !1,
5
5
  isVersionHistoryOpen: !1,
6
- editorVisualMode: "desktop"
6
+ editorVisualMode: "desktop",
7
+ isSaveTemplateModalOpen: !1
7
8
  })
8
9
  });
9
10
  export {
@@ -0,0 +1,41 @@
1
+ import type { TemplateCategory } from '@@/Types/save-as-template';
2
+ export interface MappedCategory {
3
+ value: string;
4
+ text: string;
5
+ }
6
+ export interface TemplateCategoriesState {
7
+ categories: TemplateCategory[];
8
+ mappedCategories: MappedCategory[];
9
+ selectedCategories: MappedCategory[];
10
+ loading: boolean;
11
+ loadingCreate: boolean;
12
+ }
13
+ export declare const useTemplateCategoriesStore: import("pinia").StoreDefinition<"templateCategories", TemplateCategoriesState, {
14
+ getSelectedCategoryIds: (state: {
15
+ categories: {
16
+ id: number;
17
+ name: string;
18
+ partnerId: number;
19
+ isStripo: boolean;
20
+ templatesCount: number;
21
+ }[];
22
+ mappedCategories: {
23
+ value: string;
24
+ text: string;
25
+ }[];
26
+ selectedCategories: {
27
+ value: string;
28
+ text: string;
29
+ }[];
30
+ loading: boolean;
31
+ loadingCreate: boolean;
32
+ } & import("pinia").PiniaCustomStateProperties<TemplateCategoriesState>) => number[];
33
+ }, {
34
+ fetchCategories(): Promise<void>;
35
+ checkCategoryNameExists(name: string): Promise<boolean>;
36
+ createCategory(name: string): Promise<void>;
37
+ setSelectedCategories(categories: MappedCategory[]): void;
38
+ selectCategory(category: MappedCategory): void;
39
+ resetSelection(): void;
40
+ resetStore(): void;
41
+ }>;
@@ -0,0 +1,91 @@
1
+ import { useHttp as c } from "../composables/useHttp.js";
2
+ import { useToaster as r } from "../composables/useToaster.js";
3
+ import { defineStore as g } from "pinia";
4
+ const l = () => ({
5
+ categories: [],
6
+ mappedCategories: [],
7
+ selectedCategories: [],
8
+ loading: !1,
9
+ loadingCreate: !1
10
+ }), m = g("templateCategories", {
11
+ state: () => l(),
12
+ getters: {
13
+ getSelectedCategoryIds: (e) => e.selectedCategories.map((s) => parseInt(s.value))
14
+ },
15
+ actions: {
16
+ async fetchCategories() {
17
+ this.loading = !0;
18
+ const { get: e } = c();
19
+ try {
20
+ const t = (await e("/newsletter/template-library/get-template-categories")).data || [];
21
+ this.categories = t, this.mappedCategories = t.map((a) => ({
22
+ value: a.id.toString(),
23
+ text: a.name
24
+ }));
25
+ } catch (s) {
26
+ const { handleError: t } = r();
27
+ t(s, "Error fetching template categories:"), this.categories = [], this.mappedCategories = [];
28
+ } finally {
29
+ this.loading = !1;
30
+ }
31
+ },
32
+ async checkCategoryNameExists(e) {
33
+ const { get: s } = c();
34
+ try {
35
+ const a = `/newsletter/template-library/category-name-exists?name=${encodeURIComponent(e)}`;
36
+ return (await s(a)).data.status;
37
+ } catch (t) {
38
+ const { handleError: a } = r();
39
+ return a(t, "Error checking category name:"), !1;
40
+ }
41
+ },
42
+ async createCategory(e) {
43
+ this.loadingCreate = !0;
44
+ const { post: s } = c(), { showToaster: t } = r();
45
+ try {
46
+ if (await this.checkCategoryNameExists(e)) {
47
+ t({
48
+ type: "error",
49
+ message: "Category name already exists"
50
+ });
51
+ return;
52
+ }
53
+ const i = (await s("/newsletter/template-library/create-category", { name: e })).data;
54
+ if (i) {
55
+ this.categories.push(i);
56
+ const n = {
57
+ value: i.id.toString(),
58
+ text: e
59
+ };
60
+ this.mappedCategories.push(n), this.selectedCategories.push(n), t({
61
+ type: "success",
62
+ message: "Category created successfully"
63
+ });
64
+ }
65
+ } catch (a) {
66
+ const { handleError: o } = r();
67
+ o(a, "Error creating category:");
68
+ } finally {
69
+ this.loadingCreate = !1;
70
+ }
71
+ },
72
+ setSelectedCategories(e) {
73
+ this.selectedCategories = [...e];
74
+ },
75
+ selectCategory(e) {
76
+ const s = this.selectedCategories.findIndex(
77
+ (t) => t.value === e.value
78
+ );
79
+ s === -1 ? this.selectedCategories.push(e) : this.selectedCategories.splice(s, 1);
80
+ },
81
+ resetSelection() {
82
+ this.selectedCategories = [];
83
+ },
84
+ resetStore() {
85
+ Object.assign(this, l());
86
+ }
87
+ }
88
+ });
89
+ export {
90
+ m as useTemplateCategoriesStore
91
+ };
@@ -0,0 +1,2 @@
1
+ export declare const base64EncodeWithSpecialChars: (input: string) => string;
2
+ export declare const base64DecodeWithSpecialChars: (input: string) => string;
@@ -0,0 +1,14 @@
1
+ const c = (e) => {
2
+ try {
3
+ const n = new TextEncoder().encode(e);
4
+ let o = "";
5
+ return n.forEach((r) => {
6
+ o += String.fromCharCode(r);
7
+ }), window.btoa(o);
8
+ } catch {
9
+ return window.btoa(unescape(encodeURIComponent(e)));
10
+ }
11
+ };
12
+ export {
13
+ c as base64EncodeWithSpecialChars
14
+ };
@@ -0,0 +1 @@
1
+ export declare const getCsrfToken: () => string;
@@ -0,0 +1,7 @@
1
+ const t = () => {
2
+ var e;
3
+ return ((e = document.head.querySelector('meta[name="csrf-token"]')) == null ? void 0 : e.getAttribute("content")) ?? "";
4
+ };
5
+ export {
6
+ t as getCsrfToken
7
+ };
@@ -0,0 +1,2 @@
1
+ export declare function getValueFromDotNotation<T extends object>(path: string, obj: T): unknown;
2
+ export declare function isEmpty(value: unknown): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "1.0.0-beta.b8ba815",
3
+ "version": "1.0.0-beta.c2acdd4",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",
@@ -31,8 +31,6 @@
31
31
  "dependencies": {
32
32
  "@stripoinc/ui-editor-extensions": "^1.0.6",
33
33
  "@useinsider/design-system-vue": "0.14.8",
34
- "@vuelidate/core": "2.0.3",
35
- "@vuelidate/validators": "2.0.4",
36
34
  "lodash-es": "4.17.21",
37
35
  "pinia": "2.3.1",
38
36
  "vite": "6.3.5",