@mohasinac/appkit 4.13.0 → 4.14.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 (377) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +14 -5
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +3 -0
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +6 -0
  4. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +8 -0
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.js +4 -1
  6. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +7 -0
  7. package/dist/_internal/client/features/lottery/LotteryListView.js +1 -1
  8. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +4 -1
  9. package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +15 -0
  10. package/dist/_internal/client/features/lottery/slot-collage-items.js +13 -0
  11. package/dist/_internal/server/features/auctions/actions.js +6 -0
  12. package/dist/_internal/server/features/bundles/data.d.ts +16 -0
  13. package/dist/_internal/server/features/bundles/data.js +26 -0
  14. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  15. package/dist/_internal/server/features/bundles/index.js +1 -1
  16. package/dist/_internal/server/features/checkout/actions.js +6 -0
  17. package/dist/_internal/server/features/checkout/locked-lines.d.ts +38 -0
  18. package/dist/_internal/server/features/checkout/locked-lines.js +171 -0
  19. package/dist/_internal/server/features/homepage/index.d.ts +0 -1
  20. package/dist/_internal/server/features/homepage/index.js +7 -1
  21. package/dist/_internal/server/features/lottery/adapters.js +4 -0
  22. package/dist/_internal/server/features/products/data.js +15 -37
  23. package/dist/_internal/server/features/products/index.d.ts +1 -1
  24. package/dist/_internal/server/features/products/index.js +1 -1
  25. package/dist/_internal/server/features/products/list-public.d.ts +46 -20
  26. package/dist/_internal/server/features/products/list-public.js +266 -90
  27. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +44 -0
  28. package/dist/_internal/server/features/products/listing-tab-counts.js +97 -0
  29. package/dist/_internal/server/features/site-settings/adapters.d.ts +51 -0
  30. package/dist/_internal/server/features/site-settings/adapters.js +75 -0
  31. package/dist/_internal/server/features/site-settings/index.d.ts +1 -0
  32. package/dist/_internal/server/features/site-settings/index.js +1 -0
  33. package/dist/_internal/server/features/stores/adapters.d.ts +56 -0
  34. package/dist/_internal/server/features/stores/adapters.js +91 -0
  35. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  36. package/dist/_internal/server/features/stores/index.js +1 -0
  37. package/dist/_internal/server/jobs/core/auctionSettlement.js +56 -2
  38. package/dist/_internal/server/jobs/core/offerExpiry.js +45 -9
  39. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +5 -0
  40. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +33 -1
  41. package/dist/_internal/server/jobs/handlers/messages.d.ts +7 -0
  42. package/dist/_internal/server/jobs/handlers/messages.js +10 -0
  43. package/dist/_internal/shared/actions/action-registry.js +15 -1
  44. package/dist/_internal/shared/checkout/lanes.d.ts +25 -0
  45. package/dist/_internal/shared/checkout/lanes.js +26 -0
  46. package/dist/_internal/shared/features/auctions/config.d.ts +27 -0
  47. package/dist/_internal/shared/features/auctions/config.js +27 -0
  48. package/dist/_internal/shared/features/blog/schema.d.ts +2 -2
  49. package/dist/_internal/shared/features/cart/schema.d.ts +12 -12
  50. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +32 -32
  51. package/dist/_internal/shared/features/emi/schedule.d.ts +24 -3
  52. package/dist/_internal/shared/features/emi/schedule.js +20 -5
  53. package/dist/_internal/shared/features/events/schema.d.ts +2 -2
  54. package/dist/_internal/shared/features/homepage/section-gate.d.ts +14 -0
  55. package/dist/_internal/shared/features/homepage/section-gate.js +51 -0
  56. package/dist/_internal/shared/features/offers/config.d.ts +30 -0
  57. package/dist/_internal/shared/features/offers/config.js +59 -0
  58. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  59. package/dist/_internal/shared/features/products/schema.d.ts +32 -32
  60. package/dist/_internal/shared/features/products/to-product-item.js +6 -0
  61. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  62. package/dist/_internal/shared/features/site-settings/fees.d.ts +60 -0
  63. package/dist/_internal/shared/features/site-settings/fees.js +39 -0
  64. package/dist/_internal/shared/features/site-settings/types.d.ts +40 -0
  65. package/dist/_internal/shared/features/site-settings/types.js +1 -0
  66. package/dist/_internal/shared/history/history.d.ts +66 -0
  67. package/dist/_internal/shared/history/history.js +158 -0
  68. package/dist/_internal/shared/history/index.d.ts +4 -0
  69. package/dist/_internal/shared/history/index.js +2 -0
  70. package/dist/_internal/shared/history/types.d.ts +61 -0
  71. package/dist/_internal/shared/history/types.js +6 -0
  72. package/dist/_internal/shared/listing-types/_registry.d.ts +54 -1
  73. package/dist/_internal/shared/listing-types/_registry.js +67 -0
  74. package/dist/_internal/shared/listing-types/art/config.d.ts +3 -0
  75. package/dist/_internal/shared/listing-types/art/config.js +5 -0
  76. package/dist/_internal/shared/listing-types/auction/config.d.ts +13 -0
  77. package/dist/_internal/shared/listing-types/auction/config.js +21 -0
  78. package/dist/_internal/shared/listing-types/availability.d.ts +79 -0
  79. package/dist/_internal/shared/listing-types/availability.js +104 -0
  80. package/dist/_internal/shared/listing-types/capabilities.d.ts +15 -0
  81. package/dist/_internal/shared/listing-types/capabilities.js +12 -0
  82. package/dist/_internal/shared/listing-types/classified/config.d.ts +3 -0
  83. package/dist/_internal/shared/listing-types/classified/config.js +5 -0
  84. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +11 -0
  85. package/dist/_internal/shared/listing-types/digital-code/config.js +22 -2
  86. package/dist/_internal/shared/listing-types/live/config.d.ts +3 -0
  87. package/dist/_internal/shared/listing-types/live/config.js +5 -0
  88. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +3 -0
  89. package/dist/_internal/shared/listing-types/pre-order/config.js +19 -0
  90. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +11 -0
  91. package/dist/_internal/shared/listing-types/prize-draw/config.js +15 -0
  92. package/dist/_internal/shared/listing-types/standard/config.d.ts +3 -0
  93. package/dist/_internal/shared/listing-types/standard/config.js +5 -0
  94. package/dist/_internal/shared/listing-types/stickers/config.d.ts +3 -0
  95. package/dist/_internal/shared/listing-types/stickers/config.js +5 -0
  96. package/dist/client.d.ts +7 -5
  97. package/dist/client.js +2 -2
  98. package/dist/constants/api-endpoints.d.ts +6 -0
  99. package/dist/constants/api-endpoints.js +2 -0
  100. package/dist/constants/field-names.d.ts +49 -2
  101. package/dist/constants/field-names.js +53 -2
  102. package/dist/constants/table-keys.d.ts +17 -0
  103. package/dist/constants/table-keys.js +17 -0
  104. package/dist/errors/error-codes.d.ts +13 -1
  105. package/dist/errors/error-codes.js +13 -1
  106. package/dist/errors/error-display-map.js +12 -3
  107. package/dist/errors/messages.d.ts +10 -2
  108. package/dist/errors/messages.js +10 -2
  109. package/dist/features/about/components/AboutView.d.ts +3 -0
  110. package/dist/features/about/components/AboutView.js +3 -2
  111. package/dist/features/about/components/PolicyPageView.d.ts +2 -1
  112. package/dist/features/about/components/PolicyPageView.js +61 -23
  113. package/dist/features/about/components/PublicProfileView.js +5 -0
  114. package/dist/features/about/schemas/firestore.d.ts +3 -0
  115. package/dist/features/account/components/UserOrdersView.js +7 -0
  116. package/dist/features/account/components/index.d.ts +0 -2
  117. package/dist/features/account/components/index.js +0 -1
  118. package/dist/features/account/schemas/index.d.ts +2 -2
  119. package/dist/features/account/types/index.d.ts +21 -2
  120. package/dist/features/addresses/schemas/index.d.ts +4 -4
  121. package/dist/features/admin/components/AdminArtView.js +8 -3
  122. package/dist/features/admin/components/AdminClassifiedView.js +8 -3
  123. package/dist/features/admin/components/AdminDigitalCodesView.js +8 -3
  124. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -0
  125. package/dist/features/admin/components/AdminLiveView.js +8 -3
  126. package/dist/features/admin/components/AdminOffersView.d.ts +4 -0
  127. package/dist/features/admin/components/AdminOffersView.js +186 -0
  128. package/dist/features/admin/components/AdminOrdersView.js +10 -1
  129. package/dist/features/admin/components/AdminPrizeDrawsView.js +5 -0
  130. package/dist/features/admin/components/AdminProductsView.js +16 -29
  131. package/dist/features/admin/components/AdminSiteSettingsView.js +31 -13
  132. package/dist/features/admin/components/AdminSiteView.js +6 -2
  133. package/dist/features/admin/components/AdminStickersView.js +8 -3
  134. package/dist/features/admin/components/index.d.ts +2 -0
  135. package/dist/features/admin/components/index.js +1 -0
  136. package/dist/features/admin/constants/filter-tabs.d.ts +86 -0
  137. package/dist/features/admin/constants/filter-tabs.js +55 -0
  138. package/dist/features/admin/schemas/firestore.d.ts +122 -3
  139. package/dist/features/admin/schemas/firestore.js +1 -0
  140. package/dist/features/auctions/actions/bid-actions.d.ts +20 -5
  141. package/dist/features/auctions/actions/bid-actions.js +93 -20
  142. package/dist/features/auctions/components/AuctionDetailPageView.js +11 -6
  143. package/dist/features/auctions/components/AuctionsListView.js +5 -6
  144. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +7 -0
  145. package/dist/features/auctions/components/MarketplaceAuctionCard.js +19 -2
  146. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -2
  147. package/dist/features/auctions/components/PlaceBidFormClient.js +8 -4
  148. package/dist/features/auctions/repository/bid.repository.d.ts +13 -0
  149. package/dist/features/auctions/repository/bid.repository.js +23 -0
  150. package/dist/features/auctions/schemas/firestore.d.ts +17 -0
  151. package/dist/features/auctions/schemas/index.d.ts +12 -12
  152. package/dist/features/auth/permissions/constants.d.ts +1 -1
  153. package/dist/features/auth/permissions/constants.js +10 -1
  154. package/dist/features/blog/actions/blog-actions.d.ts +7 -7
  155. package/dist/features/blog/schemas/index.d.ts +6 -6
  156. package/dist/features/cart/repository/cart.repository.js +1 -0
  157. package/dist/features/cart/schemas/firestore.d.ts +15 -0
  158. package/dist/features/catalogue/schemas/validation.d.ts +4 -4
  159. package/dist/features/categories/components/BrandDetailPageView.js +23 -40
  160. package/dist/features/categories/components/BrandDetailTabs.d.ts +7 -7
  161. package/dist/features/categories/components/BrandDetailTabs.js +8 -12
  162. package/dist/features/categories/components/BundleCollage.js +1 -1
  163. package/dist/features/categories/components/CategoryDetailPageView.js +53 -57
  164. package/dist/features/categories/components/CategoryDetailTabs.d.ts +10 -8
  165. package/dist/features/categories/components/CategoryDetailTabs.js +11 -16
  166. package/dist/features/categories/components/CategoryProductsListing.js +11 -1
  167. package/dist/features/categories/components/ConcernCard.js +7 -1
  168. package/dist/features/categories/schemas/firestore.d.ts +13 -0
  169. package/dist/features/categories/schemas/index.d.ts +26 -26
  170. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +16 -1
  171. package/dist/features/classified/components/ClassifiedDetailPageView.js +23 -3
  172. package/dist/features/events/components/AdminEventsView.js +15 -11
  173. package/dist/features/events/components/EventFilters.d.ts +9 -1
  174. package/dist/features/events/components/EventFilters.js +45 -21
  175. package/dist/features/events/components/EventsIndexListing.d.ts +6 -1
  176. package/dist/features/events/components/EventsIndexListing.js +2 -2
  177. package/dist/features/events/components/EventsListPageView.js +13 -4
  178. package/dist/features/events/repository/events.repository.d.ts +17 -0
  179. package/dist/features/events/repository/events.repository.js +27 -0
  180. package/dist/features/events/schemas/firestore.d.ts +12 -0
  181. package/dist/features/events/schemas/firestore.js +12 -0
  182. package/dist/features/events/schemas/index.d.ts +50 -50
  183. package/dist/features/events/types/index.d.ts +11 -0
  184. package/dist/features/events/types/index.js +57 -1
  185. package/dist/features/faq/actions/faq-actions.d.ts +12 -12
  186. package/dist/features/faq/schemas/index.d.ts +8 -8
  187. package/dist/features/filters/FilterFacetSection.d.ts +7 -1
  188. package/dist/features/filters/FilterFacetSection.js +11 -3
  189. package/dist/features/grouped/schemas/index.d.ts +4 -4
  190. package/dist/features/homepage/components/AnnouncementBar.d.ts +7 -1
  191. package/dist/features/homepage/components/AnnouncementBar.js +3 -3
  192. package/dist/features/homepage/components/MarketplaceHomepageView.js +20 -6
  193. package/dist/features/homepage/hooks/homepage-query.d.ts +16 -0
  194. package/dist/features/homepage/hooks/homepage-query.js +45 -0
  195. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +10 -0
  196. package/dist/features/homepage/hooks/useFeaturedAuctions.js +28 -8
  197. package/dist/features/homepage/hooks/useFeaturedPreOrders.js +17 -8
  198. package/dist/features/homepage/hooks/useFeaturedProducts.js +15 -8
  199. package/dist/features/homepage/schemas/index.d.ts +2 -2
  200. package/dist/features/layout/AppLayoutShell.d.ts +11 -1
  201. package/dist/features/layout/AppLayoutShell.js +15 -14
  202. package/dist/features/layout/BackToTop.d.ts +9 -0
  203. package/dist/features/layout/BackToTop.js +10 -1
  204. package/dist/features/layout/BottomActions.js +28 -25
  205. package/dist/features/layout/BottomChrome.d.ts +34 -0
  206. package/dist/features/layout/BottomChrome.js +55 -0
  207. package/dist/features/layout/BottomNavLayout.d.ts +6 -0
  208. package/dist/features/layout/BottomNavLayout.js +7 -1
  209. package/dist/features/layout/BottomNavbar.js +15 -2
  210. package/dist/features/layout/FooterLayout.js +11 -1
  211. package/dist/features/layout/NavbarLayout.js +1 -1
  212. package/dist/features/layout/TitleBarLayout.d.ts +7 -0
  213. package/dist/features/layout/TitleBarLayout.js +28 -5
  214. package/dist/features/layout/index.d.ts +2 -0
  215. package/dist/features/layout/index.js +1 -0
  216. package/dist/features/lottery/types/index.d.ts +3 -0
  217. package/dist/features/media/MediaPickerModal.js +5 -1
  218. package/dist/features/messages/schemas/index.d.ts +2 -2
  219. package/dist/features/orders/components/OrderScopeTabs.d.ts +20 -0
  220. package/dist/features/orders/components/OrderScopeTabs.js +31 -0
  221. package/dist/features/orders/constants/order-scope.d.ts +48 -0
  222. package/dist/features/orders/constants/order-scope.js +111 -0
  223. package/dist/features/orders/repository/orders.repository.d.ts +54 -7
  224. package/dist/features/orders/repository/orders.repository.js +116 -22
  225. package/dist/features/orders/schemas/firestore.d.ts +117 -0
  226. package/dist/features/orders/schemas/firestore.js +30 -0
  227. package/dist/features/orders/schemas/index.d.ts +18 -18
  228. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +14 -9
  229. package/dist/features/pre-orders/components/PreOrdersListView.js +6 -5
  230. package/dist/features/pre-orders/schemas/index.d.ts +1 -1
  231. package/dist/features/products/actions/product-actions.d.ts +14 -0
  232. package/dist/features/products/actions/product-actions.js +49 -11
  233. package/dist/features/products/api/route.d.ts +12 -0
  234. package/dist/features/products/api/route.js +42 -100
  235. package/dist/features/products/components/ArtStickersListView.js +2 -2
  236. package/dist/features/products/components/AuctionsIndexListing.js +13 -11
  237. package/dist/features/products/components/AvailabilityTabs.d.ts +11 -0
  238. package/dist/features/products/components/AvailabilityTabs.js +47 -0
  239. package/dist/features/products/components/MakeOfferButton.js +48 -49
  240. package/dist/features/products/components/PrizeDrawCollage.d.ts +20 -4
  241. package/dist/features/products/components/PrizeDrawCollage.js +9 -1
  242. package/dist/features/products/components/PrizeDrawsIndexListing.js +14 -12
  243. package/dist/features/products/components/PrizeDrawsListingView.js +2 -2
  244. package/dist/features/products/components/PrizeDrawsSection.d.ts +7 -1
  245. package/dist/features/products/components/PrizeDrawsSection.js +23 -18
  246. package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
  247. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  248. package/dist/features/products/components/ProductForm.js +5 -2
  249. package/dist/features/products/components/ProductGrid.js +6 -1
  250. package/dist/features/products/components/ProductsIndexListing.js +22 -32
  251. package/dist/features/products/components/ProductsIndexPageView.js +6 -9
  252. package/dist/features/products/components/index.d.ts +2 -2
  253. package/dist/features/products/components/index.js +1 -1
  254. package/dist/features/products/config/listing-type-listing-config.d.ts +20 -0
  255. package/dist/features/products/config/listing-type-listing-config.js +22 -10
  256. package/dist/features/products/constants/action-defs.d.ts +2 -0
  257. package/dist/features/products/constants/action-defs.js +6 -0
  258. package/dist/features/products/hooks/useAvailabilityScope.d.ts +13 -0
  259. package/dist/features/products/hooks/useAvailabilityScope.js +19 -0
  260. package/dist/features/products/hooks/useProducts.d.ts +5 -0
  261. package/dist/features/products/hooks/useProducts.js +13 -2
  262. package/dist/features/products/repository/products.repository.d.ts +31 -2
  263. package/dist/features/products/repository/products.repository.js +53 -21
  264. package/dist/features/products/schemas/firestore.d.ts +17 -3
  265. package/dist/features/products/schemas/firestore.js +7 -2
  266. package/dist/features/products/schemas/index.d.ts +66 -66
  267. package/dist/features/products/schemas/product-features.validators.d.ts +6 -6
  268. package/dist/features/products/types/index.d.ts +16 -1
  269. package/dist/features/promotions/schemas/index.d.ts +2 -2
  270. package/dist/features/reviews/schemas/index.d.ts +16 -16
  271. package/dist/features/search/schemas/index.d.ts +4 -4
  272. package/dist/features/seller/actions/offer-actions.js +25 -2
  273. package/dist/features/seller/components/SellerArtView.js +5 -0
  274. package/dist/features/seller/components/SellerAuctionsView.js +13 -15
  275. package/dist/features/seller/components/SellerClassifiedView.js +5 -0
  276. package/dist/features/seller/components/SellerDigitalCodesView.js +5 -0
  277. package/dist/features/seller/components/SellerLiveView.js +5 -0
  278. package/dist/features/seller/components/SellerOrdersView.js +31 -9
  279. package/dist/features/seller/components/SellerPayoutSettingsView.js +19 -18
  280. package/dist/features/seller/components/SellerPreOrdersView.js +5 -0
  281. package/dist/features/seller/components/SellerPrizeDrawsView.js +14 -16
  282. package/dist/features/seller/components/SellerProductShell.js +7 -1
  283. package/dist/features/seller/components/SellerProductsView.js +11 -8
  284. package/dist/features/seller/components/SellerStickersView.js +5 -0
  285. package/dist/features/seller/components/index.d.ts +0 -2
  286. package/dist/features/seller/components/index.js +0 -1
  287. package/dist/features/seller/repository/offer.repository.d.ts +73 -16
  288. package/dist/features/seller/repository/offer.repository.js +38 -3
  289. package/dist/features/seller/schemas/index.d.ts +2 -2
  290. package/dist/features/seller/schemas/offer-forms.d.ts +25 -0
  291. package/dist/features/seller/schemas/offer-forms.js +21 -0
  292. package/dist/features/seller/server.d.ts +0 -1
  293. package/dist/features/seller/server.js +0 -1
  294. package/dist/features/shell/SectionForm.d.ts +99 -0
  295. package/dist/features/shell/SectionForm.js +128 -0
  296. package/dist/features/shell/entity-form.d.ts +109 -0
  297. package/dist/features/shell/entity-form.js +96 -0
  298. package/dist/features/shell/index.d.ts +4 -0
  299. package/dist/features/shell/index.js +2 -0
  300. package/dist/features/stores/api/[storeSlug]/route.js +2 -25
  301. package/dist/features/stores/components/StoreAuctionsListing.js +15 -1
  302. package/dist/features/stores/components/StoreClassifiedsListing.js +12 -2
  303. package/dist/features/stores/components/StoreDetailLayoutView.js +24 -71
  304. package/dist/features/stores/components/StoreDigitalCodesListing.js +12 -2
  305. package/dist/features/stores/components/StoreLiveItemsListing.js +12 -2
  306. package/dist/features/stores/components/StorePreOrdersListing.js +12 -1
  307. package/dist/features/stores/components/StoreProductsListing.js +11 -1
  308. package/dist/features/stores/repository/store.repository.js +6 -0
  309. package/dist/features/stores/schemas/index.d.ts +6 -6
  310. package/dist/features/support/schemas/index.d.ts +4 -4
  311. package/dist/features/tester/actions/checklist-item-actions.d.ts +4 -4
  312. package/dist/features/tester/seed-data/offers-tester-seed-data.js +119 -3
  313. package/dist/features/tester/seed-data/products-tester-seed-data.js +131 -1
  314. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +105 -1
  315. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  316. package/dist/index.d.ts +13 -10
  317. package/dist/index.js +14 -9
  318. package/dist/next/routing/route-map.d.ts +7 -1
  319. package/dist/next/routing/route-map.js +5 -0
  320. package/dist/providers/db-firebase/base.repository.d.ts +30 -0
  321. package/dist/providers/db-firebase/base.repository.js +50 -1
  322. package/dist/providers/db-firebase/index.d.ts +1 -1
  323. package/dist/providers/db-firebase/index.js +1 -1
  324. package/dist/providers/db-firebase/sieve.d.ts +25 -0
  325. package/dist/providers/db-firebase/sieve.js +52 -18
  326. package/dist/react/hooks/useUrlTable.js +10 -1
  327. package/dist/schemas/registry.d.ts +68 -68
  328. package/dist/seed/_helpers/category-forest.d.ts +2 -0
  329. package/dist/seed/_helpers/category-forest.js +309 -0
  330. package/dist/seed/_helpers/category-tree.d.ts +27 -0
  331. package/dist/seed/_helpers/category-tree.js +103 -0
  332. package/dist/seed/catalogue-seed-data.js +12 -12
  333. package/dist/seed/categories-seed-data.js +177 -162
  334. package/dist/seed/events-seed-data.js +61 -10
  335. package/dist/seed/homepage-sections-seed-data.js +5 -1
  336. package/dist/seed/offers-seed-data.js +32 -27
  337. package/dist/seed/products-art-seed-data.js +50 -12
  338. package/dist/seed/products-auctions-seed-data.js +97 -18
  339. package/dist/seed/products-classifieds-seed-data.js +80 -16
  340. package/dist/seed/products-digital-codes-seed-data.js +66 -18
  341. package/dist/seed/products-live-items-seed-data.js +64 -13
  342. package/dist/seed/products-preorders-seed-data.d.ts +0 -1
  343. package/dist/seed/products-preorders-seed-data.js +52 -13
  344. package/dist/seed/products-prize-draws-seed-data.js +63 -14
  345. package/dist/seed/products-standard-seed-data.js +99 -26
  346. package/dist/seed/products-stickers-seed-data.js +47 -12
  347. package/dist/seed/reviews-seed-data.js +6 -1
  348. package/dist/seed/site-settings-seed-data.d.ts +1 -38
  349. package/dist/seed/site-settings-seed-data.js +38 -76
  350. package/dist/seed/stores-seed-data.js +71 -1
  351. package/dist/seed/users-seed-data.js +15 -5
  352. package/dist/server-entry.d.ts +1 -2
  353. package/dist/server-entry.js +4 -3
  354. package/dist/server.d.ts +4 -3
  355. package/dist/server.js +8 -4
  356. package/dist/styles.css +78 -12
  357. package/dist/tailwind-utilities.css +1 -1
  358. package/dist/ui/components/Button.style.css +19 -4
  359. package/dist/ui/components/CollapsibleSection.d.ts +17 -1
  360. package/dist/ui/components/CollapsibleSection.js +6 -2
  361. package/dist/ui/components/FilterChipGroup.d.ts +25 -1
  362. package/dist/ui/components/FilterChipGroup.js +21 -4
  363. package/dist/ui/components/HandMode.style.css +47 -0
  364. package/dist/ui/components/Layout.d.ts +9 -2
  365. package/dist/ui/components/Layout.js +1 -1
  366. package/dist/ui/components/ListingLayout.js +8 -8
  367. package/dist/ui/components/ListingLayout.style.css +8 -7
  368. package/dist/ui/components/StickyToolbar.d.ts +3 -1
  369. package/dist/ui/components/StickyToolbar.js +62 -20
  370. package/dist/ui/components/bottom-chrome-slot.d.ts +21 -0
  371. package/dist/ui/components/bottom-chrome-slot.js +29 -0
  372. package/dist/ui/components/index.style.css +3 -0
  373. package/dist/ui/forms/FormShell.d.ts +43 -13
  374. package/dist/ui/forms/FormShell.js +22 -11
  375. package/dist/ui/forms/index.d.ts +1 -1
  376. package/dist/ui/index.d.ts +1 -1
  377. package/package.json +2 -2
