@mohasinac/appkit 4.9.4 → 4.10.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 (160) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +7 -2
  2. package/dist/_internal/client/features/layout/SidebarCollapseToggle.d.ts +5 -1
  3. package/dist/_internal/client/features/layout/SidebarCollapseToggle.js +8 -2
  4. package/dist/_internal/client/features/layout/sidebarPositionClasses.d.ts +20 -0
  5. package/dist/_internal/client/features/layout/sidebarPositionClasses.js +20 -0
  6. package/dist/_internal/client/hand-mode/HandModeProvider.d.ts +21 -0
  7. package/dist/_internal/client/hand-mode/HandModeProvider.js +81 -0
  8. package/dist/_internal/client/hand-mode/index.d.ts +2 -0
  9. package/dist/_internal/client/hand-mode/index.js +1 -0
  10. package/dist/_internal/server/features/auctions/actions.js +3 -2
  11. package/dist/_internal/server/features/auctions/service.d.ts +4 -3
  12. package/dist/_internal/server/features/auctions/service.js +6 -6
  13. package/dist/_internal/server/features/bundles/data.d.ts +9 -0
  14. package/dist/_internal/server/features/bundles/data.js +14 -0
  15. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  16. package/dist/_internal/server/features/bundles/index.js +1 -1
  17. package/dist/_internal/server/features/catalogue/og.d.ts +20 -0
  18. package/dist/_internal/server/features/catalogue/og.js +27 -0
  19. package/dist/_internal/server/features/checkout/actions.d.ts +43 -0
  20. package/dist/_internal/server/features/checkout/actions.js +172 -81
  21. package/dist/_internal/server/features/checkout/index.d.ts +1 -1
  22. package/dist/_internal/server/features/checkout/index.js +1 -1
  23. package/dist/_internal/server/features/grouped/data.d.ts +12 -0
  24. package/dist/_internal/server/features/grouped/data.js +26 -1
  25. package/dist/_internal/server/features/grouped/index.d.ts +1 -1
  26. package/dist/_internal/server/features/grouped/index.js +1 -1
  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/features/seo/robots.js +3 -2
  32. package/dist/_internal/server/features/seo/sitemap.js +70 -5
  33. package/dist/_internal/shared/config/schema.d.ts +1 -0
  34. package/dist/_internal/shared/features/auctions/config.d.ts +20 -0
  35. package/dist/_internal/shared/features/auctions/config.js +31 -1
  36. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -1
  37. package/dist/_internal/shared/listing-types/art/config.js +1 -1
  38. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -1
  39. package/dist/_internal/shared/listing-types/classified/config.js +2 -2
  40. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -1
  41. package/dist/_internal/shared/listing-types/digital-code/config.js +2 -2
  42. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -1
  43. package/dist/_internal/shared/listing-types/live/config.js +2 -2
  44. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -1
  45. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -1
  46. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -1
  47. package/dist/_internal/shared/listing-types/stickers/config.js +1 -1
  48. package/dist/client.d.ts +4 -6
  49. package/dist/client.js +10 -4
  50. package/dist/constants/api-endpoints.d.ts +6 -0
  51. package/dist/constants/api-endpoints.js +2 -0
  52. package/dist/features/about/components/AboutView.js +2 -2
  53. package/dist/features/about/components/DeveloperView.js +2 -2
  54. package/dist/features/about/schemas/firestore.d.ts +1 -0
  55. package/dist/features/account/components/UserSidebar.js +8 -2
  56. package/dist/features/account/hooks/useProfile.d.ts +2 -0
  57. package/dist/features/admin/components/AdminSidebar.js +8 -2
  58. package/dist/features/admin/components/AdminSiteSettingsView.js +12 -4
  59. package/dist/features/admin/schemas/firestore.d.ts +9 -0
  60. package/dist/features/admin/schemas/firestore.js +6 -0
  61. package/dist/features/auctions/actions/bid-actions.js +4 -1
  62. package/dist/features/auctions/components/AuctionBottomActions.d.ts +2 -1
  63. package/dist/features/auctions/components/AuctionBottomActions.js +14 -1
  64. package/dist/features/auctions/components/AuctionDetailPageView.js +21 -9
  65. package/dist/features/auctions/components/LiveMinIncrement.d.ts +18 -0
  66. package/dist/features/auctions/components/LiveMinIncrement.js +17 -0
  67. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +5 -2
  68. package/dist/features/auctions/components/PlaceBidFormClient.js +7 -3
  69. package/dist/features/auth/schemas/firestore.d.ts +3 -0
  70. package/dist/features/cart/components/CartDrawer.js +4 -1
  71. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.d.ts +11 -0
  72. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +33 -0
  73. package/dist/features/catalogue/components/PublicCatalogueView.js +2 -1
  74. package/dist/features/catalogue/index.d.ts +2 -0
  75. package/dist/features/catalogue/index.js +1 -0
  76. package/dist/features/categories/components/BundleDetailView.d.ts +3 -1
  77. package/dist/features/categories/components/BundleDetailView.js +3 -2
  78. package/dist/features/classified/components/ClassifiedContactSellerPanel.d.ts +12 -0
  79. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +49 -0
  80. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +7 -0
  81. package/dist/features/classified/components/ClassifiedDetailPageView.js +69 -0
  82. package/dist/features/contact/components/ContactPageView.js +8 -2
  83. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.d.ts +19 -0
  84. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +79 -0
  85. package/dist/features/grouped/components/GroupedListingsCarousel.d.ts +13 -0
  86. package/dist/features/grouped/components/GroupedListingsCarousel.js +31 -0
  87. package/dist/features/grouped/repository/grouped-listings.repository.d.ts +8 -0
  88. package/dist/features/grouped/repository/grouped-listings.repository.js +16 -0
  89. package/dist/features/homepage/components/BrandsSection.js +3 -1
  90. package/dist/features/homepage/components/FeaturedBundlesSection.js +12 -1
  91. package/dist/features/homepage/components/GoogleReviewsSection.js +2 -2
  92. package/dist/features/homepage/components/HeroCarousel.js +3 -1
  93. package/dist/features/homepage/components/SectionCarousel.js +5 -2
  94. package/dist/features/homepage/components/SocialFeedSection.js +2 -2
  95. package/dist/features/homepage/components/WhatsAppCommunitySection.js +3 -1
  96. package/dist/features/layout/BackToTop.js +3 -1
  97. package/dist/features/layout/BottomActions.js +4 -3
  98. package/dist/features/layout/BottomActionsContext.d.ts +10 -0
  99. package/dist/features/layout/BottomActionsContext.js +5 -1
  100. package/dist/features/layout/SidebarLayout.js +7 -1
  101. package/dist/features/layout/hooks/useBottomActions.d.ts +2 -0
  102. package/dist/features/layout/hooks/useBottomActions.js +4 -1
  103. package/dist/features/live/components/LiveItemDetailPageView.d.ts +9 -0
  104. package/dist/features/live/components/LiveItemDetailPageView.js +74 -0
  105. package/dist/features/media/MediaVideo.js +17 -1
  106. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +9 -1
  107. package/dist/features/products/components/PrizeDrawDetailPageView.js +11 -1
  108. package/dist/features/products/components/ProductDetailPageView.js +11 -116
  109. package/dist/features/products/components/RelatedItemsSection.d.ts +16 -0
  110. package/dist/features/products/components/RelatedItemsSection.js +17 -0
  111. package/dist/features/seller/components/SellerProductShell.js +1 -1
  112. package/dist/features/seller/components/SellerSidebar.js +8 -2
  113. package/dist/features/shell/QuickFormDrawer.js +3 -1
  114. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +114 -3
  115. package/dist/hand-mode/index.d.ts +12 -0
  116. package/dist/hand-mode/index.js +11 -0
  117. package/dist/index.d.ts +2 -0
  118. package/dist/index.js +1 -0
  119. package/dist/next/routing/route-map.d.ts +2 -0
  120. package/dist/next/routing/route-map.js +7 -0
  121. package/dist/react/contexts/SessionContext.d.ts +5 -0
  122. package/dist/react/contexts/SessionContext.js +2 -0
  123. package/dist/seed/bids-seed-data.js +48 -3
  124. package/dist/seed/grouped-listings-seed-data.js +167 -0
  125. package/dist/seed/payouts-seed-data.js +4 -4
  126. package/dist/seed/products-art-seed-data.js +188 -5
  127. package/dist/seed/products-auctions-seed-data.js +215 -6
  128. package/dist/seed/products-classifieds-seed-data.js +255 -8
  129. package/dist/seed/products-digital-codes-seed-data.js +258 -19
  130. package/dist/seed/products-live-items-seed-data.js +143 -10
  131. package/dist/seed/products-preorders-seed-data.js +213 -8
  132. package/dist/seed/products-prize-draws-seed-data.js +198 -0
  133. package/dist/seed/products-standard-seed-data.js +141 -0
  134. package/dist/seed/products-stickers-seed-data.js +178 -5
  135. package/dist/seed/site-settings-seed-data.js +13 -31
  136. package/dist/seed/store-extensions-seed-data.js +1 -1
  137. package/dist/server-entry.d.ts +5 -2
  138. package/dist/server-entry.js +5 -2
  139. package/dist/server.d.ts +4 -2
  140. package/dist/server.js +4 -2
  141. package/dist/styles.css +30 -1
  142. package/dist/tailwind-utilities.css +1 -1
  143. package/dist/ui/components/Drawer.js +7 -4
  144. package/dist/ui/components/FilterDrawer.js +1 -1
  145. package/dist/ui/components/HandModeRow.d.ts +12 -0
  146. package/dist/ui/components/HandModeRow.js +18 -0
  147. package/dist/ui/components/ImageLightbox.js +37 -3
  148. package/dist/ui/components/ImageLightbox.style.css +28 -0
  149. package/dist/ui/components/Layout.d.ts +5 -1
  150. package/dist/ui/components/Layout.js +2 -1
  151. package/dist/ui/components/Layout.style.css +1 -0
  152. package/dist/ui/components/ListingFilterDrawer.js +3 -1
  153. package/dist/ui/components/Modal.js +3 -1
  154. package/dist/ui/components/SideDrawer.js +8 -5
  155. package/dist/ui/components/SideModal.js +7 -4
  156. package/dist/ui/index.d.ts +1 -0
  157. package/dist/ui/index.js +1 -0
  158. package/dist/utils/media-url.d.ts +9 -0
  159. package/dist/utils/media-url.js +39 -0
  160. package/package.json +1 -1
@@ -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);
@@ -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
+ ];