@mohasinac/appkit 4.52.5 → 4.53.1

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 (1018) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/client/scaffolds/AppShell.js +1 -1
  5. package/dist/_internal/server/features/auctions/actions.js +1 -1
  6. package/dist/_internal/server/features/auctions/og.d.ts +3 -1
  7. package/dist/_internal/server/features/auctions/og.js +3 -1
  8. package/dist/_internal/server/features/bundles/actions.js +1 -1
  9. package/dist/_internal/server/features/business-documents/download.d.ts +41 -0
  10. package/dist/_internal/server/features/business-documents/download.js +91 -0
  11. package/dist/_internal/server/features/categories/adapters.d.ts +1 -1
  12. package/dist/_internal/server/features/categories/adapters.js +10 -0
  13. package/dist/_internal/server/features/categories/data.js +23 -7
  14. package/dist/_internal/server/features/checkout/actions.d.ts +14 -0
  15. package/dist/_internal/server/features/checkout/actions.js +116 -15
  16. package/dist/_internal/server/features/checkout/bundle-expansion.js +17 -0
  17. package/dist/_internal/server/features/checkout/data.d.ts +37 -0
  18. package/dist/_internal/server/features/checkout/data.js +20 -3
  19. package/dist/_internal/server/features/checkout/group-rule-revalidation.d.ts +34 -0
  20. package/dist/_internal/server/features/checkout/group-rule-revalidation.js +124 -0
  21. package/dist/_internal/server/features/checkout/supplier-identity.d.ts +55 -0
  22. package/dist/_internal/server/features/checkout/supplier-identity.js +81 -0
  23. package/dist/_internal/server/features/classified/metadata.js +1 -1
  24. package/dist/_internal/server/features/classified/og.d.ts +3 -1
  25. package/dist/_internal/server/features/classified/og.js +3 -1
  26. package/dist/_internal/server/features/digital-code/metadata.js +1 -1
  27. package/dist/_internal/server/features/digital-code/og.d.ts +3 -1
  28. package/dist/_internal/server/features/digital-code/og.js +3 -1
  29. package/dist/_internal/server/features/digital-code/pool.d.ts +19 -4
  30. package/dist/_internal/server/features/digital-code/pool.js +19 -4
  31. package/dist/_internal/server/features/live/metadata.js +1 -1
  32. package/dist/_internal/server/features/live/og.d.ts +3 -1
  33. package/dist/_internal/server/features/live/og.js +3 -1
  34. package/dist/_internal/server/features/lottery/actions.js +9 -1
  35. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  36. package/dist/_internal/server/features/lottery/og.js +79 -0
  37. package/dist/_internal/server/features/messages/actions.js +5 -1
  38. package/dist/_internal/server/features/offers/adapters.js +17 -3
  39. package/dist/_internal/server/features/orders/actions.js +7 -2
  40. package/dist/_internal/server/features/parts/og.js +1 -1
  41. package/dist/_internal/server/features/pre-orders/og.d.ts +3 -1
  42. package/dist/_internal/server/features/pre-orders/og.js +3 -1
  43. package/dist/_internal/server/features/price-index/search.d.ts +18 -0
  44. package/dist/_internal/server/features/price-index/search.js +47 -7
  45. package/dist/_internal/server/features/prize-draws/og.d.ts +3 -1
  46. package/dist/_internal/server/features/prize-draws/og.js +3 -1
  47. package/dist/_internal/server/features/products/group-members.d.ts +26 -0
  48. package/dist/_internal/server/features/products/group-members.js +7 -1
  49. package/dist/_internal/server/features/products/og.d.ts +3 -1
  50. package/dist/_internal/server/features/products/og.js +3 -1
  51. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  52. package/dist/_internal/server/features/raffle/actions.js +25 -0
  53. package/dist/_internal/server/features/reviews/actions.js +1 -1
  54. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  55. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  56. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  57. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  58. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  59. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  60. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  61. package/dist/_internal/server/features/search/scoped-sources.d.ts +26 -0
  62. package/dist/_internal/server/features/search/scoped-sources.js +252 -0
  63. package/dist/_internal/server/features/search/search-everything.d.ts +57 -0
  64. package/dist/_internal/server/features/search/search-everything.js +70 -20
  65. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  66. package/dist/_internal/server/features/search/search-sources.js +142 -7
  67. package/dist/_internal/server/features/seo/robots.js +21 -1
  68. package/dist/_internal/server/features/seo/sitemap.js +7 -1
  69. package/dist/_internal/server/features/shared/listing-adapters.js +4 -2
  70. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  71. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  72. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  73. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  74. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  75. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +91 -0
  76. package/dist/_internal/server/features/sticker-trace/adapters.js +175 -0
  77. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  78. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  79. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  80. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  81. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  82. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  83. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  84. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  85. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  86. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  87. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  88. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  89. package/dist/_internal/server/features/sticker-trace/promote-to-listings.d.ts +26 -0
  90. package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +264 -0
  91. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  92. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  93. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  94. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  95. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +143 -0
  96. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +311 -0
  97. package/dist/_internal/server/features/sticker-trace/storage.d.ts +154 -0
  98. package/dist/_internal/server/features/sticker-trace/storage.js +301 -0
  99. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  100. package/dist/_internal/server/features/stores/adapters.js +16 -0
  101. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  102. package/dist/_internal/server/features/stores/index.js +1 -0
  103. package/dist/_internal/server/features/stores/tabs.d.ts +25 -0
  104. package/dist/_internal/server/features/stores/tabs.js +122 -0
  105. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  106. package/dist/_internal/server/functions/scheduled.js +25 -1
  107. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  108. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  109. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  110. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  111. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  112. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  113. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  114. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  115. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  116. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  117. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  118. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  119. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  120. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  121. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  122. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  123. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  124. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  125. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  126. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  127. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  128. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  129. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  130. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  131. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  132. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  133. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  134. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  135. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  136. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  137. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  138. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  139. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  140. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  141. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  142. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  143. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  144. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  145. package/dist/_internal/shared/actions/action-registry.js +29 -0
  146. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  147. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  148. package/dist/_internal/shared/checkout/rules/_defaults.js +0 -2
  149. package/dist/_internal/shared/checkout/rules/_limits.d.ts +14 -1
  150. package/dist/_internal/shared/checkout/rules/_limits.js +14 -1
  151. package/dist/_internal/shared/checkout/rules/_registry.js +2 -0
  152. package/dist/_internal/shared/checkout/rules/auction.rule.js +9 -1
  153. package/dist/_internal/shared/checkout/rules/bundle.rule.js +13 -0
  154. package/dist/_internal/shared/checkout/rules/index.d.ts +2 -0
  155. package/dist/_internal/shared/checkout/rules/index.js +9 -0
  156. package/dist/_internal/shared/checkout/rules/offer.rule.js +0 -1
  157. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +26 -0
  158. package/dist/_internal/shared/checkout/rules/payment-gate.js +133 -0
  159. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +29 -8
  160. package/dist/_internal/shared/checkout/rules/spares.rule.d.ts +16 -0
  161. package/dist/_internal/shared/checkout/rules/spares.rule.js +5 -0
  162. package/dist/_internal/shared/checkout/rules/types.d.ts +26 -2
  163. package/dist/_internal/shared/config/schema.d.ts +122 -0
  164. package/dist/_internal/shared/features/cart/schema.js +3 -2
  165. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  166. package/dist/_internal/shared/features/events/config.js +14 -0
  167. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  168. package/dist/_internal/shared/features/products/group-rules.d.ts +75 -0
  169. package/dist/_internal/shared/features/products/group-rules.js +142 -0
  170. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  171. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  172. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  173. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  174. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  175. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  176. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  177. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  178. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  179. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  180. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  181. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  182. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  183. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  184. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  185. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  186. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  187. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  188. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  189. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  190. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  191. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  192. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  193. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  194. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  195. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  196. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  197. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  198. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  199. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  200. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  201. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  202. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  203. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  204. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  205. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  206. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  207. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  208. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  209. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  210. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  211. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  212. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  213. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  214. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  215. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  216. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  217. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  218. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  219. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  220. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  221. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  222. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  223. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  224. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  225. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  226. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  227. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  228. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  229. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  230. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  231. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  232. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  233. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  234. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  235. package/dist/_internal/shared/listing-types/_registry.d.ts +35 -0
  236. package/dist/_internal/shared/listing-types/_registry.js +39 -1
  237. package/dist/_internal/shared/listing-types/art/config.d.ts +2 -0
  238. package/dist/_internal/shared/listing-types/art/config.js +3 -0
  239. package/dist/_internal/shared/listing-types/auction/config.d.ts +2 -0
  240. package/dist/_internal/shared/listing-types/auction/config.js +3 -0
  241. package/dist/_internal/shared/listing-types/availability.js +48 -0
  242. package/dist/_internal/shared/listing-types/capabilities.js +19 -0
  243. package/dist/_internal/shared/listing-types/classified/config.d.ts +2 -0
  244. package/dist/_internal/shared/listing-types/classified/config.js +3 -0
  245. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +2 -0
  246. package/dist/_internal/shared/listing-types/digital-code/config.js +3 -0
  247. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  248. package/dist/_internal/shared/listing-types/feature-flags.js +10 -0
  249. package/dist/_internal/shared/listing-types/live/config.d.ts +2 -0
  250. package/dist/_internal/shared/listing-types/live/config.js +3 -0
  251. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +2 -0
  252. package/dist/_internal/shared/listing-types/pre-order/config.js +3 -0
  253. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +2 -0
  254. package/dist/_internal/shared/listing-types/prize-draw/config.js +3 -0
  255. package/dist/_internal/shared/listing-types/spares/config.d.ts +74 -0
  256. package/dist/_internal/shared/listing-types/spares/config.js +60 -0
  257. package/dist/_internal/shared/listing-types/spares/ctas.d.ts +1 -0
  258. package/dist/_internal/shared/listing-types/spares/ctas.js +4 -0
  259. package/dist/_internal/shared/listing-types/spares/og.js +1 -0
  260. package/dist/_internal/shared/listing-types/spares/schema.d.ts +2 -0
  261. package/dist/_internal/shared/listing-types/spares/schema.js +3 -0
  262. package/dist/_internal/shared/listing-types/spares/seed-factory.d.ts +1 -0
  263. package/dist/_internal/shared/listing-types/spares/seed-factory.js +1 -0
  264. package/dist/_internal/shared/listing-types/standard/config.d.ts +2 -0
  265. package/dist/_internal/shared/listing-types/standard/config.js +3 -0
  266. package/dist/_internal/shared/listing-types/stickers/config.d.ts +2 -0
  267. package/dist/_internal/shared/listing-types/stickers/config.js +3 -0
  268. package/dist/_internal/shared/media/limits.d.ts +12 -2
  269. package/dist/_internal/shared/media/limits.js +12 -2
  270. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  271. package/dist/_internal/shared/search/artifact-url.js +119 -0
  272. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  273. package/dist/_internal/shared/search/index-record.js +96 -0
  274. package/dist/_internal/shared/search/match.d.ts +76 -0
  275. package/dist/_internal/shared/search/match.js +264 -0
  276. package/dist/_internal/shared/search/to-groups.d.ts +52 -0
  277. package/dist/_internal/shared/search/to-groups.js +141 -0
  278. package/dist/client.d.ts +16 -9
  279. package/dist/client.js +16 -6
  280. package/dist/configs/eslint.js +22 -2
  281. package/dist/constants/api-endpoints.d.ts +107 -15
  282. package/dist/constants/api-endpoints.js +60 -5
  283. package/dist/constants/cache-invalidation.js +3 -1
  284. package/dist/constants/field-names.d.ts +13 -1
  285. package/dist/constants/field-names.js +42 -1
  286. package/dist/contracts/repository.d.ts +8 -7
  287. package/dist/contracts/search.d.ts +2 -2
  288. package/dist/contracts/table.d.ts +3 -3
  289. package/dist/contracts/table.js +3 -3
  290. package/dist/core/contact-submissions.repository.js +2 -2
  291. package/dist/core/integration-keys.js +7 -1
  292. package/dist/core/newsletter.repository.js +2 -2
  293. package/dist/core/site-config.js +1 -1
  294. package/dist/errors/error-codes.d.ts +30 -0
  295. package/dist/errors/error-codes.js +30 -0
  296. package/dist/errors/error-display-map.js +40 -1
  297. package/dist/features/about/components/PolicyPageView.d.ts +22 -2
  298. package/dist/features/about/components/PolicyPageView.js +14 -2
  299. package/dist/features/about/components/PublicProfileView.js +2 -1
  300. package/dist/features/about/components/ShippingPolicyView.js +42 -2
  301. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  302. package/dist/features/account/components/NotificationBell.js +1 -1
  303. package/dist/features/account/components/UserBidsView.js +1 -1
  304. package/dist/features/account/components/index.d.ts +0 -8
  305. package/dist/features/account/components/index.js +0 -4
  306. package/dist/features/account/hooks/useProfileStats.js +5 -1
  307. package/dist/features/addresses/repository/addresses.repository.d.ts +33 -6
  308. package/dist/features/addresses/repository/addresses.repository.js +86 -9
  309. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  310. package/dist/features/admin/actions/admin-actions.js +16 -1
  311. package/dist/features/admin/actions/notification-actions.js +15 -6
  312. package/dist/features/admin/api/bids/route.js +1 -1
  313. package/dist/features/admin/api/coupons/route.js +1 -1
  314. package/dist/features/admin/api/products/route.js +1 -1
  315. package/dist/features/admin/api/reviews/route.js +1 -1
  316. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  317. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  318. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  319. package/dist/features/admin/components/AdminBlogView.js +1 -1
  320. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  321. package/dist/features/admin/components/AdminCategoryEditorView.js +19 -3
  322. package/dist/features/admin/components/AdminContactView.js +1 -1
  323. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  324. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  325. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  326. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  327. package/dist/features/admin/components/AdminPageHeader.js +1 -1
  328. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  329. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  330. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  331. package/dist/features/admin/components/AdminProductEditorView.js +41 -39
  332. package/dist/features/admin/components/AdminProductsView.js +10 -3
  333. package/dist/features/admin/components/AdminScammersView.js +1 -1
  334. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  335. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  336. package/dist/features/admin/components/AdminSidebar.js +1 -1
  337. package/dist/features/admin/components/AdminSiteSettingsView.js +39 -8
  338. package/dist/features/admin/components/AdminSparesView.d.ts +12 -0
  339. package/dist/features/admin/components/AdminSparesView.js +30 -0
  340. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  341. package/dist/features/admin/components/AdminTeamView.js +1 -1
  342. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  343. package/dist/features/admin/components/AdminUsersView.js +10 -8
  344. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  345. package/dist/features/admin/components/DataListingView.js +9 -4
  346. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  347. package/dist/features/admin/components/index.d.ts +2 -0
  348. package/dist/features/admin/components/index.js +1 -0
  349. package/dist/features/admin/components/sections/adminSectionsTypes.js +7 -0
  350. package/dist/features/admin/constants/filter-tabs.d.ts +3 -0
  351. package/dist/features/admin/constants/filter-tabs.js +1 -0
  352. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  353. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  354. package/dist/features/admin/schemas/firestore.d.ts +88 -3
  355. package/dist/features/admin/schemas/firestore.js +32 -0
  356. package/dist/features/admin/types/index.d.ts +1 -1
  357. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  358. package/dist/features/auctions/actions/bid-actions.js +16 -4
  359. package/dist/features/auctions/api/route.js +1 -1
  360. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  361. package/dist/features/auctions/components/AuctionDetailPageView.js +4 -11
  362. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  363. package/dist/features/auctions/repository/bid.repository.js +114 -13
  364. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  365. package/dist/features/auctions/schemas/firestore.js +1 -0
  366. package/dist/features/auth/actions/profile-actions.js +30 -4
  367. package/dist/features/auth/components/index.d.ts +0 -1
  368. package/dist/features/auth/components/index.js +0 -1
  369. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  370. package/dist/features/auth/repository/session.repository.js +46 -5
  371. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  372. package/dist/features/auth/repository/token.repository.js +65 -11
  373. package/dist/features/auth/repository/user.repository.d.ts +46 -7
  374. package/dist/features/auth/repository/user.repository.js +128 -15
  375. package/dist/features/auth/schemas/firestore.d.ts +65 -12
  376. package/dist/features/auth/schemas/firestore.js +13 -0
  377. package/dist/features/before-after/api/route.js +1 -1
  378. package/dist/features/blog/components/BlogListView.js +16 -3
  379. package/dist/features/blog/components/BlogPostView.js +1 -1
  380. package/dist/features/blog/schemas/index.d.ts +2 -2
  381. package/dist/features/business-documents/repository/business-documents.repository.d.ts +58 -0
  382. package/dist/features/business-documents/repository/business-documents.repository.js +54 -0
  383. package/dist/features/business-documents/schemas/firestore.d.ts +105 -0
  384. package/dist/features/business-documents/schemas/firestore.js +75 -0
  385. package/dist/features/cart/actions/cart-actions.js +83 -6
  386. package/dist/features/cart/api/route.js +1 -1
  387. package/dist/features/cart/repository/cart.repository.js +32 -4
  388. package/dist/features/cart/schemas/firestore.d.ts +20 -0
  389. package/dist/features/cart/schemas/index.d.ts +2 -2
  390. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +1 -1
  391. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  392. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  393. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  394. package/dist/features/categories/api/[id]/price-guidance/route.d.ts +42 -0
  395. package/dist/features/categories/api/[id]/price-guidance/route.js +113 -0
  396. package/dist/features/categories/api/route.js +10 -10
  397. package/dist/features/categories/components/BrandDetailPageView.js +19 -3
  398. package/dist/features/categories/components/BrandDetailTabs.js +10 -0
  399. package/dist/features/categories/components/CategoriesIndexListing.js +23 -8
  400. package/dist/features/categories/components/CategoryDetailPageView.js +170 -13
  401. package/dist/features/categories/components/CategoryDetailTabs.js +12 -0
  402. package/dist/features/categories/components/CategoryGrid.js +10 -1
  403. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  404. package/dist/features/categories/components/PriceGuidanceHint.d.ts +29 -0
  405. package/dist/features/categories/components/PriceGuidanceHint.js +61 -0
  406. package/dist/features/categories/components/SubcategoryCardRow.d.ts +27 -0
  407. package/dist/features/categories/components/SubcategoryCardRow.js +98 -0
  408. package/dist/features/categories/components/index.d.ts +0 -2
  409. package/dist/features/categories/components/index.js +0 -1
  410. package/dist/features/categories/constants/category-tabs.d.ts +20 -25
  411. package/dist/features/categories/constants/category-tabs.js +22 -39
  412. package/dist/features/categories/repository/categories.repository.d.ts +13 -0
  413. package/dist/features/categories/repository/categories.repository.js +51 -1
  414. package/dist/features/categories/schemas/firestore.d.ts +22 -1
  415. package/dist/features/categories/schemas/firestore.js +10 -0
  416. package/dist/features/categories/schemas/index.d.ts +8 -2
  417. package/dist/features/categories/schemas/index.js +2 -0
  418. package/dist/features/categories/types/index.d.ts +8 -0
  419. package/dist/features/categories/utils/taxonomy-visual.d.ts +34 -0
  420. package/dist/features/categories/utils/taxonomy-visual.js +74 -0
  421. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  422. package/dist/features/classified/components/ClassifiedDetailPageView.js +4 -9
  423. package/dist/features/collections/api/[slug]/route.js +3 -3
  424. package/dist/features/collections/api/route.js +1 -1
  425. package/dist/features/consultation/api/route.js +1 -1
  426. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  427. package/dist/features/consultation/types/index.d.ts +1 -1
  428. package/dist/features/contact/components/ContactForm.js +1 -3
  429. package/dist/features/contact/components/ContactPageView.d.ts +33 -1
  430. package/dist/features/contact/components/ContactPageView.js +58 -28
  431. package/dist/features/corporate/api/route.js +1 -1
  432. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  433. package/dist/features/corporate/types/index.d.ts +1 -1
  434. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  435. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  436. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +4 -9
  437. package/dist/features/events/actions/event-actions.d.ts +14 -0
  438. package/dist/features/events/actions/event-actions.js +82 -3
  439. package/dist/features/events/api/[id]/route.js +2 -2
  440. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  441. package/dist/features/events/components/AdminEventsView.js +32 -8
  442. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  443. package/dist/features/events/components/EventRafflesSection.js +52 -3
  444. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  445. package/dist/features/events/components/SpinWheelView.js +41 -4
  446. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  447. package/dist/features/events/repository/event-entry.repository.js +41 -7
  448. package/dist/features/events/schemas/firestore.d.ts +17 -4
  449. package/dist/features/events/types/index.d.ts +37 -0
  450. package/dist/features/faq/repository/faqs.repository.js +1 -1
  451. package/dist/features/faq/schemas/index.d.ts +5 -2
  452. package/dist/features/faq/schemas/index.js +6 -0
  453. package/dist/features/faq/types/index.d.ts +0 -1
  454. package/dist/features/grouped/components/GroupedListingDetailView.js +9 -1
  455. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  456. package/dist/features/grouped/schemas/firestore.d.ts +5 -0
  457. package/dist/features/homepage/actions/homepage-section-actions.d.ts +3 -3
  458. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  459. package/dist/features/homepage/api/carousel/route.js +4 -4
  460. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  461. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  462. package/dist/features/homepage/components/CollectionCardsSection.d.ts +28 -6
  463. package/dist/features/homepage/components/CollectionCardsSection.js +43 -8
  464. package/dist/features/homepage/components/HowItWorksSection.d.ts +23 -6
  465. package/dist/features/homepage/components/HowItWorksSection.js +4 -4
  466. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  467. package/dist/features/homepage/components/PromoGrid.d.ts +31 -2
  468. package/dist/features/homepage/components/PromoGrid.js +12 -3
  469. package/dist/features/homepage/components/TestimonialsCarousel.d.ts +34 -2
  470. package/dist/features/homepage/components/TestimonialsCarousel.js +1 -1
  471. package/dist/features/homepage/components/index.d.ts +0 -22
  472. package/dist/features/homepage/components/index.js +0 -12
  473. package/dist/features/homepage/index.d.ts +0 -2
  474. package/dist/features/homepage/index.js +0 -2
  475. package/dist/features/homepage/lib/section-renderer.d.ts +9 -0
  476. package/dist/features/homepage/lib/section-renderer.js +202 -58
  477. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +35 -3
  478. package/dist/features/homepage/repository/homepage-sections.repository.js +58 -8
  479. package/dist/features/homepage/schemas/firestore.d.ts +112 -3
  480. package/dist/features/homepage/schemas/firestore.js +32 -2
  481. package/dist/features/homepage/schemas/index.d.ts +46 -17
  482. package/dist/features/homepage/schemas/index.js +39 -27
  483. package/dist/features/homepage/server.d.ts +0 -3
  484. package/dist/features/homepage/server.js +0 -3
  485. package/dist/features/homepage/types/index.d.ts +0 -47
  486. package/dist/features/homepage/types/index.js +49 -0
  487. package/dist/features/layout/AppLayoutShell.d.ts +11 -0
  488. package/dist/features/layout/AppLayoutShell.js +65 -13
  489. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  490. package/dist/features/layout/BottomActionsContext.js +5 -0
  491. package/dist/features/layout/BottomChrome.js +48 -9
  492. package/dist/features/layout/BottomNavItem.js +1 -1
  493. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  494. package/dist/features/layout/BottomNavbar.js +43 -3
  495. package/dist/features/layout/BottomSheet.js +1 -1
  496. package/dist/features/layout/MainNavbar.d.ts +11 -0
  497. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  498. package/dist/features/layout/NavbarLayout.js +88 -11
  499. package/dist/features/layout/SideActionDock.d.ts +1 -0
  500. package/dist/features/layout/SideActionDock.js +219 -0
  501. package/dist/features/layout/TitleBarLayout.js +1 -1
  502. package/dist/features/layout/cta-anchor.d.ts +31 -0
  503. package/dist/features/layout/cta-anchor.js +31 -0
  504. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  505. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  506. package/dist/features/layout/index.d.ts +9 -1
  507. package/dist/features/layout/index.js +9 -1
  508. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  509. package/dist/features/layout/useCtaReveal.js +82 -0
  510. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  511. package/dist/features/layout/useHoldToOpen.js +84 -0
  512. package/dist/features/live/components/LiveItemDetailPageView.js +4 -9
  513. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  514. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  515. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  516. package/dist/features/loyalty/api/balance/route.js +1 -1
  517. package/dist/features/loyalty/api/history/route.js +1 -1
  518. package/dist/features/media/MediaImage.js +0 -1
  519. package/dist/features/media/MediaPickerModal.js +7 -1
  520. package/dist/features/media/hooks/useMedia.js +17 -0
  521. package/dist/features/media/modals/ImageEditor.js +5 -1
  522. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  523. package/dist/features/media/repository/media-assets.repository.d.ts +65 -0
  524. package/dist/features/media/repository/media-assets.repository.js +31 -0
  525. package/dist/features/media/trust-signals.d.ts +85 -0
  526. package/dist/features/media/trust-signals.js +126 -0
  527. package/dist/features/media/upload/CameraCapture.js +16 -1
  528. package/dist/features/media/upload/ImageUpload.js +42 -4
  529. package/dist/features/media/upload/MediaUploadField.js +69 -13
  530. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  531. package/dist/features/media/upload/downscale-image.js +150 -0
  532. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  533. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  534. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  535. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  536. package/dist/features/orders/hooks/useOrders.js +4 -2
  537. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  538. package/dist/features/orders/repository/orders.repository.js +52 -20
  539. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  540. package/dist/features/orders/schemas/index.d.ts +8 -8
  541. package/dist/features/orders/types/index.d.ts +2 -2
  542. package/dist/features/parts/components/PartDetailPageView.d.ts +14 -1
  543. package/dist/features/parts/components/PartDetailPageView.js +2 -2
  544. package/dist/features/parts/components/PartsIndexPageView.d.ts +11 -2
  545. package/dist/features/parts/components/PartsIndexPageView.js +2 -2
  546. package/dist/features/parts/components/PartsSearchBox.d.ts +9 -0
  547. package/dist/features/parts/components/PartsSearchBox.js +57 -0
  548. package/dist/features/parts/schemas/firestore.d.ts +149 -3
  549. package/dist/features/parts/schemas/firestore.js +184 -0
  550. package/dist/features/payments/repository/payments.repository.js +2 -2
  551. package/dist/features/payments/repository/payout.repository.d.ts +38 -6
  552. package/dist/features/payments/repository/payout.repository.js +84 -23
  553. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  554. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  555. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  556. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  557. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  558. package/dist/features/pre-orders/api/admin/route.js +1 -1
  559. package/dist/features/pre-orders/api/route.js +1 -1
  560. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +4 -11
  561. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  562. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  563. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  564. package/dist/features/price-index/components/PriceIndexToolView.d.ts +3 -1
  565. package/dist/features/price-index/components/PriceIndexToolView.js +92 -13
  566. package/dist/features/products/api/[id]/route.js +1 -1
  567. package/dist/features/products/components/CompareOverlay.d.ts +18 -1
  568. package/dist/features/products/components/CompareOverlay.js +21 -2
  569. package/dist/features/products/components/CustomSectionTabContent.d.ts +31 -0
  570. package/dist/features/products/components/CustomSectionTabContent.js +29 -3
  571. package/dist/features/products/components/GroupMemberPicker.d.ts +19 -1
  572. package/dist/features/products/components/GroupMemberPicker.js +46 -8
  573. package/dist/features/products/components/GroupSettingsPanel.d.ts +11 -1
  574. package/dist/features/products/components/GroupSettingsPanel.js +91 -3
  575. package/dist/features/products/components/ListingBottomActions.js +4 -0
  576. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  577. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +15 -1
  578. package/dist/features/products/components/PrizeDrawEntryActions.js +70 -8
  579. package/dist/features/products/components/ProductDetailPageView.js +75 -15
  580. package/dist/features/products/components/ProductForm.d.ts +13 -1
  581. package/dist/features/products/components/ProductForm.js +16 -2
  582. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  583. package/dist/features/products/components/ProductGrid.js +12 -1
  584. package/dist/features/products/components/ProductsIndexListing.d.ts +16 -1
  585. package/dist/features/products/components/ProductsIndexListing.js +3 -3
  586. package/dist/features/products/components/ShowGroupSection.js +15 -2
  587. package/dist/features/products/components/SparesListView.d.ts +7 -0
  588. package/dist/features/products/components/SparesListView.js +39 -0
  589. package/dist/features/products/components/index.d.ts +0 -2
  590. package/dist/features/products/components/index.js +0 -1
  591. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  592. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  593. package/dist/features/products/constants/action-defs.d.ts +1 -0
  594. package/dist/features/products/constants/action-defs.js +1 -0
  595. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  596. package/dist/features/products/constants/listing-tabs.js +3 -2
  597. package/dist/features/products/hooks/useProducts.js +2 -2
  598. package/dist/features/products/repository/products.repository.d.ts +98 -0
  599. package/dist/features/products/repository/products.repository.js +248 -18
  600. package/dist/features/products/schemas/firestore.d.ts +97 -4
  601. package/dist/features/products/schemas/firestore.js +104 -0
  602. package/dist/features/products/schemas/index.d.ts +12 -21
  603. package/dist/features/products/schemas/index.js +23 -6
  604. package/dist/features/products/types/index.d.ts +46 -2
  605. package/dist/features/products/utils/group-member-image.d.ts +39 -0
  606. package/dist/features/products/utils/group-member-image.js +3 -0
  607. package/dist/features/products/utils/listing-badge-variant.js +4 -0
  608. package/dist/features/promotions/api/route.js +1 -1
  609. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  610. package/dist/features/reviews/actions/review-actions.js +22 -8
  611. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  612. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  613. package/dist/features/reviews/components/ReviewsList.js +1 -1
  614. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  615. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  616. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  617. package/dist/features/reviews/schemas/index.d.ts +2 -2
  618. package/dist/features/scams/actions/scam-actions.js +16 -4
  619. package/dist/features/scams/components/ScamProfileView.js +1 -1
  620. package/dist/features/search/components/EntityTypeahead.d.ts +44 -0
  621. package/dist/features/search/components/EntityTypeahead.js +92 -0
  622. package/dist/features/search/components/Search.d.ts +12 -1
  623. package/dist/features/search/components/Search.js +47 -3
  624. package/dist/features/search/components/SearchFacetRail.d.ts +11 -0
  625. package/dist/features/search/components/SearchFacetRail.js +92 -0
  626. package/dist/features/search/components/SearchResultsClient.d.ts +33 -0
  627. package/dist/features/search/components/SearchResultsClient.js +103 -0
  628. package/dist/features/search/components/SearchResultsPageView.d.ts +15 -1
  629. package/dist/features/search/components/SearchResultsPageView.js +3 -2
  630. package/dist/features/search/components/index.d.ts +0 -6
  631. package/dist/features/search/components/index.js +0 -3
  632. package/dist/features/search/hooks/useNavSuggestions.d.ts +13 -0
  633. package/dist/features/search/hooks/useScopedSearch.d.ts +34 -0
  634. package/dist/features/search/hooks/useScopedSearch.js +114 -0
  635. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  636. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  637. package/dist/features/search/hooks/useSiteSearch.d.ts +26 -0
  638. package/dist/features/search/hooks/useSiteSearch.js +149 -0
  639. package/dist/features/search/index.d.ts +0 -4
  640. package/dist/features/search/index.js +0 -4
  641. package/dist/features/search/manifest.d.ts +12 -0
  642. package/dist/features/search/manifest.js +17 -2
  643. package/dist/features/search/server.d.ts +0 -3
  644. package/dist/features/search/server.js +0 -3
  645. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  646. package/dist/features/seller/actions/offer-actions.js +38 -8
  647. package/dist/features/seller/actions/seller-actions.js +34 -7
  648. package/dist/features/seller/api/coupons/route.js +1 -1
  649. package/dist/features/seller/api/products/route.js +1 -1
  650. package/dist/features/seller/api/store/route.js +1 -1
  651. package/dist/features/seller/components/SellerBidsView.js +1 -1
  652. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  653. package/dist/features/seller/components/SellerListingTypeView.d.ts +1 -1
  654. package/dist/features/seller/components/SellerListingTypeView.js +29 -1
  655. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  656. package/dist/features/seller/components/SellerPayoutSettingsView.js +35 -15
  657. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  658. package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
  659. package/dist/features/seller/components/SellerProductShell.js +2 -2
  660. package/dist/features/seller/components/SellerProductsView.js +1 -1
  661. package/dist/features/seller/components/SellerShippingView.js +0 -1
  662. package/dist/features/seller/components/SellerSidebar.js +1 -1
  663. package/dist/features/seller/components/SellerSparesView.d.ts +17 -0
  664. package/dist/features/seller/components/SellerSparesView.js +6 -0
  665. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  666. package/dist/features/seller/components/index.d.ts +2 -4
  667. package/dist/features/seller/components/index.js +1 -2
  668. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  669. package/dist/features/seller/repository/offer.repository.js +43 -7
  670. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  671. package/dist/features/seller/schemas/index.d.ts +4 -4
  672. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  673. package/dist/features/seller/schemas/order-forms.js +37 -0
  674. package/dist/features/shell/CommandPalette.js +1 -1
  675. package/dist/features/shell/FormShell.js +6 -2
  676. package/dist/features/shell/QuickFormDrawer.js +15 -1
  677. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  678. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  679. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  680. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  681. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  682. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  683. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  684. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  685. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  686. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  687. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  688. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  689. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  690. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  691. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  692. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  693. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  694. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  695. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  696. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  697. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  698. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  699. package/dist/features/sticker-trace/schemas/firestore.d.ts +267 -0
  700. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  701. package/dist/features/sticker-trace/server.d.ts +8 -0
  702. package/dist/features/sticker-trace/server.js +51 -0
  703. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  704. package/dist/features/stores/actions/store-query-actions.js +7 -2
  705. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  706. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  707. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  708. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  709. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  710. package/dist/features/stores/components/StoreDetailLayoutView.js +7 -82
  711. package/dist/features/stores/components/StoreHeader.js +1 -2
  712. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  713. package/dist/features/stores/components/StoreSparesPageView.d.ts +27 -0
  714. package/dist/features/stores/components/StoreSparesPageView.js +48 -0
  715. package/dist/features/stores/manifest.js +8 -4
  716. package/dist/features/stores/schemas/firestore.d.ts +19 -0
  717. package/dist/features/support/repository/support.repository.d.ts +14 -3
  718. package/dist/features/support/repository/support.repository.js +93 -13
  719. package/dist/features/support/schemas/firestore.d.ts +16 -5
  720. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  721. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  722. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +2 -0
  723. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +96 -0
  724. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +4 -0
  725. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +478 -0
  726. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +54 -32
  727. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  728. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  729. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  730. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +3 -2
  731. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +2 -0
  732. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +73 -0
  733. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +2 -0
  734. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +340 -0
  735. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  736. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  737. package/dist/features/tester/seed-data/authored/index.js +24 -0
  738. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +1 -0
  739. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +57 -0
  740. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  741. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  742. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +2 -0
  743. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +77 -0
  744. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +2 -0
  745. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +58 -0
  746. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  747. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +284 -0
  748. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +558 -34
  749. package/dist/index.d.ts +27 -80
  750. package/dist/index.js +62 -115
  751. package/dist/next/api/routeHandler.js +9 -0
  752. package/dist/next/routing/require-record.d.ts +13 -0
  753. package/dist/next/routing/require-record.js +62 -0
  754. package/dist/next/routing/route-map.d.ts +46 -5
  755. package/dist/next/routing/route-map.js +70 -3
  756. package/dist/providers/db-firebase/base.d.ts +4 -2
  757. package/dist/providers/db-firebase/base.js +21 -5
  758. package/dist/providers/db-firebase/base.repository.d.ts +33 -9
  759. package/dist/providers/db-firebase/base.repository.js +55 -0
  760. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  761. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  762. package/dist/react/ErrorBoundary.js +6 -1
  763. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  764. package/dist/react/hooks/realtime-event-constants.js +8 -0
  765. package/dist/react/hooks/useEntityDelete.js +5 -1
  766. package/dist/react/hooks/useMessage.js +5 -1
  767. package/dist/repositories/index.d.ts +2 -2
  768. package/dist/repositories/index.js +6 -1
  769. package/dist/schemas/registry.d.ts +28 -26
  770. package/dist/schemas/registry.js +31 -14
  771. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  772. package/dist/security/blind-index-tokens.d.ts +54 -0
  773. package/dist/security/blind-index-tokens.js +152 -0
  774. package/dist/security/encrypted.d.ts +117 -0
  775. package/dist/security/encrypted.js +100 -0
  776. package/dist/security/index.d.ts +6 -3
  777. package/dist/security/index.js +17 -3
  778. package/dist/security/pii-accessors.d.ts +71 -0
  779. package/dist/security/pii-accessors.js +150 -0
  780. package/dist/security/pii-encrypt.d.ts +0 -8
  781. package/dist/security/pii-encrypt.js +22 -15
  782. package/dist/security/pii-mask.d.ts +18 -0
  783. package/dist/security/pii-mask.js +27 -0
  784. package/dist/security/settings-encryption.d.ts +35 -0
  785. package/dist/security/settings-encryption.js +91 -0
  786. package/dist/seed/_helpers/brand-rows.js +38 -14
  787. package/dist/seed/_helpers/category-forest.js +73 -7
  788. package/dist/seed/_helpers/category-images-generated.d.ts +25 -6
  789. package/dist/seed/_helpers/category-images-generated.js +81 -6
  790. package/dist/seed/_helpers/category-models.d.ts +1 -1
  791. package/dist/seed/_helpers/category-models.js +7 -1
  792. package/dist/seed/_helpers/category-parts-glossary-map.js +8 -0
  793. package/dist/seed/_helpers/category-parts.d.ts +1 -1
  794. package/dist/seed/_helpers/category-parts.js +50 -2
  795. package/dist/seed/_helpers/character-features.d.ts +1 -1
  796. package/dist/seed/_helpers/character-features.js +2 -1
  797. package/dist/seed/_helpers/franchise-rows.js +10 -2
  798. package/dist/seed/_helpers/media.d.ts +47 -0
  799. package/dist/seed/_helpers/media.js +34 -0
  800. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  801. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  802. package/dist/seed/addresses-seed-data.d.ts +2 -2
  803. package/dist/seed/authenticity-knowledge-seed-data.d.ts +78 -0
  804. package/dist/seed/authenticity-knowledge-seed-data.js +10729 -0
  805. package/dist/seed/bids-seed-data.d.ts +2 -2
  806. package/dist/seed/bids-seed-data.js +23 -2
  807. package/dist/seed/categories-seed-data.js +124 -20
  808. package/dist/seed/events-seed-data.d.ts +2 -2
  809. package/dist/seed/events-seed-data.js +5 -0
  810. package/dist/seed/faq-seed-data.js +175 -5
  811. package/dist/seed/grouped-listings-seed-data.js +16 -0
  812. package/dist/seed/homepage-sections-seed-data.js +131 -26
  813. package/dist/seed/index.d.ts +3 -3
  814. package/dist/seed/index.js +3 -2
  815. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  816. package/dist/seed/manifest.js +3 -0
  817. package/dist/seed/media-assets-seed-data.d.ts +1 -1
  818. package/dist/seed/media-assets-seed-data.js +746 -196
  819. package/dist/seed/model-composition-seed-data.js +122 -6
  820. package/dist/seed/offers-seed-data.d.ts +2 -2
  821. package/dist/seed/offers-seed-data.js +1 -1
  822. package/dist/seed/orders-seed-data.d.ts +2 -2
  823. package/dist/seed/part-glossary-seed-data.d.ts +1 -1
  824. package/dist/seed/part-glossary-seed-data.js +37219 -463
  825. package/dist/seed/payouts-seed-data.d.ts +2 -2
  826. package/dist/seed/payouts-seed-data.js +1 -1
  827. package/dist/seed/products-art-seed-data.js +7 -18
  828. package/dist/seed/products-auctions-seed-data.js +56 -47
  829. package/dist/seed/products-beyblade-x-seed-data.d.ts +2 -0
  830. package/dist/seed/products-beyblade-x-seed-data.js +441 -0
  831. package/dist/seed/products-catalogue-seed-data.d.ts +5 -5
  832. package/dist/seed/products-catalogue-seed-data.js +1500 -1240
  833. package/dist/seed/products-classifieds-seed-data.js +9 -27
  834. package/dist/seed/products-digital-codes-seed-data.js +9 -18
  835. package/dist/seed/products-live-items-seed-data.js +5 -13
  836. package/dist/seed/products-preorders-seed-data.js +67 -33
  837. package/dist/seed/products-prize-draws-seed-data.js +8 -17
  838. package/dist/seed/products-spares-seed-data.d.ts +2 -0
  839. package/dist/seed/products-spares-seed-data.js +368 -0
  840. package/dist/seed/products-standard-seed-data.js +39 -126
  841. package/dist/seed/products-stickers-seed-data.js +59 -15
  842. package/dist/seed/reviews-seed-data.d.ts +1 -2
  843. package/dist/seed/seed-purpose.js +7 -0
  844. package/dist/seed/sessions-seed-data.d.ts +2 -2
  845. package/dist/seed/sessions-seed-data.js +5 -0
  846. package/dist/seed/site-settings-seed-data.js +9 -1
  847. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  848. package/dist/seed/support-tickets-seed-data.js +1 -1
  849. package/dist/seed/users-seed-data.d.ts +2 -2
  850. package/dist/seed/users-seed-data.js +1 -1
  851. package/dist/seo/json-ld.d.ts +25 -0
  852. package/dist/seo/json-ld.js +33 -1
  853. package/dist/server-entry.d.ts +3 -1
  854. package/dist/server-entry.js +2 -2
  855. package/dist/server.d.ts +27 -12
  856. package/dist/server.js +86 -28
  857. package/dist/styles.css +438 -1
  858. package/dist/tailwind-input.css +31 -17
  859. package/dist/tailwind-utilities.css +1 -1
  860. package/dist/ui/components/Accordion.js +1 -1
  861. package/dist/ui/components/Breadcrumb.js +1 -1
  862. package/dist/ui/components/Button.js +7 -1
  863. package/dist/ui/components/DetailPageGallery.js +0 -2
  864. package/dist/ui/components/DetailPageHero.js +0 -1
  865. package/dist/ui/components/DetailPageTabs.js +1 -1
  866. package/dist/ui/components/Divider.js +3 -3
  867. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  868. package/dist/ui/components/FilterChipGroup.js +1 -1
  869. package/dist/ui/components/GatedPrice.js +5 -1
  870. package/dist/ui/components/HorizontalScroller.js +1 -1
  871. package/dist/ui/components/ImageGallery.js +6 -1
  872. package/dist/ui/components/ListingLayout.js +17 -11
  873. package/dist/ui/components/MediaTabs.style.css +81 -0
  874. package/dist/ui/components/OverflowRow.d.ts +92 -0
  875. package/dist/ui/components/OverflowRow.js +203 -0
  876. package/dist/ui/components/OverflowRow.style.css +235 -0
  877. package/dist/ui/components/Pagination.js +1 -1
  878. package/dist/ui/components/PendingValue.d.ts +45 -0
  879. package/dist/ui/components/PendingValue.js +7 -0
  880. package/dist/ui/components/Radio.style.css +119 -0
  881. package/dist/ui/components/RatingDisplay.js +2 -2
  882. package/dist/ui/components/RecordDetailModal.js +14 -1
  883. package/dist/ui/components/RowActionMenu.js +5 -1
  884. package/dist/ui/components/SettingsSection.js +0 -2
  885. package/dist/ui/components/SideDrawer.js +5 -1
  886. package/dist/ui/components/SideModal.js +9 -1
  887. package/dist/ui/components/SiteLogo.js +3 -0
  888. package/dist/ui/components/SiteMark.js +3 -0
  889. package/dist/ui/components/SortDropdown.js +1 -1
  890. package/dist/ui/components/SpecTable.d.ts +58 -0
  891. package/dist/ui/components/SpecTable.js +8 -0
  892. package/dist/ui/components/StarRating.js +1 -3
  893. package/dist/ui/components/SummaryCard.js +1 -1
  894. package/dist/ui/components/TabBarShell.d.ts +12 -1
  895. package/dist/ui/components/TabBarShell.js +3 -2
  896. package/dist/ui/components/Tabs.js +36 -24
  897. package/dist/ui/components/Toast.d.ts +3 -24
  898. package/dist/ui/components/Toast.js +2 -19
  899. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  900. package/dist/ui/components/TopBannerPortal.js +19 -0
  901. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  902. package/dist/ui/components/index.style.css +2 -0
  903. package/dist/ui/components/row-collapse.d.ts +15 -0
  904. package/dist/ui/components/row-collapse.js +127 -0
  905. package/dist/ui/components/toast-context.d.ts +63 -0
  906. package/dist/ui/components/toast-context.js +48 -0
  907. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  908. package/dist/ui/components/top-banner-slot.js +45 -0
  909. package/dist/ui/icons/icon-registry.d.ts +7 -0
  910. package/dist/ui/icons/icon-registry.js +25 -1
  911. package/dist/ui/index.d.ts +6 -0
  912. package/dist/ui/index.js +3 -0
  913. package/dist/utils/array.helper.d.ts +2 -2
  914. package/dist/utils/array.helper.js +5 -5
  915. package/dist/utils/id-generators.d.ts +6 -0
  916. package/dist/utils/id-generators.js +10 -0
  917. package/dist/utils/media-url.js +0 -2
  918. package/dist/utils/search-txt-builders.d.ts +28 -4
  919. package/dist/utils/search-txt-builders.js +41 -1
  920. package/dist/utils/search-txt-query.d.ts +12 -0
  921. package/dist/utils/search-txt-query.js +12 -0
  922. package/dist/validation/schemas.d.ts +8 -8
  923. package/package.json +6 -2
  924. package/scripts/dedupe-peer-deps.mjs +18 -0
  925. package/scripts/seed-cli.mjs +138 -26
  926. package/scripts/verify-css-build.mjs +118 -37
  927. package/dist/_internal/server/features/search/actions.d.ts +0 -7
  928. package/dist/_internal/server/features/search/actions.js +0 -21
  929. package/dist/_internal/server/features/search/data.d.ts +0 -15
  930. package/dist/_internal/server/features/search/data.js +0 -18
  931. package/dist/_internal/server/features/search/index.d.ts +0 -3
  932. package/dist/_internal/server/features/search/index.js +0 -2
  933. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  934. package/dist/features/account/components/UserAddressesView.js +0 -5
  935. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  936. package/dist/features/account/components/UserNotificationsView.js +0 -12
  937. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  938. package/dist/features/account/components/UserSettingsView.js +0 -13
  939. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  940. package/dist/features/account/components/UserSupportView.js +0 -166
  941. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  942. package/dist/features/admin/components/DemoSeedView.js +0 -5
  943. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  944. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  945. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  946. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  947. package/dist/features/homepage/api/[id]/route.d.ts +0 -23
  948. package/dist/features/homepage/api/[id]/route.js +0 -103
  949. package/dist/features/homepage/api/route.d.ts +0 -14
  950. package/dist/features/homepage/api/route.js +0 -140
  951. package/dist/features/homepage/api/sections/[id]/route.d.ts +0 -26
  952. package/dist/features/homepage/api/sections/[id]/route.js +0 -95
  953. package/dist/features/homepage/api/sections/route.d.ts +0 -13
  954. package/dist/features/homepage/api/sections/route.js +0 -82
  955. package/dist/features/homepage/components/AdvertisementBanner.d.ts +0 -14
  956. package/dist/features/homepage/components/AdvertisementBanner.js +0 -35
  957. package/dist/features/homepage/components/BeforeAfterCard.d.ts +0 -9
  958. package/dist/features/homepage/components/BeforeAfterCard.js +0 -73
  959. package/dist/features/homepage/components/FeaturedResultsSection.d.ts +0 -17
  960. package/dist/features/homepage/components/FeaturedResultsSection.js +0 -17
  961. package/dist/features/homepage/components/HeroBanner.d.ts +0 -7
  962. package/dist/features/homepage/components/HeroBanner.js +0 -43
  963. package/dist/features/homepage/components/HeroSection.d.ts +0 -7
  964. package/dist/features/homepage/components/HeroSection.js +0 -6
  965. package/dist/features/homepage/components/HomepageSkeleton.d.ts +0 -2
  966. package/dist/features/homepage/components/HomepageSkeleton.js +0 -21
  967. package/dist/features/homepage/components/HomepageView.d.ts +0 -25
  968. package/dist/features/homepage/components/HomepageView.js +0 -5
  969. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  970. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  971. package/dist/features/homepage/components/NewsletterBanner.d.ts +0 -23
  972. package/dist/features/homepage/components/NewsletterBanner.js +0 -37
  973. package/dist/features/homepage/components/SiteFeaturesSection.d.ts +0 -14
  974. package/dist/features/homepage/components/SiteFeaturesSection.js +0 -11
  975. package/dist/features/homepage/components/TrustBadges.d.ts +0 -6
  976. package/dist/features/homepage/components/TrustBadges.js +0 -46
  977. package/dist/features/homepage/components/TrustIndicatorsSection.d.ts +0 -12
  978. package/dist/features/homepage/components/TrustIndicatorsSection.js +0 -11
  979. package/dist/features/homepage/hooks/useHomepage.d.ts +0 -11
  980. package/dist/features/homepage/hooks/useHomepage.js +0 -17
  981. package/dist/features/homepage/hooks/useHomepageSections.d.ts +0 -2
  982. package/dist/features/homepage/hooks/useHomepageSections.js +0 -10
  983. package/dist/features/homepage/repository/homepage.repository.d.ts +0 -11
  984. package/dist/features/homepage/repository/homepage.repository.js +0 -25
  985. package/dist/features/layout/BottomActions.d.ts +0 -1
  986. package/dist/features/layout/BottomActions.js +0 -311
  987. package/dist/features/products/components/ProductsView.d.ts +0 -6
  988. package/dist/features/products/components/ProductsView.js +0 -5
  989. package/dist/features/search/actions/index.d.ts +0 -1
  990. package/dist/features/search/actions/index.js +0 -1
  991. package/dist/features/search/actions/search-actions.d.ts +0 -18
  992. package/dist/features/search/actions/search-actions.js +0 -43
  993. package/dist/features/search/api/route.d.ts +0 -22
  994. package/dist/features/search/api/route.js +0 -128
  995. package/dist/features/search/columns/index.d.ts +0 -17
  996. package/dist/features/search/columns/index.js +0 -49
  997. package/dist/features/search/components/SearchFiltersRow.d.ts +0 -22
  998. package/dist/features/search/components/SearchFiltersRow.js +0 -21
  999. package/dist/features/search/components/SearchResultsSection.d.ts +0 -53
  1000. package/dist/features/search/components/SearchResultsSection.js +0 -35
  1001. package/dist/features/search/components/SearchView.d.ts +0 -27
  1002. package/dist/features/search/components/SearchView.js +0 -8
  1003. package/dist/features/search/hooks/useSearch.d.ts +0 -21
  1004. package/dist/features/search/hooks/useSearch.js +0 -33
  1005. package/dist/features/search/repository/search.repository.d.ts +0 -14
  1006. package/dist/features/search/repository/search.repository.js +0 -59
  1007. package/dist/features/search/schemas/index.d.ts +0 -70
  1008. package/dist/features/search/schemas/index.js +0 -36
  1009. package/dist/features/search/types/index.d.ts +0 -48
  1010. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  1011. package/dist/features/seller/components/SellerStoreView.js +0 -8
  1012. package/dist/features/stores/components/StoreScopedSearch.d.ts +0 -17
  1013. package/dist/features/stores/components/StoreScopedSearch.js +0 -27
  1014. package/dist/seed/defaults/homepage-sections.d.ts +0 -2
  1015. package/dist/seed/defaults/homepage-sections.js +0 -60
  1016. package/dist/seed/factories/homepage-section.factory.d.ts +0 -10
  1017. package/dist/seed/factories/homepage-section.factory.js +0 -13
  1018. /package/dist/{features/search/types/index.js → _internal/shared/listing-types/spares/og.d.ts} +0 -0
