@mohasinac/appkit 4.1.1 → 4.2.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 (225) hide show
  1. package/dist/_internal/client/features/maintenance/index.d.ts +2 -0
  2. package/dist/_internal/client/features/maintenance/index.js +1 -0
  3. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +9 -0
  4. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +55 -0
  5. package/dist/_internal/server/features/auctions/index.d.ts +1 -1
  6. package/dist/_internal/server/features/auctions/index.js +1 -1
  7. package/dist/_internal/server/features/auctions/service.js +2 -2
  8. package/dist/_internal/server/features/checkout/actions.d.ts +15 -0
  9. package/dist/_internal/server/features/checkout/actions.js +245 -182
  10. package/dist/_internal/server/features/maintenance/cloud-logs-data.d.ts +50 -0
  11. package/dist/_internal/server/features/maintenance/cloud-logs-data.js +152 -0
  12. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  13. package/dist/_internal/server/functions/scheduled.js +9 -1
  14. package/dist/_internal/server/jobs/core/jobRunners.js +10 -0
  15. package/dist/_internal/server/jobs/core/newsletterExport.d.ts +15 -0
  16. package/dist/_internal/server/jobs/core/newsletterExport.js +43 -0
  17. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +4 -12
  18. package/dist/_internal/server/jobs/core/onOrderCreate.js +3 -3
  19. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +2 -0
  20. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +1 -0
  21. package/dist/_internal/server/jobs/core/onProductWrite.js +14 -2
  22. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +1 -0
  23. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +1 -0
  24. package/dist/_internal/server/jobs/core/revenueRollup.d.ts +13 -0
  25. package/dist/_internal/server/jobs/core/revenueRollup.js +22 -0
  26. package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +35 -0
  27. package/dist/_internal/server/jobs/core/whatsappNotify.js +82 -0
  28. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  29. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  30. package/dist/_internal/server/jobs/handlers/revenueRollup.d.ts +2 -0
  31. package/dist/_internal/server/jobs/handlers/revenueRollup.js +2 -0
  32. package/dist/_internal/shared/features/auctions/config.d.ts +1 -1
  33. package/dist/_internal/shared/features/auctions/config.js +1 -1
  34. package/dist/_internal/shared/features/auctions/schema.js +1 -1
  35. package/dist/_internal/shared/features/cart/schema.js +2 -2
  36. package/dist/_internal/shared/features/checkout/config.d.ts +7 -0
  37. package/dist/_internal/shared/features/checkout/config.js +7 -0
  38. package/dist/_internal/shared/features/events/schema.js +1 -1
  39. package/dist/_internal/shared/features/orders/schema.js +1 -1
  40. package/dist/_internal/shared/features/products/schema.js +3 -3
  41. package/dist/_internal/shared/features/promotions/schema.js +3 -3
  42. package/dist/_internal/shared/fees/calculator.d.ts +32 -7
  43. package/dist/_internal/shared/fees/calculator.js +25 -0
  44. package/dist/client.d.ts +4 -4
  45. package/dist/client.js +4 -2
  46. package/dist/constants/api-endpoints.d.ts +9 -6
  47. package/dist/constants/api-endpoints.js +3 -2
  48. package/dist/contracts/client-payment-gateway.d.ts +1 -2
  49. package/dist/features/about/components/AboutView.d.ts +6 -16
  50. package/dist/features/about/components/AboutView.js +3 -3
  51. package/dist/features/about/components/FeesView.js +18 -0
  52. package/dist/features/about/index.d.ts +2 -1
  53. package/dist/features/about/schemas/firestore.d.ts +47 -0
  54. package/dist/features/about/schemas/firestore.js +6 -0
  55. package/dist/features/about/schemas/index.d.ts +210 -0
  56. package/dist/features/about/schemas/index.js +45 -0
  57. package/dist/features/account/hooks/useProfile.js +3 -0
  58. package/dist/features/admin/actions/notification-actions.d.ts +4 -1
  59. package/dist/features/admin/actions/notification-actions.js +56 -10
  60. package/dist/features/admin/components/AdminAdsView.js +1 -1
  61. package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +6 -0
  62. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +50 -0
  63. package/dist/features/admin/components/AdminCartsView.js +16 -3
  64. package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
  65. package/dist/features/admin/components/AdminCouponsView.js +14 -4
  66. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -42
  67. package/dist/features/admin/components/AdminMediaView.js +1 -1
  68. package/dist/features/admin/components/AdminNewsletterView.js +42 -11
  69. package/dist/features/admin/components/AdminNotificationsView.js +31 -19
  70. package/dist/features/admin/components/AdminOrdersView.js +7 -0
  71. package/dist/features/admin/components/AdminPayoutsView.js +18 -3
  72. package/dist/features/admin/components/AdminProductsView.js +17 -2
  73. package/dist/features/admin/components/AdminReviewsView.js +16 -2
  74. package/dist/features/admin/components/AdminScammersView.js +7 -0
  75. package/dist/features/admin/components/AdminSectionsView.js +4 -0
  76. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  77. package/dist/features/admin/components/AdminSiteSettingsView.js +127 -8
  78. package/dist/features/admin/components/AdminStoreEditorView.d.ts +2 -1
  79. package/dist/features/admin/components/AdminStoreEditorView.js +4 -4
  80. package/dist/features/admin/components/AdminStoresView.js +1 -1
  81. package/dist/features/admin/components/AdminSupportTicketDetailView.js +23 -5
  82. package/dist/features/admin/components/AdminSupportTicketsView.js +20 -2
  83. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +4 -1
  84. package/dist/features/admin/components/AdminTesterChecklistView.js +8 -0
  85. package/dist/features/admin/components/index.d.ts +2 -0
  86. package/dist/features/admin/components/index.js +1 -0
  87. package/dist/features/admin/constants/filter-tabs.d.ts +55 -41
  88. package/dist/features/admin/constants/filter-tabs.js +55 -27
  89. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +25 -0
  90. package/dist/features/admin/repository/analytics-rollup.repository.js +31 -0
  91. package/dist/features/admin/repository/site-settings.repository.js +8 -1
  92. package/dist/features/admin/schemas/firestore.d.ts +46 -0
  93. package/dist/features/admin/schemas/firestore.js +62 -24
  94. package/dist/features/auctions/actions/bid-actions.js +1 -1
  95. package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
  96. package/dist/features/auctions/components/AuctionsListView.js +8 -1
  97. package/dist/features/auth/components/LoginForm.js +2 -2
  98. package/dist/features/auth/components/RegisterForm.js +2 -2
  99. package/dist/features/auth/permissions/constants.d.ts +16 -0
  100. package/dist/features/auth/permissions/constants.js +53 -0
  101. package/dist/features/auth/schemas/firestore.js +1 -0
  102. package/dist/features/blog/components/BlogFilters.js +1 -1
  103. package/dist/features/cart/schemas/firestore.d.ts +1 -1
  104. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  105. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  106. package/dist/features/events/components/EventFilters.js +2 -0
  107. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  108. package/dist/features/layout/BackToTop.d.ts +9 -5
  109. package/dist/features/layout/BackToTop.js +17 -21
  110. package/dist/features/layout/TitleBarLayout.d.ts +2 -2
  111. package/dist/features/layout/TitleBarLayout.js +4 -4
  112. package/dist/features/media/AvatarUpload.js +7 -3
  113. package/dist/features/media/MediaVideo.js +1 -1
  114. package/dist/features/media/finalize.d.ts +9 -13
  115. package/dist/features/media/finalize.js +23 -74
  116. package/dist/features/media/server.d.ts +1 -1
  117. package/dist/features/media/server.js +1 -1
  118. package/dist/features/orders/actions/refund-actions.js +1 -0
  119. package/dist/features/orders/hooks/useOrders.js +16 -4
  120. package/dist/features/orders/schemas/firestore.d.ts +19 -5
  121. package/dist/features/payments/schemas/firestore.d.ts +2 -2
  122. package/dist/features/pre-orders/components/PreOrdersListView.js +7 -0
  123. package/dist/features/products/components/ArtStickersListView.js +5 -0
  124. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -1
  125. package/dist/features/products/components/ProductForm.js +14 -1
  126. package/dist/features/products/components/ProductsIndexPageView.js +7 -0
  127. package/dist/features/products/constants/action-defs.d.ts +29 -3
  128. package/dist/features/products/constants/action-defs.js +77 -1
  129. package/dist/features/products/schemas/firestore.d.ts +1 -1
  130. package/dist/features/products/schemas/product-templates.d.ts +1 -1
  131. package/dist/features/products/types/index.d.ts +4 -0
  132. package/dist/features/scams/schemas/index.js +2 -2
  133. package/dist/features/search/components/Search.js +3 -3
  134. package/dist/features/seller/components/SellerAuctionsView.js +27 -2
  135. package/dist/features/seller/components/SellerOrdersView.js +2 -2
  136. package/dist/features/seller/components/SellerPayoutsView.js +24 -10
  137. package/dist/features/seller/components/SellerPreOrdersView.js +12 -4
  138. package/dist/features/seller/components/SellerPrizeDrawsView.js +23 -5
  139. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  140. package/dist/features/seller/components/SellerProductShell.js +1 -1
  141. package/dist/features/seller/components/SellerProductsView.js +8 -6
  142. package/dist/features/seller/components/SellerReviewsView.js +27 -6
  143. package/dist/features/seller/components/index.d.ts +0 -2
  144. package/dist/features/seller/components/index.js +0 -1
  145. package/dist/features/stores/components/StoreListingsGuideView.js +2 -1
  146. package/dist/features/stores/components/StoreProductsView.js +1 -1
  147. package/dist/features/stores/schemas/firestore.d.ts +11 -0
  148. package/dist/features/stores/schemas/firestore.js +5 -0
  149. package/dist/features/stores/schemas/index.d.ts +2 -2
  150. package/dist/features/tester/actions/checklist-item-actions.d.ts +6 -0
  151. package/dist/features/tester/actions/checklist-item-actions.js +2 -0
  152. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +13 -2
  153. package/dist/features/tester/components/AdminTesterFeedbackListView.js +2 -1
  154. package/dist/features/tester/components/AdminTesterFeedbackReportView.js +9 -5
  155. package/dist/features/tester/components/TesterHubView.js +34 -21
  156. package/dist/features/tester/repository/tester-checklist-item.repository.js +1 -0
  157. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +18 -4
  158. package/dist/features/tester/repository/tester-checklist-response.repository.js +43 -8
  159. package/dist/features/tester/schemas/firestore.d.ts +8 -3
  160. package/dist/features/tester/schemas/firestore.js +6 -0
  161. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +21 -9
  162. package/dist/features/tester/utils/phases.d.ts +31 -0
  163. package/dist/features/tester/utils/phases.js +46 -0
  164. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
  165. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +10 -1
  166. package/dist/features/whatsapp-bot/helpers/whatsapp.js +47 -0
  167. package/dist/features/whatsapp-bot/types/index.d.ts +20 -1
  168. package/dist/features/wishlist/types/index.d.ts +3 -0
  169. package/dist/index.d.ts +15 -6
  170. package/dist/index.js +19 -9
  171. package/dist/next/components/NotFoundView.js +2 -1
  172. package/dist/next/routing/route-map.d.ts +6 -12
  173. package/dist/next/routing/route-map.js +3 -4
  174. package/dist/providers/db-firebase/admin.d.ts +1 -0
  175. package/dist/providers/db-firebase/admin.js +1 -1
  176. package/dist/repositories/index.d.ts +2 -0
  177. package/dist/repositories/index.js +1 -0
  178. package/dist/schemas/registry.d.ts +2 -2
  179. package/dist/seed/addresses-seed-data.js +18 -18
  180. package/dist/seed/bids-seed-data.js +4 -4
  181. package/dist/seed/blog-posts-seed-data.js +82 -82
  182. package/dist/seed/carousel-slides-seed-data.js +14 -10
  183. package/dist/seed/carousels-seed-data.js +3 -3
  184. package/dist/seed/cart-seed-data.js +92 -92
  185. package/dist/seed/claimed-coupons-seed-data.js +10 -10
  186. package/dist/seed/conversations-seed-data.js +75 -75
  187. package/dist/seed/coupon-usage-seed-data.js +12 -12
  188. package/dist/seed/coupons-seed-data.js +41 -41
  189. package/dist/seed/events-seed-data.js +105 -105
  190. package/dist/seed/grouped-listings-seed-data.d.ts +2 -137
  191. package/dist/seed/grouped-listings-seed-data.js +79 -143
  192. package/dist/seed/history-seed-data.js +38 -38
  193. package/dist/seed/homepage-sections-seed-data.js +9 -9
  194. package/dist/seed/notifications-seed-data.js +56 -56
  195. package/dist/seed/offers-seed-data.js +91 -91
  196. package/dist/seed/orders-seed-data.js +121 -106
  197. package/dist/seed/payouts-seed-data.js +42 -42
  198. package/dist/seed/products-auctions-seed-data.js +10 -2
  199. package/dist/seed/products-standard-seed-data.js +40 -8
  200. package/dist/seed/reviews-seed-data.js +42 -23
  201. package/dist/seed/scammers-seed-data.js +22 -22
  202. package/dist/seed/sessions-seed-data.js +7 -7
  203. package/dist/seed/shipments-seed-data.js +10 -10
  204. package/dist/seed/site-settings-seed-data.js +89 -0
  205. package/dist/seed/store-addresses-seed-data.js +2 -2
  206. package/dist/seed/store-extensions-seed-data.js +93 -93
  207. package/dist/seed/stores-seed-data.js +2 -0
  208. package/dist/seed/support-tickets-seed-data.js +47 -47
  209. package/dist/seed/users-seed-data.js +55 -89
  210. package/dist/seed/wishlists-seed-data.js +22 -22
  211. package/dist/server.d.ts +4 -3
  212. package/dist/server.js +7 -7
  213. package/dist/styles.css +1 -1
  214. package/dist/tailwind-utilities.css +1 -1
  215. package/dist/ui/components/PageLoader.js +8 -3
  216. package/dist/ui/components/Select.d.ts +8 -1
  217. package/dist/ui/components/Select.js +2 -2
  218. package/dist/ui/components/SiteMark.d.ts +23 -0
  219. package/dist/ui/components/SiteMark.js +76 -0
  220. package/dist/ui/index.d.ts +2 -0
  221. package/dist/ui/index.js +1 -0
  222. package/dist/validation/schemas.d.ts +0 -2
  223. package/dist/validation/schemas.js +0 -2
  224. package/package.json +1 -1
  225. package/scripts/seed-cli.mjs +17 -15
