@coveo/atomic 3.33.8-pre.52109a8c79 → 3.33.8-pre.5b06866794

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 (209) hide show
  1. package/dist/atomic/_atomic.esm.js +1 -1
  2. package/dist/atomic/atomic.esm.js.map +1 -1
  3. package/dist/atomic/components/_index.d.ts +2 -2
  4. package/dist/atomic/components/_index.js +3 -2
  5. package/dist/atomic/components/analytics-config.js +1 -1
  6. package/dist/atomic/components/atomic-insight-history-toggle.js +2 -2
  7. package/dist/atomic/components/atomic-insight-history-toggle.js.map +1 -1
  8. package/dist/atomic/components/atomic-insight-search-box.js +5 -33
  9. package/dist/atomic/components/atomic-insight-search-box.js.map +1 -1
  10. package/dist/atomic/components/atomic-insight-user-actions-toggle.js +2 -2
  11. package/dist/atomic/components/atomic-insight-user-actions-toggle.js.map +1 -1
  12. package/dist/atomic/components/atomic-search-box-instant-results.js +2 -2
  13. package/dist/atomic/components/atomic-search-box-instant-results.js.map +1 -1
  14. package/dist/atomic/components/atomic-search-box-query-suggestions.d.ts +11 -0
  15. package/dist/atomic/components/atomic-search-box-query-suggestions.js +8 -0
  16. package/dist/atomic/components/atomic-search-box-query-suggestions.js.map +1 -0
  17. package/dist/atomic/components/atomic-search-box-query-suggestions2.js +89 -0
  18. package/dist/atomic/components/atomic-search-box-query-suggestions2.js.map +1 -0
  19. package/dist/atomic/components/atomic-search-box.js +8 -9
  20. package/dist/atomic/components/atomic-search-box.js.map +1 -1
  21. package/dist/atomic/components/atomic-suggestion-renderer2.js +1 -1
  22. package/dist/atomic/components/atomic-suggestion-renderer2.js.map +1 -1
  23. package/dist/atomic/components/clock.js +2 -2
  24. package/dist/atomic/components/components/commerce/atomic-commerce-breadbox/atomic-commerce-breadbox.js +18 -11
  25. package/dist/atomic/components/components/commerce/atomic-commerce-interface/atomic-commerce-interface.js +2 -7
  26. package/dist/atomic/components/components/commerce/atomic-commerce-layout/atomic-commerce-layout.js +19 -10
  27. package/dist/atomic/components/components/commerce/atomic-commerce-search-box/atomic-commerce-search-box.js +1 -1
  28. package/dist/atomic/components/components/commerce/atomic-commerce-search-box-instant-products/atomic-commerce-search-box-instant-products.js +1 -1
  29. package/dist/atomic/components/components/commerce/atomic-commerce-search-box-query-suggestions/atomic-commerce-search-box-query-suggestions.js +1 -1
  30. package/dist/atomic/components/components/commerce/atomic-commerce-search-box-recent-queries/atomic-commerce-search-box-recent-queries.js +1 -1
  31. package/dist/atomic/components/components/common/layout/layout-styles-controller.js +40 -0
  32. package/dist/atomic/components/components/common/layout/mobile-breakpoint-controller.js +26 -0
  33. package/dist/atomic/components/components/common/suggestions/suggestion-manager.js +1 -1
  34. package/dist/atomic/components/components/common/suggestions/{suggestions-common.js → suggestions-events.js} +16 -18
  35. package/dist/atomic/components/components/common/suggestions/suggestions-types.js +1 -0
  36. package/dist/atomic/components/components/common/suggestions/suggestions-utils.js +18 -0
  37. package/dist/atomic/components/components/search/atomic-search-box-recent-queries/atomic-search-box-recent-queries.js +137 -0
  38. package/dist/atomic/components/components/search/index.js +1 -1
  39. package/dist/atomic/components/components/search/lazy-index.js +1 -1
  40. package/dist/atomic/components/global/environment.js +1 -1
  41. package/dist/atomic/components/index.js.map +1 -1
  42. package/dist/atomic/components/stencil-query-suggestions.js +33 -0
  43. package/dist/atomic/components/stencil-query-suggestions.js.map +1 -0
  44. package/dist/atomic/components/stencil-suggestion-manager.js +20 -2
  45. package/dist/atomic/components/stencil-suggestion-manager.js.map +1 -1
  46. package/dist/atomic/components/{suggestions-common.js → suggestions-events.js} +18 -20
  47. package/dist/atomic/components/suggestions-events.js.map +1 -0
  48. package/dist/atomic/index.esm.js +1 -1
  49. package/dist/atomic/index.esm.js.map +1 -1
  50. package/dist/atomic/{p-ab7c83d8.entry.js → p-03addf89.entry.js} +2 -2
  51. package/dist/atomic/p-0a051b8d.js +2 -0
  52. package/dist/atomic/p-0a051b8d.js.map +1 -0
  53. package/dist/atomic/p-16f4ce98.js +2 -0
  54. package/dist/atomic/p-16f4ce98.js.map +1 -0
  55. package/dist/atomic/p-26a51a77.entry.js +2 -0
  56. package/dist/atomic/p-26a51a77.entry.js.map +1 -0
  57. package/dist/atomic/p-2e9db4ca.entry.js +2 -0
  58. package/dist/atomic/p-2e9db4ca.entry.js.map +1 -0
  59. package/dist/atomic/{p-6b3c4d63.entry.js → p-3213157f.entry.js} +2 -2
  60. package/dist/atomic/p-4b7a19db.js +2 -0
  61. package/dist/atomic/p-4b7a19db.js.map +1 -0
  62. package/dist/atomic/{p-b5dd6399.entry.js → p-5210f9a9.entry.js} +2 -2
  63. package/dist/atomic/{p-6e6d686e.entry.js → p-7383fd32.entry.js} +2 -2
  64. package/dist/atomic/{p-3a53ad44.js → p-a2a9c37a.js} +2 -2
  65. package/dist/atomic/p-af93b44c.js +2 -0
  66. package/dist/atomic/p-af93b44c.js.map +1 -0
  67. package/dist/atomic/{p-6329ff94.entry.js → p-ba4bf29f.entry.js} +2 -2
  68. package/dist/atomic/{p-3d847e45.entry.js → p-c88a3d2d.entry.js} +2 -2
  69. package/dist/atomic/p-c88a3d2d.entry.js.map +1 -0
  70. package/dist/atomic/{p-36e71b99.entry.js → p-d0f47b33.entry.js} +2 -2
  71. package/dist/atomic/p-d0f47b33.entry.js.map +1 -0
  72. package/dist/atomic/{p-c280cd05.js → p-e1cc5150.js} +1 -1
  73. package/dist/atomic/{p-aa4224ea.entry.js → p-fbfe913d.entry.js} +2 -2
  74. package/dist/atomic/p-fbfe913d.entry.js.map +1 -0
  75. package/dist/cjs/_index.cjs.js +5 -2
  76. package/dist/cjs/_loader.cjs.js +1 -1
  77. package/dist/cjs/{analytics-config-41fc74af.js → analytics-config-9b1760f9.js} +2 -2
  78. package/dist/cjs/{analytics-config-41fc74af.js.map → analytics-config-9b1760f9.js.map} +1 -1
  79. package/dist/cjs/atomic-insight-history-toggle.cjs.entry.js +2 -2
  80. package/dist/cjs/atomic-insight-history-toggle.cjs.entry.js.map +1 -1
  81. package/dist/cjs/atomic-insight-interface.cjs.entry.js +1 -1
  82. package/dist/cjs/atomic-insight-search-box.cjs.entry.js +9 -35
  83. package/dist/cjs/atomic-insight-search-box.cjs.entry.js.map +1 -1
  84. package/dist/cjs/atomic-insight-user-actions-toggle.cjs.entry.js +2 -2
  85. package/dist/cjs/atomic-insight-user-actions-toggle.cjs.entry.js.map +1 -1
  86. package/dist/cjs/atomic-recs-interface.cjs.entry.js +1 -1
  87. package/dist/cjs/atomic-search-box-instant-results.cjs.entry.js +3 -3
  88. package/dist/cjs/atomic-search-box-instant-results.cjs.entry.js.map +1 -1
  89. package/dist/cjs/atomic-search-box-query-suggestions.cjs.entry.js +76 -0
  90. package/dist/cjs/atomic-search-box-query-suggestions.cjs.entry.js.map +1 -0
  91. package/dist/cjs/atomic-search-box.cjs.entry.js +7 -7
  92. package/dist/cjs/atomic-search-box.cjs.entry.js.map +1 -1
  93. package/dist/cjs/atomic-search-interface.cjs.entry.js +1 -1
  94. package/dist/cjs/atomic-suggestion-renderer.cjs.entry.js +1 -1
  95. package/dist/cjs/atomic-suggestion-renderer.cjs.entry.js.map +1 -1
  96. package/dist/cjs/atomic.cjs.js +1 -1
  97. package/dist/cjs/clock-7aeb19d0.js +7 -0
  98. package/dist/cjs/clock-7aeb19d0.js.map +1 -0
  99. package/dist/cjs/index-757bc886.js +2 -2
  100. package/dist/cjs/index.cjs.js.map +1 -1
  101. package/dist/cjs/stencil-query-suggestions-03268ecc.js +38 -0
  102. package/dist/cjs/stencil-query-suggestions-03268ecc.js.map +1 -0
  103. package/dist/cjs/{stencil-suggestion-manager-c0878ef2.js → stencil-suggestion-manager-2cba6d69.js} +4 -4
  104. package/dist/cjs/{stencil-suggestion-manager-c0878ef2.js.map → stencil-suggestion-manager-2cba6d69.js.map} +1 -1
  105. package/dist/cjs/{suggestions-common-5097a362.js → suggestions-events-63dd0640.js} +17 -21
  106. package/dist/cjs/suggestions-events-63dd0640.js.map +1 -0
  107. package/dist/cjs/suggestions-utils-61000808.js +25 -0
  108. package/dist/cjs/suggestions-utils-61000808.js.map +1 -0
  109. package/dist/cjs/version.cjs.js +2 -2
  110. package/dist/esm/_index.js +2 -1
  111. package/dist/esm/_loader.js +1 -1
  112. package/dist/esm/{analytics-config-c1cef549.js → analytics-config-43504b5c.js} +2 -2
  113. package/dist/esm/{analytics-config-c1cef549.js.map → analytics-config-43504b5c.js.map} +1 -1
  114. package/dist/esm/atomic-insight-history-toggle.entry.js +2 -2
  115. package/dist/esm/atomic-insight-history-toggle.entry.js.map +1 -1
  116. package/dist/esm/atomic-insight-interface.entry.js +1 -1
  117. package/dist/esm/atomic-insight-search-box.entry.js +7 -33
  118. package/dist/esm/atomic-insight-search-box.entry.js.map +1 -1
  119. package/dist/esm/atomic-insight-user-actions-toggle.entry.js +2 -2
  120. package/dist/esm/atomic-insight-user-actions-toggle.entry.js.map +1 -1
  121. package/dist/esm/atomic-recs-interface.entry.js +1 -1
  122. package/dist/esm/atomic-search-box-instant-results.entry.js +2 -2
  123. package/dist/esm/atomic-search-box-instant-results.entry.js.map +1 -1
  124. package/dist/esm/atomic-search-box-query-suggestions.entry.js +72 -0
  125. package/dist/esm/atomic-search-box-query-suggestions.entry.js.map +1 -0
  126. package/dist/esm/atomic-search-box.entry.js +6 -6
  127. package/dist/esm/atomic-search-box.entry.js.map +1 -1
  128. package/dist/esm/atomic-search-interface.entry.js +1 -1
  129. package/dist/esm/atomic-suggestion-renderer.entry.js +1 -1
  130. package/dist/esm/atomic-suggestion-renderer.entry.js.map +1 -1
  131. package/dist/esm/atomic.js +1 -1
  132. package/dist/esm/clock-b1f5d7f7.js +5 -0
  133. package/dist/esm/clock-b1f5d7f7.js.map +1 -0
  134. package/dist/esm/index-3f35faca.js +2 -2
  135. package/dist/esm/index.js.map +1 -1
  136. package/dist/esm/stencil-query-suggestions-5d6a46d7.js +33 -0
  137. package/dist/esm/stencil-query-suggestions-5d6a46d7.js.map +1 -0
  138. package/dist/esm/{stencil-suggestion-manager-486094dd.js → stencil-suggestion-manager-376f83e8.js} +2 -2
  139. package/dist/esm/{stencil-suggestion-manager-486094dd.js.map → stencil-suggestion-manager-376f83e8.js.map} +1 -1
  140. package/dist/esm/{suggestions-common-2b20db26.js → suggestions-events-b7a6f007.js} +18 -20
  141. package/dist/esm/suggestions-events-b7a6f007.js.map +1 -0
  142. package/dist/esm/suggestions-utils-591559a0.js +22 -0
  143. package/dist/esm/suggestions-utils-591559a0.js.map +1 -0
  144. package/dist/esm/version.js +2 -2
  145. package/dist/types/components/commerce/atomic-commerce-breadbox/atomic-commerce-breadbox.d.ts +2 -1
  146. package/dist/types/components/commerce/atomic-commerce-interface/atomic-commerce-interface.d.ts +0 -1
  147. package/dist/types/components/commerce/atomic-commerce-layout/atomic-commerce-layout.d.ts +3 -3
  148. package/dist/types/components/commerce/atomic-commerce-search-box-instant-products/atomic-commerce-search-box-instant-products.d.ts +1 -1
  149. package/dist/types/components/commerce/atomic-commerce-search-box-query-suggestions/atomic-commerce-search-box-query-suggestions.d.ts +1 -1
  150. package/dist/types/components/commerce/atomic-commerce-search-box-recent-queries/atomic-commerce-search-box-recent-queries.d.ts +1 -1
  151. package/dist/types/components/common/atomic-suggestion-renderer/atomic-suggestion-renderer.d.ts +1 -1
  152. package/dist/types/components/common/layout/layout-styles-controller.d.ts +22 -0
  153. package/dist/types/components/common/layout/mobile-breakpoint-controller.d.ts +18 -0
  154. package/dist/types/components/common/suggestions/instant-item.d.ts +1 -1
  155. package/dist/types/components/common/suggestions/query-suggestions.d.ts +1 -1
  156. package/dist/types/components/common/suggestions/recent-queries.d.ts +1 -1
  157. package/dist/types/components/common/suggestions/stencil-instant-item.d.ts +1 -1
  158. package/dist/types/components/common/suggestions/stencil-query-suggestions.d.ts +1 -1
  159. package/dist/types/components/common/suggestions/stencil-recent-queries.d.ts +1 -1
  160. package/dist/types/components/common/suggestions/stencil-suggestion-manager.d.ts +1 -1
  161. package/dist/types/components/common/suggestions/suggestion-manager.d.ts +1 -1
  162. package/dist/types/components/common/suggestions/suggestions-events.d.ts +14 -0
  163. package/dist/types/components/common/suggestions/{suggestions-common.d.ts → suggestions-types.d.ts} +6 -16
  164. package/dist/types/components/common/suggestions/suggestions-utils.d.ts +15 -0
  165. package/dist/types/components/search/atomic-search-box/atomic-search-box.d.ts +1 -1
  166. package/dist/types/components/search/{atomic-search-box-query-suggestions/atomic-search-box-query-suggestions.d.ts → atomic-search-box-recent-queries/atomic-search-box-recent-queries.d.ts} +15 -8
  167. package/dist/types/components/search/index.d.ts +1 -1
  168. package/dist/types/components/search/search-box-suggestions/atomic-search-box-instant-results/atomic-search-box-instant-results.d.ts +1 -1
  169. package/dist/types/components/search/search-box-suggestions/{atomic-search-box-recent-queries/atomic-search-box-recent-queries.d.ts → atomic-search-box-query-suggestions/atomic-search-box-query-suggestions.d.ts} +3 -11
  170. package/dist/types/components.d.ts +16 -16
  171. package/dist/types/decorators/types.d.ts +1 -1
  172. package/dist/types/index.d.ts +3 -1
  173. package/docs/atomic-docs.json +15 -13
  174. package/package.json +3 -3
  175. package/dist/atomic/components/atomic-search-box-recent-queries.d.ts +0 -11
  176. package/dist/atomic/components/atomic-search-box-recent-queries.js +0 -8
  177. package/dist/atomic/components/atomic-search-box-recent-queries.js.map +0 -1
  178. package/dist/atomic/components/atomic-search-box-recent-queries2.js +0 -183
  179. package/dist/atomic/components/atomic-search-box-recent-queries2.js.map +0 -1
  180. package/dist/atomic/components/components/search/atomic-search-box-query-suggestions/atomic-search-box-query-suggestions.js +0 -118
  181. package/dist/atomic/components/suggestions-common.js.map +0 -1
  182. package/dist/atomic/p-29fd6768.js +0 -2
  183. package/dist/atomic/p-29fd6768.js.map +0 -1
  184. package/dist/atomic/p-36e71b99.entry.js.map +0 -1
  185. package/dist/atomic/p-3d847e45.entry.js.map +0 -1
  186. package/dist/atomic/p-7601c3de.js +0 -2
  187. package/dist/atomic/p-7601c3de.js.map +0 -1
  188. package/dist/atomic/p-a1333787.entry.js +0 -2
  189. package/dist/atomic/p-a1333787.entry.js.map +0 -1
  190. package/dist/atomic/p-a468ba8e.entry.js +0 -2
  191. package/dist/atomic/p-a468ba8e.entry.js.map +0 -1
  192. package/dist/atomic/p-aa4224ea.entry.js.map +0 -1
  193. package/dist/cjs/atomic-search-box-recent-queries.cjs.entry.js +0 -171
  194. package/dist/cjs/atomic-search-box-recent-queries.cjs.entry.js.map +0 -1
  195. package/dist/cjs/clock-f03ff827.js +0 -7
  196. package/dist/cjs/clock-f03ff827.js.map +0 -1
  197. package/dist/cjs/suggestions-common-5097a362.js.map +0 -1
  198. package/dist/esm/atomic-search-box-recent-queries.entry.js +0 -167
  199. package/dist/esm/atomic-search-box-recent-queries.entry.js.map +0 -1
  200. package/dist/esm/clock-add3e9a5.js +0 -5
  201. package/dist/esm/clock-add3e9a5.js.map +0 -1
  202. package/dist/esm/suggestions-common-2b20db26.js.map +0 -1
  203. /package/dist/atomic/{p-ab7c83d8.entry.js.map → p-03addf89.entry.js.map} +0 -0
  204. /package/dist/atomic/{p-6b3c4d63.entry.js.map → p-3213157f.entry.js.map} +0 -0
  205. /package/dist/atomic/{p-b5dd6399.entry.js.map → p-5210f9a9.entry.js.map} +0 -0
  206. /package/dist/atomic/{p-6e6d686e.entry.js.map → p-7383fd32.entry.js.map} +0 -0
  207. /package/dist/atomic/{p-3a53ad44.js.map → p-a2a9c37a.js.map} +0 -0
  208. /package/dist/atomic/{p-6329ff94.entry.js.map → p-ba4bf29f.entry.js.map} +0 -0
  209. /package/dist/atomic/{p-c280cd05.js.map → p-e1cc5150.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2025-09-24T16:02:31",
2
+ "timestamp": "2025-09-26T16:00:04",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.20.0",
@@ -12480,12 +12480,12 @@
12480
12480
  "dependents": [],
12481
12481
  "dependencies": [
12482
12482
  "atomic-suggestion-renderer",
12483
- "atomic-search-box-recent-queries"
12483
+ "atomic-search-box-query-suggestions"
12484
12484
  ],
12485
12485
  "dependencyGraph": {
12486
12486
  "atomic-search-box": [
12487
12487
  "atomic-suggestion-renderer",
12488
- "atomic-search-box-recent-queries"
12488
+ "atomic-search-box-query-suggestions"
12489
12489
  ]
12490
12490
  }
12491
12491
  },