@@ -410,13 +410,12 @@ export declare const storeFirestoreSchema: z.ZodObject<{
410
410
  updatedAt: string | Date | z.objectOutputType<{
411
411
  toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
412
412
  }, z.ZodTypeAny, "passthrough">;
413
- storeName: string;
414
413
  ownerId: string;
414
+ storeName: string;
415
415
  storeSlug: string;
416
416
  isPublic: boolean;
417
417
  location?: string | undefined;
418
418
  returnPolicy?: string | undefined;
419
- isFeatured?: boolean | undefined;
420
419
  stats?: {
421
420
  itemsSold: number;
422
421
  totalProducts: number;
@@ -427,6 +426,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
427
426
  storeDescription?: string | undefined;
428
427
  storeLogoURL?: string | undefined;
429
428
  storeBannerURL?: string | undefined;
429
+ isFeatured?: boolean | undefined;
430
430
  capabilities?: string[] | undefined;
431
431
  shippingConfig?: {
432
432
  providers: {
@@ -495,13 +495,12 @@ export declare const storeFirestoreSchema: z.ZodObject<{
495
495
  updatedAt: string | Date | z.objectInputType<{
496
496
  toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
497
497
  }, z.ZodTypeAny, "passthrough">;
498
- storeName: string;
499
498
  ownerId: string;
499
+ storeName: string;
500
500
  storeSlug: string;
501
501
  isPublic: boolean;
502
502
  location?: string | undefined;
503
503
  returnPolicy?: string | undefined;
504
- isFeatured?: boolean | undefined;
505
504
  stats?: {
506
505
  itemsSold: number;
507
506
  totalProducts: number;
@@ -512,6 +511,7 @@ export declare const storeFirestoreSchema: z.ZodObject<{
512
511
  storeDescription?: string | undefined;
513
512
  storeLogoURL?: string | undefined;
514
513
  storeBannerURL?: string | undefined;
514
+ isFeatured?: boolean | undefined;
515
515
  capabilities?: string[] | undefined;
516
516
  shippingConfig?: {
517
517
  providers: {
@@ -607,8 +607,8 @@ export declare const storeListItemSchema: z.ZodObject<{
607
607
  }, "strip", z.ZodTypeAny, {
608
608
  status: string;
609
609
  id: string;
610
- storeName: string;
611
610
  ownerId: string;
611
+ storeName: string;
612
612
  storeSlug: string;
613
613
  isPublic: boolean;
614
614
  createdAt?: string | undefined;
@@ -623,8 +623,8 @@ export declare const storeListItemSchema: z.ZodObject<{
623
623
  }, {
624
624
  status: string;
625
625
  id: string;
626
- storeName: string;
627
626
  ownerId: string;
627
+ storeName: string;
628
628
  storeSlug: string;
629
629
  isPublic: boolean;
630
630
  createdAt?: string | undefined;
@@ -158,12 +158,12 @@ export declare const supportTicketFirestoreSchema: z.ZodObject<{
158
158
  toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
159
159
  }, z.ZodTypeAny, "passthrough">;
160
160
  userId: string;
161
- category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
162
161
  description: string;
163
- priority: "normal" | "high" | "low" | "urgent";
162
+ category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
164
163
  userEmail: string;
165
164
  userDisplayName: string;
166
165
  subject: string;
166
+ priority: "normal" | "high" | "low" | "urgent";
167
167
  messages: {
168
168
  id: string;
169
169
  body: string;
@@ -201,12 +201,12 @@ export declare const supportTicketFirestoreSchema: z.ZodObject<{
201
201
  toDate: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodDate>;
202
202
  }, z.ZodTypeAny, "passthrough">;
203
203
  userId: string;
204
- category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
205
204
  description: string;
206
- priority: "normal" | "high" | "low" | "urgent";
205
+ category: "general" | "account" | "order_issue" | "billing_payment" | "listing_dispute" | "scam_report" | "refund_request" | "auction_dispute" | "store_change_request" | "order_modification_request" | "unban_request";
207
206
  userEmail: string;
208
207
  userDisplayName: string;
209
208
  subject: string;
209
+ priority: "normal" | "high" | "low" | "urgent";
210
210
  messages: {
211
211
  id: string;
212
212
  body: string;
@@ -14,8 +14,8 @@ export declare const checklistItemCreateSchema: z.ZodObject<{
14
14
  adminOnly: z.ZodDefault<z.ZodBoolean>;
15
15
  }, "strip", z.ZodTypeAny, {
16
16
  label: string;
17
- order: number;
18
17
  isActive: boolean;
18
+ order: number;
19
19
  groupKey: string;
20
20
  pageKey: string;
21
21
  phase: number;
@@ -32,8 +32,8 @@ export declare const checklistItemCreateSchema: z.ZodObject<{
32
32
  pageLabel: string;
33
33
  href?: string | undefined;
34
34
  description?: string | undefined;
35
- order?: number | undefined;
36
35
  isActive?: boolean | undefined;
36
+ order?: number | undefined;
37
37
  phase?: number | undefined;
38
38
  adminOnly?: boolean | undefined;
39
39
  }>;
@@ -53,8 +53,8 @@ export declare const checklistItemUpdateSchema: z.ZodObject<{
53
53
  label?: string | undefined;
54
54
  href?: string | undefined;
55
55
  description?: string | undefined;
56
- order?: number | undefined;
57
56
  isActive?: boolean | undefined;
57
+ order?: number | undefined;
58
58
  groupKey?: string | undefined;
59
59
  pageKey?: string | undefined;
60
60
  phase?: number | undefined;
@@ -65,8 +65,8 @@ export declare const checklistItemUpdateSchema: z.ZodObject<{
65
65
  label?: string | undefined;
66
66
  href?: string | undefined;
67
67
  description?: string | undefined;
68
- order?: number | undefined;
69
68
  isActive?: boolean | undefined;
69
+ order?: number | undefined;
70
70
  groupKey?: string | undefined;
71
71
  pageKey?: string | undefined;
72
72
  phase?: number | undefined;
@@ -39,11 +39,15 @@ export const offersTesterSeedData = [
39
39
  buyerUid: "user-tester-qa",
40
40
  buyerName: "QA Tester",
41
41
  buyerEmail: "tester@letitrip.in",
42
- listedPrice: 1899,
43
- offerAmount: 1450,
42
+ // Realigned 2026-08-24: this carried listedPrice 1899 / offer 1450 against
43
+ // a product that costs ₹999 — an offer ABOVE the listing price, which
44
+ // `makeOffer` would reject outright. Same stale-snapshot drift the main
45
+ // offers seed had.
46
+ listedPrice: 999,
47
+ offerAmount: 780,
44
48
  // The agreed price. Checkout MUST bill this, not `listedPrice` — that
45
49
  // divergence is exactly what the paired checklist case checks.
46
- lockedPrice: 1450,
50
+ lockedPrice: 780,
47
51
  currency: "INR",
48
52
  status: OfferStatusValues.ACCEPTED,
49
53
  buyerNote: "Sandbox offer — already accepted so testers can drive checkout.",
@@ -58,4 +62,116 @@ export const offersTesterSeedData = [
58
62
  isTestData: true,
59
63
  testDataExpiresAt: testDataExpiresAt(),
60
64
  },
65
+ /**
66
+ * COUNTERED. The buyer-accepts-a-counter path had no fixture at all, so
67
+ * `acceptCounterOffer` was unreachable for a tester working solo.
68
+ */
69
+ {
70
+ id: "offer-tester-sandbox-countered",
71
+ productId: "product-beyblade-metal-storm-pegasus",
72
+ productTitle: "Beyblade Metal Storm Pegasus",
73
+ productSlug: "product-beyblade-metal-storm-pegasus",
74
+ storeId: "store-beyblade-arena",
75
+ storeName: "Beyblade Arena",
76
+ buyerUid: "user-tester-qa",
77
+ buyerName: "QA Tester",
78
+ buyerEmail: "tester@letitrip.in",
79
+ listedPrice: 1299,
80
+ offerAmount: 1000,
81
+ counterAmount: 1150,
82
+ currency: "INR",
83
+ status: OfferStatusValues.COUNTERED,
84
+ buyerNote: "Sandbox offer — seller has countered, accept it to test the counter path.",
85
+ sellerNote: "Counter: ₹1,150.",
86
+ expiresAt: hoursFromNow(24),
87
+ respondedAt: hoursAgo(1),
88
+ createdAt: hoursAgo(2),
89
+ updatedAt: hoursAgo(1),
90
+ isTestData: true,
91
+ testDataExpiresAt: testDataExpiresAt(),
92
+ },
93
+ /**
94
+ * ACCEPTED with a deliberately SHORT window, so the live countdown and the
95
+ * "pay before it closes" case are observable inside one test session rather
96
+ * than needing a 36-hour wait.
97
+ */
98
+ {
99
+ id: "offer-tester-sandbox-expiring",
100
+ productId: "product-beyblade-x-wizard-arrow",
101
+ productTitle: "Beyblade X Wizard Arrow",
102
+ productSlug: "product-beyblade-x-wizard-arrow",
103
+ storeId: "store-beyblade-arena",
104
+ storeName: "Beyblade Arena",
105
+ buyerUid: "user-tester-qa",
106
+ buyerName: "QA Tester",
107
+ buyerEmail: "tester@letitrip.in",
108
+ listedPrice: 899,
109
+ offerAmount: 700,
110
+ lockedPrice: 700,
111
+ currency: "INR",
112
+ status: OfferStatusValues.ACCEPTED,
113
+ buyerNote: "Sandbox offer — accepted with a short checkout window.",
114
+ sellerNote: "Accepted. Pay soon!",
115
+ expiresAt: hoursFromNow(1),
116
+ acceptedAt: hoursAgo(0),
117
+ respondedAt: hoursAgo(0),
118
+ checkoutDeadline: new Date(NOW.getTime() + 30 * 60000),
119
+ createdAt: hoursAgo(1),
120
+ updatedAt: hoursAgo(0),
121
+ isTestData: true,
122
+ testDataExpiresAt: testDataExpiresAt(),
123
+ },
124
+ /**
125
+ * PENDING. Two cases need this: withdrawing an offer, and the
126
+ * "you already have an active offer on this item" rejection when the tester
127
+ * tries to offer on the same listing again.
128
+ */
129
+ {
130
+ id: "offer-tester-sandbox-pending",
131
+ productId: "product-beyblade-original-driger-v",
132
+ productTitle: "Beyblade Original Driger V",
133
+ productSlug: "product-beyblade-original-driger-v",
134
+ storeId: "store-beyblade-arena",
135
+ storeName: "Beyblade Arena",
136
+ buyerUid: "user-tester-qa",
137
+ buyerName: "QA Tester",
138
+ buyerEmail: "tester@letitrip.in",
139
+ listedPrice: 1799,
140
+ offerAmount: 1450,
141
+ currency: "INR",
142
+ status: OfferStatusValues.PENDING,
143
+ buyerNote: "Sandbox offer — still pending, withdraw it to test that path.",
144
+ expiresAt: hoursFromNow(24),
145
+ createdAt: hoursAgo(1),
146
+ updatedAt: hoursAgo(1),
147
+ isTestData: true,
148
+ testDataExpiresAt: testDataExpiresAt(),
149
+ },
150
+ /**
151
+ * The SELLER side. Every fixture above has the tester as the buyer, so
152
+ * accept / decline / counter at /store/offers were unreachable for them —
153
+ * you cannot respond to your own offer. This one is addressed TO the
154
+ * tester's own sandbox store from a different persona.
155
+ */
156
+ {
157
+ id: "offer-tester-sandbox-inbound",
158
+ productId: "product-tester-standard-1",
159
+ productTitle: "Test Gadget — Standard Listing #1",
160
+ productSlug: "product-tester-standard-1",
161
+ storeId: "store-tester-qa-seller",
162
+ storeName: "Tester QA Seller",
163
+ buyerUid: "user-yugi-muto",
164
+ buyerName: "Mock User 3",
165
+ buyerEmail: "rehan.sheikh@gmail.com",
166
+ listedPrice: 150,
167
+ offerAmount: 120,
168
+ currency: "INR",
169
+ status: OfferStatusValues.PENDING,
170
+ buyerNote: "Sandbox inbound offer — accept, counter, or decline it from your store dashboard.",
171
+ expiresAt: hoursFromNow(24),
172
+ createdAt: hoursAgo(2),
173
+ updatedAt: hoursAgo(2),
174
+ isTestData: true,
175
+ testDataExpiresAt: testDataExpiresAt(),
176
+ },
61
177
  ];
@@ -83,8 +83,132 @@ const stagedAuctions = AUCTION_CYCLE_STAGGER_HOURS.map((hours, i) => withTokens(
83
83
  createdAt: new Date(),
84
84
  updatedAt: new Date(),
85
85
  }));
86
+ /**
87
+ * Buy-Now (buyout) fixtures. Four states, because the 2026-08-24 rework made
88
+ * buyout availability depend on `buyNowPrice > currentBid` rather than on
89
+ * "nobody has bid yet" — so the interesting cases are now about PRICE, and
90
+ * three of them were previously unreachable as test data.
91
+ *
92
+ * Every date is Date.now()-relative at module import, per CLAUDE.md's tester
93
+ * fixture standard, so the 4-hour testerSandboxRefresh re-arms them.
94
+ */
95
+ const buyoutAuctions = [
96
+ {
97
+ key: "buyout",
98
+ title: "Test Auction — Buy It Now available",
99
+ desc: "The clean buyout case. Buy Now is offered, there is plenty of clock, and completing checkout within the hour should close the auction as sold with your bid recorded at the buyout price.",
100
+ currentBid: 8000,
101
+ buyNowPrice: 12000,
102
+ bidCount: 0,
103
+ bidsHaveStarted: false,
104
+ endsInHours: 6,
105
+ },
106
+ {
107
+ key: "buyout-contested",
108
+ title: "Test Auction — Buy It Now with live bidding",
109
+ desc: "Buy Now is STILL offered even though bidding has started, because the buyout price is above the current bid. Buying it out should mark the other bidders lost. This case did not exist before the bidsHaveStarted gate was dropped.",
110
+ currentBid: 9500,
111
+ buyNowPrice: 12000,
112
+ bidCount: 2,
113
+ bidsHaveStarted: true,
114
+ endsInHours: 6,
115
+ },
116
+ {
117
+ key: "buyout-passed",
118
+ title: "Test Auction — bidding passed Buy It Now",
119
+ desc: "Negative control. Bidding has overtaken the buyout price, so Buy Now must appear NOWHERE — no button, no advertised price on the detail page, no Buyout chip on the card.",
120
+ currentBid: 9500,
121
+ buyNowPrice: 9000,
122
+ bidCount: 5,
123
+ bidsHaveStarted: true,
124
+ endsInHours: 6,
125
+ },
126
+ {
127
+ key: "buyout-expiring",
128
+ title: "Test Auction — Buy It Now, ends in ~20 minutes",
129
+ desc: "The buyout hold is clamped to the auction's own end time rather than the full hour. Start a buyout here and DON'T finish checkout: when the clock runs out the buyout must fail and the item must go to the bidding, not to you.",
130
+ currentBid: 3000,
131
+ buyNowPrice: 5000,
132
+ bidCount: 1,
133
+ bidsHaveStarted: true,
134
+ endsInMinutes: 20,
135
+ },
136
+ ].map((f) => withTokens({
137
+ id: `auction-tester-sandbox-${f.key}`,
138
+ slug: `auction-tester-sandbox-${f.key}`,
139
+ title: f.title,
140
+ description: f.desc,
141
+ categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
142
+ categoryNames: COLLECTIBLES_CATEGORY_NAMES,
143
+ brandSlug: "brand-tester-sandbox",
144
+ brand: "TestBrand",
145
+ startingBid: 8000,
146
+ currentBid: f.currentBid,
147
+ buyNowPrice: f.buyNowPrice,
148
+ currency: "INR",
149
+ price: f.currentBid,
150
+ stockQuantity: 1,
151
+ availableQuantity: 1,
152
+ auctionEndDate: new Date(Date.now() +
153
+ (f.endsInMinutes ? f.endsInMinutes * 60 * 1000 : (f.endsInHours ?? 6) * 60 * 60 * 1000)),
154
+ bidCount: f.bidCount,
155
+ bidsHaveStarted: f.bidsHaveStarted,
156
+ isSold: false,
157
+ mainImage: seedExtMedia(`https://picsum.photos/seed/auction-image-tester-sandbox-${f.key}-20260101/900/900`),
158
+ images: [seedExtMedia(`https://picsum.photos/seed/auction-image-tester-sandbox-${f.key}-20260101/900/900`)],
159
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
160
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
161
+ listingType: "auction",
162
+ customFields: [],
163
+ customSections: [],
164
+ isPromoted: false,
165
+ isOnSale: false,
166
+ createdAt: new Date(),
167
+ updatedAt: new Date(),
168
+ }));
169
+ /**
170
+ * An offerable standard listing, owned by the tester's OWN sandbox store
171
+ * (`withTokens` supplies `storeId: TESTER_STORE_ID`).
172
+ *
173
+ * That ownership is the point: one tester can drive the whole negotiation
174
+ * solo — make the offer at /products/product-tester-offerable as the buyer,
175
+ * then accept/counter/decline it at /store/offers as the seller. The
176
+ * complementary fixture `offer-tester-sandbox-accepted` covers the other half
177
+ * (an already-accepted offer on somebody ELSE's store, so the checkout lane can
178
+ * be exercised without the tester having accepted it themselves).
179
+ */
180
+ const offerableProduct = withTokens({
181
+ id: "product-tester-offerable",
182
+ slug: "product-tester-offerable",
183
+ title: "Test Gadget — Accepts Offers",
184
+ description: "Disposable test product with buyer offers enabled. Make an offer below the listed price and watch it appear under My Offers. Minimum accepted offer is 70% of the listed price.",
185
+ categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
186
+ categoryNames: COLLECTIBLES_CATEGORY_NAMES,
187
+ brandSlug: "brand-tester-sandbox",
188
+ brand: "TestBrand",
189
+ price: 2000,
190
+ currency: "INR",
191
+ allowOffers: true,
192
+ minOfferPercent: 70,
193
+ stockQuantity: 5,
194
+ availableQuantity: 5,
195
+ isSold: false,
196
+ mainImage: seedExtMedia("https://picsum.photos/seed/product-image-tester-offerable-20260101/900/900"),
197
+ images: [seedExtMedia("https://picsum.photos/seed/product-image-tester-offerable-20260101/900/900")],
198
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
199
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
200
+ listingType: "standard",
201
+ customFields: [],
202
+ customSections: [],
203
+ isPromoted: false,
204
+ isOnSale: false,
205
+ createdAt: new Date(),
206
+ updatedAt: new Date(),
207
+ });
86
208
  export const productsTesterSeedData = [
87
209
  ...stagedAuctions,
210
+ ...buyoutAuctions,
211
+ offerableProduct,
88
212
  withTokens({
89
213
  id: "product-tester-standard-1",
90
214
  slug: "product-tester-standard-1",
@@ -327,13 +451,19 @@ export const productsTesterSeedData = [
327
451
  id: "classified-tester-sandbox-1",
328
452
  slug: "classified-tester-sandbox-1",
329
453
  title: "Test Classified — Contact Me!",
330
- description: "Disposable test classified listing for the tester QA program. No checkout — contact the seller. Auto-expires in 7 days.",
454
+ description: "Disposable test classified listing for the tester QA program. No checkout — make an offer or contact the seller. Auto-expires in 7 days.",
331
455
  categorySlugs: COLLECTIBLES_CATEGORY_SLUGS,
332
456
  categoryNames: COLLECTIBLES_CATEGORY_NAMES,
333
457
  brandSlug: "brand-tester-sandbox",
334
458
  brand: "TestBrand",
335
459
  price: 250,
336
460
  currency: "INR",
461
+ // Classifieds are the one non-standard type with `canMakeOffer: true`.
462
+ // Until 2026-08-24 the sticky "Make an Offer" CTA on this page only
463
+ // scrolled to the chat box and created no offer at all — this flag is what
464
+ // makes the real form render there.
465
+ allowOffers: true,
466
+ minOfferPercent: 70,
337
467
  condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
338
468
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
339
469
  listingType: "classified",
@@ -400,6 +400,53 @@ const rawTesterChecklistItems = [
400
400
  },
401
401
  ],
402
402
  },
403
+ {
404
+ // Root Cause #68, part 2. Every case here is a LAYOUT assertion — an image
405
+ // that renders at 0x0, or a tile that lays out sideways, is invisible to
406
+ // tsc, to lint and to jsdom, so a human eye is the only gate that catches
407
+ // a regression. Bundle tiles rendered blank for weeks before this.
408
+ pageKey: "image-tile-layout",
409
+ pageLabel: "Image Tiles & Collages",
410
+ href: "/bundles/bundle-burst-battlers-pack",
411
+ cases: [
412
+ {
413
+ key: "bundle-member-thumbnails",
414
+ label: "A bundle's member tiles show the real product photo, filling the whole square tile — not a blank/grey box",
415
+ description: "The three members of \"Burst Battlers Pack\" each have a mainImage. If you see grey boxes, the image collapsed to 0x0 — check whether a `block`/`flex`/`hidden` Tailwind class has been added back onto the tile's <Button>, which silently overrides appkit's own display and voids the fix.",
416
+ },
417
+ {
418
+ key: "bundle-badge-position",
419
+ label: "The #1 / #2 / #3 badge sits at the TOP-LEFT corner of each bundle tile, not floating in the middle of it",
420
+ description: "The badge is absolutely positioned. If it drifts toward the centre, it is anchoring to the button's collapsed inner span instead of the tile box — the same root cause as a blank thumbnail, and often the first visible symptom.",
421
+ },
422
+ {
423
+ key: "bundle-tile-opens-lightbox",
424
+ label: "Clicking a bundle tile opens the lightbox at that item and cycles through the others; the product title below the tile still links to the product page",
425
+ },
426
+ {
427
+ key: "prizedraw-collage-stacked",
428
+ label: "Prize-draw collage tiles stack the image ABOVE the title/value caption at full card width — the image is never squashed beside the text at half width",
429
+ href: "/prize-draws/prizedraw-tester-sandbox-1",
430
+ },
431
+ {
432
+ key: "concern-card-icon-above-label",
433
+ label: "Category concern cards show their icon ABOVE the label, not beside it",
434
+ description: "This is a deliberate visual change: the card always asked for a vertical layout but had been rendering side-by-side. Confirm the stacked layout looks right rather than assuming the old side-by-side was intended.",
435
+ href: "/categories",
436
+ },
437
+ {
438
+ key: "media-picker-existing-grid",
439
+ label: "In any media field, \"Choose existing\" shows each file as a square thumbnail with the filename underneath — not thumbnail-beside-filename with a shrunken image",
440
+ href: "/admin/media",
441
+ },
442
+ {
443
+ key: "icon-button-spacing",
444
+ label: "Buttons that combine an icon and a label still have normal spacing between them, and a loading button's spinner stays centred against its text",
445
+ description: "Regression check for the shared Button change that fixed the tiles — it altered how the button's own alignment reaches its children, so spot-check a few ordinary buttons anywhere in the app.",
446
+ href: "/products",
447
+ },
448
+ ],
449
+ },
403
450
  {
404
451
  pageKey: "buying-checkout",
405
452
  pageLabel: "Buying & Checkout",
@@ -1651,6 +1698,18 @@ const rawTesterChecklistItems = [
1651
1698
  cases: [
1652
1699
  { key: "view-event", label: "Viewing an event detail page works", href: "/user/events" },
1653
1700
  { key: "events-listing-cards-images", label: "The events listing page shows each event's real cover image (not a generic icon placeholder) when one is set, and all cards in a row are the same height", href: "/events" },
1701
+ {
1702
+ key: "lottery-cover-image",
1703
+ label: "A lottery's cover image renders on both the lottery listing card and its detail page — not the 🎰 emoji placeholder",
1704
+ description: "Both views used to read a field the data never populates, so every lottery fell back to the emoji. Verify against \"Pokémon Number Draw — July 2026\" (event-pokemon-number-draw-july-2026), which has a real cover image.",
1705
+ href: "/lottery/event-pokemon-number-draw-july-2026",
1706
+ },
1707
+ {
1708
+ key: "lottery-prize-previews",
1709
+ label: "A lottery detail page shows a \"Prizes\" collage of prize photos above the numbered \"Slots\" grid, and the numbered grid itself still shows every slot as a plain number",
1710
+ description: "Only slots that actually have a photo get a collage tile — the seeded fixture has photos on the first 8 of its 25 slots, so expect 8 tiles above a 25-square grid. Claimed slots show a \"Claimed\" stamp. Prices and odds must never appear anywhere on this page.",
1711
+ href: "/lottery/event-pokemon-number-draw-july-2026",
1712
+ },
1654
1713
  {
1655
1714
  key: "related-events-section",
1656
1715
  label: "An event's Overview tab shows a \"Related Events\" carousel of other active events sharing at least one tag, with real events (not empty)",
@@ -2071,7 +2130,16 @@ const rawTesterChecklistItems = [
2071
2130
  { key: "hero-carousel-arrows-flip", label: "With Left-hand mode ON, the homepage hero carousel's Prev/Next arrow pair appears in the bottom-left corner instead of bottom-right; the dots stay centered either way", href: "/" },
2072
2131
  { key: "gallery-arrows-unaffected", label: "Left-hand mode does NOT change a product image gallery/lightbox's Prev/Next arrows — Prev stays on the left edge and Next stays on the right edge in both modes" },
2073
2132
  { key: "homepage-section-buttons-mirror", label: "With Left-hand mode ON, homepage section header rows (e.g. Brands, Featured Bundles, Google Reviews) have their \"View All\" button on the opposite side from default — title and button swap sides", href: "/" },
2074
- { key: "hand-mode-no-fouc", label: "On a hard page reload with Left-hand mode already ON, panels/sidebars render on the left immediately — there is no visible flash of them briefly appearing on the right before snapping left" },
2133
+ { key: "titlebar-actions-mirror", label: "With Left-hand mode ON, the top bar's action icons (search, Today's Deals, theme toggle, hamburger) move from the right edge to the LEFT edge and their order is mirrored — the hamburger ends up in the far-left corner — while the brand wordmark moves to the right edge; with it OFF (default), everything is the other way round", href: "/" },
2134
+ { key: "titlebar-centre-mark-unaffected", label: "Left-hand mode does NOT move the centred logo mark in the middle of the desktop top bar — it stays exactly centred in both modes", href: "/" },
2135
+ { key: "titlebar-row2-mirror", label: "On a phone-width viewport with Left-hand mode ON, the top bar's SECOND row (notifications / wishlist / cart / profile icons) packs against the LEFT edge in mirrored order with profile leftmost; with it OFF it packs against the right edge with notifications leftmost", href: "/" },
2136
+ { key: "titlebar-actions-no-overflow-narrow", label: "With Left-hand mode ON at the narrowest phone width (~320px), no top-bar icon is clipped or pushed off-screen — the mirrored row fits exactly as well as the default row does", href: "/" },
2137
+ { key: "bottom-nav-mirror", label: "With Left-hand mode ON, the mobile bottom tab bar's slots appear in reverse order (Profile leftmost, Home rightmost); with it OFF, Home is leftmost. Slot widths stay equal in both modes.", href: "/" },
2138
+ { key: "dashboard-bottom-nav-mirror", label: "With Left-hand mode ON, the dashboard's own mobile bottom tab bar (on admin/store/user routes) mirrors the same way the public one does — both bars behave identically", href: "/user" },
2139
+ { key: "count-badges-mirror", label: "With Left-hand mode ON, the red count bubbles on the cart / wishlist / notification icons sit on the TOP-LEFT corner of their icon instead of top-right — in BOTH the top bar and the mobile bottom tab bar — and neither is clipped by the icon's edge", href: "/" },
2140
+ { key: "nav-scroll-arrows-unaffected", label: "Left-hand mode does NOT flip the main navigation bar's overflow scroll chevrons — the left chevron still scrolls the nav left and the right chevron still scrolls it right, in both modes", href: "/" },
2141
+ { key: "header-tab-order-sane", label: "With Left-hand mode ON, pressing Tab repeatedly from the top of the page still reaches every top-bar control with none skipped or trapped", description: "The visual left-to-right order will NOT match the tab order in left-hand mode — that is expected and accepted (the mirror is visual only, DOM order is deliberately unchanged so screen-reader reading order stays stable). What must not happen is a control becoming unreachable.", href: "/" },
2142
+ { key: "hand-mode-no-fouc", label: "On a hard page reload with Left-hand mode already ON, panels/sidebars AND the top bar / bottom tab bar render in their left-hand positions immediately — there is no visible flash of the header icons or tab bar briefly appearing in their default positions before snapping over" },
2075
2143
  ],
2076
2144
  },
2077
2145
  {
@@ -2232,6 +2300,12 @@ const rawTesterChecklistItems = [
2232
2300
  description: "Updated 2026-08-20 — the founder card previously used a fictional placeholder name with no GitHub link. Confirm the founder card's name matches the real developer and the GitHub link opens their actual profile.",
2233
2301
  href: "/about",
2234
2302
  },
2303
+ {
2304
+ key: "about-values-expanded",
2305
+ label: "The About page's \"Our Values\" section shows six values, each with a second smaller paragraph, plus a \"How we hold ourselves to this →\" link that opens the Ethics page",
2306
+ description: "Added 2026-08-24 — the section previously had three values, no subtitle, and no onward link. Confirm the subtitle line renders under the heading and the link lands on /ethics.",
2307
+ href: "/about",
2308
+ },
2235
2309
  {
2236
2310
  key: "developer-page-loads",
2237
2311
  label: "The Developer page loads correctly, is linked from the footer's Support column next to About Us, shows the real developer's name, and its \"GitHub ↗\" link opens their actual GitHub profile",
@@ -2362,7 +2436,37 @@ const rawTesterChecklistItems = [
2362
2436
  href: "/help",
2363
2437
  cases: [
2364
2438
  { key: "shipping-refund-policy", label: "Shipping-policy and refund-policy pages load correctly" },
2439
+ {
2440
+ key: "refund-policy-not-raw-json",
2441
+ label: "The Refund Policy page shows readable policy text — NOT a wall of raw JSON starting with {\"type\":\"doc\"",
2442
+ description: "Fixed 2026-08-24. The seeded siteSettings.legalPages.refundPolicy held a TipTap JSON document, but PolicyPageView injects that field as raw HTML — so the page rendered the JSON source as visible text. The seeded overrides are now empty strings, which makes the page fall back to its proper i18n copy. Re-seed before testing this one.",
2443
+ href: "/refund-policy",
2444
+ },
2365
2445
  { key: "privacy-cookies-security", label: "Privacy, cookies, and security pages load correctly" },
2446
+ {
2447
+ key: "ethics-page-loads",
2448
+ label: "The Our Ethics page loads, and its live-animal section describes vendor verification, a lawful-destination check, CITES paperwork, and specialist transport",
2449
+ description: "Added 2026-08-24. Reachable from the footer under Support, and from the Values section on the About page.",
2450
+ href: "/ethics",
2451
+ },
2452
+ {
2453
+ key: "code-of-conduct-loads",
2454
+ label: "The Code of Conduct page loads and covers listing honestly, bidding in good faith, review integrity, and the enforcement/appeal ladder",
2455
+ description: "Added 2026-08-24. Reachable from the footer under Legal.",
2456
+ href: "/code-of-conduct",
2457
+ },
2458
+ {
2459
+ key: "policy-related-links-exclude-self",
2460
+ label: "On EVERY policy page, the \"Related Policies\" footer lists the other five policies and never links to the page you are already on",
2461
+ description: "All six pages (Terms, Privacy, Cookies, Refund, Ethics, Code of Conduct) share one renderer whose related-links list is derived from a single registry. Open each and confirm you see exactly five links and that none of them is the current page.",
2462
+ href: "/ethics",
2463
+ },
2464
+ {
2465
+ key: "policy-admin-html-override",
2466
+ label: "As an admin: pasting HTML into Site Settings → Legal → \"Our Ethics\" and saving replaces the default Ethics page content immediately (no waiting)",
2467
+ description: "Added 2026-08-24. Exercises the full chain — admin textarea → legalPages.ethics → PolicyPageView read → cache bust. These pages are cached for an hour, so saving now also revalidates them; if the change only appears after a long wait, the revalidation step regressed. Clear the textarea and save again to restore the default copy.",
2468
+ href: "/admin/site",
2469
+ },
2366
2470
  ],
2367
2471
  },
2368
2472
  {
@@ -29,7 +29,7 @@ export declare function useWishlistWithGuest(userId: string | null | undefined,
29
29
  productPrice: number;
30
30
  productSlug: string;
31
31
  addedAt: string | undefined;
32
- type: "classified" | "auction" | "digital-code" | "live" | "category" | "store" | "product" | "preorder";
32
+ type: "classified" | "category" | "auction" | "digital-code" | "live" | "store" | "product" | "preorder";
33
33
  }[];
34
34
  total: number;
35
35
  wishlistedIds: Set<string>;