@mohasinac/appkit 4.34.0 → 4.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +32 -2
  2. package/dist/_internal/server/features/seo/sitemap.js +2 -2
  3. package/dist/_internal/server/functions/scheduled.d.ts +1 -2
  4. package/dist/_internal/server/functions/scheduled.js +8 -9
  5. package/dist/_internal/server/jobs/core/testerSandboxCleanup.d.ts +15 -0
  6. package/dist/_internal/server/jobs/core/testerSandboxCleanup.js +15 -6
  7. package/dist/_internal/server/jobs/handlers/index.d.ts +0 -1
  8. package/dist/_internal/server/jobs/handlers/index.js +0 -1
  9. package/dist/features/auth/schemas/firestore.d.ts +1 -0
  10. package/dist/features/tester/components/TesterChecklistStepRow.d.ts +9 -1
  11. package/dist/features/tester/components/TesterChecklistStepRow.js +31 -2
  12. package/dist/features/tester/components/TesterHubView.js +8 -0
  13. package/dist/features/tester/repository/tester-checklist-item.repository.d.ts +16 -1
  14. package/dist/features/tester/repository/tester-checklist-item.repository.js +32 -6
  15. package/dist/features/tester/schemas/firestore.d.ts +109 -0
  16. package/dist/features/tester/schemas/firestore.js +14 -0
  17. package/dist/features/tester/seed-data/_money-flows.d.ts +23 -0
  18. package/dist/features/tester/seed-data/_money-flows.js +430 -0
  19. package/dist/features/tester/seed-data/authored/_types.d.ts +33 -0
  20. package/dist/features/tester/seed-data/authored/_types.js +35 -0
  21. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +2 -0
  22. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +207 -0
  23. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +2 -0
  24. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +298 -0
  25. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.d.ts +2 -0
  26. package/dist/features/tester/seed-data/authored/account-auth__testing-program--admin.js +33 -0
  27. package/dist/features/tester/seed-data/authored/account-auth__testing-program.d.ts +2 -0
  28. package/dist/features/tester/seed-data/authored/account-auth__testing-program.js +138 -0
  29. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +2 -0
  30. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +36 -0
  31. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +2 -0
  32. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +75 -0
  33. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +2 -0
  34. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +72 -0
  35. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +2 -0
  36. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +54 -0
  37. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +2 -0
  38. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +39 -0
  39. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +2 -0
  40. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +226 -0
  41. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +2 -0
  42. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +82 -0
  43. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +2 -0
  44. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +177 -0
  45. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +2 -0
  46. package/dist/features/tester/seed-data/authored/admin__bundles.js +97 -0
  47. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +2 -0
  48. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +232 -0
  49. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +2 -0
  50. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +306 -0
  51. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +2 -0
  52. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +158 -0
  53. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +2 -0
  54. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +78 -0
  55. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +2 -0
  56. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +261 -0
  57. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +2 -0
  58. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +151 -0
  59. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +2 -0
  60. package/dist/features/tester/seed-data/authored/admin__coupons.js +214 -0
  61. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +2 -0
  62. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +160 -0
  63. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +2 -0
  64. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +104 -0
  65. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +2 -0
  66. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +350 -0
  67. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +2 -0
  68. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +105 -0
  69. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +2 -0
  70. package/dist/features/tester/seed-data/authored/admin__site-system.js +590 -0
  71. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +2 -0
  72. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +235 -0
  73. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +2 -0
  74. package/dist/features/tester/seed-data/authored/admin__users-trust.js +569 -0
  75. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +2 -0
  76. package/dist/features/tester/seed-data/authored/buying__bidding.js +417 -0
  77. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +2 -0
  78. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +653 -0
  79. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +2 -0
  80. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +533 -0
  81. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +2 -0
  82. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +379 -0
  83. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +2 -0
  84. package/dist/features/tester/seed-data/authored/buying__cart.js +1171 -0
  85. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +2 -0
  86. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +140 -0
  87. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +2 -0
  88. package/dist/features/tester/seed-data/authored/buying__my-orders.js +257 -0
  89. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +2 -0
  90. package/dist/features/tester/seed-data/authored/buying__offers.js +1111 -0
  91. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +2 -0
  92. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +252 -0
  93. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +2 -0
  94. package/dist/features/tester/seed-data/authored/buying__product-detail.js +387 -0
  95. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +2 -0
  96. package/dist/features/tester/seed-data/authored/buying__return-request.js +152 -0
  97. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +2 -0
  98. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +242 -0
  99. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +2 -0
  100. package/dist/features/tester/seed-data/authored/buying__reviews.js +113 -0
  101. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +2 -0
  102. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +283 -0
  103. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +2 -0
  104. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +167 -0
  105. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +2 -0
  106. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +90 -0
  107. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +2 -0
  108. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +344 -0
  109. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +2 -0
  110. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +53 -0
  111. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +2 -0
  112. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +76 -0
  113. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +2 -0
  114. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +93 -0
  115. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +2 -0
  116. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +149 -0
  117. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +2 -0
  118. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +121 -0
  119. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +2 -0
  120. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +207 -0
  121. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +2 -0
  122. package/dist/features/tester/seed-data/authored/content-discovery__events.js +318 -0
  123. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +2 -0
  124. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +65 -0
  125. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +2 -0
  126. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +147 -0
  127. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +2 -0
  128. package/dist/features/tester/seed-data/authored/content-discovery__search.js +332 -0
  129. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +2 -0
  130. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +53 -0
  131. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +2 -0
  132. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +52 -0
  133. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +2 -0
  134. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +35 -0
  135. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +2 -0
  136. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +141 -0
  137. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +2 -0
  138. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +35 -0
  139. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +2 -0
  140. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +95 -0
  141. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +2 -0
  142. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +191 -0
  143. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +2 -0
  144. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +158 -0
  145. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +2 -0
  146. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +106 -0
  147. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +2 -0
  148. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +88 -0
  149. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +2 -0
  150. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +204 -0
  151. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +2 -0
  152. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +301 -0
  153. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +2 -0
  154. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +407 -0
  155. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +2 -0
  156. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +214 -0
  157. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +2 -0
  158. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +275 -0
  159. package/dist/features/tester/seed-data/authored/index.d.ts +2 -0
  160. package/dist/features/tester/seed-data/authored/index.js +237 -0
  161. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +2 -0
  162. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +102 -0
  163. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +2 -0
  164. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +50 -0
  165. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +2 -0
  166. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +66 -0
  167. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +2 -0
  168. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +115 -0
  169. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +2 -0
  170. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +136 -0
  171. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +2 -0
  172. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +69 -0
  173. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +2 -0
  174. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +263 -0
  175. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +2 -0
  176. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +102 -0
  177. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +2 -0
  178. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +234 -0
  179. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +2 -0
  180. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +126 -0
  181. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +2 -0
  182. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +255 -0
  183. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +2 -0
  184. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +59 -0
  185. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +2 -0
  186. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +88 -0
  187. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +2 -0
  188. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +51 -0
  189. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +2 -0
  190. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +35 -0
  191. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +2 -0
  192. package/dist/features/tester/seed-data/authored/selling__become-seller.js +94 -0
  193. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +2 -0
  194. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +107 -0
  195. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +2 -0
  196. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +285 -0
  197. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +2 -0
  198. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +326 -0
  199. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +2 -0
  200. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +136 -0
  201. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +2 -0
  202. package/dist/features/tester/seed-data/authored/selling__media-limits.js +128 -0
  203. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +2 -0
  204. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +167 -0
  205. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +2 -0
  206. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +117 -0
  207. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +2 -0
  208. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +88 -0
  209. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +2 -0
  210. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +151 -0
  211. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +2 -0
  212. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +105 -0
  213. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +2 -0
  214. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +33 -0
  215. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +2 -0
  216. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +347 -0
  217. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +2 -0
  218. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +166 -0
  219. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +2 -0
  220. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +89 -0
  221. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +2 -0
  222. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +195 -0
  223. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +2 -0
  224. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +180 -0
  225. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +2 -0
  226. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +164 -0
  227. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +2 -0
  228. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +116 -0
  229. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +2 -0
  230. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +111 -0
  231. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +2 -0
  232. package/dist/features/tester/seed-data/authored/seo__og-images.js +91 -0
  233. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +2 -0
  234. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +122 -0
  235. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +2 -0
  236. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +105 -0
  237. package/dist/features/tester/seed-data/events-tester-seed-data.js +77 -5
  238. package/dist/features/tester/seed-data/offers-tester-seed-data.js +23 -9
  239. package/dist/features/tester/seed-data/products-tester-seed-data.js +65 -49
  240. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +744 -1
  241. package/dist/features/tester/seed-data/tester-window.d.ts +25 -0
  242. package/dist/features/tester/seed-data/tester-window.js +66 -0
  243. package/dist/seed/carousel-slides-seed-data.js +1 -1
  244. package/dist/seed/products-standard-seed-data.js +2 -2
  245. package/dist/seed/reviews-seed-data.js +6 -1
  246. package/dist/seed/users-seed-data.js +107 -4
  247. package/package.json +1 -1
  248. package/scripts/seed-cli.mjs +6 -0
