@mohasinac/appkit 4.9.5 → 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 (108) hide show
  1. package/dist/_internal/server/features/auctions/actions.js +3 -2
  2. package/dist/_internal/server/features/auctions/service.d.ts +4 -3
  3. package/dist/_internal/server/features/auctions/service.js +6 -6
  4. package/dist/_internal/server/features/bundles/data.d.ts +9 -0
  5. package/dist/_internal/server/features/bundles/data.js +14 -0
  6. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  7. package/dist/_internal/server/features/bundles/index.js +1 -1
  8. package/dist/_internal/server/features/catalogue/og.d.ts +20 -0
  9. package/dist/_internal/server/features/catalogue/og.js +27 -0
  10. package/dist/_internal/server/features/grouped/data.d.ts +12 -0
  11. package/dist/_internal/server/features/grouped/data.js +26 -1
  12. package/dist/_internal/server/features/grouped/index.d.ts +1 -1
  13. package/dist/_internal/server/features/grouped/index.js +1 -1
  14. package/dist/_internal/server/features/products/data.d.ts +23 -0
  15. package/dist/_internal/server/features/products/data.js +159 -0
  16. package/dist/_internal/server/features/products/index.d.ts +1 -1
  17. package/dist/_internal/server/features/products/index.js +1 -1
  18. package/dist/_internal/shared/features/auctions/config.d.ts +20 -0
  19. package/dist/_internal/shared/features/auctions/config.js +31 -1
  20. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -1
  21. package/dist/_internal/shared/listing-types/art/config.js +1 -1
  22. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -1
  23. package/dist/_internal/shared/listing-types/classified/config.js +1 -1
  24. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -1
  25. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -1
  26. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -1
  27. package/dist/_internal/shared/listing-types/live/config.js +1 -1
  28. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -1
  29. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -1
  30. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -1
  31. package/dist/_internal/shared/listing-types/stickers/config.js +1 -1
  32. package/dist/client.d.ts +0 -6
  33. package/dist/client.js +1 -4
  34. package/dist/constants/api-endpoints.d.ts +3 -0
  35. package/dist/constants/api-endpoints.js +1 -0
  36. package/dist/features/admin/components/AdminSiteSettingsView.js +12 -4
  37. package/dist/features/admin/schemas/firestore.d.ts +9 -0
  38. package/dist/features/admin/schemas/firestore.js +6 -0
  39. package/dist/features/auctions/actions/bid-actions.js +4 -1
  40. package/dist/features/auctions/components/AuctionBottomActions.d.ts +2 -1
  41. package/dist/features/auctions/components/AuctionBottomActions.js +14 -1
  42. package/dist/features/auctions/components/AuctionDetailPageView.js +21 -9
  43. package/dist/features/auctions/components/LiveMinIncrement.d.ts +18 -0
  44. package/dist/features/auctions/components/LiveMinIncrement.js +17 -0
  45. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +5 -2
  46. package/dist/features/auctions/components/PlaceBidFormClient.js +7 -3
  47. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.d.ts +11 -0
  48. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +33 -0
  49. package/dist/features/catalogue/components/PublicCatalogueView.js +2 -1
  50. package/dist/features/catalogue/index.d.ts +2 -0
  51. package/dist/features/catalogue/index.js +1 -0
  52. package/dist/features/categories/components/BundleDetailView.d.ts +3 -1
  53. package/dist/features/categories/components/BundleDetailView.js +3 -2
  54. package/dist/features/classified/components/ClassifiedContactSellerPanel.d.ts +12 -0
  55. package/dist/features/classified/components/ClassifiedContactSellerPanel.js +49 -0
  56. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +7 -0
  57. package/dist/features/classified/components/ClassifiedDetailPageView.js +69 -0
  58. package/dist/features/contact/components/ContactPageView.js +8 -2
  59. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.d.ts +19 -0
  60. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +79 -0
  61. package/dist/features/grouped/components/GroupedListingsCarousel.d.ts +13 -0
  62. package/dist/features/grouped/components/GroupedListingsCarousel.js +31 -0
  63. package/dist/features/grouped/repository/grouped-listings.repository.d.ts +8 -0
  64. package/dist/features/grouped/repository/grouped-listings.repository.js +16 -0
  65. package/dist/features/layout/BottomActions.js +4 -3
  66. package/dist/features/layout/BottomActionsContext.d.ts +10 -0
  67. package/dist/features/layout/BottomActionsContext.js +5 -1
  68. package/dist/features/layout/hooks/useBottomActions.d.ts +2 -0
  69. package/dist/features/layout/hooks/useBottomActions.js +4 -1
  70. package/dist/features/live/components/LiveItemDetailPageView.d.ts +9 -0
  71. package/dist/features/live/components/LiveItemDetailPageView.js +74 -0
  72. package/dist/features/media/MediaVideo.js +17 -1
  73. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +9 -1
  74. package/dist/features/products/components/PrizeDrawDetailPageView.js +11 -1
  75. package/dist/features/products/components/ProductDetailPageView.js +11 -116
  76. package/dist/features/products/components/RelatedItemsSection.d.ts +16 -0
  77. package/dist/features/products/components/RelatedItemsSection.js +17 -0
  78. package/dist/features/seller/components/SellerProductShell.js +1 -1
  79. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +83 -3
  80. package/dist/index.d.ts +2 -0
  81. package/dist/index.js +1 -0
  82. package/dist/next/routing/route-map.d.ts +2 -0
  83. package/dist/next/routing/route-map.js +7 -0
  84. package/dist/seed/bids-seed-data.js +48 -3
  85. package/dist/seed/grouped-listings-seed-data.js +167 -0
  86. package/dist/seed/payouts-seed-data.js +4 -4
  87. package/dist/seed/products-art-seed-data.js +188 -5
  88. package/dist/seed/products-auctions-seed-data.js +215 -6
  89. package/dist/seed/products-classifieds-seed-data.js +255 -8
  90. package/dist/seed/products-digital-codes-seed-data.js +258 -19
  91. package/dist/seed/products-live-items-seed-data.js +143 -10
  92. package/dist/seed/products-preorders-seed-data.js +213 -8
  93. package/dist/seed/products-prize-draws-seed-data.js +198 -0
  94. package/dist/seed/products-standard-seed-data.js +141 -0
  95. package/dist/seed/products-stickers-seed-data.js +178 -5
  96. package/dist/seed/site-settings-seed-data.js +10 -29
  97. package/dist/seed/store-extensions-seed-data.js +1 -1
  98. package/dist/server-entry.d.ts +4 -1
  99. package/dist/server-entry.js +4 -1
  100. package/dist/server.d.ts +4 -2
  101. package/dist/server.js +4 -2
  102. package/dist/styles.css +29 -1
  103. package/dist/tailwind-utilities.css +1 -1
  104. package/dist/ui/components/ImageLightbox.js +37 -3
  105. package/dist/ui/components/ImageLightbox.style.css +28 -0
  106. package/dist/utils/media-url.d.ts +9 -0
  107. package/dist/utils/media-url.js +39 -0
  108. package/package.json +1 -1
