@mohasinac/appkit 4.9.5 → 4.11.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 (395) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.d.ts +6 -1
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +4 -1
  3. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +1 -1
  4. package/dist/_internal/client/features/lottery/LotteryPullForm.js +2 -2
  5. package/dist/_internal/server/features/admin/daily-digest-actions.d.ts +18 -0
  6. package/dist/_internal/server/features/admin/daily-digest-actions.js +37 -0
  7. package/dist/_internal/server/features/auctions/actions.js +3 -2
  8. package/dist/_internal/server/features/auctions/service.d.ts +4 -3
  9. package/dist/_internal/server/features/auctions/service.js +6 -6
  10. package/dist/_internal/server/features/audit-log/actions.d.ts +25 -0
  11. package/dist/_internal/server/features/audit-log/actions.js +38 -0
  12. package/dist/_internal/server/features/brands/actions.js +0 -2
  13. package/dist/_internal/server/features/brands/og.d.ts +4 -1
  14. package/dist/_internal/server/features/brands/og.js +1 -1
  15. package/dist/_internal/server/features/bundles/data.d.ts +9 -0
  16. package/dist/_internal/server/features/bundles/data.js +14 -0
  17. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  18. package/dist/_internal/server/features/bundles/index.js +1 -1
  19. package/dist/_internal/server/features/catalogue/og.d.ts +20 -0
  20. package/dist/_internal/server/features/catalogue/og.js +27 -0
  21. package/dist/_internal/server/features/grouped/data.d.ts +16 -0
  22. package/dist/_internal/server/features/grouped/data.js +50 -1
  23. package/dist/_internal/server/features/grouped/index.d.ts +1 -1
  24. package/dist/_internal/server/features/grouped/index.js +1 -1
  25. package/dist/_internal/server/features/orders/actions.js +9 -0
  26. package/dist/_internal/server/features/orders/adapters.js +25 -0
  27. package/dist/_internal/server/features/products/data.d.ts +23 -0
  28. package/dist/_internal/server/features/products/data.js +159 -0
  29. package/dist/_internal/server/features/products/index.d.ts +1 -1
  30. package/dist/_internal/server/features/products/index.js +1 -1
  31. package/dist/_internal/server/functions/scheduled.d.ts +3 -1
  32. package/dist/_internal/server/functions/scheduled.js +17 -1
  33. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +40 -0
  34. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +164 -0
  35. package/dist/_internal/server/jobs/core/hardBanCascade.js +11 -0
  36. package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +1 -0
  37. package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +4 -1
  38. package/dist/_internal/server/jobs/core/testerSandboxRefresh.d.ts +12 -0
  39. package/dist/_internal/server/jobs/core/testerSandboxRefresh.js +85 -0
  40. package/dist/_internal/server/jobs/core/whatsappNotify.js +16 -0
  41. package/dist/_internal/server/jobs/handlers/dailyStatusDigest.d.ts +2 -0
  42. package/dist/_internal/server/jobs/handlers/dailyStatusDigest.js +4 -0
  43. package/dist/_internal/server/jobs/handlers/index.d.ts +2 -0
  44. package/dist/_internal/server/jobs/handlers/index.js +3 -0
  45. package/dist/_internal/server/jobs/handlers/testerSandboxRefresh.d.ts +2 -0
  46. package/dist/_internal/server/jobs/handlers/testerSandboxRefresh.js +2 -0
  47. package/dist/_internal/server/notifications/channel-health.d.ts +27 -0
  48. package/dist/_internal/server/notifications/channel-health.js +101 -0
  49. package/dist/_internal/shared/features/auctions/config.d.ts +20 -0
  50. package/dist/_internal/shared/features/auctions/config.js +31 -1
  51. package/dist/_internal/shared/features/brands/schema.d.ts +0 -6
  52. package/dist/_internal/shared/features/brands/schema.js +0 -1
  53. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +7 -0
  54. package/dist/_internal/shared/features/categories/bundle-schemas.js +3 -0
  55. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  56. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -1
  57. package/dist/_internal/shared/listing-types/art/config.js +1 -1
  58. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -1
  59. package/dist/_internal/shared/listing-types/classified/config.js +1 -1
  60. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -1
  61. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -1
  62. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -1
  63. package/dist/_internal/shared/listing-types/live/config.js +1 -1
  64. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -1
  65. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -1
  66. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -1
  67. package/dist/_internal/shared/listing-types/stickers/config.js +1 -1
  68. package/dist/client.d.ts +21 -12
  69. package/dist/client.js +14 -7
  70. package/dist/constants/api-endpoints.d.ts +9 -9
  71. package/dist/constants/api-endpoints.js +3 -3
  72. package/dist/contracts/client-auth.d.ts +3 -7
  73. package/dist/contracts/email.d.ts +1 -0
  74. package/dist/features/account/components/AddressForm.js +24 -2
  75. package/dist/features/account/components/BecomeSellerView.d.ts +1 -2
  76. package/dist/features/account/components/BecomeSellerView.js +1 -1
  77. package/dist/features/account/components/NotificationBell.js +1 -1
  78. package/dist/features/account/components/UserBidsView.d.ts +1 -0
  79. package/dist/features/account/components/UserBidsView.js +47 -0
  80. package/dist/features/account/components/UserOrdersView.d.ts +4 -11
  81. package/dist/features/account/components/UserOrdersView.js +54 -4
  82. package/dist/features/account/components/UserReturnsView.d.ts +4 -9
  83. package/dist/features/account/components/UserReturnsView.js +37 -3
  84. package/dist/features/account/components/index.d.ts +3 -2
  85. package/dist/features/account/components/index.js +1 -0
  86. package/dist/features/admin/actions/admin-actions.js +22 -0
  87. package/dist/features/admin/actions/admin-coupon-actions.js +10 -0
  88. package/dist/features/admin/actions/notification-actions.js +4 -3
  89. package/dist/features/admin/components/AdminAdsView.d.ts +2 -3
  90. package/dist/features/admin/components/AdminAdsView.js +86 -89
  91. package/dist/features/admin/components/AdminAllEventEntriesView.js +18 -3
  92. package/dist/features/admin/components/AdminAuditLogView.d.ts +11 -0
  93. package/dist/features/admin/components/AdminAuditLogView.js +95 -0
  94. package/dist/features/admin/components/AdminBlogEditorView.js +37 -3
  95. package/dist/features/admin/components/AdminBrandEditorView.js +10 -6
  96. package/dist/features/admin/components/AdminBundleEditorView.js +18 -2
  97. package/dist/features/admin/components/AdminCarouselEditorView.js +2 -2
  98. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +2 -2
  99. package/dist/features/admin/components/AdminCartsView.js +34 -4
  100. package/dist/features/admin/components/AdminCategoryEditorView.js +5 -4
  101. package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
  102. package/dist/features/admin/components/AdminFaqEditorView.js +2 -2
  103. package/dist/features/admin/components/AdminHistoryView.js +11 -1
  104. package/dist/features/admin/components/AdminNotificationsView.js +27 -1
  105. package/dist/features/admin/components/AdminOrderEditorView.d.ts +10 -1
  106. package/dist/features/admin/components/AdminOrderEditorView.js +4 -3
  107. package/dist/features/admin/components/AdminOrdersView.js +92 -24
  108. package/dist/features/admin/components/AdminPayoutMarkPaidModal.d.ts +7 -0
  109. package/dist/features/admin/components/AdminPayoutMarkPaidModal.js +47 -0
  110. package/dist/features/admin/components/AdminPayoutsView.js +15 -31
  111. package/dist/features/admin/components/AdminProductEditorView.js +26 -3
  112. package/dist/features/admin/components/AdminSiteSettingsView.js +31 -4
  113. package/dist/features/admin/components/AdminStoreAddressesView.js +22 -2
  114. package/dist/features/admin/components/AdminStoresView.js +7 -0
  115. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +2 -2
  116. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +2 -2
  117. package/dist/features/admin/components/AdminUserEditorView.d.ts +2 -2
  118. package/dist/features/admin/components/AdminUserEditorView.js +4 -2
  119. package/dist/features/admin/components/AdminUsersView.js +1 -1
  120. package/dist/features/admin/components/AdminWishlistsView.js +14 -1
  121. package/dist/features/admin/components/DataListingView.d.ts +2 -2
  122. package/dist/features/admin/components/ViewAuditLogEntryModal.d.ts +19 -0
  123. package/dist/features/admin/components/ViewAuditLogEntryModal.js +22 -0
  124. package/dist/features/admin/components/ViewNotificationModal.d.ts +21 -0
  125. package/dist/features/admin/components/ViewNotificationModal.js +15 -0
  126. package/dist/features/admin/components/analytics/AdminPageViewsReportView.d.ts +4 -7
  127. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +56 -36
  128. package/dist/features/admin/components/index.d.ts +8 -1
  129. package/dist/features/admin/components/index.js +4 -0
  130. package/dist/features/admin/constants/filter-tabs.d.ts +49 -0
  131. package/dist/features/admin/constants/filter-tabs.js +27 -0
  132. package/dist/features/admin/hooks/useAdminListing.d.ts +6 -0
  133. package/dist/features/admin/hooks/useAdminListing.js +3 -1
  134. package/dist/features/admin/hooks/useAdminListingData.d.ts +9 -1
  135. package/dist/features/admin/hooks/useAdminListingData.js +9 -2
  136. package/dist/features/admin/repository/site-settings.repository.d.ts +5 -0
  137. package/dist/features/admin/schemas/firestore.d.ts +21 -0
  138. package/dist/features/admin/schemas/firestore.js +6 -0
  139. package/dist/features/analytics/types.d.ts +1 -1
  140. package/dist/features/analytics/types.js +8 -0
  141. package/dist/features/auctions/actions/bid-actions.js +4 -1
  142. package/dist/features/auctions/components/AuctionBottomActions.d.ts +2 -1
  143. package/dist/features/auctions/components/AuctionBottomActions.js +14 -1
  144. package/dist/features/auctions/components/AuctionDetailPageView.js +21 -9
  145. package/dist/features/auctions/components/LiveMinIncrement.d.ts +18 -0
  146. package/dist/features/auctions/components/LiveMinIncrement.js +17 -0
  147. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +5 -2
  148. package/dist/features/auctions/components/PlaceBidFormClient.js +7 -3
  149. package/dist/features/auctions/schemas/index.d.ts +5 -0
  150. package/dist/features/audit-log/repository/audit-log.repository.d.ts +45 -0
  151. package/dist/features/audit-log/repository/audit-log.repository.js +30 -0
  152. package/dist/features/audit-log/schemas/firestore.d.ts +59 -0
  153. package/dist/features/audit-log/schemas/firestore.js +35 -0
  154. package/dist/features/auth/actions/index.d.ts +0 -1
  155. package/dist/features/auth/actions/index.js +0 -1
  156. package/dist/features/auth/hooks/useAuth.d.ts +8 -35
  157. package/dist/features/auth/hooks/useAuth.js +21 -37
  158. package/dist/features/auth/permissions/constants.d.ts +1 -1
  159. package/dist/features/auth/permissions/constants.js +2 -0
  160. package/dist/features/blog/schemas/index.d.ts +32 -0
  161. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +31 -3
  162. package/dist/features/catalogue/components/CatalogueItemEditorView.js +2 -1
  163. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.d.ts +11 -0
  164. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +33 -0
  165. package/dist/features/catalogue/components/PublicCatalogueView.js +2 -1
  166. package/dist/features/catalogue/index.d.ts +2 -0
  167. package/dist/features/catalogue/index.js +1 -0
  168. package/dist/features/categories/components/BrandDetailPageView.js +14 -12
  169. package/dist/features/categories/components/BundleDetailView.d.ts +3 -1
  170. package/dist/features/categories/components/BundleDetailView.js +3 -2
  171. package/dist/features/categories/components/CategoryDetailPageView.js +7 -3
  172. package/dist/features/categories/components/CategoryHighlightsAndFaqSection.d.ts +14 -0
  173. package/dist/features/categories/components/CategoryHighlightsAndFaqSection.js +22 -0
  174. package/dist/features/categories/components/CategoryProductsView.d.ts +1 -5
  175. package/dist/features/categories/components/CategoryProductsView.js +1 -1
  176. package/dist/features/categories/components/CategorySelectorCreate.js +16 -2
  177. package/dist/features/categories/schemas/firestore.d.ts +19 -2
  178. package/dist/features/categories/schemas/index.d.ts +24 -3
  179. package/dist/features/categories/schemas/index.js +3 -1
  180. package/dist/features/categories/types/index.d.ts +7 -0
  181. package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +17 -3
  182. package/dist/features/checkout/actions/checkout-value-otp-actions.js +101 -22
  183. package/dist/features/classified/components/ClassifiedContactSellerPanel.d.ts +12 -0
  184. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +49 -0
  185. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +7 -0
  186. package/dist/features/classified/components/ClassifiedDetailPageView.js +69 -0
  187. package/dist/features/contact/components/ContactForm.js +17 -4
  188. package/dist/features/contact/components/ContactPageView.js +8 -2
  189. package/dist/features/contact/email.d.ts +1 -0
  190. package/dist/features/contact/email.js +3 -0
  191. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.d.ts +19 -0
  192. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +79 -0
  193. package/dist/features/events/components/AdminEventEditorView.js +54 -2
  194. package/dist/features/events/components/AdminEventEntriesView.d.ts +2 -16
  195. package/dist/features/events/components/AdminEventEntriesView.js +56 -89
  196. package/dist/features/events/components/EventFormDrawer.js +5 -1
  197. package/dist/features/events/components/EventRaffleEntryForm.d.ts +1 -3
  198. package/dist/features/events/components/EventRaffleEntryForm.js +1 -1
  199. package/dist/features/events/schemas/index.d.ts +22 -0
  200. package/dist/features/grouped/components/GroupedListingsCarousel.d.ts +13 -0
  201. package/dist/features/grouped/components/GroupedListingsCarousel.js +31 -0
  202. package/dist/features/grouped/repository/grouped-listings.repository.d.ts +12 -0
  203. package/dist/features/grouped/repository/grouped-listings.repository.js +34 -0
  204. package/dist/features/homepage/components/CharacterHotspotForm.js +202 -187
  205. package/dist/features/homepage/components/SectionCarousel.d.ts +1 -7
  206. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  207. package/dist/features/layout/BottomActions.js +4 -3
  208. package/dist/features/layout/BottomActionsContext.d.ts +10 -0
  209. package/dist/features/layout/BottomActionsContext.js +5 -1
  210. package/dist/features/layout/TitleBarLayout.d.ts +1 -1
  211. package/dist/features/layout/TitleBarLayout.js +3 -3
  212. package/dist/features/layout/hooks/useBottomActions.d.ts +2 -0
  213. package/dist/features/layout/hooks/useBottomActions.js +4 -1
  214. package/dist/features/live/components/LiveItemDetailPageView.d.ts +9 -0
  215. package/dist/features/live/components/LiveItemDetailPageView.js +74 -0
  216. package/dist/features/media/MediaImage.js +39 -3
  217. package/dist/features/media/MediaVideo.js +17 -1
  218. package/dist/features/media/types/index.d.ts +10 -0
  219. package/dist/features/media/types/index.js +1 -0
  220. package/dist/features/media/upload/MediaUploadField.d.ts +7 -1
  221. package/dist/features/media/upload/MediaUploadField.js +11 -7
  222. package/dist/features/media/upload/video-poster.d.ts +2 -0
  223. package/dist/features/media/upload/video-poster.js +16 -1
  224. package/dist/features/media/upload/video-poster.test.js +1 -1
  225. package/dist/features/orders/components/OrderStatusTimeline.d.ts +12 -0
  226. package/dist/features/orders/components/OrderStatusTimeline.js +55 -0
  227. package/dist/features/orders/components/index.d.ts +2 -0
  228. package/dist/features/orders/components/index.js +1 -0
  229. package/dist/features/orders/constants/payment-window.d.ts +25 -0
  230. package/dist/features/orders/constants/payment-window.js +25 -0
  231. package/dist/features/orders/repository/orders.repository.d.ts +32 -0
  232. package/dist/features/orders/repository/orders.repository.js +56 -0
  233. package/dist/features/orders/schemas/index.d.ts +24 -24
  234. package/dist/features/orders/types/index.d.ts +33 -0
  235. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +9 -1
  236. package/dist/features/pre-orders/schemas/index.d.ts +5 -0
  237. package/dist/features/products/components/BidHistory.js +9 -1
  238. package/dist/features/products/components/GroupSettingsPanel.js +25 -3
  239. package/dist/features/products/components/PrizeDrawDetailPageView.js +11 -1
  240. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +1 -4
  241. package/dist/features/products/components/PrizeDrawEntryActions.js +1 -1
  242. package/dist/features/products/components/ProductDetailActions.d.ts +1 -2
  243. package/dist/features/products/components/ProductDetailActions.js +1 -1
  244. package/dist/features/products/components/ProductDetailPageView.js +11 -116
  245. package/dist/features/products/components/ProductGrid.js +15 -1
  246. package/dist/features/products/components/RelatedItemsSection.d.ts +16 -0
  247. package/dist/features/products/components/RelatedItemsSection.js +17 -0
  248. package/dist/features/products/constants/action-defs.d.ts +1 -0
  249. package/dist/features/products/constants/action-defs.js +1 -0
  250. package/dist/features/products/schemas/index.d.ts +5 -0
  251. package/dist/features/promotions/components/CouponsIndexListing.d.ts +1 -3
  252. package/dist/features/promotions/components/CouponsIndexListing.js +1 -1
  253. package/dist/features/search/components/SearchView.d.ts +1 -3
  254. package/dist/features/search/components/SearchView.js +1 -1
  255. package/dist/features/seller/components/QuickProductForm.js +2 -1
  256. package/dist/features/seller/components/SellerBidsView.js +66 -107
  257. package/dist/features/seller/components/SellerGoogleReviewsView.js +17 -1
  258. package/dist/features/seller/components/SellerOrdersView.d.ts +15 -3
  259. package/dist/features/seller/components/SellerOrdersView.js +134 -163
  260. package/dist/features/seller/components/SellerPayoutMethodsView.js +60 -48
  261. package/dist/features/seller/components/SellerPayoutSettingsView.js +69 -4
  262. package/dist/features/seller/components/SellerPayoutsView.d.ts +12 -0
  263. package/dist/features/seller/components/SellerPayoutsView.js +25 -5
  264. package/dist/features/seller/components/SellerProductShell.d.ts +10 -3
  265. package/dist/features/seller/components/SellerProductShell.js +90 -37
  266. package/dist/features/seller/components/SellerProductsFilterDrawer.d.ts +2 -7
  267. package/dist/features/seller/components/SellerProductsFilterDrawer.js +4 -4
  268. package/dist/features/seller/components/SellerProductsView.d.ts +2 -4
  269. package/dist/features/seller/components/SellerProductsView.js +131 -189
  270. package/dist/features/seller/components/SellerReviewsView.js +95 -133
  271. package/dist/features/seller/components/SellerShippingConfigsView.js +47 -67
  272. package/dist/features/seller/components/SellerShippingView.js +41 -4
  273. package/dist/features/seller/components/SellerStoreCategoriesView.js +51 -59
  274. package/dist/features/seller/components/SellerStorefrontView.d.ts +6 -1
  275. package/dist/features/seller/components/SellerStorefrontView.js +42 -5
  276. package/dist/features/seller/components/index.d.ts +2 -2
  277. package/dist/features/seller/components/index.js +2 -2
  278. package/dist/features/shell/FormShell.d.ts +24 -4
  279. package/dist/features/shell/FormShell.js +12 -6
  280. package/dist/features/shell/QuickFormDrawer.js +67 -12
  281. package/dist/features/shell/StepForm.d.ts +30 -1
  282. package/dist/features/shell/StepForm.js +47 -4
  283. package/dist/features/shell/index.d.ts +1 -1
  284. package/dist/features/shell/index.js +1 -1
  285. package/dist/features/shipments/components/AdminShipmentEditorView.js +2 -2
  286. package/dist/features/shipments/schemas/validation.d.ts +14 -4
  287. package/dist/features/tester/components/AdminTesterFeedbackListView.js +23 -2
  288. package/dist/features/tester/components/TesterChecklistStepRow.js +1 -1
  289. package/dist/features/tester/components/TesterHubView.js +3 -2
  290. package/dist/features/tester/seed-data/orders-tester-seed-data.js +9 -1
  291. package/dist/features/tester/seed-data/products-tester-seed-data.js +43 -32
  292. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +487 -18
  293. package/dist/index.d.ts +17 -3
  294. package/dist/index.js +23 -5
  295. package/dist/next/routing/route-map.d.ts +13 -0
  296. package/dist/next/routing/route-map.js +12 -0
  297. package/dist/providers/email-resend/provider.js +1 -0
  298. package/dist/providers/firebase-client/auth.d.ts +1 -0
  299. package/dist/providers/firebase-client/auth.js +7 -1
  300. package/dist/repositories/index.d.ts +1 -0
  301. package/dist/repositories/index.js +1 -0
  302. package/dist/schemas/registry.d.ts +61 -25
  303. package/dist/security/pii-mask.js +1 -1
  304. package/dist/seed/bids-seed-data.js +48 -3
  305. package/dist/seed/categories-seed-data.js +69 -0
  306. package/dist/seed/grouped-listings-seed-data.js +167 -0
  307. package/dist/seed/payouts-seed-data.js +4 -4
  308. package/dist/seed/products-art-seed-data.js +188 -5
  309. package/dist/seed/products-auctions-seed-data.js +226 -6
  310. package/dist/seed/products-classifieds-seed-data.js +255 -8
  311. package/dist/seed/products-digital-codes-seed-data.js +258 -19
  312. package/dist/seed/products-live-items-seed-data.js +143 -10
  313. package/dist/seed/products-preorders-seed-data.js +213 -8
  314. package/dist/seed/products-prize-draws-seed-data.js +198 -0
  315. package/dist/seed/products-standard-seed-data.js +234 -4
  316. package/dist/seed/products-stickers-seed-data.js +178 -5
  317. package/dist/seed/site-settings-seed-data.js +23 -30
  318. package/dist/seed/store-extensions-seed-data.js +2 -2
  319. package/dist/server-entry.d.ts +6 -2
  320. package/dist/server-entry.js +24 -3
  321. package/dist/server.d.ts +10 -3
  322. package/dist/server.js +11 -4
  323. package/dist/styles.css +29 -1
  324. package/dist/tailwind-utilities.css +1 -1
  325. package/dist/ui/components/Form.d.ts +11 -2
  326. package/dist/ui/components/Form.js +4 -3
  327. package/dist/ui/components/FormField.d.ts +3 -1
  328. package/dist/ui/components/FormField.js +22 -4
  329. package/dist/ui/components/ImageLightbox.js +37 -3
  330. package/dist/ui/components/ImageLightbox.style.css +28 -0
  331. package/dist/ui/components/ListingLayout.d.ts +1 -2
  332. package/dist/ui/components/ListingLayout.js +1 -1
  333. package/dist/ui/components/RecordDetailModal.d.ts +68 -0
  334. package/dist/ui/components/RecordDetailModal.js +8 -0
  335. package/dist/ui/components/SlottedListingView.js +9 -1
  336. package/dist/ui/forms/FormErrorSummary.d.ts +25 -0
  337. package/dist/ui/forms/FormErrorSummary.js +37 -0
  338. package/dist/ui/forms/FormShell.d.ts +37 -2
  339. package/dist/ui/forms/FormShell.js +37 -7
  340. package/dist/ui/forms/FormShell.style.css +17 -0
  341. package/dist/ui/forms/index.d.ts +2 -0
  342. package/dist/ui/forms/index.js +1 -0
  343. package/dist/ui/index.d.ts +4 -0
  344. package/dist/ui/index.js +5 -0
  345. package/dist/utils/media-url.d.ts +12 -1
  346. package/dist/utils/media-url.js +59 -1
  347. package/dist/validation/schemas.d.ts +4 -4
  348. package/package.json +1 -1
  349. package/dist/_internal/client/features/classified/ClassifiedDetailView.d.ts +0 -9
  350. package/dist/_internal/client/features/classified/ClassifiedDetailView.js +0 -55
  351. package/dist/_internal/client/features/digital-code/DigitalCodeDetailView.d.ts +0 -18
  352. package/dist/_internal/client/features/digital-code/DigitalCodeDetailView.js +0 -21
  353. package/dist/_internal/client/features/live/LiveItemDetailView.d.ts +0 -9
  354. package/dist/_internal/client/features/live/LiveItemDetailView.js +0 -25
  355. package/dist/_internal/server/jobs/core/prizeRevealClose.d.ts +0 -2
  356. package/dist/_internal/server/jobs/core/prizeRevealClose.js +0 -28
  357. package/dist/_internal/server/jobs/core/prizeRevealExpiry.d.ts +0 -2
  358. package/dist/_internal/server/jobs/core/prizeRevealExpiry.js +0 -61
  359. package/dist/_internal/server/jobs/core/prizeRevealOpen.d.ts +0 -2
  360. package/dist/_internal/server/jobs/core/prizeRevealOpen.js +0 -68
  361. package/dist/_internal/server/jobs/core/prizeRevealReminder.d.ts +0 -2
  362. package/dist/_internal/server/jobs/core/prizeRevealReminder.js +0 -49
  363. package/dist/_internal/server/jobs/handlers/prizeRevealClose.d.ts +0 -2
  364. package/dist/_internal/server/jobs/handlers/prizeRevealClose.js +0 -2
  365. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.d.ts +0 -2
  366. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.js +0 -2
  367. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.d.ts +0 -2
  368. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.js +0 -2
  369. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.d.ts +0 -2
  370. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.js +0 -2
  371. package/dist/features/auth/consent-otp.d.ts +0 -57
  372. package/dist/features/auth/consent-otp.js +0 -127
  373. package/dist/features/cart/components/CheckoutOtpModal.d.ts +0 -15
  374. package/dist/features/cart/components/CheckoutOtpModal.js +0 -12
  375. package/dist/features/checkout/actions/checkout-actions.d.ts +0 -31
  376. package/dist/features/checkout/actions/checkout-actions.js +0 -124
  377. package/dist/features/classified/components/ClassifiedIndexListing.d.ts +0 -5
  378. package/dist/features/classified/components/ClassifiedIndexListing.js +0 -123
  379. package/dist/features/classified/components/ClassifiedListView.d.ts +0 -6
  380. package/dist/features/classified/components/ClassifiedListView.js +0 -44
  381. package/dist/features/digital-codes/components/DigitalCodesIndexListing.d.ts +0 -5
  382. package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +0 -114
  383. package/dist/features/digital-codes/components/DigitalCodesListView.d.ts +0 -6
  384. package/dist/features/digital-codes/components/DigitalCodesListView.js +0 -38
  385. package/dist/features/live/components/LiveItemsIndexListing.d.ts +0 -5
  386. package/dist/features/live/components/LiveItemsIndexListing.js +0 -115
  387. package/dist/features/live/components/LiveItemsListView.d.ts +0 -6
  388. package/dist/features/live/components/LiveItemsListView.js +0 -44
  389. package/dist/features/seller/components/SellerTemplatesView.d.ts +0 -12
  390. package/dist/features/seller/components/SellerTemplatesView.js +0 -276
  391. package/dist/react/hooks/useVisibleItems.d.ts +0 -37
  392. package/dist/react/hooks/useVisibleItems.js +0 -59
  393. package/dist/ui/components/TabStrip.d.ts +0 -34
  394. package/dist/ui/components/TabStrip.js +0 -56
  395. package/dist/ui/components/TabStrip.style.css +0 -97
