@mohasinac/appkit 4.1.0 → 4.1.3

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 (205) hide show
  1. package/dist/_internal/client/features/maintenance/index.d.ts +2 -0
  2. package/dist/_internal/client/features/maintenance/index.js +1 -0
  3. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +9 -0
  4. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +55 -0
  5. package/dist/_internal/server/features/auctions/index.d.ts +1 -1
  6. package/dist/_internal/server/features/auctions/index.js +1 -1
  7. package/dist/_internal/server/features/auctions/service.js +2 -2
  8. package/dist/_internal/server/features/maintenance/cloud-logs-data.d.ts +50 -0
  9. package/dist/_internal/server/features/maintenance/cloud-logs-data.js +152 -0
  10. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +4 -12
  11. package/dist/_internal/server/jobs/core/onOrderCreate.js +3 -3
  12. package/dist/_internal/server/jobs/core/onProductWrite.js +14 -2
  13. package/dist/_internal/shared/features/auctions/config.d.ts +1 -1
  14. package/dist/_internal/shared/features/auctions/config.js +1 -1
  15. package/dist/_internal/shared/features/auctions/schema.js +1 -1
  16. package/dist/_internal/shared/features/cart/schema.js +2 -2
  17. package/dist/_internal/shared/features/events/schema.js +1 -1
  18. package/dist/_internal/shared/features/orders/schema.js +1 -1
  19. package/dist/_internal/shared/features/products/schema.js +3 -3
  20. package/dist/_internal/shared/features/promotions/schema.js +3 -3
  21. package/dist/_internal/shared/fees/calculator.d.ts +6 -7
  22. package/dist/client.d.ts +4 -4
  23. package/dist/client.js +4 -2
  24. package/dist/constants/api-endpoints.d.ts +9 -6
  25. package/dist/constants/api-endpoints.js +3 -2
  26. package/dist/contracts/client-payment-gateway.d.ts +1 -2
  27. package/dist/features/about/components/AboutView.d.ts +6 -16
  28. package/dist/features/about/components/AboutView.js +3 -3
  29. package/dist/features/about/index.d.ts +2 -1
  30. package/dist/features/about/schemas/firestore.d.ts +47 -0
  31. package/dist/features/about/schemas/firestore.js +6 -0
  32. package/dist/features/about/schemas/index.d.ts +210 -0
  33. package/dist/features/about/schemas/index.js +45 -0
  34. package/dist/features/account/hooks/useProfile.js +3 -0
  35. package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +6 -0
  36. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +50 -0
  37. package/dist/features/admin/components/AdminCartsView.js +16 -3
  38. package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
  39. package/dist/features/admin/components/AdminCouponsView.js +14 -4
  40. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -42
  41. package/dist/features/admin/components/AdminMediaView.js +1 -1
  42. package/dist/features/admin/components/AdminNotificationsView.js +31 -19
  43. package/dist/features/admin/components/AdminOrdersView.js +7 -0
  44. package/dist/features/admin/components/AdminPayoutsView.js +18 -3
  45. package/dist/features/admin/components/AdminProductsView.js +17 -2
  46. package/dist/features/admin/components/AdminReviewsView.js +16 -2
  47. package/dist/features/admin/components/AdminScammersView.js +7 -0
  48. package/dist/features/admin/components/AdminSectionsView.js +4 -0
  49. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  50. package/dist/features/admin/components/AdminSiteSettingsView.js +44 -2
  51. package/dist/features/admin/components/AdminStoreEditorView.d.ts +2 -1
  52. package/dist/features/admin/components/AdminStoreEditorView.js +4 -4
  53. package/dist/features/admin/components/AdminStoresView.js +1 -1
  54. package/dist/features/admin/components/AdminSupportTicketDetailView.js +23 -5
  55. package/dist/features/admin/components/AdminSupportTicketsView.js +20 -2
  56. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +4 -1
  57. package/dist/features/admin/components/AdminTesterChecklistView.js +8 -0
  58. package/dist/features/admin/components/index.d.ts +2 -0
  59. package/dist/features/admin/components/index.js +1 -0
  60. package/dist/features/admin/constants/filter-tabs.d.ts +55 -41
  61. package/dist/features/admin/constants/filter-tabs.js +55 -27
  62. package/dist/features/admin/schemas/firestore.d.ts +5 -0
  63. package/dist/features/auctions/actions/bid-actions.js +1 -1
  64. package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
  65. package/dist/features/auctions/components/AuctionsListView.js +8 -1
  66. package/dist/features/auth/components/LoginForm.js +2 -2
  67. package/dist/features/auth/components/RegisterForm.js +2 -2
  68. package/dist/features/auth/permissions/constants.d.ts +16 -0
  69. package/dist/features/auth/permissions/constants.js +53 -0
  70. package/dist/features/auth/schemas/firestore.js +1 -0
  71. package/dist/features/blog/components/BlogFilters.js +1 -1
  72. package/dist/features/cart/schemas/firestore.d.ts +1 -1
  73. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  74. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  75. package/dist/features/events/components/EventFilters.js +2 -0
  76. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  77. package/dist/features/layout/TitleBarLayout.d.ts +2 -2
  78. package/dist/features/layout/TitleBarLayout.js +4 -4
  79. package/dist/features/media/AvatarUpload.js +7 -3
  80. package/dist/features/media/MediaVideo.js +1 -1
  81. package/dist/features/media/finalize.d.ts +9 -13
  82. package/dist/features/media/finalize.js +23 -74
  83. package/dist/features/media/server.d.ts +1 -1
  84. package/dist/features/media/server.js +1 -1
  85. package/dist/features/orders/hooks/useOrders.js +16 -4
  86. package/dist/features/orders/schemas/firestore.d.ts +5 -5
  87. package/dist/features/payments/schemas/firestore.d.ts +2 -2
  88. package/dist/features/pre-orders/components/PreOrdersListView.js +7 -0
  89. package/dist/features/products/components/ArtStickersListView.js +5 -0
  90. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -1
  91. package/dist/features/products/components/ProductForm.js +14 -1
  92. package/dist/features/products/components/ProductsIndexPageView.js +7 -0
  93. package/dist/features/products/constants/action-defs.d.ts +1 -0
  94. package/dist/features/products/constants/action-defs.js +1 -0
  95. package/dist/features/products/schemas/firestore.d.ts +1 -1
  96. package/dist/features/products/schemas/product-templates.d.ts +1 -1
  97. package/dist/features/products/types/index.d.ts +4 -0
  98. package/dist/features/scams/schemas/index.js +2 -2
  99. package/dist/features/search/components/Search.js +3 -3
  100. package/dist/features/seller/components/SellerAuctionsView.js +27 -2
  101. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  102. package/dist/features/seller/components/SellerPayoutsView.js +24 -10
  103. package/dist/features/seller/components/SellerPreOrdersView.js +12 -4
  104. package/dist/features/seller/components/SellerPrizeDrawsView.js +23 -5
  105. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  106. package/dist/features/seller/components/SellerProductShell.js +1 -1
  107. package/dist/features/seller/components/SellerProductsView.js +8 -6
  108. package/dist/features/seller/components/SellerReviewsView.js +27 -6
  109. package/dist/features/seller/components/index.d.ts +0 -2
  110. package/dist/features/seller/components/index.js +0 -1
  111. package/dist/features/stores/components/StoreListingsGuideView.js +2 -1
  112. package/dist/features/stores/components/StoreProductsView.js +1 -1
  113. package/dist/features/stores/schemas/firestore.d.ts +11 -0
  114. package/dist/features/stores/schemas/firestore.js +5 -0
  115. package/dist/features/stores/schemas/index.d.ts +2 -2
  116. package/dist/features/tester/actions/checklist-item-actions.d.ts +6 -0
  117. package/dist/features/tester/actions/checklist-item-actions.js +2 -0
  118. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +13 -2
  119. package/dist/features/tester/components/AdminTesterFeedbackListView.js +2 -1
  120. package/dist/features/tester/components/AdminTesterFeedbackReportView.js +9 -5
  121. package/dist/features/tester/components/TesterHubView.js +34 -21
  122. package/dist/features/tester/repository/tester-checklist-item.repository.js +1 -0
  123. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +18 -4
  124. package/dist/features/tester/repository/tester-checklist-response.repository.js +43 -8
  125. package/dist/features/tester/schemas/firestore.d.ts +8 -3
  126. package/dist/features/tester/schemas/firestore.js +6 -0
  127. package/dist/features/tester/seed-data/bids-tester-seed-data.d.ts +2 -0
  128. package/dist/features/tester/seed-data/bids-tester-seed-data.js +37 -0
  129. package/dist/features/tester/seed-data/coupons-tester-seed-data.d.ts +2 -0
  130. package/dist/features/tester/seed-data/coupons-tester-seed-data.js +76 -0
  131. package/dist/features/tester/seed-data/events-tester-seed-data.js +50 -2
  132. package/dist/features/tester/seed-data/index.d.ts +3 -0
  133. package/dist/features/tester/seed-data/index.js +3 -0
  134. package/dist/features/tester/seed-data/orders-tester-seed-data.d.ts +2 -0
  135. package/dist/features/tester/seed-data/orders-tester-seed-data.js +265 -0
  136. package/dist/features/tester/seed-data/products-tester-seed-data.js +213 -8
  137. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +294 -12
  138. package/dist/features/tester/utils/phases.d.ts +31 -0
  139. package/dist/features/tester/utils/phases.js +46 -0
  140. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
  141. package/dist/features/whatsapp-bot/types/index.d.ts +1 -1
  142. package/dist/features/wishlist/types/index.d.ts +3 -0
  143. package/dist/index.d.ts +11 -4
  144. package/dist/index.js +15 -7
  145. package/dist/next/api/routeHandler.js +6 -10
  146. package/dist/next/components/NotFoundView.js +2 -1
  147. package/dist/next/routing/route-map.d.ts +4 -12
  148. package/dist/next/routing/route-map.js +2 -4
  149. package/dist/providers/db-firebase/admin.d.ts +1 -0
  150. package/dist/providers/db-firebase/admin.js +1 -1
  151. package/dist/schemas/registry.d.ts +2 -2
  152. package/dist/seed/addresses-seed-data.js +18 -18
  153. package/dist/seed/bids-seed-data.js +4 -4
  154. package/dist/seed/blog-posts-seed-data.js +82 -82
  155. package/dist/seed/carousel-slides-seed-data.js +14 -10
  156. package/dist/seed/carousels-seed-data.js +3 -3
  157. package/dist/seed/cart-seed-data.js +92 -92
  158. package/dist/seed/claimed-coupons-seed-data.js +10 -10
  159. package/dist/seed/conversations-seed-data.js +75 -75
  160. package/dist/seed/coupon-usage-seed-data.js +12 -12
  161. package/dist/seed/coupons-seed-data.js +41 -41
  162. package/dist/seed/events-seed-data.js +105 -105
  163. package/dist/seed/grouped-listings-seed-data.d.ts +2 -137
  164. package/dist/seed/grouped-listings-seed-data.js +79 -143
  165. package/dist/seed/history-seed-data.js +38 -38
  166. package/dist/seed/homepage-sections-seed-data.js +9 -9
  167. package/dist/seed/index.d.ts +1 -1
  168. package/dist/seed/index.js +1 -1
  169. package/dist/seed/manifest.js +4 -4
  170. package/dist/seed/notifications-seed-data.js +56 -56
  171. package/dist/seed/offers-seed-data.js +91 -91
  172. package/dist/seed/orders-seed-data.js +125 -106
  173. package/dist/seed/payouts-seed-data.js +42 -42
  174. package/dist/seed/products-auctions-seed-data.js +10 -2
  175. package/dist/seed/products-classifieds-seed-data.js +48 -5
  176. package/dist/seed/products-digital-codes-seed-data.js +48 -5
  177. package/dist/seed/products-live-items-seed-data.js +6 -1
  178. package/dist/seed/products-prize-draws-seed-data.js +58 -5
  179. package/dist/seed/products-standard-seed-data.js +40 -8
  180. package/dist/seed/reviews-seed-data.js +42 -23
  181. package/dist/seed/scammers-seed-data.js +22 -22
  182. package/dist/seed/sessions-seed-data.js +7 -7
  183. package/dist/seed/shipments-seed-data.js +10 -10
  184. package/dist/seed/site-settings-seed-data.js +82 -0
  185. package/dist/seed/store-addresses-seed-data.js +2 -2
  186. package/dist/seed/store-extensions-seed-data.js +93 -93
  187. package/dist/seed/stores-seed-data.js +2 -0
  188. package/dist/seed/support-tickets-seed-data.js +47 -47
  189. package/dist/seed/users-seed-data.js +55 -89
  190. package/dist/seed/wishlists-seed-data.js +22 -22
  191. package/dist/server.d.ts +2 -1
  192. package/dist/server.js +5 -5
  193. package/dist/styles.css +1 -1
  194. package/dist/tailwind-utilities.css +1 -1
  195. package/dist/ui/components/PageLoader.js +8 -3
  196. package/dist/ui/components/Select.d.ts +8 -1
  197. package/dist/ui/components/Select.js +2 -2
  198. package/dist/ui/components/SiteMark.d.ts +23 -0
  199. package/dist/ui/components/SiteMark.js +76 -0
  200. package/dist/ui/index.d.ts +2 -0
  201. package/dist/ui/index.js +1 -0
  202. package/dist/validation/schemas.d.ts +0 -2
  203. package/dist/validation/schemas.js +0 -2
  204. package/package.json +1 -1
  205. package/scripts/seed-cli.mjs +27 -19
