@anker-in/headless-ui 1.2.2 → 1.2.3-alpha.1778583232121

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 (323) hide show
  1. package/dist/cjs/biz-components/AccordionCards/index.js +1 -1
  2. package/dist/cjs/biz-components/AccordionCards/index.js.map +3 -3
  3. package/dist/cjs/biz-components/ActivityMechanism/index.js +1 -1
  4. package/dist/cjs/biz-components/ActivityMechanism/index.js.map +3 -3
  5. package/dist/cjs/biz-components/ActivitySchedule/index.js +1 -1
  6. package/dist/cjs/biz-components/ActivitySchedule/index.js.map +3 -3
  7. package/dist/cjs/biz-components/AiuiProvider/index.js +1 -1
  8. package/dist/cjs/biz-components/AiuiProvider/index.js.map +3 -3
  9. package/dist/cjs/biz-components/AnchorNavigation/index.js +1 -1
  10. package/dist/cjs/biz-components/AnchorNavigation/index.js.map +3 -3
  11. package/dist/cjs/biz-components/BrandCardLink/BrandCardLink.js +1 -1
  12. package/dist/cjs/biz-components/BrandCardLink/BrandCardLink.js.map +3 -3
  13. package/dist/cjs/biz-components/Category/SwiperCategory.js +1 -1
  14. package/dist/cjs/biz-components/Category/SwiperCategory.js.map +3 -3
  15. package/dist/cjs/biz-components/Category/index.js +1 -1
  16. package/dist/cjs/biz-components/Category/index.js.map +3 -3
  17. package/dist/cjs/biz-components/Evaluate/index.js +1 -1
  18. package/dist/cjs/biz-components/Evaluate/index.js.map +3 -3
  19. package/dist/cjs/biz-components/EventSchedule/index.js +1 -1
  20. package/dist/cjs/biz-components/EventSchedule/index.js.map +3 -3
  21. package/dist/cjs/biz-components/Faq/Faq.js +1 -1
  22. package/dist/cjs/biz-components/Faq/Faq.js.map +2 -2
  23. package/dist/cjs/biz-components/Faq/types.d.ts +0 -1
  24. package/dist/cjs/biz-components/Faq/types.js +1 -1
  25. package/dist/cjs/biz-components/Faq/types.js.map +1 -1
  26. package/dist/cjs/biz-components/FeatureCards/FeatureCards.js +1 -1
  27. package/dist/cjs/biz-components/FeatureCards/FeatureCards.js.map +3 -3
  28. package/dist/cjs/biz-components/GiftBox/index.js +1 -1
  29. package/dist/cjs/biz-components/GiftBox/index.js.map +2 -2
  30. package/dist/cjs/biz-components/GiftShelf/index.js +1 -1
  31. package/dist/cjs/biz-components/GiftShelf/index.js.map +3 -3
  32. package/dist/cjs/biz-components/GiftTierShelf/index.js +1 -1
  33. package/dist/cjs/biz-components/GiftTierShelf/index.js.map +3 -3
  34. package/dist/cjs/biz-components/Graphic/index.js +1 -1
  35. package/dist/cjs/biz-components/Graphic/index.js.map +2 -2
  36. package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
  37. package/dist/cjs/biz-components/GraphicOverlay/GraphicOverlay.js.map +3 -3
  38. package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.d.ts +12 -0
  39. package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.js +2 -0
  40. package/dist/cjs/biz-components/HeaderNavigation/MobileTextLinksMenu.js.map +7 -0
  41. package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.d.ts +10 -0
  42. package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.js +2 -0
  43. package/dist/cjs/biz-components/HeaderNavigation/TextLinksDropdown.js.map +7 -0
  44. package/dist/cjs/biz-components/HeaderNavigation/index.js +1 -1
  45. package/dist/cjs/biz-components/HeaderNavigation/index.js.map +3 -3
  46. package/dist/cjs/biz-components/HeaderNavigation/types.d.ts +8 -1
  47. package/dist/cjs/biz-components/HeaderNavigation/types.js +1 -1
  48. package/dist/cjs/biz-components/HeaderNavigation/types.js.map +2 -2
  49. package/dist/cjs/biz-components/HeaderNavigation/withCategory.d.ts +1 -0
  50. package/dist/cjs/biz-components/HeaderNavigation/withCategory.js +1 -1
  51. package/dist/cjs/biz-components/HeaderNavigation/withCategory.js.map +3 -3
  52. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
  53. package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  54. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
  55. package/dist/cjs/biz-components/HeroBanner/HeroBannerCarousel.js.map +3 -3
  56. package/dist/cjs/biz-components/HeroBanner/types.d.ts +5 -0
  57. package/dist/cjs/biz-components/HeroBanner/types.js +1 -1
  58. package/dist/cjs/biz-components/HeroBanner/types.js.map +1 -1
  59. package/dist/cjs/biz-components/ImageOverlayShelf/ProductCard.js +1 -1
  60. package/dist/cjs/biz-components/ImageOverlayShelf/ProductCard.js.map +2 -2
  61. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js +1 -1
  62. package/dist/cjs/biz-components/ImageWithText/ImageWithText.js.map +3 -3
  63. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
  64. package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +3 -3
  65. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  66. package/dist/cjs/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  67. package/dist/cjs/biz-components/Listing/components/PurchaseBar/index.js +1 -1
  68. package/dist/cjs/biz-components/Listing/components/PurchaseBar/index.js.map +3 -3
  69. package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.d.ts +2 -0
  70. package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.js +1 -1
  71. package/dist/cjs/biz-components/Listing/components/PurchaseBar/types.js.map +1 -1
  72. package/dist/cjs/biz-components/LotteryShared/ErrorModal.d.ts +4 -0
  73. package/dist/cjs/biz-components/LotteryShared/ErrorModal.js.map +2 -2
  74. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.d.ts +13 -13
  75. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  76. package/dist/cjs/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  77. package/dist/cjs/biz-components/LotteryShared/types.d.ts +9 -0
  78. package/dist/cjs/biz-components/LotteryShared/types.js.map +2 -2
  79. package/dist/cjs/biz-components/Marquee/Marquee.d.ts +11 -4
  80. package/dist/cjs/biz-components/Marquee/Marquee.js +1 -1
  81. package/dist/cjs/biz-components/Marquee/Marquee.js.map +3 -3
  82. package/dist/cjs/biz-components/Marquee/index.d.ts +1 -1
  83. package/dist/cjs/biz-components/Marquee/index.js +1 -1
  84. package/dist/cjs/biz-components/Marquee/index.js.map +2 -2
  85. package/dist/cjs/biz-components/Marquee/type.d.ts +22 -4
  86. package/dist/cjs/biz-components/Marquee/type.js +1 -1
  87. package/dist/cjs/biz-components/Marquee/type.js.map +1 -1
  88. package/dist/cjs/biz-components/Media/index.js +1 -1
  89. package/dist/cjs/biz-components/Media/index.js.map +2 -2
  90. package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
  91. package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +3 -3
  92. package/dist/cjs/biz-components/MediaPlayerMulti/index.js +1 -1
  93. package/dist/cjs/biz-components/MediaPlayerMulti/index.js.map +3 -3
  94. package/dist/cjs/biz-components/MediaTextOverlay/MediaTextOverlay.d.ts +9 -0
  95. package/dist/cjs/biz-components/MediaTextOverlay/MediaTextOverlay.js +2 -0
  96. package/dist/cjs/biz-components/MediaTextOverlay/MediaTextOverlay.js.map +7 -0
  97. package/dist/cjs/biz-components/MediaTextOverlay/index.d.ts +2 -0
  98. package/dist/cjs/biz-components/MediaTextOverlay/index.js +2 -0
  99. package/dist/cjs/biz-components/MediaTextOverlay/index.js.map +7 -0
  100. package/dist/cjs/biz-components/MediaTextOverlay/types.d.ts +24 -0
  101. package/dist/cjs/biz-components/MediaTextOverlay/types.js +2 -0
  102. package/dist/cjs/biz-components/MediaTextOverlay/types.js.map +7 -0
  103. package/dist/cjs/biz-components/MemberEquity/index.js +2 -2
  104. package/dist/cjs/biz-components/MemberEquity/index.js.map +3 -3
  105. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  106. package/dist/cjs/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
  107. package/dist/cjs/biz-components/NavigationSearch/index.js +2 -2
  108. package/dist/cjs/biz-components/NavigationSearch/index.js.map +2 -2
  109. package/dist/cjs/biz-components/ProductHero/ProductHero.js +1 -1
  110. package/dist/cjs/biz-components/ProductHero/ProductHero.js.map +3 -3
  111. package/dist/cjs/biz-components/ProductLottery/types.d.ts +62 -5
  112. package/dist/cjs/biz-components/ProductLottery/types.js +1 -1
  113. package/dist/cjs/biz-components/ProductLottery/types.js.map +2 -2
  114. package/dist/cjs/biz-components/ProductNav/ProductNav.js +1 -1
  115. package/dist/cjs/biz-components/ProductNav/ProductNav.js.map +3 -3
  116. package/dist/cjs/biz-components/PromotionalBar/index.js +1 -1
  117. package/dist/cjs/biz-components/PromotionalBar/index.js.map +3 -3
  118. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +1 -0
  119. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
  120. package/dist/cjs/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +3 -3
  121. package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +9 -0
  122. package/dist/cjs/biz-components/SecondaryBanner/index.js +1 -1
  123. package/dist/cjs/biz-components/SecondaryBanner/index.js.map +3 -3
  124. package/dist/cjs/biz-components/ShelfDisplay/index.js +1 -1
  125. package/dist/cjs/biz-components/ShelfDisplay/index.js.map +2 -2
  126. package/dist/cjs/biz-components/ShelfDisplay/shelfDisplay.d.ts +1 -0
  127. package/dist/cjs/biz-components/ShelfDisplay/shelfDisplay.js +1 -1
  128. package/dist/cjs/biz-components/ShelfDisplay/shelfDisplay.js.map +1 -1
  129. package/dist/cjs/biz-components/ShelfDisplay/shelfDisplayItem.js +1 -1
  130. package/dist/cjs/biz-components/ShelfDisplay/shelfDisplayItem.js.map +3 -3
  131. package/dist/cjs/biz-components/Subscribe/index.js +1 -1
  132. package/dist/cjs/biz-components/Subscribe/index.js.map +2 -2
  133. package/dist/cjs/biz-components/SwiperBox/index.js +1 -1
  134. package/dist/cjs/biz-components/SwiperBox/index.js.map +3 -3
  135. package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
  136. package/dist/cjs/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +3 -3
  137. package/dist/cjs/biz-components/Title/index.js +1 -1
  138. package/dist/cjs/biz-components/Title/index.js.map +3 -3
  139. package/dist/cjs/biz-components/WebPushPopup/index.d.ts +44 -0
  140. package/dist/cjs/biz-components/WebPushPopup/index.js +2 -0
  141. package/dist/cjs/biz-components/WebPushPopup/index.js.map +7 -0
  142. package/dist/cjs/biz-components/WheelLottery/index.js +1 -1
  143. package/dist/cjs/biz-components/WheelLottery/index.js.map +3 -3
  144. package/dist/cjs/biz-components/index.d.ts +6 -0
  145. package/dist/cjs/biz-components/index.js +1 -1
  146. package/dist/cjs/biz-components/index.js.map +3 -3
  147. package/dist/cjs/components/Countdown.js +1 -1
  148. package/dist/cjs/components/Countdown.js.map +3 -3
  149. package/dist/cjs/components/button.d.ts +4 -0
  150. package/dist/cjs/components/button.js +1 -1
  151. package/dist/cjs/components/button.js.map +3 -3
  152. package/dist/cjs/components/link.js +1 -1
  153. package/dist/cjs/components/link.js.map +2 -2
  154. package/dist/cjs/helpers/index.d.ts +1 -1
  155. package/dist/cjs/helpers/index.js +1 -1
  156. package/dist/cjs/helpers/index.js.map +2 -2
  157. package/dist/cjs/helpers/isLexicalEmpty.d.ts +5 -0
  158. package/dist/cjs/helpers/isLexicalEmpty.js +1 -1
  159. package/dist/cjs/helpers/isLexicalEmpty.js.map +3 -3
  160. package/dist/cjs/hooks/useEmarsysWebPush.d.ts +111 -0
  161. package/dist/cjs/hooks/useEmarsysWebPush.js +2 -0
  162. package/dist/cjs/hooks/useEmarsysWebPush.js.map +7 -0
  163. package/dist/cjs/hooks/useProductListTrack.d.ts +43 -0
  164. package/dist/cjs/hooks/useProductListTrack.js +2 -0
  165. package/dist/cjs/hooks/useProductListTrack.js.map +7 -0
  166. package/dist/esm/biz-components/AccordionCards/index.js +1 -1
  167. package/dist/esm/biz-components/AccordionCards/index.js.map +3 -3
  168. package/dist/esm/biz-components/ActivityMechanism/index.js +1 -1
  169. package/dist/esm/biz-components/ActivityMechanism/index.js.map +3 -3
  170. package/dist/esm/biz-components/ActivitySchedule/index.js +1 -1
  171. package/dist/esm/biz-components/ActivitySchedule/index.js.map +3 -3
  172. package/dist/esm/biz-components/AiuiProvider/index.js +1 -1
  173. package/dist/esm/biz-components/AiuiProvider/index.js.map +3 -3
  174. package/dist/esm/biz-components/AnchorNavigation/index.js +1 -1
  175. package/dist/esm/biz-components/AnchorNavigation/index.js.map +3 -3
  176. package/dist/esm/biz-components/BrandCardLink/BrandCardLink.js +1 -1
  177. package/dist/esm/biz-components/BrandCardLink/BrandCardLink.js.map +3 -3
  178. package/dist/esm/biz-components/Category/SwiperCategory.js +1 -1
  179. package/dist/esm/biz-components/Category/SwiperCategory.js.map +3 -3
  180. package/dist/esm/biz-components/Category/index.js +1 -1
  181. package/dist/esm/biz-components/Category/index.js.map +3 -3
  182. package/dist/esm/biz-components/Evaluate/index.js +1 -1
  183. package/dist/esm/biz-components/Evaluate/index.js.map +3 -3
  184. package/dist/esm/biz-components/EventSchedule/index.js +1 -1
  185. package/dist/esm/biz-components/EventSchedule/index.js.map +3 -3
  186. package/dist/esm/biz-components/Faq/Faq.js +1 -1
  187. package/dist/esm/biz-components/Faq/Faq.js.map +2 -2
  188. package/dist/esm/biz-components/Faq/types.d.ts +0 -1
  189. package/dist/esm/biz-components/FeatureCards/FeatureCards.js +1 -1
  190. package/dist/esm/biz-components/FeatureCards/FeatureCards.js.map +3 -3
  191. package/dist/esm/biz-components/GiftBox/index.js +1 -1
  192. package/dist/esm/biz-components/GiftBox/index.js.map +2 -2
  193. package/dist/esm/biz-components/GiftShelf/index.js +1 -1
  194. package/dist/esm/biz-components/GiftShelf/index.js.map +3 -3
  195. package/dist/esm/biz-components/GiftTierShelf/index.js +1 -1
  196. package/dist/esm/biz-components/GiftTierShelf/index.js.map +3 -3
  197. package/dist/esm/biz-components/Graphic/index.js +1 -1
  198. package/dist/esm/biz-components/Graphic/index.js.map +2 -2
  199. package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js +1 -1
  200. package/dist/esm/biz-components/GraphicOverlay/GraphicOverlay.js.map +3 -3
  201. package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.d.ts +12 -0
  202. package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.js +2 -0
  203. package/dist/esm/biz-components/HeaderNavigation/MobileTextLinksMenu.js.map +7 -0
  204. package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.d.ts +10 -0
  205. package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.js +2 -0
  206. package/dist/esm/biz-components/HeaderNavigation/TextLinksDropdown.js.map +7 -0
  207. package/dist/esm/biz-components/HeaderNavigation/index.js +1 -1
  208. package/dist/esm/biz-components/HeaderNavigation/index.js.map +3 -3
  209. package/dist/esm/biz-components/HeaderNavigation/types.d.ts +8 -1
  210. package/dist/esm/biz-components/HeaderNavigation/types.js +1 -1
  211. package/dist/esm/biz-components/HeaderNavigation/types.js.map +2 -2
  212. package/dist/esm/biz-components/HeaderNavigation/withCategory.d.ts +1 -0
  213. package/dist/esm/biz-components/HeaderNavigation/withCategory.js +1 -1
  214. package/dist/esm/biz-components/HeaderNavigation/withCategory.js.map +3 -3
  215. package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
  216. package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +3 -3
  217. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js +1 -1
  218. package/dist/esm/biz-components/HeroBanner/HeroBannerCarousel.js.map +3 -3
  219. package/dist/esm/biz-components/HeroBanner/types.d.ts +5 -0
  220. package/dist/esm/biz-components/ImageOverlayShelf/ProductCard.js +1 -1
  221. package/dist/esm/biz-components/ImageOverlayShelf/ProductCard.js.map +2 -2
  222. package/dist/esm/biz-components/ImageWithText/ImageWithText.js +1 -1
  223. package/dist/esm/biz-components/ImageWithText/ImageWithText.js.map +3 -3
  224. package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
  225. package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +3 -3
  226. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js +1 -1
  227. package/dist/esm/biz-components/Listing/components/PurchaseBar/ProductActions/index.js.map +3 -3
  228. package/dist/esm/biz-components/Listing/components/PurchaseBar/index.js +1 -1
  229. package/dist/esm/biz-components/Listing/components/PurchaseBar/index.js.map +3 -3
  230. package/dist/esm/biz-components/Listing/components/PurchaseBar/types.d.ts +2 -0
  231. package/dist/esm/biz-components/LotteryShared/ErrorModal.d.ts +4 -0
  232. package/dist/esm/biz-components/LotteryShared/ErrorModal.js.map +2 -2
  233. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.d.ts +13 -13
  234. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js +1 -1
  235. package/dist/esm/biz-components/LotteryShared/MyRewardsModal.js.map +3 -3
  236. package/dist/esm/biz-components/LotteryShared/types.d.ts +9 -0
  237. package/dist/esm/biz-components/LotteryShared/types.js.map +2 -2
  238. package/dist/esm/biz-components/Marquee/Marquee.d.ts +11 -4
  239. package/dist/esm/biz-components/Marquee/Marquee.js +1 -1
  240. package/dist/esm/biz-components/Marquee/Marquee.js.map +3 -3
  241. package/dist/esm/biz-components/Marquee/index.d.ts +1 -1
  242. package/dist/esm/biz-components/Marquee/index.js +1 -1
  243. package/dist/esm/biz-components/Marquee/index.js.map +3 -3
  244. package/dist/esm/biz-components/Marquee/type.d.ts +22 -4
  245. package/dist/esm/biz-components/Media/index.js +1 -1
  246. package/dist/esm/biz-components/Media/index.js.map +2 -2
  247. package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
  248. package/dist/esm/biz-components/MediaPlayerBase/index.js.map +3 -3
  249. package/dist/esm/biz-components/MediaPlayerMulti/index.js +1 -1
  250. package/dist/esm/biz-components/MediaPlayerMulti/index.js.map +3 -3
  251. package/dist/esm/biz-components/MediaTextOverlay/MediaTextOverlay.d.ts +9 -0
  252. package/dist/esm/biz-components/MediaTextOverlay/MediaTextOverlay.js +2 -0
  253. package/dist/esm/biz-components/MediaTextOverlay/MediaTextOverlay.js.map +7 -0
  254. package/dist/esm/biz-components/MediaTextOverlay/index.d.ts +2 -0
  255. package/dist/esm/biz-components/MediaTextOverlay/index.js +2 -0
  256. package/dist/esm/biz-components/MediaTextOverlay/index.js.map +7 -0
  257. package/dist/esm/biz-components/MediaTextOverlay/types.d.ts +24 -0
  258. package/dist/esm/biz-components/MediaTextOverlay/types.js +1 -0
  259. package/dist/esm/biz-components/MediaTextOverlay/types.js.map +7 -0
  260. package/dist/esm/biz-components/MemberEquity/index.js +2 -2
  261. package/dist/esm/biz-components/MemberEquity/index.js.map +3 -3
  262. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js +1 -1
  263. package/dist/esm/biz-components/MultiLayoutGraphicBlock/MultiLayoutGraphicBlock.js.map +3 -3
  264. package/dist/esm/biz-components/NavigationSearch/index.js +2 -2
  265. package/dist/esm/biz-components/NavigationSearch/index.js.map +3 -3
  266. package/dist/esm/biz-components/ProductHero/ProductHero.js +1 -1
  267. package/dist/esm/biz-components/ProductHero/ProductHero.js.map +3 -3
  268. package/dist/esm/biz-components/ProductLottery/types.d.ts +62 -5
  269. package/dist/esm/biz-components/ProductLottery/types.js.map +2 -2
  270. package/dist/esm/biz-components/ProductNav/ProductNav.js +1 -1
  271. package/dist/esm/biz-components/ProductNav/ProductNav.js.map +3 -3
  272. package/dist/esm/biz-components/PromotionalBar/index.js +1 -1
  273. package/dist/esm/biz-components/PromotionalBar/index.js.map +3 -3
  274. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.d.ts +1 -0
  275. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js +1 -1
  276. package/dist/esm/biz-components/SecondaryBanner/SecondaryBannerCarousel.js.map +3 -3
  277. package/dist/esm/biz-components/SecondaryBanner/index.d.ts +9 -0
  278. package/dist/esm/biz-components/SecondaryBanner/index.js +1 -1
  279. package/dist/esm/biz-components/SecondaryBanner/index.js.map +3 -3
  280. package/dist/esm/biz-components/ShelfDisplay/index.js +1 -1
  281. package/dist/esm/biz-components/ShelfDisplay/index.js.map +2 -2
  282. package/dist/esm/biz-components/ShelfDisplay/shelfDisplay.d.ts +1 -0
  283. package/dist/esm/biz-components/ShelfDisplay/shelfDisplay.js.map +1 -1
  284. package/dist/esm/biz-components/ShelfDisplay/shelfDisplayItem.js +1 -1
  285. package/dist/esm/biz-components/ShelfDisplay/shelfDisplayItem.js.map +3 -3
  286. package/dist/esm/biz-components/Subscribe/index.js +1 -1
  287. package/dist/esm/biz-components/Subscribe/index.js.map +2 -2
  288. package/dist/esm/biz-components/SwiperBox/index.js +1 -1
  289. package/dist/esm/biz-components/SwiperBox/index.js.map +3 -3
  290. package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js +1 -1
  291. package/dist/esm/biz-components/ThreeDCarousel/ThreeDCarousel.js.map +3 -3
  292. package/dist/esm/biz-components/Title/index.js +1 -1
  293. package/dist/esm/biz-components/Title/index.js.map +3 -3
  294. package/dist/esm/biz-components/WebPushPopup/index.d.ts +44 -0
  295. package/dist/esm/biz-components/WebPushPopup/index.js +2 -0
  296. package/dist/esm/biz-components/WebPushPopup/index.js.map +7 -0
  297. package/dist/esm/biz-components/WheelLottery/index.js +1 -1
  298. package/dist/esm/biz-components/WheelLottery/index.js.map +2 -2
  299. package/dist/esm/biz-components/index.d.ts +6 -0
  300. package/dist/esm/biz-components/index.js +1 -1
  301. package/dist/esm/biz-components/index.js.map +3 -3
  302. package/dist/esm/components/Countdown.js +1 -1
  303. package/dist/esm/components/Countdown.js.map +3 -3
  304. package/dist/esm/components/button.d.ts +4 -0
  305. package/dist/esm/components/button.js +1 -1
  306. package/dist/esm/components/button.js.map +3 -3
  307. package/dist/esm/components/link.js +1 -1
  308. package/dist/esm/components/link.js.map +2 -2
  309. package/dist/esm/helpers/index.d.ts +1 -1
  310. package/dist/esm/helpers/index.js +1 -1
  311. package/dist/esm/helpers/index.js.map +3 -3
  312. package/dist/esm/helpers/isLexicalEmpty.d.ts +5 -0
  313. package/dist/esm/helpers/isLexicalEmpty.js +1 -1
  314. package/dist/esm/helpers/isLexicalEmpty.js.map +3 -3
  315. package/dist/esm/hooks/useEmarsysWebPush.d.ts +111 -0
  316. package/dist/esm/hooks/useEmarsysWebPush.js +2 -0
  317. package/dist/esm/hooks/useEmarsysWebPush.js.map +7 -0
  318. package/dist/esm/hooks/useProductListTrack.d.ts +43 -0
  319. package/dist/esm/hooks/useProductListTrack.js +2 -0
  320. package/dist/esm/hooks/useProductListTrack.js.map +7 -0
  321. package/package.json +1 -1
  322. package/style.css +143 -11
  323. package/tailwind.config.js +10 -0
