@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
@@ -215,15 +215,15 @@ export declare const carouselCardSchema: z.ZodObject<{
215
215
  description?: string | undefined;
216
216
  textColor?: string | undefined;
217
217
  textAlign?: "center" | "left" | "right" | undefined;
218
- subtitle?: string | undefined;
219
218
  eyebrow?: string | undefined;
219
+ subtitle?: string | undefined;
220
220
  }, {
221
221
  title?: string | undefined;
222
222
  description?: string | undefined;
223
223
  textColor?: string | undefined;
224
224
  textAlign?: "center" | "left" | "right" | undefined;
225
- subtitle?: string | undefined;
226
225
  eyebrow?: string | undefined;
226
+ subtitle?: string | undefined;
227
227
  }>>;
228
228
  buttons: z.ZodOptional<z.ZodArray<z.ZodObject<{
229
229
  id: z.ZodOptional<z.ZodString>;
@@ -282,8 +282,8 @@ export declare const carouselCardSchema: z.ZodObject<{
282
282
  description?: string | undefined;
283
283
  textColor?: string | undefined;
284
284
  textAlign?: "center" | "left" | "right" | undefined;
285
- subtitle?: string | undefined;
286
285
  eyebrow?: string | undefined;
286
+ subtitle?: string | undefined;
287
287
  } | undefined;
288
288
  hover?: {
289
289
  effect: "none" | "color" | "scale" | "glow";
@@ -323,8 +323,8 @@ export declare const carouselCardSchema: z.ZodObject<{
323
323
  description?: string | undefined;
324
324
  textColor?: string | undefined;
325
325
  textAlign?: "center" | "left" | "right" | undefined;
326
- subtitle?: string | undefined;
327
326
  eyebrow?: string | undefined;
327
+ subtitle?: string | undefined;
328
328
  } | undefined;
329
329
  hover?: {
330
330
  effect: "none" | "color" | "scale" | "glow";
@@ -555,15 +555,15 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
555
555
  description?: string | undefined;
556
556
  textColor?: string | undefined;
557
557
  textAlign?: "center" | "left" | "right" | undefined;
558
- subtitle?: string | undefined;
559
558
  eyebrow?: string | undefined;
559
+ subtitle?: string | undefined;
560
560
  }, {
561
561
  title?: string | undefined;
562
562
  description?: string | undefined;
563
563
  textColor?: string | undefined;
564
564
  textAlign?: "center" | "left" | "right" | undefined;
565
- subtitle?: string | undefined;
566
565
  eyebrow?: string | undefined;
566
+ subtitle?: string | undefined;
567
567
  }>>;
568
568
  buttons: z.ZodOptional<z.ZodArray<z.ZodObject<{
569
569
  id: z.ZodOptional<z.ZodString>;
@@ -622,8 +622,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
622
622
  description?: string | undefined;
623
623
  textColor?: string | undefined;
624
624
  textAlign?: "center" | "left" | "right" | undefined;
625
- subtitle?: string | undefined;
626
625
  eyebrow?: string | undefined;
626
+ subtitle?: string | undefined;
627
627
  } | undefined;
628
628
  hover?: {
629
629
  effect: "none" | "color" | "scale" | "glow";
@@ -663,8 +663,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
663
663
  description?: string | undefined;
664
664
  textColor?: string | undefined;
665
665
  textAlign?: "center" | "left" | "right" | undefined;
666
- subtitle?: string | undefined;
667
666
  eyebrow?: string | undefined;
667
+ subtitle?: string | undefined;
668
668
  } | undefined;
669
669
  hover?: {
670
670
  effect: "none" | "color" | "scale" | "glow";
@@ -802,8 +802,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
802
802
  description?: string | undefined;
803
803
  textColor?: string | undefined;
804
804
  textAlign?: "center" | "left" | "right" | undefined;
805
- subtitle?: string | undefined;
806
805
  eyebrow?: string | undefined;
806
+ subtitle?: string | undefined;
807
807
  } | undefined;
808
808
  hover?: {
809
809
  effect: "none" | "color" | "scale" | "glow";
@@ -911,8 +911,8 @@ export declare const carouselSlideFirestoreSchema: z.ZodObject<{
911
911
  description?: string | undefined;
912
912
  textColor?: string | undefined;
913
913
  textAlign?: "center" | "left" | "right" | undefined;
914
- subtitle?: string | undefined;
915
914
  eyebrow?: string | undefined;
915
+ subtitle?: string | undefined;
916
916
  } | undefined;
917
917
  hover?: {
918
918
  effect: "none" | "color" | "scale" | "glow";
@@ -1,6 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Section, Container, Stack, Row, Div, Heading, Text, Span, TextLink, Badge, } from "../../../ui/index.js";
2
+ import { Section, Container, Stack, Row, Div, Heading, Text, Span, TextLink, Badge, Anchor, } from "../../../ui/index.js";
3
3
  import { SpecTable } from "../../../ui/components/SpecTable.js";
4
+ import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
5
+ import { ROUTES } from "../../../next/routing/route-map.js";
4
6
  import { PART_SLOT_LABEL, } from "../schemas/firestore.js";
5
7
  /**
6
8
  * The buyer-facing label for each WBO tournament format, in the order a
@@ -100,12 +102,12 @@ export function PartDetailPageView({ part, usedBy, listings, listingsTruncated,
100
102
  : [];
101
103
  /* Only the formats this part is actually ruled on — see the note below. */
102
104
  const legalFormats = Object.entries(part.wboLegality ?? {}).filter(([, v]) => typeof v === "boolean");
103
- 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: [_jsx(Text, { size: "sm", color: "muted", children: _jsx(TextLink, { href: hrefForClassification(part.slot), children: classification }) }), _jsx(Heading, { level: 1, children: part.name }), _jsxs(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: [part.code && _jsx(Badge, { variant: "info", children: part.code }), typeof part.weightG === "number" && (_jsxs(Badge, { variant: "default", children: [part.weightG, " g"] }))] }), aliases.length > 0 && (_jsxs(Text, { size: "sm", color: "muted", children: ["Also written: ", aliases.join(" · ")] }))] }), specRows.length > 1 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Specifications" }), _jsx(SpecTable, { rows: specRows })] })), 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) => ({
105
+ 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: [_jsx(Text, { size: "sm", color: "muted", children: _jsx(TextLink, { href: hrefForClassification(part.slot), children: classification }) }), _jsx(Heading, { level: 1, children: part.name }), _jsx(RecordOwnerQuickActions, { resource: "PART", recordId: part.id, placement: "detail", recordLabel: part.name }), _jsxs(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: [part.code && _jsx(Badge, { variant: "info", children: part.code }), typeof part.weightG === "number" && (_jsxs(Badge, { variant: "default", children: [part.weightG, " g"] }))] }), aliases.length > 0 && (_jsxs(Text, { size: "sm", color: "muted", children: ["Also written: ", aliases.join(" · ")] }))] }), specRows.length > 1 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Specifications" }), _jsx(SpecTable, { rows: specRows })] })), 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) => ({
104
106
  name: r.label,
