@salla.sa/twilight-components 2.14.466 → 2.14.468

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 (361) hide show
  1. package/dist/cjs/{filepond-ChLzVjJY.js → filepond-C1SAyrFq.js} +1 -1
  2. package/dist/cjs/{filepond-plugin-file-poster-CsFmGjnc.js → filepond-plugin-file-poster-DAhQ7rGa.js} +1 -1
  3. package/dist/cjs/{filepond-plugin-file-validate-size-CHsUG4Ey.js → filepond-plugin-file-validate-size-qfwxpApK.js} +1 -1
  4. package/dist/cjs/{filepond-plugin-file-validate-type-BcOZG5x6.js → filepond-plugin-file-validate-type-BbYanfPf.js} +1 -1
  5. package/dist/cjs/{filepond-plugin-image-edit-Cq0bUS7X.js → filepond-plugin-image-edit-lWdFhMNt.js} +1 -1
  6. package/dist/cjs/{filepond-plugin-image-exif-orientation-D6e7ezt-.js → filepond-plugin-image-exif-orientation-C2wUYBSb.js} +1 -1
  7. package/dist/cjs/{filepond-plugin-image-preview-B0fvWDqM.js → filepond-plugin-image-preview-B1ukjrjT.js} +1 -1
  8. package/dist/cjs/{functions-DQkYfvtq.js → functions-DCSgyun2.js} +1 -1
  9. package/dist/cjs/{index-DTSWXcbN.js → index-CXr_39D8.js} +9 -5
  10. package/dist/cjs/{index-MaPhQdOr.js → index-D3oJJZKW.js} +1 -1
  11. package/dist/cjs/loader.cjs.js +2 -2
  12. package/dist/cjs/{mail-Bgvt2hc9.js → mail-C9D8MHae.js} +2 -2
  13. package/dist/cjs/salla-accordion-body_2.cjs.entry.js +1 -1
  14. package/dist/cjs/salla-accordion_6.cjs.entry.js +1 -1
  15. package/dist/cjs/salla-add-product-button_5.cjs.entry.js +29 -84
  16. package/dist/cjs/salla-advertisement.cjs.entry.js +1 -1
  17. package/dist/cjs/salla-alert_2.cjs.entry.js +1 -1
  18. package/dist/cjs/salla-app-install-alert.cjs.entry.js +1 -1
  19. package/dist/cjs/salla-apps-icons.cjs.entry.js +1 -1
  20. package/dist/cjs/salla-badge.cjs.entry.js +1 -1
  21. package/dist/cjs/salla-booking-field_7.cjs.entry.js +11 -11
  22. package/dist/cjs/salla-bullet-delivery_2.cjs.entry.js +91 -7
  23. package/dist/cjs/salla-cart-coupons.cjs.entry.js +1 -1
  24. package/dist/cjs/salla-cart-item-offers_2.cjs.entry.js +1 -1
  25. package/dist/cjs/salla-cashback-banner.cjs.entry.js +1 -1
  26. package/dist/cjs/salla-comment-form_8.cjs.entry.js +1 -1
  27. package/dist/cjs/salla-conditional-offer.cjs.entry.js +1 -1
  28. package/dist/cjs/salla-contacts.cjs.entry.js +3 -3
  29. package/dist/cjs/salla-cookies-bar.cjs.entry.js +1 -1
  30. package/dist/cjs/salla-count-down.cjs.entry.js +1 -1
  31. package/dist/cjs/salla-custom-fields.cjs.entry.js +1 -1
  32. package/dist/cjs/salla-delivery-promise.cjs.entry.js +1 -1
  33. package/dist/cjs/salla-edit-order-button.cjs.entry.js +1 -1
  34. package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
  35. package/dist/cjs/salla-filters.cjs.entry.js +1 -1
  36. package/dist/cjs/salla-fulfillment-methods.cjs.entry.js +1 -1
  37. package/dist/cjs/salla-gifting.cjs.entry.js +63 -28
  38. package/dist/cjs/salla-hook.cjs.entry.js +1 -1
  39. package/dist/cjs/salla-infinite-scroll.cjs.entry.js +1 -1
  40. package/dist/cjs/salla-installment.cjs.entry.js +1 -1
  41. package/dist/cjs/salla-list-tile.cjs.entry.js +1 -1
  42. package/dist/cjs/salla-localization-modal.cjs.entry.js +1 -1
  43. package/dist/cjs/salla-login-modal.cjs.entry.js +32 -2
  44. package/dist/cjs/salla-loyalty-banner.cjs.entry.js +2 -2
  45. package/dist/cjs/salla-loyalty-hero_2.cjs.entry.js +4 -4
  46. package/dist/cjs/salla-loyalty-panel.cjs.entry.js +3 -3
  47. package/dist/cjs/salla-loyalty-points-banner.cjs.entry.js +1 -1
  48. package/dist/cjs/salla-loyalty-points-history.cjs.entry.js +1 -1
  49. package/dist/cjs/salla-loyalty-prize-item.cjs.entry.js +1 -1
  50. package/dist/cjs/salla-loyalty-program.cjs.entry.js +3 -3
  51. package/dist/cjs/salla-loyalty-reward.cjs.entry.js +2 -2
  52. package/dist/cjs/salla-loyalty.cjs.entry.js +1 -1
  53. package/dist/cjs/salla-maintenance-alert.cjs.entry.js +1 -1
  54. package/dist/cjs/salla-map.cjs.entry.js +1 -1
  55. package/dist/cjs/salla-menu.cjs.entry.js +1 -1
  56. package/dist/cjs/salla-metadata.cjs.entry.js +1 -1
  57. package/dist/cjs/salla-multiple-bundle-product-cart_2.cjs.entry.js +1 -1
  58. package/dist/cjs/salla-multiple-bundle-product-options-modal_2.cjs.entry.js +1 -1
  59. package/dist/cjs/salla-multiple-bundle-product.cjs.entry.js +1 -1
  60. package/dist/cjs/salla-next-order-coupon.cjs.entry.js +1 -1
  61. package/dist/cjs/salla-notification-item.cjs.entry.js +1 -1
  62. package/dist/cjs/salla-notifications.cjs.entry.js +1 -1
  63. package/dist/cjs/salla-offer-modal.cjs.entry.js +1 -1
  64. package/dist/cjs/salla-offer.cjs.entry.js +1 -1
  65. package/dist/cjs/salla-order-branch.cjs.entry.js +1 -1
  66. package/dist/cjs/salla-order-details-multiple-bundle-product.cjs.entry.js +1 -1
  67. package/dist/cjs/salla-order-details-options.cjs.entry.js +1 -1
  68. package/dist/cjs/salla-order-details.cjs.entry.js +1 -1
  69. package/dist/cjs/salla-order-edit-item.cjs.entry.js +1 -1
  70. package/dist/cjs/salla-order-edit-product-card.cjs.entry.js +1 -1
  71. package/dist/cjs/salla-order-edit.cjs.entry.js +1 -1
  72. package/dist/cjs/salla-order-summary.cjs.entry.js +1 -1
  73. package/dist/cjs/salla-order-totals-card.cjs.entry.js +1 -1
  74. package/dist/cjs/salla-orders.cjs.entry.js +1 -1
  75. package/dist/cjs/salla-payments.cjs.entry.js +1 -1
  76. package/dist/cjs/salla-placeholder.cjs.entry.js +1 -1
  77. package/dist/cjs/salla-price-range.cjs.entry.js +1 -1
  78. package/dist/cjs/salla-product-card-embed.cjs.entry.js +1 -1
  79. package/dist/cjs/salla-product-card_2.cjs.entry.js +1 -1
  80. package/dist/cjs/salla-product-size-guide.cjs.entry.js +1 -1
  81. package/dist/cjs/salla-products-list.cjs.entry.js +259 -64
  82. package/dist/cjs/salla-progress-bar.cjs.entry.js +1 -1
  83. package/dist/cjs/salla-quick-order.cjs.entry.js +3 -3
  84. package/dist/cjs/salla-rating-modal.cjs.entry.js +3 -3
  85. package/dist/cjs/salla-reward-action_4.cjs.entry.js +3 -3
  86. package/dist/cjs/salla-scopes.cjs.entry.js +1 -1
  87. package/dist/cjs/salla-search.cjs.entry.js +1 -1
  88. package/dist/cjs/salla-skeleton.cjs.entry.js +1 -1
  89. package/dist/cjs/salla-slider.cjs.entry.js +1 -1
  90. package/dist/cjs/salla-social-share.cjs.entry.js +252 -32
  91. package/dist/cjs/salla-social.cjs.entry.js +1 -1
  92. package/dist/cjs/salla-tab-content_3.cjs.entry.js +4 -4
  93. package/dist/cjs/salla-tiered-offer.cjs.entry.js +1 -1
  94. package/dist/cjs/salla-tooltip.cjs.entry.js +2 -2
  95. package/dist/cjs/salla-trust-badges.cjs.entry.js +1 -1
  96. package/dist/cjs/salla-user-menu.cjs.entry.js +1 -1
  97. package/dist/cjs/salla-user-profile.cjs.entry.js +1 -1
  98. package/dist/cjs/salla-user-settings.cjs.entry.js +2 -2
  99. package/dist/cjs/salla-verify.cjs.entry.js +3 -3
  100. package/dist/cjs/salla-wallet.cjs.entry.js +1 -1
  101. package/dist/cjs/salla-wishlist-actions.cjs.entry.js +329 -0
  102. package/dist/cjs/{tracked-promise-ePwPYqjc.js → tracked-promise-BsYRgTGD.js} +1 -1
  103. package/dist/cjs/twilight.cjs.js +2 -2
  104. package/dist/cjs/{vanilla-picker-l24zONcP.js → vanilla-picker-DkdzTjSC.js} +1 -1
  105. package/dist/collection/collection-manifest.json +2 -1
  106. package/dist/collection/components/salla-bullet-delivery/salla-bullet-delivery.js +90 -6
  107. package/dist/collection/components/salla-gifting/salla-gifting.js +69 -29
  108. package/dist/collection/components/salla-login-modal/salla-login-modal.js +31 -1
  109. package/dist/collection/components/salla-product-options/salla-product-options.css +0 -3
  110. package/dist/collection/components/salla-product-options/salla-product-options.js +28 -84
  111. package/dist/collection/components/salla-products-list/salla-products-list.css +76 -0
  112. package/dist/collection/components/salla-products-list/salla-products-list.js +387 -65
  113. package/dist/collection/components/salla-social-share/salla-social-share.css +161 -0
  114. package/dist/collection/components/salla-social-share/salla-social-share.js +316 -50
  115. package/dist/collection/components/salla-tabs/salla-tab-content.js +1 -1
  116. package/dist/collection/components/salla-tabs/salla-tab-header.js +1 -1
  117. package/dist/collection/components/salla-tabs/salla-tabs.js +1 -1
  118. package/dist/collection/components/salla-tel-input/salla-tel-input.js +1 -1
  119. package/dist/collection/components/salla-tooltip/salla-tooltip.js +1 -1
  120. package/dist/collection/components/salla-user-settings/salla-user-settings.js +1 -1
  121. package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.css +65 -0
  122. package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.js +432 -0
  123. package/dist/components/index.js +5 -5
  124. package/dist/components/salla-bullet-delivery.js +90 -6
  125. package/dist/components/salla-gifting.js +63 -27
  126. package/dist/components/salla-login-modal2.js +31 -1
  127. package/dist/components/salla-product-options2.js +28 -84
  128. package/dist/components/salla-products-list2.js +266 -64
  129. package/dist/components/salla-social-share.js +1 -189
  130. package/dist/components/salla-social-share2.js +420 -0
  131. package/dist/components/salla-tab-content2.js +1 -1
  132. package/dist/components/salla-tab-header2.js +1 -1
  133. package/dist/components/salla-tabs2.js +1 -1
  134. package/dist/components/salla-tel-input2.js +1 -1
  135. package/dist/components/salla-tooltip2.js +1 -1
  136. package/dist/components/salla-user-settings.js +1 -1
  137. package/dist/components/salla-wishlist-actions.d.ts +11 -0
  138. package/dist/components/salla-wishlist-actions.js +375 -0
  139. package/dist/esm/{filepond-C8Bwo-02.js → filepond-C4pZr9nR.js} +1 -1
  140. package/dist/esm/{filepond-plugin-file-poster-Bx3Pf2Jt.js → filepond-plugin-file-poster-CXpAGxT4.js} +1 -1
  141. package/dist/esm/{filepond-plugin-file-validate-size-B855u7Nl.js → filepond-plugin-file-validate-size-Dk4M6ge1.js} +1 -1
  142. package/dist/esm/{filepond-plugin-file-validate-type-Bi5ftj6I.js → filepond-plugin-file-validate-type-DD7qvRsg.js} +1 -1
  143. package/dist/esm/{filepond-plugin-image-edit-BDsvflVi.js → filepond-plugin-image-edit-DMllAEkg.js} +1 -1
  144. package/dist/esm/{filepond-plugin-image-exif-orientation-CIBvl9lW.js → filepond-plugin-image-exif-orientation-BRCbcu_E.js} +1 -1
  145. package/dist/esm/{filepond-plugin-image-preview-iKOdvH4g.js → filepond-plugin-image-preview-DgeylrwN.js} +1 -1
  146. package/dist/esm/{functions-Bc7BItqP.js → functions-DrS7by6t.js} +1 -1
  147. package/dist/esm/{index-TDIoPT-F.js → index-9SnsJoYO.js} +1 -1
  148. package/dist/esm/{index-B4SEH_Fg.js → index-D2yBy7Jh.js} +9 -5
  149. package/dist/esm/loader.js +3 -3
  150. package/dist/esm/{mail-DLNIOD9t.js → mail-DzAIgzdz.js} +2 -2
  151. package/dist/esm/salla-accordion-body_2.entry.js +1 -1
  152. package/dist/esm/salla-accordion_6.entry.js +1 -1
  153. package/dist/esm/salla-add-product-button_5.entry.js +29 -84
  154. package/dist/esm/salla-advertisement.entry.js +1 -1
  155. package/dist/esm/salla-alert_2.entry.js +1 -1
  156. package/dist/esm/salla-app-install-alert.entry.js +1 -1
  157. package/dist/esm/salla-apps-icons.entry.js +1 -1
  158. package/dist/esm/salla-badge.entry.js +1 -1
  159. package/dist/esm/salla-booking-field_7.entry.js +11 -11
  160. package/dist/esm/salla-bullet-delivery_2.entry.js +91 -7
  161. package/dist/esm/salla-cart-coupons.entry.js +1 -1
  162. package/dist/esm/salla-cart-item-offers_2.entry.js +1 -1
  163. package/dist/esm/salla-cashback-banner.entry.js +1 -1
  164. package/dist/esm/salla-comment-form_8.entry.js +1 -1
  165. package/dist/esm/salla-conditional-offer.entry.js +1 -1
  166. package/dist/esm/salla-contacts.entry.js +3 -3
  167. package/dist/esm/salla-cookies-bar.entry.js +1 -1
  168. package/dist/esm/salla-count-down.entry.js +1 -1
  169. package/dist/esm/salla-custom-fields.entry.js +1 -1
  170. package/dist/esm/salla-delivery-promise.entry.js +1 -1
  171. package/dist/esm/salla-edit-order-button.entry.js +1 -1
  172. package/dist/esm/salla-filters-widget.entry.js +1 -1
  173. package/dist/esm/salla-filters.entry.js +1 -1
  174. package/dist/esm/salla-fulfillment-methods.entry.js +1 -1
  175. package/dist/esm/salla-gifting.entry.js +63 -28
  176. package/dist/esm/salla-hook.entry.js +1 -1
  177. package/dist/esm/salla-infinite-scroll.entry.js +1 -1
  178. package/dist/esm/salla-installment.entry.js +1 -1
  179. package/dist/esm/salla-list-tile.entry.js +1 -1
  180. package/dist/esm/salla-localization-modal.entry.js +1 -1
  181. package/dist/esm/salla-login-modal.entry.js +32 -2
  182. package/dist/esm/salla-loyalty-banner.entry.js +2 -2
  183. package/dist/esm/salla-loyalty-hero_2.entry.js +4 -4
  184. package/dist/esm/salla-loyalty-panel.entry.js +3 -3
  185. package/dist/esm/salla-loyalty-points-banner.entry.js +1 -1
  186. package/dist/esm/salla-loyalty-points-history.entry.js +1 -1
  187. package/dist/esm/salla-loyalty-prize-item.entry.js +1 -1
  188. package/dist/esm/salla-loyalty-program.entry.js +3 -3
  189. package/dist/esm/salla-loyalty-reward.entry.js +2 -2
  190. package/dist/esm/salla-loyalty.entry.js +1 -1
  191. package/dist/esm/salla-maintenance-alert.entry.js +1 -1
  192. package/dist/esm/salla-map.entry.js +1 -1
  193. package/dist/esm/salla-menu.entry.js +1 -1
  194. package/dist/esm/salla-metadata.entry.js +1 -1
  195. package/dist/esm/salla-multiple-bundle-product-cart_2.entry.js +1 -1
  196. package/dist/esm/salla-multiple-bundle-product-options-modal_2.entry.js +1 -1
  197. package/dist/esm/salla-multiple-bundle-product.entry.js +1 -1
  198. package/dist/esm/salla-next-order-coupon.entry.js +1 -1
  199. package/dist/esm/salla-notification-item.entry.js +1 -1
  200. package/dist/esm/salla-notifications.entry.js +1 -1
  201. package/dist/esm/salla-offer-modal.entry.js +1 -1
  202. package/dist/esm/salla-offer.entry.js +1 -1
  203. package/dist/esm/salla-order-branch.entry.js +1 -1
  204. package/dist/esm/salla-order-details-multiple-bundle-product.entry.js +1 -1
  205. package/dist/esm/salla-order-details-options.entry.js +1 -1
  206. package/dist/esm/salla-order-details.entry.js +1 -1
  207. package/dist/esm/salla-order-edit-item.entry.js +1 -1
  208. package/dist/esm/salla-order-edit-product-card.entry.js +1 -1
  209. package/dist/esm/salla-order-edit.entry.js +1 -1
  210. package/dist/esm/salla-order-summary.entry.js +1 -1
  211. package/dist/esm/salla-order-totals-card.entry.js +1 -1
  212. package/dist/esm/salla-orders.entry.js +1 -1
  213. package/dist/esm/salla-payments.entry.js +1 -1
  214. package/dist/esm/salla-placeholder.entry.js +1 -1
  215. package/dist/esm/salla-price-range.entry.js +1 -1
  216. package/dist/esm/salla-product-card-embed.entry.js +1 -1
  217. package/dist/esm/salla-product-card_2.entry.js +1 -1
  218. package/dist/esm/salla-product-size-guide.entry.js +1 -1
  219. package/dist/esm/salla-products-list.entry.js +259 -64
  220. package/dist/esm/salla-progress-bar.entry.js +1 -1
  221. package/dist/esm/salla-quick-order.entry.js +3 -3
  222. package/dist/esm/salla-rating-modal.entry.js +3 -3
  223. package/dist/esm/salla-reward-action_4.entry.js +3 -3
  224. package/dist/esm/salla-scopes.entry.js +1 -1
  225. package/dist/esm/salla-search.entry.js +1 -1
  226. package/dist/esm/salla-skeleton.entry.js +1 -1
  227. package/dist/esm/salla-slider.entry.js +1 -1
  228. package/dist/esm/salla-social-share.entry.js +252 -32
  229. package/dist/esm/salla-social.entry.js +1 -1
  230. package/dist/esm/salla-tab-content_3.entry.js +4 -4
  231. package/dist/esm/salla-tiered-offer.entry.js +1 -1
  232. package/dist/esm/salla-tooltip.entry.js +2 -2
  233. package/dist/esm/salla-trust-badges.entry.js +1 -1
  234. package/dist/esm/salla-user-menu.entry.js +1 -1
  235. package/dist/esm/salla-user-profile.entry.js +1 -1
  236. package/dist/esm/salla-user-settings.entry.js +2 -2
  237. package/dist/esm/salla-verify.entry.js +3 -3
  238. package/dist/esm/salla-wallet.entry.js +1 -1
  239. package/dist/esm/salla-wishlist-actions.entry.js +327 -0
  240. package/dist/esm/{tracked-promise-DJMfgq3q.js → tracked-promise-CTcAqNfZ.js} +1 -1
  241. package/dist/esm/twilight.js +3 -3
  242. package/dist/esm/{vanilla-picker-BZ3Kpnm6.js → vanilla-picker-DfeK45Yv.js} +1 -1
  243. package/dist/twilight/{p-7a144cce.entry.js → p-07af3286.entry.js} +1 -1
  244. package/dist/twilight/{p-08fa3250.entry.js → p-08337b2b.entry.js} +1 -1
  245. package/dist/twilight/{p-c4a2f0c4.entry.js → p-08771dff.entry.js} +1 -1
  246. package/dist/twilight/{p-63b6ff19.entry.js → p-0e1bab4f.entry.js} +1 -1
  247. package/dist/twilight/{p-a94c8805.entry.js → p-0eadca17.entry.js} +1 -1
  248. package/dist/twilight/{p-92ecbfb3.entry.js → p-12ccc1ab.entry.js} +1 -1
  249. package/dist/twilight/{p-d1be0cf0.entry.js → p-1574176e.entry.js} +1 -1
  250. package/dist/twilight/{p-b1c9125f.entry.js → p-17015f9c.entry.js} +1 -1
  251. package/dist/twilight/{p-f4326883.entry.js → p-1920b702.entry.js} +1 -1
  252. package/dist/twilight/{p-65cc4abf.entry.js → p-1a1cebfa.entry.js} +1 -1
  253. package/dist/twilight/{p-b22966df.entry.js → p-1a844fda.entry.js} +1 -1
  254. package/dist/twilight/{p-1beccaa5.entry.js → p-1b7ebf47.entry.js} +1 -1
  255. package/dist/twilight/{p-999abe04.entry.js → p-223d7ceb.entry.js} +1 -1
  256. package/dist/twilight/{p-b99ecd2c.entry.js → p-255f5d2a.entry.js} +1 -1
  257. package/dist/twilight/{p-077c5ae5.entry.js → p-266f57de.entry.js} +1 -1
  258. package/dist/twilight/p-28bdf8ec.entry.js +4 -0
  259. package/dist/twilight/{p-089507be.entry.js → p-2c7086ec.entry.js} +1 -1
  260. package/dist/twilight/{p-fe6a634f.entry.js → p-2c7f524a.entry.js} +1 -1
  261. package/dist/twilight/{p-ac91aa4f.entry.js → p-30ea9a82.entry.js} +1 -1
  262. package/dist/twilight/{p-0beaf6f8.entry.js → p-313d38cd.entry.js} +1 -1
  263. package/dist/twilight/{p-70658c1a.entry.js → p-315ce27b.entry.js} +1 -1
  264. package/dist/twilight/p-378d45e2.entry.js +4 -0
  265. package/dist/twilight/{p-96489529.entry.js → p-3c2fe8cd.entry.js} +1 -1
  266. package/dist/twilight/{p-3b416cdd.entry.js → p-3d1e7982.entry.js} +1 -1
  267. package/dist/twilight/{p-7e0bfa67.entry.js → p-3d7c0ac6.entry.js} +1 -1
  268. package/dist/twilight/{p-3e9fb046.entry.js → p-3d8d289e.entry.js} +1 -1
  269. package/dist/twilight/{p-c5b5162c.entry.js → p-4144c908.entry.js} +1 -1
  270. package/dist/twilight/{p-f4a5521e.entry.js → p-453a7bb2.entry.js} +1 -1
  271. package/dist/twilight/{p-7a238d37.entry.js → p-4c457ba5.entry.js} +1 -1
  272. package/dist/twilight/{p-d33fe4fe.entry.js → p-4d3bcacd.entry.js} +1 -1
  273. package/dist/twilight/{p-53c1a65f.entry.js → p-4dedb514.entry.js} +1 -1
  274. package/dist/twilight/{p-eebe55bd.entry.js → p-50dfec0a.entry.js} +1 -1
  275. package/dist/twilight/{p-72627a5b.entry.js → p-53f83426.entry.js} +1 -1
  276. package/dist/twilight/{p-20bed966.entry.js → p-54e9ac89.entry.js} +1 -1
  277. package/dist/twilight/{p-20b24e22.entry.js → p-571b8e00.entry.js} +1 -1
  278. package/dist/twilight/{p-7e0f8832.entry.js → p-5a5057a8.entry.js} +1 -1
  279. package/dist/twilight/{p-5817d5db.entry.js → p-5a9b94f8.entry.js} +1 -1
  280. package/dist/twilight/{p-ac2979bf.entry.js → p-5c1c520a.entry.js} +1 -1
  281. package/dist/twilight/{p-649cca57.entry.js → p-5d06fe77.entry.js} +1 -1
  282. package/dist/twilight/{p-eb7e08dd.entry.js → p-5e433652.entry.js} +1 -1
  283. package/dist/twilight/{p-c605f897.entry.js → p-6046666d.entry.js} +1 -1
  284. package/dist/twilight/{p-ace778dd.entry.js → p-67e23040.entry.js} +1 -1
  285. package/dist/twilight/{p-0c721c37.entry.js → p-6c777951.entry.js} +1 -1
  286. package/dist/twilight/{p-aaf77847.entry.js → p-749dbf27.entry.js} +1 -1
  287. package/dist/twilight/p-7bd464f3.entry.js +4 -0
  288. package/dist/twilight/{p-88a26183.entry.js → p-7ffc1711.entry.js} +1 -1
  289. package/dist/twilight/{p-173638ad.entry.js → p-83b6c374.entry.js} +1 -1
  290. package/dist/twilight/{p-83f3fe92.entry.js → p-8b5d26d3.entry.js} +1 -1
  291. package/dist/twilight/{p-46efd843.entry.js → p-9a0514dd.entry.js} +1 -1
  292. package/dist/twilight/{p-a8a43d8f.entry.js → p-9ba953ab.entry.js} +1 -1
  293. package/dist/twilight/{p-BhwNzoAX.js → p-BGpAIcg-.js} +1 -1
  294. package/dist/twilight/{p-DqcHIrMk.js → p-BHkz1ssL.js} +1 -1
  295. package/dist/twilight/{p-DCiLQw-U.js → p-BZhp8a87.js} +1 -1
  296. package/dist/twilight/{p-1GhsZ-y0.js → p-Bo1nXenO.js} +1 -1
  297. package/dist/twilight/{p-B8tpOftS.js → p-BojnM4VS.js} +1 -1
  298. package/dist/twilight/{p-CzKuXgcx.js → p-CBU9I-zy.js} +1 -1
  299. package/dist/twilight/{p-BPrbqbi4.js → p-CGd7EQZr.js} +1 -1
  300. package/dist/twilight/p-D01LipFK.js +9 -0
  301. package/dist/twilight/{p-B4SEH_Fg.js → p-D2yBy7Jh.js} +2 -2
  302. package/dist/twilight/{p-Bol9M57m.js → p-DSgSJMud.js} +2 -2
  303. package/dist/twilight/{p-DLNIOD9t.js → p-DzAIgzdz.js} +1 -1
  304. package/dist/twilight/{p-26ff2da1.entry.js → p-a0d88c4d.entry.js} +1 -1
  305. package/dist/twilight/{p-7f8b4a78.entry.js → p-a2b53a52.entry.js} +1 -1
  306. package/dist/twilight/{p-c360bc76.entry.js → p-a3e1fafc.entry.js} +1 -1
  307. package/dist/twilight/{p-204b9c34.entry.js → p-a463d567.entry.js} +1 -1
  308. package/dist/twilight/{p-39e531f4.entry.js → p-a6a9e398.entry.js} +1 -1
  309. package/dist/twilight/{p-5a8e7bb9.entry.js → p-a79f60e6.entry.js} +1 -1
  310. package/dist/twilight/{p-36528e88.entry.js → p-aadfd70e.entry.js} +1 -1
  311. package/dist/twilight/{p-7dc4a6ce.entry.js → p-ad0a27e2.entry.js} +1 -1
  312. package/dist/twilight/{p-2a1c12f9.entry.js → p-ae8bd2e7.entry.js} +1 -1
  313. package/dist/twilight/{p-50b92803.entry.js → p-af121bbf.entry.js} +1 -1
  314. package/dist/twilight/p-b0f28806.entry.js +4 -0
  315. package/dist/twilight/{p-7c46d055.entry.js → p-b3f6b725.entry.js} +1 -1
  316. package/dist/twilight/{p-e0e8b5ee.entry.js → p-b7e720e8.entry.js} +1 -1
  317. package/dist/twilight/{p-19748525.entry.js → p-b80016c8.entry.js} +1 -1
  318. package/dist/twilight/{p-19afb593.entry.js → p-c0f40eea.entry.js} +1 -1
  319. package/dist/twilight/p-c4bc10c1.entry.js +4 -0
  320. package/dist/twilight/{p-6bf44c4f.entry.js → p-c637b6bb.entry.js} +1 -1
  321. package/dist/twilight/{p-afb4ffe9.entry.js → p-c6e18746.entry.js} +1 -1
  322. package/dist/twilight/{p-a0433089.entry.js → p-cb855cb3.entry.js} +1 -1
  323. package/dist/twilight/{p-88c110ae.entry.js → p-cbc44b3e.entry.js} +1 -1
  324. package/dist/twilight/{p-d98c3e96.entry.js → p-cbf547f0.entry.js} +1 -1
  325. package/dist/twilight/{p-78cc1984.entry.js → p-cebad615.entry.js} +1 -1
  326. package/dist/twilight/{p-0abda719.entry.js → p-cfd910a8.entry.js} +1 -1
  327. package/dist/twilight/{p-a366dff0.entry.js → p-d0a8b9be.entry.js} +1 -1
  328. package/dist/twilight/{p-921b23fc.entry.js → p-d0cae7da.entry.js} +1 -1
  329. package/dist/twilight/{p-47df8f81.entry.js → p-d861eea6.entry.js} +1 -1
  330. package/dist/twilight/p-daa9c0b3.entry.js +4 -0
  331. package/dist/twilight/{p-7310af57.entry.js → p-db43fa93.entry.js} +1 -1
  332. package/dist/twilight/{p-83beb2f7.entry.js → p-e06a7e19.entry.js} +1 -1
  333. package/dist/twilight/{p-6fb05a50.entry.js → p-e34f68e0.entry.js} +1 -1
  334. package/dist/twilight/{p-5647ab30.entry.js → p-e4cac2a9.entry.js} +1 -1
  335. package/dist/twilight/{p-9f817867.entry.js → p-e5de1833.entry.js} +1 -1
  336. package/dist/twilight/{p-61bbcb2e.entry.js → p-e80ee5b0.entry.js} +2 -2
  337. package/dist/twilight/{p-42523f08.entry.js → p-e8ffc069.entry.js} +1 -1
  338. package/dist/twilight/{p-1027f1df.entry.js → p-ee8c7a5a.entry.js} +1 -1
  339. package/dist/twilight/{p-6667d7e9.entry.js → p-f0dedf42.entry.js} +1 -1
  340. package/dist/twilight/{p-fc2c74e3.entry.js → p-f3a01895.entry.js} +1 -1
  341. package/dist/twilight/{p-e0bafef7.entry.js → p-fb56a444.entry.js} +1 -1
  342. package/dist/twilight/{p-02dac67d.entry.js → p-fe1bced4.entry.js} +1 -1
  343. package/dist/twilight/{p-Cip0ZIcP.js → p-paiaALkJ.js} +1 -1
  344. package/dist/twilight/{p-BNurXH-d.js → p-xz8gqXL9.js} +1 -1
  345. package/dist/twilight/twilight.esm.js +1 -1
  346. package/dist/types/components/salla-bullet-delivery/salla-bullet-delivery.d.ts +16 -0
  347. package/dist/types/components/salla-gifting/gift-schema.d.ts +4 -0
  348. package/dist/types/components/salla-gifting/salla-gifting.d.ts +4 -1
  349. package/dist/types/components/salla-login-modal/salla-login-modal.d.ts +2 -0
  350. package/dist/types/components/salla-product-options/salla-product-options.d.ts +0 -11
  351. package/dist/types/components/salla-products-list/salla-products-list.d.ts +60 -6
  352. package/dist/types/components/salla-social-share/salla-social-share.d.ts +39 -2
  353. package/dist/types/components/salla-wishlist-actions/salla-wishlist-actions.d.ts +93 -0
  354. package/dist/types/components.d.ts +172 -18
  355. package/package.json +5 -5
  356. package/dist/twilight/p-6020ddec.entry.js +0 -4
  357. package/dist/twilight/p-645254eb.entry.js +0 -4
  358. package/dist/twilight/p-99a57ad1.entry.js +0 -4
  359. package/dist/twilight/p-BnjD0Cne.js +0 -9
  360. package/dist/twilight/p-b3456579.entry.js +0 -4
  361. package/dist/twilight/p-d19c0be3.entry.js +0 -4
