@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,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,35 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the cta-layout/product-bottom-bar page.
3
+ * WHAT: 1 case, 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
+ * @tag domain:tester
10
+ * @tag layer:seed
11
+ * @tag pattern:none
12
+ * @tag access:server-only
13
+ * @tag consumers:seed-data/authored/index.ts
14
+ * @tag sideEffects:none
15
+ */
16
+ export const authored = {
17
+ "checklist-cta-layout-product-bottom-bar-three-actions-wrap-to-second-row": {
18
+ roles: ["buyer"],
19
+ startPage: "/products/product-beyblade-original-dranzer-s",
20
+ steps: [
21
+ "Resize the browser window to 375 pixels wide.",
22
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
23
+ "Open /products/product-beyblade-original-dranzer-s.",
24
+ "Read the bottom action bar and note which buttons share a row.",
25
+ "Compare the widths of the two buttons on the upper row.",
26
+ "Click 'Add to Cart' and watch the bar while the label changes.",
27
+ "Count the rows in the bar during and after the change.",
28
+ ],
29
+ inputs: { viewportWidth: 375, productId: "product-beyblade-original-dranzer-s" },
30
+ expectedBehaviour: "Three actions of different weight are laid out as two secondaries sharing a row above one full-width primary. The secondaries share that row proportionally rather than one being pinned to its content width, which is what made the row read lopsided before.",
31
+ expectedUiState: "'Wishlist' and 'Add to Cart' occupy the upper row and neither is squeezed to a fraction of the other. 'Buy Now' spans the full width beneath them. While the label reads 'Adding…' the bar still has exactly two rows — a bar that reflows to three rows and back makes the whole page jump under the buyer's thumb mid-tap.",
32
+ expectedData: { barRowCount: 2 },
33
+ endResult: "The item is in the cart. Restore the window width and empty the cart afterwards so later cases start clean.",
34
+ },
35
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,95 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/back-to-top-button page.
3
+ * WHAT: 5 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 bottom edge is three declared tiers with exactly three variables and three
10
+ * writers: the keyboard inset, the mobile tab bar, and one container measuring
11
+ * everything between. This control consumes all three — which is why "does it
12
+ * clear the CTA bar" is a case rather than a detail.
13
+ *
14
+ * @tag domain:tester
15
+ * @tag layer:seed
16
+ * @tag pattern:none
17
+ * @tag access:server-only
18
+ * @tag consumers:seed-data/authored/index.ts
19
+ * @tag sideEffects:none
20
+ */
21
+ export const authored = {
22
+ "checklist-design-ux-back-to-top-button-appears-and-clickable-on-long-page": {
23
+ roles: ["guest"],
24
+ startPage: "/products",
25
+ steps: [
26
+ "Open /products in a private window at a desktop width of 1280 pixels.",
27
+ "Look for the back-to-top control before scrolling.",
28
+ "Scroll down past 400 pixels.",
29
+ "Look for the control again and read what it shows.",
30
+ "Click it.",
31
+ ],
32
+ inputs: { viewportWidth: 1280, revealScrollPx: 400 },
33
+ expectedBehaviour: "The control is hidden at the top of the page, where it would do nothing, and appears once there is somewhere to return to. It must be genuinely clickable rather than sitting behind another fixed element.",
34
+ expectedUiState: "Nothing is shown before scrolling. After 400 pixels the control appears and responds to a click. A control that appears but does not respond means something transparent is on top of it.",
35
+ endResult: "Read-only; nothing persists.",
36
+ },
37
+ "checklist-design-ux-back-to-top-button-above-sticky-buy-bar": {
38
+ roles: ["guest"],
39
+ startPage: "/products/product-beyblade-original-dranzer-s",
40
+ steps: [
41
+ "Open /products/product-beyblade-original-dranzer-s in a private window at 1280 pixels wide.",
42
+ "Scroll down past 400 pixels so both the sticky buy bar and the back-to-top control are showing.",
43
+ "Look at where the back-to-top control sits relative to the buy bar.",
44
+ "Try to click both the back-to-top control and each button in the buy bar.",
45
+ "Resize to 390 pixels wide and repeat.",
46
+ ],
47
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
48
+ expectedBehaviour: "Neither element learns the other's height — both read from the one measured container, so the control clears the bar automatically and a bar added later is covered with no edit. The desktop reveal threshold for the buy bar is the SAME 400 pixels, so the two appear on the same scroll tick and the overlap is guaranteed rather than occasional.",
49
+ expectedUiState: "The back-to-top control sits fully above the buy bar with a visible gap, at both widths. It does not overlap any buy-bar button, and every button in the bar is clickable.",
50
+ endResult: "Read-only; nothing persists. Restore the window width afterwards.",
51
+ },
52
+ "checklist-design-ux-back-to-top-button-scrolls-to-top": {
53
+ roles: ["guest"],
54
+ startPage: "/products",
55
+ steps: [
56
+ "Open /products in a private window and scroll to the bottom of the grid.",
57
+ "Click the back-to-top control.",
58
+ "Watch the page as it moves.",
59
+ "Read what is at the top of the viewport when it stops.",
60
+ "Read the address bar.",
61
+ ],
62
+ expectedBehaviour: "The control scrolls the window to the top of the current page. It is not a navigation — the URL, the filters and the page of results are all unchanged.",
63
+ expectedUiState: "The page ends at the top with the header and toolbar visible. The URL is unchanged, the same filters are still applied, and the same page of results is still loaded — a jump back to page one would be a navigation wearing a scroll control's clothes.",
64
+ endResult: "Read-only; nothing persists.",
65
+ },
66
+ "checklist-design-ux-back-to-top-button-dismiss-returns-on-navigation": {
67
+ roles: ["guest"],
68
+ startPage: "/products",
69
+ steps: [
70
+ "Open /products in a private window and scroll past 400 pixels so the control appears.",
71
+ "Click its close or dismiss control.",
72
+ "Scroll up and down again and check whether it returns.",
73
+ "Navigate to /auctions WITHOUT reloading — click a link rather than typing the URL.",
74
+ "Scroll past 400 pixels and look for the control.",
75
+ ],
76
+ expectedBehaviour: "Dismissal lasts for the current page and is reset on the next navigation. This control lives in a shell that does NOT remount when the route changes, so a dismissal stored in browser storage reads as permanent: one click hid it until the tab was closed, with no way to bring it back.",
77
+ expectedUiState: "After dismissing, the control stays hidden on /products however much the page is scrolled. After navigating to /auctions it returns on scroll. A control still hidden after navigation is the failure.",
78
+ endResult: "Read-only; nothing persists.",
79
+ },
80
+ "checklist-design-ux-back-to-top-button-not-covering-toast-or-modal-actions": {
81
+ roles: ["buyer"],
82
+ startPage: "/products/product-tester-standard-1",
83
+ steps: [
84
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
85
+ "Open /products/product-tester-standard-1 and scroll past 400 pixels so the control appears.",
86
+ "Click 'Add to Cart' and watch for a toast.",
87
+ "Look at whether the control overlaps the toast or any control inside it.",
88
+ "Open any modal on the page and look at its footer buttons.",
89
+ "Try to click each footer button.",
90
+ ],
91
+ expectedBehaviour: "The control yields to transient and modal UI. A toast carries actions and a modal footer carries the decision — a floating control on top of either takes a click the user meant for something else.",
92
+ expectedUiState: "The toast is fully visible and its controls are clickable. The modal's footer buttons are unobstructed and every one responds. The back-to-top control either sits clear of both or is hidden while they are open.",
93
+ endResult: "Remove the item from the cart afterwards so later cases start from an empty cart.",
94
+ },
95
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,191 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/carousel-arrow-bounds page.
3
+ * WHAT: 12 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
+ * Every carousel in the app shares one implementation, so the last two cases
10
+ * exist to prove that sharing is real: a fix that lands on the homepage rail and
11
+ * not on the related-items rail means there are two implementations.
12
+ *
13
+ * @tag domain:tester
14
+ * @tag layer:seed
15
+ * @tag pattern:none
16
+ * @tag access:server-only
17
+ * @tag consumers:seed-data/authored/index.ts
18
+ * @tag sideEffects:none
19
+ */
20
+ export const authored = {
21
+ "checklist-design-ux-carousel-arrow-bounds-arrows-never-cover-cards": {
22
+ roles: ["guest"],
23
+ startPage: "/",
24
+ steps: [
25
+ "Open / in a private window at 1280 pixels wide.",
26
+ "Scroll to a horizontal card carousel.",
27
+ "Look at the left and right arrows and what sits under each.",
28
+ "Read the title and price of the first and last visible cards.",
29
+ "Try to click the first card's title without hitting an arrow.",
30
+ ],
31
+ inputs: { viewportWidth: 1280 },
32
+ expectedBehaviour: "Arrows sit in reserved gutters beside the rail rather than floating over the first and last cards. An arrow on top of a card takes the click meant for the card, which reads as a card that does not open.",
33
+ expectedUiState: "Neither arrow overlaps a card's image, title or price. The first card is clickable across its whole area. An arrow covering the corner of the end card is the failure even when the card still opens from elsewhere.",
34
+ endResult: "Read-only; restore the window width afterwards.",
35
+ },
36
+ "checklist-design-ux-carousel-arrow-bounds-arrows-no-overlap-mid-scroll": {
37
+ roles: ["guest"],
38
+ startPage: "/",
39
+ steps: [
40
+ "Open / in a private window at 1280 pixels wide and scroll to a card carousel.",
41
+ "Click the right arrow once and watch the cards move.",
42
+ "While the cards are still moving, look at where the arrows are.",
43
+ "Let it settle and look again.",
44
+ "Click through to the middle of the rail and look once more.",
45
+ ],
46
+ expectedBehaviour: "The arrows are fixed to the rail's gutters and do not move with its content, so a card sliding past never ends up under one — mid-scroll is the moment a card is most likely to be beneath an arrow.",
47
+ expectedUiState: "Arrows stay in place while the cards move and no card passes under them. In the middle of the rail neither arrow overlaps a card.",
48
+ endResult: "Read-only; restore the window width afterwards.",
49
+ },
50
+ "checklist-design-ux-carousel-arrow-bounds-no-arrows-on-mobile": {
51
+ roles: ["guest"],
52
+ startPage: "/",
53
+ steps: [
54
+ "Resize the browser window to 390 pixels wide and open / in a private window.",
55
+ "Scroll to a card carousel and look for arrows.",
56
+ "Swipe the rail and check it moves.",
57
+ "Resize to 1280 pixels and look for the arrows again.",
58
+ ],
59
+ inputs: { mobileWidth: 390, desktopWidth: 1280 },
60
+ expectedBehaviour: "Arrows are a pointer affordance and are hidden on touch widths, where swiping is the interaction. Keeping them costs horizontal space the cards need on the narrowest screens.",
61
+ expectedUiState: "No arrows at 390 pixels, and the rail still swipes. Arrows return at 1280. Arrows present at 390 are the failure.",
62
+ endResult: "Read-only; restore the window width afterwards.",
63
+ },
64
+ "checklist-design-ux-carousel-arrow-bounds-mobile-card-not-clipped": {
65
+ roles: ["guest"],
66
+ startPage: "/",
67
+ steps: [
68
+ "Resize the browser window to 390 pixels wide and open / in a private window.",
69
+ "Scroll to a card carousel and look at the first card's left edge.",
70
+ "Look at the last card's right edge after swiping to the end.",
71
+ "Read each visible card's title and price in full.",
72
+ "Try to scroll the page sideways rather than the rail.",
73
+ ],
74
+ inputs: { mobileWidth: 390 },
75
+ expectedBehaviour: "Cards are fully readable at the rail's ends, with the container's own padding preserved. A rail that bleeds into the page's edge padding makes the whole page scroll sideways instead of the rail.",
76
+ expectedUiState: "No card is clipped at either end. Every visible title and price reads in full. The PAGE does not scroll sideways — only the rail does.",
77
+ endResult: "Read-only; restore the window width afterwards.",
78
+ },
79
+ "checklist-design-ux-carousel-arrow-bounds-mobile-swipe-and-snap": {
80
+ roles: ["guest"],
81
+ startPage: "/",
82
+ steps: [
83
+ "Resize the browser window to 390 pixels wide and open / in a private window.",
84
+ "Scroll to a card carousel and swipe it left with a short flick.",
85
+ "Watch where it comes to rest.",
86
+ "Swipe again with a long flick and watch where it rests.",
87
+ "Swipe back to the start.",
88
+ ],
89
+ inputs: { mobileWidth: 390 },
90
+ expectedBehaviour: "The rail snaps so a card edge aligns to the viewport rather than resting mid-card. Both a short and a long flick end aligned — a snap that only works for one gesture length is not a snap.",
91
+ expectedUiState: "After both flicks the rail rests with a card edge aligned, not with a card half off screen. Swiping back reaches the true start with the first card fully visible.",
92
+ endResult: "Read-only; restore the window width afterwards.",
93
+ },
94
+ "checklist-design-ux-carousel-arrow-bounds-no-white-fade-smear": {
95
+ roles: ["guest"],
96
+ startPage: "/",
97
+ steps: [
98
+ "Open / in a private window in light mode at 1280 pixels and scroll to a card carousel.",
99
+ "Look at the left and right edges of the rail for a fade or gradient overlay.",
100
+ "Switch to dark mode and look at the same edges.",
101
+ "Scroll the rail to the middle and look again in dark mode.",
102
+ ],
103
+ expectedBehaviour: "Any edge fade is drawn from a theme-relative surface so it matches the page behind it. A fade hard-coded to white sits as a pale smear over a dark page — visible as a haze rather than as a gradient into the background.",
104
+ expectedUiState: "The rail's edges blend into the page background in both themes. In dark mode there is no light smear or milky band at either edge.",
105
+ endResult: "Read-only; return the site to light mode and restore the width.",
106
+ },
107
+ "checklist-design-ux-carousel-arrow-bounds-two-row-tall-arrows": {
108
+ roles: ["guest"],
109
+ startPage: "/",
110
+ steps: [
111
+ "Open / in a private window at 1280 pixels and find a carousel whose cards wrap to two rows, or a taller card variant.",
112
+ "Look at the arrows' vertical position relative to the rail.",
113
+ "Check whether they are centred on the full height or on one row.",
114
+ "Click each and check it scrolls the whole rail.",
115
+ ],
116
+ expectedBehaviour: "Arrows centre on the rail's full height whatever the card height, so a taller card variant does not leave them stranded near the top.",
117
+ expectedUiState: "Both arrows are vertically centred against the full rail height and both scroll the entire rail. Arrows aligned to the first row of a two-row rail are the failure.",
118
+ endResult: "Read-only; restore the window width afterwards.",
119
+ },
120
+ "checklist-design-ux-carousel-arrow-bounds-arrows-dark-mode": {
121
+ roles: ["guest"],
122
+ startPage: "/",
123
+ steps: [
124
+ "Open / in a private window and switch to dark mode.",
125
+ "Scroll to a card carousel and look at both arrows.",
126
+ "Hover each and look at it while hovering.",
127
+ "Compare their visibility against light mode.",
128
+ ],
129
+ expectedBehaviour: "Arrow fill and glyph both come from tokens that invert, so the control is visible in both themes at rest and on hover. A named palette tint as the hover fill is the same near-white in both, and swallows the glyph in dark.",
130
+ expectedUiState: "Both arrows are clearly visible in dark mode and stay visible while hovered. An arrow that disappears under its own hover fill is the failure.",
131
+ endResult: "Read-only; return the site to light mode afterwards.",
132
+ },
133
+ "checklist-design-ux-carousel-arrow-bounds-arrow-end-state-no-jump": {
134
+ roles: ["guest"],
135
+ startPage: "/",
136
+ steps: [
137
+ "Open / in a private window at 1280 pixels and scroll to a card carousel.",
138
+ "Look at the left arrow while the rail is at its start.",
139
+ "Click right repeatedly to the end of the rail.",
140
+ "Look at the right arrow at the end and at the rail's position.",
141
+ "Watch whether the cards shift when an arrow changes state.",
142
+ ],
143
+ expectedBehaviour: "An arrow that cannot act is disabled in place rather than removed. Removing it frees its gutter, the rail widens, and every card jumps sideways at exactly the moment the user is reaching for one.",
144
+ expectedUiState: "At the start the left arrow is present and visibly disabled, not absent. At the end the right arrow is the same. The cards do not shift horizontally when either changes state.",
145
+ endResult: "Read-only; restore the window width afterwards.",
146
+ },
147
+ "checklist-design-ux-carousel-arrow-bounds-resize-across-breakpoint": {
148
+ roles: ["guest"],
149
+ startPage: "/",
150
+ steps: [
151
+ "Open / in a private window at 1280 pixels and scroll to a card carousel.",
152
+ "Slowly resize the window down through 1024, 768 and 640 to 390 pixels, watching the rail throughout.",
153
+ "Note the width at which the arrows disappear.",
154
+ "Slowly resize back up to 1280, watching the rail.",
155
+ "Check no card is left clipped or overlapped at any width.",
156
+ ],
157
+ expectedBehaviour: "The rail re-measures as the viewport changes, so arrows appear and disappear at the breakpoint and the card widths keep up. A rail that measures once on mount is correct at the width it loaded at and wrong at every other.",
158
+ expectedUiState: "Arrows appear and disappear cleanly at the breakpoint in both directions. At no intermediate width is a card clipped, overlapped by an arrow, or left at a stale width. The page never scrolls sideways.",
159
+ endResult: "Read-only; restore the window width afterwards.",
160
+ },
161
+ "checklist-design-ux-carousel-arrow-bounds-related-carousels-same-behaviour": {
162
+ roles: ["guest"],
163
+ startPage: "/products/product-beyblade-burst-valkyrie",
164
+ steps: [
165
+ "Open /products/product-beyblade-burst-valkyrie in a private window at 1280 pixels.",
166
+ "Scroll to the related-items carousels below the main content.",
167
+ "Check the arrows against the same points as the homepage: no card overlap, disabled at the ends, centred vertically.",
168
+ "Resize to 390 pixels and check the arrows disappear and the rail swipes.",
169
+ "Compare everything against how the homepage carousel behaved.",
170
+ ],
171
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
172
+ expectedBehaviour: "Related-items rails use the same carousel as the homepage, so every behaviour above holds here without a separate fix. A difference means there are two implementations and a fix has only landed on one.",
173
+ expectedUiState: "Arrow bounds, disabled end states, vertical centring and mobile behaviour all match the homepage carousel. Any difference is the finding, named specifically.",
174
+ endResult: "Read-only; restore the window width afterwards.",
175
+ },
176
+ "checklist-design-ux-carousel-arrow-bounds-category-page-carousels-same-behaviour": {
177
+ roles: ["guest"],
178
+ startPage: "/categories/category-beyblade-burst",
179
+ steps: [
180
+ "Open /categories/category-beyblade-burst in a private window at 1280 pixels.",
181
+ "Scroll to the grouped-listings carousel.",
182
+ "Check the arrows against the same points as the homepage rail.",
183
+ "Open /brands/brand-beyblade and check its carousel the same way.",
184
+ "Resize both to 390 pixels and check the arrows disappear and the rails swipe.",
185
+ ],
186
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
187
+ expectedBehaviour: "Category and brand pages use the same carousel again. These two are worth checking separately because the category and brand tab components are deliberate near-duplicates, and a duplicate is exactly where a shared component gets replaced by a local copy.",
188
+ expectedUiState: "Both pages' carousels behave identically to the homepage rail at both widths. A difference between the category page and the brand page is itself a finding, since they should be the same component scoped differently.",
189
+ endResult: "Read-only; restore the window width afterwards.",
190
+ },
191
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,158 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/dashboard-layout page.
3
+ * WHAT: 9 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 three portal shells are deliberate near-duplicates — different domain
10
+ * semantics over one structural shell — so the three collapsible cases are the
11
+ * same check run three times rather than one case with a loop. That is the point:
12
+ * a shared shell is only shared if all three actually behave alike.
13
+ *
14
+ * @tag domain:tester
15
+ * @tag layer:seed
16
+ * @tag pattern:none
17
+ * @tag access:server-only
18
+ * @tag consumers:seed-data/authored/index.ts
19
+ * @tag sideEffects:none
20
+ */
21
+ export const authored = {
22
+ "checklist-design-ux-dashboard-layout-collapsible-admin": {
23
+ roles: ["admin"],
24
+ startPage: "/admin",
25
+ steps: [
26
+ "Sign in as admin@letitrip.in / TempPass123!.",
27
+ "Open /admin and read the sidebar's group headings.",
28
+ "Collapse one expanded group and read what remains.",
29
+ "Expand a collapsed group and read its contents.",
30
+ "Navigate to another admin page using the sidebar.",
31
+ "Read whether the collapsed group is still collapsed.",
32
+ "Reload the page and read it again.",
33
+ ],
34
+ expectedBehaviour: "Groups collapse and expand, and the state survives navigation within the portal. Whether it survives a full reload is the second question — a preference held only in memory resets on refresh, which for a sidebar the user has arranged is a small but repeated annoyance.",
35
+ expectedUiState: "Collapsing hides that group's entries and leaves its heading. The state holds across sidebar navigation. Record in the comment whether it also survives the reload.",
36
+ endResult: "Re-expand anything collapsed, so later cases that count sidebar entries are not reading a collapsed sidebar.",
37
+ },
38
+ "checklist-design-ux-dashboard-layout-collapsible-store": {
39
+ roles: ["seller"],
40
+ startPage: "/store",
41
+ steps: [
42
+ "Sign in as tyson@beybladearena.in / TempPass123!.",
43
+ "Open /store and read the sidebar's group headings.",
44
+ "Collapse one expanded group and read what remains.",
45
+ "Expand a collapsed group and read its contents.",
46
+ "Navigate to another store page using the sidebar and read the state.",
47
+ "Reload the page and read it again.",
48
+ ],
49
+ expectedBehaviour: "The store sidebar behaves the same way as the admin one, because both wrap one structural shell. A difference between them means the behaviour lives in the wrapper rather than the shell.",
50
+ expectedUiState: "Collapse and expand work, and the state survives sidebar navigation — the same as /admin. Any divergence from the admin sidebar's behaviour is the finding.",
51
+ endResult: "Re-expand anything collapsed.",
52
+ },
53
+ "checklist-design-ux-dashboard-layout-collapsible-user": {
54
+ roles: ["buyer"],
55
+ startPage: "/user",
56
+ steps: [
57
+ "Sign in as rehan.sheikh@gmail.com / TempPass123!.",
58
+ "Open /user and read the sidebar's group headings.",
59
+ "Collapse one expanded group and read what remains.",
60
+ "Expand a collapsed group and read its contents.",
61
+ "Navigate to another user page using the sidebar and read the state.",
62
+ "Reload the page and read it again.",
63
+ ],
64
+ expectedBehaviour: "The user sidebar behaves like the other two. This portal's layout reads no session server-side, so its shell is prerendered and hydrated client-side — a difference in collapse behaviour here would point at that difference rather than at the shell.",
65
+ expectedUiState: "Collapse and expand work and survive sidebar navigation, matching /admin and /store. Any divergence is the finding.",
66
+ endResult: "Re-expand anything collapsed.",
67
+ },
68
+ "checklist-design-ux-dashboard-layout-mobile-table-cards": {
69
+ roles: ["admin"],
70
+ startPage: "/admin/products",
71
+ steps: [
72
+ "Sign in as admin@letitrip.in / TempPass123!.",
73
+ "Open /admin/products at a desktop width of 1280 pixels and read how rows are presented.",
74
+ "Resize the window to 390 pixels wide.",
75
+ "Read how the same rows are presented now.",
76
+ "Try to scroll the page sideways.",
77
+ "Open a row's action menu and read its entries.",
78
+ ],
79
+ inputs: { desktopWidth: 1280, mobileWidth: 390 },
80
+ expectedBehaviour: "A table becomes cards on a phone rather than a sideways-scrolling table, because columns off the right edge are columns nobody reads. Every row action stays reachable in the card form.",
81
+ expectedUiState: "At 1280 the rows are a table. At 390 they are cards, each carrying the row's key fields. The page does not scroll sideways. The row action menu opens and is fully on screen.",
82
+ endResult: "Read-only; restore the window width afterwards.",
83
+ },
84
+ "checklist-design-ux-dashboard-layout-view-mode-persist": {
85
+ roles: ["admin"],
86
+ startPage: "/admin/products",
87
+ steps: [
88
+ "Sign in as admin@letitrip.in / TempPass123!.",
89
+ "Open /admin/products and read which view mode is active.",
90
+ "Switch to the other view mode.",
91
+ "Read the URL.",
92
+ "Reload the page and read the view mode before touching anything.",
93
+ "Navigate to /admin/orders and back to /admin/products, then read the view mode.",
94
+ ],
95
+ expectedBehaviour: "View mode lives in the URL alongside the other listing state, so the server's first paint and the control agree and the choice is shareable. It is one of the few keys that does NOT reset the page number when it changes — switching how rows are drawn is not a new query.",
96
+ expectedUiState: "The URL carries the view mode. After the reload the chosen mode is active on first paint, not the default that then switches. Changing it does not send the list back to page one.",
97
+ endResult: "Read-only; nothing persists beyond the URL.",
98
+ },
99
+ "checklist-design-ux-dashboard-layout-list-view-default": {
100
+ roles: ["admin"],
101
+ startPage: "/admin/orders",
102
+ steps: [
103
+ "Sign in as admin@letitrip.in / TempPass123!.",
104
+ "Open /admin/orders with no query parameters and read which view mode is active.",
105
+ "Open /admin/products the same way and read its default.",
106
+ "Open /admin/users the same way and read its default.",
107
+ "Compare the three.",
108
+ ],
109
+ expectedBehaviour: "Listing pages open in the same default view. Three admin listings opening in three different modes means each is choosing its own default rather than taking the shared one.",
110
+ expectedUiState: "All three open in the same view mode with no parameter in the URL. A page that differs is the finding, named specifically.",
111
+ endResult: "Read-only; nothing persists.",
112
+ },
113
+ "checklist-design-ux-dashboard-layout-row-table-click-consistency": {
114
+ roles: ["admin"],
115
+ startPage: "/admin/orders",
116
+ steps: [
117
+ "Sign in as admin@letitrip.in / TempPass123!.",
118
+ "Open /admin/orders in table view and click a row anywhere except on a control.",
119
+ "Read what opens.",
120
+ "Go back, switch to card view, and click a card the same way.",
121
+ "Read what opens and compare with the table result.",
122
+ "Repeat both on /admin/products.",
123
+ ],
124
+ expectedBehaviour: "A row and its card open the same thing, because both derive their click target from the same row href. A card that only offers a menu while its table row opens a drawer means the two renderers have diverged.",
125
+ expectedUiState: "Clicking a row and clicking its card open the same record in the same way, on both listings. A card that is inert while its row is clickable is the failure.",
126
+ endResult: "Read-only; close whatever opens without saving.",
127
+ },
128
+ "checklist-design-ux-dashboard-layout-list-card-row-actions": {
129
+ roles: ["admin"],
130
+ startPage: "/admin/products",
131
+ steps: [
132
+ "Sign in as admin@letitrip.in / TempPass123!.",
133
+ "Open /admin/products in table view and open a row's action menu.",
134
+ "Write down every action it offers.",
135
+ "Switch to card view and open the same record's action menu.",
136
+ "Write down every action it offers and compare the two lists.",
137
+ "Check whether either list offers a way to VIEW the record, not only to mutate it.",
138
+ ],
139
+ expectedBehaviour: "Both renderers offer the same actions from the same preset. A menu of pure mutations is a dead end: it lets an admin act on a record they were never able to read, which is why a detail affordance has to be among them.",
140
+ expectedUiState: "The two menus offer the same actions. At least one is a view or edit action rather than all being mutations. Destructive entries are visually marked as such.",
141
+ endResult: "Read-only; close the menus without choosing anything.",
142
+ },
143
+ "checklist-design-ux-dashboard-layout-listing-toolbar-consistency": {
144
+ roles: ["admin"],
145
+ startPage: "/admin/products",
146
+ steps: [
147
+ "Sign in as admin@letitrip.in / TempPass123!.",
148
+ "Open /admin/products and write down every control in its toolbar, left to right.",
149
+ "Open /admin/orders and write down the same.",
150
+ "Open /admin/users and write down the same.",
151
+ "Compare the three orderings.",
152
+ "Look for any toolbar with an empty gap where a control would sit.",
153
+ ],
154
+ expectedBehaviour: "Every listing draws its toolbar from one shared scaffold, so search, filters, sort and view mode appear in the same order everywhere. A listing whose controls are in a different order is one that has been hand-wired.",
155
+ expectedUiState: "All three toolbars present the same controls in the same order. None shows an empty gap where a removed control used to be — a collapsed control must collapse its layout too.",
156
+ endResult: "Read-only; nothing persists.",
157
+ },
158
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;
@@ -0,0 +1,106 @@
1
+ /*
2
+ * WHY: Authored six-part procedures for the design-ux/footer-theme page.
3
+ * WHAT: 6 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
+ * 🛑 EVERY CASE HERE IS READ IN BOTH THEMES. A near-white tint is the same fill
10
+ * in every theme, so white-on-white shows up in exactly one of them — reading
11
+ * only the light theme passes the whole page while half of it is invisible.
12
+ *
13
+ * @tag domain:tester
14
+ * @tag layer:seed
15
+ * @tag pattern:none
16
+ * @tag access:server-only
17
+ * @tag consumers:seed-data/authored/index.ts
18
+ * @tag sideEffects:none
19
+ */
20
+ export const authored = {
21
+ "checklist-design-ux-footer-theme-footer-dark-mode": {
22
+ roles: ["guest"],
23
+ startPage: "/",
24
+ steps: [
25
+ "Open / in a private window and switch the site to dark mode.",
26
+ "Scroll to the footer.",
27
+ "Read every link, heading and paragraph in it.",
28
+ "Hover each link and read it while hovering.",
29
+ "Write down anything that becomes unreadable at any point.",
30
+ ],
31
+ expectedBehaviour: "Footer colours come from theme tokens that invert, so text stays readable in both themes and a hover fill stays behind its own ink. A named palette tint such as zinc-50 is the same near-white in every theme, so under inverted ink it is white-on-white on hover only.",
32
+ expectedUiState: "Every link, heading and paragraph is legible against the dark footer. Hovering any link keeps its text readable — a link that vanishes on hover is the specific failure, and it is invisible until the pointer is actually over it.",
33
+ expectedData: { unreadableElementsOnHover: 0 },
34
+ endResult: "Read-only; return the site to light mode afterwards.",
35
+ },
36
+ "checklist-design-ux-footer-theme-footer-github-icon": {
37
+ roles: ["guest"],
38
+ startPage: "/",
39
+ steps: [
40
+ "Open / in a private window and scroll to the footer.",
41
+ "Find the GitHub icon and look at its size relative to the other social icons.",
42
+ "Hover it and read any tooltip or label.",
43
+ "Click it and read where it lands.",
44
+ "Switch to dark mode and look at the icon again.",
45
+ ],
46
+ expectedBehaviour: "The icon is a real sized glyph inside its control, not a text character. A text character cannot be sized by any width or height utility — it renders at the platform font fallback, which is exactly what makes one icon in a row look wrong next to its neighbours.",
47
+ expectedUiState: "The GitHub icon is the same size as the other social icons in the row and is visible in both themes. It opens the real profile rather than a 404 or the GitHub homepage.",
48
+ endResult: "Read-only; return the site to light mode afterwards.",
49
+ },
50
+ "checklist-design-ux-footer-theme-footer-text-weight-readable": {
51
+ roles: ["guest"],
52
+ startPage: "/",
53
+ steps: [
54
+ "Open / in a private window at a desktop width and scroll to the footer.",
55
+ "Read the body text in each column at normal viewing distance.",
56
+ "Compare the link text's weight and contrast against the paragraph text around it.",
57
+ "Resize to 390 pixels wide and read the same text.",
58
+ ],
59
+ expectedBehaviour: "Footer text is legible rather than technically present. A muted token applied to text that is already small enough to be secondary compounds into text nobody reads.",
60
+ expectedUiState: "Body text in every column is readable without leaning in, at both widths. Links are distinguishable from surrounding paragraph text by more than colour alone.",
61
+ endResult: "Read-only; restore the window width afterwards.",
62
+ },
63
+ "checklist-design-ux-footer-theme-footer-column-headings-stand-out": {
64
+ roles: ["guest"],
65
+ startPage: "/",
66
+ steps: [
67
+ "Open / in a private window and scroll to the footer.",
68
+ "Read each column heading and the links beneath it.",
69
+ "Compare each heading's weight and size against its own links.",
70
+ "Switch to dark mode and compare them again.",
71
+ ],
72
+ expectedBehaviour: "A column heading is visually distinct from its links, so the footer reads as grouped columns rather than one long list. The distinction has to survive both themes, since it usually comes from a colour token.",
73
+ expectedUiState: "Every heading is clearly heavier or larger than the links under it, in both themes. A heading indistinguishable from its own links is the failure — the grouping is then invisible and the footer reads as noise.",
74
+ endResult: "Read-only; return the site to light mode afterwards.",
75
+ },
76
+ "checklist-design-ux-footer-theme-footer-weight-both-themes": {
77
+ roles: ["guest"],
78
+ startPage: "/",
79
+ steps: [
80
+ "Open / in a private window in light mode and scroll to the footer.",
81
+ "Write down how the footer reads: heading weights, link contrast, divider visibility.",
82
+ "Switch to dark mode without navigating.",
83
+ "Read the same three things again and compare.",
84
+ "Look specifically at any divider or border between columns or rows.",
85
+ ],
86
+ expectedBehaviour: "The footer's visual hierarchy is the same in both themes because every colour is a token that inverts. A divider declared once under the root and never inverted is invisible in one of the two.",
87
+ expectedUiState: "Headings, links and dividers all read equivalently in both themes. A divider visible in light and gone in dark — or the reverse — is the failure this case is looking for.",
88
+ endResult: "Read-only; return the site to light mode afterwards.",
89
+ },
90
+ "checklist-design-ux-footer-theme-footer-mobile-accordions": {
91
+ roles: ["guest"],
92
+ startPage: "/",
93
+ steps: [
94
+ "Resize the browser window to 390 pixels wide and open / in a private window.",
95
+ "Scroll to the footer.",
96
+ "Read how the columns are presented.",
97
+ "Expand one section and read its links.",
98
+ "Collapse it and expand another.",
99
+ "Try to scroll the page sideways.",
100
+ ],
101
+ inputs: { mobileWidth: 390 },
102
+ expectedBehaviour: "On a phone the columns collapse to accordions so the footer does not become a screen-and-a-half of links. Collapsing must remove the section's height rather than hide it by transform, or the page keeps the full footer's length with nothing in it.",
103
+ expectedUiState: "Sections are collapsed by default and expand on tap, showing their links. A collapsed section takes no vertical space. The page does not scroll sideways.",
104
+ endResult: "Read-only; restore the window width afterwards.",
105
+ },
106
+ };
@@ -0,0 +1,2 @@
1
+ import type { AuthoredCase } from "./_types";
2
+ export declare const authored: Record<string, AuthoredCase>;