@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
@@ -19,6 +19,146 @@
19
19
  import { PRODUCT_FIELDS } from "../constants/field-names";
20
20
  import { buildSearchTokens } from "../utils/search-tokens";
21
21
  import { seedExtMedia } from "./_helpers/media";
22
+ /*
23
+ * Real Beyblade attributes per fixture — Root Cause #6 (standard was the
24
+ * "richest" seed file by fixture count but never exercised customFields/
25
+ * customSections/specifications, the actual product-spec render pipeline).
26
+ * Keyed by product id, merged into each fixture below.
27
+ */
28
+ const SPEC_OVERRIDES = {
29
+ "product-beyblade-original-dranzer-s": {
30
+ specifications: [
31
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
32
+ { name: "Type", value: "Attack" },
33
+ { name: "Weight", value: "31.8", unit: "g" },
34
+ { name: "Stamina Rating", value: "5", unit: "/10" },
35
+ { name: "Attack Rating", value: "8", unit: "/10" },
36
+ ],
37
+ customFields: [
38
+ { key: "Launcher Included", type: "boolean", value: "true" },
39
+ { key: "Ripcord Length", type: "text", value: "Standard (short-pull)" },
40
+ ],
41
+ },
42
+ "product-beyblade-original-driger-v": {
43
+ specifications: [
44
+ { name: "Spin Direction", value: "Left (Left-Spin)" },
45
+ { name: "Type", value: "Attack" },
46
+ { name: "Weight", value: "33.1", unit: "g" },
47
+ { name: "Stamina Rating", value: "6", unit: "/10" },
48
+ { name: "Attack Rating", value: "7", unit: "/10" },
49
+ ],
50
+ customFields: [{ key: "Launcher Included", type: "boolean", value: "false" }],
51
+ customSections: [
52
+ {
53
+ id: "battle-tips",
54
+ title: "Battle Tips",
55
+ text: "Driger V's left-spin makes it a strong counter-pick against right-spin attack types — pair with a wide-angle stadium for maximum recoil advantage.",
56
+ },
57
+ ],
58
+ },
59
+ "product-beyblade-metal-storm-pegasus": {
60
+ specifications: [
61
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
62
+ { name: "Type", value: "Attack" },
63
+ { name: "Weight", value: "50.2", unit: "g" },
64
+ { name: "Stamina Rating", value: "4", unit: "/10" },
65
+ { name: "Attack Rating", value: "9", unit: "/10" },
66
+ { name: "Track & Bottom", value: "105 / RF (Rubber Flat)" },
67
+ ],
68
+ customFields: [{ key: "Launcher Included", type: "boolean", value: "true" }],
69
+ },
70
+ "product-beyblade-metal-flame-sagittario": {
71
+ specifications: [
72
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
73
+ { name: "Type", value: "Balance" },
74
+ { name: "Weight", value: "56.8", unit: "g" },
75
+ { name: "Stamina Rating", value: "7", unit: "/10" },
76
+ { name: "Defense Rating", value: "6", unit: "/10" },
77
+ { name: "Track & Bottom", value: "C145 / S (Spike)" },
78
+ ],
79
+ customFields: [{ key: "Tournament Legal", type: "boolean", value: "true" }],
80
+ },
81
+ "product-beyblade-burst-valkyrie": {
82
+ specifications: [
83
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
84
+ { name: "Type", value: "Attack" },
85
+ { name: "Weight", value: "28.6", unit: "g" },
86
+ { name: "Stamina Rating", value: "5", unit: "/10" },
87
+ { name: "Attack Rating", value: "9", unit: "/10" },
88
+ { name: "Layer / Disc / Driver", value: "Valkyrie / Wing / Accel" },
89
+ ],
90
+ customFields: [
91
+ { key: "Launcher Included", type: "boolean", value: "true" },
92
+ { key: "Burst Resistance", type: "text", value: "Medium — tighten disc lock before battle" },
93
+ ],
94
+ customSections: [
95
+ {
96
+ id: "battle-tips",
97
+ title: "Battle Tips",
98
+ text: "Accel driver gives Valkyrie an aggressive early-game charge — best used in Attack vs. Stamina matchups where a fast KO matters more than late-game endurance.",
99
+ },
100
+ ],
101
+ },
102
+ "product-beyblade-burst-regalia-genesis": {
103
+ specifications: [
104
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
105
+ { name: "Type", value: "Attack" },
106
+ { name: "Weight", value: "32.4", unit: "g" },
107
+ { name: "Stamina Rating", value: "4", unit: "/10" },
108
+ { name: "Attack Rating", value: "8", unit: "/10" },
109
+ { name: "Layer / Disc / Driver", value: "Regalia Genesis / .Zt" },
110
+ ],
111
+ customFields: [{ key: "Switch Launcher Compatible", type: "boolean", value: "true" }],
112
+ },
113
+ "product-beyblade-x-wizard-arrow": {
114
+ specifications: [
115
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
116
+ { name: "Type", value: "Balance" },
117
+ { name: "Weight", value: "34.9", unit: "g" },
118
+ { name: "Stamina Rating", value: "6", unit: "/10" },
119
+ { name: "Attack Rating", value: "6", unit: "/10" },
120
+ { name: "Blade / Ratchet / Bit", value: "Wizard / 4-60 / Flat" },
121
+ ],
122
+ customFields: [{ key: "Launcher Included", type: "boolean", value: "true" }],
123
+ },
124
+ "product-beyblade-x-knife-shinobi": {
125
+ specifications: [
126
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
127
+ { name: "Type", value: "Balance" },
128
+ { name: "Weight", value: "36.1", unit: "g" },
129
+ { name: "Stamina Rating", value: "8", unit: "/10" },
130
+ { name: "Defense Rating", value: "6", unit: "/10" },
131
+ { name: "Blade / Ratchet / Bit", value: "Knife Shinobi / 3-60 / Glide Flat" },
132
+ ],
133
+ customFields: [{ key: "Tournament Legal", type: "boolean", value: "true" }],
134
+ customSections: [
135
+ {
136
+ id: "battle-tips",
137
+ title: "Battle Tips",
138
+ text: "Glide Flat bit gives Knife Shinobi excellent late-game stamina in X-format stadiums with a ring — hold back and let opponents burn attack power first.",
139
+ },
140
+ ],
141
+ },
142
+ "product-beyblade-original-dragoon-f-video-demo": {
143
+ specifications: [
144
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
145
+ { name: "Type", value: "Attack" },
146
+ { name: "Weight", value: "30.5", unit: "g" },
147
+ { name: "Attack Rating", value: "8", unit: "/10" },
148
+ ],
149
+ customFields: [{ key: "Launcher Included", type: "boolean", value: "true" }],
150
+ },
151
+ "product-beyblade-x-dran-sword-video-demo": {
152
+ specifications: [
153
+ { name: "Spin Direction", value: "Right (Right-Spin)" },
154
+ { name: "Type", value: "Attack" },
155
+ { name: "Weight", value: "35.7", unit: "g" },
156
+ { name: "Attack Rating", value: "9", unit: "/10" },
157
+ { name: "Blade / Ratchet / Bit", value: "Dran Sword / 3-60 / Flat" },
158
+ ],
159
+ customFields: [{ key: "Tournament Legal", type: "boolean", value: "true" }],
160
+ },
161
+ };
22
162
  function withTokens(p) {
23
163
  return {
24
164
  tags: [],
@@ -339,6 +479,7 @@ const _rawProductsStandardSeedData = [
339
479
  export const productsStandardSeedData = [
340
480
  ..._rawProductsStandardSeedData.map((p) => withTokens({
341
481
  ...p,
482
+ ...(p.id ? SPEC_OVERRIDES[p.id] : undefined),
342
483
  listingType: PRODUCT_FIELDS.LISTING_TYPE_VALUES.STANDARD,
343
484
  })),
344
485
  ];
@@ -1,10 +1,13 @@
1
1
  /*
2
- * WHY: Sticker listings are out of scope for the minimal Beyblade-focused demo catalog.
3
- * WHAT: Exports an empty array kept as a stub so seed/index.ts and the seed API route's
4
- * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
2
+ * WHY: `listingType: "stickers"` shares ProductPrintMeta (size/material/finish/editionSize)
3
+ * with "art"both printed-only physical goods. Previously left as an empty stub,
4
+ * but sticker sheets fit the Beyblade theme naturally (see CLAUDE.md seed-data
5
+ * blandness sweep, 2026-08-20 session).
6
+ * WHAT: Exports 5 Beyblade sticker-sheet listings on Beyblade Arena, varying size,
7
+ * material, and finish (including a holographic variant and a die-cut vinyl set).
5
8
  *
6
9
  * EXPORTS:
7
- * productsStickersSeedData — empty array
10
+ * productsStickersSeedData — Array of 5 Partial<ProductDocument> with listingType:"stickers"
8
11
  *
9
12
  * @tag domain:products,stickers
10
13
  * @tag layer:seed
@@ -13,4 +16,174 @@
13
16
  * @tag consumers:seed/index.ts,seed/runner.ts
14
17
  * @tag sideEffects:none
15
18
  */
16
- export const productsStickersSeedData = [];
19
+ import { PRODUCT_FIELDS } from "../constants/field-names";
20
+ import { buildSearchTokens } from "../utils/search-tokens";
21
+ import { seedExtMedia } from "./_helpers/media";
22
+ export const productsStickersSeedData = [
23
+ {
24
+ id: "stickers-beyblade-original-classic-sheet",
25
+ slug: "stickers-beyblade-original-classic-sheet",
26
+ title: "Beyblade Original Classic — Sticker Sheet",
27
+ description: "A 5x5 cm sticker sheet featuring Dranzer, Driger, Draciel, and Dragoon in classic original-series art style.",
28
+ categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
29
+ categoryNames: ["Beyblade Original", "Spinning Tops"],
30
+ brandSlug: "brand-beyblade",
31
+ brand: "Beyblade",
32
+ price: 149,
33
+ currency: "INR",
34
+ stockQuantity: 100,
35
+ availableQuantity: 100,
36
+ isSold: false,
37
+ mainImage: seedExtMedia("https://picsum.photos/seed/stickers-image-original-classic-1-20260817/900/900"),
38
+ images: [seedExtMedia("https://picsum.photos/seed/stickers-image-original-classic-1-20260817/900/900")],
39
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
40
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
41
+ listingType: "stickers",
42
+ storeId: "store-beyblade-arena",
43
+ storeName: "Beyblade Arena",
44
+ printMeta: { size: "5x5 cm sheet", material: "Vinyl", finish: "Glossy" },
45
+ customFields: [],
46
+ customSections: [],
47
+ featured: false,
48
+ isPromoted: false,
49
+ isOnSale: false,
50
+ tags: ["stickers", "vintage-collectible"],
51
+ createdAt: new Date("2026-08-17"),
52
+ updatedAt: new Date("2026-08-17"),
53
+ searchTokens: buildSearchTokens("Beyblade Original Classic — Sticker Sheet", "5x5 cm sticker sheet featuring Dranzer, Driger, Draciel, and Dragoon.", "Beyblade", "brand-beyblade", ["Beyblade Original", "Spinning Tops"], ["stickers", "vintage-collectible"]),
54
+ },
55
+ {
56
+ id: "stickers-beyblade-x-holographic-pack",
57
+ slug: "stickers-beyblade-x-holographic-pack",
58
+ title: "Beyblade X Holographic Sticker Pack",
59
+ description: "A holographic-finish sticker pack featuring the current Beyblade X lineup — catches the light with a rainbow shimmer.",
60
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
61
+ categoryNames: ["Beyblade X", "Spinning Tops"],
62
+ brandSlug: "brand-takara-tomy",
63
+ brand: "Takara-Tomy",
64
+ price: 199,
65
+ currency: "INR",
66
+ stockQuantity: 80,
67
+ availableQuantity: 62,
68
+ isSold: false,
69
+ mainImage: seedExtMedia("https://picsum.photos/seed/stickers-image-x-holo-1-20260818/900/900"),
70
+ images: [
71
+ seedExtMedia("https://picsum.photos/seed/stickers-image-x-holo-1-20260818/900/900"),
72
+ seedExtMedia("https://picsum.photos/seed/stickers-image-x-holo-2-20260818/900/900"),
73
+ ],
74
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
75
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
76
+ listingType: "stickers",
77
+ storeId: "store-beyblade-arena",
78
+ storeName: "Beyblade Arena",
79
+ printMeta: { size: "8x10 cm sheet", material: "Holographic vinyl", finish: "Holographic" },
80
+ customFields: [],
81
+ customSections: [],
82
+ featured: true,
83
+ isPromoted: false,
84
+ isOnSale: false,
85
+ tags: ["stickers"],
86
+ createdAt: new Date("2026-08-18"),
87
+ updatedAt: new Date("2026-08-19"),
88
+ searchTokens: buildSearchTokens("Beyblade X Holographic Sticker Pack", "Holographic-finish sticker pack featuring the current Beyblade X lineup.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["stickers"]),
89
+ },
90
+ {
91
+ id: "stickers-beyblade-burst-diecut-set",
92
+ slug: "stickers-beyblade-burst-diecut-set",
93
+ title: "Beyblade Burst Die-Cut Sticker Set (6-Pack)",
94
+ description: "Individually die-cut vinyl stickers of 6 fan-favorite Burst tops — no background, clean edges, weatherproof.",
95
+ categorySlugs: ["category-beyblade-burst", "category-spinning-tops"],
96
+ categoryNames: ["Beyblade Burst", "Spinning Tops"],
97
+ brandSlug: "brand-beyblade",
98
+ brand: "Beyblade",
99
+ price: 249,
100
+ currency: "INR",
101
+ stockQuantity: 60,
102
+ availableQuantity: 60,
103
+ isSold: false,
104
+ mainImage: seedExtMedia("https://picsum.photos/seed/stickers-image-burst-diecut-1-20260819/900/900"),
105
+ images: [seedExtMedia("https://picsum.photos/seed/stickers-image-burst-diecut-1-20260819/900/900")],
106
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
107
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
108
+ listingType: "stickers",
109
+ storeId: "store-beyblade-arena",
110
+ storeName: "Beyblade Arena",
111
+ printMeta: { size: "Individually die-cut, ~6x6 cm each", material: "Weatherproof vinyl", finish: "Matte" },
112
+ customFields: [{ key: "Pack Count", type: "number", value: "6" }],
113
+ customSections: [],
114
+ featured: false,
115
+ isPromoted: false,
116
+ isOnSale: false,
117
+ tags: ["stickers"],
118
+ createdAt: new Date("2026-08-19"),
119
+ updatedAt: new Date("2026-08-19"),
120
+ searchTokens: buildSearchTokens("Beyblade Burst Die-Cut Sticker Set (6-Pack)", "Individually die-cut vinyl stickers of 6 fan-favorite Burst tops.", "Beyblade", "brand-beyblade", ["Beyblade Burst", "Spinning Tops"], ["stickers"]),
121
+ },
122
+ {
123
+ id: "stickers-beyblade-metal-retro-sheet",
124
+ slug: "stickers-beyblade-metal-retro-sheet",
125
+ title: "Metal Fight Retro Sticker Sheet — Limited /500",
126
+ description: "A limited-edition retro-styled sticker sheet celebrating Metal Fight favorites, numbered out of 500.",
127
+ categorySlugs: ["category-beyblade-metal", "category-spinning-tops"],
128
+ categoryNames: ["Beyblade Metal Fight", "Spinning Tops"],
129
+ brandSlug: "brand-takara-tomy",
130
+ brand: "Takara-Tomy",
131
+ price: 179,
132
+ currency: "INR",
133
+ stockQuantity: 500,
134
+ availableQuantity: 214,
135
+ isSold: false,
136
+ mainImage: seedExtMedia("https://picsum.photos/seed/stickers-image-metal-retro-1-20260819/900/900"),
137
+ images: [seedExtMedia("https://picsum.photos/seed/stickers-image-metal-retro-1-20260819/900/900")],
138
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
139
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
140
+ listingType: "stickers",
141
+ storeId: "store-beyblade-arena",
142
+ storeName: "Beyblade Arena",
143
+ printMeta: { size: "6x8 cm sheet", material: "Vinyl", finish: "Matte", editionSize: 500 },
144
+ customFields: [],
145
+ customSections: [],
146
+ featured: false,
147
+ isPromoted: false,
148
+ isOnSale: false,
149
+ tags: ["stickers", "vintage-collectible", "limited-run"],
150
+ createdAt: new Date("2026-08-19"),
151
+ updatedAt: new Date("2026-08-19"),
152
+ searchTokens: buildSearchTokens("Metal Fight Retro Sticker Sheet — Limited /500", "Limited-edition retro-styled sticker sheet, numbered out of 500.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade Metal Fight", "Spinning Tops"], ["stickers", "vintage-collectible", "limited-run"]),
153
+ },
154
+ {
155
+ id: "stickers-beyblade-x-glow-in-dark",
156
+ slug: "stickers-beyblade-x-glow-in-dark",
157
+ title: "Beyblade X Glow-in-the-Dark Sticker Pack",
158
+ description: "Charge these stickers under light and watch the Beyblade X logos glow in the dark. Great for stadium cases and water bottles.",
159
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
160
+ categoryNames: ["Beyblade X", "Spinning Tops"],
161
+ brandSlug: "brand-takara-tomy",
162
+ brand: "Takara-Tomy",
163
+ price: 229,
164
+ currency: "INR",
165
+ stockQuantity: 45,
166
+ availableQuantity: 45,
167
+ isSold: false,
168
+ mainImage: seedExtMedia("https://picsum.photos/seed/stickers-image-x-glow-1-20260819/900/900"),
169
+ images: [
170
+ seedExtMedia("https://picsum.photos/seed/stickers-image-x-glow-1-20260819/900/900"),
171
+ seedExtMedia("https://picsum.photos/seed/stickers-image-x-glow-2-20260819/900/900"),
172
+ ],
173
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
174
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
175
+ listingType: "stickers",
176
+ storeId: "store-beyblade-arena",
177
+ storeName: "Beyblade Arena",
178
+ printMeta: { size: "7x9 cm sheet", material: "Glow-in-the-dark vinyl", finish: "Matte" },
179
+ customFields: [{ key: "Glow Duration", type: "text", value: "~3 hours after charging" }],
180
+ customSections: [],
181
+ featured: true,
182
+ isPromoted: true,
183
+ isOnSale: false,
184
+ tags: ["stickers"],
185
+ createdAt: new Date("2026-08-19"),
186
+ updatedAt: new Date("2026-08-19"),
187
+ searchTokens: buildSearchTokens("Beyblade X Glow-in-the-Dark Sticker Pack", "Charge under light and watch the Beyblade X logos glow in the dark.", "Takara-Tomy", "brand-takara-tomy", ["Beyblade X", "Spinning Tops"], ["stickers"]),
188
+ },
189
+ ];
@@ -12,9 +12,6 @@
12
12
  * @tag consumers:seed/index.ts,seed/runner.ts
13
13
  * @tag sideEffects:none
14
14
  */
15
- import { getDefaultPhonePrefix, getSeedLocale } from "./seed-market-config";
16
- const _phonePrefix = getDefaultPhonePrefix();
17
- const _locale = getSeedLocale();
18
15
  import { seedExtMedia } from "./_helpers/media";
19
16
  import { ROUTES } from "../next/routing/route-map";
20
17
  const NOW = new Date();
@@ -119,7 +116,7 @@ export const siteSettingsSeedData = {
119
116
  { year: "2026", text: "Pre-orders, events, raffles, and a mobile-first redesign — built for the community that showed up, bid, sold, and kept coming back." },
120
117
  ],
121
118
  teamTitle: "Who's Behind LetItRip",
122
- teamSubtitle: "A small team obsessed with the same thing you are — the hunt for the next piece of the collection.",
119
+ teamSubtitle: "One collector obsessed with the same thing you are — the hunt for the next piece of the collection.",
123
120
  teamMembers: [
124
121
  {
125
122
  name: "Mohasin Chinnapattan",
@@ -130,22 +127,6 @@ export const siteSettingsSeedData = {
130
127
  isDeveloper: true,
131
128
  githubUrl: "https://github.com/mohasinac",
132
129
  },
133
- {
134
- name: "Ananya Rao",
135
- role: "Community & Trust",
136
- bio: "Keeps the marketplace honest — seller verification, dispute resolution, and the reason LetItRip's escrow system actually works the way it's supposed to. Collects vintage diecast when she isn't reviewing seller applications.",
137
- photoUrl: seedExtMedia("https://picsum.photos/seed/letitrip-team-ananya-rao-20260819/400/400"),
138
- isFounder: false,
139
- isDeveloper: false,
140
- },
141
- {
142
- name: "Devansh Mehta",
143
- role: "Seller Success",
144
- bio: "Helps new stores go from zero listings to their first sale — onboarding, storefront setup, and the occasional 2 a.m. \"why isn't my auction showing up\" message. Runs a Beyblade collection that has outgrown two apartments.",
145
- photoUrl: seedExtMedia("https://picsum.photos/seed/letitrip-team-devansh-mehta-20260819/400/400"),
146
- isFounder: false,
147
- isDeveloper: false,
148
- },
149
130
  ],
150
131
  ctaTitle: "Ready to Let It Rip?",
151
132
  ctaSell: "Start selling in minutes",
@@ -173,10 +154,10 @@ export const siteSettingsSeedData = {
173
154
  },
174
155
  contact: {
175
156
  email: "support@letitrip.in",
176
- phone: `${_phonePrefix}-9876543210`,
177
- address: `123, Marketplace Street, ${_locale.cities[0][0]}, ${_locale.cities[0][1]} - ${_locale.cities[0][2]}, ${_locale.countryName}`,
178
- upiVpa: "letitrip@upi",
179
- whatsappNumber: `${_phonePrefix.replace(/[^+\d]/g, "")}9876543210`,
157
+ phone: "+91-8919665811",
158
+ address: "Siddeshwar Peth, Solapur, Maharashtra 413001",
159
+ upiVpa: "mohsin0502@okicici",
160
+ whatsappNumber: "918919665811",
180
161
  },
181
162
  payment: {
182
163
  razorpayEnabled: false,
@@ -194,10 +175,10 @@ export const siteSettingsSeedData = {
194
175
  surchargeSellerSharePercent: 50,
195
176
  },
196
177
  socialLinks: {
197
- facebook: "https://facebook.com/letitrip",
198
- twitter: "https://twitter.com/letitrip",
199
- instagram: "https://instagram.com/letitrip",
200
- linkedin: "https://linkedin.com/company/letitrip",
178
+ facebook: "",
179
+ twitter: "",
180
+ instagram: "",
181
+ linkedin: "",
201
182
  },
202
183
  emailSettings: {
203
184
  fromName: "LetItRip",
@@ -356,7 +337,7 @@ export const siteSettingsSeedData = {
356
337
  minOrderValue: 999,
357
338
  returnWindow: 7,
358
339
  supportEmail: "support@letitrip.in",
359
- supportPhone: `${_phonePrefix}-9876543210`,
340
+ supportPhone: "+91-8919665811",
360
341
  codDeposit: 0.1,
361
342
  },
362
343
  },
@@ -49,7 +49,7 @@ export const payoutMethodsSeedData = [
49
49
  storeId: "store-letitrip-official",
50
50
  type: "upi",
51
51
  label: "LetItRip UPI",
52
- upiVpa: "letitrip@upi",
52
+ upiVpa: "mohsin0502@okicici",
53
53
  isDefault: true,
54
54
  isActive: true,
55
55
  },
@@ -28,6 +28,9 @@ export { PrizeDrawsListingView } from "./features/products/components/PrizeDraws
28
28
  export { PrizeDrawDetailPageView } from "./features/products/components/PrizeDrawDetailPageView";
29
29
  export { ProductDetailPageView } from "./features/products/components/ProductDetailPageView";
30
30
  export { ProductsIndexPageView } from "./features/products/components/ProductsIndexPageView";
31
+ export { ClassifiedDetailPageView } from "./features/classified/components/ClassifiedDetailPageView";
32
+ export { DigitalCodeDetailPageView } from "./features/digital-codes/components/DigitalCodeDetailPageView";
33
+ export { LiveItemDetailPageView } from "./features/live/components/LiveItemDetailPageView";
31
34
  export { ArtStickersListView } from "./features/products/components/ArtStickersListView";
32
35
  export { ReviewsIndexPageView } from "./features/reviews/components/ReviewsIndexPageView";
33
36
  export { ReviewDetailPageView } from "./features/reviews/components/ReviewDetailPageView";
@@ -61,7 +64,7 @@ export { renderFaqOg, renderFaqOgImage, type FaqOgData, } from "./_internal/serv
61
64
  export { renderScamOg, renderScamOgImage, type ScamOgData, getScammerForDetail, getScammerProfilePageData as getScammerProfilePageDataCached, } from "./_internal/server/features/scams/index";
62
65
  export { getSearchResults, searchAction, type SearchQuery, } from "./_internal/server/features/search/index";
63
66
  export { getCategoryForDetail, listRootCategories, listFeaturedCategories, listMenuCategories, getCategoryTree, listSitemapCategories, CATEGORIES_PAGE_SIZE, CATEGORIES_ROOT_TIER, CATEGORIES_MAX_DEPTH, CATEGORIES_SITEMAP_LIMIT, CATEGORIES_FEATURED_LIMIT, CATEGORIES_MENU_LIMIT, } from "./_internal/server/features/categories/index";
64
- export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, type GroupedListingWithItems, type ListGroupedListingsParams, type SitemapGroupedListing, } from "./_internal/server/features/grouped/index";
67
+ export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, type GroupedListingWithItems, type ListGroupedListingsParams, type SitemapGroupedListing, } from "./_internal/server/features/grouped/index";
65
68
  export { createCheckoutOrderAction, attachPaymentAction, verifyAndPlaceRazorpayOrderAction, previewCheckoutPricing, resolveShippingCost, formatShippingAddress, CHECKOUT_DEFAULT_COMMISSIONS, CHECKOUT_PAYMENT_METHODS, type CreateCheckoutOrderInput, type VerifyAndPlaceRazorpayOrderInput, type CheckoutOrderResult, type CheckoutPaymentMethod, type CheckoutPricingPreviewInput, type CheckoutPricingPreview, } from "./_internal/server/features/checkout/index";
66
69
  export { processRefundAction, type ProcessRefundInput, } from "./_internal/server/features/refunds/actions";
67
70
  export { createPaymentIntentAction, verifyPaymentSignatureAction, resolvePaymentFee, PAYMENTS_DEFAULT_PLATFORM_FEE_PERCENT, PAYMENTS_DEFAULT_GST_PERCENT, PAYMENTS_RECEIPT_PREFIX, type CreatePaymentIntentInput, type CreatePaymentIntentResult, type VerifyPaymentSignatureInput, type ResolvedPaymentFee, } from "./_internal/server/features/payments/index";
@@ -33,6 +33,9 @@ export { PrizeDrawsListingView } from "./features/products/components/PrizeDraws
33
33
  export { PrizeDrawDetailPageView } from "./features/products/components/PrizeDrawDetailPageView";
34
34
  export { ProductDetailPageView } from "./features/products/components/ProductDetailPageView";
35
35
  export { ProductsIndexPageView } from "./features/products/components/ProductsIndexPageView";
36
+ export { ClassifiedDetailPageView } from "./features/classified/components/ClassifiedDetailPageView";
37
+ export { DigitalCodeDetailPageView } from "./features/digital-codes/components/DigitalCodeDetailPageView";
38
+ export { LiveItemDetailPageView } from "./features/live/components/LiveItemDetailPageView";
36
39
  export { ArtStickersListView } from "./features/products/components/ArtStickersListView";
37
40
  export { ReviewsIndexPageView } from "./features/reviews/components/ReviewsIndexPageView";
38
41
  export { ReviewDetailPageView } from "./features/reviews/components/ReviewDetailPageView";
@@ -85,7 +88,7 @@ export { getSearchResults, searchAction, } from "./_internal/server/features/sea
85
88
  // S3: categories data layer
86
89
  export { getCategoryForDetail, listRootCategories, listFeaturedCategories, listMenuCategories, getCategoryTree, listSitemapCategories, CATEGORIES_PAGE_SIZE, CATEGORIES_ROOT_TIER, CATEGORIES_MAX_DEPTH, CATEGORIES_SITEMAP_LIMIT, CATEGORIES_FEATURED_LIMIT, CATEGORIES_MENU_LIMIT, } from "./_internal/server/features/categories/index";
87
90
  // S3: grouped listings data layer
88
- export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, } from "./_internal/server/features/grouped/index";
91
+ export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, getGroupsForProduct, getGroupsWithItemsForProduct, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, } from "./_internal/server/features/grouped/index";
89
92
  // SB-UNI-V — bundles data layer deleted; consumers should query
90
93
  // `categoriesRepository.findBySlugAndType(slug, "bundle")` /
91
94
  // `.listByType("bundle", opts)` / `.findById(id)` directly.
package/dist/server.d.ts CHANGED
@@ -495,8 +495,9 @@ export { fetchGoogleReviews } from "./features/homepage/lib/google-reviews-fetch
495
495
  export type { GoogleReview, GoogleReviewsResult } from "./features/homepage/lib/google-reviews-fetcher";
496
496
  export { GoogleReviewsSection } from "./features/homepage/components/GoogleReviewsSection";
497
497
  export type { GoogleReviewsSectionProps } from "./features/homepage/components/GoogleReviewsSection";
498
- export { getProductForDetail, listSitemapProducts, type SitemapProduct } from "./_internal/server/features/products/index";
499
- export { getBundleForDetail, listBundleMembers, listFeaturedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, type BundleDataOptions, type BundleMetadataOptions, type BundleOgData, } from "./_internal/server/features/bundles/index";
498
+ export { getProductForDetail, listSitemapProducts, computeRelatedItems, toProductItem, type SitemapProduct, type RelatedItemsResult, } from "./_internal/server/features/products/index";
499
+ export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, type BundleDataOptions, type BundleMetadataOptions, type BundleOgData, } from "./_internal/server/features/bundles/index";
500
+ export { getGroupsForProduct, getGroupsWithItemsForProduct } from "./_internal/server/features/grouped/index";
500
501
  export { getAuctionForDetail, getProductFeaturesForAuction } from "./_internal/server/features/auctions/index";
