@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
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Section, Container, Stack, Row, Div, Heading, Text, Span, TextLink, Anchor, Badge, } from "../../../ui/index.js";
3
+ import { SpecTable } from "../../../ui/components/SpecTable.js";
4
+ import { ROUTES } from "../../../next/routing/route-map.js";
5
+ import { PART_SLOT_LABEL } from "../../parts/schemas/firestore.js";
6
+ import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
7
+ /**
8
+ * The rating axes, in a fixed order.
9
+ *
10
+ * 🛑 ORDERED EXPLICITLY, never by `Object.keys`. Firestore returns map fields
11
+ * alphabetically, which would put "burst" and "dash" above "attack" and
12
+ * reorder the table per bey depending on which axes it happens to carry — so
13
+ * two beys could not be compared row against row.
14
+ */
15
+ const RATING_AXES = [
16
+ { key: "attack", label: "Attack" },
17
+ { key: "defense", label: "Defense" },
18
+ { key: "stamina", label: "Stamina" },
19
+ { key: "weight", label: "Weight" },
20
+ { key: "speed", label: "Speed" },
21
+ { key: "burst", label: "Burst" },
22
+ { key: "burstResistance", label: "Burst resistance" },
23
+ { key: "dash", label: "Dash" },
24
+ { key: "power", label: "Power" },
25
+ { key: "height", label: "Height" },
26
+ { key: "runTime", label: "Run time" },
27
+ ];
28
+ export function BeyDetailPageView({ bey, products, listings, listingsTruncated, allListingsHref, hrefForPart, categoryHref, hrefForCharacter, }) {
29
+ /*
30
+ * ── THE SPEC TABLE ────────────────────────────────────────────────────────
31
+ *
32
+ * Only what the source states. 🛑 A row is omitted when the fact is absent
33
+ * rather than rendered with an em-dash: "Element —" would claim we looked it
34
+ * up and found none, and `element` is on 45 of 1,988 beys precisely because
35
+ * it is a Beyblade-X-only attribute, not missing data.
36
+ */
37
+ const specRows = [
38
+ ...(bey.type ? [{ name: "Type", value: bey.type }] : []),
39
+ ...(bey.spinDirection ? [{ name: "Spin", value: bey.spinDirection }] : []),
40
+ ...(bey.system ? [{ name: "System", value: bey.system }] : []),
41
+ ...(bey.series ? [{ name: "Series", value: bey.series }] : []),
42
+ ...(bey.element ? [{ name: "Element", value: bey.element }] : []),
43
+ /*
44
+ * 🛑 MASS: the stated figure wins, and a SUMMED one is labelled as summed
45
+ * and marked approximate when the parts are only partly weighed. Printing
46
+ * a partial sum as a plain total is the one thing this must not do — the
47
+ * generator deliberately refuses to scale it up for the same reason.
48
+ */
49
+ ...(typeof bey.weightG === "number"
50
+ ? [{ name: "Weight", value: String(bey.weightG), unit: "g" }]
51
+ : typeof bey.weightGFromParts === "number"
52
+ ? [
53
+ {
54
+ name: "Weight",
55
+ value: String(bey.weightGFromParts),
56
+ unit: bey.weightGFromPartsCoverage?.complete
57
+ ? "g (summed from parts)"
58
+ : `g (from ${bey.weightGFromPartsCoverage?.weighed ?? 0} of ` +
59
+ `${bey.weightGFromPartsCoverage?.total ?? 0} parts)`,
60
+ approximate: !bey.weightGFromPartsCoverage?.complete,
61
+ },
62
+ ]
63
+ : []),
64
+ ...(bey.productCodes?.length
65
+ ? [{ name: bey.productCodes.length > 1 ? "Product codes" : "Product code", value: bey.productCodes.join(" · ") }]
66
+ : []),
67
+ ...(bey.releaseJP ? [{ name: "Released (JP)", value: bey.releaseJP }] : []),
68
+ ...(bey.releaseUS ? [{ name: "Released (US)", value: bey.releaseUS }] : []),
69
+ ...(bey.jpName ? [{ name: "Japanese name", value: bey.jpName }] : []),
70
+ ...(bey.romaji ? [{ name: "Romaji", value: bey.romaji }] : []),
71
+ ...(bey.creator ? [{ name: "Creator", value: bey.creator }] : []),
72
+ ];
73
+ const ratings = bey.ratingsFromParts ?? null;
74
+ const ratingRows = ratings
75
+ ? RATING_AXES.map((a) => ({ ...a, value: ratings[a.key] })).filter((r) => typeof r.value === "number")
76
+ : [];
77
+ const composition = bey.composition ?? [];
78
+ const aliases = (bey.aka ?? []).filter((a) => a && a !== bey.name);
79
+ return (_jsx(Section, { padding: "y-lg", children: _jsx(Container, { size: "lg", children: _jsxs(Stack, { gap: "lg", className: "min-w-0", children: [_jsxs(Stack, { gap: "xs", className: "min-w-0", children: [categoryHref && (_jsx(Text, { size: "sm", color: "muted", children: _jsx(TextLink, { href: categoryHref, children: "Listings for this model" }) })), _jsx(Heading, { level: 1, children: bey.name }), _jsx(RecordOwnerQuickActions, { resource: "BEY", recordId: bey.id, placement: "detail", recordLabel: bey.name }), _jsxs(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: [bey.type && _jsx(Badge, { variant: "info", children: bey.type }), bey.spinDirection && _jsx(Badge, { variant: "default", children: bey.spinDirection }), bey.system && _jsx(Badge, { variant: "secondary", children: bey.system })] }), aliases.length > 0 && (_jsxs(Text, { size: "sm", color: "muted", children: ["Also known as: ", aliases.join(" · ")] }))] }), composition.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Parts" }), _jsx(Stack, { gap: "xs", className: "min-w-0", children: composition.map((c, i) => {
80
+ const href = c.partId ? hrefForPart(c.partId) : null;
81
+ const label = PART_SLOT_LABEL[c.slot] ?? c.slot;
82
+ return (_jsxs(Row, { gap: "md", align: "center", className: "min-w-0", children: [_jsx(Text, { size: "sm", color: "muted", className: "w-36 flex-shrink-0", children: label }), href ? (_jsx(TextLink, { href: href, children: c.partName })) : (_jsx(Span, { children: c.partName }))] }, `${c.slot}-${c.partName}-${i}`));
83
+ }) })] })), ratingRows.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Ratings" }), _jsx(SpecTable, { rows: ratingRows.map((r) => ({ name: r.label, value: String(r.value) })) }), _jsxs(Text, { size: "xs", color: "faint", children: ["Averaged from this bey\u2019s parts and rescaled to 0\u2013100 for comparison across generations", bey.ratingsFromPartsCoverage
84
+ ? `; from ${bey.ratingsFromPartsCoverage.rated ?? 0} of ` +
85
+ `${bey.ratingsFromPartsCoverage.total} parts`
86
+ : "", "."] })] })), bey.modes?.length ? (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Modes" }), _jsx(Stack, { gap: "md", className: "min-w-0", children: bey.modes.map((mode) => (_jsxs(Stack, { gap: "xs", className: "min-w-0", children: [_jsxs(Row, { gap: "sm", align: "center", wrap: true, className: "min-w-0", children: [_jsx(Text, { weight: "semibold", children: mode.name }), _jsx(Text, { size: "xs", color: "muted", children: mode.switchKind === "speed" || mode.switchKind === "impact"
87
+ ? "changes on its own"
88
+ : "set before launch" })] }), _jsx(Text, { size: "sm", children: mode.behaviour }), _jsx(Text, { size: "sm", color: "muted", children: mode.trigger })] }, mode.name))) })] })) : null, (bey.ownerNames?.length || bey.specialMoves?.length || bey.appearAnime) && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "In the anime" }), _jsx(SpecTable, { rows: [
89
+ ...(bey.ownerNames?.length
90
+ ? [{ name: "Used by", value: bey.ownerNames.join(" · ") }]
91
+ : []),
92
+ ...(bey.appearAnime ? [{ name: "First appearance", value: bey.appearAnime }] : []),
93
+ ...(bey.appearManga ? [{ name: "In the manga", value: bey.appearManga }] : []),
94
+ ...(bey.specialMoves?.length
95
+ ? [{ name: "Special moves", value: bey.specialMoves.join(" · ") }]
96
+ : []),
97
+ ] }), hrefForCharacter && (bey.ownerCharacters?.length ?? 0) > 0 && (_jsx(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: bey.ownerCharacters.map((slug) => (_jsx(TextLink, { href: hrefForCharacter(slug), children: slug.replace(/-/g, " ") }, slug))) }))] })), specRows.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Specifications" }), _jsx(SpecTable, { rows: specRows })] })), products.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Found in" }), _jsx(Stack, { gap: "xs", className: "min-w-0", children: products.map((p) => (_jsxs(Row, { gap: "md", align: "center", className: "min-w-0", children: [_jsx(Span, { children: p.name }), p.productType && (_jsx(Text, { size: "xs", color: "muted", children: p.productType }))] }, p.id))) })] })), _jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: listings.length > 0 ? "Currently listed" : "Listings" }), listings.length === 0 ? (_jsx(Text, { color: "muted", size: "sm", children: "Nothing matching this model is listed right now." })) : (_jsx(Stack, { gap: "xs", className: "min-w-0", children: listings.map((l) => (_jsxs(Row, { gap: "md", align: "center", className: "min-w-0", children: [_jsx(TextLink, { href: l.href, children: l.title }), l.condition && (_jsx(Text, { size: "xs", color: "muted", children: l.condition }))] }, l.id))) })), _jsx(Text, { size: "sm", children: _jsx(TextLink, { href: allListingsHref, children: listingsTruncated ? "See all listings" : "Search listings for this model" }) })] }), _jsx(Div, { children: _jsxs(Text, { size: "xs", color: "faint", children: ["Facts on this page are drawn from a community wiki under CC\u00A0BY-SA.", " ", _jsx(Anchor, { href: bey.sourceUrl, tone: "muted", underline: "always", children: "Source" }), bey.wboThreadUrl ? (_jsxs(_Fragment, { children: [" · ", _jsx(Anchor, { href: bey.wboThreadUrl, tone: "muted", underline: "always", children: "Community discussion" })] })) : null, " · ", _jsx(TextLink, { href: String(ROUTES.PUBLIC.CREDITS), children: "Credits" })] }) })] }) }) }));
98
+ }
@@ -0,0 +1,417 @@
1
+ /**
2
+ * The `beys` and `beyProducts` collections — the BEY reference database.
3
+ *
4
+ * Extracted from a crawled corpus by committed scripts and generated into the
5
+ * seed; nothing here is hand-typed. 1,988 beys and 366 products.
6
+ *
7
+ * ── 🛑 WHY THIS MIRRORS `partGlossary` RATHER THAN INVENTING A SHAPE ───────
8
+ *
9
+ * Parts already do all three halves of this and have for months: a
10
+ * `partGlossary` collection, a category leaf per part, and a
11
+ * `/parts/{classification}/{code}` reference page. Beys get the same three,
12
+ * so every decision that was already argued out there is inherited rather
13
+ * than re-litigated:
14
+ *
15
+ * · the ID IS THE SLUG, shared with the category leaf (`category-{slug}`),
16
+ * because one key across two collections is what keeps a reference page
17
+ * and a commerce shelf pointing at the same thing;
18
+ * · measured data lives HERE, not on `categories`, because
19
+ * `handleCategoryWrite` calls `notifyRevalidate` unconditionally — so a
20
+ * reseed of bey facts would drop every bey page's ISR entry on a project
21
+ * that has already been paused at 15.5x its ISR cap;
22
+ * · and a bey page is a REFERENCE surface, so it carries no money. Prices
23
+ * are gated for signed-out visitors, which would make the page a client
24
+ * component (see `PartDetailPageView`'s header).
25
+ *
26
+ * ── 🛑 NO `searchTxt` FIELD, DELIBERATELY ─────────────────────────────────
27
+ *
28
+ * `partGlossary` had one and it was REMOVED; the collection is declared
29
+ * `INDEX_ARTIFACT_ONLY` in `audit-searchtxt-migration`, whose rule is that a
30
+ * member must not declare the field. Beys are the same kind of collection —
31
+ * discovery happens through the category leaf, which has its own `searchTxt`
32
+ * built from the leaf's name and aliases.
33
+ */
34
+ import type { AdminEditableRecord } from "../../parts/schemas/admin-edit";
35
+ import type { BaseDocument } from "../../../_internal/shared/types/base-document";
36
+ export declare const BEYS_COLLECTION: "beys";
37
+ export declare const BEY_PRODUCTS_COLLECTION: "beyProducts";
38
+ /**
39
+ * One slot of a bey's build.
40
+ *
41
+ * 🛑 `partName` is kept EVEN WHEN `partId` resolves, and that is not
42
+ * redundancy. The join reaches 88.9% of 7,688 links, so ~850 entries name a
43
+ * part we hold no row for — and a slot that renders nothing reads as a bey
44
+ * with an incomplete build rather than as a missing part page. The name is
45
+ * what the source stated; the id is what we managed to resolve.
46
+ */
47
+ export interface BeyCompositionEntry {
48
+ /** Our canonical slot key — `fusion-wheel`, `performance-tip`, `driver`. */
49
+ slot: string;
50
+ /** The part as the source names it, which is sometimes an abbreviation. */
51
+ partName: string;
52
+ /** `partGlossary` id, when the name or one of its aliases resolved. */
53
+ partId?: string;
54
+ /**
55
+ * The raw infobox key this came from.
56
+ *
57
+ * 🛑 Load-bearing for Synchrome, where `WarriorWheel2=Behemoth` is the
58
+ * OTHER HALF of a two-wheel combination rather than a duplicate key to
59
+ * dedupe. Two entries can share a `slot` and still be distinct parts.
60
+ */
61
+ infoboxKey?: string;
62
+ }
63
+ /** The 0-100 rating vector. Same axes as `PartRatings`, same scale. */
64
+ export interface BeyRatings {
65
+ attack?: number;
66
+ defense?: number;
67
+ stamina?: number;
68
+ weight?: number;
69
+ speed?: number;
70
+ burst?: number;
71
+ burstResistance?: number;
72
+ dash?: number;
73
+ power?: number;
74
+ height?: number;
75
+ runTime?: number;
76
+ }
77
+ /**
78
+ * How much of a derived figure is actually measured.
79
+ *
80
+ * 🛑 This rides WITH every derived value and is not optional decoration. A
81
+ * vector built from 2 of 5 parts is a different claim from one built from 5 of
82
+ * 5, and a mass summed from 3 weighed parts out of 5 is a floor rather than a
83
+ * total. Without this a consumer cannot tell them apart, and the honest
84
+ * rendering ("≈", or nothing at all) becomes impossible.
85
+ */
86
+ export interface BeyDerivationCoverage {
87
+ /** Parts contributing a value. */
88
+ rated?: number;
89
+ weighed?: number;
90
+ /** Parts in the composition. */
91
+ total: number;
92
+ /** True only when every part contributed. */
93
+ complete?: boolean;
94
+ }
95
+ /**
96
+ * One configuration a bey can be set to, or settles into.
97
+ *
98
+ * ── 🛑 THERE IS NO THRESHOLD FIELD, AND THAT IS DELIBERATE ────────────────
99
+ *
100
+ * Mode data exists only in the local case-study corpus (the wiki carries ZERO:
101
+ * 0 `Modes=` fields across 2,248 part pages and 2,011 bey pages), and every
102
+ * numeric threshold cross-checked there DISAGREED across sources. Cosmic
103
+ * Pegasus F:D is documented twice with the transition running in opposite
104
+ * directions and three different thresholds between the two cases and the plan.
105
+ *
106
+ * So a `thresholdRadPerSec` does not exist here. A field that is absent cannot
107
+ * be filled with a contested number by someone who assumes the gap was an
108
+ * oversight — which is why this is a schema decision and not a convention.
109
+ *
110
+ * 🛑 `trigger` is FREE TEXT, not an enum. The three authored shapes are
111
+ * already a pre-launch setting, passive spin decay, and what surface the tip
112
+ * is running on — and a three-value enum written before the fourth case was
113
+ * read would have forced the next one into the wrong bucket.
114
+ */
115
+ /**
116
+ * How a mode is selected.
117
+ *
118
+ * ── 🛑 THIS ENUM IS THE OWNER'S TAXONOMY, NOT MY GUESS ────────────────────
119
+ *
120
+ * Owner, 2026-10-21: *"most mode switches are either flips, config 1, 2 or 3
121
+ * and more."* Everything beyond that set is a mode that changes WITHOUT the
122
+ * owner doing anything, and those divide cleanly by what drives them.
123
+ *
124
+ * I deliberately did NOT define this when the first four modes were authored,
125
+ * because at that point I had seen two kinds and an enum built from two would
126
+ * have forced the next two into the wrong value. It is defined now that the
127
+ * real set is known — which is the difference between a taxonomy and a guess.
128
+ */
129
+ export declare const BEY_MODE_SWITCH_KINDS: readonly ["flip", "config", "swap", "speed", "impact"];
130
+ export type BeyModeSwitchKind = (typeof BEY_MODE_SWITCH_KINDS)[number];
131
+ /** One configuration a bey can be set to, or settles into. */
132
+ export interface BeyMode {
133
+ /** "Attack", "Stamina", "Barrage". The part's own vocabulary where it has one. */
134
+ name: string;
135
+ /** What it does, in a sentence a buyer can read. No formulae. */
136
+ behaviour: string;
137
+ /**
138
+ * How it comes about, in prose. 🛑 Kept ALONGSIDE `switchKind` rather than
139
+ * replaced by it: the kind is what a filter or a game reads, the sentence is
140
+ * what a person reads, and "Assemble the wheel for six contact points" is
141
+ * not recoverable from `"config"`.
142
+ */
143
+ trigger: string;
144
+ /** Which of the six selection mechanisms this is. */
145
+ switchKind?: BeyModeSwitchKind;
146
+ /** 1-based, for `switchKind: "config"` / `"swap"`. */
147
+ configIndex?: number;
148
+ /**
149
+ * The part that provides the mode — a fusion wheel or a tip in every case
150
+ * confirmed so far.
151
+ *
152
+ * 🛑 Modes are authored against the PART and fanned out to every bey whose
153
+ * composition uses it, so one wheel is described once rather than copied per
154
+ * bey (Root Cause #75). This field keeps that origin visible on the bey, and
155
+ * is what would let a later pass lift modes onto `partGlossary` mechanically.
156
+ */
157
+ appliesToPart?: string;
158
+ /**
159
+ * A second part the mode depends on, when it is an ALIGNMENT between two.
160
+ *
161
+ * 🛑 Not every mode belongs to one part. Lightning and Meteo L-Drago change
162
+ * mode by how the energy ring's dragon heads line up with the wheel's teeth
163
+ * — a property of the PAIR. Without this the data would claim the wheel
164
+ * alone does it.
165
+ */
166
+ requiresPart?: string;
167
+ /**
168
+ * Who or what the claim rests on — `"owner-<date>"` for a confirmed one.
169
+ *
170
+ * 🛑 LOAD-BEARING, not metadata. The generator emits ONLY modes carrying
171
+ * this, because the case-study corpus's mode prose was wrong in four of four
172
+ * claims reviewed. See `scripts/lib/bey-modes-authored.mjs`.
173
+ */
174
+ confirmed?: string;
175
+ /** The case-study case number, where one was read. A claim nobody can trace is a claim nobody can correct. */
176
+ sourceCase?: number;
177
+ }
178
+ export interface BeyDocument extends BaseDocument, AdminEditableRecord {
179
+ /** `id === slug`, and the same slug the category leaf uses. */
180
+ id: string;
181
+ slug: string;
182
+ name: string;
183
+ /** Battle type as stated — `Attack`, `Balance`, `Defense`, `Stamina`. */
184
+ type?: string;
185
+ /** `Right-Spin` / `Left-Spin` / `Dual-Spin`. */
186
+ spinDirection?: string;
187
+ /**
188
+ * The hardware generation — `4D System`, `Hybrid Wheel System`, `Basic
189
+ * Line`. 1,893 of 1,988.
190
+ *
191
+ * 🛑 This is the within-generation assembly key. No bey can be built across
192
+ * generations, and Plastic and HMS do not interchange either, so a build
193
+ * validator needs it. It is also what files the bey under a forest line
194
+ * (`scripts/lib/bey-system-to-line.mjs`).
195
+ */
196
+ system?: string;
197
+ /** A second system, for the handful of releases that span two. */
198
+ system2?: string;
199
+ /** The retail series — `Beyblade Burst QuadStrike`. */
200
+ series?: string;
201
+ series2?: string;
202
+ /**
203
+ * The paired tier-4 category leaf — where this model's LISTINGS live.
204
+ *
205
+ * 🛑 NOT derivable from `slug`. The leaf id comes from the bey's NAME with
206
+ * the trailing parenthetical stripped, so `…-press-hasbro` pairs with
207
+ * `category-…-press`; guessing would 404 on every vendor-qualified bey.
208
+ * Resolved by the generator with the leaf generator's own helper and then
209
+ * CHECKED against the leaves it emitted, so this is present only when the
210
+ * page really exists — 116 beys have no leaf because their `system` is
211
+ * deliberately unmapped.
212
+ */
213
+ categoryId?: string;
214
+ /** The build, top to bottom. 1,911 of 1,988 carry one. */
215
+ composition?: BeyCompositionEntry[];
216
+ /**
217
+ * 🛑 DERIVED AND AVERAGED, never summed, and never the raw source numbers.
218
+ *
219
+ * Two rating scales live in the part data — Beyblade X rates 0-100 and
220
+ * everything before it rates 0-6 — so these are averaged over each part's
221
+ * NORMALISED vector. A sum would make a five-part bey look five times
222
+ * stronger than a three-part one, which is backwards: more parts is not
223
+ * more attack.
224
+ */
225
+ ratingsFromParts?: BeyRatings;
226
+ ratingsFromPartsCoverage?: BeyDerivationCoverage;
227
+ /**
228
+ * Configurations this bey can be set to. **4 of 1,988 carry this.**
229
+ *
230
+ * 🛑 ABSENT, NEVER `[]`. An empty array says "this bey has no modes" to
231
+ * every consumer; absent says "unknown", which is the truth for 1,984 of
232
+ * them. Do not default it, and do not treat its absence as a gap to fill
233
+ * mechanically — see `scripts/lib/bey-modes-authored.mjs` for what the
234
+ * corpus can and cannot support, including the one bey excluded because its
235
+ * two sources contradict each other outright.
236
+ *
237
+ * Most of the corpus's mode content is about PARTS, not beys (135 of 147
238
+ * candidates were part-level analyses), so the bulk of it belongs on
239
+ * `partGlossary` if it is ever modelled at all.
240
+ */
241
+ modes?: BeyMode[];
242
+ /** Mass as the source states it. Only 248 of 1,988 do. */
243
+ weightG?: number;
244
+ /**
245
+ * Mass SUMMED from the parts — 1,593 beys, 775 from a complete set.
246
+ *
247
+ * 🛑 A DIFFERENT KIND OF CLAIM from the ratings above, and the difference is
248
+ * why it is safe: mass is physically additive, so a sum is a measurement.
249
+ * Held-out validated against the 164 beys that state their own mass —
250
+ * median absolute error 0.00 g, 99% within 2 g.
251
+ *
252
+ * 🛑 Never scaled up from partial coverage. 3 of 5 parts weighed gives the
253
+ * mass of those three; inflating it by 5/3 would invent a figure that reads
254
+ * exactly like a measured one. And a stated `weightG` always wins.
255
+ */
256
+ weightGFromParts?: number;
257
+ weightGFromPartsCoverage?: BeyDerivationCoverage;
258
+ /** Box codes. `productCodes[0]` is the one printed on the box. */
259
+ productCodes?: string[];
260
+ /**
261
+ * Every other name this bey ships under — 1,327 of 1,988.
262
+ *
263
+ * 🛑 This is the Hasbro ↔ Takara-Tomy map, stated by the source rather than
264
+ * inferred: Valkyrie/Valtryek, Spriggan/Spryzen. It must NOT be used to
265
+ * merge two rows — `Dead` and `Dread` are two real Gatinko bases one
266
+ * character apart, so any name-similarity join on this corpus is
267
+ * disqualified.
268
+ */
269
+ aka?: string[];
270
+ jpName?: string;
271
+ romaji?: string;
272
+ kanjiName?: string;
273
+ krName?: string;
274
+ releaseJP?: string;
275
+ releaseUS?: string;
276
+ releaseCA?: string;
277
+ releaseKR?: string;
278
+ /** As stated, in the source's own currency and formatting. */
279
+ price?: string;
280
+ /** The owner string verbatim, qualifiers and all. */
281
+ owner?: string;
282
+ /** Each person named, cleaned and split. */
283
+ ownerNames?: string[];
284
+ /**
285
+ * Character slugs that resolved exactly — 661 of the 733 with an owner.
286
+ *
287
+ * 🛑 Resolved by stripping a stated qualifier and matching EXACTLY, never
288
+ * approximately. `owner` keeps the raw string because "(manga)" is a real
289
+ * distinction: that bey belongs to that character in the manga continuity
290
+ * only.
291
+ */
292
+ ownerCharacters?: string[];
293
+ creator?: string;
294
+ specialMoves?: string[];
295
+ /** First anime appearance, as the source names the episode. */
296
+ appearAnime?: string;
297
+ appearManga?: string;
298
+ animeDebut?: string;
299
+ /** Beyblade-X-only attribute. 45 of 1,988 — not worth a facet. */
300
+ element?: string;
301
+ avatar?: string;
302
+ toyline?: string;
303
+ /** Image filenames, resolved to `/media/<shortId>` at upload time. */
304
+ /**
305
+ * `lead` marks the one image to show first. Optional because a hand-written
306
+ * row may omit it and absent reads as false; the generator sets it on all
307
+ * 2,459 entries, so no reader is relying on the default today.
308
+ */
309
+ images?: {
310
+ file: string;
311
+ label?: string | null;
312
+ lead?: boolean;
313
+ }[];
314
+ /** Our own prose, composed from the facts above. */
315
+ seoDescription?: string;
316
+ /**
317
+ * The source page.
318
+ *
319
+ * 🛑 REQUIRED, and it must reach the UI. The corpus is CC-BY-SA, and the
320
+ * two things that keep us clear of share-alike are taking facts only and
321
+ * linking back. It was stored on ~5,500 rows and rendered on NONE of them
322
+ * until the credits work; storing it is not discharging the obligation.
323
+ */
324
+ sourceUrl: string;
325
+ /** How the row was obtained — `fandom-infobox`. */
326
+ source?: string;
327
+ /** Community discussion thread, where the source links one. */
328
+ wboThreadUrl?: string;
329
+ }
330
+ /** One assortment slot of a product — a bey a buyer might get. */
331
+ export interface BeyProductAssortmentEntry {
332
+ /** The bey as the source names it. */
333
+ bey: string;
334
+ /** Resolved `beys` id, when the name matched. */
335
+ beyId?: string;
336
+ /** A prize bey is not purchasable — it is drawn. */
337
+ isPrize?: boolean;
338
+ /** Stated pull odds, where the source gives them. */
339
+ odds?: string;
340
+ /**
341
+ * The manufacturer's per-item code within the assortment ("B-101 01"), where
342
+ * the source lists one. Distinct from the PRODUCT's own code: a random
343
+ * booster has one code and a different one per bey you can pull from it.
344
+ */
345
+ itemCode?: string;
346
+ /** This bey debuts in the set, rather than being a repackaged earlier release. */
347
+ newToSeries?: boolean;
348
+ }
349
+ /**
350
+ * One image in a product's gallery.
351
+ *
352
+ * `caption` is optional-AND-nullable, mirroring `BeyDocument.images[].label`
353
+ * beside it: the generator emits the key on all 1,457 entries and leaves 292
354
+ * of them `null`, while a hand-written row may simply omit it. Both are "no
355
+ * caption", and the type accepts both rather than forcing one spelling on a
356
+ * generator that already chose the other.
357
+ */
358
+ /** One line of a product's per-carton distribution table. */
359
+ export interface BeyProductCartonEntry {
360
+ /** The bey as the source names it — matches `BeyProductAssortmentEntry.bey`. */
361
+ bey: string;
362
+ /** How many of this bey ship in one sealed carton. */
363
+ perCarton: number;
364
+ }
365
+ export interface BeyProductGalleryImage {
366
+ /** Source filename, as the corpus names it — not a `/media/` slug yet. */
367
+ file: string;
368
+ caption?: string | null;
369
+ }
370
+ export interface BeyProductDocument extends BaseDocument {
371
+ id: string;
372
+ slug: string;
373
+ name: string;
374
+ /** `Random Booster`, `Battle Set`, `Starter`, `Stadium`. */
375
+ productType?: string;
376
+ productCodes?: string[];
377
+ price?: string;
378
+ releaseJP?: string;
379
+ jpName?: string;
380
+ romaji?: string;
381
+ /** What is in the box, or what can be pulled from it. */
382
+ assortment?: BeyProductAssortmentEntry[];
383
+ /**
384
+ * Every resolved `beys` id in `assortment`, flat.
385
+ *
386
+ * 🛑 A denormalised MIRROR of `assortment[].beyId`, and it exists for one
387
+ * reason: Firestore cannot `array-contains` a field nested inside objects
388
+ * in an array, so "which products contain this bey" is otherwise
389
+ * unanswerable. Derived by the generator in the same pass that resolves the
390
+ * ids — never hand-maintained, because a mirror somebody can edit
391
+ * independently is the drift in Root Cause #42.
392
+ */
393
+ assortmentBeyIds?: string[];
394
+ /**
395
+ * Per-carton distribution, on the 24 products whose source states one.
396
+ *
397
+ * 🛑 An ARRAY, not the `Record<string, string>` this was declared as. A map
398
+ * keyed on the bey name cannot hold two entries for the same name, and it
399
+ * loses the source's ordering — both of which the carton tables rely on.
400
+ * Measured across all 24: 137 entries, every one carrying both keys.
401
+ */
402
+ breakdown?: BeyProductCartonEntry[];
403
+ boxImage?: string;
404
+ gallery?: BeyProductGalleryImage[];
405
+ seoDescription?: string;
406
+ /** CC-BY-SA link-back — see `BeyDocument.sourceUrl`. */
407
+ sourceUrl: string;
408
+ source?: string;
409
+ }
410
+ /**
411
+ * The document id for a bey.
412
+ *
413
+ * 🛑 The ONE place this is composed, mirroring `partGlossaryId`. The id is
414
+ * also the slug, the public URL and a `searchTxt` source on the paired
415
+ * category leaf, so a second spelling of this rule is a second set of URLs.
416
+ */
417
+ export declare function beyId(slug: string): string;
@@ -0,0 +1,65 @@
1
+ export const BEYS_COLLECTION = "beys";
2
+ export const BEY_PRODUCTS_COLLECTION = "beyProducts";
3
+ /**
4
+ * One configuration a bey can be set to, or settles into.
5
+ *
6
+ * ── 🛑 THERE IS NO THRESHOLD FIELD, AND THAT IS DELIBERATE ────────────────
7
+ *
8
+ * Mode data exists only in the local case-study corpus (the wiki carries ZERO:
9
+ * 0 `Modes=` fields across 2,248 part pages and 2,011 bey pages), and every
10
+ * numeric threshold cross-checked there DISAGREED across sources. Cosmic
11
+ * Pegasus F:D is documented twice with the transition running in opposite
12
+ * directions and three different thresholds between the two cases and the plan.
13
+ *
14
+ * So a `thresholdRadPerSec` does not exist here. A field that is absent cannot
15
+ * be filled with a contested number by someone who assumes the gap was an
16
+ * oversight — which is why this is a schema decision and not a convention.
17
+ *
18
+ * 🛑 `trigger` is FREE TEXT, not an enum. The three authored shapes are
19
+ * already a pre-launch setting, passive spin decay, and what surface the tip
20
+ * is running on — and a three-value enum written before the fourth case was
21
+ * read would have forced the next one into the wrong bucket.
22
+ */
23
+ /**
24
+ * How a mode is selected.
25
+ *
26
+ * ── 🛑 THIS ENUM IS THE OWNER'S TAXONOMY, NOT MY GUESS ────────────────────
27
+ *
28
+ * Owner, 2026-10-21: *"most mode switches are either flips, config 1, 2 or 3
29
+ * and more."* Everything beyond that set is a mode that changes WITHOUT the
30
+ * owner doing anything, and those divide cleanly by what drives them.
31
+ *
32
+ * I deliberately did NOT define this when the first four modes were authored,
33
+ * because at that point I had seen two kinds and an enum built from two would
34
+ * have forced the next two into the wrong value. It is defined now that the
35
+ * real set is known — which is the difference between a taxonomy and a guess.
36
+ */
37
+ export const BEY_MODE_SWITCH_KINDS = [
38
+ /** Turn the part over. Two states by definition. */
39
+ "flip",
40
+ /** An indexed assembly position — config 1, 2, 3… See `configIndex`. */
41
+ "config",
42
+ /** Swap in a different piece (Delta Drive's three tips). */
43
+ "swap",
44
+ /** Changes on its own as spin speed falls. Nothing to set. */
45
+ "speed",
46
+ /** Fires when the bey is struck (Kreis' halves slipping). */
47
+ "impact",
48
+ /*
49
+ * 🛑 There is deliberately NO "surface" kind. Its only candidate was the
50
+ * claim that Bandit Genbu's TB tip runs on a ball or a cylinder rim
51
+ * depending on the floor — and TB is "Tapered Ball", a FIXED SHAPE with no
52
+ * modes at all (owner, 2026-10-21). An enum value whose only instance turned
53
+ * out not to exist is the speculative infra this project forbids.
54
+ */
55
+ ];
56
+ /**
57
+ * The document id for a bey.
58
+ *
59
+ * 🛑 The ONE place this is composed, mirroring `partGlossaryId`. The id is
60
+ * also the slug, the public URL and a `searchTxt` source on the paired
61
+ * category leaf, so a second spelling of this rule is a second set of URLs.
62
+ */
63
+ export function beyId(slug) {
64
+ return slug;
65
+ }
@@ -6,6 +6,7 @@ import { getMediaUrl } from "../../media/types/index.js";
6
6
  import { getDefaultLocale } from "../../../core/baseline-resolver.js";
