@salla.sa/twilight-components 2.14.467 → 2.14.469

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 (364) hide show
  1. package/dist/cjs/{filepond-Li5IcLEr.js → filepond-CG7dNZgq.js} +1 -1
  2. package/dist/cjs/{filepond-plugin-file-poster-CXgEvsrj.js → filepond-plugin-file-poster-B1zrjwgr.js} +1 -1
  3. package/dist/cjs/{filepond-plugin-file-validate-size-DISjKBXN.js → filepond-plugin-file-validate-size-BqZtoWbe.js} +1 -1
  4. package/dist/cjs/{filepond-plugin-file-validate-type-BeDqb2RU.js → filepond-plugin-file-validate-type-BGmGKK9L.js} +1 -1
  5. package/dist/cjs/{filepond-plugin-image-edit-CTKgasCY.js → filepond-plugin-image-edit-CYeh6qmG.js} +1 -1
  6. package/dist/cjs/{filepond-plugin-image-exif-orientation-BqvyVbfM.js → filepond-plugin-image-exif-orientation-BEVpo-ZQ.js} +1 -1
  7. package/dist/cjs/{filepond-plugin-image-preview-DfX-wD-s.js → filepond-plugin-image-preview-C7MMEZFE.js} +1 -1
  8. package/dist/cjs/{functions-DXNacMtu.js → functions-CnBVKKGk.js} +1 -1
  9. package/dist/cjs/{index-2n84VIdz.js → index-BNOCK3IN.js} +1 -1
  10. package/dist/cjs/{index-JuURs8Nc.js → index-inmL4H71.js} +9 -5
  11. package/dist/cjs/loader.cjs.js +2 -2
  12. package/dist/cjs/{mail-Bgvt2hc9.js → mail-C9D8MHae.js} +2 -2
  13. package/dist/cjs/salla-accordion-body_2.cjs.entry.js +1 -1
  14. package/dist/cjs/salla-accordion_6.cjs.entry.js +1 -1
  15. package/dist/cjs/salla-add-product-button_5.cjs.entry.js +29 -84
  16. package/dist/cjs/salla-advertisement.cjs.entry.js +1 -1
  17. package/dist/cjs/salla-alert_2.cjs.entry.js +1 -1
  18. package/dist/cjs/salla-app-install-alert.cjs.entry.js +1 -1
  19. package/dist/cjs/salla-apps-icons.cjs.entry.js +1 -1
  20. package/dist/cjs/salla-badge.cjs.entry.js +1 -1
  21. package/dist/cjs/salla-booking-field_7.cjs.entry.js +11 -11
  22. package/dist/cjs/salla-bullet-delivery_2.cjs.entry.js +91 -7
  23. package/dist/cjs/salla-cart-coupons.cjs.entry.js +1 -1
  24. package/dist/cjs/salla-cart-item-offers_2.cjs.entry.js +1 -1
  25. package/dist/cjs/salla-cashback-banner.cjs.entry.js +1 -1
  26. package/dist/cjs/salla-comment-form_8.cjs.entry.js +1 -1
  27. package/dist/cjs/salla-conditional-offer.cjs.entry.js +1 -1
  28. package/dist/cjs/salla-contacts.cjs.entry.js +3 -3
  29. package/dist/cjs/salla-cookies-bar.cjs.entry.js +1 -1
  30. package/dist/cjs/salla-count-down.cjs.entry.js +1 -1
  31. package/dist/cjs/salla-custom-fields.cjs.entry.js +1 -1
  32. package/dist/cjs/salla-delivery-promise.cjs.entry.js +1 -1
  33. package/dist/cjs/salla-edit-order-button.cjs.entry.js +1 -1
  34. package/dist/cjs/salla-filters-widget.cjs.entry.js +1 -1
  35. package/dist/cjs/salla-filters.cjs.entry.js +1 -1
  36. package/dist/cjs/salla-fulfillment-methods.cjs.entry.js +1 -1
  37. package/dist/cjs/salla-gifting.cjs.entry.js +85 -31
  38. package/dist/cjs/salla-hook.cjs.entry.js +1 -1
  39. package/dist/cjs/salla-infinite-scroll.cjs.entry.js +1 -1
  40. package/dist/cjs/salla-installment.cjs.entry.js +1 -1
  41. package/dist/cjs/salla-list-tile.cjs.entry.js +1 -1
  42. package/dist/cjs/salla-localization-modal.cjs.entry.js +1 -1
  43. package/dist/cjs/salla-login-modal.cjs.entry.js +32 -2
  44. package/dist/cjs/salla-loyalty-banner.cjs.entry.js +2 -2
  45. package/dist/cjs/salla-loyalty-hero_2.cjs.entry.js +4 -4
  46. package/dist/cjs/salla-loyalty-panel.cjs.entry.js +3 -3
  47. package/dist/cjs/salla-loyalty-points-banner.cjs.entry.js +1 -1
  48. package/dist/cjs/salla-loyalty-points-history.cjs.entry.js +1 -1
  49. package/dist/cjs/salla-loyalty-prize-item.cjs.entry.js +1 -1
  50. package/dist/cjs/salla-loyalty-program.cjs.entry.js +3 -3
  51. package/dist/cjs/salla-loyalty-reward.cjs.entry.js +2 -2
  52. package/dist/cjs/salla-loyalty.cjs.entry.js +1 -1
  53. package/dist/cjs/salla-maintenance-alert.cjs.entry.js +1 -1
  54. package/dist/cjs/salla-map.cjs.entry.js +1 -1
  55. package/dist/cjs/salla-menu.cjs.entry.js +1 -1
  56. package/dist/cjs/salla-metadata.cjs.entry.js +1 -1
  57. package/dist/cjs/salla-multiple-bundle-product-cart_2.cjs.entry.js +1 -1
  58. package/dist/cjs/salla-multiple-bundle-product-options-modal_2.cjs.entry.js +1 -1
  59. package/dist/cjs/salla-multiple-bundle-product.cjs.entry.js +1 -1
  60. package/dist/cjs/salla-next-order-coupon.cjs.entry.js +1 -1
  61. package/dist/cjs/salla-notification-item.cjs.entry.js +1 -1
  62. package/dist/cjs/salla-notifications.cjs.entry.js +1 -1
  63. package/dist/cjs/salla-offer-modal.cjs.entry.js +1 -1
  64. package/dist/cjs/salla-offer.cjs.entry.js +1 -1
  65. package/dist/cjs/salla-order-branch.cjs.entry.js +1 -1
  66. package/dist/cjs/salla-order-details-multiple-bundle-product.cjs.entry.js +1 -1
  67. package/dist/cjs/salla-order-details-options.cjs.entry.js +1 -1
  68. package/dist/cjs/salla-order-details.cjs.entry.js +1 -1
  69. package/dist/cjs/salla-order-edit-item.cjs.entry.js +1 -1
  70. package/dist/cjs/salla-order-edit-product-card.cjs.entry.js +1 -1
  71. package/dist/cjs/salla-order-edit.cjs.entry.js +1 -1
  72. package/dist/cjs/salla-order-summary.cjs.entry.js +1 -1
  73. package/dist/cjs/salla-order-totals-card.cjs.entry.js +1 -1
  74. package/dist/cjs/salla-orders.cjs.entry.js +1 -1
  75. package/dist/cjs/salla-payments.cjs.entry.js +1 -1
  76. package/dist/cjs/salla-placeholder.cjs.entry.js +1 -1
  77. package/dist/cjs/salla-price-range.cjs.entry.js +1 -1
  78. package/dist/cjs/salla-product-card-embed.cjs.entry.js +1 -1
  79. package/dist/cjs/salla-product-card_2.cjs.entry.js +1 -1
  80. package/dist/cjs/salla-product-size-guide.cjs.entry.js +1 -1
  81. package/dist/cjs/salla-products-list.cjs.entry.js +259 -64
  82. package/dist/cjs/salla-progress-bar.cjs.entry.js +1 -1
  83. package/dist/cjs/salla-quick-order.cjs.entry.js +3 -3
  84. package/dist/cjs/salla-rating-modal.cjs.entry.js +3 -3
  85. package/dist/cjs/salla-reward-action_4.cjs.entry.js +3 -3
  86. package/dist/cjs/salla-scopes.cjs.entry.js +1 -1
  87. package/dist/cjs/salla-search.cjs.entry.js +1 -1
  88. package/dist/cjs/salla-skeleton.cjs.entry.js +1 -1
  89. package/dist/cjs/salla-slider.cjs.entry.js +1 -1
  90. package/dist/cjs/salla-social-share.cjs.entry.js +252 -32
  91. package/dist/cjs/salla-social.cjs.entry.js +1 -1
  92. package/dist/cjs/salla-tab-content_3.cjs.entry.js +4 -4
  93. package/dist/cjs/salla-tiered-offer.cjs.entry.js +1 -1
  94. package/dist/cjs/salla-tooltip.cjs.entry.js +2 -2
  95. package/dist/cjs/salla-trust-badges.cjs.entry.js +1 -1
  96. package/dist/cjs/salla-user-menu.cjs.entry.js +1 -1
  97. package/dist/cjs/salla-user-profile.cjs.entry.js +1 -1
  98. package/dist/cjs/salla-user-settings.cjs.entry.js +2 -2
  99. package/dist/cjs/salla-verify.cjs.entry.js +3 -3
  100. package/dist/cjs/salla-wallet.cjs.entry.js +1 -1
  101. package/dist/cjs/salla-wishlist-actions.cjs.entry.js +329 -0
  102. package/dist/cjs/{tracked-promise-BdbqBT_O.js → tracked-promise-DvLhM2Sx.js} +1 -1
  103. package/dist/cjs/twilight.cjs.js +2 -2
  104. package/dist/cjs/{vanilla-picker-Cj5ogibZ.js → vanilla-picker-DtuN6WGq.js} +1 -1
  105. package/dist/collection/collection-manifest.json +2 -1
  106. package/dist/collection/components/salla-bullet-delivery/salla-bullet-delivery.js +90 -6
  107. package/dist/collection/components/salla-gifting/salla-gifting.css +18 -0
  108. package/dist/collection/components/salla-gifting/salla-gifting.js +91 -31
  109. package/dist/collection/components/salla-login-modal/salla-login-modal.js +31 -1
  110. package/dist/collection/components/salla-product-options/salla-product-options.css +0 -3
  111. package/dist/collection/components/salla-product-options/salla-product-options.js +28 -84
  112. package/dist/collection/components/salla-products-list/salla-products-list.css +76 -0
  113. package/dist/collection/components/salla-products-list/salla-products-list.js +387 -65
  114. package/dist/collection/components/salla-social-share/salla-social-share.css +161 -0
  115. package/dist/collection/components/salla-social-share/salla-social-share.js +316 -50
  116. package/dist/collection/components/salla-tabs/salla-tab-content.js +1 -1
  117. package/dist/collection/components/salla-tabs/salla-tab-header.js +1 -1
  118. package/dist/collection/components/salla-tabs/salla-tabs.js +1 -1
  119. package/dist/collection/components/salla-tel-input/salla-tel-input.js +1 -1
  120. package/dist/collection/components/salla-tooltip/salla-tooltip.js +1 -1
  121. package/dist/collection/components/salla-user-settings/salla-user-settings.js +1 -1
  122. package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.css +65 -0
  123. package/dist/collection/components/salla-wishlist-actions/salla-wishlist-actions.js +432 -0
  124. package/dist/components/index.js +5 -5
  125. package/dist/components/salla-bullet-delivery.js +90 -6
  126. package/dist/components/salla-gifting.js +86 -30
  127. package/dist/components/salla-login-modal2.js +31 -1
  128. package/dist/components/salla-product-options2.js +28 -84
  129. package/dist/components/salla-products-list2.js +266 -64
  130. package/dist/components/salla-social-share.js +1 -189
  131. package/dist/components/salla-social-share2.js +420 -0
  132. package/dist/components/salla-tab-content2.js +1 -1
  133. package/dist/components/salla-tab-header2.js +1 -1
  134. package/dist/components/salla-tabs2.js +1 -1
  135. package/dist/components/salla-tel-input2.js +1 -1
  136. package/dist/components/salla-tooltip2.js +1 -1
  137. package/dist/components/salla-user-settings.js +1 -1
  138. package/dist/components/salla-wishlist-actions.d.ts +11 -0
  139. package/dist/components/salla-wishlist-actions.js +375 -0
  140. package/dist/esm/{filepond-Cpf2HNH9.js → filepond-D4dDq1wa.js} +1 -1
  141. package/dist/esm/{filepond-plugin-file-poster-CVurRtjC.js → filepond-plugin-file-poster-CcnsMPSH.js} +1 -1
  142. package/dist/esm/{filepond-plugin-file-validate-size-Dw2xFbfx.js → filepond-plugin-file-validate-size-qgEgRYkk.js} +1 -1
  143. package/dist/esm/{filepond-plugin-file-validate-type-D6seJVa2.js → filepond-plugin-file-validate-type-BuFGnco8.js} +1 -1
  144. package/dist/esm/{filepond-plugin-image-edit-CBikW78V.js → filepond-plugin-image-edit-kS2Sie2d.js} +1 -1
  145. package/dist/esm/{filepond-plugin-image-exif-orientation-5yNhe9TO.js → filepond-plugin-image-exif-orientation-Bjoh_of2.js} +1 -1
  146. package/dist/esm/{filepond-plugin-image-preview-PlAAXB7f.js → filepond-plugin-image-preview-b_VEHHGf.js} +1 -1
  147. package/dist/esm/{functions-Egzz8fEM.js → functions-ISZQDw0y.js} +1 -1
  148. package/dist/esm/{index-Do4FV1UZ.js → index-CqC4wD_f.js} +1 -1
  149. package/dist/esm/{index-a4x9urdK.js → index-Cqh-ta1v.js} +9 -5
  150. package/dist/esm/loader.js +3 -3
  151. package/dist/esm/{mail-DLNIOD9t.js → mail-DzAIgzdz.js} +2 -2
  152. package/dist/esm/salla-accordion-body_2.entry.js +1 -1
  153. package/dist/esm/salla-accordion_6.entry.js +1 -1
  154. package/dist/esm/salla-add-product-button_5.entry.js +29 -84
  155. package/dist/esm/salla-advertisement.entry.js +1 -1
  156. package/dist/esm/salla-alert_2.entry.js +1 -1
  157. package/dist/esm/salla-app-install-alert.entry.js +1 -1
  158. package/dist/esm/salla-apps-icons.entry.js +1 -1
  159. package/dist/esm/salla-badge.entry.js +1 -1
  160. package/dist/esm/salla-booking-field_7.entry.js +11 -11
  161. package/dist/esm/salla-bullet-delivery_2.entry.js +91 -7
  162. package/dist/esm/salla-cart-coupons.entry.js +1 -1
  163. package/dist/esm/salla-cart-item-offers_2.entry.js +1 -1
  164. package/dist/esm/salla-cashback-banner.entry.js +1 -1
  165. package/dist/esm/salla-comment-form_8.entry.js +1 -1
  166. package/dist/esm/salla-conditional-offer.entry.js +1 -1
  167. package/dist/esm/salla-contacts.entry.js +3 -3
  168. package/dist/esm/salla-cookies-bar.entry.js +1 -1
  169. package/dist/esm/salla-count-down.entry.js +1 -1
  170. package/dist/esm/salla-custom-fields.entry.js +1 -1
  171. package/dist/esm/salla-delivery-promise.entry.js +1 -1
  172. package/dist/esm/salla-edit-order-button.entry.js +1 -1
  173. package/dist/esm/salla-filters-widget.entry.js +1 -1
  174. package/dist/esm/salla-filters.entry.js +1 -1
  175. package/dist/esm/salla-fulfillment-methods.entry.js +1 -1
  176. package/dist/esm/salla-gifting.entry.js +85 -31
  177. package/dist/esm/salla-hook.entry.js +1 -1
  178. package/dist/esm/salla-infinite-scroll.entry.js +1 -1
  179. package/dist/esm/salla-installment.entry.js +1 -1
  180. package/dist/esm/salla-list-tile.entry.js +1 -1
  181. package/dist/esm/salla-localization-modal.entry.js +1 -1
  182. package/dist/esm/salla-login-modal.entry.js +32 -2
  183. package/dist/esm/salla-loyalty-banner.entry.js +2 -2
  184. package/dist/esm/salla-loyalty-hero_2.entry.js +4 -4
  185. package/dist/esm/salla-loyalty-panel.entry.js +3 -3
  186. package/dist/esm/salla-loyalty-points-banner.entry.js +1 -1
  187. package/dist/esm/salla-loyalty-points-history.entry.js +1 -1
  188. package/dist/esm/salla-loyalty-prize-item.entry.js +1 -1
  189. package/dist/esm/salla-loyalty-program.entry.js +3 -3
  190. package/dist/esm/salla-loyalty-reward.entry.js +2 -2
  191. package/dist/esm/salla-loyalty.entry.js +1 -1
  192. package/dist/esm/salla-maintenance-alert.entry.js +1 -1
  193. package/dist/esm/salla-map.entry.js +1 -1
  194. package/dist/esm/salla-menu.entry.js +1 -1
  195. package/dist/esm/salla-metadata.entry.js +1 -1
  196. package/dist/esm/salla-multiple-bundle-product-cart_2.entry.js +1 -1
  197. package/dist/esm/salla-multiple-bundle-product-options-modal_2.entry.js +1 -1
  198. package/dist/esm/salla-multiple-bundle-product.entry.js +1 -1
  199. package/dist/esm/salla-next-order-coupon.entry.js +1 -1
  200. package/dist/esm/salla-notification-item.entry.js +1 -1
  201. package/dist/esm/salla-notifications.entry.js +1 -1
  202. package/dist/esm/salla-offer-modal.entry.js +1 -1
  203. package/dist/esm/salla-offer.entry.js +1 -1
  204. package/dist/esm/salla-order-branch.entry.js +1 -1
  205. package/dist/esm/salla-order-details-multiple-bundle-product.entry.js +1 -1
  206. package/dist/esm/salla-order-details-options.entry.js +1 -1
  207. package/dist/esm/salla-order-details.entry.js +1 -1
  208. package/dist/esm/salla-order-edit-item.entry.js +1 -1
  209. package/dist/esm/salla-order-edit-product-card.entry.js +1 -1
  210. package/dist/esm/salla-order-edit.entry.js +1 -1
  211. package/dist/esm/salla-order-summary.entry.js +1 -1
  212. package/dist/esm/salla-order-totals-card.entry.js +1 -1
  213. package/dist/esm/salla-orders.entry.js +1 -1
  214. package/dist/esm/salla-payments.entry.js +1 -1
  215. package/dist/esm/salla-placeholder.entry.js +1 -1
  216. package/dist/esm/salla-price-range.entry.js +1 -1
  217. package/dist/esm/salla-product-card-embed.entry.js +1 -1
  218. package/dist/esm/salla-product-card_2.entry.js +1 -1
  219. package/dist/esm/salla-product-size-guide.entry.js +1 -1
  220. package/dist/esm/salla-products-list.entry.js +259 -64
  221. package/dist/esm/salla-progress-bar.entry.js +1 -1
  222. package/dist/esm/salla-quick-order.entry.js +3 -3
  223. package/dist/esm/salla-rating-modal.entry.js +3 -3
  224. package/dist/esm/salla-reward-action_4.entry.js +3 -3
  225. package/dist/esm/salla-scopes.entry.js +1 -1
  226. package/dist/esm/salla-search.entry.js +1 -1
  227. package/dist/esm/salla-skeleton.entry.js +1 -1
  228. package/dist/esm/salla-slider.entry.js +1 -1
  229. package/dist/esm/salla-social-share.entry.js +252 -32
  230. package/dist/esm/salla-social.entry.js +1 -1
  231. package/dist/esm/salla-tab-content_3.entry.js +4 -4
  232. package/dist/esm/salla-tiered-offer.entry.js +1 -1
  233. package/dist/esm/salla-tooltip.entry.js +2 -2
  234. package/dist/esm/salla-trust-badges.entry.js +1 -1
  235. package/dist/esm/salla-user-menu.entry.js +1 -1
  236. package/dist/esm/salla-user-profile.entry.js +1 -1
  237. package/dist/esm/salla-user-settings.entry.js +2 -2
  238. package/dist/esm/salla-verify.entry.js +3 -3
  239. package/dist/esm/salla-wallet.entry.js +1 -1
  240. package/dist/esm/salla-wishlist-actions.entry.js +327 -0
  241. package/dist/esm/{tracked-promise-BX5clCDX.js → tracked-promise-CH_UyK-l.js} +1 -1
  242. package/dist/esm/twilight.js +3 -3
  243. package/dist/esm/{vanilla-picker-DB0pDHa7.js → vanilla-picker-PE31tu9y.js} +1 -1
  244. package/dist/twilight/{p-afcb0117.entry.js → p-054c9462.entry.js} +1 -1
  245. package/dist/twilight/{p-78020271.entry.js → p-06372aeb.entry.js} +1 -1
  246. package/dist/twilight/p-06c06719.entry.js +4 -0
  247. package/dist/twilight/{p-16bcc5ab.entry.js → p-0c7efc0b.entry.js} +1 -1
  248. package/dist/twilight/{p-53cbb271.entry.js → p-0cca1b63.entry.js} +1 -1
  249. package/dist/twilight/{p-ad19661d.entry.js → p-1415eb5e.entry.js} +1 -1
  250. package/dist/twilight/{p-a53d5944.entry.js → p-14a3277b.entry.js} +1 -1
  251. package/dist/twilight/{p-92b02f3c.entry.js → p-15b3f969.entry.js} +1 -1
  252. package/dist/twilight/{p-241bd42e.entry.js → p-16b64bb5.entry.js} +1 -1
  253. package/dist/twilight/{p-37457147.entry.js → p-16c64a38.entry.js} +1 -1
  254. package/dist/twilight/{p-f5135cb5.entry.js → p-17920aa7.entry.js} +1 -1
  255. package/dist/twilight/{p-ec5ae058.entry.js → p-196fad8d.entry.js} +1 -1
  256. package/dist/twilight/{p-5803c158.entry.js → p-19fe2b27.entry.js} +1 -1
  257. package/dist/twilight/{p-316135f8.entry.js → p-1c0f9fd9.entry.js} +1 -1
  258. package/dist/twilight/{p-1130d4b7.entry.js → p-1db8b515.entry.js} +1 -1
  259. package/dist/twilight/{p-d0340e11.entry.js → p-219b14c4.entry.js} +1 -1
  260. package/dist/twilight/{p-127ee640.entry.js → p-227d11a0.entry.js} +1 -1
  261. package/dist/twilight/p-293a6d6b.entry.js +4 -0
  262. package/dist/twilight/{p-0c748664.entry.js → p-2ba603bc.entry.js} +1 -1
  263. package/dist/twilight/p-2dbb3b49.entry.js +4 -0
  264. package/dist/twilight/{p-5b365561.entry.js → p-31bd852c.entry.js} +1 -1
  265. package/dist/twilight/{p-92f3ea44.entry.js → p-32a7cb85.entry.js} +1 -1
  266. package/dist/twilight/{p-1a37b959.entry.js → p-32d5d279.entry.js} +1 -1
  267. package/dist/twilight/{p-91363b7e.entry.js → p-36884c05.entry.js} +1 -1
  268. package/dist/twilight/{p-13a033fa.entry.js → p-38a791cb.entry.js} +1 -1
  269. package/dist/twilight/{p-0b169d4e.entry.js → p-3b198162.entry.js} +1 -1
  270. package/dist/twilight/{p-735fafef.entry.js → p-3d517178.entry.js} +1 -1
  271. package/dist/twilight/{p-d9d4ea5b.entry.js → p-3e5a57cc.entry.js} +1 -1
  272. package/dist/twilight/{p-fa1cc092.entry.js → p-40eb9556.entry.js} +6 -6
  273. package/dist/twilight/{p-1ce817c2.entry.js → p-49181c4a.entry.js} +1 -1
  274. package/dist/twilight/p-4a81a708.entry.js +4 -0
  275. package/dist/twilight/{p-35ac1fc9.entry.js → p-4b20872a.entry.js} +1 -1
  276. package/dist/twilight/{p-e27363dd.entry.js → p-4c370853.entry.js} +1 -1
  277. package/dist/twilight/{p-e1205d19.entry.js → p-4ee20a54.entry.js} +1 -1
  278. package/dist/twilight/{p-b0bf7a5b.entry.js → p-51c30ec2.entry.js} +1 -1
  279. package/dist/twilight/{p-2bcfb4f3.entry.js → p-5334222c.entry.js} +1 -1
  280. package/dist/twilight/{p-c0380d40.entry.js → p-559bdcca.entry.js} +1 -1
  281. package/dist/twilight/{p-03d13b9f.entry.js → p-5701244a.entry.js} +1 -1
  282. package/dist/twilight/{p-0da78d4e.entry.js → p-5d364fc2.entry.js} +1 -1
  283. package/dist/twilight/{p-DiWHgCMH.js → p-5fxCpxw5.js} +1 -1
  284. package/dist/twilight/{p-08b2c781.entry.js → p-61ad2660.entry.js} +1 -1
  285. package/dist/twilight/p-6590acee.entry.js +4 -0
  286. package/dist/twilight/{p-b8ab7da8.entry.js → p-681f8874.entry.js} +1 -1
  287. package/dist/twilight/{p-d17596ff.entry.js → p-6b6f9822.entry.js} +1 -1
  288. package/dist/twilight/{p-4d393389.entry.js → p-6d23fd92.entry.js} +1 -1
  289. package/dist/twilight/p-6e723d46.entry.js +4 -0
  290. package/dist/twilight/{p-d33203b7.entry.js → p-71f2ba66.entry.js} +1 -1
  291. package/dist/twilight/{p-c8fd03c0.entry.js → p-732bd9fb.entry.js} +1 -1
  292. package/dist/twilight/{p-42a0b54a.entry.js → p-73d9e4c8.entry.js} +1 -1
  293. package/dist/twilight/{p-e90d18b2.entry.js → p-74e0d0c2.entry.js} +1 -1
  294. package/dist/twilight/{p-52fe97c8.entry.js → p-77d2312a.entry.js} +1 -1
  295. package/dist/twilight/{p-635347c9.entry.js → p-78ff445c.entry.js} +1 -1
  296. package/dist/twilight/{p-74a61155.entry.js → p-798fb3c7.entry.js} +1 -1
  297. package/dist/twilight/{p-e726123e.entry.js → p-79c20964.entry.js} +1 -1
  298. package/dist/twilight/{p-C4aFleDM.js → p-7FtjQghq.js} +1 -1
  299. package/dist/twilight/{p-0405f5e8.entry.js → p-7afe6e1a.entry.js} +1 -1
  300. package/dist/twilight/{p-b80adb19.entry.js → p-7e185acf.entry.js} +1 -1
  301. package/dist/twilight/{p-f684d7bf.entry.js → p-8b538bd7.entry.js} +1 -1
  302. package/dist/twilight/{p-bfbf8121.entry.js → p-8bcc3b86.entry.js} +1 -1
  303. package/dist/twilight/{p-a068fff4.entry.js → p-8db52fe9.entry.js} +1 -1
  304. package/dist/twilight/{p-89f11893.entry.js → p-93ec294d.entry.js} +1 -1
  305. package/dist/twilight/p-9785f314.entry.js +4 -0
  306. package/dist/twilight/{p-ff270706.entry.js → p-9a3f27e9.entry.js} +1 -1
  307. package/dist/twilight/{p-DSBkBAFI.js → p-B0uENqSF.js} +1 -1
  308. package/dist/twilight/{p-B7KW0zhB.js → p-C3kw3FEZ.js} +1 -1
  309. package/dist/twilight/{p-BVqg7xd9.js → p-CUfwD9kr.js} +1 -1
  310. package/dist/twilight/{p-a4x9urdK.js → p-Cqh-ta1v.js} +2 -2
  311. package/dist/twilight/{p-fCaOxwGH.js → p-DZ18vMT2.js} +1 -1
  312. package/dist/twilight/{p-EPfEwqOC.js → p-DyQ5MH6F.js} +1 -1
  313. package/dist/twilight/{p-DLNIOD9t.js → p-DzAIgzdz.js} +1 -1
  314. package/dist/twilight/{p-pOgjUtf9.js → p-J_27I63T.js} +1 -1
  315. package/dist/twilight/{p-10e0936d.entry.js → p-a85d80b5.entry.js} +1 -1
  316. package/dist/twilight/{p-6d47892b.entry.js → p-a918b812.entry.js} +1 -1
  317. package/dist/twilight/{p-ba1199ba.entry.js → p-aec0a2df.entry.js} +1 -1
  318. package/dist/twilight/{p-9b639078.entry.js → p-b16d8b19.entry.js} +1 -1
  319. package/dist/twilight/{p-ee605cef.entry.js → p-b295c1f1.entry.js} +1 -1
  320. package/dist/twilight/{p-0957f323.entry.js → p-b6c0aa79.entry.js} +1 -1
  321. package/dist/twilight/{p-0bdf58a4.entry.js → p-b7727021.entry.js} +1 -1
  322. package/dist/twilight/{p-e8a82952.entry.js → p-badf4c9d.entry.js} +1 -1
  323. package/dist/twilight/{p-fe506679.entry.js → p-c6be8afd.entry.js} +1 -1
  324. package/dist/twilight/{p-ec073354.entry.js → p-ccd8c960.entry.js} +1 -1
  325. package/dist/twilight/{p-3fbd88d0.entry.js → p-ce0410d5.entry.js} +1 -1
  326. package/dist/twilight/{p-ef8fb222.entry.js → p-cee7a8ad.entry.js} +1 -1
  327. package/dist/twilight/{p-f6bb956c.entry.js → p-d0c8435f.entry.js} +1 -1
  328. package/dist/twilight/{p-59f815bc.entry.js → p-d23eeb0c.entry.js} +1 -1
  329. package/dist/twilight/{p-f170aff7.entry.js → p-d63f2cbd.entry.js} +1 -1
  330. package/dist/twilight/{p-6d87b134.entry.js → p-d6b6a8ad.entry.js} +1 -1
  331. package/dist/twilight/{p-b0ed6a9f.entry.js → p-d823cbcd.entry.js} +1 -1
  332. package/dist/twilight/{p-9df5c9a7.entry.js → p-d8f22e4b.entry.js} +1 -1
  333. package/dist/twilight/{p-CsMnvJkR.js → p-dKdk2xpB.js} +1 -1
  334. package/dist/twilight/p-dbdbb882.entry.js +4 -0
  335. package/dist/twilight/{p-d905fbca.entry.js → p-dc8555bf.entry.js} +1 -1
  336. package/dist/twilight/{p-fbfacb11.entry.js → p-dca3b67e.entry.js} +1 -1
  337. package/dist/twilight/{p-056400a1.entry.js → p-e0671ff1.entry.js} +1 -1
  338. package/dist/twilight/{p-59f7f014.entry.js → p-e06e37c1.entry.js} +1 -1
  339. package/dist/twilight/{p-c60c302f.entry.js → p-e265d626.entry.js} +1 -1
  340. package/dist/twilight/{p-61b1fd3b.entry.js → p-f0e96875.entry.js} +1 -1
  341. package/dist/twilight/p-f64168cc.entry.js +4 -0
  342. package/dist/twilight/{p-0b1970c2.entry.js → p-f67639df.entry.js} +1 -1
  343. package/dist/twilight/{p-fa039238.entry.js → p-fd180bd3.entry.js} +1 -1
  344. package/dist/twilight/{p-D9ni3BuG.js → p-m2p-QAbu.js} +1 -1
  345. package/dist/twilight/{p-CkA6UKAD.js → p-yyvPGK6r.js} +2 -2
  346. package/dist/twilight/twilight.esm.js +1 -1
  347. package/dist/types/components/salla-bullet-delivery/salla-bullet-delivery.d.ts +16 -0
  348. package/dist/types/components/salla-gifting/gift-schema.d.ts +4 -0
  349. package/dist/types/components/salla-gifting/salla-gifting.d.ts +5 -1
  350. package/dist/types/components/salla-login-modal/salla-login-modal.d.ts +2 -0
  351. package/dist/types/components/salla-product-options/salla-product-options.d.ts +0 -11
  352. package/dist/types/components/salla-products-list/salla-products-list.d.ts +60 -6
  353. package/dist/types/components/salla-social-share/salla-social-share.d.ts +39 -2
  354. package/dist/types/components/salla-wishlist-actions/salla-wishlist-actions.d.ts +93 -0
  355. package/dist/types/components.d.ts +172 -18
  356. package/package.json +5 -5
  357. package/dist/twilight/p-234fdf72.entry.js +0 -4
  358. package/dist/twilight/p-7a1cfd65.entry.js +0 -4
  359. package/dist/twilight/p-865c602e.entry.js +0 -4
  360. package/dist/twilight/p-9dc0fec4.entry.js +0 -4
  361. package/dist/twilight/p-e485d0b8.entry.js +0 -4
  362. package/dist/twilight/p-f5072671.entry.js +0 -4
  363. package/dist/twilight/p-fb7904e6.entry.js +0 -4
  364. package/dist/twilight/p-fdde8399.entry.js +0 -4
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var index = require('./index-JuURs8Nc.js');
6
+ var index = require('./index-inmL4H71.js');
7
7
 