@@ -12707,10 +12707,10 @@
12707
12707
  }
12708
12708
  },
12709
12709
  {
12710
- "filePath": "src/components/search/search-box-suggestions/atomic-search-box-recent-queries/atomic-search-box-recent-queries.tsx",
12710
+ "filePath": "src/components/search/search-box-suggestions/atomic-search-box-query-suggestions/atomic-search-box-query-suggestions.tsx",
12711
12711
  "encapsulation": "shadow",
12712
- "tag": "atomic-search-box-recent-queries",
12713
- "docs": "The `atomic-search-box-recent-queries` component can be added as a child of an `atomic-search-box` component, allowing for the configuration of recent query suggestions.",
12712
+ "tag": "atomic-search-box-query-suggestions",
12713
+ "docs": "The `atomic-search-box-query-suggestions` component can be added as a child of an `atomic-search-box` component, allowing for the configuration of query suggestion behavior.",
12714
12714
  "docsTags": [],
12715
12715
  "usage": {},
12716
12716
  "props": [
@@ -12740,10 +12740,10 @@
12740
12740
  },
12741
12741
  {
12742
12742
  "name": "maxWithQuery",
12743
- "type": "number",
12743
+ "type": "number | undefined",
12744
12744
  "complexType": {
12745
12745
  "original": "number",
12746
- "resolved": "number",
12746
+ "resolved": "number | undefined",
12747
12747
  "references": {}
12748
12748
  },
12749
12749
  "mutable": false,
@@ -12751,13 +12751,15 @@
12751
12751
  "reflectToAttr": true,
12752
12752
  "docs": "The maximum number of suggestions that will be displayed if the user has typed something into the input field.",
12753
12753
  "docsTags": [],
12754
- "default": "3",
12755
12754
  "values": [
12756
12755
  {
12757
12756
  "type": "number"
12757
+ },
12758
+ {
12759
+ "type": "undefined"
12758
12760
  }
12759
12761
  ],
12760
- "optional": false,
12762
+ "optional": true,
12761
12763
  "required": false
12762
12764
  },
12763
12765
  {
@@ -12797,7 +12799,7 @@
12797
12799
  "dependencies": [],
12798
12800
  "dependencyGraph": {
12799
12801
  "atomic-search-box": [
12800
- "atomic-search-box-recent-queries"
12802
+ "atomic-search-box-query-suggestions"
12801
12803
  ]
12802
12804
  }
12803
12805
  },
@@ -15990,10 +15992,10 @@
15990
15992
  "docstring": "",
15991
15993
  "path": "src/components/common/layout/display-options.ts"
15992
15994
  },