7
7
  import { safeDisplayName } from "../../../security/index.js";
8
8
  import { useLongPress } from "../../../react/hooks/useLongPress.js";
9
+ import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
9
10
  const __P = {
10
11
  p4: "p-[var(--appkit-space-4)]",
11
12
  };
@@ -32,11 +33,23 @@ export function BlogFeaturedCard({ post, href, labels = {}, className = "", sele
32
33
  })
33
34
  : "";
34
35
  const card = (_jsxs(Article, { rounded: "xl", shadow: "hover-md", className: `group relative h-full overflow-hidden border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] ${isSelected ? "ring-2 ring-primary outline outline-2 outline-primary" : ""} ${className}`, onMouseDown: onSelect && !isSelected ? longPress.onMouseDown : undefined, onMouseUp: onSelect && !isSelected ? longPress.onMouseUp : undefined, onMouseLeave: onSelect && !isSelected ? longPress.onMouseLeave : undefined, onTouchStart: onSelect && !isSelected ? longPress.onTouchStart : undefined, onTouchEnd: onSelect && !isSelected ? longPress.onTouchEnd : undefined, onTouchCancel: onSelect && !isSelected ? longPress.onTouchCancel : undefined, children: [onSelect && (_jsx(BaseListingCard.Checkbox, { selected: isSelected, onSelect: (e) => { e.preventDefault(); onSelect(post.id, !isSelected); }, label: isSelected ? "Deselect post" : "Select post", position: "top-2 left-2", className: selectable || isSelected ? "opacity-100" : "opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto transition-opacity" })), _jsxs(TextLink, { href: href, layout: "flex-col", className: "h-full", children: [showThumbnail && (_jsx(Div, { className: `relative aspect-video ${__O.hidden} flex-shrink-0`, children: coverImageUrl ? (_jsx(MediaImage, { src: coverImageUrl, alt: safeTitle, size: "card", className: "transition-transform duration-300 group-hover:scale-105" })) : (_jsx(Div, { role: "img", "aria-label": safeTitle, surface: "muted", className: "h-full w-full" })) })), _jsxs(Stack, { className: `flex-1 ${__P.p4}`, children: [_jsxs(Row, { gap: "xs", className: "mb-2", wrap: true, children: [_jsx(Span, { size: "xs", weight: "medium", className: `inline-block capitalize ${CATEGORY_BADGE[post.category] ?? "bg-[var(--appkit-color-bg)] text-[var(--appkit-color-text-muted)]"}`, rounded: "full", padding: "pill-xs", children: post.category }), post.isFeatured && (_jsx(Span, { size: "xs", weight: "medium", className: CLS_FEATURED_BADGE, children: labels.featuredBadge ?? "Featured" }))] }), _jsx(Heading, { level: 3, className: `leading-snug mb-1`, color: "primary", truncate: 2, size: "base", weight: "semibold", children: safeTitle }), post.excerpt && (_jsx(Text, { className: `mb-3`, color: "muted", truncate: 2, size: "sm", children: post.excerpt })), _jsxs(Row, { color: "muted", textSize: "xs", className: "mt-auto", gap: "3", wrap: true, children: [showAuthor && post.authorName && (_jsx(Span, { children: safeDisplayName(post.authorName, "Author") })), showReadTime && post.readTimeMinutes != null && (_jsxs(Span, { children: [post.readTimeMinutes, " ", labels.readTime ?? "min read"] })), date && _jsx(Span, { children: date })] })] })] })] }));
