@coveo/atomic 3.50.0 → 3.51.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.
Files changed (226) hide show
  1. package/custom-elements.json +2254 -372
  2. package/dist/atomic/_atomic.esm.js +1 -1
  3. package/dist/atomic/atomic.esm.js.map +1 -1
  4. package/dist/atomic/components/_index.d.ts +0 -10
  5. package/dist/atomic/components/_index.js +2 -8
  6. package/dist/atomic/components/atomic-insight-result-action.js +122 -5
  7. package/dist/atomic/components/atomic-insight-result-action.js.map +1 -1
  8. package/dist/atomic/components/atomic-insight-result-children-template.js +1 -2
  9. package/dist/atomic/components/atomic-insight-result-children-template.js.map +1 -1
  10. package/dist/atomic/components/atomic-insight-timeframe-facet.js +96 -6
  11. package/dist/atomic/components/atomic-insight-timeframe-facet.js.map +1 -1
  12. package/dist/atomic/components/atomic-stencil-facet-date-input.js +3 -3
  13. package/dist/atomic/components/components/common/generated-answer/render-feedback-and-copy-buttons.js +4 -3
  14. package/dist/atomic/components/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.js +444 -0
  15. package/dist/atomic/components/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.tw.css.js +2 -0
  16. package/dist/atomic/components/components/insight/atomic-insight-result-attach-to-case-action/atomic-insight-result-attach-to-case-action.js +122 -0
  17. package/dist/atomic/components/components/insight/index.js +2 -0
  18. package/dist/atomic/components/components/insight/lazy-index.js +2 -0
  19. package/dist/atomic/components/components/ipx/atomic-ipx-button/atomic-ipx-button.js +1 -1
  20. package/dist/atomic/components/components/ipx/atomic-ipx-recs-list/atomic-ipx-recs-list.js +483 -0
  21. package/dist/atomic/components/components/ipx/atomic-ipx-refine-modal/atomic-ipx-refine-modal.js +202 -0
  22. package/dist/atomic/components/components/ipx/atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.js +123 -0
  23. package/dist/atomic/components/components/ipx/index.js +3 -0
  24. package/dist/atomic/components/components/ipx/lazy-index.js +3 -0
  25. package/dist/atomic/components/components/recommendations/atomic-recs-result/atomic-recs-result.js +1 -0
  26. package/dist/atomic/components/components/search/atomic-generated-answer/atomic-generated-answer.js +7 -1
  27. package/dist/atomic/components/components/search/atomic-refine-modal/atomic-refine-modal.js +2 -1
  28. package/dist/atomic/components/global/environment.js +1 -1
  29. package/dist/atomic/components/index.js.map +1 -1
  30. package/dist/atomic/components/props-utils.js +1402 -2
  31. package/dist/atomic/components/props-utils.js.map +1 -1
  32. package/dist/atomic/components/utils/custom-element-tags.js +6 -0
  33. package/dist/atomic/index.esm.js +1 -1
  34. package/dist/atomic/p-1df0744f.entry.js +9 -0
  35. package/dist/atomic/p-1df0744f.entry.js.map +1 -0
  36. package/dist/atomic/{p-4a32511f.js → p-2045a1b1.js} +2 -2
  37. package/dist/atomic/p-500bf5c4.entry.js +2 -0
  38. package/dist/atomic/{p-4117289b.entry.js.map → p-500bf5c4.entry.js.map} +1 -1
  39. package/dist/atomic/p-5226a938.js +3 -0
  40. package/dist/atomic/p-5226a938.js.map +1 -0
  41. package/dist/atomic/{p-b4cfedf1.js → p-720863c3.js} +2 -2
  42. package/dist/atomic/p-81336626.entry.js +2 -0
  43. package/dist/atomic/p-81336626.entry.js.map +1 -0
  44. package/dist/atomic/p-aad3b4ec.js +3 -0
  45. package/dist/atomic/p-aad3b4ec.js.map +1 -0
  46. package/dist/atomic/{p-0698ccf1.entry.js → p-b5af331b.entry.js} +2 -2
  47. package/dist/atomic/{p-677f9c40.js → p-b7209471.js} +2 -2
  48. package/dist/cjs/_index.cjs.js +2 -2
  49. package/dist/cjs/_loader.cjs.js +2 -2
  50. package/dist/cjs/atomic-insight-result-action.cjs.entry.js +21 -8
  51. package/dist/cjs/atomic-insight-result-action.cjs.entry.js.map +1 -1
  52. package/dist/cjs/atomic-insight-result-children-template.cjs.entry.js +6 -7
  53. package/dist/cjs/atomic-insight-result-children-template.cjs.entry.js.map +1 -1
  54. package/dist/cjs/atomic-insight-timeframe-facet.cjs.entry.js +105 -15
  55. package/dist/cjs/atomic-insight-timeframe-facet.cjs.entry.js.map +1 -1
  56. package/dist/cjs/atomic-stencil-facet-date-input.cjs.entry.js +5 -5
  57. package/dist/cjs/atomic.cjs.js +2 -2
  58. package/dist/cjs/{index-3532822e.js → index-122375df.js} +4 -58
  59. package/dist/cjs/index-122375df.js.map +1 -0
  60. package/dist/cjs/{initialization-utils-51a423fe.js → initialization-utils-c2821271.js} +2 -2
  61. package/dist/cjs/{initialization-utils-51a423fe.js.map → initialization-utils-c2821271.js.map} +1 -1
  62. package/dist/cjs/{utils-e845f262.js → props-utils-e4f29f1e.js} +54 -21
  63. package/dist/cjs/props-utils-e4f29f1e.js.map +1 -0
  64. package/dist/cjs/{stencil-button-f39da03e.js → stencil-button-bf22eea4.js} +2 -2
  65. package/dist/cjs/{stencil-button-f39da03e.js.map → stencil-button-bf22eea4.js.map} +1 -1
  66. package/dist/cjs/{stencil-result-template-decorators-1f099c15.js → stencil-result-template-decorators-96954751.js} +2 -2
  67. package/dist/cjs/{stencil-result-template-decorators-1f099c15.js.map → stencil-result-template-decorators-96954751.js.map} +1 -1
  68. package/dist/cjs/version.cjs.js +2 -2
  69. package/dist/esm/_index.js +3 -3
  70. package/dist/esm/_loader.js +3 -3
  71. package/dist/esm/atomic-insight-result-action.entry.js +19 -6
  72. package/dist/esm/atomic-insight-result-action.entry.js.map +1 -1
  73. package/dist/esm/atomic-insight-result-children-template.entry.js +2 -3
  74. package/dist/esm/atomic-insight-result-children-template.entry.js.map +1 -1
  75. package/dist/esm/atomic-insight-timeframe-facet.entry.js +99 -9
  76. package/dist/esm/atomic-insight-timeframe-facet.entry.js.map +1 -1
  77. package/dist/esm/atomic-stencil-facet-date-input.entry.js +5 -5
  78. package/dist/esm/atomic.js +3 -3
  79. package/dist/esm/{index-3eb0b28e.js → index-4d679e44.js} +5 -58
  80. package/dist/{cjs/index-3532822e.js.map → esm/index-4d679e44.js.map} +1 -1
  81. package/dist/esm/{initialization-utils-82d28c63.js → initialization-utils-9ff399ff.js} +2 -2
  82. package/dist/esm/{initialization-utils-82d28c63.js.map → initialization-utils-9ff399ff.js.map} +1 -1
  83. package/dist/esm/{utils-b5bab369.js → props-utils-76043c82.js} +54 -18
  84. package/dist/esm/props-utils-76043c82.js.map +1 -0
  85. package/dist/esm/{stencil-button-c25899df.js → stencil-button-28de709c.js} +2 -2
  86. package/dist/esm/{stencil-button-c25899df.js.map → stencil-button-28de709c.js.map} +1 -1
  87. package/dist/esm/{stencil-result-template-decorators-9cbe1e1c.js → stencil-result-template-decorators-4c2e5132.js} +2 -2
  88. package/dist/esm/{stencil-result-template-decorators-9cbe1e1c.js.map → stencil-result-template-decorators-4c2e5132.js.map} +1 -1
  89. package/dist/esm/version.js +2 -2
  90. package/dist/types/components/common/generated-answer/answerContent/answer-content.d.ts +49 -0
  91. package/dist/types/components/common/generated-answer/render-feedback-and-copy-buttons.d.ts +8 -2
  92. package/dist/types/components/common/item-list/table-layout.d.ts +1 -1
  93. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.d.ts +54 -35
  94. package/dist/types/components/insight/atomic-insight-generated-answer/atomic-insight-generated-answer.tw.css.d.ts +2 -0
  95. package/dist/types/components/insight/atomic-insight-result-attach-to-case-action/atomic-insight-result-attach-to-case-action.d.ts +25 -20
  96. package/dist/types/components/insight/index.d.ts +2 -0
  97. package/dist/types/components/ipx/atomic-ipx-button/atomic-ipx-button.d.ts +1 -1
  98. package/dist/types/components/ipx/atomic-ipx-recs-list/{atomic-recs-list/atomic-ipx-recs-list.d.ts → atomic-ipx-recs-list.d.ts} +43 -21
  99. package/dist/types/components/ipx/atomic-ipx-refine-modal/atomic-ipx-refine-modal.d.ts +62 -15
  100. package/dist/types/components/ipx/atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.d.ts +26 -11
  101. package/dist/types/components/ipx/index.d.ts +3 -0
  102. package/dist/types/components/recommendations/atomic-recs-result/atomic-recs-result.d.ts +1 -0
  103. package/dist/types/components/search/atomic-refine-modal/atomic-refine-modal.d.ts +4 -3
  104. package/dist/types/components.d.ts +0 -249
  105. package/docs/atomic-docs.json +1 -26
  106. package/package.json +3 -3
  107. package/dist/atomic/components/arrow-top-rounded.js +0 -7
  108. package/dist/atomic/components/arrow-top-rounded.js.map +0 -1
  109. package/dist/atomic/components/atomic-insight-generated-answer.d.ts +0 -11
  110. package/dist/atomic/components/atomic-insight-generated-answer.js +0 -3264
  111. package/dist/atomic/components/atomic-insight-generated-answer.js.map +0 -1
  112. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.d.ts +0 -11
  113. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.js +0 -102
  114. package/dist/atomic/components/atomic-insight-result-attach-to-case-action.js.map +0 -1
  115. package/dist/atomic/components/atomic-ipx-recs-list.d.ts +0 -11
  116. package/dist/atomic/components/atomic-ipx-recs-list.js +0 -631
  117. package/dist/atomic/components/atomic-ipx-recs-list.js.map +0 -1
  118. package/dist/atomic/components/atomic-ipx-refine-modal.d.ts +0 -11
  119. package/dist/atomic/components/atomic-ipx-refine-modal.js +0 -8
  120. package/dist/atomic/components/atomic-ipx-refine-modal.js.map +0 -1
  121. package/dist/atomic/components/atomic-ipx-refine-modal2.js +0 -162
  122. package/dist/atomic/components/atomic-ipx-refine-modal2.js.map +0 -1
  123. package/dist/atomic/components/atomic-ipx-refine-toggle.d.ts +0 -11
  124. package/dist/atomic/components/atomic-ipx-refine-toggle.js +0 -121
  125. package/dist/atomic/components/atomic-ipx-refine-toggle.js.map +0 -1
  126. package/dist/atomic/components/attach.js +0 -115
  127. package/dist/atomic/components/attach.js.map +0 -1
  128. package/dist/atomic/components/components/common/layout/display-options.js +0 -28
  129. package/dist/atomic/components/popover-type.js +0 -12
  130. package/dist/atomic/components/popover-type.js.map +0 -1
  131. package/dist/atomic/components/stencil-heading.js +0 -169
  132. package/dist/atomic/components/stencil-heading.js.map +0 -1
  133. package/dist/atomic/components/stencil-iconButton.js +0 -16
  134. package/dist/atomic/components/stencil-iconButton.js.map +0 -1
  135. package/dist/atomic/components/store.js +0 -13
  136. package/dist/atomic/components/store.js.map +0 -1
  137. package/dist/atomic/components/utils.js +0 -1421
  138. package/dist/atomic/components/utils.js.map +0 -1
  139. package/dist/atomic/p-0f896350.entry.js +0 -2
  140. package/dist/atomic/p-0f896350.entry.js.map +0 -1
  141. package/dist/atomic/p-4117289b.entry.js +0 -2
  142. package/dist/atomic/p-578d761c.js +0 -2
  143. package/dist/atomic/p-578d761c.js.map +0 -1
  144. package/dist/atomic/p-70cc18a1.js +0 -2
  145. package/dist/atomic/p-70cc18a1.js.map +0 -1
  146. package/dist/atomic/p-74210c4b.entry.js +0 -9
  147. package/dist/atomic/p-74210c4b.entry.js.map +0 -1
  148. package/dist/atomic/p-8b039c2e.entry.js +0 -2
  149. package/dist/atomic/p-8b039c2e.entry.js.map +0 -1
  150. package/dist/atomic/p-991e840f.entry.js +0 -2
  151. package/dist/atomic/p-991e840f.entry.js.map +0 -1
  152. package/dist/atomic/p-9c5ec170.js +0 -2
  153. package/dist/atomic/p-9c5ec170.js.map +0 -1
  154. package/dist/atomic/p-9dfe5ab1.js +0 -2
  155. package/dist/atomic/p-9dfe5ab1.js.map +0 -1
  156. package/dist/atomic/p-9f774145.entry.js +0 -2
  157. package/dist/atomic/p-9f774145.entry.js.map +0 -1
  158. package/dist/atomic/p-a33748a9.js +0 -2
  159. package/dist/atomic/p-a33748a9.js.map +0 -1
  160. package/dist/atomic/p-b09433bb.js +0 -3
  161. package/dist/atomic/p-b09433bb.js.map +0 -1
  162. package/dist/atomic/p-c81f1edb.entry.js +0 -2
  163. package/dist/atomic/p-c81f1edb.entry.js.map +0 -1
  164. package/dist/atomic/p-d75a4630.js +0 -2
  165. package/dist/atomic/p-d75a4630.js.map +0 -1
  166. package/dist/atomic/p-ec1c5f46.js +0 -3
  167. package/dist/atomic/p-ec1c5f46.js.map +0 -1
  168. package/dist/atomic/p-eea2c139.entry.js +0 -2
  169. package/dist/atomic/p-eea2c139.entry.js.map +0 -1
  170. package/dist/atomic/p-f321aab0.js +0 -2
  171. package/dist/atomic/p-f321aab0.js.map +0 -1
  172. package/dist/cjs/arrow-top-rounded-885250ea.js +0 -10
  173. package/dist/cjs/arrow-top-rounded-885250ea.js.map +0 -1
  174. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js +0 -3238
  175. package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js.map +0 -1
  176. package/dist/cjs/atomic-insight-result-attach-to-case-action.cjs.entry.js +0 -90
  177. package/dist/cjs/atomic-insight-result-attach-to-case-action.cjs.entry.js.map +0 -1
  178. package/dist/cjs/atomic-ipx-recs-list.cjs.entry.js +0 -600
  179. package/dist/cjs/atomic-ipx-recs-list.cjs.entry.js.map +0 -1
  180. package/dist/cjs/atomic-ipx-refine-modal.cjs.entry.js +0 -143
  181. package/dist/cjs/atomic-ipx-refine-modal.cjs.entry.js.map +0 -1
  182. package/dist/cjs/atomic-ipx-refine-toggle.cjs.entry.js +0 -99
  183. package/dist/cjs/atomic-ipx-refine-toggle.cjs.entry.js.map +0 -1
  184. package/dist/cjs/attach-19283bec.js +0 -10
  185. package/dist/cjs/attach-19283bec.js.map +0 -1
  186. package/dist/cjs/popover-type-22f285e1.js +0 -16
  187. package/dist/cjs/popover-type-22f285e1.js.map +0 -1
  188. package/dist/cjs/props-utils-bc5feb04.js +0 -59
  189. package/dist/cjs/props-utils-bc5feb04.js.map +0 -1
  190. package/dist/cjs/stencil-heading-ecec9ab3.js +0 -174
  191. package/dist/cjs/stencil-heading-ecec9ab3.js.map +0 -1
  192. package/dist/cjs/stencil-iconButton-f8b9fda0.js +0 -18
  193. package/dist/cjs/stencil-iconButton-f8b9fda0.js.map +0 -1
  194. package/dist/cjs/store-70fff5e6.js +0 -16
  195. package/dist/cjs/store-70fff5e6.js.map +0 -1
  196. package/dist/cjs/utils-e845f262.js.map +0 -1
  197. package/dist/esm/arrow-top-rounded-745b84a6.js +0 -7
  198. package/dist/esm/arrow-top-rounded-745b84a6.js.map +0 -1
  199. package/dist/esm/atomic-insight-generated-answer.entry.js +0 -3234
  200. package/dist/esm/atomic-insight-generated-answer.entry.js.map +0 -1
  201. package/dist/esm/atomic-insight-result-attach-to-case-action.entry.js +0 -86
  202. package/dist/esm/atomic-insight-result-attach-to-case-action.entry.js.map +0 -1
  203. package/dist/esm/atomic-ipx-recs-list.entry.js +0 -596
  204. package/dist/esm/atomic-ipx-recs-list.entry.js.map +0 -1
  205. package/dist/esm/atomic-ipx-refine-modal.entry.js +0 -139
  206. package/dist/esm/atomic-ipx-refine-modal.entry.js.map +0 -1
  207. package/dist/esm/atomic-ipx-refine-toggle.entry.js +0 -95
  208. package/dist/esm/atomic-ipx-refine-toggle.entry.js.map +0 -1
  209. package/dist/esm/attach-81bb8872.js +0 -8
  210. package/dist/esm/attach-81bb8872.js.map +0 -1
  211. package/dist/esm/index-3eb0b28e.js.map +0 -1
  212. package/dist/esm/popover-type-c85677ef.js +0 -12
  213. package/dist/esm/popover-type-c85677ef.js.map +0 -1
  214. package/dist/esm/props-utils-d343133b.js +0 -57
  215. package/dist/esm/props-utils-d343133b.js.map +0 -1
  216. package/dist/esm/stencil-heading-98a5f23f.js +0 -169
  217. package/dist/esm/stencil-heading-98a5f23f.js.map +0 -1
  218. package/dist/esm/stencil-iconButton-ed5804d3.js +0 -16
  219. package/dist/esm/stencil-iconButton-ed5804d3.js.map +0 -1
  220. package/dist/esm/store-50d170c8.js +0 -13
  221. package/dist/esm/store-50d170c8.js.map +0 -1
  222. package/dist/esm/utils-b5bab369.js.map +0 -1
  223. /package/dist/atomic/{p-4a32511f.js.map → p-2045a1b1.js.map} +0 -0
  224. /package/dist/atomic/{p-b4cfedf1.js.map → p-720863c3.js.map} +0 -0
  225. /package/dist/atomic/{p-0698ccf1.entry.js.map → p-b5af331b.entry.js.map} +0 -0
  226. /package/dist/atomic/{p-677f9c40.js.map → p-b7209471.js.map} +0 -0
