@useinsider/guido 3.12.0-beta.975e966 → 3.12.0-beta.9f391a5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -161,6 +161,7 @@ const config: GuidoConfigInput = {
161
161
  modulesDisabled?: boolean, // Default: false - Disable modules panel
162
162
  liquidSyntax?: boolean, // Default: false - Enable Liquid template syntax
163
163
  autosave?: boolean, // Default: false - Show the Auto Save toggle in the header. See wiki/AUTOSAVE.md.
164
+ allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
164
165
  },
165
166
 
166
167
  // Optional: Callbacks
@@ -1,11 +1,11 @@
1
1
  import { ModuleFolderDefaults as y } from "../../enums/defaults.js";
2
- import { object as a, number as n, optional as e, string as t, picklist as l, pipe as p, minLength as b, custom as f, boolean as o, array as c, record as k, fallback as C, literal as i, looseObject as g, variant as R, union as h, unknown as s, lazy as T } from "../../node_modules/valibot/dist/index.js";
2
+ import { object as a, number as n, optional as e, string as t, picklist as r, pipe as p, minLength as b, custom as h, boolean as o, array as c, record as k, fallback as C, literal as i, looseObject as g, variant as R, union as f, unknown as s, lazy as T } from "../../node_modules/valibot/dist/index.js";
3
3
  const d = {
4
4
  /** Promotional/marketing emails */
5
5
  PROMOTIONAL: 1,
6
6
  /** Transactional/system emails */
7
7
  TRANSACTIONAL: 2
8
- }, r = {
8
+ }, l = {
9
9
  /** Standard email campaigns */
10
10
  EMAIL: 60,
11
11
  /** Architect journey builder */
@@ -38,16 +38,16 @@ const d = {
38
38
  ),
39
39
  /** Product type identifier */
40
40
  productType: e(
41
- l([
42
- r.EMAIL,
43
- r.ARCHITECT,
44
- r.UNSUBSCRIBE_PAGES
41
+ r([
42
+ l.EMAIL,
43
+ l.ARCHITECT,
44
+ l.UNSUBSCRIBE_PAGES
45
45
  ]),
46
- r.EMAIL
46
+ l.EMAIL
47
47
  ),
48
48
  /** Message type (promotional or transactional) */
49
49
  messageType: e(
50
- l([d.PROMOTIONAL, d.TRANSACTIONAL]),
50
+ r([d.PROMOTIONAL, d.TRANSACTIONAL]),
51
51
  d.PROMOTIONAL
52
52
  ),
53
53
  /** Display name for the current user */
@@ -76,14 +76,14 @@ const d = {
76
76
  children: e(c(S)),
77
77
  // eslint-disable-next-line camelcase -- backend field name
78
78
  select_items: e(c(S))
79
- })), P = k(
79
+ })), E = k(
80
80
  t(),
81
81
  C(c(S), [])
82
- ), D = g({
82
+ ), P = g({
83
83
  /** Block ID (matches the dictionary key and the legacy HTML element id) */
84
84
  id: e(n()),
85
85
  /** Decimal places for price display (legacy data may use string or number) */
86
- decimalCount: e(h([t(), n()])),
86
+ decimalCount: e(f([t(), n()])),
87
87
  /** Pinned product IDs (empty array when filter-driven) */
88
88
  productIds: e(c(s())),
89
89
  /** Whether the block requested live products at send time */
@@ -117,14 +117,14 @@ const d = {
117
117
  /** Block type marker used by some legacy variants */
118
118
  blockType: e(t()),
119
119
  /** Size variant marker (legacy data may use string or number) */
120
- size: e(h([t(), n()])),
120
+ size: e(f([t(), n()])),
121
121
  /** Vertical responsiveness flag (legacy size=1 variants) */
122
122
  verticalResponsiveness: e(o()),
123
123
  /** Legacy "Move to next line" price placement toggle (cardPricePlacement.js) */
124
124
  isPriceMovedToNextLine: e(o()),
125
125
  /** Legacy "Hide if same as discounted" / delete-price-for-zero-sale toggle */
126
126
  isPriceDeletedForZeroSale: e(o())
127
- }), E = a({
127
+ }), D = a({
128
128
  /**
129
129
  * Legacy recommendation block configs keyed by block ID.
130
130
  * Pass this when loading a template authored with the v1
@@ -132,7 +132,7 @@ const d = {
132
132
  * strategy, currency, locale, and layout data.
133
133
  */
134
134
  recommendationConfigs: e(
135
- k(t(), D),
135
+ k(t(), P),
136
136
  {}
137
137
  )
138
138
  }), M = a({
@@ -151,7 +151,7 @@ const d = {
151
151
  * (first) partner's leaf attributes into the label→token map that repairs
152
152
  * label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
153
153
  */
154
- dynamicContentList: e(P, {}),
154
+ dynamicContentList: e(E, {}),
155
155
  /** Valid custom field attribute names from the partner's categorized fields */
156
156
  customFieldAttributes: e(c(t()), []),
157
157
  /** Selected unsubscribe page IDs */
@@ -159,7 +159,7 @@ const d = {
159
159
  /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
160
160
  forceRecreate: e(o(), !1),
161
161
  /** Migration-only inputs (legacy block configs) */
162
- migration: e(E, {})
162
+ migration: e(D, {})
163
163
  }), N = a({
164
164
  /** Sender display name */
165
165
  senderName: e(t(), ""),
@@ -201,8 +201,10 @@ const d = {
201
201
  /** Enable Liquid template syntax */
202
202
  liquidSyntax: e(o(), !1),
203
203
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
204
- autosave: e(o(), !1)
205
- }), U = l([
204
+ autosave: e(o(), !1),
205
+ /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
206
+ allowlistEnabled: e(o(), !1)
207
+ }), U = r([
206
208
  "amp-accordion",
207
209
  "amp-carousel",
208
210
  "amp-form-controls",
@@ -216,7 +218,7 @@ const d = {
216
218
  "text-block",
217
219
  "timer-block",
218
220
  "video-block"
219
- ]), B = l([
221
+ ]), B = r([
220
222
  "dynamic-content",
221
223
  "checkbox-block",
222
224
  "radio-button-block",
@@ -269,7 +271,7 @@ const d = {
269
271
  ...m.entries,
270
272
  type: i("custom"),
271
273
  /** Custom processor function */
272
- processor: f(
274
+ processor: h(
273
275
  (u) => typeof u == "function",
274
276
  "processor must be a function"
275
277
  )
@@ -289,7 +291,7 @@ const d = {
289
291
  * Return false to cancel the save operation.
290
292
  */
291
293
  externalValidation: e(
292
- f(
294
+ h(
293
295
  (u) => typeof u == "function",
294
296
  "externalValidation must be a function"
295
297
  )
@@ -324,7 +326,7 @@ export {
324
326
  B as CustomBlockTypeSchema,
325
327
  q as CustomRuleSchema,
326
328
  U as DefaultBlockTypeSchema,
327
- P as DynamicContentListSchema,
329
+ E as DynamicContentListSchema,
328
330
  S as DynamicContentNodeSchema,
329
331
  v as DynamicContentSchema,
330
332
  O as EditorSchema,
@@ -333,14 +335,14 @@ export {
333
335
  F as FeaturesSchema,
334
336
  K as GuidoConfigSchema,
335
337
  A as IdentitySchema,
336
- D as LegacyRecommendationConfigSchema,
338
+ P as LegacyRecommendationConfigSchema,
337
339
  d as MessageType,
338
340
  L as PartnerSchema,
339
- r as ProductType,
341
+ l as ProductType,
340
342
  _ as RegexRuleSchema,
341
343
  j as RemoveRuleSchema,
342
344
  H as ReplaceRuleSchema,
343
- E as TemplateMigrationSchema,
345
+ D as TemplateMigrationSchema,
344
346
  M as TemplateSchema,
345
347
  x as UISchema
346
348
  };
@@ -10,9 +10,9 @@ var n = function() {
10
10
  r,
11
11
  !1,
12
12
  null,
13
- "10599c37"
13
+ "195ab6d4"
14
14
  );
15
- const d = a.exports;
15
+ const c = a.exports;
16
16
  export {
17
- d as default
17
+ c as default
18
18
  };
@@ -10,7 +10,7 @@ var n = function() {
10
10
  r,
11
11
  !1,
12
12
  null,
13
- "38eb0a73"
13
+ "d405ca59"
14
14
  );
15
15
  const d = a.exports;
16
16
  export {
@@ -0,0 +1,21 @@
1
+ import { base64EncodeWithSpecialChars as o } from "../utils/base64.js";
2
+ import { useTranslations as a } from "./useTranslations.js";
3
+ import { useUserRole as i } from "./useUserRole.js";
4
+ const s = {
5
+ MANAGE: "journey-builder.domain-allowlist-warning",
6
+ NON_MANAGE: "settings.allow-list-warning-not-admin-architect",
7
+ ADD_BUTTON: "settings.allow-list-warning-add-button"
8
+ }, l = (t) => `/settings?openAddModal=true&type=domain&values=${o(t)}#security`, w = () => {
9
+ const t = a(), { getIsManageUser: n } = i();
10
+ return { resolveAllowlistToast: async (e) => await n() ? {
11
+ message: t(s.MANAGE),
12
+ actionButton: {
13
+ text: t(s.ADD_BUTTON),
14
+ onClick: () => window.open(l(e.join(",")), "_blank")
15
+ }
16
+ } : { message: t(s.NON_MANAGE) } };
17
+ };
18
+ export {
19
+ l as buildAllowlistSettingsUrl,
20
+ w as useAllowlistToast
21
+ };
@@ -1,32 +1,52 @@
1
- import { useActionsApi as H } from "./useActionsApi.js";
2
- import { useConfig as y } from "./useConfig.js";
3
- import { useSaveStart as w, useSaveComplete as k } from "./useGuidoActions.js";
1
+ import { useActionsApi as x } from "./useActionsApi.js";
2
+ import { useConfig as k } from "./useConfig.js";
3
+ import { useSaveStart as B, useSaveComplete as E } from "./useGuidoActions.js";
4
4
  import { useSyncModuleExtractor as q } from "./useSyncModuleExtractor.js";
5
+ import { ToasterTypeOptions as A } from "../enums/toaster.js";
5
6
  import { useStripoApi as C } from "../services/stripoApi.js";
6
- import { useTemplatePreparation as E } from "../utils/templatePreparation.js";
7
- import { useHtmlValidator as B } from "./useHtmlValidator.js";
8
- import { useCouponBlockValidator as L } from "./validators/useCouponBlockValidator.js";
9
- import { useLiquidValidator as P } from "./validators/useLiquidValidator.js";
10
- import { useUnsubscribeBlockValidator as U } from "./validators/useUnsubscribeBlockValidator.js";
11
- const K = () => {
12
- const o = w(), s = k(), { validateHtml: r } = B(), { validateLiquidSyntax: l } = P(), { validateCouponBlockTags: n } = L(), { validateUnsubscribeBlockUniqueness: d, validateUnsubscribeBlockHasTemplate: c } = U(), { callbacks: i, isFeatureEnabled: u } = y(), { extractSyncModuleData: m } = q(), { setSyncModuleUnsubscriptionPages: p } = C(), { editorSave: v } = H();
13
- return { save: async (f = !1, S = !1) => {
14
- var a;
15
- o();
16
- const { prepareTemplateDetails: V } = E(), t = await V();
17
- if (!n(t.compiledHtml) || !d(t.compiledHtml) || !c(t.compiledHtml))
7
+ import { useTemplatePreparation as D } from "../utils/templatePreparation.js";
8
+ import { useAllowlistToast as L } from "./useAllowlistToast.js";
9
+ import { useHtmlValidator as P } from "./useHtmlValidator.js";
10
+ import { useToaster as U } from "./useToaster.js";
11
+ import { useAllowlistValidator as M } from "./validators/useAllowlistValidator.js";
12
+ import { useCouponBlockValidator as h } from "./validators/useCouponBlockValidator.js";
13
+ import { useLiquidValidator as F } from "./validators/useLiquidValidator.js";
14
+ import { useUnsubscribeBlockValidator as O } from "./validators/useUnsubscribeBlockValidator.js";
15
+ const ot = () => {
16
+ const l = B(), n = E(), { validateHtml: m } = P(), { validateLiquidSyntax: c } = F(), { validateCouponBlockTags: d } = h(), { validateUnsubscribeBlockUniqueness: u, validateUnsubscribeBlockHasTemplate: p } = O(), { callbacks: e, isFeatureEnabled: a } = k(), { extractSyncModuleData: f } = q(), { setSyncModuleUnsubscriptionPages: v } = C(), { editorSave: w } = x(), { showToaster: S } = U(), { getBlockedDomains: b } = M(), { resolveAllowlistToast: V } = L();
17
+ return { save: async (y = !1, s = !1) => {
18
+ var r;
19
+ l();
20
+ const { prepareTemplateDetails: H } = D(), t = await H();
21
+ if (!d(t.compiledHtml) || !u(t.compiledHtml) || !p(t.compiledHtml))
18
22
  return;
19
- if (u("liquidSyntax")) {
20
- if (!await l(t.compiledHtml))
23
+ if (a("liquidSyntax")) {
24
+ if (!await c(t.compiledHtml))
21
25
  return;
22
- } else if (!await r(t.compiledHtml, t.dynamicContentList, !0))
26
+ } else if (!await m(t.compiledHtml, t.dynamicContentList, !0))
23
27
  return;
24
- if ((a = i.value) != null && a.externalValidation && !await i.value.externalValidation(t) || !await v())
28
+ if ((r = e.value) != null && r.externalValidation && !await e.value.externalValidation(t))
25
29
  return;
26
- const { unsubscribePayload: b, stripoModules: x } = m(t.rawHtml);
27
- return await p(b), t.modules = x, f || s({ ...t, silent: S }), t;
30
+ if (a("allowlistEnabled")) {
31
+ const o = await b(t.compiledHtml, t.css);
32
+ if (o.length) {
33
+ if (!s) {
34
+ const i = await V(o);
35
+ i != null && i.message && S({
36
+ type: A.Warning,
37
+ message: i.message,
38
+ actionButton: i.actionButton
39
+ });
40
+ }
41
+ return;
42
+ }
43
+ }
44
+ if (!await w())
45
+ return;
46
+ const { unsubscribePayload: T, stripoModules: g } = f(t.rawHtml);
47
+ return await v(T), t.modules = g, y || n({ ...t, silent: s }), t;
28
48
  } };
29
49
  };
30
50
  export {
31
- K as useSave
51
+ ot as useSave
32
52
  };
@@ -0,0 +1,13 @@
1
+ import { RoleEnums as t } from "../enums/roles.js";
2
+ import { useHttp as o } from "./useHttp.js";
3
+ const s = "/get-user-role-and-email";
4
+ let r = null, n = null;
5
+ const f = () => {
6
+ const { get: l } = o();
7
+ return { getIsManageUser: async () => r !== null ? r : (n || (n = l(s).then(({ data: e }) => (r = (e == null ? void 0 : e.role) === t.MANAGE_USERS, r)).catch((e) => (console.error("[GUIDO_ALLOWLIST] role fetch failed", e), !1)).finally(() => {
8
+ n = null;
9
+ })), n) };
10
+ };
11
+ export {
12
+ f as useUserRole
13
+ };
@@ -0,0 +1,37 @@
1
+ import { base64EncodeWithSpecialChars as w } from "../../utils/base64.js";
2
+ import { useHttp as h } from "../useHttp.js";
3
+ const p = "/allowlist/check-single-item", u = /(?:https?:\/\/|www\.)[^\s"'<>()]+/gi, L = /&quot;\/\//gi, a = /* @__PURE__ */ new Set(), O = () => {
4
+ const { get: i } = h(), l = (e, s) => {
5
+ const r = `${e || ""} ${s || ""}`.replace(L, "https://").match(u) || [], t = /* @__PURE__ */ new Set();
6
+ return r.forEach((n) => {
7
+ const d = /^https?:\/\//i.test(n) ? n : `https://${n}`;
8
+ try {
9
+ const { hostname: c } = new URL(d);
10
+ c && t.add(c.replace(/^www\./i, "").toLowerCase());
11
+ } catch {
12
+ }
13
+ }), [...t];
14
+ }, m = async (e) => {
15
+ if (a.has(e))
16
+ return !0;
17
+ try {
18
+ const s = encodeURIComponent(w(`https://${e}`)), { data: o } = await i(`${p}?item=${s}&type=domain`), r = o.type === "success";
19
+ return r && a.add(e), r;
20
+ } catch (s) {
21
+ return console.error("[GUIDO_ALLOWLIST] isDomainAllowlisted failed", e, s), !0;
22
+ }
23
+ };
24
+ return { getBlockedDomains: async (e, s) => {
25
+ try {
26
+ const o = l(e, s);
27
+ return o.length ? (await Promise.all(
28
+ o.map(async (t) => ({ domain: t, allowlisted: await m(t) }))
29
+ )).filter((t) => !t.allowlisted).map((t) => t.domain) : [];
30
+ } catch (o) {
31
+ return console.error("[GUIDO_ALLOWLIST] getBlockedDomains failed", o), [];
32
+ }
33
+ } };
34
+ };
35
+ export {
36
+ O as useAllowlistValidator
37
+ };
@@ -0,0 +1,4 @@
1
+ var e = /* @__PURE__ */ ((r) => (r.MANAGE_USERS = "manage-users", r))(e || {});
2
+ export {
3
+ e as RoleEnums
4
+ };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .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-10599c37]{position:relative;display:inline-block}.new-tag[data-v-10599c37]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-10599c37] .guido__view-option-selection-desktop svg,[data-v-10599c37] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-10599c37] .in-segments-wrapper__button_selected,[data-v-10599c37] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-38eb0a73]{position:relative;display:inline-block}.new-tag[data-v-38eb0a73]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-38eb0a73] .guido__verion-history-view-option-selection-desktop svg,[data-v-38eb0a73] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-38eb0a73] .in-segments-wrapper__button_selected,[data-v-38eb0a73] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .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-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{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-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .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-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{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-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .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-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{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-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}
@@ -1,9 +1,13 @@
1
- import { useHttp as d } from "../composables/useHttp.js";
2
- import { useToaster as m } from "../composables/useToaster.js";
3
- import { MAX_DEFAULT_TEMPLATE_ID as y } from "../enums/defaults.js";
4
- import { useBlankTemplate as f } from "./blankTemplate.js";
5
- const D = () => {
6
- const { get: s, post: u } = d(), { handleError: r } = m(), { getBlankTemplate: o } = f();
1
+ import { useHttp as m } from "../composables/useHttp.js";
2
+ import { useToaster as y } from "../composables/useToaster.js";
3
+ import { MAX_DEFAULT_TEMPLATE_ID as f } from "../enums/defaults.js";
4
+ import { useBlankTemplate as g } from "./blankTemplate.js";
5
+ const l = () => ({
6
+ id: 0,
7
+ stripoId: 0,
8
+ unsubscriptionPreferencePages: []
9
+ }), D = () => {
10
+ const { get: s, post: u } = m(), { handleError: r } = y(), { getBlankTemplate: n } = g();
7
11
  return {
8
12
  getToken: async () => {
9
13
  try {
@@ -26,13 +30,13 @@ const D = () => {
26
30
  },
27
31
  getDefaultTemplate: async () => {
28
32
  try {
29
- const t = new URLSearchParams(window.location.search), e = t.get("default-template"), l = t.get("master"), n = e ? parseInt(e) : 0, i = n >= 1 && n <= y ? n : 0;
30
- if (!i && !l)
31
- return await o();
32
- const p = `/stripo/default-template/${i}`, { data: c } = await s(p), a = typeof c == "string" ? JSON.parse(c) : c;
33
- return !a || typeof a != "object" || !("html" in a) || !("css" in a) ? await o() : a;
33
+ const t = new URLSearchParams(window.location.search), e = t.get("default-template"), p = t.get("master"), o = e ? parseInt(e) : 0, i = o >= 1 && o <= f ? o : 0;
34
+ if (!i && !p)
35
+ return await n();
36
+ const d = `/stripo/default-template/${i}`, { data: c } = await s(d), a = typeof c == "string" ? JSON.parse(c) : c;
37
+ return !a || typeof a != "object" || !("html" in a) || !("css" in a) ? await n() : a;
34
38
  } catch (t) {
35
- return r(t, "Failed to fetch default template"), o();
39
+ return r(t, "Failed to fetch default template"), n();
36
40
  }
37
41
  },
38
42
  getSyncModulesStatus: async () => {
@@ -53,13 +57,9 @@ const D = () => {
53
57
  getSyncModule: async (t) => {
54
58
  try {
55
59
  const { data: e } = await s(`/stripo/stripo-modules/${t}/get`);
56
- return e;
60
+ return Array.isArray(e == null ? void 0 : e.unsubscriptionPreferencePages) ? e : l();
57
61
  } catch (e) {
58
- return r(e, "Failed to get sync module"), {
59
- id: 0,
60
- stripoId: 0,
61
- unsubscriptionPreferencePages: []
62
- };
62
+ return r(e, "Failed to get sync module"), l();
63
63
  }
64
64
  },
65
65
  setSyncModuleUnsubscriptionPages: async (t) => {
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import type { DynamicContentNode } from '../generic';
9
9
  import type { SavedTemplateDetails } from '../stripo';
10
+ import type { ActionButton } from '../toaster';
10
11
  import * as v from 'valibot';
11
12
  /**
12
13
  * Handler function for external validation before save
@@ -14,6 +15,16 @@ import * as v from 'valibot';
14
15
  * @returns Promise<boolean> - true if valid, false to cancel save
15
16
  */
16
17
  export type ExternalValidationHandler = (data: Omit<SavedTemplateDetails, 'metadata'>) => Promise<boolean>;
18
+ /**
19
+ * Content for the domain-allowlist block toaster. Guido self-serves this (see
20
+ * useAllowlistToast): it resolves the user role via /get-user-role-and-email, builds the
21
+ * settings deep-link, and pulls copy from window.trans. `actionButton.onClick` runs the
22
+ * action (e.g. the "Add to allowlist" deep-link).
23
+ */
24
+ export interface AllowlistToastContent {
25
+ message: string;
26
+ actionButton?: ActionButton;
27
+ }
17
28
  /**
18
29
  * Message type constants for email templates
19
30
  */
@@ -377,6 +388,8 @@ export declare const FeaturesSchema: v.ObjectSchema<{
377
388
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
378
389
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
379
390
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
391
+ /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
392
+ readonly allowlistEnabled: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
380
393
  }, undefined>;
381
394
  /**
382
395
  * Default block types available in Stripo
@@ -764,6 +777,8 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
764
777
  readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
765
778
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
766
779
  readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
780
+ /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
781
+ readonly allowlistEnabled: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
767
782
  }, undefined>, {}>;
768
783
  /** Block configuration */
769
784
  readonly blocks: v.OptionalSchema<v.ObjectSchema<{
@@ -0,0 +1,17 @@
1
+ import type { AllowlistToastContent } from '@@/Types/config/schemas';
2
+ /**
3
+ * Builds the "Add to allowlist" InOne Settings deep-link (Security tab, add-domain modal
4
+ * prefilled). The route is identical across InOne products, so Guido builds it generically.
5
+ * @param value - domain(s) to prefill; base64-encoded into the `values` query param.
6
+ */
7
+ export declare const buildAllowlistSettingsUrl: (value: string) => string;
8
+ /**
9
+ * Builds the domain-allowlist block-toaster content Guido renders when a save is blocked.
10
+ * Guido owns the whole toaster: it resolves the user role itself (useUserRole → the shared
11
+ * /get-user-role-and-email endpoint) and pulls copy from window.trans, so consumers only need
12
+ * to set features.allowlistEnabled. Manage users get the "Add to allowlist" deep-link button;
13
+ * everyone else gets a message-only warning. SD-143197.
14
+ */
15
+ export declare const useAllowlistToast: () => {
16
+ resolveAllowlistToast: (blockedDomains: string[]) => Promise<AllowlistToastContent>;
17
+ };
@@ -96,6 +96,7 @@ export declare const useConfig: () => {
96
96
  modulesDisabled: boolean;
97
97
  liquidSyntax: boolean;
98
98
  autosave: boolean;
99
+ allowlistEnabled: boolean;
99
100
  };
100
101
  blocks: {
101
102
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -227,6 +228,7 @@ export declare const useConfig: () => {
227
228
  modulesDisabled: boolean;
228
229
  liquidSyntax: boolean;
229
230
  autosave: boolean;
231
+ allowlistEnabled: boolean;
230
232
  } | null>;
231
233
  blocks: import("vue").ComputedRef<{
232
234
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolves whether the current user may manage the partner's domain allowlist, via the shared
3
+ * InOne endpoint GET /get-user-role-and-email. Fail-open: on any error the user is treated as
4
+ * non-manage (message-only toaster, no "Add to allowlist" deep-link they may not be able to use).
5
+ */
6
+ export declare const useUserRole: () => {
7
+ getIsManageUser: () => Promise<boolean>;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Pre-save domain-allowlist validation. Extracts every external domain from the compiled
3
+ * HTML/CSS and asks the backend whether each is allowlisted, so an un-allowlisted link can
4
+ * block the save BEFORE anything is persisted. Gated by `features.allowlistEnabled` in
5
+ * `useSave`; the block toaster is rendered by Guido from host-supplied content.
6
+ */
7
+ export declare const useAllowlistValidator: () => {
8
+ getBlockedDomains: (html: string, css: string) => Promise<string[]>;
9
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Insider user-role aliases — the kebab-case wire values returned by
3
+ * GET /get-user-role-and-email (the same set honey-badger's RoleEnums defines).
4
+ * Only the manage-user role is needed in Guido: it gates the "Add to allowlist"
5
+ * action in the domain-allowlist block toaster. SD-143197.
6
+ */
7
+ export declare enum RoleEnums {
8
+ MANAGE_USERS = "manage-users"
9
+ }
@@ -101,6 +101,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
101
101
  modulesDisabled: boolean;
102
102
  liquidSyntax: boolean;
103
103
  autosave: boolean;
104
+ allowlistEnabled: boolean;
104
105
  };
105
106
  blocks: {
106
107
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -238,6 +239,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
238
239
  modulesDisabled: boolean;
239
240
  liquidSyntax: boolean;
240
241
  autosave: boolean;
242
+ allowlistEnabled: boolean;
241
243
  };
242
244
  blocks: {
243
245
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -375,6 +377,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
375
377
  modulesDisabled: boolean;
376
378
  liquidSyntax: boolean;
377
379
  autosave: boolean;
380
+ allowlistEnabled: boolean;
378
381
  };
379
382
  blocks: {
380
383
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -512,6 +515,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
512
515
  modulesDisabled: boolean;
513
516
  liquidSyntax: boolean;
514
517
  autosave: boolean;
518
+ allowlistEnabled: boolean;
515
519
  };
516
520
  blocks: {
517
521
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -649,6 +653,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
649
653
  modulesDisabled: boolean;
650
654
  liquidSyntax: boolean;
651
655
  autosave: boolean;
656
+ allowlistEnabled: boolean;
652
657
  };
653
658
  blocks: {
654
659
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -786,6 +791,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
786
791
  modulesDisabled: boolean;
787
792
  liquidSyntax: boolean;
788
793
  autosave: boolean;
794
+ allowlistEnabled: boolean;
789
795
  };
790
796
  blocks: {
791
797
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -923,6 +929,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
923
929
  modulesDisabled: boolean;
924
930
  liquidSyntax: boolean;
925
931
  autosave: boolean;
932
+ allowlistEnabled: boolean;
926
933
  };
927
934
  blocks: {
928
935
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1060,6 +1067,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1060
1067
  modulesDisabled: boolean;
1061
1068
  liquidSyntax: boolean;
1062
1069
  autosave: boolean;
1070
+ allowlistEnabled: boolean;
1063
1071
  };
1064
1072
  blocks: {
1065
1073
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1197,6 +1205,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1197
1205
  modulesDisabled: boolean;
1198
1206
  liquidSyntax: boolean;
1199
1207
  autosave: boolean;
1208
+ allowlistEnabled: boolean;
1200
1209
  };
1201
1210
  blocks: {
1202
1211
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1334,6 +1343,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1334
1343
  modulesDisabled: boolean;
1335
1344
  liquidSyntax: boolean;
1336
1345
  autosave: boolean;
1346
+ allowlistEnabled: boolean;
1337
1347
  };
1338
1348
  blocks: {
1339
1349
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1471,6 +1481,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1471
1481
  modulesDisabled: boolean;
1472
1482
  liquidSyntax: boolean;
1473
1483
  autosave: boolean;
1484
+ allowlistEnabled: boolean;
1474
1485
  };
1475
1486
  blocks: {
1476
1487
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1608,6 +1619,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1608
1619
  modulesDisabled: boolean;
1609
1620
  liquidSyntax: boolean;
1610
1621
  autosave: boolean;
1622
+ allowlistEnabled: boolean;
1611
1623
  };
1612
1624
  blocks: {
1613
1625
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1745,6 +1757,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1745
1757
  modulesDisabled: boolean;
1746
1758
  liquidSyntax: boolean;
1747
1759
  autosave: boolean;
1760
+ allowlistEnabled: boolean;
1748
1761
  };
1749
1762
  blocks: {
1750
1763
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -1882,6 +1895,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
1882
1895
  modulesDisabled: boolean;
1883
1896
  liquidSyntax: boolean;
1884
1897
  autosave: boolean;
1898
+ allowlistEnabled: boolean;
1885
1899
  };
1886
1900
  blocks: {
1887
1901
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -2019,6 +2033,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2019
2033
  modulesDisabled: boolean;
2020
2034
  liquidSyntax: boolean;
2021
2035
  autosave: boolean;
2036
+ allowlistEnabled: boolean;
2022
2037
  };
2023
2038
  blocks: {
2024
2039
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -2156,6 +2171,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2156
2171
  modulesDisabled: boolean;
2157
2172
  liquidSyntax: boolean;
2158
2173
  autosave: boolean;
2174
+ allowlistEnabled: boolean;
2159
2175
  };
2160
2176
  blocks: {
2161
2177
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -2293,6 +2309,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2293
2309
  modulesDisabled: boolean;
2294
2310
  liquidSyntax: boolean;
2295
2311
  autosave: boolean;
2312
+ allowlistEnabled: boolean;
2296
2313
  };
2297
2314
  blocks: {
2298
2315
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -2430,6 +2447,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
2430
2447
  modulesDisabled: boolean;
2431
2448
  liquidSyntax: boolean;
2432
2449
  autosave: boolean;
2450
+ allowlistEnabled: boolean;
2433
2451
  };
2434
2452
  blocks: {
2435
2453
  excludeDefaults: ("amp-accordion" | "amp-carousel" | "amp-form-controls" | "banner-block" | "button-block" | "html-block" | "image-block" | "menu-block" | "social-block" | "spacer-block" | "text-block" | "timer-block" | "video-block")[];
@@ -3,8 +3,12 @@ const n = `.base-input {
3
3
  border-radius: 4px;
4
4
  background-color: var(--guido-color-gray-0);
5
5
  align-items: center;
6
- height: 40px;
7
- max-height: 40px;
6
+ /* 40px is a floor, never a cap: \`.base-input\` is shared by every settings field,
7
+ including Stripo's own auto-height inputs (e.g. the link field) that expand on
8
+ focus. A fixed max-height clamped their inner box; keep 40px only as the floor. */
9
+ min-height: 40px;
10
+ height: auto;
11
+ max-height: none;
8
12
  box-sizing: content-box;
9
13
  outline: none;
10
14
  resize: vertical;
@@ -36,11 +40,6 @@ ue-contenteditable .base-input {
36
40
  line-height: 24px;
37
41
  }
38
42
 
39
- /* Image link input is auto-height; lift the fixed 40px cap so it can grow. */
40
- ue-contenteditable.link-autoheight-contenteditable .base-input {
41
- max-height: none;
42
- }
43
-
44
43
  ue-icon-component.icon-button.icon-clear-input {
45
44
  right: 2px;
46
45
  top: 2px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.12.0-beta.975e966",
3
+ "version": "3.12.0-beta.9f391a5",
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",
@@ -44,7 +44,7 @@
44
44
  "license": "ISC",
45
45
  "dependencies": {
46
46
  "@stripoinc/ui-editor-extensions": "3.8.0",
47
- "@useinsider/design-system-vue": "2.0.0",
47
+ "@useinsider/design-system-vue": "1.3.0",
48
48
  "@vueuse/core": "11.3.0",
49
49
  "lodash-es": "4.17.21",
50
50
  "pinia": "2.3.1",