@mohasinac/appkit 4.57.0 → 4.59.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 (574) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/server/features/beys/data.d.ts +44 -0
  3. package/dist/_internal/server/features/beys/data.js +107 -0
  4. package/dist/_internal/server/features/beys/og.d.ts +42 -0
  5. package/dist/_internal/server/features/beys/og.js +89 -0
  6. package/dist/_internal/server/features/parts/data.js +3 -2
  7. package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
  8. package/dist/_internal/server/jobs/handlers/messages.js +1 -1
  9. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  10. package/dist/_internal/shared/actions/action-registry.js +86 -0
  11. package/dist/_internal/shared/types/base-document.d.ts +1 -1
  12. package/dist/client.d.ts +2 -0
  13. package/dist/client.js +1 -0
  14. package/dist/constants/api-endpoints.d.ts +12 -0
  15. package/dist/constants/api-endpoints.js +10 -0
  16. package/dist/constants/field-names.d.ts +46 -0
  17. package/dist/constants/field-names.js +46 -0
  18. package/dist/constants/seed-meta.d.ts +113 -0
  19. package/dist/constants/seed-meta.js +91 -0
  20. package/dist/features/admin/components/AdminBeysView.d.ts +27 -0
  21. package/dist/features/admin/components/AdminBeysView.js +178 -0
  22. package/dist/features/admin/components/AdminPartsView.d.ts +27 -0
  23. package/dist/features/admin/components/AdminPartsView.js +160 -0
  24. package/dist/features/admin/components/OwnerQuickActions.d.ts +19 -2
  25. package/dist/features/admin/components/OwnerQuickActions.js +31 -3
  26. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +31 -0
  27. package/dist/features/admin/components/RecordOwnerQuickActions.js +128 -0
  28. package/dist/features/admin/components/ReferenceRecordEditor.d.ts +45 -0
  29. package/dist/features/admin/components/ReferenceRecordEditor.js +153 -0
  30. package/dist/features/admin/schemas/firestore.d.ts +1 -1
  31. package/dist/features/auctions/components/MarketplaceAuctionCard.js +15 -2
  32. package/dist/features/auth/permissions/constants.d.ts +1 -1
  33. package/dist/features/auth/permissions/constants.js +12 -1
  34. package/dist/features/beys/components/BeyDetailPageView.d.ts +50 -0
  35. package/dist/features/beys/components/BeyDetailPageView.js +98 -0
  36. package/dist/features/beys/schemas/firestore.d.ts +417 -0
  37. package/dist/features/beys/schemas/firestore.js +65 -0
  38. package/dist/features/blog/components/BlogFeaturedCard.js +15 -2
  39. package/dist/features/blog/components/BlogPostView.js +2 -2
  40. package/dist/features/categories/components/BrandDetailPageView.js +4 -2
  41. package/dist/features/categories/components/BundleDetailView.js +2 -2
  42. package/dist/features/categories/components/CategoryDetailPageView.js +36 -3
  43. package/dist/features/categories/components/CategoryGrid.js +24 -2
  44. package/dist/features/categories/components/FranchiseDetailPageView.js +2 -3
  45. package/dist/features/events/components/EventCard.js +15 -2
  46. package/dist/features/grouped/components/GroupedListingDetailView.js +2 -3
  47. package/dist/features/homepage/components/CustomCardsSection.js +67 -50
  48. package/dist/features/homepage/components/ShopByCategorySection.js +23 -10
  49. package/dist/features/homepage/schemas/index.d.ts +10 -10
  50. package/dist/features/parts/components/PartDetailPageView.js +5 -3
  51. package/dist/features/parts/components/PartsSearchBox.js +79 -4
  52. package/dist/features/parts/schemas/admin-edit.d.ts +81 -0
  53. package/dist/features/parts/schemas/admin-edit.js +89 -0
  54. package/dist/features/parts/schemas/firestore.d.ts +2 -1
  55. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +15 -2
  56. package/dist/features/products/components/MarketplaceBundleCard.js +15 -2
  57. package/dist/features/products/components/MarketplacePrizeDrawCard.js +15 -2
  58. package/dist/features/products/components/ProductGrid.js +18 -2
  59. package/dist/features/products/schemas/firestore.d.ts +18 -0
  60. package/dist/features/seller/components/CategoryInlineSelect.d.ts +10 -1
  61. package/dist/features/seller/components/CategoryInlineSelect.js +53 -5
  62. package/dist/features/seller/components/SellerProductShell.d.ts +39 -0
  63. package/dist/features/seller/components/SellerProductShell.js +31 -3
  64. package/dist/index.d.ts +6 -129
  65. package/dist/index.js +61 -292
  66. package/dist/next/routing/route-map.d.ts +13 -1
  67. package/dist/next/routing/route-map.js +37 -0
  68. package/dist/schemas/registry.d.ts +6 -6
  69. package/dist/server.d.ts +2 -69
  70. package/dist/server.js +8 -69
  71. package/dist/styles.css +468 -1
  72. package/dist/tailwind-utilities.css +1 -1
  73. package/dist/ui/components/PosterCard.d.ts +99 -0
  74. package/dist/ui/components/PosterCard.js +109 -0
  75. package/dist/ui/components/PosterCard.style.css +466 -0
  76. package/dist/ui/components/index.style.css +1 -0
  77. package/dist/ui/index.d.ts +2 -0
  78. package/dist/ui/index.js +2 -0
  79. package/package.json +4 -2
  80. package/scripts/seed-cli.mjs +177 -2
  81. package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
  82. package/dist/features/tester/seed-data/_happy-path.js +0 -710
  83. package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
  84. package/dist/features/tester/seed-data/_money-flows.js +0 -610
  85. package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
  86. package/dist/features/tester/seed-data/authored/_types.js +0 -35
  87. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
  88. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
  89. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
  90. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
  91. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
  92. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
  93. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
  94. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
  95. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
  96. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
  97. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
  98. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
  99. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
  100. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
  101. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
  102. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
  103. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
  104. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
  105. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
  106. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
  107. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
  108. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
  109. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
  110. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
  111. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
  112. package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
  113. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
  114. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
  115. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
  116. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
  117. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
  118. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
  119. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
  120. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
  121. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
  122. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
  123. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
  124. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
  125. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
  126. package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
  127. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
  128. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
  129. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
  130. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
  131. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
  132. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
  133. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
  134. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
  135. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
  136. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
  137. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
  138. package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
  139. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
  140. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
  141. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
  142. package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
  143. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
  144. package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
  145. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
  146. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
  147. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
  148. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
  149. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
  150. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
  151. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
  152. package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
  153. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
  154. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
  155. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
  156. package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
  157. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
  158. package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
  159. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
  160. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
  161. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
  162. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
  163. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
  164. package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
  165. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
  166. package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
  167. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
  168. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
  169. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
  170. package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
  171. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
  172. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
  173. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
  174. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
  175. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
  176. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
  177. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
  178. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
  179. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
  180. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
  181. package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
  182. package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
  183. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
  184. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
  185. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
  186. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
  187. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
  188. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
  189. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
  190. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
  191. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
  192. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
  193. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
  194. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
  195. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
  196. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
  197. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
  198. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
  199. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
  200. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
  201. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
  202. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
  203. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
  204. package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
  205. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
  206. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
  207. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
  208. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
  209. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
  210. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
  211. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
  212. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
  213. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
  214. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
  215. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
  216. package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
  217. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
  218. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
  219. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
  220. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
  221. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
  222. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
  223. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
  224. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
  225. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
  226. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
  227. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
  228. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
  229. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
  230. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
  231. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
  232. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
  233. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
  234. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
  235. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
  236. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
  237. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
  238. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
  239. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
  240. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
  241. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
  242. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
  243. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
  244. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
  245. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
  246. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
  247. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
  248. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
  249. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
  250. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
  251. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
  252. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
  253. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
  254. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
  255. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
  256. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
  257. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
  258. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
  259. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
  260. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
  261. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
  262. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
  263. package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
  264. package/dist/features/tester/seed-data/authored/index.js +0 -301
  265. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
  266. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
  267. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
  268. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
  269. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
  270. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
  271. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
  272. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
  273. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
  274. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
  275. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
  276. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
  277. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
  278. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
  279. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
  280. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
  281. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
  282. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
  283. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
  284. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
  285. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
  286. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
  287. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
  288. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
  289. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
  290. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
  291. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
  292. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
  293. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
  294. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
  295. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
  296. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
  297. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
  298. package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
  299. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
  300. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
  301. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
  302. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
  303. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
  304. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
  305. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
  306. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
  307. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
  308. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
  309. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
  310. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
  311. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
  312. package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
  313. package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
  314. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
  315. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
  316. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
  317. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
  318. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
  319. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
  320. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
  321. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
  322. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
  323. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
  324. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
  325. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
  326. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
  327. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
  328. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
  329. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
  330. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
  331. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
  332. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
  333. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
  334. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
  335. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
  336. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
  337. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
  338. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
  339. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
  340. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
  341. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
  342. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
  343. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
  344. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
  345. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
  346. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
  347. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
  348. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
  349. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
  350. package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
  351. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
  352. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
  353. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
  354. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
  355. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
  356. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
  357. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
  358. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
  359. package/dist/features/tester/seed-data/index.d.ts +0 -2
  360. package/dist/features/tester/seed-data/index.js +0 -2
  361. package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
  362. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
  363. package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
  364. package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
  365. package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
  366. package/dist/features/tester/seed-data/tester-window.js +0 -66
  367. package/dist/seed/_helpers/brand-rows.d.ts +0 -35
  368. package/dist/seed/_helpers/brand-rows.js +0 -600
  369. package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
  370. package/dist/seed/_helpers/category-content-generated.js +0 -1853
  371. package/dist/seed/_helpers/category-content.d.ts +0 -68
  372. package/dist/seed/_helpers/category-content.js +0 -731
  373. package/dist/seed/_helpers/category-forest.d.ts +0 -4
  374. package/dist/seed/_helpers/category-forest.js +0 -824
  375. package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
  376. package/dist/seed/_helpers/category-images-generated.js +0 -618
  377. package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
  378. package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
  379. package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
  380. package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
  381. package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
  382. package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
  383. package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
  384. package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
  385. package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
  386. package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
  387. package/dist/seed/_helpers/category-models.d.ts +0 -12
  388. package/dist/seed/_helpers/category-models.js +0 -45
  389. package/dist/seed/_helpers/category-names.d.ts +0 -54
  390. package/dist/seed/_helpers/category-names.js +0 -118
  391. package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
  392. package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
  393. package/dist/seed/_helpers/category-parts.d.ts +0 -9
  394. package/dist/seed/_helpers/category-parts.js +0 -15022
  395. package/dist/seed/_helpers/category-tree.d.ts +0 -27
  396. package/dist/seed/_helpers/category-tree.js +0 -119
  397. package/dist/seed/_helpers/character-features.d.ts +0 -10
  398. package/dist/seed/_helpers/character-features.js +0 -120
  399. package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
  400. package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
  401. package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
  402. package/dist/seed/_helpers/franchise-rows.js +0 -189
  403. package/dist/seed/_helpers/media.d.ts +0 -67
  404. package/dist/seed/_helpers/media.js +0 -172
  405. package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
  406. package/dist/seed/_helpers/part-colours-generated.js +0 -273
  407. package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
  408. package/dist/seed/_helpers/product-search-txt.js +0 -23
  409. package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
  410. package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
  411. package/dist/seed/addresses-seed-data.d.ts +0 -2
  412. package/dist/seed/addresses-seed-data.js +0 -78
  413. package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
  414. package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
  415. package/dist/seed/bids-seed-data.d.ts +0 -2
  416. package/dist/seed/bids-seed-data.js +0 -206
  417. package/dist/seed/blog-posts-seed-data.d.ts +0 -6
  418. package/dist/seed/blog-posts-seed-data.js +0 -442
  419. package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
  420. package/dist/seed/carousel-slides-seed-data.js +0 -411
  421. package/dist/seed/carousels-seed-data.d.ts +0 -2
  422. package/dist/seed/carousels-seed-data.js +0 -36
  423. package/dist/seed/cart-seed-data.d.ts +0 -2
  424. package/dist/seed/cart-seed-data.js +0 -241
  425. package/dist/seed/catalogue-seed-data.d.ts +0 -2
  426. package/dist/seed/catalogue-seed-data.js +0 -112
  427. package/dist/seed/categories-seed-data.d.ts +0 -3
  428. package/dist/seed/categories-seed-data.js +0 -816
  429. package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
  430. package/dist/seed/claimed-coupons-seed-data.js +0 -85
  431. package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
  432. package/dist/seed/coupon-usage-seed-data.js +0 -55
  433. package/dist/seed/coupons-seed-data.d.ts +0 -2
  434. package/dist/seed/coupons-seed-data.js +0 -226
  435. package/dist/seed/defaults/categories.d.ts +0 -2
  436. package/dist/seed/defaults/categories.js +0 -12
  437. package/dist/seed/defaults/faqs.d.ts +0 -2
  438. package/dist/seed/defaults/faqs.js +0 -40
  439. package/dist/seed/events-seed-data.d.ts +0 -7
  440. package/dist/seed/events-seed-data.js +0 -482
  441. package/dist/seed/factories/address.factory.d.ts +0 -21
  442. package/dist/seed/factories/address.factory.js +0 -44
  443. package/dist/seed/factories/bid.factory.d.ts +0 -15
  444. package/dist/seed/factories/bid.factory.js +0 -33
  445. package/dist/seed/factories/blog-post.factory.d.ts +0 -15
  446. package/dist/seed/factories/blog-post.factory.js +0 -22
  447. package/dist/seed/factories/carousel.factory.d.ts +0 -11
  448. package/dist/seed/factories/carousel.factory.js +0 -17
  449. package/dist/seed/factories/cart.factory.d.ts +0 -25
  450. package/dist/seed/factories/cart.factory.js +0 -35
  451. package/dist/seed/factories/category.factory.d.ts +0 -11
  452. package/dist/seed/factories/category.factory.js +0 -16
  453. package/dist/seed/factories/coupon.factory.d.ts +0 -21
  454. package/dist/seed/factories/coupon.factory.js +0 -43
  455. package/dist/seed/factories/faq.factory.d.ts +0 -10
  456. package/dist/seed/factories/faq.factory.js +0 -15
  457. package/dist/seed/factories/notification.factory.d.ts +0 -18
  458. package/dist/seed/factories/notification.factory.js +0 -39
  459. package/dist/seed/factories/order.factory.d.ts +0 -20
  460. package/dist/seed/factories/order.factory.js +0 -20
  461. package/dist/seed/factories/payout.factory.d.ts +0 -21
  462. package/dist/seed/factories/payout.factory.js +0 -38
  463. package/dist/seed/factories/product.factory.d.ts +0 -27
  464. package/dist/seed/factories/product.factory.js +0 -80
  465. package/dist/seed/factories/review.factory.d.ts +0 -14
  466. package/dist/seed/factories/review.factory.js +0 -52
  467. package/dist/seed/factories/session.factory.d.ts +0 -15
  468. package/dist/seed/factories/session.factory.js +0 -31
  469. package/dist/seed/factories/store.factory.d.ts +0 -23
  470. package/dist/seed/factories/store.factory.js +0 -47
  471. package/dist/seed/factories/user.factory.d.ts +0 -19
  472. package/dist/seed/factories/user.factory.js +0 -56
  473. package/dist/seed/faq-seed-data.d.ts +0 -18
  474. package/dist/seed/faq-seed-data.js +0 -1956
  475. package/dist/seed/firestore-indexes.d.ts +0 -12
  476. package/dist/seed/firestore-indexes.js +0 -31
  477. package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
  478. package/dist/seed/grouped-listings-seed-data.js +0 -283
  479. package/dist/seed/history-seed-data.d.ts +0 -12
  480. package/dist/seed/history-seed-data.js +0 -70
  481. package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
  482. package/dist/seed/homepage-sections-seed-data.js +0 -1018
  483. package/dist/seed/index.d.ts +0 -98
  484. package/dist/seed/index.js +0 -112
  485. package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
  486. package/dist/seed/lottery-entries-seed-data.js +0 -108
  487. package/dist/seed/manifest.d.ts +0 -16
  488. package/dist/seed/manifest.js +0 -235
  489. package/dist/seed/media-assets-seed-data.d.ts +0 -22
  490. package/dist/seed/media-assets-seed-data.js +0 -5593
  491. package/dist/seed/model-composition-seed-data.d.ts +0 -15
  492. package/dist/seed/model-composition-seed-data.js +0 -9032
  493. package/dist/seed/notifications-seed-data.d.ts +0 -2
  494. package/dist/seed/notifications-seed-data.js +0 -606
  495. package/dist/seed/offers-seed-data.d.ts +0 -2
  496. package/dist/seed/offers-seed-data.js +0 -398
  497. package/dist/seed/orders-seed-data.d.ts +0 -2
  498. package/dist/seed/orders-seed-data.js +0 -845
  499. package/dist/seed/part-glossary/chunk0.d.ts +0 -9
  500. package/dist/seed/part-glossary/chunk0.js +0 -35448
  501. package/dist/seed/part-glossary/chunk1.d.ts +0 -9
  502. package/dist/seed/part-glossary/chunk1.js +0 -40494
  503. package/dist/seed/part-glossary/chunk2.d.ts +0 -9
  504. package/dist/seed/part-glossary/chunk2.js +0 -51242
  505. package/dist/seed/part-glossary/chunk3.d.ts +0 -9
  506. package/dist/seed/part-glossary/chunk3.js +0 -53337
  507. package/dist/seed/part-glossary/chunk4.d.ts +0 -9
  508. package/dist/seed/part-glossary/chunk4.js +0 -51454
  509. package/dist/seed/part-glossary-seed-data.d.ts +0 -15
  510. package/dist/seed/part-glossary-seed-data.js +0 -25
  511. package/dist/seed/payouts-seed-data.d.ts +0 -2
  512. package/dist/seed/payouts-seed-data.js +0 -302
  513. package/dist/seed/product-features-seed-data.d.ts +0 -3
  514. package/dist/seed/product-features-seed-data.js +0 -366
  515. package/dist/seed/products-art-seed-data.d.ts +0 -2
  516. package/dist/seed/products-art-seed-data.js +0 -289
  517. package/dist/seed/products-auctions-seed-data.d.ts +0 -2
  518. package/dist/seed/products-auctions-seed-data.js +0 -475
  519. package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
  520. package/dist/seed/products-beyblade-x-seed-data.js +0 -476
  521. package/dist/seed/products-catalogue-seed-data.d.ts +0 -22
  522. package/dist/seed/products-catalogue-seed-data.js +0 -86384
  523. package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
  524. package/dist/seed/products-classifieds-seed-data.js +0 -435
  525. package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
  526. package/dist/seed/products-digital-codes-seed-data.js +0 -395
  527. package/dist/seed/products-live-items-seed-data.d.ts +0 -7
  528. package/dist/seed/products-live-items-seed-data.js +0 -269
  529. package/dist/seed/products-preorders-seed-data.d.ts +0 -2
  530. package/dist/seed/products-preorders-seed-data.js +0 -360
  531. package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
  532. package/dist/seed/products-prize-draws-seed-data.js +0 -427
  533. package/dist/seed/products-spares-seed-data.d.ts +0 -2
  534. package/dist/seed/products-spares-seed-data.js +0 -368
  535. package/dist/seed/products-standard-seed-data.d.ts +0 -2
  536. package/dist/seed/products-standard-seed-data.js +0 -632
  537. package/dist/seed/products-stickers-seed-data.d.ts +0 -2
  538. package/dist/seed/products-stickers-seed-data.js +0 -319
  539. package/dist/seed/reviews-seed-data.d.ts +0 -1
  540. package/dist/seed/reviews-seed-data.js +0 -185
  541. package/dist/seed/runner.d.ts +0 -2
  542. package/dist/seed/runner.js +0 -125
  543. package/dist/seed/scammers-seed-data.d.ts +0 -2
  544. package/dist/seed/scammers-seed-data.js +0 -235
  545. package/dist/seed/seed-market-config.d.ts +0 -48
  546. package/dist/seed/seed-market-config.js +0 -199
  547. package/dist/seed/seed-purpose.d.ts +0 -299
  548. package/dist/seed/seed-purpose.js +0 -431
  549. package/dist/seed/sessions-seed-data.d.ts +0 -3
  550. package/dist/seed/sessions-seed-data.js +0 -116
  551. package/dist/seed/shipments-seed-data.d.ts +0 -5
  552. package/dist/seed/shipments-seed-data.js +0 -185
  553. package/dist/seed/site-settings-seed-data.d.ts +0 -2
  554. package/dist/seed/site-settings-seed-data.js +0 -1069
  555. package/dist/seed/store-addresses-seed-data.d.ts +0 -18
  556. package/dist/seed/store-addresses-seed-data.js +0 -71
  557. package/dist/seed/store-extensions-seed-data.d.ts +0 -11
  558. package/dist/seed/store-extensions-seed-data.js +0 -292
  559. package/dist/seed/stores-seed-data.d.ts +0 -6
  560. package/dist/seed/stores-seed-data.js +0 -242
  561. package/dist/seed/support-tickets-seed-data.d.ts +0 -16
  562. package/dist/seed/support-tickets-seed-data.js +0 -239
  563. package/dist/seed/tax-codes-seed-data.d.ts +0 -34
  564. package/dist/seed/tax-codes-seed-data.js +0 -100
  565. package/dist/seed/test-data-ttl.d.ts +0 -29
  566. package/dist/seed/test-data-ttl.js +0 -31
  567. package/dist/seed/test-utils.d.ts +0 -49
  568. package/dist/seed/test-utils.js +0 -110
  569. package/dist/seed/types.d.ts +0 -89
  570. package/dist/seed/types.js +0 -15
  571. package/dist/seed/users-seed-data.d.ts +0 -2
  572. package/dist/seed/users-seed-data.js +0 -597
  573. package/dist/seed/wishlists-seed-data.d.ts +0 -12
  574. package/dist/seed/wishlists-seed-data.js +0 -54