@@ -0,0 +1,111 @@
1
+ export interface EmarsysContactInfo {
2
+ /** Emarsys 联系人字段 ID(如 10372) */
3
+ fieldId: number;
4
+ /** 字段值(如用户唯一标识) */
5
+ fieldValue: string;
6
+ }
7
+ export interface EmarsysInitConfig {
8
+ /** Emarsys Domain Code,从后台获取 */
9
+ applicationCode: string;
10
+ /** macOS Safari 16+ 使用 VAPID 替代 APNS */
11
+ enableMacSafariVapid?: boolean;
12
+ /** 默认推送通知标题 */
13
+ defaultNotificationTitle?: string;
14
+ /** 默认推送通知图标 URL */
15
+ defaultNotificationIcon?: string;
16
+ /** 是否自动触发浏览器订阅弹窗,强烈建议设为 false */
17
+ autoSubscribe?: boolean;
18
+ /** 开发阶段开启 SDK 日志 */
19
+ enableLogging?: boolean;
20
+ serviceWorker: {
21
+ /** Service Worker 文件路径(需放在网站根目录) */
22
+ url: string;
23
+ /** VAPID 公钥(Base64 URL-safe 编码) */
24
+ applicationServerPublicKey: string;
25
+ };
26
+ }
27
+ type EmarsysSdkEventName = 'onReady' | 'onSubscribe' | 'onUnsubscribe' | 'onPermissionPrompt' | 'onPermissionGranted' | 'onPermissionDenied' | 'onSWInitError';
28
+ type EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void];
29
+ interface EmarsysSdkApi {
30
+ subscribe: () => void;
31
+ unsubscribe: () => void;
32
+ login: (contactInfo: EmarsysContactInfo) => Promise<boolean>;
33
+ logout: () => Promise<boolean>;
34
+ isSubscribed: () => Promise<boolean>;
35
+ isRegistered: () => boolean;
36
+ customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>;
37
+ push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void;
38
+ }
39
+ declare global {
40
+ interface Window {
41
+ WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[];
42
+ }
43
+ }
44
+ export interface UseEmarsysWebPushOptions {
45
+ /** Emarsys Domain Code */
46
+ applicationCode: string;
47
+ /** VAPID 公钥 */
48
+ applicationServerPublicKey: string;
49
+ /** Service Worker 路径,默认 'service-worker.js'(不含前导斜杠) */
50
+ serviceWorkerUrl?: string;
51
+ /** 默认通知标题 */
52
+ defaultNotificationTitle?: string;
53
+ /** 默认通知图标 URL */
54
+ defaultNotificationIcon?: string;
55
+ /** 联系人主键字段 ID(由 Emarsys 后台配置) */
56
+ fieldId: number;
57
+ /**
58
+ * 当前用户的联系人标识(如 hashed email / customer ID)。
59
+ * null 表示未登录的匿名访客。
60
+ */
61
+ contactValue: string | null;
62
+ /** 是否开启调试日志,默认 false */
63
+ enableLogging?: boolean;
64
+ /**
65
+ * 点击"稍后"后的弹窗冷却天数,默认 7 天。
66
+ * 冷却期间不再展示自定义弹窗。
67
+ */
68
+ dismissCooldownDays?: number;
69
+ /**
70
+ * SDK 是否已通过外部 <Script> 标签加载完毕。
71
+ * 传入此 flag 以便 hook 在正确时机初始化。
72
+ * 默认 true(假设 SDK 已经加载)。
73
+ */
74
+ sdkLoaded?: boolean;
75
+ }
76
+ export interface UseEmarsysWebPushReturn {
77
+ /** 手动触发浏览器原生订阅弹窗(供"订阅"按钮调用) */
78
+ subscribe: () => void;
79
+ /** 取消推送订阅 */
80
+ unsubscribe: () => void;
81
+ /** 是否应向用户展示自定义引导弹窗 */
82
+ shouldShowPopup: boolean;
83
+ /** 关闭自定义弹窗并写入冷却标记 */
84
+ dismissPopup: () => void;
85
+ /** 当前是否已订阅(异步检测完成后更新) */
86
+ isSubscribed: boolean;
87
+ /** SDK 是否就绪 */
88
+ isReady: boolean;
89
+ }
90
+ /**
91
+ * useEmarsysWebPush
92
+ *
93
+ * 封装 Emarsys Web Push SDK 的订阅生命周期,包括:
94
+ * - SDK 初始化
95
+ * - 自定义弹窗展示逻辑(两步策略,避免直接触发浏览器原生弹窗)
96
+ * - 已登录联系人的 login / logout 自动管理
97
+ * - 已有订阅用户的迁移(从旧推送系统迁移)
98
+ *
99
+ * @example
100
+ * ```tsx
101
+ * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({
102
+ * applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,
103
+ * applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,
104
+ * fieldId: 10372,
105
+ * contactValue: user?.customerId ?? null,
106
+ * sdkLoaded: scriptLoaded,
107
+ * })
108
+ * ```
109
+ */
110
+ export declare function useEmarsysWebPush({ applicationCode, applicationServerPublicKey, serviceWorkerUrl, defaultNotificationTitle, defaultNotificationIcon, fieldId, contactValue, enableLogging, dismissCooldownDays, sdkLoaded, }: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn;
111
+ export {};
@@ -0,0 +1,2 @@
1
+ import{useCallback as d,useEffect as g,useRef as R,useState as y}from"react";const E="emarsysSubscribe",b="emarsysLogin",C="anker_push_dismissed";function D(){return typeof navigator>"u"?!1:/iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())}function x(){return typeof window>"u"?!1:window.matchMedia("(display-mode: standalone)").matches||"standalone"in window.navigator&&window.navigator.standalone===!0}function r(n,o,u){try{if(n==="get")return localStorage.getItem(o);n==="set"&&u!==void 0&&localStorage.setItem(o,u),n==="remove"&&localStorage.removeItem(o)}catch{}return null}function a(){if(typeof window>"u")return null;const n=window.WebEmarsysSdk;return!n||Array.isArray(n)?null:n}function K({applicationCode:n,applicationServerPublicKey:o,serviceWorkerUrl:u="service-worker.js",defaultNotificationTitle:w,defaultNotificationIcon:k,fieldId:h,contactValue:t,enableLogging:v=!1,dismissCooldownDays:P=7,sdkLoaded:c=!0}){const[f,L]=y(!1),[G,m]=y(!1),[_,p]=y(!1),S=R(!1),A=R(!1);g(()=>{if(!c||typeof window>"u")return;const e=u.replace(/^\/+/,"").replace(/^https?:\/\/[^/]+\//,"");window.WebEmarsysSdk=window.WebEmarsysSdk||[],window.WebEmarsysSdk.push(["init",{applicationCode:n,enableMacSafariVapid:!0,defaultNotificationTitle:w,defaultNotificationIcon:k,autoSubscribe:!1,enableLogging:v,serviceWorker:{url:e,applicationServerPublicKey:o}}])},[c,n,o,u,w,k,v]);const l=d(e=>{if(S.current)return;const s=a();s&&s.isSubscribed().then(i=>{i&&s.login({fieldId:h,fieldValue:e}).then(W=>{W&&(r("set",b,"login"),S.current=!0)})})},[h]),I=d(()=>{const e=a();e&&e.isSubscribed().then(s=>{s&&e.logout().then(i=>{i&&(r("remove",b),S.current=!1)})})},[]);g(()=>{if(!c||typeof window>"u"||D()&&!x())return;window.WebEmarsysSdk=window.WebEmarsysSdk||[];const e=window.WebEmarsysSdk;e.push(["onReady",()=>{L(!0),a()?.isSubscribed().then(i=>{m(i)}),e.push(["onPermissionGranted",()=>{!r("get",E)&&!A.current&&(a()?.subscribe(),r("set",E,"subscribe"))}]);let s=!1;e.push(["onPermissionGranted",()=>{s=!0}]),e.push(["onPermissionDenied",()=>{s=!0}]),setTimeout(()=>{if(s)return;const i=r("get",C);i&&Date.now()-parseInt(i,10)<P*24*60*60*1e3||p(!0)},2e3)}]),e.push(["onSubscribe",()=>{m(!0),r("set",E,"subscribe"),t&&l(t)}]),e.push(["onUnsubscribe",()=>{m(!1)}])},[c,t,P,l]),g(()=>{f&&(t?r("get",b)||l(t):r("get",b)&&I())},[f,t,l,I]);const N=d(()=>{p(!1),A.current=!0;const e=a();if(!e){window.WebEmarsysSdk.push(i=>{i.subscribe()});return}e.subscribe()},[]),O=d(()=>{a()?.unsubscribe()},[]),U=d(()=>{p(!1),r("set",C,String(Date.now()))},[]);return{subscribe:N,unsubscribe:O,shouldShowPopup:_,dismissPopup:U,isSubscribed:G,isReady:f}}export{K as useEmarsysWebPush};
2
+ //# sourceMappingURL=useEmarsysWebPush.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useEmarsysWebPush.ts"],
4
+ "sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Emarsys Web Push SDK \u5168\u5C40\u7C7B\u578B\u58F0\u660E\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EmarsysContactInfo {\n /** Emarsys \u8054\u7CFB\u4EBA\u5B57\u6BB5 ID\uFF08\u5982 10372\uFF09 */\n fieldId: number\n /** \u5B57\u6BB5\u503C\uFF08\u5982\u7528\u6237\u552F\u4E00\u6807\u8BC6\uFF09 */\n fieldValue: string\n}\n\nexport interface EmarsysInitConfig {\n /** Emarsys Domain Code\uFF0C\u4ECE\u540E\u53F0\u83B7\u53D6 */\n applicationCode: string\n /** macOS Safari 16+ \u4F7F\u7528 VAPID \u66FF\u4EE3 APNS */\n enableMacSafariVapid?: boolean\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u63A8\u9001\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u662F\u5426\u81EA\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u8BA2\u9605\u5F39\u7A97\uFF0C\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A false */\n autoSubscribe?: boolean\n /** \u5F00\u53D1\u9636\u6BB5\u5F00\u542F SDK \u65E5\u5FD7 */\n enableLogging?: boolean\n serviceWorker: {\n /** Service Worker \u6587\u4EF6\u8DEF\u5F84\uFF08\u9700\u653E\u5728\u7F51\u7AD9\u6839\u76EE\u5F55\uFF09 */\n url: string\n /** VAPID \u516C\u94A5\uFF08Base64 URL-safe \u7F16\u7801\uFF09 */\n applicationServerPublicKey: string\n }\n}\n\ntype EmarsysSdkEventName =\n | 'onReady'\n | 'onSubscribe'\n | 'onUnsubscribe'\n | 'onPermissionPrompt'\n | 'onPermissionGranted'\n | 'onPermissionDenied'\n | 'onSWInitError'\n\ntype EmarsysSdkCommand = ['init', EmarsysInitConfig] | [EmarsysSdkEventName, () => void]\n\ninterface EmarsysSdkApi {\n subscribe: () => void\n unsubscribe: () => void\n login: (contactInfo: EmarsysContactInfo) => Promise<boolean>\n logout: () => Promise<boolean>\n isSubscribed: () => Promise<boolean>\n isRegistered: () => boolean\n customEvent: (eventName: string, payload?: Record<string, unknown>) => Promise<boolean>\n push: (command: EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void)) => void\n}\n\ndeclare global {\n interface Window {\n WebEmarsysSdk: EmarsysSdkApi | (EmarsysSdkCommand | ((sdk: EmarsysSdkApi) => void))[]\n }\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u5165\u53C2\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushOptions {\n /** Emarsys Domain Code */\n applicationCode: string\n /** VAPID \u516C\u94A5 */\n applicationServerPublicKey: string\n /** Service Worker \u8DEF\u5F84\uFF0C\u9ED8\u8BA4 'service-worker.js'\uFF08\u4E0D\u542B\u524D\u5BFC\u659C\u6760\uFF09 */\n serviceWorkerUrl?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u6807\u9898 */\n defaultNotificationTitle?: string\n /** \u9ED8\u8BA4\u901A\u77E5\u56FE\u6807 URL */\n defaultNotificationIcon?: string\n /** \u8054\u7CFB\u4EBA\u4E3B\u952E\u5B57\u6BB5 ID\uFF08\u7531 Emarsys \u540E\u53F0\u914D\u7F6E\uFF09 */\n fieldId: number\n /**\n * \u5F53\u524D\u7528\u6237\u7684\u8054\u7CFB\u4EBA\u6807\u8BC6\uFF08\u5982 hashed email / customer ID\uFF09\u3002\n * null \u8868\u793A\u672A\u767B\u5F55\u7684\u533F\u540D\u8BBF\u5BA2\u3002\n */\n contactValue: string | null\n /** \u662F\u5426\u5F00\u542F\u8C03\u8BD5\u65E5\u5FD7\uFF0C\u9ED8\u8BA4 false */\n enableLogging?: boolean\n /**\n * \u70B9\u51FB\"\u7A0D\u540E\"\u540E\u7684\u5F39\u7A97\u51B7\u5374\u5929\u6570\uFF0C\u9ED8\u8BA4 7 \u5929\u3002\n * \u51B7\u5374\u671F\u95F4\u4E0D\u518D\u5C55\u793A\u81EA\u5B9A\u4E49\u5F39\u7A97\u3002\n */\n dismissCooldownDays?: number\n /**\n * SDK \u662F\u5426\u5DF2\u901A\u8FC7\u5916\u90E8 <Script> \u6807\u7B7E\u52A0\u8F7D\u5B8C\u6BD5\u3002\n * \u4F20\u5165\u6B64 flag \u4EE5\u4FBF hook \u5728\u6B63\u786E\u65F6\u673A\u521D\u59CB\u5316\u3002\n * \u9ED8\u8BA4 true\uFF08\u5047\u8BBE SDK \u5DF2\u7ECF\u52A0\u8F7D\uFF09\u3002\n */\n sdkLoaded?: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Hook \u8FD4\u56DE\u503C\u7C7B\u578B\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface UseEmarsysWebPushReturn {\n /** \u624B\u52A8\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u8BA2\u9605\u5F39\u7A97\uFF08\u4F9B\"\u8BA2\u9605\"\u6309\u94AE\u8C03\u7528\uFF09 */\n subscribe: () => void\n /** \u53D6\u6D88\u63A8\u9001\u8BA2\u9605 */\n unsubscribe: () => void\n /** \u662F\u5426\u5E94\u5411\u7528\u6237\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97 */\n shouldShowPopup: boolean\n /** \u5173\u95ED\u81EA\u5B9A\u4E49\u5F39\u7A97\u5E76\u5199\u5165\u51B7\u5374\u6807\u8BB0 */\n dismissPopup: () => void\n /** \u5F53\u524D\u662F\u5426\u5DF2\u8BA2\u9605\uFF08\u5F02\u6B65\u68C0\u6D4B\u5B8C\u6210\u540E\u66F4\u65B0\uFF09 */\n isSubscribed: boolean\n /** SDK \u662F\u5426\u5C31\u7EEA */\n isReady: boolean\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u5DE5\u5177\u51FD\u6570\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst STORAGE_KEY_SUBSCRIBE = 'emarsysSubscribe'\nconst STORAGE_KEY_LOGIN = 'emarsysLogin'\nconst STORAGE_KEY_DISMISSED = 'anker_push_dismissed'\n\nfunction isIOS(): boolean {\n if (typeof navigator === 'undefined') return false\n return /iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())\n}\n\nfunction isStandaloneWebApp(): boolean {\n if (typeof window === 'undefined') return false\n return (\n window.matchMedia('(display-mode: standalone)').matches ||\n // Safari standalone \u5C5E\u6027\uFF08\u975E\u6807\u51C6\uFF09\n ('standalone' in window.navigator && (window.navigator as Navigator & { standalone?: boolean }).standalone === true)\n )\n}\n\nfunction safeLocalStorage(action: 'get', key: string): string | null\nfunction safeLocalStorage(action: 'set', key: string, value: string): void\nfunction safeLocalStorage(action: 'remove', key: string): void\nfunction safeLocalStorage(action: 'get' | 'set' | 'remove', key: string, value?: string): string | null | void {\n try {\n if (action === 'get') return localStorage.getItem(key)\n if (action === 'set' && value !== undefined) localStorage.setItem(key, value)\n if (action === 'remove') localStorage.removeItem(key)\n } catch {\n // SSR \u6216\u9690\u79C1\u6A21\u5F0F\u4E0B localStorage \u4E0D\u53EF\u7528\n }\n return null\n}\n\nfunction getSdkApi(): EmarsysSdkApi | null {\n if (typeof window === 'undefined') return null\n const sdk = window.WebEmarsysSdk\n if (!sdk || Array.isArray(sdk)) return null\n return sdk as EmarsysSdkApi\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u6838\u5FC3 Hook\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * useEmarsysWebPush\n *\n * \u5C01\u88C5 Emarsys Web Push SDK \u7684\u8BA2\u9605\u751F\u547D\u5468\u671F\uFF0C\u5305\u62EC\uFF1A\n * - SDK \u521D\u59CB\u5316\n * - \u81EA\u5B9A\u4E49\u5F39\u7A97\u5C55\u793A\u903B\u8F91\uFF08\u4E24\u6B65\u7B56\u7565\uFF0C\u907F\u514D\u76F4\u63A5\u89E6\u53D1\u6D4F\u89C8\u5668\u539F\u751F\u5F39\u7A97\uFF09\n * - \u5DF2\u767B\u5F55\u8054\u7CFB\u4EBA\u7684 login / logout \u81EA\u52A8\u7BA1\u7406\n * - \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u7684\u8FC1\u79FB\uFF08\u4ECE\u65E7\u63A8\u9001\u7CFB\u7EDF\u8FC1\u79FB\uFF09\n *\n * @example\n * ```tsx\n * const { shouldShowPopup, subscribe, dismissPopup } = useEmarsysWebPush({\n * applicationCode: process.env.NEXT_PUBLIC_EMARSYS_APP_CODE!,\n * applicationServerPublicKey: process.env.NEXT_PUBLIC_EMARSYS_VAPID_PUBLIC_KEY!,\n * fieldId: 10372,\n * contactValue: user?.customerId ?? null,\n * sdkLoaded: scriptLoaded,\n * })\n * ```\n */\nexport function useEmarsysWebPush({\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl = 'service-worker.js',\n defaultNotificationTitle,\n defaultNotificationIcon,\n fieldId,\n contactValue,\n enableLogging = false,\n dismissCooldownDays = 7,\n sdkLoaded = true,\n}: UseEmarsysWebPushOptions): UseEmarsysWebPushReturn {\n const [isReady, setIsReady] = useState(false)\n const [isSubscribed, setIsSubscribed] = useState(false)\n const [shouldShowPopup, setShouldShowPopup] = useState(false)\n\n // \u907F\u514D\u91CD\u590D login/logout\n const hasPerformedLogin = useRef(false)\n // \u8FFD\u8E2A\u5F53\u524D session \u5185\u662F\u5426\u5DF2\u4E3B\u52A8\u89E6\u53D1\u8FC7 subscribe\n const isGeneralSubscribeRef = useRef(false)\n\n // \u2500\u2500 \u521D\u59CB\u5316 SDK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // SDK v4.7.0 \u5185\u90E8 registerServiceWorker() \u6267\u884C `/${url}` \u62FC\u63A5\uFF0C\n // \u56E0\u6B64\u6B64\u5904\u5FC5\u987B\u4F20\u4E0D\u542B\u524D\u5BFC\u659C\u6760\u7684\u7EAF\u8DEF\u5F84\uFF08\u5982 'service-worker.js'\uFF09\uFF0C\n // \u4F20\u5165\u5E26\u659C\u6760\u7684\u8DEF\u5F84\u6216\u7EDD\u5BF9 URL \u5747\u4F1A\u5BFC\u81F4\u53CC\u659C\u6760/\u8DE8\u57DF SecurityError\u3002\n const swPath = serviceWorkerUrl.replace(/^\\/+/, '').replace(/^https?:\\/\\/[^/]+\\//, '')\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'init',\n {\n applicationCode,\n enableMacSafariVapid: true,\n defaultNotificationTitle,\n defaultNotificationIcon,\n autoSubscribe: false,\n enableLogging,\n serviceWorker: {\n url: swPath,\n applicationServerPublicKey,\n },\n },\n ])\n }, [\n sdkLoaded,\n applicationCode,\n applicationServerPublicKey,\n serviceWorkerUrl,\n defaultNotificationTitle,\n defaultNotificationIcon,\n enableLogging,\n ])\n\n // \u2500\u2500 \u6267\u884C Emarsys login\uFF08\u5173\u8054\u5DF2\u77E5\u8054\u7CFB\u4EBA\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogin = useCallback(\n (value: string) => {\n if (hasPerformedLogin.current) return\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.login({ fieldId, fieldValue: value }).then(result => {\n if (result) {\n safeLocalStorage('set', STORAGE_KEY_LOGIN, 'login')\n hasPerformedLogin.current = true\n }\n })\n })\n },\n [fieldId]\n )\n\n // \u2500\u2500 \u6267\u884C Emarsys logout\uFF08\u89E3\u9664\u8054\u7CFB\u4EBA\u5173\u8054\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const performLogout = useCallback(() => {\n const api = getSdkApi()\n if (!api) return\n\n api.isSubscribed().then(subscribed => {\n if (!subscribed) return\n api.logout().then(result => {\n if (result) {\n safeLocalStorage('remove', STORAGE_KEY_LOGIN)\n hasPerformedLogin.current = false\n }\n })\n })\n }, [])\n\n // \u2500\u2500 \u6CE8\u518C SDK \u56DE\u8C03 & \u4E1A\u52A1\u903B\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!sdkLoaded || typeof window === 'undefined') return\n\n // iOS \u6D4F\u89C8\u5668\uFF08\u975E PWA \u6A21\u5F0F\uFF09\u4E0D\u505A\u4EFB\u4F55\u64CD\u4F5C\n if (isIOS() && !isStandaloneWebApp()) return\n\n window.WebEmarsysSdk = window.WebEmarsysSdk || []\n const sdk = window.WebEmarsysSdk as (EmarsysSdkCommand | ((api: EmarsysSdkApi) => void))[]\n\n sdk.push([\n 'onReady',\n () => {\n setIsReady(true)\n\n // \u68C0\u67E5\u5F53\u524D\u8BA2\u9605\u72B6\u6001\n getSdkApi()\n ?.isSubscribed()\n .then(subscribed => {\n setIsSubscribed(subscribed)\n })\n\n // \u5DF2\u6709\u8BA2\u9605\u7528\u6237\u8FC1\u79FB\uFF08\u65E7\u63A8\u9001\u7CFB\u7EDF \u2192 Emarsys\uFF09\n sdk.push([\n 'onPermissionGranted',\n () => {\n if (!safeLocalStorage('get', STORAGE_KEY_SUBSCRIBE) && !isGeneralSubscribeRef.current) {\n getSdkApi()?.subscribe()\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n }\n },\n ])\n\n // \u5224\u65AD\u662F\u5426\u9700\u8981\u5C55\u793A\u81EA\u5B9A\u4E49\u5F15\u5BFC\u5F39\u7A97\n // \u5EF6\u8FDF 2 \u79D2\uFF0C\u7B49\u5F85 onPermissionGranted / onPermissionDenied \u5F02\u6B65\u56DE\u8C03\n let permissionAlreadyHandled = false\n sdk.push([\n 'onPermissionGranted',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n sdk.push([\n 'onPermissionDenied',\n () => {\n permissionAlreadyHandled = true\n },\n ])\n\n setTimeout(() => {\n if (permissionAlreadyHandled) return\n\n // \u68C0\u67E5\u51B7\u5374\u671F\n const dismissedAt = safeLocalStorage('get', STORAGE_KEY_DISMISSED)\n if (dismissedAt) {\n const elapsed = Date.now() - parseInt(dismissedAt, 10)\n if (elapsed < dismissCooldownDays * 24 * 60 * 60 * 1000) return\n }\n\n setShouldShowPopup(true)\n }, 2000)\n },\n ])\n\n // \u8BA2\u9605\u6210\u529F\u540E\u66F4\u65B0\u72B6\u6001\u5E76\u6267\u884C login\n sdk.push([\n 'onSubscribe',\n () => {\n setIsSubscribed(true)\n safeLocalStorage('set', STORAGE_KEY_SUBSCRIBE, 'subscribe')\n if (contactValue) {\n performLogin(contactValue)\n }\n },\n ])\n\n sdk.push([\n 'onUnsubscribe',\n () => {\n setIsSubscribed(false)\n },\n ])\n }, [sdkLoaded, contactValue, dismissCooldownDays, performLogin])\n\n // \u2500\u2500 \u76D1\u542C contactValue \u53D8\u5316\uFF0C\u81EA\u52A8 login / logout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n useEffect(() => {\n if (!isReady) return\n\n if (contactValue) {\n if (!safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogin(contactValue)\n }\n } else {\n if (safeLocalStorage('get', STORAGE_KEY_LOGIN)) {\n performLogout()\n }\n }\n }, [isReady, contactValue, performLogin, performLogout])\n\n // \u2500\u2500 \u5BF9\u5916\u66B4\u9732\u7684 API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const subscribe = useCallback(() => {\n setShouldShowPopup(false)\n isGeneralSubscribeRef.current = true\n const api = getSdkApi()\n if (!api) {\n const sdk = window.WebEmarsysSdk as ((api: EmarsysSdkApi) => void)[]\n sdk.push(sdkApi => {\n sdkApi.subscribe()\n })\n return\n }\n api.subscribe()\n }, [])\n\n const unsubscribe = useCallback(() => {\n getSdkApi()?.unsubscribe()\n }, [])\n\n const dismissPopup = useCallback(() => {\n setShouldShowPopup(false)\n safeLocalStorage('set', STORAGE_KEY_DISMISSED, String(Date.now()))\n }, [])\n\n return {\n subscribe,\n unsubscribe,\n shouldShowPopup,\n dismissPopup,\n isSubscribed,\n isReady,\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,EAAa,aAAAC,EAAW,UAAAC,EAAQ,YAAAC,MAAgB,QA0HzD,MAAMC,EAAwB,mBACxBC,EAAoB,eACpBC,EAAwB,uBAE9B,SAASC,GAAiB,CACxB,OAAI,OAAO,UAAc,IAAoB,GACtC,mBAAmB,KAAK,UAAU,UAAU,YAAY,CAAC,CAClE,CAEA,SAASC,GAA8B,CACrC,OAAI,OAAO,OAAW,IAAoB,GAExC,OAAO,WAAW,4BAA4B,EAAE,SAE/C,eAAgB,OAAO,WAAc,OAAO,UAAmD,aAAe,EAEnH,CAKA,SAASC,EAAiBC,EAAkCC,EAAaC,EAAsC,CAC7G,GAAI,CACF,GAAIF,IAAW,MAAO,OAAO,aAAa,QAAQC,CAAG,EACjDD,IAAW,OAASE,IAAU,QAAW,aAAa,QAAQD,EAAKC,CAAK,EACxEF,IAAW,UAAU,aAAa,WAAWC,CAAG,CACtD,MAAQ,CAER,CACA,OAAO,IACT,CAEA,SAASE,GAAkC,CACzC,GAAI,OAAO,OAAW,IAAa,OAAO,KAC1C,MAAMC,EAAM,OAAO,cACnB,MAAI,CAACA,GAAO,MAAM,QAAQA,CAAG,EAAU,KAChCA,CACT,CA0BO,SAASC,EAAkB,CAChC,gBAAAC,EACA,2BAAAC,EACA,iBAAAC,EAAmB,oBACnB,yBAAAC,EACA,wBAAAC,EACA,QAAAC,EACA,aAAAC,EACA,cAAAC,EAAgB,GAChB,oBAAAC,EAAsB,EACtB,UAAAC,EAAY,EACd,EAAsD,CACpD,KAAM,CAACC,EAASC,CAAU,EAAIxB,EAAS,EAAK,EACtC,CAACyB,EAAcC,CAAe,EAAI1B,EAAS,EAAK,EAChD,CAAC2B,EAAiBC,CAAkB,EAAI5B,EAAS,EAAK,EAGtD6B,EAAoB9B,EAAO,EAAK,EAEhC+B,EAAwB/B,EAAO,EAAK,EAG1CD,EAAU,IAAM,CACd,GAAI,CAACwB,GAAa,OAAO,OAAW,IAAa,OAKjD,MAAMS,EAAShB,EAAiB,QAAQ,OAAQ,EAAE,EAAE,QAAQ,sBAAuB,EAAE,EAErF,OAAO,cAAgB,OAAO,eAAiB,CAAC,EACpC,OAAO,cAEf,KAAK,CACP,OACA,CACE,gBAAAF,EACA,qBAAsB,GACtB,yBAAAG,EACA,wBAAAC,EACA,cAAe,GACf,cAAAG,EACA,cAAe,CACb,IAAKW,EACL,2BAAAjB,CACF,CACF,CACF,CAAC,CACH,EAAG,CACDQ,EACAT,EACAC,EACAC,EACAC,EACAC,EACAG,CACF,CAAC,EAGD,MAAMY,EAAenC,EAClBY,GAAkB,CACjB,GAAIoB,EAAkB,QAAS,OAC/B,MAAMI,EAAMvB,EAAU,EACjBuB,GAELA,EAAI,aAAa,EAAE,KAAKC,GAAc,CAC/BA,GACLD,EAAI,MAAM,CAAE,QAAAf,EAAS,WAAYT,CAAM,CAAC,EAAE,KAAK0B,GAAU,CACnDA,IACF7B,EAAiB,MAAOJ,EAAmB,OAAO,EAClD2B,EAAkB,QAAU,GAEhC,CAAC,CACH,CAAC,CACH,EACA,CAACX,CAAO,CACV,EAGMkB,EAAgBvC,EAAY,IAAM,CACtC,MAAMoC,EAAMvB,EAAU,EACjBuB,GAELA,EAAI,aAAa,EAAE,KAAKC,GAAc,CAC/BA,GACLD,EAAI,OAAO,EAAE,KAAKE,GAAU,CACtBA,IACF7B,EAAiB,SAAUJ,CAAiB,EAC5C2B,EAAkB,QAAU,GAEhC,CAAC,CACH,CAAC,CACH,EAAG,CAAC,CAAC,EAGL/B,EAAU,IAAM,CAId,GAHI,CAACwB,GAAa,OAAO,OAAW,KAGhClB,EAAM,GAAK,CAACC,EAAmB,EAAG,OAEtC,OAAO,cAAgB,OAAO,eAAiB,CAAC,EAChD,MAAMM,EAAM,OAAO,cAEnBA,EAAI,KAAK,CACP,UACA,IAAM,CACJa,EAAW,EAAI,EAGfd,EAAU,GACN,aAAa,EACd,KAAKwB,GAAc,CAClBR,EAAgBQ,CAAU,CAC5B,CAAC,EAGHvB,EAAI,KAAK,CACP,sBACA,IAAM,CACA,CAACL,EAAiB,MAAOL,CAAqB,GAAK,CAAC6B,EAAsB,UAC5EpB,EAAU,GAAG,UAAU,EACvBJ,EAAiB,MAAOL,EAAuB,WAAW,EAE9D,CACF,CAAC,EAID,IAAIoC,EAA2B,GAC/B1B,EAAI,KAAK,CACP,sBACA,IAAM,CACJ0B,EAA2B,EAC7B,CACF,CAAC,EACD1B,EAAI,KAAK,CACP,qBACA,IAAM,CACJ0B,EAA2B,EAC7B,CACF,CAAC,EAED,WAAW,IAAM,CACf,GAAIA,EAA0B,OAG9B,MAAMC,EAAchC,EAAiB,MAAOH,CAAqB,EAC7DmC,GACc,KAAK,IAAI,EAAI,SAASA,EAAa,EAAE,EACvCjB,EAAsB,GAAK,GAAK,GAAK,KAGrDO,EAAmB,EAAI,CACzB,EAAG,GAAI,CACT,CACF,CAAC,EAGDjB,EAAI,KAAK,CACP,cACA,IAAM,CACJe,EAAgB,EAAI,EACpBpB,EAAiB,MAAOL,EAAuB,WAAW,EACtDkB,GACFa,EAAab,CAAY,CAE7B,CACF,CAAC,EAEDR,EAAI,KAAK,CACP,gBACA,IAAM,CACJe,EAAgB,EAAK,CACvB,CACF,CAAC,CACH,EAAG,CAACJ,EAAWH,EAAcE,EAAqBW,CAAY,CAAC,EAG/DlC,EAAU,IAAM,CACTyB,IAEDJ,EACGb,EAAiB,MAAOJ,CAAiB,GAC5C8B,EAAab,CAAY,EAGvBb,EAAiB,MAAOJ,CAAiB,GAC3CkC,EAAc,EAGpB,EAAG,CAACb,EAASJ,EAAca,EAAcI,CAAa,CAAC,EAIvD,MAAMG,EAAY1C,EAAY,IAAM,CAClC+B,EAAmB,EAAK,EACxBE,EAAsB,QAAU,GAChC,MAAMG,EAAMvB,EAAU,EACtB,GAAI,CAACuB,EAAK,CACI,OAAO,cACf,KAAKO,GAAU,CACjBA,EAAO,UAAU,CACnB,CAAC,EACD,MACF,CACAP,EAAI,UAAU,CAChB,EAAG,CAAC,CAAC,EAECQ,EAAc5C,EAAY,IAAM,CACpCa,EAAU,GAAG,YAAY,CAC3B,EAAG,CAAC,CAAC,EAECgC,EAAe7C,EAAY,IAAM,CACrC+B,EAAmB,EAAK,EACxBtB,EAAiB,MAAOH,EAAuB,OAAO,KAAK,IAAI,CAAC,CAAC,CACnE,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,UAAAoC,EACA,YAAAE,EACA,gBAAAd,EACA,aAAAe,EACA,aAAAjB,EACA,QAAAF,CACF,CACF",
6
+ "names": ["useCallback", "useEffect", "useRef", "useState", "STORAGE_KEY_SUBSCRIBE", "STORAGE_KEY_LOGIN", "STORAGE_KEY_DISMISSED", "isIOS", "isStandaloneWebApp", "safeLocalStorage", "action", "key", "value", "getSdkApi", "sdk", "useEmarsysWebPush", "applicationCode", "applicationServerPublicKey", "serviceWorkerUrl", "defaultNotificationTitle", "defaultNotificationIcon", "fieldId", "contactValue", "enableLogging", "dismissCooldownDays", "sdkLoaded", "isReady", "setIsReady", "isSubscribed", "setIsSubscribed", "shouldShowPopup", "setShouldShowPopup", "hasPerformedLogin", "isGeneralSubscribeRef", "swPath", "performLogin", "api", "subscribed", "result", "performLogout", "permissionAlreadyHandled", "dismissedAt", "subscribe", "sdkApi", "unsubscribe", "dismissPopup"]
7
+ }
@@ -0,0 +1,43 @@
1
+ import { type RefObject } from 'react';
2
+ import type { Product } from '../biz-components/Listing/types/product.js';
3
+ /** 单个产品项的埋点数据(CMS 配置的简化产品) */
4
+ export interface ProductItem {
5
+ sku?: string;
6
+ handle?: string;
7
+ custom_price?: number;
8
+ [key: string]: any;
9
+ }
10
+ /** Hook 入参 */
11
+ export interface ProductListTrackOptions {
12
+ /** 组件容器 ref,用于 view_item_list 的视口检测 */
13
+ containerRef: RefObject<HTMLDivElement>;
14
+ /** 列表名称,用于 item_list_name 字段 */
15
+ listName: string;
16
+ /** 产品列表(简化数据,来自 CMS 配置) */
17
+ items: ProductItem[];
18
+ /** 构建时产品完整数据(来自 Shopify API) */
19
+ products?: Product[];
20
+ }
21
+ /**
22
+ * 产品列表埋点 Hook
23
+ *
24
+ * 封装两个 GA4 电商事件:
25
+ * - `view_item_list` — 组件进入视口时自动触发一次(产品列表露出)
26
+ * - `select_item` — 返回 trackSelectItem 函数,点击产品时手动调用(产品选择)
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * const { trackSelectItem } = useProductListTrack({
31
+ * containerRef: innerRef,
32
+ * listName: 'gift_tier_shelf',
33
+ * items: availableItems.map(item => item.products?.[0]).filter(Boolean),
34
+ * products: buildData?.products,
35
+ * })
36
+ *
37
+ * // 点击产品卡片时
38
+ * <Card onClick={() => { trackSelectItem(product, index); onCardClick?.() }} />
39
+ * ```
40
+ */
41
+ export declare const useProductListTrack: ({ containerRef, listName, items, products }: ProductListTrackOptions) => {
42
+ trackSelectItem: (item: ProductItem, index: number) => void;
43
+ };
@@ -0,0 +1,2 @@
1
+ import{useRef as p,useEffect as _,useCallback as v}from"react";import{gaTrack as l}from"../shared/track.js";import{useAiuiContext as g}from"../biz-components/AiuiProvider/index.js";const k=(a,c)=>a.map((r,n)=>{const i=c?.find(s=>s.handle===r.handle)||null,t=i?.variants?.find(s=>s?.sku===r.sku)||null;return{item_id:r.sku||t?.sku||"",item_name:t?.title||i?.title||"",item_variant:t?.title||"",price:r.custom_price??t?.price?.amount??"",index:n+1}}),b=({containerRef:a,listName:c,items:r,products:n})=>{const{trackingData:i}=g(),t=p(!1);return _(()=>{if(!a.current||t.current||!n?.length)return;const e=new IntersectionObserver(([u])=>{u.isIntersecting&&!t.current&&(t.current=!0,l({event:"ga4Event",event_name:"view_item_list",event_parameters:{page_group:i?.pageGroup||"Home Page",item_list_name:c,items:k(r,n)}}),e.disconnect())},{threshold:0});return e.observe(a.current),()=>e.disconnect()},[n,r,i,c,a]),{trackSelectItem:v((e,u)=>{const d=n?.find(m=>m.handle===e.handle)||null,o=d?.variants?.find(m=>m?.sku===e.sku)||null;l({event:"ga4Event",event_name:"select_item",event_parameters:{page_group:i?.pageGroup||"Home Page",item_list_name:c,items:[{item_id:e.sku||o?.sku||"",item_name:o?.title||d?.title||"",item_variant:o?.title||"",price:e.custom_price??o?.price?.amount??"",index:u+1}]}})},[n,i,c])}};export{b as useProductListTrack};
2
+ //# sourceMappingURL=useProductListTrack.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useProductListTrack.ts"],
4
+ "sourcesContent": ["import { type RefObject, useRef, useEffect, useCallback } from 'react'\nimport { gaTrack } from '../shared/track.js'\nimport { useAiuiContext } from '../biz-components/AiuiProvider/index.js'\nimport type { Product, ProductVariant } from '../biz-components/Listing/types/product.js'\n\n/** \u5355\u4E2A\u4EA7\u54C1\u9879\u7684\u57CB\u70B9\u6570\u636E\uFF08CMS \u914D\u7F6E\u7684\u7B80\u5316\u4EA7\u54C1\uFF09 */\nexport interface ProductItem {\n sku?: string\n handle?: string\n custom_price?: number\n [key: string]: any\n}\n\n/** Hook \u5165\u53C2 */\nexport interface ProductListTrackOptions {\n /** \u7EC4\u4EF6\u5BB9\u5668 ref\uFF0C\u7528\u4E8E view_item_list \u7684\u89C6\u53E3\u68C0\u6D4B */\n containerRef: RefObject<HTMLDivElement>\n /** \u5217\u8868\u540D\u79F0\uFF0C\u7528\u4E8E item_list_name \u5B57\u6BB5 */\n listName: string\n /** \u4EA7\u54C1\u5217\u8868\uFF08\u7B80\u5316\u6570\u636E\uFF0C\u6765\u81EA CMS \u914D\u7F6E\uFF09 */\n items: ProductItem[]\n /** \u6784\u5EFA\u65F6\u4EA7\u54C1\u5B8C\u6574\u6570\u636E\uFF08\u6765\u81EA Shopify API\uFF09 */\n products?: Product[]\n}\n\n/**\n * \u6839\u636E\u7B80\u5316\u4EA7\u54C1 + \u5B8C\u6574\u4EA7\u54C1\u6570\u636E\uFF0C\u6784\u5EFA GA4 \u6807\u51C6 items \u6570\u7EC4\n */\nconst resolveItemList = (items: ProductItem[], products?: Product[]) => {\n return items.map((item, index) => {\n const matchedProduct = products?.find(p => p.handle === item.handle) || null\n const variant = matchedProduct?.variants?.find((v: ProductVariant) => v?.sku === item.sku) || null\n return {\n item_id: item.sku || variant?.sku || '',\n item_name: variant?.title || matchedProduct?.title || '',\n item_variant: variant?.title || '',\n price: item.custom_price ?? variant?.price?.amount ?? '',\n index: index + 1,\n }\n })\n}\n\n/**\n * \u4EA7\u54C1\u5217\u8868\u57CB\u70B9 Hook\n *\n * \u5C01\u88C5\u4E24\u4E2A GA4 \u7535\u5546\u4E8B\u4EF6\uFF1A\n * - `view_item_list` \u2014 \u7EC4\u4EF6\u8FDB\u5165\u89C6\u53E3\u65F6\u81EA\u52A8\u89E6\u53D1\u4E00\u6B21\uFF08\u4EA7\u54C1\u5217\u8868\u9732\u51FA\uFF09\n * - `select_item` \u2014 \u8FD4\u56DE trackSelectItem \u51FD\u6570\uFF0C\u70B9\u51FB\u4EA7\u54C1\u65F6\u624B\u52A8\u8C03\u7528\uFF08\u4EA7\u54C1\u9009\u62E9\uFF09\n *\n * @example\n * ```tsx\n * const { trackSelectItem } = useProductListTrack({\n * containerRef: innerRef,\n * listName: 'gift_tier_shelf',\n * items: availableItems.map(item => item.products?.[0]).filter(Boolean),\n * products: buildData?.products,\n * })\n *\n * // \u70B9\u51FB\u4EA7\u54C1\u5361\u7247\u65F6\n * <Card onClick={() => { trackSelectItem(product, index); onCardClick?.() }} />\n * ```\n */\nexport const useProductListTrack = ({ containerRef, listName, items, products }: ProductListTrackOptions) => {\n const { trackingData } = useAiuiContext()\n const hasViewed = useRef(false)\n\n // view_item_list \u2014 \u8FDB\u5165\u89C6\u53E3\u89E6\u53D1\u4E00\u6B21\n useEffect(() => {\n if (!containerRef.current || hasViewed.current || !products?.length) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting && !hasViewed.current) {\n hasViewed.current = true\n gaTrack({\n event: 'ga4Event',\n event_name: 'view_item_list',\n event_parameters: {\n page_group: trackingData?.pageGroup || 'Home Page',\n item_list_name: listName,\n items: resolveItemList(items, products),\n },\n })\n observer.disconnect()\n }\n },\n { threshold: 0 }\n )\n\n observer.observe(containerRef.current)\n return () => observer.disconnect()\n }, [products, items, trackingData, listName, containerRef])\n\n // select_item \u2014 \u70B9\u51FB\u67D0\u4EA7\u54C1\u65F6\u8C03\u7528\n const trackSelectItem = useCallback(\n (item: ProductItem, index: number) => {\n const matchedProduct = products?.find(p => p.handle === item.handle) || null\n const variant = matchedProduct?.variants?.find((v: ProductVariant) => v?.sku === item.sku) || null\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'select_item',\n event_parameters: {\n page_group: trackingData?.pageGroup || 'Home Page',\n item_list_name: listName,\n items: [\n {\n item_id: item.sku || variant?.sku || '',\n item_name: variant?.title || matchedProduct?.title || '',\n item_variant: variant?.title || '',\n price: item.custom_price ?? variant?.price?.amount ?? '',\n index: index + 1,\n },\n ],\n },\n })\n },\n [products, trackingData, listName]\n )\n\n return { trackSelectItem }\n}\n"],
5
+ "mappings": "AAAA,OAAyB,UAAAA,EAAQ,aAAAC,EAAW,eAAAC,MAAmB,QAC/D,OAAS,WAAAC,MAAe,qBACxB,OAAS,kBAAAC,MAAsB,0CA0B/B,MAAMC,EAAkB,CAACC,EAAsBC,IACtCD,EAAM,IAAI,CAACE,EAAMC,IAAU,CAChC,MAAMC,EAAiBH,GAAU,KAAKI,GAAKA,EAAE,SAAWH,EAAK,MAAM,GAAK,KAClEI,EAAUF,GAAgB,UAAU,KAAMG,GAAsBA,GAAG,MAAQL,EAAK,GAAG,GAAK,KAC9F,MAAO,CACL,QAASA,EAAK,KAAOI,GAAS,KAAO,GACrC,UAAWA,GAAS,OAASF,GAAgB,OAAS,GACtD,aAAcE,GAAS,OAAS,GAChC,MAAOJ,EAAK,cAAgBI,GAAS,OAAO,QAAU,GACtD,MAAOH,EAAQ,CACjB,CACF,CAAC,EAuBUK,EAAsB,CAAC,CAAE,aAAAC,EAAc,SAAAC,EAAU,MAAAV,EAAO,SAAAC,CAAS,IAA+B,CAC3G,KAAM,CAAE,aAAAU,CAAa,EAAIb,EAAe,EAClCc,EAAYlB,EAAO,EAAK,EAG9B,OAAAC,EAAU,IAAM,CACd,GAAI,CAACc,EAAa,SAAWG,EAAU,SAAW,CAACX,GAAU,OAAQ,OAErE,MAAMY,EAAW,IAAI,qBACnB,CAAC,CAACC,CAAK,IAAM,CACPA,EAAM,gBAAkB,CAACF,EAAU,UACrCA,EAAU,QAAU,GACpBf,EAAQ,CACN,MAAO,WACP,WAAY,iBACZ,iBAAkB,CAChB,WAAYc,GAAc,WAAa,YACvC,eAAgBD,EAChB,MAAOX,EAAgBC,EAAOC,CAAQ,CACxC,CACF,CAAC,EACDY,EAAS,WAAW,EAExB,EACA,CAAE,UAAW,CAAE,CACjB,EAEA,OAAAA,EAAS,QAAQJ,EAAa,OAAO,EAC9B,IAAMI,EAAS,WAAW,CACnC,EAAG,CAACZ,EAAUD,EAAOW,EAAcD,EAAUD,CAAY,CAAC,EA6BnD,CAAE,gBA1Beb,EACtB,CAACM,EAAmBC,IAAkB,CACpC,MAAMC,EAAiBH,GAAU,KAAKI,GAAKA,EAAE,SAAWH,EAAK,MAAM,GAAK,KAClEI,EAAUF,GAAgB,UAAU,KAAMG,GAAsBA,GAAG,MAAQL,EAAK,GAAG,GAAK,KAE9FL,EAAQ,CACN,MAAO,WACP,WAAY,cACZ,iBAAkB,CAChB,WAAYc,GAAc,WAAa,YACvC,eAAgBD,EAChB,MAAO,CACL,CACE,QAASR,EAAK,KAAOI,GAAS,KAAO,GACrC,UAAWA,GAAS,OAASF,GAAgB,OAAS,GACtD,aAAcE,GAAS,OAAS,GAChC,MAAOJ,EAAK,cAAgBI,GAAS,OAAO,QAAU,GACtD,MAAOH,EAAQ,CACjB,CACF,CACF,CACF,CAAC,CACH,EACA,CAACF,EAAUU,EAAcD,CAAQ,CACnC,CAEyB,CAC3B",
6
+ "names": ["useRef", "useEffect", "useCallback", "gaTrack", "useAiuiContext", "resolveItemList", "items", "products", "item", "index", "matchedProduct", "p", "variant", "v", "useProductListTrack", "containerRef", "listName", "trackingData", "hasViewed", "observer", "entry"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anker-in/headless-ui",
3
- "version": "1.2.2",
3
+ "version": "1.2.3-alpha.1778583232121",
4
4
  "type": "commonjs",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "types": "./dist/cjs/index.d.ts",
package/style.css CHANGED
@@ -1001,6 +1001,9 @@ video {
1001
1001
  .mt-0 {
1002
1002
  margin-top: 0px;
1003
1003
  }
1004
+ .mt-0\.5 {
1005
+ margin-top: 0.125rem;
1006
+ }
1004
1007
  .mt-1 {
1005
1008
  margin-top: 0.25rem;
1006
1009
  }
@@ -1010,6 +1013,9 @@ video {
1010
1013
  .mt-2 {
1011
1014
  margin-top: 0.5rem;
1012
1015
  }
1016
+ .mt-20 {
1017
+ margin-top: 5rem;
1018
+ }
1013
1019
  .mt-3 {
1014
1020
  margin-top: 0.75rem;
1015
1021
  }
@@ -1184,6 +1190,9 @@ video {
1184
1190
  .aspect-square {
1185
1191
  aspect-ratio: 1 / 1;
1186
1192
  }
1193
+ .aspect-video {
1194
+ aspect-ratio: 16 / 9;
1195
+ }
1187
1196
  .size-0 {
1188
1197
  width: 0px;
1189
1198
  height: 0px;
@@ -1642,6 +1651,9 @@ video {
1642
1651
  .min-h-\[336px\] {
1643
1652
  min-height: 336px;
1644
1653
  }
1654
+ .min-h-\[36px\] {
1655
+ min-height: 36px;
1656
+ }
1645
1657
  .min-h-\[48px\] {
1646
1658
  min-height: 48px;
1647
1659
  }
@@ -1705,6 +1717,9 @@ video {
1705
1717
  .w-\[18px\] {
1706
1718
  width: 18px;
1707
1719
  }
1720
+ .w-\[200px\] {
1721
+ width: 200px;
1722
+ }
1708
1723
  .w-\[20px\] {
1709
1724
  width: 20px;
1710
1725
  }
@@ -2020,6 +2035,28 @@ video {
2020
2035
  .animate-\[spin_120s_linear_infinite\] {
2021
2036
  animation: spin 120s linear infinite;
2022
2037
  }
2038
+ @keyframes marquee {
2039
+ 0% {
2040
+ transform: translateX(0);
2041
+ }
2042
+ 100% {
2043
+ transform: translateX(calc(-1 * var(--track-width, 50%)));
2044
+ }
2045
+ }
2046
+ .animate-marquee {
2047
+ animation: marquee var(--marquee-duration, 10s) linear infinite;
2048
+ }
2049
+ @keyframes marquee-reverse {
2050
+ 0% {
2051
+ transform: translateX(calc(-1 * var(--track-width, 50%)));
2052
+ }
2053
+ 100% {
2054
+ transform: translateX(0);
2055
+ }
2056
+ }
2057
+ .animate-marquee-reverse {
2058
+ animation: marquee-reverse var(--marquee-duration, 10s) linear infinite;
2059
+ }
2023
2060
  @keyframes marquee-x {
2024
2061
  0% {
2025
2062
  transform: translateX(0);
@@ -2535,6 +2572,10 @@ video {
2535
2572
  --tw-border-opacity: 1 !important;
2536
2573
  border-color: rgb(248 77 79 / var(--tw-border-opacity, 1)) !important;
2537
2574
  }
2575
+ .border-\[\#005D8E\] {
2576
+ --tw-border-opacity: 1;
2577
+ border-color: rgb(0 93 142 / var(--tw-border-opacity, 1));
2578
+ }
2538
2579
  .border-\[\#00BEFA\] {
2539
2580
  --tw-border-opacity: 1;
2540
2581
  border-color: rgb(0 190 250 / var(--tw-border-opacity, 1));
@@ -2589,6 +2630,9 @@ video {
2589
2630
  .border-\[var\(--brand-color-0\)\] {
2590
2631
  border-color: var(--brand-color-0);
2591
2632
  }
2633
+ .border-black\/5 {
2634
+ border-color: rgb(0 0 0 / 0.05);
2635
+ }
2592
2636
  .border-brand-0 {
2593
2637
  border-color: var(--brand-color-0);
2594
2638
  }
@@ -2649,6 +2693,10 @@ video {
2649
2693
  --tw-bg-opacity: 1 !important;
2650
2694
  background-color: rgb(8 10 15 / var(--tw-bg-opacity, 1)) !important;
2651
2695
  }
2696
+ .\!bg-\[\#1E2024\] {
2697
+ --tw-bg-opacity: 1 !important;
2698
+ background-color: rgb(30 32 36 / var(--tw-bg-opacity, 1)) !important;
2699
+ }
2652
2700
  .\!bg-\[\#E8E8E8\] {
2653
2701
  --tw-bg-opacity: 1 !important;
2654
2702
  background-color: rgb(232 232 232 / var(--tw-bg-opacity, 1)) !important;
@@ -2836,6 +2884,10 @@ video {
2836
2884
  .bg-error-1 {
2837
2885
  background-color: var(--error-color-1);
2838
2886
  }
2887
+ .bg-gray-900 {
2888
+ --tw-bg-opacity: 1;
2889
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1));
2890
+ }
2839
2891
  .bg-info-primary {
2840
2892
  background-color: var(--info-primary-color);
2841
2893
  }
@@ -3328,9 +3380,15 @@ video {
3328
3380
  .pr-0 {
3329
3381
  padding-right: 0px;
3330
3382
  }
3383
+ .pr-12 {
3384
+ padding-right: 3rem;
3385
+ }
3331
3386
  .pr-2 {
3332
3387
  padding-right: 0.5rem;
3333
3388
  }
3389
+ .pr-20 {
3390
+ padding-right: 5rem;
3391
+ }
3334
3392
  .pr-6 {
3335
3393
  padding-right: 1.5rem;
3336
3394
  }
@@ -3349,6 +3407,9 @@ video {
3349
3407
  .pt-0 {
3350
3408
  padding-top: 0px;
3351
3409
  }
3410
+ .pt-0\.5 {
3411
+ padding-top: 0.125rem;
3412
+ }
3352
3413
  .pt-1 {
3353
3414
  padding-top: 0.25rem;
3354
3415
  }
@@ -3528,6 +3589,12 @@ video {
3528
3589
  .leading-none {
3529
3590
  line-height: 1;
3530
3591
  }
3592
+ .leading-relaxed {
3593
+ line-height: 1.625;
3594
+ }
3595
+ .leading-snug {
3596
+ line-height: 1.375;
3597
+ }
3531
3598
  .leading-tight {
3532
3599
  line-height: var(--line-height-tight);
3533
3600
  }
@@ -3575,6 +3642,10 @@ video {
3575
3642
  --tw-text-opacity: 1;
3576
3643
  color: rgb(0 0 0 / var(--tw-text-opacity, 1));
3577
3644
  }
3645
+ .text-\[\#005D8E\] {
3646
+ --tw-text-opacity: 1;
3647
+ color: rgb(0 93 142 / var(--tw-text-opacity, 1));
3648
+ }
3578
3649
  .text-\[\#00BEFA\] {
3579
3650
  --tw-text-opacity: 1;
3580
3651
  color: rgb(0 190 250 / var(--tw-text-opacity, 1));
@@ -3708,6 +3779,9 @@ video {
3708
3779
  .text-\[1D1D1F\] {
3709
3780
  color: 1D1D1F;
3710
3781
  }
3782
+ .text-\[var\(--brand-color-0\)\] {
3783
+ color: var(--brand-color-0);
3784
+ }
3711
3785
  .text-black {
3712
3786
  --tw-text-opacity: 1;
3713
3787
  color: rgb(0 0 0 / var(--tw-text-opacity, 1));
@@ -3736,6 +3810,10 @@ video {
3736
3810
  --tw-text-opacity: 1;
3737
3811
  color: rgb(107 114 128 / var(--tw-text-opacity, 1));
3738
3812
  }
3813
+ .text-gray-900 {
3814
+ --tw-text-opacity: 1;
3815
+ color: rgb(17 24 39 / var(--tw-text-opacity, 1));
3816
+ }
3739
3817
  .text-info-primary {
3740
3818
  color: var(--info-primary-color);
3741
3819
  }
@@ -3952,6 +4030,9 @@ video {
3952
4030
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
3953
4031
  transition-duration: 150ms;
3954
4032
  }
4033
+ .duration-150 {
4034
+ transition-duration: 150ms;
4035
+ }
3955
4036
  .duration-200 {
3956
4037
  transition-duration: 200ms;
3957
4038
  }
@@ -4256,6 +4337,14 @@ video {
4256
4337
  .hover\:bg-container-secondary-0:hover {
4257
4338
  background-color: var(--container-secondary-color-0);
4258
4339
  }
4340
+ .hover\:bg-gray-100:hover {
4341
+ --tw-bg-opacity: 1;
4342
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));
4343
+ }
4344
+ .hover\:bg-gray-700:hover {
4345
+ --tw-bg-opacity: 1;
4346
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1));
4347
+ }
4259
4348
  .hover\:bg-info-white:hover {
4260
4349
  background-color: var(--info-white-color);
4261
4350
  }
@@ -4323,6 +4412,9 @@ video {
4323
4412
  .hover\:opacity-100:hover {
4324
4413
  opacity: 1;
4325
4414
  }
4415
+ .hover\:opacity-70:hover {
4416
+ opacity: 0.7;
4417
+ }
4326
4418
  .hover\:opacity-80:hover {
4327
4419
  opacity: 0.8;
4328
4420
  }
@@ -4380,6 +4472,21 @@ video {
4380
4472
  outline: 2px solid transparent;
4381
4473
  outline-offset: 2px;
4382
4474
  }
4475
+ .focus-visible\:outline:focus-visible {
4476
+ outline-style: solid;
4477
+ }
4478
+ .focus-visible\:outline-2:focus-visible {
4479
+ outline-width: 2px;
4480
+ }
4481
+ .focus-visible\:outline-offset-2:focus-visible {
4482
+ outline-offset: 2px;
4483
+ }
4484
+ .focus-visible\:outline-gray-400:focus-visible {
4485
+ outline-color: #9ca3af;
4486
+ }
4487
+ .focus-visible\:outline-gray-900:focus-visible {
4488
+ outline-color: #111827;
4489
+ }
4383
4490
  .focus-visible\:ring-0:focus-visible {
4384
4491
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
4385
4492
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
@@ -5546,6 +5653,9 @@ video {
5546
5653
  .laptop\:aspect-\[824\/560\] {
5547
5654
  aspect-ratio: 824/560;
5548
5655
  }
5656
+ .laptop\:aspect-auto {
5657
+ aspect-ratio: auto;
5658
+ }
5549
5659
  .laptop\:size-1\/2 {
5550
5660
  width: 50%;
5551
5661
  height: 50%;
@@ -5618,6 +5728,14 @@ video {
5618
5728
  width: 90%;
5619
5729
  height: 90%;
5620
5730
  }
5731
+ .laptop\:size-\[96px\] {
5732
+ width: 96px;
5733
+ height: 96px;
5734
+ }
5735
+ .laptop\:size-full {
5736
+ width: 100%;
5737
+ height: 100%;
5738
+ }
5621
5739
  .laptop\:h-0 {
5622
5740
  height: 0px;
5623
5741
  }
@@ -5690,8 +5808,8 @@ video {
5690
5808
  .laptop\:h-\[54px\] {
5691
5809
  height: 54px;
5692
5810
  }
5693
- .laptop\:h-\[80px\] {
5694
- height: 80px;
5811
+ .laptop\:h-\[72px\] {
5812
+ height: 72px;
5695
5813
  }
5696
5814
  .laptop\:h-\[calc\(220px-72px\)\] {
5697
5815
  height: calc(220px - 72px);
@@ -5729,6 +5847,9 @@ video {
5729
5847
  .laptop\:w-2\/3 {
5730
5848
  width: 66.666667%;
5731
5849
  }
5850
+ .laptop\:w-80 {
5851
+ width: 20rem;
5852
+ }
5732
5853
  .laptop\:w-\[--circle-laptop-size\] {
5733
5854
  width: var(--circle-laptop-size);
5734
5855
  }
@@ -6158,6 +6279,9 @@ video {
6158
6279
  .laptop\:pr-1 {
6159
6280
  padding-right: 0.25rem;
6160
6281
  }
6282
+ .laptop\:pr-24 {
6283
+ padding-right: 6rem;
6284
+ }
6161
6285
  .laptop\:pt-4 {
6162
6286
  padding-top: 1rem;
6163
6287
  }
@@ -6560,6 +6684,10 @@ video {
6560
6684
  width: 1.5rem;
6561
6685
  height: 1.5rem;
6562
6686
  }
6687
+ .desktop\:size-\[112px\] {
6688
+ width: 112px;
6689
+ height: 112px;
6690
+ }
6563
6691
  .desktop\:size-\[115px\] {
6564
6692
  width: 115px;
6565
6693
  height: 115px;
@@ -6920,6 +7048,10 @@ video {
6920
7048
  padding-left: 1.75rem;
6921
7049
  padding-right: 1.75rem;
6922
7050
  }
7051
+ .desktop\:px-8 {
7052
+ padding-left: 2rem;
7053
+ padding-right: 2rem;
7054
+ }
6923
7055
  .desktop\:px-\[111px\] {
6924
7056
  padding-left: 111px;
6925
7057
  padding-right: 111px;
@@ -6989,6 +7121,9 @@ video {
6989
7121
  .desktop\:pr-16 {
6990
7122
  padding-right: 4rem;
6991
7123
  }
7124
+ .desktop\:pr-28 {
7125
+ padding-right: 7rem;
7126
+ }
6992
7127
  .desktop\:pt-0 {
6993
7128
  padding-top: 0px;
6994
7129
  }
@@ -7201,6 +7336,10 @@ video {
7201
7336
  width: 108px;
7202
7337
  height: 108px;
7203
7338
  }
7339
+ .lg-desktop\:size-\[128px\] {
7340
+ width: 128px;
7341
+ height: 128px;
7342
+ }
7204
7343
  .lg-desktop\:size-\[144px\] {
7205
7344
  width: 144px;
7206
7345
  height: 144px;
@@ -7722,9 +7861,8 @@ video {
7722
7861
  .\[\&_\.banner-dot\.swiper-pagination-bullet-active\]\:rounded-full .banner-dot.swiper-pagination-bullet-active {
7723
7862
  border-radius: 9999px;
7724
7863
  }
7725
- .\[\&_\.banner-dot\.swiper-pagination-bullet-active\]\:bg-\[\#080A0F\] .banner-dot.swiper-pagination-bullet-active {
7726
- --tw-bg-opacity: 1;
7727
- background-color: rgb(8 10 15 / var(--tw-bg-opacity, 1));
7864
+ .\[\&_\.banner-dot\.swiper-pagination-bullet-active\]\:bg-info-primary .banner-dot.swiper-pagination-bullet-active {
7865
+ background-color: var(--info-primary-color);
7728
7866
  }
7729
7867
  .\[\&_\.banner-dot\]\:size-2 .banner-dot {
7730
7868
  width: 0.5rem;
@@ -7808,18 +7946,12 @@ video {
7808
7946
  .\[\&_\.swiper-slide\]\:\!h-auto .swiper-slide {
7809
7947
  height: auto !important;
7810
7948
  }
7811
- .\[\&_\.swiper-slide\]\:\!w-auto .swiper-slide {
7812
- width: auto !important;
7813
- }
7814
7949
  .\[\&_\.swiper-wrapper\]\:flex .swiper-wrapper {
7815
7950
  display: flex;
7816
7951
  }
7817
7952
  .\[\&_\.swiper-wrapper\]\:items-stretch .swiper-wrapper {
7818
7953
  align-items: stretch;
7819
7954
  }
7820
- .\[\&_\.swiper-wrapper\]\:\!ease-linear .swiper-wrapper {
7821
- transition-timing-function: linear !important;
7822
- }
7823
7955
  .\[\&_a\]\:text-\[\#1E2024\] a {
7824
7956
  --tw-text-opacity: 1;
7825
7957
  color: rgb(30 32 36 / var(--tw-text-opacity, 1));
@@ -24,6 +24,14 @@ module.exports = {
24
24
  '0%': { transform: 'translateX(0)' },
25
25
  '100%': { transform: 'translateX(-50%)' },
26
26
  },
27
+ marquee: {
28
+ '0%': { transform: 'translateX(0)' },
29
+ '100%': { transform: 'translateX(calc(-1 * var(--track-width, 50%)))' },
30
+ },
31
+ 'marquee-reverse': {
32
+ '0%': { transform: 'translateX(calc(-1 * var(--track-width, 50%)))' },
33
+ '100%': { transform: 'translateX(0)' },
34
+ },
27
35
  'marquee-y': {
28
36
  from: { transform: 'translateY(0%)' },
29
37
  to: { transform: 'translateY(-50%)' },
@@ -50,6 +58,8 @@ module.exports = {
50
58
  animation: {
51
59
  'marquee-y': 'marquee-y 20s linear infinite',
52
60
  'marquee-x': 'marquee-x var(--scroll-duration, 30s) linear infinite',
61
+ marquee: 'marquee var(--marquee-duration, 10s) linear infinite',
62
+ 'marquee-reverse': 'marquee-reverse var(--marquee-duration, 10s) linear infinite',
53
63
  'scroll-text': 'scroll-text 2s ease-in-out infinite',
54
64
  'progress-bar': 'progress-bar var(--interval-time) ease-out',
55
65
  'fade-in-overlay': 'fade-in-overlay 0.3s cubic-bezier(0.4,0,0.2,1) both',