105
107
  value: `${r.value} / 100`,
106
108
  })) }), _jsxs(Text, { size: "xs", color: "faint", children: ["Rescaled to 0\u2013100 for comparison across generations", typeof part.ratingScale === "number"
107
109
  ? `; rated 0–${part.ratingScale} at source`
108
- : "", "."] })] })), legalFormats.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Tournament legality" }), _jsx(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: legalFormats.map(([format, allowed]) => (_jsxs(Badge, { variant: allowed ? "success" : "danger", children: [WBO_FORMAT_LABEL[format] ?? format, allowed ? " ✓" : " ✗"] }, format))) }), _jsx(Text, { size: "xs", color: "faint", children: "World Beyblade Organization formats this part is ruled on. A format not listed has no ruling for it." })] })), _jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: usedBy.length > 0
110
+ : "", "."] })] })), legalFormats.length > 0 && (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: "Tournament legality" }), _jsx(Row, { gap: "xs", wrap: true, align: "center", className: "min-w-0", children: legalFormats.map(([format, allowed]) => (_jsxs(Badge, { variant: allowed ? "success" : "danger", children: [WBO_FORMAT_LABEL[format] ?? format, allowed ? " ✓" : " ✗"] }, format))) }), _jsx(Text, { size: "xs", color: "faint", children: "World Beyblade Organization formats this part is ruled on. A format not listed has no ruling for it." })] })), part.sourceUrl && (_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: part.sourceUrl, tone: "muted", underline: "always", children: "Source" }), " · ", _jsx(TextLink, { href: String(ROUTES.PUBLIC.CREDITS), children: "Credits" })] }) })), _jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Heading, { level: 2, size: "lg", children: usedBy.length > 0
109
111
  ? `Used by ${usedBy.length} ${usedBy.length === 1 ? "model" : "models"}`
110
112
  : "Used by" }), usedBy.length === 0 ? (_jsx(Text, { color: "muted", size: "sm", children: "No model in our database records this part yet." })) : (_jsx(Stack, { gap: "xs", className: "min-w-0", children: usedBy.map((m) => (_jsxs(Row, { gap: "sm", align: "center", padding: "inline", surface: "card", rounded: "md", border: "subtle", className: "min-w-0", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [m.categoryId ? (_jsx(TextLink, { href: hrefForModel(m.categoryId), children: m.name })) : (
111
113
  /* 49 of 259 compositions did not join to a category.
@@ -35,13 +35,88 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
35
35
  import React from "react";
36
36
  import { Div, Input, Stack, Text, TextLink } from "../../../ui/index.js";
37
37
  import { useSiteSearch } from "../../search/hooks/useSiteSearch.js";
38
+ import { useUrlTable } from "../../../react/hooks/useUrlTable.js";
39
+ import { TABLE_KEYS } from "../../../constants/table-keys.js";
38
40
  /** Only this slice of the index. See `resolveEntity`'s `types` parameter. */
39
41
  const PART_TYPES = ["part"];
40
42
  /** Stable identity — a `useMemo` dependency inside the hook. */
41
43
  const partLabel = () => "Parts";
42
44
  export function PartsSearchBox({ indexEnabled, placeholder = "Search parts by name or code — RF, 105, Rubber Flat…", limit = 10, }) {
43
- const [query, setQuery] = React.useState("");
44
- const [active, setActive] = React.useState(false);
45
+ /*
46
+ * ── 🛑 THE QUERY LIVES IN THE URL, SO A SEARCH IS SHAREABLE ──────────────
47
+ *
48
+ * This was `React.useState("")`, which meant typing filtered the list and
49
+ * left the address bar on `/parts`. Every detail page here is a real slug
50
+ * (`/parts/{classification}/{code}`, `/beys/{slug}`) and every other listing
51
+ * surface puts its state in the URL — `/search?q=…` reads `searchParams`
52
+ * server-side, and the category pages go as far as path segments
53
+ * (`/categories/{slug}/{tab}/sort/{sortKey}/page/{page}`). A client-local
54
+ * box was the one surface where you could not send someone what you were
55
+ * looking at.
56
+ *
57
+ * `useUrlTable` is the mechanism, not a second one invented here: it owns
58
+ * `router.replace()`, uses replace rather than push so typing does not fill
59
+ * the back button, and `TABLE_KEYS.QUERY` is the same `q` the rest of the
60
+ * app reads.
61
+ *
62
+ * 🛑 TWO pieces of state, deliberately, and they are not redundant. `draft`
63
+ * drives the input so a keystroke is never waiting on a navigation; the URL
64
+ * is the shareable record, written on a debounce. Driving the input straight
65
+ * from `searchParams` makes every character a round trip through the router
66
+ * and the field feels broken on a slow render.
67
+ *
68
+ * 🛑 `useSearchParams` requires a `<Suspense>` ancestor or the build fails
69
+ * on prerender (Root Cause #17b). The root locale layout has one, which is
70
+ * what the ~246 comments citing that pattern are about.
71
+ */
72
+ /*
73
+ * 🛑 DESTRUCTURED, because `useUrlTable` returns a fresh object literal every
74
+ * render while the callbacks inside it are `useCallback`-memoised. Depending
75
+ * on `table` would make the effect below re-run on every render; depending on
76
+ * `set`/`clear` is stable. Same trap as the `loadOptions` identity bug in
77
+ * `PaginatedSelect`, where an unstable function re-triggered a fetch effect.
78
+ */
79
+ const { get, set, clear } = useUrlTable();
80
+ const urlQuery = get(TABLE_KEYS.QUERY) ?? "";
81
+ const [draft, setDraft] = React.useState(urlQuery);
82
+ /*
83
+ * 🛑 SEEDED FROM THE URL, not `false`.
84
+ *
85
+ * `useSiteSearch` only fetches the index when `active`, which previously
86
+ * meant "the user has focused the box". Arriving on `/parts?q=rubber-flat`
87
+ * from a shared link, `active` would be false — so the query would sit in
88
+ * the field and in the address bar having searched NOTHING until the visitor
89
+ * clicked into the input. That defeats the entire reason for putting the
90
+ * query in the URL, and it is the kind of gap that looks like the link
91
+ * "didn't work" rather than like a missing fetch.
92
+ */
93
+ const [active, setActive] = React.useState(urlQuery.length > 0);
94
+ /*
95
+ * Back/forward and a shared link both change the URL without touching the
96
+ * input, so the draft follows the URL when the URL moves on its own.
97
+ * Guarded on inequality — without that this fights the user's typing.
98
+ */
99
+ React.useEffect(() => {
100
+ setDraft((prev) => (prev === urlQuery ? prev : urlQuery));
101
+ }, [urlQuery]);
102
+ /*
103
+ * 🛑 Debounced, because `router.replace` on every keystroke is a navigation
104
+ * per character. 300ms is the same order the rest of the app uses for a
105
+ * search field, and the cleanup makes the last keystroke the one that wins.
106
+ */
107
+ React.useEffect(() => {
108
+ if (draft === urlQuery)
109
+ return;
110
+ const t = setTimeout(() => {
111
+ if (draft)
112
+ set(TABLE_KEYS.QUERY, draft);
113
+ else
114
+ clear([TABLE_KEYS.QUERY]);
115
+ }, 300);
116
+ return () => clearTimeout(t);
117
+ }, [draft, urlQuery, set, clear]);
118
+ /* The index is searched on the URL's value — the thing that is shareable. */
119
+ const query = urlQuery;
45
120
  const { status, result } = useSiteSearch(query, {
46
121
  active,
47
122
  indexEnabled,
@@ -50,8 +125,8 @@ export function PartsSearchBox({ indexEnabled, placeholder = "Search parts by na
50
125
  });
51
126
  const hits = result?.groups[0]?.hits ?? [];
52
127
  const typed = query.trim().length > 0;
53
- return (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Input, { type: "search", value: query, placeholder: placeholder, "aria-label": "Search parts", onFocus: () => setActive(true), onChange: (event) => {
128
+ return (_jsxs(Stack, { gap: "sm", className: "min-w-0", children: [_jsx(Input, { type: "search", value: draft, placeholder: placeholder, "aria-label": "Search parts", onFocus: () => setActive(true), onChange: (event) => {
54
129
  setActive(true);
55
- setQuery(event.target.value);
130
+ setDraft(event.target.value);
56
131
  } }), typed && status === "loading" && _jsx(Text, { color: "muted", children: "Searching\u2026" }), typed && (status === "failed" || status === "disabled") && (_jsx(Text, { size: "sm", color: "muted", children: "Part search is unavailable right now \u2014 browse by classification below." })), typed && status === "ready" && hits.length === 0 && (_jsx(Text, { color: "muted", children: "No part matches that name or code." })), hits.length > 0 && (_jsx(Stack, { gap: "xs", className: "min-w-0", children: hits.slice(0, limit).map((hit) => (_jsxs(Div, { surface: "card", padding: "sm", rounded: "md", border: "subtle", children: [_jsx(TextLink, { href: hit.href, children: hit.title }), hit.detail && (_jsx(Text, { size: "xs", color: "muted", children: hit.detail }))] }, hit.id))) }))] }));
57
132
  }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Field-level protection for hand-corrections to GENERATED reference data.
3
+ *
4
+ * ── 🛑 THE PROBLEM THIS SOLVES ────────────────────────────────────────────
5
+ *
6
+ * `partGlossary` (2,488 rows) and `beys` (1,988) are produced by committed
7
+ * generators from a crawled corpus, and `appkit-seed load` writes them with
8
+ * `set(doc, { merge: true })`. A merge-write overwrites every key present in
9
+ * the payload — so an admin who corrects a wrong extracted weight loses that
10
+ * correction on the next reseed, silently, and the row goes back to being
11
+ * wrong while `appkit-seed status` reports the collection perfectly in sync
12
+ * (it counts ids, and the id did not change).
13
+ *
14
+ * That is not hypothetical for this dataset. This session alone found five
15
+ * wrong claims in the source corpus — an inverted tip transition, a mode that
16
+ * was actually launch spin direction, a mechanism on the wrong part, a part
17
+ * with no modes at all, and a part named "Duo:Dual" that is Delta Drive. A
18
+ * hand-correction is the fast path for exactly those, and it has to survive.
19
+ *
20
+ * ── 🛑 FIELD-LEVEL, NOT ROW-LEVEL ────────────────────────────────────────
21
+ *
22
+ * The obvious shape is one boolean meaning "do not touch this row". It is
23
+ * wrong: freezing a whole row because somebody fixed one weight means the row
24
+ * stops receiving every genuine improvement the generator makes afterwards —
25
+ * a better description, a newly resolved part id, a corrected release date.
26
+ * The row quietly falls out of the dataset's own maintenance.
27
+ *
28
+ * So `adminEditedFields` names the keys a human owns. The loader strips
29
+ * exactly those from its payload and writes everything else, which means a
30
+ * corrected weight and an improved description can both be true at once.
31
+ *
32
+ * `adminEdited` is a plain boolean beside it purely so the loader can find
33
+ * these rows with ONE equality query per collection instead of reading all
34
+ * 4,476 documents to discover the handful that matter. `array-contains` on
35
+ * `adminEditedFields` cannot answer "has any value", and an `orderBy` or `!=`
36
+ * on it would silently exclude every row that lacks the field — which is all
37
+ * of them (Root Cause #100).
38
+ *
39
+ * 🛑 KEEP THE TWO IN SYNC. `adminEdited` is `adminEditedFields.length > 0`.
40
+ * Writing one without the other either hides a protected row from the loader
41
+ * (so the edit is lost anyway) or makes the loader fetch a row with nothing to
42
+ * protect. `applyAdminEdit` is the only function that should set either.
43
+ */
44
+ /** The fields a human has taken ownership of on one generated row. */
45
+ export interface AdminEditableRecord {
46
+ /**
47
+ * `true` iff `adminEditedFields` is non-empty. Exists ONLY so the seed
48
+ * loader can find protected rows with one indexed equality.
49
+ */
50
+ adminEdited?: boolean;
51
+ /**
52
+ * Keys the generator must not overwrite. Dot paths are NOT supported — a
53
+ * nested object is owned whole, because a merge-write replaces a map wholesale
54
+ * and protecting one leaf of it is not something `{ merge: true }` can express.
55
+ */
56
+ adminEditedFields?: string[];
57
+ /** When the most recent hand-edit landed. Audit trail, never read by logic. */
58
+ adminEditedAt?: Date;
59
+ /** Who. The Auth UID, never a name — this travels into no public projection. */
60
+ adminEditedBy?: string;
61
+ }
62
+ /**
63
+ * Merge a hand-edit into a record, keeping the two protection fields honest.
64
+ *
65
+ * Returns the patch to write — the caller's changed fields plus the updated
66
+ * ownership set. 🛑 Ownership is CUMULATIVE: editing the weight today and the
67
+ * description tomorrow must leave both protected, so the existing set is
68
+ * unioned rather than replaced.
69
+ */
70
+ export declare function applyAdminEdit<TChanges extends object>(existing: Pick<AdminEditableRecord, "adminEditedFields"> | null | undefined, changes: TChanges, actorUid: string): TChanges & Required<Pick<AdminEditableRecord, "adminEdited" | "adminEditedFields">> & {
71
+ adminEditedAt: Date;
72
+ adminEditedBy: string;
73
+ };
74
+ /**
75
+ * Strip the fields a human owns out of a generator payload.
76
+ *
77
+ * Used by `appkit/scripts/seed-cli.mjs`. Exported from here rather than
78
+ * duplicated there so the rule has one definition — the CLI is `.mjs` and
79
+ * reads this through the built package, the same way it reads the seed data.
80
+ */
81
+ export declare function stripAdminOwnedFields<T extends object>(payload: T, ownedFields: readonly string[] | undefined): Partial<T>;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Field-level protection for hand-corrections to GENERATED reference data.
3
+ *
4
+ * ── 🛑 THE PROBLEM THIS SOLVES ────────────────────────────────────────────
5
+ *
6
+ * `partGlossary` (2,488 rows) and `beys` (1,988) are produced by committed
7
+ * generators from a crawled corpus, and `appkit-seed load` writes them with
8
+ * `set(doc, { merge: true })`. A merge-write overwrites every key present in
9
+ * the payload — so an admin who corrects a wrong extracted weight loses that
10
+ * correction on the next reseed, silently, and the row goes back to being
11
+ * wrong while `appkit-seed status` reports the collection perfectly in sync
12
+ * (it counts ids, and the id did not change).
13
+ *
14
+ * That is not hypothetical for this dataset. This session alone found five
15
+ * wrong claims in the source corpus — an inverted tip transition, a mode that
16
+ * was actually launch spin direction, a mechanism on the wrong part, a part
17
+ * with no modes at all, and a part named "Duo:Dual" that is Delta Drive. A
18
+ * hand-correction is the fast path for exactly those, and it has to survive.
19
+ *
20
+ * ── 🛑 FIELD-LEVEL, NOT ROW-LEVEL ────────────────────────────────────────
21
+ *
22
+ * The obvious shape is one boolean meaning "do not touch this row". It is
23
+ * wrong: freezing a whole row because somebody fixed one weight means the row
24
+ * stops receiving every genuine improvement the generator makes afterwards —
25
+ * a better description, a newly resolved part id, a corrected release date.
26
+ * The row quietly falls out of the dataset's own maintenance.
27
+ *
28
+ * So `adminEditedFields` names the keys a human owns. The loader strips
29
+ * exactly those from its payload and writes everything else, which means a
30
+ * corrected weight and an improved description can both be true at once.
31
+ *
32
+ * `adminEdited` is a plain boolean beside it purely so the loader can find
33
+ * these rows with ONE equality query per collection instead of reading all
34
+ * 4,476 documents to discover the handful that matter. `array-contains` on
35
+ * `adminEditedFields` cannot answer "has any value", and an `orderBy` or `!=`
36
+ * on it would silently exclude every row that lacks the field — which is all
37
+ * of them (Root Cause #100).
38
+ *
39
+ * 🛑 KEEP THE TWO IN SYNC. `adminEdited` is `adminEditedFields.length > 0`.
40
+ * Writing one without the other either hides a protected row from the loader
41
+ * (so the edit is lost anyway) or makes the loader fetch a row with nothing to
42
+ * protect. `applyAdminEdit` is the only function that should set either.
43
+ */
44
+ /**
45
+ * Merge a hand-edit into a record, keeping the two protection fields honest.
46
+ *
47
+ * Returns the patch to write — the caller's changed fields plus the updated
48
+ * ownership set. 🛑 Ownership is CUMULATIVE: editing the weight today and the
49
+ * description tomorrow must leave both protected, so the existing set is
50
+ * unioned rather than replaced.
51
+ */
52
+ export function applyAdminEdit(existing, changes, actorUid) {
53
+ const owned = new Set(existing?.adminEditedFields ?? []);
54
+ for (const key of Object.keys(changes)) {
55
+ /*
56
+ * The protection fields themselves are never protected — that would make
57
+ * the set unmodifiable by the next edit.
58
+ */
59
+ if (key.startsWith("adminEdited"))
60
+ continue;
61
+ owned.add(key);
62
+ }
63
+ const fields = [...owned].sort();
64
+ return {
65
+ ...changes,
66
+ adminEditedFields: fields,
67
+ adminEdited: fields.length > 0,
68
+ adminEditedAt: new Date(),
69
+ adminEditedBy: actorUid,
70
+ };
71
+ }
72
+ /**
73
+ * Strip the fields a human owns out of a generator payload.
74
+ *
75
+ * Used by `appkit/scripts/seed-cli.mjs`. Exported from here rather than
76
+ * duplicated there so the rule has one definition — the CLI is `.mjs` and
77
+ * reads this through the built package, the same way it reads the seed data.
78
+ */
79
+ export function stripAdminOwnedFields(payload, ownedFields) {
80
+ if (!ownedFields?.length)
81
+ return payload;
82
+ const out = {};
83
+ for (const [k, v] of Object.entries(payload)) {
84
+ if (ownedFields.includes(k))
85
+ continue;
86
+ out[k] = v;
87
+ }
88
+ return out;
89
+ }
@@ -29,6 +29,7 @@
29
29
  * `Record<Generation, Slot[]>` would be the hand-written enumeration of Root
30
30
  * Cause #61 with a merge case it structurally cannot hold.
31
31
  */
32
+ import type { AdminEditableRecord } from "./admin-edit";
32
33
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
33
34
  export declare const PART_GLOSSARY_COLLECTION: "partGlossary";
34
35
  export declare const MODEL_COMPOSITION_COLLECTION: "modelComposition";
@@ -271,7 +272,7 @@ export interface PartWboLegality {
271
272
  * source. A slot missing from that map yields no `role` rather than a guess.
272
273
  */
273
274
  export type PartRole = "chip" | "ring" | "wheel" | "weight" | "base" | "blade" | "track" | "tip" | "gear" | "support";
274
- export interface PartGlossaryDocument extends BaseDocument {
275
+ export interface PartGlossaryDocument extends BaseDocument, AdminEditableRecord {
275
276
  /** `${slot}--${codeOrSlug}` — both halves, because a code is not unique. */
276
277
  id: string;
277
278
  /** Buyer-facing label: "Performance Tip", "Fusion Wheel". */
@@ -19,6 +19,7 @@ import { normalizeRichTextHtml } from "../../../utils/string.formatter.js";
19
19
  import { PreorderBadge } from "./PreorderCard.js";
20
20
  import { WishlistHeartButton } from "../../wishlist/components/WishlistHeartButton.js";
21
21
  import { CardStoreLine } from "../../products/components/CardStoreLine.js";
22
+ import { ProductOwnerQuickActions } from "../../products/components/ProductOwnerQuickActions.js";
22
23
  const DEFAULT_LABELS = {
23
24
  preOrderBadge: "Pre-order",
24
25
  featuredBadge: "Featured",
@@ -69,11 +70,23 @@ export function MarketplacePreorderCard({ product, className = "", variant = "gr
69
70
  _jsxs(_Fragment, { children: [_jsxs(Row, { className: "min-w-0", align: "start", justify: "between", gap: "sm", children: [_jsx(TextLink, { href: detailHref, className: "min-w-0 flex-1", children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), wishlistActions && (_jsx(WishlistHeartButton, { size: "inline", inWishlist: inWishlist, addLabel: mergedLabels.addToWishlist, removeLabel: mergedLabels.removeFromWishlist, onToggle: handleWishlist }))] }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), _jsxs(Row, { align: "center", gap: "sm", wrap: true, children: [_jsx(Text, { className: "text-primary", size: "sm", weight: "bold", children: _jsx(GatedPrice, { children: formatCurrency(product.price, getDefaultCurrency()) }) }), shipDate && _jsx(PreorderBadge, { shipDate: shipDate })] }), _jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "self-start mt-0.5", onClick: handleNavigate, children: mergedLabels.reserveNow })] })) : (
70
71
  /* ── Full grid layout ── */
71
72
  _jsxs(_Fragment, { children: [_jsx(TextLink, { href: detailHref, children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), product.description ? (_jsx(RichText, { html: normalizeRichTextHtml(product.description), proseClass: "prose prose-sm max-w-none dark:prose-invert prose-p:my-0", className: "line-clamp-2 text-[length:var(--appkit-text-xs)] text-[var(--appkit-color-text-muted)]" })) : null, _jsxs(Row, { justify: "between", className: "mt-1", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: _jsx(GatedPrice, { children: formatCurrency(product.price, getDefaultCurrency()) }) }), shipDate && _jsx(PreorderBadge, { shipDate: shipDate })] }), _jsxs(Row, { justify: "between", className: "mt-auto pt-[var(--appkit-space-2)]", gap: "sm", children: [_jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "flex-1", onClick: handleNavigate, children: mergedLabels.reserveNow }), onAddToCart ? (_jsx(Button, { type: "button", variant: "outline", size: "sm", textSize: "xs", className: "flex-1", onClick: (e) => { e.stopPropagation(); onAddToCart(product); }, children: mergedLabels.addToCart })) : null, wishlistActions ? (_jsx(WishlistHeartButton, { size: "inline", inWishlist: inWishlist, addLabel: mergedLabels.addToWishlist, removeLabel: mergedLabels.removeFromWishlist, onToggle: handleWishlist })) : null] })] })) })] }));
72
- if (!renderOwnerActions)
73
+ /*
74
+ * 🛑 Default, not opt-in. Nothing in either repo ever passed
75
+ * `renderOwnerActions`, so this toolbar was unreachable on every grid that
76
+ * mounts this card (Root Cause #8 — a slot shell rendered with zero render
77
+ * props). A card is resource-specific by construction, so it names its own
78
+ * resource rather than being threaded one; the prop stays as an override.
79
+ */
80
+ const ownerActions = renderOwnerActions
81
+ ? renderOwnerActions()
82
+ : product.id
83
+ ? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" }))
84
+ : null;
85
+ if (!ownerActions)
73
86
  return card;
74
87
  /*
75
88
  * Sibling of the card, never a child — see the prop's docstring. `z-20`
76
89
  * clears this card's own overlays, which all sit at `z-10`.
77
90
  */
78
- return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 bottom-2 z-20", children: renderOwnerActions() })] }));
91
+ return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 bottom-2 z-20", children: ownerActions })] }));
79
92
  }
@@ -14,6 +14,7 @@ import { BaseListingCard, Div, GatedPrice, PricesOnly, Row, Span, Stack, Text, T
14
14
  import { MediaImage } from "../../media/MediaImage.js";
15
15
  import { computeBundleDiscount } from "../../../_internal/shared/features/categories/bundle-pricing.js";
16
16
  import { BUNDLE_COPY } from "../../../_internal/shared/features/categories/bundle-copy.js";
17
+ import { RecordOwnerQuickActions } from "../../admin/components/RecordOwnerQuickActions.js";
17
18
  const DEFAULT_LABELS = {
18
19
  bundleBadge: "Bundle",
19
20
  inStockBadge: "In stock",
@@ -58,11 +59,23 @@ export function MarketplaceBundleCard({ bundle, className = "", variant = "grid"
58
59
  ? formatCurrency(price, getDefaultCurrency())
59
60
  : "—" }), discount && (_jsx(Text, { size: "xs", color: "muted", className: "line-through", children: formatCurrency(discount.originalTotal, getDefaultCurrency()) }))] }) }) }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: mergedLabels.itemsLabel(memberCount) })] }), _jsx(Div, { className: CLS_VIEW_BTN, role: "button", tabIndex: 0, onClick: handleNavigate, onKeyDown: (e) => { if (e.key === "Enter" || e.key === " ")
60
61
  handleNavigate(); }, children: "View Bundle" })] })] }));