35
- if (!renderOwnerActions)
36
+ /*
37
+ * 🛑 Default, not opt-in. Nothing in either repo ever passed
38
+ * `renderOwnerActions`, so this toolbar was unreachable on every grid that
39
+ * mounts this card (Root Cause #8 — a slot shell rendered with zero render
40
+ * props). A card is resource-specific by construction, so it names its own
41
+ * resource rather than being threaded one; the prop stays as an override.
42
+ */
43
+ const ownerActions = renderOwnerActions
44
+ ? renderOwnerActions()
45
+ : post.id
46
+ ? (_jsx(RecordOwnerQuickActions, { resource: "BLOG", recordId: String(post.id), recordLabel: post.title, placement: "card" }))
47
+ : null;
48
+ if (!ownerActions)
36
49
  return card;
37
50
  /*
38
51
  * Sibling of the card, never a child — see the prop's docstring. `z-20`
39
52
  * beats this card's own overlays, which all sit at `z-10`.
40
53
  */
41
- return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: renderOwnerActions() })] }));
54
+ return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: ownerActions })] }));
42
55
  }
@@ -11,7 +11,7 @@ import { getMediaUrl } from "../../media/types/index.js";
11
11
  import { getDefaultLocale } from "../../../core/baseline-resolver.js";
12
12
  import { normalizeRichTextHtml } from "../../../utils/string.formatter.js";