15993
- "src/components/common/suggestions/suggestions-common.ts::SearchBoxSuggestionElement": {
15995
+ "src/components/common/suggestions/suggestions-types.ts::SearchBoxSuggestionElement": {
15994
15996
  "declaration": "export interface SearchBoxSuggestionElement {\n /**\n * Stable identity which enables Stencil to reuse DOM elements for better performance.\n * The best way to pick a key is to use a string that uniquely identifies that list item among its siblings (often your data will already have IDs).\n */\n key: string;\n /**\n * Rendered content of the element.\n *\n * @remarks\n * The `VNode` type will be deprecated in v4 as we are detaching from Stencil.\n */\n content: Element | VNode;\n /**\n * Hook called when the selection is selected.\n * @param e DOM event.\n */\n onSelect?(e: Event): void;\n /**\n * The query associated with the suggestion which will replace the query in the search box if the suggestion is selected.\n */\n query?: string;\n /**\n * For improved accessibility, provide this property with additional information.\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label\n */\n ariaLabel?: string;\n /**\n * Adds a specific shadow part attribute that can be selected with the CSS ::part pseudo-element.\n * https://developer.mozilla.org/en-US/docs/Web/CSS/::part\n */\n part?: string;\n /**\n * Hide the suggestion if it's the last in the list.\n */\n hideIfLast?: boolean;\n}",
15995
15997
  "docstring": "Element which will be rendered in the list of suggestions.",
15996
- "path": "src/components/common/suggestions/suggestions-common.ts"
15998
+ "path": "src/components/common/suggestions/suggestions-types.ts"
15997
15999
  },
15998
16000
  "../headless/dist/definitions/index.d.ts::RelativeDateUnit": {
15999
16001
  "declaration": "any",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@coveo/atomic",
3
3
  "type": "module",
4
- "version": "3.33.8-pre.52109a8c79",
4
+ "version": "3.33.8-pre.5b06866794",
5
5
  "description": "A web-component library for building modern UIs interfacing with the Coveo platform",
6
6
  "homepage": "https://docs.coveo.com/en/atomic/latest/",
7
7
  "repository": {
@@ -81,7 +81,7 @@
81
81
  },
82
82
  "dependencies": {
83
83
  "@coveo/bueno": "1.1.2",
84
- "@coveo/headless": "3.31.0",
84
+ "@coveo/headless": "3.31.1-pre.5b06866794",
85
85
  "@lit/context": "1.1.6",
86
86
  "@open-wc/lit-helpers": "0.7.0",
87
87
  "@popperjs/core": "2.11.8",
@@ -153,7 +153,7 @@
153
153
  },
154
154
  "peerDependencies": {
155
155
  "@coveo/bueno": "1.1.2",
156
- "@coveo/headless": "3.31.0",
156
+ "@coveo/headless": "3.31.1-pre.5b06866794",
157
157
  "typescript": ">=5.0.0"
158
158
  },
159
159
  "peerDependenciesMeta": {
@@ -1,11 +0,0 @@
1
- import type { Components, JSX } from "../../types/components";
2
-
3
- interface AtomicSearchBoxRecentQueries extends Components.AtomicSearchBoxRecentQueries, HTMLElement {}
4
- export const AtomicSearchBoxRecentQueries: {
5
- prototype: AtomicSearchBoxRecentQueries;
6
- new (): AtomicSearchBoxRecentQueries;
7
- };
8
- /**
9
- * Used to define this component and all nested components recursively.
10
- */
11
- export const defineCustomElement: () => void;
@@ -1,8 +0,0 @@
1
- import { A as AtomicSearchBoxRecentQueries$1, d as defineCustomElement$1 } from './atomic-search-box-recent-queries2.js';
2
-
3
- const AtomicSearchBoxRecentQueries = AtomicSearchBoxRecentQueries$1;
4
- const defineCustomElement = defineCustomElement$1;
5
-
6
- export { AtomicSearchBoxRecentQueries, defineCustomElement };
7
-
8
- //# sourceMappingURL=atomic-search-box-recent-queries.js.map
@@ -1 +0,0 @@
1
- {"file":"atomic-search-box-recent-queries.js","mappings":";;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
@@ -1,183 +0,0 @@
1
- import { h, proxyCustomElement, HTMLElement } from '@stencil/core/internal/client';
2
- import { HighlightUtils, buildRecentQueriesList } from '@coveo/headless';
3
- import { C as Clock } from './clock.js';
4
- import { a as SafeStorage, S as StorageItems } from './local-storage-utils.js';
5
- import { o as once } from './utils.js';
6
- import { e as encodeForDomAttribute } from './string-utils.js';
7
- import { d as dispatchSearchBoxSuggestionsEvent } from './suggestions-common.js';
8
-
9
- const getPartialRecentQueryElement = (value, i18n) => {
10
- return {
11
- part: 'recent-query-item',
12
- query: value,
13
- key: `recent-${encodeForDomAttribute(value)}`,
14
- ariaLabel: i18n.t('recent-query-suggestion-label', {
15
- query: value,
16
- interpolation: { escapeValue: false },
17
- }),
18
- };
19
- };
20
- const getPartialRecentQueryClearElement = (i18n) => {
21
- return {
22
- key: 'recent-query-clear',
23
- ariaLabel: i18n.t('clear-recent-searches', {
24
- interpolation: { escapeValue: false },
25
- }),
26
- part: 'recent-query-title-item suggestion-divider',
27
- hideIfLast: true,
28
- };
29
- };
30
- const RecentQueriesContainer = (_, children) => {
31
- return (h("div", { part: "recent-query-content", class: "flex items-center text-left break-all" }, children));
32
- };
33
- const RecentQueryIcon = ({ icon, }) => {
34
- return (h("atomic-icon", { part: "recent-query-icon", icon: icon, class: "mr-2 h-4 w-4 shrink-0" }));
35
- };
36
- const RecentQueryText = ({ query, value, }) => {
37
- if (query === '') {
38
- return (h("span", { part: "recent-query-text", class: "line-clamp-2 break-all" }, value));
39
- }
40
- return (h("span", { part: "recent-query-text", class: "line-clamp-2 break-all", innerHTML: HighlightUtils.highlightString({
41
- content: value,
42
- openingDelimiter: '<span part="recent-query-text-highlight" class="font-bold">',
43
- closingDelimiter: '</span>',
44
- highlights: [
45
- {
46
- offset: query.length,
47
- length: value.length - query.length,
48
- },
49
- ],
50
- }) }));
51
- };
52
- const RecentQueryClear = ({ i18n, }) => {
53
- return (h("div", { part: "recent-query-title-content", class: "flex w-full justify-between" },
54
- h("span", { class: "font-bold", part: "recent-query-title" }, i18n.t('recent-searches')),
55
- h("span", { part: "recent-query-clear" }, i18n.t('clear'))));
56
- };
57
-
58
- const AtomicSearchBoxRecentQueries = /*@__PURE__*/ proxyCustomElement(class AtomicSearchBoxRecentQueries extends HTMLElement {
59
- constructor() {
60
- super();
61
- this.__registerHost();
62
- this.__attachShadow();
63
- /**
64
- * The maximum number of suggestions that will be displayed if the user has typed something into the input field.
65
- */
66
- this.maxWithQuery = 3;
67
- this.warnUser = once(() => this.bindings.engine.logger.warn('Because analytics are disabled, the recent queries feature is deactivated.'));
68
- this.error = undefined;
69
- this.icon = undefined;
70
- this.maxWithQuery = 3;
71
- this.maxWithoutQuery = undefined;
72
- }
73
- componentWillLoad() {
74
- try {
75
- dispatchSearchBoxSuggestionsEvent((bindings) => {
76
- this.bindings = bindings;
77
- return this.initialize();
78
- }, this.host, ['atomic-search-box']);
79
- }
80
- catch (error) {
81
- this.error = error;
82
- }
83
- }
84
- renderIcon() {
85
- return this.icon || Clock;
86
- }
87
- initialize() {
88
- this.storage = new SafeStorage();
89
- this.recentQueriesList = buildRecentQueriesList(this.bindings.engine, {
90
- initialState: { queries: this.retrieveLocalStorage() },
91
- options: { maxLength: 1000, clearFilters: this.bindings.clearFilters },
92
- });
93
- this.recentQueriesList.subscribe(() => this.updateLocalStorage());
94
- return {
95
- position: Array.from(this.host.parentNode.children).indexOf(this.host),
96
- renderItems: () => this.renderItems(),
97
- };
98
- }
99
- retrieveLocalStorage() {
100
- return this.storage.getParsedJSON(StorageItems.RECENT_QUERIES, []);
101
- }
102
- updateLocalStorage() {
103
- if (!this.recentQueriesList.state.analyticsEnabled) {
104
- return this.disableFeature();
105
- }
106
- return this.storage.setJSON(StorageItems.RECENT_QUERIES, this.recentQueriesList.state.queries);
107
- }
108
- disableFeature() {
109
- this.warnUser();
110
- this.storage.removeItem(StorageItems.RECENT_QUERIES);
111
- }
112
- renderItems() {
113
- if (!this.recentQueriesList.state.analyticsEnabled) {
114
- return [];
115
- }
116
- const query = this.bindings.searchBoxController.state.value;
117
- const hasQuery = query !== '';
118
- const max = hasQuery ? this.maxWithQuery : this.maxWithoutQuery;
119
- const filteredQueries = this.recentQueriesList.state.queries
120
- .filter((recentQuery) => recentQuery.toLowerCase().startsWith(query.toLowerCase()))
121
- .slice(0, max);
122
- const suggestionElements = filteredQueries.map((value) => this.renderItem(value));
123
- if (suggestionElements.length) {
124
- suggestionElements.unshift(this.renderClear());
125
- }
126
- return suggestionElements;
127
- }
128
- renderClear() {
129
- const partialItem = getPartialRecentQueryClearElement(this.bindings.i18n);
130
- return {
131
- ...partialItem,
132
- content: h(RecentQueryClear, { i18n: this.bindings.i18n }),
133
- onSelect: () => {
134
- this.recentQueriesList.clear();
135
- this.bindings.triggerSuggestions();
136
- },
137
- };
138
- }
139
- renderItem(value) {
140
- const query = this.bindings.searchBoxController.state.value;
141
- const partialItem = getPartialRecentQueryElement(value, this.bindings.i18n);
142
- return {
143
- ...partialItem,
144
- content: (h(RecentQueriesContainer, null, h(RecentQueryIcon, { icon: this.renderIcon() }), h(RecentQueryText, { query: query, value: value }))),
145
- onSelect: () => {
146
- if (this.bindings.isStandalone) {
147
- this.bindings.searchBoxController.updateText(value);
148
- this.bindings.searchBoxController.submit();
149
- return;
150
- }
151
- this.recentQueriesList.executeRecentQuery(this.recentQueriesList.state.queries.indexOf(value));
152
- },
153
- };
154
- }
155
- render() {
156
- if (this.error) {
157
- return (h("atomic-component-error", { key: 'bc7e0d617164709b3ce19c39d4cd75e465afa3b9', element: this.host, error: this.error }));
158
- }
159
- }
160
- get host() { return this; }
161
- }, [1, "atomic-search-box-recent-queries", {
162
- "icon": [1],
163
- "maxWithQuery": [514, "max-with-query"],
164
- "maxWithoutQuery": [514, "max-without-query"],
165
- "error": [32]
166
- }]);
167
- function defineCustomElement() {
168
- if (typeof customElements === "undefined") {
169
- return;
170
- }
171
- const components = ["atomic-search-box-recent-queries"];
172
- components.forEach(tagName => { switch (tagName) {
173
- case "atomic-search-box-recent-queries":
174
- if (!customElements.get(tagName)) {
175
- customElements.define(tagName, AtomicSearchBoxRecentQueries);
176
- }
177
- break;
178
- } });
179
- }
180
-
181
- export { AtomicSearchBoxRecentQueries as A, defineCustomElement as d };
182
-
183
- //# sourceMappingURL=atomic-search-box-recent-queries2.js.map
@@ -1 +0,0 @@
1
- {"file":"atomic-search-box-recent-queries2.js","mappings":"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","names":[],"sources":["src/components/common/suggestions/stencil-recent-queries.tsx","src/components/search/search-box-suggestions/atomic-search-box-recent-queries/atomic-search-box-recent-queries.tsx"],"sourcesContent":["import {HighlightUtils} from '@coveo/headless';\nimport {FunctionalComponent, h} from '@stencil/core';\nimport {i18n} from 'i18next';\nimport {encodeForDomAttribute} from '../../../utils/string-utils';\nimport {SearchBoxSuggestionElement} from './suggestions-common';\n\nexport const getPartialRecentQueryElement = (\n value: string,\n i18n: i18n\n): Pick<SearchBoxSuggestionElement, 'ariaLabel' | 'key' | 'query' | 'part'> => {\n return {\n part: 'recent-query-item',\n query: value,\n key: `recent-${encodeForDomAttribute(value)}`,\n ariaLabel: i18n.t('recent-query-suggestion-label', {\n query: value,\n interpolation: {escapeValue: false},\n }),\n };\n};\n\nexport const getPartialRecentQueryClearElement = (\n i18n: i18n\n): Pick<\n SearchBoxSuggestionElement,\n 'ariaLabel' | 'key' | 'part' | 'hideIfLast'\n> => {\n return {\n key: 'recent-query-clear',\n ariaLabel: i18n.t('clear-recent-searches', {\n interpolation: {escapeValue: false},\n }),\n part: 'recent-query-title-item suggestion-divider',\n hideIfLast: true,\n };\n};\n\nexport const RecentQueriesContainer: FunctionalComponent = (_, children) => {\n return (\n <div\n part=\"recent-query-content\"\n class=\"flex items-center text-left break-all\"\n >\n {children}\n </div>\n );\n};\n\ninterface RecentQueryIconProps {\n icon: string;\n}\n\nexport const RecentQueryIcon: FunctionalComponent<RecentQueryIconProps> = ({\n icon,\n}) => {\n return (\n <atomic-icon\n part=\"recent-query-icon\"\n icon={icon}\n class=\"mr-2 h-4 w-4 shrink-0\"\n ></atomic-icon>\n );\n};\n\ninterface RecentQueryTextProps {\n query: string;\n value: string;\n}\n\nexport const RecentQueryText: FunctionalComponent<RecentQueryTextProps> = ({\n query,\n value,\n}) => {\n if (query === '') {\n return (\n <span part=\"recent-query-text\" class=\"line-clamp-2 break-all\">\n {value}\n </span>\n );\n }\n return (\n <span\n part=\"recent-query-text\"\n class=\"line-clamp-2 break-all\"\n innerHTML={HighlightUtils.highlightString({\n content: value,\n openingDelimiter:\n '<span part=\"recent-query-text-highlight\" class=\"font-bold\">',\n closingDelimiter: '</span>',\n highlights: [\n {\n offset: query.length,\n length: value.length - query.length,\n },\n ],\n })}\n ></span>\n );\n};\n\ninterface RecentQueryClearProps {\n i18n: i18n;\n}\n\nexport const RecentQueryClear: FunctionalComponent<RecentQueryClearProps> = ({\n i18n,\n}) => {\n return (\n <div part=\"recent-query-title-content\" class=\"flex w-full justify-between\">\n <span class=\"font-bold\" part=\"recent-query-title\">\n {i18n.t('recent-searches')}\n </span>\n <span part=\"recent-query-clear\">{i18n.t('clear')}</span>\n </div>\n );\n};\n","import {\n buildRecentQueriesList,\n RecentQueriesList,\n SearchBox,\n} from '@coveo/headless';\nimport {Component, Element, Prop, State, h} from '@stencil/core';\nimport Clock from '../../../../images/clock.svg';\nimport {SafeStorage, StorageItems} from '../../../../utils/local-storage-utils';\nimport {once} from '../../../../utils/utils';\nimport {\n getPartialRecentQueryClearElement,\n getPartialRecentQueryElement,\n RecentQueriesContainer,\n RecentQueryClear,\n RecentQueryIcon,\n RecentQueryText,\n} from '../../../common/suggestions/stencil-recent-queries';\nimport {\n dispatchSearchBoxSuggestionsEvent,\n SearchBoxSuggestionElement,\n SearchBoxSuggestions,\n SearchBoxSuggestionsBindings,\n} from '../../../common/suggestions/suggestions-common';\nimport {Bindings} from '../../atomic-search-interface/atomic-search-interface';\n\n/**\n * The `atomic-search-box-recent-queries` component can be added as a child of an `atomic-search-box` component, allowing for the configuration of recent query suggestions.\n */\n@Component({\n tag: 'atomic-search-box-recent-queries',\n shadow: true,\n})\nexport class AtomicSearchBoxRecentQueries {\n private bindings!: SearchBoxSuggestionsBindings<SearchBox, Bindings>;\n private recentQueriesList!: RecentQueriesList;\n private storage!: SafeStorage;\n\n @Element() private host!: HTMLElement;\n\n @State() public error!: Error;\n\n /**\n * The SVG icon to display.\n *\n * - Use a value that starts with `http://`, `https://`, `./`, or `../`, to fetch and display an icon from a given location.\n * - Use a value that starts with `assets://`, to display an icon from the Atomic package.\n * - Use a stringified SVG to display it directly.\n */\n @Prop() public icon?: string;\n\n /**\n * The maximum number of suggestions that will be displayed if the user has typed something into the input field.\n */\n @Prop({reflect: true}) public maxWithQuery = 3;\n /**\n * The maximum number of suggestions that will be displayed initially when the input field is empty.\n */\n @Prop({reflect: true}) public maxWithoutQuery?: number;\n\n componentWillLoad() {\n try {\n dispatchSearchBoxSuggestionsEvent<SearchBox, Bindings>(\n (bindings) => {\n this.bindings = bindings;\n return this.initialize();\n },\n this.host,\n ['atomic-search-box']\n );\n } catch (error) {\n this.error = error as Error;\n }\n }\n\n private renderIcon() {\n return this.icon || Clock;\n }\n\n private initialize(): SearchBoxSuggestions {\n this.storage = new SafeStorage();\n this.recentQueriesList = buildRecentQueriesList(this.bindings.engine, {\n initialState: {queries: this.retrieveLocalStorage()},\n options: {maxLength: 1000, clearFilters: this.bindings.clearFilters},\n });\n\n this.recentQueriesList.subscribe(() => this.updateLocalStorage());\n\n return {\n position: Array.from(this.host.parentNode!.children).indexOf(this.host),\n renderItems: () => this.renderItems(),\n };\n }\n\n private retrieveLocalStorage() {\n return this.storage.getParsedJSON(StorageItems.RECENT_QUERIES, []);\n }\n\n private updateLocalStorage() {\n if (!this.recentQueriesList.state.analyticsEnabled) {\n return this.disableFeature();\n }\n\n return this.storage.setJSON(\n StorageItems.RECENT_QUERIES,\n this.recentQueriesList.state.queries\n );\n }\n\n private warnUser = once(() =>\n this.bindings.engine.logger.warn(\n 'Because analytics are disabled, the recent queries feature is deactivated.'\n )\n );\n\n private disableFeature() {\n this.warnUser();\n this.storage.removeItem(StorageItems.RECENT_QUERIES);\n }\n\n private renderItems(): SearchBoxSuggestionElement[] {\n if (!this.recentQueriesList.state.analyticsEnabled) {\n return [];\n }\n\n const query = this.bindings.searchBoxController.state.value;\n const hasQuery = query !== '';\n const max = hasQuery ? this.maxWithQuery : this.maxWithoutQuery;\n const filteredQueries = this.recentQueriesList.state.queries\n .filter((recentQuery) =>\n recentQuery.toLowerCase().startsWith(query.toLowerCase())\n )\n .slice(0, max);\n\n const suggestionElements: SearchBoxSuggestionElement[] =\n filteredQueries.map((value) => this.renderItem(value));\n if (suggestionElements.length) {\n suggestionElements.unshift(this.renderClear());\n }\n\n return suggestionElements;\n }\n\n private renderClear(): SearchBoxSuggestionElement {\n const partialItem = getPartialRecentQueryClearElement(this.bindings.i18n);\n\n return {\n ...partialItem,\n content: <RecentQueryClear i18n={this.bindings.i18n} />,\n onSelect: () => {\n this.recentQueriesList.clear();\n this.bindings.triggerSuggestions();\n },\n };\n }\n\n private renderItem(value: string): SearchBoxSuggestionElement {\n const query = this.bindings.searchBoxController.state.value;\n const partialItem = getPartialRecentQueryElement(value, this.bindings.i18n);\n return {\n ...partialItem,\n content: (\n <RecentQueriesContainer>\n <RecentQueryIcon icon={this.renderIcon()} />\n <RecentQueryText query={query} value={value} />\n </RecentQueriesContainer>\n ),\n\n onSelect: () => {\n if (this.bindings.isStandalone) {\n this.bindings.searchBoxController.updateText(value);\n this.bindings.searchBoxController.submit();\n return;\n }\n\n this.recentQueriesList.executeRecentQuery(\n this.recentQueriesList.state.queries.indexOf(value)\n );\n },\n };\n }\n\n public render() {\n if (this.error) {\n return (\n <atomic-component-error\n element={this.host}\n error={this.error}\n ></atomic-component-error>\n );\n }\n }\n}\n"],"version":3}
@@ -1,118 +0,0 @@
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 { loadQuerySuggestActions, } from '@coveo/headless';
8
- import { html, LitElement, nothing } from 'lit';
9
- import { customElement, property, state } from 'lit/decorators.js';
10
- import { getPartialSearchBoxSuggestionElement, renderQuerySuggestion, } from "../../common/suggestions/query-suggestions.js";
11
- import { dispatchSearchBoxSuggestionsEvent, } from "../../common/suggestions/suggestions-common.js";
12
- import { errorGuard } from "../../../decorators/error-guard.js";
13
- const SearchIcon = "<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m6.4 0c3.5 0 6.4 2.9 6.4 6.4 0 1.4-.4 2.7-1.2 3.7l4 4c.4.4.4 1 .1 1.5l-.1.1c-.2.2-.5.3-.8.3s-.6-.1-.8-.3l-4-4c-1 .7-2.3 1.2-3.7 1.2-3.4-.1-6.3-3-6.3-6.5s2.9-6.4 6.4-6.4zm0 2.1c-2.3 0-4.3 1.9-4.3 4.3s1.9 4.3 4.3 4.3 4.3-1.9 4.3-4.3-1.9-4.3-4.3-4.3z\"/></svg>";
14
- /**
15
- * The `atomic-search-box-query-suggestions` component can be added as a child of an `atomic-search-box` component, allowing for the configuration of query suggestion behavior.
16
- */
17
- let AtomicSearchBoxQuerySuggestions = class AtomicSearchBoxQuerySuggestions extends LitElement {
18
- constructor() {
19
- super(...arguments);
20
- /**
21
- * The SVG icon to display.
22
- *
23
- * - Use a value that starts with `http://`, `https://`, `./`, or `../`, to fetch and display an icon from a given location.
24
- * - Use a value that starts with `assets://`, to display an icon from the Atomic package.
25
- * - Use a stringified SVG to display it directly.
26
- */
27
- this.icon = '';
28
- /**
29
- * The maximum number of suggestions that will be displayed if the user has typed something into the input field.
30
- */
31
- this.maxWithQuery = 3;
32
- /**
33
- * The maximum number of suggestions that will be displayed initially when the input field is empty.
34
- */
35
- this.maxWithoutQuery = 0;
36
- }
37
- connectedCallback() {
38
- super.connectedCallback();
39
- try {
40
- dispatchSearchBoxSuggestionsEvent((bindings) => {
41
- this.bindings = bindings;
42
- return this.initialize();
43
- }, this, ['atomic-search-box']);
44
- }
45
- catch (error) {
46
- this.error = error;
47
- }
48
- }
49
- initialize() {
50
- const engine = this.bindings.engine;
51
- const { registerQuerySuggest, fetchQuerySuggestions } = loadQuerySuggestActions(engine);
52
- const numberOfQueries = this.bindings.numberOfQueries;
53
- const maxWithQuery = this.maxWithQuery;
54
- if (numberOfQueries < maxWithQuery) {
55
- this.bindings.engine.logger.warn(`Query suggestions configuration mismatch: atomic-search-box has number-of-queries="${numberOfQueries}" but atomic-search-box-query-suggestions has max-with-query="${maxWithQuery}". ` +
56
- `This may cause inconsistent behavior where the search box requests ${numberOfQueries} suggestions but the component tries to display up to ${maxWithQuery}. ` +
57
- `Consider updating max-with-query to ${numberOfQueries} or increasing number-of-queries to ${maxWithQuery}.`);
58
- }
59
- engine.dispatch(registerQuerySuggest({
60
- id: this.bindings.id,
61
- count: this.bindings.numberOfQueries,
62
- }));
63
- return {
64
- position: Array.from(this.parentNode.children).indexOf(this),
65
- onInput: () => engine.dispatch(fetchQuerySuggestions({
66
- id: this.bindings.id,
67
- })),
68
- renderItems: () => this.renderItems(),
69
- };
70
- }
71
- renderItems() {
72
- const hasQuery = this.bindings.searchBoxController.state.value !== '';
73
- const max = hasQuery ? this.maxWithQuery : this.maxWithoutQuery;
74
- return this.bindings.searchBoxController.state.suggestions
75
- .slice(0, max)
76
- .map((suggestion) => this.renderItem(suggestion));
77
- }
78
- renderItem(suggestion) {
79
- const partialItem = getPartialSearchBoxSuggestionElement(suggestion, this.bindings.i18n);
80
- const icon = this.icon || SearchIcon;
81
- const hasQuery = this.bindings.searchBoxController.state.value !== '';
82
- const hasMultipleKindOfSuggestions = this.bindings.getSuggestions().length > 1;
83
- return {
84
- ...partialItem,
85
- content: renderQuerySuggestion({
86
- icon,
87
- hasQuery,
88
- suggestion,
89
- hasMultipleKindOfSuggestions,
90
- }),
91
- onSelect: () => {
92
- this.bindings.searchBoxController.selectSuggestion(suggestion.rawValue);
93
- },
94
- };
95
- }
96
- render() {
97
- return html `${nothing}`;
98
- }
99
- };
100
- __decorate([
101
- state()
102
- ], AtomicSearchBoxQuerySuggestions.prototype, "error", void 0);
103
- __decorate([
104
- property()
105
- ], AtomicSearchBoxQuerySuggestions.prototype, "icon", void 0);
106
- __decorate([
107
- property({ type: Number, attribute: 'max-with-query', reflect: true })
108
- ], AtomicSearchBoxQuerySuggestions.prototype, "maxWithQuery", void 0);
109
- __decorate([
110
- property({ type: Number, attribute: 'max-without-query', reflect: true })
111
- ], AtomicSearchBoxQuerySuggestions.prototype, "maxWithoutQuery", void 0);
112
- __decorate([
113
- errorGuard()
114
- ], AtomicSearchBoxQuerySuggestions.prototype, "render", null);
115
- AtomicSearchBoxQuerySuggestions = __decorate([
116
- customElement('atomic-search-box-query-suggestions')
117
- ], AtomicSearchBoxQuerySuggestions);
118
- export { AtomicSearchBoxQuerySuggestions };
@@ -1 +0,0 @@
1
- {"file":"suggestions-common.js","mappings":";;;AA0FA,MAAM,iBAAiB,GAAG;IACxB,mBAAmB;IACnB,2BAA2B;IAC3B,4BAA4B;CACpB,CAAC;AAoDX,MAAM,mBAAmB,GAAG,CAAC,SAAkB,KAC7C,gBAAgB,IAAK,SAAwB;IAC5C,SAAwB,CAAC,cAAc,YAAY,OAAO,CAAC;AAE9D,MAAM,2CAA2C,GAAG,OAIlD,gBAAyB,EACzB,OAAoB,EACpB,KAA+D;IAE/D,MAAM,cAAc,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,IAAI,mBAAmB,CAAC,gBAAgB,CAAC,EAAE;QACzC,MAAM,gBAAgB,CAAC,cAAc,CAAC;KACvC;SAAM,IAAI,kBAAkB,IAAI,gBAAgB,EAAE;QACjD,MAAO,gBAAuC,CAAC,gBAAgB,EAAE,CAAC;KACnE;IACD,OAAO,CAAC,aAAa,CACnB,gBAAgB,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAC/D,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;MAKa,iCAAiC,GAAG,CAI/C,KAA+D,EAC/D,OAAoB,EACpB,2BAA0E,iBAAiB;IAE3F,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CACb,QAAQ,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gFAAgF,wBAAwB,CAAC,IAAI,CACjJ,IAAI,CACL,EAAE,CACJ,CAAC;KACH;IACD,KAAK,2CAA2C,CAC9C,gBAAgB,EAChB,OAAO,EACP,KAAK,CACN,CAAC;AACJ,EAAE;SAEc,iBAAiB,CAAC,EAA8B;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;SAEe,eAAe,CAAC,EAA8B;IAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC9C;;;;","names":[],"sources":["src/components/common/suggestions/suggestions-common.ts"],"sourcesContent":["import type {VNode} from '@stencil/core';\nimport 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';\n\n/**\n * Element which will be rendered in the list of suggestions.\n */\nexport interface SearchBoxSuggestionElement {\n /**\n * Stable identity which enables Stencil to reuse DOM elements for better performance.\n * The best way to pick a key is to use a string that uniquely identifies that list item among its siblings (often your data will already have IDs).\n */\n key: string;\n /**\n * Rendered content of the element.\n *\n * @remarks\n * The `VNode` type will be deprecated in v4 as we are detaching from Stencil.\n */\n content: Element | VNode;\n /**\n * Hook called when the selection is selected.\n * @param e DOM event.\n */\n onSelect?(e: Event): void;\n /**\n * The query associated with the suggestion which will replace the query in the search box if the suggestion is selected.\n */\n query?: string;\n /**\n * For improved accessibility, provide this property with additional information.\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label\n */\n ariaLabel?: string;\n /**\n * Adds a specific shadow part attribute that can be selected with the CSS ::part pseudo-element.\n * https://developer.mozilla.org/en-US/docs/Web/CSS/::part\n */\n part?: string;\n /**\n * Hide the suggestion if it's the last in the list.\n */\n hideIfLast?: boolean;\n}\n\n/**\n * List of suggestions that will be displayed along other lists (e.g recent queries) when the search box's input is selected.\n */\nexport interface SearchBoxSuggestions {\n /**\n * The search box will sort the position of suggestions using this value. The lowest value being first.\n * By default, the DOM position will be used.\n */\n position: number;\n /**\n * Whether the suggestions should be listed in the right or left panel. By default, the suggestions are listed in the right panel.\n */\n panel?: 'left' | 'right';\n /**\n * Method that returns the list of elements which will be rendered in the list of suggestions.\n */\n renderItems(): SearchBoxSuggestionElement[];\n /**\n * Hook called when the user changes the search box's input value. This can lead to all the query suggestions being updated.\n */\n onInput?(): Promise<unknown>;\n /**\n * Hook called when the suggested query changes as a user traverses through the list of suggestions.\n * This is used for instant results, which are rendered based on the current suggested query.\n * @param q The new suggested query.\n */\n onSuggestedQueryChange?(q: string): Promise<unknown>;\n}\n\n/**\n * Event sent from the registered query suggestions to the parent search box.\n */\nexport type SearchBoxSuggestionsEvent<\n SearchBoxController,\n Bindings = AnyBindings,\n> = (\n /**\n * The bindings passed from the search box to the suggestions.\n */\n bindings: SearchBoxSuggestionsBindings<SearchBoxController, Bindings>\n) => SearchBoxSuggestions;\n\nconst searchBoxElements = [\n 'atomic-search-box',\n 'atomic-insight-search-box',\n 'atomic-commerce-search-box',\n] as const;\n\n/**\n * The bindings passed from the search box to the suggestions.\n */\nexport type SearchBoxSuggestionsBindings<\n SearchBoxController,\n Bindings = AnyBindings,\n> = Bindings & {\n /**\n * The unique id of the search box.\n */\n id: string;\n /**\n * Whether the search box is [standalone](https://docs.coveo.com/en/atomic/latest/usage/ssb/).\n */\n isStandalone: boolean;\n /**\n * The search box headless controller.\n */\n searchBoxController: SearchBoxController;\n /**\n * The number of queries to display when the user interacts with the search box.\n */\n numberOfQueries: number;\n /**\n * Whether to clear all active query filters when the end user submits a new query from the search box.\n */\n clearFilters: boolean;\n /**\n * Retrieves the suggested query, meaning the query that would be sent if the search is executed.\n * The suggested query changes as a user traverses through the list of suggestions.\n */\n suggestedQuery(): string;\n /**\n * Removes the current suggestions.\n */\n clearSuggestions(): void;\n /**\n * Triggers update & retrieval of all suggestions.\n */\n triggerSuggestions(): void;\n /**\n * Retrieves the current suggestions.\n */\n getSuggestions(): SearchBoxSuggestions[];\n /**\n * Retrieves the current suggestions elements.\n */\n getSuggestionElements(): SearchBoxSuggestionElement[];\n};\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\n/**\n * Dispatches an event which retrieves the `SearchBoxSuggestionsBindings` on a configured parent search box.\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 */\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\nexport function elementHasNoQuery(el: SearchBoxSuggestionElement) {\n return !el.query || el.query.trim() === '';\n}\n\nexport function elementHasQuery(el: SearchBoxSuggestionElement) {\n return !!el.query && el.query.trim() !== '';\n}\n"],"version":3}
@@ -1,2 +0,0 @@
1
- import{h as t,f as s}from"./p-dc3df5ce.js";import{B as e}from"./p-b93ccff9.js";import{isNullOrUndefined as i}from"@coveo/bueno";import{D as n}from"./p-f284897c.js";import{d as r}from"./p-01c91b69.js";import{e as o,a}from"./p-7601c3de.js";const h=`<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">\n<circle cx="7" cy="7" r="6.5" stroke="currentColor"/>\n<path d="M16 16L12 12" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>\n</svg>\n`;const u=(s,e)=>{const i=()=>{const t="flex bg-background w-full border border-neutral rounded-md focus-within:ring-3 absolute top-0 left-0";const e=s.disabled?"focus-within:border-disabled focus-within:ring-neutral":"focus-within:border-primary focus-within:ring-ring-primary";return[t,e].join(" ")};return t("div",{part:"wrapper",class:i(),onFocusout:s.onFocusout},e)};const c=`<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M15 1.00012L1.00012 14.9999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>\n<path d="M0.999878 1L14.9999 15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>\n</svg>\n`;const l=({inputRef:s,bindings:i,onClick:n,...r})=>t("div",{part:"clear-button-wrapper",class:"ml-2 flex items-center justify-center py-2"},t(e,{style:"text-transparent",part:"clear-button",class:"text-neutral-dark flex h-8 w-8 shrink-0 items-center justify-center",onClick:()=>{n?.();s?.focus()},ariaLabel:i.i18n.t("clear"),...r},t("atomic-icon",{part:"clear-icon",icon:c,class:"h-4 w-4"})));function g(t){return{autocomplete:"off",autocapitalize:"off",autocorrect:"off",...t.activeDescendant&&{"aria-activedescendant":t.activeDescendant},"aria-autocomplete":"both","aria-haspopup":"true","aria-controls":t.id}}function f(t,s){const e=t?.parentNode;if(!e){return}if(t.value==="\n"){return}e.dataset.replicatedValue=s??t.value}function d(t){const s=t?.parentNode;if(s){delete s.dataset.replicatedValue}}function p(t){const s=t?.parentNode;if(s){s.classList.remove("expanded")}}function m(t){const s=t?.parentNode;if(s){s.classList.add("expanded")}}const w=({textAreaRef:s,loading:e,bindings:i,onInput:n,onFocus:r,onBlur:o,onChange:a,onKeyDown:h,onKeyUp:u,value:c,ariaLabel:w,onClear:b,popup:v,...y})=>t("div",{class:"flex grow overflow-hidden"},t("div",{part:"textarea-expander",class:"grid grow overflow-hidden"},t("textarea",{part:"textarea","aria-label":w,placeholder:i.i18n.t("search"),class:"placeholder-neutral-dark",rows:1,onInput:t=>{n?.(t);f(s)},onKeyDown:t=>{f(s);if(t.key==="Enter"){if(t.shiftKey){return}t.preventDefault()}h?.(t)},onKeyUp:t=>{u?.(t);if(t.key==="Enter"){t.preventDefault();return}f(s)},onBlur:t=>{o?.(t);p(s);f(s)},onChange:t=>{a?.(t);f(s)},onFocus:t=>{r?.(t);const e=t.target;f(s??e);m(s??e)},autocomplete:"off",...v&&g(v),...y,value:c})),e&&t("div",{class:"searchbox-button-wrapper ml-2 flex items-center justify-center"},t("span",{part:"loading",class:"loading mr-2 grid h-5 w-5 animate-spin place-items-center rounded-full bg-linear-to-r"})),!e&&c&&t(l,{inputRef:s,bindings:i,onClick:()=>{b();d(s)}}));function b(t,s){let e;const i=new Promise(((t,i)=>{e=setTimeout((()=>{i(new Error("Promise timed out."))}),s)}));return Promise.race([t,i]).then((()=>{clearTimeout(e)}))}class v{constructor(t){this.ownerSearchBoxProps=t;this.suggestions=[];this.leftSuggestionElements=[];this.rightSuggestionElements=[];this.leftPanel=undefined;this.rightPanel=undefined;this.activeDescendant="";this.suggestedQuery="";this.keyboardActiveDescendant="";this.queryDataAttribute="data-query";this.suggestionEvents=[];this.previousActiveDescendantElement=null;this.leftSuggestions=[];this.rightSuggestions=[];this.triggerSuggestions=r((()=>this.executeQuerySuggestion()),this.ownerSearchBoxProps.getSuggestionDelay())}get partialSuggestionBindings(){return{suggestedQuery:()=>this.suggestedQuery,clearSuggestions:()=>this.clearSuggestions(),triggerSuggestions:()=>this.triggerSuggestions(),getSuggestions:()=>this.suggestions,getSuggestionElements:()=>this.allSuggestionElements}}get activeDescendantElement(){if(!this.hasActiveDescendant){return null}return this.leftPanel?.querySelector(`#${this.activeDescendant}`)||this.rightPanel?.querySelector(`#${this.activeDescendant}`)||null}onSubmit(){this.clickOnActiveElement();this.clearSuggestions()}updateActiveDescendant(t=""){this.activeDescendant=t;s(this.ownerSearchBoxProps.getHost())}updateKeyboardActiveDescendant(t=""){this.keyboardActiveDescendant=t}clickOnActiveElement(){this.activeDescendantElement?.click();this.updateActiveDescendant()}isRightPanelInFocus(){if(i(this.panelInFocus)||i(this.rightPanel)){return false}return this.panelInFocus===this.rightPanel}initializeSuggestions(t){this.suggestions=this.suggestionEvents.map((s=>s(t)))}registerSuggestionsFromEvent(t,s){t.preventDefault();t.stopPropagation();this.suggestionEvents.push(t.detail);this.suggestions.push(t.detail(s))}registerSuggestions(t){this.suggestions.push(t)}get isDoubleList(){return Boolean(this.leftSuggestionElements.length&&this.rightSuggestionElements.length)}focusPanel(t){const s=t==="left"?this.leftPanel:this.rightPanel;if(this.panelInFocus===s){return}if(s?.firstElementChild){const t=this.previousActiveDescendantElement&&s.contains(this.previousActiveDescendantElement);const e=t?this.previousActiveDescendantElement:s.firstElementChild;this.updateDescendants(e.id)}}clearSuggestions(){this.clearSuggestionElements();this.updateActiveDescendant()}async focusNextValue(){if(!this.hasSuggestions||!this.nextOrFirstValue){return}await this.focusValue(this.nextOrFirstValue)}async focusValue(t){this.updateKeyboardActiveDescendant(t.id);this.updateActiveDescendant(t.id);this.scrollActiveDescendantIntoView();await this.updateQueryFromSuggestion()}async onSuggestionMouseOver(t,s,e){const i=s==="left"?this.leftPanel:this.rightPanel;this.updateKeyboardActiveDescendant();if(this.panelInFocus===i){this.updateActiveDescendant(e)}else{this.updateDescendants(e)}if(t.query){await this.updateSuggestedQuery(t.query)}}async onSuggestionClick(t,s){if(t.query){this.clearSuggestions();await this.updateOwnerSearchboxQuery(t.query)}t.onSelect?.(s)}get hasSuggestions(){return!!this.allSuggestionElements.length}get allSuggestionElements(){return[...this.leftSuggestionElements,...this.rightSuggestionElements]}async focusPreviousValue(){if(this.firstValue===this.activeDescendantElement){this.updateKeyboardActiveDescendant();this.updateActiveDescendant();return}if(!this.hasSuggestions||!this.previousOrLastValue){return}await this.focusValue(this.previousOrLastValue)}get hasActiveDescendant(){return this.activeDescendant!==""}async executeQuerySuggestion(){this.updateActiveDescendant();const t=await Promise.allSettled(this.suggestions.map((t=>b(t.onInput?t.onInput():Promise.resolve(),this.ownerSearchBoxProps.getSuggestionTimeout()))));const s=[];t.forEach(((t,e)=>{if(t.status==="fulfilled"){s.push(this.suggestions[e])}else{this.ownerSearchBoxProps.getLogger().warn("Some query suggestions are not being shown because the promise timed out.")}}));const e=(t,e=false)=>s.filter((s=>s.panel===t||!s.panel&&e)).sort(this.sortSuggestions);this.leftSuggestions=e("left",true);this.leftSuggestionElements=this.getAndFilterLeftSuggestionElements();this.rightSuggestions=e("right");this.rightSuggestionElements=this.getSuggestionElements(this.rightSuggestions);const i=this.allSuggestionElements.find(o)?.query||"";await this.updateSuggestedQuery(i)}get lastValue(){return this.panelInFocus?.lastElementChild}get previousOrLastValue(){if(!this.hasActiveDescendant){return this.lastValue?.firstChild}const t=this.activeDescendantElement?.parentElement;return t?.previousElementSibling?.firstChild||this.firstValue?.firstChild}sortSuggestions(t,s){return t.position-s.position}get nextOrFirstValue(){if(!this.hasActiveDescendant){return this.firstValue?.firstChild}const t=this.activeDescendantElement?.parentElement;return t?.nextElementSibling?.firstChild||this.firstValue?.firstChild}get firstValue(){return this.panelInFocus?.firstElementChild}get panelInFocus(){if(this.leftPanel?.contains(this.activeDescendantElement)){return this.leftPanel}if(this.rightPanel?.contains(this.activeDescendantElement)){return this.rightPanel}return this.leftPanel||this.rightPanel}scrollActiveDescendantIntoView(){this.activeDescendantElement?.scrollIntoView({block:"nearest"})}async updateQueryFromSuggestion(){const t=this.activeDescendantElement?.getAttribute(this.queryDataAttribute);await this.updateOwnerSearchboxQuery(t||"")}async updateOwnerSearchboxQuery(t){if(t&&this.ownerSearchBoxProps.getSearchBoxValue()!==t){this.ownerSearchBoxProps.updateQuery(t);await this.updateSuggestedQuery(t)}}async updateSuggestedQuery(t){await Promise.allSettled(this.suggestions.map((s=>b(s.onSuggestedQueryChange?s.onSuggestedQueryChange(t):Promise.resolve(),this.ownerSearchBoxProps.getSuggestionTimeout()))));this.suggestedQuery=t;this.updateSuggestionElements(t);s(this.ownerSearchBoxProps.getHost())}updateSuggestionElements(t){if(!this.isPanelInFocus(this.leftPanel,t)){this.leftSuggestionElements=this.getAndFilterLeftSuggestionElements()}if(!this.isPanelInFocus(this.rightPanel,t)){this.rightSuggestionElements=this.getSuggestionElements(this.rightSuggestions)}}forceUpdate(){this.updateSuggestionElements(this.suggestedQuery);s(this.ownerSearchBoxProps.getHost())}isPanelInFocus(t,s){if(!this.activeDescendantElement){return false}if(s){const e=n.sanitize(s);return!!t?.querySelector(`[${this.queryDataAttribute}="${CSS.escape(e)}"]`)}return this.activeDescendantElement?.closest("ul")===t}getAndFilterLeftSuggestionElements(){const t=this.getSuggestionElements(this.leftSuggestions);const s=new Set;const e=t.filter((t=>{if(i(t.query)){return true}if(s.has(t.query)){return false}else{s.add(t.query);return true}}));return e}getSuggestionElements(t){const s=t.flatMap((t=>t.renderItems()));const e=this.ownerSearchBoxProps.getNumberOfSuggestionsToDisplay()+s.filter(a).length;return s.slice(0,e)}updateDescendants(t=""){const s=this.activeDescendantElement;this.previousActiveDescendantElement=s;this.updateActiveDescendant(t)}clearSuggestionElements(){this.leftSuggestionElements=[];this.rightSuggestionElements=[]}}export{v as S,h as a,w as b,u as c};
2
- //# sourceMappingURL=p-29fd6768.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["SearchBoxWrapper","props","children","getClasses","baseClasses","focusClasses","disabled","join","h","part","class","onFocusout","TextAreaClearButton","inputRef","bindings","onClick","defaultButtonProps","Button","style","focus","ariaLabel","i18n","t","icon","ClearSlim","getPopupAttributes","autocomplete","autocapitalize","autocorrect","activeDescendant","id","syncTextWithReplica","elem","value","parent","parentNode","dataset","replicatedValue","resetReplicaText","collapseTextArea","classList","remove","expandTextArea","add","SearchTextArea","textAreaRef","loading","onInput","onFocus","onBlur","onChange","onKeyDown","onKeyUp","onClear","popup","defaultInputProps","placeholder","rows","e","key","shiftKey","preventDefault","target","promiseTimeout","prom","ms","timeout","Promise","_","reject","setTimeout","Error","race","then","clearTimeout","SuggestionManager","constructor","ownerSearchBoxProps","this","suggestions","leftSuggestionElements","rightSuggestionElements","leftPanel","undefined","rightPanel","suggestedQuery","keyboardActiveDescendant","queryDataAttribute","suggestionEvents","previousActiveDescendantElement","leftSuggestions","rightSuggestions","triggerSuggestions","debounce","executeQuerySuggestion","getSuggestionDelay","partialSuggestionBindings","clearSuggestions","getSuggestions","getSuggestionElements","allSuggestionElements","activeDescendantElement","hasActiveDescendant","querySelector","onSubmit","clickOnActiveElement","updateActiveDescendant","forceUpdate","getHost","updateKeyboardActiveDescendant","click","isRightPanelInFocus","isNullOrUndefined","panelInFocus","initializeSuggestions","map","event","registerSuggestionsFromEvent","stopPropagation","push","detail","registerSuggestions","isDoubleList","Boolean","length","focusPanel","side","panel","firstElementChild","panelHasActiveDescendant","contains","newValue","updateDescendants","clearSuggestionElements","focusNextValue","hasSuggestions","nextOrFirstValue","focusValue","scrollActiveDescendantIntoView","updateQueryFromSuggestion","onSuggestionMouseOver","item","thisPanel","query","updateSuggestedQuery","onSuggestionClick","updateOwnerSearchboxQuery","onSelect","focusPreviousValue","firstValue","previousOrLastValue","settled","allSettled","suggestion","resolve","getSuggestionTimeout","fulfilledSuggestions","forEach","j","status","getLogger","warn","splitSuggestions","isDefault","filter","sort","sortSuggestions","getAndFilterLeftSuggestionElements","defaultSuggestedQuery","find","elementHasQuery","lastValue","lastElementChild","firstChild","parentOfActiveDescendant","parentElement","previousElementSibling","a","b","position","nextElementSibling","scrollIntoView","block","getAttribute","getSearchBoxValue","updateQuery","onSuggestedQueryChange","updateSuggestionElements","isPanelInFocus","escaped","DOMPurify","sanitize","CSS","escape","closest","suggestionElements","filterOnDuplicate","Set","out","suggestionElement","has","elements","flatMap","renderItems","max","getNumberOfSuggestionsToDisplay","elementHasNoQuery","slice","newPrevDescendantElement"],"sources":["src/components/common/search-box/stencil-search-box-wrapper.tsx","src/components/common/search-box/stencil-text-area-clear-button.tsx","src/components/common/search-box/stencil-search-text-area.tsx","src/utils/promise-utils.ts","src/components/common/suggestions/stencil-suggestion-manager.ts"],"sourcesContent":["import {FunctionalComponent, h} from '@stencil/core';\n\ninterface Props {\n disabled: boolean;\n onFocusout?: (event: FocusEvent) => void;\n}\n\nexport const SearchBoxWrapper: FunctionalComponent<Props> = (\n props,\n children\n) => {\n const getClasses = () => {\n const baseClasses =\n 'flex bg-background w-full border border-neutral rounded-md focus-within:ring-3 absolute top-0 left-0';\n const focusClasses = props.disabled\n ? 'focus-within:border-disabled focus-within:ring-neutral'\n : 'focus-within:border-primary focus-within:ring-ring-primary';\n\n return [baseClasses, focusClasses].join(' ');\n };\n\n return (\n <div part=\"wrapper\" class={getClasses()} onFocusout={props.onFocusout}>\n {children}\n </div>\n );\n};\n","import {FunctionalComponent, h} from '@stencil/core';\nimport ClearSlim from '../../../images/clear-slim.svg';\nimport {AnyBindings} from '../interface/bindings';\nimport {Button, StencilButtonProps} from '../stencil-button';\n\ninterface Props extends Partial<StencilButtonProps> {\n bindings: AnyBindings;\n inputRef: HTMLInputElement | HTMLTextAreaElement | null;\n}\n\nexport const TextAreaClearButton: FunctionalComponent<Props> = ({\n inputRef,\n bindings,\n onClick,\n ...defaultButtonProps\n}) => (\n <div\n part=\"clear-button-wrapper\"\n class=\"ml-2 flex items-center justify-center py-2\"\n >\n <Button\n style=\"text-transparent\"\n part=\"clear-button\"\n class=\"text-neutral-dark flex h-8 w-8 shrink-0 items-center justify-center\"\n onClick={() => {\n onClick?.();\n inputRef?.focus();\n }}\n ariaLabel={bindings.i18n.t('clear')}\n {...defaultButtonProps}\n >\n <atomic-icon\n part=\"clear-icon\"\n icon={ClearSlim}\n class=\"h-4 w-4\"\n ></atomic-icon>\n </Button>\n </div>\n);\n","import {FunctionalComponent, h} from '@stencil/core';\nimport {JSXBase} from '@stencil/core/internal';\nimport {AnyBindings} from '../interface/bindings';\nimport {TextAreaClearButton} from './stencil-text-area-clear-button';\n\ninterface Props extends JSXBase.TextareaHTMLAttributes<HTMLTextAreaElement> {\n textAreaRef: HTMLTextAreaElement;\n loading: boolean;\n bindings: AnyBindings;\n value: string;\n ariaLabel: string;\n onClear(): void;\n popup?: {\n id: string;\n activeDescendant: string;\n expanded: boolean;\n hasSuggestions: boolean;\n };\n}\n\nfunction getPopupAttributes(props: Required<Props>['popup']) {\n return {\n autocomplete: 'off',\n autocapitalize: 'off',\n autocorrect: 'off',\n ...(props.activeDescendant && {\n 'aria-activedescendant': props.activeDescendant,\n }),\n 'aria-autocomplete': 'both',\n 'aria-haspopup': 'true',\n 'aria-controls': props.id,\n };\n}\n\nfunction syncTextWithReplica(elem: HTMLTextAreaElement, value?: string) {\n const parent = elem?.parentNode as HTMLElement;\n if (!parent) {\n return;\n }\n if (elem.value === '\\n') {\n return;\n }\n parent.dataset.replicatedValue = value ?? elem.value;\n}\n\nfunction resetReplicaText(elem: HTMLTextAreaElement) {\n const parent = elem?.parentNode as HTMLElement;\n if (parent) {\n delete parent.dataset.replicatedValue;\n }\n}\n\nfunction collapseTextArea(elem: HTMLTextAreaElement) {\n const parent = elem?.parentNode as HTMLElement;\n if (parent) {\n parent.classList.remove('expanded');\n }\n}\n\nfunction expandTextArea(elem: HTMLTextAreaElement) {\n const parent = elem?.parentNode as HTMLElement;\n if (parent) {\n parent.classList.add('expanded');\n }\n}\n\nexport const SearchTextArea: FunctionalComponent<Props> = ({\n textAreaRef,\n loading,\n bindings,\n onInput,\n onFocus,\n onBlur,\n onChange,\n onKeyDown,\n onKeyUp,\n value,\n ariaLabel,\n onClear,\n popup,\n ...defaultInputProps\n}) => (\n <div class=\"flex grow overflow-hidden\">\n <div part=\"textarea-expander\" class=\"grid grow overflow-hidden\">\n <textarea\n part=\"textarea\"\n aria-label={ariaLabel}\n placeholder={bindings.i18n.t('search')}\n class=\"placeholder-neutral-dark\"\n rows={1}\n onInput={(e) => {\n onInput?.(e);\n syncTextWithReplica(textAreaRef);\n }}\n onKeyDown={(e) => {\n syncTextWithReplica(textAreaRef);\n if (e.key === 'Enter') {\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n }\n onKeyDown?.(e);\n }}\n onKeyUp={(e) => {\n onKeyUp?.(e);\n if (e.key === 'Enter') {\n e.preventDefault();\n return;\n }\n syncTextWithReplica(textAreaRef);\n }}\n onBlur={(e) => {\n onBlur?.(e);\n collapseTextArea(textAreaRef);\n syncTextWithReplica(textAreaRef);\n }}\n onChange={(e) => {\n onChange?.(e);\n syncTextWithReplica(textAreaRef);\n }}\n onFocus={(e) => {\n onFocus?.(e);\n const target = e.target as HTMLTextAreaElement;\n syncTextWithReplica(textAreaRef ?? target);\n expandTextArea(textAreaRef ?? target);\n }}\n autocomplete=\"off\"\n {...(popup && getPopupAttributes(popup))}\n {...defaultInputProps}\n value={value}\n />\n </div>\n\n {loading && (\n <div class=\"searchbox-button-wrapper ml-2 flex items-center justify-center\">\n <span\n part=\"loading\"\n class=\"loading mr-2 grid h-5 w-5 animate-spin place-items-center rounded-full bg-linear-to-r\"\n ></span>\n </div>\n )}\n {!loading && value && (\n <TextAreaClearButton\n inputRef={textAreaRef}\n bindings={bindings}\n onClick={() => {\n onClear();\n resetReplicaText(textAreaRef);\n }}\n />\n )}\n </div>\n);\n","export function promiseTimeout<T>(prom: T | Promise<T>, ms: number) {\n let id: NodeJS.Timeout;\n const timeout = new Promise((_, reject) => {\n id = setTimeout(() => {\n reject(new Error('Promise timed out.'));\n }, ms);\n });\n return Promise.race([prom, timeout]).then(() => {\n clearTimeout(id);\n });\n}\n","import {isNullOrUndefined} from '@coveo/bueno';\nimport {forceUpdate} from '@stencil/core';\nimport DOMPurify from 'dompurify';\nimport {debounce} from '../../../utils/debounce-utils';\nimport {promiseTimeout} from '../../../utils/promise-utils';\nimport {\n elementHasNoQuery,\n elementHasQuery,\n type SearchBoxSuggestionElement,\n type SearchBoxSuggestionsBindings,\n type SearchBoxSuggestionsEvent,\n} from './suggestions-common';\n\n/**\n * List of suggestions that will be displayed along other lists (e.g recent queries) when the search box's input is selected.\n */\nexport interface SearchBoxSuggestions {\n /**\n * The search box will sort the position of suggestions using this value, the lowest value being first.\n * By default, the DOM position will be used.\n */\n position: number;\n /**\n * Whether the suggestions should be listed in the right or left panel. By default, the suggestions are listed in the right panel.\n */\n panel?: 'left' | 'right';\n /**\n * Method that returns the list of elements which will be rendered in the list of suggestions.\n */\n renderItems(): SearchBoxSuggestionElement[];\n /**\n * Hook called when the user changes the search box's input value. This can lead to all the query suggestions being updated.\n */\n onInput?(): Promise<unknown>;\n /**\n * Hook called when the current suggested query changes as the user navigates the list of suggestions.\n * This is used for instant results, which are rendered based on the current suggested query.\n * @param q The new current suggested query.\n */\n onSuggestedQueryChange?(q: string): Promise<unknown>;\n}\n\ninterface SearchBoxProps {\n getSearchBoxValue: () => string;\n updateQuery: (suggestedQuery: string) => void;\n getSuggestionTimeout: () => number;\n getNumberOfSuggestionsToDisplay: () => number;\n getSuggestionDelay: () => number;\n getLogger: () => Pick<typeof console, 'warn'>;\n getHost: () => HTMLElement;\n}\n\nexport class SuggestionManager<SearchBoxController> {\n public suggestions: SearchBoxSuggestions[] = [];\n public leftSuggestionElements: SearchBoxSuggestionElement[] = [];\n public rightSuggestionElements: SearchBoxSuggestionElement[] = [];\n public leftPanel: HTMLElement | undefined = undefined;\n public rightPanel: HTMLElement | undefined = undefined;\n public triggerSuggestions: () => Promise<void>;\n public activeDescendant = '';\n public suggestedQuery = '';\n public keyboardActiveDescendant = '';\n\n private queryDataAttribute = 'data-query';\n private suggestionEvents: SearchBoxSuggestionsEvent<SearchBoxController>[] =\n [];\n\n private previousActiveDescendantElement: HTMLElement | null = null;\n private leftSuggestions: SearchBoxSuggestions[] = [];\n private rightSuggestions: SearchBoxSuggestions[] = [];\n\n constructor(private ownerSearchBoxProps: SearchBoxProps) {\n this.triggerSuggestions = debounce(\n () => this.executeQuerySuggestion(),\n this.ownerSearchBoxProps.getSuggestionDelay()\n );\n }\n\n public get partialSuggestionBindings(): Pick<\n SearchBoxSuggestionsBindings<SearchBoxController>,\n | 'suggestedQuery'\n | 'clearSuggestions'\n | 'triggerSuggestions'\n | 'getSuggestions'\n | 'getSuggestionElements'\n > {\n return {\n suggestedQuery: () => this.suggestedQuery,\n clearSuggestions: () => this.clearSuggestions(),\n triggerSuggestions: () => this.triggerSuggestions(),\n getSuggestions: () => this.suggestions,\n getSuggestionElements: () => this.allSuggestionElements,\n };\n }\n\n public get activeDescendantElement(): HTMLElement | null {\n if (!this.hasActiveDescendant) {\n return null;\n }\n\n return (\n this.leftPanel?.querySelector(`#${this.activeDescendant}`) ||\n this.rightPanel?.querySelector(`#${this.activeDescendant}`) ||\n null\n );\n }\n\n public onSubmit() {\n this.clickOnActiveElement();\n this.clearSuggestions();\n }\n\n public updateActiveDescendant(id = '') {\n this.activeDescendant = id;\n forceUpdate(this.ownerSearchBoxProps.getHost());\n }\n\n public updateKeyboardActiveDescendant(id = '') {\n this.keyboardActiveDescendant = id;\n }\n\n public clickOnActiveElement() {\n this.activeDescendantElement?.click();\n this.updateActiveDescendant();\n }\n\n public isRightPanelInFocus() {\n if (\n isNullOrUndefined(this.panelInFocus) ||\n isNullOrUndefined(this.rightPanel)\n ) {\n return false;\n }\n\n return this.panelInFocus === this.rightPanel;\n }\n\n public initializeSuggestions(\n bindings: SearchBoxSuggestionsBindings<SearchBoxController>\n ) {\n this.suggestions = this.suggestionEvents.map((event) => event(bindings));\n }\n\n public registerSuggestionsFromEvent(\n event: CustomEvent<SearchBoxSuggestionsEvent<SearchBoxController>>,\n bindings: SearchBoxSuggestionsBindings<SearchBoxController>\n ) {\n event.preventDefault();\n event.stopPropagation();\n this.suggestionEvents.push(event.detail);\n this.suggestions.push(event.detail(bindings));\n }\n\n public registerSuggestions(suggestions: SearchBoxSuggestions) {\n this.suggestions.push(suggestions);\n }\n\n public get isDoubleList() {\n return Boolean(\n this.leftSuggestionElements.length && this.rightSuggestionElements.length\n );\n }\n\n public focusPanel(side: 'left' | 'right') {\n const panel = side === 'left' ? this.leftPanel : this.rightPanel;\n\n if (this.panelInFocus === panel) {\n return;\n }\n if (panel?.firstElementChild) {\n const panelHasActiveDescendant =\n this.previousActiveDescendantElement &&\n panel.contains(this.previousActiveDescendantElement);\n const newValue = panelHasActiveDescendant\n ? this.previousActiveDescendantElement!\n : (panel.firstElementChild as HTMLElement);\n this.updateDescendants(newValue.id);\n }\n }\n\n public clearSuggestions() {\n this.clearSuggestionElements();\n this.updateActiveDescendant();\n }\n\n public async focusNextValue() {\n if (!this.hasSuggestions || !this.nextOrFirstValue) {\n return;\n }\n\n await this.focusValue(this.nextOrFirstValue as HTMLElement);\n }\n\n public async focusValue(value: HTMLElement) {\n this.updateKeyboardActiveDescendant(value.id);\n this.updateActiveDescendant(value.id);\n this.scrollActiveDescendantIntoView();\n await this.updateQueryFromSuggestion();\n }\n\n public async onSuggestionMouseOver(\n item: SearchBoxSuggestionElement,\n side: 'left' | 'right',\n id: string\n ) {\n const thisPanel = side === 'left' ? this.leftPanel : this.rightPanel;\n // When hovering, always reset the keyboard active descendant\n this.updateKeyboardActiveDescendant();\n if (this.panelInFocus === thisPanel) {\n this.updateActiveDescendant(id);\n } else {\n this.updateDescendants(id);\n }\n if (item.query) {\n await this.updateSuggestedQuery(item.query);\n }\n }\n\n public async onSuggestionClick(item: SearchBoxSuggestionElement, e: Event) {\n if (item.query) {\n this.clearSuggestions();\n await this.updateOwnerSearchboxQuery(item.query);\n }\n item.onSelect?.(e);\n }\n\n public get hasSuggestions() {\n return !!this.allSuggestionElements.length;\n }\n\n public get allSuggestionElements() {\n return [...this.leftSuggestionElements, ...this.rightSuggestionElements];\n }\n\n public async focusPreviousValue() {\n if (this.firstValue === this.activeDescendantElement) {\n this.updateKeyboardActiveDescendant();\n this.updateActiveDescendant();\n return;\n }\n\n if (!this.hasSuggestions || !this.previousOrLastValue) {\n return;\n }\n\n await this.focusValue(this.previousOrLastValue as HTMLElement);\n }\n\n public get hasActiveDescendant() {\n return this.activeDescendant !== '';\n }\n\n private async executeQuerySuggestion() {\n this.updateActiveDescendant();\n const settled = await Promise.allSettled(\n this.suggestions.map((suggestion) =>\n promiseTimeout(\n suggestion.onInput ? suggestion.onInput() : Promise.resolve(),\n this.ownerSearchBoxProps.getSuggestionTimeout()\n )\n )\n );\n\n const fulfilledSuggestions: SearchBoxSuggestions[] = [];\n\n settled.forEach((prom, j) => {\n if (prom.status === 'fulfilled') {\n fulfilledSuggestions.push(this.suggestions[j]);\n } else {\n this.ownerSearchBoxProps\n .getLogger()\n .warn(\n 'Some query suggestions are not being shown because the promise timed out.'\n );\n }\n });\n\n const splitSuggestions = (side: 'left' | 'right', isDefault = false) =>\n fulfilledSuggestions\n .filter(\n (suggestion) =>\n suggestion.panel === side || (!suggestion.panel && isDefault)\n )\n .sort(this.sortSuggestions);\n\n this.leftSuggestions = splitSuggestions('left', true);\n this.leftSuggestionElements = this.getAndFilterLeftSuggestionElements();\n\n this.rightSuggestions = splitSuggestions('right');\n this.rightSuggestionElements = this.getSuggestionElements(\n this.rightSuggestions\n );\n\n const defaultSuggestedQuery =\n this.allSuggestionElements.find(elementHasQuery)?.query || '';\n\n await this.updateSuggestedQuery(defaultSuggestedQuery);\n }\n\n private get lastValue() {\n return this.panelInFocus?.lastElementChild;\n }\n\n private get previousOrLastValue() {\n if (!this.hasActiveDescendant) {\n return this.lastValue?.firstChild;\n }\n\n const parentOfActiveDescendant =\n this.activeDescendantElement?.parentElement;\n return (\n parentOfActiveDescendant?.previousElementSibling?.firstChild ||\n this.firstValue?.firstChild\n );\n }\n\n private sortSuggestions(a: SearchBoxSuggestions, b: SearchBoxSuggestions) {\n return a.position - b.position;\n }\n\n private get nextOrFirstValue() {\n if (!this.hasActiveDescendant) {\n return this.firstValue?.firstChild;\n }\n\n const parentOfActiveDescendant =\n this.activeDescendantElement?.parentElement;\n return (\n parentOfActiveDescendant?.nextElementSibling?.firstChild ||\n this.firstValue?.firstChild\n );\n }\n\n private get firstValue() {\n return this.panelInFocus?.firstElementChild;\n }\n\n private get panelInFocus() {\n if (this.leftPanel?.contains(this.activeDescendantElement)) {\n return this.leftPanel;\n }\n if (this.rightPanel?.contains(this.activeDescendantElement)) {\n return this.rightPanel;\n }\n return this.leftPanel || this.rightPanel;\n }\n\n private scrollActiveDescendantIntoView() {\n this.activeDescendantElement?.scrollIntoView({\n block: 'nearest',\n });\n }\n\n private async updateQueryFromSuggestion() {\n const suggestedQuery = this.activeDescendantElement?.getAttribute(\n this.queryDataAttribute\n );\n await this.updateOwnerSearchboxQuery(suggestedQuery || '');\n }\n\n private async updateOwnerSearchboxQuery(query: string) {\n if (query && this.ownerSearchBoxProps.getSearchBoxValue() !== query) {\n this.ownerSearchBoxProps.updateQuery(query);\n await this.updateSuggestedQuery(query);\n }\n }\n\n private async updateSuggestedQuery(suggestedQuery: string) {\n await Promise.allSettled(\n this.suggestions.map((suggestion) =>\n promiseTimeout(\n suggestion.onSuggestedQueryChange\n ? suggestion.onSuggestedQueryChange(suggestedQuery)\n : Promise.resolve(),\n this.ownerSearchBoxProps.getSuggestionTimeout()\n )\n )\n );\n this.suggestedQuery = suggestedQuery;\n this.updateSuggestionElements(suggestedQuery);\n forceUpdate(this.ownerSearchBoxProps.getHost());\n }\n\n private updateSuggestionElements(query: string) {\n if (!this.isPanelInFocus(this.leftPanel, query)) {\n this.leftSuggestionElements = this.getAndFilterLeftSuggestionElements();\n }\n\n if (!this.isPanelInFocus(this.rightPanel, query)) {\n this.rightSuggestionElements = this.getSuggestionElements(\n this.rightSuggestions\n );\n }\n }\n\n public forceUpdate() {\n this.updateSuggestionElements(this.suggestedQuery);\n forceUpdate(this.ownerSearchBoxProps.getHost());\n }\n\n private isPanelInFocus(\n panel: HTMLElement | undefined,\n query: string\n ): boolean {\n if (!this.activeDescendantElement) {\n return false;\n }\n\n if (query) {\n const escaped = DOMPurify.sanitize(query);\n return !!panel?.querySelector(\n `[${this.queryDataAttribute}=\"${CSS.escape(escaped)}\"]`\n );\n }\n\n return this.activeDescendantElement?.closest('ul') === panel;\n }\n\n private getAndFilterLeftSuggestionElements() {\n const suggestionElements = this.getSuggestionElements(this.leftSuggestions);\n const filterOnDuplicate = new Set();\n\n const out = suggestionElements.filter((suggestionElement) => {\n if (isNullOrUndefined(suggestionElement.query)) {\n return true;\n }\n if (filterOnDuplicate.has(suggestionElement.query)) {\n return false;\n } else {\n filterOnDuplicate.add(suggestionElement.query);\n return true;\n }\n });\n\n return out;\n }\n\n private getSuggestionElements(suggestions: SearchBoxSuggestions[]) {\n const elements = suggestions.flatMap((suggestion) =>\n suggestion.renderItems()\n );\n\n const max =\n this.ownerSearchBoxProps.getNumberOfSuggestionsToDisplay() +\n elements.filter(elementHasNoQuery).length;\n\n return elements.slice(0, max);\n }\n\n private updateDescendants(activeDescendant = '') {\n const newPrevDescendantElement = this.activeDescendantElement;\n this.previousActiveDescendantElement = newPrevDescendantElement;\n this.updateActiveDescendant(activeDescendant);\n }\n\n private clearSuggestionElements() {\n this.leftSuggestionElements = [];\n this.rightSuggestionElements = [];\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["AtomicSuggestionRenderer","parts","part","this","isSelected","suggestion","query","classes","content","isHTMLElement","h","Fragment","ariaLabel","isButton","contentLabel","i18n","t","labelWithType","isMacOS","label","interpolation","escapeValue","position","index","count","lastIndex","isDoubleList","side","ensureContentForRenderedSuggestion","element","replaceChildren","el","HTMLElement","render","onSelect","Host","key","class","id","onMouseDown","e","preventDefault","onClick","onMouseOver","ref"],"sources":["src/components/common/atomic-suggestion-renderer/atomic-suggestion-renderer.tsx"],"sourcesContent":["import {isMacOS} from '@/src/utils/device-utils';\nimport {Component, Fragment, Host, Prop, VNode, h} from '@stencil/core';\nimport {i18n} from 'i18next';\nimport {SearchBoxSuggestionElement} from '../suggestions/suggestions-common';\n\n/**\n * The `atomic-suggestion-renderer` component is used to render individual suggestions. It was created to isolate\n * the rendering logic of the 'content' property of the `SearchBoxSuggestionElement` interface. This property can be Stencil\n * VNode or native Element so there must be a Stencil component to render it. For Lit components using this component, they will\n * use native Elements.\n *\n * @internal\n */\n@Component({\n tag: 'atomic-suggestion-renderer',\n shadow: false,\n})\nexport class AtomicSuggestionRenderer {\n @Prop() public i18n!: i18n;\n @Prop() public id!: string;\n @Prop() public suggestion!: SearchBoxSuggestionElement;\n @Prop() public isSelected!: boolean;\n @Prop() public side!: 'left' | 'right';\n @Prop() public index!: number;\n @Prop() public lastIndex!: number;\n @Prop() public isDoubleList!: boolean;\n @Prop() public onClick?: (e: Event) => void;\n @Prop() public onMouseOver?: (e: Event) => void;\n\n private get parts() {\n let part = 'suggestion';\n if (this.isSelected) {\n part += ' active-suggestion';\n }\n if (this.suggestion.query) {\n part += ' suggestion-with-query';\n }\n if (this.suggestion.part) {\n part += ` ${this.suggestion.part}`;\n }\n return part;\n }\n\n private get classes() {\n return `flex px-4 min-h-10 items-center text-left text-neutral-dark cursor-pointer ${\n this.isSelected ? 'bg-neutral-light' : ''\n }`;\n }\n\n private get content() {\n return this.isHTMLElement(this.suggestion.content) ? (\n <Fragment></Fragment>\n ) : (\n this.suggestion.content\n );\n }\n\n private ariaLabel(isButton: boolean) {\n const contentLabel =\n this.suggestion.ariaLabel ??\n this.suggestion.query ??\n this.i18n.t('no-title');\n\n const labelWithType =\n isMacOS() && isButton\n ? this.i18n.t('search-suggestion-button', {\n label: contentLabel,\n interpolation: {escapeValue: false},\n })\n : contentLabel;\n\n const position = this.index + 1;\n const count = this.lastIndex + 1;\n\n if (!this.isDoubleList) {\n return this.i18n.t('search-suggestion-single-list', {\n label: labelWithType,\n position,\n count,\n interpolation: {escapeValue: false},\n });\n }\n\n return this.i18n.t('search-suggestion-double-list', {\n label: labelWithType,\n position,\n count,\n side: this.i18n.t(this.side === 'left' ? 'left' : 'right'),\n interpolation: {escapeValue: false},\n });\n }\n\n private ensureContentForRenderedSuggestion(element: HTMLElement) {\n if (this.isHTMLElement(this.suggestion.content)) {\n element.replaceChildren(this.suggestion.content);\n }\n }\n\n private isHTMLElement(el: VNode | Element): el is HTMLElement {\n return el instanceof HTMLElement;\n }\n\n render() {\n const isButton = !!(this.suggestion.onSelect || this.suggestion.query);\n\n return (\n <Host class=\"contents\">\n {isButton ? (\n <button\n id={this.id}\n key={this.suggestion.key}\n part={this.parts}\n class={this.classes}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e: Event) => this.onClick?.(e)}\n onMouseOver={(e: Event) => this.onMouseOver?.(e)}\n data-query={this.suggestion.query}\n aria-label={this.ariaLabel(isButton)}\n ref={(el) => {\n if (!el) {\n return;\n }\n this.ensureContentForRenderedSuggestion(el);\n }}\n >\n {this.content}\n </button>\n ) : (\n <span\n id={this.id}\n key={this.suggestion.key}\n part={this.parts}\n class={this.classes}\n aria-label={this.ariaLabel(isButton)}\n ref={(el) => {\n if (!el) {\n return;\n }\n this.ensureContentForRenderedSuggestion(el);\n }}\n >\n {this.content}\n </span>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"mGAiBaA,EAAwB,M,mQAYnC,SAAYC,GACV,IAAIC,EAAO,aACX,GAAIC,KAAKC,WAAY,CACnBF,GAAQ,oB,CAEV,GAAIC,KAAKE,WAAWC,MAAO,CACzBJ,GAAQ,wB,CAEV,GAAIC,KAAKE,WAAWH,KAAM,CACxBA,GAAQ,IAAIC,KAAKE,WAAWH,M,CAE9B,OAAOA,C,CAGT,WAAYK,GACV,MAAO,8EACLJ,KAAKC,WAAa,mBAAqB,I,CAI3C,WAAYI,GACV,OAAOL,KAAKM,cAAcN,KAAKE,WAAWG,SACxCE,EAACC,EAAQ,MAETR,KAAKE,WAAkB,O,CAInB,SAAAO,CAAUC,GAChB,MAAMC,EACJX,KAAKE,WAAWO,WAChBT,KAAKE,WAAWC,OAChBH,KAAKY,KAAKC,EAAE,YAEd,MAAMC,EACJC,KAAaL,EACTV,KAAKY,KAAKC,EAAE,2BAA4B,CACtCG,MAAOL,EACPM,cAAe,CAACC,YAAa,SAE/BP,EAEN,MAAMQ,EAAWnB,KAAKoB,MAAQ,EAC9B,MAAMC,EAAQrB,KAAKsB,UAAY,EAE/B,IAAKtB,KAAKuB,aAAc,CACtB,OAAOvB,KAAKY,KAAKC,EAAE,gCAAiC,CAClDG,MAAOF,EACPK,WACAE,QACAJ,cAAe,CAACC,YAAa,Q,CAIjC,OAAOlB,KAAKY,KAAKC,EAAE,gCAAiC,CAClDG,MAAOF,EACPK,WACAE,QACAG,KAAMxB,KAAKY,KAAKC,EAAEb,KAAKwB,OAAS,OAAS,OAAS,SAClDP,cAAe,CAACC,YAAa,Q,CAIzB,kCAAAO,CAAmCC,GACzC,GAAI1B,KAAKM,cAAcN,KAAKE,WAAWG,SAAU,CAC/CqB,EAAQC,gBAAgB3B,KAAKE,WAAWG,Q,EAIpC,aAAAC,CAAcsB,GACpB,OAAOA,aAAcC,W,CAGvB,MAAAC,GACE,MAAMpB,KAAcV,KAAKE,WAAW6B,UAAY/B,KAAKE,WAAWC,OAEhE,OACEI,EAACyB,EAAI,CAAAC,IAAA,2CAACC,MAAM,YACTxB,EACCH,EAAA,UACE4B,GAAInC,KAAKmC,GACTF,IAAKjC,KAAKE,WAAW+B,IACrBlC,KAAMC,KAAKF,MACXoC,MAAOlC,KAAKI,QACZgC,YAAcC,GAAMA,EAAEC,iBACtBC,QAAUF,GAAarC,KAAKuC,UAAUF,GACtCG,YAAcH,GAAarC,KAAKwC,cAAcH,GAAE,aACpCrC,KAAKE,WAAWC,MAAK,aACrBH,KAAKS,UAAUC,GAC3B+B,IAAMb,IACJ,IAAKA,EAAI,CACP,M,CAEF5B,KAAKyB,mCAAmCG,EAAG,GAG5C5B,KAAKK,SAGRE,EAAA,QACE4B,GAAInC,KAAKmC,GACTF,IAAKjC,KAAKE,WAAW+B,IACrBlC,KAAMC,KAAKF,MACXoC,MAAOlC,KAAKI,QAAO,aACPJ,KAAKS,UAAUC,GAC3B+B,IAAMb,IACJ,IAAKA,EAAI,CACP,M,CAEF5B,KAAKyB,mCAAmCG,EAAG,GAG5C5B,KAAKK,S","ignoreList":[]}