@useinsider/guido 3.12.0-beta.00cbb4c → 3.12.0-beta.19da4fb

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 (96) hide show
  1. package/dist/@types/config/schemas.js +9 -4
  2. package/dist/components/Guido.vue.js +8 -8
  3. package/dist/components/Guido.vue2.js +58 -56
  4. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +1 -1
  5. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +8 -8
  6. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +5 -5
  7. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue2.js +10 -10
  8. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.js +38 -0
  9. package/dist/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue2.js +271 -0
  10. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue.js +20 -0
  11. package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue2.js +16 -0
  12. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue.js +20 -0
  13. package/dist/components/organisms/extensions/recommendation/StrategyPicker.vue2.js +80 -0
  14. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.js +18 -0
  15. package/dist/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue2.js +42 -0
  16. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.js +20 -0
  17. package/dist/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue2.js +18 -0
  18. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.js +20 -0
  19. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue2.js +60 -0
  20. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.js +19 -0
  21. package/dist/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue2.js +19 -0
  22. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.js +22 -0
  23. package/dist/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue2.js +29 -0
  24. package/dist/components/organisms/header/ViewOptions.vue.js +3 -3
  25. package/dist/components/organisms/header/version-history/ViewOptions.vue.js +1 -1
  26. package/dist/composables/usePreviewInteractionGuard.js +36 -11
  27. package/dist/composables/useRecommendation.js +82 -51
  28. package/dist/composables/useRecommendationPreview.js +61 -60
  29. package/dist/composables/useStrategyFilters.js +16 -0
  30. package/dist/config/migrator/recommendationMigrator.js +7 -4
  31. package/dist/enums/date.js +4 -3
  32. package/dist/enums/extensions/filteringV2.js +1024 -0
  33. package/dist/enums/extensions/recommendationBlock.js +43 -29
  34. package/dist/enums/extensions/strategyDetail.js +148 -0
  35. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  36. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +12 -11
  37. package/dist/extensions/Blocks/Recommendation/controls/blockBackground/index.js +10 -0
  38. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +137 -119
  39. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +57 -0
  40. package/dist/extensions/Blocks/Recommendation/extension.js +23 -21
  41. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +41 -40
  42. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +392 -112
  43. package/dist/extensions/Blocks/Recommendation/utils/strategyHumanizer.js +97 -0
  44. package/dist/extensions/Blocks/Recommendation/utils/strategyInfoBox.js +24 -0
  45. package/dist/extensions/Blocks/Recommendation/utils/strategyNavigation.js +8 -0
  46. package/dist/extensions/Blocks/Recommendation/utils/strategySummary.js +95 -0
  47. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +24 -10
  48. package/dist/extensions/Blocks/Unsubscribe/utils/constants.js +3 -2
  49. package/dist/extensions/Blocks/controlFactories.js +125 -75
  50. package/dist/guido.css +1 -1
  51. package/dist/node_modules/@vueuse/core/index.js +48 -0
  52. package/dist/node_modules/@vueuse/shared/index.js +57 -27
  53. package/dist/services/recommendationApi.js +86 -29
  54. package/dist/services/stripoApi.js +18 -18
  55. package/dist/src/@types/config/schemas.d.ts +10 -0
  56. package/dist/src/components/organisms/extensions/recommendation/StrategyDetailDrawer.vue.d.ts +2 -0
  57. package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBox.vue.d.ts +26 -0
  58. package/dist/src/components/organisms/extensions/recommendation/StrategyPicker.vue.d.ts +2 -0
  59. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/CampaignTable.vue.d.ts +43 -0
  60. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/FilterHumanizer.vue.d.ts +29 -0
  61. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerCondition.vue.d.ts +40 -0
  62. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/HumanizerGroup.vue.d.ts +38 -0
  63. package/dist/src/components/organisms/extensions/recommendation/strategy-detail/InfoDisplayValue.vue.d.ts +51 -0
  64. package/dist/src/composables/useConfig.d.ts +2 -0
  65. package/dist/src/composables/usePreviewInteractionGuard.d.ts +1 -1
  66. package/dist/src/composables/useRecommendation.d.ts +2 -0
  67. package/dist/src/composables/useStrategyFilters.d.ts +24 -0
  68. package/dist/src/enums/extensions/filteringV2.d.ts +72 -0
  69. package/dist/src/enums/extensions/recommendationBlock.d.ts +21 -0
  70. package/dist/src/enums/extensions/strategyDetail.d.ts +90 -0
  71. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
  72. package/dist/src/extensions/Blocks/Recommendation/controls/blockBackground/index.d.ts +14 -0
  73. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +1 -0
  74. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +10 -4
  75. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +16 -0
  76. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +894 -1
  77. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
  78. package/dist/src/extensions/Blocks/Recommendation/utils/strategyHumanizer.d.ts +50 -0
  79. package/dist/src/extensions/Blocks/Recommendation/utils/strategyInfoBox.d.ts +33 -0
  80. package/dist/src/extensions/Blocks/Recommendation/utils/strategyNavigation.d.ts +10 -0
  81. package/dist/src/extensions/Blocks/Recommendation/utils/strategySummary.d.ts +34 -0
  82. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +8 -1
  83. package/dist/src/extensions/Blocks/Unsubscribe/utils/constants.d.ts +1 -0
  84. package/dist/src/extensions/Blocks/controlFactories.d.ts +36 -0
  85. package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
  86. package/dist/src/services/recommendationApi.d.ts +8 -1
  87. package/dist/src/stores/config.d.ts +18 -0
  88. package/dist/src/utils/genericUtil.d.ts +9 -0
  89. package/dist/src/utils/urlSchemes.d.ts +6 -0
  90. package/dist/static/styles/base.css.js +25 -0
  91. package/dist/static/styles/components/base-input.css.js +6 -7
  92. package/dist/utils/dateUtil.js +23 -10
  93. package/dist/utils/genericUtil.js +10 -1
  94. package/dist/utils/templatePreparation.js +70 -57
  95. package/dist/utils/urlSchemes.js +4 -0
  96. package/package.json +2 -2
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Parses a strategy's `filters` JSON into groups and caps how many are shown.
3
+ *
4
+ * Ported from design-system-organisms
5
+ * `src/organisms/OrgStrategyDetailModal/composables/useFilters.ts` (branch `develop`).
6
+ *
7
+ * The drawer lists two filter groups by default and reveals the rest behind a
8
+ * "Show more" toggle, so a strategy with a dozen groups cannot push the campaign
9
+ * tab off the screen.
10
+ */
11
+ import type { RrsDetailFilterGroup } from '@@/Types/recommendation';
12
+ import { type ComputedRef, type Ref } from 'vue';
13
+ export interface UseStrategyFilters {
14
+ filterQuery: ComputedRef<Record<string, RrsDetailFilterGroup>>;
15
+ hasAnyFilter: ComputedRef<boolean>;
16
+ canToggle: ComputedRef<boolean>;
17
+ isCollapsed: Ref<boolean>;
18
+ toggleMore: () => void;
19
+ }
20
+ /**
21
+ * @param filters - Getter for the raw `filters` JSON string, so the caller can pass a
22
+ * reactive prop without this composable needing to know about props.
23
+ */
24
+ export declare function useStrategyFilters(filters: () => string | undefined): UseStrategyFilters;
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Filtering enums for Reusable Recommendation Strategies (RRS).
3
+ *
4
+ * Ported verbatim from discovery-strategies-fe `src/enums/FilteringEnumsV2.js`
5
+ * (branch `develop`). Only the subset the strategy info-box / humanizer needs is
6
+ * carried over: `Operators`, `OperatorAbbreviations`, `DataTypes`,
7
+ * `MultiSelectDataTypes`, `OperatorNames`, `TimeAbbreviations`.
8
+ *
9
+ * Guido has no equivalent — `utils/filterUtil.ts` and `validation/filterSchema.ts`
10
+ * serve the recommendation block's filters, which are a different shape from a
11
+ * strategy's filters. Do not merge the two.
12
+ *
13
+ * The `text` values are translation keys, not literals; resolve them through
14
+ * `useTranslations().trans()`.
15
+ *
16
+ * ponytail: kept as a literal copy rather than a re-derivation so it stays easy
17
+ * to diff against the source when Smart Recommender adds an operator.
18
+ */
19
+ /** A single operator option, keyed under its attribute data type. */
20
+ export interface OperatorDefinition {
21
+ value: string;
22
+ text: string;
23
+ operator: string;
24
+ /** Alternative label used when the strategy targets the cart page. */
25
+ cartPageText?: string;
26
+ /** Absent on the `Object` data type in the source. */
27
+ filterType?: string;
28
+ }
29
+ export declare const Operators: Record<string, OperatorDefinition[]>;
30
+ export declare const TimeAbbreviations: {
31
+ readonly WEEK: "w";
32
+ readonly DAY: "d";
33
+ readonly HOUR: "h";
34
+ };
35
+ export declare const OperatorAbbreviations: {
36
+ readonly OPERATOR: {
37
+ readonly IN_LAST: "in-last";
38
+ readonly IS_EMPTY: "is-empty";
39
+ readonly IS_NOT_EMPTY: "is-not-empty";
40
+ readonly IN_BETWEEN: "is-between";
41
+ readonly IS_TRUE: "true";
42
+ readonly IS_FALSE: "false";
43
+ };
44
+ readonly OPERATOR_EXPRESSION: {
45
+ readonly IS_EMPTY: "?";
46
+ readonly IS_NOT_EMPTY: "!?";
47
+ };
48
+ readonly DATE_PICKER_OPERATORS: readonly ["after", "before", "is", "is-not"];
49
+ readonly NON_INPUT_OPERATORS: readonly ["in", "not-in", "after", "before", "is", "is-not", "is-empty", "is-not-empty"];
50
+ readonly CHIPS_WIDGET_OPERATORS: readonly ["in", "not-in"];
51
+ };
52
+ export declare const DataTypes: {
53
+ readonly STRING: "String";
54
+ readonly BOOLEAN: "Boolean";
55
+ readonly DATE: "Date";
56
+ readonly NUMBER: "Number";
57
+ readonly TEXT: "Text";
58
+ readonly URL: "Image";
59
+ readonly NUMBERS: "Numbers";
60
+ readonly DATES: "Dates";
61
+ readonly BOOLEANS: "Booleans";
62
+ readonly STRINGS: "Strings";
63
+ };
64
+ export declare const MultiSelectDataTypes: readonly ["Strings", "String", "Array"];
65
+ export declare const OperatorNames: {
66
+ readonly IS_EXACTLY: "is-exactly";
67
+ readonly IS_NOT_EXACTLY: "is-not-exactly";
68
+ readonly CONTAINS: "contains";
69
+ readonly NOT_CONTAINS: "does-not-contain";
70
+ readonly IN: "in";
71
+ readonly NOT_IN: "not-in";
72
+ };
@@ -3,10 +3,31 @@ import type { RecommendationFeedItem } from '@@/Types/recommendation';
3
3
  export declare const URLS: {
4
4
  RECOMMENDATION_API_URL: string;
5
5
  PRODUCT_ATTRIBUTES_PATH: string;
6
+ RECOMMENDATION_STRATEGIES_PATH: string;
7
+ STRATEGY_RECOMMENDATION_URL_PATH: string;
8
+ STRATEGY_DUPLICATE_PATH: string;
9
+ };
10
+ /**
11
+ * Smart Recommender panel routes, relative to the embedding inone origin.
12
+ * Guido navigates in the same tab; the flow continues on those pages and does
13
+ * not come back (`{{id}}` is substituted by `buildStrategyEditPath`).
14
+ */
15
+ export declare const STRATEGY_PAGES: {
16
+ LISTING: string;
17
+ CREATE: string;
18
+ EDIT: string;
6
19
  };
