@useinsider/guido 3.2.0-beta.803b92e → 3.2.0-beta.8220f9d

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 (113) hide show
  1. package/README.md +1 -25
  2. package/dist/@types/config/schemas.js +2 -2
  3. package/dist/components/Guido.vue.js +5 -5
  4. package/dist/components/Guido.vue2.js +88 -78
  5. package/dist/components/organisms/chat/blueprint/BlueprintCard.vue.js +20 -0
  6. package/dist/components/organisms/chat/blueprint/BlueprintCard.vue2.js +20 -0
  7. package/dist/components/organisms/chat/blueprint/EmailTemplateBlueprintCard.vue.js +23 -0
  8. package/dist/components/organisms/chat/blueprint/EmailTemplateBlueprintCard.vue2.js +18 -0
  9. package/dist/components/organisms/chat/chatbox/ChatboxContainer.vue.js +18 -0
  10. package/dist/components/organisms/chat/chatbox/ChatboxContainer.vue2.js +16 -0
  11. package/dist/components/organisms/chat/chatbox/ChatboxPanel.vue.js +20 -0
  12. package/dist/components/organisms/chat/chatbox/ChatboxPanel.vue2.js +19 -0
  13. package/dist/components/organisms/chat/conversation/ChatConversation.vue.js +28 -0
  14. package/dist/components/organisms/chat/conversation/ChatConversation.vue2.js +20 -0
  15. package/dist/components/organisms/chat/conversation/ChatWelcome.vue.js +18 -0
  16. package/dist/components/organisms/chat/conversation/ChatWelcome.vue2.js +11 -0
  17. package/dist/components/organisms/chat/conversation/QuickActionChips.vue.js +22 -0
  18. package/dist/components/organisms/chat/conversation/QuickActionChips.vue2.js +42 -0
  19. package/dist/components/organisms/chat/input/ChatInput.vue.js +29 -0
  20. package/dist/components/organisms/chat/input/ChatInput.vue2.js +39 -0
  21. package/dist/components/organisms/chat/input/GuidoAgentSelector.vue.js +22 -0
  22. package/dist/components/organisms/chat/input/GuidoAgentSelector.vue2.js +29 -0
  23. package/dist/components/organisms/chat/messages/AiMessage.vue.js +26 -0
  24. package/dist/components/organisms/chat/messages/AiMessage.vue2.js +41 -0
  25. package/dist/components/organisms/chat/messages/AiMessageActions.vue.js +18 -0
  26. package/dist/components/organisms/chat/messages/AiMessageActions.vue2.js +27 -0
  27. package/dist/components/organisms/chat/messages/ChatLoading.vue.js +18 -0
  28. package/dist/components/organisms/chat/messages/ChatLoading.vue2.js +30 -0
  29. package/dist/components/organisms/chat/messages/ChatMessages.vue.js +26 -0
  30. package/dist/components/organisms/chat/messages/ChatMessages.vue2.js +67 -0
  31. package/dist/components/organisms/chat/messages/UserMessage.vue.js +18 -0
  32. package/dist/components/organisms/chat/messages/UserMessage.vue2.js +26 -0
  33. package/dist/components/organisms/header/RightSlot.vue.js +8 -8
  34. package/dist/components/organisms/header/RightSlot.vue2.js +8 -9
  35. package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
  36. package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
  37. package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
  38. package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
  39. package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
  40. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
  41. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
  42. package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
  43. package/dist/composables/useChatState.js +130 -0
  44. package/dist/composables/useChatStreaming.js +191 -0
  45. package/dist/composables/useConversationEvents.js +37 -0
  46. package/dist/composables/useEmailTemplateApplier.js +41 -0
  47. package/dist/composables/useRibbonOffset.js +21 -0
  48. package/dist/composables/useSave.js +15 -15
  49. package/dist/config/compiler/unsubscribeCompilerRules.js +40 -37
  50. package/dist/enums/onboarding.js +7 -2
  51. package/dist/enums/unsubscribe.js +34 -27
  52. package/dist/guido.css +1 -1
  53. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +258 -235
  54. package/dist/node_modules/@vueuse/core/index.js +127 -0
  55. package/dist/node_modules/@vueuse/shared/index.js +68 -27
  56. package/dist/node_modules/dompurify/dist/purify.es.js +595 -0
  57. package/dist/node_modules/marked/lib/marked.esm.js +1152 -0
  58. package/dist/package.json.js +1 -1
  59. package/dist/services/chatService.js +163 -0
  60. package/dist/services/templateLibraryApi.js +5 -4
  61. package/dist/src/@types/chat.d.ts +138 -0
  62. package/dist/src/@types/config/schemas.d.ts +4 -4
  63. package/dist/src/components/Guido.vue.d.ts +5 -1
  64. package/dist/src/components/organisms/chat/blueprint/BlueprintCard.vue.d.ts +38 -0
  65. package/dist/src/components/organisms/chat/blueprint/EmailTemplateBlueprintCard.vue.d.ts +35 -0
  66. package/dist/src/components/organisms/chat/chatbox/ChatboxContainer.vue.d.ts +4 -0
  67. package/dist/src/components/organisms/chat/chatbox/ChatboxPanel.vue.d.ts +4 -0
  68. package/dist/src/components/organisms/chat/conversation/ChatConversation.vue.d.ts +31 -0
  69. package/dist/src/components/organisms/chat/conversation/QuickActionChips.vue.d.ts +30 -0
  70. package/dist/src/components/organisms/chat/input/ChatInput.vue.d.ts +37 -0
  71. package/dist/src/components/organisms/chat/messages/AiMessage.vue.d.ts +33 -0
  72. package/dist/src/components/organisms/chat/messages/AiMessageActions.vue.d.ts +18 -0
  73. package/dist/src/components/organisms/chat/messages/ChatLoading.vue.d.ts +32 -0
  74. package/dist/src/components/organisms/chat/messages/ChatMessages.vue.d.ts +37 -0
  75. package/dist/src/components/organisms/chat/messages/UserMessage.vue.d.ts +35 -0
  76. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  77. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  78. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  79. package/dist/src/composables/useChatState.d.ts +26 -0
  80. package/dist/src/composables/useChatStreaming.d.ts +26 -0
  81. package/dist/src/composables/useConfig.d.ts +2 -2
  82. package/dist/src/composables/useConversationEvents.d.ts +19 -0
  83. package/dist/src/composables/useEmailTemplateApplier.d.ts +21 -0
  84. package/dist/src/composables/useRibbonOffset.d.ts +4 -0
  85. package/dist/src/composables/useSave.d.ts +1 -1
  86. package/dist/src/enums/onboarding.d.ts +6 -0
  87. package/dist/src/enums/unsubscribe.d.ts +5 -0
  88. package/dist/src/services/chatService.d.ts +16 -0
  89. package/dist/src/stores/chat.d.ts +323 -0
  90. package/dist/src/stores/config.d.ts +18 -18
  91. package/dist/src/stores/editor.d.ts +23 -0
  92. package/dist/src/stores/onboarding.d.ts +4 -0
  93. package/dist/src/utils/generateId.d.ts +1 -0
  94. package/dist/src/utils/markdown.d.ts +1 -0
  95. package/dist/stores/chat.js +26 -0
  96. package/dist/stores/editor.js +1 -0
  97. package/dist/stores/onboarding.js +4 -0
  98. package/dist/utils/generateId.js +7 -0
  99. package/dist/utils/markdown.js +21 -0
  100. package/dist/utils/pairProductVariables.js +89 -88
  101. package/package.json +6 -3
  102. package/dist/components/organisms/AutoSaveController.vue.js +0 -17
  103. package/dist/components/organisms/AutoSaveController.vue2.js +0 -13
  104. package/dist/components/organisms/header/AutoSaveToggle.vue.js +0 -22
  105. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +0 -19
  106. package/dist/composables/useAutoSave.js +0 -68
  107. package/dist/src/composables/useAutoSave.d.ts +0 -3
  108. package/dist/src/stores/autosave.d.ts +0 -6
  109. package/dist/src/utils/timeUtil.d.ts +0 -8
  110. package/dist/stores/autosave.js +0 -11
  111. package/dist/utils/timeUtil.js +0 -19
  112. /package/dist/src/components/organisms/{AutoSaveController.vue.d.ts → chat/conversation/ChatWelcome.vue.d.ts} +0 -0
  113. /package/dist/src/components/organisms/{header/AutoSaveToggle.vue.d.ts → chat/input/GuidoAgentSelector.vue.d.ts} +0 -0