61
- if (!renderOwnerActions)
62
+ /*
63
+ * 🛑 Default, not opt-in. Nothing in either repo ever passed
64
+ * `renderOwnerActions`, so this toolbar was unreachable on every grid that
65
+ * mounts this card (Root Cause #8 — a slot shell rendered with zero render
66
+ * props). A card is resource-specific by construction, so it names its own
67
+ * resource rather than being threaded one; the prop stays as an override.
68
+ */
69
+ const ownerActions = renderOwnerActions
70
+ ? renderOwnerActions()
71
+ : bundle.id
72
+ ? (_jsx(RecordOwnerQuickActions, { resource: "BUNDLE", recordId: String(bundle.id), recordLabel: String(bundle.name), placement: "card" }))
73
+ : null;
74
+ if (!ownerActions)
62
75
  return card;
63
76
  /*
64
77
  * Sibling of the card, never a child — see the prop's docstring. `z-20`
65
78
  * clears this card's own overlays, which all sit at `z-10`.
66
79
  */
67
- return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: renderOwnerActions() })] }));
80
+ return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: ownerActions })] }));
68
81
  }
@@ -11,6 +11,7 @@ const CLS_PRIZE_PILL = "inline-flex items-center rounded-full bg-fuchsia-600 px-
11
11
  import { BaseListingCard, Button, Div, GatedPrice, Row, Span, Stack, Text, TextLink } from "../../../ui/index.js";