@@ -1,12 +1,15 @@
1
1
  /*
2
- * WHY: Real (non-tester-sandbox) classified listing so testers and shoppers can exercise
3
- * the classified contact-seller flow (no checkout, chat/phone only) against permanent
4
- * catalog content. Previously an empty stub "out of scope for the minimal
5
- * Beyblade-focused demo catalog" now populated with one seller-run local listing.
6
- * WHAT: Exports 1 classified listing on Beyblade Arena — local meetup, negotiable.
2
+ * WHY: Seeds a Beyblade classifieds catalog with real geographic and meta-field variety.
3
+ * The original 1-fixture file only ever exercised one city (Mumbai), one
4
+ * `contactMethod` ("both"), and always `acceptsShipping:false`/`negotiable:true`
5
+ * no variety to exercise the classifieds filter UI or the contact-method-specific
6
+ * copy on the detail page (see CLAUDE.md seed-data blandness sweep, 2026-08-20).
7
+ * WHAT: Exports 7 classified listings on Beyblade Arena — local meetups across 5 Indian
8
+ * cities, covering all 3 contactMethod values and both true/false states of
9
+ * acceptsShipping/negotiable.
7
10
  *
8
11
  * EXPORTS:
9
- * productsClassifiedsSeedData — Array of 1 Partial<ProductDocument> with listingType:"classified"
12
+ * productsClassifiedsSeedData — Array of 7 Partial<ProductDocument> with listingType:"classified"
10
13
  *
11
14
  * @tag domain:products,classifieds
12
15
  * @tag layer:seed
@@ -23,7 +26,7 @@ export const productsClassifiedsSeedData = [
23
26
  id: "classified-beyblade-stadium-set",
24
27
  slug: "classified-beyblade-stadium-set",
25
28
  title: "Used Beyblade Stadium Set — Local Pickup Only",
26
- description: "Well-loved Beyblade stadium with 6 tops and 2 launchers, sold as-is. Meet up locally or arrange your own shipping — price is negotiable.",
29
+ description: "Well-loved Beyblade stadium with 6 tops and 2 launchers, sold as-is. Meet up locally — price is negotiable.",
27
30
  categorySlugs: ["category-spinning-tops"],
28
31
  categoryNames: ["Spinning Tops"],
29
32
  brandSlug: "brand-beyblade",
@@ -34,7 +37,10 @@ export const productsClassifiedsSeedData = [
34
37
  availableQuantity: 1,
35
38
  isSold: false,
36
39
  mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-1-20260101/900/900"),
37
- images: [seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-1-20260101/900/900")],
40
+ images: [
41
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-1-20260101/900/900"),
42
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-2-20260101/900/900"),
43
+ ],
38
44
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
39
45
  condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
40
46
  listingType: "classified",
@@ -56,4 +62,245 @@ export const productsClassifiedsSeedData = [
56
62
  updatedAt: new Date("2026-05-05"),
57
63
  searchTokens: buildSearchTokens("Used Beyblade Stadium Set — Local Pickup Only", "Well-loved Beyblade stadium with 6 tops and 2 launchers.", "Beyblade", "brand-beyblade", ["Spinning Tops"], ["classified", "local-pickup"]),
58
64
  },
65
+ {
66
+ id: "classified-beyblade-burst-collection-bengaluru",
67
+ slug: "classified-beyblade-burst-collection-bengaluru",
68
+ title: "Beyblade Burst Collection (12 Tops) — Bengaluru",
69
+ description: "Downsizing my Burst collection — 12 tops in good condition, fixed price, will also ship nationwide if you'd rather not meet up.",
70
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
71
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
72
+ brandSlug: "brand-beyblade",
73
+ brand: "Beyblade",
74
+ price: 4500,
75
+ currency: "INR",
76
+ stockQuantity: 1,
77
+ availableQuantity: 1,
78
+ isSold: false,
79
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-burst-bengaluru-1-20260813/900/900"),
80
+ images: [
81
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-burst-bengaluru-1-20260813/900/900"),
82
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-burst-bengaluru-2-20260813/900/900"),
83
+ ],
84
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
85
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
86
+ listingType: "classified",
87
+ storeId: "store-beyblade-arena",
88
+ storeName: "Beyblade Arena",
89
+ classified: {
90
+ meetupArea: { city: "Bengaluru", locality: "Koramangala", pincode: "560034" },
91
+ contactMethod: "chat",
92
+ acceptsShipping: true,
93
+ negotiable: false,
94
+ },
95
+ customFields: [{ key: "Item Count", type: "number", value: "12" }],
96
+ customSections: [],
97
+ featured: false,
98
+ isPromoted: false,
99
+ isOnSale: false,
100
+ tags: ["classified", "bulk-lot"],
101
+ createdAt: new Date("2026-08-13"),
102
+ updatedAt: new Date("2026-08-13"),
103
+ searchTokens: buildSearchTokens("Beyblade Burst Collection (12 Tops) — Bengaluru", "Downsizing my Burst collection, fixed price, ships nationwide.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["classified", "bulk-lot"]),
104
+ },
105
+ {
106
+ id: "classified-beyblade-x-starter-pune",
107
+ slug: "classified-beyblade-x-starter-pune",
108
+ title: "Beyblade X Starter Pack — Pune, Phone Contact Only",
109
+ description: "Barely used Beyblade X starter pack, selling because I upgraded to a full set. Call or WhatsApp only, no chat.",
110
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
111
+ categoryNames: ["Beyblade X", "Spinning Tops"],
112
+ brandSlug: "brand-takara-tomy",
113
+ brand: "Takara-Tomy",
114
+ price: 650,
115
+ currency: "INR",
116
+ stockQuantity: 1,
117
+ availableQuantity: 1,
118
+ isSold: false,
119
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-x-pune-1-20260814/900/900"),
120
+ images: [seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-x-pune-1-20260814/900/900")],
121
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
122
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
123
+ listingType: "classified",
124
+ storeId: "store-beyblade-arena",
125
+ storeName: "Beyblade Arena",
126
+ classified: {
127
+ meetupArea: { city: "Pune", locality: "Kothrud", pincode: "411038" },
128
+ contactMethod: "phone",
129
+ acceptsShipping: false,
130
+ negotiable: true,
131
+ },
132
+ customFields: [],
133
+ customSections: [],
134
+ featured: false,
135
+ isPromoted: false,
136
+ isOnSale: false,
137
+ tags: ["classified", "local-pickup", "starter-set"],
138
+ createdAt: new Date("2026-08-14"),
139
+ updatedAt: new Date("2026-08-14"),
140
+ searchTokens: buildSearchTokens("Beyblade X Starter Pack — Pune, Phone Contact Only", "Barely used Beyblade X starter pack, phone/WhatsApp only.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["classified", "local-pickup", "starter-set"]),
141
+ },
142
+ {
143
+ id: "classified-beyblade-metal-vintage-delhi",
144
+ slug: "classified-beyblade-metal-vintage-delhi",
145
+ title: "Vintage Metal Fight Lot (5 Tops) — Delhi NCR",
146
+ description: "A well-preserved 5-top Metal Fight lot from a long-time collector. Firm price, ships anywhere in India.",
147
+ categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
148
+ categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
149
+ brandSlug: "brand-takara-tomy",
150
+ brand: "Takara-Tomy",
151
+ price: 3200,
152
+ currency: "INR",
153
+ stockQuantity: 1,
154
+ availableQuantity: 1,
155
+ isSold: false,
156
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-metal-delhi-1-20260815/900/900"),
157
+ images: [
158
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-metal-delhi-1-20260815/900/900"),
159
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-metal-delhi-2-20260815/900/900"),
160
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-metal-delhi-3-20260815/900/900"),
161
+ ],
162
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
163
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
164
+ listingType: "classified",
165
+ storeId: "store-beyblade-arena",
166
+ storeName: "Beyblade Arena",
167
+ classified: {
168
+ meetupArea: { city: "New Delhi", locality: "Rajouri Garden", pincode: "110027" },
169
+ contactMethod: "both",
170
+ acceptsShipping: true,
171
+ negotiable: false,
172
+ },
173
+ customFields: [{ key: "Item Count", type: "number", value: "5" }],
174
+ customSections: [
175
+ {
176
+ id: "collector-notes",
177
+ title: "Collector's Notes",
178
+ text: "All 5 tops have been kept in a display case since purchase — minor shelf wear only, no chips or cracks on any layer/energy ring.",
179
+ },
180
+ ],
181
+ featured: true,
182
+ isPromoted: false,
183
+ isOnSale: false,
184
+ tags: ["classified", "bulk-lot", "vintage-collectible"],
185
+ createdAt: new Date("2026-08-15"),
186
+ updatedAt: new Date("2026-08-16"),
187
+ searchTokens: buildSearchTokens("Vintage Metal Fight Lot (5 Tops) — Delhi NCR", "Well-preserved 5-top Metal Fight lot, firm price, ships anywhere.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade Metal Fight", "Spinning Tops"], ["classified", "bulk-lot", "vintage-collectible"]),
188
+ },
189
+ {
190
+ id: "classified-beyblade-original-grail-chennai",
191
+ slug: "classified-beyblade-original-grail-chennai",
192
+ title: "Original Series Grail Piece — Chennai, Meet Up Only",
193
+ description: "A genuine original-series grail piece, only selling to a local buyer I can meet in person to verify authenticity together.",
194
+ categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
195
+ categoryNames: ["Beyblade Original", "Spinning Tops"],
196
+ brandSlug: "brand-beyblade",
197
+ brand: "Beyblade",
198
+ price: 8000,
199
+ currency: "INR",
200
+ stockQuantity: 1,
201
+ availableQuantity: 1,
202
+ isSold: false,
203
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-original-chennai-1-20260816/900/900"),
204
+ images: [
205
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-original-chennai-1-20260816/900/900"),
206
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-original-chennai-2-20260816/900/900"),
207
+ ],
208
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
209
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
210
+ listingType: "classified",
211
+ storeId: "store-beyblade-arena",
212
+ storeName: "Beyblade Arena",
213
+ classified: {
214
+ meetupArea: { city: "Chennai", locality: "T. Nagar", pincode: "600017" },
215
+ contactMethod: "chat",
216
+ acceptsShipping: false,
217
+ negotiable: false,
218
+ },
219
+ customFields: [{ key: "Authenticity Verified", type: "boolean", value: "true" }],
220
+ customSections: [],
221
+ featured: false,
222
+ isPromoted: false,
223
+ isOnSale: false,
224
+ tags: ["classified", "vintage-collectible", "local-pickup"],
225
+ createdAt: new Date("2026-08-16"),
226
+ updatedAt: new Date("2026-08-16"),
227
+ searchTokens: buildSearchTokens("Original Series Grail Piece — Chennai, Meet Up Only", "Genuine original-series grail piece, local meetup verification only.", "Beyblade", "brand-beyblade", ["Beyblade Original", "Spinning Tops"], ["classified", "vintage-collectible", "local-pickup"]),
228
+ },
229
+ {
230
+ id: "classified-beyblade-x-tournament-kit-hyderabad",
231
+ slug: "classified-beyblade-x-tournament-kit-hyderabad",
232
+ title: "Tournament-Ready Beyblade X Kit — Hyderabad",
233
+ description: "Complete tournament-legal kit including 3 tops, stadium, and a scorecard pad from our last local meetup event.",
234
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
235
+ categoryNames: ["Beyblade X", "Spinning Tops"],
236
+ brandSlug: "brand-takara-tomy",
237
+ brand: "Takara-Tomy",
238
+ price: 2400,
239
+ currency: "INR",
240
+ stockQuantity: 1,
241
+ availableQuantity: 1,
242
+ isSold: false,
243
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-x-hyderabad-1-20260817/900/900"),
244
+ images: [
245
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-x-hyderabad-1-20260817/900/900"),
246
+ seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-x-hyderabad-2-20260817/900/900"),
247
+ ],
248
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
249
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
250
+ listingType: "classified",
251
+ storeId: "store-beyblade-arena",
252
+ storeName: "Beyblade Arena",
253
+ classified: {
254
+ meetupArea: { city: "Hyderabad", locality: "Banjara Hills", pincode: "500034" },
255
+ contactMethod: "phone",
256
+ acceptsShipping: true,
257
+ negotiable: true,
258
+ },
259
+ customFields: [{ key: "Tournament Legal", type: "boolean", value: "true" }],
260
+ customSections: [],
261
+ featured: false,
262
+ isPromoted: false,
263
+ isOnSale: false,
264
+ tags: ["classified", "tournament-grade"],
265
+ createdAt: new Date("2026-08-17"),
266
+ updatedAt: new Date("2026-08-17"),
267
+ searchTokens: buildSearchTokens("Tournament-Ready Beyblade X Kit — Hyderabad", "Complete tournament-legal kit including stadium and scorecard pad.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["classified", "tournament-grade"]),
268
+ },
269
+ {
270
+ id: "classified-beyblade-burst-parts-mumbai",
271
+ slug: "classified-beyblade-burst-parts-mumbai",
272
+ title: "Spare Burst Parts Bundle — Mumbai, Ships Too",
273
+ description: "Assorted spare Burst layers, discs, and drivers cleared out from my parts box. Happy to meet locally or ship.",
274
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
275
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
276
+ brandSlug: "brand-beyblade",
277
+ brand: "Beyblade",
278
+ price: 450,
279
+ currency: "INR",
280
+ stockQuantity: 1,
281
+ availableQuantity: 1,
282
+ isSold: false,
283
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-burst-mumbai-1-20260818/900/900"),
284
+ images: [seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-burst-mumbai-1-20260818/900/900")],
285
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
286
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
287
+ listingType: "classified",
288
+ storeId: "store-beyblade-arena",
289
+ storeName: "Beyblade Arena",
290
+ classified: {
291
+ meetupArea: { city: "Mumbai", locality: "Powai", pincode: "400076" },
292
+ contactMethod: "both",
293
+ acceptsShipping: true,
294
+ negotiable: true,
295
+ },
296
+ customFields: [],
297
+ customSections: [],
298
+ featured: false,
299
+ isPromoted: false,
300
+ isOnSale: false,
301
+ tags: ["classified", "spare-parts"],
302
+ createdAt: new Date("2026-08-18"),
303
+ updatedAt: new Date("2026-08-18"),
304
+ searchTokens: buildSearchTokens("Spare Burst Parts Bundle — Mumbai, Ships Too", "Assorted spare Burst layers, discs, and drivers.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["classified", "spare-parts"]),
305
+ },
59
306
  ];
@@ -1,12 +1,14 @@
1
1
  /*
2
- * WHY: Real (non-tester-sandbox) digital-code listing so testers and shoppers can exercise
3
- * the auto-claim digital delivery flow against permanent catalog content. Previously an
4
- * empty stub "out of scope for the minimal Beyblade-focused demo catalog" — now
5
- * populated with one companion-app unlock code, on-theme for the spinning-tops catalog.
6
- * WHAT: Exports 1 digital-code listing on Beyblade Arena — auto-claim delivery.
2
+ * WHY: Seeds a Beyblade digital-code catalog with real pool/redemption variety. The
3
+ * original 1-fixture file only ever exercised `codeDeliveryMethod:"auto-claim"` with
4
+ * `codesAvailable === codePoolSize` (i.e. no fixture ever showed a partially-redeemed
5
+ * or sold-out pool, and `manual-email` delivery was never exercised at all) — see
6
+ * CLAUDE.md seed-data blandness sweep, 2026-08-20 session.
7
+ * WHAT: Exports 7 digital-code listings on Beyblade Arena — mixed auto-claim/manual-email
8
+ * delivery, partially-redeemed and fully-sold-out pools, and expiring codes.
7
9
  *
8
10
  * EXPORTS:
9
- * productsDigitalCodesSeedData — Array of 1 Partial<ProductDocument> with listingType:"digital-code"
11
+ * productsDigitalCodesSeedData — Array of 7 Partial<ProductDocument> with listingType:"digital-code"
10
12
  *
11
13
  * @tag domain:products,digital-codes
12
14
  * @tag layer:seed
@@ -20,12 +22,12 @@ import { buildSearchTokens } from "../utils/search-tokens";
20
22
  import { seedExtMedia } from "./_helpers/media";
21
23
  export const productsDigitalCodesSeedData = [
22
24
  {
23
- id: "digitalcode-beyblade-x-app-unlock",
24
- slug: "digitalcode-beyblade-x-app-unlock",
25
- title: "Beyblade X Companion App — Premium Unlock Code",
26
- description: "Digital unlock code for the Beyblade X companion app's premium tournament tracker and battle-log features. Delivered instantly after payment.",
27
- categorySlugs: ["category-spinning-tops"],
28
- categoryNames: ["Spinning Tops"],
25
+ id: "digitalcode-beyblade-x-app-starter-pack",
26
+ slug: "digitalcode-beyblade-x-app-starter-pack",
27
+ title: "Beyblade X App — Starter Pack Code",
28
+ description: "Digital redemption code for the Beyblade X companion app's Starter Pack instantly unlocks 5 exclusive digital tops.",
29
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
30
+ categoryNames: ["Beyblade X", "Spinning Tops"],
29
31
  brandSlug: "brand-takara-tomy",
30
32
  brand: "Takara-Tomy",
31
33
  price: 199,
@@ -33,8 +35,11 @@ export const productsDigitalCodesSeedData = [
33
35
  stockQuantity: 25,
34
36
  availableQuantity: 25,
35
37
  isSold: false,
36
- mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-app-unlock-1-20260101/900/900"),
37
- images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-app-unlock-1-20260101/900/900")],
38
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-starter-1-20260101/900/900"),
39
+ images: [
40
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-starter-1-20260101/900/900"),
41
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-starter-2-20260101/900/900"),
42
+ ],
38
43
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
39
44
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
40
45
  listingType: "digital-code",
@@ -44,16 +49,250 @@ export const productsDigitalCodesSeedData = [
44
49
  codeDeliveryMethod: "auto-claim",
45
50
  codePoolSize: 25,
46
51
  codesAvailable: 25,
47
- redemptionInstructions: "Open the Beyblade X companion app, go to Settings → Redeem Code, and enter your code to unlock premium features.",
52
+ redemptionInstructions: "Open the Beyblade X app, go to Settings → Redeem Code, and paste your code to unlock the Starter Pack instantly.",
48
53
  },
49
54
  customFields: [],
50
55
  customSections: [],
51
56
  featured: false,
52
57
  isPromoted: false,
53
58
  isOnSale: false,
54
- tags: ["digital-code", "app-unlock"],
55
- createdAt: new Date("2026-05-05"),
56
- updatedAt: new Date("2026-05-05"),
57
- searchTokens: buildSearchTokens("Beyblade X Companion App — Premium Unlock Code", "Digital unlock code for the Beyblade X companion app.", "Takara-Tomy", "brand-takara-tomy", ["Spinning Tops"], ["digital-code", "app-unlock"]),
59
+ tags: ["digital-code", "app-content"],
60
+ createdAt: new Date("2026-05-06"),
61
+ updatedAt: new Date("2026-05-06"),
62
+ searchTokens: buildSearchTokens("Beyblade X App — Starter Pack Code", "Digital redemption code for the Beyblade X companion app.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["digital-code", "app-content"]),
63
+ },
64
+ {
65
+ id: "digitalcode-beyblade-x-app-legendary-pack",
66
+ slug: "digitalcode-beyblade-x-app-legendary-pack",
67
+ title: "Beyblade X App — Legendary Pack Code (Partially Claimed)",
68
+ description: "Unlocks 3 legendary digital tops in the companion app. Popular pack — most of the batch has already been claimed.",
69
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
70
+ categoryNames: ["Beyblade X", "Spinning Tops"],
71
+ brandSlug: "brand-takara-tomy",
72
+ brand: "Takara-Tomy",
73
+ price: 349,
74
+ currency: "INR",
75
+ stockQuantity: 40,
76
+ availableQuantity: 6,
77
+ isSold: false,
78
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-legendary-1-20260814/900/900"),
79
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-legendary-1-20260814/900/900")],
80
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
81
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
82
+ listingType: "digital-code",
83
+ storeId: "store-beyblade-arena",
84
+ storeName: "Beyblade Arena",
85
+ digitalCode: {
86
+ codeDeliveryMethod: "auto-claim",
87
+ codePoolSize: 40,
88
+ codesAvailable: 6,
89
+ redemptionInstructions: "Open the Beyblade X app, go to Settings → Redeem Code, and paste your code to unlock the Legendary Pack instantly.",
90
+ expiresAt: new Date(Date.now() + 60 * 24 * 60 * 60 * 1000),
91
+ },
92
+ customFields: [],
93
+ customSections: [],
94
+ featured: true,
95
+ isPromoted: true,
96
+ isOnSale: false,
97
+ tags: ["digital-code", "app-content"],
98
+ createdAt: new Date("2026-08-14"),
99
+ updatedAt: new Date("2026-08-19"),
100
+ searchTokens: buildSearchTokens("Beyblade X App — Legendary Pack Code (Partially Claimed)", "Unlocks 3 legendary digital tops, most of the batch already claimed.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["digital-code", "app-content"]),
101
+ },
102
+ {
103
+ id: "digitalcode-beyblade-burst-app-sold-out",
104
+ slug: "digitalcode-beyblade-burst-app-sold-out",
105
+ title: "Beyblade Burst App — Anniversary Pack Code (Sold Out)",
106
+ description: "Limited-run anniversary code pack for the Beyblade Burst app — every code in this batch has been claimed.",
107
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
108
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
109
+ brandSlug: "brand-beyblade",
110
+ brand: "Beyblade",
111
+ price: 299,
112
+ currency: "INR",
113
+ stockQuantity: 15,
114
+ availableQuantity: 0,
115
+ isSold: false,
116
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-sold-out-1-20260810/900/900"),
117
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-sold-out-1-20260810/900/900")],
118
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
119
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
120
+ listingType: "digital-code",
121
+ storeId: "store-beyblade-arena",
122
+ storeName: "Beyblade Arena",
123
+ digitalCode: {
124
+ codeDeliveryMethod: "auto-claim",
125
+ codePoolSize: 15,
126
+ codesAvailable: 0,
127
+ redemptionInstructions: "Open the Beyblade Burst app, go to Settings → Redeem Code, and paste your code to unlock the Anniversary Pack.",
128
+ },
129
+ customFields: [],
130
+ customSections: [],
131
+ featured: false,
132
+ isPromoted: false,
133
+ isOnSale: false,
134
+ tags: ["digital-code", "app-content", "limited-run"],
135
+ createdAt: new Date("2026-08-01"),
136
+ updatedAt: new Date("2026-08-10"),
137
+ searchTokens: buildSearchTokens("Beyblade Burst App — Anniversary Pack Code (Sold Out)", "Limited-run anniversary code pack, every code claimed.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["digital-code", "app-content", "limited-run"]),
138
+ },
139
+ {
140
+ id: "digitalcode-beyblade-x-manual-tournament-pass",
141
+ slug: "digitalcode-beyblade-x-manual-tournament-pass",
142
+ title: "Beyblade X Regional Tournament — Digital Entry Pass",
143
+ description: "Digital entry pass for the next regional tournament, emailed manually by the organizer within 24 hours of purchase.",
144
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
145
+ categoryNames: ["Beyblade X", "Spinning Tops"],
146
+ brandSlug: "brand-takara-tomy",
147
+ brand: "Takara-Tomy",
148
+ price: 499,
149
+ currency: "INR",
150
+ stockQuantity: 50,
151
+ availableQuantity: 32,
152
+ isSold: false,
153
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-tournament-1-20260815/900/900"),
154
+ images: [
155
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-tournament-1-20260815/900/900"),
156
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-tournament-2-20260815/900/900"),
157
+ ],
158
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
159
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
160
+ listingType: "digital-code",
161
+ storeId: "store-beyblade-arena",
162
+ storeName: "Beyblade Arena",
163
+ digitalCode: {
164
+ codeDeliveryMethod: "manual-email",
165
+ codePoolSize: 50,
166
+ codesAvailable: 32,
167
+ redemptionInstructions: "Your tournament entry pass will be emailed within 24 hours of purchase. Check your spam folder if it doesn't arrive.",
168
+ expiresAt: new Date(Date.now() + 20 * 24 * 60 * 60 * 1000),
169
+ },
170
+ customFields: [{ key: "Manual Fulfillment", type: "boolean", value: "true" }],
171
+ customSections: [],
172
+ featured: false,
173
+ isPromoted: false,
174
+ isOnSale: false,
175
+ tags: ["digital-code", "tournament-grade"],
176
+ createdAt: new Date("2026-08-15"),
177
+ updatedAt: new Date("2026-08-15"),
178
+ searchTokens: buildSearchTokens("Beyblade X Regional Tournament — Digital Entry Pass", "Digital entry pass, emailed manually by the organizer.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["digital-code", "tournament-grade"]),
179
+ },
180
+ {
181
+ id: "digitalcode-beyblade-metal-app-classic-pack",
182
+ slug: "digitalcode-beyblade-metal-app-classic-pack",
183
+ title: "Beyblade Metal Fight App — Classic Pack Code",
184
+ description: "Unlocks the Metal Fight classic-era top roster in the companion app — Storm Pegasus, Lightning L-Drago, and more.",
185
+ categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
186
+ categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
187
+ brandSlug: "brand-takara-tomy",
188
+ brand: "Takara-Tomy",
189
+ price: 249,
190
+ currency: "INR",
191
+ stockQuantity: 30,
192
+ availableQuantity: 30,
193
+ isSold: false,
194
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-metal-classic-1-20260816/900/900"),
195
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-metal-classic-1-20260816/900/900")],
196
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
197
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
198
+ listingType: "digital-code",
199
+ storeId: "store-beyblade-arena",
200
+ storeName: "Beyblade Arena",
201
+ digitalCode: {
202
+ codeDeliveryMethod: "auto-claim",
203
+ codePoolSize: 30,
204
+ codesAvailable: 30,
205
+ redemptionInstructions: "Open the Beyblade Metal Fight app, go to Settings → Redeem Code, and paste your code to unlock the Classic Pack instantly.",
206
+ },
207
+ customFields: [],
208
+ customSections: [],
209
+ featured: false,
210
+ isPromoted: false,
211
+ isOnSale: false,
212
+ tags: ["digital-code", "app-content"],
213
+ createdAt: new Date("2026-08-16"),
214
+ updatedAt: new Date("2026-08-16"),
215
+ searchTokens: buildSearchTokens("Beyblade Metal Fight App — Classic Pack Code", "Unlocks the Metal Fight classic-era top roster.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade Metal Fight", "Spinning Tops"], ["digital-code", "app-content"]),
216
+ },
217
+ {
218
+ id: "digitalcode-beyblade-burst-app-avatar-skins",
219
+ slug: "digitalcode-beyblade-burst-app-avatar-skins",
220
+ title: "Beyblade Burst App — Avatar Skin Bundle Code",
221
+ description: "Cosmetic-only code bundle — unlocks 8 exclusive player avatar skins in the Beyblade Burst app, no gameplay advantage.",
222
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
223
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
224
+ brandSlug: "brand-beyblade",
225
+ brand: "Beyblade",
226
+ price: 149,
227
+ currency: "INR",
228
+ stockQuantity: 60,
229
+ availableQuantity: 41,
230
+ isSold: false,
231
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-avatar-1-20260817/900/900"),
232
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-burst-avatar-1-20260817/900/900")],
233
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
234
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
235
+ listingType: "digital-code",
236
+ storeId: "store-beyblade-arena",
237
+ storeName: "Beyblade Arena",
238
+ digitalCode: {
239
+ codeDeliveryMethod: "auto-claim",
240
+ codePoolSize: 60,
241
+ codesAvailable: 41,
242
+ redemptionInstructions: "Open the Beyblade Burst app, go to Settings → Redeem Code, and paste your code to unlock all 8 avatar skins instantly.",
243
+ },
244
+ customFields: [{ key: "Cosmetic Only", type: "boolean", value: "true" }],
245
+ customSections: [],
246
+ featured: false,
247
+ isPromoted: false,
248
+ isOnSale: true,
249
+ tags: ["digital-code", "app-content", "cosmetic"],
250
+ createdAt: new Date("2026-08-17"),
251
+ updatedAt: new Date("2026-08-19"),
252
+ searchTokens: buildSearchTokens("Beyblade Burst App — Avatar Skin Bundle Code", "Cosmetic-only code bundle, 8 exclusive player avatar skins.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["digital-code", "app-content", "cosmetic"]),
253
+ },
254
+ {
255
+ id: "digitalcode-beyblade-x-manual-coaching-session",
256
+ slug: "digitalcode-beyblade-x-manual-coaching-session",
257
+ title: "1-on-1 Beyblade X Coaching Session — Digital Booking Code",
258
+ description: "Redeem this code for a 30-minute 1-on-1 video coaching session with a tournament-ranked Beyblade X player. Booking link emailed manually.",
259
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
260
+ categoryNames: ["Beyblade X", "Spinning Tops"],
261
+ brandSlug: "brand-takara-tomy",
262
+ brand: "Takara-Tomy",
263
+ price: 799,
264
+ currency: "INR",
265
+ stockQuantity: 10,
266
+ availableQuantity: 3,
267
+ isSold: false,
268
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-coaching-1-20260818/900/900"),
269
+ images: [
270
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-coaching-1-20260818/900/900"),
271
+ seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-coaching-2-20260818/900/900"),
272
+ ],
273
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
274
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
275
+ listingType: "digital-code",
276
+ storeId: "store-beyblade-arena",
277
+ storeName: "Beyblade Arena",
278
+ digitalCode: {
279
+ codeDeliveryMethod: "manual-email",
280
+ codePoolSize: 10,
281
+ codesAvailable: 3,
282
+ redemptionInstructions: "Your booking link and coach's availability calendar will be emailed within 24 hours of purchase.",
283
+ expiresAt: new Date(Date.now() + 45 * 24 * 60 * 60 * 1000),
284
+ },
285
+ customFields: [
286
+ { key: "Session Length", type: "text", value: "30 minutes" },
287
+ { key: "Manual Fulfillment", type: "boolean", value: "true" },
288
+ ],
289
+ customSections: [],
290
+ featured: true,
291
+ isPromoted: false,
292
+ isOnSale: false,
293
+ tags: ["digital-code", "coaching"],
294
+ createdAt: new Date("2026-08-18"),
295
+ updatedAt: new Date("2026-08-18"),
296
+ searchTokens: buildSearchTokens("1-on-1 Beyblade X Coaching Session — Digital Booking Code", "30-minute 1-on-1 video coaching session, booking link emailed manually.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["digital-code", "coaching"]),
58
297
  },
59
298
  ];