@@ -0,0 +1,191 @@
1
+ import { generateId as u } from "../utils/generateId.js";
2
+ const S = (h) => {
3
+ const {
4
+ messages: d,
5
+ conversationId: F,
6
+ isLoading: b,
7
+ assistantMsgId: p,
8
+ addOrUpdateBlueprint: w
9
+ } = h, n = [], g = [];
10
+ let r = "";
11
+ const i = (e = {}) => {
12
+ const c = d.value.findIndex((m) => m.id === p);
13
+ c < 0 || d.value.splice(c, 1, {
14
+ ...d.value[c],
15
+ ...e,
16
+ segments: [...n]
17
+ });
18
+ }, f = () => {
19
+ if (!r)
20
+ return;
21
+ const e = n[n.length - 1];
22
+ e && e.type === "text" ? e.content = r : n.push({
23
+ _id: u("seg"),
24
+ type: "text",
25
+ content: r
26
+ }), i({});
27
+ };
28
+ return { handleEvent: (e) => {
29
+ var c, m, k, x;
30
+ switch (e.type) {
31
+ case "text": {
32
+ r += e.content ?? "";
33
+ const t = n[n.length - 1];
34
+ t && t.type === "text" ? t.content = r : n.push({
35
+ _id: u("seg"),
36
+ type: "text",
37
+ content: r
38
+ }), i({ currentStatus: void 0 });
39
+ break;
40
+ }
41
+ case "agent_start": {
42
+ f(), r = "";
43
+ const t = e.id ?? e.toolCallId ?? u("seg"), a = (e.name ?? "tool").replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()), o = g[g.length - 1] ?? null;
44
+ n.push({
45
+ _id: u("seg"),
46
+ type: "tool",
47
+ toolCallId: t,
48
+ name: a,
49
+ isRunning: !0,
50
+ startedAt: Date.now(),
51
+ ownerAgentId: o
52
+ }), g.push(t);
53
+ const s = ((c = d.value.find((l) => l.id === p)) == null ? void 0 : c.agentFlow) ?? [];
54
+ i({
55
+ agentFlow: [
56
+ ...s,
57
+ {
58
+ id: t,
59
+ name: a,
60
+ parentId: o,
61
+ startedAt: Date.now()
62
+ }
63
+ ]
64
+ });
65
+ break;
66
+ }
67
+ case "agent_end": {
68
+ const t = e.id ?? e.toolCallId, a = n.findIndex(
69
+ (l) => l.type === "tool" && l.toolCallId === t
70
+ );
71
+ a >= 0 && (n[a].endedAt = Date.now(), e.success ? n.splice(a, 1) : (n[a].isRunning = !1, n[a].error = !0));
72
+ const o = g.lastIndexOf(t ?? "");
73
+ o >= 0 && g.splice(o, 1);
74
+ const s = (m = d.value.find((l) => l.id === p)) == null ? void 0 : m.agentFlow;
75
+ if (s) {
76
+ const l = s.map((I) => I.id === t ? { ...I, success: !!e.success, endedAt: Date.now() } : I);
77
+ i({ agentFlow: l });
78
+ } else
79
+ i({});
80
+ break;
81
+ }
82
+ case "agent_handoff": {
83
+ const t = e.toAgent ?? e.id;
84
+ if (!t)
85
+ break;
86
+ const a = (e.objective ?? e.message ?? "").trim();
87
+ if (!a)
88
+ break;
89
+ const o = (k = d.value.find((s) => s.id === p)) == null ? void 0 : k.agentFlow;
90
+ if (o && o.some((s) => s.id === t))
91
+ i({
92
+ agentFlow: o.map((s) => s.id === t ? { ...s, description: s.description ?? a } : s)
93
+ });
94
+ else {
95
+ const s = {
96
+ id: t,
97
+ name: (e.toAgent ?? "agent").replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()),
98
+ parentId: e.fromAgent ?? e.parentId ?? null,
99
+ description: a
100
+ };
101
+ i({ agentFlow: [...o ?? [], s] });
102
+ }
103
+ break;
104
+ }
105
+ case "agent_result": {
106
+ const t = e.id ?? e.toAgent;
107
+ if (!t)
108
+ break;
109
+ const a = (e.summary ?? "").trim(), o = (x = d.value.find((s) => s.id === p)) == null ? void 0 : x.agentFlow;
110
+ if (!o)
111
+ break;
112
+ i({
113
+ agentFlow: o.map((s) => s.id === t ? {
114
+ ...s,
115
+ description: a || s.description,
116
+ success: typeof e.success == "boolean" ? e.success : s.success,
117
+ endedAt: s.endedAt ?? Date.now()
118
+ } : s)
119
+ });
120
+ break;
121
+ }
122
+ case "tool_call": {
123
+ const t = [...n].reverse().find(
124
+ (a) => a.type === "tool" && a.isRunning
125
+ );
126
+ t && (t.title = e.name ?? "", i({}));
127
+ break;
128
+ }
129
+ case "status": {
130
+ const t = e.message ?? "";
131
+ i({ currentStatus: t || void 0 });
132
+ break;
133
+ }
134
+ case "blueprint_create":
135
+ case "blueprint_update": {
136
+ const t = {
137
+ id: e.blueprintId ?? "",
138
+ type: e.blueprintType ?? "unknown",
139
+ title: e.title ?? "",
140
+ data: e.data ?? {},
141
+ version: e.version ?? 1,
142
+ status: e.status ?? "draft"
143
+ };
144
+ w && w(t), f(), r = "";
145
+ const a = n.findIndex(
146
+ (s) => s.type === "blueprint" && s.blueprintId === t.id
147
+ ), o = {
148
+ _id: a >= 0 ? n[a]._id : u("seg"),
149
+ type: "blueprint",
150
+ blueprintId: t.id,
151
+ blueprintType: t.type,
152
+ title: t.title,
153
+ blueprintData: t.data,
154
+ version: t.version,
155
+ status: t.status
156
+ };
157
+ a >= 0 ? n[a] = o : n.push(o), i({});
158
+ break;
159
+ }
160
+ case "done": {
161
+ f(), e.conversationId && (F.value = e.conversationId), i({
162
+ isStreaming: !1,
163
+ content: r,
164
+ traceId: e.traceId ?? null
165
+ }), b.value = !1;
166
+ break;
167
+ }
168
+ case "error": {
169
+ n.push({
170
+ _id: u("seg"),
171
+ type: "error",
172
+ content: e.message ?? "An error occurred"
173
+ }), i({
174
+ isStreaming: !1,
175
+ isError: !0
176
+ }), b.value = !1;
177
+ break;
178
+ }
179
+ case "cancelled": {
180
+ i({
181
+ isStreaming: !1,
182
+ isCancelled: !0
183
+ }), b.value = !1;
184
+ break;
185
+ }
186
+ }
187
+ }, segments: n, flushText: f };
188
+ };
189
+ export {
190
+ S as createStreamHandler
191
+ };
@@ -0,0 +1,37 @@
1
+ import { useChatState as h } from "./useChatState.js";
2
+ import { useClipboard as u } from "../node_modules/@vueuse/core/index.js";
3
+ const M = () => {
4
+ const {
5
+ messages: s,
6
+ isLoading: t,
7
+ hasMessages: o,
8
+ blueprints: a,
9
+ activeBlueprint: d,
10
+ sendMessage: r,
11
+ cancelStream: i,
12
+ retryLastUserMessage: c
13
+ } = h(), { copy: l } = u();
14
+ return {
15
+ messages: s,
16
+ isLoading: t,
17
+ hasMessages: o,
18
+ blueprints: a,
19
+ activeBlueprint: d,
20
+ handleSend: (n) => {
21
+ r(n);
22
+ },
23
+ handleStop: () => {
24
+ i();
25
+ },
26
+ handleRetry: () => {
27
+ c();
28
+ },
29
+ handleCopyMessage: (n) => {
30
+ const e = s.value.find((p) => p.id === n);
31
+ e != null && e.content && l(e.content);
32
+ }
33
+ };
34
+ };
35
+ export {
36
+ M as useConversationEvents
37
+ };
@@ -0,0 +1,41 @@
1
+ import { useActionsApi as u } from "./useActionsApi.js";
2
+ import { useToaster as T } from "./useToaster.js";
3
+ import { useTranslations as f } from "./useTranslations.js";
4
+ import { ToasterTypeOptions as n } from "../enums/toaster.js";
5
+ import { ref as y } from "vue";
6
+ const h = 250, s = y({}), o = {}, j = () => {
7
+ const { updateHtmlAndCss: l } = u(), { showToaster: r } = T(), i = f(), c = (e, t, p) => {
8
+ s.value = { ...s.value, [e]: "applying" };
9
+ try {
10
+ l(t, p), s.value = { ...s.value, [e]: "applied" }, r({
11
+ type: n.Success,
12
+ message: i("newsletter.ai-template-applied")
13
+ });
14
+ } catch (a) {
15
+ s.value = { ...s.value, [e]: "failed" }, r({
16
+ type: n.Alert,
17
+ message: a instanceof Error ? a.message : "Failed to apply template"
18
+ });
19
+ }
20
+ }, m = (e) => {
21
+ const t = o[e];
22
+ t && (clearTimeout(t), delete o[e]);
23
+ };
24
+ return { applyStatus: s, applyTemplate: (e, t) => {
25
+ t.html && (m(e), c(e, t.html, t.css ?? ""));
26
+ }, applyTemplateDebounced: (e, t) => {
27
+ if (!t.html)
28
+ return;
29
+ m(e);
30
+ const { html: p } = t, a = t.css ?? "";
31
+ o[e] = setTimeout(() => {
32
+ delete o[e], c(e, p, a);
33
+ }, h);
34
+ } };
35
+ }, w = () => {
36
+ Object.values(o).forEach(clearTimeout), Object.keys(o).forEach((l) => delete o[l]), s.value = {};
37
+ };
38
+ export {
39
+ w as resetEmailTemplateApplier,
40
+ j as useEmailTemplateApplier
41
+ };
@@ -0,0 +1,21 @@
1
+ import { RIBBON_SELECTOR as r } from "../enums/onboarding.js";
2
+ import { ref as f, onMounted as c, onBeforeUnmount as i } from "vue";
3
+ const m = () => {
4
+ const o = f(0);
5
+ let e = null;
6
+ const n = () => {
7
+ const t = document.querySelector(r), s = (t == null ? void 0 : t.offsetHeight) ?? 0;
8
+ o.value !== s && (o.value = s);
9
+ }, u = (t) => `${t + o.value}px`;
10
+ return c(() => {
11
+ n(), e = new MutationObserver(n), e.observe(document.body, {
12
+ childList: !0,
13
+ subtree: !0
14
+ });
15
+ }), i(() => {
16
+ e == null || e.disconnect();
17
+ }), { ribbonOffset: o, getTopPosition: u };
18
+ };
19
+ export {
20
+ m as useRibbonOffset
21
+ };
@@ -1,17 +1,17 @@
1
- import { useActionsApi as V } from "./useActionsApi.js";
2
- import { useConfig as x } from "./useConfig.js";
3
- import { useSaveStart as y, useSaveComplete as w } from "./useGuidoActions.js";
4
- import { useSyncModuleExtractor as b } from "./useSyncModuleExtractor.js";
5
- import { useStripoApi as q } from "../services/stripoApi.js";
6
- import { useTemplatePreparation as H } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as L } from "./useHtmlValidator.js";
8
- import { useLiquidValidator as P } from "./validators/useLiquidValidator.js";
9
- const U = () => {
10
- const o = y(), s = w(), { validateHtml: r } = L(), { validateLiquidSyntax: n } = P(), { callbacks: a, isFeatureEnabled: l } = x(), { extractSyncModuleData: d } = b(), { setSyncModuleUnsubscriptionPages: u } = q(), { editorSave: c } = V();
11
- return { save: async (m = !1, p = !1) => {
1
+ import { useActionsApi as S } from "./useActionsApi.js";
2
+ import { useConfig as V } from "./useConfig.js";
3
+ import { useSaveStart as x, useSaveComplete as y } from "./useGuidoActions.js";
4
+ import { useSyncModuleExtractor as w } from "./useSyncModuleExtractor.js";
5
+ import { useStripoApi as b } from "../services/stripoApi.js";
6
+ import { useTemplatePreparation as q } from "../utils/templatePreparation.js";
7
+ import { useHtmlValidator as H } from "./useHtmlValidator.js";
8
+ import { useLiquidValidator as L } from "./validators/useLiquidValidator.js";
9
+ const F = () => {
10
+ const o = x(), s = y(), { validateHtml: r } = H(), { validateLiquidSyntax: n } = L(), { callbacks: a, isFeatureEnabled: l } = V(), { extractSyncModuleData: d } = w(), { setSyncModuleUnsubscriptionPages: u } = b(), { editorSave: c } = S();
11
+ return { save: async (m = !1) => {
12
12
  var i;
13
13
  o();
14
- const { prepareTemplateDetails: f } = H(), t = await f();
14
+ const { prepareTemplateDetails: p } = q(), t = await p();
15
15
  if (l("liquidSyntax")) {
16
16
  if (!await n(t.compiledHtml))
17
17
  return;
@@ -20,10 +20,10 @@ const U = () => {
20
20
  if ((i = a.value) != null && i.externalValidation && !await a.value.externalValidation(t))
21
21
  return;
22
22
  await c();
23
- const { unsubscribePayload: v, stripoModules: S } = d(t.rawHtml);
24
- return await u(v), t.modules = S, m || s({ ...t, silent: p }), t;
23
+ const { unsubscribePayload: f, stripoModules: v } = d(t.rawHtml);
24
+ return await u(f), t.modules = v, m || s(t), t;
25
25
  } };
26
26
  };
27
27
  export {
28
- U as useSave
28
+ F as useSave
29
29
  };
@@ -1,41 +1,44 @@
1
- import { usePartner as y } from "../../composables/usePartner.js";
2
- import { LINK_REGEXES as p, LINK_TYPES as S, INSIDER_ID as m, URLS as R } from "../../enums/unsubscribe.js";
3
- import { parsePageList as I } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
4
- import { useConfigStore as N } from "../../stores/config.js";
5
- import { useDynamicContentStore as U } from "../../stores/dynamic-content.js";
6
- import { useUnsubscribeStore as C } from "../../stores/unsubscribe.js";
7
- const G = [
1
+ import { usePartner as U } from "../../composables/usePartner.js";
2
+ import { LINK_REGEXES as p, PRODUCT_TYPE_URL_SEGMENTS as R, LINK_TYPES as _, INSIDER_ID as m, URLS as y } from "../../enums/unsubscribe.js";
3
+ import { parsePageList as N } from "../../extensions/Blocks/Unsubscribe/utils/utils.js";
4
+ import { useConfigStore as C } from "../../stores/config.js";
5
+ import { useDynamicContentStore as L } from "../../stores/dynamic-content.js";
6
+ import { useUnsubscribeStore as P } from "../../stores/unsubscribe.js";
7
+ import { ProductType as B } from "../../@types/config/schemas.js";
8
+ import "../../@types/config/defaults.js";
9
+ const F = [
8
10
  {
9
11
  id: "add-unsubscribe-link-values",
10
12
  description: "Adding unsubscribe link values",
11
13
  type: "custom",
12
- processor: (t) => {
13
- const { getPartnerName: i } = y(), o = N(), s = U(), d = C(), a = o.variationId;
14
- if (!a)
15
- return t;
16
- let e = t;
17
- const r = `/${i()}/email/${a}?user={{iid}}`, E = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]");
18
- let c = !1, l = !1;
19
- return E.forEach((f) => {
20
- var b;
21
- const u = f.getAttribute("data-unsubscribe-page-list");
14
+ processor: (s) => {
15
+ const { getPartnerName: i } = U(), n = C(), t = L(), E = P(), c = n.variationId;
16
+ if (!c)
17
+ return s;
18
+ const r = R[n.productType] ?? R[B.EMAIL];
19
+ let e = s;
20
+ const d = `/${i()}/${r}/${c}?user={{iid}}`, f = new DOMParser().parseFromString(e, "text/html").querySelectorAll(".unsubscribe-block-v2[data-unsubscribe-page-list]");
21
+ let a = !1, l = !1;
22
+ return f.forEach((g) => {
23
+ var S;
24
+ const u = g.getAttribute("data-unsubscribe-page-list");
22
25
  if (!u)
23
26
  return;
24
- const _ = I(u), g = ((b = d.templates) == null ? void 0 : b.filter(
25
- (n) => _.includes(n.id)
27
+ const I = N(u), b = ((S = E.templates) == null ? void 0 : S.filter(
28
+ (o) => I.includes(o.id)
26
29
  )) ?? [];
27
- c = c || g.some((n) => n.type === S.UNSUBSCRIBE_LINK_TYPE), l = l || g.some((n) => n.type === S.PREFERENCES_LINK_TYPE);
28
- }), (c || l) && (s.selectedDynamicContentList.some((u) => u.value === m) || s.selectedDynamicContentList.push({
30
+ a = a || b.some((o) => o.type === _.UNSUBSCRIBE_LINK_TYPE), l = l || b.some((o) => o.type === _.PREFERENCES_LINK_TYPE);
31
+ }), (a || l) && (t.selectedDynamicContentList.some((u) => u.value === m) || t.selectedDynamicContentList.push({
29
32
  text: m,
30
33
  value: m,
31
34
  fallback: ""
32
- })), c && (e = e.replace(
35
+ })), a && (e = e.replace(
33
36
  p.GLOBAL_UNSUBSCRIBE_LINK_REGEX,
34
- R.UNSUBSCRIBE_URL + r
37
+ y.UNSUBSCRIBE_URL + d
35
38
  )), l && (e = e.replace(
36
39
  p.PREFERENCES_UNSUBSCRIBE_LINK_REGEX,
37
- R.PREFERENCES_URL + r
38
- )), E.length && (e = e.replace(p.UNSUBSCRIBE_LINK_REGEX, "")), e;
40
+ y.PREFERENCES_URL + d
41
+ )), f.length && (e = e.replace(p.UNSUBSCRIBE_LINK_REGEX, "")), e;
39
42
  },
40
43
  priority: 60
41
44
  },
@@ -52,25 +55,25 @@ const G = [
52
55
  id: "format-comment-braces",
53
56
  description: "Adding spaces around comment braces for proper formatting",
54
57
  type: "custom",
55
- processor: (t) => t.replace(/{#/g, "{ #").replace(/#}/g, "# }"),
58
+ processor: (s) => s.replace(/{#/g, "{ #").replace(/#}/g, "# }"),
56
59
  priority: 62
57
60
  },
58
61
  {
59
62
  id: "add-universal-link-flags",
60
63
  description: "Adding universal link flags",
61
64
  type: "custom",
62
- processor: (t) => {
63
- let i = t;
64
- const o = i.match(/<a[^>]+>(.*?)<\/a>/gm);
65
- return o && o.forEach((s) => {
66
- if (s.includes("insEmail=1"))
65
+ processor: (s) => {
66
+ let i = s;
67
+ const n = i.match(/<a[^>]+>(.*?)<\/a>/gm);
68
+ return n && n.forEach((t) => {
69
+ if (t.includes("insEmail=1"))
67
70
  return;
68
- if (s.match(/<a\s+(?:[^>]*?\s+)?href=(["'`”])(.*?)\1\s+(?:[^>]*?\s+)?universal=(["'`”])true\3/gm)) {
69
- const a = s.replace(/href=(["'`”])(.*?)\1/gm, (e) => {
70
- const r = e.slice(6, e.length - 1).trim();
71
- return e.includes("?") || e.includes("#") ? r.slice(-1) === "&" ? e.replace(r, `${r}insEmail=1`) : e.replace(r, `${r}&insEmail=1`) : e.replace(r, `${r}?insEmail=1`);
71
+ if (t.match(/<a\s+(?:[^>]*?\s+)?href=(["'`”])(.*?)\1\s+(?:[^>]*?\s+)?universal=(["'`”])true\3/gm)) {
72
+ const c = t.replace(/href=(["'`”])(.*?)\1/gm, (r) => {
73
+ const e = r.slice(6, r.length - 1).trim();
74
+ return r.includes("?") || r.includes("#") ? e.slice(-1) === "&" ? r.replace(e, `${e}insEmail=1`) : r.replace(e, `${e}&insEmail=1`) : r.replace(e, `${e}?insEmail=1`);
72
75
  });
73
- i = i.replace(s, a);
76
+ i = i.replace(t, c);
74
77
  }
75
78
  }), i;
76
79
  },
@@ -78,5 +81,5 @@ const G = [
78
81
  }
79
82
  ];
80
83
  export {
81
- G as unsubscribeCompilerRules
84
+ F as unsubscribeCompilerRules
82
85
  };
@@ -2,10 +2,15 @@ const e = [
2
2
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-0.ng-star-inserted",
3
3
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-1.ng-star-inserted",
4
4
  ".service-element.stacked-panel-item.ng-tns-c1014751574-3.level-bottom-2.ng-star-inserted"
5
- ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', o = ".in-ribbons-wrapper";
5
+ ], t = "ui-editor", n = 'button[role="tab"][aria-label="Card Composition"]', s = 'button[role="tab"][aria-label="Settings"]', E = ".in-ribbons-wrapper", o = ".guido__amp-toggle-html", a = ".in-segments-wrapper", O = '[data-testid="guido-header"]', _ = 158, i = 10;
6
6
  export {
7
+ o as AMP_TOGGLE_BUTTON_SELECTOR,
8
+ a as AMP_TOGGLE_WRAPPER_SELECTOR,
7
9
  n as CARD_COMPOSITION_TAB_SELECTOR,
8
- o as RIBBON_SELECTOR,
10
+ O as HEADER_SELECTOR,
11
+ _ as POPOVER_LEFT_OFFSET,
12
+ i as POPOVER_TOP_GAP,
13
+ E as RIBBON_SELECTOR,
9
14
  e as SERVICE_HOVER_SELECTORS,
10
15
  s as SETTINGS_TAB_SELECTOR,
11
16
  t as UI_EDITOR_SELECTOR
@@ -1,29 +1,35 @@
1
- import { useTranslations as e } from "../composables/useTranslations.js";
2
- import { getEnvironmentPrefix as R } from "../utils/environmentUtil.js";
3
- const _ = {
1
+ import { useTranslations as R } from "../composables/useTranslations.js";
2
+ import { ProductType as s } from "../@types/config/schemas.js";
3
+ import "../@types/config/defaults.js";
4
+ import { getEnvironmentPrefix as S } from "../utils/environmentUtil.js";
5
+ const B = {
4
6
  UNSUBSCRIBE_LINK_TYPE: 1,
5
7
  PREFERENCES_LINK_TYPE: 3
6
- }, I = {
8
+ }, i = {
7
9
  UNSUBSCRIBE_LINK_REGEX: /{{ins-unsubscribe-link}}/g,
8
10
  DATA_OGSB_BUTTON_CSS_REGEX: "\\[data-ogsb\\]\\s*\\.es-button\\.es-button-[0-9]+\\s*\\{(?:[^\\}]*)\\}",
9
11
  GLOBAL_UNSUBSCRIBE_LINK_REGEX: /{{ins-global-unsubscribe-link}}/g,
10
12
  PREFERENCES_UNSUBSCRIBE_LINK_REGEX: /{{ins-preferences-unsubscribe-link}}/g
11
- }, n = R(), r = {
13
+ }, n = S(), C = {
12
14
  UNSUBSCRIBE_URL: `https://mail.${n}.com/user/v1/unsub`,
13
15
  PREFERENCES_URL: `https://mail.${n}.com/user/v1/prefs`
14
- }, B = "iid", i = {
16
+ }, U = {
17
+ [s.EMAIL]: "email",
18
+ [s.ARCHITECT]: "journey",
19
+ [s.UNSUBSCRIBE_PAGES]: "email"
20
+ }, t = "iid", o = {
15
21
  name: "Global Unsubscribe",
16
22
  sendGridId: "G"
17
- }, C = "/email/unsubscribe-pages", E = {
23
+ }, c = "/email/unsubscribe-pages", E = {
18
24
  GLOBAL_UNSUBSCRIBE: 1,
19
25
  GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE: 2,
20
26
  SUBSCRIPTION_PREFERENCE_CENTER: 3,
21
27
  SUBSCRIPTION_PREFERENCE_CONFIRMATION: 4,
22
28
  RESUBSCRIBE: 5
23
- }, U = {
29
+ }, u = {
24
30
  [E.GLOBAL_UNSUBSCRIBE]: "custom-unsubscribe",
25
31
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "custom-preferences"
26
- }, t = {
32
+ }, T = {
27
33
  [E.GLOBAL_UNSUBSCRIBE]: [
28
34
  E.GLOBAL_UNSUBSCRIBE,
29
35
  E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE,
@@ -33,30 +39,31 @@ const _ = {
33
39
  E.SUBSCRIPTION_PREFERENCE_CENTER,
34
40
  E.SUBSCRIPTION_PREFERENCE_CONFIRMATION
35
41
  ]
36
- }, c = () => {
37
- const s = e();
42
+ }, b = () => {
43
+ const e = R();
38
44
  return {
39
- [E.GLOBAL_UNSUBSCRIBE]: s("unsubscription-preference.type-global-unsubscribe"),
40
- [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: s("unsubscription-preference.type-global-unsubscription-confirmation"),
41
- [E.RESUBSCRIBE]: s("unsubscription-preference.type-resubscribe"),
42
- [E.SUBSCRIPTION_PREFERENCE_CENTER]: s("unsubscription-preference.type-subscription-preferences-center"),
43
- [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: s("unsubscription-preference.type-subscription-preferences-confirmation")
45
+ [E.GLOBAL_UNSUBSCRIBE]: e("unsubscription-preference.type-global-unsubscribe"),
46
+ [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: e("unsubscription-preference.type-global-unsubscription-confirmation"),
47
+ [E.RESUBSCRIBE]: e("unsubscription-preference.type-resubscribe"),
48
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: e("unsubscription-preference.type-subscription-preferences-center"),
49
+ [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: e("unsubscription-preference.type-subscription-preferences-confirmation")
44
50
  };
45
- }, o = {
51
+ }, P = {
46
52
  default: "{{ins-unsubscribe-link}}",
47
53
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
48
54
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
49
55
  };
50
56
  export {
51
- i as DEFAULT_UNSUBSCRIBE_GROUP,
52
- B as INSIDER_ID,
53
- I as LINK_REGEXES,
54
- _ as LINK_TYPES,
55
- o as MERGE_TAGS,
57
+ o as DEFAULT_UNSUBSCRIBE_GROUP,
58
+ t as INSIDER_ID,
59
+ i as LINK_REGEXES,
60
+ B as LINK_TYPES,
61
+ P as MERGE_TAGS,
56
62
  E as PAGE_TYPES,
57
- t as TYPE_COLLECTIONS,
58
- C as UNSUBSCRIBE_PAGES_LINK,
59
- U as UNSUBSCRIBE_SYNC_MODULE_TYPES,
60
- r as URLS,
61
- c as getTypeTranslations
63
+ U as PRODUCT_TYPE_URL_SEGMENTS,
64
+ T as TYPE_COLLECTIONS,
65
+ c as UNSUBSCRIBE_PAGES_LINK,
66
+ u as UNSUBSCRIBE_SYNC_MODULE_TYPES,
67
+ C as URLS,
68
+ b as getTypeTranslations
62
69
  };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-3b53a736],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-4cbf0abd]{position:relative}.auto-save-toggle__info-box[data-v-4cbf0abd]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-4e2a4adb]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-fffc13d6]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-fffc13d6]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-fffc13d6]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-29b9af29] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-d073b1dc] .vueperslides__bullets{pointer-events:none!important}[data-v-d073b1dc] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .chat-welcome[data-v-715e7d06]{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px;font-family:Figtree,sans-serif}.chat-welcome__subtitle[data-v-715e7d06]{margin:0;font-size:15px;font-weight:400;line-height:24px;color:#393939}.chat-welcome__title[data-v-715e7d06]{margin:0;font-size:26px;font-weight:400;line-height:32px;color:#1c1c1c}.quick-action-chips[data-v-0d23f2b4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;width:100%;max-width:720px}.quick-action-chips--compact[data-v-0d23f2b4]{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;max-width:420px}.quick-action-chips--compact .quick-action-chips__chip[data-v-0d23f2b4]{padding:14px 16px;font-size:13px;line-height:20px;min-height:64px}.quick-action-chips__chip[data-v-0d23f2b4]{display:flex;align-items:flex-start;padding:8px 9px 8px 8px;background:#fff;border:none;border-radius:8px;box-shadow:0 4px 12px #39393926;font-family:Figtree,sans-serif;font-size:13px;font-weight:400;line-height:1.4;color:#393939;text-align:left;cursor:pointer;transition:box-shadow .15s}.quick-action-chips__chip[data-v-0d23f2b4]:hover{box-shadow:0 6px 18px #39393938}.quick-action-chips__chip[data-v-0d23f2b4]:focus{outline:none;box-shadow:0 6px 18px #39393938}.guido-agent-selector[data-v-1179a597]{display:inline-flex;align-items:center;padding:2px;background:#f5f5f7;border-radius:6px}.guido-agent-selector__option[data-v-1179a597]{padding:4px 10px;border:none;border-radius:4px;background:transparent;color:#666;font-family:Figtree,sans-serif;font-size:12px;font-weight:500;cursor:pointer;transition:background-color .15s,color .15s}.guido-agent-selector__option[data-v-1179a597]:hover:not(.guido-agent-selector__option--active){color:#292929}.guido-agent-selector__option--active[data-v-1179a597]{background:#fff;color:#292929;box-shadow:0 1px 3px #0000001a}.chat-input[data-v-dd031314]{width:100%;max-width:720px;position:relative}.chat-input__container[data-v-dd031314]{display:flex;flex-direction:column;position:relative;background:linear-gradient(180deg,#fff,#fafafc);border:1px solid #e1e1e1;border-radius:5px;box-shadow:0 4px 12px #39393926,inset 0 1px #fffc;overflow:visible}.chat-input__container--focused[data-v-dd031314]{border-color:#5f24af}.chat-input__text-area[data-v-dd031314]{display:flex;flex-direction:column;padding:16px}.chat-input__textarea[data-v-dd031314]{width:100%;min-height:24px;max-height:120px;padding:0;border:none;outline:none;resize:none;font-family:Figtree,sans-serif;font-size:15px;font-weight:400;line-height:24px;color:#1c1c1c;background:transparent}.chat-input__textarea[data-v-dd031314]::placeholder{color:#666}.chat-input__textarea[data-v-dd031314]:disabled{background:#f9fafb;cursor:not-allowed}.chat-input__toolbar[data-v-dd031314]{display:flex;align-items:center;padding:4px 8px 8px}.chat-input__toolbar-left[data-v-dd031314]{display:flex;align-items:center;gap:8px}.chat-input__actions[data-v-dd031314]{margin-left:auto}.chat-input__send-btn[data-v-dd031314]{display:flex;align-items:center;justify-content:center;height:40px;padding:8px;border:none;border-radius:4px;background:transparent;color:#222938;cursor:pointer;transition:background-color .2s,color .2s}.chat-input__send-btn[data-v-dd031314]:hover:not(:disabled){background:#f5f5f5}.chat-input__send-btn[data-v-dd031314]:disabled{opacity:.4;cursor:not-allowed}.blueprint-card[data-v-28b88292]{display:flex;align-items:center;gap:16px;width:100%;height:72px;padding:0 16px;background:#fff;border:1px solid #e1e1e1;border-radius:8px;cursor:pointer;text-align:left;overflow:hidden;box-shadow:0 4px 12px #39393926;transition:border-color .2s}.blueprint-card[data-v-28b88292]:hover{border-color:#0a2ecc}.blueprint-card__icon-box[data-v-28b88292]{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:8px;background:#f9f9f9;border:1px solid #e1e1e1;color:#5f24af;flex-shrink:0}.blueprint-card__body[data-v-28b88292]{display:flex;flex-direction:column;flex:1;min-width:0}.blueprint-card__title[data-v-28b88292]{font-family:Figtree,sans-serif;font-size:15px;font-weight:400;line-height:24px;color:#292929;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%}.blueprint-card__date[data-v-28b88292]{font-family:Figtree,sans-serif;font-size:13px;font-weight:400;line-height:16px;color:#666}.blueprint-card__chevron[data-v-28b88292]{flex-shrink:0;color:#666}.email-template-card[data-v-2853740d]{display:flex;align-items:center;gap:12px;width:100%;padding:12px 16px;background:#fff;border:1px solid #e1e1e1;border-radius:8px;box-shadow:0 4px 12px #3939391a;transition:border-color .2s}.email-template-card--applied[data-v-2853740d]{border-color:#27ae60}.email-template-card--failed[data-v-2853740d]{border-color:#d32f2f}.email-template-card__icon-box[data-v-2853740d]{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:8px;background:linear-gradient(135deg,#fa3a3a,#5f24af);color:#fff;flex-shrink:0}.email-template-card--applied .email-template-card__icon-box[data-v-2853740d]{background:#27ae60}.email-template-card--failed .email-template-card__icon-box[data-v-2853740d]{background:#d32f2f}.email-template-card__body[data-v-2853740d]{display:flex;flex-direction:column;flex:1;min-width:0}.email-template-card__title[data-v-2853740d]{font-family:Figtree,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#292929}.email-template-card__meta[data-v-2853740d]{font-family:Figtree,sans-serif;font-size:12px;font-weight:400;line-height:16px;color:#666}.email-template-card__action[data-v-2853740d]{padding:6px 12px;border:1px solid #e1e1e1;border-radius:6px;background:#fff;color:#292929;font-family:Figtree,sans-serif;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s}.email-template-card__action[data-v-2853740d]:hover:not(:disabled){background:#f5f5f5}.email-template-card__action[data-v-2853740d]:disabled{opacity:.5;cursor:not-allowed}.ai-message-actions[data-v-4b57f736]{gap:8px}.ai-message-actions__btn[data-v-4b57f736]{width:32px;height:32px;padding:0;background:transparent;color:#292929;transition:background-color .15s}.ai-message-actions__btn[data-v-4b57f736]:hover:not(:disabled){background:#0000000f}.ai-message-actions__btn[data-v-4b57f736]:disabled{cursor:not-allowed;opacity:.4}.ai-message-actions__btn--success[data-v-4b57f736]{color:#27ae60}.chat-loading[data-v-4a52f577]{gap:8px}.chat-loading__icon[data-v-4a52f577]{width:24px;height:24px}.chat-loading__text[data-v-4a52f577]{font-family:Figtree,sans-serif;font-size:15px;line-height:24px;background:linear-gradient(90deg,#495366,#5f24af,#9b59b6,#5f24af,#495366);background-size:200% 100%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;animation:gradientShift-4a52f577 3s ease-in-out infinite}@keyframes gradientShift-4a52f577{0%{background-position:100% 50%}50%{background-position:0% 50%}to{background-position:100% 50%}}.ai-message__segments[data-v-b287766f],.ai-message__content[data-v-b287766f]{width:100%;align-self:stretch;font-family:Figtree,sans-serif;font-size:15px;line-height:24px;color:#292929}.ai-message__segments[data-v-b287766f] p,.ai-message__content[data-v-b287766f] p{margin:0 0 8px}.ai-message__segments[data-v-b287766f] p:last-child,.ai-message__content[data-v-b287766f] p:last-child{margin:0}.ai-message__segments[data-v-b287766f] strong,.ai-message__content[data-v-b287766f] strong{font-weight:600}.ai-message__segments[data-v-b287766f] ul,.ai-message__segments[data-v-b287766f] ol,.ai-message__content[data-v-b287766f] ul,.ai-message__content[data-v-b287766f] ol{margin:8px 0;padding-left:24px}.ai-message__segments[data-v-b287766f] li,.ai-message__content[data-v-b287766f] li{margin:4px 0}.ai-message__segments[data-v-b287766f] code,.ai-message__content[data-v-b287766f] code{background:#f4f4f4;padding:2px 6px;border-radius:4px;font-size:13px}.ai-message__segments[data-v-b287766f] pre,.ai-message__content[data-v-b287766f] pre{background:#f4f4f4;padding:12px;border-radius:8px;overflow-x:auto;margin:8px 0}.ai-message__segments[data-v-b287766f] pre code,.ai-message__content[data-v-b287766f] pre code{background:none;padding:0}.ai-message__segments[data-v-b287766f] a,.ai-message__content[data-v-b287766f] a{color:#0a2ecc;text-decoration:none}.ai-message__segments[data-v-b287766f] a:hover,.ai-message__content[data-v-b287766f] a:hover{text-decoration:underline}.ai-message__error[data-v-b287766f]{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:16px;background:#d32f2f14;color:#d32f2f;font-size:14px}.ai-message__error-text[data-v-b287766f]{font-family:Figtree,sans-serif;line-height:20px}.user-message__view-wrapper[data-v-bc03b908]{display:flex;flex-direction:column;align-items:flex-end;width:100%}.user-message__bubble[data-v-bc03b908]{max-width:364px;padding:8px 16px;background:#dcdfe6;border-radius:8px 8px 0}.user-message__text[data-v-bc03b908]{font-family:Figtree,sans-serif;font-size:15px;font-weight:400;line-height:24px;color:#222938;white-space:pre-wrap;word-break:break-word}.user-message__timestamp[data-v-bc03b908]{margin-top:8px;font-family:Figtree,sans-serif;font-size:13px;font-weight:400;line-height:16px;color:#666;white-space:nowrap}.user-message__bubble-row[data-v-bc03b908]{gap:16px}.user-message__actions[data-v-bc03b908]{gap:8px;padding:8px;opacity:0;transition:opacity .2s}.user-message:hover .user-message__actions[data-v-bc03b908]{opacity:1}.user-message__action-btn[data-v-bc03b908]{width:32px;height:32px;padding:0;background:transparent;color:#8c8c8c;transition:color .15s,background-color .15s}.user-message__action-btn[data-v-bc03b908]:hover{color:#393939;background:#0000000f}.user-message__action-btn--success[data-v-bc03b908]{color:#27ae60}.chat-messages[data-v-42f0f380]{position:relative}.chat-messages__list[data-v-42f0f380]{gap:16px}.chat-conversation[data-v-5a25bfc5]{flex:1 1 0;display:flex;flex-direction:column;align-items:center;position:relative;z-index:1;min-height:0;overflow-y:auto;scroll-behavior:smooth;scrollbar-width:none}.chat-conversation[data-v-5a25bfc5]::-webkit-scrollbar{display:none}.chat-conversation__header[data-v-5a25bfc5]{position:sticky;top:0;z-index:15;flex-shrink:0}.chat-conversation__messages[data-v-5a25bfc5]{flex:1;width:100%;max-width:720px}.chat-conversation__empty[data-v-5a25bfc5]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:32px;width:100%;height:100%;padding:16px;box-sizing:border-box}.chat-conversation__input[data-v-5a25bfc5]{position:sticky;bottom:0;display:flex;justify-content:center;width:100%;max-width:720px;padding:16px 0 0;z-index:10;background:#fff}.chatbox-panel[data-v-26934e62]{position:relative;width:100%;height:100%;background:#fff;overflow:hidden}.chatbox-panel__gradient[data-v-26934e62]{position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(ellipse at top right,rgba(95,36,175,.06) 0%,transparent 60%);pointer-events:none;z-index:0}.chatbox-panel__header[data-v-26934e62]{width:100%;padding:16px 20px;background:#fff;border-bottom:1px solid #eef0f4}.chatbox-panel__title[data-v-26934e62]{font-family:Figtree,sans-serif;font-size:16px;font-weight:600;line-height:24px;color:#1c1c1c}.chatbox-panel__close[data-v-26934e62]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:6px;background:transparent;color:#666;cursor:pointer;transition:background-color .15s,color .15s}.chatbox-panel__close[data-v-26934e62]:hover{background:#f5f5f5;color:#292929}.chatbox-container[data-v-a5430681]{position:fixed;top:64px;right:16px;bottom:16px;width:480px;max-width:calc(100vw - 32px);z-index:1000;pointer-events:none}.chatbox-container__shell[data-v-a5430681]{width:100%;height:100%;background:#fff;border-radius:12px;box-shadow:0 16px 48px #0000002e,0 4px 12px #00000014;overflow:hidden;pointer-events:auto}.gap-16[data-v-3b53a736],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.editor-actions[data-v-4e2a4adb]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-ec575441]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-ec575441]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-ec575441]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}