@@ -1,9 +1,11 @@
1
1
  /*
2
2
  * WHY: Seeds the initial tester QA checklist catalog — DB-backed, admin-manageable (mirrors faq-seed-data.ts).
3
- * WHAT: ~65 default test cases across 6 groups (Account & Auth, Buying, Selling, Content & Discovery,
4
- * Community & Support, Design & UX). Admins add/edit further cases via /admin/tester-checklist —
5
- * this array is a starting point, not the source of truth. Every case is searchable by title or
6
- * route in the Tester Hub (/user/tester), which any isTester account OR admin can open.
3
+ * WHAT: Default test cases across 8 groups (Account & Auth, Buying, Selling, Content & Discovery,
4
+ * Community & Support, Design & UX, Public & Marketing Pages, Admin (Testing)). Admins add/edit
5
+ * further cases via /admin/tester-checklist — this array is a starting point, not the source of
6
+ * truth. Every case is searchable by title or route in the Tester Hub (/user/tester), which any
7
+ * isTester account OR admin can open. Items in the "admin" group carry adminOnly:true — only
8
+ * visible to a tester with canTestAdmin (or a real admin); see `group()`'s `opts.adminOnly`.
7
9
  *
8
10
  * EXPORTS:
9
11
  * testerChecklistSeedData — Array of Partial<TesterChecklistItemDocument> for seed runner
@@ -15,6 +17,7 @@
15
17
  * @tag consumers:seed/index.ts,seed/runner.ts
16
18
  * @tag sideEffects:none
17
19
  */