@@ -16,6 +16,7 @@ import type { Auth } from "firebase-admin/auth";
16
16
  import type { Firestore } from "firebase-admin/firestore";
17
17
  import type { Storage } from "firebase-admin/storage";
18
18
  import type { Database } from "firebase-admin/database";
19
+ export declare function parsePrivateKey(raw: string): string;
19
20
  declare global {
20
21
  var __mohasinac_firebase_admin_app__: App | null | undefined;
21
22
  var __mohasinac_firebase_admin_auth__: Auth | null | undefined;
@@ -35,7 +35,7 @@ function loadDatabase() {
35
35
  // OpenSSL 3 (Node 18+) rejects malformed PEM — ensure the key is normalised
36
36
  // before passing it to `cert()`.
37
37
  //
38
- function parsePrivateKey(raw) {
38
+ export function parsePrivateKey(raw) {
39
39
  return raw
40
40
  .replace(/^/, "") // strip UTF-8 BOM (PowerShell pipe artefact)
41
41
  .replace(/^["']|["']$/g, "") // strip optional surrounding quotes
@@ -17,6 +17,8 @@ export { bidRepository } from "../features/auctions/repository/bid.repository";
17
17
  export { CartRepository, cartRepository, } from "../features/cart/repository/cart.repository";
18
18
  export { StoreRepository, storeRepository, } from "../features/stores/repository/store.repository";
19
19
  export { siteSettingsRepository } from "../features/admin/repository/site-settings.repository";
20
+ export { analyticsRollupRepository } from "../features/admin/repository/analytics-rollup.repository";
21
+ export type { AnalyticsRollupDocument } from "../features/admin/repository/analytics-rollup.repository";
20
22
  export { notificationRepository } from "../features/admin/repository/notification.repository";
21
23
  export { chatRepository } from "../features/admin/repository/chat.repository";
22
24
  export { carouselRepository } from "../features/homepage/repository/carousel.repository";
@@ -24,6 +24,7 @@ export { StoreRepository, storeRepository, } from "../features/stores/repository
24
24
  // SB-UNI-A 2026-05-13 — storeAddressRepository deleted. Use addressesRepository
25
25
  // with ownerType:"store" instead.
26
26
  export { siteSettingsRepository } from "../features/admin/repository/site-settings.repository";
27
+ export { analyticsRollupRepository } from "../features/admin/repository/analytics-rollup.repository";
27
28
  export { notificationRepository } from "../features/admin/repository/notification.repository";
28
29
  export { chatRepository } from "../features/admin/repository/chat.repository";
29
30
  export { carouselRepository } from "../features/homepage/repository/carousel.repository";
@@ -3947,10 +3947,10 @@ export declare const SCHEMAS: {
3947
3947
  shippingPolicy?: string | undefined;
3948
3948
  isVacationMode?: boolean | undefined;
3949
3949
  vacationMessage?: string | undefined;
3950
+ capabilities?: string[] | undefined;
3950
3951
  vacationReturnDate?: string | Date | import("zod").objectOutputType<{
3951
3952
  toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
3952
3953
  }, import("zod").ZodTypeAny, "passthrough"> | undefined;
3953
- capabilities?: string[] | undefined;
3954
3954
  customCommissionRate?: number | undefined;
3955
3955
  googleReviews?: {
3956
3956
  enabled: boolean;
@@ -4032,10 +4032,10 @@ export declare const SCHEMAS: {
4032
4032
  shippingPolicy?: string | undefined;
4033
4033
  isVacationMode?: boolean | undefined;
4034
4034
  vacationMessage?: string | undefined;
4035
+ capabilities?: string[] | undefined;
4035
4036
  vacationReturnDate?: string | Date | import("zod").objectInputType<{
4036
4037
  toDate: import("zod").ZodFunction<import("zod").ZodTuple<[], import("zod").ZodUnknown>, import("zod").ZodDate>;
4037
4038
  }, import("zod").ZodTypeAny, "passthrough"> | undefined;
4038
- capabilities?: string[] | undefined;
4039
4039
  customCommissionRate?: number | undefined;
4040
4040
  googleReviews?: {
4041
4041
  enabled: boolean;
@@ -20,38 +20,38 @@
20
20
  const NOW = new Date();
21
21
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
22
22
  const _rawAddressesSeedData = [
23
- // Yugi Muto — Home
23
+ // Mock User 3 — Home
24
24
  {
25
25
  id: "addr-yugi-home",
26
26
  ownerType: "user",
27
27
  ownerId: "user-yugi-muto",
28
28
  label: "Home",
29
- fullName: "Yugi Muto",
29
+ fullName: "Mock User 3",
30
30
  phone: "+91-99999-10001",
31
- addressLine1: "123 Duel City Lane",
32
- addressLine2: "Domino City",
33
- city: "Domino City",
34
- state: "Tokyo",
35
- postalCode: "110-0001",
36
- country: "Japan",
31
+ addressLine1: "123 Stadium Lane",
32
+ addressLine2: "Vijay Nagar",
33
+ city: "Indore",
34
+ state: "Madhya Pradesh",
35
+ postalCode: "452010",
36
+ country: "India",
37
37
  isDefault: true,
38
38
  createdAt: daysAgo(180),
39
39
  updatedAt: daysAgo(1),
40
40
  },
41
- // Seto KaibaKaiba Mansion
41
+ // Mock User 2 Home
42
42
  {
43
43
  id: "addr-kaiba-mansion",
44
44
  ownerType: "user",
45
45
  ownerId: "user-seto-kaiba",
46
- label: "Kaiba Mansion",
47
- fullName: "Seto Kaiba",
46
+ label: "Home",
47
+ fullName: "Mock User 2",
48
48
  phone: "+91-99999-20001",
49
- addressLine1: "1000 Kaiba Estate Drive",
50
- addressLine2: "Domino Heights",
51
- city: "Domino City",
52
- state: "Tokyo",
53
- postalCode: "110-0020",
54
- country: "Japan",
49
+ addressLine1: "1000 Civil Lines Drive",
50
+ addressLine2: "Sitabuldi",
51
+ city: "Nagpur",
52
+ state: "Maharashtra",
53
+ postalCode: "440012",
54
+ country: "India",
55
55
  isDefault: true,
56
56
  createdAt: daysAgo(200),
57
57
  updatedAt: daysAgo(10),
@@ -62,7 +62,7 @@ const _rawAddressesSeedData = [
62
62
  ownerType: "user",
63
63
  ownerId: "user-admin-letitrip",
64
64
  label: "LetItRip HQ",
65
- fullName: "LetItRip Admin",
65
+ fullName: "Mock User 1",
66
66
  phone: "+91-99999-30001",
67
67
  addressLine1: "100 Collectibles Plaza",
68
68
  addressLine2: "Mumbai Central",
@@ -5,7 +5,7 @@
5
5
  * auction-beyblade-metal-lightning-l-drago) — bid counts and final amounts match
6
6
  * each auction's `bidCount`/`currentBid` fields exactly, so the product card's
7
7
  * "N bids" summary and the detail page's bid-history list agree. Bidders: 3 buyer
8
- * personas (Meera Nair, Rohit Agarwal, Ananya Patel), never the store's own seller
8
+ * personas (Mock User 11, Mock User 14, Mock User 9), never the store's own seller
9
9
  * (user-tyson-blader owns store-beyblade-arena). Status: newest bid per auction is
10
10
  * "active", the rest "outbid". Bid IDs: bid-{productSlug}-{userName}-{YYYYMMDD}-{rand6}.
11
11
  *
@@ -28,9 +28,9 @@ const BIDDER_EMAILS = {
28
28
  "user-ananya-collector": "ananya.patel@gmail.com",
29
29
  };
30
30
  const BIDDER_NAMES = {
31
- "user-meera-bey": "Meera Nair",
32
- "user-rohit-collector": "Rohit Agarwal",
33
- "user-ananya-collector": "Ananya Patel",
31
+ "user-meera-bey": "Mock User 11",
32
+ "user-rohit-collector": "Mock User 14",
33
+ "user-ananya-collector": "Mock User 9",
34
34
  };
35
35
  function withBidDefaults(b) {
36
36
  return {
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * WHY: Seeds 20 blog posts for LetItRip collectibles marketplace — content/SEO testing across all categories.
3
- * WHAT: 17 published + 2 draft + 1 archived. Mix of YGO-specific, broader collectibles (Pokémon, Hot Wheels,
4
- * Beyblade, Gundam, Funko), marketplace guides, and community stories.
3
+ * WHAT: 17 published + 2 draft + 1 archived. Mix of Beyblade-specific, broader collectibles (Pokémon, Hot Wheels,
4
+ * Gundam, Funko), marketplace guides, and community stories.
5
5
  *
6
6
  * EXPORTS:
7
7
  * blogPostsSeedData — Array of Partial<BlogPostDocument> for seed runner
@@ -19,67 +19,67 @@ const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
19
19
  export const blogPostsSeedData = [
20
20
  // ── GUIDES (6) ────────────────────────────────────────────────────────────
21
21
  {
22
- id: "blog-identify-1st-edition-yugioh",
23
- title: "How to Identify 1st Edition Yu-Gi-Oh! Cards",
24
- slug: "identify-1st-edition-yugioh",
25
- excerpt: "Learn the telltale signs that distinguish a genuine 1st Edition print from Unlimited — from the gold stamp placement to the eye of Anubis hologram.",
26
- content: `<h2>The Gold Stamp</h2><p>1st Edition Yu-Gi-Oh! cards feature a gold "1st Edition" stamp below the artwork on the left side. On LOB (Legend of Blue Eyes White Dragon) cards from 2002, this stamp is slightly larger than later sets.</p><h2>Eye of Anubis</h2><p>Starting with LOB Unlimited, Konami added the Eye of Anubis hologram to the bottom-right corner. 1st Edition LOB cards do NOT have this hologram that's actually a sign of authenticity for the earliest prints.</p><h2>Font Differences</h2><p>Compare the font weight of the card name. 1st Edition prints from the early Duel Monsters era often have slightly bolder text than their Unlimited counterparts.</p>`,
27
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg"), alt: "Dark Magician card art" },
22
+ id: "blog-spot-genuine-takara-tomy-beyblade",
23
+ title: "How to Spot a Genuine Takara-Tomy Beyblade (vs. Counterfeit Clones)",
24
+ slug: "spot-genuine-takara-tomy-beyblade",
25
+ excerpt: "Learn the telltale signs that distinguish a genuine Takara-Tomy Beyblade from a cheap clone — from the laser-etched logo to the weight of the metal driver.",
26
+ content: `<h2>The Laser-Etched Logo</h2><p>Genuine Takara-Tomy Beyblades have a crisp, laser-etched "TAKARA TOMY" logo on the underside of the layer or base. Clones use a shallow, blurry stamp that smudges under a fingernail scratch test.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-genuine-beyblade-logo-1-20260101/1000/600")}" alt="Close-up of the genuine Takara-Tomy laser-etched logo" /><h2>Weight and Balance</h2><p>A genuine metal-fusion driver has a consistent, dense weight clones often use lighter zinc alloy that feels noticeably hollow. Spin the beyblade on a flat glass surface: a genuine driver spins true with almost no wobble.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-genuine-beyblade-weight-2-20260101/1000/600")}" alt="Weighing a genuine metal-fusion driver on a digital scale" /><h2>Sticker Print Quality</h2><p>Compare the face-bolt sticker under bright light. Genuine stickers have sharp gradient printing and a slightly raised clear-coat finish. Clone stickers are flat-printed and peel at the edges within weeks.</p>`,
27
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-genuine-beyblade-20260101/1200/630"), alt: "Genuine Takara-Tomy Beyblade close-up" },
28
28
  category: "guides",
29
- tags: ["1st-edition", "authentication", "grading", "ygo"],
29
+ tags: ["authentication", "takara-tomy", "beyblade", "counterfeit"],
30
30
  isFeatured: true,
31
31
  status: "published",
32
32
  publishedAt: daysAgo(30),
33
33
  authorId: "user-admin-letitrip",
34
- authorName: "LetItRip Admin",
35
- authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
34
+ authorName: "Mock User 1",
35
+ authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
36
36
  readTimeMinutes: 5,
37
37
  views: 4200,
38
- metaTitle: "How to Identify 1st Edition Yu-Gi-Oh! Cards | LetItRip",
39
- metaDescription: "Learn how to spot genuine 1st Edition YGO cards gold stamps, Eye of Anubis, font differences, and more.",
38
+ metaTitle: "How to Spot a Genuine Takara-Tomy Beyblade | LetItRip",
39
+ metaDescription: "Learn how to spot genuine Takara-Tomy Beybladeslaser-etched logos, driver weight, sticker quality, and more.",
40
40
  createdAt: daysAgo(35),
41
41
  updatedAt: daysAgo(30),
42
42
  },
43
43
  {
44
- id: "blog-psa-vs-bgs-vs-cgc",
45
- title: "PSA vs BGS vs CGC Which Grading Service for Your Cards?",
46
- slug: "psa-vs-bgs-vs-cgc",
47
- excerpt: "A head-to-head comparison of the three major card grading services and which one commands the highest premiums in the trading card market.",
48
- content: `<h2>PSA — The Industry Standard</h2><p>PSA (Professional Sports Authenticator) is the most widely recognized grading service. A PSA 10 "Gem Mint" commands the highest resale premiums, especially for vintage cards from any TCG.</p><h2>BGS — The Sub-Grade King</h2><p>Beckett Grading Services provides sub-grades for centering, surface, edges, and corners. A BGS 10 "Pristine" is incredibly rare, and a BGS 10 "Black Label" (all sub-grades 10) is the holy grail.</p><h2>CGC The Newcomer</h2><p>CGC entered the trading card market more recently. They also offer sub-grades and their slabs have a modern, clean design. CGC is growing in popularity but PSA still dominates resale value.</p><h2>Our Recommendation</h2><p>For investment: PSA 10 commands the highest resale value. For personal collection with detailed condition analysis: BGS. For budget grading: CGC.</p>`,
49
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"), alt: "Exodia the Forbidden One" },
44
+ id: "blog-sealed-vs-opened-beyblade-value",
45
+ title: "Sealed vs. OpenedHow Condition Affects Beyblade Resale Value",
46
+ slug: "sealed-vs-opened-beyblade-value",
47
+ excerpt: "A head-to-head look at what actually moves the needle on Beyblade resale price sealed box premiums, tip wear, and launcher grip condition.",
48
+ content: `<h2>Sealed Box — The Investment Grade</h2><p>A factory-sealed box with an unbroken shrink-wrap seal commands the highest resale premiums, especially for discontinued original-series and Metal Fight releases. Collectors treat sealed stock the way trading-card collectors treat unopened booster boxes.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-sealed-beyblade-box-1-20260101/1000/600")}" alt="Factory-sealed Beyblade box with intact shrink wrap" /><h2>Tip Wear — The Sub-Grade That Matters</h2><p>For opened, battled beyblades, tip wear is the single biggest value factor. A sharp, unrounded tip with visible factory grooves grades far higher than a rounded, "sanded" tip from heavy stadium use.</p><h2>Launcher Grip Condition</h2><p>Ripcord launchers with clean, unfrayed grip tape and a tight ratchet mechanism add real value to a bundle. A stripped ratchet or fraying cord is an instant discount flag.</p><h2>Our Recommendation</h2><p>For investment: chase sealed, unopened stock. For a battle-ready collection: prioritize tip sharpness and launcher condition over cosmetic sticker wear.</p>`,
49
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-sealed-vs-opened-beyblade-20260101/1200/630"), alt: "Sealed and opened Beyblade boxes side by side" },
50
50
  category: "guides",
51
- tags: ["grading", "psa", "bgs", "cgc", "trading-cards", "investment"],
51
+ tags: ["condition", "sealed", "tip-wear", "beyblade", "investment"],
52
52
  isFeatured: true,
53
53
  status: "published",
54
54
  publishedAt: daysAgo(25),
55
55
  authorId: "user-admin-letitrip",
56
- authorName: "LetItRip Admin",
57
- authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
56
+ authorName: "Mock User 1",
57
+ authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
58
58
  readTimeMinutes: 7,
59
59
  views: 3800,
60
- metaTitle: "PSA vs BGS vs CGC Best Card Grading Services | LetItRip",
61
- metaDescription: "Compare PSA, BGS, and CGC grading services for trading cards — premiums, turnaround, and which to choose.",
60
+ metaTitle: "Sealed vs. Opened Beyblade Condition & Resale Value | LetItRip",
61
+ metaDescription: "What actually affects Beyblade resale value sealed box premiums, tip wear grading, and launcher condition.",
62
62
  createdAt: daysAgo(28),
63
63
  updatedAt: daysAgo(25),
64
64
  },
65
65
  {
66
- id: "blog-complete-exodia-guide",
67
- title: "Complete Exodia Guide — All Printings and Values",
68
- slug: "complete-exodia-guide",
69
- excerpt: "Every printing of Exodia the Forbidden One and its four limbs — from the original LOB 1st Edition to the latest reprint, with current market values.",
70
- content: `<h2>The Original Five</h2><p>Exodia the Forbidden One (33396948), Left Arm (07902349), Right Arm (70903634), Left Leg (44519536), and Right Leg (08124921). Completing the set in your hand is an instant win and completing a 1st Edition PSA 10 set is the ultimate flex.</p><h2>LOB 1st Edition (2002)</h2><p>The holy grail. Each piece in PSA 10 ranges from ₹3–5 lakh. A complete set? Over ₹20 lakh.</p><h2>Later Printings</h2><p>Unlimited LOB, Retro Pack, Lost Art Promotion, and various structure deck reprints. Values range from ₹500 for common reprints to ₹50,000+ for rare promotional versions.</p>`,
71
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"), alt: "Exodia the Forbidden One" },
66
+ id: "blog-complete-beyblade-x-series-guide",
67
+ title: "Complete Beyblade X Series Guide — Every Wave and Value",
68
+ slug: "complete-beyblade-x-series-guide",
69
+ excerpt: "Every Beyblade X wave released so far — from the BX-01 starter line to the latest BX-08 wave — with current market values.",
70
+ content: `<h2>The Starter Waves</h2><p>BX-01 through BX-04 introduced the core X-series parts Blade, Ratchet, and Bit replacing the old layer/disk/driver system entirely. Sealed starters from these early waves are already appreciating.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-beyblade-x-waves-1-20260101/1000/600")}" alt="Beyblade X starter wave lineup" /><h2>BX-05 through BX-08 (2025-2026)</h2><p>The current generation. Each piece in sealed condition ranges from ₹500-₹1,200. A complete wave set? Over ₹8,000.</p><h2>Later Waves</h2><p>Limited convention exclusives, gold-finish promos, and various starter-set reprints. Values range from ₹300 for common reprints to ₹5,000+ for rare promotional versions.</p>`,
71
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-beyblade-x-guide-20260101/1200/630"), alt: "Beyblade X series wave lineup" },
72
72
  category: "guides",
73
- tags: ["exodia", "guide", "printings", "values", "ygo"],
73
+ tags: ["beyblade-x", "guide", "waves", "values"],
74
74
  isFeatured: false,
75
75
  status: "draft",
76
76
  authorId: "user-admin-letitrip",
77
- authorName: "LetItRip Admin",
78
- authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
77
+ authorName: "Mock User 1",
78
+ authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
79
79
  readTimeMinutes: 10,
80
80
  views: 0,
81
- metaTitle: "Complete Exodia Guide — All Printings & Values | LetItRip",
82
- metaDescription: "Every Exodia printing from LOB 1st Edition to modern reprints — market values and collecting tips.",
81
+ metaTitle: "Complete Beyblade X Series Guide — Every Wave & Value | LetItRip",
82
+ metaDescription: "Every Beyblade X wave from BX-01 to the latest release — market values and collecting tips.",
83
83
  createdAt: daysAgo(5),
84
84
  updatedAt: daysAgo(2),
85
85
  },
@@ -95,7 +95,7 @@ export const blogPostsSeedData = [
95
95
  status: "published",
96
96
  publishedAt: daysAgo(18),
97
97
  authorId: "user-admin-letitrip",
98
- authorName: "LetItRip Admin",
98
+ authorName: "Mock User 1",
99
99
  readTimeMinutes: 8,
100
100
  views: 3100,
101
101
  metaTitle: "Beginner's Guide to Hot Wheels Collecting | LetItRip",
@@ -116,7 +116,7 @@ export const blogPostsSeedData = [
116
116
  status: "published",
117
117
  publishedAt: daysAgo(12),
118
118
  authorId: "user-admin-letitrip",
119
- authorName: "LetItRip Admin",
119
+ authorName: "Mock User 1",
120
120
  readTimeMinutes: 7,
121
121
  views: 2600,
122
122
  metaTitle: "Gundam Model Kit Grades Explained | LetItRip",
@@ -136,7 +136,7 @@ export const blogPostsSeedData = [
136
136
  status: "published",
137
137
  publishedAt: daysAgo(8),
138
138
  authorId: "user-admin-letitrip",
139
- authorName: "LetItRip Admin",
139
+ authorName: "Mock User 1",
140
140
  readTimeMinutes: 6,
141
141
  views: 1900,
142
142
  metaTitle: "Beyblade X vs Burst Comparison | LetItRip",
@@ -146,24 +146,24 @@ export const blogPostsSeedData = [
146
146
  },
147
147
  // ── NEWS (4) ──────────────────────────────────────────────────────────────
148
148
  {
149
- id: "blog-top-10-duel-monsters-cards",
150
- title: "Top 10 Most Valuable Duel Monsters Era Cards",
151
- slug: "top-10-duel-monsters-cards",
152
- excerpt: "From the legendary Blue-Eyes White Dragon LOB 1st Edition to the elusive Tournament Black Luster Soldier — these are the cards every collector dreams of.",
153
- content: `<h2>1. Tournament Black Luster Soldier (2002)</h2><p>The rarest YGO card ever printed. Only one exists in the wild. Estimated value: over ₹70 lakh.</p><h2>2. Blue-Eyes White Dragon LOB 1st Ed PSA 10</h2><p>Seto Kaiba's signature card in gem mint 1st Edition. PSA 10 copies sell for ₹15–25 lakh.</p><h2>3. Dark Magician LOB 1st Ed PSA 10</h2><p>Yugi's signature card. A PSA 10 1st Edition LOB Dark Magician commands ₹8–12 lakh.</p><h2>4. Exodia Complete Set (LOB 1st Ed, all 5 pieces PSA 10)</h2><p>All five Exodia pieces in 1st Edition PSA 10 — virtually impossible to assemble. Set value: over ₹20 lakh.</p><h2>510</h2><p>Mirror Force MRD 1st Ed, Change of Heart MRD 1st Ed, Monster Reborn LOB 1st Ed, Pot of Greed LOB 1st Ed, Gate Guardian MRD, and Dark Magician Girl MFC 1st Ed.</p>`,
154
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg"), alt: "Blue-Eyes White Dragon" },
149
+ id: "blog-top-10-most-valuable-vintage-beyblades",
150
+ title: "Top 10 Most Valuable Vintage Beyblades",
151
+ slug: "top-10-most-valuable-vintage-beyblades",
152
+ excerpt: "From the legendary original-series Dragoon Storm to the elusive tournament-only L-Drago variants — these are the beyblades every collector dreams of.",
153
+ content: `<h2>1. Tournament-Exclusive Gold Dragoon (2000)</h2><p>The rarest original-series beyblade ever distributed. Only handed out at the Japan national finals. Estimated value: over ₹4 lakh.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-top10-tournament-gold-1-20260101/1000/600")}" alt="Tournament-exclusive gold Dragoon beyblade" /><h2>2. Beyblade Original Dragoon Storm, Sealed</h2><p>Tyson's signature spinner in sealed, factory condition. Sealed copies sell for ₹1.5-2.5 lakh.</p><h2>3. Beyblade Metal Lightning L-Drago, Sealed</h2><p>Kai's iconic rival spinner. A sealed Metal Lightning L-Drago commands ₹80,000-1.2 lakh.</p><h2>4. Complete Original-Series Starter Set (all 5 pieces, sealed)</h2><p>All five original-series starter beyblades still sealed — virtually impossible to assemble. Set value: over ₹6 lakh.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-top10-starter-set-2-20260101/1000/600")}" alt="Complete original-series Beyblade starter set" /><h2>5-10</h2><p>Metal Fusion Storm Pegasus (sealed), Metal Fight Flame Sagittario (sealed), Burst Valkyrie tournament promo, Burst Regalia Genesis limited run, original-series Dranzer S first-print, and Driger V arena-exclusive gold edition.</p>`,
154
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-top10-vintage-beyblade-20260101/1200/630"), alt: "Vintage Beyblade collection" },
155
155
  category: "news",
156
- tags: ["top-10", "duel-monsters", "investment", "rare-cards"],
156
+ tags: ["top-10", "vintage", "investment", "rare-beyblades"],
157
157
  isFeatured: false,
158
158
  status: "published",
159
159
  publishedAt: daysAgo(20),
160
160
  authorId: "user-admin-letitrip",
161
- authorName: "LetItRip Admin",
162
- authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
161
+ authorName: "Mock User 1",
162
+ authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
163
163
  readTimeMinutes: 8,
164
164
  views: 6100,
165
- metaTitle: "Top 10 Most Valuable Duel Monsters Era Cards | LetItRip",
166
- metaDescription: "The 10 most expensive Yu-Gi-Oh! cards from the original Duel Monsters era.",
165
+ metaTitle: "Top 10 Most Valuable Vintage Beyblades | LetItRip",
166
+ metaDescription: "The 10 most expensive vintage Beyblades from the original series to Metal Fight.",
167
167
  createdAt: daysAgo(22),
168
168
  updatedAt: daysAgo(20),
169
169
  },
@@ -179,7 +179,7 @@ export const blogPostsSeedData = [
179
179
  status: "published",
180
180
  publishedAt: daysAgo(7),
181
181
  authorId: "user-admin-letitrip",
182
- authorName: "LetItRip Admin",
182
+ authorName: "Mock User 1",
183
183
  readTimeMinutes: 6,
184
184
  views: 5200,
185
185
  metaTitle: "Pokémon Prismatic Evolutions — Indian Collector Guide | LetItRip",
@@ -199,7 +199,7 @@ export const blogPostsSeedData = [
199
199
  status: "published",
200
200
  publishedAt: daysAgo(14),
201
201
  authorId: "user-admin-letitrip",
202
- authorName: "LetItRip Admin",
202
+ authorName: "Mock User 1",
203
203
  readTimeMinutes: 7,
204
204
  views: 2400,
205
205
  metaTitle: "Funko Pop Collecting in India 2026 | LetItRip",
@@ -219,7 +219,7 @@ export const blogPostsSeedData = [
219
219
  status: "published",
220
220
  publishedAt: daysAgo(22),
221
221
  authorId: "user-admin-letitrip",
222
- authorName: "LetItRip Admin",
222
+ authorName: "Mock User 1",
223
223
  readTimeMinutes: 6,
224
224
  views: 1800,
225
225
  metaTitle: "Tomica vs Hot Wheels — Diecast Battle in India | LetItRip",
@@ -229,24 +229,24 @@ export const blogPostsSeedData = [
229
229
  },
230
230
  // ── TIPS (4) ──────────────────────────────────────────────────────────────
231
231
  {
232
- id: "blog-gx-era-hidden-gems",
233
- title: "GX Era Hidden Gems: Undervalued Cards from Shadow of Infinity",
234
- slug: "gx-era-hidden-gems",
235
- excerpt: "The GX era produced some of the most undervalued cards in Yu-Gi-Oh! history. Here are the Shadow of Infinity cards smart collectors are buying now.",
236
- content: `<h2>Why GX Cards Are Undervalued</h2><p>The GX era (2004–2008) coincided with peak Yu-Gi-Oh! anime popularity but many collectors focus exclusively on the original Duel Monsters era. This creates a pricing gap.</p><h2>Shadow of Infinity Picks</h2><p><strong>Elemental HERO Neos</strong> — Jaden Yuki's signature card. 1st Edition Ultra Rare copies are still affordable at ₹3,000–₹5,000.</p><p><strong>Cyber Dragon</strong> — One of the most competitively impactful cards ever. 1st Edition Ultimate Rare commands ₹8,000–₹12,000.</p><p><strong>Rainbow Dragon</strong> — Jesse Anderson's ace. Low print run makes this a sleeper investment.</p>`,
237
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg"), alt: "Elemental HERO Neos" },
232
+ id: "blog-metal-fight-hidden-gems",
233
+ title: "Metal Fight Hidden Gems: Undervalued Beyblades from the 2009-2012 Era",
234
+ slug: "metal-fight-hidden-gems",
235
+ excerpt: "The Metal Fight era produced some of the most undervalued beyblades in collecting history. Here are the picks smart collectors are buying now.",
236
+ content: `<h2>Why Metal Fight Beyblades Are Undervalued</h2><p>The Metal Fight era (2009-2012) coincided with peak Beyblade anime popularity but many collectors focus exclusively on the original 1999-2003 series. This creates a pricing gap.</p><img src="${seedExtMedia("https://picsum.photos/seed/blog-content-image-metal-fight-gems-1-20260101/1000/600")}" alt="Metal Fight era Beyblade lineup" /><h2>Metal Fight Picks</h2><p><strong>Metal Storm Pegasus</strong> — the fan-favorite protagonist spinner. Sealed copies are still affordable at ₹1,500-₹2,500.</p><p><strong>Metal Flame Sagittario</strong> — one of the most competitively impactful attack types ever. Sealed condition commands ₹3,500-₹5,000.</p><p><strong>Rare 4D System variants</strong> — low print run makes these a sleeper investment.</p>`,
237
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-metal-fight-gems-20260101/1200/630"), alt: "Metal Fight Beyblade collection" },
238
238
  category: "tips",
239
- tags: ["gx-era", "hidden-gems", "investment", "ygo"],
239
+ tags: ["metal-fight", "hidden-gems", "investment", "beyblade"],
240
240
  isFeatured: false,
241
241
  status: "published",
242
242
  publishedAt: daysAgo(15),
243
243
  authorId: "user-admin-letitrip",
244
- authorName: "LetItRip Admin",
245
- authorAvatar: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/33396948.jpg"),
244
+ authorName: "Mock User 1",
245
+ authorAvatar: seedExtMedia("https://picsum.photos/seed/user-avatar-letitrip-admin-20260101/400/400"),
246
246
  readTimeMinutes: 6,
247
247
  views: 2900,
248
- metaTitle: "GX Era Hidden Gems — Undervalued YGO Cards | LetItRip",
249
- metaDescription: "Discover undervalued GX era Yu-Gi-Oh! cards that smart collectors are buying now.",
248
+ metaTitle: "Metal Fight Hidden Gems — Undervalued Beyblades | LetItRip",
249
+ metaDescription: "Discover undervalued Metal Fight era Beyblades that smart collectors are buying now.",
250
250
  createdAt: daysAgo(18),
251
251
  updatedAt: daysAgo(15),
252
252
  },
@@ -262,7 +262,7 @@ export const blogPostsSeedData = [
262
262
  status: "published",
263
263
  publishedAt: daysAgo(10),
264
264
  authorId: "user-admin-letitrip",
265
- authorName: "LetItRip Admin",
265
+ authorName: "Mock User 1",
266
266
  readTimeMinutes: 7,
267
267
  views: 3500,
268
268
  metaTitle: "Protect Collectibles in India's Climate | LetItRip",
@@ -282,7 +282,7 @@ export const blogPostsSeedData = [
282
282
  status: "published",
283
283
  publishedAt: daysAgo(5),
284
284
  authorId: "user-admin-letitrip",
285
- authorName: "LetItRip Admin",
285
+ authorName: "Mock User 1",
286
286
  readTimeMinutes: 5,
287
287
  views: 1600,
288
288
  metaTitle: "10 Tips to Sell Faster on LetItRip",
@@ -301,7 +301,7 @@ export const blogPostsSeedData = [
301
301
  isFeatured: false,
302
302
  status: "draft",
303
303
  authorId: "user-admin-letitrip",
304
- authorName: "LetItRip Admin",
304
+ authorName: "Mock User 1",
305
305
  readTimeMinutes: 8,
306
306
  views: 0,
307
307
  metaTitle: "One Piece TCG in India — Complete Primer | LetItRip",
@@ -311,23 +311,23 @@ export const blogPostsSeedData = [
311
311
  },
312
312
  // ── COMMUNITY (3) ─────────────────────────────────────────────────────────
313
313
  {
314
- id: "blog-authenticating-ygo-cards",
315
- title: "How a Verified Store Authenticates Every Card",
316
- slug: "authenticating-ygo-cards",
317
- excerpt: "A behind-the-scenes look at how verified sellers on LetItRip check every trading card before listing — light tests, holo patterns, and weight checks.",
318
- content: `<h2>The 5-Point Authentication Process</h2><p>Every card listed by top verified stores goes through a rigorous 5-point check:</p><ol><li><strong>Light Test</strong> — Genuine Konami/Pokémon Company cards have a specific opacity when held to light.</li><li><strong>Holo Pattern</strong> — Each rarity has a distinct holographic pattern verified under UV light.</li><li><strong>Weight Check</strong> — A genuine trading card weighs approximately 1.7–1.8 grams.</li><li><strong>Rosette Test</strong> — Under 10x magnification, genuine cards show a rosette dot pattern.</li><li><strong>Edge & Corner Inspection</strong> — Check for trimming, re-cornering, or alteration.</li></ol>`,
319
- coverImage: { type: "image", url: seedExtMedia("https://images.ygoprodeck.com/images/cards/cropped/23995346.jpg"), alt: "Card authentication process" },
314
+ id: "blog-authenticating-beyblades",
315
+ title: "How a Verified Store Authenticates Every Beyblade",
316
+ slug: "authenticating-beyblades",
317
+ excerpt: "A behind-the-scenes look at how verified sellers on LetItRip check every beyblade before listing — logo tests, weight checks, and spin-balance inspection.",
318
+ content: `<h2>The 5-Point Authentication Process</h2><p>Every beyblade listed by top verified stores goes through a rigorous 5-point check:</p><ol><li><strong>Logo Test</strong> — Genuine Takara-Tomy pieces have a specific laser-etched depth and clarity when checked under raking light.</li><li><strong>Weight Check</strong> — A genuine metal-fusion driver weighs within a tight factory tolerance verified on a digital scale.</li><li><strong>Spin-Balance Test</strong> — Each layer/driver combo is spin-tested on a flat glass surface; genuine parts spin true with minimal wobble.</li><li><strong>Sticker Print Inspection</strong> — Under 10x magnification, genuine face-bolt stickers show sharp gradient printing and a raised clear-coat.</li><li><strong>Ratchet & Grip Inspection</strong> — Check the launcher for a tight ratchet mechanism and unfrayed grip tape.</li></ol>`,
319
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/blog-cover-authenticating-beyblades-20260101/1200/630"), alt: "Beyblade authentication process" },
320
320
  category: "community",
321
- tags: ["authentication", "verification", "counterfeit", "trading-cards"],
321
+ tags: ["authentication", "verification", "counterfeit", "beyblade"],
322
322
  isFeatured: false,
323
323
  status: "published",
324
324
  publishedAt: daysAgo(10),
325
325
  authorId: "user-admin-letitrip",
326
- authorName: "LetItRip Admin",
326
+ authorName: "Mock User 1",
327
327
  readTimeMinutes: 5,
328
328
  views: 3400,
329
- metaTitle: "How Verified Stores Authenticate Cards | LetItRip",
330
- metaDescription: "The 5-point authentication process used by verified stores to check every trading card on LetItRip.",
329
+ metaTitle: "How Verified Stores Authenticate Beyblades | LetItRip",
330
+ metaDescription: "The 5-point authentication process used by verified stores to check every beyblade on LetItRip.",
331
331
  createdAt: daysAgo(12),
332
332
  updatedAt: daysAgo(10),
333
333
  },
@@ -343,7 +343,7 @@ export const blogPostsSeedData = [
343
343
  status: "published",
344
344
  publishedAt: daysAgo(3),
345
345
  authorId: "user-admin-letitrip",
346
- authorName: "LetItRip Admin",
346
+ authorName: "Mock User 1",
347
347
  readTimeMinutes: 6,
348
348
  views: 1200,
349
349
  metaTitle: "Collector Spotlight: Mumbai Gundam Collection | LetItRip",
@@ -356,14 +356,14 @@ export const blogPostsSeedData = [
356
356
  title: "The Indian Collectibles Market in 2026: Where We Stand",
357
357
  slug: "india-collectibles-market-overview",
358
358
  excerpt: "From trading cards to action figures — a data-driven look at India's growing collectibles scene and what's driving the boom.",
359
- content: `<h2>The Numbers</h2><p>India's organized collectibles market is estimated at ₹2,500 crore in 2026, up from ₹800 crore in 2022. Trading cards (Pokémon, YGO, One Piece) account for ~40%, followed by action figures (~25%), diecast (~15%), and model kits (~10%).</p><h2>What's Driving Growth</h2><p><strong>Anime streaming</strong> — India is now the #3 market for anime streaming (Crunchyroll, Netflix anime). Fans who watch Dragon Ball, Naruto, and One Piece naturally become collectors. <strong>Social media</strong> — Instagram and YouTube unboxing/pull content drives awareness. <strong>Verified platforms</strong> — LetItRip and similar platforms have made it safe to buy collectibles online, reducing the counterfeit risk that previously kept buyers away.</p><h2>What's Hot in 2026</h2><p>Pokémon cards remain #1 by volume. Yu-Gi-Oh! has the highest average transaction value. Beyblade X is the fastest-growing category. Gundam is niche but intensely loyal. Hot Wheels Super Treasure Hunts are the "gateway drug" for new collectors.</p><h2>What's Next</h2><p>Sports cards (cricket, specifically) are the next frontier. Digital collectibles (graded card NFTs backed by physical) are being explored. LetItRip is building infrastructure for both.</p>`,
359
+ content: `<h2>The Numbers</h2><p>India's organized collectibles market is estimated at ₹2,500 crore in 2026, up from ₹800 crore in 2022. Trading cards (Pokémon, One Piece) account for ~40%, followed by action figures (~25%), diecast (~15%), and model kits/spinning tops (~10%).</p><h2>What's Driving Growth</h2><p><strong>Anime streaming</strong> — India is now the #3 market for anime streaming (Crunchyroll, Netflix anime). Fans who watch Dragon Ball, Naruto, and One Piece naturally become collectors. <strong>Social media</strong> — Instagram and YouTube unboxing/pull content drives awareness. <strong>Verified platforms</strong> — LetItRip and similar platforms have made it safe to buy collectibles online, reducing the counterfeit risk that previously kept buyers away.</p><h2>What's Hot in 2026</h2><p>Pokémon cards remain #1 by volume. Beyblade X is the fastest-growing category by transaction value. Gundam is niche but intensely loyal. Hot Wheels Super Treasure Hunts are the "gateway drug" for new collectors.</p><h2>What's Next</h2><p>Sports cards (cricket, specifically) are the next frontier. Digital collectibles (graded item NFTs backed by physical) are being explored. LetItRip is building infrastructure for both.</p>`,
360
360
  category: "community",
361
361
  tags: ["india", "market", "overview", "trends", "2026"],
362
362
  isFeatured: false,
363
363
  status: "published",
364
364
  publishedAt: daysAgo(16),
365
365
  authorId: "user-admin-letitrip",
366
- authorName: "LetItRip Admin",
366
+ authorName: "Mock User 1",
367
367
  readTimeMinutes: 8,
368
368
  views: 4100,
369
369
  metaTitle: "Indian Collectibles Market 2026 | LetItRip",
@@ -384,7 +384,7 @@ export const blogPostsSeedData = [
384
384
  status: "published",
385
385
  publishedAt: daysAgo(45),
386
386
  authorId: "user-admin-letitrip",
387
- authorName: "LetItRip Admin",
387
+ authorName: "Mock User 1",
388
388
  readTimeMinutes: 4,
389
389
  views: 7200,
390
390
  metaTitle: "Escrow Protection Now Live on LetItRip",
@@ -404,7 +404,7 @@ export const blogPostsSeedData = [
404
404
  status: "published",
405
405
  publishedAt: daysAgo(35),
406
406
  authorId: "user-admin-letitrip",
407
- authorName: "LetItRip Admin",
407
+ authorName: "Mock User 1",
408
408
  readTimeMinutes: 5,
409
409
  views: 4800,
410
410
  metaTitle: "Verified Seller Program | LetItRip",
@@ -424,7 +424,7 @@ export const blogPostsSeedData = [
424
424
  status: "archived",
425
425
  publishedAt: daysAgo(60),
426
426
  authorId: "user-admin-letitrip",
427
- authorName: "LetItRip Admin",
427
+ authorName: "Mock User 1",
428
428
  readTimeMinutes: 4,
429
429
  views: 5600,
430
430
  metaTitle: "Live Auctions Now on LetItRip",