13
13
  import { ROUTES } from "../../../next/routing/route-map.js";
14
- import { OwnerQuickActions } from "../../admin/components/OwnerQuickActions.js";
14
+ import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
15
15
  const __P = {
16
16
  p8: "p-[var(--appkit-space-8)]",
17
17
  };
@@ -27,7 +27,7 @@ const CATEGORY_BADGE = {
27
27
  };
28
28
  const CLS_FEATURED_BADGE = "bg-warning-surface text-warning dark:bg-warning-surface dark:text-warning px-[var(--appkit-space-2)] py-[var(--appkit-space-0-5)] rounded-full";
29
29
  function renderBlogPostHeader(post, date, labels) {
30
- return (_jsxs(Div, { className: "mb-8", children: [_jsxs(Row, { className: "mb-4", gap: "sm", children: [_jsx(Span, { size: "xs", weight: "medium", className: `inline-block capitalize ${CATEGORY_BADGE[post.category] ?? ""}`, rounded: "full", padding: "pill-xs", children: post.category }), post.isFeatured && _jsx(Span, { size: "xs", weight: "medium", className: CLS_FEATURED_BADGE, children: labels?.featured ?? "Featured" })] }), _jsxs(Row, { className: "mb-4", gap: "sm", align: "center", justify: "between", wrap: true, children: [_jsx(Heading, { level: 1, size: "3xl", weight: "bold", children: post.title }), _jsx(OwnerQuickActions, { resource: "BLOG", placement: "detail", editHref: String(ROUTES.ADMIN.BLOG_EDIT(post.id)), recordLabel: post.title })] }), post.excerpt && _jsx(Text, { className: "mb-6", color: "muted", size: "lg", children: post.excerpt }), _jsxs(Row, { color: "muted", textSize: "sm", wrap: true, gap: "md", children: [post.authorName && _jsxs(Span, { children: [labels?.author ?? "By", " ", _jsx(Span, { weight: "medium", color: "muted", children: post.authorName })] }), post.readTimeMinutes != null && _jsxs(Span, { children: [post.readTimeMinutes, " ", labels?.readTime ?? "min read"] }), date && _jsxs(Span, { children: [labels?.publishedOn ?? "Published", " ", date] }), post.views != null && _jsxs(Span, { children: [post.views, " ", labels?.viewsLabel ?? "views"] })] })] }));
30
+ return (_jsxs(Div, { className: "mb-8", children: [_jsxs(Row, { className: "mb-4", gap: "sm", children: [_jsx(Span, { size: "xs", weight: "medium", className: `inline-block capitalize ${CATEGORY_BADGE[post.category] ?? ""}`, rounded: "full", padding: "pill-xs", children: post.category }), post.isFeatured && _jsx(Span, { size: "xs", weight: "medium", className: CLS_FEATURED_BADGE, children: labels?.featured ?? "Featured" })] }), _jsxs(Row, { className: "mb-4", gap: "sm", align: "center", justify: "between", wrap: true, children: [_jsx(Heading, { level: 1, size: "3xl", weight: "bold", children: post.title }), _jsx(RecordOwnerQuickActions, { resource: "BLOG", recordId: post.id, placement: "detail", recordLabel: post.title })] }), post.excerpt && _jsx(Text, { className: "mb-6", color: "muted", size: "lg", children: post.excerpt }), _jsxs(Row, { color: "muted", textSize: "sm", wrap: true, gap: "md", children: [post.authorName && _jsxs(Span, { children: [labels?.author ?? "By", " ", _jsx(Span, { weight: "medium", color: "muted", children: post.authorName })] }), post.readTimeMinutes != null && _jsxs(Span, { children: [post.readTimeMinutes, " ", labels?.readTime ?? "min read"] }), date && _jsxs(Span, { children: [labels?.publishedOn ?? "Published", " ", date] }), post.views != null && _jsxs(Span, { children: [post.views, " ", labels?.viewsLabel ?? "views"] })] })] }));
31
31
  }
32
32
  function renderBlogPostRelated(related, title, renderRelatedCard) {
33
33
  if (related.length === 0)