@gengage/assistant-fe 0.1.0
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/LICENSE +61 -0
- package/README.md +232 -0
- package/dist/assistant-fe.css +1 -0
- package/dist/chat/api.d.ts +87 -0
- package/dist/chat/api.d.ts.map +1 -0
- package/dist/chat/attachment-utils.d.ts +10 -0
- package/dist/chat/attachment-utils.d.ts.map +1 -0
- package/dist/chat/catalog.d.ts +1114 -0
- package/dist/chat/catalog.d.ts.map +1 -0
- package/dist/chat/components/AIGroupingCards.d.ts +4 -0
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
- package/dist/chat/components/AITopPicks.d.ts +4 -0
- package/dist/chat/components/AITopPicks.d.ts.map +1 -0
- package/dist/chat/components/CategoriesContainer.d.ts +4 -0
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
- package/dist/chat/components/ChatDrawer.d.ts +140 -0
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
- package/dist/chat/components/ChoicePrompter.d.ts +16 -0
- package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
- package/dist/chat/components/ComparisonTable.d.ts +47 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
- package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +6 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
- package/dist/chat/components/Launcher.d.ts +25 -0
- package/dist/chat/components/Launcher.d.ts.map +1 -0
- package/dist/chat/components/PanelTopBar.d.ts +20 -0
- package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
- package/dist/chat/components/ProactivePopup.d.ts +11 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
- package/dist/chat/components/ProsAndCons.d.ts +9 -0
- package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -0
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
- package/dist/chat/components/actionClassifier.d.ts +13 -0
- package/dist/chat/components/actionClassifier.d.ts.map +1 -0
- package/dist/chat/components/productMentionLinker.d.ts +26 -0
- package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
- package/dist/chat/components/renderUISpec.d.ts +15 -0
- package/dist/chat/components/renderUISpec.d.ts.map +1 -0
- package/dist/chat/components/typewriter.d.ts +25 -0
- package/dist/chat/components/typewriter.d.ts.map +1 -0
- package/dist/chat/extendedModeManager.d.ts +33 -0
- package/dist/chat/extendedModeManager.d.ts.map +1 -0
- package/dist/chat/index.d.ts +192 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts +3 -0
- package/dist/chat/locales/en.d.ts.map +1 -0
- package/dist/chat/locales/index.d.ts +6 -0
- package/dist/chat/locales/index.d.ts.map +1 -0
- package/dist/chat/locales/tr.d.ts +3 -0
- package/dist/chat/locales/tr.d.ts.map +1 -0
- package/dist/chat/types.d.ts +212 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.iife.js +59 -0
- package/dist/chat.iife.js.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/common/action-router.d.ts +30 -0
- package/dist/common/action-router.d.ts.map +1 -0
- package/dist/common/activity-tracker.d.ts +38 -0
- package/dist/common/activity-tracker.d.ts.map +1 -0
- package/dist/common/analytics-events.d.ts +90 -0
- package/dist/common/analytics-events.d.ts.map +1 -0
- package/dist/common/analytics.d.ts +58 -0
- package/dist/common/analytics.d.ts.map +1 -0
- package/dist/common/api-paths.d.ts +14 -0
- package/dist/common/api-paths.d.ts.map +1 -0
- package/dist/common/client.d.ts +20 -0
- package/dist/common/client.d.ts.map +1 -0
- package/dist/common/communication-bridge.d.ts +51 -0
- package/dist/common/communication-bridge.d.ts.map +1 -0
- package/dist/common/config-schema.d.ts +241 -0
- package/dist/common/config-schema.d.ts.map +1 -0
- package/dist/common/context.d.ts +28 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/customization-factories.d.ts +63 -0
- package/dist/common/customization-factories.d.ts.map +1 -0
- package/dist/common/events.d.ts +47 -0
- package/dist/common/events.d.ts.map +1 -0
- package/dist/common/global-error-toast.d.ts +6 -0
- package/dist/common/global-error-toast.d.ts.map +1 -0
- package/dist/common/index.d.ts +36 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/indexed-db.d.ts +74 -0
- package/dist/common/indexed-db.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +64 -0
- package/dist/common/overlay.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +12 -0
- package/dist/common/preflight.d.ts.map +1 -0
- package/dist/common/renderer/dom.d.ts +4 -0
- package/dist/common/renderer/dom.d.ts.map +1 -0
- package/dist/common/renderer/index.d.ts +5 -0
- package/dist/common/renderer/index.d.ts.map +1 -0
- package/dist/common/renderer/overrides.d.ts +24 -0
- package/dist/common/renderer/overrides.d.ts.map +1 -0
- package/dist/common/renderer/registry.d.ts +3 -0
- package/dist/common/renderer/registry.d.ts.map +1 -0
- package/dist/common/renderer/types.d.ts +20 -0
- package/dist/common/renderer/types.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +19 -0
- package/dist/common/safe-html.d.ts.map +1 -0
- package/dist/common/streaming.d.ts +32 -0
- package/dist/common/streaming.d.ts.map +1 -0
- package/dist/common/theme-utils.d.ts +16 -0
- package/dist/common/theme-utils.d.ts.map +1 -0
- package/dist/common/types.d.ts +298 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/ui-theme.d.ts +10 -0
- package/dist/common/ui-theme.d.ts.map +1 -0
- package/dist/common/uuidv7.d.ts +8 -0
- package/dist/common/uuidv7.d.ts.map +1 -0
- package/dist/common/v1-protocol-adapter.d.ts +66 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +75 -0
- package/dist/common/widget-base.d.ts.map +1 -0
- package/dist/common.cjs +2 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.js +584 -0
- package/dist/common.js.map +1 -0
- package/dist/index-CFA70IGF.js +3626 -0
- package/dist/index-CFA70IGF.js.map +1 -0
- package/dist/index-Dfl89zpe.cjs +13 -0
- package/dist/index-Dfl89zpe.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/qna/api.d.ts +22 -0
- package/dist/qna/api.d.ts.map +1 -0
- package/dist/qna/catalog.d.ts +140 -0
- package/dist/qna/catalog.d.ts.map +1 -0
- package/dist/qna/components/ButtonRow.d.ts +16 -0
- package/dist/qna/components/ButtonRow.d.ts.map +1 -0
- package/dist/qna/components/TextInput.d.ts +12 -0
- package/dist/qna/components/TextInput.d.ts.map +1 -0
- package/dist/qna/components/renderUISpec.d.ts +8 -0
- package/dist/qna/components/renderUISpec.d.ts.map +1 -0
- package/dist/qna/index.d.ts +34 -0
- package/dist/qna/index.d.ts.map +1 -0
- package/dist/qna/locales/en.d.ts +3 -0
- package/dist/qna/locales/en.d.ts.map +1 -0
- package/dist/qna/locales/index.d.ts +6 -0
- package/dist/qna/locales/index.d.ts.map +1 -0
- package/dist/qna/locales/tr.d.ts +3 -0
- package/dist/qna/locales/tr.d.ts.map +1 -0
- package/dist/qna/types.d.ts +62 -0
- package/dist/qna/types.d.ts.map +1 -0
- package/dist/qna.cjs +2 -0
- package/dist/qna.cjs.map +1 -0
- package/dist/qna.css +1 -0
- package/dist/qna.iife.js +48 -0
- package/dist/qna.iife.js.map +1 -0
- package/dist/qna.js +435 -0
- package/dist/qna.js.map +1 -0
- package/dist/simrel/api.d.ts +26 -0
- package/dist/simrel/api.d.ts.map +1 -0
- package/dist/simrel/catalog.d.ts +319 -0
- package/dist/simrel/catalog.d.ts.map +1 -0
- package/dist/simrel/components/GroupTabs.d.ts +17 -0
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
- package/dist/simrel/components/ProductCard.d.ts +17 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -0
- package/dist/simrel/components/ProductGrid.d.ts +17 -0
- package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
- package/dist/simrel/components/renderUISpec.d.ts +8 -0
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
- package/dist/simrel/index.d.ts +36 -0
- package/dist/simrel/index.d.ts.map +1 -0
- package/dist/simrel/locales/en.d.ts +3 -0
- package/dist/simrel/locales/en.d.ts.map +1 -0
- package/dist/simrel/locales/index.d.ts +6 -0
- package/dist/simrel/locales/index.d.ts.map +1 -0
- package/dist/simrel/locales/tr.d.ts +3 -0
- package/dist/simrel/locales/tr.d.ts.map +1 -0
- package/dist/simrel/types.d.ts +111 -0
- package/dist/simrel/types.d.ts.map +1 -0
- package/dist/simrel.cjs +2 -0
- package/dist/simrel.cjs.map +1 -0
- package/dist/simrel.css +1 -0
- package/dist/simrel.iife.js +48 -0
- package/dist/simrel.iife.js.map +1 -0
- package/dist/simrel.js +620 -0
- package/dist/simrel.js.map +1 -0
- package/dist/types-CeON7iBO.cjs +48 -0
- package/dist/types-CeON7iBO.cjs.map +1 -0
- package/dist/types-yxW8WA7u.js +4132 -0
- package/dist/types-yxW8WA7u.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ProductGridSchema: z.ZodObject<{
|
|
3
|
+
layout: z.ZodOptional<z.ZodEnum<["grid", "carousel"]>>;
|
|
4
|
+
columns: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
layout?: "grid" | "carousel" | undefined;
|
|
7
|
+
columns?: number | undefined;
|
|
8
|
+
}, {
|
|
9
|
+
layout?: "grid" | "carousel" | undefined;
|
|
10
|
+
columns?: number | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const ProductCardSchema: z.ZodObject<{
|
|
13
|
+
product: z.ZodObject<{
|
|
14
|
+
sku: z.ZodString;
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
imageUrl: z.ZodOptional<z.ZodString>;
|
|
17
|
+
price: z.ZodOptional<z.ZodString>;
|
|
18
|
+
originalPrice: z.ZodOptional<z.ZodString>;
|
|
19
|
+
discountPercent: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
url: z.ZodString;
|
|
21
|
+
brand: z.ZodOptional<z.ZodString>;
|
|
22
|
+
rating: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
reviewCount: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
sku: string;
|
|
26
|
+
url: string;
|
|
27
|
+
name: string;
|
|
28
|
+
price?: string | undefined;
|
|
29
|
+
reviewCount?: number | undefined;
|
|
30
|
+
brand?: string | undefined;
|
|
31
|
+
imageUrl?: string | undefined;
|
|
32
|
+
rating?: number | undefined;
|
|
33
|
+
originalPrice?: string | undefined;
|
|
34
|
+
discountPercent?: number | undefined;
|
|
35
|
+
}, {
|
|
36
|
+
sku: string;
|
|
37
|
+
url: string;
|
|
38
|
+
name: string;
|
|
39
|
+
price?: string | undefined;
|
|
40
|
+
reviewCount?: number | undefined;
|
|
41
|
+
brand?: string | undefined;
|
|
42
|
+
imageUrl?: string | undefined;
|
|
43
|
+
rating?: number | undefined;
|
|
44
|
+
originalPrice?: string | undefined;
|
|
45
|
+
discountPercent?: number | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
index: z.ZodNumber;
|
|
48
|
+
discountType: z.ZodOptional<z.ZodEnum<["strike-through", "badge"]>>;
|
|
49
|
+
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
product: {
|
|
51
|
+
sku: string;
|
|
52
|
+
url: string;
|
|
53
|
+
name: string;
|
|
54
|
+
price?: string | undefined;
|
|
55
|
+
reviewCount?: number | undefined;
|
|
56
|
+
brand?: string | undefined;
|
|
57
|
+
imageUrl?: string | undefined;
|
|
58
|
+
rating?: number | undefined;
|
|
59
|
+
originalPrice?: string | undefined;
|
|
60
|
+
discountPercent?: number | undefined;
|
|
61
|
+
};
|
|
62
|
+
index: number;
|
|
63
|
+
discountType?: "strike-through" | "badge" | undefined;
|
|
64
|
+
}, {
|
|
65
|
+
product: {
|
|
66
|
+
sku: string;
|
|
67
|
+
url: string;
|
|
68
|
+
name: string;
|
|
69
|
+
price?: string | undefined;
|
|
70
|
+
reviewCount?: number | undefined;
|
|
71
|
+
brand?: string | undefined;
|
|
72
|
+
imageUrl?: string | undefined;
|
|
73
|
+
rating?: number | undefined;
|
|
74
|
+
originalPrice?: string | undefined;
|
|
75
|
+
discountPercent?: number | undefined;
|
|
76
|
+
};
|
|
77
|
+
index: number;
|
|
78
|
+
discountType?: "strike-through" | "badge" | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
export declare const AddToCartButtonSchema: z.ZodObject<{
|
|
81
|
+
sku: z.ZodString;
|
|
82
|
+
label: z.ZodOptional<z.ZodString>;
|
|
83
|
+
cartCode: z.ZodString;
|
|
84
|
+
}, "strip", z.ZodTypeAny, {
|
|
85
|
+
sku: string;
|
|
86
|
+
cartCode: string;
|
|
87
|
+
label?: string | undefined;
|
|
88
|
+
}, {
|
|
89
|
+
sku: string;
|
|
90
|
+
cartCode: string;
|
|
91
|
+
label?: string | undefined;
|
|
92
|
+
}>;
|
|
93
|
+
export declare const QuickActionsSchema: z.ZodObject<{
|
|
94
|
+
actions: z.ZodArray<z.ZodObject<{
|
|
95
|
+
label: z.ZodString;
|
|
96
|
+
action: z.ZodObject<{
|
|
97
|
+
title: z.ZodString;
|
|
98
|
+
type: z.ZodString;
|
|
99
|
+
payload: z.ZodOptional<z.ZodUnknown>;
|
|
100
|
+
}, "strip", z.ZodTypeAny, {
|
|
101
|
+
type: string;
|
|
102
|
+
title: string;
|
|
103
|
+
payload?: unknown;
|
|
104
|
+
}, {
|
|
105
|
+
type: string;
|
|
106
|
+
title: string;
|
|
107
|
+
payload?: unknown;
|
|
108
|
+
}>;
|
|
109
|
+
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
label: string;
|
|
111
|
+
action: {
|
|
112
|
+
type: string;
|
|
113
|
+
title: string;
|
|
114
|
+
payload?: unknown;
|
|
115
|
+
};
|
|
116
|
+
}, {
|
|
117
|
+
label: string;
|
|
118
|
+
action: {
|
|
119
|
+
type: string;
|
|
120
|
+
title: string;
|
|
121
|
+
payload?: unknown;
|
|
122
|
+
};
|
|
123
|
+
}>, "many">;
|
|
124
|
+
}, "strip", z.ZodTypeAny, {
|
|
125
|
+
actions: {
|
|
126
|
+
label: string;
|
|
127
|
+
action: {
|
|
128
|
+
type: string;
|
|
129
|
+
title: string;
|
|
130
|
+
payload?: unknown;
|
|
131
|
+
};
|
|
132
|
+
}[];
|
|
133
|
+
}, {
|
|
134
|
+
actions: {
|
|
135
|
+
label: string;
|
|
136
|
+
action: {
|
|
137
|
+
type: string;
|
|
138
|
+
title: string;
|
|
139
|
+
payload?: unknown;
|
|
140
|
+
};
|
|
141
|
+
}[];
|
|
142
|
+
}>;
|
|
143
|
+
export declare const EmptyStateSchema: z.ZodObject<{
|
|
144
|
+
message: z.ZodOptional<z.ZodString>;
|
|
145
|
+
}, "strip", z.ZodTypeAny, {
|
|
146
|
+
message?: string | undefined;
|
|
147
|
+
}, {
|
|
148
|
+
message?: string | undefined;
|
|
149
|
+
}>;
|
|
150
|
+
export declare const simRelCatalog: {
|
|
151
|
+
readonly components: {
|
|
152
|
+
readonly ProductGrid: {
|
|
153
|
+
readonly schema: z.ZodObject<{
|
|
154
|
+
layout: z.ZodOptional<z.ZodEnum<["grid", "carousel"]>>;
|
|
155
|
+
columns: z.ZodOptional<z.ZodNumber>;
|
|
156
|
+
}, "strip", z.ZodTypeAny, {
|
|
157
|
+
layout?: "grid" | "carousel" | undefined;
|
|
158
|
+
columns?: number | undefined;
|
|
159
|
+
}, {
|
|
160
|
+
layout?: "grid" | "carousel" | undefined;
|
|
161
|
+
columns?: number | undefined;
|
|
162
|
+
}>;
|
|
163
|
+
readonly description: "Outer grid or carousel container for similar products.";
|
|
164
|
+
};
|
|
165
|
+
readonly ProductCard: {
|
|
166
|
+
readonly schema: z.ZodObject<{
|
|
167
|
+
product: z.ZodObject<{
|
|
168
|
+
sku: z.ZodString;
|
|
169
|
+
name: z.ZodString;
|
|
170
|
+
imageUrl: z.ZodOptional<z.ZodString>;
|
|
171
|
+
price: z.ZodOptional<z.ZodString>;
|
|
172
|
+
originalPrice: z.ZodOptional<z.ZodString>;
|
|
173
|
+
discountPercent: z.ZodOptional<z.ZodNumber>;
|
|
174
|
+
url: z.ZodString;
|
|
175
|
+
brand: z.ZodOptional<z.ZodString>;
|
|
176
|
+
rating: z.ZodOptional<z.ZodNumber>;
|
|
177
|
+
reviewCount: z.ZodOptional<z.ZodNumber>;
|
|
178
|
+
}, "strip", z.ZodTypeAny, {
|
|
179
|
+
sku: string;
|
|
180
|
+
url: string;
|
|
181
|
+
name: string;
|
|
182
|
+
price?: string | undefined;
|
|
183
|
+
reviewCount?: number | undefined;
|
|
184
|
+
brand?: string | undefined;
|
|
185
|
+
imageUrl?: string | undefined;
|
|
186
|
+
rating?: number | undefined;
|
|
187
|
+
originalPrice?: string | undefined;
|
|
188
|
+
discountPercent?: number | undefined;
|
|
189
|
+
}, {
|
|
190
|
+
sku: string;
|
|
191
|
+
url: string;
|
|
192
|
+
name: string;
|
|
193
|
+
price?: string | undefined;
|
|
194
|
+
reviewCount?: number | undefined;
|
|
195
|
+
brand?: string | undefined;
|
|
196
|
+
imageUrl?: string | undefined;
|
|
197
|
+
rating?: number | undefined;
|
|
198
|
+
originalPrice?: string | undefined;
|
|
199
|
+
discountPercent?: number | undefined;
|
|
200
|
+
}>;
|
|
201
|
+
index: z.ZodNumber;
|
|
202
|
+
discountType: z.ZodOptional<z.ZodEnum<["strike-through", "badge"]>>;
|
|
203
|
+
}, "strip", z.ZodTypeAny, {
|
|
204
|
+
product: {
|
|
205
|
+
sku: string;
|
|
206
|
+
url: string;
|
|
207
|
+
name: string;
|
|
208
|
+
price?: string | undefined;
|
|
209
|
+
reviewCount?: number | undefined;
|
|
210
|
+
brand?: string | undefined;
|
|
211
|
+
imageUrl?: string | undefined;
|
|
212
|
+
rating?: number | undefined;
|
|
213
|
+
originalPrice?: string | undefined;
|
|
214
|
+
discountPercent?: number | undefined;
|
|
215
|
+
};
|
|
216
|
+
index: number;
|
|
217
|
+
discountType?: "strike-through" | "badge" | undefined;
|
|
218
|
+
}, {
|
|
219
|
+
product: {
|
|
220
|
+
sku: string;
|
|
221
|
+
url: string;
|
|
222
|
+
name: string;
|
|
223
|
+
price?: string | undefined;
|
|
224
|
+
reviewCount?: number | undefined;
|
|
225
|
+
brand?: string | undefined;
|
|
226
|
+
imageUrl?: string | undefined;
|
|
227
|
+
rating?: number | undefined;
|
|
228
|
+
originalPrice?: string | undefined;
|
|
229
|
+
discountPercent?: number | undefined;
|
|
230
|
+
};
|
|
231
|
+
index: number;
|
|
232
|
+
discountType?: "strike-through" | "badge" | undefined;
|
|
233
|
+
}>;
|
|
234
|
+
readonly description: "A single product card with image, title, price, and actions.";
|
|
235
|
+
};
|
|
236
|
+
readonly AddToCartButton: {
|
|
237
|
+
readonly schema: z.ZodObject<{
|
|
238
|
+
sku: z.ZodString;
|
|
239
|
+
label: z.ZodOptional<z.ZodString>;
|
|
240
|
+
cartCode: z.ZodString;
|
|
241
|
+
}, "strip", z.ZodTypeAny, {
|
|
242
|
+
sku: string;
|
|
243
|
+
cartCode: string;
|
|
244
|
+
label?: string | undefined;
|
|
245
|
+
}, {
|
|
246
|
+
sku: string;
|
|
247
|
+
cartCode: string;
|
|
248
|
+
label?: string | undefined;
|
|
249
|
+
}>;
|
|
250
|
+
readonly description: "Add-to-cart CTA rendered inside or below a product card.";
|
|
251
|
+
};
|
|
252
|
+
readonly QuickActions: {
|
|
253
|
+
readonly schema: z.ZodObject<{
|
|
254
|
+
actions: z.ZodArray<z.ZodObject<{
|
|
255
|
+
label: z.ZodString;
|
|
256
|
+
action: z.ZodObject<{
|
|
257
|
+
title: z.ZodString;
|
|
258
|
+
type: z.ZodString;
|
|
259
|
+
payload: z.ZodOptional<z.ZodUnknown>;
|
|
260
|
+
}, "strip", z.ZodTypeAny, {
|
|
261
|
+
type: string;
|
|
262
|
+
title: string;
|
|
263
|
+
payload?: unknown;
|
|
264
|
+
}, {
|
|
265
|
+
type: string;
|
|
266
|
+
title: string;
|
|
267
|
+
payload?: unknown;
|
|
268
|
+
}>;
|
|
269
|
+
}, "strip", z.ZodTypeAny, {
|
|
270
|
+
label: string;
|
|
271
|
+
action: {
|
|
272
|
+
type: string;
|
|
273
|
+
title: string;
|
|
274
|
+
payload?: unknown;
|
|
275
|
+
};
|
|
276
|
+
}, {
|
|
277
|
+
label: string;
|
|
278
|
+
action: {
|
|
279
|
+
type: string;
|
|
280
|
+
title: string;
|
|
281
|
+
payload?: unknown;
|
|
282
|
+
};
|
|
283
|
+
}>, "many">;
|
|
284
|
+
}, "strip", z.ZodTypeAny, {
|
|
285
|
+
actions: {
|
|
286
|
+
label: string;
|
|
287
|
+
action: {
|
|
288
|
+
type: string;
|
|
289
|
+
title: string;
|
|
290
|
+
payload?: unknown;
|
|
291
|
+
};
|
|
292
|
+
}[];
|
|
293
|
+
}, {
|
|
294
|
+
actions: {
|
|
295
|
+
label: string;
|
|
296
|
+
action: {
|
|
297
|
+
type: string;
|
|
298
|
+
title: string;
|
|
299
|
+
payload?: unknown;
|
|
300
|
+
};
|
|
301
|
+
}[];
|
|
302
|
+
}>;
|
|
303
|
+
readonly description: "A row of quick-action buttons below product info.";
|
|
304
|
+
};
|
|
305
|
+
readonly EmptyState: {
|
|
306
|
+
readonly schema: z.ZodObject<{
|
|
307
|
+
message: z.ZodOptional<z.ZodString>;
|
|
308
|
+
}, "strip", z.ZodTypeAny, {
|
|
309
|
+
message?: string | undefined;
|
|
310
|
+
}, {
|
|
311
|
+
message?: string | undefined;
|
|
312
|
+
}>;
|
|
313
|
+
readonly description: "Empty state shown when no similar products are available.";
|
|
314
|
+
};
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
export type SimRelCatalog = typeof simRelCatalog;
|
|
318
|
+
export type SimRelComponentName = keyof SimRelCatalog['components'];
|
|
319
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/simrel/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI5B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;EAE3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBhB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC;AACjD,MAAM,MAAM,mBAAmB,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NormalizedProduct } from '../../common/v1-protocol-adapter.js';
|
|
2
|
+
import { ProductGroup } from '../api.js';
|
|
3
|
+
import { SimRelI18n } from '../types.js';
|
|
4
|
+
export interface GroupTabsOptions {
|
|
5
|
+
groups: ProductGroup[];
|
|
6
|
+
discountType?: 'strike-through' | 'badge';
|
|
7
|
+
onClick: (product: NormalizedProduct) => void;
|
|
8
|
+
onAddToCart: (params: {
|
|
9
|
+
sku: string;
|
|
10
|
+
quantity: number;
|
|
11
|
+
cartCode: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
renderCard?: (product: NormalizedProduct, index: number) => string;
|
|
14
|
+
i18n?: SimRelI18n;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderGroupTabs(options: GroupTabsOptions): HTMLElement;
|
|
17
|
+
//# sourceMappingURL=GroupTabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupTabs.d.ts","sourceRoot":"","sources":["../../../src/simrel/components/GroupTabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC1C,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnE,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CA2EtE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NormalizedProduct } from '../../common/v1-protocol-adapter.js';
|
|
2
|
+
import { SimRelI18n } from '../types.js';
|
|
3
|
+
export interface ProductCardOptions {
|
|
4
|
+
product: NormalizedProduct;
|
|
5
|
+
index: number;
|
|
6
|
+
discountType?: 'strike-through' | 'badge';
|
|
7
|
+
onClick: (product: NormalizedProduct) => void;
|
|
8
|
+
onAddToCart: (params: {
|
|
9
|
+
sku: string;
|
|
10
|
+
quantity: number;
|
|
11
|
+
cartCode: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
renderCard?: (product: NormalizedProduct, index: number) => string;
|
|
14
|
+
i18n?: SimRelI18n;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderProductCard(options: ProductCardOptions): HTMLElement;
|
|
17
|
+
//# sourceMappingURL=ProductCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCard.d.ts","sourceRoot":"","sources":["../../../src/simrel/components/ProductCard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC1C,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnE,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAwH1E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NormalizedProduct } from '../../common/v1-protocol-adapter.js';
|
|
2
|
+
import { SimRelI18n } from '../types.js';
|
|
3
|
+
export interface ProductGridOptions {
|
|
4
|
+
products: NormalizedProduct[];
|
|
5
|
+
columns?: number;
|
|
6
|
+
discountType?: 'strike-through' | 'badge';
|
|
7
|
+
onClick: (product: NormalizedProduct) => void;
|
|
8
|
+
onAddToCart: (params: {
|
|
9
|
+
sku: string;
|
|
10
|
+
quantity: number;
|
|
11
|
+
cartCode: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
renderCard?: (product: NormalizedProduct, index: number) => string;
|
|
14
|
+
i18n?: SimRelI18n;
|
|
15
|
+
}
|
|
16
|
+
export declare function renderProductGrid(options: ProductGridOptions): HTMLElement;
|
|
17
|
+
//# sourceMappingURL=ProductGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductGrid.d.ts","sourceRoot":"","sources":["../../../src/simrel/components/ProductGrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC1C,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnE,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAiC1E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';
|
|
2
|
+
import { UISpec } from '../../common/types.js';
|
|
3
|
+
import { SimRelUISpecRenderContext } from '../types.js';
|
|
4
|
+
export type SimRelUISpecRegistry = UISpecDomRegistry<SimRelUISpecRenderContext>;
|
|
5
|
+
export declare const defaultSimRelUnknownUISpecRenderer: UISpecDomUnknownRenderer<SimRelUISpecRenderContext>;
|
|
6
|
+
export declare function createDefaultSimRelUISpecRegistry(): SimRelUISpecRegistry;
|
|
7
|
+
export declare function renderSimRelUISpec(spec: UISpec, context: SimRelUISpecRenderContext, registry?: SimRelUISpecRegistry, unknownRenderer?: UISpecDomUnknownRenderer<SimRelUISpecRenderContext>): HTMLElement;
|
|
8
|
+
//# sourceMappingURL=renderUISpec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderUISpec.d.ts","sourceRoot":"","sources":["../../../src/simrel/components/renderUISpec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAkB,MAAM,aAAa,CAAC;AAK7E,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;AA4LhF,eAAO,MAAM,kCAAkC,EAAE,wBAAwB,CAAC,yBAAyB,CAgBlG,CAAC;AAEF,wBAAgB,iCAAiC,IAAI,oBAAoB,CAExE;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,EAClC,QAAQ,uBAAkC,EAC1C,eAAe,GAAE,wBAAwB,CAAC,yBAAyB,CAAsC,GACxG,WAAW,CAQb"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PageContext } from '../common/types.js';
|
|
2
|
+
import { NormalizedProduct } from '../common/v1-protocol-adapter.js';
|
|
3
|
+
import { BaseWidget } from '../common/widget-base.js';
|
|
4
|
+
import { SimRelWidgetConfig } from './types.js';
|
|
5
|
+
export declare class GengageSimRel extends BaseWidget<SimRelWidgetConfig> {
|
|
6
|
+
private _abortController;
|
|
7
|
+
private _contentEl;
|
|
8
|
+
private _lastSku;
|
|
9
|
+
private _i18n;
|
|
10
|
+
protected onInit(config: SimRelWidgetConfig): Promise<void>;
|
|
11
|
+
protected onUpdate(context: Partial<PageContext>): void;
|
|
12
|
+
protected onShow(): void;
|
|
13
|
+
protected onHide(): void;
|
|
14
|
+
protected onDestroy(): void;
|
|
15
|
+
_handleProductClick(product: NormalizedProduct): void;
|
|
16
|
+
_handleAddToCart(params: {
|
|
17
|
+
sku: string;
|
|
18
|
+
quantity: number;
|
|
19
|
+
cartCode: string;
|
|
20
|
+
}): void;
|
|
21
|
+
private _abort;
|
|
22
|
+
private _fetchAndRender;
|
|
23
|
+
private _resolveI18n;
|
|
24
|
+
private _resolveUISpecRegistry;
|
|
25
|
+
private _buildRenderContext;
|
|
26
|
+
private _renderUISpec;
|
|
27
|
+
private _buildProductsSpec;
|
|
28
|
+
private _buildGroupsSpec;
|
|
29
|
+
}
|
|
30
|
+
export declare function createSimRelWidget(): GengageSimRel;
|
|
31
|
+
export type { SimRelWidgetConfig, SimilarProduct, SimRelUIComponents, SimRelI18n, SimRelUISpecRenderContext, SimRelRendererConfig, } from './types.js';
|
|
32
|
+
export { renderSimRelUISpec, createDefaultSimRelUISpecRegistry, defaultSimRelUnknownUISpecRenderer, } from './components/renderUISpec.js';
|
|
33
|
+
export type { SimRelUISpecRegistry } from './components/renderUISpec.js';
|
|
34
|
+
export { simRelCatalog } from './catalog.js';
|
|
35
|
+
export type { SimRelCatalog, SimRelComponentName } from './catalog.js';
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simrel/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAgBtD,OAAO,KAAK,EAAE,kBAAkB,EAAyD,MAAM,YAAY,CAAC;AAG5G,OAAO,yBAAyB,CAAC;AAEjC,qBAAa,aAAc,SAAQ,UAAU,CAAC,kBAAkB,CAAC;IAC/D,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAA8B;cAE3B,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjE,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAOvD,SAAS,CAAC,MAAM,IAAI,IAAI;IAUxB,SAAS,CAAC,MAAM,IAAI,IAAI;IAIxB,SAAS,CAAC,SAAS,IAAI,IAAI;IAY3B,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IA4BrD,gBAAgB,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAoBnF,OAAO,CAAC,MAAM;YAKA,eAAe;IA2H7B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,gBAAgB;CAiBzB;AAED,wBAAgB,kBAAkB,IAAI,aAAa,CAElD;AAED,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/simrel/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,cAAc,EAAE,UAK5B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SimRelI18n } from '../types.js';
|
|
2
|
+
import { SIMREL_I18N_TR } from './tr.js';
|
|
3
|
+
import { SIMREL_I18N_EN } from './en.js';
|
|
4
|
+
export declare function resolveSimRelLocale(locale?: string): SimRelI18n;
|
|
5
|
+
export { SIMREL_I18N_TR, SIMREL_I18N_EN };
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/simrel/locales/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAOzC,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAO/D;AAED,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tr.d.ts","sourceRoot":"","sources":["../../../src/simrel/locales/tr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,cAAc,EAAE,UAK5B,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { BaseWidgetConfig, ActionPayload } from '../common/types.js';
|
|
2
|
+
import { UISpecRendererOverrides } from '../common/renderer/index.js';
|
|
3
|
+
export interface SimRelWidgetConfig extends BaseWidgetConfig {
|
|
4
|
+
/** Product SKU to find similar items for. Required. */
|
|
5
|
+
sku: string;
|
|
6
|
+
/** Where to render the product grid. Required. */
|
|
7
|
+
mountTarget: HTMLElement | string;
|
|
8
|
+
/** Called when "Add to cart" is tapped on a product card. */
|
|
9
|
+
onAddToCart?: (params: {
|
|
10
|
+
sku: string;
|
|
11
|
+
quantity: number;
|
|
12
|
+
cartCode: string;
|
|
13
|
+
}) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Called when the user taps a product card (navigation intent).
|
|
16
|
+
* Return false to prevent the widget's default navigation.
|
|
17
|
+
*/
|
|
18
|
+
onProductClick?: (product: SimilarProduct) => boolean | void;
|
|
19
|
+
/**
|
|
20
|
+
* Called just before navigating to a product page.
|
|
21
|
+
* Use to call window.gengage.chat.saveSession() for cross-page session continuity.
|
|
22
|
+
*/
|
|
23
|
+
onProductNavigate?: (url: string, sku: string, sessionId: string | null) => void;
|
|
24
|
+
/** Forwarded to your analytics layer. */
|
|
25
|
+
onAnalyticsEvent?: (event: string, data: Record<string, unknown>) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Override the default product card template.
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ XSS WARNING: This function returns a raw HTML string injected into the DOM.
|
|
30
|
+
* You MUST sanitize any user-controlled data (e.g. product names from the API)
|
|
31
|
+
* using DOMPurify or a similar library before returning.
|
|
32
|
+
*
|
|
33
|
+
* Glov/Gengage accepts no responsibility for XSS vulnerabilities introduced
|
|
34
|
+
* by unsafe renderCard implementations.
|
|
35
|
+
*/
|
|
36
|
+
renderCard?: (product: SimilarProduct, index: number) => string;
|
|
37
|
+
/** Show the first slot as a "special" card (e.g. a promo or bundle). */
|
|
38
|
+
useSpecialCard?: boolean;
|
|
39
|
+
renderSpecialCard?: (product: SimilarProduct) => string | null;
|
|
40
|
+
discountType?: 'strike-through' | 'badge';
|
|
41
|
+
domain?: string;
|
|
42
|
+
/** Locale key for SDK defaults (for example 'tr', 'en'). */
|
|
43
|
+
locale?: string;
|
|
44
|
+
i18n?: Partial<SimRelI18n>;
|
|
45
|
+
renderer?: SimRelRendererConfig;
|
|
46
|
+
}
|
|
47
|
+
export interface SimilarProduct {
|
|
48
|
+
sku: string;
|
|
49
|
+
name: string;
|
|
50
|
+
imageUrl?: string;
|
|
51
|
+
price?: string;
|
|
52
|
+
originalPrice?: string;
|
|
53
|
+
discountPercent?: number;
|
|
54
|
+
url: string;
|
|
55
|
+
brand?: string;
|
|
56
|
+
rating?: number;
|
|
57
|
+
reviewCount?: number;
|
|
58
|
+
cartCode?: string;
|
|
59
|
+
inStock?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface SimRelI18n {
|
|
62
|
+
similarProductsAriaLabel: string;
|
|
63
|
+
emptyStateMessage: string;
|
|
64
|
+
addToCartButton: string;
|
|
65
|
+
priceSuffix: string;
|
|
66
|
+
}
|
|
67
|
+
export interface SimRelUISpecRenderContext {
|
|
68
|
+
onClick: (product: SimilarProduct) => void;
|
|
69
|
+
onAddToCart: (params: {
|
|
70
|
+
sku: string;
|
|
71
|
+
quantity: number;
|
|
72
|
+
cartCode: string;
|
|
73
|
+
}) => void;
|
|
74
|
+
onAction?: (action: ActionPayload) => void;
|
|
75
|
+
discountType?: 'strike-through' | 'badge';
|
|
76
|
+
renderCard?: (product: SimilarProduct, index: number) => string;
|
|
77
|
+
i18n: SimRelI18n;
|
|
78
|
+
}
|
|
79
|
+
export type SimRelRendererConfig = UISpecRendererOverrides<SimRelUISpecRenderContext>;
|
|
80
|
+
export interface SimRelUIComponents {
|
|
81
|
+
/** The outer grid/carousel container. */
|
|
82
|
+
ProductGrid: {
|
|
83
|
+
layout?: 'grid' | 'carousel';
|
|
84
|
+
columns?: number;
|
|
85
|
+
};
|
|
86
|
+
/** A single product card in the grid. */
|
|
87
|
+
ProductCard: {
|
|
88
|
+
product: SimilarProduct;
|
|
89
|
+
index: number;
|
|
90
|
+
discountType?: 'strike-through' | 'badge';
|
|
91
|
+
};
|
|
92
|
+
/** Add-to-cart button inside a card. */
|
|
93
|
+
AddToCartButton: {
|
|
94
|
+
sku: string;
|
|
95
|
+
label?: string;
|
|
96
|
+
/** Cart code / variant identifier. */
|
|
97
|
+
cartCode: string;
|
|
98
|
+
};
|
|
99
|
+
/** A "quick action" row of buttons below the product info. */
|
|
100
|
+
QuickActions: {
|
|
101
|
+
actions: Array<{
|
|
102
|
+
label: string;
|
|
103
|
+
action: ActionPayload;
|
|
104
|
+
}>;
|
|
105
|
+
};
|
|
106
|
+
/** Empty state shown when no similar products are found. */
|
|
107
|
+
EmptyState: {
|
|
108
|
+
message?: string;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/simrel/types.ts"],"names":[],"mappings":"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"}
|
package/dist/simrel.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./types-CeON7iBO.cjs");function v(n){const e=n.headers.get("Content-Type")??"";return e.includes("application/x-ndjson")||e.includes("text/event-stream")}async function w(n,e){const t=[],r={onEvent:i=>{const o=a.adaptV1Event(i);if(!(!o||o.type!=="ui_spec")){for(const s of Object.values(o.spec.elements))if(s.type==="ProductCard"&&s.props){const c=s.props.product??s.props;typeof c.sku=="string"&&typeof c.name=="string"&&t.push(c)}}}};return e!==void 0&&(r.signal=e),await a.consumeStream(n,r),t}async function R(n,e,t){const r=a.buildChatEndpointUrl("similar_products",e),i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)};t!==void 0&&(i.signal=t);const o=await fetch(r,i);if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);if(v(o))return w(o,t);const s=await o.text();return s?a.normalizeSimilarProductsResponse(JSON.parse(s)):[]}async function N(n,e){const t=[];let r=null;const i={onEvent:o=>{const s=a.adaptV1Event(o);if(s){if(s.type==="metadata"&&s.meta){const c=s.meta.group_name;if(typeof c=="string"){r={name:c,products:[]};const l=s.meta.highlight;typeof l=="string"&&(r.highlight=l),t.push(r)}}if(s.type==="ui_spec"&&r){for(const c of Object.values(s.spec.elements))if(c.type==="ProductCard"&&c.props){const l=c.props.product??c.props;typeof l.sku=="string"&&typeof l.name=="string"&&r.products.push(l)}}}}};return e!==void 0&&(i.signal=e),await a.consumeStream(n,i),t}async function I(n,e,t){const r=a.buildChatEndpointUrl("product_groupings",e),i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)};t!==void 0&&(i.signal=t);const o=await fetch(r,i);if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);if(v(o))return N(o,t);const s=await o.text();return s?a.normalizeProductGroupingsResponse(JSON.parse(s)):[]}function E(n){const{product:e,index:t,discountType:r,onClick:i,onAddToCart:o,renderCard:s}=n,c=n.i18n,l=c?.priceSuffix??" TL";if(s){const d=document.createElement("div");return d.className="gengage-simrel-card gengage-simrel-card--custom",d.innerHTML=s(e,t),d.addEventListener("click",f=>{f.target.closest(".gengage-simrel-atc")||i(e)}),d}const u=document.createElement("article");u.className="gengage-simrel-card",u.setAttribute("role","listitem"),u.dataset.sku=e.sku;const p=document.createElement("div");if(p.className="gengage-simrel-card-image",e.imageUrl){const d=document.createElement("img");d.src=e.imageUrl,d.alt=e.name,d.loading="lazy",p.appendChild(d)}if(r==="badge"&&e.discountPercent&&e.discountPercent>0){const d=document.createElement("span");d.className="gengage-simrel-badge",d.textContent=`%${e.discountPercent}`,p.appendChild(d)}u.appendChild(p);const g=document.createElement("div");if(g.className="gengage-simrel-card-info",e.brand){const d=document.createElement("div");d.className="gengage-simrel-card-brand",d.textContent=e.brand,g.appendChild(d)}const m=document.createElement("div");if(m.className="gengage-simrel-card-name",m.textContent=e.name,g.appendChild(m),e.rating!=null&&e.rating>0){const d=document.createElement("div");d.className="gengage-simrel-card-rating";const f="★".repeat(Math.round(e.rating))+"☆".repeat(5-Math.round(e.rating));if(d.textContent=f,e.reviewCount!=null){const y=document.createElement("span");y.className="gengage-simrel-card-review-count",y.textContent=` (${e.reviewCount})`,d.appendChild(y)}g.appendChild(d)}const h=document.createElement("div");if(h.className="gengage-simrel-card-price",e.originalPrice&&e.originalPrice!==e.price&&(r==="strike-through"||!r)){const d=document.createElement("span");d.className="gengage-simrel-card-price-original",d.textContent=e.originalPrice+l,h.appendChild(d)}if(e.price){const d=document.createElement("span");d.className="gengage-simrel-card-price-current",d.textContent=e.price+l,h.appendChild(d)}if(g.appendChild(h),u.appendChild(g),e.cartCode){const d=document.createElement("button");d.className="gengage-simrel-atc",d.type="button",d.textContent=c?.addToCartButton??"Sepete Ekle",d.addEventListener("click",f=>{f.stopPropagation(),o({sku:e.sku,quantity:1,cartCode:e.cartCode})}),u.appendChild(d)}return u.addEventListener("click",d=>{d.target.closest(".gengage-simrel-atc")||i(e)}),u}function b(n){const e=document.createElement("div");e.className="gengage-simrel-grid",e.setAttribute("role","list"),e.setAttribute("aria-label",n.i18n?.similarProductsAriaLabel??"Similar products"),n.columns&&e.style.setProperty("--gengage-simrel-columns",String(n.columns));for(let t=0;t<n.products.length;t++){const i={product:n.products[t],index:t,onClick:n.onClick,onAddToCart:n.onAddToCart};n.i18n!==void 0&&(i.i18n=n.i18n),n.discountType!==void 0&&(i.discountType=n.discountType),n.renderCard!==void 0&&(i.renderCard=n.renderCard);const o=E(i);e.appendChild(o)}if(n.products.length===0){const t=document.createElement("div");t.className="gengage-simrel-empty",t.textContent=n.i18n?.emptyStateMessage??"Benzer ürün bulunamadı.",e.appendChild(t)}return e}function U(n){const e=document.createElement("div");if(e.className="gengage-simrel-groups",n.groups.length===0){const c=document.createElement("div");return c.className="gengage-simrel-empty",c.textContent=n.i18n?.emptyStateMessage??"Benzer ürün bulunamadı.",e.appendChild(c),e}const t=document.createElement("div");t.className="gengage-simrel-tabs",t.setAttribute("role","tablist");const r=document.createElement("div");r.className="gengage-simrel-tab-content";for(let c=0;c<n.groups.length;c++){const l=n.groups[c],u=document.createElement("button");u.className="gengage-simrel-tab",u.type="button",u.textContent=l.name,u.setAttribute("role","tab"),u.setAttribute("aria-selected",c===0?"true":"false"),c===0&&u.classList.add("gengage-simrel-tab--active"),u.addEventListener("click",()=>{const p=t.querySelector(".gengage-simrel-tab--active");p?.classList.remove("gengage-simrel-tab--active"),p?.setAttribute("aria-selected","false"),u.classList.add("gengage-simrel-tab--active"),u.setAttribute("aria-selected","true"),r.innerHTML="";const g={products:l.products,onClick:n.onClick,onAddToCart:n.onAddToCart};n.i18n!==void 0&&(g.i18n=n.i18n),n.discountType!==void 0&&(g.discountType=n.discountType),n.renderCard!==void 0&&(g.renderCard=n.renderCard);const m=b(g);r.appendChild(m)}),t.appendChild(u)}e.appendChild(t);const o={products:n.groups[0].products,onClick:n.onClick,onAddToCart:n.onAddToCart};n.i18n!==void 0&&(o.i18n=n.i18n),n.discountType!==void 0&&(o.discountType=n.discountType),n.renderCard!==void 0&&(o.renderCard=n.renderCard);const s=b(o);return r.appendChild(s),e.appendChild(r),e}function T(n){if(!n||typeof n!="object")return null;const e=n;if(typeof e.sku!="string"||typeof e.name!="string"||typeof e.url!="string")return null;const t={sku:e.sku,name:e.name,url:e.url},r=e.imageUrl;typeof r=="string"&&(t.imageUrl=r);const i=e.price;typeof i=="string"&&(t.price=i);const o=e.originalPrice;typeof o=="string"&&(t.originalPrice=o);const s=e.discountPercent;typeof s=="number"&&(t.discountPercent=s);const c=e.brand;typeof c=="string"&&(t.brand=c);const l=e.rating;typeof l=="number"&&(t.rating=l);const u=e.reviewCount;typeof u=="number"&&(t.reviewCount=u);const p=e.cartCode;typeof p=="string"&&(t.cartCode=p);const g=e.inStock;return typeof g=="boolean"&&(t.inStock=g),t}function x(n){if(!n||typeof n!="object")return null;const e=n,t=e.title,r=e.type;if(typeof t!="string"||typeof r!="string")return null;const i={title:t,type:r};return e.payload!==void 0&&(i.payload=e.payload),i}const _={ProductGrid:({element:n,renderElement:e})=>{const t=document.createElement("div");t.className="gengage-simrel-grid",t.setAttribute("role","list");const r=n.props?.columns;typeof r=="number"&&Number.isFinite(r)&&r>0&&t.style.setProperty("--gengage-simrel-columns",String(r));for(const i of n.children??[]){const o=e(i);o&&t.appendChild(o)}if(t.children.length===0){const i=document.createElement("div");i.className="gengage-simrel-empty",i.textContent="Benzer ürün bulunamadı.",t.appendChild(i)}return t},ProductCard:({element:n,context:e})=>{const t=n.props?.product??n.props,r=T(t);if(!r)return null;const i=n.props?.index,o=typeof i=="number"&&Number.isFinite(i)?i:0,s=n.props?.discountType,c=s==="strike-through"||s==="badge"?s:e.discountType,l={product:r,index:o,onClick:e.onClick,onAddToCart:e.onAddToCart,i18n:e.i18n};return c!==void 0&&(l.discountType=c),e.renderCard!==void 0&&(l.renderCard=e.renderCard),E(l)},GroupTabs:({element:n,context:e})=>{const t=n.props?.groups;if(!Array.isArray(t))return null;const r=[];for(const o of t){if(!o||typeof o!="object")continue;const s=o;if(typeof s.name!="string")continue;const c=[];if(Array.isArray(s.products))for(const u of s.products){const p=T(u);p&&c.push(p)}const l={name:s.name,products:c};typeof s.highlight=="string"&&(l.highlight=s.highlight),r.push(l)}const i={groups:r,onClick:e.onClick,onAddToCart:e.onAddToCart,i18n:e.i18n};return e.discountType!==void 0&&(i.discountType=e.discountType),e.renderCard!==void 0&&(i.renderCard=e.renderCard),U(i)},EmptyState:({element:n,context:e})=>{const t=document.createElement("div");t.className="gengage-simrel-empty";const r=n.props?.message;return t.textContent=typeof r=="string"?r:e.i18n.emptyStateMessage,t},AddToCartButton:({element:n,context:e})=>{const t=n.props?.sku,r=n.props?.cartCode;if(typeof t!="string"||typeof r!="string")return null;const i=document.createElement("button");i.className="gengage-simrel-atc",i.type="button";const o=n.props?.label;return i.textContent=typeof o=="string"?o:e.i18n.addToCartButton,i.addEventListener("click",s=>{s.preventDefault(),s.stopPropagation(),e.onAddToCart({sku:t,quantity:1,cartCode:r})}),i},QuickActions:({element:n,context:e})=>{const t=document.createElement("div");t.className="gengage-simrel-quick-actions";const r=n.props?.actions;if(!Array.isArray(r)||!e.onAction)return t;for(const i of r){if(!i||typeof i!="object")continue;const o=i,s=o.label,c=x(o.action);if(typeof s!="string"||!c)continue;const l=document.createElement("button");l.className="gengage-simrel-quick-action",l.type="button",l.textContent=s,l.addEventListener("click",u=>{u.preventDefault(),u.stopPropagation(),e.onAction?.(c)}),t.appendChild(l)}return t}},C=({element:n,renderElement:e})=>{if(!n.children||n.children.length===0)return null;const t=document.createElement("div");for(const r of n.children){const i=e(r);i&&t.appendChild(i)}return t};function S(){return{..._}}function k(n,e,t=_,r=C){return a.renderUISpecWithRegistry({spec:n,context:e,registry:t,containerClassName:"gengage-simrel-uispec",unknownRenderer:r})}const P={similarProductsAriaLabel:"Benzer ürünler",emptyStateMessage:"Benzer ürün bulunamadı.",addToCartButton:"Sepete Ekle",priceSuffix:" TL"},L={similarProductsAriaLabel:"Similar products",emptyStateMessage:"No similar products found.",addToCartButton:"Add to cart",priceSuffix:""};function G(n){return n?n.toLowerCase().split("-")[0]??"tr":"tr"}function j(n){return G(n)==="en"?L:P}const M=a.objectType({sku:a.stringType(),name:a.stringType(),imageUrl:a.stringType().url().optional(),price:a.stringType().optional(),originalPrice:a.stringType().optional(),discountPercent:a.numberType().optional(),url:a.stringType().url(),brand:a.stringType().optional(),rating:a.numberType().min(0).max(5).optional(),reviewCount:a.numberType().int().nonnegative().optional()}),O=a.objectType({layout:a.enumType(["grid","carousel"]).optional(),columns:a.numberType().int().positive().optional()}),B=a.objectType({product:M,index:a.numberType().int().nonnegative(),discountType:a.enumType(["strike-through","badge"]).optional()}),q=a.objectType({sku:a.stringType(),label:a.stringType().optional(),cartCode:a.stringType()}),D=a.objectType({actions:a.arrayType(a.objectType({label:a.stringType(),action:a.objectType({title:a.stringType(),type:a.stringType(),payload:a.unknownType().optional()})}))}),z=a.objectType({message:a.stringType().optional()}),H={components:{ProductGrid:{schema:O,description:"Outer grid or carousel container for similar products."},ProductCard:{schema:B,description:"A single product card with image, title, price, and actions."},AddToCartButton:{schema:q,description:"Add-to-cart CTA rendered inside or below a product card."},QuickActions:{schema:D,description:"A row of quick-action buttons below product info."},EmptyState:{schema:z,description:"Empty state shown when no similar products are available."}}};class A extends a.BaseWidget{constructor(){super(...arguments),this._abortController=null,this._contentEl=null,this._i18n=P}async onInit(e){this._i18n=this._resolveI18n(e),this._contentEl=document.createElement("div"),this._contentEl.className="gengage-simrel-container",this.root.appendChild(this._contentEl),this._lastSku=e.sku,await this._fetchAndRender(e.sku),this.isVisible=!0}onUpdate(e){const t=e.sku;!t||t===this._lastSku||(this._lastSku=t,this._fetchAndRender(t))}onShow(){this._contentEl&&(this._contentEl.style.opacity="0",this._contentEl.style.transition="opacity 0.3s ease-in",requestAnimationFrame(()=>{this._contentEl&&(this._contentEl.style.opacity="1")}))}onHide(){}onDestroy(){this._abort(),this._contentEl&&(this._contentEl.remove(),this._contentEl=null)}_handleProductClick(e){const t={sku:e.sku,name:e.name,url:e.url};if(e.imageUrl!==void 0&&(t.imageUrl=e.imageUrl),e.price!==void 0&&(t.price=e.price),e.originalPrice!==void 0&&(t.originalPrice=e.originalPrice),e.discountPercent!==void 0&&(t.discountPercent=e.discountPercent),e.brand!==void 0&&(t.brand=e.brand),e.rating!==void 0&&(t.rating=e.rating),e.reviewCount!==void 0&&(t.reviewCount=e.reviewCount),e.cartCode!==void 0&&(t.cartCode=e.cartCode),e.inStock!==void 0&&(t.inStock=e.inStock),this.config.onProductClick?.(t)===!1)return;const r=this.config.session?.sessionId??null;a.dispatch("gengage:similar:product-click",{sku:e.sku,url:e.url,sessionId:r}),this.config.onProductNavigate?.(e.url,e.sku,r)}_handleAddToCart(e){this.config.onAddToCart?.(e),a.dispatch("gengage:similar:add-to-cart",e),this.track(a.basketAddEvent(this.analyticsContext(),{attribution_source:"simrel",attribution_action_id:crypto.randomUUID(),cart_value:0,currency:"TRY",line_items:e.quantity,sku:e.sku}))}_abort(){this._abortController?.abort(),this._abortController=null}async _fetchAndRender(e){if(this._abort(),this._abortController=new AbortController,!this._contentEl)return;this._contentEl.innerHTML="";const t=document.createElement("div");t.className="gengage-simrel-loading";const r=document.createElement("div");r.className="gengage-simrel-spinner",t.appendChild(r),this._contentEl.appendChild(t);const i={middlewareUrl:this.config.middlewareUrl},o=crypto.randomUUID(),s=Date.now();this.track(a.streamStartEvent(this.analyticsContext(),{endpoint:"similar_products",request_id:o,widget:"simrel"}));try{const c={account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??"",sku:e};this.config.domain!==void 0&&(c.domain=this.config.domain);const l=await R(c,i,this._abortController.signal);if(!this._contentEl)return;if(this._contentEl.innerHTML="",l.length>0)try{const u=l.map(g=>g.sku),p=await I({account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??"",skus:u},i,this._abortController.signal);if(p.length>0&&this._contentEl){const g=this._buildGroupsSpec(p),m=this._renderUISpec(g);this._contentEl.appendChild(m);return}}catch{}if(this._contentEl){const u=this._buildProductsSpec(l),p=this._renderUISpec(u);this._contentEl.appendChild(p)}this.track(a.streamDoneEvent(this.analyticsContext(),{request_id:o,latency_ms:Date.now()-s,chunk_count:l.length,widget:"simrel"})),this.track(a.widgetHistorySnapshotEvent(this.analyticsContext(),{message_count:l.length,history_ref:o,redaction_level:"none",widget:"simrel"}))}catch(c){if(c instanceof DOMException&&c.name==="AbortError")return;a.dispatch("gengage:global:error",{source:"simrel",code:"FETCH_ERROR",message:a.getGlobalErrorMessage(this.config.locale)}),this.track(a.streamErrorEvent(this.analyticsContext(),{request_id:o,error_code:"FETCH_ERROR",error_message:c instanceof Error?c.message:String(c),widget:"simrel"})),this._contentEl&&(this._contentEl.innerHTML="",this._contentEl.style.display="none")}}_resolveI18n(e){return{...j(e.locale),...e.i18n}}_resolveUISpecRegistry(){const e=S();return a.mergeUISpecRegistry(e,this.config.renderer?.registry)}_buildRenderContext(){const e=this.config.renderCard,t={onClick:r=>this._handleProductClick(r),onAddToCart:r=>this._handleAddToCart(r),i18n:this._i18n};return this.config.discountType!==void 0&&(t.discountType=this.config.discountType),e!==void 0&&(t.renderCard=e),t}_renderUISpec(e){const t=this._resolveUISpecRegistry(),r=this._buildRenderContext(),i=this.config.renderer?.unknownRenderer??C,o=(l,u)=>k(l,u,t,i),s=this.config.renderer?.renderUISpec;return s?s(e,r,{registry:t,unknownRenderer:i,defaultRender:o}):o(e,r)}_buildProductsSpec(e){const t={},r=[];for(let i=0;i<e.length;i++){const o=e[i],s=`product-${i}`;r.push(s),t[s]={type:"ProductCard",props:{product:o,index:i,discountType:this.config.discountType}}}return t.root={type:"ProductGrid",props:{layout:"grid"},children:r},{root:"root",elements:t}}_buildGroupsSpec(e){return{root:"root",elements:{root:{type:"GroupTabs",props:{groups:e}}}}}}function F(){return new A}exports.GengageSimRel=A;exports.createDefaultSimRelUISpecRegistry=S;exports.createSimRelWidget=F;exports.defaultSimRelUnknownUISpecRenderer=C;exports.renderSimRelUISpec=k;exports.simRelCatalog=H;
|
|
2
|
+
//# sourceMappingURL=simrel.cjs.map
|