@@ -45,14 +45,19 @@ function withBidDefaults(b) {
45
45
  updatedAt: (b.createdAt ?? NOW),
46
46
  };
47
47
  }
48
- /** One ascending bid ladder per auction — last entry is "active", the rest "outbid". */
48
+ /**
49
+ * One ascending bid ladder per auction. By default the last entry is "active"
50
+ * and the rest "outbid" (a live auction). Pass `closed:true` for an ended
51
+ * auction — the last entry becomes "won" and the rest "lost".
52
+ */
49
53
  function buildLadder(params) {
50
- const { productId, productTitle, startingBid, currentBid, bidderIds } = params;
54
+ const { productId, productTitle, startingBid, currentBid, bidderIds, closed = false } = params;
51
55
  const steps = bidderIds.length;
52
56
  const range = currentBid - startingBid;
53
57
  return bidderIds.map((userId, i) => {
54
58
  const amount = i === steps - 1 ? currentBid : Math.round(startingBid + (range * (i + 1)) / (steps + 1));
55
59
  const daysBack = steps - i;
60
+ const isFinal = i === steps - 1;
56
61
  return {
57
62
  id: `bid-${productId.replace(/^auction-/, "")}-${userId.replace(/^user-/, "")}-20260601-${String(i).padStart(3, "0")}`,
58
63
  productId,
@@ -60,7 +65,7 @@ function buildLadder(params) {
60
65
  userId,
61
66
  userName: BIDDER_NAMES[userId] ?? userId,
62
67
  bidAmount: amount,
63
- status: i === steps - 1 ? "active" : "outbid",
68
+ status: isFinal ? (closed ? "won" : "active") : (closed ? "lost" : "outbid"),
64
69
  bidDate: daysAgo(daysBack),
65
70
  createdAt: daysAgo(daysBack),
66
71
  };
@@ -98,5 +103,45 @@ const _rawBidsSeedData = [
98
103
  "user-rohit-collector",
99
104
  ],
100
105
  }),
106
+ // auction-beyblade-original-seaborg — bidCount: 4, currentBid: 2200 (reserve 4000 not met)
107
+ ...buildLadder({
108
+ productId: "auction-beyblade-original-seaborg",
109
+ productTitle: "Beyblade Original — Seaborg 2000 (Reserve Auction)",
110
+ startingBid: 1499,
111
+ currentBid: 2200,
112
+ bidderIds: ["user-ananya-collector", "user-meera-bey", "user-rohit-collector", "user-ananya-collector"],
113
+ }),
114
+ // auction-beyblade-metal-diablo-nemesis — bidCount: 6, currentBid: 6200, CLOSED (won by user-rohit-collector)
115
+ ...buildLadder({
116
+ productId: "auction-beyblade-metal-diablo-nemesis",
117
+ productTitle: "Metal Fight Beyblade BB-122 Diablo Nemesis (Ended — Sold)",
118
+ startingBid: 3499,
119
+ currentBid: 6200,
120
+ bidderIds: [
121
+ "user-meera-bey",
122
+ "user-ananya-collector",
123
+ "user-meera-bey",
124
+ "user-ananya-collector",
125
+ "user-meera-bey",
126
+ "user-rohit-collector",
127
+ ],
128
+ closed: true,
129
+ }),
130
+ // auction-beyblade-burst-cho-z-achilles — bidCount: 2, currentBid: 1650
131
+ ...buildLadder({
132
+ productId: "auction-beyblade-burst-cho-z-achilles",
133
+ productTitle: "Beyblade Burst B-100 Cho-Z Achilles",
134
+ startingBid: 1199,
135
+ currentBid: 1650,
136
+ bidderIds: ["user-rohit-collector", "user-meera-bey"],
137
+ }),
138
+ // auction-beyblade-x-wizard-fafnir — bidCount: 3, currentBid: 1450
139
+ ...buildLadder({
140
+ productId: "auction-beyblade-x-wizard-fafnir",
141
+ productTitle: "Beyblade X BX-06 Wizard Fafnir (Long-Running Auction)",
142
+ startingBid: 999,
143
+ currentBid: 1450,
144
+ bidderIds: ["user-ananya-collector", "user-rohit-collector", "user-meera-bey"],
145
+ }),
101
146
  ];
102
147
  export const bidsSeedData = _rawBidsSeedData.map(withBidDefaults);
@@ -55,6 +55,15 @@ const rawCategories = [
55
55
  isFeatured: true,
56
56
  featuredPriority: 1,
57
57
  isBrand: false,
58
+ highlights: [
59
+ "Every era of Beyblade in one place — Original, Metal Fight, Burst, and X",
60
+ "Verified sellers with condition-graded listings",
61
+ "Auctions, pre-orders, and prize draws alongside straightforward buy-now listings",
62
+ ],
63
+ faqs: [
64
+ { question: "What's the difference between the four Beyblade generations?", answer: "Original (1999-2003) started the franchise with ripcord launchers; Metal Fight (2008-2013) added metal-weighted tops; Burst (2015-present) introduced tops that burst apart on hard hits; X (2023-present) uses the new Xtreme Gear system with clip-on parts." },
65
+ { question: "Are used tops sold here safe to battle with?", answer: "Every listing shows a condition rating (New/Like New/Good/Used) and sellers are expected to disclose any chips or cracks — check the condition badge and item photos before buying." },
66
+ ],
58
67
  seo: { title: "Spinning Tops | LetItRip", description: "Buy Beyblade and spinning tops — Original, Metal Fight, Burst, X, and accessories.", keywords: ["beyblade", "spinning tops", "beyblade x", "beyblade burst"] },
59
68
  display: { icon: "🌀", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-spinning-tops-20260101/1200/600"), color: "#0891b2", showInMenu: true, showInFooter: true },
60
69
  isActive: true,
@@ -81,6 +90,15 @@ const rawCategories = [
81
90
  metrics: emptyMetrics,
82
91
  isFeatured: false,
83
92
  isBrand: false,
93
+ highlights: [
94
+ "The tops that started it all in 1999",
95
+ "Ripcord launcher compatible with the full original-series lineup",
96
+ "A favorite among vintage collectors — sealed pieces command a premium",
97
+ ],
98
+ faqs: [
99
+ { question: "Will an original-series top work with a Burst or X launcher?", answer: "No — each generation uses its own launcher and ripcord system. Original-series tops need an original-series launcher." },
100
+ { question: "How do I tell if an original top is a genuine Takara release vs. a reprint?", answer: "Check the sticker finish and base stamp under good lighting — sellers with vintage-collectible tagged listings usually note authentication details in the description." },
101
+ ],
84
102
  seo: { title: "Beyblade Original | LetItRip", description: "Buy original-series Beyblade tops and launchers — Plastic Generation, 1999-2003.", keywords: ["beyblade original", "plastic generation", "vintage beyblade", "beyblade 1999"] },
85
103
  display: { icon: "🪀", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-original-20260101/1200/600"), color: "#b45309", showInMenu: true, showInFooter: false },
86
104
  isActive: true,
@@ -107,6 +125,15 @@ const rawCategories = [
107
125
  metrics: emptyMetrics,
108
126
  isFeatured: false,
109
127
  isBrand: false,
128
+ highlights: [
129
+ "Metal-weighted tops for serious attack and defense power",
130
+ "Covers all four Metal Fight sub-generations: Fusion, Masters, Fury, Zero-G",
131
+ "Popular with tournament players for their heavier base weight",
132
+ ],
133
+ faqs: [
134
+ { question: "What does the number/letter code after a top's name mean (e.g. \"105RF\")?", answer: "It's the track height and bottom type — e.g. 105RF means a 105-height track with a Rubber Flat bottom. Swapping tracks and bottoms lets you tune stamina vs. attack." },
135
+ { question: "Can Metal Fight tops battle Burst tops in the same stadium?", answer: "Physically yes if the stadium size matches, but they don't burst apart on impact the way Burst tops do — most local groups keep the generations separate for fair play." },
136
+ ],
110
137
  seo: { title: "Beyblade Metal Fight | LetItRip", description: "Buy vintage Beyblade Metal Fight tops — Fusion, Masters, Fury.", keywords: ["beyblade metal fight", "metal fusion", "metal masters", "vintage beyblade"] },
111
138
  display: { icon: "⚙️", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-metal-20260101/1200/600"), color: "#64748b", showInMenu: true, showInFooter: false },
112
139
  isActive: true,
@@ -133,6 +160,15 @@ const rawCategories = [
133
160
  metrics: emptyMetrics,
134
161
  isFeatured: false,
135
162
  isBrand: false,
163
+ highlights: [
164
+ "Tops that burst apart on a hard enough hit — a whole new battle mechanic",
165
+ "Swappable Layer / Disc / Driver parts for build customization",
166
+ "The most actively traded generation on the platform",
167
+ ],
168
+ faqs: [
169
+ { question: "What's the difference between a Layer, Disc, and Driver?", answer: "Layer is the top piece (attack profile), Disc sits underneath it (weight/stamina), Driver is the tip that touches the stadium floor (spin behavior). Mixing and matching lets you build custom combos." },
170
+ { question: "Is a burst during battle bad for the top?", answer: "No — Burst tops are designed to separate on hard impacts as the game's core mechanic, then click back together for the next battle." },
171
+ ],
136
172
  seo: { title: "Beyblade Burst | LetItRip", description: "Buy Beyblade Burst tops, launchers, and stadiums.", keywords: ["beyblade burst", "burst system", "beyblade burst pro"] },
137
173
  display: { icon: "💥", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-burst-20260101/1200/600"), color: "#059669", showInMenu: true, showInFooter: false },
138
174
  isActive: true,
@@ -159,6 +195,15 @@ const rawCategories = [
159
195
  metrics: emptyMetrics,
160
196
  isFeatured: true,
161
197
  isBrand: false,
198
+ highlights: [
199
+ "The newest generation — Xtreme Gear system launched in 2023",
200
+ "Faster clip-on part swaps than any previous generation",
201
+ "Actively growing tournament scene with new waves releasing regularly",
202
+ ],
203
+ faqs: [
204
+ { question: "Do I need new stadiums for Beyblade X?", answer: "X-format tops battle best in the wider X-format stadiums, though many X tops still spin in older round stadiums — check a listing's description for stadium compatibility notes." },
205
+ { question: "What does the Blade / Ratchet / Bit naming mean?", answer: "Beyblade X renamed the part system — Blade (top piece), Ratchet (middle, sets height), Bit (bottom tip) — functionally similar to Burst's Layer/Disc/Driver but not physically interchangeable with them." },
206
+ ],
162
207
  seo: { title: "Beyblade X | LetItRip", description: "Buy Beyblade X tops and stadiums by Takara-Tomy.", keywords: ["beyblade x", "xtreme gear", "beyblade x starter", "takara tomy beyblade"] },
163
208
  display: { icon: "💫", coverImage: seedExtMedia("https://picsum.photos/seed/category-image-beyblade-x-20260101/1200/600"), color: "#0d9488", showInMenu: true, showInFooter: false },
164
209
  isActive: true,
@@ -185,6 +230,15 @@ const brandRows = [
185
230
  brandWebsite: "https://www.takaratomy.co.jp",
186
231
  brandCountry: "Japan",
187
232
  brandFounded: 2006,
233
+ highlights: [
234
+ "The Japanese toy company that manufactures every Beyblade generation",
235
+ "Also behind Tomica, Transformers (Japan region), and Duel Masters",
236
+ "Known for Japan-exclusive releases and premium tooling quality",
237
+ ],
238
+ faqs: [
239
+ { question: "Is Takara-Tomy the same company as Hasbro's Beyblade line?", answer: "No — Takara-Tomy manufactures and sells Beyblade in Japan and most of Asia; Hasbro licenses and distributes a separate (sometimes different) product line internationally, primarily in North America." },
240
+ { question: "Are Takara-Tomy imports compatible with Hasbro Beyblade parts?", answer: "Within the same generation (e.g. Burst-to-Burst), yes, in most cases — cross-generation compatibility is not guaranteed." },
241
+ ],
188
242
  rootId: "brand-takara-tomy",
189
243
  parentIds: [],
190
244
  tier: 0,
@@ -210,6 +264,15 @@ const brandRows = [
210
264
  brandWebsite: "https://beyblade.takaratomy.co.jp",
211
265
  brandCountry: "Japan",
212
266
  brandFounded: 1999,
267
+ highlights: [
268
+ "The franchise itself — spanning four generations since 1999",
269
+ "One of the best-selling spinning-top toy lines in the world",
270
+ "A competitive tournament scene alongside casual collecting",
271
+ ],
272
+ faqs: [
273
+ { question: "What age range is Beyblade designed for?", answer: "Most sets are labeled for ages 8+ due to small parts and launcher spring mechanisms — always check the age rating on the listing before buying for a young child." },
274
+ { question: "Where can I find official tournament rules?", answer: "Takara-Tomy and Hasbro both publish official battle rules for their respective regions — check the manufacturer's site linked from this page's \"Website\" field for the current rulebook." },
275
+ ],
213
276
  rootId: "brand-beyblade",
214
277
  parentIds: [],
215
278
  tier: 0,
@@ -239,6 +302,7 @@ const bundleRows = [
239
302
  description: "Both original-generation Beyblades — Dranzer S and Driger V — bundled at a discount.",
240
303
  categoryType: "bundle",
241
304
  bundleKind: "special",
305
+ brandSlug: "brand-beyblade",
242
306
  bundlePrice: 2999,
243
307
  bundleQueryRule: {
244
308
  type: "static",
@@ -272,6 +336,7 @@ const bundleRows = [
272
336
  description: "Storm Pegasus and Flame Sagittario — the classic Metal Fight rivalry, together.",
273
337
  categoryType: "bundle",
274
338
  bundleKind: "special",
339
+ brandSlug: "brand-takara-tomy",
275
340
  bundlePrice: 3499,
276
341
  bundleQueryRule: {
277
342
  type: "static",
@@ -305,6 +370,7 @@ const bundleRows = [
305
370
  description: "Valkyrie and Regalia Genesis — top-tier Burst-era attackers in one set.",
306
371
  categoryType: "bundle",
307
372
  bundleKind: "special",
373
+ brandSlug: "brand-beyblade",
308
374
  // Was 3799 — priced ABOVE the 999+1399+1199=3597 member total (no real
309
375
  // discount, contradicted the bundle's whole purpose). Corrected 2026-08-19.
310
376
  bundlePrice: 2899,
@@ -340,6 +406,7 @@ const bundleRows = [
340
406
  description: "Wizard Arrow and Knife Shinobi — the newest X-series tops for new battlers.",
341
407
  categoryType: "bundle",
342
408
  bundleKind: "special",
409
+ brandSlug: "brand-takara-tomy",
343
410
  bundlePrice: 2499,
344
411
  bundleQueryRule: {
345
412
  type: "static",
@@ -373,6 +440,8 @@ const bundleRows = [
373
440
  description: "One top from every Beyblade generation — Original, Metal Fight, Burst, and X — the ultimate collector's starter pack.",
374
441
  categoryType: "bundle",
375
442
  bundleKind: "special",
443
+ // Deliberately no brandSlug — genuinely cross-brand (2 Beyblade + 2
444
+ // Takara-Tomy member products), a real "no specific brand" test case.
376
445
  // Was 5999 — priced ABOVE the 1799+1299+999+899=4996 member total (no
377
446
  // real discount, contradicted the bundle's whole purpose). Corrected 2026-08-19.
378
447
  bundlePrice: 3999,
@@ -97,4 +97,171 @@ export const groupedListingsSeedData = [
97
97
  createdAt: daysAgo(15),
98
98
  updatedAt: daysAgo(3),
99
99
  },
100
+ // --- Coverage for every other listing type — previously only standard products had a
101
+ // group, so the public GroupedListingsCarousel (Phase 3) had nothing to render on
102
+ // any auction/pre-order/prize-draw/classified/digital-code/live/art/stickers page. ---
103
+ {
104
+ id: "group-beyblade-auction-highlights",
105
+ slug: "group-beyblade-auction-highlights",
106
+ title: "Auction Highlights",
107
+ description: "Two of the rarest pieces currently up for auction on Beyblade Arena.",
108
+ productIds: [
109
+ "auction-beyblade-original-dragoon-storm",
110
+ "auction-beyblade-metal-diablo-nemesis",
111
+ ],
112
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-auction-highlights-20260819/1200/900"),
113
+ groupTheme: "related",
114
+ minActiveMembers: 2,
115
+ activeMemberCount: 2,
116
+ visibilityStatus: "visible",
117
+ isActive: true,
118
+ isFeatured: false,
119
+ storeId: "store-beyblade-arena",
120
+ brandSlug: "brand-beyblade",
121
+ categorySlug: "category-spinning-tops",
122
+ createdBy: "user-admin-letitrip",
123
+ createdAt: daysAgo(6),
124
+ updatedAt: daysAgo(1),
125
+ },
126
+ {
127
+ id: "group-beyblade-x-preorder-wave",
128
+ slug: "group-beyblade-x-preorder-wave",
129
+ title: "Beyblade X Pre-Order Wave",
130
+ description: "Reserve your spot in the upcoming Beyblade X booster waves.",
131
+ productIds: [
132
+ "preorder-beyblade-x-bx-08-wave",
133
+ "preorder-beyblade-x-bx-09-glide-ring",
134
+ ],
135
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-x-preorder-wave-20260819/1200/900"),
136
+ groupTheme: "set",
137
+ minActiveMembers: 2,
138
+ activeMemberCount: 2,
139
+ visibilityStatus: "visible",
140
+ isActive: true,
141
+ isFeatured: false,
142
+ storeId: "store-beyblade-arena",
143
+ brandSlug: "brand-takara-tomy",
144
+ categorySlug: "category-beyblade-x",
145
+ createdBy: "user-admin-letitrip",
146
+ createdAt: daysAgo(5),
147
+ updatedAt: daysAgo(1),
148
+ },
149
+ {
150
+ id: "group-beyblade-mystery-draws",
151
+ slug: "group-beyblade-mystery-draws",
152
+ title: "Mystery Draws You Might Like",
153
+ description: "More prize draws with entries still open.",
154
+ productIds: [
155
+ "prizedraw-beyblade-mystery-box",
156
+ "prizedraw-beyblade-x-legendary-vault",
157
+ "prizedraw-beyblade-original-vintage-vault",
158
+ ],
159
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-mystery-draws-20260819/1200/900"),
160
+ groupTheme: "related",
161
+ minActiveMembers: 2,
162
+ activeMemberCount: 3,
163
+ visibilityStatus: "visible",
164
+ isActive: true,
165
+ isFeatured: true,
166
+ storeId: "store-letitrip-official",
167
+ brandSlug: "brand-beyblade",
168
+ categorySlug: "category-spinning-tops",
169
+ createdBy: "user-admin-letitrip",
170
+ createdAt: daysAgo(4),
171
+ updatedAt: daysAgo(1),
172
+ },
173
+ {
174
+ id: "group-beyblade-local-meetup-picks",
175
+ slug: "group-beyblade-local-meetup-picks",
176
+ title: "Local Meetup Picks",
177
+ description: "More classified listings from sellers open to meeting up.",
178
+ productIds: [
179
+ "classified-beyblade-stadium-set",
180
+ "classified-beyblade-burst-collection-bengaluru",
181
+ "classified-beyblade-x-starter-pune",
182
+ ],
183
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-local-meetup-picks-20260819/1200/900"),
184
+ groupTheme: "related",
185
+ minActiveMembers: 2,
186
+ activeMemberCount: 3,
187
+ visibilityStatus: "visible",
188
+ isActive: true,
189
+ isFeatured: false,
190
+ storeId: "store-beyblade-arena",
191
+ brandSlug: "brand-beyblade",
192
+ categorySlug: "category-spinning-tops",
193
+ createdBy: "user-admin-letitrip",
194
+ createdAt: daysAgo(3),
195
+ updatedAt: daysAgo(1),
196
+ },
197
+ {
198
+ id: "group-beyblade-app-unlock-codes",
199
+ slug: "group-beyblade-app-unlock-codes",
200
+ title: "App Unlock Codes",
201
+ description: "More companion-app digital codes to unlock tops, packs, and cosmetics.",
202
+ productIds: [
203
+ "digitalcode-beyblade-x-app-starter-pack",
204
+ "digitalcode-beyblade-metal-app-classic-pack",
205
+ "digitalcode-beyblade-burst-app-avatar-skins",
206
+ ],
207
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-app-unlock-codes-20260819/1200/900"),
208
+ groupTheme: "related",
209
+ minActiveMembers: 2,
210
+ activeMemberCount: 3,
211
+ visibilityStatus: "visible",
212
+ isActive: true,
213
+ isFeatured: false,
214
+ storeId: "store-beyblade-arena",
215
+ brandSlug: "brand-takara-tomy",
216
+ categorySlug: "category-spinning-tops",
217
+ createdBy: "user-admin-letitrip",
218
+ createdAt: daysAgo(3),
219
+ updatedAt: daysAgo(1),
220
+ },
221
+ {
222
+ id: "group-beyblade-fan-art-and-stickers",
223
+ slug: "group-beyblade-fan-art-and-stickers",
224
+ title: "Fan Art & Stickers",
225
+ description: "Prints and sticker sheets to go with your collection.",
226
+ productIds: [
227
+ "art-dranzer-phoenix-poster",
228
+ "art-valkyrie-holographic-print",
229
+ "stickers-beyblade-original-classic-sheet",
230
+ "stickers-beyblade-x-holographic-pack",
231
+ ],
232
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-fan-art-and-stickers-20260819/1200/900"),
233
+ groupTheme: "related",
234
+ minActiveMembers: 2,
235
+ activeMemberCount: 4,
236
+ visibilityStatus: "visible",
237
+ isActive: true,
238
+ isFeatured: false,
239
+ storeId: "store-beyblade-arena",
240
+ brandSlug: "brand-beyblade",
241
+ categorySlug: "category-spinning-tops",
242
+ createdBy: "user-admin-letitrip",
243
+ createdAt: daysAgo(2),
244
+ updatedAt: daysAgo(1),
245
+ },
246
+ {
247
+ id: "group-beyblade-arena-extras",
248
+ slug: "group-beyblade-arena-extras",
249
+ title: "Beyblade Arena Extras",
250
+ description: "A few off-catalog extras also listed by Beyblade Arena.",
251
+ productIds: [
252
+ "live-golden-retriever-puppy",
253
+ "live-bonsai-juniper-10yr",
254
+ ],
255
+ coverImage: seedExtMedia("https://picsum.photos/seed/group-beyblade-arena-extras-20260819/1200/900"),
256
+ groupTheme: "generic",
257
+ minActiveMembers: 2,
258
+ activeMemberCount: 2,
259
+ visibilityStatus: "visible",
260
+ isActive: true,
261
+ isFeatured: false,
262
+ storeId: "store-beyblade-arena",
263
+ createdBy: "user-admin-letitrip",
264
+ createdAt: daysAgo(2),
265
+ updatedAt: daysAgo(1),
266
+ },
100
267
  ];
@@ -65,7 +65,7 @@ export const payoutsSeedData = [
65
65
  currency: _CURRENCY,
66
66
  status: PAYOUT_FIELDS.STATUS_VALUES.PAID,
67
67
  paymentMethod: "upi",
68
- upiId: "letitrip@upi",
68
+ upiId: "mohsin0502@okicici",
69
69
  notes: "January 2026 payout — Mystery box + pre-order deposit orders",
70
70
  adminNote: "UPI credited. Ref: UPI-2026-01-9983",
71
71
  orderIds: ["order-2-20260120-d4e5f6"],
@@ -110,7 +110,7 @@ export const payoutsSeedData = [
110
110
  currency: _CURRENCY,
111
111
  status: PAYOUT_FIELDS.STATUS_VALUES.PAID,
112
112
  paymentMethod: "upi",
113
- upiId: "letitrip@upi",
113
+ upiId: "mohsin0502@okicici",
114
114
  notes: "March 2026 payout — Accessory orders",
115
115
  adminNote: "UPI credited. Ref: UPI-2026-03-7765",
116
116
  orderIds: ["order-4-20260315-j1k2l3"],
@@ -151,7 +151,7 @@ export const payoutsSeedData = [
151
151
  currency: _CURRENCY,
152
152
  status: PAYOUT_FIELDS.STATUS_VALUES.PROCESSING,
153
153
  paymentMethod: "upi",
154
- upiId: "letitrip@upi",
154
+ upiId: "mohsin0502@okicici",
155
155
  notes: "May 2026 payout — Mystery box sealed batch + accessories batch",
156
156
  adminNote: "UPI transfer queued. Processing batch run.",
157
157
  orderIds: ["order-6-20260510-p7q8r9"],
@@ -199,7 +199,7 @@ export const payoutsSeedData = [
199
199
  currency: _CURRENCY,
200
200
  status: PAYOUT_FIELDS.STATUS_VALUES.PENDING,
201
201
  paymentMethod: "upi",
202
- upiId: "letitrip@upi",
202
+ upiId: "mohsin0502@okicici",
203
203
  notes: "May 2026 payout — Pre-order deposits + accessories",
204
204
  orderIds: ["order-8-20260518-v4w5x6"],
205
205
  requestedAt: daysAgo(1),
@@ -1,10 +1,14 @@
1
1
  /*
2
- * WHY: Art listings are out of scope for the minimal Beyblade-focused demo catalog.
3
- * WHAT: Exports an empty array kept as a stub so seed/index.ts and the seed API route's
4
- * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
2
+ * WHY: `listingType: "art"` shares ProductPrintMeta (size/material/finish/editionSize)
3
+ * with "stickers"both printed-only physical goods. Previously left as an empty
4
+ * stub with the note "out of scope for the minimal Beyblade-focused demo catalog,"
5
+ * but unlike "live," art prints fit the Beyblade theme naturally as fan-art (see
6
+ * CLAUDE.md seed-data blandness sweep, 2026-08-20 session).
7
+ * WHAT: Exports 5 Beyblade fan-art print listings on Beyblade Arena, varying size,
8
+ * material, finish, and edition size (including one open-edition, no editionSize).
5
9
  *
6
10
  * EXPORTS:
7
- * productsArtSeedData — empty array
11
+ * productsArtSeedData — Array of 5 Partial<ProductDocument> with listingType:"art"
8
12
  *
9
13
  * @tag domain:products,art
10
14
  * @tag layer:seed
@@ -13,4 +17,183 @@
13
17
  * @tag consumers:seed/index.ts,seed/runner.ts
14
18
  * @tag sideEffects:none
15
19
  */
16
- export const productsArtSeedData = [];
20
+ import { PRODUCT_FIELDS } from "../constants/field-names";
21
+ import { buildSearchTokens } from "../utils/search-tokens";
22
+ import { seedExtMedia } from "./_helpers/media";
23
+ export const productsArtSeedData = [
24
+ {
25
+ id: "art-dranzer-phoenix-poster",
26
+ slug: "art-dranzer-phoenix-poster",
27
+ title: "Dranzer Phoenix Rising — Fan Art Poster",
28
+ description: "A vibrant fan-art poster of Dranzer erupting in phoenix flame, hand-illustrated and giclée-printed on matte photo paper.",
29
+ categorySlugs: ["category-spinning-tops"],
30
+ categoryNames: ["Spinning Tops"],
31
+ brandSlug: "brand-beyblade",
32
+ brand: "Beyblade",
33
+ price: 599,
34
+ currency: "INR",
35
+ stockQuantity: 20,
36
+ availableQuantity: 20,
37
+ isSold: false,
38
+ mainImage: seedExtMedia("https://picsum.photos/seed/art-image-dranzer-phoenix-1-20260817/900/900"),
39
+ images: [
40
+ seedExtMedia("https://picsum.photos/seed/art-image-dranzer-phoenix-1-20260817/900/900"),
41
+ seedExtMedia("https://picsum.photos/seed/art-image-dranzer-phoenix-2-20260817/900/900"),
42
+ ],
43
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
44
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
45
+ listingType: "art",
46
+ storeId: "store-beyblade-arena",
47
+ storeName: "Beyblade Arena",
48
+ printMeta: { size: "12x18 in", material: "Matte photo paper", finish: "Matte" },
49
+ customFields: [],
50
+ customSections: [],
51
+ featured: true,
52
+ isPromoted: false,
53
+ isOnSale: false,
54
+ tags: ["fan-art", "poster"],
55
+ createdAt: new Date("2026-08-17"),
56
+ updatedAt: new Date("2026-08-17"),
57
+ searchTokens: buildSearchTokens("Dranzer Phoenix Rising — Fan Art Poster", "Vibrant fan-art poster of Dranzer erupting in phoenix flame.", "Beyblade", "brand-beyblade", ["Spinning Tops"], ["fan-art", "poster"]),
58
+ },
59
+ {
60
+ id: "art-valkyrie-holographic-print",
61
+ slug: "art-valkyrie-holographic-print",
62
+ title: "Beyblade Burst Valkyrie — Holographic Art Print (Limited /100)",
63
+ description: "A limited-edition holographic art print of Valkyrie mid-battle, numbered out of 100. Ships in a rigid mailer to prevent bending.",
64
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
65
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
66
+ brandSlug: "brand-beyblade",
67
+ brand: "Beyblade",
68
+ price: 1299,
69
+ currency: "INR",
70
+ stockQuantity: 100,
71
+ availableQuantity: 37,
72
+ isSold: false,
73
+ mainImage: seedExtMedia("https://picsum.photos/seed/art-image-valkyrie-holo-1-20260818/900/900"),
74
+ images: [
75
+ seedExtMedia("https://picsum.photos/seed/art-image-valkyrie-holo-1-20260818/900/900"),
76
+ seedExtMedia("https://picsum.photos/seed/art-image-valkyrie-holo-2-20260818/900/900"),
77
+ ],
78
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
79
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
80
+ listingType: "art",
81
+ storeId: "store-beyblade-arena",
82
+ storeName: "Beyblade Arena",
83
+ printMeta: { size: "8x10 in", material: "Holographic cardstock", finish: "Holographic", editionSize: 100 },
84
+ customFields: [{ key: "Numbered Edition", type: "boolean", value: "true" }],
85
+ customSections: [],
86
+ featured: true,
87
+ isPromoted: true,
88
+ isOnSale: false,
89
+ tags: ["fan-art", "limited-run"],
90
+ createdAt: new Date("2026-08-18"),
91
+ updatedAt: new Date("2026-08-19"),
92
+ searchTokens: buildSearchTokens("Beyblade Burst Valkyrie — Holographic Art Print (Limited /100)", "Limited-edition holographic art print of Valkyrie, numbered out of 100.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["fan-art", "limited-run"]),
93
+ },
94
+ {
95
+ id: "art-beyblade-x-lineup-canvas",
96
+ slug: "art-beyblade-x-lineup-canvas",
97
+ title: "Beyblade X Full Lineup — Canvas Print",
98
+ description: "A gallery-style canvas print featuring the full current Beyblade X roster in battle formation. Stretched and ready to hang.",
99
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
100
+ categoryNames: ["Beyblade X", "Spinning Tops"],
101
+ brandSlug: "brand-takara-tomy",
102
+ brand: "Takara-Tomy",
103
+ price: 2499,
104
+ currency: "INR",
105
+ stockQuantity: 15,
106
+ availableQuantity: 15,
107
+ isSold: false,
108
+ mainImage: seedExtMedia("https://picsum.photos/seed/art-image-x-lineup-canvas-1-20260819/900/900"),
109
+ images: [seedExtMedia("https://picsum.photos/seed/art-image-x-lineup-canvas-1-20260819/900/900")],
110
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
111
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
112
+ listingType: "art",
113
+ storeId: "store-beyblade-arena",
114
+ storeName: "Beyblade Arena",
115
+ printMeta: { size: "16x20 in", material: "Canvas", finish: "Matte" },
116
+ customFields: [],
117
+ customSections: [
118
+ {
119
+ id: "care-instructions",
120
+ title: "Care Instructions",
121
+ text: "Wipe with a dry microfiber cloth only. Keep out of direct sunlight to preserve color vibrancy over time.",
122
+ },
123
+ ],
124
+ featured: false,
125
+ isPromoted: false,
126
+ isOnSale: false,
127
+ tags: ["fan-art", "canvas"],
128
+ createdAt: new Date("2026-08-19"),
129
+ updatedAt: new Date("2026-08-19"),
130
+ searchTokens: buildSearchTokens("Beyblade X Full Lineup — Canvas Print", "Gallery-style canvas print featuring the full current Beyblade X roster.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["fan-art", "canvas"]),
131
+ },
132
+ {
133
+ id: "art-metal-fight-vintage-poster",
134
+ slug: "art-metal-fight-vintage-poster",
135
+ title: "Metal Fight Beyblade — Vintage-Style Poster (Open Edition)",
136
+ description: "A retro-styled poster celebrating the Metal Fight era, printed on demand — open edition, no print run limit.",
137
+ categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
138
+ categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
139
+ brandSlug: "brand-takara-tomy",
140
+ brand: "Takara-Tomy",
141
+ price: 449,
142
+ currency: "INR",
143
+ stockQuantity: 999,
144
+ availableQuantity: 999,
145
+ isSold: false,
146
+ mainImage: seedExtMedia("https://picsum.photos/seed/art-image-metal-vintage-1-20260819/900/900"),
147
+ images: [seedExtMedia("https://picsum.photos/seed/art-image-metal-vintage-1-20260819/900/900")],
148
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
149
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
150
+ listingType: "art",
151
+ storeId: "store-beyblade-arena",
152
+ storeName: "Beyblade Arena",
153
+ printMeta: { size: "11x17 in", material: "Matte photo paper", finish: "Matte" },
154
+ customFields: [{ key: "Print on Demand", type: "boolean", value: "true" }],
155
+ customSections: [],
156
+ featured: false,
157
+ isPromoted: false,
158
+ isOnSale: false,
159
+ tags: ["fan-art", "poster", "vintage-collectible"],
160
+ createdAt: new Date("2026-08-19"),
161
+ updatedAt: new Date("2026-08-19"),
162
+ searchTokens: buildSearchTokens("Metal Fight Beyblade — Vintage-Style Poster (Open Edition)", "Retro-styled poster celebrating the Metal Fight era, open edition.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade Metal Fight", "Spinning Tops"], ["fan-art", "poster", "vintage-collectible"]),
163
+ },
164
+ {
165
+ id: "art-original-series-anniversary-print",
166
+ slug: "art-original-series-anniversary-print",
167
+ title: "Original Series 25th Anniversary — Glossy Art Print",
168
+ description: "A commemorative glossy print marking 25 years of the original Beyblade series, featuring Dragoon, Dranzer, Driger, and Draciel together.",
169
+ categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
170
+ categoryNames: ["Beyblade Original", "Spinning Tops"],
171
+ brandSlug: "brand-beyblade",
172
+ brand: "Beyblade",
173
+ price: 899,
174
+ currency: "INR",
175
+ stockQuantity: 250,
176
+ availableQuantity: 180,
177
+ isSold: false,
178
+ mainImage: seedExtMedia("https://picsum.photos/seed/art-image-original-anniversary-1-20260819/900/900"),
179
+ images: [
180
+ seedExtMedia("https://picsum.photos/seed/art-image-original-anniversary-1-20260819/900/900"),
181
+ seedExtMedia("https://picsum.photos/seed/art-image-original-anniversary-2-20260819/900/900"),
182
+ ],
183
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
184
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
185
+ listingType: "art",
186
+ storeId: "store-beyblade-arena",
187
+ storeName: "Beyblade Arena",
188
+ printMeta: { size: "12x18 in", material: "Glossy photo paper", finish: "Glossy", editionSize: 250 },
189
+ customFields: [{ key: "Anniversary Edition", type: "boolean", value: "true" }],
190
+ customSections: [],
191
+ featured: true,
192
+ isPromoted: false,
193
+ isOnSale: false,
194
+ tags: ["fan-art", "vintage-collectible", "limited-run"],
195
+ createdAt: new Date("2026-08-19"),
196
+ updatedAt: new Date("2026-08-19"),
197
+ searchTokens: buildSearchTokens("Original Series 25th Anniversary — Glossy Art Print", "Commemorative glossy print marking 25 years of the original Beyblade series.", "Beyblade", "brand-beyblade", ["Beyblade Original", "Spinning Tops"], ["fan-art", "vintage-collectible", "limited-run"]),
198
+ },
199
+ ];