501
502
  export { getPreOrderForDetail, getProductFeaturesForPreOrder } from "./_internal/server/features/pre-orders/index";
502
503
  export { getStoreForDetail, listStoreProductsInitial, listStoreAuctionsInitial, listStorePreOrdersInitial, listSitemapStores } from "./_internal/server/features/stores/index";
@@ -548,6 +549,7 @@ export { getItemRequestForDetail, renderItemRequestOg, renderItemRequestOgImage,
548
549
  export { toClientClassified, type ClassifiedClientShape } from "./_internal/server/features/classified/adapters";
549
550
  export { buildClassifiedMetadata, type ClassifiedMetadataOptions } from "./_internal/server/features/classified/metadata";
550
551
  export { renderClassifiedOg, renderClassifiedOgImage, renderClassifiedOgFromDoc, type ClassifiedOgData } from "./_internal/server/features/classified/og";
552
+ export { renderCatalogueItemOg, renderCatalogueItemOgImage, type CatalogueItemOgData } from "./_internal/server/features/catalogue/og";
551
553
  export { getDigitalCodeForDetail } from "./_internal/server/features/digital-code/data";
552
554
  export { toClientDigitalCode, type DigitalCodeClientShape } from "./_internal/server/features/digital-code/adapters";
553
555
  export { buildDigitalCodeMetadata, type DigitalCodeMetadataOptions } from "./_internal/server/features/digital-code/metadata";
package/dist/server.js CHANGED
@@ -1347,9 +1347,10 @@ export { GoogleReviewsSection } from "./features/homepage/components/GoogleRevie
1347
1347
  // `@mohasinac/appkit/server` subpath (preferred for SSR route files).
1348
1348
  // ---------------------------------------------------------------------------
1349
1349
  // Data layers — each wrapped in React.cache for request-scoped dedup
1350
- export { getProductForDetail, listSitemapProducts } from "./_internal/server/features/products/index";
1350
+ export { getProductForDetail, listSitemapProducts, computeRelatedItems, toProductItem, } from "./_internal/server/features/products/index";
1351
1351
  // S-SBUNI-3/4 2026-05-13 — bundle data/metadata/og layer.
1352
- export { getBundleForDetail, listBundleMembers, listFeaturedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, } from "./_internal/server/features/bundles/index";
1352
+ export { getBundleForDetail, listBundleMembers, listFeaturedBundles, getRelatedBundles, resolveBundleMemberIds, resolveBundleOriginalTotal, buildBundleMetadata, renderBundleOg, renderBundleOgImage, addBundleToCartAction, } from "./_internal/server/features/bundles/index";
1353
+ export { getGroupsForProduct, getGroupsWithItemsForProduct } from "./_internal/server/features/grouped/index";
1353
1354
  export { getAuctionForDetail, getProductFeaturesForAuction } from "./_internal/server/features/auctions/index";
1354
1355
  export { getPreOrderForDetail, getProductFeaturesForPreOrder } from "./_internal/server/features/pre-orders/index";
1355
1356
  export { getStoreForDetail, listStoreProductsInitial, listStoreAuctionsInitial, listStorePreOrdersInitial, listSitemapStores } from "./_internal/server/features/stores/index";
@@ -1409,6 +1410,7 @@ export { getItemRequestForDetail, renderItemRequestOg, renderItemRequestOgImage,
1409
1410
  export { toClientClassified } from "./_internal/server/features/classified/adapters";
1410
1411
  export { buildClassifiedMetadata } from "./_internal/server/features/classified/metadata";
1411
1412
  export { renderClassifiedOg, renderClassifiedOgImage, renderClassifiedOgFromDoc } from "./_internal/server/features/classified/og";
1413
+ export { renderCatalogueItemOg, renderCatalogueItemOgImage } from "./_internal/server/features/catalogue/og";
1412
1414
  // ── Digital-code listing — data + adapters + metadata + OG ───────────────────
1413
1415
  export { getDigitalCodeForDetail } from "./_internal/server/features/digital-code/data";
1414
1416
  export { toClientDigitalCode } from "./_internal/server/features/digital-code/adapters";