@mohasinac/appkit 4.11.2 → 4.12.0

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 (246) hide show
  1. package/dist/_internal/server/features/checkout/actions.d.ts +40 -3
  2. package/dist/_internal/server/features/checkout/actions.js +232 -47
  3. package/dist/_internal/server/features/checkout/data.d.ts +10 -0
  4. package/dist/_internal/server/features/orders/adapters.js +20 -0
  5. package/dist/_internal/server/features/products/data.d.ts +12 -3
  6. package/dist/_internal/server/features/products/data.js +55 -4
  7. package/dist/_internal/server/features/products/index.d.ts +1 -1
  8. package/dist/_internal/server/features/products/index.js +1 -1
  9. package/dist/_internal/server/features/products/list-public.d.ts +47 -0
  10. package/dist/_internal/server/features/products/list-public.js +131 -6
  11. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  12. package/dist/_internal/server/features/reviews/data.js +3 -2
  13. package/dist/_internal/server/features/tester/visibility.js +3 -3
  14. package/dist/_internal/server/jobs/core/auctionSettlement.js +5 -2
  15. package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +1 -1
  16. package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +4 -1
  17. package/dist/_internal/server/jobs/core/testerSandboxRefresh.js +2 -0
  18. package/dist/_internal/server/jobs/handlers/_helpers.js +4 -1
  19. package/dist/_internal/shared/checkout/lanes.d.ts +20 -0
  20. package/dist/_internal/shared/checkout/lanes.js +28 -0
  21. package/dist/_internal/shared/features/checkout/config.d.ts +4 -0
  22. package/dist/_internal/shared/features/checkout/config.js +8 -0
  23. package/dist/_internal/shared/features/promotions/schema.d.ts +0 -16
  24. package/dist/_internal/shared/features/promotions/schema.js +0 -2
  25. package/dist/_internal/shared/features/reviews/config.d.ts +8 -1
  26. package/dist/_internal/shared/features/reviews/config.js +8 -1
  27. package/dist/_internal/shared/fees/calculator.d.ts +34 -2
  28. package/dist/_internal/shared/fees/calculator.js +45 -1
  29. package/dist/_internal/shared/listing-types/_registry.d.ts +88 -1
  30. package/dist/_internal/shared/listing-types/_registry.js +63 -1
  31. package/dist/_internal/shared/listing-types/art/config.d.ts +59 -0
  32. package/dist/_internal/shared/listing-types/art/config.js +12 -0
  33. package/dist/_internal/shared/listing-types/auction/config.d.ts +53 -0
  34. package/dist/_internal/shared/listing-types/auction/config.js +17 -0
  35. package/dist/_internal/shared/listing-types/classified/config.d.ts +59 -0
  36. package/dist/_internal/shared/listing-types/classified/config.js +14 -0
  37. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +59 -0
  38. package/dist/_internal/shared/listing-types/digital-code/config.js +12 -0
  39. package/dist/_internal/shared/listing-types/live/config.d.ts +59 -0
  40. package/dist/_internal/shared/listing-types/live/config.js +14 -0
  41. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +110 -0
  42. package/dist/_internal/shared/listing-types/pre-order/config.js +14 -0
  43. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +44 -0
  44. package/dist/_internal/shared/listing-types/prize-draw/config.js +10 -0
  45. package/dist/_internal/shared/listing-types/standard/config.d.ts +59 -0
  46. package/dist/_internal/shared/listing-types/standard/config.js +9 -0
  47. package/dist/_internal/shared/listing-types/stickers/config.d.ts +59 -0
  48. package/dist/_internal/shared/listing-types/stickers/config.js +12 -0
  49. package/dist/client.d.ts +12 -2
  50. package/dist/client.js +8 -2
  51. package/dist/constants/api-endpoints.d.ts +6 -0
  52. package/dist/constants/api-endpoints.js +2 -0
  53. package/dist/constants/field-names.d.ts +12 -0
  54. package/dist/constants/field-names.js +12 -0
  55. package/dist/constants/table-keys.d.ts +2 -0
  56. package/dist/constants/table-keys.js +2 -0
  57. package/dist/features/account/components/UserOrdersView.js +27 -5
  58. package/dist/features/admin/components/AdminAddressesView.js +21 -11
  59. package/dist/features/admin/components/AdminArtView.d.ts +9 -0
  60. package/dist/features/admin/components/AdminArtView.js +11 -35
  61. package/dist/features/admin/components/AdminClassifiedView.d.ts +9 -0
  62. package/dist/features/admin/components/AdminClassifiedView.js +11 -35
  63. package/dist/features/admin/components/AdminCouponEditorView.js +1 -4
  64. package/dist/features/admin/components/AdminDigitalCodesView.d.ts +9 -0
  65. package/dist/features/admin/components/AdminDigitalCodesView.js +11 -42
  66. package/dist/features/admin/components/AdminLiveView.d.ts +9 -0
  67. package/dist/features/admin/components/AdminLiveView.js +11 -41
  68. package/dist/features/admin/components/AdminOrderEditorView.d.ts +8 -1
  69. package/dist/features/admin/components/AdminOrderEditorView.js +4 -3
  70. package/dist/features/admin/components/AdminOrdersView.js +14 -1
  71. package/dist/features/admin/components/AdminPaymentMethodsView.js +18 -11
  72. package/dist/features/admin/components/AdminProductsView.js +34 -18
  73. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  74. package/dist/features/admin/components/AdminSiteSettingsView.js +4 -2
  75. package/dist/features/admin/components/AdminStickersView.d.ts +9 -0
  76. package/dist/features/admin/components/AdminStickersView.js +11 -35
  77. package/dist/features/admin/constants/filter-tabs.d.ts +26 -9
  78. package/dist/features/admin/constants/filter-tabs.js +22 -9
  79. package/dist/features/admin/hooks/useAdminListing.js +7 -2
  80. package/dist/features/admin/schemas/firestore.d.ts +5 -0
  81. package/dist/features/admin/schemas/firestore.js +1 -0
  82. package/dist/features/auctions/actions/bid-actions.js +2 -2
  83. package/dist/features/auctions/components/AuctionBidsTable.js +1 -1
  84. package/dist/features/auctions/components/AuctionBottomActions.js +1 -0
  85. package/dist/features/auctions/components/AuctionDetailPageView.js +13 -11
  86. package/dist/features/cart/components/CartDrawer.d.ts +9 -1
  87. package/dist/features/cart/components/CartDrawer.js +4 -3
  88. package/dist/features/cart/components/CartPriceBreakdown.d.ts +61 -0
  89. package/dist/features/cart/components/CartPriceBreakdown.js +25 -0
  90. package/dist/features/cart/components/StoreAddonsPicker.d.ts +47 -0
  91. package/dist/features/cart/components/StoreAddonsPicker.js +21 -0
  92. package/dist/features/cart/components/index.d.ts +4 -0
  93. package/dist/features/cart/components/index.js +2 -0
  94. package/dist/features/cart/repository/cart.repository.d.ts +20 -2
  95. package/dist/features/cart/repository/cart.repository.js +49 -0
  96. package/dist/features/cart/schemas/firestore.d.ts +26 -2
  97. package/dist/features/categories/components/BrandDetailTabs.js +31 -11
  98. package/dist/features/categories/components/CategoryDetailTabs.js +27 -7
  99. package/dist/features/categories/components/CategoryProductsListing.d.ts +9 -1
  100. package/dist/features/categories/components/CategoryProductsListing.js +5 -2
  101. package/dist/features/classified/components/ClassifiedDetailPageView.js +2 -1
  102. package/dist/features/contact/email.js +5 -1
  103. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +17 -16
  104. package/dist/features/homepage/components/FeaturedResultsSection.js +1 -1
  105. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  106. package/dist/features/homepage/components/ShopByCategorySection.js +1 -1
  107. package/dist/features/layout/AppLayoutShell.js +9 -2
  108. package/dist/features/layout/BottomActions.js +62 -6
  109. package/dist/features/layout/BottomActionsContext.d.ts +26 -0
  110. package/dist/features/layout/BottomActionsContext.js +18 -1
  111. package/dist/features/layout/hooks/useBottomActions.d.ts +12 -1
  112. package/dist/features/layout/hooks/useBottomActions.js +14 -1
  113. package/dist/features/layout/index.d.ts +1 -1
  114. package/dist/features/live/components/LiveItemDetailPageView.js +7 -6
  115. package/dist/features/orders/components/OrderAddonBadges.d.ts +36 -0
  116. package/dist/features/orders/components/OrderAddonBadges.js +28 -0
  117. package/dist/features/orders/components/index.d.ts +1 -0
  118. package/dist/features/orders/components/index.js +1 -0
  119. package/dist/features/orders/repository/orders.repository.d.ts +36 -0
  120. package/dist/features/orders/repository/orders.repository.js +18 -0
  121. package/dist/features/orders/types/index.d.ts +38 -0
  122. package/dist/features/pre-orders/components/PreOrderBottomActions.d.ts +1 -1
  123. package/dist/features/pre-orders/components/PreOrderBottomActions.js +3 -19
  124. package/dist/features/products/components/ArtStickersListView.js +5 -4
  125. package/dist/features/products/components/AuctionsIndexListing.js +1 -2
  126. package/dist/features/products/components/ListingBottomActions.d.ts +28 -0
  127. package/dist/features/products/components/ListingBottomActions.js +25 -0
  128. package/dist/features/products/components/PrizeDrawBottomActions.d.ts +1 -1
  129. package/dist/features/products/components/PrizeDrawBottomActions.js +3 -21
  130. package/dist/features/products/components/PrizeDrawsListingView.js +18 -33
  131. package/dist/features/products/components/ProductDetailActions.js +4 -0
  132. package/dist/features/products/components/ProductDetailPageView.js +7 -7
  133. package/dist/features/products/components/ProductsIndexListing.js +87 -11
  134. package/dist/features/products/components/ProductsIndexPageView.js +14 -2
  135. package/dist/features/products/config/listing-type-listing-config.d.ts +31 -0
  136. package/dist/features/products/config/listing-type-listing-config.js +74 -0
  137. package/dist/features/products/constants/listing-tabs.d.ts +43 -198
  138. package/dist/features/products/constants/listing-tabs.js +71 -58
  139. package/dist/features/products/constants/sieve.d.ts +104 -1
  140. package/dist/features/products/constants/sieve.js +27 -7
  141. package/dist/features/products/hooks/useProducts.js +14 -0
  142. package/dist/features/products/repository/products.repository.d.ts +45 -1
  143. package/dist/features/products/repository/products.repository.js +26 -3
  144. package/dist/features/products/types/index.d.ts +15 -0
  145. package/dist/features/products/utils/listing-badge-variant.d.ts +20 -1
  146. package/dist/features/products/utils/listing-badge-variant.js +26 -1
  147. package/dist/features/products/utils/listing-type.d.ts +24 -0
  148. package/dist/features/products/utils/listing-type.js +48 -0
  149. package/dist/features/promotions/actions/coupon-actions.d.ts +7 -0
  150. package/dist/features/promotions/actions/coupon-actions.js +12 -1
  151. package/dist/features/promotions/actions/coupon-stacking.d.ts +24 -0
  152. package/dist/features/promotions/actions/coupon-stacking.js +21 -0
  153. package/dist/features/promotions/actions/index.d.ts +1 -0
  154. package/dist/features/promotions/actions/index.js +1 -0
  155. package/dist/features/promotions/actions/seller-coupon-actions.d.ts +0 -1
  156. package/dist/features/promotions/actions/seller-coupon-actions.js +0 -1
  157. package/dist/features/promotions/components/CouponHelpDetails.d.ts +20 -0
  158. package/dist/features/promotions/components/CouponHelpDetails.js +17 -0
  159. package/dist/features/promotions/components/CouponsIndexListing.js +2 -1
  160. package/dist/features/promotions/components/index.d.ts +2 -0
  161. package/dist/features/promotions/components/index.js +1 -0
  162. package/dist/features/promotions/constants/coupon-help.d.ts +27 -0
  163. package/dist/features/promotions/constants/coupon-help.js +42 -0
  164. package/dist/features/promotions/repository/coupons.repository.d.ts +10 -1
  165. package/dist/features/promotions/repository/coupons.repository.js +22 -8
  166. package/dist/features/promotions/schemas/firestore.d.ts +0 -1
  167. package/dist/features/promotions/schemas/firestore.js +1 -1
  168. package/dist/features/promotions/schemas/index.d.ts +0 -20
  169. package/dist/features/promotions/schemas/index.js +0 -1
  170. package/dist/features/reviews/actions/review-actions.js +5 -1
  171. package/dist/features/reviews/components/ReviewDetailPageView.js +2 -1
  172. package/dist/features/reviews/components/ReviewFilters.d.ts +7 -1
  173. package/dist/features/reviews/components/ReviewFilters.js +4 -3
  174. package/dist/features/reviews/components/ReviewsIndexListing.d.ts +6 -0
  175. package/dist/features/reviews/components/ReviewsIndexListing.js +9 -109
  176. package/dist/features/reviews/components/ReviewsListingPanel.d.ts +41 -0
  177. package/dist/features/reviews/components/ReviewsListingPanel.js +226 -0
  178. package/dist/features/reviews/components/index.d.ts +2 -0
  179. package/dist/features/reviews/components/index.js +1 -0
  180. package/dist/features/reviews/hooks/useReviews.d.ts +8 -0
  181. package/dist/features/reviews/hooks/useReviews.js +14 -6
  182. package/dist/features/reviews/repository/reviews.repository.d.ts +29 -1
  183. package/dist/features/reviews/repository/reviews.repository.js +77 -41
  184. package/dist/features/reviews/types/index.d.ts +8 -1
  185. package/dist/features/seller/components/SellerOrdersView.js +2 -1
  186. package/dist/features/seller/components/SellerProductsCards.js +2 -2
  187. package/dist/features/seller/components/SellerProductsView.js +21 -18
  188. package/dist/features/stores/actions/store-query-actions.js +1 -1
  189. package/dist/features/stores/components/StoreArtStickersPageView.d.ts +21 -0
  190. package/dist/features/stores/components/StoreArtStickersPageView.js +30 -0
  191. package/dist/features/stores/components/StoreAuctionsListing.js +5 -11
  192. package/dist/features/stores/components/StoreAuctionsPageView.d.ts +4 -1
  193. package/dist/features/stores/components/StoreAuctionsPageView.js +17 -17
  194. package/dist/features/stores/components/StoreClassifiedsListing.js +7 -0
  195. package/dist/features/stores/components/StoreClassifiedsPageView.d.ts +4 -1
  196. package/dist/features/stores/components/StoreClassifiedsPageView.js +16 -12
  197. package/dist/features/stores/components/StoreDetailLayoutView.js +4 -3
  198. package/dist/features/stores/components/StoreDigitalCodesListing.js +5 -0
  199. package/dist/features/stores/components/StoreDigitalCodesPageView.d.ts +4 -1
  200. package/dist/features/stores/components/StoreDigitalCodesPageView.js +16 -12
  201. package/dist/features/stores/components/StoreLiveItemsListing.js +7 -0
  202. package/dist/features/stores/components/StoreLiveItemsPageView.d.ts +4 -1
  203. package/dist/features/stores/components/StoreLiveItemsPageView.js +16 -12
  204. package/dist/features/stores/components/StorePreOrdersListing.js +6 -11
  205. package/dist/features/stores/components/StorePreOrdersPageView.d.ts +4 -1
  206. package/dist/features/stores/components/StorePreOrdersPageView.js +17 -17
  207. package/dist/features/stores/components/StorePrizeDrawsPageView.d.ts +4 -8
  208. package/dist/features/stores/components/StorePrizeDrawsPageView.js +17 -22
  209. package/dist/features/stores/components/StoreProductsListing.d.ts +7 -1
  210. package/dist/features/stores/components/StoreProductsListing.js +3 -2
  211. package/dist/features/stores/components/StoreProductsPageView.d.ts +1 -1
  212. package/dist/features/stores/components/StoreProductsPageView.js +16 -21
  213. package/dist/features/stores/components/StoreReviewsListing.d.ts +4 -0
  214. package/dist/features/stores/components/StoreReviewsListing.js +7 -108
  215. package/dist/features/stores/schemas/index.d.ts +2 -2
  216. package/dist/features/tester/seed-data/coupons-tester-seed-data.js +3 -3
  217. package/dist/features/tester/seed-data/index.d.ts +1 -0
  218. package/dist/features/tester/seed-data/index.js +1 -0
  219. package/dist/features/tester/seed-data/offers-tester-seed-data.d.ts +2 -0
  220. package/dist/features/tester/seed-data/offers-tester-seed-data.js +61 -0
  221. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +939 -1
  222. package/dist/index.d.ts +9 -3
  223. package/dist/index.js +11 -2
  224. package/dist/next/routing/route-map.d.ts +2 -0
  225. package/dist/next/routing/route-map.js +5 -0
  226. package/dist/react/hooks/useListingTypeFlags.d.ts +12 -19
  227. package/dist/react/hooks/useListingTypeFlags.js +4 -9
  228. package/dist/schemas/registry.d.ts +0 -12
  229. package/dist/seed/claimed-coupons-seed-data.js +3 -3
  230. package/dist/seed/coupons-seed-data.js +29 -10
  231. package/dist/seed/faq-seed-data.js +2 -2
  232. package/dist/seed/manifest.js +2 -2
  233. package/dist/seed/reviews-seed-data.js +52 -0
  234. package/dist/server-entry.d.ts +1 -0
  235. package/dist/server-entry.js +1 -0
  236. package/dist/styles.css +55 -39
  237. package/dist/tailwind-utilities.css +1 -1
  238. package/dist/ui/components/Checkbox.d.ts +10 -1
  239. package/dist/ui/components/Checkbox.js +14 -2
  240. package/dist/ui/components/Checkbox.style.css +11 -0
  241. package/dist/ui/components/FilterChipGroup.d.ts +21 -3
  242. package/dist/ui/components/FilterChipGroup.js +33 -4
  243. package/dist/ui/components/HorizontalScroller.d.ts +1 -2
  244. package/dist/ui/components/HorizontalScroller.js +9 -5
  245. package/dist/ui/components/HorizontalScroller.style.css +43 -38
  246. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -2538,6 +2538,8 @@ export { COUPON_FIELDS } from "./features/promotions/index";
