@athoscommerce/snap-preact 1.13.3-beta.168 → 1.13.3-beta.191

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 (126) hide show
  1. package/dist/cjs/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +3 -1
  2. package/dist/cjs/components/src/components/Molecules/ChatMessageText/ChatMessageText.js +2 -1
  3. package/dist/cjs/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.js +4 -0
  4. package/dist/cjs/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.js +1 -0
  5. package/dist/cjs/components/src/components/Molecules/ChatQuickview/ChatQuickview.js +514 -0
  6. package/dist/cjs/components/src/components/Molecules/{ChatProductQueryMessage → ChatQuickview}/index.js +1 -1
  7. package/dist/cjs/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.js +2 -2
  8. package/dist/cjs/components/src/components/Molecules/Slideshow/Slideshow.js +47 -20
  9. package/dist/cjs/components/src/components/Organisms/Chat/Chat.js +12 -5
  10. package/dist/cjs/components/src/components/Organisms/Chat/Chat.lang.js +5 -0
  11. package/dist/cjs/components/src/components/Organisms/Chat/components/ChatAttachments.js +5 -4
  12. package/dist/cjs/components/src/components/Organisms/Chat/components/ChatComposer.js +3 -3
  13. package/dist/cjs/components/src/components/Organisms/Chat/components/ChatSideChat.js +3 -3
  14. package/dist/cjs/components/src/components/Organisms/Chat/components/chatAccentTheme.js +22 -20
  15. package/dist/cjs/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.js +44 -11
  16. package/dist/cjs/components/src/index.js +1 -1
  17. package/dist/cjs/components/src/providers/themeComponents.js +1 -1
  18. package/dist/cjs/src/Snap.js +13 -1
  19. package/dist/cjs/src/Templates/Stores/LibraryStore.js +2 -2
  20. package/dist/cjs/src/Templates/Stores/library/languages/ar.js +45 -34
  21. package/dist/cjs/src/Templates/Stores/library/languages/de.js +45 -34
  22. package/dist/cjs/src/Templates/Stores/library/languages/es.js +45 -34
  23. package/dist/cjs/src/Templates/Stores/library/languages/fr.js +45 -34
  24. package/dist/cjs/src/Templates/Stores/library/languages/hi.js +45 -34
  25. package/dist/cjs/src/Templates/Stores/library/languages/it.js +45 -34
  26. package/dist/cjs/src/Templates/Stores/library/languages/ja.js +45 -34
  27. package/dist/cjs/src/Templates/Stores/library/languages/ko.js +45 -34
  28. package/dist/cjs/src/Templates/Stores/library/languages/nl.js +45 -34
  29. package/dist/cjs/src/Templates/Stores/library/languages/pt.js +45 -34
  30. package/dist/cjs/src/Templates/Stores/library/languages/ru.js +45 -34
  31. package/dist/cjs/src/Templates/Stores/library/languages/tr.js +45 -34
  32. package/dist/cjs/src/Templates/Stores/library/languages/vi.js +45 -34
  33. package/dist/cjs/src/Templates/Stores/library/languages/zh.js +45 -34
  34. package/dist/cjs/src/create/createChatController.js +1 -0
  35. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts +1 -1
  36. package/dist/esm/components/src/components/Atoms/Button/Button.d.ts.map +1 -1
  37. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts +12 -5
  38. package/dist/esm/components/src/components/Molecules/ChatAttachmentContext/ChatAttachmentContext.d.ts.map +1 -1
  39. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts +13 -2
  40. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.d.ts.map +1 -1
  41. package/dist/esm/components/src/components/Molecules/ChatInspirationResultMessage/ChatInspirationResultMessage.js +3 -1
  42. package/dist/esm/components/src/components/Molecules/ChatMessageText/ChatMessageText.d.ts.map +1 -1
  43. package/dist/esm/components/src/components/Molecules/ChatMessageText/ChatMessageText.js +2 -1
  44. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts +17 -3
  45. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.d.ts.map +1 -1
  46. package/dist/esm/components/src/components/Molecules/ChatMessageUser/ChatMessageUser.js +4 -0
  47. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts +7 -1
  48. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.d.ts.map +1 -1
  49. package/dist/esm/components/src/components/Molecules/ChatProductComparisonMessage/ChatProductComparisonMessage.js +1 -0
  50. package/dist/esm/components/src/components/Molecules/ChatQuickview/ChatQuickview.d.ts +30 -0
  51. package/dist/esm/components/src/components/Molecules/ChatQuickview/ChatQuickview.d.ts.map +1 -0
  52. package/dist/esm/components/src/components/Molecules/ChatQuickview/ChatQuickview.js +508 -0
  53. package/dist/esm/components/src/components/Molecules/ChatQuickview/index.d.ts +2 -0
  54. package/dist/esm/components/src/components/Molecules/ChatQuickview/index.d.ts.map +1 -0
  55. package/dist/esm/components/src/components/Molecules/ChatQuickview/index.js +1 -0
  56. package/dist/esm/components/src/components/Molecules/ChatResultsDisplay/ChatResultsDisplay.js +2 -2
  57. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.d.ts.map +1 -1
  58. package/dist/esm/components/src/components/Molecules/Slideshow/Slideshow.js +47 -20
  59. package/dist/esm/components/src/components/Organisms/Chat/Chat.d.ts.map +1 -1
  60. package/dist/esm/components/src/components/Organisms/Chat/Chat.js +12 -5
  61. package/dist/esm/components/src/components/Organisms/Chat/Chat.lang.d.ts +3 -0
  62. package/dist/esm/components/src/components/Organisms/Chat/Chat.lang.d.ts.map +1 -1
  63. package/dist/esm/components/src/components/Organisms/Chat/Chat.lang.js +5 -0
  64. package/dist/esm/components/src/components/Organisms/Chat/components/ChatAttachments.d.ts.map +1 -1
  65. package/dist/esm/components/src/components/Organisms/Chat/components/ChatAttachments.js +5 -4
  66. package/dist/esm/components/src/components/Organisms/Chat/components/ChatComposer.d.ts.map +1 -1
  67. package/dist/esm/components/src/components/Organisms/Chat/components/ChatComposer.js +3 -3
  68. package/dist/esm/components/src/components/Organisms/Chat/components/ChatSideChat.d.ts.map +1 -1
  69. package/dist/esm/components/src/components/Organisms/Chat/components/ChatSideChat.js +3 -3
  70. package/dist/esm/components/src/components/Organisms/Chat/components/chatAccentTheme.d.ts +1 -1
  71. package/dist/esm/components/src/components/Organisms/Chat/components/chatAccentTheme.d.ts.map +1 -1
  72. package/dist/esm/components/src/components/Organisms/Chat/components/chatAccentTheme.js +22 -20
  73. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.d.ts +5 -1
  74. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.d.ts.map +1 -1
  75. package/dist/esm/components/src/components/Organisms/QuickviewLayout/QuickviewLayout.js +44 -11
  76. package/dist/esm/components/src/index.d.ts +1 -1
  77. package/dist/esm/components/src/index.d.ts.map +1 -1
  78. package/dist/esm/components/src/index.js +1 -1
  79. package/dist/esm/components/src/providers/langComponents.d.ts +2 -2
  80. package/dist/esm/components/src/providers/langComponents.d.ts.map +1 -1
  81. package/dist/esm/components/src/providers/themeComponents.d.ts +7 -7
  82. package/dist/esm/components/src/providers/themeComponents.d.ts.map +1 -1
  83. package/dist/esm/components/src/providers/themeComponents.js +1 -1
  84. package/dist/esm/src/Snap.d.ts +1 -0
  85. package/dist/esm/src/Snap.d.ts.map +1 -1
  86. package/dist/esm/src/Snap.js +13 -1
  87. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts +2 -2
  88. package/dist/esm/src/Templates/Stores/LibraryStore.d.ts.map +1 -1
  89. package/dist/esm/src/Templates/Stores/LibraryStore.js +2 -2
  90. package/dist/esm/src/Templates/Stores/library/languages/ar.d.ts.map +1 -1
  91. package/dist/esm/src/Templates/Stores/library/languages/ar.js +45 -34
  92. package/dist/esm/src/Templates/Stores/library/languages/de.d.ts.map +1 -1
  93. package/dist/esm/src/Templates/Stores/library/languages/de.js +45 -34
  94. package/dist/esm/src/Templates/Stores/library/languages/es.d.ts.map +1 -1
  95. package/dist/esm/src/Templates/Stores/library/languages/es.js +45 -34
  96. package/dist/esm/src/Templates/Stores/library/languages/fr.d.ts.map +1 -1
  97. package/dist/esm/src/Templates/Stores/library/languages/fr.js +45 -34
  98. package/dist/esm/src/Templates/Stores/library/languages/hi.d.ts.map +1 -1
  99. package/dist/esm/src/Templates/Stores/library/languages/hi.js +45 -34
  100. package/dist/esm/src/Templates/Stores/library/languages/it.d.ts.map +1 -1
  101. package/dist/esm/src/Templates/Stores/library/languages/it.js +45 -34
  102. package/dist/esm/src/Templates/Stores/library/languages/ja.d.ts.map +1 -1
  103. package/dist/esm/src/Templates/Stores/library/languages/ja.js +45 -34
  104. package/dist/esm/src/Templates/Stores/library/languages/ko.d.ts.map +1 -1
  105. package/dist/esm/src/Templates/Stores/library/languages/ko.js +45 -34
  106. package/dist/esm/src/Templates/Stores/library/languages/nl.d.ts.map +1 -1
  107. package/dist/esm/src/Templates/Stores/library/languages/nl.js +45 -34
  108. package/dist/esm/src/Templates/Stores/library/languages/pt.d.ts.map +1 -1
  109. package/dist/esm/src/Templates/Stores/library/languages/pt.js +45 -34
  110. package/dist/esm/src/Templates/Stores/library/languages/ru.d.ts.map +1 -1
  111. package/dist/esm/src/Templates/Stores/library/languages/ru.js +45 -34
  112. package/dist/esm/src/Templates/Stores/library/languages/tr.d.ts.map +1 -1
  113. package/dist/esm/src/Templates/Stores/library/languages/tr.js +45 -34
  114. package/dist/esm/src/Templates/Stores/library/languages/vi.d.ts.map +1 -1
  115. package/dist/esm/src/Templates/Stores/library/languages/vi.js +45 -34
  116. package/dist/esm/src/Templates/Stores/library/languages/zh.d.ts.map +1 -1
  117. package/dist/esm/src/Templates/Stores/library/languages/zh.js +45 -34
  118. package/dist/esm/src/create/createChatController.js +1 -0
  119. package/package.json +12 -12
  120. package/dist/cjs/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +0 -577
  121. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts +0 -38
  122. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.d.ts.map +0 -1
  123. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.js +0 -571
  124. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts +0 -2
  125. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.d.ts.map +0 -1
  126. package/dist/esm/components/src/components/Molecules/ChatProductQueryMessage/index.js +0 -1