@@ -0,0 +1,407 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/homepage-carousels page.
3
+ * WHAT: 26 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 THE HOMEPAGE COMPOSES ~26 INDEPENDENTLY-FETCHED SECTIONS, each inside its
10
+ * own boundary that renders NOTHING on failure and reports server-side. That is
11
+ * deliberate — a visitor should see a homepage missing one row, not an apology —
12
+ * but it means a broken section is silent. Several cases here therefore ask what
13
+ * is ABSENT, which is the only way a swallowed section becomes visible.
14
+ *
15
+ * @tag domain:tester
16
+ * @tag layer:seed
17
+ * @tag pattern:none
18
+ * @tag access:server-only
19
+ * @tag consumers:seed-data/authored/index.ts
20
+ * @tag sideEffects:none
21
+ */
22
+ export const authored = {
23
+ "checklist-design-ux-homepage-carousels-carousel-loops": {
24
+ roles: ["guest"],
25
+ startPage: "/",
26
+ steps: [
27
+ "Open / in a private window at 1280 pixels wide.",
28
+ "Watch the hero carousel through a full cycle without touching it, counting the slides.",
29
+ "Keep watching past the last slide.",
30
+ "Note whether it returns to the first slide or stops.",
31
+ "Watch one more full cycle to check the count is the same.",
32
+ ],
33
+ inputs: { viewportWidth: 1280 },
34
+ expectedBehaviour: "The hero advances on its own and wraps from the last slide back to the first. At most five slides are active at once, so a cycle that never repeats a slide has more active than the cap allows.",
35
+ expectedUiState: "Slides advance automatically and the carousel returns to the first slide after the last. The same number of slides appears in both cycles, and that number is at most five.",
36
+ endResult: "Read-only; restore the window width afterwards.",
37
+ },
38
+ "checklist-design-ux-homepage-carousels-carousel-no-flicker": {
39
+ roles: ["guest"],
40
+ startPage: "/",
41
+ steps: [
42
+ "Open / in a private window at 1280 pixels wide and watch the hero as it first appears.",
43
+ "Watch each transition between slides for a flash of background or a jump in height.",
44
+ "Hard-reload with Ctrl+Shift+R and watch the first paint again.",
45
+ "Do that three more times, watching each time.",
46
+ ],
47
+ inputs: { viewportWidth: 1280 },
48
+ expectedBehaviour: "Slides cross-fade or slide without an intermediate empty frame, and the carousel holds one height throughout so the page below never shifts. A flash on first paint is usually the first slide's image arriving after its container.",
49
+ expectedUiState: "No flash of empty background between slides and none on any of the four loads. The content below the hero does not move vertically as slides change.",
50
+ endResult: "Read-only; restore the window width afterwards.",
51
+ },
52
+ "checklist-design-ux-homepage-carousels-hero-carousel-video-plays": {
53
+ roles: ["guest"],
54
+ startPage: "/",
55
+ steps: [
56
+ "Open / in a private window at 1280 pixels wide.",
57
+ "Wait for the slide whose background is a video.",
58
+ "Watch whether the video plays and whether it loops.",
59
+ "Look for any error text or a black rectangle where the video should be.",
60
+ "Resize to 390 pixels and watch the same slide again.",
61
+ ],
62
+ inputs: { viewportWidth: 1280, mobileWidth: 390 },
63
+ expectedBehaviour: "A video background renders through a real video element and must therefore point at a directly playable file — the image proxy that watermarks still images rejects video outright, so a video URL routed through it never plays. The poster image is a still and does go through the proxy.",
64
+ expectedUiState: "The video plays and loops at both widths, with the dim overlay and slide copy readable over it. A black rectangle, a broken-media icon or an unsupported-format message are all the same failure.",
65
+ endResult: "Read-only; restore the window width afterwards.",
66
+ },
67
+ "checklist-design-ux-homepage-carousels-carousel-pause-on-interaction": {
68
+ roles: ["guest"],
69
+ startPage: "/",
70
+ steps: [
71
+ "Open / in a private window at 1280 pixels wide and let the hero advance once on its own.",
72
+ "Hover the pointer over the hero and hold it there for 15 seconds.",
73
+ "Note whether the slides keep advancing.",
74
+ "Move the pointer away and watch whether autoplay resumes.",
75
+ "Click a slide's own control and check the carousel does not advance out from under the click.",
76
+ ],
77
+ inputs: { viewportWidth: 1280 },
78
+ expectedBehaviour: "Autoplay pauses while the visitor is interacting and resumes afterwards. A carousel that advances mid-click moves the target the user was aiming at, which is how a hero sends someone to the wrong page.",
79
+ expectedUiState: "Slides stop advancing while hovered and resume shortly after the pointer leaves. Clicking a slide control does not coincide with an advance.",
80
+ endResult: "Read-only; restore the window width afterwards.",
81
+ },
82
+ "checklist-design-ux-homepage-carousels-carousel-arrows-work": {
83
+ roles: ["guest"],
84
+ startPage: "/",
85
+ steps: [
86
+ "Open / in a private window at 1280 pixels wide.",
87
+ "Click the hero's next control and note which slide appears.",
88
+ "Click it repeatedly through a full cycle back to the starting slide.",
89
+ "Click the previous control and check it goes back one.",
90
+ "Use any slide indicators to jump directly to a slide.",
91
+ ],
92
+ inputs: { viewportWidth: 1280 },
93
+ expectedBehaviour: "Manual controls move exactly one slide per press and wrap in both directions. Indicators jump directly and reflect the current slide.",
94
+ expectedUiState: "Next advances one slide, previous goes back one, and both wrap. The active indicator tracks the visible slide, including after an automatic advance.",
95
+ endResult: "Read-only; restore the window width afterwards.",
96
+ },
97
+ "checklist-design-ux-homepage-carousels-hero-banner-loops": {
98
+ roles: ["guest"],
99
+ startPage: "/",
100
+ steps: [
101
+ "Open / in a private window at 1280 pixels and find any banner strip distinct from the hero carousel.",
102
+ "Watch it through a full cycle and note the item count.",
103
+ "Watch past the last item to see whether it wraps.",
104
+ "Resize to 390 pixels and watch it again.",
105
+ ],
106
+ inputs: { viewportWidth: 1280, mobileWidth: 390 },
107
+ expectedBehaviour: "A banner strip wraps like the hero does and keeps its cycle at both widths. A strip that wraps on desktop and stops on mobile has been re-measured on resize but not re-armed.",
108
+ expectedUiState: "The strip cycles and wraps at both widths, with the same items in the same order.",
109
+ endResult: "Read-only; restore the window width afterwards.",
110
+ },
111
+ "checklist-design-ux-homepage-carousels-sections-showcase-render": {
112
+ roles: ["guest"],
113
+ startPage: "/",
114
+ steps: [
115
+ "Open / in a private window at 1280 pixels wide.",
116
+ "Find each product-showcase section and read its heading.",
117
+ "Check each has cards beneath it with titles, images and prices.",
118
+ "Write down any showcase heading whose rail is empty.",
119
+ "Click one card and confirm it opens that listing.",
120
+ ],
121
+ expectedBehaviour: "A showcase section renders its own query's results. Because each section fails silently to nothing, an empty rail under a heading is the visible half of a section whose fetch returned nothing — the heading rendering at all means the section itself did not throw.",
122
+ expectedUiState: "Every showcase heading has populated cards beneath it, each with a real title, a rendered image and a price. A heading with an empty rail is the finding, named specifically.",
123
+ expectedData: { emptyShowcaseRails: 0 },
124
+ endResult: "Read-only; nothing persists.",
125
+ },
126
+ "checklist-design-ux-homepage-carousels-sections-promo-render": {
127
+ roles: ["guest"],
128
+ startPage: "/",
129
+ steps: [
130
+ "Open / in a private window at 1280 pixels wide.",
131
+ "Find each promotional section and read its heading, copy and action buttons.",
132
+ "Check each button's label is not truncated and that it leads somewhere.",
133
+ "Click one and read where it lands.",
134
+ "Switch to dark mode and read the same sections.",
135
+ ],
136
+ expectedBehaviour: "Promo sections render their configured copy and actions, and their buttons resolve. Buttons on a coloured band need the solid pairing rather than a theme-relative surface, which is a light background in every light theme.",
137
+ expectedUiState: "Each promo section shows its copy and buttons with readable labels in both themes, and every button lands on a real page. An empty promo band, or a button whose label is invisible in one theme, are both failures.",
138
+ endResult: "Read-only; return the site to light mode afterwards.",
139
+ },
140
+ "checklist-design-ux-homepage-carousels-sections-live-reserve-render": {
141
+ roles: ["guest"],
142
+ startPage: "/",
143
+ steps: [
144
+ "Open / in a private window at 1280 pixels wide.",
145
+ "Find the live auctions section and read every card.",
146
+ "Check each card's countdown and note whether any reads as already ended.",
147
+ "Find the pre-order or reserve section and read its cards.",
148
+ "Check whether any is sold out.",
149
+ ],
150
+ expectedBehaviour: "Both strips filter by availability before rendering. The auctions strip is the one worth checking hardest: sorted by end date ASCENDING with no lower bound, it front-loads the OLDEST end dates, so a 'Live Auctions' rail leads with the longest-dead lots in the catalogue — and an ended auction renders as a perfectly ordinary card with nothing to flag it.",
151
+ expectedUiState: "Every card in the live auctions strip has a future end date and a running countdown. No card reads 'Ended'. The reserve strip holds no sold-out pre-orders.",
152
+ expectedData: { endedAuctionsInLiveStrip: 0 },
153
+ endResult: "Read-only; nothing persists. Read every card's countdown rather than the first — the dead ones sort to the front, but a partially-fixed filter can leave them anywhere.",
154
+ },
155
+ "checklist-design-ux-homepage-carousels-sections-social-proof-render": {
156
+ roles: ["guest"],
157
+ startPage: "/",
158
+ steps: [
159
+ "Open / in a private window at 1280 pixels wide.",
160
+ "Find the social-proof section — reviews, ratings or testimonials.",
161
+ "Read each entry for its text, its rating and its attribution.",
162
+ "Check whether any attribution shows a full real name.",
163
+ "Check whether any review image renders as a broken tile.",
164
+ ],
165
+ expectedBehaviour: "Reviewer identities are masked on the way out of the server. Review images are stored as plain URL strings — a renderer that expects objects and reads a nested property off each string gets undefined for every one and falls back to a placeholder, which is what makes every review photo on a page vanish at once.",
166
+ expectedUiState: "Entries show their text and rating with masked attributions rather than full names. Any review photos render rather than showing placeholder icons.",
167
+ endResult: "Read-only; nothing persists.",
168
+ },
169
+ "checklist-design-ux-homepage-carousels-sections-social-feed-hidden": {
170
+ roles: ["guest"],
171
+ startPage: "/",
172
+ steps: [
173
+ "Open / in a private window with no session.",
174
+ "Scroll the whole page looking for an embedded social feed.",
175
+ "Open the browser's View Source and search for instagram, twitter, x.com and facebook embed markers.",
176
+ "Open DevTools' Network tab, reload, and look for requests to any social host.",
177
+ ],
178
+ expectedBehaviour: "A social feed section stays hidden until it is configured. An unconfigured embed either renders an empty framed box or loads a third-party script for every visitor and shows nothing — both are worse than the section being absent.",
179
+ expectedUiState: "No social feed section is rendered, no empty framed box sits where one would be, and no request goes to a social host.",
180
+ expectedData: { socialHostRequests: 0 },
181
+ endResult: "Read-only; nothing persists. If a feed IS configured on this environment, record that rather than failing the case.",
182
+ },
183
+ "checklist-design-ux-homepage-carousels-hero-welcome-logo-sized-padded": {
184
+ roles: ["guest"],
185
+ startPage: "/",
186
+ steps: [
187
+ "Open / in a private window at 1280 pixels wide.",
188
+ "Look at the welcome hero's brand mark and wordmark.",
189
+ "Check the space around them against the surrounding copy.",
190
+ "Resize to 390 pixels and look again.",
191
+ "Switch to dark mode and look at both widths again.",
192
+ ],
193
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
194
+ expectedBehaviour: "The logo takes its size from a named size rather than hand-written height classes, so it scales across breakpoints without each call site restating the ladder. Its gradient stops come from theme colours, so it restyles with the theme instead of needing a second asset.",
195
+ expectedUiState: "The mark and wordmark are proportionate with even padding at both widths, and both are legible in both themes. A logo that is enormous on mobile or crushed against its neighbours is the failure.",
196
+ endResult: "Read-only; return to light mode and restore the width.",
197
+ },
198
+ "checklist-design-ux-homepage-carousels-welcome-hero-no-gap": {
199
+ roles: ["guest"],
200
+ startPage: "/",
201
+ steps: [
202
+ "Open / in a private window at 1280 pixels wide.",
203
+ "Look at the join between the header and the welcome hero.",
204
+ "Look at the join between the hero and the section below it.",
205
+ "Resize to 390 pixels and look at both joins again.",
206
+ "Scroll down and back up and look once more.",
207
+ ],
208
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
209
+ expectedBehaviour: "The hero meets the header and the following section without a stray band of page background. Such a gap usually comes from a section applying its own top margin on top of the shell's spacing.",
210
+ expectedUiState: "No unexplained horizontal band above or below the hero at either width. The hero's background meets the header cleanly.",
211
+ endResult: "Read-only; restore the window width afterwards.",
212
+ },
213
+ "checklist-design-ux-homepage-carousels-promo-banner-overlay": {
214
+ roles: ["guest"],
215
+ startPage: "/",
216
+ steps: [
217
+ "Open / in a private window at 1280 pixels wide and find a promo banner with copy over an image.",
218
+ "Read every word of its heading, body and button labels.",
219
+ "Resize to 390 pixels and read them again.",
220
+ "Switch to dark mode and read them at both widths.",
221
+ "Note any word that is hard to read against the image behind it.",
222
+ ],
223
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
224
+ expectedBehaviour: "A dim overlay sits between the image and the copy so text stays readable whatever the image is. Without it, legibility depends on which photo an admin uploaded — which means it will fail eventually and not during testing.",
225
+ expectedUiState: "All banner copy is readable at both widths in both themes, with a visible dim layer between image and text. Copy fighting a busy photograph is the failure even if it is just about readable today.",
226
+ endResult: "Read-only; return to light mode and restore the width.",
227
+ },
228
+ "checklist-design-ux-homepage-carousels-hero-slides-have-copy": {
229
+ roles: ["guest"],
230
+ startPage: "/",
231
+ steps: [
232
+ "Open / in a private window at 1280 pixels wide.",
233
+ "Watch the hero through a full cycle, reading each slide's heading, body and button.",
234
+ "Write down any slide that is image-only with no copy.",
235
+ "Click each slide's button and read where it lands.",
236
+ "Resize to 390 pixels and check the copy is still readable and not clipped.",
237
+ ],
238
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
239
+ expectedBehaviour: "Every active slide carries copy and a destination. An image-only slide is a large piece of screen that says nothing and goes nowhere, which is worse than one fewer slide.",
240
+ expectedUiState: "Each slide has a heading, some body copy and a working button. Nothing is clipped at 390 pixels. A slide whose button leads nowhere is the failure.",
241
+ expectedData: { slidesWithoutCopy: 0 },
242
+ endResult: "Read-only; restore the window width afterwards.",
243
+ },
244
+ "checklist-design-ux-homepage-carousels-homepage-single-h1": {
245
+ roles: ["guest"],
246
+ startPage: "/",
247
+ steps: [
248
+ "Open / in a private window with no session.",
249
+ "Open the browser's View Source and search for every h1 tag.",
250
+ "Count them.",
251
+ "Read the text of each one found.",
252
+ "Repeat on /products and on a product detail page.",
253
+ ],
254
+ expectedBehaviour: "One top-level heading per page. Several compete for what the page is about, which weakens the signal a crawler reads and makes the document outline meaningless to a screen reader.",
255
+ expectedUiState: "Exactly one h1 in the homepage source, describing the site. The same holds on /products and on a product page, where the h1 is the product's own title.",
256
+ expectedData: { h1Count: 1 },
257
+ endResult: "Read-only; nothing persists.",
258
+ },
259
+ "checklist-design-ux-homepage-carousels-homepage-section-order": {
260
+ roles: ["admin", "guest"],
261
+ startPage: "/",
262
+ steps: [
263
+ "Open / in a private window and write down every section heading in the order it appears.",
264
+ "Sign in as admin@letitrip.in / TempPass123! and open the homepage sections editor.",
265
+ "Write down the configured order.",
266
+ "Compare the two lists.",
267
+ "Move one section up in the editor and save.",
268
+ "Reload the public homepage and check that section has moved, then put it back.",
269
+ ],
270
+ expectedBehaviour: "The rendered order follows the configured order, and a change takes effect on the public page. An order held in the renderer rather than read from configuration makes the admin control decorative.",
271
+ expectedUiState: "The two lists match. After the move, the public page reflects the new position. A saved change with no visible effect is the failure.",
272
+ endResult: "The section is back in its original position by the final step.",
273
+ },
274
+ "checklist-design-ux-homepage-carousels-homepage-no-franchise-specific-strips": {
275
+ roles: ["guest"],
276
+ startPage: "/",
277
+ steps: [
278
+ "Open / in a private window with no session.",
279
+ "Read every section heading down the page.",
280
+ "Write down any heading naming a specific franchise or brand rather than a category or a state.",
281
+ "Check whether any such strip is empty.",
282
+ ],
283
+ expectedBehaviour: "Homepage strips are configured, not hard-coded to a franchise. A strip named for one brand is a strip that empties the day that brand's stock runs out — and an empty strip under a heading is exactly what a silent section failure looks like, so the two become indistinguishable.",
284
+ expectedUiState: "Section headings describe categories, states or configured collections rather than naming a single franchise. No strip is empty.",
285
+ endResult: "Read-only; nothing persists.",
286
+ },
287
+ "checklist-design-ux-homepage-carousels-section-config-actually-renders": {
288
+ roles: ["admin", "guest"],
289
+ startPage: "/admin",
290
+ steps: [
291
+ "Sign in as admin@letitrip.in / TempPass123! and open the homepage sections editor.",
292
+ "Open one section's configuration and write down every field it offers.",
293
+ "Change a visible field — a heading or an item limit — and save.",
294
+ "Open / in a private window and read that section.",
295
+ "Check whether the change is reflected.",
296
+ "Repeat for a second section of a different type, then restore both.",
297
+ ],
298
+ expectedBehaviour: "Every field a section's configuration offers reaches the renderer. A field that is editable and saved but never read is invisible from both ends — the admin sees it save and the page never changes.",
299
+ expectedUiState: "Both changed fields are reflected on the public homepage after saving. A field that saves without changing anything is the finding, named by section and field.",
300
+ endResult: "Both sections are restored to their original configuration by the final step.",
301
+ },
302
+ "checklist-design-ux-homepage-carousels-section-save-preserves-other-fields": {
303
+ roles: ["admin"],
304
+ startPage: "/admin",
305
+ steps: [
306
+ "Sign in as admin@letitrip.in / TempPass123! and open the homepage sections editor.",
307
+ "Open one section and write down the value of EVERY field it holds.",
308
+ "Change exactly one field and save.",
309
+ "RELOAD the editor and read every field again.",
310
+ "Compare against what was written down.",
311
+ "Restore the changed field and save.",
312
+ ],
313
+ expectedBehaviour: "Saving one field leaves the rest untouched. A form that submits its whole object from partly-populated state overwrites every field it did not load — and the save returns a perfectly normal success, so only a reload shows it.",
314
+ expectedUiState: "After the reload only the changed field differs. Every other field holds its original value. A field silently reset to its default is the failure, and it is invisible without the reload.",
315
+ endResult: "The section is back to its original configuration by the final step.",
316
+ },
317
+ "checklist-design-ux-homepage-carousels-carousel-toggles-take-effect": {
318
+ roles: ["admin", "guest"],
319
+ startPage: "/admin",
320
+ steps: [
321
+ "Sign in as admin@letitrip.in / TempPass123! and open the carousel or homepage section settings.",
322
+ "Note which carousel-related toggles are offered and their current states.",
323
+ "Turn one off and save.",
324
+ "Open / in a private window and check whether that behaviour has stopped.",
325
+ "Turn it back on, save, and check the behaviour returns.",
326
+ ],
327
+ expectedBehaviour: "Each toggle reaches the rendered carousel. A toggle that saves without changing behaviour is decorative, and the admin has no way to tell — the setting reads as applied.",
328
+ expectedUiState: "Turning the toggle off visibly stops the behaviour on the public homepage, and turning it on restores it. No effect in either direction is the failure.",
329
+ endResult: "Every toggle is back in its original state by the final step.",
330
+ },
331
+ "checklist-design-ux-homepage-carousels-banner-buttons-from-config": {
332
+ roles: ["admin", "guest"],
333
+ startPage: "/admin",
334
+ steps: [
335
+ "Sign in as admin@letitrip.in / TempPass123! and open the homepage section holding a banner with buttons.",
336
+ "Change a button's label to 'QA Banner buttons-from-config' and its destination to /about, then save.",
337
+ "Open / in a private window and find that banner.",
338
+ "Read the button's label and click it.",
339
+ "Read where it lands.",
340
+ "Restore the original label and destination.",
341
+ ],
342
+ inputs: { buttonLabel: "QA Banner buttons-from-config", destination: "/about" },
343
+ expectedBehaviour: "Banner buttons are rendered from configuration rather than hard-coded, so both label and destination follow what the admin set.",
344
+ expectedUiState: "The public banner shows the typed label and clicking it lands on /about. A button still showing its old label, or still going to its old destination, is the failure — and a label that updates while the destination does not is the more likely half.",
345
+ endResult: "The button is restored to its original label and destination by the final step.",
346
+ },
347
+ "checklist-design-ux-homepage-carousels-trust-and-security-from-config": {
348
+ roles: ["admin", "guest"],
349
+ startPage: "/",
350
+ steps: [
351
+ "Open / in a private window and find the trust or security section, reading every item in it.",
352
+ "Sign in as admin@letitrip.in / TempPass123! and open that section's configuration.",
353
+ "Compare the configured items against what the public page showed.",
354
+ "Change one item's text and save.",
355
+ "Reload the public homepage and read that item.",
356
+ "Restore the original text.",
357
+ ],
358
+ expectedBehaviour: "The trust section's items come from configuration rather than being hard-coded copy. Hard-coded trust claims cannot be corrected without a deploy, which matters more here than in most sections.",
359
+ expectedUiState: "The configured items match what the public page renders, and the edited item's new text appears after saving. An unchanged public page means the section ignores its configuration.",
360
+ endResult: "The item is restored by the final step.",
361
+ },
362
+ "checklist-design-ux-homepage-carousels-homepage-newsletter-enter-key": {
363
+ roles: ["guest"],
364
+ startPage: "/",
365
+ steps: [
366
+ "Open / in a private window and find the newsletter signup on the homepage.",
367
+ "Click into its email field and press Enter with the field empty.",
368
+ "Read what happens.",
369
+ "Type not-an-email and press Enter.",
370
+ "Read where any error appears.",
371
+ "Type qa-newsletter-1@mailnull.com and press Enter without clicking the button.",
372
+ ],
373
+ inputs: { invalidEmail: "not-an-email", validEmail: "qa-newsletter-1@mailnull.com" },
374
+ expectedBehaviour: "Enter submits the form, exactly as the button does. A field that ignores Enter loses every visitor who types an address and presses return — which is most of them.",
375
+ expectedUiState: "The empty and malformed submissions produce an inline error on the field. The valid one produces a confirmation. Enter behaves identically to clicking the button, and the page does not reload.",
376
+ endResult: "A newsletter subscription exists for that address. The address is numbered so a second run can increment it rather than colliding.",
377
+ },
378
+ "checklist-design-ux-homepage-carousels-footer-newsletter-inline-error": {
379
+ roles: ["guest"],
380
+ startPage: "/",
381
+ steps: [
382
+ "Open / in a private window and scroll to the footer's newsletter signup.",
383
+ "Submit it with the field empty and read where any message appears.",
384
+ "Type not-an-email and submit, then read where the message appears.",
385
+ "Check whether the error is attached to the field or shown as a floating toast.",
386
+ "Type qa-newsletter-2@mailnull.com and submit.",
387
+ ],
388
+ inputs: { invalidEmail: "not-an-email", validEmail: "qa-newsletter-2@mailnull.com" },
389
+ expectedBehaviour: "The footer form reports its errors inline on the field, like every other form in the app. A toast for a field-level problem forces the user to look away from the field they need to fix, and disappears before they have.",
390
+ expectedUiState: "Both invalid submissions put an error under the email field, not in a toast. The valid one confirms. The behaviour matches the homepage newsletter form.",
391
+ endResult: "A subscription exists for that address. Note any difference from the homepage form — two newsletter forms behaving differently is itself the finding.",
392
+ },
393
+ "checklist-design-ux-homepage-carousels-homepage-faq-structured-data": {
394
+ roles: ["guest"],
395
+ startPage: "/",
396
+ steps: [
397
+ "Open / in a private window with no session.",
398
+ "Find the FAQ section on the page and read its questions.",
399
+ "Open the browser's View Source and search for application/ld+json.",
400
+ "Read the structured data block and find the FAQ entries.",
401
+ "Compare the questions in the markup against the ones rendered.",
402
+ ],
403
+ expectedBehaviour: "The FAQ section emits matching structured data, so the questions a crawler reads are the questions on the page. Markup describing questions that are not rendered is a mismatch a search engine will eventually penalise.",
404
+ expectedUiState: "A structured-data block is present and its FAQ entries match the rendered questions and answers one for one. Markup with no visible section, or a section with no markup, are both failures.",
405
+ endResult: "Read-only; nothing persists.",
406
+ },
407
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,214 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/status-badge-legibility page.
3
+ * WHAT: 13 case(s), keyed by full checklist id.
4
+ *
5
+ * Written by hand, case by case, against the label each one states. There is no
6
+ * generator: the authoring scripts were deleted once it was clear they were
7
+ * scaffolding around work that is simply writing.
8
+ *
9
+ * 🛑 TWO PAIRINGS, NEVER MIXED. An inline chip is a status TINT with matching
10
+ * status ink; a badge overlaying a photo is a status SOLID with on-solid ink.
11
+ * Both halves of each pair invert together. A literal white ink against either
12
+ * background is invisible in exactly one theme, which is why every case here is
13
+ * read in both — and why several of them name the dark theme specifically.
14
+ *
15
+ * A third failure mode is worse than a wrong pairing: a class the build never
16
+ * generates. Tailwind drops an unknown utility silently, so the element renders
17
+ * with no background at all and looks like a styling choice.
18
+ *
19
+ * @tag domain:tester
20
+ * @tag layer:seed
21
+ * @tag pattern:none
22
+ * @tag access:server-only
23
+ * @tag consumers:seed-data/authored/index.ts
24
+ * @tag sideEffects:none
25
+ */
26
+ export const authored = {
27
+ "checklist-design-ux-status-badge-legibility-listing-type-tags-readable-light": {
28
+ roles: ["guest"],
29
+ startPage: "/products",
30
+ steps: [
31
+ "Open /products in a private window in LIGHT mode.",
32
+ "Find a card of each listing type and read its badge: Auction, Pre-Order, Prize Draw, Classified, Digital Code, Live Item, Art Print, Sticker Sheet.",
33
+ "Read each badge's text against its own background.",
34
+ "Write down any badge whose text cannot be read.",
35
+ ],
36
+ expectedBehaviour: "Each type badge pairs a background and an ink that belong together. A tint paired with a literal white ink is white on near-white in a light theme — and the same badge is perfectly readable in dark, which is why a light-mode pass is its own case.",
37
+ expectedUiState: "All eight badges are readable in light mode. The specific failure is a badge whose text is invisible against a pale fill while the badge shape is clearly there.",
38
+ expectedData: { unreadableBadgesLight: 0 },
39
+ endResult: "Read-only; nothing persists.",
40
+ },
41
+ "checklist-design-ux-status-badge-legibility-listing-type-tags-readable-dark": {
42
+ roles: ["guest"],
43
+ startPage: "/products",
44
+ steps: [
45
+ "Open /products in a private window and switch to DARK mode.",
46
+ "Find a card of each listing type and read its badge.",
47
+ "Compare each against how it read in light mode.",
48
+ "Write down any badge readable in one theme and not the other.",
49
+ ],
50
+ expectedBehaviour: "The same eight badges hold in dark mode, because both halves of the pairing invert. A badge that is fine in one theme and unreadable in the other is the signature of a pairing where only one half is a token.",
51
+ expectedUiState: "All eight badges are readable in dark mode. A badge that passed the light-mode case and fails here is the finding, and it is the same bug from the other side.",
52
+ expectedData: { unreadableBadgesDark: 0 },
53
+ endResult: "Read-only; return the site to light mode afterwards.",
54
+ },
55
+ "checklist-design-ux-status-badge-legibility-live-item-tag-has-background": {
56
+ roles: ["guest"],
57
+ startPage: "/products",
58
+ steps: [
59
+ "Open /products in a private window and find a Live Item card.",
60
+ "Look at its badge and check whether it has a filled background at all.",
61
+ "Compare it against the Auction and Pre-Order badges beside it.",
62
+ "Switch to dark mode and look again.",
63
+ "Open /live/live-tester-sandbox-1 signed in as tester@letitrip.in / TempPass123! and look at the badge there.",
64
+ ],
65
+ expectedBehaviour: "The Live Item badge names a colour the build can actually generate. Its background once used a flat alias that has no tint variant and is absent from the app's own palette entirely, so the class compiled to nothing and the badge rendered with no fill — which reads as a deliberate outline style rather than a dropped class.",
66
+ expectedUiState: "The Live Item badge has a visible filled background in both themes, like every other type badge. A badge that is text-only while its neighbours are filled is the failure.",
67
+ expectedData: { hasBackground: true },
68
+ endResult: "Read-only; return the site to light mode afterwards.",
69
+ },
70
+ "checklist-design-ux-status-badge-legibility-promo-badges-readable": {
71
+ roles: ["guest"],
72
+ startPage: "/products",
73
+ steps: [
74
+ "Open /products in a private window in light mode.",
75
+ "Find cards showing NEW, SALE and LIMITED badges and read each.",
76
+ "Note whether these badges sit over the card's photo or beside its title.",
77
+ "Switch to dark mode and read them again.",
78
+ ],
79
+ expectedBehaviour: "These badges overlay a photograph, so they take the solid pairing rather than the tint one — a pale tint over an arbitrary product image is unreadable regardless of theme. A past sweep converted solid fills to tints and left the white ink behind, which broke these three specifically.",
80
+ expectedUiState: "NEW, SALE and LIMITED are readable over their photos in both themes, with a solid enough fill to separate them from the image behind. A pale badge floating over a light product photo is the failure.",
81
+ endResult: "Read-only; return the site to light mode afterwards.",
82
+ },
83
+ "checklist-design-ux-status-badge-legibility-soft-ban-lift-notification-has-a-body": {
84
+ roles: ["admin", "buyer"],
85
+ startPage: "/admin/users",
86
+ steps: [
87
+ "Sign in as admin@letitrip.in / TempPass123!.",
88
+ "Open /admin/users, find karthik.new@gmail.com, and apply a soft ban with a reason.",
89
+ "Lift the ban again.",
90
+ "Sign out and sign in as karthik.new@gmail.com / TempPass123!.",
91
+ "Open /user/notifications and read the ban-lift notification's title AND its body.",
92
+ ],
93
+ inputs: { targetUser: "karthik.new@gmail.com" },
94
+ expectedBehaviour: "The ban-lift notification carries a body, not only a title. Every notification type renders from a per-type template; a type with no template falls back to something generic, which shows as an empty body or a repeat of the title.",
95
+ expectedUiState: "The notification has a readable title and a distinct body explaining that access is restored. An empty body, or a body that simply restates the title, means this type has no template.",
96
+ endResult: "The account is unbanned. Confirm karthik.new@gmail.com can sign in normally afterwards — it is used by other cases.",
97
+ },
98
+ "checklist-design-ux-status-badge-legibility-review-feedback-notification-delivers": {
99
+ roles: ["buyer", "seller"],
100
+ startPage: "/products/product-beyblade-burst-valkyrie",
101
+ steps: [
102
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
103
+ "Open a product this account has bought and leave a review.",
104
+ "Sign out and sign in as tyson@beybladearena.in / TempPass123!, the store owner.",
105
+ "Open /store and check for a notification about the new review.",
106
+ "Read its title, its body and where its link goes.",
107
+ "Click the link.",
108
+ ],
109
+ expectedBehaviour: "The seller is notified when a review lands, with a body and a destination. Reviews have no per-record page in any role, so the link correctly resolves to the reviews LIST — fabricating a per-review URL would 404, which is worse than a list.",
110
+ expectedUiState: "A notification exists for the store owner with a readable title and body. Its link opens the reviews list rather than a 404. No notification at all means the hook did not fire.",
111
+ endResult: "Delete the review afterwards so review counts on that product stay as seeded.",
112
+ },
113
+ "checklist-design-ux-status-badge-legibility-analytics-tags-absent-until-configured": {
114
+ roles: ["guest"],
115
+ startPage: "/",
116
+ steps: [
117
+ "Open / in a private window with no session.",
118
+ "Open the browser's View Source and search for gtag, googletagmanager, fbq and connect.facebook.net.",
119
+ "Open DevTools' Network tab, reload, and look for any request to a Google or Facebook analytics host.",
120
+ "Note whether any such tag is present.",
121
+ ],
122
+ expectedBehaviour: "Analytics tags are injected only when their ids are configured. Those ids live in a settings group that is separate from the encrypted credentials — and that group was written by the admin form while being undeclared on the settings type, which is precisely how a field escapes every type-driven review.",
123
+ expectedUiState: "With no analytics ids configured, no tag script is present in the source and no request is made to an analytics host. A tag firing with an empty or placeholder id is the failure — it loads the third-party script for every visitor and sends nothing useful.",
124
+ expectedData: { analyticsRequests: 0 },
125
+ endResult: "Read-only; nothing persists. If ids ARE configured on this environment, note that instead of failing the case.",
126
+ },
127
+ "checklist-design-ux-status-badge-legibility-notification-count-bubbles-readable": {
128
+ roles: ["buyer"],
129
+ startPage: "/user",
130
+ steps: [
131
+ "Sign in as rehan.sheikh@gmail.com / TempPass123! with at least one unread notification.",
132
+ "Open /user and read the number inside the header bell's count bubble.",
133
+ "Read the same bubble in the sidebar if one appears there.",
134
+ "Switch to dark mode and read both again.",
135
+ "Resize to 390 pixels wide and read them again.",
136
+ ],
137
+ inputs: { mobileWidth: 390 },
138
+ expectedBehaviour: "A count bubble overlays other chrome, so it takes the solid pairing. These bubbles were among the surfaces a past sweep converted to a tint while leaving the white ink, which makes the number invisible while the bubble itself is clearly there.",
139
+ expectedUiState: "The number is legible in both themes and at both widths. A visible coloured dot with no readable number in it is the failure.",
140
+ endResult: "Read-only; return the site to light mode and restore the width.",
141
+ },
142
+ "checklist-design-ux-status-badge-legibility-admin-status-chips-colored": {
143
+ roles: ["admin"],
144
+ startPage: "/admin/orders",
145
+ steps: [
146
+ "Sign in as admin@letitrip.in / TempPass123!.",
147
+ "Open /admin/orders and read every status chip in the list.",
148
+ "Check that different statuses use different colours and that each chip's text is readable.",
149
+ "Open /admin/stores and read its status chips.",
150
+ "Open /admin/payouts and read its status chips.",
151
+ "Switch to dark mode and read all three again.",
152
+ ],
153
+ expectedBehaviour: "Status chips are inline, so they take the tint pairing with matching ink. Distinct statuses must be distinguishable by colour — a table where every chip is the same grey is a table where status has to be read word by word.",
154
+ expectedUiState: "Each status renders in its own colour and every chip's text is readable, on all three pages and in both themes. Chips that are all one colour, or whose text is invisible, are both failures.",
155
+ endResult: "Read-only; return the site to light mode afterwards.",
156
+ },
157
+ "checklist-design-ux-status-badge-legibility-faq-helpful-buttons-readable": {
158
+ roles: ["guest"],
159
+ startPage: "/faqs",
160
+ steps: [
161
+ "Open /faqs in a private window in light mode and expand a question.",
162
+ "Find the helpful / not-helpful controls and read their labels.",
163
+ "Hover each and read it while hovering.",
164
+ "Click one and read its label in the selected state.",
165
+ "Switch to dark mode and repeat all four readings.",
166
+ ],
167
+ expectedBehaviour: "These controls have three states — resting, hover and selected — and each needs its own readable pairing in both themes. They were among the surfaces broken by a tint-with-white-ink conversion, and the selected state is the one most easily missed.",
168
+ expectedUiState: "Labels are readable in all three states, in both themes. The most likely failure is the selected state, since it is the only one requiring a click to see at all.",
169
+ endResult: "Read-only apart from the vote; return the site to light mode afterwards.",
170
+ },
171
+ "checklist-design-ux-status-badge-legibility-detail-page-tags-readable": {
172
+ roles: ["guest"],
173
+ startPage: "/auctions/auction-beyblade-x-shark-edge",
174
+ steps: [
175
+ "Open /auctions/auction-beyblade-x-shark-edge in a private window in light mode.",
176
+ "Read every tag and badge on the page — listing type, condition, stock, any promo tag.",
177
+ "Open /pre-orders/preorder-beyblade-x-bx-08-wave and read its badges, including the production status.",
178
+ "Open /prize-draws/prizedraw-beyblade-mystery-box and read its badges.",
179
+ "Switch to dark mode and read all three pages again.",
180
+ ],
181
+ expectedBehaviour: "Detail-page badges follow the same two pairings as card badges. They are worth checking separately because a detail page renders badges the grid never shows — production status, reserve state, code-pool state — and those are the ones a card-only sweep misses.",
182
+ expectedUiState: "Every badge on all three pages is readable in both themes. Detail-only badges such as 'In Production' are included in the reading.",
183
+ expectedData: { unreadableBadges: 0 },
184
+ endResult: "Read-only; return the site to light mode afterwards.",
185
+ },
186
+ "checklist-design-ux-status-badge-legibility-whatsapp-community-member-pill": {
187
+ roles: ["guest"],
188
+ startPage: "/",
189
+ steps: [
190
+ "Open / in a private window in light mode and scroll to the WhatsApp community card.",
191
+ "Read the member-count pill on it.",
192
+ "Look at the pill's background against the card's own branded background.",
193
+ "Switch to dark mode and read the pill again.",
194
+ ],
195
+ expectedBehaviour: "A pill sitting on a branded backdrop needs the translucent-white surface, not the page surface. The page surface is a LIGHT background in every light theme, so pairing it with inverse ink is white-on-white — the same defect as the badge cases, expressed through primitive props rather than utility classes.",
196
+ expectedUiState: "The member-count pill is readable against the branded card in both themes. A pill whose number is invisible while the pill shape is visible is the failure.",
197
+ endResult: "Read-only; return the site to light mode afterwards.",
198
+ },
199
+ "checklist-design-ux-status-badge-legibility-image-lightbox-close-hover": {
200
+ roles: ["guest"],
201
+ startPage: "/products/product-beyblade-burst-valkyrie",
202
+ steps: [
203
+ "Open /products/product-beyblade-burst-valkyrie in a private window.",
204
+ "Click the main image to open the lightbox.",
205
+ "Find the close control and read it at rest.",
206
+ "Hover it and read it while hovering.",
207
+ "Hover each of the other toolbar controls — zoom, rotate, expand — and read each.",
208
+ "Switch to dark mode and repeat.",
209
+ ],
210
+ expectedBehaviour: "The lightbox toolbar sits on a fixed dark scrim, which is one of the few places a fixed light hover fill is correct — expressed as white with an alpha rather than as a named palette tint. A named tint is the same near-white in both themes and swallows the icon on hover.",
211
+ expectedUiState: "The close control and every toolbar control stay visible while hovered, in both themes. An icon that disappears under its own hover fill is the failure, and it only shows with the pointer actually over it.",
212
+ endResult: "Read-only; return the site to light mode afterwards.",
213
+ },
214
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;