12
12
  import { MediaImage } from "../../media/MediaImage.js";
13
13
  import { CardStoreLine } from "./CardStoreLine.js";
14
+ import { ProductOwnerQuickActions } from "./ProductOwnerQuickActions.js";
14
15
  const DEFAULT_LABELS = {
15
16
  prizeDrawBadge: "Prize draw",
16
17
  pendingBadge: "Reveal pending",
@@ -100,11 +101,23 @@ export function MarketplacePrizeDrawCard({ product, className = "", variant = "g
100
101
  }, className: selectable || isSelected
101
102
  ? "opacity-100"
102
103
  : "opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto transition-opacity" }))] }), _jsxs(BaseListingCard.Info, { variant: variant, children: [_jsx(TextLink, { href: String(detailHref), children: _jsx(Text, { size: "sm", weight: "medium", color: "primary", truncate: 2, children: product.title }) }), _jsx(CardStoreLine, { storeName: product.storeName, storeId: product.storeId }), _jsxs(Row, { justify: "between", className: "mt-1", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: _jsxs(GatedPrice, { label: "Sign in to see the entry price", children: [formatCurrency(pricePerEntry, getDefaultCurrency()), " ", _jsx(Span, { size: "xs", weight: "normal", className: "text-[var(--appkit-color-text-muted)]", children: mergedLabels.pricePerEntryLabel })] }) }), max > 0 ? (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: mergedLabels.entriesRemainingLabel(remaining, max) })) : null] }), countdown ? (_jsxs(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: [status === "pending" ? "Opens in" : "Closes in", " ", countdown] })) : null, _jsx(Button, { type: "button", variant: "primary", size: "sm", textSize: "xs", className: "mt-2 w-full", onClick: handleNavigate, disabled: status === "closed" || remaining === 0, children: mergedLabels.enterDraw })] })] }));
