@salla.sa/twilight-components 2.14.439 → 2.14.441

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 (329) hide show
  1. package/dist/cjs/{filepond-DdDLuiM5.js → filepond-CR18WANU.js} +1 -1
  2. package/dist/cjs/{filepond-plugin-file-poster-yMQqced-.js → filepond-plugin-file-poster-BgJLk2xE.js} +1 -1
  3. package/dist/cjs/{filepond-plugin-file-validate-size-ySnuQivZ.js → filepond-plugin-file-validate-size-DdhORRaG.js} +1 -1
  4. package/dist/cjs/{filepond-plugin-file-validate-type-DZR1JS8f.js → filepond-plugin-file-validate-type-Cub0X5ah.js} +1 -1
  5. package/dist/cjs/{filepond-plugin-image-edit-D1I8S80L.js → filepond-plugin-image-edit-DgEsDjWT.js} +1 -1
  6. package/dist/cjs/{filepond-plugin-image-exif-orientation-C9XMlwy1.js → filepond-plugin-image-exif-orientation-BTfUfEsw.js} +1 -1
  7. package/dist/cjs/{filepond-plugin-image-preview-Bb0GALoo.js → filepond-plugin-image-preview-HZ3u1SlT.js} +1 -1
  8. package/dist/cjs/{functions-wi2J1iyx.js → functions-D9RJmmeE.js} +1 -1
  9. package/dist/cjs/{index-gyLHvjDh.js → index-BTssS-W3.js} +1 -1
  10. package/dist/cjs/{index-CzYs-dhm.js → index-ChjKTah1.js} +6 -6
  11. package/dist/cjs/loader.cjs.js +2 -2
  12. package/dist/cjs/salla-accordion-body_2.cjs.entry.js +1 -1
  13. package/dist/cjs/salla-accordion_6.cjs.entry.js +1 -1
  14. package/dist/cjs/salla-add-product-button_5.cjs.entry.js +1 -1
  15. package/dist/cjs/salla-advertisement.cjs.entry.js +1 -1
  16. package/dist/cjs/salla-alert_2.cjs.entry.js +1 -1
  17. package/dist/cjs/salla-app-install-alert.cjs.entry.js +1 -1
  18. package/dist/cjs/salla-apps-icons.cjs.entry.js +1 -1
  19. package/dist/cjs/salla-badge.cjs.entry.js +1 -1
  20. package/dist/cjs/salla-booking-field_7.cjs.entry.js +10 -10
  21. package/dist/cjs/salla-bullet-delivery_2.cjs.entry.js +1 -1
  22. package/dist/cjs/salla-cart-coupons.cjs.entry.js +1 -1
  23. package/dist/cjs/salla-cart-item-offers_2.cjs.entry.js +1 -1
  24. package/dist/cjs/salla-cashback-banner.cjs.entry.js +1 -1
  25. package/dist/cjs/salla-comment-form_8.cjs.entry.js +1 -1
  26. package/dist/cjs/salla-conditional-offer.cjs.entry.js +1 -1
  27. package/dist/cjs/salla-contacts.cjs.entry.js +1 -1
  28. package/dist/cjs/salla-cookies-bar.cjs.entry.js +1 -1
  29. package/dist/cjs/salla-count-down.cjs.entry.js +1 -1
  30. package/dist/cjs/salla-custom-fields.cjs.entry.js +1 -1
  31. package/dist/cjs/salla-delivery-promise.cjs.entry.js +41 -35
  32. package/dist/cjs/salla-edit-order-button.cjs.entry.js +1 -1
  33. package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
  34. package/dist/cjs/salla-filters.cjs.entry.js +1 -1
  35. package/dist/cjs/salla-fulfillment-methods.cjs.entry.js +1 -1
  36. package/dist/cjs/salla-gifting.cjs.entry.js +1 -1
  37. package/dist/cjs/salla-hook.cjs.entry.js +1 -1
  38. package/dist/cjs/salla-infinite-scroll.cjs.entry.js +1 -1
  39. package/dist/cjs/salla-installment.cjs.entry.js +1 -1
  40. package/dist/cjs/salla-list-tile.cjs.entry.js +1 -1
  41. package/dist/cjs/salla-localization-modal.cjs.entry.js +1 -1
  42. package/dist/cjs/salla-login-modal.cjs.entry.js +1 -1
  43. package/dist/cjs/salla-loyalty-banner.cjs.entry.js +2 -2
  44. package/dist/cjs/salla-loyalty-hero_2.cjs.entry.js +2 -2
  45. package/dist/cjs/salla-loyalty-panel.cjs.entry.js +3 -3
  46. package/dist/cjs/salla-loyalty-points-banner.cjs.entry.js +1 -1
  47. package/dist/cjs/salla-loyalty-prize-item.cjs.entry.js +1 -1
  48. package/dist/cjs/salla-loyalty-program.cjs.entry.js +3 -3
  49. package/dist/cjs/salla-loyalty-reward.cjs.entry.js +2 -2
  50. package/dist/cjs/salla-loyalty.cjs.entry.js +1 -1
  51. package/dist/cjs/salla-maintenance-alert.cjs.entry.js +1 -1
  52. package/dist/cjs/salla-map.cjs.entry.js +1 -1
  53. package/dist/cjs/salla-menu.cjs.entry.js +1 -1
  54. package/dist/cjs/salla-metadata.cjs.entry.js +1 -1
  55. package/dist/cjs/salla-multiple-bundle-product-cart_2.cjs.entry.js +247 -42
  56. package/dist/cjs/salla-multiple-bundle-product-options-modal_2.cjs.entry.js +86 -25
  57. package/dist/cjs/salla-multiple-bundle-product.cjs.entry.js +1 -1
  58. package/dist/cjs/salla-next-order-coupon.cjs.entry.js +1 -1
  59. package/dist/cjs/salla-notification-item.cjs.entry.js +1 -1
  60. package/dist/cjs/salla-notifications.cjs.entry.js +1 -1
  61. package/dist/cjs/salla-offer-modal.cjs.entry.js +1 -1
  62. package/dist/cjs/salla-offer.cjs.entry.js +1 -1
  63. package/dist/cjs/salla-order-details-multiple-bundle-product.cjs.entry.js +1 -1
  64. package/dist/cjs/salla-order-details-options.cjs.entry.js +1 -1
  65. package/dist/cjs/salla-order-details.cjs.entry.js +1 -1
  66. package/dist/cjs/salla-order-edit-item.cjs.entry.js +1 -1
  67. package/dist/cjs/salla-order-edit-product-card.cjs.entry.js +1 -1
  68. package/dist/cjs/salla-order-edit.cjs.entry.js +1 -1
  69. package/dist/cjs/salla-order-summary.cjs.entry.js +1 -1
  70. package/dist/cjs/salla-order-totals-card.cjs.entry.js +1 -1
  71. package/dist/cjs/salla-orders.cjs.entry.js +1 -1
  72. package/dist/cjs/salla-payments.cjs.entry.js +1 -1
  73. package/dist/cjs/salla-placeholder.cjs.entry.js +1 -1
  74. package/dist/cjs/salla-price-range.cjs.entry.js +1 -1
  75. package/dist/cjs/salla-product-card-embed.cjs.entry.js +2 -2
  76. package/dist/cjs/salla-product-card_2.cjs.entry.js +1 -1
  77. package/dist/cjs/salla-product-size-guide.cjs.entry.js +1 -1
  78. package/dist/cjs/salla-products-list.cjs.entry.js +1 -1
  79. package/dist/cjs/salla-progress-bar.cjs.entry.js +1 -1
  80. package/dist/cjs/salla-quick-order.cjs.entry.js +1 -1
  81. package/dist/cjs/salla-rating-modal.cjs.entry.js +1 -1
  82. package/dist/cjs/salla-reward-action_4.cjs.entry.js +3 -3
  83. package/dist/cjs/salla-scopes.cjs.entry.js +1 -1
  84. package/dist/cjs/salla-search.cjs.entry.js +1 -1
  85. package/dist/cjs/salla-skeleton.cjs.entry.js +1 -1
  86. package/dist/cjs/salla-slider.cjs.entry.js +1 -1
  87. package/dist/cjs/salla-social-share.cjs.entry.js +1 -1
  88. package/dist/cjs/salla-social.cjs.entry.js +1 -1
  89. package/dist/cjs/salla-tab-content_3.cjs.entry.js +1 -1
  90. package/dist/cjs/salla-tiered-offer.cjs.entry.js +48 -31
  91. package/dist/cjs/salla-tooltip.cjs.entry.js +1 -1
  92. package/dist/cjs/salla-trust-badges.cjs.entry.js +1 -1
  93. package/dist/cjs/salla-user-menu.cjs.entry.js +1 -1
  94. package/dist/cjs/salla-user-profile.cjs.entry.js +1 -1
  95. package/dist/cjs/salla-user-settings.cjs.entry.js +1 -1
  96. package/dist/cjs/salla-verify.cjs.entry.js +1 -1
  97. package/dist/cjs/salla-wallet.cjs.entry.js +1 -1
  98. package/dist/cjs/{tracked-promise-DT3W4yYx.js → tracked-promise-kKXrk2xR.js} +1 -1
  99. package/dist/cjs/twilight.cjs.js +2 -2
  100. package/dist/cjs/{vanilla-picker-BdKuUhUF.js → vanilla-picker-DchwguNU.js} +1 -1
  101. package/dist/collection/components/salla-delivery-promise/delivery-promise-api.js +4 -3
  102. package/dist/collection/components/salla-delivery-promise/salla-delivery-promise.js +38 -25
  103. package/dist/collection/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-details.js +278 -41
  104. package/dist/collection/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-options-modal.js +18 -4
  105. package/dist/collection/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-slider.js +107 -20
  106. package/dist/collection/components/salla-product-card-embed/salla-product-card-embed.css +32 -0
  107. package/dist/collection/components/salla-tiered-offer/salla-tiered-offer.js +47 -30
  108. package/dist/components/index.js +2 -2
  109. package/dist/components/salla-delivery-promise.js +54 -42
  110. package/dist/components/salla-multiple-bundle-product-details2.js +250 -42
  111. package/dist/components/salla-multiple-bundle-product-options-modal2.js +18 -4
  112. package/dist/components/salla-multiple-bundle-product-slider2.js +69 -20
  113. package/dist/components/salla-product-card-embed.js +1 -1
  114. package/dist/components/salla-tiered-offer.js +47 -30
  115. package/dist/esm/{filepond-CuxNx4T_.js → filepond-DKQDCbwV.js} +1 -1
  116. package/dist/esm/{filepond-plugin-file-poster-B0bm9HVP.js → filepond-plugin-file-poster-SawqMYzR.js} +1 -1
  117. package/dist/esm/{filepond-plugin-file-validate-size-Ndd8bi5G.js → filepond-plugin-file-validate-size-BmxmtaD4.js} +1 -1
  118. package/dist/esm/{filepond-plugin-file-validate-type-DrPPjEtZ.js → filepond-plugin-file-validate-type-CCuZxfqE.js} +1 -1
  119. package/dist/esm/{filepond-plugin-image-edit-C96YLlHm.js → filepond-plugin-image-edit-BW1mzub6.js} +1 -1
  120. package/dist/esm/{filepond-plugin-image-exif-orientation-BufhQyn4.js → filepond-plugin-image-exif-orientation-CN08NQm5.js} +1 -1
  121. package/dist/esm/{filepond-plugin-image-preview-xyGt-4PS.js → filepond-plugin-image-preview-HKD_HLA1.js} +1 -1
  122. package/dist/esm/{functions-BXvEy71U.js → functions-hYdCF4RE.js} +1 -1
  123. package/dist/esm/{index-D0jpoyIT.js → index-DMcU-3GG.js} +6 -6
  124. package/dist/esm/{index-BVmIkaqr.js → index-VfKYpHVb.js} +1 -1
  125. package/dist/esm/loader.js +3 -3
  126. package/dist/esm/salla-accordion-body_2.entry.js +1 -1
  127. package/dist/esm/salla-accordion_6.entry.js +1 -1
  128. package/dist/esm/salla-add-product-button_5.entry.js +1 -1
  129. package/dist/esm/salla-advertisement.entry.js +1 -1
  130. package/dist/esm/salla-alert_2.entry.js +1 -1
  131. package/dist/esm/salla-app-install-alert.entry.js +1 -1
  132. package/dist/esm/salla-apps-icons.entry.js +1 -1
  133. package/dist/esm/salla-badge.entry.js +1 -1
  134. package/dist/esm/salla-booking-field_7.entry.js +10 -10
  135. package/dist/esm/salla-bullet-delivery_2.entry.js +1 -1
  136. package/dist/esm/salla-cart-coupons.entry.js +1 -1
  137. package/dist/esm/salla-cart-item-offers_2.entry.js +1 -1
  138. package/dist/esm/salla-cashback-banner.entry.js +1 -1
  139. package/dist/esm/salla-comment-form_8.entry.js +1 -1
  140. package/dist/esm/salla-conditional-offer.entry.js +1 -1
  141. package/dist/esm/salla-contacts.entry.js +1 -1
  142. package/dist/esm/salla-cookies-bar.entry.js +1 -1
  143. package/dist/esm/salla-count-down.entry.js +1 -1
  144. package/dist/esm/salla-custom-fields.entry.js +1 -1
  145. package/dist/esm/salla-delivery-promise.entry.js +41 -35
  146. package/dist/esm/salla-edit-order-button.entry.js +1 -1
  147. package/dist/esm/salla-filters-widget.entry.js +1 -1
  148. package/dist/esm/salla-filters.entry.js +1 -1
  149. package/dist/esm/salla-fulfillment-methods.entry.js +1 -1
  150. package/dist/esm/salla-gifting.entry.js +1 -1
  151. package/dist/esm/salla-hook.entry.js +1 -1
  152. package/dist/esm/salla-infinite-scroll.entry.js +1 -1
  153. package/dist/esm/salla-installment.entry.js +1 -1
  154. package/dist/esm/salla-list-tile.entry.js +1 -1
  155. package/dist/esm/salla-localization-modal.entry.js +1 -1
  156. package/dist/esm/salla-login-modal.entry.js +1 -1
  157. package/dist/esm/salla-loyalty-banner.entry.js +2 -2
  158. package/dist/esm/salla-loyalty-hero_2.entry.js +2 -2
  159. package/dist/esm/salla-loyalty-panel.entry.js +3 -3
  160. package/dist/esm/salla-loyalty-points-banner.entry.js +1 -1
  161. package/dist/esm/salla-loyalty-prize-item.entry.js +1 -1
  162. package/dist/esm/salla-loyalty-program.entry.js +3 -3
  163. package/dist/esm/salla-loyalty-reward.entry.js +2 -2
  164. package/dist/esm/salla-loyalty.entry.js +1 -1
  165. package/dist/esm/salla-maintenance-alert.entry.js +1 -1
  166. package/dist/esm/salla-map.entry.js +1 -1
  167. package/dist/esm/salla-menu.entry.js +1 -1
  168. package/dist/esm/salla-metadata.entry.js +1 -1
  169. package/dist/esm/salla-multiple-bundle-product-cart_2.entry.js +247 -42
  170. package/dist/esm/salla-multiple-bundle-product-options-modal_2.entry.js +86 -25
  171. package/dist/esm/salla-multiple-bundle-product.entry.js +1 -1
  172. package/dist/esm/salla-next-order-coupon.entry.js +1 -1
  173. package/dist/esm/salla-notification-item.entry.js +1 -1
  174. package/dist/esm/salla-notifications.entry.js +1 -1
  175. package/dist/esm/salla-offer-modal.entry.js +1 -1
  176. package/dist/esm/salla-offer.entry.js +1 -1
  177. package/dist/esm/salla-order-details-multiple-bundle-product.entry.js +1 -1
  178. package/dist/esm/salla-order-details-options.entry.js +1 -1
  179. package/dist/esm/salla-order-details.entry.js +1 -1
  180. package/dist/esm/salla-order-edit-item.entry.js +1 -1
  181. package/dist/esm/salla-order-edit-product-card.entry.js +1 -1
  182. package/dist/esm/salla-order-edit.entry.js +1 -1
  183. package/dist/esm/salla-order-summary.entry.js +1 -1
  184. package/dist/esm/salla-order-totals-card.entry.js +1 -1
  185. package/dist/esm/salla-orders.entry.js +1 -1
  186. package/dist/esm/salla-payments.entry.js +1 -1
  187. package/dist/esm/salla-placeholder.entry.js +1 -1
  188. package/dist/esm/salla-price-range.entry.js +1 -1
  189. package/dist/esm/salla-product-card-embed.entry.js +2 -2
  190. package/dist/esm/salla-product-card_2.entry.js +1 -1
  191. package/dist/esm/salla-product-size-guide.entry.js +1 -1
  192. package/dist/esm/salla-products-list.entry.js +1 -1
  193. package/dist/esm/salla-progress-bar.entry.js +1 -1
  194. package/dist/esm/salla-quick-order.entry.js +1 -1
  195. package/dist/esm/salla-rating-modal.entry.js +1 -1
  196. package/dist/esm/salla-reward-action_4.entry.js +3 -3
  197. package/dist/esm/salla-scopes.entry.js +1 -1
  198. package/dist/esm/salla-search.entry.js +1 -1
  199. package/dist/esm/salla-skeleton.entry.js +1 -1
  200. package/dist/esm/salla-slider.entry.js +1 -1
  201. package/dist/esm/salla-social-share.entry.js +1 -1
  202. package/dist/esm/salla-social.entry.js +1 -1
  203. package/dist/esm/salla-tab-content_3.entry.js +1 -1
  204. package/dist/esm/salla-tiered-offer.entry.js +48 -31
  205. package/dist/esm/salla-tooltip.entry.js +1 -1
  206. package/dist/esm/salla-trust-badges.entry.js +1 -1
  207. package/dist/esm/salla-user-menu.entry.js +1 -1
  208. package/dist/esm/salla-user-profile.entry.js +1 -1
  209. package/dist/esm/salla-user-settings.entry.js +1 -1
  210. package/dist/esm/salla-verify.entry.js +1 -1
  211. package/dist/esm/salla-wallet.entry.js +1 -1
  212. package/dist/esm/{tracked-promise-2BTc0cKI.js → tracked-promise-BSIJGUDO.js} +1 -1
  213. package/dist/esm/twilight.js +3 -3
  214. package/dist/esm/{vanilla-picker-DN-pQ4Fw.js → vanilla-picker-DKFizE1R.js} +1 -1
  215. package/dist/twilight/{p-eb352a06.entry.js → p-057303fc.entry.js} +1 -1
  216. package/dist/twilight/{p-bfe0be2b.entry.js → p-0da228bd.entry.js} +1 -1
  217. package/dist/twilight/{p-2ab53408.entry.js → p-0e7eded5.entry.js} +1 -1
  218. package/dist/twilight/p-1344cda3.entry.js +4 -0
  219. package/dist/twilight/{p-c207c587.entry.js → p-1694c751.entry.js} +1 -1
  220. package/dist/twilight/{p-5f7466cf.entry.js → p-169f09fe.entry.js} +1 -1
  221. package/dist/twilight/{p-228413fa.entry.js → p-180ecec6.entry.js} +1 -1
  222. package/dist/twilight/{p-f81452e9.entry.js → p-18788bb9.entry.js} +1 -1
  223. package/dist/twilight/{p-81985743.entry.js → p-21d225b0.entry.js} +1 -1
  224. package/dist/twilight/{p-fc3e6684.entry.js → p-255c1c94.entry.js} +1 -1
  225. package/dist/twilight/{p-378a7e72.entry.js → p-2813f52f.entry.js} +1 -1
  226. package/dist/twilight/{p-0fd165b9.entry.js → p-28312faf.entry.js} +1 -1
  227. package/dist/twilight/p-2a820928.entry.js +4 -0
  228. package/dist/twilight/{p-ef5d5f2a.entry.js → p-2da4174e.entry.js} +1 -1
  229. package/dist/twilight/{p-4a9379a1.entry.js → p-2fb7fda6.entry.js} +1 -1
  230. package/dist/twilight/{p-3c5b9e45.entry.js → p-31b6ab69.entry.js} +1 -1
  231. package/dist/twilight/{p-e2ebc898.entry.js → p-329e0ccf.entry.js} +1 -1
  232. package/dist/twilight/{p-3918f93c.entry.js → p-32b4986d.entry.js} +1 -1
  233. package/dist/twilight/{p-1567d3b0.entry.js → p-373ab9bb.entry.js} +1 -1
  234. package/dist/twilight/{p-c1823790.entry.js → p-37571489.entry.js} +1 -1
  235. package/dist/twilight/{p-79197700.entry.js → p-37871613.entry.js} +1 -1
  236. package/dist/twilight/p-399f5ab8.entry.js +4 -0
  237. package/dist/twilight/{p-adc138bc.entry.js → p-3f65d67b.entry.js} +1 -1
  238. package/dist/twilight/{p-4b6e6fb8.entry.js → p-4b837a59.entry.js} +1 -1
  239. package/dist/twilight/{p-083e5039.entry.js → p-52566485.entry.js} +1 -1
  240. package/dist/twilight/{p-ced32f4a.entry.js → p-53ff0bad.entry.js} +1 -1
  241. package/dist/twilight/{p-d9569632.entry.js → p-5afc64f0.entry.js} +1 -1
  242. package/dist/twilight/{p-0597375e.entry.js → p-5ee27511.entry.js} +1 -1
  243. package/dist/twilight/{p-3e5dbd96.entry.js → p-5f417c00.entry.js} +1 -1
  244. package/dist/twilight/{p-0831e5fc.entry.js → p-608cc0c1.entry.js} +1 -1
  245. package/dist/twilight/{p-0c174f16.entry.js → p-6bc527ce.entry.js} +1 -1
  246. package/dist/twilight/{p-078450b0.entry.js → p-6c3c2930.entry.js} +1 -1
  247. package/dist/twilight/{p-e59b3e07.entry.js → p-745a99a6.entry.js} +1 -1
  248. package/dist/twilight/{p-e58b7d20.entry.js → p-797fb657.entry.js} +1 -1
  249. package/dist/twilight/{p-12a6d03b.entry.js → p-81bc0869.entry.js} +1 -1
  250. package/dist/twilight/{p-5bd8ffe5.entry.js → p-85de11d2.entry.js} +1 -1
  251. package/dist/twilight/{p-3f52dc98.entry.js → p-8ad1aba2.entry.js} +1 -1
  252. package/dist/twilight/{p-68bcb0ba.entry.js → p-8d723a8b.entry.js} +1 -1
  253. package/dist/twilight/{p-631191d2.entry.js → p-8feebf4d.entry.js} +1 -1
  254. package/dist/twilight/{p-77f85461.entry.js → p-90e5db90.entry.js} +1 -1
  255. package/dist/twilight/{p-b73471d3.entry.js → p-939d986e.entry.js} +1 -1
  256. package/dist/twilight/{p-5b106fd4.entry.js → p-93f4a2b4.entry.js} +1 -1
  257. package/dist/twilight/{p-5eec5519.entry.js → p-94539039.entry.js} +1 -1
  258. package/dist/twilight/{p-567ba930.entry.js → p-9581bcc7.entry.js} +1 -1
  259. package/dist/twilight/{p-45708652.entry.js → p-9b3549cd.entry.js} +1 -1
  260. package/dist/twilight/{p-DIsyGRAw.js → p-B4668CGH.js} +1 -1
  261. package/dist/twilight/{p-B3k6Ab4H.js → p-BQ05LMoe.js} +1 -1
  262. package/dist/twilight/{p-DwV68ec-.js → p-BmFzQ6g-.js} +1 -1
  263. package/dist/twilight/{p-OK5pMKD1.js → p-BrqihLUh.js} +1 -1
  264. package/dist/twilight/{p-NBF3VaTJ.js → p-ByYVb96L.js} +1 -1
  265. package/dist/twilight/{p-KmhadCpx.js → p-CCQCS6cn.js} +1 -1
  266. package/dist/twilight/{p-xuGEmDhH.js → p-CI4TbxNl.js} +1 -1
  267. package/dist/twilight/{p-D0jpoyIT.js → p-DMcU-3GG.js} +1 -1
  268. package/dist/twilight/{p-DvcNoEfM.js → p-DwT-8WBr.js} +1 -1
  269. package/dist/twilight/{p-Cq8arVRH.js → p-Dz1v02Mc.js} +2 -2
  270. package/dist/twilight/{p-2dabb075.entry.js → p-a30cbec7.entry.js} +1 -1
  271. package/dist/twilight/{p-1ba82c7d.entry.js → p-abed2dbc.entry.js} +1 -1
  272. package/dist/twilight/{p-9c6752e6.entry.js → p-aca35083.entry.js} +1 -1
  273. package/dist/twilight/{p-d18400bb.entry.js → p-ad2a24ee.entry.js} +1 -1
  274. package/dist/twilight/{p-637168d2.entry.js → p-ad3e6082.entry.js} +1 -1
  275. package/dist/twilight/p-ad3ed8de.entry.js +4 -0
  276. package/dist/twilight/{p-b05ce2ee.entry.js → p-b0882f69.entry.js} +1 -1
  277. package/dist/twilight/{p-03718a72.entry.js → p-b0923292.entry.js} +1 -1
  278. package/dist/twilight/{p-2a511b8a.entry.js → p-b36b9c00.entry.js} +1 -1
  279. package/dist/twilight/{p-04e8106c.entry.js → p-b7aa5687.entry.js} +1 -1
  280. package/dist/twilight/{p-f42fa303.entry.js → p-b9064a54.entry.js} +1 -1
  281. package/dist/twilight/{p-e2ad8bc7.entry.js → p-b9fb7536.entry.js} +1 -1
  282. package/dist/twilight/{p-62c791c6.entry.js → p-bab4e280.entry.js} +1 -1
  283. package/dist/twilight/{p-eec8bdb1.entry.js → p-bd4140b1.entry.js} +1 -1
  284. package/dist/twilight/{p-d60ed03c.entry.js → p-bf500346.entry.js} +1 -1
  285. package/dist/twilight/{p-90afbf42.entry.js → p-c1ce3f7a.entry.js} +1 -1
  286. package/dist/twilight/{p-c05648b2.entry.js → p-c1e5b2f2.entry.js} +1 -1
  287. package/dist/twilight/{p-7bdb6aca.entry.js → p-c3c0ff5b.entry.js} +1 -1
  288. package/dist/twilight/{p-ebc0b840.entry.js → p-c7389707.entry.js} +1 -1
  289. package/dist/twilight/{p-1c53d114.entry.js → p-cbc8df12.entry.js} +1 -1
  290. package/dist/twilight/{p-fd7f2211.entry.js → p-d10bab5b.entry.js} +1 -1
  291. package/dist/twilight/{p-fadab0ac.entry.js → p-d65e45a0.entry.js} +1 -1
  292. package/dist/twilight/{p-ea80046d.entry.js → p-d7d262c3.entry.js} +1 -1
  293. package/dist/twilight/{p-33a52238.entry.js → p-da2f8e8b.entry.js} +1 -1
  294. package/dist/twilight/{p-b7e861b2.entry.js → p-da884485.entry.js} +1 -1
  295. package/dist/twilight/{p-5131149c.entry.js → p-db394617.entry.js} +1 -1
  296. package/dist/twilight/{p-2404e668.entry.js → p-dc2b82cb.entry.js} +1 -1
  297. package/dist/twilight/{p-afdddba9.entry.js → p-dd21610f.entry.js} +1 -1
  298. package/dist/twilight/{p-D-wessdE.js → p-dewEo579.js} +1 -1
  299. package/dist/twilight/{p-6073673e.entry.js → p-e1292b60.entry.js} +1 -1
  300. package/dist/twilight/{p-19ab0abc.entry.js → p-e3a7f1c8.entry.js} +1 -1
  301. package/dist/twilight/{p-9dc45b4d.entry.js → p-e7b5028b.entry.js} +1 -1
  302. package/dist/twilight/{p-baed03c3.entry.js → p-ec33a2ea.entry.js} +1 -1
  303. package/dist/twilight/{p-d44c5dcc.entry.js → p-ec8ddb7f.entry.js} +1 -1
  304. package/dist/twilight/{p-cd47fec2.entry.js → p-f0739410.entry.js} +1 -1
  305. package/dist/twilight/p-f39d6efd.entry.js +4 -0
  306. package/dist/twilight/{p-0adb148a.entry.js → p-f470779e.entry.js} +1 -1
  307. package/dist/twilight/{p-0bbf0061.entry.js → p-f4a6bf88.entry.js} +1 -1
  308. package/dist/twilight/{p-b0f25824.entry.js → p-f5019168.entry.js} +1 -1
  309. package/dist/twilight/{p-133aea32.entry.js → p-f59f94de.entry.js} +1 -1
  310. package/dist/twilight/{p-fa049325.entry.js → p-fc98c574.entry.js} +1 -1
  311. package/dist/twilight/{p-b44d2016.entry.js → p-fdf306f6.entry.js} +1 -1
  312. package/dist/twilight/p-ohGq8vKD.js +4 -0
  313. package/dist/twilight/twilight.esm.js +1 -1
  314. package/dist/types/components/salla-delivery-promise/delivery-promise-api.d.ts +1 -1
  315. package/dist/types/components/salla-delivery-promise/salla-delivery-promise.d.ts +6 -5
  316. package/dist/types/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-details.d.ts +20 -0
  317. package/dist/types/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-options-modal.d.ts +1 -0
  318. package/dist/types/components/salla-multiple-bundle-product/components/salla-multiple-bundle-product-slider.d.ts +9 -0
  319. package/dist/types/components/salla-multiple-bundle-product/interfaces.d.ts +1 -0
  320. package/dist/types/components/salla-tiered-offer/interfaces.d.ts +1 -0
  321. package/dist/types/components/salla-tiered-offer/salla-tiered-offer.d.ts +3 -0
  322. package/dist/types/components.d.ts +21 -0
  323. package/package.json +5 -5
  324. package/dist/twilight/p-4d21d259.entry.js +0 -4
  325. package/dist/twilight/p-COQaiMGv.js +0 -4
  326. package/dist/twilight/p-a0471050.entry.js +0 -4
  327. package/dist/twilight/p-b33c50dc.entry.js +0 -4
  328. package/dist/twilight/p-e4bb0633.entry.js +0 -4
  329. package/dist/twilight/p-eb53ef20.entry.js +0 -4