@@ -0,0 +1,123 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { buildBreadcrumbManager, buildSearchStatus, } from '@coveo/headless';
8
+ import { css, html, LitElement } from 'lit';
9
+ import { customElement, property, state } from 'lit/decorators.js';
10
+ import { renderIconButton } from "../../common/icon-button";
11
+ import { bindStateToController } from "../../../decorators/bind-state";
12
+ import { bindingGuard } from "../../../decorators/binding-guard";
13
+ import { bindings } from "../../../decorators/bindings";
14
+ import { errorGuard } from "../../../decorators/error-guard";
15
+ import { withTailwindStyles } from "../../../decorators/with-tailwind-styles";
16
+ const FilterIcon = "<svg width=\"14\" height=\"13\" viewBox=\"0 0 14 13\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8.87501 6.12835C8.86388 6.13837 8.8532 6.14889 8.84301 6.15987C8.62114 6.399 8.5 6.71441 8.5 7.03922L8.5 12.2222C8.5 12.3929 8.37108 12.4999 8.25 12.4999L5.74999 12.4999C5.62891 12.4999 5.49999 12.3929 5.5 12.2222V7.03921C5.5 6.7144 5.37885 6.39899 5.15698 6.15986C5.14679 6.14888 5.13612 6.13836 5.12499 6.12834L0.56512 2.02315C0.524585 1.9736 0.499999 1.9077 0.5 1.83654L0.500008 0.777776C0.500009 0.607068 0.628921 0.5 0.750007 0.5L13.25 0.500025C13.3711 0.500025 13.5 0.607095 13.5 0.777806L13.5 1.83656C13.5 1.90773 13.4754 1.97362 13.4349 2.02317L8.87501 6.12835Z\" stroke=\"currentColor\" stroke-linejoin=\"round\"/>\n</svg>\n";
17
+ import "../atomic-ipx-refine-modal/atomic-ipx-refine-modal";
18
+ /**
19
+ * The `atomic-ipx-refine-toggle` component displays a button that, when clicked, opens a refine modal containing facets.
20
+ *
21
+ * @part ipx-refine-toggle-container - The container div element.
22
+ * @part ipx-refine-toggle-button - The button element.
23
+ * @part ipx-refine-toggle-icon - The filter icon within the button.
24
+ * @part ipx-refine-toggle-badge - The badge element displaying the number of active filters.
25
+ */
26
+ let AtomicIpxRefineToggle = class AtomicIpxRefineToggle extends LitElement {
27
+ constructor() {
28
+ super(...arguments);
29
+ /**
30
+ * The number of expanded facets inside the refine modal.
31
+ * Remaining facets are automatically collapsed.
32
+ *
33
+ * Using the value `0` collapses all facets.
34
+ */
35
+ this.collapseFacetsAfter = 0;
36
+ this.modalLoaded = false;
37
+ }
38
+ get numberOfBreadcrumbs() {
39
+ const state = this.breadcrumbManagerState;
40
+ return (state.facetBreadcrumbs.length +
41
+ state.categoryFacetBreadcrumbs.length +
42
+ state.numericFacetBreadcrumbs.length +
43
+ state.dateFacetBreadcrumbs.length +
44
+ state.staticFilterBreadcrumbs.length +
45
+ state.automaticFacetBreadcrumbs.length);
46
+ }
47
+ initialize() {
48
+ this.breadcrumbManager = buildBreadcrumbManager(this.bindings.engine);
49
+ this.searchStatus = buildSearchStatus(this.bindings.engine);
50
+ }
51
+ loadModal() {
52
+ if (this.modalLoaded) {
53
+ return;
54
+ }
55
+ this.modalLoaded = true;
56
+ this.modalRef = document.createElement('atomic-ipx-refine-modal');
57
+ this.insertAdjacentElement('beforebegin', this.modalRef);
58
+ this.modalRef.openButton = this.buttonRef;
59
+ this.modalRef.collapseFacetsAfter = this.collapseFacetsAfter;
60
+ }
61
+ openModal() {
62
+ if (this.modalRef) {
63
+ this.modalRef.isOpen = true;
64
+ }
65
+ }
66
+ handleClick() {
67
+ this.bindings.store.waitUntilAppLoaded(() => {
68
+ this.openModal();
69
+ });
70
+ }
71
+ render() {
72
+ return renderIconButton({
73
+ props: {
74
+ partPrefix: 'ipx-refine-toggle',
75
+ class: 'icon-button',
76
+ style: 'outline-neutral',
77
+ title: this.bindings.i18n.t('filters'),
78
+ icon: FilterIcon,
79
+ disabled: !this.searchStatusState.hasResults && !this.numberOfBreadcrumbs,
80
+ ariaLabel: this.bindings.i18n.t('filters'),
81
+ onClick: () => this.handleClick(),
82
+ buttonRef: (button) => {
83
+ if (!button) {
84
+ return;
85
+ }
86
+ this.buttonRef = button;
87
+ this.loadModal();
88
+ },
89
+ badge: this.breadcrumbManagerState.hasBreadcrumbs
90
+ ? html `<slot>${this.numberOfBreadcrumbs}</slot>`
91
+ : undefined,
92
+ },
93
+ });
94
+ }
95
+ };
96
+ AtomicIpxRefineToggle.styles = css`/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */@layer properties;:host{[part=ipx-refine-toggle-button]{height:100%;width:auto}[part=ipx-refine-toggle-badge]{font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,1.33333));--tw-leading:calc(var(--spacing, 0.25rem)*5);line-height:calc(var(--spacing, .25rem)*5)}[part=ipx-refine-toggle-badge],[part=ipx-refine-toggle-icon]{height:calc(var(--spacing, .25rem)*5);width:calc(var(--spacing, .25rem)*5)}}@property --tw-leading{syntax:"*";inherits:false}@layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-leading:initial}}}`;
97
+ __decorate([
98
+ property({ type: Number, reflect: true, attribute: 'collapse-facets-after' })
99
+ ], AtomicIpxRefineToggle.prototype, "collapseFacetsAfter", void 0);
100
+ __decorate([
101
+ state()
102
+ ], AtomicIpxRefineToggle.prototype, "bindings", void 0);
103
+ __decorate([
104
+ state()
105
+ ], AtomicIpxRefineToggle.prototype, "error", void 0);
106
+ __decorate([
107
+ bindStateToController('breadcrumbManager'),
108
+ state()
109
+ ], AtomicIpxRefineToggle.prototype, "breadcrumbManagerState", void 0);
110
+ __decorate([
111
+ bindStateToController('searchStatus'),
112
+ state()
113
+ ], AtomicIpxRefineToggle.prototype, "searchStatusState", void 0);
114
+ __decorate([
115
+ errorGuard(),
116
+ bindingGuard()
117
+ ], AtomicIpxRefineToggle.prototype, "render", null);
118
+ AtomicIpxRefineToggle = __decorate([
119
+ customElement('atomic-ipx-refine-toggle'),
120
+ bindings(),
121
+ withTailwindStyles
122
+ ], AtomicIpxRefineToggle);
123
+ export { AtomicIpxRefineToggle };
@@ -2,6 +2,9 @@
2
2
  export { AtomicIpxButton } from './atomic-ipx-button/atomic-ipx-button.js';