103
- if (!renderOwnerActions)
104
+ /*
105
+ * 🛑 Default, not opt-in. Nothing in either repo ever passed
106
+ * `renderOwnerActions`, so this toolbar was unreachable on every grid that
107
+ * mounts this card (Root Cause #8 — a slot shell rendered with zero render
108
+ * props). A card is resource-specific by construction, so it names its own
109
+ * resource rather than being threaded one; the prop stays as an override.
110
+ */
111
+ const ownerActions = renderOwnerActions
112
+ ? renderOwnerActions()
113
+ : product.id
114
+ ? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" }))
115
+ : null;
116
+ if (!ownerActions)
104
117
  return card;
105
118
  /*
106
119
  * Sibling of the card, never a child — see the prop's docstring. `z-20`
107
120
  * clears this card's own overlays, which all sit at `z-10`.
108
121
  */
109
- return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: renderOwnerActions() })] }));
122
+ return (_jsxs(Div, { className: "relative h-full", children: [card, _jsx(Div, { className: "absolute right-2 top-2 z-20", children: ownerActions })] }));
110
123
  }
@@ -17,6 +17,7 @@ import { PRODUCT_FEATURE_CARD_MAX_VISIBLE } from "../constants/product-features.
17
17
  import { normalizeListingType } from "../utils/listing-type.js";
