@mohasinac/appkit 4.59.0 → 4.60.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
  3. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
  4. package/dist/_internal/server/features/brands/actions.js +78 -4
  5. package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
  6. package/dist/_internal/server/features/checkout/actions.js +668 -183
  7. package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
  8. package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
  9. package/dist/_internal/server/features/gateway-events/index.js +10 -0
  10. package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
  11. package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
  12. package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
  13. package/dist/_internal/server/features/gateway-events/redact.js +151 -0
  14. package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
  15. package/dist/_internal/server/features/grievance/actions.js +173 -0
  16. package/dist/_internal/server/features/grievance/index.d.ts +8 -0
  17. package/dist/_internal/server/features/grievance/index.js +8 -0
  18. package/dist/_internal/server/features/grouped/data.js +28 -3
  19. package/dist/_internal/server/features/lottery/actions.js +99 -4
  20. package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
  21. package/dist/_internal/server/features/order-completion/actions.js +336 -0
  22. package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
  23. package/dist/_internal/server/features/order-completion/index.js +7 -0
  24. package/dist/_internal/server/features/orders/actions.d.ts +13 -0
  25. package/dist/_internal/server/features/orders/actions.js +56 -2
  26. package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
  27. package/dist/_internal/server/features/orders/adapters.js +44 -0
  28. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
  29. package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
  30. package/dist/_internal/server/features/orders/index.d.ts +2 -1
  31. package/dist/_internal/server/features/orders/index.js +1 -1
  32. package/dist/_internal/server/features/orders/service.d.ts +60 -0
  33. package/dist/_internal/server/features/orders/service.js +74 -0
  34. package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
  35. package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
  36. package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
  37. package/dist/_internal/server/features/payment-cases/index.js +9 -0
  38. package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
  39. package/dist/_internal/server/features/payouts/actions.js +84 -10
  40. package/dist/_internal/server/features/points/adjust.d.ts +61 -0
  41. package/dist/_internal/server/features/points/adjust.js +121 -0
  42. package/dist/_internal/server/features/points/award.d.ts +65 -0
  43. package/dist/_internal/server/features/points/award.js +145 -0
  44. package/dist/_internal/server/features/price-index/market.d.ts +33 -0
  45. package/dist/_internal/server/features/price-index/market.js +54 -1
  46. package/dist/_internal/server/features/products/data.js +40 -22
  47. package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
  48. package/dist/_internal/server/features/protection-claims/actions.js +228 -0
  49. package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
  50. package/dist/_internal/server/features/protection-claims/index.js +8 -0
  51. package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
  52. package/dist/_internal/server/features/refunds/actions.js +259 -17
  53. package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
  54. package/dist/_internal/server/features/refunds/capacity.js +37 -0
  55. package/dist/_internal/server/features/reviews/actions.js +3 -2
  56. package/dist/_internal/server/features/search/index-build/sources.js +20 -1
  57. package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
  58. package/dist/_internal/server/features/shipping/reconcile.js +34 -3
  59. package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
  60. package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
  61. package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
  62. package/dist/_internal/server/features/stores/tabs.js +24 -4
  63. package/dist/_internal/server/functions/https.d.ts +31 -1
  64. package/dist/_internal/server/functions/https.js +52 -1
  65. package/dist/_internal/server/functions/scheduled.d.ts +72 -1
  66. package/dist/_internal/server/functions/scheduled.js +124 -1
  67. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
  68. package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
  69. package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
  70. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
  71. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
  72. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
  73. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  74. package/dist/_internal/server/jobs/core/index.js +2 -0
  75. package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
  76. package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
  77. package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
  78. package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
  79. package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
  80. package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
  81. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
  83. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
  84. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
  85. package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
  86. package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
  87. package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
  88. package/dist/_internal/server/jobs/handlers/index.js +5 -0
  89. package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
  90. package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
  91. package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
  92. package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
  93. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
  94. package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
  95. package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
  96. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  97. package/dist/_internal/shared/actions/action-registry.js +71 -0
  98. package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
  99. package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
  100. package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
  101. package/dist/_internal/shared/checkout/lanes.js +46 -0
  102. package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
  103. package/dist/_internal/shared/checkout/order-math.js +251 -3
  104. package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
  105. package/dist/_internal/shared/checkout/refundable-base.js +122 -0
  106. package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
  107. package/dist/_internal/shared/features/auctions/config.js +30 -1
  108. package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
  109. package/dist/_internal/shared/features/brands/schema.js +18 -0
  110. package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
  111. package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
  112. package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
  113. package/dist/_internal/shared/features/print/label-profiles.js +350 -0
  114. package/dist/_internal/shared/features/products/to-product-item.js +33 -5
  115. package/dist/_internal/shared/fees/calculator.d.ts +31 -2
  116. package/dist/_internal/shared/fees/calculator.js +103 -5
  117. package/dist/_internal/shared/fees/india-states.d.ts +195 -0
  118. package/dist/_internal/shared/fees/india-states.js +190 -0
  119. package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
  120. package/dist/_internal/shared/fees/payout-hold.js +74 -0
  121. package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
  122. package/dist/_internal/shared/obligations/deadlines.js +155 -0
  123. package/dist/_internal/shared/shipping/quote.d.ts +96 -0
  124. package/dist/_internal/shared/shipping/quote.js +67 -0
  125. package/dist/_internal/shared/time/business-days.d.ts +91 -0
  126. package/dist/_internal/shared/time/business-days.js +185 -0
  127. package/dist/cli/index.js +0 -2
  128. package/dist/client.d.ts +10 -4
  129. package/dist/client.js +29 -3
  130. package/dist/configs/tailwind.d.ts +0 -12
  131. package/dist/configs/tailwind.js +28 -15
  132. package/dist/constants/api-endpoints.d.ts +51 -9
  133. package/dist/constants/api-endpoints.js +23 -7
  134. package/dist/constants/index.d.ts +1 -1
  135. package/dist/constants/index.js +1 -1
  136. package/dist/contracts/index.d.ts +1 -1
  137. package/dist/contracts/payment.d.ts +131 -0
  138. package/dist/features/about/components/AboutView.js +1 -1
  139. package/dist/features/about/components/DeveloperView.js +5 -2
  140. package/dist/features/about/components/FAQPageView.js +2 -1
  141. package/dist/features/about/components/FeesView.js +2 -1
  142. package/dist/features/about/components/HelpPageView.js +2 -1
  143. package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
  144. package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
  145. package/dist/features/about/components/HowEmiWorksView.js +2 -1
  146. package/dist/features/about/components/HowOffersWorkView.js +2 -1
  147. package/dist/features/about/components/HowOrdersWorkView.js +2 -1
  148. package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
  149. package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
  150. package/dist/features/about/components/HowReviewsWorkView.js +2 -1
  151. package/dist/features/about/components/PolicyPageView.js +2 -1
  152. package/dist/features/about/components/ProseHero.d.ts +73 -0
  153. package/dist/features/about/components/ProseHero.js +18 -0
  154. package/dist/features/about/components/SecurityPrivacyView.js +2 -1
  155. package/dist/features/about/components/ShippingPolicyView.js +2 -1
  156. package/dist/features/about/components/TrackOrderView.js +2 -1
  157. package/dist/features/about/components/UnauthorizedView.js +1 -1
  158. package/dist/features/about/index.d.ts +2 -0
  159. package/dist/features/about/index.js +5 -0
  160. package/dist/features/account/actions/address-actions.d.ts +26 -2
  161. package/dist/features/account/actions/address-actions.js +25 -1
  162. package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
  163. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  164. package/dist/features/account/components/UserOrdersView.js +17 -0
  165. package/dist/features/account/components/UserSidebar.js +1 -1
  166. package/dist/features/account/hooks/useNotifications.js +29 -0
  167. package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
  168. package/dist/features/admin/components/AdminBeysView.js +2 -2
  169. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  170. package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
  171. package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
  172. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
  173. package/dist/features/admin/components/AdminCategoriesView.js +1 -1
  174. package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
  175. package/dist/features/admin/components/AdminContactEditorView.js +1 -1
  176. package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
  177. package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
  178. package/dist/features/admin/components/AdminFaqsView.js +2 -2
  179. package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
  180. package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
  181. package/dist/features/admin/components/AdminGuideHubView.js +1 -1
  182. package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
  183. package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
  184. package/dist/features/admin/components/AdminPartsView.js +2 -2
  185. package/dist/features/admin/components/AdminProductsView.js +75 -4
  186. package/dist/features/admin/components/AdminSidebar.js +2 -2
  187. package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
  188. package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
  189. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  190. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  191. package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
  192. package/dist/features/admin/components/AdminUsersView.js +72 -1
  193. package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
  194. package/dist/features/admin/components/AdminViewCards.js +4 -4
  195. package/dist/features/admin/components/DataListingView.d.ts +28 -0
  196. package/dist/features/admin/components/DataListingView.js +175 -14
  197. package/dist/features/admin/components/DataTable.d.ts +12 -1
  198. package/dist/features/admin/components/DataTable.js +3 -3
  199. package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
  200. package/dist/features/admin/components/OwnerQuickActions.js +60 -2
  201. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
  202. package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
  203. package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
  204. package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
  205. package/dist/features/admin/components/index.d.ts +4 -0
  206. package/dist/features/admin/components/index.js +6 -0
  207. package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
  208. package/dist/features/admin/constants/filter-tabs.js +106 -0
  209. package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
  210. package/dist/features/admin/repository/site-settings.repository.js +82 -1
  211. package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
  212. package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
  213. package/dist/features/admin/schemas/firestore.js +5 -1
  214. package/dist/features/admin/schemas/site-settings-form.js +30 -1
  215. package/dist/features/auctions/actions/bid-actions.js +13 -1
  216. package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
  217. package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
  218. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
  219. package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
  220. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
  221. package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
  222. package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
  223. package/dist/features/audit-log/schemas/firestore.js +14 -0
  224. package/dist/features/auth/permissions/constants.d.ts +17 -1
  225. package/dist/features/auth/permissions/constants.js +18 -0
  226. package/dist/features/blog/components/BlogPostView.js +1 -1
  227. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
  228. package/dist/features/categories/api/[id]/description-template/route.js +107 -1
  229. package/dist/features/categories/components/BrandDetailPageView.js +2 -2
  230. package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
  231. package/dist/features/categories/components/BundleDetailView.js +1 -1
  232. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  233. package/dist/features/categories/components/CategoryForm.js +12 -1
  234. package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
  235. package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
  236. package/dist/features/categories/repository/market-price-index.repository.js +105 -0
  237. package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
  238. package/dist/features/categories/repository/price-observation.repository.js +132 -0
  239. package/dist/features/events/components/EventSaleBanner.js +1 -1
  240. package/dist/features/events/components/EventStatusBadge.js +1 -1
  241. package/dist/features/faq/components/FAQAccordion.js +2 -1
  242. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  243. package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
  244. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  245. package/dist/features/filters/FilterFacetSection.js +1 -1
  246. package/dist/features/filters/SwitchFilter.js +1 -1
  247. package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
  248. package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
  249. package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
  250. package/dist/features/gateway-events/schemas/firestore.js +125 -0
  251. package/dist/features/gateway-events/schemas/index.d.ts +81 -0
  252. package/dist/features/gateway-events/schemas/index.js +79 -0
  253. package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
  254. package/dist/features/homepage/components/AnnouncementBar.js +37 -1
  255. package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
  256. package/dist/features/homepage/components/BrandsSection.js +1 -1
  257. package/dist/features/homepage/components/CTABannerSection.js +1 -1
  258. package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
  259. package/dist/features/homepage/components/HeroCarousel.js +2 -2
  260. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  261. package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
  262. package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
  263. package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
  264. package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
  265. package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
  266. package/dist/features/inventory/components/ReceiveStationView.js +413 -0
  267. package/dist/features/inventory/components/operator-message.d.ts +29 -0
  268. package/dist/features/inventory/components/operator-message.js +41 -0
  269. package/dist/features/inventory/index.d.ts +13 -0
  270. package/dist/features/inventory/index.js +28 -0
  271. package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
  272. package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
  273. package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
  274. package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
  275. package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
  276. package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
  277. package/dist/features/inventory/schemas/firestore.d.ts +197 -0
  278. package/dist/features/inventory/schemas/firestore.js +159 -0
  279. package/dist/features/layout/AppLayoutShell.d.ts +12 -1
  280. package/dist/features/layout/AppLayoutShell.js +25 -12
  281. package/dist/features/layout/AutoBreadcrumbs.js +162 -3
  282. package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
  283. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  284. package/dist/features/layout/BottomNavbar.js +2 -2
  285. package/dist/features/media/MediaAvatar.js +1 -1
  286. package/dist/features/media/MediaImage.d.ts +24 -4
  287. package/dist/features/media/MediaImage.js +44 -4
  288. package/dist/features/media/MediaLightbox.js +1 -1
  289. package/dist/features/media/modals/ImageCropModal.js +1 -1
  290. package/dist/features/media/modals/ImageEditor.js +1 -1
  291. package/dist/features/media/upload/MediaUploadField.js +91 -3
  292. package/dist/features/obligations/constants/policies.d.ts +92 -0
  293. package/dist/features/obligations/constants/policies.js +378 -0
  294. package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
  295. package/dist/features/obligations/repository/obligations.repository.js +158 -0
  296. package/dist/features/obligations/schemas/firestore.d.ts +160 -0
  297. package/dist/features/obligations/schemas/firestore.js +87 -0
  298. package/dist/features/orders/actions/order-actions.d.ts +43 -4
  299. package/dist/features/orders/actions/order-actions.js +60 -3
  300. package/dist/features/orders/actions/refund-actions.js +70 -10
  301. package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
  302. package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
  303. package/dist/features/orders/components/OrdersList.js +2 -2
  304. package/dist/features/orders/components/RefundHistoryTable.js +3 -1
  305. package/dist/features/orders/components/index.d.ts +2 -0
  306. package/dist/features/orders/components/index.js +6 -0
  307. package/dist/features/orders/constants/transitions.d.ts +59 -0
  308. package/dist/features/orders/constants/transitions.js +104 -0
  309. package/dist/features/orders/repository/orders.repository.d.ts +109 -6
  310. package/dist/features/orders/repository/orders.repository.js +464 -21
  311. package/dist/features/orders/schemas/firestore.d.ts +270 -0
  312. package/dist/features/orders/schemas/firestore.js +24 -0
  313. package/dist/features/orders/schemas/index.d.ts +61 -0
  314. package/dist/features/orders/schemas/index.js +22 -0
  315. package/dist/features/orders/types/index.d.ts +79 -0
  316. package/dist/features/parts/components/PartsIndexPageView.js +8 -1
  317. package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
  318. package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
  319. package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
  320. package/dist/features/payment-cases/schemas/firestore.js +105 -0
  321. package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
  322. package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
  323. package/dist/features/payments/repository/payout.repository.d.ts +0 -1
  324. package/dist/features/payments/repository/payout.repository.js +0 -1
  325. package/dist/features/points/repository/points.repository.d.ts +122 -0
  326. package/dist/features/points/repository/points.repository.js +304 -1
  327. package/dist/features/points/schemas/adjust-form.d.ts +58 -0
  328. package/dist/features/points/schemas/adjust-form.js +63 -0
  329. package/dist/features/points/schemas/firestore.d.ts +108 -1
  330. package/dist/features/points/schemas/firestore.js +84 -0
  331. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
  332. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  333. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
  334. package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
  335. package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
  336. package/dist/features/price-index/market-stats.d.ts +82 -0
  337. package/dist/features/price-index/market-stats.js +230 -0
  338. package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
  339. package/dist/features/print/components/BoxLabelPrintView.js +66 -0
  340. package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
  341. package/dist/features/print/components/LabelProfilePicker.js +38 -0
  342. package/dist/features/print/components/labels.d.ts +117 -0
  343. package/dist/features/print/components/labels.js +258 -0
  344. package/dist/features/print/components/labels.style.css +46 -0
  345. package/dist/features/print/index.d.ts +6 -0
  346. package/dist/features/print/index.js +16 -0
  347. package/dist/features/products/columns/productTableColumns.js +5 -4
  348. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  349. package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
  350. package/dist/features/products/components/PrizeDrawCollage.js +1 -1
  351. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  352. package/dist/features/products/components/PrizeRevealModal.js +2 -2
  353. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  354. package/dist/features/products/components/ProductForm.js +34 -23
  355. package/dist/features/products/components/ProductGrid.js +86 -62
  356. package/dist/features/products/constants/card-badges.d.ts +97 -0
  357. package/dist/features/products/constants/card-badges.js +100 -0
  358. package/dist/features/products/repository/products.repository.js +34 -1
  359. package/dist/features/products/schemas/firestore.d.ts +46 -3
  360. package/dist/features/products/schemas/firestore.js +21 -0
  361. package/dist/features/promotions/components/PromotionsView.js +1 -1
  362. package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
  363. package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
  364. package/dist/features/promotions/schemas/firestore.js +30 -3
  365. package/dist/features/promotions/schemas/index.d.ts +6 -6
  366. package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
  367. package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
  368. package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
  369. package/dist/features/protection-claims/schemas/firestore.js +130 -0
  370. package/dist/features/reviews/actions/review-actions.js +3 -2
  371. package/dist/features/reviews/components/ReviewModal.js +1 -1
  372. package/dist/features/reviews/components/ReviewsList.js +1 -1
  373. package/dist/features/reviews/schemas/firestore.d.ts +20 -1
  374. package/dist/features/scams/constants/scam-types.d.ts +2 -0
  375. package/dist/features/scams/constants/scam-types.js +18 -0
  376. package/dist/features/scams/schemas/report-form.d.ts +3 -3
  377. package/dist/features/scams/schemas/report-form.js +26 -1
  378. package/dist/features/search/components/Search.js +9 -9
  379. package/dist/features/search/components/SearchResultsClient.js +18 -3
  380. package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
  381. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  382. package/dist/features/seller/actions/offer-actions.js +16 -1
  383. package/dist/features/seller/actions/seller-actions.js +14 -3
  384. package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
  385. package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
  386. package/dist/features/seller/components/PrintCenterView.js +41 -30
  387. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  388. package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
  389. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  390. package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
  391. package/dist/features/seller/components/SellerProductShell.js +123 -13
  392. package/dist/features/seller/components/SellerReviewsView.js +4 -2
  393. package/dist/features/seller/components/SellerSidebar.js +1 -1
  394. package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
  395. package/dist/features/seller/schemas/coupon-form.js +27 -0
  396. package/dist/features/seller/schemas/product-form.d.ts +3 -0
  397. package/dist/features/seller/schemas/product-form.js +5 -0
  398. package/dist/features/shell/FormShell.js +2 -2
  399. package/dist/features/shell/QuickFormDrawer.js +14 -0
  400. package/dist/features/shell/SectionForm.d.ts +19 -0
  401. package/dist/features/shell/SectionForm.js +133 -9
  402. package/dist/features/shell/SectionForm.style.css +54 -0
  403. package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
  404. package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
  405. package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
  406. package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
  407. package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
  408. package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
  409. package/dist/features/stores/components/StoreGuideHubView.js +1 -1
  410. package/dist/features/stores/components/StoreHeader.js +1 -1
  411. package/dist/features/support/schemas/firestore.d.ts +73 -2
  412. package/dist/features/support/schemas/firestore.js +59 -0
  413. package/dist/index.d.ts +16 -24
  414. package/dist/index.js +38 -47
  415. package/dist/next/ErrorBoundary.js +1 -1
  416. package/dist/next/routing/route-map.d.ts +24 -0
  417. package/dist/next/routing/route-map.js +40 -0
  418. package/dist/providers/payment-manual/index.d.ts +15 -1
  419. package/dist/providers/payment-manual/index.js +37 -0
  420. package/dist/providers/payment-phonepe/index.d.ts +14 -1
  421. package/dist/providers/payment-phonepe/index.js +36 -0
  422. package/dist/providers/payment-razorpay/index.d.ts +44 -1
  423. package/dist/providers/payment-razorpay/index.js +99 -0
  424. package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
  425. package/dist/providers/shipping-shiprocket/index.js +18 -0
  426. package/dist/schemas/registry.d.ts +44 -11
  427. package/dist/server-entry.d.ts +2 -0
  428. package/dist/server-entry.js +27 -0
  429. package/dist/server.d.ts +43 -0
  430. package/dist/server.js +98 -0
  431. package/dist/styles.css +418 -149
  432. package/dist/tailwind-utilities.css +1 -1
  433. package/dist/tokens/themes/default-dark.js +15 -12
  434. package/dist/tokens/themes/default-light.js +14 -11
  435. package/dist/tokens/tokens.css +106 -23
  436. package/dist/ui/DataTable.style.css +4 -4
  437. package/dist/ui/columns/cell-renderers.d.ts +20 -0
  438. package/dist/ui/columns/cell-renderers.js +26 -1
  439. package/dist/ui/columns/index.d.ts +1 -1
  440. package/dist/ui/columns/index.js +4 -1
  441. package/dist/ui/components/Badge.style.css +1 -1
  442. package/dist/ui/components/Breadcrumb.js +19 -1
  443. package/dist/ui/components/BulkActionBar.style.css +4 -4
  444. package/dist/ui/components/Button.style.css +1 -1
  445. package/dist/ui/components/Checkbox.style.css +1 -1
  446. package/dist/ui/components/FallbackShell.js +1 -1
  447. package/dist/ui/components/Form.d.ts +14 -1
  448. package/dist/ui/components/Form.js +2 -2
  449. package/dist/ui/components/FormField.js +18 -4
  450. package/dist/ui/components/FormField.style.css +43 -3
  451. package/dist/ui/components/GatedPrice.style.css +1 -1
  452. package/dist/ui/components/IconButton.style.css +1 -1
  453. package/dist/ui/components/Input.js +22 -1
  454. package/dist/ui/components/Input.style.css +38 -22
  455. package/dist/ui/components/ListingFilterDrawer.js +1 -1
  456. package/dist/ui/components/ListingToolbar.js +1 -1
  457. package/dist/ui/components/PaginatedSelect.js +0 -0
  458. package/dist/ui/components/Radio.style.css +1 -1
  459. package/dist/ui/components/Repeater.d.ts +53 -0
  460. package/dist/ui/components/Repeater.js +7 -0
  461. package/dist/ui/components/RichTextEditor.d.ts +20 -1
  462. package/dist/ui/components/RichTextEditor.js +23 -2
  463. package/dist/ui/components/Select.style.css +7 -21
  464. package/dist/ui/components/Semantic.js +27 -3
  465. package/dist/ui/components/TagInput.style.css +4 -9
  466. package/dist/ui/components/Textarea.style.css +4 -18
  467. package/dist/ui/components/Toggle.style.css +1 -1
  468. package/dist/ui/components/Typography.d.ts +3 -3
  469. package/dist/ui/components/Typography.js +15 -15
  470. package/dist/ui/components/ViewToggle.style.css +4 -4
  471. package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
  472. package/dist/ui/forms/AddAnotherToggle.js +56 -0
  473. package/dist/ui/forms/ColorPickerField.js +15 -2
  474. package/dist/ui/forms/FieldCheckbox.js +15 -2
  475. package/dist/ui/forms/FieldInput.d.ts +22 -1
  476. package/dist/ui/forms/FieldInput.js +19 -5
  477. package/dist/ui/forms/FieldLabel.d.ts +35 -0
  478. package/dist/ui/forms/FieldLabel.js +70 -0
  479. package/dist/ui/forms/FieldSelect.d.ts +4 -1
  480. package/dist/ui/forms/FieldSelect.js +27 -5
  481. package/dist/ui/forms/FieldTextarea.d.ts +4 -1
  482. package/dist/ui/forms/FieldTextarea.js +22 -5
  483. package/dist/ui/forms/FormShell.d.ts +17 -1
  484. package/dist/ui/forms/FormShell.js +36 -2
  485. package/dist/ui/forms/FormShell.style.css +41 -33
  486. package/dist/ui/forms/index.d.ts +5 -1
  487. package/dist/ui/forms/index.js +2 -0
  488. package/dist/ui/icons/icon-registry.d.ts +1 -0
  489. package/dist/ui/icons/icon-registry.js +17 -1
  490. package/dist/utils/id-generators.d.ts +80 -0
  491. package/dist/utils/id-generators.js +93 -0
  492. package/dist/utils/search-txt-builders.d.ts +12 -0
  493. package/dist/utils/search-txt-builders.js +17 -0
  494. package/package.json +1 -1
  495. package/scripts/seed-cli.mjs +106 -5
  496. package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
  497. package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
  498. package/dist/features/loyalty/api/balance/route.d.ts +0 -12
  499. package/dist/features/loyalty/api/balance/route.js +0 -41
  500. package/dist/features/loyalty/api/earn/route.d.ts +0 -12
  501. package/dist/features/loyalty/api/earn/route.js +0 -38
  502. package/dist/features/loyalty/api/history/route.d.ts +0 -12
  503. package/dist/features/loyalty/api/history/route.js +0 -58
  504. package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
  505. package/dist/features/loyalty/api/redeem/route.js +0 -38
  506. package/dist/features/loyalty/columns/index.d.ts +0 -17
  507. package/dist/features/loyalty/columns/index.js +0 -40
  508. package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
  509. package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
  510. package/dist/features/loyalty/components/index.d.ts +0 -1
  511. package/dist/features/loyalty/components/index.js +0 -1
  512. package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
  513. package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
  514. package/dist/features/loyalty/index.d.ts +0 -6
  515. package/dist/features/loyalty/index.js +0 -6
  516. package/dist/features/loyalty/manifest.d.ts +0 -2
  517. package/dist/features/loyalty/manifest.js +0 -16
  518. package/dist/features/loyalty/messages/en.json +0 -19
  519. package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
  520. package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
  521. package/dist/features/loyalty/schemas/index.d.ts +0 -85
  522. package/dist/features/loyalty/schemas/index.js +0 -40
  523. package/dist/features/loyalty/server.d.ts +0 -6
  524. package/dist/features/loyalty/server.js +0 -6
  525. package/dist/features/loyalty/types/index.d.ts +0 -31
  526. package/dist/features/loyalty/types/index.js +0 -1
  527. package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
  528. package/dist/features/loyalty/types/loyalty-config.js +0 -1
  529. package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
  530. package/dist/features/loyalty/types/loyalty-math.js +0 -27
  531. package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
  532. package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