3
3
  export { AtomicIpxEmbedded } from './atomic-ipx-embedded/atomic-ipx-embedded.js';
4
4
  export { AtomicIpxModal } from './atomic-ipx-modal/atomic-ipx-modal.js';
5
+ export { AtomicIpxRecsList } from './atomic-ipx-recs-list/atomic-ipx-recs-list.js';
6
+ export { AtomicIpxRefineModal } from './atomic-ipx-refine-modal/atomic-ipx-refine-modal.js';
7
+ export { AtomicIpxRefineToggle } from './atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.js';
5
8
  export { AtomicIpxResultLink } from './atomic-ipx-result-link/atomic-ipx-result-link.js';
6
9
  export { AtomicIpxTab } from './atomic-ipx-tab/atomic-ipx-tab.js';
7
10
  export { AtomicIpxTabs } from './atomic-ipx-tabs/atomic-ipx-tabs.js';
@@ -3,6 +3,9 @@ export default {
3
3
  'atomic-ipx-button': async () => await import('./atomic-ipx-button/atomic-ipx-button.js'),
4
4
  'atomic-ipx-embedded': async () => await import('./atomic-ipx-embedded/atomic-ipx-embedded.js'),
5
5
  'atomic-ipx-modal': async () => await import('./atomic-ipx-modal/atomic-ipx-modal.js'),
6
+ 'atomic-ipx-recs-list': async () => await import('./atomic-ipx-recs-list/atomic-ipx-recs-list.js'),
7
+ 'atomic-ipx-refine-modal': async () => await import('./atomic-ipx-refine-modal/atomic-ipx-refine-modal.js'),
8
+ 'atomic-ipx-refine-toggle': async () => await import('./atomic-ipx-refine-toggle/atomic-ipx-refine-toggle.js'),
6
9
  'atomic-ipx-result-link': async () => await import('./atomic-ipx-result-link/atomic-ipx-result-link.js'),
7
10
  'atomic-ipx-tab': async () => await import('./atomic-ipx-tab/atomic-ipx-tab.js'),
8
11
  'atomic-ipx-tabs': async () => await import('./atomic-ipx-tabs/atomic-ipx-tabs.js'),
@@ -16,6 +16,7 @@ import { booleanConverter } from "../../../converters/boolean-converter";
16
16
  import { withTailwindStyles } from "../../../decorators/with-tailwind-styles";
17
17
  import { ChildrenUpdateCompleteMixin } from "../../../mixins/children-update-complete-mixin";
18
18
  import { parentNodeToString } from "../../../utils/dom-utils";
19
+ import "../../search/atomic-result-link/atomic-result-link";
19
20
  /**
20
21
  * The `atomic-recs-result` component is used internally by the `atomic-recs-list` component.
21
22
  */
@@ -369,7 +369,13 @@ let AtomicGeneratedAnswer = AtomicGeneratedAnswer_1 = class AtomicGeneratedAnswe
369
369
  return renderFeedbackAndCopyButtons({
370
370
  props: {
371
371
  i18n: this.bindings.i18n,
372
- generatedAnswerState: this.generatedAnswerState,
372
+ generatedAnswerActionsState: {
373
+ liked: this.generatedAnswerState.liked,
374
+ disliked: this.generatedAnswerState.disliked,
375
+ isStreaming: this.generatedAnswerState.isStreaming,
376
+ isLoading: this.generatedAnswerState.isLoading,
377
+ answer: this.generatedAnswerState.answer,
378
+ },
373
379
  copied: this.copied,
374
380
  copyError: this.copyError,
375
381
  getCopyToClipboardTooltip: () => this.copyToClipboardTooltip,
@@ -28,7 +28,7 @@ import "../atomic-automatic-facet-generator/atomic-automatic-facet-generator";
28
28
  /**
29
29
  * The `atomic-refine-modal` component is automatically created as a child of the `atomic-search-interface` when the `atomic-refine-toggle` is initialized.
30
30
  *
31
- * When the modal is opened, the class `atomic-modal-opened` is added to the interface element and the body, allowing further customization.
31
+ * When the modal is opened, the class `atomic-modal-opened` is added to the interface element and the body.
32
32
  *
33
33
  * @part title - The title of the modal.
34
34
  * @part close-button - The button in the header that closes the modal.
@@ -55,6 +55,7 @@ import "../atomic-automatic-facet-generator/atomic-automatic-facet-generator";
55
55
  * @part header-wrapper - The wrapper around the header.
56
56
  * @part header - The header of the modal, containing the title.
57
57
  * @part container - The modal's outermost container.
58
+ * @part backdrop - The transparent backdrop hiding the content behind the modal.
58
59
  *
59
60
  * @cssprop --atomic-refine-modal-facet-margin - The margin between facets in the refine modal. Default is `20px`.
60
61
  */
@@ -3,7 +3,7 @@ function getWindow() {
3
3
  }
4
4
  export function getAtomicEnvironment(headlessVersion) {
5
5
  return {
6
- version: "3.50.0",
6
+ version: "3.51.0",
7
7
  headlessVersion,
8
8
  };
9
9
  }
@@ -1 +1 @@
1
- {"file":"index.js","mappings":"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","names":[],"sources":["src/components/common/item-list/context/item-context-controller.ts","src/components/common/item-list/fetch-item-context.ts","src/components/commerce/product-template-component-utils/context/fetch-product-context.ts","src/components/commerce/product-template-component-utils/context/stencil-product-template-decorators.tsx","src/components/common/suggestions/suggestions-events.ts","src/components/common/suggestions/suggestions-utils.ts","src/utils/result-utils.ts"],"sourcesContent":["import type {LitElement, ReactiveController, ReactiveControllerHost} from 'lit';\nimport type {InitializableComponent} from '@/src/decorators/types.js';\nimport {buildCustomEvent} from '@/src/utils/event-utils';\n\ntype LitElementWithError = Omit<\n Pick<InitializableComponent, 'error'>,\n 'error'\n> &\n LitElement & {\n error: Error | null;\n };\n\nconst itemContextEventName = 'atomic/resolveResult';\n\nexport class MissingParentError extends Error {\n constructor(elementName: string, parentName: string) {\n super(\n `The \"${elementName}\" element must be the child of an \"${parentName}\" element.`\n );\n }\n}\n\nfunction extractFolded<T = Record<string, unknown>>(\n item: Record<string, unknown>,\n returnFolded: boolean\n): T {\n if (returnFolded) {\n if ('children' in item) {\n return item as T;\n } else {\n return {children: [], result: item} as T;\n }\n }\n\n if ('children' in item && 'result' in item) {\n return item.result as T;\n }\n return item as T;\n}\n\n/**\n * A reactive controller that manages item context data from parent components.\n * Handles fetching item data via custom events and manages error states.\n */\nexport class ItemContextController<T = Record<string, unknown>>\n implements ReactiveController\n{\n private host: ReactiveControllerHost & LitElementWithError;\n private parentName: string;\n private folded: boolean;\n private _item: T | null = null;\n private _error: MissingParentError | null = null;\n\n constructor(\n host: ReactiveControllerHost & LitElementWithError,\n options: {parentName?: string; folded?: boolean} = {}\n ) {\n this.host = host;\n this.parentName = options.parentName ?? 'atomic-result';\n this.folded = options.folded ?? false;\n host.addController(this);\n }\n\n get item(): T | null {\n return this._error ? null : this._item;\n }\n\n get error(): MissingParentError | null {\n return this._error;\n }\n\n get hasError(): boolean {\n return this._error !== null;\n }\n\n hostConnected(): void {\n this._resolveItemContext();\n }\n\n private _resolveItemContext(): void {\n const event = buildCustomEvent(\n itemContextEventName,\n (item: Record<string, unknown>) => {\n this._item = extractFolded<T>(item, this.folded);\n this._error = null;\n this.host.error = null;\n this.host.requestUpdate();\n }\n );\n\n const canceled = this.host.dispatchEvent(event);\n if (canceled) {\n const elementName = (this.host as Element).nodeName.toLowerCase();\n this._error = new MissingParentError(elementName, this.parentName);\n this._item = null;\n this.host.error = this._error;\n this.host.requestUpdate();\n }\n }\n}\n\ntype ItemContextEventHandler<T> = (item: T) => void;\nexport type ItemContextEvent<T> = CustomEvent<ItemContextEventHandler<T>>;\n","import {closest} from '../../../utils/dom-utils.js';\nimport {buildCustomEvent} from '../../../utils/event-utils.js';\nimport {MissingParentError} from './context/item-context-controller.js';\n\nconst itemContextEventName = 'atomic/resolveResult';\n\ntype ItemContextEventHandler<T> = (item: T) => void;\n\nexport function fetchItemContext<T>(element: Element, parentName: string) {\n return new Promise<T>((resolve, reject) => {\n const event = buildCustomEvent<ItemContextEventHandler<T>>(\n itemContextEventName,\n (item: T) => {\n return resolve(item);\n }\n );\n element.dispatchEvent(event);\n\n if (!closest(element, parentName)) {\n reject(\n new MissingParentError(element.nodeName.toLowerCase(), parentName)\n );\n }\n });\n}\n","import type {Product} from '@coveo/headless/commerce';\nimport {fetchItemContext} from '@/src/components/common/item-list/fetch-item-context';\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This utility function is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the utility function in the [`connectedCallback` lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered `atomic-product`.\n * @returns A promise that resolves on initialization of the parent `atomic-product` element, or rejects when there is no parent `atomic-product` element.\n */\nexport function fetchProductContext<T extends Product>(element: Element) {\n return fetchItemContext<T>(element, 'atomic-product');\n}\n","import {Product} from '@coveo/headless/commerce';\nimport {itemContext} from '@/src/components/common/item-list/stencil-item-decorators';\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This method is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the method in the [`connectedCallback` lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered \"atomic-product\".\n * @returns A promise that resolves on initialization of the parent \"atomic-product\" element, or rejects when there is no parent \"atomic-product\" element.\n *\n * @deprecated should only be used for Stencil components. For Lit components, use `fetchProductContext` from \\@/src/components/commerce/product-template-component-utils/context/fetch-product-context.ts\n */\nexport function productContext<T extends Product>(element: Element) {\n return itemContext<T>(element, 'atomic-product');\n}\n","import type {HTMLStencilElement} from '@stencil/core/internal';\nimport type {LitElement} from 'lit';\nimport {closest} from '../../../utils/dom-utils';\nimport {buildCustomEvent} from '../../../utils/event-utils';\nimport type {AnyBindings} from '../interface/bindings';\nimport type {SearchBoxSuggestionsEvent} from './suggestions-types';\n\n/**\n * Dispatches an event which retrieves the `SearchBoxSuggestionsBindings` on a configured parent search box.\n *\n * @param event Event sent from the registered query suggestions to the parent search box\n * @param element Element on which to dispatch the event, which must be the child of a configured search box\n * @param allowedSearchBoxElements Optional array of allowed search box element selectors\n *\n * @throws Error if the element is not a child of an allowed search box element\n */\nexport const dispatchSearchBoxSuggestionsEvent = <\n SearchBoxController,\n Bindings = AnyBindings,\n>(\n event: SearchBoxSuggestionsEvent<SearchBoxController, Bindings>,\n element: HTMLElement,\n allowedSearchBoxElements: readonly (typeof searchBoxElements)[number][] = searchBoxElements\n) => {\n const interfaceElement = closest(element, searchBoxElements.join(', '));\n if (!interfaceElement) {\n throw new Error(\n `The \"${element.nodeName.toLowerCase()}\" component was not handled, as it is not a child of the following elements: ${allowedSearchBoxElements.join(\n ', '\n )}`\n );\n }\n void dispatchSearchBoxSuggestionsEventEventually(\n interfaceElement,\n element,\n event\n );\n};\n\nconst searchBoxElements = [\n 'atomic-search-box',\n 'atomic-insight-search-box',\n 'atomic-commerce-search-box',\n] as const;\n\nconst isLitElementLoosely = (candidate: unknown): candidate is LitElement =>\n 'updateComplete' in (candidate as LitElement) &&\n (candidate as LitElement).updateComplete instanceof Promise;\n\nconst dispatchSearchBoxSuggestionsEventEventually = async <\n SearchBoxController,\n Bindings = AnyBindings,\n>(\n interfaceElement: Element,\n element: HTMLElement,\n event: SearchBoxSuggestionsEvent<SearchBoxController, Bindings>\n) => {\n await customElements.whenDefined(interfaceElement.nodeName.toLowerCase());\n if (isLitElementLoosely(interfaceElement)) {\n await interfaceElement.updateComplete;\n } else if ('componentOnReady' in interfaceElement) {\n await (interfaceElement as HTMLStencilElement).componentOnReady();\n }\n element.dispatchEvent(\n buildCustomEvent('atomic/searchBoxSuggestion/register', event)\n );\n};\n","import type {SearchBoxSuggestionElement} from './suggestions-types';\n\n/**\n * Checks if a search box suggestion element has no query.\n *\n * @param el - The search box suggestion element to check\n * @returns True if the element has no query or the query is whitespace-only\n */\nexport function elementHasNoQuery(el: SearchBoxSuggestionElement): boolean {\n return !el.query || el.query.trim() === '';\n}\n\n/**\n * Checks if a search box suggestion element has a query.\n *\n * @param el - The search box suggestion element to check\n * @returns True if the element has a non-empty, non-whitespace query\n */\nexport function elementHasQuery(el: SearchBoxSuggestionElement): boolean {\n return !!el.query && el.query.trim() !== '';\n}\n","import {\n buildInteractiveResult,\n type Result,\n ResultTemplatesHelpers,\n type SearchEngine,\n} from '@coveo/headless';\nimport type {RecsBindings} from '../components/recommendations/atomic-recs-interface/interfaces';\nimport type {Bindings} from '../components/search/atomic-search-interface/atomic-search-interface';\nimport {readFromObject} from './object-utils';\n\n/**\n * Binds the logging of document\n * @returns An unbind function for the events\n * @param engine A headless search engine instance.\n * @param result The result object\n * @param resultElement Parent result element\n * @param selector Optional. Css selector that selects all links to the document. Default: \"a\" tags with the clickUri as \"href\" parameter.\n */\nexport function bindLogDocumentOpenOnResult(\n engine: SearchEngine,\n result: Result,\n resultElement: Element | ShadowRoot,\n selector?: string\n) {\n const interactiveResult = buildInteractiveResult(engine, {\n options: {result},\n });\n\n const eventsMap: Record<string, EventListenerOrEventListenerObject> = {\n contextmenu: () => interactiveResult.select(),\n click: () => interactiveResult.select(),\n mouseup: () => interactiveResult.select(),\n mousedown: () => interactiveResult.select(),\n touchstart: () => interactiveResult.beginDelayedSelect(),\n touchend: () => interactiveResult.cancelPendingSelect(),\n };\n const elements = resultElement.querySelectorAll(selector || 'a');\n\n elements.forEach((element) => {\n Object.keys(eventsMap).forEach((key) =>\n element.addEventListener(key, eventsMap[key])\n );\n });\n\n return () => {\n elements.forEach((element) => {\n Object.keys(eventsMap).forEach((key) =>\n element.removeEventListener(key, eventsMap[key])\n );\n });\n };\n}\n\nexport function buildStringTemplateFromResult(\n template: string,\n result: Result,\n bindings: Bindings | RecsBindings\n) {\n return template.replace(/\\${(.*?)}/g, (value: string) => {\n const key = value.substring(2, value.length - 1);\n let newValue = readFromObject(result, key);\n if (!newValue && typeof window !== 'undefined') {\n newValue = readFromObject(window, key);\n }\n\n if (!newValue) {\n bindings.engine.logger.warn(\n `${key} used in the href template is undefined for this result: ${result.uniqueId} and could not be found in the window object.`\n );\n return '';\n }\n\n return newValue;\n });\n}\n\nexport function getStringValueFromResultOrNull(result: Result, field: string) {\n const value = ResultTemplatesHelpers.getResultProperty(result, field);\n\n if (typeof value !== 'string' || value.trim() === '') {\n return null;\n }\n\n return value;\n}\n"],"version":3}
1
+ {"file":"index.js","mappings":"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","names":[],"sources":["src/components/common/item-list/context/item-context-controller.ts","src/components/common/item-list/fetch-item-context.ts","src/components/commerce/product-template-component-utils/context/fetch-product-context.ts","src/components/commerce/product-template-component-utils/context/stencil-product-template-decorators.tsx","src/components/common/suggestions/suggestions-events.ts","src/components/common/suggestions/suggestions-utils.ts","src/utils/result-utils.ts"],"sourcesContent":["import type {LitElement, ReactiveController, ReactiveControllerHost} from 'lit';\nimport type {InitializableComponent} from '@/src/decorators/types.js';\nimport {buildCustomEvent} from '@/src/utils/event-utils';\n\ntype LitElementWithError = Omit<\n Pick<InitializableComponent, 'error'>,\n 'error'\n> &\n LitElement & {\n error: Error | null;\n };\n\nconst itemContextEventName = 'atomic/resolveResult';\n\nexport class MissingParentError extends Error {\n constructor(elementName: string, parentName: string) {\n super(\n `The \"${elementName}\" element must be the child of an \"${parentName}\" element.`\n );\n }\n}\n\nfunction extractFolded<T = Record<string, unknown>>(\n item: Record<string, unknown>,\n returnFolded: boolean\n): T {\n if (returnFolded) {\n if ('children' in item) {\n return item as T;\n } else {\n return {children: [], result: item} as T;\n }\n }\n\n if ('children' in item && 'result' in item) {\n return item.result as T;\n }\n return item as T;\n}\n\n/**\n * A reactive controller that manages item context data from parent components.\n * Handles fetching item data via custom events and manages error states.\n */\nexport class ItemContextController<T = Record<string, unknown>>\n implements ReactiveController\n{\n private host: ReactiveControllerHost & LitElementWithError;\n private parentName: string;\n private folded: boolean;\n private _item: T | null = null;\n private _error: MissingParentError | null = null;\n\n constructor(\n host: ReactiveControllerHost & LitElementWithError,\n options: {parentName?: string; folded?: boolean} = {}\n ) {\n this.host = host;\n this.parentName = options.parentName ?? 'atomic-result';\n this.folded = options.folded ?? false;\n host.addController(this);\n }\n\n get item(): T | null {\n return this._error ? null : this._item;\n }\n\n get error(): MissingParentError | null {\n return this._error;\n }\n\n get hasError(): boolean {\n return this._error !== null;\n }\n\n hostConnected(): void {\n this._resolveItemContext();\n }\n\n private _resolveItemContext(): void {\n const event = buildCustomEvent(\n itemContextEventName,\n (item: Record<string, unknown>) => {\n this._item = extractFolded<T>(item, this.folded);\n this._error = null;\n this.host.error = null;\n this.host.requestUpdate();\n }\n );\n\n const canceled = this.host.dispatchEvent(event);\n if (canceled) {\n const elementName = (this.host as Element).nodeName.toLowerCase();\n this._error = new MissingParentError(elementName, this.parentName);\n this._item = null;\n this.host.error = this._error;\n this.host.requestUpdate();\n }\n }\n}\n\ntype ItemContextEventHandler<T> = (item: T) => void;\nexport type ItemContextEvent<T> = CustomEvent<ItemContextEventHandler<T>>;\n","import {closest} from '../../../utils/dom-utils.js';\nimport {buildCustomEvent} from '../../../utils/event-utils.js';\nimport {MissingParentError} from './context/item-context-controller.js';\n\nconst itemContextEventName = 'atomic/resolveResult';\n\ntype ItemContextEventHandler<T> = (item: T) => void;\n\nexport function fetchItemContext<T>(element: Element, parentName: string) {\n return new Promise<T>((resolve, reject) => {\n const event = buildCustomEvent<ItemContextEventHandler<T>>(\n itemContextEventName,\n (item: T) => {\n return resolve(item);\n }\n );\n element.dispatchEvent(event);\n\n if (!closest(element, parentName)) {\n reject(\n new MissingParentError(element.nodeName.toLowerCase(), parentName)\n );\n }\n });\n}\n","import type {Product} from '@coveo/headless/commerce';\nimport {fetchItemContext} from '@/src/components/common/item-list/fetch-item-context';\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This utility function is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the utility function in the [`connectedCallback` lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered `atomic-product`.\n * @returns A promise that resolves on initialization of the parent `atomic-product` element, or rejects when there is no parent `atomic-product` element.\n */\nexport function fetchProductContext<T extends Product>(element: Element) {\n return fetchItemContext<T>(element, 'atomic-product');\n}\n","import {Product} from '@coveo/headless/commerce';\nimport {itemContext} from '@/src/components/common/item-list/stencil-item-decorators';\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This method is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the method in the [`connectedCallback` lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered \"atomic-product\".\n * @returns A promise that resolves on initialization of the parent \"atomic-product\" element, or rejects when there is no parent \"atomic-product\" element.\n *\n * @deprecated should only be used for Stencil components. For Lit components, use `fetchProductContext` from \\@/src/components/commerce/product-template-component-utils/context/fetch-product-context.ts\n */\nexport function productContext<T extends Product>(element: Element) {\n return itemContext<T>(element, 'atomic-product');\n}\n","import type {HTMLStencilElement} from '@stencil/core/internal';\nimport type {LitElement} from 'lit';\nimport {closest} from '../../../utils/dom-utils';\nimport {buildCustomEvent} from '../../../utils/event-utils';\nimport type {AnyBindings} from '../interface/bindings';\nimport type {SearchBoxSuggestionsEvent} from './suggestions-types';\n\n/**\n * Dispatches an event which retrieves the `SearchBoxSuggestionsBindings` on a configured parent search box.\n *\n * @param event Event sent from the registered query suggestions to the parent search box\n * @param element Element on which to dispatch the event, which must be the child of a configured search box\n * @param allowedSearchBoxElements Optional array of allowed search box element selectors\n *\n * @throws Error if the element is not a child of an allowed search box element\n */\nexport const dispatchSearchBoxSuggestionsEvent = <\n SearchBoxController,\n Bindings = AnyBindings,\n>(\n event: SearchBoxSuggestionsEvent<SearchBoxController, Bindings>,\n element: HTMLElement,\n allowedSearchBoxElements: readonly (typeof searchBoxElements)[number][] = searchBoxElements\n) => {\n const interfaceElement = closest(element, searchBoxElements.join(', '));\n if (!interfaceElement) {\n throw new Error(\n `The \"${element.nodeName.toLowerCase()}\" component was not handled, as it is not a child of the following elements: ${allowedSearchBoxElements.join(\n ', '\n )}`\n );\n }\n void dispatchSearchBoxSuggestionsEventEventually(\n interfaceElement,\n element,\n event\n );\n};\n\nconst searchBoxElements = [\n 'atomic-search-box',\n 'atomic-insight-search-box',\n 'atomic-commerce-search-box',\n] as const;\n\nconst isLitElementLoosely = (candidate: unknown): candidate is LitElement =>\n 'updateComplete' in (candidate as LitElement) &&\n (candidate as LitElement).updateComplete instanceof Promise;\n\nconst dispatchSearchBoxSuggestionsEventEventually = async <\n SearchBoxController,\n Bindings = AnyBindings,\n>(\n interfaceElement: Element,\n element: HTMLElement,\n event: SearchBoxSuggestionsEvent<SearchBoxController, Bindings>\n) => {\n await customElements.whenDefined(interfaceElement.nodeName.toLowerCase());\n if (isLitElementLoosely(interfaceElement)) {\n await interfaceElement.updateComplete;\n } else if ('componentOnReady' in interfaceElement) {\n await (interfaceElement as HTMLStencilElement).componentOnReady();\n }\n element.dispatchEvent(\n buildCustomEvent('atomic/searchBoxSuggestion/register', event)\n );\n};\n","import type {SearchBoxSuggestionElement} from './suggestions-types';\n\n/**\n * Checks if a search box suggestion element has no query.\n *\n * @param el - The search box suggestion element to check\n * @returns True if the element has no query or the query is whitespace-only\n */\nexport function elementHasNoQuery(el: SearchBoxSuggestionElement): boolean {\n return !el.query || el.query.trim() === '';\n}\n\n/**\n * Checks if a search box suggestion element has a query.\n *\n * @param el - The search box suggestion element to check\n * @returns True if the element has a non-empty, non-whitespace query\n */\nexport function elementHasQuery(el: SearchBoxSuggestionElement): boolean {\n return !!el.query && el.query.trim() !== '';\n}\n","import {\n buildInteractiveResult,\n type Result,\n ResultTemplatesHelpers,\n type SearchEngine,\n} from '@coveo/headless';\nimport type {RecsBindings} from '../components/recommendations/atomic-recs-interface/interfaces';\nimport type {Bindings} from '../components/search/atomic-search-interface/atomic-search-interface';\nimport {readFromObject} from './object-utils';\n\n/**\n * Binds the logging of document\n * @returns An unbind function for the events\n * @param engine A headless search engine instance.\n * @param result The result object\n * @param resultElement Parent result element\n * @param selector Optional. Css selector that selects all links to the document. Default: \"a\" tags with the clickUri as \"href\" parameter.\n */\nexport function bindLogDocumentOpenOnResult(\n engine: SearchEngine,\n result: Result,\n resultElement: Element | ShadowRoot,\n selector?: string\n) {\n const interactiveResult = buildInteractiveResult(engine, {\n options: {result},\n });\n\n const eventsMap: Record<string, EventListenerOrEventListenerObject> = {\n contextmenu: () => interactiveResult.select(),\n click: () => interactiveResult.select(),\n mouseup: () => interactiveResult.select(),\n mousedown: () => interactiveResult.select(),\n touchstart: () => interactiveResult.beginDelayedSelect(),\n touchend: () => interactiveResult.cancelPendingSelect(),\n };\n const elements = resultElement.querySelectorAll(selector || 'a');\n\n elements.forEach((element) => {\n Object.keys(eventsMap).forEach((key) =>\n element.addEventListener(key, eventsMap[key])\n );\n });\n\n return () => {\n elements.forEach((element) => {\n Object.keys(eventsMap).forEach((key) =>\n element.removeEventListener(key, eventsMap[key])\n );\n });\n };\n}\n\nexport function buildStringTemplateFromResult(\n template: string,\n result: Result,\n bindings: Bindings | RecsBindings\n) {\n return template.replace(/\\${(.*?)}/g, (value: string) => {\n const key = value.substring(2, value.length - 1);\n let newValue = readFromObject(result, key);\n if (!newValue && typeof window !== 'undefined') {\n newValue = readFromObject(window, key);\n }\n\n if (!newValue) {\n bindings.engine.logger.warn(\n `${key} used in the href template is undefined for this result: ${result.uniqueId} and could not be found in the window object.`\n );\n return '';\n }\n\n return newValue;\n });\n}\n\nexport function getStringValueFromResultOrNull(result: Result, field: string) {\n const value = ResultTemplatesHelpers.getResultProperty(result, field);\n\n if (typeof value !== 'string' || value.trim() === '') {\n return null;\n }\n\n return value;\n}\n"],"version":3}