8
8
  function _mergeNamespaces(n, m) {
9
9
  m.forEach(function (e) {
@@ -122,7 +122,8 @@
122
122
  "components/salla-user-profile/salla-user-profile.js",
123
123
  "components/salla-user-settings/salla-user-settings.js",
124
124
  "components/salla-verify/salla-verify.js",
125
- "components/salla-wallet/salla-wallet.js"
125
+ "components/salla-wallet/salla-wallet.js",
126
+ "components/salla-wishlist-actions/salla-wishlist-actions.js"
126
127
  ],
127
128
  "compiler": {
128
129
  "name": "@stencil/core",
@@ -6,6 +6,8 @@ import { bulletDeliveryAPI, clearApiCache, isSaudiArabia } from "./api-service";
6
6
  import { buildAddressLocationPayloadFromSelection, filterBranches, findNearestBranch, formatWorkingHoursDisplay, getBranchFirstSlot, getGeolocationErrorMessage, getIntentBranchId, getIntentCityId, getIntentCountryCode, getIntentCountryId, getIntentDistrictId, getIntentLatitude, getIntentLongitude, getIntentRegionId, getIntentSubtitle, hasSessionAddressIntent, requireRegionAndDistrictForSA, } from "./helpers";
7
7
  const BRANCH_SEARCH_DEBOUNCE_MS = 1000;
8
8
  const GEOLOCATION_TIMEOUT = 10000;
9
+ /** Final fallback center used only if `user.default_geo_location` is absent (Riyadh — matches checkout map-page). */
10
+ const DEFAULT_MAP_CENTER = { lat: 24.7756042, lng: 46.7360729 };
9
11
  import { load } from "@salla.sa/ui-google-map-render";
10
12
  import "@salla.sa/ui-google-map-render";
11
13
  import GetDirections from "../../assets/svg/get-directions.svg";
@@ -64,6 +66,8 @@ export class SallaBulletDelivery {
64
66
  /** True after saved addresses have been loaded (lazy: only when address tab is shown). */
65
67
  this.savedAddressesLoaded = false;
66
68
  this.gmapRef = null;
69
+ /** Guards against re-prompting for geolocation each time the map (re)initializes within one flow. */
70
+ this.autoGeolocationTriggered = false;
67
71
  // Core state
68
72
  this.activeTab = "address";
69
73
  this.isLoggedIn = false;
@@ -205,6 +209,8 @@ export class SallaBulletDelivery {
205
209
  shortAddress: detail.place?.placeId ?? detail.place?.place_id ?? undefined,
206
210
  formattedAddress: detail.place?.formattedAddress ?? detail.place?.formatted_address ?? undefined,
207
211
  };
212
+ // Bias autocomplete results toward the currently selected location.
213
+ this.updateLocationBias();
208
214
  setTimeout(() => {
209
215
  const marker = this.gmapRef?.locationMarker;
210
216
  if (marker)
@@ -216,6 +222,25 @@ export class SallaBulletDelivery {
216
222
  if (this.gmapRef && typeof this.gmapRef.resize === 'function') {
217
223
  this.gmapRef.resize();
218
224
  }
225
+ this.updateLocationBias();
226
+ // Auto-locate the customer so the map never opens "empty" — matches checkout map-page
227
+ // (getCurrentLocation(true) pans to the resolved position). Skip if a location is already set
228
+ // (e.g. returning from the confirm step). Falls back silently to mapInitialCenter if denied.
229
+ if (!this.autoGeolocationTriggered && !this.hasMapLocation() && this.gmapRef) {
230
+ const getCurrentLocation = this.gmapRef.getCurrentLocation;
231
+ if (typeof getCurrentLocation === 'function') {
232
+ this.autoGeolocationTriggered = true;
233
+ try {
234
+ const result = getCurrentLocation.call(this.gmapRef, true);
235
+ if (result && typeof result.catch === 'function') {
236
+ result.catch((err) => log('Auto geolocation failed', err));
237
+ }
238
+ }
239
+ catch (err) {
240
+ log('Auto geolocation threw', err);
241
+ }
242
+ }
243
+ }
219
244
  };
220
245
  /**
221
246
  * Submit add-address form: create address via API then switch back to list.
@@ -339,6 +364,9 @@ export class SallaBulletDelivery {
339
364
  get isRequired() {
340
365
  return !!Salla.config.get("store.settings.bullet_delivery.settings.is_required");
341
366
  }
367
+ get isSupportsDelivery() {
368
+ return !!Salla.config.get("store.settings.bullet_delivery.supports_delivery");
369
+ }
342
370
  get isMobileApp() {
343
371
  return Salla.config.isMobileApp();
344
372
  }
@@ -447,6 +475,7 @@ export class SallaBulletDelivery {
447
475
  }
448
476
  resetState() {
449
477
  this.viewMode = "main";
478
+ this.autoGeolocationTriggered = false;
450
479
  this.selectedCountry = null;
451
480
  this.selectedRegion = null;
452
481
  this.selectedCity = null;
@@ -524,12 +553,27 @@ export class SallaBulletDelivery {
524
553
  // only when it represents a valid session-style address.
525
554
  return hasSessionAddressIntent(intent);
526
555
  }
556
+ /**
557
+ * Whether the store still supports the delivery method captured in a stored
558
+ * intent. Shared by the cart pill and the cart-submit gate so an unsupported
559
+ * method (e.g. a remembered delivery address in a now pickup-only store) is
560
+ * never treated as a valid/complete selection.
561
+ */
562
+ isIntentMethodSupported(intent) {
563
+ if (intent.type === "branch")
564
+ return this.supportsPickup;
565
+ if (intent.type === "address")
566
+ return this.isSupportsDelivery;
567
+ return false;
568
+ }
527
569
  hasCompleteIntentForLoggedInUser() {
528
570
  if (this.isGuestUser())
529
571
  return false;
530
572
  const intent = this.getStoredIntent();
531
573
  if (!intent)
532
574
  return false;
575
+ if (!this.isIntentMethodSupported(intent))
576
+ return false;
533
577
  if (intent.type === "address")
534
578
  return !!intent.address_id;
535
579
  if (intent.type === "branch")
@@ -1107,6 +1151,7 @@ export class SallaBulletDelivery {
1107
1151
  async handleAddNewAddress() {
1108
1152
  this.viewMode = "add-address";
1109
1153
  this.mapLocationData = null;
1154
+ this.autoGeolocationTriggered = false;
1110
1155
  this.fetchAddressToken();
1111
1156
  const intent = this.getStoredIntent();
1112
1157
  const sessionCountryId = getIntentCountryId(intent);
@@ -1129,6 +1174,7 @@ export class SallaBulletDelivery {
1129
1174
  this.mapLocationData = null;
1130
1175
  this.mapStep = 'map';
1131
1176
  this.addressDescription = '';
1177
+ this.autoGeolocationTriggered = false;
1132
1178
  }
1133
1179
  // ─── Map methods ───
1134
1180
  async fetchAddressToken() {
@@ -1153,6 +1199,15 @@ export class SallaBulletDelivery {
1153
1199
  this.loadingToken = false;
1154
1200
  }
1155
1201
  }
1202
+ /** Bias autocomplete toward the current selection (or the initial center) — mirrors checkout's map-page. */
1203
+ updateLocationBias() {
1204
+ if (!this.gmapRef)
1205
+ return;
1206
+ const center = this.hasMapLocation()
1207
+ ? { lat: this.mapLocationData.lat, lng: this.mapLocationData.lng }
1208
+ : this.mapInitialCenter;
1209
+ this.gmapRef.autocompleteLocationBias = { center, radius: 500000 };
1210
+ }
1156
1211
  hasMapLocation() {
1157
1212
  return this.mapLocationData?.lat != null && this.mapLocationData?.lng != null;
1158
1213
  }
@@ -1163,6 +1218,27 @@ export class SallaBulletDelivery {
1163
1218
  get isMapModeAvailable() {
1164
1219
  return this.isMapSettingEnabled && !!salla.config.get('store.settings.keys.maps') && !!this.addressToken;
1165
1220
  }
1221
+ /** Center shown before geolocation resolves — the customer's IP-based default (falls back to Riyadh). */
1222
+ get mapInitialCenter() {
1223
+ const geo = salla.config.get('user.default_geo_location');
1224
+ // Coerce defensively: config may arrive as strings, blank/whitespace, NaN, or out-of-range
1225
+ // values. Reject blanks before coercion (Number('') === 0) and validate lat/lng ranges so we
1226
+ // never feed (0,0) or an invalid point to the map; otherwise fall back to the default center.
1227
+ const lat = this.toCoordinate(geo?.lat);
1228
+ const lng = this.toCoordinate(geo?.lng);
1229
+ const isValid = lat != null && lng != null &&
1230
+ lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;
1231
+ return isValid ? { lat, lng } : DEFAULT_MAP_CENTER;
1232
+ }
1233
+ /** Parse a config coordinate to a finite number, treating blank/whitespace strings as missing. */
1234
+ toCoordinate(value) {
1235
+ if (typeof value === 'string' && value.trim() === '')
1236
+ return null;
1237
+ if (value == null)
1238
+ return null;
1239
+ const num = Number(value);
1240
+ return Number.isFinite(num) ? num : null;
1241
+ }
1166
1242
  // ─── End Map methods ───
1167
1243
  /**
1168
1244
  * Build address/location payload from guest-form state (same fields as add-address).
@@ -1733,10 +1809,10 @@ export class SallaBulletDelivery {
1733
1809
  getCartViewConfig(intent) {
1734
1810
  if (!intent || !Salla.url.is_page("cart"))
1735
1811
  return null;
1812
+ if (!this.isIntentMethodSupported(intent))
1813
+ return null;
1736
1814
  const isBranch = intent.type === "branch";
1737
1815
  const isAddress = intent.type === "address";
1738
- if ((isBranch && !this.supportsPickup) || (!isBranch && !isAddress))
1739
- return null;
1740
1816
  return {
1741
1817
  title: isBranch
1742
1818
  ? Salla.lang.get("pages.checkout.pickup_option")
@@ -1786,13 +1862,15 @@ export class SallaBulletDelivery {
1786
1862
  return wrapper;
1787
1863
  }
1788
1864
  renderTabs() {
1789
- // Show tabs only when pickup is supported; otherwise delivery-only view with no tabs
1865
+ // Show tabs only when pickup is supported; otherwise delivery-only view with no tabs.
1866
+ // The pickup tab is gated by this same `supportsPickup` check, while the delivery
1867
+ // tab is shown only when bullet delivery supports delivery (`isSupportsDelivery`).
1790
1868
  if (!this.supportsPickup)
1791
1869
  return null;
1792
- return (h("div", { class: "s-bullet-delivery-tabs" }, h("button", { type: "button", class: {
1870
+ return (h("div", { class: "s-bullet-delivery-tabs" }, this.isSupportsDelivery && (h("button", { type: "button", class: {
1793
1871
  "s-bullet-delivery-tab": true,
1794
1872
  "s-bullet-delivery-tab--active": this.activeTab === "address",
1795
- }, onClick: () => this.handleTabChange("address") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Location, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.delivery"))), h("button", { type: "button", class: {
1873
+ }, onClick: () => this.handleTabChange("address") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Location, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.delivery")))), h("button", { type: "button", class: {
1796
1874
  "s-bullet-delivery-tab": true,
1797
1875
  "s-bullet-delivery-tab--active": this.activeTab === "branch",
1798
1876
  }, onClick: () => this.handleTabChange("branch") }, h("span", { class: "s-bullet-delivery-tab-icon", innerHTML: Store, "aria-hidden": "true" }), h("span", null, Salla.lang.get("mobile_app.strings.pickup")))));
@@ -1945,7 +2023,13 @@ export class SallaBulletDelivery {
1945
2023
  }
1946
2024
  renderMapSection() {
1947
2025
  const isSA = isSaudiArabia(this.selectedCountry?.code ?? '');
1948
- return (h("div", { class: "s-bullet-delivery-map-container" }, h("gmap-map", { ref: (el) => (this.gmapRef = el), zoom: 16, "map-id": "DEMO_MAP_ID", "enable-autocomplete": true, "enable-geolocation": true, "show-location-marker": true, language: Salla.lang.getLocale?.() ?? document.documentElement.lang ?? 'ar', "geolocation-button-label": Salla.lang.get('pages.checkout.current_location'), "autocomplete-placeholder": Salla.lang.get('pages.checkout.search_for_address'), "autocomplete-hint": isSA ? Salla.lang.get('pages.checkout.short_address_format_validation') : undefined, "autocomplete-country": this.selectedCountry?.code?.toLowerCase(), "autocomplete-resolve": false, "autocomplete-auth-token": this.addressToken, "location-marker-background": "#4285F4", "location-marker-border-color": "#1967D2", "location-marker-glyph-color": "#FFFFFF", "location-marker-scale": 1.3, "onGmap-location-changed": this.handleMapLocationChanged, "onGmap-ready": this.handleMapReady })));
2026
+ const loc = this.mapLocationData;
2027
+ const hasLoc = loc?.lat != null && loc?.lng != null;
2028
+ // Resolve the center once (the getter reads salla.config) and reuse it for the marker so the
2029
+ // map never opens "empty": before a selection the marker sits on the IP/Riyadh default and is
2030
+ // dragged/replaced once auto-geolocation or the user picks a real position.
2031
+ const center = hasLoc ? { lat: loc.lat, lng: loc.lng } : this.mapInitialCenter;
2032
+ return (h("div", { class: "s-bullet-delivery-map-container" }, h("gmap-map", { ref: (el) => (this.gmapRef = el), center: center, zoom: 16, "min-zoom": 4, "max-zoom": 21, "map-id": "DEMO_MAP_ID", "enable-autocomplete": true, "enable-geolocation": true, "show-location-marker": true, "location-marker-position": hasLoc ? { lat: loc.lat, lng: loc.lng, accuracy: 50 } : { ...center, accuracy: 50 }, language: Salla.lang.getLocale?.() ?? document.documentElement.lang ?? 'ar', "geolocation-button-label": Salla.lang.get('pages.checkout.current_location'), "autocomplete-placeholder": Salla.lang.get('pages.checkout.search_for_address'), "autocomplete-hint": isSA ? Salla.lang.get('pages.checkout.short_address_format_validation') : undefined, "autocomplete-country": this.selectedCountry?.code?.toLowerCase(), "autocomplete-resolve": false, "autocomplete-auth-token": this.addressToken, "location-marker-background": "#4285F4", "location-marker-border-color": "#1967D2", "location-marker-glyph-color": "#FFFFFF", "location-marker-scale": 1.3, "onGmap-location-changed": this.handleMapLocationChanged, "onGmap-ready": this.handleMapReady })));
1949
2033
  }
1950
2034
  renderAddressConfirmation() {
1951
2035
  const address = this.mapLocationData?.formattedAddress ?? '';
@@ -37,4 +37,22 @@
37
37
  }
38
38
  .s-gifting-modal .s-searchable-dropdown-trigger-placeholder {
39
39
  color: #000;
40
+ }
41
+ .s-gifting-modal .s-gifting-image-section {
42
+ margin-bottom: 1.5rem;
43
+ }
44
+ .s-gifting-modal .s-gifting-slider {
45
+ margin-bottom: 0.5rem;
46
+ }
47
+ .s-gifting-modal .s-gifting-image {
48
+ display: block;
49
+ }
50
+ .s-gifting-modal .s-gifting-image img {
51
+ display: block;
52
+ width: auto;
53
+ height: 100px;
54
+ object-fit: contain;
55
+ }
56
+ .s-gifting-modal .s-gifting-image-section + .anime-item .s-gifting-text-title {
57
+ margin-top: 1rem;
40
58
  }
@@ -14,7 +14,7 @@ import Alert from "../../assets/svg/alert.svg";
14
14
  export class SallaGifting {
15
15
  constructor() {
16
16
  this.defaultEvent = "gifting:open";
17
- this.selectImageForYourGift = salla.lang.get('blocks.buy_as_gift.select_image_or_upload');
17
+ this.selectImageForYourGift = salla.lang.get('blocks.buy_as_gift.select_image_for_your_gift');
18
18
  this.currentStep = 1;
19
19
  this.showCalendar = false;
20
20
  this.showGiftText = false;
@@ -50,6 +50,7 @@ export class SallaGifting {
50
50
  this.timeZone = null;
51
51
  this.receiverCountryCode = salla.config.get('store.scope.countries')?.[0] || salla.config.get('store.store_country') || 'SA';
52
52
  this.hostId = `salla-gifting-${Math.random().toString(36).slice(2, 10)}`;
53
+ this.disableClass = this.gift?.show_image_upload ? '' : 'pointer-events-none';
53
54
  /**
54
55
  * The form selector to be used to get the form data
55
56
  */
@@ -106,6 +107,7 @@ export class SallaGifting {
106
107
  this.sectionBtnText = salla.lang.get('blocks.buy_as_gift.send_as_a_gift');
107
108
  this.giftDetails = salla.lang.get('blocks.buy_as_gift.gift_details');
108
109
  this.selectGiftMessage = salla.lang.get('blocks.buy_as_gift.select_gift_message');
110
+ this.giftText = salla.lang.get('blocks.buy_as_gift.gift_text');
109
111
  this.giftCustomText = salla.lang.get('blocks.buy_as_gift.gift_custom_text');
110
112
  this.textId = salla.lang.get('blocks.buy_as_gift.text_id');
111
113
  this.incorrectGiftText = salla.lang.get('blocks.buy_as_gift.incorrect_gift_text');
@@ -175,13 +177,46 @@ export class SallaGifting {
175
177
  salla.event.dispatch('login::open', { withoutReload: true });
176
178
  return;
177
179
  }
180
+ this.currentStep = 1;
181
+ this.parentClass = 'is-current-step-1';
182
+ this.step2Animated = false;
183
+ this.selectedText = undefined;
184
+ this.selectedGiftTextOption = undefined;
185
+ this.uploadedImage = undefined;
186
+ this.selectedImage = undefined;
178
187
  await this.modal.open();
179
188
  // Determine the appropriate method to call based on the `physicalProducts` flag
180
189
  const giftDetailsMethod = this.productId ? () => salla.product.getGiftProductDetails(this.productId) : () => salla.cart.getGiftCartDetails();
181
190
  return await salla.api.withoutNotifier(giftDetailsMethod)
182
191
  .then((response) => {
183
192
  this.gift = response.data;
193
+ // Backward-compat: older BE responses omit these visibility flags. Treat a
194
+ // missing flag as enabled so the image/text steps still render until the BE
195
+ // that returns them is deployed. Use `??` so an explicit `false` is preserved.
196
+ this.gift.show_texts = this.gift.show_texts ?? true;
197
+ this.gift.show_images = this.gift.show_images ?? true;
198
+ this.gift.show_custom_text = this.gift.show_custom_text ?? true;
199
+ this.gift.show_image_upload = this.gift.show_image_upload ?? true;
184
200
  this.senderName = this.gift.sender_name;
201
+ this.disableClass = this.gift?.show_image_upload ? '' : 'pointer-events-none';
202
+ if (!this.gift.show_texts) {
203
+ this.selectedGiftTextOption = undefined;
204
+ this.selectedText = undefined;
205
+ }
206
+ if (!this.gift.show_images) {
207
+ this.selectedImage = undefined;
208
+ this.uploadedImage = undefined;
209
+ }
210
+ if (this.skipStep1()) {
211
+ this.currentStep = 2;
212
+ this.parentClass = 'is-current-step-2';
213
+ this.step2Animated = true;
214
+ }
215
+ else if (!this.gift.show_images) {
216
+ // the slider lays out asynchronously,
217
+ // so an early measurement would pin it too short and overlap the button.
218
+ this.setWrapperHeight(1, 250, 5);
219
+ }
185
220
  })
186
221
  .catch(e => {
187
222
  this.hasError = true;
@@ -189,6 +224,9 @@ export class SallaGifting {
189
224
  })
190
225
  .finally(() => this.modal.stopLoading());
191
226
  }
227
+ skipStep1() {
228
+ return !!this.gift && !this.gift.show_images && !this.gift.show_texts;
229
+ }
192
230
  /**
193
231
  *
194
232
  * Hide / close the gifting modal window
@@ -225,39 +263,35 @@ export class SallaGifting {
225
263
  this.textSelect?.classList.remove('s-form-has-error');
226
264
  let dataID = event.target.children[event.target.selectedIndex].getAttribute('data-id');
227
265
  let customID = dataID == "custom";
266
+ // Only the custom-text textarea changes the layout; resize the wrapper just
267
+ // when it actually appears/disappears so picking or clearing a normal option
268
+ // doesn't jump the modal height.
269
+ const customVisibilityChanged = this.showGiftText !== customID;
228
270
  this.showGiftText = customID;
229
271
  if (dataID) {
230
272
  this.selectedGiftTextOption = dataID;
231
273
  customID ? this.selectedText = undefined : this.selectedText = event.target.value;
232
- this.setWrapperHeight(1, 150, 5);
233
274
  }
234
275
  else {
235
276
  // empty textarea value
236
277
  this.textArea.value = '';
237
278
  this.selectedText = undefined;
238
279
  this.selectedGiftTextOption = undefined;
239
- this.setWrapperHeight(1, 150, -15);
280
+ }
281
+ if (customVisibilityChanged) {
282
+ this.setWrapperHeight(1, 150, 5);
240
283
  }
241
284
  }
242
285
  /**
243
286
  *
244
287
  * Go to the step 2
245
288
  */
246
- async goToStep2() {
247
- if (!this.selectedGiftTextOption) {
248
- this.textSelect.classList.add('s-form-has-error');
249
- this.customTextArea.classList.remove('s-form-has-error');
289
+ async goToStep2(withValidation = true) {
290
+ if (!this.step1Elems)
250
291
  return;
251
- }
252
- else if (this.selectedGiftTextOption == 'custom' && !this.selectedText) {
253
- this.textSelect.classList.remove('s-form-has-error');
254
- this.customTextArea.classList.add('s-form-has-error');
292
+ if (withValidation && !this.validateStep1()) {
255
293
  return;
256
294
  }
257
- else {
258
- this.textSelect.classList.remove('s-form-has-error');
259
- this.customTextArea.classList.remove('s-form-has-error');
260
- }
261
295
  this.setWrapperHeight(2, 600, 0);
262
296
  let stepNextAnime = new anime.timeline();
263
297
  stepNextAnime.add({
@@ -290,6 +324,23 @@ export class SallaGifting {
290
324
  this.currentStep = 2;
291
325
  this.parentClass = `is-current-step-${this.currentStep}`;
292
326
  }
327
+ validateStep1() {
328
+ if (!this.gift?.show_texts)
329
+ return true;
330
+ if (!this.selectedGiftTextOption) {
331
+ this.textSelect?.classList.add('s-form-has-error');
332
+ this.customTextArea?.classList.remove('s-form-has-error');
333
+ return false;
334
+ }
335
+ else if (this.selectedGiftTextOption == 'custom' && !this.selectedText) {
336
+ this.textSelect?.classList.remove('s-form-has-error');
337
+ this.customTextArea?.classList.add('s-form-has-error');
338
+ return false;
339
+ }
340
+ this.textSelect?.classList.remove('s-form-has-error');
341
+ this.customTextArea?.classList.remove('s-form-has-error');
342
+ return true;
343
+ }
293
344
  /**
294
345
  *
295
346
  * Go to the step 1
@@ -332,7 +383,7 @@ export class SallaGifting {
332
383
  this.parentClass = `is-current-step-${this.currentStep}`;
333
384
  }
334
385
  getFilepondPlaceholder() {
335
- return `<div class="s-gifting-filepond-placeholder"><span class="s-gifting-filepond-placeholder-icon">${Images}</span><p class="s-gifting-filepond-placeholder-text">${this.selectImageOrUpload ? this.selectImageOrUpload : ''}</p></div>`;
386
+ return `<div class="s-gifting-filepond-placeholder"><span class="s-gifting-filepond-placeholder-icon">${Images}</span><p class="s-gifting-filepond-placeholder-text">${this.selectImageOrUpload && this.gift.show_image_upload ? this.selectImageOrUpload : this.selectImageForYourGift}</p></div>`;
336
387
  }
337
388
  setPreview(image) {
338
389
  this.uploader?.classList.add('has-bg');
@@ -342,7 +393,7 @@ export class SallaGifting {
342
393
  bg.style.backgroundImage = "url('" + image.url + "')";
343
394
  this.uploader?.querySelector('.filepond--root')?.appendChild(bg);
344
395
  this.uploadedImage = image.url;
345
- if (!!this.gift && this.gift.gift_images.length) {
396
+ if (!!this.gift && this.gift.gift_images?.length) {
346
397
  this.setWrapperHeight(1, 150, 0);
347
398
  }
348
399
  }
@@ -355,7 +406,7 @@ export class SallaGifting {
355
406
  }
356
407
  handleTextAreaChange(event) {
357
408
  this.selectedText = event.target.value;
358
- this.customTextArea.classList.remove('s-form-has-error');
409
+ this.customTextArea?.classList.remove('s-form-has-error');
359
410
  }
360
411
  clearError(key) {
361
412
  if (this.errors?.[key]) {
@@ -506,13 +557,13 @@ export class SallaGifting {
506
557
  }
507
558
  handleUploadImage(img) {
508
559
  this.uploadedImage = img;
509
- if (!!this.gift && this.gift.gift_images.length) {
560
+ if (!!this.gift && this.gift.gift_images?.length) {
510
561
  this.setWrapperHeight(1, 150, 0);
511
562
  }
512
563
  }
513
564
  handleRemoveImage() {
514
565
  this.uploadedImage = '';
515
- if (!!this.gift && this.gift.gift_images.length) {
566
+ if (!!this.gift && this.gift.gift_images?.length) {
516
567
  this.setWrapperHeight(1, 150, 0);
517
568
  }
518
569
  }
@@ -646,16 +697,19 @@ export class SallaGifting {
646
697
  }
647
698
  render() {
648
699
  return [
649
- h("div", { key: 'db700f9ec96a6974f3b815bb017ebe97ae8fe5c0' }, h("salla-list-tile", { key: '1e2fd1c0b375c85fcd4af1ea071c36879e6913c5', class: this.generateClass() }, h("div", { key: 'a9d02c933bc13bf8765e7e91ce08b2c9495954e5', slot: "title" }, this.vertical ? h("span", { innerHTML: GiftSharing }) : '', h("h3", { key: '56bd850368806c6ed5770ea5f6b0339749a77dfa' }, !!this.widgetTitle ? this.widgetTitle : this.sectionTitle)), h("div", { key: 'fbb4940fd3e3578f2f5a479d9d44be8dfbda7e43', slot: "subtitle" }, h("div", { key: 'fb7e8532984fbfc6fd61c55a6d44d7cdbb4bc9a2' }, !!this.widgetSubtitle ? this.widgetSubtitle : this.sectionSubtitle)), h("div", { key: '04f27f1ddbfa0b06be111b6c3176fbda5ea6d43a', slot: "action" }, h("salla-button", { key: 'fe71a1a773e5275ede7d1b3ea535c330688028b7', color: "primary", fill: "outline", width: "wide", class: "s-gifting-widget-action", onClick: () => this.handleGiftButtonClick() }, h("slot", { key: 'd62127d30254df2d8add55e0e1dbcfefb686e359', name: "widget-btn-content" }, h("div", { key: '5ddbb695af142baf3bb6986627f97a7a7607eb31', class: "s-gifting-widget-action-content" }, h("span", { key: '7820fb6abd9d7a9c1035c0f80191a3ff2a4c5fe8', innerHTML: GiftSharing }), " \u00A0", h("span", { key: '2cfc69862d3d087375efaed3bcec0ff0c1587989' }, this.sectionBtnText)))))), h("salla-modal", { key: '32c19391248ba6186f43fea59493171079e7bf07', id: this.hostId, isLoading: true, class: "s-gifting-modal", width: "sm", ref: modal => this.modal = modal }, h("div", { key: 'e4b5829416314f25793158dae0c530b8057b4085', slot: "loading" }, h("div", { key: '6ee873add5868f105b7ec7291c2a8c8fc033c588', class: "s-gifting-skeleton" }, h("div", { key: '40aae38f8b2d62b434394811a3ef6d8bc00f6f32', class: "s-gifting-modal-header" }, h("salla-skeleton", { key: 'a652cd74a16d0db662ea4a518ebfab366a3c3899', type: 'circle', height: '5rem', width: '5rem' }), h("h2", { key: 'edb4a1477893246e98207aeba7bfb5af686f20b9', class: "s-gifting-modal-title" }, h("div", { key: '83ef942b15450cc59ad32d8c5b3ba43a32bcb29c', class: "s-gifting-modal-badge-wrapper" }, h("salla-skeleton", { key: 'd9041c777a2fa0aa7ffc752958c7441916a02f85', height: '15px', width: '150px' })))), h("div", { key: 'fe3bb9dad01becba87486c4886037fd67b059919', class: "s-gifting-skeleton-content" }, h("salla-skeleton", { key: '08bd8304b66264b70f6df68e64da3560a1f75461', height: '10px', width: '150px' }), h("salla-skeleton", { key: 'bbea0d7ff0c846897af2ef5d3696b252a2f4e662', height: '230px' }), h("salla-skeleton", { key: '8cb1fde02e31a1accabd2e26409983e7ba56eeb1', height: '10px', width: '150px' }), h("salla-skeleton", { key: 'f80a986b953278bac41505506adf8d611566a167', height: '30px' }), h("salla-skeleton", { key: 'f7eccce69b619de385872642e1fb62b2cf6c3082', height: '40px' })))), h("slot", { key: 'd299e46040193b441f8171d05e0048849e3df8d5', name: "header" }), !!this.hasError ?
700
+ h("div", { key: 'fdb6b68a052a9fa0a0d527edb25e3d7783cc47e9' }, h("salla-list-tile", { key: '3cfb7f37df96e924af7f977fd17f4161e40f83fe', class: this.generateClass() }, h("div", { key: '291a27d70bc43d6edac5c5838d93eaa6a51fb84a', slot: "title" }, this.vertical ? h("span", { innerHTML: GiftSharing }) : '', h("h3", { key: 'c49f119d84a279338c4478872883ba7356e118ce' }, !!this.widgetTitle ? this.widgetTitle : this.sectionTitle)), h("div", { key: '2ccfb84620132477c0845ffc0bbc257c350cdeb9', slot: "subtitle" }, h("div", { key: '2840a426b505f7fe7ac5c285ab9b74ca4f99ab55' }, !!this.widgetSubtitle ? this.widgetSubtitle : this.sectionSubtitle)), h("div", { key: 'e3560b1bc8a6c062417f3e2b7a91b5b20b4e1880', slot: "action" }, h("salla-button", { key: '5d96fb354f2845955344d782e693fe27a0fa2652', color: "primary", fill: "outline", width: "wide", class: "s-gifting-widget-action", onClick: () => this.handleGiftButtonClick() }, h("slot", { key: '384ab549dc1942a600cc37c4df26008a8a05e9ab', name: "widget-btn-content" }, h("div", { key: '80d83cd6296f2e93ebbc0eada8737d65c76e4ce0', class: "s-gifting-widget-action-content" }, h("span", { key: '69f6686f6fe23bdab891ab12b295cf918ba0a8fb', innerHTML: GiftSharing }), " \u00A0", h("span", { key: '495c9e9b10dcb69a1335d0345d42a8323b52abef' }, this.sectionBtnText)))))), h("salla-modal", { key: '303a208c394aa2c91f2273b3909208c29266b490', id: this.hostId, isLoading: true, class: "s-gifting-modal", width: "sm", ref: modal => this.modal = modal }, h("div", { key: '985a4d292ea01cb7ff48b443afe854de6f293abf', slot: "loading" }, h("div", { key: 'ba2b61f3bebf33d04d7132a00d3334a35042646a', class: "s-gifting-skeleton" }, h("div", { key: '4c8d2a5f128407423fd0c3070907d7781fb92283', class: "s-gifting-modal-header" }, h("salla-skeleton", { key: '8585263f0bcb523a5b537c3b13f9c2a0a3a898d0', type: 'circle', height: '5rem', width: '5rem' }), h("h2", { key: 'dbd2c3efbe5c91563275c09efd832709b6ed6748', class: "s-gifting-modal-title" }, h("div", { key: '4885e29c71001b530be33a4cf585fd77cf434dfd', class: "s-gifting-modal-badge-wrapper" }, h("salla-skeleton", { key: '6c248a65bcc92c51555f0dd8f6d10c6f9d4a2b9a', height: '15px', width: '150px' })))), h("div", { key: '07de64586572cea82b2561344b5922ad4f7cb2c1', class: "s-gifting-skeleton-content" }, h("salla-skeleton", { key: '9a9e45772c6f5ce30a19ebcb53405032dfc25862', height: '10px', width: '150px' }), h("salla-skeleton", { key: 'd1165987504fb2e5a7d013118b6ca5db2bf1523c', height: '230px' }), h("salla-skeleton", { key: '33cc657831541bcf6916c54c8dffca3b9933ccbb', height: '10px', width: '150px' }), h("salla-skeleton", { key: '46ff78b7725c57c955c73e9a71b9bf1c7340a354', height: '30px' }), h("salla-skeleton", { key: '520bd0a02c0bf4ef6109f014856dfad71d779aca', height: '40px' })))), h("slot", { key: '5519fd6df4f911b042f68f6825a563ce92f16733', name: "header" }), !!this.hasError ?
650
701
  h("salla-placeholder", { alignment: "center" }, h("span", { slot: "title" }, this.errorMessage || salla.lang.get('common.errors.empty_results')), h("span", { slot: "description" }, " "))
651
702
  :
652
703
  [
653
- h("div", { class: "s-gifting-modal-header" }, h("span", { class: "s-gifting-modal-icon" }, h("span", { innerHTML: GiftSharing })), h("h2", { class: "s-gifting-modal-title" }, h("div", { class: "s-gifting-modal-badge-wrapper" }, h("div", { class: "s-gifting-modal-badge" }, h("span", null, h("span", null, this.currentStep), "/2")), h("span", null, this.giftDetails)))),
654
- h("div", { class: "s-gifting-steps-wrapper " + this.parentClass, ref: el => this.stepsWrapper = el }, h("div", { class: "s-gifting-step-one gift-step-1", ref: el => this.step1Elems = el }, h("div", { class: "s-gifting-modal-uploader-title anime-item" }, this.selectImageForYourGift), h("div", { class: "s-gifting-modal-uploader anime-item", ref: el => this.uploader = el }, h("span", { class: "s-gifting-remove-preview", onClick: () => this.removePreview(), innerHTML: Cancel }), this.selectImageOrUpload && h("salla-file-upload", { "instant-upload": true, name: "image_url", url: salla.url.api(salla.product.api.getUrl('giftImage')), onUploaded: event => this.handleUploadImage(event.detail), labelIdle: this.getFilepondPlaceholder(), onRemoved: () => this.handleRemoveImage() })), h("div", { class: "anime-item" }, !this.uploadedImage && !!this.gift && !!this.gift.gift_images && this.gift.gift_images.length > 0 ?
655
- h("salla-slider", { id: "gifting-slider", loop: false, "controls-outer": true, class: "s-gifting-slider", type: "carousel" }, h("div", { slot: "items" }, this.gift && this.gift.gift_images ?
656
- this.gift?.gift_images.map((item) => h("a", { class: "s-gifting-clickable s-gifting-image", onClick: () => this.setPreview(item) }, h("img", { style: { "width": "120px" }, src: item.url, alt: `${item.id}` }))) : ''))
657
- : ""), h("div", { class: "anime-item" }, h("div", { class: "s-form-group s-gifting-selectText", ref: el => this.textSelect = el }, h("select", { id: "gift-text-selection", name: "gift-text-selection", class: "s-form-control s-gifting-select", onChange: e => this.toggleGiftText(e) }, h("option", { "data-id": null, selected: true }, this.selectGiftMessage), this.gift && this.gift.gift_texts ?
658
- this.gift?.gift_texts.map((txt) => h("option", { "data-id": txt.id, value: txt.text, key: txt.id }, txt.text)) : '', h("option", { "data-id": "custom" }, this.giftCustomText))), h("div", { class: this.showGiftText ? "s-form-group s-gifting-textarea shown" : "s-form-group s-gifting-textarea hide", ref: (el) => this.customTextArea = el }, h("label", { htmlFor: "gift-custom-text", class: "s-form-label" }, this.giftCustomText), h("div", { class: "mt-1" }, h("textarea", { onInput: (event) => this.handleTextAreaChange(event), rows: 4, ref: (el) => this.textArea = el, name: "gift-custom-text", id: "gift-custom-text", class: "s-form-control" })))), h("div", { class: "anime-item" }, h("salla-button", { color: "primary", width: "wide", onClick: () => this.goToStep2() }, h("span", null, this.nextStep)))), h("div", { class: "s-gifting-step-two gift-step-2", ref: el => this.step2Elems = el }, h("div", { class: this.step2ItemClass(this.errors?.['sender_name'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { htmlFor: "sender_name", class: "s-form-label" }, this.senderNameLabel), h("input", { type: "text", class: "s-form-control", name: "sender_name", id: "sender_name", value: this.senderName, onInput: (event) => this.handleSenderName(event), placeholder: "" }), this.errors && this.errors['sender_name'] ?
704
+ h("div", { class: "s-gifting-modal-header" }, h("span", { class: "s-gifting-modal-icon" }, h("span", { innerHTML: GiftSharing })), h("h2", { class: "s-gifting-modal-title" }, h("div", { class: "s-gifting-modal-badge-wrapper" }, !this.skipStep1() && h("div", { class: "s-gifting-modal-badge" }, h("span", null, h("span", null, this.currentStep), "/2")), h("span", null, this.giftDetails)))),
705
+ h("div", { class: "s-gifting-steps-wrapper " + this.parentClass, ref: el => this.stepsWrapper = el }, !this.skipStep1() && h("div", { class: "s-gifting-step-one gift-step-1", ref: el => this.step1Elems = el }, this.gift && this.gift.show_images &&
706
+ h("div", { class: "s-gifting-modal-uploader-title anime-item" }, this.selectImageForYourGift), this.gift && this.gift.show_images &&
707
+ h("div", { class: "s-gifting-image-section" }, h("div", { class: `s-gifting-modal-uploader anime-item ${this.disableClass}`, ref: el => this.uploader = el }, h("span", { class: "s-gifting-remove-preview pointer-events-auto", onClick: () => this.removePreview(), innerHTML: Cancel }), this.selectImageOrUpload && this.gift && h("salla-file-upload", { "instant-upload": true, name: "image_url", url: salla.url.api(salla.product.api.getUrl('giftImage')), onUploaded: event => this.handleUploadImage(event.detail), labelIdle: this.getFilepondPlaceholder(), onRemoved: () => this.handleRemoveImage() })), h("div", { class: "anime-item" }, !this.uploadedImage && !!this.gift && !!this.gift.gift_images && this.gift.gift_images.length > 0 ?
708
+ h("salla-slider", { id: "gifting-slider", loop: false, "controls-outer": true, class: "s-gifting-slider", type: "carousel" }, h("div", { slot: "items" }, this.gift && this.gift.gift_images ?
709
+ this.gift?.gift_images.map((item) => h("a", { class: "s-gifting-clickable s-gifting-image", onClick: () => this.setPreview(item) }, h("img", { src: item.url, alt: `${item.id}` }))) : ''))
710
+ : "")), this.gift && this.gift.show_texts ?
711
+ h("div", { class: "anime-item" }, h("div", { class: "s-gifting-modal-uploader-title s-gifting-text-title" }, this.giftText), h("div", { class: "s-form-group s-gifting-selectText", ref: el => this.textSelect = el }, h("select", { id: "gift-text-selection", name: "gift-text-selection", class: "s-form-control s-gifting-select", onChange: e => this.toggleGiftText(e) }, h("option", { "data-id": null, selected: true }, this.selectGiftMessage), this.gift && this.gift.gift_texts ?
712
+ this.gift?.gift_texts.map((txt) => h("option", { "data-id": txt.id, value: txt.text, key: txt.id }, txt.text)) : '', this.gift && this.gift.show_custom_text ? h("option", { "data-id": "custom" }, this.giftCustomText) : null)), h("div", { class: this.showGiftText && this.gift && this.gift.show_custom_text ? "s-form-group s-gifting-textarea shown" : "s-form-group s-gifting-textarea hide", ref: (el) => this.customTextArea = el }, h("label", { htmlFor: "gift-custom-text", class: "s-form-label" }, this.giftCustomText), h("div", { class: "mt-1" }, h("textarea", { onInput: (event) => this.handleTextAreaChange(event), rows: 4, ref: (el) => this.textArea = el, name: "gift-custom-text", id: "gift-custom-text", class: "s-form-control" })))) : null, h("div", { class: "anime-item" }, h("salla-button", { color: "primary", width: "wide", onClick: () => this.goToStep2(!!this.gift?.show_texts) }, h("span", null, this.nextStep)))), h("div", { class: "s-gifting-step-two gift-step-2", style: this.skipStep1() ? { opacity: '1', transform: 'translateX(0)', position: 'relative' } : undefined, ref: el => this.step2Elems = el }, h("div", { class: this.step2ItemClass(this.errors?.['sender_name'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { htmlFor: "sender_name", class: "s-form-label" }, this.senderNameLabel), h("input", { type: "text", class: "s-form-control", name: "sender_name", id: "sender_name", value: this.senderName, onInput: (event) => this.handleSenderName(event), placeholder: "" }), this.errors && this.errors['sender_name'] ?
659
713
  h("span", { class: "s-gifting-error" }, this.errors['sender_name']) : ''), h("div", { class: this.step2ItemClass(this.errors?.['receiver.name'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { htmlFor: "receiver_name", class: "s-form-label" }, this.receiverNameFieldLabel), h("input", { type: "text", class: "s-form-control", name: "receiver_name", id: "receiver_name", value: "", onInput: (event) => this.handleReceiverName(event), placeholder: "" }), this.errors && this.errors['receiver.name'] ?
660
714
  h("span", { class: "s-gifting-error" }, this.errors['receiver.name']) : ''), h("div", { class: this.step2ItemClass(this.errors?.['receiver.mobile'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { class: "s-form-label" }, this.receiverMobileFieldLabel), h("salla-tel-input", { class: "s-gifting-tel-input", phone: this.receiverMobile, countryCode: this.receiverCountryCode, onPhoneEntered: (e) => this.handlePhoneInputChange(e) }), this.errors && this.errors['receiver.mobile'] ?
661
715
  h("span", { class: "s-gifting-error" }, this.errors['receiver.mobile']) : ''), this.isPhysical() &&
@@ -665,8 +719,8 @@ export class SallaGifting {
665
719
  h("span", { class: "s-gifting-error" }, this.errors['receiver.region']) : ''), this.isPhysical() &&
666
720
  h("div", { class: this.step2ItemClass(this.errors?.['receiver.city_id'] ? 's-form-group s-form-has-error' : 's-form-group') }, h("label", { class: "s-form-label", htmlFor: `${this.hostId}-city` }, this.receiverCityFieldLabel), h("salla-searchable-dropdown", { placeholder: this.selectCity, items: this.displayedCities, selectedItem: this.selectedCity, loading: this.loadingCities, searching: this.searchingCities, disabled: this.loadingCities || (this.isKSA && !this.selectedRegionId), required: true, inputId: `${this.hostId}-city`, searchQuery: this.citySearchQuery, clientSearch: !this.enableCityAjaxSearch, dropUp: true, keepParentScroll: true, onItemSelected: (e) => this.handleCitySelected(e.detail), onSearchInput: (e) => this.handleCitySearch(e.detail), onDropdownClosed: () => this.handleCityDropdownClosed() }), this.errors && this.errors['receiver.city_id'] ?
667
721
  h("span", { class: "s-gifting-error" }, this.errors['receiver.city_id']) : ''), this.isPhysical() &&
668
- h("div", { class: this.step2ItemClass('s-gifting-info') }, h("span", { innerHTML: Alert }), h("span", null, this.selectCityInfo)), !this.isPhysical() && h("div", { class: this.step2ItemClass() }, h("label", { class: "s-gifting-schedule s-gifting-clickable", htmlFor: `schedule-${this.hostId}` }, h("input", { type: "checkbox", name: 'schedule', id: `schedule-${this.hostId}`, onChange: () => this.toggleCalendar(), class: "s-checkbox" }), h("span", { class: "s-form-label" }, " ", this.sendLater, " "))), h("div", { class: this.getCalendarClasses(), ref: (el) => this.calendarFormGroup = el }, h("label", { class: "s-form-label" }, this.selectSendDateAndTime), h("salla-datetime-picker", { value: this.deliveryDate, placeholder: this.selectSendDateAndTime, "enable-time": true, "date-format": "Y-m-d h:i K", onPicked: (event) => this.handleDateTimePicker(event) }), h("span", { class: "s-gifting-calendar-hint" }, this.canNotEditOrderAfterSelectDate)), h("div", { class: this.step2ItemClass('s-gifting-step-two-footer') }, h("a", { href: "#!", innerHTML: LeftArrow, onClick: (e) => this.goToStep1(e) }), h("salla-button", { onClick: () => this.submitForm(), color: "primary", width: 'wide' }, h("span", null, this.sendGift)))))
669
- ], h("slot", { key: 'bd8cd1628ed4282b177f0ddcd5fb93289c47b4d6', name: "footer" })))
722
+ h("div", { class: this.step2ItemClass('s-gifting-info') }, h("span", { innerHTML: Alert }), h("span", null, this.selectCityInfo)), !this.isPhysical() && h("div", { class: this.step2ItemClass() }, h("label", { class: "s-gifting-schedule s-gifting-clickable", htmlFor: `schedule-${this.hostId}` }, h("input", { type: "checkbox", name: 'schedule', id: `schedule-${this.hostId}`, onChange: () => this.toggleCalendar(), class: "s-checkbox" }), h("span", { class: "s-form-label" }, " ", this.sendLater, " "))), h("div", { class: this.getCalendarClasses(), ref: (el) => this.calendarFormGroup = el }, h("label", { class: "s-form-label" }, this.selectSendDateAndTime), h("salla-datetime-picker", { value: this.deliveryDate, placeholder: this.selectSendDateAndTime, "enable-time": true, "date-format": "Y-m-d h:i K", onPicked: (event) => this.handleDateTimePicker(event) }), h("span", { class: "s-gifting-calendar-hint" }, this.canNotEditOrderAfterSelectDate)), h("div", { class: this.step2ItemClass('s-gifting-step-two-footer') }, !this.skipStep1() && h("a", { href: "#!", innerHTML: LeftArrow, onClick: (e) => this.goToStep1(e) }), h("salla-button", { onClick: () => this.submitForm(), color: "primary", width: 'wide' }, h("span", null, this.sendGift)))))
723
+ ], h("slot", { key: '9413ec459b3b5dc137a90979990022b7ec1c6453', name: "footer" })))
670
724
  ];
671
725
  }
672
726
  static get is() { return "salla-gifting"; }
@@ -827,6 +881,7 @@ export class SallaGifting {
827
881
  "selectImageForYourGift": {},
828
882
  "selectImageOrUpload": {},
829
883
  "selectGiftMessage": {},
884
+ "giftText": {},
830
885
  "giftCustomText": {},
831
886
  "textId": {},
832
887
  "incorrectGiftText": {},
@@ -887,6 +942,7 @@ export class SallaGifting {
887
942
  "receiverCountryCode": {},
888
943
  "receiverEmail": {},
889
944
  "hostId": {},
945
+ "disableClass": {},
890
946
  "receiverCity": {}
891
947
  };
892
948
  }
@@ -932,8 +988,12 @@ export class SallaGifting {
932
988
  },
933
989
  "goToStep2": {
934
990
  "complexType": {
935
- "signature": "() => Promise<void>",
936
- "parameters": [],
991
+ "signature": "(withValidation?: boolean) => Promise<void>",
992
+ "parameters": [{
993
+ "name": "withValidation",
994
+ "type": "boolean",
995
+ "docs": ""
996
+ }],
937
997
  "references": {
938
998
  "Promise": {
939
999
  "location": "global",
@@ -56,7 +56,8 @@ export class SallaLoginModal {
56
56
  }
57
57
  componentDidLoad() {
58
58
  window.addEventListener('message', (event) => {
59
- if (event.data.source != "login") {
59
+ // Trust only our login iframe/passkey popup at the accounts origin.
60
+ if (!this.isTrustedMessage(event) || event.data?.source != "login") {
60
61
  return;
61
62
  }
62
63
  if (!this.inline && !this.canRenderIframe) {
@@ -133,6 +134,8 @@ export class SallaLoginModal {
133
134
  return window.location.reload();
134
135
  }
135
136
  if (action === 'open_page') {
137
+ if (!this.isSafeUrl(value?.url))
138
+ return;
136
139
  return window.location.href = value.url;
137
140
  }
138
141
  if (action === 'open_passkey_page') {
@@ -245,6 +248,33 @@ export class SallaLoginModal {
245
248
  }
246
249
  withCartReset && Salla.cart.reset();
247
250
  }
251
+ // Accept postMessage only from our own login iframe/passkey popup at the accounts origin.
252
+ isTrustedMessage(event) {
253
+ const fromIframe = !!this.iframe && event.source === this.iframe.contentWindow;
254
+ const fromPasskey = !!this.createPassKey && event.source === this.createPassKey;
255
+ if (!fromIframe && !fromPasskey)
256
+ return false;
257
+ let origin;
258
+ try {
259
+ origin = new URL(salla.config.get('login.url', 'https://accounts.salla.com')).origin;
260
+ }
261
+ catch (e) {
262
+ origin = 'https://accounts.salla.com';
263
+ }
264
+ return event.origin === origin;
265
+ }
266
+ // Reject javascript:/data: and other non-http(s) navigation targets.
267
+ isSafeUrl(url) {
268
+ if (typeof url !== 'string' || !url)
269
+ return false;
270
+ try {
271
+ const { protocol } = new URL(url, location.href);
272
+ return protocol === 'https:' || protocol === 'http:';
273
+ }
274
+ catch (e) {
275
+ return false;
276
+ }
277
+ }
248
278
  sendMessageToIframe(message) {
249
279
  if (!this.iframe)
250
280
  return;
@@ -1,3 +0,0 @@
1
- .s-product-options-option-stock-out {
2
- opacity: 0.5;
3
- }