@@ -6,13 +6,14 @@ import { a as anime } from './anime.es.js';
6
6
  import { S as ShoppingBag } from './shopping-bag.js';
7
7
  import { H as Helper } from './Helper.js';
8
8
 
9
- const sallaProductsListCss = "";
9
+ const sallaProductsListCss = ".s-products-list-selectable-item{position:relative;border-radius:0.5rem;transition:box-shadow 0.15s ease-in-out}.s-products-list-item-selected{box-shadow:0 0 0 2px var(--color-primary)}.s-products-list-select-control{position:absolute;top:10px;inset-inline-start:10px;z-index:5;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.s-products-list-select-checkbox{appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;width:22px;height:22px;margin:0;cursor:pointer;color:var(--color-primary);border:1px solid rgba(0, 0, 0, 0.15);border-radius:6px;background-color:#fff;box-shadow:0 1px 3px rgba(0, 0, 0, 0.2);transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out}.s-products-list-select-checkbox:hover{border-color:var(--color-primary)}.s-products-list-select-checkbox:focus,.s-products-list-select-checkbox:focus-visible{outline:none;border-color:var(--color-primary);box-shadow:0 1px 3px rgba(0, 0, 0, 0.2), 0 0 0 3px color-mix(in srgb, var(--color-primary) 30%, transparent)}.s-products-list-select-checkbox:checked,.s-products-list-select-checkbox:checked:hover,.s-products-list-select-checkbox:checked:focus{background-color:var(--color-primary);border-color:var(--color-primary)}.s-products-list-select-checkbox:checked::after{content:\"\";position:absolute;top:50%;left:50%;width:5px;height:10px;border:solid #fff;border-width:0 2px 2px 0;transform:translate(-50%, -60%) rotate(45deg)}.s-products-list-row-cards .s-products-list-select-control{top:50%;inset-inline-start:14px;transform:translateY(-50%)}.s-products-list-row-cards .s-products-list-selectable-item>:not(.s-products-list-select-control){padding-inline-start:2.75rem}";
10
10
 