@@ -11,7 +11,82 @@ const GRADIENTS = {
11
11
  amber: "var(--appkit-gradient-warning-stat)",
12
12
  rose: "var(--appkit-gradient-danger-stat)",
13
13
  };
14
- export function AdminStatCard({ label, value, sub, icon, gradient = "brand", className = "", }) {
14
+ /**
15
+ * A 40×24 trend line. Deliberately NOT recharts.
16
+ *
17
+ * 🛑 recharts IS installed and is used for the three real charts in this app —
18
+ * but it is a ~100 KB client bundle with a `ResponsiveContainer` that measures
19
+ * on mount, and a dashboard home renders six to eight of these. Six
20
+ * ResizeObservers to draw six polylines is a layout-thrash and a bundle cost
21
+ * for 24 pixels of decoration. An inline `<svg>` with a `<polyline>` is the
22
+ * whole feature.
23
+ *
24
+ * `preserveAspectRatio="none"` so the line fills its box at any size: the
25
+ * values are normalised to 0–100 here, so the viewBox IS the data range and
26
+ * stretching it is correct rather than distorting.
27
+ */
28
+ function Sparkline({ series, rising, }) {
29
+ const min = Math.min(...series);
30
+ const max = Math.max(...series);
31
+ /*
32
+ * 🛑 A FLAT SERIES IS DRAWN FLAT, not divided by zero. When every value is
33
+ * equal `max - min` is 0; the guard puts the line down the middle, which is
34
+ * what "no change" looks like. Without it every point becomes NaN and the
35
+ * polyline silently renders nothing — a missing sparkline that reads as
36
+ * "no data" about a series that is simply steady.
37
+ */
38
+ const span = max - min || 1;
39
+ const points = series
40
+ .map((v, i) => {
41
+ const x = (i / (series.length - 1)) * 100;
42
+ // SVG y grows downward, so the value is inverted.
43
+ const y = 100 - ((v - min) / span) * 100;
44
+ return `${x.toFixed(2)},${y.toFixed(2)}`;
45
+ })
46
+ .join(" ");
47
+ return (_jsx("svg", { viewBox: "0 0 100 100", preserveAspectRatio: "none", className: "h-full w-full", focusable: "false", children: _jsx("polyline", { points: points, fill: "none", stroke: rising
48
+ ? "var(--appkit-color-success)"
49
+ : "var(--appkit-color-error)", strokeWidth: 6, strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) }));
50
+ }
51
+ export function AdminStatCard({ label, value, sub, icon, gradient = "brand", className = "", trendPercent, trendLabel, higherIsBetter = true, series, }) {
15
52
  const resolvedGradient = GRADIENTS[gradient] ?? gradient;
16
- return (_jsxs(Div, { className: `relative border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden ${className}`, rounded: "xl", shadow: "sm-hover-md", children: [_jsx(DynamicBgDiv, { background: resolvedGradient, className: "absolute top-0 left-0 right-0 h-[3px]", "aria-hidden": "true" }), _jsxs(Row, { paddingX: "x-5", paddingY: "b-md-lg", padding: "t-lg", align: "start", justify: "between", gap: "3", children: [_jsxs(Div, { className: "min-w-0 flex-1", children: [_jsx(Text, { className: "text-[11px] tracking-widest text-[var(--appkit-color-text-muted)]", weight: "semibold", transform: "uppercase", children: label }), _jsx(Heading, { level: 3, className: "mt-2 tabular-nums leading-none text-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: value }), sub && (_jsx(Text, { className: "mt-1.5 text-[var(--appkit-color-text-muted)]", size: "xs", children: sub }))] }), icon && (_jsx(DynamicBgDiv, { background: resolvedGradient, className: "flex-shrink-0 w-10 h-10 flex items-center justify-center rounded-lg text-[length:var(--appkit-text-xl)]", children: icon }))] })] }));
53
+ /*
54
+ * 🛑 `!= null`, NOT a truthiness check. `trendPercent === 0` is a real
55
+ * measurement — "this figure did not move" — and `if (trendPercent)` would
56
+ * discard exactly that reading while keeping every other one. The same
57
+ * mistake as `rating !== undefined` passing for `rating: 0`, which showed
58
+ * five stars on unreviewed products (and is fixed two commits over).
59
+ */
60
+ const showTrend = trendPercent != null;
61
+ /* Two points minimum: one point is not a line, and a 1-point polyline
62
+ * renders as nothing at all rather than as a dot. */
63
+ const showSpark = Array.isArray(series) && series.length >= 2;
64
+ const up = showTrend && trendPercent > 0;
65
+ const down = showTrend && trendPercent < 0;
66
+ const flat = showTrend && trendPercent === 0;
67
+ /*
68
+ * 🛑 GOOD/BAD IS NOT UP/DOWN. Refunds, cancellations, failed payments and
69
+ * error counts all rise when things go wrong, so `higherIsBetter` decides
70
+ * the colour and the arrow only decides the direction. Tying the tone to
71
+ * the arrow would paint a spike in refunds green.
72
+ */
73
+ const good = higherIsBetter ? up : down;
74
+ const bad = higherIsBetter ? down : up;
75
+ const trendTone = flat ? "muted" : good ? "success" : bad ? "error" : "muted";
76
+ const trendArrow = flat ? "–" : up ? "▲" : "▼";
77
+ const trendText = flat
78
+ ? "no change"
79
+ : `${up ? "up" : "down"} ${Math.abs(trendPercent).toFixed(1).replace(/\.0$/, "")}%`;
80
+ // The sparkline's colour follows the same good/bad rule, not its slope.
81
+ const sparkRising = good || (flat && higherIsBetter);
82
+ return (_jsxs(Div, { className: `relative border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden ${className}`, rounded: "xl", shadow: "sm-hover-md", children: [_jsx(DynamicBgDiv, { background: resolvedGradient, className: "absolute top-0 left-0 right-0 h-[3px]", "aria-hidden": "true" }), _jsxs(Row, { paddingX: "x-5", paddingY: "b-md-lg", padding: "t-lg", align: "start", justify: "between", gap: "3", children: [_jsxs(Div, { className: "min-w-0 flex-1", children: [_jsx(Text, { className: "text-[11px] tracking-widest text-[var(--appkit-color-text-muted)]", weight: "semibold", transform: "uppercase", children: label }), _jsx(Heading, { level: 3, className: "mt-2 tabular-nums leading-none text-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: value }), sub && (_jsx(Text, { className: "mt-1.5 text-[var(--appkit-color-text-muted)]", size: "xs", children: sub }))] }), icon && (_jsx(DynamicBgDiv, { background: resolvedGradient, className: "flex-shrink-0 w-10 h-10 flex items-center justify-center rounded-lg text-[length:var(--appkit-text-xl)]", children: icon }))] }), (showTrend || showSpark) && (_jsxs(Row, { paddingX: "x-5", padding: "b-md", align: "center", justify: "between", gap: "3", children: [showTrend ? (_jsxs(Text, { size: "xs", color: trendTone, weight: "semibold", children: [_jsxs("span", { "aria-hidden": "true", children: [trendArrow, " "] }), trendText, trendLabel ? (_jsxs(Text, { as: "span", size: "xs", color: "muted", weight: "normal", children: [" ", trendLabel] })) : null] })) : (_jsx("span", {})), showSpark && (
83
+ /*
84
+ 🛑 `aria-hidden`, with NO accessible label. A sparkline is a
85
+ decorative restatement of a trend already given in words
86
+ directly beside it — describing it again would make a screen
87
+ reader read the same fact twice. If the series ever carried
88
+ information the trend line does not, it needs a real chart with
89
+ a real description, not a label bolted onto 40 pixels.
90
+ */
91
+ _jsx(Div, { "aria-hidden": "true", className: "h-6 w-20 flex-shrink-0 opacity-80", children: _jsx(Sparkline, { series: series, rising: sparkRising }) }))] }))] }));
17
92
  }
@@ -105,6 +105,10 @@ export { AdminPayoutMarkPaidModal } from "./AdminPayoutMarkPaidModal";
105
105
  export type { AdminPayoutMarkPaidModalProps } from "./AdminPayoutMarkPaidModal";
106
106
  export { AdminAuditLogView } from "./AdminAuditLogView";
107
107
  export type { AdminAuditLogViewProps } from "./AdminAuditLogView";
108
+ export { AdminMoneyCasesView } from "./AdminMoneyCasesView";
109
+ export type { AdminMoneyCasesViewProps } from "./AdminMoneyCasesView";
110
+ export { AdminGatewayEventsView } from "./AdminGatewayEventsView";
111
+ export type { AdminGatewayEventsViewProps } from "./AdminGatewayEventsView";
108
112
  export { ViewAuditLogEntryModal } from "./ViewAuditLogEntryModal";
109
113
  export type { AuditLogEntryDetail, ViewAuditLogEntryModalProps } from "./ViewAuditLogEntryModal";
110
114
  export { ViewNotificationModal } from "./ViewNotificationModal";
@@ -57,6 +57,12 @@ export { AdminHistoryView } from "./AdminHistoryView.js";
57
57
  export { AdminPayoutsView } from "./AdminPayoutsView.js";
58
58
  export { AdminPayoutMarkPaidModal } from "./AdminPayoutMarkPaidModal.js";
59
59
  export { AdminAuditLogView } from "./AdminAuditLogView.js";
60
+ /*
61
+ * Payment protection — the operator queue for everything where money is at
62
+ * risk, and the first surface `paymentCases` has ever had.
63
+ */
64
+ export { AdminMoneyCasesView } from "./AdminMoneyCasesView.js";
65
+ export { AdminGatewayEventsView } from "./AdminGatewayEventsView.js";
60
66
  export { ViewAuditLogEntryModal } from "./ViewAuditLogEntryModal.js";
61
67
  export { ViewNotificationModal } from "./ViewNotificationModal.js";
62
68
  export { AdminReviewsView } from "./AdminReviewsView.js";
@@ -699,3 +699,159 @@ export declare const SELLER_BID_STATUS_TABS: readonly [{
699
699
  readonly id: "cancelled";
700
700
  readonly label: "Cancelled";
701
701
  }];
702
+ /** Admin > Money cases — `PaymentCaseStatus`. `open` is the birth state. */
703
+ export declare const ADMIN_PAYMENT_CASE_STATUS_TABS: readonly [{
704
+ readonly id: "All";
705
+ readonly label: "All";
706
+ }, {
707
+ readonly id: "open";
708
+ readonly label: "Open";
709
+ }, {
710
+ readonly id: "under-review";
711
+ readonly label: "Under review";
712
+ }, {
713
+ readonly id: "actioned";
714
+ readonly label: "Actioned";
715
+ }, {
716
+ readonly id: "dismissed";
717
+ readonly label: "Dismissed";
718
+ }];
719
+ /**
720
+ * Admin > Money cases — `PaymentCaseKind`, all eleven.
721
+ *
722
+ * Labels are what an operator recognises, not the field value: `missing_order`
723
+ * reads as "Captured, no order", which is what the problem IS. The ids stay
724
+ * byte-exact against the union because they go straight into a Sieve equality
725
+ * and a near-miss returns zero rows forever with no error (Root Cause #33).
726
+ */
727
+ export declare const ADMIN_PAYMENT_CASE_KIND_TABS: readonly [{
728
+ readonly id: "All";
729
+ readonly label: "All";
730
+ }, {
731
+ readonly id: "missing_order";
732
+ readonly label: "Captured, no order";
733
+ }, {
734
+ readonly id: "dispute";
735
+ readonly label: "Chargeback";
736
+ }, {
737
+ readonly id: "manual_refund_due";
738
+ readonly label: "Refund owed";
739
+ }, {
740
+ readonly id: "refund_mismatch";
741
+ readonly label: "Refund mismatch";
742
+ }, {
743
+ readonly id: "amount_mismatch";
744
+ readonly label: "Amount mismatch";
745
+ }, {
746
+ readonly id: "unprocessed_event";
747
+ readonly label: "Unprocessed event";
748
+ }, {
749
+ readonly id: "status_conflict";
750
+ readonly label: "Status conflict";
751
+ }, {
752
+ readonly id: "protection_claim";
753
+ readonly label: "Protection claim";
754
+ }, {
755
+ readonly id: "grievance";
756
+ readonly label: "Grievance";
757
+ }, {
758
+ readonly id: "shipping_unpriced";
759
+ readonly label: "Shipping unpriced";
760
+ }, {
761
+ readonly id: "dead_job";
762
+ readonly label: "Dead job";
763
+ }, {
764
+ readonly id: "ledger_drift";
765
+ readonly label: "Points drift";
766
+ }];
767
+ /** Admin > Money cases — `PaymentCaseSeverity`. Escalate-only, never downgraded. */
768
+ export declare const ADMIN_PAYMENT_CASE_SEVERITY_TABS: readonly [{
769
+ readonly id: "All";
770
+ readonly label: "All";
771
+ }, {
772
+ readonly id: "error";
773
+ readonly label: "Error";
774
+ }, {
775
+ readonly id: "warning";
776
+ readonly label: "Warning";
777
+ }, {
778
+ readonly id: "info";
779
+ readonly label: "Info";
780
+ }];
781
+ /**
782
+ * Admin > Gateway events — `GatewayEventStatus`.
783
+ *
784
+ * `ignored` is a real, healthy outcome and not a failure: an event type we are
785
+ * subscribed to but do not implement is recorded verbatim and settled
786
+ * `ignored`, which is the whole reason the inbox records unknown events rather
787
+ * than dropping them. `conflict` means a late event would have regressed an
788
+ * order's status — also not an error.
789
+ */
790
+ export declare const ADMIN_GATEWAY_EVENT_STATUS_TABS: readonly [{
791
+ readonly id: "All";
792
+ readonly label: "All";
793
+ }, {
794
+ readonly id: "received";
795
+ readonly label: "Received";
796
+ }, {
797
+ readonly id: "processing";
798
+ readonly label: "Processing";
799
+ }, {
800
+ readonly id: "processed";
801
+ readonly label: "Processed";
802
+ }, {
803
+ readonly id: "failed";
804
+ readonly label: "Failed";
805
+ }, {
806
+ readonly id: "conflict";
807
+ readonly label: "Late / conflict";
808
+ }, {
809
+ readonly id: "ignored";
810
+ readonly label: "Ignored";
811
+ }];
812
+ /** Admin > Gateway events — `GatewayEventKind`. */
813
+ export declare const ADMIN_GATEWAY_EVENT_KIND_TABS: readonly [{
814
+ readonly id: "All";
815
+ readonly label: "All";
816
+ }, {
817
+ readonly id: "paid";
818
+ readonly label: "Paid";
819
+ }, {
820
+ readonly id: "failed";
821
+ readonly label: "Failed";
822
+ }, {
823
+ readonly id: "refund";
824
+ readonly label: "Refund";
825
+ }, {
826
+ readonly id: "dispute";
827
+ readonly label: "Dispute";
828
+ }, {
829
+ readonly id: "other";
830
+ readonly label: "Other";
831
+ }];
832
+ /** Admin > Protection claims — `ProtectionClaimStatus`. */
833
+ export declare const ADMIN_PROTECTION_CLAIM_STATUS_TABS: readonly [{
834
+ readonly id: "All";
835
+ readonly label: "All";
836
+ }, {
837
+ readonly id: "open";
838
+ readonly label: "Open";
839
+ }, {
840
+ readonly id: "awaiting-return";
841
+ readonly label: "Awaiting return";
842
+ }, {
843
+ readonly id: "inspecting";
844
+ readonly label: "Inspecting";
845
+ }, {
846
+ readonly id: "upheld";
847
+ readonly label: "Upheld";
848
+ }, {
849
+ readonly id: "rejected";
850
+ readonly label: "Rejected";
851
+ }, {
852
+ readonly id: "withdrawn";
853
+ readonly label: "Withdrawn";
854
+ }, {
855
+ readonly id: "expired";
856
+ readonly label: "Expired";
857
+ }];
@@ -401,3 +401,109 @@ export const SELLER_BID_STATUS_TABS = [
401
401
  { id: "lost", label: "Lost" },
402
402
  { id: "cancelled", label: "Cancelled" },
403
403
  ];
404
+ // ============================================================================
405
+ // PAYMENT PROTECTION — the four collections the money spine writes to
406
+ //
407
+ // All eight arrays below are registered in `audit-filter-tab-enums`, whose
408
+ // COVERAGE check is what makes them worth having: a kind with no chip is a kind
409
+ // an operator cannot isolate, and these are the queues where that costs money
410
+ // rather than convenience (Root Cause #72).
411
+ //
412
+ // They are rendered in a filter PANEL, not an always-visible chip row — eleven
413
+ // case kinds and twelve obligation kinds are a complete set, not a scannable
414
+ // one, and `renderFilterPanel` is where a complete set belongs.
415
+ // ============================================================================
416
+ /** Admin > Money cases — `PaymentCaseStatus`. `open` is the birth state. */
417
+ export const ADMIN_PAYMENT_CASE_STATUS_TABS = [
418
+ ALL_TAB,
419
+ { id: "open", label: "Open" },
420
+ { id: "under-review", label: "Under review" },
421
+ { id: "actioned", label: "Actioned" },
422
+ { id: "dismissed", label: "Dismissed" },
423
+ ];
424
+ /**
425
+ * Admin > Money cases — `PaymentCaseKind`, all eleven.
426
+ *
427
+ * Labels are what an operator recognises, not the field value: `missing_order`
428
+ * reads as "Captured, no order", which is what the problem IS. The ids stay
429
+ * byte-exact against the union because they go straight into a Sieve equality
430
+ * and a near-miss returns zero rows forever with no error (Root Cause #33).
431
+ */
432
+ export const ADMIN_PAYMENT_CASE_KIND_TABS = [
433
+ ALL_TAB,
434
+ { id: "missing_order", label: "Captured, no order" },
435
+ { id: "dispute", label: "Chargeback" },
436
+ { id: "manual_refund_due", label: "Refund owed" },
437
+ { id: "refund_mismatch", label: "Refund mismatch" },
438
+ { id: "amount_mismatch", label: "Amount mismatch" },
439
+ { id: "unprocessed_event", label: "Unprocessed event" },
440
+ { id: "status_conflict", label: "Status conflict" },
441
+ { id: "protection_claim", label: "Protection claim" },
442
+ { id: "grievance", label: "Grievance" },
443
+ { id: "shipping_unpriced", label: "Shipping unpriced" },
444
+ { id: "dead_job", label: "Dead job" },
445
+ { id: "ledger_drift", label: "Points drift" },
446
+ ];
447
+ /** Admin > Money cases — `PaymentCaseSeverity`. Escalate-only, never downgraded. */
448
+ export const ADMIN_PAYMENT_CASE_SEVERITY_TABS = [
449
+ ALL_TAB,
450
+ { id: "error", label: "Error" },
451
+ { id: "warning", label: "Warning" },
452
+ { id: "info", label: "Info" },
453
+ ];
454
+ /**
455
+ * Admin > Gateway events — `GatewayEventStatus`.
456
+ *
457
+ * `ignored` is a real, healthy outcome and not a failure: an event type we are
458
+ * subscribed to but do not implement is recorded verbatim and settled
459
+ * `ignored`, which is the whole reason the inbox records unknown events rather
460
+ * than dropping them. `conflict` means a late event would have regressed an
461
+ * order's status — also not an error.
462
+ */
463
+ export const ADMIN_GATEWAY_EVENT_STATUS_TABS = [
464
+ ALL_TAB,
465
+ { id: "received", label: "Received" },
466
+ { id: "processing", label: "Processing" },
467
+ { id: "processed", label: "Processed" },
468
+ { id: "failed", label: "Failed" },
469
+ { id: "conflict", label: "Late / conflict" },
470
+ { id: "ignored", label: "Ignored" },
471
+ ];
472
+ /** Admin > Gateway events — `GatewayEventKind`. */
473
+ export const ADMIN_GATEWAY_EVENT_KIND_TABS = [
474
+ ALL_TAB,
475
+ { id: "paid", label: "Paid" },
476
+ { id: "failed", label: "Failed" },
477
+ { id: "refund", label: "Refund" },
478
+ { id: "dispute", label: "Dispute" },
479
+ { id: "other", label: "Other" },
480
+ ];
481
+ /*
482
+ * 🛑 NO obligation tab arrays, and the absence is deliberate.
483
+ *
484
+ * `ADMIN_OBLIGATION_STATE_TABS` and `ADMIN_OBLIGATION_KIND_TABS` were written
485
+ * here and removed before shipping, because `/admin/maintenance/obligations`
486
+ * does not filter:
487
+ *
488
+ * · the page reads `obligationsRepository.listDue()`, which returns OPEN and
489
+ * overdue rows by definition — so a state filter would offer five chips of
490
+ * which exactly one can ever match anything;
491
+ * · `ObligationsRepository` declares **no `SIEVE_FIELDS`**, on its own stated
492
+ * reasoning that a filterable surface nothing calls is the speculative-infra
493
+ * pattern. Adding one to feed chips nobody needs would be that pattern
494
+ * twice over.
495
+ *
496
+ * Twelve chips with nothing behind them is exactly the dead control this file's
497
+ * COVERAGE note exists to prevent — it would just fail in the other direction.
498
+ */
499
+ /** Admin > Protection claims — `ProtectionClaimStatus`. */
500
+ export const ADMIN_PROTECTION_CLAIM_STATUS_TABS = [
501
+ ALL_TAB,
502
+ { id: "open", label: "Open" },
503
+ { id: "awaiting-return", label: "Awaiting return" },
504
+ { id: "inspecting", label: "Inspecting" },
505
+ { id: "upheld", label: "Upheld" },
506
+ { id: "rejected", label: "Rejected" },
507
+ { id: "withdrawn", label: "Withdrawn" },
508
+ { id: "expired", label: "Expired" },
509
+ ];
@@ -5,6 +5,28 @@
5
5
  */
6
6
  import { BaseRepository } from "../../../providers/db-firebase";
7
7
  import { SiteSettingsDocument, SiteSettingsCredentialsMasked, SiteSettingsUpdateInput } from "../schemas";
8
+ /**
9
+ * Flatten a nested update into Firestore dotted field paths, so a partial
10
+ * group update MERGES into the stored map instead of replacing it.
11
+ *
12
+ * `update({ commissions: { gstPercent: 18 } })` deletes every other key under
13
+ * `commissions`; `update({ "commissions.gstPercent": 18 })` touches one leaf.
14
+ * See the call site for the five keys that were silently destroyed by the
15
+ * former (D13).
16
+ *
17
+ * Three cases are deliberately NOT recursed into:
18
+ *
19
+ * · **Arrays** — an array is a VALUE, not a map. Flattening
20
+ * `legalPages.sections.0.title` would make a shorter replacement array leave
21
+ * the old tail in place, which is a worse bug than the one being fixed.
22
+ * · **`undefined`** — kept at its own path so a caller can still delete a
23
+ * field. Recursing would turn it into a path to nothing.
24
+ * · **`Date` and any other class instance** — Firestore stores a `Date` as a
25
+ * Timestamp; walking its properties would write `{}`. Tested by rejecting
26
+ * anything whose prototype is not `Object.prototype`, which also covers
27
+ * `FieldValue` sentinels and `Timestamp` itself.
28
+ */
29
+ export declare function toDottedPaths(input: Record<string, unknown>, prefix?: string): Record<string, unknown>;
8
30
  /**
9
31
  * Repository for site settings management
10
32
  *
@@ -17,6 +17,53 @@ import { cacheManager } from "../../../core/CacheManager.js";
17
17
  import { SITE_SETTINGS_COLLECTION, DEFAULT_SITE_SETTINGS_DATA, } from "../schemas/index.js";
18
18
  import { DatabaseError } from "../../../errors/index.js";
19
19
  import { decryptSecret, encryptSecret, maskSecret } from "../../../security/index.js";
20
+ /**
21
+ * Flatten a nested update into Firestore dotted field paths, so a partial
22
+ * group update MERGES into the stored map instead of replacing it.
23
+ *
24
+ * `update({ commissions: { gstPercent: 18 } })` deletes every other key under
25
+ * `commissions`; `update({ "commissions.gstPercent": 18 })` touches one leaf.
26
+ * See the call site for the five keys that were silently destroyed by the
27
+ * former (D13).
28
+ *
29
+ * Three cases are deliberately NOT recursed into:
30
+ *
31
+ * · **Arrays** — an array is a VALUE, not a map. Flattening
32
+ * `legalPages.sections.0.title` would make a shorter replacement array leave
33
+ * the old tail in place, which is a worse bug than the one being fixed.
34
+ * · **`undefined`** — kept at its own path so a caller can still delete a
35
+ * field. Recursing would turn it into a path to nothing.
36
+ * · **`Date` and any other class instance** — Firestore stores a `Date` as a
37
+ * Timestamp; walking its properties would write `{}`. Tested by rejecting
38
+ * anything whose prototype is not `Object.prototype`, which also covers
39
+ * `FieldValue` sentinels and `Timestamp` itself.
40
+ */
41
+ export function toDottedPaths(input, prefix = "") {
42
+ const out = {};
43
+ for (const [key, value] of Object.entries(input)) {
44
+ const path = prefix ? `${prefix}.${key}` : key;
45
+ const isPlainObject = typeof value === "object" &&
46
+ value !== null &&
47
+ !Array.isArray(value) &&
48
+ Object.getPrototypeOf(value) === Object.prototype;
49
+ if (isPlainObject) {
50
+ const nested = toDottedPaths(value, path);
51
+ /*
52
+ * An EMPTY object is written at its own path rather than vanishing.
53
+ * `{ watermark: {} }` is a caller saying "clear this group"; dropping it
54
+ * because it produced no leaves would silently ignore the instruction.
55
+ */
56
+ if (Object.keys(nested).length === 0)
57
+ out[path] = value;
58
+ else
59
+ Object.assign(out, nested);
60
+ }
61
+ else {
62
+ out[path] = value;
63
+ }
64
+ }
65
+ return out;
66
+ }
20
67
  /**
21
68
  * Repository for site settings management
22
69
  *
@@ -113,10 +160,44 @@ export class SiteSettingsRepository extends BaseRepository {
113
160
  ...finalUpdates,
114
161
  updatedAt: new Date(),
115
162
  });
163
+ /*
164
+ * ── D13: DOTTED PATHS, not a wholesale nested-map replace ────────────
165
+ *
166
+ * 🛑 This was `.update(updateData)` with nested objects, and Firestore's
167
+ * `update()` REPLACES a nested map wholesale rather than merging into
168
+ * it. So saving `{ commissions: { platformFeePercent: 2 } }` deleted
169
+ * every other key under `commissions`.
170
+ *
171
+ * That is not hypothetical. `AdminSiteSettingsView`'s commissions
172
+ * payload omitted FIVE keys — `saleProtectionFeeEnabled`,
173
+ * `saleProtectionFeePercent`, `saleProtectionFeeMin`,
174
+ * `codHandlingFeeCap`, `codHandlingFeePercent` — with no state, no field
175
+ * and no control for any of them. So the FIRST save of any commissions
176
+ * field silently:
177
+ *
178
+ * · stopped sale protection being sold, a product we charge 3% (min
179
+ * ₹49) for, with no error and nothing in the UI to notice; and
180
+ * · reverted COD handling to code defaults.
181
+ *
182
+ * It also made CLAUDE.md's stated remediation — "enable them once at
183
+ * Admin → Site Settings → Commissions" — impossible, because there was
184
+ * no control there to enable them with.
185
+ *
186
+ * Flattening to dotted paths is the structural fix: `commissions.gstPercent`
187
+ * touches exactly that leaf. The alternative (adding the five missing
188
+ * fields to the form) fixes TODAY'S instance and leaves the next group
189
+ * that grows a field to hit the same wall — and `legalPages` had already
190
+ * hit it independently (D19), which is the evidence that this recurs.
191
+ *
192
+ * 🛑 ARRAYS AND `undefined` ARE NOT FLATTENED. An array is a value, not a
193
+ * map: flattening `legalPages.sections.0.title` would make a shorter
194
+ * replacement array leave the old tail behind. And `undefined` must stay
195
+ * a top-level delete rather than becoming a dotted path to nothing.
196
+ */
116
197
  await this.db
117
198
  .collection(this.collection)
118
199
  .doc(this.SINGLETON_ID)
119
- .update(updateData);
200
+ .update(toDottedPaths(updateData));
120
201
  const latest = await this.getSingleton();
121
202
  cacheManager.set(this.cacheKey(), latest, {
122
203
  ttl: SiteSettingsRepository.CACHE_TTL_MS,
@@ -92,6 +92,17 @@ export declare const brandFormSchema: z.ZodObject<{
92
92
  website: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
93
93
  country: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
94
94
  founded: z.ZodOptional<z.ZodNumber>;
95
+ highlightsText: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
96
+ faqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
97
+ question: z.ZodString;
98
+ answer: z.ZodString;
99
+ }, "strip", z.ZodTypeAny, {
100
+ question: string;
101
+ answer: string;
102
+ }, {
103
+ question: string;
104
+ answer: string;
105
+ }>, "many">>;
95
106
  isActive: z.ZodBoolean;
96
107
  displayOrder: z.ZodOptional<z.ZodNumber>;
97
108
  }, "strip", z.ZodTypeAny, {
@@ -99,20 +110,30 @@ export declare const brandFormSchema: z.ZodObject<{
99
110
  isActive: boolean;
100
111
  country?: string | undefined;
101
112
  slug?: string | undefined;
113
+ faqs?: {
114
+ question: string;
115
+ answer: string;
116
+ }[] | undefined;
102
117
  description?: string | undefined;
103
118
  displayOrder?: number | undefined;
104
119
  logoURL?: string | undefined;
105
120
  website?: string | undefined;
106
121
  founded?: number | undefined;
122
+ highlightsText?: string | undefined;
107
123
  }, {
108
124
  name: string;
109
125
  isActive: boolean;
110
126
  country?: string | undefined;
111
127
  slug?: string | undefined;
128
+ faqs?: {
129
+ question: string;
130
+ answer: string;
131
+ }[] | undefined;
112
132
  description?: string | undefined;
113
133
  displayOrder?: number | undefined;
114
134
  logoURL?: string | undefined;
115
135
  website?: string | undefined;
116
136
  founded?: number | undefined;
137
+ highlightsText?: string | undefined;
117
138
  }>;
118
139
  export type BrandFormValues = z.infer<typeof brandFormSchema>;
@@ -177,6 +177,50 @@ export const brandFormSchema = z.object({
177
177
  section: "identity", order: 2, row: "pair", label: "Country of origin",
178
178
  }),
179
179
  founded: annotate(z.number().int().min(1800, "That is earlier than any brand on record.").max(new Date().getFullYear(), "A founding year cannot be in the future.").optional(), { section: "identity", order: 3, row: "pair", kind: "number", label: "Founded year" }),
180
+ /*
181
+ * ── Editorial content ────────────────────────────────────────────────────
182
+ *
183
+ * 🛑 BOTH OF THESE HAVE RENDERED ON THE BRAND PAGE SINCE THEY SHIPPED, with
184
+ * no way to author them. `BrandDetailPageView:418` mounts
185
+ * `<CategoryHighlightsAndFaqSection highlights={brand?.highlights}
186
+ * faqs={brand?.faqs} />`, `CategoryDocument` declares both with a comment
187
+ * saying they render on "category and BRAND detail pages", and
188
+ * `CATEGORIES_UPDATABLE_FIELDS` has always permitted the write. The only
189
+ * missing piece was a form — the category editor had one, the brand editor
190
+ * did not, so brand highlights and FAQs were unreachable.
191
+ *
192
+ * `highlightsText` is a newline-separated textarea rather than a repeater,
193
+ * matching the category editor exactly: these are a flat `string[]`, an
194
+ * admin pasting five bullets wants to paste five lines, and order is
195
+ * preserved by the text itself.
196
+ */
197
+ highlightsText: annotate(z.string().optional().or(z.literal("")), {
198
+ section: "content", sectionLabel: "Content", order: 1, row: "full",
199
+ kind: "textarea", label: "Highlights — one per line",
200
+ help: "Short \"why shop this brand\" bullets, shown above the FAQs.",
201
+ }),
202
+ /*
203
+ * 🛑 DECLARED HERE SO THE PARSE COVERS IT, rendered by a custom `renderers`
204
+ * entry in the editor. `buildSectionsFromSchema` has no `kind` for a
205
+ * per-row shape, and inventing one for a single consumer would be the
206
+ * speculative-infra move — `logoURL` already establishes the pattern of a
207
+ * schema field with a bespoke renderer.
208
+ *
209
+ * It lives in the DRAFT rather than its own `useState`, unlike the category
210
+ * editor's three repeaters. Those predate this form being schema-driven;
211
+ * here the draft can hold the array, so validation, dirty-tracking and the
212
+ * error summary all see it, and there is one source of truth instead of two.
213
+ */
214
+ faqs: annotate(z
215
+ .array(z.object({
216
+ question: z.string().min(1, "A question is required").max(300),
217
+ answer: z.string().min(1, "An answer is required").max(2000),
218
+ }))
219
+ .max(8, "At most 8 questions")
220
+ .optional(), {
221
+ section: "content", order: 2, row: "full", label: "Brand FAQs",
222
+ help: "Rendered beneath the highlights on the brand page.",
223
+ }),
180
224
  isActive: annotate(z.boolean(), {
181
225
  section: "visibility", sectionLabel: "Visibility", order: 1, row: "quarter",
182
226
  label: "Active",
@@ -292,7 +292,11 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
292
292
  platformShippingPercent: 10,
293
293
  platformShippingFixedMin: 0,
294
294
  autoPayoutWindowDays: 7,
295
- payoutHoldDays: 2,
295
+ // 7, not 2 — see `PAYOUT_HOLD_FLOOR_DAYS`. A 2-day hold releases the
296
+ // seller's money inside both the 7-day return window and the 7-day
297
+ // sale-protection claim window, so it was never a legal value; it was
298
+ // merely an unread one (D28).
299
+ payoutHoldDays: 7,
296
300
  minPayoutAmount: 100,
297
301
  auctionListingFee: 0,
298
302
  preOrderListingFee: 0,