7
20
  export declare const QUERY_PARAMS: {
8
21
  CLIENT_ID: string;
22
+ STRATEGY_ID: string;
23
+ FILTERS: string;
9
24
  };
25
+ /**
26
+ * Smart Recommender's filter grammar: `[table.field][operator][value]`, ANDed with `*`.
27
+ * `~` means "contains" — required because `suitable_channels` is a comma-separated
28
+ * column, so `=` would only ever match single-channel strategies.
29
+ */
30
+ export declare const RRS_EMAIL_ACTIVE_FILTER = "[sr_strategies.status][=][active]*[sr_strategies.suitable_channels][~][EMAIL]";
10
31
  /**
11
32
  * Get recommendation feed source maps lazily so translated names resolve at access time.
12
33
  * Must be called within a Vue component context or after Pinia is initialized.
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Enums for the Reusable Recommendation Strategy (RRS) detail drawer.
3
+ *
4
+ * Ported from design-system-organisms
5
+ * `src/organisms/OrgStrategyDetailModal/enums/details-modal.enum.ts` (branch `develop`).
6
+ *
7
+ * IMPORTANT — this is NOT the same operator table as `@@/Enums/extensions/filteringV2`.
8
+ * The detail modal carries its own, deliberately: it uses different operator values
9
+ * (a `-page-context` suffix where FilteringEnumsV2 uses `_dynamic`) and a different
10
+ * label per operator. The two tables humanize the same JSON for different surfaces —
11
+ * filteringV2 backs the four-row panel summary, this one backs the drawer's filter
12
+ * humanizer. Do not merge them or the drawer starts rendering the wrong operator names.
13
+ *
14
+ * One deliberate deviation from the source: the source resolves `translations[...]` at
15
+ * module-evaluation time. Guido loads translations from editor config after module init,
16
+ * so every `text` here stays a translation KEY and is resolved at render through
17
+ * `useTranslations()`. Resolving eagerly would freeze every label to `undefined`.
18
+ */
19
+ /** Discriminates a duration-based exclusion from a count-based one. */
20
+ export declare const TIME = "TIME";
21
+ export declare const COUNT = "COUNT";
22
+ export declare const OperatorAbbreviations: {
23
+ readonly OPERATOR: {
24
+ readonly IN_LAST: "in-last";
25
+ readonly IS_EMPTY: "is-empty";
26
+ readonly IS_NOT_EMPTY: "is-not-empty";
27
+ readonly IN_BETWEEN: "is-between";
28
+ readonly IS_TRUE: "true";
29
+ readonly IS_FALSE: "false";
30
+ readonly IN: "in";
31
+ readonly NOT_IN: "not-in";
32
+ };
33
+ readonly OPERATOR_EXPRESSION: {
34
+ readonly IS_EMPTY: "?";
35
+ readonly IS_NOT_EMPTY: "!?";
36
+ };
37
+ };
38
+ /** One operator option; `text` is a translation key, not a label. */
39
+ export interface DetailOperator {
40
+ value: string;
41
+ text: string;
42
+ operator: string;
43
+ }
44
+ export declare const Operators: Record<string, DetailOperator[]>;
45
+ export declare const DataTypes: {
46
+ readonly STRING: "String";
47
+ readonly BOOLEAN: "Boolean";
48
+ readonly DATE: "Date";
49
+ readonly NUMBER: "Number";
50
+ readonly TEXT: "Text";
51
+ readonly URL: "Image";
52
+ readonly NUMBERS: "Numbers";
53
+ readonly DATES: "Dates";
54
+ readonly BOOLEANS: "Booleans";
55
+ readonly STRINGS: "Strings";
56
+ };
57
+ export declare const MultiSelectDataTypes: string[];
58
+ export declare const OperatorNames: {
59
+ readonly IS_EXACTLY: "is-exactly";
60
+ readonly IS_NOT_EXACTLY: "is-not-exactly";
61
+ readonly CONTAINS: "contains";
62
+ readonly NOT_CONTAINS: "does-not-contain";
63
+ readonly IN: "in";
64
+ readonly NOT_IN: "not-in";
65
+ };
66
+ export declare const FilterTypeNames: {
67
+ readonly STANDARD_FILTER: "standardFilter";
68
+ readonly DYNAMIC_FILTER: "dynamicFilter";
69
+ readonly USER_CONTEXT_FILTER: "userContextFilter";
70
+ readonly USER_ATTRIBUTE_FILTER: "userAttributeFilter";
71
+ readonly USER_EVENT_FILTER: "userEventFilter";
72
+ readonly EVENT_BASED_FILTER: "eventBasedFilter";
73
+ };
74
+ export declare const UserEventKeys: {
75
+ readonly CURRENTLY_VIEWED_ITEM: "page";
76
+ readonly LEGACY_CURRENTLY_VIEWED_ITEM: "currentlyViewedItem";
77
+ };
78
+ /** `text` is a translation key, resolved at render. */
79
+ export declare const UserEvents: {
80
+ value: string;
81
+ text: string;
82
+ }[];
83
+ /** Channel value that must render as the email product's own label. */
84
+ export declare const EMAIL_CHANNEL = "email";
85
+ export declare const PageTypeTranslationKeys: Record<string, string>;
86
+ /** Drawer tab identifiers. */
87
+ export declare const DetailTabs: {
88
+ readonly GENERAL: "general";
89
+ readonly OTHER: "other";
90
+ };
@@ -3,6 +3,7 @@
3
3
  * These IDs are returned by the getId() method of each control
