@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
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
 
8
8
  const sallaMultipleBundleProductCartCss = "";
9
9
 
@@ -64,22 +64,37 @@ const SallaMultipleBundleProductDetails = class {
64
64
  this.productSelectedHandler = null;
65
65
  // handle selecting a product (toggle)
66
66
  this.onSelectProduct = (sectionId, product) => {
67
+ const productId = product.id;
68
+ const wasSelected = this.selectedProducts[sectionId]?.has(productId) ?? false;
69
+ const section = this.sections.find(s => s.id == sectionId);
70
+ if (wasSelected && section && this.isProductSelectionLocked(section)) {
71
+ return;
72
+ }
73
+ if (!wasSelected) {
74
+ if (!section) {
75
+ return;
76
+ }
77
+ if (this.getEffectiveMax(section) !== 1 && this.isAtSelectionLimit(section)) {
78
+ return;
79
+ }
80
+ }
67
81
  this.selectedProducts = {
68
82
  ...this.selectedProducts,
69
83
  [sectionId]: new Set(this.selectedProducts[sectionId] || []),
70
84
  };
71
- const productId = product.id;
72
- const wasSelected = this.selectedProducts[sectionId].has(productId);
73
85
  if (wasSelected) {
74
- // Product is being deselected
75
86
  this.selectedProducts[sectionId].delete(productId);
76
- // Clear form data and modal options for this product in this specific section
77
87
  this.clearProductFormData(productId, sectionId);
78
88
  this.clearProductModalOptions(productId, sectionId);
79
89
  }
80
90
  else {
81
- // Product is being selected
82
- this.selectedProducts[sectionId].add(productId);
91
+ const effectiveMax = this.getEffectiveMax(section);
92
+ if (effectiveMax === 1) {
93
+ this.syncSectionSelection(sectionId, productId);
94
+ }
95
+ else {
96
+ this.selectedProducts[sectionId].add(productId);
97
+ }
83
98
  }
84
99
  // force re-render
85
100
  this.selectedProducts = { ...this.selectedProducts };
@@ -99,31 +114,45 @@ const SallaMultipleBundleProductDetails = class {
99
114
  [sectionId]: new Set(this.selectedProducts[sectionId] || []),
100
115
  };
101
116
  const productId = product.id;
102
- // Only add if not already selected
103
- if (!this.selectedProducts[sectionId].has(productId)) {
117
+ if (this.selectedProducts[sectionId].has(productId)) {
118
+ return;
119
+ }
120
+ const section = this.sections.find(s => s.id == sectionId);
121
+ if (!section) {
122
+ return;
123
+ }
124
+ const effectiveMax = this.getEffectiveMax(section);
125
+ if (effectiveMax === 1) {
126
+ this.syncSectionSelection(sectionId, productId);
127
+ }
128
+ else if (effectiveMax > 1 && this.isAtSelectionLimit(section)) {
129
+ return;
130
+ }
131
+ else {
104
132
  this.selectedProducts[sectionId].add(productId);
105
- // force re-render
106
- this.selectedProducts = { ...this.selectedProducts };
107
- // dispatch event
108
- salla.event.dispatch('on-bundle-product-selected', {
109
- id: product.id,
110
- name: product.name,
111
- options: product.options,
112
- });
113
133
  }
134
+ this.selectedProducts = { ...this.selectedProducts };
135
+ salla.event.dispatch('on-bundle-product-selected', {
136
+ id: product.id,
137
+ name: product.name,
138
+ options: product.options,
139
+ });
114
140
  };
115
141
  // open product options modal
116
142
  this.onSelectProductOptions = (product, sectionId) => {
117
- // Find the section index from the sectionId
118
- const sectionIndex = this.sections.findIndex(section => section.id == sectionId);
119
- // Find the product index within the section
120
- const section = this.sections.find(section => section.id == sectionId);
121
- const productIndex = section?.products?.findIndex(p => p.id == product.id) ?? 0;
143
+ const section = this.sections.find(s => s.id == sectionId);
144
+ if (!section || !this.canSelectProductInSection(section, product.id)) {
145
+ return;
146
+ }
147
+ const sectionIndex = this.sections.findIndex(s => s.id == sectionId);
148
+ const productIndex = section.products?.findIndex(p => p.id == product.id) ?? 0;
149
+ const isProductAlreadySelected = this.selectedProducts[sectionId]?.has(product.id) ?? false;
122
150
  salla.event.dispatch('multiple-bundle-product-modal::open', {
123
151
  product,
124
152
  sectionId,
125
153
  sectionIndex,
126
154
  productIndex,
155
+ isProductAlreadySelected,
127
156
  });
128
157
  };
129
158
  // Event handlers for bundle slider component
@@ -136,22 +165,164 @@ const SallaMultipleBundleProductDetails = class {
136
165
  this.onSelectProductOptions(product, sectionId);
137
166
  };
138
167
  }
168
+ isSingleProductSection(section) {
169
+ return (section.products?.length ?? 0) === 1;
170
+ }
171
+ getObligatoryMin(section) {
172
+ const min = section.obligatory_products;
173
+ if (min == null) {
174
+ return 0;
175
+ }
176
+ const numericMin = Number(min);
177
+ return Number.isNaN(numericMin) ? 0 : numericMin;
178
+ }
179
+ isProductSelectionLocked(section) {
180
+ return this.isSingleProductSection(section) && this.getObligatoryMin(section) === 1;
181
+ }
182
+ /** Empty max → cap is the number of products in the section. */
183
+ getEffectiveMax(section) {
184
+ const productCount = section.products?.length ?? 0;
185
+ const max = section.max_obligatory_products;
186
+ if (max != null && max > 0) {
187
+ return Math.min(max, productCount);
188
+ }
189
+ return productCount;
190
+ }
191
+ getSelectedCount(sectionId) {
192
+ return this.selectedProducts[sectionId]?.size ?? 0;
193
+ }
194
+ isAtSelectionLimit(section) {
195
+ return this.getSelectedCount(section.id) >= this.getEffectiveMax(section);
196
+ }
197
+ canSelectProductInSection(section, productId) {
198
+ if (this.selectedProducts[section.id]?.has(productId)) {
199
+ return true;
200
+ }
201
+ if (this.getEffectiveMax(section) === 1) {
202
+ return true;
203
+ }
204
+ return !this.isAtSelectionLimit(section);
205
+ }
206
+ async canSelectBundleProduct(sectionId, productId) {
207
+ const section = this.sections.find(s => s.id == sectionId);
208
+ if (!section) {
209
+ return false;
210
+ }
211
+ return this.canSelectProductInSection(section, productId);
212
+ }
213
+ queryProductCheckbox(sectionId, productIndex) {
214
+ const selector = `input.s-multiple-bundle-product-checkbox[name="bundle[${sectionId}][${productIndex}][id]"]`;
215
+ const form = this.host.closest('form');
216
+ const fromForm = form?.querySelector(selector);
217
+ if (fromForm) {
218
+ return fromForm;
219
+ }
220
+ for (const slider of this.host.querySelectorAll('salla-multiple-bundle-product-slider')) {
221
+ const root = slider.shadowRoot ?? slider;
222
+ const input = root.querySelector(selector);
223
+ if (input) {
224
+ return input;
225
+ }
226
+ }
227
+ return null;
228
+ }
229
+ dispatchBubblingChange(target) {
230
+ requestAnimationFrame(() => {
231
+ target.dispatchEvent(new window.Event('change', { bubbles: true }));
232
+ });
233
+ }
234
+ /** Uncheck checkbox, remove form inputs, and reset modal state for one product slot. */
235
+ clearSectionProductSlot(sectionId, productId, productIndex) {
236
+ const checkbox = this.queryProductCheckbox(sectionId, productIndex);
237
+ if (checkbox) {
238
+ checkbox.checked = false;
239
+ }
240
+ const form = this.host.closest('form');
241
+ if (form) {
242
+ const slotPrefix = `bundle[${sectionId}][${productIndex}]`;
243
+ Array.from(form.querySelectorAll('input')).forEach((input) => {
244
+ const inSlot = input.name?.startsWith(slotPrefix) ?? false;
245
+ if (!inSlot) {
246
+ return;
247
+ }
248
+ if (input.type === 'checkbox' && input.name?.endsWith('][id]')) {
249
+ input.checked = false;
250
+ return;
251
+ }
252
+ input.remove();
253
+ });
254
+ }
255
+ this.clearProductModalOptions(productId, sectionId);
256
+ }
257
+ /** max=1: replace section selection and keep DOM/form in sync. */
258
+ syncSectionSelection(sectionId, productId) {
259
+ const section = this.sections.find(s => s.id == sectionId);
260
+ section?.products?.forEach((product, productIndex) => {
261
+ if (product.id != productId) {
262
+ this.clearSectionProductSlot(sectionId, product.id, productIndex);
263
+ }
264
+ });
265
+ this.selectedProducts[sectionId] = new Set([productId]);
266
+ const selectedIndex = section?.products?.findIndex(p => p.id == productId) ?? -1;
267
+ const checkbox = selectedIndex >= 0 ? this.queryProductCheckbox(sectionId, selectedIndex) : null;
268
+ if (checkbox) {
269
+ checkbox.checked = true;
270
+ this.dispatchBubblingChange(checkbox);
271
+ }
272
+ }
273
+ autoSelectSingleProductSections() {
274
+ if (!this.sections?.length) {
275
+ return;
276
+ }
277
+ const newSelectedProducts = { ...this.selectedProducts };
278
+ let updated = false;
279
+ const selectedEvents = [];
280
+ for (const section of this.sections) {
281
+ if (!this.isProductSelectionLocked(section)) {
282
+ continue;
283
+ }
284
+ const product = section.products?.[0];
285
+ if (!product || (!product.unlimited_quantity && (product.quantity ?? 0) <= 0)) {
286
+ continue;
287
+ }
288
+ const sectionId = section.id;
289
+ const currentSet = new Set(newSelectedProducts[sectionId] || []);
290
+ if (currentSet.has(product.id)) {
291
+ continue;
292
+ }
293
+ currentSet.add(product.id);
294
+ newSelectedProducts[sectionId] = currentSet;
295
+ updated = true;
296
+ selectedEvents.push({ product });
297
+ }
298
+ if (!updated) {
299
+ return;
300
+ }
301
+ this.selectedProducts = newSelectedProducts;
302
+ selectedEvents.forEach(({ product }) => {
303
+ salla.event.dispatch('on-bundle-product-selected', {
304
+ id: product.id,
305
+ name: product.name,
306
+ options: product.options,
307
+ });
308
+ });
309
+ }
139
310
  // Clear form data for a specific product in specific section
140
311
  clearProductFormData(productId, sectionId) {
141
- const form = this.host.closest('form');
142
- if (sectionId) {
143
- // Remove inputs for specific section/productIndex combination
144
- const productInputPattern = `bundle[${sectionId}][`;
145
- const inputsToRemove = Array.from(form.querySelectorAll('input')).filter((input) => input.getAttribute('data-product-id') === String(productId) &&
146
- input.name &&
147
- input.name.startsWith(productInputPattern));
148
- inputsToRemove.forEach(input => input.remove());
312
+ if (sectionId != null) {
313
+ const section = this.sections.find(s => s.id == sectionId);
314
+ const productIndex = section?.products?.findIndex(product => product.id == productId) ?? -1;
315
+ if (productIndex >= 0) {
316
+ this.clearSectionProductSlot(sectionId, productId, productIndex);
317
+ return;
318
+ }
149
319
  }
150
- else {
151
- // Fallback: Remove all hidden inputs related to this product (legacy behavior)
152
- const inputsToRemove = form.querySelectorAll(`[data-product-id="${productId}"]`);
153
- inputsToRemove.forEach(input => input.remove());
320
+ const form = this.host.closest('form');
321
+ if (!form) {
322
+ return;
154
323
  }
324
+ const inputsToRemove = form.querySelectorAll(`[data-product-id="${productId}"]`);
325
+ inputsToRemove.forEach(input => input.remove());
155
326
  }
156
327
  // Clear modal options state for a specific product
157
328
  clearProductModalOptions(productId, sectionId) {
@@ -175,10 +346,42 @@ const SallaMultipleBundleProductDetails = class {
175
346
  productIndex,
176
347
  });
177
348
  }
178
- renderAccordionHeader(section, selectedCount) {
179
- return (index.h(index.Fragment, null, index.h("h2", { slot: "title" }, section?.name), section?.obligatory_products ? (index.h("span", { slot: "note" }, salla.lang.get('pages.products.obligatory_products', {
180
- count: section?.obligatory_products || 0,
181
- }))) : '', index.h("span", { slot: "progress" }, selectedCount, "/", section?.products?.length || 0)));
349
+ getProgressStatus(section) {
350
+ const selectedCount = this.getSelectedCount(section.id);
351
+ const effectiveMax = this.getEffectiveMax(section);
352
+ if (effectiveMax > 0) {
353
+ return `${selectedCount}/${effectiveMax}`;
354
+ }
355
+ return '0';
356
+ }
357
+ getSectionSelectionNote(section) {
358
+ const min = this.getObligatoryMin(section);
359
+ const max = Number(section.max_obligatory_products) || 0;
360
+ const hasMin = min > 0;
361
+ const hasMax = max > 0;
362
+ if (!hasMin && !hasMax) {
363
+ return null;
364
+ }
365
+ if (hasMin && hasMax) {
366
+ if (min === max) {
367
+ return salla.lang.getWithDefault('pages.products.bundle_select_exact', `اختر ${min} منتجات`, { count: min });
368
+ }
369
+ return salla.lang.getWithDefault('pages.products.bundle_select_range', `اختر من ${min} إلى ${max} منتجات`, { min, max });
370
+ }
371
+ if (hasMin) {
372
+ return salla.lang.getWithDefault('pages.products.bundle_select_min', `اختر على الأقل ${min} منتجات`, { min });
373
+ }
374
+ return salla.lang.getWithDefault('pages.products.bundle_select_max', `اختر حتى ${max} منتجات`, { max });
375
+ }
376
+ handleSectionsChange() {
377
+ this.autoSelectSingleProductSections();
378
+ }
379
+ componentWillLoad() {
380
+ this.autoSelectSingleProductSections();
381
+ }
382
+ renderAccordionHeader(section) {
383
+ const selectionNote = this.getSectionSelectionNote(section);
384
+ return (index.h(index.Fragment, null, index.h("h2", { slot: "title" }, section?.name), selectionNote ? index.h("span", { slot: "note" }, selectionNote) : null, index.h("span", { slot: "progress" }, this.getProgressStatus(section))));
182
385
  }
183
386
  componentDidLoad() {
184
387
  // Listen for product selected event from modal
@@ -209,12 +412,14 @@ const SallaMultipleBundleProductDetails = class {
209
412
  }
210
413
  }
211
414
  render() {
212
- return (index.h(index.Host, { key: '27a3d6baa97585e983db19522ab2981ecc9e50f1', class: "s-multiple-bundle-product-wrapper" }, index.h("div", { key: 'c96cf52dfaee161a03a6bf97de267d9942a47a49', class: "s-multiple-bundle-product-wrapper-sections" }, this.sections.map((section, index$1) => {
213
- const selectedCount = this.selectedProducts[section.id]?.size || 0;
214
- return (index.h("salla-accordion", { key: section.id, collapsed: index$1 === 0 ? false : true }, index.h("salla-accordion-head", null, this.renderAccordionHeader(section, selectedCount)), index.h("salla-accordion-body", null, index.h("salla-multiple-bundle-product-slider", { section: section, sectionIndex: index$1, selectedProducts: this.selectedProducts, onProductSelected: this.handleBundleSliderProductSelected, onProductOptionsSelected: this.handleBundleSliderProductOptionsSelected }))));
215
- })), index.h("salla-multiple-bundle-product-options-modal", { key: '6627ee4f67bcd775b16e470dd4735848e6087fd4' })));
415
+ return (index.h(index.Host, { key: '74b123c432e77263cf0ddcf20ab742885c54d5f4', class: "s-multiple-bundle-product-wrapper" }, index.h("div", { key: '24bef0958a2a7d29bb4485eac08c7e6b8614a00d', class: "s-multiple-bundle-product-wrapper-sections" }, this.sections.map((section, index$1) => {
416
+ return (index.h("salla-accordion", { key: section.id, collapsed: index$1 === 0 ? false : true }, index.h("salla-accordion-head", null, this.renderAccordionHeader(section)), index.h("salla-accordion-body", null, index.h("salla-multiple-bundle-product-slider", { section: section, sectionIndex: index$1, selectedProducts: this.selectedProducts, selectionLimit: this.getEffectiveMax(section), isSelectionLocked: this.isProductSelectionLocked(section), onProductSelected: this.handleBundleSliderProductSelected, onProductOptionsSelected: this.handleBundleSliderProductOptionsSelected }))));
417
+ })), index.h("salla-multiple-bundle-product-options-modal", { key: '556b4e51a4b79dfc00371a07296556fb74111524' })));
216
418
  }
217
419
  get host() { return index.getElement(this); }
420
+ static get watchers() { return {
421
+ "sections": ["handleSectionsChange"]
422
+ }; }
218
423
  };
219
424
  SallaMultipleBundleProductDetails.style = sallaMultipleBundleProductDetailsCss;
220
425
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
  var keyboard_arrow_right = require('./keyboard_arrow_right-BayM_Il2.js');
8
8
 
9
9
  const sallaMultipleBundleProductOptionsModalCss = ":host{display:block}";
@@ -22,6 +22,7 @@ const SallaMultipleBundleProductOptionsModal = class {
22
22
  this.isLoading = false;
23
23
  this.hasUnsavedChanges = false;
24
24
  this.validationErrors = [];
25
+ this.isProductAlreadySelected = false;
25
26
  }
26
27
  /**
27
28
  * Generate a unique cache key for selected options using section ID, product index, and product ID
@@ -83,6 +84,7 @@ const SallaMultipleBundleProductOptionsModal = class {
83
84
  this.sectionId = data.sectionId || null;
84
85
  this.sectionIndex = data.sectionIndex || 0;
85
86
  this.productIndex = data.productIndex || 0;
87
+ this.isProductAlreadySelected = !!data.isProductAlreadySelected;
86
88
  this.open();
87
89
  };
88
90
  salla.event.on('multiple-bundle-product-modal::open', this.modalOpenListener);
@@ -113,6 +115,10 @@ const SallaMultipleBundleProductOptionsModal = class {
113
115
  // Extract section info from the checkbox name: bundle[sectionId][productIndex][id]
114
116
  const nameMatch = target.name.match(/^bundle\[([^\]]+)\]\[([^\]]+)\]\[id\]$/);
115
117
  if (nameMatch && !target.checked) {
118
+ if (target.getAttribute('data-selection-locked') === 'true') {
119
+ target.checked = true;
120
+ return;
121
+ }
116
122
  const [, sectionId, productIndex] = nameMatch;
117
123
  const productId = target.value;
118
124
  const form = this.host.closest('form');
@@ -351,6 +357,14 @@ const SallaMultipleBundleProductOptionsModal = class {
351
357
  salla.notify.error(this.validationErrors.join(', '));
352
358
  return;
353
359
  }
360
+ if (!this.isProductAlreadySelected && this.sectionId != null) {
361
+ const details = this.host.closest('salla-multiple-bundle-product-details');
362
+ const canSelect = await details?.canSelectBundleProduct(this.sectionId, productId);
363
+ if (!canSelect) {
364
+ salla.notify.error(salla.lang.getWithDefault('pages.products.bundle_selection_limit_reached', 'لا يمكنك اختيار المزيد من المنتجات في هذا القسم'));
365
+ return;
366
+ }
367
+ }
354
368
  this.isLoading = true;
355
369
  try {
356
370
  // please don't change this with this.host.querySelector it will return null
@@ -467,7 +481,7 @@ const SallaMultipleBundleProductOptionsModal = class {
467
481
  const cacheKey = this.generateCacheKey(this.sectionId, this.productIndex, productId);
468
482
  const resetToken = this.optionsResetTokens[cacheKey] || 0;
469
483
  const isDisabled = this.isLoading || optionsWithSelectedState.some(opt => opt.details.some(d => d.is_selected && d.is_out === true));
470
- return (index.h(index.Host, { key: 'd9dc4018798fe902048f3e3e37fcb2edf84713b0' }, index.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" }, index.h("div", { key: '10fcc08be35bfd4231f9cf48501614ae49a985a3', slot: "loading" }, index.h("salla-skeleton", { key: '1aee9616e4f05188067708506352b0d97d504696', height: "100%", width: "100%" })), this.product?.images && this.product?.images.length > 0 && (index.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: {
484
+ return (index.h(index.Host, { key: '6c1d1d3911867e30240676f3e2b7353e9ecf76c3' }, index.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" }, index.h("div", { key: '20a52bbc732c6edfffde86577e99bbe300a1a4c8', slot: "loading" }, index.h("salla-skeleton", { key: '3a69fc75939d8b8f8639983d0f2f8dd8bf961152', height: "100%", width: "100%" })), this.product?.images && this.product?.images.length > 0 && (index.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: {
471
485
  centeredSlides: true,
472
486
  centeredSlidesBounds: true,
473
487
  slidesPerView: Math.min(5, Math.max(1, this.product?.images.length)),
@@ -475,13 +489,13 @@ const SallaMultipleBundleProductOptionsModal = class {
475
489
  watchSlidesProgress: true,
476
490
  direction: 'vertical',
477
491
  spaceBetween: 10,
478
- } }, index.h("div", { key: '11970032bdc37e5d20d6737e3109fcec9b4de4cb', slot: "items" }, this.product?.images &&
492
+ } }, index.h("div", { key: '3b6a88fe3862870d674dadc31967df6cc8fac365', slot: "items" }, this.product?.images &&
479
493
  this.product?.images.map((image, index$1) => (index.h("div", { key: index$1, class: "swiper-slide" }, index.h("img", { src: image.url, alt: image.alt || `${this.product?.name} - Image ${index$1 + 1}`, loading: "lazy", onError: e => {
480
494
  e.target.style.display = 'none';
481
- } }))))), this.product?.images && this.product?.images.length > 1 && (index.h("div", { key: 'c7d0fd432d8449e4742f0686ddecb7e87bebf159', slot: "thumbs" }, this.product?.images &&
495
+ } }))))), this.product?.images && this.product?.images.length > 1 && (index.h("div", { key: '6fce48b5b035cc61866aaf6c339866fa2314be87', slot: "thumbs" }, this.product?.images &&
482
496
  this.product?.images.map((image, index$1) => (index.h("div", { key: index$1, "data-caption": `${this.product?.name} - Image ${index$1 + 1}` }, index.h("img", { src: image.url, loading: "eager", class: "s-multiple-bundle-product-options-modal-slider-thumb", title: `${this.product?.name} - ${index$1 + 1}`, alt: image.alt || `${this.product?.name} - ${index$1 + 1}`, onError: e => {
483
497
  e.target.style.display = 'none';
484
- } })))))))), index.h("salla-product-options", { options: JSON.stringify(optionsWithSelectedState), key: `${cacheKey}-reset-${resetToken}`, "product-id": productId, "unique-key": `${cacheKey}-reset-${resetToken}` }), index.h("div", { key: 'c9b5f53696d9f8800e3a6be31ec78b51f0cb9bb1', slot: "footer" }, index.h("div", { key: 'e972370006feae6c17797f54c415ef0d2aaa3f57', class: "s-multiple-bundle-product-options-modal-footer" }, index.h("salla-button", { key: '7a3787936eec6c0c8a69a64799af5595f51909f9', onClick: e => this.onSave(e), loading: this.isLoading, disabled: isDisabled }, this.isLoading
498
+ } })))))))), index.h("salla-product-options", { options: JSON.stringify(optionsWithSelectedState), key: `${cacheKey}-reset-${resetToken}`, "product-id": productId, "unique-key": `${cacheKey}-reset-${resetToken}` }), index.h("div", { key: '3d555ea40fe5d9f3685fc6dafa4b6fad16732091', slot: "footer" }, index.h("div", { key: '1b4c6834899efbd09f3ea1db251999f50ec655b2', class: "s-multiple-bundle-product-options-modal-footer" }, index.h("salla-button", { key: '0818a75a444cca510c7f0cfea2ec53414c12db53', onClick: e => this.onSave(e), loading: this.isLoading, disabled: isDisabled }, this.isLoading
485
499
  ? salla.lang.get('common.elements.saving')
486
500
  : salla.lang.get('common.elements.save')))))));
487
501
  }
@@ -501,39 +515,71 @@ const SallaMultipleBundleProductSlider = class {
501
515
  this.productOptionsSelected = index.createEvent(this, "productOptionsSelected");
502
516
  /** A dictionary tracking which product IDs are currently selected per section. */
503
517
  this.selectedProducts = {};
518
+ /** When true, the selected product cannot be deselected (single-product section with min = 1). */
519
+ this.isSelectionLocked = false;
520
+ /** Maximum selectable products for this section (empty max → all products in section). */
521
+ this.selectionLimit = 0;
504
522
  this.savedOptionsByInstance = {};
505
523
  this.handleProductClick = (product, productIndex) => {
506
- // Find the checkbox input for this product
507
- const checkboxId = this.generateEventName(this.section.id, productIndex);
508
- const checkbox = document.getElementById(checkboxId);
509
- if (!checkbox)
510
- return;
511
- if (checkbox) {
512
- const willBeChecked = !checkbox.checked;
513
- if (!willBeChecked) {
514
- this.dispatchClearOptionsEvent(product, productIndex);
515
- this.clearSavedOptionsState(this.section.id, productIndex);
524
+ const isChecked = this.selectedProducts[this.section.id]?.has(product.id) || false;
525
+ const checkbox = this.getCheckbox(this.section.id, productIndex);
526
+ if (isChecked && this.isSelectionLocked) {
527
+ if (checkbox) {
528
+ checkbox.checked = true;
516
529
  }
517
- // Toggle the checkbox state
518
- checkbox.checked = willBeChecked;
519
- // Dispatch a change event to trigger form validation/submission
520
- requestAnimationFrame(() => {
521
- const changeEvent = new window.Event('change', { bubbles: true });
522
- checkbox.dispatchEvent(changeEvent);
530
+ return;
531
+ }
532
+ if (!isChecked && this.isMaxSelectionReached() && this.selectionLimit !== 1) {
533
+ return;
534
+ }
535
+ // max = 1: parent replaces selection and syncs all checkboxes in the section
536
+ if (this.selectionLimit === 1 && !isChecked) {
537
+ this.productSelected.emit({
538
+ product,
539
+ sectionId: this.section.id,
523
540
  });
541
+ return;
542
+ }
543
+ if (!checkbox)
544
+ return;
545
+ const willBeChecked = !checkbox.checked;
546
+ if (!willBeChecked) {
547
+ this.dispatchClearOptionsEvent(product, productIndex);
548
+ this.clearSavedOptionsState(this.section.id, productIndex);
524
549
  }
550
+ checkbox.checked = willBeChecked;
551
+ requestAnimationFrame(() => {
552
+ const changeEvent = new window.Event('change', { bubbles: true });
553
+ checkbox.dispatchEvent(changeEvent);
554
+ });
525
555
  this.productSelected.emit({
526
556
  product,
527
557
  sectionId: this.section.id,
528
558
  });
529
559
  };
530
560
  this.handleOptionsClick = (product) => {
561
+ const isChecked = this.selectedProducts[this.section.id]?.has(product.id) || false;
562
+ if (!isChecked && this.isMaxSelectionReached() && this.selectionLimit !== 1) {
563
+ return;
564
+ }
531
565
  this.productOptionsSelected.emit({
532
566
  product,
533
567
  sectionId: this.section.id,
534
568
  });
535
569
  };
536
570
  }
571
+ getSelectedCount() {
572
+ return this.selectedProducts[this.section?.id]?.size ?? 0;
573
+ }
574
+ isMaxSelectionReached() {
575
+ return this.selectionLimit > 1 && this.getSelectedCount() >= this.selectionLimit;
576
+ }
577
+ isProductSelectionDisabled(product, isChecked) {
578
+ if (product.quantity === 0) {
579
+ return true;
580
+ }
581
+ return !isChecked && this.isMaxSelectionReached();
582
+ }
537
583
  getProductInstanceKey(sectionId, productIndex) {
538
584
  return `${sectionId}::${productIndex}`;
539
585
  }
@@ -579,9 +625,26 @@ const SallaMultipleBundleProductSlider = class {
579
625
  generateEventName(sectionId, productIndex) {
580
626
  return `bundle[${sectionId}][${productIndex}][id]`;
581
627
  }
628
+ getCheckbox(sectionId, productIndex) {
629
+ const name = this.generateEventName(sectionId, productIndex);
630
+ return this.host.querySelector(`input.s-multiple-bundle-product-checkbox[name="${name}"]`);
631
+ }
632
+ preventLockedDeselect(event, isChecked) {
633
+ if (!this.isSelectionLocked || !isChecked) {
634
+ return;
635
+ }
636
+ event.preventDefault();
637
+ event.stopPropagation();
638
+ const checkbox = event.target;
639
+ if (checkbox?.type === 'checkbox') {
640
+ checkbox.checked = true;
641
+ }
642
+ }
582
643
  render() {
583
- return (index.h(index.Host, { key: 'ecdac4638007d9435ec8b06f32114a0dada03b86' }, index.h("salla-slider", { key: 'c245e7dcfd157908063fd5ec13c6d49f8862dd18', type: "carousel", controlsOuter: false, showControls: false, id: `accordion-multiple-bundle-product-${this.section.id}`, pagination: true, class: "s-multiple-bundle-product-wrapper-slider", sliderConfig: { spaceBetween: 0 } }, index.h("div", { key: '17bdd6def2ff6f1d2ad22fa8b5299fc0000b1e82', slot: "items" }, this?.section?.products?.map((product, productIndex) => {
644
+ return (index.h(index.Host, { key: 'd52eb26454606df2526fa4c086110a54f7466644' }, index.h("salla-slider", { key: '1aa1fce5943c3721a8e4f762171c864d9097bb28', type: "carousel", controlsOuter: false, showControls: false, id: `accordion-multiple-bundle-product-${this.section.id}`, pagination: true, class: "s-multiple-bundle-product-wrapper-slider", sliderConfig: { spaceBetween: 0 } }, index.h("div", { key: '9342381bc43389bae48b906a1ab23a4f3cf8d00a', slot: "items" }, this?.section?.products?.map((product, productIndex) => {
584
645
  const isChecked = this.selectedProducts[this.section.id]?.has(product.id) || false;
646
+ const isLocked = isChecked && this.isSelectionLocked;
647
+ const isDisabled = this.isProductSelectionDisabled(product, isChecked);
585
648
  const hasSavedOptions = this.savedOptionsByInstance[this.getProductInstanceKey(this.section.id, productIndex)];
586
649
  const optionsButtonLabel = hasSavedOptions
587
650
  ? salla.lang.getWithDefault('pages.products.edit_selected_options', 'تعديل الخيارات')
@@ -589,9 +652,7 @@ const SallaMultipleBundleProductSlider = class {
589
652
  let optionsArrowIcon = salla.config.get('theme.is_rtl', true)
590
653
  ? keyboard_arrow_right.ArrowLeftIcon
591
654
  : keyboard_arrow_right.ArrowRightIcon;
592
- return (index.h("div", { class: `s-multiple-bundle-product-slide-one-third ${product.quantity == 0
593
- ? 's-multiple-bundle-product-slide-one-third-disabled'
594
- : ''}`, key: product.id }, index.h("div", { class: "s-multiple-bundle-product-card" }, index.h("div", { class: "s-multiple-bundle-product-image-wrapper", onClick: () => this.handleProductClick(product, productIndex) }, index.h("input", { id: this.generateEventName(this.section.id, productIndex), type: "checkbox", class: "s-multiple-bundle-product-checkbox", checked: isChecked, name: this.generateEventName(this.section.id, productIndex), value: product.id }), index.h("img", { src: product.image.url || salla.url.cdn('images/s-empty.png'), loading: "lazy", alt: product.image.alt || product.name, class: "s-multiple-bundle-product-image" })), index.h("div", { class: "s-multiple-bundle-product-content-wrapper" }, index.h("div", { class: "s-multiple-bundle-product-content" }, index.h("div", { class: "s-multiple-bundle-product-details" }, index.h("div", { class: "s-multiple-bundle-product-title-wrapper" }, index.h("h2", { class: "s-multiple-bundle-product-title" }, index.h("a", { href: product?.url || '#', target: "_blank", rel: "noopener noreferrer" }, product.name))), index.h("div", { class: "s-multiple-bundle-product-price-wrapper" }, index.h("span", { class: "s-multiple-bundle-product-price" }, index.h("span", { innerHTML: salla.money(product.price) })), product.sale_price > 0 && (index.h("span", { class: "s-multiple-bundle-product-price-discount" }, index.h("span", { innerHTML: salla.money(product.regular_price) }))))), product.quantity_in_group > 0 && product.quantity !== 0 && (index.h("span", { class: "s-multiple-bundle-product-badge" }, salla.lang.get('pages.products.pieces'), index.h("span", null, product.quantity_in_group))), product.quantity === 0 && (index.h("span", { class: "s-multiple-bundle-product-badge" }, salla.lang.get('pages.products.quantity_in_group_finished')))), product.options?.length > 0 && (index.h("button", { class: "s-multiple-bundle-product-button", onClick: () => this.handleOptionsClick(product), type: "button" }, optionsButtonLabel, index.h("span", { class: "s-multiple-bundle-product-button-icon", innerHTML: optionsArrowIcon })))))));
655
+ return (index.h("div", { class: `s-multiple-bundle-product-slide-one-third${isDisabled ? ' s-multiple-bundle-product-slide-one-third-disabled' : ''}`, key: product.id }, index.h("div", { class: "s-multiple-bundle-product-card" }, index.h("div", { class: "s-multiple-bundle-product-image-wrapper", onClick: () => this.handleProductClick(product, productIndex) }, index.h("input", { id: this.generateEventName(this.section.id, productIndex), type: "checkbox", class: "s-multiple-bundle-product-checkbox", checked: isChecked, "data-selection-locked": isLocked ? 'true' : undefined, name: this.generateEventName(this.section.id, productIndex), value: product.id, onClick: event => this.preventLockedDeselect(event, isChecked), onChange: event => this.preventLockedDeselect(event, isChecked) }), index.h("img", { src: product.image.url || salla.url.cdn('images/s-empty.png'), loading: "lazy", alt: product.image.alt || product.name, class: "s-multiple-bundle-product-image" })), index.h("div", { class: "s-multiple-bundle-product-content-wrapper" }, index.h("div", { class: "s-multiple-bundle-product-content" }, index.h("div", { class: "s-multiple-bundle-product-details" }, index.h("div", { class: "s-multiple-bundle-product-title-wrapper" }, index.h("h2", { class: "s-multiple-bundle-product-title" }, index.h("a", { href: product?.url || '#', target: "_blank", rel: "noopener noreferrer" }, product.name))), index.h("div", { class: "s-multiple-bundle-product-price-wrapper" }, index.h("span", { class: "s-multiple-bundle-product-price" }, index.h("span", { innerHTML: salla.money(product.price) })), product.sale_price > 0 && (index.h("span", { class: "s-multiple-bundle-product-price-discount" }, index.h("span", { innerHTML: salla.money(product.regular_price) }))))), product.quantity_in_group > 0 && product.quantity !== 0 && (index.h("span", { class: "s-multiple-bundle-product-badge" }, salla.lang.get('pages.products.pieces'), index.h("span", null, product.quantity_in_group))), product.quantity === 0 && (index.h("span", { class: "s-multiple-bundle-product-badge" }, salla.lang.get('pages.products.quantity_in_group_finished')))), product.options?.length > 0 && (index.h("button", { class: "s-multiple-bundle-product-button", onClick: () => this.handleOptionsClick(product), type: "button" }, optionsButtonLabel, index.h("span", { class: "s-multiple-bundle-product-button-icon", innerHTML: optionsArrowIcon })))))));
595
656
  })))));
596
657
  }
597
658
  get host() { return index.getElement(this); }
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
 
8
8
  const sallaMultipleBundleProductCss = ":host{display:block}";
9
9
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
  var tagMoney = require('./tag-money-Cuohw_4j.js');
8
8
  var swapStroke = require('./swap-stroke-CYGxjKIS.js');
9
9
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
 
8
8
  const sallaNotificationsCss = "";
9
9
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
  var Helper = require('./Helper-CU4Xuiki.js');
8
8
  require('./anime.es-BqW8JHZi.js');
9
9
 
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
  var specialDiscount = require('./special-discount-DC2oXurL.js');
8
8
  var tag = require('./tag-D-PcUR33.js');
9
9
  var cart2 = require('./cart2-B98PSAFN.js');
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
 
8
8
  var PageType;
9
9
  (function (PageType) {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-CzYs-dhm.js');
6
+ var index = require('./index-ChjKTah1.js');
7
7
 
8
8
  const sallaOrderDetailsMultipleBundleProductCss = "";
9
9