11
11
  const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsList extends HTMLElement {
12
12
  constructor() {
13
13
  super();
14
14
  this.__registerHost();
15
15
  this.productsFetched = createEvent(this, "productsFetched", 7);
16
+ this.selectionChanged = createEvent(this, "selectionChanged", 7);
16
17
  /**
17
18
  * Autoload next page when scroll
18
19
  */
@@ -27,6 +28,18 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
27
28
  * <salla-products-list product-card-component="my-custom-card-style2" ...
28
29
  */
29
30
  this.productCardComponent = 'custom-salla-product-card';
31
+ /**
32
+ * Enables multi-selection of products. When enabled, a checkbox overlay is
33
+ * rendered on top of each product card and the selected products are exposed
34
+ * via the `selectionChanged` event, the `salla-products-list::selection.changed`
35
+ * global event and the `getSelected()` method.
36
+ *
37
+ * This is source-agnostic (works for any `source`) and defaults to `false`.
38
+ * On the wishlist page the `salla-wishlist-actions` panel turns it on at
39
+ * runtime (when the customer chooses "share specific items"), so no theme
40
+ * markup changes are required.
41
+ */
42
+ this.selectable = false;
30
43
  // State
31
44
  this.page = 1;
32
45
  this.placeholderText = salla.lang.get('pages.categories.no_products');
@@ -34,10 +47,12 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
34
47
  this.failedLoadMore = salla.lang.get('common.elements.failed_to_load_more');
35
48
  this.currentPage = salla.config.get('page');
36
49
  this.filtersSnapshot = [];
37
- this.lastViewedProductKey = "lastViewedProductId";
38
- this.filtersKey = "filters";
39
- this.infiniteScrollStateKey = "infiniteScrollState";
40
- this.prevCategoryIdKey = "prevCategoryId";
50
+ /** Map of selected products keyed by product id (preserves selection across pagination). */
51
+ this.selectedProducts = new Map();
52
+ this.lastViewedProductKey = 'lastViewedProductId';
53
+ this.filtersKey = 'filters';
54
+ this.infiniteScrollStateKey = 'infiniteScrollState';
55
+ this.prevCategoryIdKey = 'prevCategoryId';
41
56
  this.isProcessing = false; // Tracks if we are processing data
42
57
  this.scrollTimeout = null;
43
58
  this.boundScrollToLastViewedProduct = () => this.scrollToLastViewedProduct();
@@ -46,7 +61,44 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
46
61
  'product.index.latest': 'latest',
47
62
  'product.index.offers': 'offers',
48
63
  'product.index.search': 'search',
49
- 'product.index.sales': 'sales'
64
+ 'product.index.sales': 'sales',
65
+ };
66
+ this.onWishlistItemRemoved = (_response, productId) => {
67
+ if (this.getSource() !== 'wishlist' || !this.wrapper) {
68
+ return;
69
+ }
70
+ const normalizedId = String(productId);
71
+ const cardTag = this.hasCustomComponent ? this.productCardComponent : 'salla-product-card';
72
+ for (const child of Array.from(this.wrapper.children)) {
73
+ const listItem = child;
74
+ const card = child.querySelector(cardTag);
75
+ const id = listItem.product?.id ?? card?.product?.id;
76
+ if (id != null && String(id) === normalizedId) {
77
+ child.remove();
78
+ break;
79
+ }
80
+ }
81
+ // Theme may remove the card first and leave an empty selectable shell.
82
+ for (const child of Array.from(this.wrapper.children)) {
83
+ if (!child.classList.contains('s-products-list-selectable-item')) {
84
+ continue;
85
+ }
86
+ const listItem = child;
87
+ if (listItem.product?.id != null &&
88
+ String(listItem.product.id) === normalizedId &&
89
+ !child.querySelector(cardTag)) {
90
+ child.remove();
91
+ break;
92
+ }
93
+ }
94
+ if (this.selectable) {
95
+ for (const id of Array.from(this.selectedProducts.keys())) {
96
+ if (String(id) === normalizedId) {
97
+ this.selectedProducts.delete(id);
98
+ }
99
+ }
100
+ this.emitSelection();
101
+ }
50
102
  };
51
103
  //TODO:: check why `this.includes` not working!!
52
104
  this.includes = Helper.parseJson(this.includes || this.host.getAttribute('includes'));
@@ -63,15 +115,17 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
63
115
  }