4
4
  */
5
5
  export declare enum RecommendationControlId {
6
+ BLOCK_BACKGROUND = "recommendation-block-background-color-control",
6
7
  BUTTON_ALIGN = "recommendation-block-button-align-control",
7
8
  BUTTON_BORDER = "recommendation-block-button-border-control",
8
9
  BUTTON_BORDER_RADIUS = "recommendation-block-button-border-radius-control",
@@ -0,0 +1,14 @@
1
+ export declare const BlockBackgroundColorControl: {
2
+ new (): {
3
+ getId(): string;
4
+ getLabels(): {
5
+ title: string;
6
+ };
7
+ getTargetNodes(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode[];
8
+ getAdditionalModifications(root: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): import("@stripoinc/ui-editor-extensions").TemplateModifier<import("@stripoinc/ui-editor-extensions").HtmlNodeModifier, import("@stripoinc/ui-editor-extensions").CssNodeModifier> | undefined;
9
+ getParentControlId(): string;
10
+ api: import("@stripoinc/ui-editor-extensions").ControlApi;
11
+ getModificationDescription(): import("@stripoinc/ui-editor-extensions").ModificationDescription | undefined;
12
+ isVisible(_node: import("@stripoinc/ui-editor-extensions").ImmutableHtmlNode): boolean;
13
+ };
14
+ };
@@ -20,6 +20,7 @@ export { ButtonControls } from './button';
20
20
  export { ImageControls } from './image';
21
21
  export { CustomAttributeControls } from './customAttribute';
22
22
  export { SpacingControl, SPACING_CONTROL_ID } from './spacing';
23
+ export { BlockBackgroundColorControl } from './blockBackground';
23
24
  export { CardBackgroundColorControl, CARD_BACKGROUND_COLOR_CONTROL_ID } from './cardBackground';
24
25
  export { RecommendationCardCompositionControl, COMPOSITION_CONTROL_BLOCK_ID } from './cardComposition';
25
26
  export { SyncInfoMessageControl, SYNC_INFO_MESSAGE_CONTROL_ID } from './syncInfoMessage';
@@ -9,8 +9,9 @@ import { PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID } from './pricePlacem
9
9
  import { ProductCountControl, PRODUCT_COUNT_CONTROL_ID } from './productCount';
10
10
  import { ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID } from './productLayout';
11
11
  import { ShuffleControl, SHUFFLE_CONTROL_ID } from './shuffle';
12
+ import { StrategyControl, STRATEGY_CONTROL_ID } from './strategy';
12
13
  export declare const CONTROL_BLOCK_ID = "ui-elements-recommendation-block";
13
- export { AlgorithmControl, ALGORITHM_CONTROL_ID, LocaleControl, LOCALE_CONTROL_ID, CurrencyControl, CURRENCY_CONTROL_ID, ProductCountControl, PRODUCT_COUNT_CONTROL_ID, ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID, FiltersControl, FILTERS_CONTROL_ID, ShuffleControl, SHUFFLE_CONTROL_ID, LayoutOrientationControl, LAYOUT_ORIENTATION_CONTROL_ID, PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID, };
14
+ export { AlgorithmControl, ALGORITHM_CONTROL_ID, LocaleControl, LOCALE_CONTROL_ID, CurrencyControl, CURRENCY_CONTROL_ID, ProductCountControl, PRODUCT_COUNT_CONTROL_ID, ProductLayoutControl, PRODUCT_LAYOUT_CONTROL_ID, FiltersControl, FILTERS_CONTROL_ID, ShuffleControl, SHUFFLE_CONTROL_ID, LayoutOrientationControl, LAYOUT_ORIENTATION_CONTROL_ID, PricePlacementControl, PRICE_PLACEMENT_CONTROL_ID, StrategyControl, STRATEGY_CONTROL_ID, };
14
15
  export * from './utils';
15
16
  /**
16
17
  * Main recommendation block control that composes all sub-controls
@@ -21,6 +22,7 @@ export declare class RecommendationBlockControl extends CommonControl {
21
22
  private storeUnsubscription;
22
23
  private syncedBlockIds;
23
24
  private algorithmControl;
25
+ private strategyControl;
24
26
  private localeControl;
25
27
  private currencyControl;
26
28
  private productCountControl;
@@ -107,8 +109,12 @@ export declare class RecommendationBlockControl extends CommonControl {
107
109
  */
108
110
  private _listenStateUpdates;
109
111
  /**
110
- * Persists the current filter state from Pinia store to the Stripo node config.
111
- * This ensures filters survive template save/reload cycles.
112
+ * Persists the Pinia-owned parts of the block config to the Stripo node config,
113
+ * so they survive template save/reload cycles.
114
+ *
115
+ * Filters are edited in a drawer and the strategy in an overlaid picker — neither
116
+ * is a Stripo form element, so neither can write to the node itself. Both ride
117
+ * this one update to keep the undo history to a single entry per change.
112
118
  */
113
- private _persistFiltersToNodeConfig;
119
+ private _persistStoreConfigToNode;
114
120
  }
@@ -0,0 +1,16 @@
1
+ import { CommonControl } from '../../../common-control';
2
+ export declare const STRATEGY_CONTROL_ID = "recommendation-strategy-control";
3
+ /**
4
+ * Control for selecting a Reusable Recommendation Strategy
5
+ */
6
+ export declare class StrategyControl extends CommonControl {
7
+ private store;
8
+ private createListener;
9
+ private createButton;
10
+ getId(): string;
11
+ getTemplate(): string;
12
+ onRender(): void;
13
+ onDestroy(): void;
14
+ _onCreateClick(): void;
15
+ _setupButtonListeners(): void;
16
+ }