@useinsider/guido 3.2.0-beta.8b4780a → 3.2.0-beta.8e8f902
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 +25 -1
- package/dist/@types/config/schemas.js +38 -36
- package/dist/components/Guido.vue.js +4 -4
- package/dist/components/Guido.vue2.js +35 -34
- package/dist/components/organisms/AutoSaveController.vue.js +17 -0
- package/dist/components/organisms/AutoSaveController.vue2.js +13 -0
- package/dist/components/organisms/header/AutoSaveToggle.vue.js +22 -0
- package/dist/components/organisms/header/AutoSaveToggle.vue2.js +19 -0
- package/dist/components/organisms/header/RightSlot.vue.js +8 -8
- package/dist/components/organisms/header/RightSlot.vue2.js +9 -8
- package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
- package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
- package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
- package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
- package/dist/composables/useAutoSave.js +71 -0
- package/dist/composables/useFullStoryBridge.js +14 -0
- package/dist/composables/useRibbonOffset.js +21 -0
- package/dist/composables/useSave.js +15 -15
- package/dist/composables/useStripo.js +44 -42
- package/dist/config/compiler/unsubscribeCompilerRules.js +40 -37
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +33 -30
- package/dist/config/migrator/recommendationMigrator.js +1 -1
- package/dist/enums/onboarding.js +7 -2
- package/dist/enums/unsubscribe.js +34 -27
- package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +21 -18
- package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +99 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +6 -6
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +3 -1
- package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +27 -57
- package/dist/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.js +14 -0
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +18 -17
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +29 -25
- package/dist/extensions/Blocks/Recommendation/templates/list/template.js +11 -11
- package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +17 -14
- package/dist/guido.css +1 -1
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +258 -235
- package/dist/package.json.js +1 -1
- package/dist/services/templateLibraryApi.js +5 -4
- package/dist/src/@types/config/schemas.d.ts +4 -0
- package/dist/src/components/Guido.vue.d.ts +1 -1
- package/dist/src/components/organisms/AutoSaveController.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/AutoSaveToggle.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
- package/dist/src/composables/useAutoSave.d.ts +3 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useFullStoryBridge.d.ts +11 -0
- package/dist/src/composables/useRibbonOffset.d.ts +4 -0
- package/dist/src/composables/useSave.d.ts +1 -1
- package/dist/src/enums/onboarding.d.ts +6 -0
- package/dist/src/enums/unsubscribe.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +3 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.d.ts +35 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +3 -20
- package/dist/src/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.d.ts +29 -0
- package/dist/src/stores/autosave.d.ts +12 -0
- package/dist/src/stores/config.d.ts +18 -0
- package/dist/src/stores/editor.d.ts +23 -0
- package/dist/src/stores/onboarding.d.ts +4 -0
- package/dist/src/utils/timeUtil.d.ts +8 -0
- package/dist/stores/autosave.js +17 -0
- package/dist/stores/editor.js +3 -1
- package/dist/stores/onboarding.js +4 -0
- package/dist/utils/pairProductVariables.js +89 -88
- package/dist/utils/timeUtil.js +19 -0
- package/package.json +3 -3
package/dist/package.json.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useConfig as w } from "../composables/useConfig.js";
|
|
2
2
|
import { useHttp as b } from "../composables/useHttp.js";
|
|
3
|
-
import { useToaster as
|
|
4
|
-
import { useTranslations as
|
|
3
|
+
import { useToaster as C } from "../composables/useToaster.js";
|
|
4
|
+
import { useTranslations as h } from "../composables/useTranslations.js";
|
|
5
5
|
import { useLiquidValidator as S } from "../composables/validators/useLiquidValidator.js";
|
|
6
6
|
import { EditorType as v } from "../enums/defaults.js";
|
|
7
7
|
import { useRecommendationExtensionStore as N } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
@@ -9,7 +9,7 @@ import { useSaveAsTemplateStore as x } from "../stores/save-as-template.js";
|
|
|
9
9
|
import { base64EncodeWithSpecialChars as r } from "../utils/base64.js";
|
|
10
10
|
import { useTemplatePreparation as A } from "../utils/templatePreparation.js";
|
|
11
11
|
const $ = () => {
|
|
12
|
-
const { get: n, post: m } = b(), { handleError: o, showToaster: l } =
|
|
12
|
+
const { get: n, post: m } = b(), { handleError: o, showToaster: l } = C(), { config: c, isFeatureEnabled: p } = w(), { validateLiquidSyntax: g } = S(), u = h();
|
|
13
13
|
return {
|
|
14
14
|
getCategories: async () => {
|
|
15
15
|
try {
|
|
@@ -62,7 +62,8 @@ const $ = () => {
|
|
|
62
62
|
stripoConfig: r({
|
|
63
63
|
editor: "stripo",
|
|
64
64
|
html: a.rawHtml,
|
|
65
|
-
css: a.css
|
|
65
|
+
css: a.css,
|
|
66
|
+
dynamicContentList: a.dynamicContentList
|
|
66
67
|
})
|
|
67
68
|
}, { data: { type: T } } = await m(
|
|
68
69
|
"/newsletter/template-library/create-template",
|
|
@@ -178,6 +178,8 @@ export declare const FeaturesSchema: v.ObjectSchema<{
|
|
|
178
178
|
readonly modulesDisabled: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
179
179
|
/** Enable Liquid template syntax */
|
|
180
180
|
readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
181
|
+
/** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
|
|
182
|
+
readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
181
183
|
}, undefined>;
|
|
182
184
|
/**
|
|
183
185
|
* Default block types available in Stripo
|
|
@@ -501,6 +503,8 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
|
|
|
501
503
|
readonly modulesDisabled: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
502
504
|
/** Enable Liquid template syntax */
|
|
503
505
|
readonly liquidSyntax: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
506
|
+
/** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
|
|
507
|
+
readonly autosave: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
504
508
|
}, undefined>, {}>;
|
|
505
509
|
/** Block configuration */
|
|
506
510
|
readonly blocks: v.OptionalSchema<v.ObjectSchema<{
|
|
@@ -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: () => Promise<Omit<SavedTemplateDetails, "metadata" | "silent"> | undefined> | 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;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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
|
+
export default _default;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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
|
+
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) => Promise<Omit<import("../../../@types/stripo.js").SavedTemplateDetails, "metadata" | "silent"> | undefined> | 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;
|
|
@@ -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) => Promise<Omit<import("../../../@types/stripo.js").SavedTemplateDetails, "metadata" | "silent"> | undefined> | 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;
|
|
@@ -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) => Promise<Omit<import("../../../@types/stripo.js").SavedTemplateDetails, "metadata" | "silent"> | undefined> | 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;
|
|
@@ -62,6 +62,7 @@ export declare const useConfig: () => {
|
|
|
62
62
|
unsubscribe: boolean;
|
|
63
63
|
modulesDisabled: boolean;
|
|
64
64
|
liquidSyntax: boolean;
|
|
65
|
+
autosave: boolean;
|
|
65
66
|
};
|
|
66
67
|
blocks: {
|
|
67
68
|
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")[];
|
|
@@ -159,6 +160,7 @@ export declare const useConfig: () => {
|
|
|
159
160
|
unsubscribe: boolean;
|
|
160
161
|
modulesDisabled: boolean;
|
|
161
162
|
liquidSyntax: boolean;
|
|
163
|
+
autosave: boolean;
|
|
162
164
|
} | null>;
|
|
163
165
|
blocks: import("vue").ComputedRef<{
|
|
164
166
|
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,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injects the hosted FullStory bridge script into the Stripo editor iframe.
|
|
3
|
+
*
|
|
4
|
+
* The bridge script's origin is allowlisted via Stripo's
|
|
5
|
+
* `allowedScriptSourceDomains` in useStripo, so the iframe's CSP permits
|
|
6
|
+
* the load. The bundled script itself handles reading FS config from the
|
|
7
|
+
* parent window and booting the FullStory queue stub inside the iframe.
|
|
8
|
+
*/
|
|
9
|
+
export declare const useFullStoryBridge: () => {
|
|
10
|
+
injectFullStory: () => void;
|
|
11
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { SavedTemplateDetails } from '@@/Types/stripo';
|
|
2
2
|
export declare const useSave: () => {
|
|
3
|
-
save: (
|
|
3
|
+
save: (suppressEmit?: boolean, silent?: boolean) => Promise<Omit<SavedTemplateDetails, "metadata" | "silent"> | undefined>;
|
|
4
4
|
};
|
|
@@ -3,3 +3,9 @@ export declare const UI_EDITOR_SELECTOR = "ui-editor";
|
|
|
3
3
|
export declare const CARD_COMPOSITION_TAB_SELECTOR = "button[role=\"tab\"][aria-label=\"Card Composition\"]";
|
|
4
4
|
export declare const SETTINGS_TAB_SELECTOR = "button[role=\"tab\"][aria-label=\"Settings\"]";
|
|
5
5
|
export declare const RIBBON_SELECTOR = ".in-ribbons-wrapper";
|
|
6
|
+
export declare const DYNAMIC_CONTENT_BUTTON_SELECTOR = "#guido__btn-add-dynamic-content";
|
|
7
|
+
export declare const AMP_TOGGLE_BUTTON_SELECTOR = ".guido__amp-toggle-html";
|
|
8
|
+
export declare const AMP_TOGGLE_WRAPPER_SELECTOR = ".in-segments-wrapper";
|
|
9
|
+
export declare const HEADER_SELECTOR = "[data-testid=\"guido-header\"]";
|
|
10
|
+
export declare const POPOVER_LEFT_OFFSET = 158;
|
|
11
|
+
export declare const POPOVER_TOP_GAP = 10;
|
|
@@ -12,6 +12,11 @@ export declare const URLS: {
|
|
|
12
12
|
UNSUBSCRIBE_URL: string;
|
|
13
13
|
PREFERENCES_URL: string;
|
|
14
14
|
};
|
|
15
|
+
export declare const PRODUCT_TYPE_URL_SEGMENTS: {
|
|
16
|
+
readonly 60: "email";
|
|
17
|
+
readonly 49: "journey";
|
|
18
|
+
readonly 97: "email";
|
|
19
|
+
};
|
|
15
20
|
export declare const INSIDER_ID = "iid";
|
|
16
21
|
export declare const DEFAULT_UNSUBSCRIBE_GROUP: {
|
|
17
22
|
readonly name: "Global Unsubscribe";
|
|
@@ -63,5 +63,6 @@ export declare enum RecommendationControlId {
|
|
|
63
63
|
CUSTOM_ATTR_PADDINGS = "recommendation-block-custom-attr-paddings-control",
|
|
64
64
|
CUSTOM_ATTR_SIZE = "recommendation-block-custom-attr-size-control",
|
|
65
65
|
CUSTOM_ATTR_STYLE = "recommendation-block-custom-attr-style-control",
|
|
66
|
+
CUSTOM_ATTR_TEXT_TRIM = "recommendation-block-custom-attr-text-trim-control",
|
|
66
67
|
SYNC_INFO_MESSAGE = "recommendation-block-sync-info-message"
|
|
67
68
|
}
|
|
@@ -13,10 +13,12 @@
|
|
|
13
13
|
* product cards — changing "brand" color won't affect "rating_star" color.
|
|
14
14
|
*/
|
|
15
15
|
import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
16
|
+
import { CustomAttributeTextTrimControl } from './textTrim';
|
|
16
17
|
/**
|
|
17
18
|
* Grouped Custom Attribute Controls
|
|
18
19
|
* Use this object for cleaner imports in extension.ts
|
|
19
20
|
*/
|
|
21
|
+
export { CustomAttributeTextTrimControl } from './textTrim';
|
|
20
22
|
export declare const CustomAttributeControls: {
|
|
21
23
|
readonly align: {
|
|
22
24
|
new (): {
|
|
@@ -102,4 +104,5 @@ export declare const CustomAttributeControls: {
|
|
|
102
104
|
isVisible(_node: ImmutableHtmlNode): boolean;
|
|
103
105
|
};
|
|
104
106
|
};
|
|
107
|
+
readonly textTrim: typeof CustomAttributeTextTrimControl;
|
|
105
108
|
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Attribute Text Trim Control
|
|
3
|
+
*
|
|
4
|
+
* Per-attribute text trimming for custom product attributes.
|
|
5
|
+
* Unlike NameTextTrimControl which applies to ALL product names globally,
|
|
6
|
+
* this control is scoped to a specific custom attribute type via the
|
|
7
|
+
* `product-attr` HTML attribute — changing text-trim on "brand" won't
|
|
8
|
+
* affect "rating_star".
|
|
9
|
+
*
|
|
10
|
+
* CSS rules are shared with NameTextTrimControl via shared/textTrimCssRules.ts.
|
|
11
|
+
*/
|
|
12
|
+
import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
13
|
+
import { CommonControl } from '../../../common-control';
|
|
14
|
+
/**
|
|
15
|
+
* Control for enabling/disabling text trimming on individual custom attributes.
|
|
16
|
+
* Scoped per attribute type using the `product-attr` HTML attribute.
|
|
17
|
+
*/
|
|
18
|
+
export declare class CustomAttributeTextTrimControl extends CommonControl {
|
|
19
|
+
getId(): string;
|
|
20
|
+
getTemplate(): string;
|
|
21
|
+
onRender(): void;
|
|
22
|
+
onTemplateNodeUpdated(node: ImmutableHtmlNode): void;
|
|
23
|
+
_setFormValues(): void;
|
|
24
|
+
_getCurrentTrimState(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Finds all custom attribute elements of the same type as the current node.
|
|
27
|
+
*
|
|
28
|
+
* Similar to getCustomAttrTargetNodes in customAttribute/index.ts, but adapted
|
|
29
|
+
* for CommonControl lifecycle where currentNode is a class property (not a
|
|
30
|
+
* parameter from Stripo's getTargetNodes override).
|
|
31
|
+
*/
|
|
32
|
+
_getTargetElements(): ImmutableHtmlNode[];
|
|
33
|
+
_onTextTrimChange(enabled: boolean): void;
|
|
34
|
+
_listenToFormUpdates(): void;
|
|
35
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
|
|
2
2
|
import { CommonControl } from '../../../common-control';
|
|
3
3
|
/**
|
|
4
|
-
* Control for enabling/disabling text trimming on product names
|
|
4
|
+
* Control for enabling/disabling text trimming on product names.
|
|
5
5
|
* When enabled, adds a CSS class that applies text-overflow: ellipsis
|
|
6
|
-
* and injects the required CSS rules into the document stylesheet
|
|
6
|
+
* and injects the required CSS rules into the document stylesheet.
|
|
7
7
|
*/
|
|
8
8
|
export declare class NameTextTrimControl extends CommonControl {
|
|
9
9
|
getId(): string;
|
|
@@ -12,23 +12,6 @@ export declare class NameTextTrimControl extends CommonControl {
|
|
|
12
12
|
onTemplateNodeUpdated(node: ImmutableHtmlNode): void;
|
|
13
13
|
_setFormValues(): void;
|
|
14
14
|
_getCurrentTrimState(): boolean;
|
|
15
|
-
/**
|
|
16
|
-
* Finds an existing CSS rule in the document stylesheet by exact query
|
|
17
|
-
* @param query - The CSS query to search for (uses Stripo's CSS query syntax)
|
|
18
|
-
* @returns The CSS rule node if found, undefined otherwise
|
|
19
|
-
*/
|
|
20
|
-
_findCssRule(query: string): ImmutableCssNode | undefined;
|
|
21
|
-
/**
|
|
22
|
-
* Finds the .text-trim-enabled p rule by searching all text-trim rules and comparing selectors
|
|
23
|
-
* This is needed because Stripo's CSS query syntax interprets spaces as path separators
|
|
24
|
-
* @returns true if the rule exists
|
|
25
|
-
*/
|
|
26
|
-
_hasParagraphRule(): boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Ensures the text-trim CSS rules exist in the document stylesheet
|
|
29
|
-
* Only adds rules if they don't already exist (prevents duplicates across multiple blocks)
|
|
30
|
-
*/
|
|
31
|
-
_ensureCssRulesExist(): void;
|
|
32
15
|
_onTextTrimChange(enabled: boolean): void;
|
|
33
16
|
_listenToFormUpdates(): void;
|
|
34
17
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Text Trim CSS Rule Management
|
|
3
|
+
*
|
|
4
|
+
* Extracted from NameTextTrimControl to be reused by CustomAttributeTextTrimControl.
|
|
5
|
+
* Follows the same pattern as controls/mobileLayout/cssRules.ts — standalone
|
|
6
|
+
* functions that accept an API parameter, importable by any control class.
|
|
7
|
+
*
|
|
8
|
+
* The CSS rules are document-scoped (shared across all recommendation blocks).
|
|
9
|
+
* Once injected, they persist until the template is closed.
|
|
10
|
+
*/
|
|
11
|
+
import type { ImmutableCssNode } from '@stripoinc/ui-editor-extensions';
|
|
12
|
+
import { ModificationDescription } from '@stripoinc/ui-editor-extensions';
|
|
13
|
+
export declare const CSS_CLASS_TEXT_TRIM = "text-trim-enabled";
|
|
14
|
+
interface CssCapableApi {
|
|
15
|
+
getDocumentRootCssNode: () => ImmutableCssNode | null;
|
|
16
|
+
getDocumentModifier: () => {
|
|
17
|
+
modifyCss: (node: ImmutableCssNode) => {
|
|
18
|
+
appendRule: (rule: string) => void;
|
|
19
|
+
};
|
|
20
|
+
apply: (desc: ModificationDescription) => void;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Ensures the text-trim CSS rules exist in the document stylesheet.
|
|
25
|
+
* Only adds rules if they don't already exist (prevents duplicates across blocks).
|
|
26
|
+
* Calls getDocumentRootCssNode once and passes it to both checks.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureTextTrimCssRulesExist(api: CssCapableApi): void;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const AUTOSAVE_STATUS: {
|
|
2
|
+
readonly IDLE: "idle";
|
|
3
|
+
readonly SAVING: "saving";
|
|
4
|
+
readonly SAVED: "saved";
|
|
5
|
+
readonly ERROR: "error";
|
|
6
|
+
};
|
|
7
|
+
export type AutosaveStatus = typeof AUTOSAVE_STATUS[keyof typeof AUTOSAVE_STATUS];
|
|
8
|
+
export declare const useAutosaveStore: import("pinia").StoreDefinition<"guidoAutosave", {
|
|
9
|
+
isOn: boolean;
|
|
10
|
+
lastSavedAt: Date | null;
|
|
11
|
+
status: AutosaveStatus;
|
|
12
|
+
}, {}, {}>;
|
|
@@ -67,6 +67,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
67
67
|
unsubscribe: boolean;
|
|
68
68
|
modulesDisabled: boolean;
|
|
69
69
|
liquidSyntax: boolean;
|
|
70
|
+
autosave: boolean;
|
|
70
71
|
};
|
|
71
72
|
blocks: {
|
|
72
73
|
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")[];
|
|
@@ -170,6 +171,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
170
171
|
unsubscribe: boolean;
|
|
171
172
|
modulesDisabled: boolean;
|
|
172
173
|
liquidSyntax: boolean;
|
|
174
|
+
autosave: boolean;
|
|
173
175
|
};
|
|
174
176
|
blocks: {
|
|
175
177
|
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")[];
|
|
@@ -273,6 +275,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
273
275
|
unsubscribe: boolean;
|
|
274
276
|
modulesDisabled: boolean;
|
|
275
277
|
liquidSyntax: boolean;
|
|
278
|
+
autosave: boolean;
|
|
276
279
|
};
|
|
277
280
|
blocks: {
|
|
278
281
|
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")[];
|
|
@@ -376,6 +379,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
376
379
|
unsubscribe: boolean;
|
|
377
380
|
modulesDisabled: boolean;
|
|
378
381
|
liquidSyntax: boolean;
|
|
382
|
+
autosave: boolean;
|
|
379
383
|
};
|
|
380
384
|
blocks: {
|
|
381
385
|
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")[];
|
|
@@ -479,6 +483,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
479
483
|
unsubscribe: boolean;
|
|
480
484
|
modulesDisabled: boolean;
|
|
481
485
|
liquidSyntax: boolean;
|
|
486
|
+
autosave: boolean;
|
|
482
487
|
};
|
|
483
488
|
blocks: {
|
|
484
489
|
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")[];
|
|
@@ -582,6 +587,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
582
587
|
unsubscribe: boolean;
|
|
583
588
|
modulesDisabled: boolean;
|
|
584
589
|
liquidSyntax: boolean;
|
|
590
|
+
autosave: boolean;
|
|
585
591
|
};
|
|
586
592
|
blocks: {
|
|
587
593
|
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")[];
|
|
@@ -685,6 +691,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
685
691
|
unsubscribe: boolean;
|
|
686
692
|
modulesDisabled: boolean;
|
|
687
693
|
liquidSyntax: boolean;
|
|
694
|
+
autosave: boolean;
|
|
688
695
|
};
|
|
689
696
|
blocks: {
|
|
690
697
|
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")[];
|
|
@@ -788,6 +795,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
788
795
|
unsubscribe: boolean;
|
|
789
796
|
modulesDisabled: boolean;
|
|
790
797
|
liquidSyntax: boolean;
|
|
798
|
+
autosave: boolean;
|
|
791
799
|
};
|
|
792
800
|
blocks: {
|
|
793
801
|
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")[];
|
|
@@ -891,6 +899,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
891
899
|
unsubscribe: boolean;
|
|
892
900
|
modulesDisabled: boolean;
|
|
893
901
|
liquidSyntax: boolean;
|
|
902
|
+
autosave: boolean;
|
|
894
903
|
};
|
|
895
904
|
blocks: {
|
|
896
905
|
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")[];
|
|
@@ -994,6 +1003,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
994
1003
|
unsubscribe: boolean;
|
|
995
1004
|
modulesDisabled: boolean;
|
|
996
1005
|
liquidSyntax: boolean;
|
|
1006
|
+
autosave: boolean;
|
|
997
1007
|
};
|
|
998
1008
|
blocks: {
|
|
999
1009
|
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")[];
|
|
@@ -1097,6 +1107,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1097
1107
|
unsubscribe: boolean;
|
|
1098
1108
|
modulesDisabled: boolean;
|
|
1099
1109
|
liquidSyntax: boolean;
|
|
1110
|
+
autosave: boolean;
|
|
1100
1111
|
};
|
|
1101
1112
|
blocks: {
|
|
1102
1113
|
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")[];
|
|
@@ -1200,6 +1211,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1200
1211
|
unsubscribe: boolean;
|
|
1201
1212
|
modulesDisabled: boolean;
|
|
1202
1213
|
liquidSyntax: boolean;
|
|
1214
|
+
autosave: boolean;
|
|
1203
1215
|
};
|
|
1204
1216
|
blocks: {
|
|
1205
1217
|
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")[];
|
|
@@ -1303,6 +1315,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1303
1315
|
unsubscribe: boolean;
|
|
1304
1316
|
modulesDisabled: boolean;
|
|
1305
1317
|
liquidSyntax: boolean;
|
|
1318
|
+
autosave: boolean;
|
|
1306
1319
|
};
|
|
1307
1320
|
blocks: {
|
|
1308
1321
|
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")[];
|
|
@@ -1406,6 +1419,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1406
1419
|
unsubscribe: boolean;
|
|
1407
1420
|
modulesDisabled: boolean;
|
|
1408
1421
|
liquidSyntax: boolean;
|
|
1422
|
+
autosave: boolean;
|
|
1409
1423
|
};
|
|
1410
1424
|
blocks: {
|
|
1411
1425
|
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")[];
|
|
@@ -1509,6 +1523,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1509
1523
|
unsubscribe: boolean;
|
|
1510
1524
|
modulesDisabled: boolean;
|
|
1511
1525
|
liquidSyntax: boolean;
|
|
1526
|
+
autosave: boolean;
|
|
1512
1527
|
};
|
|
1513
1528
|
blocks: {
|
|
1514
1529
|
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")[];
|
|
@@ -1612,6 +1627,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1612
1627
|
unsubscribe: boolean;
|
|
1613
1628
|
modulesDisabled: boolean;
|
|
1614
1629
|
liquidSyntax: boolean;
|
|
1630
|
+
autosave: boolean;
|
|
1615
1631
|
};
|
|
1616
1632
|
blocks: {
|
|
1617
1633
|
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")[];
|
|
@@ -1715,6 +1731,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1715
1731
|
unsubscribe: boolean;
|
|
1716
1732
|
modulesDisabled: boolean;
|
|
1717
1733
|
liquidSyntax: boolean;
|
|
1734
|
+
autosave: boolean;
|
|
1718
1735
|
};
|
|
1719
1736
|
blocks: {
|
|
1720
1737
|
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")[];
|
|
@@ -1818,6 +1835,7 @@ export declare const useConfigStore: import("pinia").StoreDefinition<"guido-conf
|
|
|
1818
1835
|
unsubscribe: boolean;
|
|
1819
1836
|
modulesDisabled: boolean;
|
|
1820
1837
|
liquidSyntax: boolean;
|
|
1838
|
+
autosave: boolean;
|
|
1821
1839
|
};
|
|
1822
1840
|
blocks: {
|
|
1823
1841
|
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")[];
|
|
@@ -263,4 +263,27 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
|
|
|
263
263
|
templateId: string;
|
|
264
264
|
syncModulesEnabled: boolean;
|
|
265
265
|
}>) => boolean;
|
|
266
|
+
isInSaveableState: (state: {
|
|
267
|
+
loadingStatus: boolean;
|
|
268
|
+
isCodeEditorOpen: boolean;
|
|
269
|
+
isSaveAsTemplateDrawerOpen: boolean;
|
|
270
|
+
isVersionHistoryOpen: boolean;
|
|
271
|
+
isPreviewModeOpen: boolean;
|
|
272
|
+
editorVisualMode: string;
|
|
273
|
+
hasChanges: boolean;
|
|
274
|
+
isStripoInitialized: boolean;
|
|
275
|
+
templateId: string;
|
|
276
|
+
syncModulesEnabled: boolean;
|
|
277
|
+
} & import("pinia").PiniaCustomStateProperties<{
|
|
278
|
+
loadingStatus: boolean;
|
|
279
|
+
isCodeEditorOpen: boolean;
|
|
280
|
+
isSaveAsTemplateDrawerOpen: boolean;
|
|
281
|
+
isVersionHistoryOpen: boolean;
|
|
282
|
+
isPreviewModeOpen: boolean;
|
|
283
|
+
editorVisualMode: string;
|
|
284
|
+
hasChanges: boolean;
|
|
285
|
+
isStripoInitialized: boolean;
|
|
286
|
+
templateId: string;
|
|
287
|
+
syncModulesEnabled: boolean;
|
|
288
|
+
}>) => boolean;
|
|
266
289
|
}, {}>;
|
|
@@ -1392,6 +1392,10 @@ export declare const useOnboardingStore: import("pinia").StoreDefinition<"guidoO
|
|
|
1392
1392
|
close(type: OnboardingType): Promise<void>;
|
|
1393
1393
|
next(type: OnboardingType): void;
|
|
1394
1394
|
previous(type: OnboardingType): void;
|
|
1395
|
+
updateCardPosition(type: OnboardingType, cardIndex: number, position: {
|
|
1396
|
+
top: string;
|
|
1397
|
+
position: string;
|
|
1398
|
+
}): void;
|
|
1395
1399
|
setConfig(type: OnboardingType, config: OnboardingCardConfig[]): void;
|
|
1396
1400
|
onDiscoverNowClicked(): Promise<void>;
|
|
1397
1401
|
onRemindMeLater(): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats a Date as local time in 24-hour format.
|
|
3
|
+
* Pass `useTimezone = true` to append the UTC offset and city name — useful when the
|
|
4
|
+
* timestamp must clearly communicate the client's timezone.
|
|
5
|
+
* @example formatLocalTime(date) -> 12:20:02
|
|
6
|
+
* @example formatLocalTime(date, true) -> 12:20:02 (UTC+3 Istanbul)
|
|
7
|
+
*/
|
|
8
|
+
export declare const formatLocalTime: (date: Date, useTimezone?: boolean) => string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineStore as e } from "pinia";
|
|
2
|
+
const t = {
|
|
3
|
+
IDLE: "idle",
|
|
4
|
+
SAVING: "saving",
|
|
5
|
+
SAVED: "saved",
|
|
6
|
+
ERROR: "error"
|
|
7
|
+
}, o = e("guidoAutosave", {
|
|
8
|
+
state: () => ({
|
|
9
|
+
isOn: !1,
|
|
10
|
+
lastSavedAt: null,
|
|
11
|
+
status: t.IDLE
|
|
12
|
+
})
|
|
13
|
+
});
|
|
14
|
+
export {
|
|
15
|
+
t as AUTOSAVE_STATUS,
|
|
16
|
+
o as useAutosaveStore
|
|
17
|
+
};
|
package/dist/stores/editor.js
CHANGED
|
@@ -25,7 +25,9 @@ const o = e("guidoEditor", {
|
|
|
25
25
|
isExportButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
|
|
26
26
|
isSaveAsButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
|
|
27
27
|
isTestButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
|
|
28
|
-
isSaveButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen || i.isPreviewModeOpen
|
|
28
|
+
isSaveButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen || i.isPreviewModeOpen,
|
|
29
|
+
// Autosave
|
|
30
|
+
isInSaveableState: (i) => !i.loadingStatus && !i.isVersionHistoryOpen && !i.isPreviewModeOpen && !i.isCodeEditorOpen
|
|
29
31
|
}
|
|
30
32
|
});
|
|
31
33
|
export {
|
|
@@ -71,6 +71,10 @@ const t = () => ({
|
|
|
71
71
|
previous(n) {
|
|
72
72
|
this.onboardings[n].cardIndex > 0 && this.onboardings[n].cardIndex--;
|
|
73
73
|
},
|
|
74
|
+
updateCardPosition(n, i, o) {
|
|
75
|
+
const s = this.onboardings[n].config[i];
|
|
76
|
+
s && (s.top = o.top, s.position = o.position);
|
|
77
|
+
},
|
|
74
78
|
setConfig(n, i) {
|
|
75
79
|
this.onboardings[n].config = i ?? [], this.onboardings[n].cardIndex >= this.onboardings[n].config.length && (this.onboardings[n].cardIndex = 0);
|
|
76
80
|
},
|