@@ -18,6 +18,7 @@
18
18
  * @tag consumers:seed/index.ts,seed/runner.ts
19
19
  * @tag sideEffects:none
20
20
  */
21
+ import { PRODUCT_MAX_IMAGES, PRODUCT_MAX_VIDEOS, } from "../../../_internal/shared/media/limits.js";
21
22
  import { assignDefaultPhases } from "../utils/phases.js";
22
23
  import { happyPathPages } from "./_happy-path.js";
23
24
  import { moneyFlowsPages } from "./_money-flows.js";
@@ -217,6 +218,49 @@ const rawTesterChecklistItems = [
217
218
  },
218
219
  ]),
219
220
  ...group("buying", "Buying", [
221
+ {
222
+ /*
223
+ * Part Two B/C/D/E — spares, made-to-order, promoted sticker parts and
224
+ * the group discount, all together on the one page a buyer actually
225
+ * uses. Each case is an explicit BEFORE -> AFTER: a spare page returning
226
+ * 200 with plausible cards is not evidence any of this works.
227
+ */
228
+ pageKey: "spares-and-groups",
229
+ pageLabel: "Spares browse, made-to-order, and group selections",
230
+ href: "/spares",
231
+ cases: [
232
+ {
233
+ key: "spares-not-in-general-catalogue",
234
+ label: "A spare does NOT appear on /products, but does appear on /spares",
235
+ description: "BEFORE: there was no tenth listing type. AFTER: open /products and search for a known spare's title (e.g. \"Cross Dranzer\") — it must NOT appear, because `spares` sets `inGeneralCatalogue: false`. The same title DOES appear on /spares. If it appears on both, the exclusion broke; if it appears on neither, the nav/page wiring broke.",
236
+ },
237
+ {
238
+ key: "spares-nav-entry-present",
239
+ label: "The main nav's Products dropdown has a \"Spares\" child linking to /spares",
240
+ },
241
+ {
242
+ key: "made-to-order-buyable-at-zero-stock",
243
+ label: "A made-to-order listing at zero stock is buyable and says \"Made to order\", never \"Out of Stock\"",
244
+ description: "Open the seeded \"Custom Beyblade Sticker Sheet — Print on Demand\" (stockQuantity 0, madeToOrder true). It must show \"Made to order — printed when you order\" rather than an Out of Stock badge, Add to Cart must work, and checkout must complete. This is the exact case C exists for: stock must gate nothing on this listing.",
245
+ href: "/products/sticker-beyblade-custom-print-on-demand",
246
+ },
247
+ {
248
+ key: "group-picker-shows-rules-before-choosing",
249
+ label: "A group with selection rules states them BEFORE the buyer picks anything",
250
+ description: "Open the seeded \"Burst & X Attackers You Might Like\" group (via one of its member products' Group section). The picker must show its rules (min 2, max 3, max 2 of any one, 10% off) as text near the top — not only as a refusal after submitting.",
251
+ },
252
+ {
253
+ key: "group-picker-blocks-and-explains-invalid-selection",
254
+ label: "Picking an invalid combination (e.g. only 1 item, or 3 of one item) shows the reason and disables Add",
255
+ description: "On the same group, select only 1 item: the Add button must be disabled and a message naming the rule must appear (\"Pick at least 2…\"). Select 3 of one item: a different message naming the per-item cap must appear. Fixing the selection must re-enable Add without a page reload.",
256
+ },
257
+ {
258
+ key: "group-discount-applied-and-shown",
259
+ label: "The group discount is shown on the picker AND the cart line is actually discounted by that percentage",
260
+ description: "Select a valid combination (e.g. 2 different items) on the 10%-off group and note the total shown in the picker. Add to cart, then open the cart and the checkout review: the line total must be 10% below the sum of the two items' individual prices, to the paisa, in all three places (picker, cart, checkout).",
261
+ },
262
+ ],
263
+ },
220
264
  {
221
265
  /*
222
266
  * The post-purchase money surface. `/user/orders/[id]/` has five
@@ -2211,6 +2255,39 @@ const rawTesterChecklistItems = [
2211
2255
  },
2212
2256
  ]),
2213
2257
  ...group("selling", "Selling", [
2258
+ {
2259
+ /*
2260
+ * Part Two B/E — the seller side of spares, and the shared group-stock
2261
+ * editor. "Stock is independent per listing" is the whole premise, so
2262
+ * the editor-save-and-reload round trip is what actually proves that —
2263
+ * a shared pool bug would show up exactly here, as one listing's stock
2264
+ * silently changing another's.
2265
+ */
2266
+ pageKey: "spares-seller-and-group-editing",
2267
+ pageLabel: "Seller spares dashboard and group stock/rules editing",
2268
+ href: "/store/spares",
2269
+ cases: [
2270
+ {
2271
+ key: "seller-can-list-a-spare",
2272
+ label: "A seller can create, publish and see a spare on their own /store/spares list",
2273
+ },
2274
+ {
2275
+ key: "group-stock-edit-is-independent",
2276
+ label: "Editing one group member's stock does NOT change any other member's stock",
2277
+ description: "Open a group parent's editor, note two children's stock figures, change ONLY one of them in the shared stock editor, save, reload. The edited child shows the new figure; the other child is UNCHANGED. This is the premise the whole feature rests on — a shared pool would fail exactly this check.",
2278
+ },
2279
+ {
2280
+ key: "group-rules-save-and-reload",
2281
+ label: "Saved group rules (min/max/per-item cap/discount) survive a reload and reach the public picker",
2282
+ description: "In the group parent's editor, set min/max/per-item/discount to new values, save, reload the editor — the same values must still be there. Then open the group's public picker (as a buyer) and confirm the NEW rule text is what shows, not the old one.",
2283
+ },
2284
+ {
2285
+ key: "group-stock-partial-failure-reported",
2286
+ label: "Saving group stock for a member no longer in the group reports it, without losing the other saved rows",
2287
+ description: "Unlink a child from a group in one tab, then (without reloading) try to save that same child's stock from a second tab holding the stale member list. The response must name that row as rejected while the OTHER rows in the same save still succeed — not a blanket failure.",
2288
+ },
2289
+ ],
2290
+ },
2214
2291
  {
2215
2292
  /*
2216
2293
  * The UPDATE path. The create path has 57 cases on /store/products/new
@@ -2314,20 +2391,21 @@ const rawTesterChecklistItems = [
2314
2391
  /*
2315
2392
  * REMOVED 2026-09-11 — `media-upload-images-capped-at-5`.
2316
2393
  *
2317
- * It asserted the gallery caps at "5 images (not 10)". The cap was
2318
- * raised to 10 (`PRODUCT_MAX_IMAGES`, shared/media/limits.ts:37) and the
2319
- * `selling/media-limits` page asserts the opposite in its own label:
2320
- * "The 10th gallery image uploads — the 5th used to fail with a 400".
2321
- *
2322
- * So this case documented the OLD behaviour as the expectation. It
2323
- * would fail against correct code, and anyone "fixing" the product to
2324
- * satisfy it would re-break ten-image support. Its id encoded the wrong
2325
- * number too, so correcting the label alone would still mislead.
2394
+ * It asserted the gallery caps at "5 images (not 10)". The cap had been
2395
+ * raised (`PRODUCT_MAX_IMAGES`), so the case documented the OLD
2396
+ * behaviour as the expectation: it would fail against correct code, and
2397
+ * anyone "fixing" the product to satisfy it would re-break multi-image
2398
+ * support. Its id encoded the wrong number too, so correcting the label
2399
+ * alone would still mislead.
2326
2400
  *
2327
2401
  * The invariant it really tested — the stated limit equals the enforced
2328
- * limit — survives in `media-eleventh-image-refused-client-side`, which
2329
- * requires the refusal to name the limit ("You can upload up to 10
2330
- * images."). Nothing was lost.
2402
+ * limit — survives in `media-over-cap-image-refused-client-side`, which
2403
+ * requires the refusal to NAME the limit. Nothing was lost.
2404
+ *
2405
+ * 🛑 And the lesson got applied rather than just recorded: the cap moved
2406
+ * again on 2026-10-19 (10 -> 24), and the two cases that would have gone
2407
+ * stale now interpolate `PRODUCT_MAX_IMAGES` and carry no number in
2408
+ * their ids. See the note on the `media-limits` page below.
2331
2409
  */
2332
2410
  {
2333
2411
  key: "media-upload-video-duration",
@@ -2903,25 +2981,44 @@ const rawTesterChecklistItems = [
2903
2981
  },
2904
2982
  {
2905
2983
  pageKey: "media-limits",
2906
- pageLabel: "Media \u2014 ten images and one video, on every listing type",
2984
+ pageLabel: `Media \u2014 ${PRODUCT_MAX_IMAGES} images and ${PRODUCT_MAX_VIDEOS} video, on every listing type`,
2907
2985
  href: "/store/products/new",
2908
2986
  cases: [
2909
2987
  {
2910
2988
  key: "media-gallery-accepts-images-and-video",
2911
2989
  label: "The gallery takes BOTH images and a video, and shows a live per-type count",
2912
- description: "Changed 2026-09-04. BEFORE the single-media control on the listing form was video-only (`kind=\"video\"`), so the one \"add media\" affordance a seller saw refused photos. AFTER: the gallery accepts image files and a video file in the same control, and a counter under it reads \"N/10 images \u00b7 N/1 video\" as you add them.",
2990
+ description: `Changed 2026-09-04. BEFORE the single-media control on the listing form was video-only (\`kind="video"\`), so the one "add media" affordance a seller saw refused photos. AFTER: the gallery accepts image files and a video file in the same control, and a counter under it reads "N/${PRODUCT_MAX_IMAGES} images \u00b7 N/${PRODUCT_MAX_VIDEOS} video" as you add them.`,
2913
2991
  href: "/store/products/new",
2914
2992
  },
2993
+ /*
2994
+ * \ud83d\uded1 These two cases state the cap by INTERPOLATING `PRODUCT_MAX_IMAGES`,
2995
+ * and their keys no longer encode a number.
2996
+ *
2997
+ * The pair they replace (`media-tenth-image-uploads`,
2998
+ * `media-eleventh-image-refused-client-side`) hard-coded 10 in the key,
2999
+ * the label, the description and the authored procedure's `inputs` \u2014
3000
+ * so raising the cap to 24 on 2026-10-19 would have left four cases
3001
+ * asserting the OLD number and failing against correct code. That is
3002
+ * exactly what the removal note above this page records happening the
3003
+ * last time the cap moved, including its warning that "its id encoded
3004
+ * the wrong number too, so correcting the label alone would still
3005
+ * mislead".
3006
+ *
3007
+ * What is actually under test is the BOUNDARY, not the number: that the
3008
+ * last allowed image succeeds (the off-by-one), and that the first one
3009
+ * over is refused client-side. Both are stated cap-agnostically, so the
3010
+ * next change to the cap needs no edit here at all.
3011
+ */
2915
3012
  {
2916
- key: "media-tenth-image-uploads",
2917
- label: "The 10th gallery image uploads \u2014 the 5th used to fail with a 400",
2918
- description: "BEFORE: the gallery was capped at 5 and sent its Nth image as index N+1, while the server's signed-URL guard rejected any index above 5 \u2014 so the LAST slot of every product form returned a 400 that read as a random upload failure. AFTER: add ten images one at a time. All ten must succeed, including the tenth.",
3013
+ key: "media-last-allowed-image-uploads",
3014
+ label: "The LAST allowed gallery image uploads \u2014 the cap is inclusive of its own number",
3015
+ description: `Add images one at a time, counting previews, until the control refuses one. BEFORE: the gallery sent its Nth image as index N+1 while the server's signed-URL guard rejected any index above the cap \u2014 so the LAST slot of every product form returned a 400 that read as a random upload failure. AFTER: the count you reach before any refusal must be exactly ${PRODUCT_MAX_IMAGES}, not ${PRODUCT_MAX_IMAGES - 1}. An off-by-one here is the most likely error and the least likely to be noticed, because one short of the cap still looks like plenty.`,
2919
3016
  href: "/store/products/new",
2920
3017
  },
2921
3018
  {
2922
- key: "media-eleventh-image-refused-client-side",
2923
- label: "The 11th image is refused by the FORM with a clear message, not by the server",
2924
- description: "Try to add an 11th image. The control must refuse it before uploading, naming the limit (\"You can upload up to 10 images.\"). A server-side 400 arriving after the bytes have gone up is the wrong behaviour \u2014 the user has already waited.",
3019
+ key: "media-over-cap-image-refused-client-side",
3020
+ label: "The first image OVER the cap is refused by the FORM, not by the server",
3021
+ description: `With ${PRODUCT_MAX_IMAGES} images already added, attempt one more with the browser's Network panel open. The control must refuse it before requesting a signed URL, and the message must NAME the limit ("You can upload up to ${PRODUCT_MAX_IMAGES} images."). A server-side 400 arriving after the bytes have gone up is the wrong behaviour twice over \u2014 the seller has already waited, and an orphaned object is left in storage.`,
2925
3022
  href: "/store/products/new",
2926
3023
  },
2927
3024
  {
@@ -2932,8 +3029,8 @@ const rawTesterChecklistItems = [
2932
3029
  },
2933
3030
  {
2934
3031
  key: "media-caps-flat-across-types",
2935
- label: "The same 10 + 1 applies to an auction and a pre-order \u2014 there is no per-type table",
2936
- description: "Repeat the ten-image check on /store/auctions/new and /store/pre-orders/new. Both must allow ten. BEFORE the server carried separate AUCTION_IMAGE_MAX and PREORDER_IMAGE_MAX constants, both 5, disagreeing with everything else.",
3032
+ label: `The same ${PRODUCT_MAX_IMAGES} + ${PRODUCT_MAX_VIDEOS} applies to an auction and a pre-order \u2014 there is no per-type table`,
3033
+ description: `Repeat the boundary check on /store/auctions/new and /store/pre-orders/new. Both must allow ${PRODUCT_MAX_IMAGES}. BEFORE the server carried separate AUCTION_IMAGE_MAX and PREORDER_IMAGE_MAX constants, both 5, disagreeing with everything else.`,
2937
3034
  href: "/store/auctions/new",
2938
3035
  },
2939
3036
  {
@@ -3093,8 +3190,169 @@ const rawTesterChecklistItems = [
3093
3190
  },
3094
3191
  {
3095
3192
  /*
3096
- * D12 — the parts database, the composition panel, and the part line in a
3097
- * seller's auto-filled description.
3193
+ * Overflowing pill and tab rows — 2026-10-18.
3194
+ *
3195
+ * 🛑 Every case here is written as an explicit BEFORE → AFTER, because
3196
+ * the defect's symptom is not an error: a row that overflows renders
3197
+ * perfectly, returns HTTP 200, and simply puts some of its items past
3198
+ * the right edge where nothing indicates they exist. A case reading
3199
+ * "check the subcategories show" PASSES against the bug.
3200
+ *
3201
+ * The reported instance had 12 subcategory pills on a 1440px viewport
3202
+ * with the last four unreachable — no scrollbar, no arrow, no hint.
3203
+ *
3204
+ * Width is the thing under test, so every case NAMES A VIEWPORT. A run
3205
+ * at an unstated width cannot distinguish "collapsed correctly" from
3206
+ * "collapsed when it had room", which are opposite defects.
3207
+ */
3208
+ pageKey: "overflowing-pill-rows",
3209
+ pageLabel: "Pill and tab rows that do not fit collapse into a searchable dropdown",
3210
+ href: "/categories",
3211
+ cases: [
3212
+ { key: "wide-row-stays-pills", label: "A subcategory row that FITS still renders as pills, not a dropdown" },
3213
+ { key: "narrow-row-collapses", label: "The same row at a phone width collapses to one dropdown trigger" },
3214
+ { key: "collapsed-dropdown-is-searchable", label: "The collapsed dropdown has a search box that filters as you type" },
3215
+ { key: "collapsed-dropdown-keyboard", label: "Arrow keys and Enter pick an item without touching the mouse" },
3216
+ { key: "every-item-reachable-when-collapsed", label: "Every subcategory is reachable from the dropdown, including ones that used to be off-screen" },
3217
+ { key: "pills-carry-a-leading-image", label: "Subcategory pills and dropdown rows show the category's own cover image" },
3218
+ { key: "missing-image-falls-back-to-initial", label: "A subcategory with no cover image shows an initial, not a blank box or a broken image" },
3219
+ { key: "widening-restores-the-pills", label: "Widening the window back expands the dropdown into pills again" },
3220
+ { key: "subcategory-click-is-client-side", label: "Clicking a subcategory navigates without a full page reload" },
3221
+ { key: "tabs-collapse-by-width-not-count", label: "A tab bar with six short tabs stays a row on desktop instead of collapsing on a count" },
3222
+ { key: "event-tabs-do-not-jump-to-top", label: "Switching event tabs does not scroll the page back to the top" },
3223
+ ],
3224
+ },
3225
+ {
3226
+ /*
3227
+ * The authenticity checker — 2026-10-18.
3228
+ *
3229
+ * 🛑 Every case here asserts the presence of a HEDGE, or compares two
3230
+ * inputs, because this tool's failure mode is not a crash: it is a
3231
+ * confident, plausible, wrong answer served with HTTP 200. Code-matching
3232
+ * alone cannot detect a counterfeit (one crawled counterfeit catalogue
3233
+ * printed 900+ genuine Takara Tomy codes), the Metal Fight date-code
3234
+ * decoding is disputed with no manufacturer statement, and two of the
3235
+ * spellings a naive build would flag as fake tells are Takara Tomy's own
3236
+ * romanisation and a licensed Indian importer's name.
3237
+ */
3238
+ pageKey: "authenticity-checker",
3239
+ pageLabel: "Authenticity checker — box codes, per-generation checks and the regional code tables",
3240
+ href: "/tools/authenticity",
3241
+ cases: [
3242
+ /* ── Guards for the near-miss work (2026-10-19) ──────────────────
3243
+ * All three protect behaviour that is ALREADY CORRECT. They exist
3244
+ * because a "did you mean" feature is precisely the change that
3245
+ * could turn an absent code into an accusation, and this tool's
3246
+ * third rule is that a false counterfeit accusation against a real
3247
+ * seller is worse than a missed one.
3248
+ */
3249
+ {
3250
+ key: "authenticity-unknown-code-is-not-fake",
3251
+ label: "An invented but well-formed box code returns NEUTRAL + inconclusive — never a counterfeit verdict",
3252
+ description: "Type a code that is well-formed (one letter, four digits) but not in any table — try Z9999. The verdict must be \"Inconclusive\", the signal must read neutral, and the text must say the code is NOT RECORDED rather than fake. Any wording that implies the item is counterfeit is the failure, and so is any verdict more severe than inconclusive. New genuine codes appear regularly, and counterfeiters use real codes anyway, so an absent code proves nothing in either direction.",
3253
+ href: "/tools/authenticity",
3254
+ },
3255
+ {
3256
+ key: "authenticity-near-miss-suggests",
3257
+ label: "A one-character-off code offers \"did you mean …?\" as a SUGGESTION, with no change to the verdict",
3258
+ description: "BEFORE: a transposed code said only \"not in either table\". AFTER: enter A0831 when A0813 is a known code — you get a neutral \"did you mean A0813?\" line. It must sit OUTSIDE the \"What I checked\" list, must not appear as a signal, must not fire any evasion or counterfeit warning, and the verdict must stay exactly what it was without the suggestion. A near-miss is ambiguous between a typo and a batch mimicking a real code; it is input correction, never evidence.",
3259
+ href: "/tools/authenticity",
3260
+ },
3261
+ {
3262
+ key: "authenticity-inconclusive-asks-for-more",
3263
+ label: "Code-only input prompts for the model name and offers the ask-the-seller next step",
3264
+ description: "Enter a code and a generation but NO model name. The inconclusive result must now say that supplying the name lets it cross-check name against code, and must offer asking the seller for a photo of the box bottom and the screws. BEFORE: you got the physical checklist and no indication that a second field would unlock a real check.",
3265
+ href: "/tools/authenticity",
3266
+ },
3267
+ {
3268
+ key: "authenticity-evasion-warning-survives",
3269
+ label: "Typing \"Pegasis\" still reaches the tool's own verdict with the evasion warning intact",
3270
+ description: "SECURITY-SHAPED, and it exists because of a specific hazard. The site search matcher deliberately treats \"Pegasis\" as a match for \"Storm Pegasus\" — its alias table is built FROM a counterfeit seller's spellings. This tool treats that same spelling as EVIDENCE of trademark evasion. Type Pegasis here: the fuzzy/evasion signal must still fire. If a name typeahead is offered and you pick a canonical name from it, the tool must STILL analyse what you typed — a case asserting only \"the typeahead found it\" would pass against exactly the bug this guards.",
3271
+ href: "/tools/authenticity",
3272
+ },
3273
+ {
3274
+ key: "authenticity-name-typeahead",
3275
+ label: "Typing a partial model name offers canonical releases, and picking one does NOT change what gets checked",
3276
+ description: "BEFORE: you had to already know the exact release name. AFTER: type a partial name (e.g. \"Drago\") and canonical releases appear beneath the field as suggestions. Click one — a confirmation line appears (\"We have a record close to this: …\"), but the TEXT YOU TYPED in the field must stay exactly as you typed it. Submit the check and confirm the result is consistent with what you typed, not with the suggestion you clicked.",
3277
+ href: "/tools/authenticity",
3278
+ },
3279
+ {
3280
+ key: "authenticity-box-code-still-instant",
3281
+ label: "A box date code (e.g. A0813) resolves instantly with no network request — it is NOT in the search index",
3282
+ description: "GUARD CASE. Open DevTools -> Network, clear it, and submit a known box date code. No fetch to the search artifact or any search endpoint should appear — the date-code table is bundled locally and always was. This case exists because the site-wide index work added a name typeahead to this same page, and the two must stay on separate code paths.",
3283
+ href: "/tools/authenticity",
3284
+ },
3285
+ { key: "guest-sees-reference-not-a-wall", label: "Signed out, the LOOKUP ITSELF runs — no sign-in card anywhere on the page" },
3286
+ { key: "no-signin-flash-when-authenticated", label: "No session placeholder and no sign-in card during a hard reload, signed in or out" },
3287
+ { key: "midfake-code-reads-as-batch-not-accusation", label: "A matched midfake code reports a batch, never a counterfeit accusation against the seller" },
3288
+ { key: "date-code-shows-both-readings", label: "A box date code shows BOTH circulating readings and says neither is official" },
3289
+ { key: "real-product-code-is-not-evidence", label: "A well-formed product code is marked neutral and states that real codes appear on fakes" },
3290
+ { key: "name-code-mismatch-asks-rather-than-accuses", label: "A name/code mismatch is a question, and answering 'How it was sold' re-reads it as expected" },
3291
+ { key: "ambiguous-name-asks-which-model", label: "An ambiguous name asks which release instead of confidently naming one" },
3292
+ { key: "takara-spelling-is-not-flagged", label: "'Storm Pegasis' (the Takara Tomy spelling) is not flagged, while 'Scythee' is" },
3293
+ { key: "funskool-is-not-a-fake-signal", label: "Funskool reads as a licensed importer; Rapidity reads as an unlicensed producer" },
3294
+ { key: "unknown-code-is-not-called-fake", label: "An unrecorded code says 'not recorded' and explicitly not 'fake'" },
3295
+ { key: "asks-generation-when-nothing-inferable", label: "With no generation inferable the tool asks instead of returning a verdict" },
3296
+ { key: "api-refuses-signed-out", label: "POST /api/tools/authenticity answers a signed-out caller, and still 400s an undeclared key" },
3297
+ { key: "json-ld-declares-no-false-gate", label: "The WebApplication JSON-LD declares NO paywalled region, now that there is none" },
3298
+ { key: "defaults-to-metal-fight", label: "Generation opens on Metal Fight, and a Burst code against it raises a mismatch signal rather than passing silently" },
3299
+ { key: "contested-code-reports-the-disagreement", label: "A code two sources disagree about reports the disagreement instead of picking a side" },
3300
+ { key: "font-midfake-does-not-accuse", label: "A midfake row whose own source calls the code authentic does NOT reach 'likely reproduction'" },
3301
+ { key: "regional-code-reads-as-regional", label: "A Korean or Middle-East code names its region instead of coming back unrecorded" },
3302
+ { key: "series-window-names-the-production-run", label: "A derivable date names its Metal-series production window, or names none outside all four" },
3303
+ { key: "temporal-context-for-an-unmatched-code", label: "An unmatched code reports what else the tables record from the same month, framed as context not a match" },
3304
+ ],
3305
+ },
3306
+ {
3307
+ pageKey: "price-index-tool",
3308
+ pageLabel: "What it sold for — realised prices",
3309
+ href: "/tools/price-index",
3310
+ cases: [
3311
+ {
3312
+ key: "price-index-resolves-locally",
3313
+ label: "Candidate names appear with no network delay while typing; only the bands themselves come from the server",
3314
+ description: "BEFORE: resolving a free-text query to a category leaf was a Firestore searchTxt query on every lookup. AFTER: open /tools/price-index, open DevTools -> Network, clear the log, and search a real model name. The suggestion/candidate step must feel instant and correspond to the local search artifact (a .json fetched once, not per search); only ONE further request — to the bands endpoint — should fire, carrying just the resolved id(s), and it must return real min/median/mean/max figures for a model with recorded sales.",
3315
+ href: "/tools/price-index",
3316
+ },
3317
+ {
3318
+ key: "price-index-falls-back-when-index-off",
3319
+ label: "Price lookup still works end-to-end if the search index is unavailable",
3320
+ description: "GUARD CASE for the fallback path. If the admin search-index kill switch is off (or the artifact fails to load), the price lookup must still return real results via the original query-based endpoint — the feature must not go blank just because the faster path is unavailable.",
3321
+ href: "/tools/price-index",
3322
+ needsReview: true,
3323
+ reviewNote: "Needs the kill switch flipped off to observe, which an ordinary run does not do — flagged for a human or admin-tooling pass.",
3324
+ },
3325
+ ],
3326
+ },
3327
+ {
3328
+ pageKey: "compare-overlay-add-item",
3329
+ pageLabel: "Compare overlay — add another item",
3330
+ href: "/products",
3331
+ cases: [
3332
+ {
3333
+ key: "compare-add-another-via-typeahead",
3334
+ label: "The compare overlay's \"Add another\" typeahead adds a real item without leaving the page",
3335
+ description: "BEFORE: the compare overlay only ever showed items selected via listing-page checkboxes before opening it — there was no way to add a further item once the overlay was open. AFTER: open the compare overlay with at least one item selected, find the 'Add another to compare' box, type a product name, and pick a suggestion. The picked item's full column (image, price, specs) appears in the overlay without closing it or returning to the listing grid.",
3336
+ href: "/products",
3337
+ },
3338
+ {
3339
+ key: "compare-add-hidden-at-column-limit",
3340
+ label: "The \"Add another\" box disappears once the compare overlay is full",
3341
+ description: "Add items via checkboxes (or the typeahead) until the overlay holds its maximum number of columns. The 'Add another' box must then be absent entirely — not merely disabled — since a picker that cannot add anything is worse than none.",
3342
+ href: "/products",
3343
+ },
3344
+ ],
3345
+ },
3346
+ {
3347
+ /*
3348
+ * D12 — the Beyblade parts gallery, the composition panel, and the part
3349
+ * line in a seller's auto-filled description.
3350
+ *
3351
+ * 🛑 `pageKey` stays `parts-database` even though the surface is now
3352
+ * called the Beyblade parts gallery. It keys all nine case ids, every
3353
+ * `testerChecklistResponses` row already recorded against them, and
3354
+ * `audit-tester-checklist-hrefs`. A label is a label; a key is an
3355
+ * identifier.
3098
3356
  *
3099
3357
  * 🛑 Four defects this feature has already produced, every one of them a
3100
3358
  * 200 with plausible content: a read against a field the collection does
@@ -3105,7 +3363,7 @@ const rawTesterChecklistItems = [
3105
3363
  * ABSENT panel — indistinguishable from a model we have no data for.
3106
3364
  */
3107
3365
  pageKey: "parts-database",
3108
- pageLabel: "Parts database, composition panel and the part line in a description",
3366
+ pageLabel: "Beyblade parts gallery, composition panel and the part line in a description",
3109
3367
  href: "/parts",
3110
3368
  cases: [
3111
3369
  { key: "index-lists-every-classification", label: "The parts index lists all 20 classifications, labelled as names and not as URL slugs" },
@@ -3130,30 +3388,33 @@ const rawTesterChecklistItems = [
3130
3388
  *
3131
3389
  * 1. The index rendered all 1,185 rows flat. Nothing errored; it just
3132
3390
  * buried the six roots under 752 part leaves.
3133
- * 2. The Parts tab first matched 772 rows — it also caught the 20
3134
- * classification NODES, whose own parentIds pass through a
3135
- * `*-parts` node. A tab mixing "Attack Rings" with the attack rings
3136
- * inside it looks entirely reasonable.
3137
- * 3. Seven franchises have NO stock. Seeded active they would each be
3391
+ * 2. Seven franchises have NO stock. Seeded active they would each be
3138
3392
  * a card opening an empty shop; omitted entirely, seventeen
3139
3393
  * CharacterHotspot links stay 404. Both failure modes look fine
3140
3394
  * from one page.
3141
- * 4. Every bundle carries a placeholder cover image, so a collage
3395
+ * 3. Every bundle carries a placeholder cover image, so a collage
3142
3396
  * checked AFTER the cover would never render — and a card showing
3143
3397
  * one grey tile is not visibly broken.
3398
+ *
3399
+ * 🛑 There was a fifth tab, Parts, removed 2026-10-20 — parts belong to
3400
+ * `/parts` and the spares listing type, not to a flat tab over 752
3401
+ * leaves. Its own case went with it. The product-detail Parts
3402
+ * COMPOSITION tab is a different surface and still has cases, on the
3403
+ * `parts-database` page above.
3144
3404
  */
3145
3405
  pageKey: "category-tabs-franchise-bundles",
3146
3406
  pageLabel: "Categories index tabs, the franchise unit and the bundle collage",
3147
3407
  href: "/categories",
3148
3408
  cases: [
3149
3409
  { key: "index-shows-roots-only", label: "The Categories tab lists the six roots and NO deeper category" },
3150
- { key: "five-tabs-no-all", label: "There are exactly five tabs and none of them is 'All'" },
3151
- { key: "parts-tab-is-leaves-only", label: "The Parts tab lists part leaves and NOT the 20 classification nodes" },
3410
+ { key: "four-tabs-no-all-no-parts", label: "There are exactly four tabs — no 'All', and no 'Parts'" },
3152
3411
  { key: "tabs-do-not-overlap", label: "No single row appears on two tabs" },
3153
3412
  { key: "franchise-index-hides-unstocked", label: "The franchise index shows only stocked franchises, not all eight" },
3154
3413
  { key: "unstocked-franchise-page-resolves", label: "An unstocked franchise page loads and says so, rather than 404ing or showing an empty grid" },
3155
3414
  { key: "franchise-detail-lists-its-products", label: "The Beyblade franchise page lists its listings, with a nonsense slug as the control" },
3156
3415
  { key: "bundle-card-shows-a-collage", label: "A bundle card shows a collage of its members, not its placeholder cover" },
3416
+ { key: "tabs-collapse-on-narrow-viewport", label: "On a phone-width viewport the four tabs collapse into a searchable dropdown, not a row running off-screen" },
3417
+ { key: "tabs-hover-changes-ink", label: "On desktop, hovering an inactive tab visibly changes its text colour" },
3157
3418
  ],
3158
3419
  },
3159
3420
  {
@@ -3363,7 +3624,7 @@ const rawTesterChecklistItems = [
3363
3624
  {
3364
3625
  key: "search-typeahead-differs",
3365
3626
  label: "Typing \"dranzer\" and then \"dragoon\" in the header search gives DIFFERENT suggestions",
3366
- description: "WAS: the same 5 newest rows appeared for every keystroke, because no search term reached the query at all. If both terms give an identical list, the term is still being ignored.",
3627
+ description: "WAS: the same 5 newest rows appeared for every keystroke, because no search term reached the query at all. If both terms give an identical list, the term is still being ignored. UPDATED 2026-10-19: suggestions now come from the local index and span all 21 content types rather than the four the old endpoint could produce — so expect categories, parts and FAQs among the rows, not only products. ALSO CHECK, in DevTools -> Network: after the first index download there must be NO request per keystroke.",
3367
3628
  },
3368
3629
  {
3369
3630
  key: "search-typeahead-no-drafts",
@@ -3478,6 +3739,138 @@ const rawTesterChecklistItems = [
3478
3739
  description: "Write this one carefully. Every other case here passes on freshly seeded data while real production documents stay invisible, because search tokens are only written when a record is saved. Pick a listing that has NOT been edited recently and confirm it is findable; if it is not, the backfill did not cover it.",
3479
3740
  href: "/products",
3480
3741
  },
3742
+ /* ── The site-wide index (2026-10-19) ─────────────────────────────
3743
+ * Every case below is written as an explicit BEFORE -> AFTER,
3744
+ * because almost all of them describe behaviour that previously
3745
+ * returned HTTP 200 with plausible rows. A case reading "check
3746
+ * search works" passes AGAINST the bug it is meant to catch.
3747
+ */
3748
+ {
3749
+ key: "search-finds-every-type",
3750
+ label: "Searching \"dranzer\" from the header lands on /search and returns hits in SEVERAL sections",
3751
+ description: "BEFORE: the header sent you to /products?q=dranzer — one browse page — so you never learned there is also a category, a part, a blog post and an FAQ about it. AFTER: you land on /search and see grouped results across several sections. CONTROL, and it is the only assertion here that cannot pass by accident: search \"zzzznope\" and the page must say nothing matched, with ZERO result rows.",
3752
+ href: "/search",
3753
+ },
3754
+ {
3755
+ key: "search-finds-a-part",
3756
+ label: "Searching \"Rubber Flat\" and then \"RF\" both find the part",
3757
+ description: "BEFORE: zero results for either — all 752 parts had no search tokens at all, so they were reachable only by drilling /parts -> classification -> code. AFTER: both queries return the part, and the row shows its classification underneath the name.",
3758
+ href: "/search",
3759
+ },
3760
+ {
3761
+ key: "search-ambiguous-part-code",
3762
+ label: "Searching \"105\" returns SEVERAL parts, each showing a DIFFERENT classification",
3763
+ description: "BEFORE: there was no way to search parts at all. AFTER: \"105\" is deliberately ambiguous — it is a Metal Fight spin-track height, while a bare number in Burst is a disc — so the right answer is several rows, each naming its own classification and each linking to a different two-segment /parts/<classification>/<code> page. ONE row is the failure: it means something picked a winner.",
3764
+ href: "/search",
3765
+ },
3766
+ {
3767
+ key: "search-midword",
3768
+ label: "Searching \"ariza\" finds Charizard",
3769
+ description: "BEFORE: impossible. Firestore token search is word-PREFIX only, so a mid-word fragment matched nothing. AFTER: it matches, because the browser scans the whole index. CONTROL: \"zzzz\" must still return nothing — a matcher that returns everything for any fragment would also pass the first half.",
3770
+ href: "/search",
3771
+ },
3772
+ {
3773
+ key: "search-typo",
3774
+ label: "Searching \"dragon g\" finds Dragoon G, and \"Pegasis\" finds Storm Pegasus",
3775
+ description: "Misspellings are expanded at index time from a crawl of a counterfeit seller's real titles, on the basis that an evasion spelling is the same string a buyer mistypes. BEFORE: neither matched. AFTER: both do.",
3776
+ href: "/search",
3777
+ },
3778
+ {
3779
+ key: "search-normalised-away",
3780
+ label: "Searching \"!!!\" shows the \"no searchable words\" state — NOT every listing",
3781
+ description: "BEFORE (the inverse bug, on /api/products): a punctuation-only query produced no filter clause, so it returned the ENTIRE published catalogue as search results. AFTER: the page says the query had no searchable words in it. Note this is a different message from \"nothing matched\" and both must be distinguishable.",
3782
+ href: "/search",
3783
+ },
3784
+ {
3785
+ key: "search-zero-reads",
3786
+ label: "After the first search, typing produces NO further network requests",
3787
+ description: "Open DevTools -> Network, signed out. Type a query: you should see ONE fetch of the index artifact (a .json from firebasestorage, a few hundred KB) and nothing per keystroke thereafter. BEFORE: every keystroke hit /api/search/suggestions. A request per character is the failure even though the results look identical.",
3788
+ href: "/search",
3789
+ },
3790
+ {
3791
+ key: "search-no-prices",
3792
+ label: "No rupee amount appears anywhere in the header suggestions or /search results, signed out",
3793
+ description: "BEFORE: the header dropdown printed the product price as the suggestion subtitle, from a route cached PUBLIC for 60s — a live guest-price leak on every page. AFTER: suggestions show the brand and category instead, and no ₹ appears anywhere for a signed-out visitor.",
3794
+ href: "/search",
3795
+ },
3796
+ {
3797
+ key: "search-no-sandbox",
3798
+ label: "No tester-sandbox row appears in search results for a signed-out visitor",
3799
+ description: "The index is ONE shared file every browser downloads, with no per-viewer filter anywhere after it is built — so a sandbox row in it is published to the world for that version's lifetime. Search \"sandbox\" and \"tester\" signed out; nothing seeded as test data may appear.",
3800
+ href: "/search",
3801
+ },
3802
+ {
3803
+ key: "search-freshness",
3804
+ label: "A newly published listing becomes findable within ~15 minutes, and unpublishing removes it",
3805
+ description: "Publish a listing, note the time, and search its exact title. It should appear within about 15 minutes. Then unpublish it and search again — it must disappear within the same window. BEFORE: there was no index to go stale. A row that never appears, or never leaves, both mean the rebuild stopped.",
3806
+ href: "/search",
3807
+ },
3808
+ {
3809
+ key: "search-facet-counts",
3810
+ label: "Facet chips on /search show counts that match the rows actually displayed, and ticking one narrows BOTH",
3811
+ description: "Search a broad term. The rail shows chips like Type/Brand/Condition with a number on each. Tick one: the results narrow AND the other chips' numbers drop to match. A chip whose count does not change the result set, or a count that disagrees with the rows you can see, is the failure.",
3812
+ href: "/search",
3813
+ },
3814
+ {
3815
+ key: "search-guest-no-private",
3816
+ label: "Signed out, /search shows no account sections and makes ZERO authenticated requests",
3817
+ description: "SECURITY. In a private window with no session, search a broad term and watch DevTools -> Network. There must be no request to /api/search/scoped at all — not a 401, not an empty 200. An authenticated request firing for a guest means a session the page did not expect.",
3818
+ href: "/search",
3819
+ },
3820
+ {
3821
+ key: "search-buyer-isolation",
3822
+ label: "Buyer A cannot find Buyer B's order — by the UI AND by calling the API directly",
3823
+ description: "SECURITY, and the API half is the half that matters. Signed in as one buyer, search a term from another buyer's order. Then call /api/search/scoped?q=<term> directly in the same session and read the JSON. Neither may contain the other buyer's row. A UI that hides it while the API returns it is the failure this case exists for.",
3824
+ href: "/search",
3825
+ },
3826
+ {
3827
+ key: "search-seller-own-store",
3828
+ label: "A seller finds their own DRAFT listing; another seller's draft is absent",
3829
+ description: "Signed in as a seller, search a draft listing's title. It appears under \"Your listings (incl. drafts)\" — that section exists precisely because published listings are deduped away into the public results, so what is left is your drafts. Then confirm a different store's draft title returns nothing.",
3830
+ href: "/search",
3831
+ },
3832
+ {
3833
+ key: "search-listing-boxes-still-filter",
3834
+ label: "The per-collection search boxes still filter — one public, one seller, one admin",
3835
+ description: "REGRESSION GUARD. The box on /stores, the one on /store/orders and the one on /admin/users are a DIFFERENT system from site-wide search and must be untouched. For each: a real term narrows the list, a nonsense term returns zero, pagination still works, and the filter-drawer badge still counts correctly.",
3836
+ href: "/stores",
3837
+ },
3838
+ {
3839
+ key: "search-support-ticket-two-words",
3840
+ label: "A TWO-WORD support-ticket search narrows to tickets matching BOTH words",
3841
+ description: "BEFORE: the second word was discarded entirely, so the search returned everything matching the longer word and looked like it was working. AFTER: search two words you know appear in one ticket's subject but not together in others — only the matching ticket should remain.",
3842
+ href: "/admin/support-tickets",
3843
+ },
3844
+ {
3845
+ key: "search-parts-page-has-a-box",
3846
+ label: "/parts has a search box that finds a part by name or by code",
3847
+ description: "BEFORE: /parts was browse-only — 752 parts reachable only by clicking a classification then a code. AFTER: there is a search input above the classification grid. Type \"RF\" and the part appears with its classification; type \"zzzznope\" and it says nothing matches. The classification grid must still be there below it.",
3848
+ href: "/parts",
3849
+ },
3850
+ {
3851
+ key: "search-facet-carries-through",
3852
+ label: "\"See all →\" on a group with a facet ticked lands on the browse page WITH that facet still applied",
3853
+ description: "Search a broad term and tick a facet chip (e.g. a brand). Click the group's own \"See all →\" link. BEFORE: the link always went to the plain, unfiltered browse page, so refining on /search and then following through threw the refinement away. AFTER: the destination URL carries the same filter (e.g. ?f=brand==Takara-Tomy) and the browse page opens already narrowed.",
3854
+ href: "/search",
3855
+ },
3856
+ {
3857
+ key: "search-admin-person-exact",
3858
+ label: "Admin can find a user by typing just their FIRST name — but a prefix of it finds nothing",
3859
+ description: "Signed in as admin, open /admin/users and type a real user's first name only (not their full \"First Last\"). BEFORE: the search was an exact match on the WHOLE displayName string, so typing only the first name found nobody. AFTER: it is a whole-WORD match and finds them. Then type only the first 3-4 letters of that name (a prefix, not the whole word) — this must find NOTHING. That second half is the design, not a bug: the index is whole-word only so it cannot be unpicked by counting partial-match frequencies.",
3860
+ href: "/admin/users",
3861
+ },
3862
+ {
3863
+ key: "search-no-plaintext-pii",
3864
+ label: "The stored search-index values are HMAC digests, never a readable name",
3865
+ description: "For an admin or engineer with Firestore console access: open a `users` document and find `nameTokensIndex`. Every entry must be an opaque hex digest (prefixed `hmac:`), never the person's actual name or email in any form. Also confirm no such field exists on, or is reachable from, the public search artifact (the .json file fetched by a signed-out visitor) — a deterministic per-person identifier published to every browser is a disclosure even though it cannot be reversed.",
3866
+ href: "/admin/users",
3867
+ },
3868
+ {
3869
+ key: "faq-punctuation-search",
3870
+ label: "Searching \"!!!\" in the FAQ box shows the normalised-away state, not every FAQ",
3871
+ description: "GUARD CASE — this behaviour is already correct and this case exists to pin it so it cannot regress while the site-wide index work is in motion elsewhere. Open /faqs and search \"!!!\". It must say the search had no searchable words, and show zero FAQs — not the entire FAQ list.",
3872
+ href: "/faqs",
3873
+ },
3481
3874
  ],
3482
3875
  },
3483
3876
  {
@@ -3935,6 +4328,49 @@ const rawTesterChecklistItems = [
3935
4328
  },
3936
4329
  ],
3937
4330
  },
4331
+ {
4332
+ pageKey: "header-brand-mark-centring",
4333
+ pageLabel: "Header — Centred Brand Mark Never Collides With the Icons",
4334
+ href: "/products",
4335
+ cases: [
4336
+ {
4337
+ key: "mark-clear-of-icons-across-the-lg-band",
4338
+ label: "Sweeping the window from 1024px to 1280px, the centred leaf mark never overlaps the notification, messages, wishlist or cart icons",
4339
+ description: "Fixed 2026-10-19. BEFORE: the mark was `position: absolute; left: 50%` inside the title row, so the row's `justify-between` reserved no space for it and the right-hand cluster grew leftward straight over it. The mark reveals at md (768px) and those four icons reveal at lg (1024px), so from 1024px to roughly 1150px the cluster's left edge crossed the row midpoint and the leaf painted across the bell and the heart. AFTER: resize in ~32px steps from 1024px to 1280px and watch the gap between the wordmark and the first icon. The leaf must sit in clear space at every single step — no part of it may touch an icon's 44px box.",
4340
+ href: "/products",
4341
+ },
4342
+ {
4343
+ key: "mark-clear-signed-out-worst-case",
4344
+ label: "SIGNED OUT at ~1100px — where 'Sign in' and 'Register' make the cluster widest — the mark is still clear of everything",
4345
+ description: "Signed out is the worst case, not the easiest: the two auth buttons (~160px together) stand in for a single 44px avatar, so the cluster reaches ~120px further left than it does signed in. This is the exact width and session the original screenshot was taken at. Compare the same width signed in and signed out; both must be clean, and if only one fails say which.",
4346
+ href: "/products",
4347
+ },
4348
+ {
4349
+ key: "mark-shifts-rather-than-overlapping",
4350
+ label: "When the cluster is too wide to leave room, the mark moves off-centre — it never ends up underneath an icon, and no control is clipped at the window edge",
4351
+ description: "The mark is now one of three in-flow tracks, so a crowded row makes it YIELD. Narrow past the point where a perfectly centred mark would no longer fit and confirm the degradation: the leaf slides toward the wordmark and stays fully visible, the icons keep their full 44px boxes, and nothing is cut off at the right edge. A leaf that vanishes under an icon, or a hamburger sliced by the edge, are both failures — record which.",
4352
+ href: "/products",
4353
+ },
4354
+ {
4355
+ key: "mark-centred-at-wide-widths",
4356
+ label: "At 1440px and wider the leaf is centred in the header, not nudged to one side",
4357
+ description: "With room to spare the two side tracks split the free space evenly, which should put the leaf on the header's midpoint. Maximise the window and eyeball it against the centre of the page — a mark that is visibly off-centre at a wide width means the tracks are no longer balanced, which is a different fault from the collision and should be reported separately.",
4358
+ href: "/products",
4359
+ },
4360
+ {
4361
+ key: "mark-absent-below-md",
4362
+ label: "At 767px and below there is no centred leaf, the wordmark keeps its own small leaf prefix, and the header has no odd empty gap",
4363
+ description: "The centred mark is `hidden` below md, which removes it as a layout item entirely — so the header should look exactly as it always has on mobile. Check 767px, 640px and 320px: no centred leaf, a small leaf immediately left of the 'LetItRip' wordmark, the action cluster still flush to the right edge with no stray gap, and the hamburger fully visible and tappable at 320px.",
4364
+ href: "/products",
4365
+ },
4366
+ {
4367
+ key: "mark-centred-in-left-hand-mode",
4368
+ label: "In left-hand mode the wordmark and the icons swap sides, the leaf stays centred, and it still overlaps nothing",
4369
+ description: "Hand mode mirrors the row, so this is where a layout fix most easily half-works. Turn on left-hand mode, then repeat the 1024px–1280px sweep: the wordmark must sit flush against the RIGHT edge with no gap, the icon cluster flush against the LEFT edge with the hamburger outermost, and the leaf still centred and untouched. A wordmark floating away from its edge means a side track lost its mirrored alignment.",
4370
+ href: "/products",
4371
+ },
4372
+ ],
4373
+ },
3938
4374
  {
3939
4375
  pageKey: "nav-reachability",
3940
4376
  pageLabel: "Navigation — Every Item Reachable at Every Width",
@@ -6626,6 +7062,24 @@ const rawTesterChecklistItems = [
6626
7062
  pageLabel: "Header search",
6627
7063
  href: "/",
6628
7064
  cases: [
7065
+ {
7066
+ key: "header-search-submit-lands-on-search",
7067
+ label: "Submitting the header search lands on /search with GROUPED results — not on one browse page",
7068
+ description: "BEFORE: submitting sent you to the browse route for whichever type was selected in the dropdown — /products?q=dranzer — so a cross-resource search was unreachable and the /search page it should have used had no users at all. AFTER: you land on /search?q=dranzer and see results grouped by type, each group with its own \"See all … →\" link pointing at that browse page. The per-type destinations are not lost; they moved to where they belong.",
7069
+ href: "/",
7070
+ },
7071
+ {
7072
+ key: "header-search-type-is-a-filter",
7073
+ label: "The type dropdown NARROWS the results — it no longer decides where you land",
7074
+ description: "BEFORE: choosing \"Stores\" meant submitting took you to /stores. AFTER: choosing \"Stores\" narrows what you see, and the Stores group's own \"See all stores →\" link is what takes you to /stores. Also confirm an EMPTY query does nothing at all on submit — landing on a bare browse page you did not ask for is worse than staying put.",
7075
+ href: "/",
7076
+ },
7077
+ {
7078
+ key: "header-search-no-price-for-guest",
7079
+ label: "Signed out, no suggestion row shows a price",
7080
+ description: "BEFORE: the suggestion subtitle was the product's price, served from a route cached PUBLIC for 60 seconds — so every signed-out visitor saw prices in the header on every page. AFTER: the subtitle is the brand and category. Any ₹ in the dropdown while signed out is a FAIL.",
7081
+ href: "/",
7082
+ },
6629
7083
  {
6630
7084
  key: "search-finds-maintenance-toggle",
6631
7085
  label: "Searching 'maintenance' reaches the maintenance TOGGLE, not just Site Settings",
@@ -6711,6 +7165,76 @@ const rawTesterChecklistItems = [
6711
7165
  * tester reporting "I did the actions" as if it were "the outcome was right".
6712
7166
  * ══════════════════════════════════════════════════════════════════════════ */
6713
7167
  ...group("money-flows", "Money Flows (end to end)", moneyFlowsPages),
7168
+ /*
7169
+ * The sticker-sheet kiss-cut tracer. Admin-only, under a PUBLIC prefix.
7170
+ *
7171
+ * 🛑 `adminOnly` is a presentation flag for the checklist, not the gate. The
7172
+ * real boundary is the layout's server-side session read, which redirects a
7173
+ * non-admin before any HTML exists — which is exactly what the buyer and
7174
+ * guest cases below assert. Marking it admin-only here only keeps it out of a
7175
+ * non-admin tester's list.
7176
+ *
7177
+ * Every case is an explicit BEFORE -> AFTER, because almost every defect this
7178
+ * feature can have returns 200 with plausible content: a wrong part count, a
7179
+ * watermarked original, a millimetre derived from a DPI nobody confirmed. A
7180
+ * case reading "check the tracer works" would pass against all three.
7181
+ */
7182
+ ...group("tools", "Tools", [
7183
+ {
7184
+ pageKey: "sticker-tracer",
7185
+ pageLabel: "Sticker sheet tracer",
7186
+ href: "/tools/sticker-tracer",
7187
+ cases: [
7188
+ { key: "enclosed-region-opaque", label: "An enclosed region matching the paper colour stays OPAQUE inside its sticker" },
7189
+ { key: "white-on-white-edge", label: "A white sticker edge on white paper is found with no per-sticker parameter" },
7190
+ { key: "background-model-named", label: "The result names which background model ran (paper vs art)" },
7191
+ { key: "name-required", label: "A run cannot be committed without a name" },
7192
+ { key: "no-watermark-on-original", label: "A downloaded original carries NO watermark and comes from a signed GCS URL" },
7193
+ { key: "progress-names-stage", label: "Live progress names the current STAGE, not just a percentage" },
7194
+ { key: "failure-names-stage", label: "A failed run names the stage it died in and survives a reload" },
7195
+ { key: "runs-never-overwrite", label: "A second run never overwrites the first — both stay in history" },
7196
+ { key: "accepted-differs-from-succeeded", label: "'accepted' and 'succeeded' are distinct, and exactly one run is accepted" },
7197
+ { key: "fullres-only-after-accept", label: "Full-resolution parts and the export surface appear only after accepting" },
7198
+ { key: "no-dpi-no-mm", label: "With no confirmed DPI the export REFUSES rather than inventing a scale" },
7199
+ { key: "oversized-named-not-scaled", label: "A part too wide for the machine is NAMED before export, never scaled" },
7200
+ { key: "node-budget-reported", label: "The export node budget reports its cost in millimetres of deviation" },
7201
+ { key: "retry-shows-clamp", label: "A retry SHOWS the resume clamp before it is applied" },
7202
+ { key: "buyer-redirected", label: "A signed-in buyer is redirected and sees no Tools entry for it" },
7203
+ { key: "guest-redirected", label: "A signed-out visitor is redirected; /tools itself is unaffected" },
7204
+ { key: "storage-meter-honest", label: "The storage meter reports object COUNT beside bytes, and says when it truncated" },
7205
+ ],
7206
+ },
7207
+ {
7208
+ /*
7209
+ * Part Two D — promoting a traced, accepted, promoted-to-full-res
7210
+ * sheet into real marketplace listings. Distinct from the tracer's
7211
+ * own "promote" (run -> sheet, full-res pixels); this is sheet ->
7212
+ * marketplace (real products). Needs a real traced sheet to reach, so
7213
+ * these cases follow the tracer's own happy path rather than
7214
+ * standing alone.
7215
+ */
7216
+ pageKey: "sticker-promote-to-listings",
7217
+ pageLabel: "Promoting a sheet to real listings",
7218
+ href: "/tools/sticker-tracer",
7219
+ cases: [
7220
+ {
7221
+ key: "promote-creates-one-group",
7222
+ label: "Promoting a sheet creates one parent listing plus one child per UNIQUE part, all in one group",
7223
+ description: "On a sheet with at least one part marked a duplicate of another, promote it to listings. The group must contain the parent plus exactly the UNIQUE parts — a duplicate part must NOT get its own listing — and the picker on the parent's product page must show every member, not just one (this is exactly the `linkChildToGroup` stale-append bug: linking N children in a loop used to leave only one).",
7224
+ },
7225
+ {
7226
+ key: "promoted-part-image-watermarked",
7227
+ label: "A promoted part's marketplace image is watermarked; the admin's original download is NOT",
7228
+ description: "Open the promoted CHILD listing's public page and note its image carries a visible watermark. Then, from the tracer's own UI, download that same part's original — it must be clean, with no watermark. Same pixels, same object, two different responses: that is the point.",
7229
+ },
7230
+ {
7231
+ key: "promote-refuses-before-full-res-render",
7232
+ label: "Promoting a sheet that has not been accepted-and-rendered is refused, naming the fix",
7233
+ description: "Attempt to promote a sheet whose active run has not had \"Accept & render\" run on it (or try on a fresh trace with no promoted run). The action must refuse with a message naming the required step (accept/render the run first) — not create partial listings.",
7234
+ },
7235
+ ],
7236
+ },
7237
+ ], { adminOnly: true }),
6714
7238
  ];
6715
7239
  const defaultPhases = assignDefaultPhases(rawTesterChecklistItems);
6716
7240
  export const testerChecklistSeedData = rawTesterChecklistItems.map((item, index) => ({