@useinsider/guido 3.0.0-beta.de55333 → 3.0.0-beta.e7bc91a

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 (49) hide show
  1. package/dist/components/organisms/header/EditorActions.vue.js +10 -8
  2. package/dist/components/organisms/header/EditorActions.vue2.js +40 -30
  3. package/dist/components/organisms/header/MigrationConfirmModal.vue.js +17 -0
  4. package/dist/components/organisms/header/MigrationConfirmModal.vue2.js +39 -0
  5. package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
  6. package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +1 -1
  7. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +1 -1
  8. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +2 -2
  9. package/dist/config/i18n/en/labels.json.js +8 -3
  10. package/dist/config/i18n/en/tooltips.json.js +2 -1
  11. package/dist/config/migrator/itemsBlockMigrator.js +135 -131
  12. package/dist/config/migrator/recommendationMigrator.js +58 -54
  13. package/dist/enums/block.js +4 -0
  14. package/dist/extensions/Blocks/Items/block.js +30 -21
  15. package/dist/extensions/Blocks/Items/iconsRegistry.js +7 -6
  16. package/dist/extensions/Blocks/Items/items.css.js +48 -0
  17. package/dist/extensions/Blocks/Recommendation/block.js +23 -14
  18. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +1 -1
  19. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +73 -71
  20. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +5 -4
  21. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +48 -0
  22. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +6 -6
  23. package/dist/extensions/Blocks/Unsubscribe/settingsPanel.js +16 -17
  24. package/dist/extensions/Blocks/common-control.js +12 -4
  25. package/dist/guido.css +1 -1
  26. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +324 -218
  27. package/dist/package.json.js +1 -1
  28. package/dist/src/@types/extensions/block.d.ts +2 -0
  29. package/dist/src/App.vue.d.ts +3 -0
  30. package/dist/src/components/Guido.vue.d.ts +1 -1
  31. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  32. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  33. package/dist/src/components/organisms/header/MigrationConfirmModal.vue.d.ts +6 -0
  34. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  35. package/dist/src/components/wrappers/WpModal.vue.d.ts +2 -2
  36. package/dist/src/enums/block.d.ts +4 -0
  37. package/dist/src/extensions/Blocks/Items/block.d.ts +3 -1
  38. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +3 -1
  39. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +3 -3
  40. package/dist/src/extensions/Blocks/common-control.d.ts +5 -0
  41. package/dist/src/main.d.ts +1 -3
  42. package/dist/src/stores/template.d.ts +29 -0
  43. package/dist/src/utils/migrationBannerHtml.d.ts +2 -0
  44. package/dist/static/assets/info.svg.js +5 -0
  45. package/dist/static/styles/components/button.css.js +13 -7
  46. package/dist/static/styles/components/narrow-panel.css.js +52 -0
  47. package/dist/stores/template.js +15 -0
  48. package/dist/utils/migrationBannerHtml.js +21 -0
  49. package/package.json +5 -4
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.54.0" } }, s = {
1
+ const o = { stripo: { version: "2.59.0" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -0,0 +1,2 @@
1
+ import { BlockId as BlockIdEnum } from '@@/Enums/block';
2
+ export type BlockId = `${BlockIdEnum}`;
@@ -1,2 +1,5 @@
1
+ import '@useinsider/design-system-vue/style';
2
+ import '@useinsider/design-system-vue/fonts.css';
3
+ import '@useinsider/design-system-vue/utilities.css';
1
4
  declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
5
  export default _default;
@@ -11,7 +11,7 @@ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__
11
11
  close: () => void;
12
12
  };
13
13
  hasChanges: import("vue").ComputedRef<boolean>;
14
- saveSilent: () => Promise<Omit<SavedTemplateDetails, "metadata"> | undefined> | undefined;
14
+ saveSilent: () => void | undefined;
15
15
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
16
16
  "dynamic-content:open": (detail: {
17
17
  text: string;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => Promise<Omit<import("../../../@types/stripo").SavedTemplateDetails, "metadata"> | undefined>;
2
+ handleSave: (isSilent: boolean) => void;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => Promise<Omit<import("../../../@types/stripo.js").SavedTemplateDetails, "metadata"> | undefined> | undefined;
2
+ handleSave: (isSilent: boolean) => void | undefined;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -0,0 +1,6 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {
2
+ open: () => void;
3
+ }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
4
+ confirm: () => void;
5
+ }, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
6
+ export default _default;
@@ -1,4 +1,4 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
- handleSave: (isSilent: boolean) => Promise<Omit<import("../../../@types/stripo.js").SavedTemplateDetails, "metadata"> | undefined> | undefined;
2
+ handleSave: (isSilent: boolean) => void | undefined;
3
3
  }, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
4
4
  export default _default;
@@ -3,7 +3,7 @@ type __VLS_Props = {
3
3
  id: string;
4
4
  title: string;
5
5
  description?: string;
6
- size?: 'small' | 'medium' | 'large';
6
+ size?: 'X-small' | 'small' | 'medium' | 'large';
7
7
  footerButtonOptions?: FooterButtonGroup;
8
8
  closeButtonStatus?: boolean;
9
9
  closeOnOutsideClick?: boolean;
@@ -33,7 +33,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_WithDefaults<
33
33
  footerStatus: boolean;
34
34
  }>>>, {
35
35
  description: string;
36
- size: "small" | "medium" | "large";
36
+ size: "X-small" | "small" | "medium" | "large";
37
37
  closeOnOutsideClick: boolean;
38
38
  footerButtonOptions: FooterButtonGroup;
39
39
  closeButtonStatus: boolean;
@@ -0,0 +1,4 @@
1
+ export declare enum BlockId {
2
+ Items = "items-block",
3
+ Recommendation = "recommendation-block"
4
+ }
@@ -1,5 +1,6 @@
1
+ import type { BlockId } from '@@/Types/extensions/block';
1
2
  import { Block, BlockCompositionType, ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
2
- export declare const BLOCK_ID = "items-block";
3
+ export declare const BLOCK_ID: BlockId;
3
4
  /**
4
5
  * Items Block extension for Stripo email editor.
5
6
  *
@@ -20,6 +21,7 @@ export declare class ItemsBlock extends Block {
20
21
  getBlockCompositionType(): BlockCompositionType;
21
22
  getName(): string;
22
23
  getDescription(): string;
24
+ getSettingsPanelTitleHtml(): string;
23
25
  getTemplate(): string;
24
26
  allowInnerBlocksDND(): boolean;
25
27
  onCreated(node: ImmutableHtmlNode): void;
@@ -5,9 +5,10 @@
5
5
  * Handles block lifecycle including configuration initialization and migration.
6
6
  * Supports multiple block instances with unique recommendation-id attributes.
7
7
  */
8
+ import type { BlockId } from '@@/Types/extensions/block';
8
9
  import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
9
10
  import { Block, BlockCompositionType } from '@stripoinc/ui-editor-extensions';
10
- export declare const BLOCK_ID = "recommendation-block";
11
+ export declare const BLOCK_ID: BlockId;
11
12
  export declare class RecommendationBlock extends Block {
12
13
  /**
13
14
  * Stores the ID generated in getTemplate() so onCreated() can reuse it.
@@ -20,6 +21,7 @@ export declare class RecommendationBlock extends Block {
20
21
  getBlockCompositionType(): BlockCompositionType;
21
22
  getName(): string;
22
23
  getDescription(): string;
24
+ getSettingsPanelTitleHtml(): string;
23
25
  /**
24
26
  * Returns the template HTML for a new recommendation block.
25
27
  * Generates a unique recommendation ID and embeds the instance class
@@ -15,7 +15,7 @@ export interface NodeWithGetStyle {
15
15
  }
16
16
  /** Interface for nodes with parent method */
17
17
  export interface NodeWithParent {
18
- parent: () => ImmutableHtmlNode | null;
18
+ parent: () => ImmutableHtmlNode | undefined;
19
19
  }
20
20
  /**
21
21
  * Type guard to check if a node has getStyle method
@@ -38,13 +38,13 @@ export declare function isTdNode(node: unknown): node is ImmutableHtmlNode & Nod
38
38
  * @param property - The CSS property name
39
39
  * @returns The style value or null if not accessible
40
40
  */
41
- export declare function safeGetStyle(node: ImmutableHtmlNode | null, property: string): string | null | undefined;
41
+ export declare function safeGetStyle(node: ImmutableHtmlNode | null | undefined, property: string): string | null | undefined;
42
42
  /**
43
43
  * Safely retrieves the parent element of a node
44
44
  * @param node - The node to get the parent from
45
45
  * @returns The parent node or null if not accessible
46
46
  */
47
- export declare function safeGetParent(node: ImmutableHtmlNode | null): ImmutableHtmlNode | null;
47
+ export declare function safeGetParent(node: ImmutableHtmlNode | null | undefined): ImmutableHtmlNode | null;
48
48
  /**
49
49
  * Safely retrieves the tag name from a node.
50
50
  * Handles both standard DOM tagName property and Stripo's getTagName() method.
@@ -11,6 +11,10 @@ interface LabelProps {
11
11
  name?: string;
12
12
  position?: 'top' | 'left';
13
13
  }
14
+ interface IconProps {
15
+ src: string;
16
+ className?: string;
17
+ }
14
18
  interface IconButtonProps {
15
19
  name: string;
16
20
  icon: string;
@@ -89,6 +93,7 @@ export declare abstract class CommonControl extends Control {
89
93
  }): string;
90
94
  _GuRadioButton({ name, buttons, id }: RadioButtonProps): string;
91
95
  _GuButton({ name, label, id }: ButtonProps): string;
96
+ _GuIcon({ src, className }: IconProps): string;
92
97
  /**
93
98
  *
94
99
  * @param param0
@@ -1,3 +1 @@
1
- import '@useinsider/design-system-vue/style';
2
- import '@useinsider/design-system-vue/fonts.css';
3
- import '@useinsider/design-system-vue/utilities.css';
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { BlockId } from '@@/Types/extensions/block';
2
+ export declare const useTemplateStore: import("pinia").StoreDefinition<"guidoTemplate", {
3
+ migrations: Partial<Record<BlockId, number>>;
4
+ }, {
5
+ hasMigrations: (state: {
6
+ migrations: {
7
+ "recommendation-block"?: number | undefined;
8
+ "items-block"?: number | undefined;
9
+ };
10
+ } & import("pinia").PiniaCustomStateProperties<{
11
+ migrations: Partial<Record<BlockId, number>>;
12
+ }>) => boolean;
13
+ hasRecommendationMigrations: (state: {
14
+ migrations: {
15
+ "recommendation-block"?: number | undefined;
16
+ "items-block"?: number | undefined;
17
+ };
18
+ } & import("pinia").PiniaCustomStateProperties<{
19
+ migrations: Partial<Record<BlockId, number>>;
20
+ }>) => boolean;
21
+ hasItemsMigrations: (state: {
22
+ migrations: {
23
+ "recommendation-block"?: number | undefined;
24
+ "items-block"?: number | undefined;
25
+ };
26
+ } & import("pinia").PiniaCustomStateProperties<{
27
+ migrations: Partial<Record<BlockId, number>>;
28
+ }>) => boolean;
29
+ }, {}>;
@@ -0,0 +1,2 @@
1
+ import type { BlockId } from '@@/Types/extensions/block';
2
+ export declare function getMigrationBannerHtml(blockId: BlockId, blockName: string, infoText: string): string;
@@ -0,0 +1,5 @@
1
+ const a = `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><g transform="translate(3, 2.5)"><path fill="#258DDE" d="M6.878.142c3.91-.723 7.802 1.369 9.323 5.022 1.533 3.683.231 7.927-3.11 10.138a8.47 8.47 0 0 1-10.563-.983l-.067-.065A8.318 8.318 0 0 1 0 8.343V8.25C.05 4.305 2.878.927 6.787.16l.092-.018Zm7.713 5.682c-1.216-2.92-4.342-4.582-7.467-3.97-3.125.614-5.378 3.331-5.382 6.491a6.597 6.597 0 0 0 1.952 4.688 6.718 6.718 0 0 0 8.43.83 6.595 6.595 0 0 0 2.467-8.039Z"/><path fill="#258DDE" d="M12.52 13.58a.876.876 0 0 1 1.215-.017l.016.015 3.993 3.946a.86.86 0 0 1 .002 1.222.876.876 0 0 1-1.232.002l-3.992-3.946-.016-.015a.86.86 0 0 1 .014-1.206ZM6.713 5.43a.876.876 0 0 0-1.232 0 .86.86 0 0 0 0 1.221l1.232-1.222Zm1.09 3.525a.876.876 0 0 0 1.232 0 .86.86 0 0 0 0-1.222L7.804 8.955Zm1.232-1.222a.876.876 0 0 0-1.231 0 .86.86 0 0 0 0 1.222l1.231-1.222Zm1.091 3.526a.876.876 0 0 0 1.232 0 .86.86 0 0 0 0-1.222l-1.232 1.222Zm-1.09-2.304a.86.86 0 0 0 0-1.222.876.876 0 0 0-1.232 0l1.231 1.222ZM5.48 10.037a.86.86 0 0 0 0 1.222.876.876 0 0 0 1.232 0L5.48 10.037Zm2.323-2.304a.86.86 0 0 0 0 1.222.876.876 0 0 0 1.231 0L7.804 7.733Zm3.554-1.082a.86.86 0 0 0 0-1.222.876.876 0 0 0-1.232 0l1.232 1.222Zm-5.877 0 2.323 2.304 1.231-1.222L6.713 5.43 5.48 6.651Zm2.323 2.304 2.322 2.304 1.232-1.222-2.323-2.304-1.231 1.222Zm0-1.222L5.48 10.037l1.232 1.222 2.322-2.304-1.231-1.222Zm1.231 1.222 2.323-2.304-1.232-1.222-2.322 2.304 1.231 1.222Z"/></g></svg>
2
+ `;
3
+ export {
4
+ a as default
5
+ };
@@ -99,18 +99,12 @@ ue-check-button.checked:not(.flat-white) input:checked + label .icon-button {
99
99
  color: var(--guido-color-primary-500);
100
100
  }
101
101
 
102
- ue-select.full-width .button {
103
- border: none !important;
104
- background-color: var(--guido-color-neutral-200) !important;
105
- color: var(--guido-color-neutral-800) !important;
106
- }
107
-
108
102
  ue-select.full-width .button .icon-button {
109
103
  color: var(--guido-color-gray-600) !important;
110
104
  }
111
105
 
112
106
  ue-select.full-width .button:hover:not(:disabled,.disabled) {
113
- background-color: var(--guido-color-neutral-100) !important;
107
+ background-color: var(--guido-color-gray-0) !important;
114
108
  }
115
109
 
116
110
  ue-color {
@@ -130,6 +124,18 @@ ue-select-text-input .select-text-input-toggle .button {
130
124
  justify-content: center;
131
125
  background-color: transparent !important;
132
126
  }
127
+
128
+ .control-shadow-wrapper,
129
+ ue-button:not(.no-shadow,.flat-white),
130
+ ue-toggle:not(.no-shadow,.flat-white),
131
+ :is(ue-popover-toggler,ue-toggle-icon-picker,ue-emoji-toggle),
132
+ .button-group,
133
+ ue-counter:not(.no-shadow),
134
+ :is(ue-select,ue-mergetags,ue-font-family-select):not(.no-shadow),
135
+ ue-check-button:not(.no-shadow,.flat-white) {
136
+ background: none;
137
+ padding: 0;
138
+ }
133
139
  `;
134
140
  export {
135
141
  o as default
@@ -28,6 +28,58 @@ ue-stripe-thumb:hover:not(.disabled),
28
28
  border-color: var(--guido-color-primary-500);
29
29
  }
30
30
 
31
+ /* Module search — initial */
32
+ .module-search-container {
33
+ background-color: var(--guido-color-gray-0);
34
+ border: 1px solid var(--guido-color-gray-300);
35
+ border-radius: 4px;
36
+ }
37
+
38
+ .module-search-container .service-element {
39
+ background-color: unset;
40
+ }
41
+
42
+ .module-filter-toggle {
43
+ top: -1px !important;
44
+ right: -1px !important;
45
+ }
46
+
47
+ .module-filter-toggle > .button,
48
+ .module-search-container:hover .module-filter-toggle > .button {
49
+ border: none;
50
+ background: transparent;
51
+ }
52
+
53
+ /* Module search — hover */
54
+ .module-search-container:has(.module-search-chip-input:hover) {
55
+ border-color: var(--guido-color-primary-500);
56
+ }
57
+
58
+ .module-search-container .module-search-chip-input .service-element:hover {
59
+ background-color: var(--guido-color-gray-0);
60
+ border-radius: 4px;
61
+ }
62
+
63
+ .module-search-container .module-filter-toggle:hover > .button {
64
+ background-color: var(--guido-color-gray-1);
65
+ }
66
+
67
+ /* Module search — selected (.on) */
68
+ .module-search-container:has(.module-search-chip-input.on),
69
+ .module-search-container:has(.module-search-chip-input.on):hover {
70
+ border-color: var(--guido-color-primary-500);
71
+ box-shadow: 0 0 0 3px var(--guido-color-primary-200) !important;
72
+ }
73
+
74
+ .module-search-container .module-search-chip-input.on .input-section {
75
+ background-color: unset;
76
+ box-shadow: unset;
77
+ }
78
+
79
+ .module-categories-list .menu-item {
80
+ padding: 8px 20px !important;
81
+ }
82
+
31
83
  .modules-layout-wrapper {
32
84
  padding: 0 16px 16px;
33
85
  grid-row-gap: 16px;
@@ -0,0 +1,15 @@
1
+ import { BlockId as e } from "../enums/block.js";
2
+ import { defineStore as i } from "pinia";
3
+ const a = i("guidoTemplate", {
4
+ state: () => ({
5
+ migrations: {}
6
+ }),
7
+ getters: {
8
+ hasMigrations: (t) => Object.values(t.migrations).some((o) => (o ?? 0) > 0),
9
+ hasRecommendationMigrations: (t) => (t.migrations[e.Recommendation] ?? 0) > 0,
10
+ hasItemsMigrations: (t) => (t.migrations[e.Items] ?? 0) > 0
11
+ }
12
+ });
13
+ export {
14
+ a as useTemplateStore
15
+ };
@@ -0,0 +1,21 @@
1
+ import { useTemplateStore as o } from "../stores/template.js";
2
+ import { UIElementType as i, UEAttr as r } from "../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
3
+ function g(t, n, e) {
4
+ return (o().migrations[t] ?? 0) <= 0 ? "" : `<div>
5
+ <div style="display: flex; align-items: center;">
6
+ <span>${n}</span>
7
+ </div>
8
+ <div class="${t}-migration-info">
9
+ <${i.ICON}
10
+ ${r.ICON.src}="migration-info-icon"
11
+ class="${t}-migration-info__icon">
12
+ </${i.ICON}>
13
+ <p class="${t}-migration-info__text">
14
+ ${e}
15
+ </p>
16
+ </div>
17
+ </div>`;
18
+ }
19
+ export {
20
+ g as getMigrationBannerHtml
21
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.0.0-beta.de55333",
3
+ "version": "3.0.0-beta.e7bc91a",
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",
@@ -25,13 +25,14 @@
25
25
  "lint:fix": "NODE_OPTIONS=--max-old-space-size=2048 eslint --fix ./",
26
26
  "type-check": "vue-tsc --noEmit --project tsconfig.config.json && vue-tsc --noEmit --project tsconfig.app.json",
27
27
  "test:visual-update": "npx playwright test --update-snapshots --reporter html",
28
- "prepare": "husky"
28
+ "prepare": "husky",
29
+ "preinstall": "rm -rf ./node_modules/.vite"
29
30
  },
30
31
  "keywords": [],
31
32
  "author": "",
32
33
  "license": "ISC",
33
34
  "dependencies": {
34
- "@stripoinc/ui-editor-extensions": "3.5.0",
35
+ "@stripoinc/ui-editor-extensions": "3.7.0",
35
36
  "@useinsider/design-system-vue": "0.14.28",
36
37
  "@vueuse/core": "11.3.0",
37
38
  "lodash-es": "4.17.21",
@@ -85,7 +86,7 @@
85
86
  },
86
87
  "guido": {
87
88
  "stripo": {
88
- "version": "2.54.0"
89
+ "version": "2.59.0"
89
90
  }
90
91
  }
91
92
  }