2538
2538
  export { COUPON_TYPE_LABELS } from "./features/promotions/index";
2539
2539
  export { COUPON_USAGE_SUBCOLLECTION } from "./features/promotions/index";
2540
2540
  export { CouponCard } from "./features/promotions/index";
2541
+ export { CouponHelpDetails } from "./features/promotions/index";
2542
+ export type { CouponHelpDetailsProps } from "./features/promotions/index";
2541
2543
  export { CouponsIndexListing } from "./features/promotions/index";
2542
2544
  export type { CouponsIndexListingProps } from "./features/promotions/index";
2543
2545
  export { DEFAULT_COUPON_DATA } from "./features/promotions/index";
@@ -2583,6 +2585,8 @@ export type { RestrictionsConfig } from "./features/promotions/index";
2583
2585
  export type { TieredDiscount } from "./features/promotions/index";
2584
2586
  export type { UsageConfig } from "./features/promotions/index";
2585
2587
  export type { ValidityConfig } from "./features/promotions/index";
2588
+ export { detectCouponConflict } from "./features/promotions/server";
2589
+ export type { IncomingCoupon } from "./features/promotions/server";
2586
2590
  export { getPromotions } from "./features/promotions/server";
2587
2591
  export { promotionsGET } from "./features/promotions/server";