@@ -1,731 +0,0 @@
1
- /*
2
- * WHY: ~382 category nodes need description templates and product defaults,
3
- * and inlining them per node is 382 places a fix has to land. The crawl
4
- * is the evidence that this is the right shape: worldhobbyshop reuses
5
- * exactly TWO bodies across 1,195 listings, so the bodies are a small
6
- * closed set and the per-category part is which set applies.
7
- * WHAT: The five reusable description bodies, the measured day-1 market bands,
8
- * and per-vertical `productDefaults` factories. Authored ONCE.
9
- *
10
- * EXPORTS:
11
- * TEMPLATES — the five bodies, by variant
12
- * templateSet — pick a subset by variant for a category
13
- * marketBand — a measured {p25, median, p75, sampleSize, asOf} band
14
- * beyDefaults / partDefaults / launcherDefaults / stadiumDefaults
15
- * tcgDefaults / figureDefaults / diecastDefaults / accessoryDefaults
16
- *
17
- * 🛑 Every number in MARKET_BANDS is MEASURED, from
18
- * docs/research/competitor-crawl-2026-10/price-bands.md, with its real
19
- * sample size. A band with no evidence is omitted rather than guessed —
20
- * a fabricated "typical price" is worse than no hint, because a seller
21
- * prices against it.
22
- *
23
- * 🛑 `sold` is never seeded. It is OUR completed sales and we have none for
24
- * most leaves; `priceIndexRollup` (C1) is its only writer, and it must
25
- * never touch `market`.
26
- *
27
- * @tag domain:categories
28
- * @tag layer:seed
29
- * @tag pattern:shared-literal
30
- * @tag access:server-only
31
- * @tag consumers:seed/_helpers/category-forest.ts
32
- * @tag sideEffects:none
33
- */
34
- /**
35
- * When the competitor crawl was taken. Fixed, never `new Date()` — a seed file
36
- * is re-executed on every `appkit-seed` invocation, so a moving timestamp makes
37
- * `load` non-idempotent (Root Cause #25).
38
- */
39
- export const CRAWL_AS_OF = new Date("2026-10-09T00:00:00.000Z");
40
- // ─────────────────────────────────────────────────────────────────────────────
41
- // The five description bodies
42
- //
43
- // Shapes taken from the crawl; every word is ours. The counter-example is
44
- // raikagesbeybladestore, whose 114-char bodies are lifted verbatim from the
45
- // Beyblade Wiki and one of which ships with the literal UI string "Add to
46
- // Wishlist Add to Wishlist" welded into the product body.
47
- //
48
- // 🛑 No `{{price}}` slot, deliberately. A price in free text is an ungated
49
- // public price that `<GatedPrice>` cannot wrap, and `audit-guest-price-leak`
50
- // R2 blocks it.
51
- // ─────────────────────────────────────────────────────────────────────────────
52
- const PRE_OWNED_BODY = `<h2>{{title}}</h2>
53
- <p>A pre-owned {{category}} listing from the {{series}} line, sold as pictured.</p>
54
- <h3>Important things to know</h3>
55
- <ul>
56
- <li><strong>Condition:</strong> {{condition}}. The photographs are of the actual item, not a stock image.</li>
57
- <li><strong>What is included:</strong> only what is shown. Launchers, ripcords and stadiums are sold separately unless pictured.</li>
58
- <li><strong>Wear:</strong> a used {{category}} will show handling marks. Anything structural — a chip, a crack, a stripped tooth — is called out above and photographed.</li>
59
- <li><strong>Authenticity:</strong> stated on this listing. Reproduction parts are labelled as such and never described as original.</li>
60
- </ul>
61
- <p>Sold by a verified seller on {{siteName}}, with buyer protection on every order.</p>`;
62
- const NEW_IN_BOX_BODY = `<h2>{{title}}</h2>
63
- <p>Sealed, unopened {{category}} from the {{series}} line.</p>
64
- <h3>Specification</h3>
65
- <ul>
66
- <li><strong>Manufacturer:</strong> {{brand}}</li>
67
- <li><strong>Condition:</strong> {{condition}}</li>
68
- <li><strong>Series:</strong> {{series}}</li>
69
- <li><strong>System:</strong> {{system}}</li>
70
- <li><strong>Category:</strong> {{categoryPath}}</li>
71
- </ul>
72
- <h3>What is in the box?</h3>
73
- <p>Factory contents, unopened. Where a release includes a launcher or ripcord it is listed in the specification above; where it does not, it is a top-only release.</p>
74
- <p>Listed by a verified seller on {{siteName}}.</p>`;
75
- const NEW_IN_PACKET_BODY = `<h2>{{title}}</h2>
76
- <p>New {{category}} on its original card or in its original polybag — never used, packaging unopened.</p>
77
- <ul>
78
- <li><strong>Manufacturer:</strong> {{brand}}</li>
79
- <li><strong>Condition:</strong> {{condition}}</li>
80
- <li><strong>Series:</strong> {{series}}</li>
81
- </ul>
82
- <p>Card and bag wear is normal on stock of this age and is photographed where present. The item itself is untouched.</p>`;
83
- const REPLICA_BODY = `<h2>{{title}}</h2>
84
- <p><strong>This is a reproduction, not an original {{brand}} release.</strong> It is listed as one deliberately, because knowing which you are buying is the point.</p>
85
- <h3>What that means</h3>
86
- <ul>
87
- <li>A reproduction is an unlicensed copy of an original design. It carries no manufacturer's marque.</li>
88
- <li>Build quality on reproductions varies. Weight and balance may differ from the original, which matters in competitive play.</li>
89
- <li>Some tournament formats permit certain reproduction parts and some do not — check your local format before buying to compete.</li>
90
- <li>This is <em>not</em> a counterfeit sold as genuine. If you believe a listing misrepresents a reproduction as original, report it.</li>
91
- </ul>
92
- <p><strong>Condition:</strong> {{condition}}. Sold as pictured.</p>`;
93
- const DEFAULT_BODY = `<h2>{{title}}</h2>
94
- <p>{{category}} from the {{series}} line, listed by a verified seller on {{siteName}}.</p>
95
- <ul>
96
- <li><strong>Manufacturer:</strong> {{brand}}</li>
97
- <li><strong>Condition:</strong> {{condition}}</li>
98
- <li><strong>Category:</strong> {{categoryPath}}</li>
99
- </ul>
100
- <p>Condition and authenticity are stated on every listing. Photographs are of the actual item.</p>`;
101
- /**
102
- * The five bodies, by variant.
103
- *
104
- * `placeholders` is deliberately LEFT ABSENT on all five: the field's contract
105
- * is that absent means "re-parse", and `extractPlaceholders(body)` is the one
106
- * implementation. Writing the list here by hand would be a second copy that
107
- * drifts the first time a body is edited — and the failure mode is a published
108
- * description containing a literal `{{series}}`.
109
- */
110
- export const TEMPLATES = {
111
- default: {
112
- id: "tpl-default",
113
- label: "Standard — manufacturer, condition, category",
114
- variant: "default",
115
- body: DEFAULT_BODY,
116
- version: 1,
117
- },
118
- new_in_box: {
119
- id: "tpl-new-in-box",
120
- label: "New in box — sealed, with a specification table",
121
- variant: "new_in_box",
122
- body: NEW_IN_BOX_BODY,
123
- version: 1,
124
- },
125
- new_in_packet: {
126
- id: "tpl-new-in-packet",
127
- label: "New in packet — carded or bagged, unopened",
128
- variant: "new_in_packet",
129
- body: NEW_IN_PACKET_BODY,
130
- version: 1,
131
- },
132
- pre_owned: {
133
- id: "tpl-pre-owned",
134
- label: "Pre-owned — condition exactly as pictured",
135
- variant: "pre_owned",
136
- body: PRE_OWNED_BODY,
137
- version: 1,
138
- },
139
- replica: {
140
- id: "tpl-replica",
141
- label: "Reproduction — disclosed, with a what-this-means panel",
142
- variant: "replica",
143
- body: REPLICA_BODY,
144
- version: 1,
145
- },
146
- };
147
- /**
148
- * ── D12: the BEYBLADE bodies, which are the only ones that state PARTS ─────
149
- *
150
- * 🛑 A separate set rather than adding the slot to the shared bodies, and the
151
- * reason is mechanical: `COLLECTIBLE_TEMPLATES` is also what every figure,
152
- * Hot Wheels and TCG category uses, and a `{{partBreakdown}}` on a Marvel
153
- * Legends listing resolves to nothing. The endpoint strips the line when
154
- * there is no composition, so the artifact would be invisible rather than
155
- * wrong — but it would also be a read attempted on four roots that can never
156
- * satisfy it, on an endpoint the seller form hits on every category change.
157
- *
158
- * Assigned to the 21 `line(...)` nodes, which are Beyblade generation lines
159
- * and nothing else — their children are `MODEL_LEAVES`. A model leaf carries
160
- * no body of its own and INHERITS this one, while the slot resolves against
161
- * the leaf's OWN composition. That is the whole design: one body per
162
- * generation, 216 models' worth of parts.
163
- */
164
- const BEY_PARTS_LINE = ` <li><strong>Parts:</strong> {{partBreakdown}}</li>`;
165
- /** The slot sits on its own source line, because the strip is line-based. */
166
- function withPartsLine(body) {
167
- return body.replace("</ul>", `${BEY_PARTS_LINE}
168
- </ul>`);
169
- }
170
- const BEY_TEMPLATE_VARIANTS = [
171
- "new_in_box",
172
- "pre_owned",
173
- "replica",
174
- "default",
175
- ];
176
- export const BEY_TEMPLATES = BEY_TEMPLATE_VARIANTS.map((v) => ({ ...TEMPLATES[v], body: withPartsLine(TEMPLATES[v].body) }));
177
- /** The set a normal collectible category offers. */
178
- export const COLLECTIBLE_TEMPLATES = [
179
- TEMPLATES.new_in_box,
180
- TEMPLATES.pre_owned,
181
- TEMPLATES.replica,
182
- TEMPLATES.default,
183
- ];
184
- /** Parts and small accessories arrive carded or loose, not boxed. */
185
- export const PART_TEMPLATES = [
186
- TEMPLATES.new_in_packet,
187
- TEMPLATES.pre_owned,
188
- TEMPLATES.replica,
189
- TEMPLATES.default,
190
- ];
191
- /** Sealed-only verticals (TCG sealed product, model kits) — no repro tier. */
192
- export const SEALED_TEMPLATES = [
193
- TEMPLATES.new_in_box,
194
- TEMPLATES.pre_owned,
195
- TEMPLATES.default,
196
- ];
197
- export function templateSet(...variants) {
198
- return variants.map((v) => TEMPLATES[v]);
199
- }
200
- /*
201
- * Day-1 bands, keyed by the leaf they belong to.
202
- *
203
- * 🛑 EVERY ROW HERE TRACES TO A LINE IN
204
- * docs/research/competitor-crawl-2026-10/price-bands.md. Nothing is
205
- * interpolated, averaged across sources, or extrapolated from a
206
- * neighbouring leaf. A leaf the crawl has no evidence for is ABSENT from
207
- * this map and renders no hint at all — ten of them are, and they are
208
- * listed at the bottom so their absence is a recorded decision rather than
209
- * an oversight.
210
- *
211
- * 🛑 An earlier draft of this map invented a sample size for all 21 Beyblade
212
- * top lines, because the type required one. The crawl's own rule is the
213
- * reason that matters: *"quote `n`, because a band with n=2 is not
214
- * evidence"* — so a fabricated n is not a cosmetic liberty, it is the
215
- * confidence signal replaced with a guess. `sampleSize` is optional now,
216
- * and these 21 rows legitimately have none.
217
- *
218
- * SOURCE PRIORITY: worldhobbyshop first wherever it has data, which is every
219
- * Beyblade band except HMS. HMS is beybladeshopindia at n=39 against WHS's
220
- * n=2, and `src` records that so the decision is reviewable rather than
221
- * buried. Parts pricing is raikages-only (the sole component-level source in
222
- * the crawl), and TCG / figures / Hot Wheels come from the sites that sell
223
- * them, since WHS carries none of those verticals.
224
- */
225
- const MARKET_BANDS = {
226
- // ── Beyblade tops, by line. WHS + beybladeshopindia; no per-leaf n ────────
227
- "category-original-plastic-gen": { p25: 799, median: 899, p75: 1499, src: "worldhobbyshop (plastic-3-layer)" },
228
- "category-original-spin-gear": { p25: 799, median: 1399, p75: 1799, src: "worldhobbyshop (spin-gear-sf)" },
229
- "category-original-magnacore": { p25: 999, median: 1699, p75: 1999, src: "worldhobbyshop (magna-core-v-force)" },
230
- // 🛑 The one row where a larger sample beat worldhobbyshop, and it is
231
- // recorded because the gap is enormous: beybladeshopindia n=39 against WHS
232
- // n=2. HMS is also the highest-value Beyblade tier on the site, so getting
233
- // it from a coin-flip sample would mis-anchor every HMS listing.
234
- "category-original-hms": { p25: 2999, median: 3999, p75: 9999, n: 39, src: "beybladeshopindia n=39 (worldhobbyshop had n=2)" },
235
- "category-metal-phws": { p25: 799, median: 899, p75: 999, src: "worldhobbyshop (phws-metal-system)" },
236
- "category-metal-fusion": { p25: 799, median: 999, p75: 1499, src: "worldhobbyshop (metal-fusion)" },
237
- "category-metal-masters": { p25: 1099, median: 1499, p75: 1999, src: "worldhobbyshop (metal-masters)" },
238
- "category-metal-fury-4d": { p25: 1799, median: 2399, p75: 2999, src: "worldhobbyshop (metal-fury-4d)" },
239
- "category-metal-shogun-steel": { p25: 1599, median: 2499, p75: 2999, src: "worldhobbyshop (shogun-steel-zero-g)" },
240
- // The crawl lists single-layer (299/299/399) and dual-layer (299/399/399)
241
- // separately and the taxonomy collapses them to one leaf, so the band
242
- // collapses with them — to the documented 299/399/399, not to a midpoint
243
- // somebody computed.
244
- "category-burst-classic": { p25: 299, median: 399, p75: 399, src: "worldhobbyshop (single-layer + dual-layer, collapsed)" },
245
- "category-burst-god": { p25: 599, median: 599, p75: 999, src: "worldhobbyshop (burst-god-evolution)" },
246
- "category-burst-cho-z": { p25: 599, median: 799, p75: 999, src: "worldhobbyshop (burst-cho-z-turbo)" },
247
- "category-burst-gt": { p25: 799, median: 999, p75: 1099, src: "worldhobbyshop (burst-gt-rise)" },
248
- "category-burst-superking": { p25: 999, median: 999, p75: 1499, src: "worldhobbyshop (burst-superking-surge)" },
249
- "category-burst-db": { p25: 999, median: 1399, p75: 1799, src: "worldhobbyshop (burst-db-quaddrive)" },
250
- "category-burst-bu": { p25: 1499, median: 1599, p75: 1799, src: "worldhobbyshop (burst-bu-quadstrike)" },
251
- "category-x-basic": { p25: 799, median: 999, p75: 1499, src: "worldhobbyshop (x-basic-s1)" },
252
- "category-x-unique-ux": { p25: 1199, median: 1399, p75: 1699, src: "worldhobbyshop (x-unique-ux)" },
253
- "category-x-custom-cx": { p25: 1299, median: 1499, p75: 1799, src: "worldhobbyshop (x-custom-cx)" },
254
- "category-x-over": { p25: 999, median: 1099, p75: 1499, src: "worldhobbyshop (x-over-remakes)" },
255
- // ── Parts. raikages is the ONLY component-level source in the crawl ───────
256
- "category-metal-energy-rings": { p25: 149, median: 199, p75: 249, n: 68, src: "raikages n=68" },
257
- "category-metal-fusion-wheels": { p25: 149, median: 249, p75: 299, n: 52, src: "raikages n=52" },
258
- "category-metal-spin-tracks": { p25: 149, median: 199, p75: 249, n: 53, src: "raikages n=53" },
259
- "category-metal-performance-tips": { p25: 129, median: 139, p75: 149, n: 25, src: "raikages n=25" },
260
- // WHS prices Burst parts as ONE pool (n=82) and X parts as one pool (n=14);
261
- // it does not split layers from discs from drivers. The three leaves share
262
- // the pooled band, and `src` says so rather than implying three measurements.
263
- "category-burst-layers": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
264
- "category-burst-discs": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
265
- "category-burst-drivers": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
266
- "category-x-blades": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
267
- "category-x-ratchets": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
268
- "category-x-bits": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
269
- // ── Launchers. One pooled band per generation, again as WHS measured it ───
270
- "category-original-ripcord-launchers": { p25: 199, median: 299, p75: 899, n: 32, src: "worldhobbyshop n=32, POOLED across original-era launchers" },
271
- "category-original-winders": { p25: 199, median: 299, p75: 899, n: 32, src: "worldhobbyshop n=32, POOLED across original-era launchers" },
272
- "category-metal-string-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
273
- "category-metal-ripcord-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
274
- "category-metal-lr-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
275
- "category-burst-string-launchers": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
276
- "category-burst-lr-launchers": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
277
- "category-burst-grips": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
278
- "category-x-string-launchers": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
279
- "category-x-winders": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
280
- "category-x-grips": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
281
- // ── Stadiums. ONE band, EIGHT leaves ──────────────────────────────────────
282
- // WHS does not split stadiums by generation — its single "Stadiums & Arenas"
283
- // category states the split in PROSE, because WooCommerce's flat taxonomy
284
- // could not hold it. So there is no per-generation evidence, and inventing
285
- // four bands from one sample of seven would be fabrication. The leaves stay
286
- // split (a BX-10 Xtreme Stadium is a Beyblade X product); the band does not.
287
- "category-original-bakuten-arena": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
288
- "category-original-attack-stadium": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
289
- "category-metal-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
290
- "category-metal-zero-g-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
291
- "category-burst-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
292
- "category-burst-stadium-variants": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
293
- "category-x-xtreme-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
294
- "category-x-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
295
- // ── TCG. tcgrepublic + hobbykart. WHS sells no cards ─────────────────────
296
- "category-pokemon-singles": { p25: 350, median: 400, p75: 500, n: 545, src: "tcgrepublic n=545 (singles, all games)" },
297
- "category-one-piece-singles": { p25: 350, median: 400, p75: 500, n: 545, src: "tcgrepublic n=545 (singles, all games)" },
298
- "category-pokemon-graded": { p25: 4600, median: 8000, p75: 11000, n: 15, src: "hobbykart n=15 (graded slabs)" },
299
- "category-one-piece-graded": { p25: 4600, median: 8000, p75: 11000, n: 15, src: "hobbykart n=15 (graded slabs)" },
300
- "category-tcg-weiss-schwarz": { p25: 3500, median: 6500, p75: 7500, n: 14, src: "tcgrepublic n=14" },
301
- "category-card-sleeves-toploaders": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
302
- "category-card-binders-boxes": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
303
- "category-card-slab-display": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
304
- // ── Figures. hobson + redeyemerch ────────────────────────────────────────
305
- "category-anime-scale-1-12": { p25: 3499, median: 5900, p75: 7999, n: 34, src: "hobson n=34 (1/12 scale)" },
306
- // The only band the crawl has for mid-scale statues is its general "Anime
307
- // Figures" tag, not a 1/7-or-1/8 measurement. Used, and labelled as general.
308
- "category-anime-scale-1-7-1-8": { p25: 1199, median: 1699, p75: 2499, n: 94, src: "redeyemerch n=94, GENERAL anime-figure band (not scale-specific)" },
309
- "category-anime-prize-figures": { p25: 1999, median: 2699, p75: 2999, n: 23, src: "hobson n=23 (prize figures)" },
310
- "category-comic-marvel-legends": { p25: 2999, median: 3999, p75: 5499, n: 41, src: "hobson n=41" },
311
- "category-comic-vintage-toybiz": { p25: 3499, median: 3999, p75: 4499, n: 22, src: "hobson n=22" },
312
- // ── Hot Wheels. toycollectorsindia ───────────────────────────────────────
313
- // 🛑 NO QUARTILES EXIST for either row. The crawl recorded a median and a
314
- // RANGE (₹99–36,500 for the pooled 1:64 band; ₹130–999 for their own plain
315
- // mainline collection), and a range is not a quartile. So these two carry a
316
- // median only, which is why `p25`/`p75` are optional at all.
317
- "category-hw-mainline-series": { median: 399, n: 27, src: "toycollectorsindia n=27 (their own plain mainline collection); range 130-999, no quartiles measured" },
318
- "category-hw-treasure-hunt": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
319
- "category-hw-car-culture": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
320
- "category-hw-boulevard": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
321
- "category-hw-team-transport": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
322
- "category-hw-fast-and-furious": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
323
- "category-hw-pop-culture": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
324
- "category-hw-rlc": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
325
- /*
326
- * 🛑 DELIBERATELY ABSENT — the crawl measured no band for these, and a
327
- * plausible-looking number would be worse than no hint, because a seller
328
- * prices against whatever we show them:
329
- *
330
- * category-original-engine-gear WHS bands plastic / spin-gear / magnacore
331
- * / HMS and NOT Engine Gear. An earlier
332
- * draft of this map invented 899/1499/1899
333
- * for it, interpolated from its neighbours.
334
- * category-metal-face-bolts raikages prices rings, wheels, tracks and
335
- * category-burst-chips-armour tips — not face bolts, chips or armour.
336
- * category-anime-scale-1-6 No 1/6 measurement. S.H.Figuarts (n=25)
337
- * is a 1/12 line and is not a substitute.
338
- * category-anime-nendoroid-chibi No band. Good Smile's n=17 in the crawl
339
- * is a TAG COUNT, not a price sample.
340
- * category-comic-dc No DC band at all.
341
- * category-game-* Three leaves, no franchise-level bands.
342
- * the TCG expansion-set leaves Booster pack / box / ETB are a FORMAT
343
- * axis (the `tcg-format` feature group),
344
- * and a set leaf holds all of them mixed.
345
- * No single band describes it honestly.
346
- * the Gunpla grade leaves No model-kit pricing in any of the
347
- * fifteen crawls.
348
- * category-hw-multipacks children No multipack band.
349
- * the accessory leaves No band for cases, tools or counters.
350
- * the living-collectibles leaves Not a market we crawled, and would not
351
- * want a competitor-derived band for.
352
- */
353
- };
354
- export function marketBand(leafId) {
355
- const b = MARKET_BANDS[leafId];
356
- if (!b)
357
- return undefined;
358
- return {
359
- currency: "INR",
360
- market: {
361
- median: b.median,
362
- ...(b.p25 == null ? {} : { p25: b.p25 }),
363
- ...(b.p75 == null ? {} : { p75: b.p75 }),
364
- ...(b.n == null ? {} : { sampleSize: b.n }),
365
- asOf: CRAWL_AS_OF,
366
- /*
367
- * Measured across the five largest competitors: 92.8 / 88.5 / 87.0 /
368
- * 81.1 / 76.0% of their listings are sold out. Carried so the seller
369
- * hint can say "this is a typical ASK, and most asks at this level do
370
- * not convert" rather than presenting it as a clearing price.
371
- */
372
- soldOutShare: 0.85,
373
- source: b.src,
374
- },
375
- };
376
- }
377
- /** Every leaf id this map claims a band for — the seed asserts they all exist. */
378
- export const MARKET_BAND_LEAF_IDS = Object.keys(MARKET_BANDS);
379
- // ─────────────────────────────────────────────────────────────────────────────
380
- // Per-vertical productDefaults
381
- //
382
- // 🛑 taxCodeId, not gstRate/hsnCode. The reference is for AUTHORING; the
383
- // scalars are resolved onto the PRODUCT by `deriveTaxonomy` and snapshotted
384
- // again onto the order item. Without that layering, editing a tax code
385
- // would retroactively re-rate an invoice already issued.
386
- // ─────────────────────────────────────────────────────────────────────────────
387
- const TAX_TOY = "tax-hsn-95030020"; // non-electronic toys incl. spinning tops — 5%
388
- const TAX_TOY_OTHER = "tax-hsn-95030099"; // other toys — 5%
389
- const TAX_EXEMPT = "tax-exempt-0";
390
- /**
391
- * B6 — the ROOT-LEVEL tax fallback, one per root.
392
- *
393
- * 🛑 Measured 2026-10-12: the tax code sat on tiers 1–3 only (t1=4, t2=47,
394
- * t3=71) and on NO root, so **3 of 70 live products resolved no tax code at
395
- * all** and would have fallen to `DEFAULT_GST_RATE` — a listing filed at
396
- * `category-spinning-tops`, `category-burst-tops` or `category-x-tops`.
397
- *
398
- * C0c's own rule is that reaching that constant is a TRIAGE SIGNAL, not a
399
- * feature: "a listing reaching step 3 at all means its category has no tax
400
- * code — and that, not the constant, is the defect to fix. The measure of
401
- * success is that step 3 fires for nothing."
402
- *
403
- * Putting it at the root is what makes that true for every branch, including
404
- * branches nobody has filed under yet — `resolveCategoryDefaults` walks the
405
- * chain nearest-first, so a tier-2 or tier-3 entry still WINS as a
406
- * more-specific override. This is a floor, not a replacement.
407
- *
408
- * 🛑 Deliberately NOT a single shared constant. Each root is a different HSN
409
- * question and a wrong HSN on a real invoice is worse than an absent one —
410
- * printed cards are chapter 4911, not 9503, and a live plant is exempt. Only
411
- * 9503 was verified (section 3.2); the three non-9503 roots therefore take the
412
- * closest VERIFIED code rather than an unverified guess, and say so.
413
- */
414
- export const ROOT_AUTHENTICITY_DEFAULT = "unverified";
415
- export const ROOT_TAX_DEFAULTS = {
416
- // Verified: HSN 9503 0020 — non-electronic toys including spinning tops, 5%.
417
- "category-spinning-tops": { taxCodeId: TAX_TOY },
418
- // Verified: HSN 9503 0099 — "other toys", 5%. A built model kit and a
419
- // die-cast car are both toys under 9503; neither is a spinning top.
420
- "category-hot-wheels": { taxCodeId: TAX_TOY_OTHER },
421
- "category-model-kits": { taxCodeId: TAX_TOY_OTHER },
422
- "category-collectible-figures": { taxCodeId: TAX_TOY_OTHER },
423
- /*
424
- * 🛑 Trading cards are chapter 4911 (printed matter) or 9504 (playing cards)
425
- * and NEITHER was verified — section 3.2 confirmed 9503 only, and § "Still
426
- * open" records "verify each before seeding; 9503 is the only one I
427
- * confirmed". `9503 0099` is used as the floor because a TCG single sold as
428
- * a collectible is a toy-chapter good at the same 5% rate, so the RATE is
429
- * right even where the chapter may not be. It must be re-chaptered before
430
- * the first real TCG invoice, and that is a data task with a source, not a
431
- * guess to make here.
432
- */
433
- "category-trading-cards": { taxCodeId: TAX_TOY_OTHER },
434
- // A live plant or animal is nil-rated — a deliberate exemption, which is
435
- // exactly why `gstRate: 0` must survive derivation rather than be "corrected".
436
- "category-living-collectibles": { taxCodeId: TAX_EXEMPT },
437
- };
438
- /** Shared across every Beyblade-family node. */
439
- const BEY_FAQ_TEMPLATES = [
440
- {
441
- question: "Is {{title}} an original {{brand}} release?",
442
- answer: "The authenticity of every listing is stated on the listing itself — original, reproduction, or unverified. A reproduction is an unlicensed copy with no manufacturer's marque and is always labelled as one; it is not the same thing as a counterfeit sold as genuine.",
443
- },
444
- {
445
- question: "What condition is {{title}} in?",
446
- answer: "This listing is graded {{condition}}, and the photographs are of the actual item rather than a stock image. Structural damage — a chip, a crack, a stripped tooth — is called out in the description and photographed.",
447
- },
448
- {
449
- question: "Does {{title}} include a launcher?",
450
- answer: "Only if the description says so. Starter releases include a launcher and ripcord; booster releases are top-only. Where a used listing is involved, what is pictured is what ships.",
451
- },
452
- {
453
- question: "Can I return {{title}} if it is not as described?",
454
- answer: "Yes. A listing that misrepresents condition or authenticity is covered by buyer protection, and the return window opens from delivery. Report the listing as well as opening the return — a misdescribed reproduction is a listing problem, not just an order problem.",
455
- },
456
- ];
457
- const SPEC = (name, value, unit) => unit ? { name, value, unit } : { name, value };
458
- /** A complete top. */
459
- export function beyDefaults(leafId, series, system) {
460
- return {
461
- taxCodeId: TAX_TOY,
462
- specifications: [SPEC("Series", series), SPEC("System", system)],
463
- inTheBox: ["Beyblade top", "Manual (where supplied)"],
464
- defaultAuthenticity: "unverified",
465
- priceGuidance: marketBand(leafId),
466
- seoTitleTemplate: "{{title}} — {{series}} | {{siteName}}",
467
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} {{category}}, from a verified seller on {{siteName}}. Condition {{condition}}, authenticity stated, buyer protection on every order.",
468
- seoKeywords: ["beyblade", series.toLowerCase()],
469
- weightG: 120,
470
- dimensionsCm: { l: 12, w: 10, h: 6 },
471
- fragile: false,
472
- faqTemplates: BEY_FAQ_TEMPLATES,
473
- };
474
- }
475
- /** A loose component. */
476
- export function partDefaults(leafId, partKind) {
477
- return {
478
- taxCodeId: TAX_TOY,
479
- specifications: [SPEC("Part type", partKind)],
480
- inTheBox: [`${partKind} only — no complete top`],
481
- defaultAuthenticity: "unverified",
482
- priceGuidance: marketBand(leafId),
483
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
484
- seoDescriptionTemplate: "Buy {{title}}, a loose {{category}} for custom builds, on {{siteName}}. Condition {{condition}}, sold as pictured.",
485
- seoKeywords: ["beyblade parts", partKind.toLowerCase()],
486
- weightG: 25,
487
- dimensionsCm: { l: 8, w: 6, h: 3 },
488
- fragile: false,
489
- /*
490
- * A part listing answers a different question from a complete top: the
491
- * buyer already owns a bey and wants to know whether this fits it. So the
492
- * first FAQ is compatibility, not authenticity — which is also the single
493
- * most common pre-purchase question on used-part listings.
494
- */
495
- faqTemplates: [
496
- {
497
- question: "Will {{title}} fit my Beyblade?",
498
- answer: "Parts are compatible within a generation, not across them. A {{series}} component fits other {{series}} tops; it will not fit a different generation's system, because each generation uses its own locking geometry.",
499
- },
500
- BEY_FAQ_TEMPLATES[1],
501
- BEY_FAQ_TEMPLATES[3],
502
- ],
503
- };
504
- }
505
- export function launcherDefaults(leafId, series) {
506
- return {
507
- taxCodeId: TAX_TOY,
508
- specifications: [SPEC("Series", series), SPEC("Accessory type", "Launcher")],
509
- inTheBox: ["Launcher", "Ripcord or winder (where supplied)"],
510
- defaultAuthenticity: "unverified",
511
- priceGuidance: marketBand(leafId),
512
- seoTitleTemplate: "{{title}} — {{series}} launcher | {{siteName}}",
513
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} launcher, on {{siteName}}. Condition {{condition}}, tested where the seller states so.",
514
- seoKeywords: ["beyblade launcher", series.toLowerCase()],
515
- weightG: 90,
516
- dimensionsCm: { l: 16, w: 10, h: 4 },
517
- fragile: false,
518
- faqTemplates: [
519
- {
520
- question: "Which Beyblades does {{title}} launch?",
521
- answer: "A {{series}} launcher drives {{series}} tops. Launchers are not interchangeable across generations — the ripcord, the prongs and the lock all changed between them.",
522
- },
523
- {
524
- question: "Is the ripcord included with {{title}}?",
525
- answer: "Check the description. A ripcord is a wear part and is frequently sold separately or replaced; where one is included the listing says so and it is in the photographs.",
526
- },
527
- BEY_FAQ_TEMPLATES[1],
528
- ],
529
- };
530
- }
531
- export function stadiumDefaults(leafId, series) {
532
- return {
533
- taxCodeId: TAX_TOY,
534
- specifications: [SPEC("Series", series), SPEC("Accessory type", "Stadium")],
535
- inTheBox: ["Stadium", "Assembly parts where the design requires them"],
536
- defaultAuthenticity: "unverified",
537
- priceGuidance: marketBand(leafId),
538
- seoTitleTemplate: "{{title}} — {{series}} stadium | {{siteName}}",
539
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} Beyblade stadium, on {{siteName}}. Condition {{condition}}, dimensions and compatibility in the description.",
540
- seoKeywords: ["beyblade stadium", "beystadium", series.toLowerCase()],
541
- /*
542
- * 🛑 Stadiums are the one Beyblade node where shipping actually bites — a
543
- * ~35 cm dish is volumetric freight, not a 120 g parcel. The weight and
544
- * dimensions here are what a courier rate is computed from, so getting
545
- * them wrong under-quotes every stadium listing.
546
- */
547
- weightG: 900,
548
- dimensionsCm: { l: 40, w: 40, h: 12 },
549
- fragile: true,
550
- faqTemplates: [
551
- {
552
- question: "Can I use {{title}} with every Beyblade generation?",
553
- answer: "Mostly. Round stadiums handle Original, Metal Fight and Burst play. Beyblade X's Xtreme Line stadiums add a rail feature X tops are designed around, so serious X play wants an X-format stadium rather than a round one.",
554
- },
555
- {
556
- question: "Does {{title}} ship assembled?",
557
- answer: "A stadium ships flat or in its original packaging wherever the design allows it, because a rigid dish is volumetric freight. Any assembly required is noted in the description.",
558
- },
559
- BEY_FAQ_TEMPLATES[1],
560
- ],
561
- };
562
- }
563
- export function tcgDefaults(leafId, game, format) {
564
- return {
565
- /*
566
- * Chapter 9504 (playing cards) is the likelier correct HSN for a TCG
567
- * single and it is deliberately NOT seeded: its current rate is
568
- * UNVERIFIED, and a wrong HSN on a real invoice is worse than a
569
- * conservative one. 9503 0099 ("other toys", 5%) is the rate the Indian
570
- * hobby trade actually invoices sealed product at, and it is the one
571
- * chapter here that was confirmed. Revisit when 9504 is verified.
572
- */
573
- taxCodeId: TAX_TOY_OTHER,
574
- specifications: [SPEC("Game", game), SPEC("Format", format)],
575
- defaultAuthenticity: "unverified",
576
- priceGuidance: marketBand(leafId),
577
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
578
- seoDescriptionTemplate: "Buy {{title}}, a {{categoryPath}} listing on {{siteName}}. Condition {{condition}}, language and print run stated on the listing.",
579
- seoKeywords: [game.toLowerCase(), "trading cards", format.toLowerCase()],
580
- weightG: format === "Sealed" ? 450 : 15,
581
- dimensionsCm: format === "Sealed" ? { l: 20, w: 15, h: 10 } : { l: 10, w: 7, h: 1 },
582
- fragile: false,
583
- /*
584
- * The tcgindia model — five templated FAQs per product, three of which
585
- * interpolate the name. Nobody else in the crawl of fifteen does it, and
586
- * it is the cheapest structured-data win available to us.
587
- */
588
- faqTemplates: [
589
- {
590
- question: "Is {{title}} authentic?",
591
- answer: "Yes. Cards and sealed product listed here come from verified sellers, and a listing that misrepresents authenticity is covered by buyer protection. Language and print run are stated because a Japanese print and an English print of the same card are different products.",
592
- },
593
- {
594
- question: "Is {{title}} sealed?",
595
- answer: "The listing states it. Sealed product is unopened and factory-wrapped; a single is an individual card whose condition is graded on the listing.",
596
- },
597
- {
598
- question: "Can I request {{title}} if it is out of stock?",
599
- answer: "Yes — add it to your wishlist and you will be notified when a seller lists it again. Sold listings stay visible here on purpose, so you can see what has been available and at what price.",
600
- },
601
- {
602
- question: "Are specific pulls guaranteed from {{title}}?",
603
- answer: "No. Sealed product is random by design and no seller here guarantees a particular card from a pack or box. Any listing claiming a guaranteed pull from sealed product should be reported.",
604
- },
605
- {
606
- question: "Can I return {{title}}?",
607
- answer: "A misdescribed card or a damaged delivery is returnable within the stated window. Opened sealed product is not returnable on the basis of what was inside it, for the reason above.",
608
- },
609
- ],
610
- };
611
- }
612
- export function figureDefaults(leafId, scaleOrLine) {
613
- return {
614
- taxCodeId: TAX_TOY_OTHER,
615
- specifications: [SPEC("Scale / line", scaleOrLine)],
616
- inTheBox: ["Figure", "Stand and accessories as supplied by the maker"],
617
- defaultAuthenticity: "unverified",
618
- priceGuidance: marketBand(leafId),
619
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
620
- seoDescriptionTemplate: "Buy {{title}}, a {{category}} collectible figure, on {{siteName}}. Condition {{condition}}, box state stated, buyer protection on every order.",
621
- seoKeywords: ["collectible figure", "anime figure", scaleOrLine.toLowerCase()],
622
- weightG: 700,
623
- dimensionsCm: { l: 30, w: 20, h: 20 },
624
- /*
625
- * PVC at scale is genuinely fragile — a 1/7 figure has thin painted
626
- * extremities and the box is part of the value. This is the one vertical
627
- * where `fragile` drives packaging instructions rather than being advisory.
628
- */
629
- fragile: true,
630
- faqTemplates: [
631
- {
632
- question: "Is {{title}} an authentic {{brand}} figure?",
633
- answer: "Authenticity is stated on the listing. Bootleg figures are common at scale and are identified by paint quality, seam finish and box printing — a seller listing a bootleg must label it as a reproduction.",
634
- },
635
- {
636
- question: "What condition is the box of {{title}} in?",
637
- answer: "Box condition is called out separately from figure condition, because for a collectible figure the two are priced differently. A \"without box\" listing says so in its title.",
638
- },
639
- BEY_FAQ_TEMPLATES[3],
640
- ],
641
- };
642
- }
643
- export function diecastDefaults(leafId, line) {
644
- return {
645
- taxCodeId: TAX_TOY,
646
- specifications: [SPEC("Line", line), SPEC("Scale", "1:64")],
647
- inTheBox: ["Die-cast model on its original card where carded"],
648
- defaultAuthenticity: "unverified",
649
- priceGuidance: marketBand(leafId),
650
- seoTitleTemplate: "{{title}} — Hot Wheels {{category}} | {{siteName}}",
651
- seoDescriptionTemplate: "Buy {{title}}, a Hot Wheels {{category}} die-cast, on {{siteName}}. Card condition stated; chase variants identified on the listing.",
652
- seoKeywords: ["hot wheels", "diecast", "1:64", line.toLowerCase()],
653
- weightG: 60,
654
- dimensionsCm: { l: 17, w: 9, h: 4 },
655
- fragile: false,
656
- faqTemplates: [
657
- {
658
- question: "Is {{title}} a Treasure Hunt?",
659
- answer: "Chase variants are identified on the listing itself, not inferred. A Treasure Hunt carries the flame circle logo; a Super Treasure Hunt additionally has Real Riders rubber tyres and Spectraflame paint. A listing that claims a chase without showing it should be reported.",
660
- },
661
- {
662
- question: "Is the card for {{title}} in good condition?",
663
- answer: "Card condition is graded separately from the car, because carded collectors price it separately. Creases, bends and blister clouding are photographed where present.",
664
- },
665
- {
666
- question: "Is {{title}} an Indian-card release?",
667
- answer: "Where it is, the listing says so. The Indian-market blister card differs from the US one and collectors here price the two differently, so it is called out rather than left for the buyer to spot.",
668
- },
669
- ],
670
- };
671
- }
672
- const TAX_TOY_ELECTRONIC = "tax-hsn-95030010"; // electronic toys — 18%
673
- /**
674
- * 🛑 THE ONLY 18% BRANCH IN THE CATALOGUE, and it is derived rather than
675
- * hand-written on a product.
676
- *
677
- * `tax-hsn-95030010` (electronic toys, 18%) has existed as a `taxCodes` row
678
- * since B3 with **nothing referencing it** — so the 18% arm of `calculateGst`
679
- * and every mixed-rate path (C0c defect 4's `gstByRate`, the per-rate invoice
680
- * table, the blended-rate payout) had no data that could exercise it. A code
681
- * with no referrer is the vocabulary-with-no-rows shape of Root Cause #90.
682
- *
683
- * Counters and BeyPointers are battery-powered scoring devices, which is what
684
- * 9503 0010 covers — so this is the honest home for it, not a flag planted on
685
- * an arbitrary row. Putting it on the CATEGORY rather than on a product means
686
- * the 18% is proven through `deriveTaxonomy`, i.e. through the mechanism that
687
- * will actually carry it in production, instead of through a literal that
688
- * would pass while the derivation stayed untested.
689
- */
690
- const ELECTRONIC_ACCESSORY_LEAVES = new Set(["category-accessory-counters"]);
691
- export function accessoryDefaults(leafId, kind) {
692
- return {
693
- taxCodeId: ELECTRONIC_ACCESSORY_LEAVES.has(leafId) ? TAX_TOY_ELECTRONIC : TAX_TOY_OTHER,
694
- specifications: [SPEC("Accessory type", kind)],
695
- defaultAuthenticity: "unverified",
696
- priceGuidance: marketBand(leafId),
697
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
698
- seoDescriptionTemplate: "Buy {{title}}, a {{category}}, on {{siteName}}. Condition {{condition}}, capacity and dimensions in the description.",
699
- seoKeywords: [kind.toLowerCase(), "collectible accessories"],
700
- weightG: 400,
701
- dimensionsCm: { l: 28, w: 20, h: 8 },
702
- fragile: false,
703
- faqTemplates: [
704
- {
705
- question: "What fits in {{title}}?",
706
- answer: "Capacity is in the description. Storage designed for complete tops and storage designed for loose parts are different products, and the listing states which this is.",
707
- },
708
- BEY_FAQ_TEMPLATES[1],
709
- ],
710
- };
711
- }
712
- /** Live animals and plants — exempt, and nothing about them is a toy. */
713
- export function livingDefaults() {
714
- return {
715
- taxCodeId: TAX_EXEMPT,
716
- defaultAuthenticity: "original",
717
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
718
- seoDescriptionTemplate: "{{title}}, a {{category}} listing from a verified seller on {{siteName}}. Species, age and provenance disclosed; jurisdiction checked before payment.",
719
- fragile: true,
720
- faqTemplates: [
721
- {
722
- question: "Can {{title}} be shipped to me?",
723
- answer: "The jurisdiction check runs at checkout, before payment rather than after. Most live listings are local-collection only and the listing states the collection area; where courier transport is lawful and appropriate the seller arranges a specialist live service.",
724
- },
725
- {
726
- question: "What welfare information comes with {{title}}?",
727
- answer: "Species, age, sex where known, and provenance are recorded on the listing, and a seller must be verified before any live listing goes public.",
728
- },
729
- ],
730
- };
731
- }