@@ -2,9 +2,10 @@
2
2
  * Crafted with ❤ by Salla
3
3
  */
4
4
  import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
5
- import { d as defineCustomElement$5 } from './salla-button2.js';
6
- import { d as defineCustomElement$4 } from './salla-loading2.js';
7
- import { d as defineCustomElement$3 } from './salla-modal2.js';
5
+ import { d as defineCustomElement$6 } from './salla-button2.js';
6
+ import { d as defineCustomElement$5 } from './salla-loading2.js';
7
+ import { d as defineCustomElement$4 } from './salla-modal2.js';
8
+ import { d as defineCustomElement$3 } from './salla-searchable-dropdown2.js';
8
9
  import { d as defineCustomElement$2 } from './salla-skeleton2.js';
9
10
 
10
11
  const DEBUG_KEY = 'salla-delivery-promise-debug';
@@ -14,9 +15,10 @@ function log(message, data) {
14
15
  }
15
16
  }
16
17
  /** Fetch available cities for a product's delivery promises. */
17
- async function fetchCities(productId) {
18
- log('fetchCities start', { productId });
19
- const response = await salla.api.request(salla.url.api(`products/${productId}/delivery-promises/cities`));
18
+ async function fetchCities(productId, keyword) {
19
+ log('fetchCities start', { productId, keyword });
20
+ const queryString = keyword != null ? `?keyword=${encodeURIComponent(keyword)}` : '';
21
+ const response = await salla.api.request(salla.url.api(`products/${productId}/delivery-promises/cities${queryString}`));
20
22
  if (!response.success || !Array.isArray(response.data) || response.data.length === 0) {
21
23
  log('fetchCities: no data', { response });
22
24
  return { cities: [] };
@@ -44,15 +46,6 @@ async function fetchDeliveryMessage(productId, id, optionType, isLoginCycleEnabl
44
46
  return message || null;
45
47
  }
46
48
 
47
- /** Filters cities by Arabic/English name (used inside the city-change modal). */
48
- function filterCitiesForModal(cities, query) {
49
- const q = query.trim().toLowerCase();
50
- if (!q) {
51
- return [...cities];
52
- }
53
- return cities.filter(city => city.name.toLowerCase().includes(q) || (city.name_en || '').toLowerCase().includes(q));
54
- }
55
-
56
49
  const INTENT_KEY = 'bullet_delivery_intent';
57
50
  function getIntentStorage() {
58
51
  const rememberLastSession = Boolean(salla.config.get('store.settings.bullet_delivery.settings.remember_last_session'));
@@ -167,21 +160,24 @@ const SallaDeliveryPromise$1 = /*@__PURE__*/ proxyCustomElement(class SallaDeliv
167
160
  this.selectedCity = null;
168
161
  this.isLoadingCities = false;
169
162
  // ── City-change modal state (non–login-cycle) ─────────────────────────
170
- this.modalSearchQuery = '';
171
163
  this.cityPendingSelection = null;
172
- this.isCityPopoverOpen = false;
164
+ this.modalCities = [];
165
+ this.isSearchingCities = false;
166
+ this.citySearchCounter = 0;
173
167
  // ═══════════════════════════════════════════════════════════════════════
174
168
  // Login-cycle (bullet delivery) integration
175
169
  // ═══════════════════════════════════════════════════════════════════════
176
170
  this.onBulletDeliveryConfirmed = () => {
177
171
  this.applyBulletIntent();
178
172
  };
179
- this.handleModalSearchInput = (event) => {
180
- this.modalSearchQuery = event.target.value;
181
- this.isCityPopoverOpen = true;
182
- };
183
- this.handleModalComboboxActivate = () => {
184
- this.isCityPopoverOpen = true;
173
+ this.handleCitySearch = (keyword) => {
174
+ clearTimeout(this.citySearchTimer);
175
+ if (!keyword.trim()) {
176
+ this.modalCities = [...this.cities];
177
+ this.isSearchingCities = false;
178
+ return;
179
+ }
180
+ this.citySearchTimer = setTimeout(() => this.searchCitiesRemote(keyword), 300);
185
181
  };
186
182
  // ═══════════════════════════════════════════════════════════════════════
187
183
  // Header click (dispatches to correct flow)
@@ -290,7 +286,6 @@ const SallaDeliveryPromise$1 = /*@__PURE__*/ proxyCustomElement(class SallaDeliv
290
286
  if (autoCity) {
291
287
  log("delivery promise standard flow autoCity found", autoCity);
292
288
  this.selectedCity = autoCity;
293
- this.modalSearchQuery = getCityDisplayName(autoCity);
294
289
  }
295
290
  await this.loadDeliveryMessage(cityId, 'city');
296
291
  }
@@ -329,14 +324,29 @@ const SallaDeliveryPromise$1 = /*@__PURE__*/ proxyCustomElement(class SallaDeliv
329
324
  if (!this.cityModalRef)
330
325
  return;
331
326
  this.cityPendingSelection = null;
332
- this.isCityPopoverOpen = false;
327
+ this.modalCities = [...this.cities];
333
328
  await this.cityModalRef.setTitle(this.labels.changeCityTitle);
334
329
  await this.cityModalRef.open();
335
330
  }
336
- handleModalSelectCity(city) {
337
- this.cityPendingSelection = city;
338
- this.modalSearchQuery = getCityDisplayName(city);
339
- this.isCityPopoverOpen = false;
331
+ async searchCitiesRemote(keyword) {
332
+ const requestId = ++this.citySearchCounter;
333
+ this.isSearchingCities = true;
334
+ try {
335
+ const { cities } = await fetchCities(this.productId, keyword);
336
+ if (requestId !== this.citySearchCounter)
337
+ return;
338
+ this.modalCities = cities;
339
+ }
340
+ catch {
341
+ if (requestId !== this.citySearchCounter)
342
+ return;
343
+ this.modalCities = [];
344
+ }
345
+ finally {
346
+ if (requestId === this.citySearchCounter) {
347
+ this.isSearchingCities = false;
348
+ }
349
+ }
340
350
  }
341
351
  async handleConfirmCityModal() {
342
352
  if (!this.cityPendingSelection) {
@@ -364,14 +374,11 @@ const SallaDeliveryPromise$1 = /*@__PURE__*/ proxyCustomElement(class SallaDeliv
364
374
  return h("div", { class: "s-delivery-promise-message" }, this.deliveryMessage);
365
375
  }
366
376
  renderCityModalBody() {
367
- const filtered = filterCitiesForModal(this.cities, this.modalSearchQuery);
368
- return (h("div", { class: "s-delivery-promise-modal-body" }, h("label", { class: "s-delivery-promise-modal-field-label", htmlFor: "s-delivery-promise-modal-search" }, this.labels.cityFieldLabel, h("span", { class: "s-delivery-promise-required", "aria-hidden": "true" }, " *")), h("div", { class: "s-delivery-promise-modal-combobox" }, h("div", { class: "s-delivery-promise-modal-search", onClick: this.handleModalComboboxActivate }, h("i", { class: "sicon-search", "aria-hidden": "true" }), h("input", { id: "s-delivery-promise-modal-search", type: "text", class: "form-input", placeholder: this.labels.modalSearchPlaceholder, value: this.modalSearchQuery, onInput: this.handleModalSearchInput, autocomplete: "off", "aria-autocomplete": "list", "aria-expanded": this.isCityPopoverOpen ? 'true' : 'false', "aria-controls": "s-delivery-promise-modal-listbox" })), h("div", { id: "s-delivery-promise-modal-listbox", class: "s-delivery-promise-modal-popover", role: "listbox", hidden: !this.isCityPopoverOpen }, h("div", { class: "s-delivery-promise-modal-list s-scrollbar" }, filtered.length === 0 ? (h("div", { class: "s-delivery-promise-modal-empty" }, this.labels.noResults)) : (filtered.map(city => (h("button", { key: city.id, type: "button", role: "option", class: {
369
- 's-delivery-promise-modal-item': true,
370
- 's-delivery-promise-modal-item--selected': this.cityPendingSelection?.id === city.id,
371
- }, "aria-selected": this.cityPendingSelection?.id === city.id ? 'true' : 'false', onClick: e => {
372
- e.stopPropagation();
373
- this.handleModalSelectCity(city);
374
- } }, h("span", { class: "s-delivery-promise-modal-item-name" }, city.name), this.cityPendingSelection?.id === city.id ? h("i", { class: "sicon-check", "aria-hidden": "true" }) : null)))))))));
377
+ return (h("div", { class: "s-delivery-promise-modal-body" }, h("salla-searchable-dropdown", { label: this.labels.cityFieldLabel, placeholder: this.labels.modalSearchPlaceholder, items: this.modalCities, selectedItem: this.cityPendingSelection, searching: this.isSearchingCities, required: true, noResultsText: this.labels.noResults, inputId: "s-delivery-promise-modal-search", onItemSelected: (e) => {
378
+ this.cityPendingSelection = e.detail;
379
+ }, onSearchInput: (e) => {
380
+ this.handleCitySearch(e.detail);
381
+ } })));
375
382
  }
376
383
  renderCityChangeModal() {
377
384
  if (this.isLoginCycleEnabled)
@@ -406,15 +413,15 @@ const SallaDeliveryPromise$1 = /*@__PURE__*/ proxyCustomElement(class SallaDeliv
406
413
  "cities": [32],
407
414
  "selectedCity": [32],
408
415
  "isLoadingCities": [32],
409
- "modalSearchQuery": [32],
410
416
  "cityPendingSelection": [32],
411
- "isCityPopoverOpen": [32]
417
+ "modalCities": [32],
418
+ "isSearchingCities": [32]
412
419
  }]);
413
420
  function defineCustomElement$1() {
414
421
  if (typeof customElements === "undefined") {
415
422
  return;
416
423
  }
417
- const components = ["salla-delivery-promise", "salla-button", "salla-loading", "salla-modal", "salla-skeleton"];
424
+ const components = ["salla-delivery-promise", "salla-button", "salla-loading", "salla-modal", "salla-searchable-dropdown", "salla-skeleton"];
418
425
  components.forEach(tagName => { switch (tagName) {
419
426
  case "salla-delivery-promise":
420
427
  if (!customElements.get(tagName)) {
@@ -423,15 +430,20 @@ function defineCustomElement$1() {
423
430
  break;
424
431
  case "salla-button":
425
432
  if (!customElements.get(tagName)) {
426
- defineCustomElement$5();
433
+ defineCustomElement$6();
427
434
  }
428
435
  break;
429
436
  case "salla-loading":
430
437
  if (!customElements.get(tagName)) {
431
- defineCustomElement$4();
438
+ defineCustomElement$5();
432
439
  }
433
440
  break;
434
441
  case "salla-modal":
442
+ if (!customElements.get(tagName)) {
443
+ defineCustomElement$4();
444
+ }
445
+ break;
446
+ case "salla-searchable-dropdown":
435
447
  if (!customElements.get(tagName)) {
436
448
  defineCustomElement$3();
437
449
  }
@@ -35,22 +35,37 @@ const SallaMultipleBundleProductDetails = /*@__PURE__*/ proxyCustomElement(class
35
35
  this.productSelectedHandler = null;
36
36
  // handle selecting a product (toggle)
37
37
  this.onSelectProduct = (sectionId, product) => {
38
+ const productId = product.id;
39
+ const wasSelected = this.selectedProducts[sectionId]?.has(productId) ?? false;
40
+ const section = this.sections.find(s => s.id == sectionId);
41
+ if (wasSelected && section && this.isProductSelectionLocked(section)) {
42
+ return;
43
+ }
44
+ if (!wasSelected) {
45
+ if (!section) {
46
+ return;
47
+ }
48
+ if (this.getEffectiveMax(section) !== 1 && this.isAtSelectionLimit(section)) {
49
+ return;
50
+ }
51
+ }
38
52
  this.selectedProducts = {
39
53
  ...this.selectedProducts,
40
54
  [sectionId]: new Set(this.selectedProducts[sectionId] || []),
41
55
  };
42
- const productId = product.id;
43
- const wasSelected = this.selectedProducts[sectionId].has(productId);
44
56
  if (wasSelected) {
45
- // Product is being deselected
46
57
  this.selectedProducts[sectionId].delete(productId);
47
- // Clear form data and modal options for this product in this specific section
48
58
  this.clearProductFormData(productId, sectionId);
49
59
  this.clearProductModalOptions(productId, sectionId);
50
60
  }
51
61
  else {
52
- // Product is being selected
53
- this.selectedProducts[sectionId].add(productId);
62
+ const effectiveMax = this.getEffectiveMax(section);
63
+ if (effectiveMax === 1) {
64
+ this.syncSectionSelection(sectionId, productId);
65
+ }
66
+ else {
67
+ this.selectedProducts[sectionId].add(productId);
68
+ }
54
69
  }
55
70
  // force re-render
56
71
  this.selectedProducts = { ...this.selectedProducts };
@@ -70,31 +85,45 @@ const SallaMultipleBundleProductDetails = /*@__PURE__*/ proxyCustomElement(class
70
85
  [sectionId]: new Set(this.selectedProducts[sectionId] || []),
71
86
  };
72
87
  const productId = product.id;
73
- // Only add if not already selected
74
- if (!this.selectedProducts[sectionId].has(productId)) {
88
+ if (this.selectedProducts[sectionId].has(productId)) {
89
+ return;
90
+ }
91
+ const section = this.sections.find(s => s.id == sectionId);
92
+ if (!section) {
93
+ return;
94
+ }
95
+ const effectiveMax = this.getEffectiveMax(section);
96
+ if (effectiveMax === 1) {
97
+ this.syncSectionSelection(sectionId, productId);
98
+ }
99
+ else if (effectiveMax > 1 && this.isAtSelectionLimit(section)) {
100
+ return;
101
+ }
102
+ else {
75
103
  this.selectedProducts[sectionId].add(productId);
76
- // force re-render
77
- this.selectedProducts = { ...this.selectedProducts };
78
- // dispatch event
79
- salla.event.dispatch('on-bundle-product-selected', {
80
- id: product.id,
81
- name: product.name,
82
- options: product.options,
83
- });
84
104
  }
105
+ this.selectedProducts = { ...this.selectedProducts };
106
+ salla.event.dispatch('on-bundle-product-selected', {
107
+ id: product.id,
108
+ name: product.name,
109
+ options: product.options,
110
+ });
85
111
  };
86
112
  // open product options modal
87
113
  this.onSelectProductOptions = (product, sectionId) => {
88
- // Find the section index from the sectionId
89
- const sectionIndex = this.sections.findIndex(section => section.id == sectionId);
90
- // Find the product index within the section
91
- const section = this.sections.find(section => section.id == sectionId);
92
- const productIndex = section?.products?.findIndex(p => p.id == product.id) ?? 0;
114
+ const section = this.sections.find(s => s.id == sectionId);
115
+ if (!section || !this.canSelectProductInSection(section, product.id)) {
116
+ return;
117
+ }
118
+ const sectionIndex = this.sections.findIndex(s => s.id == sectionId);
119
+ const productIndex = section.products?.findIndex(p => p.id == product.id) ?? 0;
120
+ const isProductAlreadySelected = this.selectedProducts[sectionId]?.has(product.id) ?? false;
93
121
  salla.event.dispatch('multiple-bundle-product-modal::open', {
94
122
  product,
95
123
  sectionId,
96
124
  sectionIndex,
97
125
  productIndex,
126
+ isProductAlreadySelected,
98
127
  });
99
128
  };
100
129
  // Event handlers for bundle slider component
@@ -107,22 +136,164 @@ const SallaMultipleBundleProductDetails = /*@__PURE__*/ proxyCustomElement(class
107
136
  this.onSelectProductOptions(product, sectionId);
108
137
  };
109
138
  }
139
+ isSingleProductSection(section) {
140
+ return (section.products?.length ?? 0) === 1;
141
+ }
142
+ getObligatoryMin(section) {
143
+ const min = section.obligatory_products;
144
+ if (min == null) {
145
+ return 0;
146
+ }
147
+ const numericMin = Number(min);
148
+ return Number.isNaN(numericMin) ? 0 : numericMin;
149
+ }
150
+ isProductSelectionLocked(section) {
151
+ return this.isSingleProductSection(section) && this.getObligatoryMin(section) === 1;
152
+ }
153
+ /** Empty max → cap is the number of products in the section. */
154
+ getEffectiveMax(section) {
155
+ const productCount = section.products?.length ?? 0;
156
+ const max = section.max_obligatory_products;
157
+ if (max != null && max > 0) {
158
+ return Math.min(max, productCount);
159
+ }
160
+ return productCount;
161
+ }
162
+ getSelectedCount(sectionId) {
163
+ return this.selectedProducts[sectionId]?.size ?? 0;
164
+ }
165
+ isAtSelectionLimit(section) {
166
+ return this.getSelectedCount(section.id) >= this.getEffectiveMax(section);
167
+ }
168
+ canSelectProductInSection(section, productId) {
169
+ if (this.selectedProducts[section.id]?.has(productId)) {
170
+ return true;
171
+ }
172
+ if (this.getEffectiveMax(section) === 1) {
173
+ return true;
174
+ }
175
+ return !this.isAtSelectionLimit(section);
176
+ }
177
+ async canSelectBundleProduct(sectionId, productId) {
178
+ const section = this.sections.find(s => s.id == sectionId);
179
+ if (!section) {
180
+ return false;
181
+ }
182
+ return this.canSelectProductInSection(section, productId);
183
+ }
184
+ queryProductCheckbox(sectionId, productIndex) {
185
+ const selector = `input.s-multiple-bundle-product-checkbox[name="bundle[${sectionId}][${productIndex}][id]"]`;
186
+ const form = this.host.closest('form');
187
+ const fromForm = form?.querySelector(selector);
188
+ if (fromForm) {
189
+ return fromForm;
190
+ }
191
+ for (const slider of this.host.querySelectorAll('salla-multiple-bundle-product-slider')) {
192
+ const root = slider.shadowRoot ?? slider;
193
+ const input = root.querySelector(selector);
194
+ if (input) {
195
+ return input;
196
+ }
197
+ }
198
+ return null;
199
+ }
200
+ dispatchBubblingChange(target) {
201
+ requestAnimationFrame(() => {
202
+ target.dispatchEvent(new window.Event('change', { bubbles: true }));
203
+ });
204
+ }
205
+ /** Uncheck checkbox, remove form inputs, and reset modal state for one product slot. */
206
+ clearSectionProductSlot(sectionId, productId, productIndex) {
207
+ const checkbox = this.queryProductCheckbox(sectionId, productIndex);
208
+ if (checkbox) {
209
+ checkbox.checked = false;
210
+ }
211
+ const form = this.host.closest('form');
212
+ if (form) {
213
+ const slotPrefix = `bundle[${sectionId}][${productIndex}]`;
214
+ Array.from(form.querySelectorAll('input')).forEach((input) => {
215
+ const inSlot = input.name?.startsWith(slotPrefix) ?? false;
216
+ if (!inSlot) {
217
+ return;
218
+ }
219
+ if (input.type === 'checkbox' && input.name?.endsWith('][id]')) {
220
+ input.checked = false;
221
+ return;
222
+ }
223
+ input.remove();
224
+ });
225
+ }
226
+ this.clearProductModalOptions(productId, sectionId);
227
+ }
228
+ /** max=1: replace section selection and keep DOM/form in sync. */
229
+ syncSectionSelection(sectionId, productId) {
230
+ const section = this.sections.find(s => s.id == sectionId);
231
+ section?.products?.forEach((product, productIndex) => {
232
+ if (product.id != productId) {
233
+ this.clearSectionProductSlot(sectionId, product.id, productIndex);
234
+ }
235
+ });
236
+ this.selectedProducts[sectionId] = new Set([productId]);
237
+ const selectedIndex = section?.products?.findIndex(p => p.id == productId) ?? -1;
238
+ const checkbox = selectedIndex >= 0 ? this.queryProductCheckbox(sectionId, selectedIndex) : null;
239
+ if (checkbox) {
240
+ checkbox.checked = true;
241
+ this.dispatchBubblingChange(checkbox);
242
+ }
243
+ }
244
+ autoSelectSingleProductSections() {
245
+ if (!this.sections?.length) {
246
+ return;
247
+ }
248
+ const newSelectedProducts = { ...this.selectedProducts };
249
+ let updated = false;
250
+ const selectedEvents = [];
251
+ for (const section of this.sections) {
252
+ if (!this.isProductSelectionLocked(section)) {
253
+ continue;
254
+ }
255
+ const product = section.products?.[0];
256
+ if (!product || (!product.unlimited_quantity && (product.quantity ?? 0) <= 0)) {
257
+ continue;
258
+ }
259
+ const sectionId = section.id;
260
+ const currentSet = new Set(newSelectedProducts[sectionId] || []);
261
+ if (currentSet.has(product.id)) {
262
+ continue;
263
+ }
264
+ currentSet.add(product.id);
265
+ newSelectedProducts[sectionId] = currentSet;
266
+ updated = true;
267
+ selectedEvents.push({ product });
268
+ }
269
+ if (!updated) {
270
+ return;
271
+ }
272
+ this.selectedProducts = newSelectedProducts;
273
+ selectedEvents.forEach(({ product }) => {
274
+ salla.event.dispatch('on-bundle-product-selected', {
275
+ id: product.id,
276
+ name: product.name,
277
+ options: product.options,
278
+ });
279
+ });
280
+ }
110
281
  // Clear form data for a specific product in specific section
111
282
  clearProductFormData(productId, sectionId) {
112
- const form = this.host.closest('form');
113
- if (sectionId) {
114
- // Remove inputs for specific section/productIndex combination
115
- const productInputPattern = `bundle[${sectionId}][`;
116
- const inputsToRemove = Array.from(form.querySelectorAll('input')).filter((input) => input.getAttribute('data-product-id') === String(productId) &&
117
- input.name &&
118
- input.name.startsWith(productInputPattern));
119
- inputsToRemove.forEach(input => input.remove());
283
+ if (sectionId != null) {
284
+ const section = this.sections.find(s => s.id == sectionId);
285
+ const productIndex = section?.products?.findIndex(product => product.id == productId) ?? -1;
286
+ if (productIndex >= 0) {
287
+ this.clearSectionProductSlot(sectionId, productId, productIndex);
288
+ return;
289
+ }
120
290
  }
121
- else {
122
- // Fallback: Remove all hidden inputs related to this product (legacy behavior)
123
- const inputsToRemove = form.querySelectorAll(`[data-product-id="${productId}"]`);
124
- inputsToRemove.forEach(input => input.remove());
291
+ const form = this.host.closest('form');
292
+ if (!form) {
293
+ return;
125
294
  }
295
+ const inputsToRemove = form.querySelectorAll(`[data-product-id="${productId}"]`);
296
+ inputsToRemove.forEach(input => input.remove());
126
297
  }
127
298
  // Clear modal options state for a specific product
128
299
  clearProductModalOptions(productId, sectionId) {
@@ -146,10 +317,42 @@ const SallaMultipleBundleProductDetails = /*@__PURE__*/ proxyCustomElement(class
146
317
  productIndex,
147
318
  });
148
319
  }
149
- renderAccordionHeader(section, selectedCount) {
150
- return (h(Fragment, null, h("h2", { slot: "title" }, section?.name), section?.obligatory_products ? (h("span", { slot: "note" }, salla.lang.get('pages.products.obligatory_products', {
151
- count: section?.obligatory_products || 0,
152
- }))) : '', h("span", { slot: "progress" }, selectedCount, "/", section?.products?.length || 0)));
320
+ getProgressStatus(section) {
321
+ const selectedCount = this.getSelectedCount(section.id);
322
+ const effectiveMax = this.getEffectiveMax(section);
323
+ if (effectiveMax > 0) {
324
+ return `${selectedCount}/${effectiveMax}`;
325
+ }
326
+ return '0';
327
+ }
328
+ getSectionSelectionNote(section) {
329
+ const min = this.getObligatoryMin(section);
330
+ const max = Number(section.max_obligatory_products) || 0;
331
+ const hasMin = min > 0;
332
+ const hasMax = max > 0;
333
+ if (!hasMin && !hasMax) {
334
+ return null;
335
+ }
336
+ if (hasMin && hasMax) {
337
+ if (min === max) {
338
+ return salla.lang.getWithDefault('pages.products.bundle_select_exact', `اختر ${min} منتجات`, { count: min });
339
+ }
340
+ return salla.lang.getWithDefault('pages.products.bundle_select_range', `اختر من ${min} إلى ${max} منتجات`, { min, max });
341
+ }
342
+ if (hasMin) {
343
+ return salla.lang.getWithDefault('pages.products.bundle_select_min', `اختر على الأقل ${min} منتجات`, { min });
344
+ }
345
+ return salla.lang.getWithDefault('pages.products.bundle_select_max', `اختر حتى ${max} منتجات`, { max });
346
+ }
347
+ handleSectionsChange() {
348
+ this.autoSelectSingleProductSections();
349
+ }
350
+ componentWillLoad() {
351
+ this.autoSelectSingleProductSections();
352
+ }
353
+ renderAccordionHeader(section) {
354
+ const selectionNote = this.getSectionSelectionNote(section);
355
+ return (h(Fragment, null, h("h2", { slot: "title" }, section?.name), selectionNote ? h("span", { slot: "note" }, selectionNote) : null, h("span", { slot: "progress" }, this.getProgressStatus(section))));
153
356
  }
154
357
  componentDidLoad() {
155
358
  // Listen for product selected event from modal
@@ -180,16 +383,21 @@ const SallaMultipleBundleProductDetails = /*@__PURE__*/ proxyCustomElement(class
180
383
  }
181
384
  }
182
385
  render() {
183
- return (h(Host, { key: '27a3d6baa97585e983db19522ab2981ecc9e50f1', class: "s-multiple-bundle-product-wrapper" }, h("div", { key: 'c96cf52dfaee161a03a6bf97de267d9942a47a49', class: "s-multiple-bundle-product-wrapper-sections" }, this.sections.map((section, index) => {
184
- const selectedCount = this.selectedProducts[section.id]?.size || 0;
185
- return (h("salla-accordion", { key: section.id, collapsed: index === 0 ? false : true }, h("salla-accordion-head", null, this.renderAccordionHeader(section, selectedCount)), h("salla-accordion-body", null, h("salla-multiple-bundle-product-slider", { section: section, sectionIndex: index, selectedProducts: this.selectedProducts, onProductSelected: this.handleBundleSliderProductSelected, onProductOptionsSelected: this.handleBundleSliderProductOptionsSelected }))));
186
- })), h("salla-multiple-bundle-product-options-modal", { key: '6627ee4f67bcd775b16e470dd4735848e6087fd4' })));
386
+ return (h(Host, { key: '74b123c432e77263cf0ddcf20ab742885c54d5f4', class: "s-multiple-bundle-product-wrapper" }, h("div", { key: '24bef0958a2a7d29bb4485eac08c7e6b8614a00d', class: "s-multiple-bundle-product-wrapper-sections" }, this.sections.map((section, index) => {
387
+ return (h("salla-accordion", { key: section.id, collapsed: index === 0 ? false : true }, h("salla-accordion-head", null, this.renderAccordionHeader(section)), h("salla-accordion-body", null, h("salla-multiple-bundle-product-slider", { section: section, sectionIndex: index, selectedProducts: this.selectedProducts, selectionLimit: this.getEffectiveMax(section), isSelectionLocked: this.isProductSelectionLocked(section), onProductSelected: this.handleBundleSliderProductSelected, onProductOptionsSelected: this.handleBundleSliderProductOptionsSelected }))));
388
+ })), h("salla-multiple-bundle-product-options-modal", { key: '556b4e51a4b79dfc00371a07296556fb74111524' })));
187
389
  }
188
390
  get host() { return this; }
391
+ static get watchers() { return {
392
+ "sections": ["handleSectionsChange"]
393
+ }; }
189
394
  static get style() { return sallaMultipleBundleProductDetailsCss; }
190
395
  }, [0, "salla-multiple-bundle-product-details", {
191
396
  "sections": [16],
192
- "selectedProducts": [32]
397
+ "selectedProducts": [32],
398
+ "canSelectBundleProduct": [64]
399
+ }, undefined, {
400
+ "sections": ["handleSectionsChange"]
193
401
  }]);
194
402
  function defineCustomElement() {
195
403
  if (typeof customElements === "undefined") {
@@ -34,6 +34,7 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
34
34
  this.isLoading = false;
35
35
  this.hasUnsavedChanges = false;
36
36
  this.validationErrors = [];
37
+ this.isProductAlreadySelected = false;
37
38
  }
38
39
  /**
39
40
  * Generate a unique cache key for selected options using section ID, product index, and product ID
@@ -95,6 +96,7 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
95
96
  this.sectionId = data.sectionId || null;
96
97
  this.sectionIndex = data.sectionIndex || 0;
97
98
  this.productIndex = data.productIndex || 0;
99
+ this.isProductAlreadySelected = !!data.isProductAlreadySelected;
98
100
  this.open();
99
101
  };
100
102
  salla.event.on('multiple-bundle-product-modal::open', this.modalOpenListener);
@@ -125,6 +127,10 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
125
127
  // Extract section info from the checkbox name: bundle[sectionId][productIndex][id]
126
128
  const nameMatch = target.name.match(/^bundle\[([^\]]+)\]\[([^\]]+)\]\[id\]$/);
127
129
  if (nameMatch && !target.checked) {
130
+ if (target.getAttribute('data-selection-locked') === 'true') {
131
+ target.checked = true;
132
+ return;
133
+ }
128
134
  const [, sectionId, productIndex] = nameMatch;
129
135
  const productId = target.value;
130
136
  const form = this.host.closest('form');
@@ -363,6 +369,14 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
363
369
  salla.notify.error(this.validationErrors.join(', '));
364
370
  return;
365
371
  }
372
+ if (!this.isProductAlreadySelected && this.sectionId != null) {
373
+ const details = this.host.closest('salla-multiple-bundle-product-details');
374
+ const canSelect = await details?.canSelectBundleProduct(this.sectionId, productId);
375
+ if (!canSelect) {
376
+ salla.notify.error(salla.lang.getWithDefault('pages.products.bundle_selection_limit_reached', 'لا يمكنك اختيار المزيد من المنتجات في هذا القسم'));
377
+ return;
378
+ }
379
+ }
366
380
  this.isLoading = true;
367
381
  try {
368
382
  // please don't change this with this.host.querySelector it will return null
@@ -479,7 +493,7 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
479
493
  const cacheKey = this.generateCacheKey(this.sectionId, this.productIndex, productId);
480
494
  const resetToken = this.optionsResetTokens[cacheKey] || 0;
481
495
  const isDisabled = this.isLoading || optionsWithSelectedState.some(opt => opt.details.some(d => d.is_selected && d.is_out === true));
482
- return (h(Host, { key: 'd9dc4018798fe902048f3e3e37fcb2edf84713b0' }, h("salla-modal", { key: 'af3cc56a9c2c969dc0cbb2b4caba14fd270a11bb', isLoading: this.isLoading, ref: el => (this.modal = el), width: "md", centered: false, id: `s-multiple-bundle-product-options-modal-options-${productId}`, class: "s-multiple-bundle-product-options-modal-wrapper" }, h("div", { key: '10fcc08be35bfd4231f9cf48501614ae49a985a3', slot: "loading" }, h("salla-skeleton", { key: '1aee9616e4f05188067708506352b0d97d504696', height: "100%", width: "100%" })), this.product?.images && this.product?.images.length > 0 && (h("salla-slider", { key: 'a7d7a459d383c353b5ef716365ba0a0ac5d3a0b7', id: `details-slider-${this.product?.id}`, type: "thumbs", loop: false, "auto-height": true, "listen-to-thumbnails-option": true, showThumbsControls: false, controlsOuter: false, showControls: false, class: "s-multiple-bundle-product-options-modal-slider", verticalThumbs: true, thumbsConfig: {
496
+ return (h(Host, { key: '6c1d1d3911867e30240676f3e2b7353e9ecf76c3' }, h("salla-modal", { key: 'b02110d80cd422d64962d78812ae0b0637c56237', isLoading: this.isLoading, ref: el => (this.modal = el), width: "md", centered: false, id: `s-multiple-bundle-product-options-modal-options-${productId}`, class: "s-multiple-bundle-product-options-modal-wrapper" }, h("div", { key: '20a52bbc732c6edfffde86577e99bbe300a1a4c8', slot: "loading" }, h("salla-skeleton", { key: '3a69fc75939d8b8f8639983d0f2f8dd8bf961152', height: "100%", width: "100%" })), this.product?.images && this.product?.images.length > 0 && (h("salla-slider", { key: '185639c54f79188093df98ac1cece1958879f71d', id: `details-slider-${this.product?.id}`, type: "thumbs", loop: false, "auto-height": true, "listen-to-thumbnails-option": true, showThumbsControls: false, controlsOuter: false, showControls: false, class: "s-multiple-bundle-product-options-modal-slider", verticalThumbs: true, thumbsConfig: {
483
497
  centeredSlides: true,
484
498
  centeredSlidesBounds: true,
485
499
  slidesPerView: Math.min(5, Math.max(1, this.product?.images.length)),
@@ -487,13 +501,13 @@ const SallaMultipleBundleProductOptionsModal = /*@__PURE__*/ proxyCustomElement(
487
501
  watchSlidesProgress: true,
488
502
  direction: 'vertical',
489
503
  spaceBetween: 10,
490
- } }, h("div", { key: '11970032bdc37e5d20d6737e3109fcec9b4de4cb', slot: "items" }, this.product?.images &&
504
+ } }, h("div", { key: '3b6a88fe3862870d674dadc31967df6cc8fac365', slot: "items" }, this.product?.images &&
491
505
  this.product?.images.map((image, index) => (h("div", { key: index, class: "swiper-slide" }, h("img", { src: image.url, alt: image.alt || `${this.product?.name} - Image ${index + 1}`, loading: "lazy", onError: e => {
492
506
  e.target.style.display = 'none';
493
- } }))))), this.product?.images && this.product?.images.length > 1 && (h("div", { key: 'c7d0fd432d8449e4742f0686ddecb7e87bebf159', slot: "thumbs" }, this.product?.images &&
507
+ } }))))), this.product?.images && this.product?.images.length > 1 && (h("div", { key: '6fce48b5b035cc61866aaf6c339866fa2314be87', slot: "thumbs" }, this.product?.images &&
494
508
  this.product?.images.map((image, index) => (h("div", { key: index, "data-caption": `${this.product?.name} - Image ${index + 1}` }, h("img", { src: image.url, loading: "eager", class: "s-multiple-bundle-product-options-modal-slider-thumb", title: `${this.product?.name} - ${index + 1}`, alt: image.alt || `${this.product?.name} - ${index + 1}`, onError: e => {
495
509
  e.target.style.display = 'none';
496
- } })))))))), h("salla-product-options", { options: JSON.stringify(optionsWithSelectedState), key: `${cacheKey}-reset-${resetToken}`, "product-id": productId, "unique-key": `${cacheKey}-reset-${resetToken}` }), h("div", { key: 'c9b5f53696d9f8800e3a6be31ec78b51f0cb9bb1', slot: "footer" }, h("div", { key: 'e972370006feae6c17797f54c415ef0d2aaa3f57', class: "s-multiple-bundle-product-options-modal-footer" }, h("salla-button", { key: '7a3787936eec6c0c8a69a64799af5595f51909f9', onClick: e => this.onSave(e), loading: this.isLoading, disabled: isDisabled }, this.isLoading
510
+ } })))))))), h("salla-product-options", { options: JSON.stringify(optionsWithSelectedState), key: `${cacheKey}-reset-${resetToken}`, "product-id": productId, "unique-key": `${cacheKey}-reset-${resetToken}` }), h("div", { key: '3d555ea40fe5d9f3685fc6dafa4b6fad16732091', slot: "footer" }, h("div", { key: '1b4c6834899efbd09f3ea1db251999f50ec655b2', class: "s-multiple-bundle-product-options-modal-footer" }, h("salla-button", { key: '0818a75a444cca510c7f0cfea2ec53414c12db53', onClick: e => this.onSave(e), loading: this.isLoading, disabled: isDisabled }, this.isLoading
497
511
  ? salla.lang.get('common.elements.saving')
498
512
  : salla.lang.get('common.elements.save')))))));
499
513
  }