2588
2592
  export { sellerCreateCoupon } from "./features/promotions/server";
@@ -3133,9 +3137,11 @@ export type { ProductFeatureAdminCreatePayload, ProductFeatureStoreCreatePayload
3133
3137
  export { LISTING_PARAM_NAMES, parseListingParams, parseListingSearchParams, serializeListingParams, } from "./utils/listing-params";
3134
3138
  export type { ListingParams } from "./utils/listing-params";
3135
3139
  export { PRODUCT_FEATURE_CATEGORY_OPTIONS, PRODUCT_FEATURE_PRODUCT_TYPE_OPTIONS, PRODUCT_FEATURE_SCOPE_OPTIONS, PRODUCT_FEATURE_ICON_COLOR_OPTIONS, PRODUCT_FEATURE_SCOPE_TABS, PRODUCT_FEATURE_DEFAULT_DISPLAY_ORDER, PRODUCT_FEATURE_CARD_MAX_VISIBLE, PRODUCT_FEATURE_QUERY_STALE_MS, } from "./features/products/constants/product-features.constants";
3136
- export { CATEGORY_PAGE_TABS, STORE_PAGE_TABS, SELLER_LISTING_TABS, SEARCH_RESULT_TABS, } from "./features/products/constants/listing-tabs";
3137
- export type { ListingTab, CategoryTabId, StoreTabId, SellerListingTabId, SearchTabId, } from "./features/products/constants/listing-tabs";
3138
- export { STANDARD_SORT_OPTIONS, STANDARD_PUBLIC_SORT_OPTIONS, AUCTION_SORT_OPTIONS, AUCTION_PUBLIC_SORT_OPTIONS, PREORDER_SORT_OPTIONS, BUNDLE_SORT_OPTIONS, PRIZE_DRAW_SORT_OPTIONS, SORT_OPTIONS_BY_LISTING_TYPE, } from "./features/products/constants/sieve";
3140
+ export { CATEGORY_PAGE_TABS, STORE_PAGE_TABS, SELLER_LISTING_TABS, PRODUCT_TYPE_FILTER_TABS, ART_STICKERS_TYPE_FILTER_TABS, GENERIC_PRODUCT_LISTING_TYPES, ART_STICKERS_LISTING_TYPES, } from "./features/products/constants/listing-tabs";
3141
+ export type { ListingTab, CategoryTabId, StoreTabId, SellerListingTabId, } from "./features/products/constants/listing-tabs";
3142
+ export { STANDARD_SORT_OPTIONS, STANDARD_PUBLIC_SORT_OPTIONS, AUCTION_SORT_OPTIONS, AUCTION_PUBLIC_SORT_OPTIONS, PREORDER_SORT_OPTIONS, PREORDER_PUBLIC_SORT_OPTIONS, BUNDLE_SORT_OPTIONS, PRIZE_DRAW_SORT_OPTIONS, PRIZE_DRAW_PUBLIC_SORT_OPTIONS, } from "./features/products/constants/sieve";
3143
+ export { sortOptionsFor, commonSortOptionsFor, hideDefaultsFor, } from "./_internal/shared/listing-types/_registry";
3144
+ export type { ListingHideDefault } from "./_internal/shared/listing-types/_registry";
3139
3145
  export type { SortOption } from "./features/products/constants/sieve";
3140
3146
  export { ALL_TAB, EMPTY_TAB, ADMIN_PRODUCT_STATUS_TABS, ADMIN_PRODUCT_LISTING_TYPE_TABS, ADMIN_BLOG_STATUS_TABS, ADMIN_USER_STATUS_TABS, ADMIN_USER_ROLE_TABS, ADMIN_STORE_STATUS_TABS, ADMIN_PAYOUT_STATUS_TABS, ADMIN_ORDER_STATUS_TABS, ADMIN_REVIEW_STATUS_TABS, ADMIN_REVIEW_RATING_TABS, ADMIN_BID_STATUS_TABS, ADMIN_CONTACT_STATUS_TABS, ADMIN_NEWSLETTER_STATUS_TABS, ADMIN_EVENT_ENTRY_STATUS_TABS, ADMIN_EVENT_STATUS_TABS, ADMIN_CART_OWNERSHIP_TABS, ADMIN_COUPON_TYPE_TABS, SELLER_PRODUCT_STATUS_TABS, SELLER_AUCTION_STATUS_TABS, SELLER_ORDER_STATUS_TABS, SELLER_OFFER_STATUS_TABS, SELLER_BID_STATUS_TABS, } from "./features/admin/constants/filter-tabs";
3141
3147
  export type { AdminFilterTab } from "./features/admin/constants/filter-tabs";
package/dist/index.js CHANGED
@@ -4583,6 +4583,8 @@ export { COUPON_USAGE_SUBCOLLECTION } from "./features/promotions/index";
4583
4583
  // [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
4584
4584
  // CouponCard - Component for coupon card.
4585
4585
  export { CouponCard } from "./features/promotions/index";
4586
+ // CouponHelpDetails - Expandable "How coupons work" explainer (scoping + stacking rules).
4587
+ export { CouponHelpDetails } from "./features/promotions/index";
4586
4588
  // CouponsIndexListing - Client component for browsing coupons with search/filter/sort.
4587
4589
  export { CouponsIndexListing } from "./features/promotions/index";
4588
4590
  // [SCHEMA]-Schema / data-shape constant â€" Zod validator, default-value object, or Firestore collection/field name constant.
@@ -4649,6 +4651,9 @@ export { useCouponValidate } from "./features/promotions/index";
4649
4651
  // usePromotions - React hook for use promotions.
4650
4652
  export { usePromotions } from "./features/promotions/index";
4651
4653
  // ./features/promotions/server
4654
+ // [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
4655
+ // detectCouponConflict - Coupon stacking rule: one seller coupon per store + one admin coupon per cart.
4656
+ export { detectCouponConflict } from "./features/promotions/server";
4652
4657
  // [DB]-Database layer â€" uses firebase-admin or another server-side DB SDK; can only run in a trusted server environment.
4653
4658
  // getPromotions - Helper for get promotions.
4654
4659
  export { getPromotions } from "./features/promotions/server";
@@ -5534,8 +5539,12 @@ export { LISTING_PARAM_NAMES, parseListingParams, parseListingSearchParams, seri
5534
5539
  // Product features UI option lists (S8 refactor â€" shared by editor + selector)
5535
5540
  export { PRODUCT_FEATURE_CATEGORY_OPTIONS, PRODUCT_FEATURE_PRODUCT_TYPE_OPTIONS, PRODUCT_FEATURE_SCOPE_OPTIONS, PRODUCT_FEATURE_ICON_COLOR_OPTIONS, PRODUCT_FEATURE_SCOPE_TABS, PRODUCT_FEATURE_DEFAULT_DISPLAY_ORDER, PRODUCT_FEATURE_CARD_MAX_VISIBLE, PRODUCT_FEATURE_QUERY_STALE_MS, } from "./features/products/constants/product-features.constants";
5536
5541
  // SB10-A listing tab constants
5537
- export { CATEGORY_PAGE_TABS, STORE_PAGE_TABS, SELLER_LISTING_TABS, SEARCH_RESULT_TABS, } from "./features/products/constants/listing-tabs";
5538
- export { STANDARD_SORT_OPTIONS, STANDARD_PUBLIC_SORT_OPTIONS, AUCTION_SORT_OPTIONS, AUCTION_PUBLIC_SORT_OPTIONS, PREORDER_SORT_OPTIONS, BUNDLE_SORT_OPTIONS, PRIZE_DRAW_SORT_OPTIONS, SORT_OPTIONS_BY_LISTING_TYPE, } from "./features/products/constants/sieve";
5542
+ export { CATEGORY_PAGE_TABS, STORE_PAGE_TABS, SELLER_LISTING_TABS, PRODUCT_TYPE_FILTER_TABS, ART_STICKERS_TYPE_FILTER_TABS, GENERIC_PRODUCT_LISTING_TYPES, ART_STICKERS_LISTING_TYPES, } from "./features/products/constants/listing-tabs";
5543
+ export { STANDARD_SORT_OPTIONS, STANDARD_PUBLIC_SORT_OPTIONS, AUCTION_SORT_OPTIONS, AUCTION_PUBLIC_SORT_OPTIONS, PREORDER_SORT_OPTIONS, PREORDER_PUBLIC_SORT_OPTIONS, BUNDLE_SORT_OPTIONS, PRIZE_DRAW_SORT_OPTIONS, PRIZE_DRAW_PUBLIC_SORT_OPTIONS, } from "./features/products/constants/sieve";
5544
+ // The per-type sort lookup is DERIVED from the listing-type plugin registry
5545
+ // (it used to be a hand-written map here that was missing five of the nine
5546
+ // types and still listed the long-dead `bundle` listingType).
5547
+ export { sortOptionsFor, commonSortOptionsFor, hideDefaultsFor, } from "./_internal/shared/listing-types/_registry";
5539
5548
  // SB10-C admin + seller filter-chip tab sets (S8 2026-05-13)
5540
5549
  export { ALL_TAB, EMPTY_TAB, ADMIN_PRODUCT_STATUS_TABS, ADMIN_PRODUCT_LISTING_TYPE_TABS, ADMIN_BLOG_STATUS_TABS, ADMIN_USER_STATUS_TABS, ADMIN_USER_ROLE_TABS, ADMIN_STORE_STATUS_TABS, ADMIN_PAYOUT_STATUS_TABS, ADMIN_ORDER_STATUS_TABS, ADMIN_REVIEW_STATUS_TABS, ADMIN_REVIEW_RATING_TABS, ADMIN_BID_STATUS_TABS, ADMIN_CONTACT_STATUS_TABS, ADMIN_NEWSLETTER_STATUS_TABS, ADMIN_EVENT_ENTRY_STATUS_TABS, ADMIN_EVENT_STATUS_TABS, ADMIN_CART_OWNERSHIP_TABS, ADMIN_COUPON_TYPE_TABS, SELLER_PRODUCT_STATUS_TABS, SELLER_AUCTION_STATUS_TABS, SELLER_ORDER_STATUS_TABS, SELLER_OFFER_STATUS_TABS, SELLER_BID_STATUS_TABS, } from "./features/admin/constants/filter-tabs";
5541
5550
  // Grouped listings feature schemas
@@ -44,6 +44,7 @@ export declare const DEFAULT_ROUTE_MAP: {
44
44
  readonly STORE_CLASSIFIEDS: (storeSlug: string) => string;
45
45
  readonly STORE_DIGITAL_CODES: (storeSlug: string) => string;
46
46
  readonly STORE_LIVE: (storeSlug: string) => string;
47
+ readonly STORE_ART: (storeSlug: string) => string;
47
48
  readonly CATEGORIES: "/categories";
48
49
  readonly CATEGORY_DETAIL: (slug: string) => string;
49
50
  readonly BRANDS: "/brands";
@@ -415,6 +416,7 @@ export declare const ROUTES: {
415
416
  readonly STORE_CLASSIFIEDS: (storeSlug: string) => string;
416
417
  readonly STORE_DIGITAL_CODES: (storeSlug: string) => string;
417
418
  readonly STORE_LIVE: (storeSlug: string) => string;
419
+ readonly STORE_ART: (storeSlug: string) => string;
418
420
  readonly CATEGORIES: "/categories";
419
421
  readonly CATEGORY_DETAIL: (slug: string) => string;
420
422
  readonly BRANDS: "/brands";
@@ -33,6 +33,11 @@ export const DEFAULT_ROUTE_MAP = {
33
33
  STORE_CLASSIFIEDS: (storeSlug) => `/stores/${storeSlug}/classified`,
34
34
  STORE_DIGITAL_CODES: (storeSlug) => `/stores/${storeSlug}/digital-codes`,
35
35
  STORE_LIVE: (storeSlug) => `/stores/${storeSlug}/live`,
36
+ // Combined art + stickers, mirroring the public /art page. The store's
37
+ // "Art & Stickers" tab used to point at STORE_PRODUCTS, which filters to
38
+ // `standard` — so the tab showed a real non-zero count and then landed on
39
+ // a page containing none of those items.
40
+ STORE_ART: (storeSlug) => `/stores/${storeSlug}/art`,
36
41
  CATEGORIES: "/categories",
37
42
  CATEGORY_DETAIL: (slug) => `/categories/${slug}`,
38
43
  BRANDS: "/brands",
@@ -1,3 +1,4 @@
1
+ import type { ListingType } from "../../features/products/types/index";
1
2
  /**
2
3
  * W1-43 — useListingTypeFlags
3
4
  *
@@ -8,25 +9,17 @@
8
9
  * Defaults to all-enabled when settings haven't loaded yet — match the
9
10
  * permissive default used by `DEFAULT_SITE_SETTINGS_DATA` so first paint
10
11
  * doesn't briefly hide enabled features.
12
+ *
13
+ * KEYED ON THE UNION, NOT A HAND-WRITTEN LIST (2026-08-21). Both types below
14
+ * used to enumerate seven types by hand and had never been updated for `art`
15
+ * and `stickers` — so `isEnabled("art")` didn't even typecheck, and the seller
16
+ * TypeDropdown (its main consumer) could not offer either type. Deriving from
17
+ * `ListingType` makes a missing member a compile error, matching the same
18
+ * decision made for `ALL_LISTING_TYPES_MAP` in `feature-flags.ts`.
11
19
  */
12
- export type ListingTypeFlagsShape = Partial<{
13
- standard: boolean;
14
- auction: boolean;
15
- "pre-order": boolean;
16
- "prize-draw": boolean;
17
- classified: boolean;
18
- "digital-code": boolean;
19
- live: boolean;
20
- }>;
21
- export interface ListingTypeFlags {
22
- standard: boolean;
23
- auction: boolean;
24
- "pre-order": boolean;
25
- "prize-draw": boolean;
26
- classified: boolean;
27
- "digital-code": boolean;
28
- live: boolean;
20
+ export type ListingTypeFlagsShape = Partial<Record<ListingType, boolean>>;
21
+ export type ListingTypeFlags = Record<ListingType, boolean> & {
29
22
  /** True when the listing type is enabled (or the setting hasn't loaded yet). */
30
- isEnabled: (type: "standard" | "auction" | "pre-order" | "prize-draw" | "classified" | "digital-code" | "live") => boolean;
31
- }
23
+ isEnabled: (type: ListingType) => boolean;
24
+ };
32
25
  export declare function useListingTypeFlags(): ListingTypeFlags;
@@ -1,17 +1,12 @@
1
1
  "use client";
2
2
  import { useSiteSettings } from "../../core/hooks/useSiteSettings";
3
+ import { ALL_LISTING_TYPES } from "../../_internal/shared/listing-types/feature-flags";
3
4
  export function useListingTypeFlags() {
4
5
  const { data } = useSiteSettings();
5
6
  const lt = data?.featureFlags?.listingTypes;
6
- const flags = {
7
- standard: lt?.standard !== false,
8
- auction: lt?.auction !== false,
9
- "pre-order": lt?.["pre-order"] !== false,
10
- "prize-draw": lt?.["prize-draw"] !== false,
11
- classified: lt?.classified !== false,
12
- "digital-code": lt?.["digital-code"] !== false,
13
- live: lt?.live !== false,
14
- };
7
+ // A type is disabled only when EXPLICITLY set to false — a missing flag (or
8
+ // settings that haven't loaded) means enabled.
9
+ const flags = Object.fromEntries(ALL_LISTING_TYPES.map((type) => [type, lt?.[type] !== false]));
15
10
  return {
16
11
  ...flags,
17
12
  isEnabled: (type) => flags[type],
@@ -1389,10 +1389,8 @@ export declare const SCHEMAS: {
1389
1389
  excludeProducts: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
1390
1390
  excludeCategories: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
1391
1391
  firstTimeUserOnly: import("zod").ZodBoolean;
1392
- combineWithSellerCoupons: import("zod").ZodBoolean;
1393
1392
  }, "strip", import("zod").ZodTypeAny, {
1394
1393
  firstTimeUserOnly: boolean;
1395
- combineWithSellerCoupons: boolean;
1396
1394
  applicableProducts?: string[] | undefined;
1397
1395
  applicableCategories?: string[] | undefined;
1398
1396
  applicableSellers?: string[] | undefined;
@@ -1400,7 +1398,6 @@ export declare const SCHEMAS: {
1400
1398
  excludeCategories?: string[] | undefined;
1401
1399
  }, {
1402
1400
  firstTimeUserOnly: boolean;
1403
- combineWithSellerCoupons: boolean;
1404
1401
  applicableProducts?: string[] | undefined;
1405
1402
  applicableCategories?: string[] | undefined;
1406
1403
  applicableSellers?: string[] | undefined;
@@ -1418,7 +1415,6 @@ export declare const SCHEMAS: {
1418
1415
  };
1419
1416
  restrictions: {
1420
1417
  firstTimeUserOnly: boolean;
1421
- combineWithSellerCoupons: boolean;
1422
1418
  applicableProducts?: string[] | undefined;
1423
1419
  applicableCategories?: string[] | undefined;
1424
1420
  applicableSellers?: string[] | undefined;
@@ -1438,7 +1434,6 @@ export declare const SCHEMAS: {
1438
1434
  };
1439
1435
  restrictions: {
1440
1436
  firstTimeUserOnly: boolean;
1441
- combineWithSellerCoupons: boolean;
1442
1437
  applicableProducts?: string[] | undefined;
1443
1438
  applicableCategories?: string[] | undefined;
1444
1439
  applicableSellers?: string[] | undefined;
@@ -1499,7 +1494,6 @@ export declare const SCHEMAS: {
1499
1494
  };
1500
1495
  restrictions: {
1501
1496
  firstTimeUserOnly: boolean;
1502
- combineWithSellerCoupons: boolean;
1503
1497
  applicableProducts?: string[] | undefined;
1504
1498
  applicableCategories?: string[] | undefined;
1505
1499
  applicableSellers?: string[] | undefined;
@@ -1540,7 +1534,6 @@ export declare const SCHEMAS: {
1540
1534
  };
1541
1535
  restrictions: {
1542
1536
  firstTimeUserOnly: boolean;
1543
- combineWithSellerCoupons: boolean;
1544
1537
  applicableProducts?: string[] | undefined;
1545
1538
  applicableCategories?: string[] | undefined;
1546
1539
  applicableSellers?: string[] | undefined;
@@ -1812,10 +1805,8 @@ export declare const SCHEMAS: {
1812
1805
  excludeProducts: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
1813
1806
  excludeCategories: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
1814
1807
  firstTimeUserOnly: import("zod").ZodBoolean;
1815
- combineWithSellerCoupons: import("zod").ZodBoolean;
1816
1808
  }, "strip", import("zod").ZodTypeAny, {
1817
1809
  firstTimeUserOnly: boolean;
1818
- combineWithSellerCoupons: boolean;
1819
1810
  applicableProducts?: string[] | undefined;
1820
1811
  applicableCategories?: string[] | undefined;
1821
1812
  applicableSellers?: string[] | undefined;
@@ -1823,7 +1814,6 @@ export declare const SCHEMAS: {
1823
1814
  excludeCategories?: string[] | undefined;
1824
1815
  }, {
1825
1816
  firstTimeUserOnly: boolean;
1826
- combineWithSellerCoupons: boolean;
1827
1817
  applicableProducts?: string[] | undefined;
1828
1818
  applicableCategories?: string[] | undefined;
1829
1819
  applicableSellers?: string[] | undefined;
@@ -1884,7 +1874,6 @@ export declare const SCHEMAS: {
1884
1874
  };
1885
1875
  restrictions: {
1886
1876
  firstTimeUserOnly: boolean;
1887
- combineWithSellerCoupons: boolean;
1888
1877
  applicableProducts?: string[] | undefined;
1889
1878
  applicableCategories?: string[] | undefined;
1890
1879
  applicableSellers?: string[] | undefined;
@@ -1943,7 +1932,6 @@ export declare const SCHEMAS: {
1943
1932
  };
1944
1933
  restrictions: {
1945
1934
  firstTimeUserOnly: boolean;
1946
- combineWithSellerCoupons: boolean;
1947
1935
  applicableProducts?: string[] | undefined;
1948
1936
  applicableCategories?: string[] | undefined;
1949
1937
  applicableSellers?: string[] | undefined;
@@ -30,7 +30,7 @@ export const claimedCouponsSeedData = [
30
30
  type: "percentage",
31
31
  scope: "admin",
32
32
  discount: { value: 10, maxDiscount: 500, minPurchase: 999 },
33
- restrictions: { firstTimeUserOnly: true, combineWithSellerCoupons: false },
33
+ restrictions: { firstTimeUserOnly: true },
34
34
  },
35
35
  status: "active",
36
36
  expiresAt: daysAhead(14),
@@ -51,7 +51,7 @@ export const claimedCouponsSeedData = [
51
51
  type: "fixed",
52
52
  scope: "admin",
53
53
  discount: { value: 500, minPurchase: 5000 },
54
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
54
+ restrictions: { firstTimeUserOnly: false },
55
55
  },
56
56
  status: "expired",
57
57
  expiresAt: daysAgo(5),
@@ -72,7 +72,7 @@ export const claimedCouponsSeedData = [
72
72
  type: "free_shipping",
73
73
  scope: "admin",
74
74
  discount: { value: 0, minPurchase: 499 },
75
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
75
+ restrictions: { firstTimeUserOnly: false },
76
76
  },
77
77
  status: "used",
78
78
  expiresAt: daysAhead(60),
@@ -28,7 +28,7 @@ export const couponsSeedData = [
28
28
  discount: { value: 10, maxDiscount: 200, minPurchase: 500 },
29
29
  usage: { totalLimit: undefined, perUserLimit: 1, currentUsage: 312 },
30
30
  validity: { startDate: daysAgo(90), endDate: daysAhead(180), isActive: true },
31
- restrictions: { firstTimeUserOnly: true, combineWithSellerCoupons: true },
31
+ restrictions: { firstTimeUserOnly: true },
32
32
  createdBy: "user-admin-letitrip",
33
33
  createdAt: daysAgo(90),
34
34
  updatedAt: daysAgo(5),
@@ -44,7 +44,7 @@ export const couponsSeedData = [
44
44
  discount: { value: 500, maxDiscount: 500, minPurchase: 2000 },
45
45
  usage: { totalLimit: 500, perUserLimit: 2, currentUsage: 187 },
46
46
  validity: { startDate: daysAgo(30), endDate: daysAhead(60), isActive: true },
47
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
47
+ restrictions: { firstTimeUserOnly: false },
48
48
  createdBy: "user-admin-letitrip",
49
49
  createdAt: daysAgo(30),
50
50
  updatedAt: daysAgo(3),
@@ -60,7 +60,7 @@ export const couponsSeedData = [
60
60
  discount: { value: 0, maxDiscount: 0, minPurchase: 499 },
61
61
  usage: { totalLimit: undefined, perUserLimit: 5, currentUsage: 1024 },
62
62
  validity: { startDate: daysAgo(60), endDate: daysAhead(120), isActive: true },
63
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
63
+ restrictions: { firstTimeUserOnly: false },
64
64
  createdBy: "user-admin-letitrip",
65
65
  createdAt: daysAgo(60),
66
66
  updatedAt: daysAgo(1),
@@ -76,7 +76,7 @@ export const couponsSeedData = [
76
76
  discount: { value: 20, maxDiscount: 400, minPurchase: 1000 },
77
77
  usage: { totalLimit: undefined, perUserLimit: 1, currentUsage: 89 },
78
78
  validity: { startDate: daysAgo(14), endDate: daysAhead(90), isActive: true },
79
- restrictions: { firstTimeUserOnly: true, combineWithSellerCoupons: false },
79
+ restrictions: { firstTimeUserOnly: true },
80
80
  createdBy: "user-admin-letitrip",
81
81
  createdAt: daysAgo(14),
82
82
  updatedAt: daysAgo(2),
@@ -92,7 +92,7 @@ export const couponsSeedData = [
92
92
  discount: { value: 200, maxDiscount: 200, minPurchase: 1000 },
93
93
  usage: { totalLimit: 1000, perUserLimit: 3, currentUsage: 456 },
94
94
  validity: { startDate: daysAgo(45), endDate: daysAhead(45), isActive: true },
95
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
95
+ restrictions: { firstTimeUserOnly: false },
96
96
  createdBy: "user-admin-letitrip",
97
97
  createdAt: daysAgo(45),
98
98
  updatedAt: daysAgo(1),
@@ -110,7 +110,7 @@ export const couponsSeedData = [
110
110
  discount: { value: 25, maxDiscount: 500, minPurchase: 1000 },
111
111
  usage: { totalLimit: 200, perUserLimit: 2, currentUsage: 67 },
112
112
  validity: { startDate: daysAgo(20), endDate: daysAhead(40), isActive: true },
113
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: false },
113
+ restrictions: { firstTimeUserOnly: false },
114
114
  createdBy: "user-tyson-blader",
115
115
  createdAt: daysAgo(20),
116
116
  updatedAt: daysAgo(4),
@@ -130,7 +130,6 @@ export const couponsSeedData = [
130
130
  restrictions: {
131
131
  applicableCategories: ["category-beyblade-original", "category-beyblade-metal"],
132
132
  firstTimeUserOnly: false,
133
- combineWithSellerCoupons: false,
134
133
  },
135
134
  createdBy: "user-tyson-blader",
136
135
  createdAt: daysAgo(10),
@@ -153,7 +152,7 @@ export const couponsSeedData = [
153
152
  },
154
153
  usage: { totalLimit: 100, perUserLimit: 3, currentUsage: 34 },
155
154
  validity: { startDate: daysAgo(15), endDate: daysAhead(45), isActive: true },
156
- restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: false },
155
+ restrictions: { firstTimeUserOnly: false },
157
156
  createdBy: "user-tyson-blader",
158
157
  createdAt: daysAgo(15),
159
158
  updatedAt: daysAgo(2),
@@ -173,7 +172,6 @@ export const couponsSeedData = [
173
172
  restrictions: {
174
173
  applicableCategories: ["category-beyblade-burst", "category-beyblade-x"],
175
174
  firstTimeUserOnly: false,
176
- combineWithSellerCoupons: false,
177
175
  },
178
176
  createdBy: "user-tyson-blader",
179
177
  createdAt: daysAgo(7),
@@ -194,11 +192,32 @@ export const couponsSeedData = [
194
192
  restrictions: {
195
193
  applicableCategories: ["bundle-original-collectors-set", "bundle-metal-fusion-duo", "bundle-burst-battlers-pack", "bundle-x-series-starter"],
196
194
  firstTimeUserOnly: false,
197
- combineWithSellerCoupons: false,
198
195
  },
199
196
  createdBy: "user-tyson-blader",
200
197
  createdAt: daysAgo(5),
201
198
  updatedAt: daysAgo(1),
202
199
  stats: { totalUses: 19, totalRevenue: 95000, totalDiscount: 11400 },
203
200
  },
201
+ // ── Seller coupon (LetItRip Official) ──────────────────────────────────────
202
+ // Deliberately on a SECOND store: every other seller coupon above belongs to
203
+ // store-beyblade-arena, so without this one the "one coupon per store, plus
204
+ // one platform-wide coupon" stacking rule could never be demonstrated on a
205
+ // real multi-store cart.
206
+ {
207
+ id: "coupon-official10",
208
+ code: "OFFICIAL10",
209
+ name: "LetItRip Official — 10% Off",
210
+ description: "10% off anything from the LetItRip Official store. Stacks with other stores' coupons and with a platform-wide coupon.",
211
+ type: COUPON_FIELDS.TYPE_VALUES.PERCENTAGE,
212
+ scope: COUPON_FIELDS.SCOPE_VALUES.SELLER,
213
+ storeId: "store-letitrip-official",
214
+ discount: { value: 10, maxDiscount: 300, minPurchase: 500 },
215
+ usage: { totalLimit: 300, perUserLimit: 2, currentUsage: 41 },
216
+ validity: { startDate: daysAgo(15), endDate: daysAhead(45), isActive: true },
217
+ restrictions: { firstTimeUserOnly: false },
218
+ createdBy: "user-admin-letitrip",
219
+ createdAt: daysAgo(15),
220
+ updatedAt: daysAgo(2),
221
+ stats: { totalUses: 41, totalRevenue: 205000, totalDiscount: 20500 },
222
+ },
204
223
  ];
@@ -256,7 +256,7 @@ export const faqSeedData = [
256
256
  {
257
257
  id: "faq-free-shipping-available",
258
258
  question: "Is free shipping available?",
259
- answer: html(`<p>Many sellers offer free shipping on orders above a certain amount. Look for the "Free Shipping" badge on product listings. You can also use the FREESHIP999 coupon for free shipping on orders ₹999+.</p>`),
259
+ answer: html(`<p>Many sellers offer free shipping on orders above a certain amount. Look for the "Free Shipping" badge on product listings. You can also use the FREESHIP499 coupon for free shipping on orders ₹499+.</p>`),
260
260
  category: "shipping_delivery",
261
261
  showOnHomepage: true,
262
262
  showInFooter: false,
@@ -543,7 +543,7 @@ export const faqSeedData = [
543
543
  {
544
544
  id: "faq-coupons-and-discounts",
545
545
  question: "How do I use coupons and discount codes?",
546
- answer: html(`<p>Enter your coupon code at checkout in the "Apply Coupon" field. Coupons may be platform-wide (from LetItRip) or store-specific (from individual sellers). Some coupons have minimum order requirements, expiry dates, or per-user limits. You cannot stack multiple coupons on a single order unless the coupon explicitly allows it.</p>`),
546
+ answer: html(`<p>Enter your coupon code at checkout in the "Apply Coupon" field. Coupons are either <strong>store coupons</strong> (issued by an individual seller) or <strong>platform-wide coupons</strong> (issued by LetItRip).</p><p><strong>Coupons stack.</strong> You can apply <strong>one coupon per store</strong> — so a cart with items from three stores can carry all three of those stores' coupons at once — <strong>plus one platform-wide coupon</strong> on top. A second coupon for the same store, or a second platform-wide coupon, is declined; remove the first one to swap it.</p><p>A store coupon only discounts that store's items. A platform-wide coupon is spread proportionally across every store in your cart. Because orders are placed per store, each store's order shows its own share of the discount.</p><p>Coupons may also have a minimum order value (measured against the items the coupon actually covers, not your whole cart), an expiry date, a per-user limit, or a total limit across all buyers. Coupons are re-checked when you place the order if one expired or ran out while it sat in your cart, it is removed and your total is recalculated before payment.</p>`),
547
547
  category: "orders_payment",
548
548
  showOnHomepage: false,
549
549
  showInFooter: false,
@@ -51,7 +51,7 @@ import { offersSeedData } from "./offers-seed-data";
51
51
  import { couponUsageSeedData } from "./coupon-usage-seed-data";
52
52
  import { claimedCouponsSeedData } from "./claimed-coupons-seed-data";
53
53
  // Tester sandbox seed fixtures live in ../features/tester/seed-data (isolated on purpose).
54
- import { testerChecklistSeedData, storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData, blogTesterSeedData, eventsTesterSeedData, couponsTesterSeedData, bidsTesterSeedData, ordersTesterSeedData, } from "../features/tester/seed-data";
54
+ import { testerChecklistSeedData, storesTesterSeedData, categoriesTesterSeedData, productsTesterSeedData, blogTesterSeedData, eventsTesterSeedData, couponsTesterSeedData, bidsTesterSeedData, ordersTesterSeedData, offersTesterSeedData, } from "../features/tester/seed-data";
55
55
  function asArr(items) {
56
56
  return items ?? [];
57
57
  }
@@ -199,7 +199,7 @@ export const SEED_MANIFEST = {
199
199
  ...f,
200
200
  name: f.label ?? f.id,
201
201
  }))),
202
- offers: pick(asArr(offersSeedData).map((o) => ({
202
+ offers: pick([...asArr(offersSeedData), ...asArr(offersTesterSeedData)].map((o) => ({
203
203
  ...o,
204
204
  name: o.productTitle ?? o.id,
205
205
  }))),
@@ -119,4 +119,56 @@ for (let i = 0; i < 65; i++) {
119
119
  updatedAt: daysAgo(daysAgoCreated - 1),
120
120
  });
121
121
  }
122
+ /**
123
+ * A deliberately deep review list on ONE product, so the paginated reviews tab is
124
+ * actually exercisable.
125
+ *
126
+ * The round-robin above spreads 65 reviews across 14 products — 4-5 each, which is
127
+ * below the 10-per-page detail-page size, so pagination could never appear on a product
128
+ * page and the tester checklist cases for it would be untestable. This block pushes
129
+ * "Beyblade Original Dranzer S" to 5 + 14 = 19 approved reviews (2 pages), and spreads
130
+ * ratings across all five stars so the rating filter and the average/distribution
131
+ * summary have something real to act on.
132
+ *
133
+ * Ids and every field are derived from the loop index — no Math.random(), no Date.now()
134
+ * in an id — so `appkit-seed load` stays idempotent (Recurrent Root Cause #25).
135
+ */
136
+ const DEEP_REVIEW_PRODUCT = {
137
+ id: "product-beyblade-original-dranzer-s",
138
+ title: "Beyblade Original Dranzer S",
139
+ store: "store-beyblade-arena",
140
+ };
141
+ for (let i = 0; i < 14; i++) {
142
+ const template = reviewTemplates[i % reviewTemplates.length];
143
+ const buyer = buyers[i % buyers.length];
144
+ // 1..5, cycling — guarantees every star bucket is populated for the rating filter.
145
+ const rating = (i % 5) + 1;
146
+ // Distinct from the main loop's 90-i range so the two sets interleave predictably
147
+ // and "newest first" is verifiable by eye.
148
+ const daysAgoCreated = 28 - i;
149
+ const hasImage = i % 4 === 0;
150
+ _rawReviewsSeedData.push({
151
+ id: `review-dranzer-deep-${i + 1}`,
152
+ productId: DEEP_REVIEW_PRODUCT.id,
153
+ productTitle: DEEP_REVIEW_PRODUCT.title,
154
+ storeId: DEEP_REVIEW_PRODUCT.store,
155
+ userId: buyer.id,
156
+ userName: buyer.name,
157
+ rating,
158
+ title: `${template.title} (${rating}★)`,
159
+ comment: template.comment,
160
+ images: hasImage
161
+ ? [
162
+ seedExtMedia(`https://picsum.photos/seed/review-image-dranzer-deep-${i + 1}/800/800`),
163
+ ]
164
+ : [],
165
+ hasImages: hasImage,
166
+ verified: i % 3 !== 2,
167
+ status: "approved",
168
+ helpfulCount: (i * 3) % 17,
169
+ reportCount: 0,
170
+ createdAt: daysAgo(daysAgoCreated),
171
+ updatedAt: daysAgo(daysAgoCreated),
172
+ });
173
+ }
122
174
  export const reviewsSeedData = _rawReviewsSeedData;
@@ -44,6 +44,7 @@ export { StoreBundlesPageView } from "./features/stores/components/StoreBundlesP
44
44
  export { StoreClassifiedsPageView } from "./features/stores/components/StoreClassifiedsPageView";
45
45
  export { StoreDigitalCodesPageView } from "./features/stores/components/StoreDigitalCodesPageView";
46
46
  export { StoreLiveItemsPageView } from "./features/stores/components/StoreLiveItemsPageView";
47
+ export { StoreArtStickersPageView } from "./features/stores/components/StoreArtStickersPageView";
47
48
  export { getProductForDetail, listSitemapProducts, type SitemapProduct, } from "./_internal/server/features/products/index";
48
49
  export { listPublicProducts, parsePublicProductParams, PUBLIC_PRODUCT_MAX_PAGE_SIZE, type PublicProductListInput, type PublicProductListResult, type PublicProductListOptions, type PublicProductExecutor, type PublicProductQuery, } from "./_internal/server/features/products/index";
49
50
  export { getAuctionForDetail, getProductFeaturesForAuction, } from "./_internal/server/features/auctions/index";
@@ -49,6 +49,7 @@ export { StoreBundlesPageView } from "./features/stores/components/StoreBundlesP
49
49
  export { StoreClassifiedsPageView } from "./features/stores/components/StoreClassifiedsPageView";
50
50
  export { StoreDigitalCodesPageView } from "./features/stores/components/StoreDigitalCodesPageView";
51
51
  export { StoreLiveItemsPageView } from "./features/stores/components/StoreLiveItemsPageView";
52
+ export { StoreArtStickersPageView } from "./features/stores/components/StoreArtStickersPageView";
52
53
  // S2: products data layer — deduped via React.cache()
53
54
  export { getProductForDetail, listSitemapProducts, } from "./_internal/server/features/products/index";
54
55
  export { listPublicProducts, parsePublicProductParams, PUBLIC_PRODUCT_MAX_PAGE_SIZE, } from "./_internal/server/features/products/index";