64
116
  connectedCallback() {
65
117
  //Override browser scroll restoration default behaviour
66
- if ("scrollRestoration" in history)
67
- history.scrollRestoration = "manual";
118
+ if ('scrollRestoration' in history)
119
+ history.scrollRestoration = 'manual';
68
120
  // required for scroll restoration case when the component loads before DOM content is completed (slow internet bandwidth /low device specs)
69
121
  window.addEventListener('DOMContentLoaded', this.boundScrollToLastViewedProduct);
70
122
  salla.event.on('salla-filters::changed', filters => this.setFilters(filters));
123
+ salla.event.on('wishlist::removed', this.onWishlistItemRemoved);
71
124
  }
72
125
  disconnectedCallback() {
73
126
  window.removeEventListener('DOMContentLoaded', this.boundScrollToLastViewedProduct);
74
127
  window.removeEventListener('scroll', this.boundHandleScroll);
128
+ salla.event.off('wishlist::removed', this.onWishlistItemRemoved);
75
129
  }
76
130
  /**
77
131
  * Set parsed filters data from URI
@@ -84,7 +138,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
84
138
  window.scrollTo({ top: 0, behavior: 'smooth' });
85
139
  // Create a deep copy of the filters object to avoid mutating the original object
86
140
  this.parsedFilters = JSON.parse(JSON.stringify(filters));
87
- if (this.currentPage?.slug == "product.index" && this.parsedFilters && this.parsedFilters.category_id) {
141
+ if (this.currentPage?.slug == 'product.index' &&
142
+ this.parsedFilters &&
143
+ this.parsedFilters.category_id) {
88
144
  this.currentCategoryIdFilter = [this.parsedFilters.category_id];
89
145
  }
90
146
  return this.reload();
@@ -172,12 +228,12 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
172
228
  }
173
229
  this.nextPage += '&filterable=1';
174
230
  for (const [key, value] of Object.entries(this.parsedFilters || {})) {
175
- if (["string", "number"].includes(typeof value)) {
231
+ if (['string', 'number'].includes(typeof value)) {
176
232
  // @ts-ignore
177
233
  this.nextPage += `&filters[${encodeURIComponent(key)}]=${encodeURIComponent(value)}`;
178
234
  }
179
235
  else if (Array.isArray(value)) {
180
- value.forEach(item => this.nextPage += `&filters[${encodeURIComponent(key)}][]=${encodeURIComponent(item)}`);
236
+ value.forEach(item => (this.nextPage += `&filters[${encodeURIComponent(key)}][]=${encodeURIComponent(item)}`));
181
237
  }
182
238
  else if (typeof value === 'object') {
183
239
  for (const [k, v] of Object.entries(value)) {
@@ -231,7 +287,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
231
287
  //as a request they don't want to let the user to open the product details
232
288
  //todo:: find a better way to handle this request
233
289
  this.getSource() === 'landing-page' && (product.url = '');
234
- const customComponentTag = this.hasCustomComponent ? this.productCardComponent : 'salla-product-card';
290
+ const customComponentTag = this.hasCustomComponent
291
+ ? this.productCardComponent
292
+ : 'salla-product-card';
235
293
  const productCard = document.createElement(customComponentTag);
236
294
  productCard.product = product;
237
295
  // Apply compact layout if requested - set both property and attribute for compatibility
@@ -242,7 +300,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
242
300
  this.applyLandingPageStyles(productCard);
243
301
  this.applyHorizontalCardStyles(productCard);
244
302
  // Attach click event listener to save the current products snapshot
245
- productCard.addEventListener('click', (event) => {
303
+ productCard.addEventListener('click', event => {
246
304
  const target = event.target;
247
305
  // Check if the clicked element is an anchor or inside an anchor
248
306
  const anchor = target.closest('a');
@@ -254,8 +312,69 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
254
312
  }
255
313
  }
256
314
  });
315
+ if (this.selectable) {
316
+ return this.wrapSelectableItem(productCard, product);
317
+ }
257
318
  return productCard;
258
319
  }
320
+ /**
321
+ * Wrap a product card with a selection control. The wrapper mirrors `product`
322
+ * so the scroll-restoration snapshot logic (which reads `child.product`) keeps
323
+ * working, and the card keeps its id for `scrollToLastViewedProduct`.
324
+ */
325
+ wrapSelectableItem(productCard, product) {
326
+ const container = document.createElement('div');
327
+ container.className = 's-products-list-selectable-item';
328
+ container.product = product;
329
+ const isSelected = this.selectedProducts.has(product.id);
330
+ if (isSelected) {
331
+ container.classList.add('s-products-list-item-selected');
332
+ }
333
+ const control = document.createElement('label');
334
+ control.className = 's-products-list-select-control';
335
+ control.setAttribute('aria-label', salla.lang.get('common.elements.select', 'تحديد'));
336
+ const checkbox = document.createElement('input');
337
+ checkbox.type = 'checkbox';
338
+ checkbox.className = 's-products-list-select-checkbox';
339
+ checkbox.checked = isSelected;
340
+ checkbox.addEventListener('change', () => this.toggleSelection(product, container, checkbox.checked));
341
+ control.appendChild(checkbox);
342
+ container.appendChild(control);
343
+ container.appendChild(productCard);
344
+ return container;
345
+ }
346
+ toggleSelection(product, container, checked) {
347
+ if (checked) {
348
+ this.selectedProducts.set(product.id, product);
349
+ container?.classList.add('s-products-list-item-selected');
350
+ }
351
+ else {
352
+ this.selectedProducts.delete(product.id);
353
+ container?.classList.remove('s-products-list-item-selected');
354
+ }
355
+ this.emitSelection();
356
+ }
357
+ emitSelection() {
358
+ const products = Array.from(this.selectedProducts.values());
359
+ const ids = Array.from(this.selectedProducts.keys());
360
+ const detail = { ids, products, count: ids.length };
361
+ this.selectionChanged.emit(detail);
362
+ salla.event.emit('salla-products-list::selection.changed', detail);
363
+ }
364
+ /**
365
+ * Re-render the list when selection mode is toggled at runtime (e.g. enabled
366
+ * by the wishlist actions panel after the list already loaded).
367
+ */
368
+ onSelectableChanged(newValue, oldValue) {
369
+ if (newValue === oldValue || !this.isReady || !this.wrapper) {
370
+ return;
371
+ }
372
+ if (!newValue) {
373
+ this.selectedProducts.clear();
374
+ this.emitSelection();
375
+ }
376
+ this.reload();
377
+ }
259
378
  applyLandingPageStyles(productCard) {
260
379
  if (this.getSource() === 'landing-page' && !this.hasCustomComponent) {
261
380
  productCard.toggleAttribute('hide-add-btn', true);
@@ -273,7 +392,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
273
392
  }
274
393
  waitForResizing(element) {
275
394
  let timeout = null;
276
- return new Promise((resolve) => {
395
+ return new Promise(resolve => {
277
396
  const resizeObserver = new ResizeObserver(() => {
278
397
  clearTimeout(timeout);
279
398
  timeout = setTimeout(() => {
@@ -286,7 +405,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
286
405
  }
287
406
  waitForLayoutStable(element) {
288
407
  let timeout = null;
289
- return new Promise((resolve) => {
408
+ return new Promise(resolve => {
290
409
  const observer = new MutationObserver(() => {
291
410
  clearTimeout(timeout);
292
411
  timeout = setTimeout(() => {
@@ -306,15 +425,14 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
306
425
  // Wait for DOM mutations and layout shifts to stabilize
307
426
  return await Promise.allSettled([
308
427
  this.waitForResizing(element),
309
- this.waitForLayoutStable(element)
428
+ this.waitForLayoutStable(element),
310
429
  ]);
311
430
  }
312
431
  scrollToLastViewedProduct() {
313
432
  const lastViewedProductId = sessionStorage.getItem(this.lastViewedProductKey);
314
433
  if (!lastViewedProductId || salla.url.is_page('product.single'))
315
434
  return;
316
- this.isElementLoaded(`[id*="${lastViewedProductId}"]`)
317
- .then(() => {
435
+ this.isElementLoaded(`[id*="${lastViewedProductId}"]`).then(() => {
318
436
  const productCard = this.wrapper?.querySelector(`[id*="${lastViewedProductId}"]`);
319
437
  if (!productCard)
320
438
  return;
@@ -322,8 +440,12 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
322
440
  const scrollToProductCard = () => {
323
441
  // calculations is located here for last second changes in the ui (ie. sticky header height)
324
442
  productCard.scrollIntoView({ block: 'start', behavior: 'instant' });
325
- const headerSelector = matchMedia('(max-width: 1024px)').matches ? "header .inner" : "ul.main-menu";
326
- const headerHeight = window?.header_is_sticky ? (document.querySelector(headerSelector)?.getBoundingClientRect()?.height ?? 56) : 0;
443
+ const headerSelector = matchMedia('(max-width: 1024px)').matches
444
+ ? 'header .inner'
445
+ : 'ul.main-menu';
446
+ const headerHeight = window?.header_is_sticky
447
+ ? (document.querySelector(headerSelector)?.getBoundingClientRect()?.height ?? 56)
448
+ : 0;
327
449
  const cardsListRowGap = parseInt(getComputedStyle(this.wrapper).rowGap) ?? 16;
328
450
  const productCardOffset = headerHeight + cardsListRowGap;
329
451
  scrollBy({ top: productCardOffset * -1, behavior: 'instant' });
@@ -331,7 +453,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
331
453
  //start scrolling to the product card position
332
454
  requestAnimationFrame(scrollToProductCard);
333
455
  const productImages = productCard.querySelectorAll('img.lazy');
334
- productImages.forEach((image) => {
456
+ productImages.forEach(image => {
335
457
  const productImage = image;
336
458
  const handleImageEvent = () => {
337
459
  requestAnimationFrame(scrollToProductCard);
@@ -348,16 +470,15 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
348
470
  });
349
471
  }
350
472
  isElementLoaded(selector) {
351
- return new Promise((resolve => {
473
+ return new Promise(resolve => {
352
474
  const interval = setInterval(() => {
353
475
  if (document.querySelector(selector)) {
354
476
  clearInterval(interval);
355
477
  return resolve(document.querySelector(selector));
356
478
  }
357
479
  }, 50);
358
- }));
480
+ });
359
481
  }
360
- ;
361
482
  takeStateSnapshot() {
362
483
  const currentPageData = [];
363
484
  // Classic for-loop for performance
@@ -368,7 +489,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
368
489
  const scrollState = {
369
490
  pageIndex: Math.max((this.infiniteScroll?.pageIndex ?? 1) - 1, 1),
370
491
  nextPage: this.nextPage,
371
- currentPageData
492
+ currentPageData,
372
493
  };
373
494
  if (this.isFilterable()) {
374
495
  const existingFilters = sessionStorage.getItem(this.filtersKey);
@@ -415,9 +536,8 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
415
536
  const isDifferentCategory = currentPageSlug
416
537
  ? prevCategory !== currentPageSlug // Compare slugs for special pages
417
538
  : prevCategory !== String(currentPageId); // Compare IDs otherwise
418
- if ((prevCategory && isDifferentCategory && !isHomepage && !isProductPage)
419
- ||
420
- (isHomepage && !this.hasInfiniteScroll)) {
539
+ if ((prevCategory && isDifferentCategory && !isHomepage && !isProductPage) ||
540
+ (isHomepage && !this.hasInfiniteScroll)) {
421
541
  this.removeScrollRestorationSession();
422
542
  this.switchToNormalBehavior = true;
423
543
  return false;
@@ -461,7 +581,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
461
581
  return ['json', 'selected', 'related', 'landing-page', 'recently'].includes(this.getSource());
462
582
  }
463
583
  getSourceValue() {
464
- return this.currentCategoryIdFilter ? this.currentCategoryIdFilter : Helper.getProductsSourceValue(this.source, this.sourceValue);
584
+ return this.currentCategoryIdFilter
585
+ ? this.currentCategoryIdFilter
586
+ : Helper.getProductsSourceValue(this.source, this.sourceValue);
465
587
  }
466
588
  logFetchError(errorPhase, error, fetchPath, http, response) {
467
589
  try {
@@ -472,7 +594,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
472
594
  source: this.getSource(),
473
595
  sourceValue: typeof sourceValue === 'string' && sourceValue.length > 200
474
596
  ? `${sourceValue.slice(0, 200)}…`
475
- : Array.isArray(sourceValue) ? { length: sourceValue.length } : sourceValue,
597
+ : Array.isArray(sourceValue)
598
+ ? { length: sourceValue.length }
599
+ : sourceValue,
476
600
  pageIndex: this.infiniteScroll?.pageIndex,
477
601
  fetchPath,
478
602
  httpStatus: http?.status,
@@ -489,7 +613,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
489
613
  : {}),
490
614
  });
491
615
  }
492
- catch { /* analytics */ }
616
+ catch {
617
+ /* analytics */
618
+ }
493
619
  }
494
620
  appendDataLayer(data) {
495
621
  if (typeof dataLayer !== 'object' || !Array.isArray(dataLayer)) {
@@ -497,29 +623,29 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
497
623
  return;
498
624
  }
499
625
  dataLayer.push({
500
- "event": "impressions",
501
- "ecommerce": {
502
- "currencyCode": salla.config.currency().code,
626
+ event: 'impressions',
627
+ ecommerce: {
628
+ currencyCode: salla.config.currency().code,
503
629
  // "event_id":"", // todo
504
- "impressions": data.map((product, index) => {
630
+ impressions: data.map((product, index) => {
505
631
  return {
506
- "id": product.id,
507
- "name": product.name,
508
- "price": product.price,
509
- "brand": product.brand?.name || '',
510
- "quantity": product.quantity,
632
+ id: product.id,
633
+ name: product.name,
634
+ price: product.price,
635
+ brand: product.brand?.name || '',
636
+ quantity: product.quantity,
511
637
  // "variant": "",
512
- "categories": [
638
+ categories: [
513
639
  {
514
- "name": product.category?.name || salla.config.get('page.title'),
515
- "id": salla.config.get('page.id')
516
- }
640
+ name: product.category?.name || salla.config.get('page.title'),
641
+ id: salla.config.get('page.id'),
642
+ },
517
643
  ],
518
- "category": product.category?.name || salla.config.get('page.title'),
519
- 'position': index + 1
644
+ category: product.category?.name || salla.config.get('page.title'),
645
+ position: index + 1,
520
646
  };
521
- })
522
- }
647
+ }),
648
+ },
523
649
  });
524
650
  }
525
651
  initiateInfiniteScroll() {
@@ -532,7 +658,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
532
658
  history: false,
533
659
  nextPage: this.nextPage,
534
660
  scrollThreshold: shouldApplyManualLoad ? false : this.autoload ? 100 : false,
535
- loadOnScroll: shouldApplyManualLoad ? false : this.autoload
661
+ loadOnScroll: shouldApplyManualLoad ? false : this.autoload,
536
662
  }, true);
537
663
  this.infiniteScroll.pageIndex = this.page;
538
664
  this.infiniteScroll?.on('request', () => {
@@ -643,11 +769,13 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
643
769
  }
644
770
  getInitialData() {
645
771
  this.loading();
646
- return salla.api.withoutNotifier(() => salla.product.api.fetch({
772
+ return salla.api.withoutNotifier(() => salla.product.api
773
+ .fetch({
647
774
  source: Helper.getApiSource(this.getSource()),
648
775
  source_value: this.getSourceValue(),
649
- limit: this.limit
650
- }).then(async (response) => {
776
+ limit: this.limit,
777
+ })
778
+ .then(async (response) => {
651
779
  if (!response.data.length) {
652
780
  this.showPlaceholder = true;
653
781
  this.placeholderLoader && this.placeholderLoader.remove();
@@ -671,9 +799,65 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
671
799
  async loadMore() {
672
800
  this.infiniteScroll?.loadNextPage();
673
801
  }
802
+ /**
803
+ * Get the currently selected products.
804
+ */
805
+ async getSelected() {
806
+ return {
807
+ ids: Array.from(this.selectedProducts.keys()),
808
+ products: Array.from(this.selectedProducts.values()),
809
+ };
810
+ }
811
+ /**
812
+ * Get all products currently rendered in the list (works whether selection
813
+ * is enabled or not). Useful to gather ids for "share all".
814
+ */
815
+ async getLoadedProducts() {
816
+ const products = [];
817
+ if (!this.wrapper) {
818
+ return products;
819
+ }
820
+ for (let i = 0; i < this.wrapper.children.length; i++) {
821
+ const item = this.wrapper.children[i];
822
+ item?.product && products.push(item.product);
823
+ }
824
+ return products;
825
+ }
826
+ /**
827
+ * Select all currently rendered products.
828
+ */
829
+ async selectAll() {
830
+ if (!this.selectable || !this.wrapper) {
831
+ return;
832
+ }
833
+ for (let i = 0; i < this.wrapper.children.length; i++) {
834
+ const item = this.wrapper.children[i];
835
+ if (item?.product) {
836
+ this.selectedProducts.set(item.product.id, item.product);
837
+ item.classList.add('s-products-list-item-selected');
838
+ const checkbox = item.querySelector('.s-products-list-select-checkbox');
839
+ checkbox && (checkbox.checked = true);
840
+ }
841
+ }
842
+ this.emitSelection();
843
+ }
844
+ /**
845
+ * Clear the current selection.
846
+ */
847
+ async clearSelection() {
848
+ this.selectedProducts.clear();
849
+ if (this.wrapper) {
850
+ this.wrapper
851
+ .querySelectorAll('.s-products-list-select-checkbox')
852
+ .forEach((checkbox) => (checkbox.checked = false));
853
+ this.wrapper
854
+ .querySelectorAll('.s-products-list-item-selected')
855
+ .forEach(item => item.classList.remove('s-products-list-item-selected'));
856
+ }
857
+ this.emitSelection();
858
+ }
674
859
  componentWillLoad() {
675
- return salla.onReady()
676
- .then(async () => {
860
+ return salla.onReady().then(async () => {
677
861
  this.hasCustomComponent = !!customElements.get(this.productCardComponent);
678
862
  this.sourceValueIsValid = !!(this.getSourceValue() || this.isSourceWithoutValue());
679
863
  this.hasInfiniteScroll = !this.isAuxiliaryProductsListSource() && !this.limit;
@@ -753,15 +937,16 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
753
937
  });
754
938
  }
755
939
  else {
756
- console.error("No response received after getInitialData.");
940
+ console.error('No response received after getInitialData.');
757
941
  }
758
942
  })
759
943
  .catch(error => {
760
- console.error("Error during initial data fetch:", error);
944
+ console.error('Error during initial data fetch:', error);
761
945
  });
762
946
  }
763
947
  else {
764
- this.firstPageResponse && (await this.handleResponse(this.firstPageResponse, false)).forEach(card => this.wrapper.append(card));
948
+ this.firstPageResponse &&
949
+ (await this.handleResponse(this.firstPageResponse, false)).forEach(card => this.wrapper.append(card));
765
950
  }
766
951
  }
767
952
  canRender() {
@@ -772,16 +957,18 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
772
957
  return '';
773
958
  }
774
959
  if (this.showPlaceholder) {
775
- return h("div", { class: "s-products-list-placeholder" }, h("span", { innerHTML: ShoppingBag }), h("p", null, this.placeholderText));
960
+ return (h("div", { class: "s-products-list-placeholder" }, h("span", { innerHTML: ShoppingBag }), h("p", null, this.placeholderText)));
776
961
  }
777
962
  return (h(Host, { class: "s-products-list" }, h("div", { class: {
778
- "s-products-list-wrapper": true,
963
+ 's-products-list-wrapper': true,
779
964
  's-products-list-horizontal-cards': this.horizontalCards && !this.filtersResults,
780
965
  's-products-list-vertical-cards': !this.horizontalCards && !this.rowCards && !this.filtersResults,
781
966
  's-products-list-row-cards': this.rowCards,
782
967
  's-products-list-compact-cards': this.compactCards,
783
968
  's-products-list-filters-results': this.filtersResults,
784
- }, ref: wrapper => this.wrapper = wrapper }), h("div", { class: "s-infinite-scroll-status", ref: status => this.status = status }, h("p", { class: "s-infinite-scroll-last infinite-scroll-last s-hidden" }, this.endOfText), h("p", { class: "s-infinite-scroll-error infinite-scroll-error s-hidden" }, this.failedLoadMore)), this.autoload && h("div", { class: "s-products-list-loading-wrapper", style: { "display": "none" }, ref: loader => this.loader = loader }, h("span", { class: "s-button-loader s-button-loader-center s-infinite-scroll-btn-loader" })), this.hasInfiniteScroll && this.nextPage && !this.autoload ? (h("div", { class: "s-infinite-scroll-wrapper", style: { "display": "none" }, ref: loadMoreWrapper => this.loadMoreWrapper = loadMoreWrapper }, h("button", { onClick: () => this.loadMore(), class: "s-infinite-scroll-btn s-button-btn s-button-primary" }, h("span", { class: "s-button-text s-infinite-scroll-btn-text" }, this.loadMoreText ? this.loadMoreText : salla.lang.get('common.elements.load_more')), h("span", { class: "s-button-loader s-button-loader-center s-infinite-scroll-btn-loader", ref: btnLoader => this.btnLoader = btnLoader, style: { "display": "none" } })))) : ""));
969
+ }, ref: wrapper => (this.wrapper = wrapper) }), h("div", { class: "s-infinite-scroll-status", ref: status => (this.status = status) }, h("p", { class: "s-infinite-scroll-last infinite-scroll-last s-hidden" }, this.endOfText), h("p", { class: "s-infinite-scroll-error infinite-scroll-error s-hidden" }, this.failedLoadMore)), this.autoload && (h("div", { class: "s-products-list-loading-wrapper", style: { display: 'none' }, ref: loader => (this.loader = loader) }, h("span", { class: "s-button-loader s-button-loader-center s-infinite-scroll-btn-loader" }))), this.hasInfiniteScroll && this.nextPage && !this.autoload ? (h("div", { class: "s-infinite-scroll-wrapper", style: { display: 'none' }, ref: loadMoreWrapper => (this.loadMoreWrapper = loadMoreWrapper) }, h("button", { onClick: () => this.loadMore(), class: "s-infinite-scroll-btn s-button-btn s-button-primary" }, h("span", { class: "s-button-text s-infinite-scroll-btn-text" }, this.loadMoreText
970
+ ? this.loadMoreText
971
+ : salla.lang.get('common.elements.load_more')), h("span", { class: "s-button-loader s-button-loader-center s-infinite-scroll-btn-loader", ref: btnLoader => (this.btnLoader = btnLoader), style: { display: 'none' } })))) : ('')));
785
972
  }
786
973
  init() {
787
974
  this.initiateInfiniteScroll();
@@ -798,14 +985,19 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
798
985
  let title = Helper.getPageTitleForSource(source);
799
986
  try {
800
987
  if (this.getSource() === 'search') {
801
- title = salla.lang.get('common.elements.search_about', { 'word': this.getSourceValue() });
988
+ title = salla.lang.get('common.elements.search_about', { word: this.getSourceValue() });
802
989
  }
803
990
  else if (!title) {
804
991
  let catId = this.parsedFilters.category_id || this.getSourceValue()[0];
805
992
  // get the first filter that its key is category_id, then get the value when filter.value.*.key==catId
806
- title = response.filters?.find(filter => filter.key === 'category_id')?.values?.find(cat => cat.key === catId)?.value ?? '';
993
+ title =
994
+ response.filters
995
+ ?.find(filter => filter.key === 'category_id')
996
+ ?.values?.find(cat => cat.key === catId)?.value ?? '';
807
997
  }
808
- title += (title ? ' - ' : '') + salla.lang.choice('blocks.header.products_count', response.data?.length);
998
+ title +=
999
+ (title ? ' - ' : '') +
1000
+ salla.lang.choice('blocks.header.products_count', response.data?.length);
809
1001
  if (response.data.length === 15) {
810
1002
  title = title.replace(response.data.length, salla.lang.get('common.elements.more_than') + ' ' + response.data.length);
811
1003
  }
@@ -844,6 +1036,9 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
844
1036
  return productCardsView;
845
1037
  }
846
1038
  get host() { return this; }
1039
+ static get watchers() { return {
1040
+ "selectable": ["onSelectableChanged"]
1041
+ }; }
847
1042
  static get style() { return sallaProductsListCss; }
848
1043
  }, [0, "salla-products-list", {
849
1044
  "source": [1537],
@@ -858,6 +1053,7 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
858
1053
  "loadMoreText": [1, "load-more-text"],
859
1054
  "productCardComponent": [1, "product-card-component"],
860
1055
  "includes": [1040],
1056
+ "selectable": [1540],
861
1057
  "page": [32],
862
1058
  "nextPage": [32],
863
1059
  "hasInfiniteScroll": [32],
@@ -875,7 +1071,13 @@ const SallaProductsList = /*@__PURE__*/ proxyCustomElement(class SallaProductsLi
875
1071
  "filtersSnapshot": [32],
876
1072
  "setFilters": [64],
877
1073
  "reload": [64],
878
- "loadMore": [64]
1074
+ "loadMore": [64],
1075
+ "getSelected": [64],
1076
+ "getLoadedProducts": [64],
1077
+ "selectAll": [64],
1078
+ "clearSelection": [64]
1079
+ }, undefined, {
1080
+ "selectable": ["onSelectableChanged"]
879
1081
  }]);
880
1082
  function defineCustomElement() {
881
1083
  if (typeof customElements === "undefined") {