20
+ import { assignDefaultPhases } from "../utils/phases";
18
21
  function group(groupKey, groupLabel, pages, opts) {
19
22
  const items = [];
20
23
  pages.forEach((page, pageIdx) => {
@@ -36,17 +39,23 @@ function group(groupKey, groupLabel, pages, opts) {
36
39
  });
37
40
  return items;
38
41
  }
39
- export const testerChecklistSeedData = [
42
+ /**
43
+ * Array order below IS the intended catalog order (groups concatenated via
44
+ * spread, in authoring order) — `assignDefaultPhases` walks it directly
45
+ * rather than sorting by `order`, since `order` restarts at 0 within each
46
+ * group and is not globally unique across groups.
47
+ */
48
+ const rawTesterChecklistItems = [
40
49
  ...group("account-auth", "Account & Auth", [
41
50
  {
42
51
  pageKey: "signup-login",
43
52
  pageLabel: "Signup & Login",
44
53
  cases: [
45
- { key: "email-signup", label: "Sign up with email works", href: "/register" },
46
- { key: "google-oauth", label: "Sign up / log in with Google works", href: "/login" },
54
+ { key: "email-signup", label: "Sign up with email works", href: "/auth/register" },
55
+ { key: "google-oauth", label: "Sign up / log in with Google works", href: "/auth/login" },
47
56
  { key: "google-link-existing", label: "Linking Google sign-in to an existing email/password account works" },
48
57
  { key: "google-popup-blocked-fallback", label: "If the Google sign-in popup is blocked, the fallback (RTDB signal + postMessage) still completes sign-in" },
49
- { key: "login", label: "Log in with email + password works", href: "/login" },
58
+ { key: "login", label: "Log in with email + password works", href: "/auth/login" },
50
59
  { key: "logout", label: "Log out works and clears the session" },
51
60
  { key: "email-verify", label: "Email verification link works" },
52
61
  { key: "password-reset", label: "Forgot-password / reset-password flow works" },
@@ -106,14 +115,29 @@ export const testerChecklistSeedData = [
106
115
  pageLabel: "Buying & Checkout",
107
116
  cases: [
108
117
  { key: "add-to-cart", label: "Add to cart works from the product page" },
109
- { key: "checkout-flow", label: "Checkout flow completes without errors", href: "/cart" },
118
+ { key: "add-to-cart-out-of-stock", label: "Add to cart is disabled/blocked once a listing's stock reaches zero" },
119
+ { key: "add-to-cart-max-quantity", label: "Increasing quantity in the cart is capped at the listing's available stock, with a clear message" },
120
+ { key: "checkout-flow", label: "Checkout flow completes without errors", href: "/checkout" },
121
+ { key: "checkout-order-review", label: "The order-review step before payment shows correct items, quantities, addresses, and totals" },
122
+ { key: "checkout-multi-seller-split", label: "A cart with items from multiple sellers correctly splits into separate orders at checkout" },
110
123
  { key: "shipping-address", label: "Selecting/adding a shipping address works" },
124
+ { key: "shipping-address-inline-add", label: "Adding a new address inline during checkout (without leaving the flow) works and the new address is selectable immediately" },
125
+ { key: "shipping-address-edit", label: "Editing an existing shipping address from checkout works" },
126
+ { key: "shipping-method-selection", label: "Selecting a shipping method/provider at checkout recalculates the shipping fee correctly" },
127
+ { key: "gst-breakdown-display", label: "When GST is enabled in Site Settings, checkout shows the correct CGST/SGST or IGST breakdown based on buyer vs seller state" },
111
128
  { key: "checkout-otp-highvalue", label: "Carts ≥ the OTP threshold prompt for email verification before placing the order (except COD)" },
129
+ { key: "payment-method-selection", label: "Choosing between COD, UPI/manual, and Razorpay (when enabled) at checkout works" },
112
130
  { key: "payment-window-countdown", label: "Manual-payment orders show a 15-minute countdown timer on the payment page" },
113
131
  { key: "payment-proof-upload", label: "Uploading manual payment proof (screenshot, UTR, mark-as-paid + agreement checkboxes) works" },
132
+ { key: "payment-proof-reupload", label: "Requesting a proof re-upload extends the buyer's payment window and the buyer can successfully re-submit" },
114
133
  { key: "payment-window-expiry", label: "An order whose 15-minute payment window expires with no proof auto-cancels and the item returns to stock" },
134
+ { key: "emi-checkout-flow", label: "Choosing EMI at checkout (when enabled) shows the correct tenure options, token amount, and surcharge, and creates the installment schedule" },
135
+ { key: "out-of-stock-policy-cancel", label: "With the \"cancel whole order\" out-of-stock policy, checkout correctly rejects the entire batch if any item goes out of stock mid-checkout" },
136
+ { key: "out-of-stock-policy-skip", label: "With the \"skip unavailable items\" policy, checkout proceeds with only the still-available items" },
115
137
  { key: "order-confirmation", label: "Order confirmation page/email shows correct order details" },
116
138
  { key: "payment-auto-approve-dispute", label: "An auto-approved order (2h, no admin review) shows the badge, and \"Raise a dispute\" submits successfully" },
139
+ { key: "checkout-mobile-responsive", label: "The full checkout flow (cart → address → payment → confirmation) is usable and correctly laid out on a mobile viewport" },
140
+ { key: "checkout-back-navigation", label: "Using the browser back button mid-checkout does not lose cart state or double-submit the order" },
117
141
  ],
118
142
  },
119
143
  {
@@ -130,9 +154,21 @@ export const testerChecklistSeedData = [
130
154
  pageKey: "wishlist-history",
131
155
  pageLabel: "Wishlist & History",
132
156
  cases: [
133
- { key: "add-wishlist", label: "Adding a product to the wishlist works", href: "/user/wishlist" },
157
+ { key: "add-wishlist-pdp", label: "Adding a product to the wishlist from the product detail page works", href: "/wishlist" },
158
+ { key: "add-wishlist-card", label: "Adding a product to the wishlist from a listing card (checkbox/long-press) works on both listing and search pages" },
134
159
  { key: "remove-wishlist", label: "Removing a product from the wishlist works" },
135
- { key: "view-history", label: "Recently viewed history shows accurate items", href: "/user/history" },
160
+ { key: "wishlist-persists-guest-to-login", label: "Wishlist items added as a guest are preserved after logging in" },
161
+ { key: "wishlist-idempotent-readd", label: "Re-adding a product already on the wishlist is a no-op and doesn't create a duplicate entry" },
162
+ { key: "wishlist-cap-enforced", label: "Adding a 21st item to the wishlist is blocked with a clear \"wishlist full\" message (20-item cap)" },
163
+ { key: "wishlist-across-listing-types", label: "Auctions and pre-orders (not just standard products) can be added to and viewed correctly in the wishlist" },
164
+ { key: "wishlist-price-drop-accuracy", label: "A wishlist item's displayed price matches the product's current price, not a stale snapshot" },
165
+ { key: "wishlist-sold-out-item", label: "A wishlist item whose product later sells out or is removed still displays gracefully (no crash) with an appropriate indicator" },
166
+ { key: "wishlist-empty-state", label: "The empty-wishlist state renders correctly with no items", href: "/wishlist" },
167
+ { key: "wishlist-add-to-cart-from-list", label: "Adding a wishlist item directly to the cart from the wishlist page works" },
168
+ { key: "view-history", label: "Recently viewed history shows accurate items in most-recent-first order", href: "/user/history" },
169
+ { key: "history-revisit-reorders", label: "Re-visiting a product already in history removes the old entry and moves it to the front, rather than duplicating it" },
170
+ { key: "history-fifo-cap", label: "History silently evicts the oldest entry once more than 50 items have been viewed (no error shown to the user)" },
171
+ { key: "history-guest-merge-on-login", label: "Guest browsing history (localStorage) merges correctly with the account's history after login, deduplicated by product" },
136
172
  ],
137
173
  },
138
174
  {
@@ -141,7 +177,12 @@ export const testerChecklistSeedData = [
141
177
  cases: [
142
178
  { key: "update-qty", label: "Updating item quantity in cart recalculates the total" },
143
179
  { key: "apply-coupon", label: "Applying a coupon code at checkout works" },
180
+ { key: "remove-coupon", label: "Removing an already-applied coupon from the cart recalculates the total back down" },
144
181
  { key: "remove-item", label: "Removing an item from the cart works" },
182
+ { key: "cart-empty-state", label: "The empty-cart state renders correctly with a clear call to action" },
183
+ { key: "cart-persists-across-session", label: "Cart contents persist across a page reload and across login/logout for the same account" },
184
+ { key: "cart-guest-to-login-merge", label: "A guest cart's items merge correctly into the account's cart after logging in" },
185
+ { key: "cart-price-revalidated", label: "If a product's price changes after it was added to the cart, checkout uses the current price and shows the buyer the updated total" },
145
186
  ],
146
187
  },
147
188
  {
@@ -177,6 +218,20 @@ export const testerChecklistSeedData = [
177
218
  { key: "my-reviews", label: "\"My Reviews\" shows reviews the user has left", href: "/user/reviews" },
178
219
  ],
179
220
  },
221
+ {
222
+ pageKey: "user-dashboard-navigation",
223
+ pageLabel: "User Dashboard Navigation",
224
+ cases: [
225
+ { key: "sidebar-all-links-work", label: "Every item in the user dashboard sidebar navigates to its page without a 404 or broken layout", href: "/user" },
226
+ { key: "sidebar-active-highlight", label: "The sidebar correctly highlights the currently active section as you navigate between pages" },
227
+ { key: "sidebar-mobile-collapse", label: "The user dashboard sidebar collapses into a mobile-friendly menu/bottom bar on small screens" },
228
+ { key: "deep-link-direct-load", label: "Directly loading a deep user dashboard URL (e.g. /user/orders/view/[id]) works without first visiting the dashboard home" },
229
+ { key: "become-seller-crossnav", label: "\"Become a Seller\" (buyer) vs \"Go to my Store\" (seller) shows the correct one based on account state and navigates correctly" },
230
+ { key: "browser-back-forward", label: "Browser back/forward buttons move correctly between dashboard sub-pages without breaking the layout" },
231
+ { key: "logged-out-redirect", label: "Opening a user dashboard URL while logged out redirects to login, then returns to the originally requested page after signing in" },
232
+ { key: "breadcrumbs-accurate", label: "Breadcrumbs (where present) on nested user dashboard pages accurately reflect the current location" },
233
+ ],
234
+ },
180
235
  ]),
181
236
  ...group("selling", "Selling", [
182
237
  {
@@ -263,7 +318,7 @@ export const testerChecklistSeedData = [
263
318
  { key: "seller-messages", label: "Seller messages list and thread view both work", href: "/store/messages" },
264
319
  { key: "seller-fulfillment-queue", label: "Seller fulfillment queue shows accurate pending items", href: "/store/fulfillment" },
265
320
  { key: "seller-print-center", label: "Seller print-center generates labels/invoices correctly", href: "/store/print-center" },
266
- { key: "seller-inventory-print", label: "Seller inventory print view works", href: "/store/inventory/print" },
321
+ { key: "seller-inventory-print", label: "Seller inventory print view works", href: "/store/print-center" },
267
322
  ],
268
323
  },
269
324
  {
@@ -284,6 +339,20 @@ export const testerChecklistSeedData = [
284
339
  { key: "seller-guide-pages", label: "The 5 seller guide pages (overview, capabilities, finance, listings, orders, settings) all load correctly", href: "/store/guide" },
285
340
  ],
286
341
  },
342
+ {
343
+ pageKey: "store-dashboard-navigation",
344
+ pageLabel: "Store Dashboard Navigation",
345
+ cases: [
346
+ { key: "store-sidebar-all-links-work", label: "Every item in the store/seller dashboard sidebar navigates to its page without a 404 or broken layout", href: "/store" },
347
+ { key: "store-sidebar-active-highlight", label: "The store sidebar correctly highlights the currently active section as you navigate between pages" },
348
+ { key: "store-sidebar-mobile-collapse", label: "The store dashboard sidebar collapses into a mobile-friendly menu/bottom bar on small screens" },
349
+ { key: "store-deep-link-direct-load", label: "Directly loading a deep store dashboard URL (e.g. /store/products/[id]/edit) works without first visiting the dashboard home" },
350
+ { key: "store-user-crossnav", label: "The store dashboard's cross-nav link back to the buyer dashboard works and lands on the correct page" },
351
+ { key: "store-browser-back-forward", label: "Browser back/forward buttons move correctly between store dashboard sub-pages without breaking the layout" },
352
+ { key: "store-logged-out-redirect", label: "Opening a store dashboard URL while logged out (or as a non-seller) redirects appropriately instead of erroring" },
353
+ { key: "store-nav-listing-type-groups", label: "The seller nav correctly groups/labels each listing-type management area (standard, auctions, pre-orders, prize draws, bundles, classifieds, digital codes, live, art, stickers)" },
354
+ ],
355
+ },
287
356
  ]),
288
357
  ...group("content-discovery", "Content & Discovery", [
289
358
  {
@@ -405,4 +474,217 @@ export const testerChecklistSeedData = [
405
474
  ],
406
475
  },
407
476
  ]),
477
+ ...group("public-pages", "Public & Marketing Pages", [
478
+ {
479
+ pageKey: "core-listing-pages",
480
+ pageLabel: "Homepage & Core Listing Pages",
481
+ cases: [
482
+ { key: "homepage-loads", label: "The homepage loads without errors on both desktop and mobile", href: "/" },
483
+ { key: "products-listing-page", label: "The products listing page loads and paginates correctly", href: "/products" },
484
+ { key: "auctions-listing-page", label: "The auctions listing page loads correctly", href: "/auctions" },
485
+ { key: "preorders-listing-page", label: "The pre-orders listing page loads correctly", href: "/pre-orders" },
486
+ { key: "bundles-listing-page", label: "The bundles listing page loads correctly", href: "/bundles" },
487
+ { key: "categories-index", label: "The categories index page loads correctly", href: "/categories" },
488
+ { key: "brands-index-detail", label: "The brands index and an individual brand detail page load correctly" },
489
+ ],
490
+ },
491
+ {
492
+ pageKey: "stores-sellers-directories",
493
+ pageLabel: "Store & Seller Directories",
494
+ cases: [
495
+ { key: "store-directory", label: "The store directory page loads correctly", href: "/stores" },
496
+ { key: "store-detail-tabs", label: "A store detail page's auctions/bundles/coupons/pre-orders/prize-draws/reviews tabs all load correctly" },
497
+ { key: "sellers-directory", label: "The sellers directory page loads correctly", href: "/sellers" },
498
+ { key: "seller-detail-page", label: "An individual seller's public detail page loads correctly" },
499
+ { key: "scams-registry", label: "The scams registry page and an individual scam detail page load correctly", href: "/scams" },
500
+ ],
501
+ },
502
+ {
503
+ pageKey: "help-how-it-works",
504
+ pageLabel: "Help & How-It-Works Pages",
505
+ cases: [
506
+ { key: "contact-page", label: "The contact page loads and the form submits correctly", href: "/contact" },
507
+ { key: "help-page", label: "The help page loads correctly", href: "/help" },
508
+ { key: "how-it-works-pages", label: "All 7 how-it-works pages (auctions, checkout, offers, orders, payouts, pre-orders, reviews) load correctly" },
509
+ { key: "fees-page", label: "The fees page loads correctly", href: "/fees" },
510
+ ],
511
+ },
512
+ {
513
+ pageKey: "legal-policy-pages",
514
+ pageLabel: "Legal & Policy Pages",
515
+ cases: [
516
+ { key: "shipping-refund-policy", label: "Shipping-policy and refund-policy pages load correctly" },
517
+ { key: "privacy-cookies-security", label: "Privacy, cookies, and security pages load correctly" },
518
+ ],
519
+ },
520
+ {
521
+ pageKey: "auth-error-pages",
522
+ pageLabel: "Remaining Auth & Error Pages",
523
+ cases: [
524
+ { key: "register-page", label: "The register page loads and account creation works", href: "/auth/register" },
525
+ { key: "forgot-reset-password-pages", label: "Forgot-password and reset-password pages both work" },
526
+ { key: "verify-email-page", label: "The verify-email page correctly confirms a pending verification" },
527
+ { key: "oauth-loading-redirect", label: "The OAuth-loading redirect page transitions correctly after a Google sign-in" },
528
+ { key: "checkout-success-page", label: "The checkout-success page shows correct order details after payment", href: "/checkout/success" },
529
+ { key: "unauthorized-404-pages", label: "Unauthorized and 404 error pages render correctly instead of crashing" },
530
+ ],
531
+ },
532
+ ]),
533
+ ...group("admin", "Admin (Testing)", [
534
+ {
535
+ pageKey: "catalog-listings",
536
+ pageLabel: "Catalog & Listings",
537
+ cases: [
538
+ { key: "brands-crud", label: "Admin can create, edit, and list brands", href: "/admin/brands" },
539
+ { key: "categories-crud", label: "Admin can create, edit, and list categories", href: "/admin/categories" },
540
+ { key: "products-crud", label: "Admin can create, edit, and list products", href: "/admin/products" },
541
+ { key: "sublisting-categories-crud", label: "Admin can create, edit, and list sublisting categories", href: "/admin/sublisting-categories" },
542
+ { key: "carousel-crud", label: "Admin can create, edit, and reorder carousel slides", href: "/admin/carousel" },
543
+ { key: "sections-crud", label: "Admin can create, edit, and reorder homepage sections", href: "/admin/sections" },
544
+ { key: "art-stickers-crud", label: "Admin can create, edit, and list art and sticker listings" },
545
+ { key: "deals-featured-crud", label: "Admin can create, edit, and list deals and featured listings" },
546
+ ],
547
+ },
548
+ {
549
+ pageKey: "coupons",
550
+ pageLabel: "Coupons",
551
+ cases: [
552
+ { key: "coupon-create-percentage", label: "Admin can create a percentage-type coupon", href: "/admin/coupons/new" },
553
+ { key: "coupon-create-fixed-freeship-bxgy", label: "Admin can create fixed, free_shipping, and buy_x_get_y coupon types" },
554
+ { key: "coupon-per-user-limit-enforced", label: "A coupon's perUserLimit is correctly enforced at checkout after being set by admin" },
555
+ { key: "coupon-min-max-discount", label: "Admin-set minPurchase and maxDiscount are correctly enforced at checkout" },
556
+ { key: "coupon-scope-admin-vs-seller", label: "Admin-scope and seller-scope coupons both apply correctly, respecting scope rules" },
557
+ { key: "coupon-expire-reject", label: "Expiring a coupon from the admin editor causes checkout to reject it immediately" },
558
+ ],
559
+ },
560
+ {
561
+ pageKey: "events-raffles-spin",
562
+ pageLabel: "Events, Raffles & Spin Wheel",
563
+ cases: [
564
+ { key: "raffle-create-open", label: "Admin can create an open_raffle event", href: "/admin/events/new" },
565
+ { key: "raffle-create-top-n-scorers", label: "Admin can create a top_n_scorers raffle event" },
566
+ { key: "raffle-create-top-n-participants", label: "Admin can create a top_n_participants raffle event" },
567
+ { key: "raffle-draw-winner", label: "Drawing a raffle winner correctly populates raffleWinnerUserId and raffleTriggeredAt" },
568
+ { key: "spin-wheel-create", label: "Admin can create a spin_wheel event with weighted prizes" },
569
+ { key: "spin-wheel-limits-enforced", label: "spinMaxPerUser and spinWindowStart/End are correctly enforced once configured by admin" },
570
+ { key: "event-entries-admin-view", label: "Admin event-entries list shows accurate entries", href: "/admin/event-entries" },
571
+ ],
572
+ },
573
+ {
574
+ pageKey: "prize-draws-lotteries",
575
+ pageLabel: "Prize Draws / Lotteries",
576
+ cases: [
577
+ { key: "prizedraw-create", label: "Admin can create a prize-draw listing", href: "/admin/prize-draws" },
578
+ { key: "prizedraw-reveal-winner", label: "Admin can reveal a prize-draw winner via the crypto.randomInt reveal flow" },
579
+ { key: "prizedraw-auto-refund", label: "Non-winning entries are auto-refunded correctly after a reveal" },
580
+ { key: "prizedraw-lock-on-reveal", label: "Lock-on-reveal correctly blocks further entries after the draw" },
581
+ { key: "prizedraw-entries-view", label: "Admin can view prize-draw / lottery entries", href: "/admin/lotteries" },
582
+ ],
583
+ },
584
+ {
585
+ pageKey: "bundles",
586
+ pageLabel: "Bundles / Grouped Listings",
587
+ cases: [
588
+ { key: "bundle-create", label: "Admin can create a bundle from existing products", href: "/admin/bundles" },
589
+ { key: "bundle-stock-sync", label: "Bundle stock correctly syncs when a component product's stock changes" },
590
+ { key: "bundle-edit-delete", label: "Admin can edit and delete a bundle" },
591
+ ],
592
+ },
593
+ {
594
+ pageKey: "classifieds-digitalcodes-live",
595
+ pageLabel: "Classifieds, Digital Codes & Live Listings",
596
+ cases: [
597
+ { key: "classified-create-moderate", label: "Admin can create and moderate classified listings", href: "/admin/classified" },
598
+ { key: "digitalcode-create-moderate", label: "Admin can create and moderate digital-code listings", href: "/admin/digital-codes" },
599
+ { key: "live-create-moderate", label: "Admin can create and moderate live-item listings", href: "/admin/live" },
600
+ ],
601
+ },
602
+ {
603
+ pageKey: "blog-faqs",
604
+ pageLabel: "Blog & FAQs",
605
+ cases: [
606
+ { key: "blog-create-edit-publish", label: "Admin can create, edit, and publish a blog post", href: "/admin/blog" },
607
+ { key: "faq-create-edit-category", label: "Admin can create and edit an FAQ, including category assignment", href: "/admin/faqs" },
608
+ ],
609
+ },
610
+ {
611
+ pageKey: "orders-fulfillment",
612
+ pageLabel: "Orders & Fulfillment",
613
+ cases: [
614
+ { key: "orders-status-change", label: "Admin orders list shows accurate orders and status changes save correctly", href: "/admin/orders" },
615
+ { key: "bids-admin-view", label: "Admin bids view shows accurate bid data", href: "/admin/bids" },
616
+ { key: "return-requests-triage", label: "Admin can triage return requests", href: "/admin/return-requests" },
617
+ { key: "fulfillment-queue-admin", label: "Admin fulfillment queue shows accurate pending items", href: "/admin/fulfillment" },
618
+ { key: "shipments-crud", label: "Admin can create/edit shipments, including lots/items and projections", href: "/admin/shipments" },
619
+ { key: "print-center-admin", label: "Admin print-center generates labels/invoices correctly", href: "/admin/print-center" },
620
+ { key: "payouts-export-admin", label: "Admin can export payouts", href: "/admin/payouts" },
621
+ { key: "bulk-action-realtime-progress", label: "A bulk admin action (e.g. bulk order status update) shows live progress via the bulk_events realtime channel and resolves without polling" },
622
+ ],
623
+ },
624
+ {
625
+ pageKey: "users-trust",
626
+ pageLabel: "Users & Trust",
627
+ cases: [
628
+ { key: "users-role-change", label: "Admin can change a user's role and toggle isTester/canTestAdmin", href: "/admin/users" },
629
+ { key: "roles-crud", label: "Admin can create and edit custom roles", href: "/admin/roles" },
630
+ { key: "sessions-revoke", label: "Admin can revoke a user's active sessions", href: "/admin/sessions" },
631
+ { key: "scammers-registry-admin", label: "Admin can manage the scammer registry", href: "/admin/scammers" },
632
+ { key: "banned-addresses-admin", label: "Admin can manage banned addresses", href: "/admin/banned-addresses" },
633
+ { key: "address-clusters-admin", label: "Admin can view address clusters", href: "/admin/address-clusters" },
634
+ { key: "moderation-queue-admin", label: "Admin moderation queue works correctly", href: "/admin/moderation" },
635
+ { key: "support-tickets-triage-admin", label: "Admin can triage support tickets", href: "/admin/support-tickets" },
636
+ { key: "item-requests-admin", label: "Admin can manage item requests", href: "/admin/item-requests" },
637
+ { key: "reports-admin", label: "Admin reports queue works correctly", href: "/admin/reports" },
638
+ { key: "payment-methods-clusters-admin", label: "Admin can manage payment methods and payment-method clusters", href: "/admin/payment-methods" },
639
+ { key: "catalogue-approvals-admin", label: "Admin can approve/reject personal catalogue submissions", href: "/admin/catalogue-approvals" },
640
+ ],
641
+ },
642
+ {
643
+ pageKey: "content-marketing",
644
+ pageLabel: "Content & Marketing",
645
+ cases: [
646
+ { key: "ads-crud-preview", label: "Admin can create, edit, and preview ads", href: "/admin/ads" },
647
+ { key: "newsletter-export-admin", label: "Admin can export the newsletter subscriber list", href: "/admin/newsletter" },
648
+ { key: "contact-submissions-admin", label: "Admin can view contact form submissions", href: "/admin/contact" },
649
+ { key: "media-library-admin", label: "Admin media library works correctly", href: "/admin/media" },
650
+ { key: "navigation-editor-admin", label: "Admin can edit site navigation", href: "/admin/navigation" },
651
+ { key: "settings-navigation-actions", label: "Admin settings/navigation and settings/actions pages save correctly" },
652
+ { key: "features-feature-flags-admin", label: "Admin can manage product features and feature flags" },
653
+ ],
654
+ },
655
+ {
656
+ pageKey: "site-system",
657
+ pageLabel: "Site & System",
658
+ cases: [
659
+ { key: "site-settings-admin", label: "Admin site settings page saves correctly", href: "/admin/site" },
660
+ { key: "admin-dashboard-widgets", label: "Admin dashboard widgets show accurate data", href: "/admin/dashboard" },
661
+ { key: "analytics-admin", label: "Admin analytics dashboard shows accurate data", href: "/admin/analytics" },
662
+ { key: "maintenance-pages-admin", label: "The maintenance pages (analysis, client-errors, cloud-logs, function-errors, payment-rollbacks, server-errors + detail) all load correctly", href: "/admin/maintenance" },
663
+ { key: "copilot-admin", label: "Admin copilot page works correctly", href: "/admin/copilot" },
664
+ { key: "team-admin", label: "Admin team page works correctly", href: "/admin/team" },
665
+ { key: "guide-pages-admin", label: "The 8 admin guide pages all load correctly", href: "/admin/guide" },
666
+ { key: "tester-checklist-crud-admin", label: "Admin can create, edit, and toggle adminOnly on tester checklist items", href: "/admin/tester-checklist" },
667
+ { key: "tester-feedback-report-export", label: "Admin tester-feedback report shows Yes/No analytics grouped correctly and the Download Report export works", href: "/admin/tester-feedback" },
668
+ ],
669
+ },
670
+ {
671
+ pageKey: "buyer-data-admin",
672
+ pageLabel: "Buyer-Data Admin Views",
673
+ cases: [
674
+ { key: "carts-admin-view", label: "Admin carts view shows accurate data", href: "/admin/carts" },
675
+ { key: "wishlists-admin-view", label: "Admin wishlists view shows accurate data", href: "/admin/wishlists" },
676
+ { key: "history-admin-view", label: "Admin history view shows accurate data", href: "/admin/history" },
677
+ { key: "notifications-admin-view", label: "Admin notifications and admin-notifications views show accurate data" },
678
+ { key: "reviews-admin-view", label: "Admin reviews view shows accurate data", href: "/admin/reviews" },
679
+ { key: "store-addresses-admin", label: "Admin store-addresses view shows accurate data", href: "/admin/store-addresses" },
680
+ { key: "addresses-crud-admin", label: "Admin can create and edit addresses", href: "/admin/addresses" },
681
+ { key: "stores-admin-view", label: "Admin stores view shows accurate data", href: "/admin/stores" },
682
+ ],
683
+ },
684
+ ], { adminOnly: true }),
408
685
  ];
686
+ const defaultPhases = assignDefaultPhases(rawTesterChecklistItems);
687
+ export const testerChecklistSeedData = rawTesterChecklistItems.map((item, index) => ({
688
+ ...item,
689
+ phase: defaultPhases[index],
690
+ }));
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Computes default `phase` numbers for the tester checklist catalog.
3
+ *
4
+ * `phase` is a real, stored, admin-editable field on `TesterChecklistItemDocument`
5
+ * (see schemas/firestore.ts) — not something recomputed on every read. This
6
+ * module only supplies the INITIAL assignment: given the catalog in its
7
+ * existing groupKey/pageKey/order sequence, bucket whole pages together into
8
+ * phases of roughly `targetPhaseSize` items each (never splitting a single
9
+ * page's items across two phases), so a tester works through ~10-50 cases
10
+ * per session instead of the full catalog at once.
11
+ *
12
+ * Used once at seed-authoring time (tester-checklist-seed-data.ts) and by
13
+ * the one-off Firestore backfill for already-seeded items that predate the
14
+ * `phase` field. After that, every read path (TesterHubView, admin results
15
+ * views, the markdown report) just groups by the stored `item.phase` value —
16
+ * no chunking logic at read time.
17
+ */
18
+ export interface TesterPhaseAssignable {
19
+ groupKey: string;
20
+ pageKey: string;
21
+ }
22
+ /** Target item count per phase — real phase sizes vary a little around this
23
+ * since a page's items are never split across two phases. */
24
+ export declare const DEFAULT_TESTER_PHASE_SIZE = 25;
25
+ /**
26
+ * Returns a same-length array of 1-based phase numbers, one per input item,
27
+ * computed by greedily packing whole pages (consecutive runs of the same
28
+ * groupKey+pageKey) into phases of ~`targetPhaseSize` items. `items` MUST
29
+ * already be in catalog order (e.g. sorted by the `order` field).
30
+ */
31
+ export declare function assignDefaultPhases<T extends TesterPhaseAssignable>(itemsInCatalogOrder: T[], targetPhaseSize?: number): number[];
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Computes default `phase` numbers for the tester checklist catalog.
3
+ *
4
+ * `phase` is a real, stored, admin-editable field on `TesterChecklistItemDocument`
5
+ * (see schemas/firestore.ts) — not something recomputed on every read. This
6
+ * module only supplies the INITIAL assignment: given the catalog in its
7
+ * existing groupKey/pageKey/order sequence, bucket whole pages together into
8
+ * phases of roughly `targetPhaseSize` items each (never splitting a single
9
+ * page's items across two phases), so a tester works through ~10-50 cases
10
+ * per session instead of the full catalog at once.
11
+ *
12
+ * Used once at seed-authoring time (tester-checklist-seed-data.ts) and by
13
+ * the one-off Firestore backfill for already-seeded items that predate the
14
+ * `phase` field. After that, every read path (TesterHubView, admin results
15
+ * views, the markdown report) just groups by the stored `item.phase` value —
16
+ * no chunking logic at read time.
17
+ */
18
+ /** Target item count per phase — real phase sizes vary a little around this
19
+ * since a page's items are never split across two phases. */
20
+ export const DEFAULT_TESTER_PHASE_SIZE = 25;
21
+ /**
22
+ * Returns a same-length array of 1-based phase numbers, one per input item,
23
+ * computed by greedily packing whole pages (consecutive runs of the same
24
+ * groupKey+pageKey) into phases of ~`targetPhaseSize` items. `items` MUST
25
+ * already be in catalog order (e.g. sorted by the `order` field).
26
+ */
27
+ export function assignDefaultPhases(itemsInCatalogOrder, targetPhaseSize = DEFAULT_TESTER_PHASE_SIZE) {
28
+ const phaseNumbers = new Array(itemsInCatalogOrder.length);
29
+ let currentPhase = 1;
30
+ let currentPhaseCount = 0;
31
+ let lastPageKey = null;
32
+ for (let i = 0; i < itemsInCatalogOrder.length; i++) {
33
+ const item = itemsInCatalogOrder[i];
34
+ const pageId = `${item.groupKey}␟${item.pageKey}`;
35
+ const isNewPage = pageId !== lastPageKey;
36
+ // Only allow a phase boundary between pages, never mid-page.
37
+ if (isNewPage && currentPhaseCount >= targetPhaseSize) {
38
+ currentPhase += 1;
39
+ currentPhaseCount = 0;
40
+ }
41
+ phaseNumbers[i] = currentPhase;
42
+ currentPhaseCount += 1;
43
+ lastPageKey = pageId;
44
+ }
45
+ return phaseNumbers;
46
+ }
@@ -166,7 +166,7 @@ export function SellerWhatsAppSettingsView({ hasCapability }) {
166
166
  buyerName: "Ravi K.",
167
167
  firstItemName: "Charizard PSA 9",
168
168
  additionalItemCount: 2,
169
- totalAmount: 450000,
169
+ totalAmount: 4500,
170
170
  orderId: "order-3-20260510-a1b2c3",
171
171
  }) })] }), _jsxs(Section, { className: CLS_SECTION_CARD, children: [_jsx(Heading, { level: 2, className: "mb-2", color: "primary", size: "sm", weight: "semibold", children: "Catalog Preview" }), _jsx(Text, { className: "mb-4", color: "muted", size: "xs", children: "This is how your products appear in the WhatsApp Catalog when a buyer taps \"View Catalog\" in the chat. Only published standard products are included." }), _jsxs(Div, { className: `${__O.hidden} bg-[var(--appkit-color-whatsapp-bg)] bg-[var(--appkit-color-surface-elevated)] ${__P.p3}`, rounded: "xl", border: "default", children: [_jsxs(Row, { gap: "sm", align: "center", className: "mb-3", children: [_jsx(Row, { className: "w-8 h-8 bg-[var(--appkit-color-whatsapp)]", align: "center", justify: "center", rounded: "full", children: _jsx(Text, { color: "inverse", size: "xs", weight: "bold", children: "W" }) }), _jsxs(Div, { children: [_jsx(Text, { size: "xs", weight: "semibold", color: "primary", children: cfg?.connected ? "Your Store" : "Store Name" }), _jsx(Text, { className: "text-[10px]", color: "muted", children: "WhatsApp Business" })] })] }), _jsx(Div, { layout: "grid", gap: "2", className: "grid-cols-2", children: SAMPLE_CATALOG_ITEMS.map((item) => (_jsxs(Div, { surface: "card", className: `${__O.hidden}`, children: [_jsx(Row, { className: "aspect-square", surface: "subtle", align: "center", justify: "center", children: _jsx(Text, { size: "2xl", children: item.emoji }) }), _jsxs(Div, { padding: "xs", children: [_jsx(Text, { className: "line-clamp-2 leading-tight", color: "primary", size: "xs", weight: "medium", children: item.name }), _jsx(Text, { className: "text-[var(--appkit-color-whatsapp)] mt-0.5", size: "xs", weight: "semibold", children: item.price })] })] }, item.id))) }), _jsx(Div, { className: "mt-3 text-center", children: _jsx(Text, { className: "text-[10px]", color: "muted", children: cfg?.lastSyncCount
172
172
  ? `${cfg.lastSyncCount} products synced to catalog`
@@ -85,7 +85,7 @@ export interface PurchaseAnnouncementInput {
85
85
  firstItemName: string;
86
86
  /** 0 if only one item in the order */
87
87
  additionalItemCount: number;
88
- /** Total order amount in paise */
88
+ /** Total order amount in decimal rupees */
89
89
  totalAmount: number;
90
90
  orderId: string;
91
91
  }
@@ -26,6 +26,9 @@ export interface WishlistProductData {
26
26
  isFeatured?: boolean;
27
27
  /** Canonical listing-kind discriminator (SB1-G Phase 4). */
28
28
  listingType?: ListingType;
29
+ /** Already present on the wire — GET /api/user/wishlist spreads the full
30
+ * ProductDocument into `product`, this was just untyped. */
31
+ isSold?: boolean;
29
32
  }
30
33
  /** WishlistItem enriched with inline product details returned by the wishlist GET endpoint. */
31
34
  export interface EnrichedWishlistItem extends WishlistItem {
package/dist/index.d.ts CHANGED
@@ -913,6 +913,8 @@ export type { AboutHowItem } from "./features/about/index";
913
913
  export type { AboutMilestone } from "./features/about/index";
914
914
  export type { AboutValueItem } from "./features/about/index";
915
915
  export type { AboutViewProps } from "./features/about/index";
916
+ export type { AboutTeamMember } from "./features/about/index";
917
+ export type { AboutContentDocument } from "./features/about/index";
916
918
  export type { FAQPageViewProps } from "./features/about/index";
917
919
  export type { FeesViewProps } from "./features/about/index";
918
920
  export type { HelpPageViewProps } from "./features/about/index";
@@ -1149,6 +1151,10 @@ export { AdminNotificationsView } from "./features/admin/index";
1149
1151
  export { AdminCartsView } from "./features/admin/index";
1150
1152
  export { AdminWishlistsView } from "./features/admin/index";
1151
1153
  export { AdminHistoryView } from "./features/admin/index";
1154
+ export { AdminGroupedListingsView } from "./features/admin/index";
1155
+ export type { AdminGroupedListingsViewProps } from "./features/admin/index";
1156
+ export { AdminCarouselGroupEditorView } from "./features/admin/index";
1157
+ export type { AdminCarouselGroupEditorViewProps } from "./features/admin/index";
1152
1158
  export { AdminContactEditorView } from "./features/admin/index";
1153
1159
  export type { AdminContactEditorViewProps } from "./features/admin/index";
1154
1160
  export { AdminReturnRequestsView } from "./features/admin/index";
@@ -1180,6 +1186,10 @@ export { DEFAULT_TRUST_BAR_ITEMS } from "./features/admin/index";
1180
1186
  export { DashboardStatsGrid } from "./features/admin/index";
1181
1187
  export { AdminTeamView } from "./features/admin/index";
1182
1188
  export { AdminEmployeeEditorView } from "./features/admin/index";
1189
+ export { PERMISSION_GROUPS } from "./features/auth/permissions/constants";
1190
+ export { PERMISSION_DOMAINS } from "./features/auth/permissions/constants";
1191
+ export { getPermissionsForDomain } from "./features/auth/permissions/constants";
1192
+ export { formatPermLabel } from "./features/auth/permissions/constants";
1183
1193
  export { AdminSupportTicketsView } from "./features/admin/index";
1184
1194
  export { AdminSupportTicketDetailView } from "./features/admin/index";
1185
1195
  export { DrawerFormFooter } from "./features/admin/index";
@@ -2206,7 +2216,6 @@ export type { MediaUploadResult } from "./features/media/index";
2206
2216
  export type { MediaVideoProps } from "./features/media/index";
2207
2217
  export type { VideoThumbnailSelectorProps } from "./features/media/index";
2208
2218
  export type { VideoTrimModalProps } from "./features/media/index";
2209
- export { extractStoragePathFromUrl } from "./features/media/server";
2210
2219
  export { finalizeStagedMediaArray } from "./features/media/server";
2211
2220
  export { finalizeStagedMediaField } from "./features/media/server";
2212
2221
  export { finalizeStagedMediaObject } from "./features/media/server";
@@ -3088,7 +3097,7 @@ export { SUCCESS_MESSAGES } from "./values/index";
3088
3097
  export { splitCartIntoOrderGroups } from "./features/orders/index";
3089
3098
  export { groupOrderItemsByBundle, type BundleOrderGroup, type OrderItemForBundleGrouping, } from "./features/orders/index";
3090
3099
  export { buildSieveFilters } from "./utils/filter.helper";
3091
- export { formatFileSize } from "./utils/number.formatter";
3100
+ export { formatCurrency, formatFileSize } from "./utils/number.formatter";
3092
3101
  export { formatMonthYear } from "./utils/date.formatter";
3093
3102
  export { generateMediaFilename } from "./utils/id-generators";
3094
3103
  export { deriveContextTypeFromFilename } from "./utils/id-generators";
@@ -3217,8 +3226,6 @@ export { MarketplaceBundleCard } from "./features/products/index";
3217
3226
  export type { MarketplaceBundleCardProps, MarketplaceBundleCardData, MarketplaceBundleCardLabels, } from "./features/products/index";
3218
3227
  export { SellerStoreCategoriesView } from "./features/seller/components/SellerStoreCategoriesView";
3219
3228
  export type { SellerStoreCategoriesViewProps } from "./features/seller/components/SellerStoreCategoriesView";
3220
- export { SellerTemplatesView } from "./features/seller/components/SellerTemplatesView";
3221
- export type { SellerTemplatesViewProps } from "./features/seller/components/SellerTemplatesView";
3222
3229
  export { SellerPayoutMethodsView } from "./features/seller/components/SellerPayoutMethodsView";
3223
3230
  export type { SellerPayoutMethodsViewProps } from "./features/seller/components/SellerPayoutMethodsView";
3224
3231
  export { SellerShippingConfigsView } from "./features/seller/components/SellerShippingConfigsView";