@@ -1,577 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChatProductQueryMessage = void 0;
7
- const react_1 = require("@emotion/react");
8
- const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
9
- const hooks_1 = require("preact/hooks");
10
- const mobx_react_lite_1 = require("mobx-react-lite");
11
- const react_2 = require("@emotion/react");
12
- const classnames_1 = __importDefault(require("classnames"));
13
- const deepmerge_1 = __importDefault(require("deepmerge"));
14
- const providers_1 = require("../../../providers");
15
- const utilities_1 = require("../../../utilities");
16
- const hooks_2 = require("../../../hooks");
17
- const Image_1 = require("../../Atoms/Image");
18
- const Button_1 = require("../../Atoms/Button");
19
- const Price_1 = require("../../Atoms/Price");
20
- const defaultStyles = ({ primaryColor, primaryColorText, theme }) => {
21
- const colorPrimary = primaryColor || utilities_1.Colour.concrete(theme?.variables?.colors?.primary) || '#253B80';
22
- const colorPrimaryText = primaryColorText || '#fff';
23
- const colorAccent = utilities_1.Colour.concrete(theme?.variables?.colors?.accent) || '#D4A843';
24
- const colorCta = utilities_1.Colour.concrete(theme?.variables?.colors?.accent) || '#feeeae';
25
- // neutral colors — no theme variable equivalents
26
- const colorText = '#374151';
27
- const colorBorder = '#E5E7EB';
28
- return (0, react_2.css)({
29
- display: 'flex',
30
- flexDirection: 'column',
31
- gap: '1em',
32
- paddingBottom: '1em',
33
- '.ss__chat-product-query-message__header__back.ss__button': {
34
- // Overlay banner pinned to the top of the secondary chat's scrollable messages
35
- // container so it stays visible while the product details scroll underneath.
36
- // Styling mirrors `.ss__chat__session-feedback` (dark primary bg, primary text,
37
- // 8px/15px padding, 10px gap, 14px font). Rendered as a direct child of the
38
- // component root (not the header) so sticky holds across the full scroll range.
39
- // Negative marginBottom cancels the root's `gap: 1em` so the banner sits flush
40
- // against the header below it.
41
- position: 'sticky',
42
- top: 0,
43
- zIndex: 2,
44
- marginBottom: '-1em',
45
- display: 'flex',
46
- flexDirection: 'row-reverse',
47
- justifyContent: 'flex-end',
48
- alignItems: 'center',
49
- gap: '10px',
50
- padding: '8px 15px',
51
- background: colorPrimary,
52
- color: colorPrimaryText,
53
- fontSize: '14px',
54
- cursor: 'pointer',
55
- border: 'none',
56
- font: 'inherit',
57
- width: 'auto',
58
- '.ss__button__content': {
59
- width: 'auto',
60
- },
61
- // pin the background so the Chat organism's generic `.ss__button:hover`
62
- // lightening rule (higher specificity) doesn't recolor the banner
63
- '&:not(.ss__button--disabled):hover': {
64
- background: colorPrimary,
65
- },
66
- '&:focus-visible': {
67
- outline: `2px solid ${colorPrimaryText}`,
68
- outlineOffset: '-2px',
69
- },
70
- svg: {
71
- fill: colorPrimaryText,
72
- stroke: colorPrimaryText,
73
- },
74
- },
75
- '.ss__chat-product-query-message__header': {
76
- background: colorPrimary,
77
- padding: '1em',
78
- display: 'flex',
79
- flexDirection: 'column',
80
- '.ss__price': {
81
- color: colorPrimaryText,
82
- },
83
- '.ss__chat-product-query-message__header__product': {
84
- display: 'flex',
85
- gap: '1em',
86
- '.ss__chat-product-query-message__header__product__image': {
87
- width: '25%',
88
- objectFit: 'contain',
89
- flexShrink: 0,
90
- borderRadius: '0.33em',
91
- overflow: 'hidden',
92
- },
93
- '.ss__chat-product-query-message__header__product__details': {
94
- display: 'flex',
95
- flexDirection: 'column',
96
- gap: '0.5em',
97
- flex: 1,
98
- justifyContent: 'space-evenly',
99
- '.ss__chat-product-query-message__header__product__details__name': {
100
- fontWeight: 'bold',
101
- fontSize: '1.2em',
102
- a: {
103
- color: colorPrimaryText,
104
- textDecoration: 'none',
105
- '&:hover': {
106
- textDecoration: 'underline',
107
- },
108
- },
109
- },
110
- '.ss__chat-product-query-message__header__product__details__price': {
111
- fontWeight: 'bold',
112
- fontSize: '1.1em',
113
- color: colorAccent,
114
- display: 'flex',
115
- gap: '0.5em',
116
- alignItems: 'center',
117
- },
118
- },
119
- '.ss__chat-product-query-message__header__product__actions': {
120
- display: 'flex',
121
- flexDirection: 'row',
122
- gap: '0.5em',
123
- '.ss__chat-product-query-message__header__product__actions__add-to-cart .ss__button': {
124
- flexDirection: 'row-reverse',
125
- borderRadius: '0.5em',
126
- padding: '0.4em 0.75em',
127
- fontWeight: 'bold',
128
- border: 'none',
129
- whiteSpace: 'nowrap',
130
- cursor: 'pointer',
131
- fontSize: '0.8em',
132
- background: colorCta,
133
- color: '#000',
134
- justifyContent: 'center',
135
- width: '100%',
136
- textAlign: 'center',
137
- svg: {
138
- fill: '#000',
139
- stroke: '#000',
140
- },
141
- '&:not(.ss__button--disabled):hover': {
142
- filter: 'brightness(0.97)',
143
- },
144
- },
145
- '.ss__chat-product-query-message__header__product__actions__show-similar .ss__button, .ss__chat-product-query-message__header__product__actions__discuss-product .ss__button': {
146
- flexDirection: 'row-reverse',
147
- borderRadius: '0.5em',
148
- padding: '0.4em 0.75em',
149
- fontWeight: 'bold',
150
- whiteSpace: 'nowrap',
151
- cursor: 'pointer',
152
- fontSize: '0.8em',
153
- background: '#000',
154
- color: '#fff',
155
- justifyContent: 'center',
156
- width: '100%',
157
- textAlign: 'center',
158
- svg: {
159
- fill: '#fff',
160
- stroke: '#fff',
161
- },
162
- },
163
- },
164
- },
165
- },
166
- '.ss__chat-product-query-message__variants': {
167
- padding: '0 2em',
168
- display: 'flex',
169
- flexDirection: 'column',
170
- gap: '1em',
171
- '.ss__chat-product-query-message__variants__label': {
172
- fontWeight: '600',
173
- fontSize: '0.9em',
174
- color: colorText,
175
- textTransform: 'uppercase',
176
- marginBottom: '0.5em',
177
- },
178
- '.ss__chat-product-query-message__variants__swatches': {
179
- display: 'flex',
180
- flexWrap: 'wrap',
181
- gap: '0.5em',
182
- '.ss__chat-product-query-message__variants__swatch.ss__button': {
183
- display: 'flex',
184
- flex: '1 1 auto',
185
- cursor: 'pointer',
186
- padding: '0.25em',
187
- borderRadius: '0.5em',
188
- border: '2px solid transparent',
189
- transition: 'border-color 0.15s ease',
190
- background: 'transparent',
191
- font: 'inherit',
192
- color: 'inherit',
193
- '.ss__button__content': {
194
- display: 'flex',
195
- flexDirection: 'column',
196
- alignItems: 'center',
197
- gap: '0.25em',
198
- },
199
- '&:not(.ss__button--disabled):hover': {
200
- borderColor: colorPrimary,
201
- },
202
- '&:focus-visible': {
203
- outline: `2px solid ${colorPrimary}`,
204
- outlineOffset: '2px',
205
- },
206
- '&[aria-disabled="true"]': {
207
- cursor: 'not-allowed',
208
- },
209
- '&.ss__chat-product-query-message__variants__swatch--selected': {
210
- borderColor: colorPrimary,
211
- borderWidth: '3px',
212
- padding: '0.15em',
213
- },
214
- '&.ss__chat-product-query-message__variants__swatch--unavailable': {
215
- opacity: 0.4,
216
- },
217
- '&.ss__chat-product-query-message__variants__swatch--text-only': {
218
- padding: '0.4em 0.75em',
219
- '&.ss__chat-product-query-message__variants__swatch--selected': {
220
- padding: '0.3em 0.65em',
221
- },
222
- '.ss__chat-product-query-message__variants__swatch__value': {
223
- fontSize: '1em',
224
- maxWidth: 'none',
225
- },
226
- },
227
- '.ss__chat-product-query-message__variants__swatch__image': {
228
- width: '48px',
229
- height: '48px',
230
- objectFit: 'cover',
231
- borderRadius: '50%',
232
- border: `1px solid ${colorBorder}`,
233
- },
234
- '.ss__chat-product-query-message__variants__swatch__value': {
235
- fontSize: '0.75em',
236
- color: colorText,
237
- textAlign: 'center',
238
- maxWidth: '60px',
239
- overflow: 'hidden',
240
- textOverflow: 'ellipsis',
241
- whiteSpace: 'nowrap',
242
- },
243
- },
244
- },
245
- },
246
- '.ss__chat-product-query-message__section': {
247
- padding: '0 1em',
248
- '.ss__chat-product-query-message__section__table': {
249
- width: '100%',
250
- maxWidth: '100%',
251
- tableLayout: 'fixed',
252
- borderCollapse: 'separate',
253
- borderSpacing: 0,
254
- fontSize: '0.9em',
255
- 'tbody tr': {
256
- transition: 'background-color 0.15s ease',
257
- },
258
- 'tbody tr:hover': {
259
- background: '#F3F4F6',
260
- },
261
- 'th, td': {
262
- padding: '0.75em 1em',
263
- verticalAlign: 'top',
264
- wordBreak: 'break-word',
265
- overflowWrap: 'anywhere',
266
- textAlign: 'left',
267
- borderBottom: `1px solid ${colorBorder}`,
268
- },
269
- 'tbody tr:last-of-type th, tbody tr:last-of-type td': {
270
- borderBottom: 'none',
271
- },
272
- 'th[scope="row"]': {
273
- fontWeight: '600',
274
- color: '#6B7280',
275
- textTransform: 'uppercase',
276
- fontSize: '0.8em',
277
- letterSpacing: '0.03em',
278
- width: '40%',
279
- },
280
- 'td:last-of-type': {
281
- textAlign: 'right',
282
- color: '#111827',
283
- fontWeight: '500',
284
- },
285
- '.ss__chat-product-query-message__section__table__availability--in-stock': {
286
- color: '#10B981',
287
- fontWeight: '600',
288
- },
289
- '.ss__chat-product-query-message__section__table__availability--out-of-stock': {
290
- color: '#DC2626',
291
- fontWeight: '600',
292
- },
293
- '.ss__chat-product-query-message__section__table__price': {
294
- display: 'flex',
295
- gap: '0.5em',
296
- alignItems: 'center',
297
- justifyContent: 'flex-end',
298
- },
299
- },
300
- },
301
- '.ss__chat-product-query-message__description': {
302
- padding: '0 1em',
303
- fontSize: '0.9em',
304
- color: colorText,
305
- lineHeight: '1.5',
306
- },
307
- });
308
- };
309
- // fields that have dedicated rendering in the product card; skip them in the info table
310
- const CARD_FIELDS = new Set([
311
- 'name',
312
- 'brand',
313
- 'price',
314
- 'msrp',
315
- 'imageUrl',
316
- 'thumbnailImageUrl',
317
- 'secureImageUrl',
318
- 'secureThumbnailImageUrl',
319
- 'url',
320
- 'addToCartUrl',
321
- 'uid',
322
- 'sku',
323
- 'parentId',
324
- 'parentImageUrl',
325
- 'description',
326
- 'caption',
327
- 'popularity',
328
- 'stockMessage',
329
- ]);
330
- // preferred ordering for the structured info table - any extras get appended after
331
- const PREFERRED_INFO_ORDER = ['material', 'fit', 'color', 'sizes', 'size', 'category', 'rating', 'availability'];
332
- const formatLabel = (key) => {
333
- return key
334
- .replace(/[_-]+/g, ' ')
335
- .replace(/([a-z])([A-Z])/g, '$1 $2')
336
- .trim();
337
- };
338
- const stripHtml = (str) => str.replace(/<[^>]*>/g, '');
339
- const formatValue = (value) => {
340
- if (Array.isArray(value)) {
341
- return stripHtml(value.filter((v) => v != null && v !== '').join(', '));
342
- }
343
- if (value == null) {
344
- return '';
345
- }
346
- return stripHtml(String(value));
347
- };
348
- const collectInfoRows = (display, availabilityLabels, displayFields) => {
349
- const core = display?.mappings?.core || {};
350
- const attributes = display?.attributes || {};
351
- const filterByDisplayFields = displayFields && displayFields.length > 0;
352
- const displayFieldsLower = filterByDisplayFields ? displayFields.map((f) => f.toLowerCase()) : [];
353
- const merged = {};
354
- // when displayFields is specified, include matching core fields that are normally skipped
355
- if (filterByDisplayFields) {
356
- Object.entries(core).forEach(([key, value]) => {
357
- if (displayFieldsLower.includes(key.toLowerCase()) && value != null) {
358
- merged[key] = value;
359
- }
360
- });
361
- }
362
- // pull selected core fields (rating + availability)
363
- if (core.rating != null) {
364
- const rating = core.rating;
365
- const ratingCount = core.ratingCount;
366
- merged.rating = ratingCount ? `${rating}/5.0 (${ratingCount} reviews)` : `${rating}/5.0`;
367
- }
368
- if (core.available != null) {
369
- merged.availability = core.available ? availabilityLabels.inStock : availabilityLabels.outOfStock;
370
- }
371
- // merge product attributes, skipping ones already shown on the card
372
- Object.entries(attributes).forEach(([key, value]) => {
373
- if (!filterByDisplayFields && CARD_FIELDS.has(key))
374
- return;
375
- const formatted = formatValue(value);
376
- if (!formatted)
377
- return;
378
- merged[key] = formatted;
379
- });
380
- const seen = new Set();
381
- const ordered = [];
382
- PREFERRED_INFO_ORDER.forEach((preferred) => {
383
- const match = Object.keys(merged).find((k) => k.toLowerCase() === preferred);
384
- if (match && !seen.has(match)) {
385
- seen.add(match);
386
- ordered.push({ key: match, rawKey: match, label: formatLabel(match), value: formatValue(merged[match]) });
387
- }
388
- });
389
- Object.keys(merged).forEach((key) => {
390
- if (seen.has(key))
391
- return;
392
- seen.add(key);
393
- ordered.push({ key, rawKey: key, label: formatLabel(key), value: formatValue(merged[key]) });
394
- });
395
- // filter and sort by displayFields order
396
- if (filterByDisplayFields) {
397
- const filtered = ordered.filter((row) => displayFieldsLower.includes(row.rawKey.toLowerCase()));
398
- filtered.sort((a, b) => displayFieldsLower.indexOf(a.rawKey.toLowerCase()) - displayFieldsLower.indexOf(b.rawKey.toLowerCase()));
399
- return filtered;
400
- }
401
- return ordered;
402
- };
403
- const resolveLangValue = (langEntry) => typeof langEntry?.value == 'function' ? langEntry.value() : langEntry?.value;
404
- exports.ChatProductQueryMessage = (0, mobx_react_lite_1.observer)((properties) => {
405
- const globalTheme = (0, providers_1.useTheme)();
406
- const globalTreePath = (0, providers_1.useTreePath)();
407
- const defaultProps = {
408
- treePath: globalTreePath,
409
- };
410
- const props = (0, utilities_1.mergeProps)('chatProductQueryMessage', globalTheme, defaultProps, properties);
411
- const { chatItem, controller, displayFields, disableStyles, className, internalClassName, treePath } = props;
412
- const { overrideElement, shouldRenderDefault } = (0, hooks_2.useCustomComponentOverride)('chatProductQueryMessage', props);
413
- const subProps = {
414
- image: {
415
- // inherited props
416
- ...(0, utilities_1.defined)({
417
- disableStyles,
418
- }),
419
- // component theme overrides
420
- theme: props?.theme,
421
- treePath,
422
- },
423
- button: {
424
- disableStyles,
425
- theme: props.theme,
426
- treePath,
427
- },
428
- };
429
- const styling = (0, utilities_1.mergeStyles)(props, defaultStyles);
430
- const { messageType, sourceProduct } = chatItem;
431
- const product = controller?.store.productQuickview;
432
- const productQuickviewError = controller?.store.productQuickviewError;
433
- const chatMessages = controller?.store.currentChat?.chat || [];
434
- const sourceMessage = chatItem.sourceMessageId ? chatMessages.find((m) => m.id === chatItem.sourceMessageId) : null;
435
- const cameFromInspiration = sourceMessage?.messageType === 'inspirationResult';
436
- const cameFromComparison = sourceMessage?.messageType === 'productComparison';
437
- const variants = product?.variants;
438
- const selections = variants?.selections || [];
439
- // Ensure every selection has an initial value picked. Without this, entering
440
- // the quickview from inspiration leaves all selections empty, and the first
441
- // variant click can't narrow `refineSelections` to a single variant — so the
442
- // active variant (and hero image) doesn't update until a second selection is
443
- // made. Prefer the variant whose own id (uid) matches the clicked result's id
444
- // so the panel reflects exactly the variant the user clicked; fall back to the
445
- // first available value. Single-value selections also get hidden from the UI
446
- // (handled by `visibleSelections` below).
447
- (0, hooks_1.useEffect)(() => {
448
- if (messageType !== 'productQuery' || !product)
449
- return;
450
- const sourceId = sourceProduct?.id;
451
- const matchedVariant = sourceId != null ? variants?.data?.find((variant) => variant.mappings?.core?.uid === sourceId) : undefined;
452
- selections.forEach((selection) => {
453
- if (selection.selected)
454
- return;
455
- const matchedValue = matchedVariant?.options?.[selection.field]?.value;
456
- const target = (matchedValue != null && selection.values.find((v) => v.available && v.value == matchedValue)) ||
457
- selection.values.find((v) => v.available) ||
458
- selection.values[0];
459
- if (target) {
460
- selection.select(target.value);
461
- }
462
- });
463
- }, [selections]);
464
- // after all hooks — an override that resolves or fails mid-lifecycle must not
465
- // change the hook count between renders
466
- if (!shouldRenderDefault) {
467
- return overrideElement;
468
- }
469
- //initialize lang
470
- const defaultLang = {
471
- loadingText: {
472
- value: 'Loading product details...',
473
- },
474
- backToComparisonButton: {
475
- value: 'Back to comparison',
476
- attributes: {
477
- 'aria-label': 'Back to comparison',
478
- },
479
- },
480
- backToInspirationButton: {
481
- value: 'Back to inspiration',
482
- attributes: {
483
- 'aria-label': 'Back to inspiration',
484
- },
485
- },
486
- addToCartButton: {
487
- value: 'Add to Cart',
488
- },
489
- similarButton: {
490
- value: 'Similar',
491
- },
492
- discussButton: {
493
- value: 'Discuss',
494
- },
495
- inStockText: {
496
- value: 'In Stock',
497
- },
498
- outOfStockText: {
499
- value: 'Out of Stock',
500
- },
501
- unavailableText: {
502
- value: 'unavailable',
503
- },
504
- variantsGroup: {
505
- attributes: {
506
- 'aria-label': 'Variant selection',
507
- },
508
- },
509
- productInformationTable: {
510
- attributes: {
511
- 'aria-label': 'Product information',
512
- },
513
- },
514
- };
515
- //deep merge with props.lang
516
- const lang = (0, deepmerge_1.default)(defaultLang, props.lang || {});
517
- const mergedLang = (0, hooks_2.useLang)(lang, {
518
- controller,
519
- chatItem,
520
- }, { activeBreakpoint: globalTheme?.activeBreakpoint });
521
- if (messageType !== 'productQuery') {
522
- controller?.log?.warn('ChatProductQueryMessage received message with unsupported type:', messageType, 'Expected type: productQuery');
523
- return null;
524
- }
525
- if (!product) {
526
- return ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message', className, internalClassName), ...styling, children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header'), children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product'), children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__details'), children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__details__name'), children: productQuickviewError || resolveLangValue(lang.loadingText) }) }) }) }) }) }));
527
- }
528
- const displayed = product.display;
529
- const displayedCore = displayed.mappings?.core || {};
530
- const visibleSelections = selections.filter((selection) => selection.values.length > 1);
531
- const displayedData = {
532
- mappings: displayed.mappings,
533
- attributes: displayed.attributes || {},
534
- };
535
- const allInfoRows = collectInfoRows(displayedData, { inStock: resolveLangValue(lang.inStockText), outOfStock: resolveLangValue(lang.outOfStockText) }, displayFields);
536
- const descriptionRow = allInfoRows.find((row) => row.rawKey.toLowerCase() === 'description');
537
- const infoRows = allInfoRows.filter((row) => row.rawKey.toLowerCase() !== 'description');
538
- const handleBack = () => {
539
- controller?.store.currentChat?.popProductQueryMessage(chatItem.sourceMessageId);
540
- controller?.store.clearProductQuickview();
541
- };
542
- const unavailableText = resolveLangValue(lang.unavailableText);
543
- return ((0, jsx_runtime_1.jsx)(providers_1.CacheProvider, { children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message', className, internalClassName), ...styling, children: [(cameFromInspiration || cameFromComparison) && ((0, jsx_runtime_1.jsx)(Button_1.Button, { ...subProps.button, internalClassName: (0, classnames_1.default)('ss__chat-product-query-message__header__back'), icon: { icon: 'angle-left', size: '14px' }, onClick: handleBack, lang: { button: cameFromComparison ? lang.backToComparisonButton : lang.backToInspirationButton } })), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header'), children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product'), children: [(displayedCore.imageUrl || displayedCore.parentImageUrl) && ((0, jsx_runtime_1.jsx)(Image_1.Image, { ...subProps.image, className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__image'), src: (displayedCore.imageUrl || displayedCore.parentImageUrl), alt: displayedCore.name || '' })), (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__details'), children: [displayedCore.name && ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__details__name'), children: displayedCore.url ? ((0, jsx_runtime_1.jsx)("a", { href: displayedCore.url, onClick: (e) => controller?.track.product.click(e, product), children: displayedCore.name })) : (displayedCore.name) })), displayedCore.price != null && ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__details__price'), children: [displayedCore.msrp != null && Number(displayedCore.msrp) > Number(displayedCore.price) && ((0, jsx_runtime_1.jsx)(Price_1.Price, { value: displayedCore.msrp, lineThrough: true })), (0, jsx_runtime_1.jsx)(Price_1.Price, { value: displayedCore.price })] })), (0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__actions'), children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__actions__add-to-cart'), children: (0, jsx_runtime_1.jsx)(Button_1.Button, { ...subProps.button, icon: "cart", onClick: () => {
544
- controller?.track.product.addToCart(product);
545
- controller?.addToCart(product);
546
- }, lang: { button: lang.addToCartButton } }) }), controller?.store.features.similarProducts.enabled && ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__actions__show-similar'), children: (0, jsx_runtime_1.jsx)(Button_1.Button, { ...subProps.button, icon: "search-thin", onClick: () => controller?.productSimilar(sourceProduct), lang: { button: lang.similarButton } }) })), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__header__product__actions__discuss-product'), children: (0, jsx_runtime_1.jsx)(Button_1.Button, { ...subProps.button, icon: "chat",
547
- // pass the quickview product (not sourceProduct) — its display is masked
548
- // to the active variant, so the attachment shows the selected variant
549
- onClick: () => controller?.productQuery(product), lang: { button: lang.discussButton } }) })] })] })] }) }), visibleSelections.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__variants'), role: "group", ...mergedLang.variantsGroup.attributes, children: visibleSelections.map((selection) => {
550
- // If every value in this selection shares the same thumbnail (or none have
551
- // one), the image carries no signal — show text only.
552
- const firstThumb = selection.values[0]?.thumbnailImageUrl;
553
- const allSameThumb = selection.values.every((v) => v.thumbnailImageUrl === firstThumb);
554
- const showThumbs = !allSameThumb;
555
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__variants__label'), id: `ss__chat-pq-variant-${selection.field}`, children: [formatLabel(selection.field), " (", selection.values.length, ")"] }), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__variants__swatches'), role: "radiogroup", "aria-labelledby": `ss__chat-pq-variant-${selection.field}`, children: selection.values.map((selectionValue) => {
556
- const isUnavailable = !selectionValue.available;
557
- const isSelected = selection.selected?.value === selectionValue.value;
558
- return ((0, react_1.createElement)(Button_1.Button, { ...subProps.button, key: selectionValue.value, internalClassName: (0, classnames_1.default)('ss__chat-product-query-message__variants__swatch', {
559
- 'ss__chat-product-query-message__variants__swatch--selected': isSelected,
560
- 'ss__chat-product-query-message__variants__swatch--unavailable': isUnavailable,
561
- 'ss__chat-product-query-message__variants__swatch--text-only': !showThumbs,
562
- }), ...{ role: 'radio', 'aria-checked': isSelected }, disabled: isUnavailable, lang: {
563
- button: {
564
- attributes: {
565
- title: selectionValue.value,
566
- 'aria-label': `${formatLabel(selection.field)}: ${selectionValue.value}${isUnavailable ? ` (${unavailableText})` : ''}`,
567
- },
568
- },
569
- }, onClick: () => selection.select(selectionValue.value) },
570
- showThumbs && selectionValue.thumbnailImageUrl ? ((0, jsx_runtime_1.jsx)(Image_1.Image, { ...subProps.image, className: (0, classnames_1.default)('ss__chat-product-query-message__variants__swatch__image'), src: selectionValue.thumbnailImageUrl, alt: selectionValue.value })) : null,
571
- (0, jsx_runtime_1.jsx)("span", { className: (0, classnames_1.default)('ss__chat-product-query-message__variants__swatch__value'), children: selectionValue.value })));
572
- }) })] }, selection.field));
573
- }) })), infoRows.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__section'), children: (0, jsx_runtime_1.jsx)("table", { className: (0, classnames_1.default)('ss__chat-product-query-message__section__table'), ...mergedLang.productInformationTable.attributes, children: (0, jsx_runtime_1.jsx)("tbody", { children: infoRows.map((row) => ((0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { scope: "row", children: row.label }), (0, jsx_runtime_1.jsx)("td", { children: row.rawKey === 'availability' ? ((0, jsx_runtime_1.jsx)("span", { className: (0, classnames_1.default)({
574
- 'ss__chat-product-query-message__section__table__availability--in-stock': displayedCore.available,
575
- 'ss__chat-product-query-message__section__table__availability--out-of-stock': !displayedCore.available,
576
- }), children: displayedCore.available ? `✓ ${row.value}` : row.value })) : row.rawKey.toLowerCase() === 'price' ? ((0, jsx_runtime_1.jsxs)("span", { className: "ss__chat-product-query-message__section__table__price", children: [displayedCore.msrp != null && Number(displayedCore.msrp) > Number(row.value) && ((0, jsx_runtime_1.jsx)(Price_1.Price, { value: Number(displayedCore.msrp), lineThrough: true })), (0, jsx_runtime_1.jsx)(Price_1.Price, { value: Number(row.value) })] })) : (row.value) })] }, row.key))) }) }) })), descriptionRow && (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ss__chat-product-query-message__description'), children: descriptionRow.value })] }) }));
577
- });
@@ -1,38 +0,0 @@
1
- import { h } from 'preact';
2
- import { ComponentProps } from '../../../types';
3
- import { Lang } from '../../../hooks';
4
- import type { ChatController } from '@athoscommerce/snap-controller';
5
- import type { Product } from '@athoscommerce/snap-store-mobx';
6
- export declare const ChatProductQueryMessage: ((properties: ChatProductQueryMessageProps) => import("@emotion/react/jsx-runtime").JSX.Element | h.JSX.Element | null) & {
7
- displayName: string;
8
- };
9
- export type ChatProductQueryMessageProps = {
10
- chatItem: ChatProductQueryMessageItem;
11
- controller?: ChatController;
12
- lang?: Partial<ChatProductQueryMessageLang>;
13
- } & ChatProductQueryMessageTemplatesLegalProps & ComponentProps<ChatProductQueryMessageProps>;
14
- export type ChatProductQueryMessageItem = {
15
- id: string;
16
- messageType: 'productQuery';
17
- sourceProduct: Product;
18
- sourceMessageId?: string;
19
- };
20
- export type ChatProductQueryMessageTemplatesLegalProps = {
21
- displayFields?: string[];
22
- primaryColor?: string;
23
- primaryColorText?: string;
24
- };
25
- export interface ChatProductQueryMessageLang {
26
- loadingText?: Lang<never>;
27
- backToComparisonButton?: Lang<never>;
28
- backToInspirationButton?: Lang<never>;
29
- addToCartButton?: Lang<never>;
30
- similarButton?: Lang<never>;
31
- discussButton?: Lang<never>;
32
- inStockText?: Lang<never>;
33
- outOfStockText?: Lang<never>;
34
- unavailableText?: Lang<never>;
35
- variantsGroup?: Lang<never>;
36
- productInformationTable?: Lang<never>;
37
- }
38
- //# sourceMappingURL=ChatProductQueryMessage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatProductQueryMessage.d.ts","sourceRoot":"","sources":["../../../../../../../components/src/components/Molecules/ChatProductQueryMessage/ChatProductQueryMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAS3B,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAuC,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,gCAAgC,CAAC;AA2bhF,eAAO,MAAM,uBAAuB,gBAAyB,4BAA4B;;CA8WvF,CAAC;AAOH,MAAM,MAAM,4BAA4B,GAAG;IAC1C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAC5C,GAAG,0CAA0C,GAC7C,cAAc,CAAC,4BAA4B,CAAC,CAAC;AAE9C,MAAM,MAAM,2BAA2B,GAAG;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,cAAc,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACxD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC3C,WAAW,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,sBAAsB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,uBAAuB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,eAAe,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,uBAAuB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;CACtC"}