18
18
  import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
19
19
  import { WishlistHeartButton } from "../../wishlist/components/WishlistHeartButton.js";
20
+ import { ProductOwnerQuickActions } from "./ProductOwnerQuickActions.js";
20
21
  const __P = {
21
22
  p3: "p-[var(--appkit-space-3)]",
22
23
  };
@@ -125,7 +126,22 @@ export function ProductCard({ product, href, onClick, onAddToWishlist, isWishlis
125
126
  onAddToCart(product);
126
127
  }, className: "justify-center text-[length:var(--appkit-text-xs)]", children: [_jsx("svg", { className: "h-3.5 w-3.5 flex-shrink-0", fill: "none", stroke: "currentColor", strokeWidth: 2, viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 3h2l.4 2M7 13h10l4-8H5.4m1.6 8L5 3H3m4 10v7a1 1 0 001 1h8a1 1 0 001-1v-7M9 21h6" }) }), "Cart"] }))] }))] })] })] }));
127
128
  const wrapped = href && !selectionMode ? (_jsx(Link, { href: href, className: "block h-full", children: cardBody })) : (cardBody);
128
- if (!renderOwnerActions || selectionMode || isSelected)
129
+ /*
130
+ * 🛑 Default, not opt-in — nothing in either repo ever passed
131
+ * `renderOwnerActions`, so this toolbar was unreachable on every product
132
+ * grid in the app despite the prop, the docstring and the positioning all
133
+ * being present (Root Cause #8).
134
+ *
135
+ * `ProductOwnerQuickActions`, not the generic wrapper: a product is the one
136
+ * collection a SELLER can also own, so its endpoints live under
137
+ * `SELLER_ENDPOINTS` and its clone has a bespoke redirect to the copy's
138
+ * editor. `storeId` is the store SLUG, which is what `SessionUser.storeId`
139
+ * holds — the component renders nothing for anyone who owns neither.
140
+ */
141
+ const ownerActions = renderOwnerActions ? (renderOwnerActions()) : product.id ? (_jsx(ProductOwnerQuickActions, { productId: String(product.id), storeId: product.storeId ? String(product.storeId) : undefined, recordLabel: product.title, placement: "card" })) : null;
142
+ // Selection is still suppressed: a bulk-select gesture and a per-record edit
143
+ // are different intents, and offering both at once invites the wrong one.
144
+ if (!ownerActions || selectionMode || isSelected)
129
145
  return wrapped;
130
146
  /*
131
147
  * 🛑 OUTSIDE the anchor, as a sibling — never inside `cardBody`.
@@ -144,7 +160,7 @@ export function ProductCard({ product, href, onClick, onAddToWishlist, isWishlis
144
160
  *
145
161
  * `z-20` beats the in-card overlays, which all sit at `z-10`.
146
162
  */
147
- return (_jsxs(Div, { className: "relative h-full", children: [wrapped, _jsx(Div, { className: "absolute right-2 top-14 z-20", children: renderOwnerActions() })] }));
163
+ return (_jsxs(Div, { className: "relative h-full", children: [wrapped, _jsx(Div, { className: "absolute right-2 top-14 z-20", children: ownerActions })] }));
148
164
  }
149
165
  function ProductListRow({ product, onClick, onAddToWishlist, isWishlisted, }) {
150
166
  const discount = product.originalPrice && product.originalPrice > product.price
@@ -379,6 +379,24 @@ export interface ProductDocument extends BaseDocument {
379
379
  * defects welded into the TITLE.
380
380
  */
381
381
  unitLabel?: string;
382
+ /**
383
+ * This listing is a complete BEY, and this is which one.
384
+ *
385
+ * The `beys` document id, which is also its slug and also the URL
386
+ * (`/beys/{beyId}`) with no re-derivation — the same property that made
387
+ * `partGlossaryId` a single id rather than a pair.
388
+ *
389
+ * 🛑 THE EXACT COUNTERPART OF `partGlossaryId`, and the pair is what makes
390
+ * the seller's "single" choice meaningful: a single item is either one named
391
+ * bey or one named part, and those are the only two things in the catalogue
392
+ * that have an identity to point at. A lot has neither, which is why it
393
+ * files under a non-leaf CATEGORY instead (see `isLot`).
394
+ *
395
+ * 🛑 Never set together with `partGlossaryId`. A listing is a whole bey or a
396
+ * component, not both — and the two link to different reference pages, so a
397
+ * row carrying both would render two contradictory "what is this" sections.
398
+ */
399
+ beyId?: string;
382
400
  /**
383
401
  * This listing is a COMPONENT, and this is which one.
384
402
  *
@@ -22,5 +22,14 @@ export interface CategoryInlineSelectProps {
22
22
  * `MAX_CATEGORY_ASSIGNMENTS`, which is what the repository refuses above.
23
23
  */
24
24
  maxAssignments?: number;
25
+ /**
26
+ * Scope the rows to LEAVES (a single item) or to COLLECTIONS (a lot).
27
+ *
28
+ * 🛑 `undefined` means UNSCOPED, which is what every existing call site
29
+ * gets — this cannot default, because a caller that does not know whether it
30
+ * is a lot must not be silently told it is a single. See `leafFilterFor`
31
+ * for why the server makes this load-bearing rather than cosmetic.
32
+ */
33
+ leavesOnly?: boolean;
25
34
  }
26
- export declare function CategoryInlineSelect({ value, onChange, placeholder, disabled, allowCreate, extraValues, onExtraValuesChange, maxAssignments, }: CategoryInlineSelectProps): React.JSX.Element;
35
+ export declare function CategoryInlineSelect({ value, onChange, placeholder, disabled, allowCreate, extraValues, onExtraValuesChange, maxAssignments, leavesOnly, }: CategoryInlineSelectProps): React.JSX.Element;