@mohasinac/appkit 4.59.0 → 4.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) 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.js +26 -0
  27. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
  28. package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
  29. package/dist/_internal/server/features/orders/index.d.ts +2 -1
  30. package/dist/_internal/server/features/orders/index.js +1 -1
  31. package/dist/_internal/server/features/orders/service.d.ts +60 -0
  32. package/dist/_internal/server/features/orders/service.js +74 -0
  33. package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
  34. package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
  35. package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
  36. package/dist/_internal/server/features/payment-cases/index.js +9 -0
  37. package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
  38. package/dist/_internal/server/features/payouts/actions.js +84 -10
  39. package/dist/_internal/server/features/points/adjust.d.ts +61 -0
  40. package/dist/_internal/server/features/points/adjust.js +121 -0
  41. package/dist/_internal/server/features/points/award.d.ts +65 -0
  42. package/dist/_internal/server/features/points/award.js +145 -0
  43. package/dist/_internal/server/features/price-index/market.d.ts +33 -0
  44. package/dist/_internal/server/features/price-index/market.js +54 -1
  45. package/dist/_internal/server/features/products/data.js +40 -22
  46. package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
  47. package/dist/_internal/server/features/protection-claims/actions.js +228 -0
  48. package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
  49. package/dist/_internal/server/features/protection-claims/index.js +8 -0
  50. package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
  51. package/dist/_internal/server/features/refunds/actions.js +259 -17
  52. package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
  53. package/dist/_internal/server/features/refunds/capacity.js +37 -0
  54. package/dist/_internal/server/features/reviews/actions.js +3 -2
  55. package/dist/_internal/server/features/search/index-build/sources.js +20 -1
  56. package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
  57. package/dist/_internal/server/features/shipping/reconcile.js +34 -3
  58. package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
  59. package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
  60. package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
  61. package/dist/_internal/server/features/stores/tabs.js +24 -4
  62. package/dist/_internal/server/functions/https.d.ts +31 -1
  63. package/dist/_internal/server/functions/https.js +52 -1
  64. package/dist/_internal/server/functions/scheduled.d.ts +72 -1
  65. package/dist/_internal/server/functions/scheduled.js +124 -1
  66. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
  67. package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
  68. package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
  69. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
  70. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
  71. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
  72. package/dist/_internal/server/jobs/core/index.d.ts +2 -0
  73. package/dist/_internal/server/jobs/core/index.js +2 -0
  74. package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
  75. package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
  76. package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
  77. package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
  78. package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
  79. package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
  80. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
  81. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
  82. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
  83. package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
  84. package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
  85. package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
  86. package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
  87. package/dist/_internal/server/jobs/handlers/index.js +5 -0
  88. package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
  89. package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
  90. package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
  91. package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
  92. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
  93. package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
  94. package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
  95. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  96. package/dist/_internal/shared/actions/action-registry.js +71 -0
  97. package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
  98. package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
  99. package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
  100. package/dist/_internal/shared/checkout/lanes.js +46 -0
  101. package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
  102. package/dist/_internal/shared/checkout/order-math.js +251 -3
  103. package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
  104. package/dist/_internal/shared/checkout/refundable-base.js +122 -0
  105. package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
  106. package/dist/_internal/shared/features/auctions/config.js +30 -1
  107. package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
  108. package/dist/_internal/shared/features/brands/schema.js +18 -0
  109. package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
  110. package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
  111. package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
  112. package/dist/_internal/shared/features/print/label-profiles.js +350 -0
  113. package/dist/_internal/shared/features/products/to-product-item.js +33 -5
  114. package/dist/_internal/shared/fees/calculator.d.ts +31 -2
  115. package/dist/_internal/shared/fees/calculator.js +103 -5
  116. package/dist/_internal/shared/fees/india-states.d.ts +195 -0
  117. package/dist/_internal/shared/fees/india-states.js +190 -0
  118. package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
  119. package/dist/_internal/shared/fees/payout-hold.js +74 -0
  120. package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
  121. package/dist/_internal/shared/obligations/deadlines.js +155 -0
  122. package/dist/_internal/shared/shipping/quote.d.ts +96 -0
  123. package/dist/_internal/shared/shipping/quote.js +67 -0
  124. package/dist/_internal/shared/time/business-days.d.ts +91 -0
  125. package/dist/_internal/shared/time/business-days.js +185 -0
  126. package/dist/cli/index.js +0 -2
  127. package/dist/client.d.ts +9 -4
  128. package/dist/client.js +26 -3
  129. package/dist/configs/tailwind.d.ts +0 -12
  130. package/dist/configs/tailwind.js +28 -15
  131. package/dist/constants/api-endpoints.d.ts +51 -9
  132. package/dist/constants/api-endpoints.js +23 -7
  133. package/dist/constants/index.d.ts +1 -1
  134. package/dist/constants/index.js +1 -1
  135. package/dist/contracts/index.d.ts +1 -1
  136. package/dist/contracts/payment.d.ts +131 -0
  137. package/dist/features/about/components/AboutView.js +1 -1
  138. package/dist/features/about/components/DeveloperView.js +5 -2
  139. package/dist/features/about/components/FAQPageView.js +2 -1
  140. package/dist/features/about/components/FeesView.js +2 -1
  141. package/dist/features/about/components/HelpPageView.js +2 -1
  142. package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
  143. package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
  144. package/dist/features/about/components/HowEmiWorksView.js +2 -1
  145. package/dist/features/about/components/HowOffersWorkView.js +2 -1
  146. package/dist/features/about/components/HowOrdersWorkView.js +2 -1
  147. package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
  148. package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
  149. package/dist/features/about/components/HowReviewsWorkView.js +2 -1
  150. package/dist/features/about/components/PolicyPageView.js +2 -1
  151. package/dist/features/about/components/ProseHero.d.ts +73 -0
  152. package/dist/features/about/components/ProseHero.js +18 -0
  153. package/dist/features/about/components/SecurityPrivacyView.js +2 -1
  154. package/dist/features/about/components/ShippingPolicyView.js +2 -1
  155. package/dist/features/about/components/TrackOrderView.js +2 -1
  156. package/dist/features/about/components/UnauthorizedView.js +1 -1
  157. package/dist/features/about/index.d.ts +2 -0
  158. package/dist/features/about/index.js +5 -0
  159. package/dist/features/account/actions/address-actions.d.ts +26 -2
  160. package/dist/features/account/actions/address-actions.js +25 -1
  161. package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
  162. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  163. package/dist/features/account/components/UserOrdersView.js +17 -0
  164. package/dist/features/account/components/UserSidebar.js +1 -1
  165. package/dist/features/account/hooks/useNotifications.js +29 -0
  166. package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
  167. package/dist/features/admin/components/AdminBeysView.js +2 -2
  168. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  169. package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
  170. package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
  171. package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
  172. package/dist/features/admin/components/AdminCategoriesView.js +1 -1
  173. package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
  174. package/dist/features/admin/components/AdminContactEditorView.js +1 -1
  175. package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
  176. package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
  177. package/dist/features/admin/components/AdminFaqsView.js +2 -2
  178. package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
  179. package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
  180. package/dist/features/admin/components/AdminGuideHubView.js +1 -1
  181. package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
  182. package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
  183. package/dist/features/admin/components/AdminPartsView.js +2 -2
  184. package/dist/features/admin/components/AdminProductsView.js +75 -4
  185. package/dist/features/admin/components/AdminSidebar.js +2 -2
  186. package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
  187. package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
  188. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  189. package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
  190. package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
  191. package/dist/features/admin/components/AdminUsersView.js +72 -1
  192. package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
  193. package/dist/features/admin/components/AdminViewCards.js +4 -4
  194. package/dist/features/admin/components/DataListingView.d.ts +28 -0
  195. package/dist/features/admin/components/DataListingView.js +175 -14
  196. package/dist/features/admin/components/DataTable.d.ts +12 -1
  197. package/dist/features/admin/components/DataTable.js +3 -3
  198. package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
  199. package/dist/features/admin/components/OwnerQuickActions.js +60 -2
  200. package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
  201. package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
  202. package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
  203. package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
  204. package/dist/features/admin/components/index.d.ts +4 -0
  205. package/dist/features/admin/components/index.js +6 -0
  206. package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
  207. package/dist/features/admin/constants/filter-tabs.js +106 -0
  208. package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
  209. package/dist/features/admin/repository/site-settings.repository.js +82 -1
  210. package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
  211. package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
  212. package/dist/features/admin/schemas/firestore.js +5 -1
  213. package/dist/features/admin/schemas/site-settings-form.js +30 -1
  214. package/dist/features/auctions/actions/bid-actions.js +13 -1
  215. package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
  216. package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
  217. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
  218. package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
  219. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
  220. package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
  221. package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
  222. package/dist/features/audit-log/schemas/firestore.js +14 -0
  223. package/dist/features/auth/permissions/constants.d.ts +17 -1
  224. package/dist/features/auth/permissions/constants.js +18 -0
  225. package/dist/features/blog/components/BlogPostView.js +1 -1
  226. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
  227. package/dist/features/categories/api/[id]/description-template/route.js +107 -1
  228. package/dist/features/categories/components/BrandDetailPageView.js +2 -2
  229. package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
  230. package/dist/features/categories/components/BundleDetailView.js +1 -1
  231. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  232. package/dist/features/categories/components/CategoryForm.js +12 -1
  233. package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
  234. package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
  235. package/dist/features/categories/repository/market-price-index.repository.js +105 -0
  236. package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
  237. package/dist/features/categories/repository/price-observation.repository.js +132 -0
  238. package/dist/features/events/components/EventSaleBanner.js +1 -1
  239. package/dist/features/events/components/EventStatusBadge.js +1 -1
  240. package/dist/features/faq/components/FAQAccordion.js +2 -1
  241. package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
  242. package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
  243. package/dist/features/faq/components/RelatedFAQs.js +1 -1
  244. package/dist/features/filters/FilterFacetSection.js +1 -1
  245. package/dist/features/filters/SwitchFilter.js +1 -1
  246. package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
  247. package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
  248. package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
  249. package/dist/features/gateway-events/schemas/firestore.js +125 -0
  250. package/dist/features/gateway-events/schemas/index.d.ts +81 -0
  251. package/dist/features/gateway-events/schemas/index.js +79 -0
  252. package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
  253. package/dist/features/homepage/components/AnnouncementBar.js +37 -1
  254. package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
  255. package/dist/features/homepage/components/BrandsSection.js +1 -1
  256. package/dist/features/homepage/components/CTABannerSection.js +1 -1
  257. package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
  258. package/dist/features/homepage/components/HeroCarousel.js +2 -2
  259. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  260. package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
  261. package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
  262. package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
  263. package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
  264. package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
  265. package/dist/features/inventory/components/ReceiveStationView.js +413 -0
  266. package/dist/features/inventory/components/operator-message.d.ts +29 -0
  267. package/dist/features/inventory/components/operator-message.js +41 -0
  268. package/dist/features/inventory/index.d.ts +13 -0
  269. package/dist/features/inventory/index.js +28 -0
  270. package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
  271. package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
  272. package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
  273. package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
  274. package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
  275. package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
  276. package/dist/features/inventory/schemas/firestore.d.ts +197 -0
  277. package/dist/features/inventory/schemas/firestore.js +159 -0
  278. package/dist/features/layout/AppLayoutShell.d.ts +12 -1
  279. package/dist/features/layout/AppLayoutShell.js +25 -12
  280. package/dist/features/layout/AutoBreadcrumbs.js +162 -3
  281. package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
  282. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  283. package/dist/features/layout/BottomNavbar.js +2 -2
  284. package/dist/features/media/MediaAvatar.js +1 -1
  285. package/dist/features/media/MediaImage.d.ts +24 -4
  286. package/dist/features/media/MediaImage.js +44 -4
  287. package/dist/features/media/MediaLightbox.js +1 -1
  288. package/dist/features/media/modals/ImageCropModal.js +1 -1
  289. package/dist/features/media/modals/ImageEditor.js +1 -1
  290. package/dist/features/media/upload/MediaUploadField.js +91 -3
  291. package/dist/features/obligations/constants/policies.d.ts +92 -0
  292. package/dist/features/obligations/constants/policies.js +378 -0
  293. package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
  294. package/dist/features/obligations/repository/obligations.repository.js +158 -0
  295. package/dist/features/obligations/schemas/firestore.d.ts +160 -0
  296. package/dist/features/obligations/schemas/firestore.js +87 -0
  297. package/dist/features/orders/actions/order-actions.d.ts +43 -4
  298. package/dist/features/orders/actions/order-actions.js +60 -3
  299. package/dist/features/orders/actions/refund-actions.js +70 -10
  300. package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
  301. package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
  302. package/dist/features/orders/components/OrdersList.js +2 -2
  303. package/dist/features/orders/components/RefundHistoryTable.js +3 -1
  304. package/dist/features/orders/components/index.d.ts +2 -0
  305. package/dist/features/orders/components/index.js +6 -0
  306. package/dist/features/orders/constants/transitions.d.ts +59 -0
  307. package/dist/features/orders/constants/transitions.js +104 -0
  308. package/dist/features/orders/repository/orders.repository.d.ts +109 -6
  309. package/dist/features/orders/repository/orders.repository.js +464 -21
  310. package/dist/features/orders/schemas/firestore.d.ts +270 -0
  311. package/dist/features/orders/schemas/firestore.js +24 -0
  312. package/dist/features/orders/schemas/index.d.ts +61 -0
  313. package/dist/features/orders/schemas/index.js +22 -0
  314. package/dist/features/orders/types/index.d.ts +79 -0
  315. package/dist/features/parts/components/PartsIndexPageView.js +8 -1
  316. package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
  317. package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
  318. package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
  319. package/dist/features/payment-cases/schemas/firestore.js +105 -0
  320. package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
  321. package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
  322. package/dist/features/payments/repository/payout.repository.d.ts +0 -1
  323. package/dist/features/payments/repository/payout.repository.js +0 -1
  324. package/dist/features/points/repository/points.repository.d.ts +122 -0
  325. package/dist/features/points/repository/points.repository.js +304 -1
  326. package/dist/features/points/schemas/adjust-form.d.ts +58 -0
  327. package/dist/features/points/schemas/adjust-form.js +63 -0
  328. package/dist/features/points/schemas/firestore.d.ts +108 -1
  329. package/dist/features/points/schemas/firestore.js +84 -0
  330. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
  331. package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
  332. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
  333. package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
  334. package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
  335. package/dist/features/price-index/market-stats.d.ts +82 -0
  336. package/dist/features/price-index/market-stats.js +230 -0
  337. package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
  338. package/dist/features/print/components/BoxLabelPrintView.js +66 -0
  339. package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
  340. package/dist/features/print/components/LabelProfilePicker.js +38 -0
  341. package/dist/features/print/components/labels.d.ts +117 -0
  342. package/dist/features/print/components/labels.js +258 -0
  343. package/dist/features/print/components/labels.style.css +46 -0
  344. package/dist/features/print/index.d.ts +6 -0
  345. package/dist/features/print/index.js +16 -0
  346. package/dist/features/products/columns/productTableColumns.js +5 -4
  347. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  348. package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
  349. package/dist/features/products/components/PrizeDrawCollage.js +1 -1
  350. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  351. package/dist/features/products/components/PrizeRevealModal.js +2 -2
  352. package/dist/features/products/components/ProductDetailPageView.js +18 -4
  353. package/dist/features/products/components/ProductForm.js +34 -23
  354. package/dist/features/products/components/ProductGrid.js +86 -62
  355. package/dist/features/products/constants/card-badges.d.ts +97 -0
  356. package/dist/features/products/constants/card-badges.js +100 -0
  357. package/dist/features/products/repository/products.repository.js +34 -1
  358. package/dist/features/products/schemas/firestore.d.ts +46 -3
  359. package/dist/features/products/schemas/firestore.js +21 -0
  360. package/dist/features/promotions/components/PromotionsView.js +1 -1
  361. package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
  362. package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
  363. package/dist/features/promotions/schemas/firestore.js +30 -3
  364. package/dist/features/promotions/schemas/index.d.ts +6 -6
  365. package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
  366. package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
  367. package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
  368. package/dist/features/protection-claims/schemas/firestore.js +130 -0
  369. package/dist/features/reviews/actions/review-actions.js +3 -2
  370. package/dist/features/reviews/components/ReviewModal.js +1 -1
  371. package/dist/features/reviews/components/ReviewsList.js +1 -1
  372. package/dist/features/reviews/schemas/firestore.d.ts +20 -1
  373. package/dist/features/scams/constants/scam-types.d.ts +2 -0
  374. package/dist/features/scams/constants/scam-types.js +18 -0
  375. package/dist/features/scams/schemas/report-form.d.ts +3 -3
  376. package/dist/features/scams/schemas/report-form.js +26 -1
  377. package/dist/features/search/components/Search.js +9 -9
  378. package/dist/features/search/components/SearchResultsClient.js +18 -3
  379. package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
  380. package/dist/features/search/components/SearchResultsPageView.js +2 -2
  381. package/dist/features/seller/actions/offer-actions.js +16 -1
  382. package/dist/features/seller/actions/seller-actions.js +14 -3
  383. package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
  384. package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
  385. package/dist/features/seller/components/PrintCenterView.js +41 -30
  386. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  387. package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
  388. package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
  389. package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
  390. package/dist/features/seller/components/SellerProductShell.js +123 -13
  391. package/dist/features/seller/components/SellerReviewsView.js +4 -2
  392. package/dist/features/seller/components/SellerSidebar.js +1 -1
  393. package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
  394. package/dist/features/seller/schemas/coupon-form.js +27 -0
  395. package/dist/features/seller/schemas/product-form.d.ts +3 -0
  396. package/dist/features/seller/schemas/product-form.js +5 -0
  397. package/dist/features/shell/FormShell.js +2 -2
  398. package/dist/features/shell/QuickFormDrawer.js +14 -0
  399. package/dist/features/shell/SectionForm.d.ts +19 -0
  400. package/dist/features/shell/SectionForm.js +133 -9
  401. package/dist/features/shell/SectionForm.style.css +54 -0
  402. package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
  403. package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
  404. package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
  405. package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
  406. package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
  407. package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
  408. package/dist/features/stores/components/StoreGuideHubView.js +1 -1
  409. package/dist/features/stores/components/StoreHeader.js +1 -1
  410. package/dist/features/support/schemas/firestore.d.ts +73 -2
  411. package/dist/features/support/schemas/firestore.js +59 -0
  412. package/dist/index.d.ts +16 -24
  413. package/dist/index.js +38 -47
  414. package/dist/next/ErrorBoundary.js +1 -1
  415. package/dist/next/routing/route-map.d.ts +24 -0
  416. package/dist/next/routing/route-map.js +40 -0
  417. package/dist/providers/payment-manual/index.d.ts +15 -1
  418. package/dist/providers/payment-manual/index.js +37 -0
  419. package/dist/providers/payment-phonepe/index.d.ts +14 -1
  420. package/dist/providers/payment-phonepe/index.js +36 -0
  421. package/dist/providers/payment-razorpay/index.d.ts +44 -1
  422. package/dist/providers/payment-razorpay/index.js +99 -0
  423. package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
  424. package/dist/providers/shipping-shiprocket/index.js +18 -0
  425. package/dist/schemas/registry.d.ts +44 -11
  426. package/dist/server-entry.d.ts +2 -0
  427. package/dist/server-entry.js +27 -0
  428. package/dist/server.d.ts +42 -0
  429. package/dist/server.js +93 -0
  430. package/dist/styles.css +418 -149
  431. package/dist/tailwind-utilities.css +1 -1
  432. package/dist/tokens/themes/default-dark.js +15 -12
  433. package/dist/tokens/themes/default-light.js +14 -11
  434. package/dist/tokens/tokens.css +106 -23
  435. package/dist/ui/DataTable.style.css +4 -4
  436. package/dist/ui/columns/cell-renderers.d.ts +20 -0
  437. package/dist/ui/columns/cell-renderers.js +26 -1
  438. package/dist/ui/columns/index.d.ts +1 -1
  439. package/dist/ui/columns/index.js +4 -1
  440. package/dist/ui/components/Badge.style.css +1 -1
  441. package/dist/ui/components/Breadcrumb.js +19 -1
  442. package/dist/ui/components/BulkActionBar.style.css +4 -4
  443. package/dist/ui/components/Button.style.css +1 -1
  444. package/dist/ui/components/Checkbox.style.css +1 -1
  445. package/dist/ui/components/FallbackShell.js +1 -1
  446. package/dist/ui/components/Form.d.ts +14 -1
  447. package/dist/ui/components/Form.js +2 -2
  448. package/dist/ui/components/FormField.js +18 -4
  449. package/dist/ui/components/FormField.style.css +43 -3
  450. package/dist/ui/components/GatedPrice.style.css +1 -1
  451. package/dist/ui/components/IconButton.style.css +1 -1
  452. package/dist/ui/components/Input.js +22 -1
  453. package/dist/ui/components/Input.style.css +38 -22
  454. package/dist/ui/components/ListingFilterDrawer.js +1 -1
  455. package/dist/ui/components/ListingToolbar.js +1 -1
  456. package/dist/ui/components/PaginatedSelect.js +0 -0
  457. package/dist/ui/components/Radio.style.css +1 -1
  458. package/dist/ui/components/Repeater.d.ts +53 -0
  459. package/dist/ui/components/Repeater.js +7 -0
  460. package/dist/ui/components/RichTextEditor.d.ts +20 -1
  461. package/dist/ui/components/RichTextEditor.js +23 -2
  462. package/dist/ui/components/Select.style.css +7 -21
  463. package/dist/ui/components/Semantic.js +27 -3
  464. package/dist/ui/components/TagInput.style.css +4 -9
  465. package/dist/ui/components/Textarea.style.css +4 -18
  466. package/dist/ui/components/Toggle.style.css +1 -1
  467. package/dist/ui/components/Typography.d.ts +3 -3
  468. package/dist/ui/components/Typography.js +15 -15
  469. package/dist/ui/components/ViewToggle.style.css +4 -4
  470. package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
  471. package/dist/ui/forms/AddAnotherToggle.js +56 -0
  472. package/dist/ui/forms/ColorPickerField.js +15 -2
  473. package/dist/ui/forms/FieldCheckbox.js +15 -2
  474. package/dist/ui/forms/FieldInput.d.ts +22 -1
  475. package/dist/ui/forms/FieldInput.js +19 -5
  476. package/dist/ui/forms/FieldLabel.d.ts +35 -0
  477. package/dist/ui/forms/FieldLabel.js +70 -0
  478. package/dist/ui/forms/FieldSelect.d.ts +4 -1
  479. package/dist/ui/forms/FieldSelect.js +27 -5
  480. package/dist/ui/forms/FieldTextarea.d.ts +4 -1
  481. package/dist/ui/forms/FieldTextarea.js +22 -5
  482. package/dist/ui/forms/FormShell.d.ts +17 -1
  483. package/dist/ui/forms/FormShell.js +36 -2
  484. package/dist/ui/forms/FormShell.style.css +41 -33
  485. package/dist/ui/forms/index.d.ts +5 -1
  486. package/dist/ui/forms/index.js +2 -0
  487. package/dist/ui/icons/icon-registry.d.ts +1 -0
  488. package/dist/ui/icons/icon-registry.js +17 -1
  489. package/dist/utils/id-generators.d.ts +80 -0
  490. package/dist/utils/id-generators.js +93 -0
  491. package/dist/utils/search-txt-builders.d.ts +12 -0
  492. package/dist/utils/search-txt-builders.js +17 -0
  493. package/package.json +1 -1
  494. package/scripts/seed-cli.mjs +106 -5
  495. package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
  496. package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
  497. package/dist/features/loyalty/api/balance/route.d.ts +0 -12
  498. package/dist/features/loyalty/api/balance/route.js +0 -41
  499. package/dist/features/loyalty/api/earn/route.d.ts +0 -12
  500. package/dist/features/loyalty/api/earn/route.js +0 -38
  501. package/dist/features/loyalty/api/history/route.d.ts +0 -12
  502. package/dist/features/loyalty/api/history/route.js +0 -58
  503. package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
  504. package/dist/features/loyalty/api/redeem/route.js +0 -38
  505. package/dist/features/loyalty/columns/index.d.ts +0 -17
  506. package/dist/features/loyalty/columns/index.js +0 -40
  507. package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
  508. package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
  509. package/dist/features/loyalty/components/index.d.ts +0 -1
  510. package/dist/features/loyalty/components/index.js +0 -1
  511. package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
  512. package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
  513. package/dist/features/loyalty/index.d.ts +0 -6
  514. package/dist/features/loyalty/index.js +0 -6
  515. package/dist/features/loyalty/manifest.d.ts +0 -2
  516. package/dist/features/loyalty/manifest.js +0 -16
  517. package/dist/features/loyalty/messages/en.json +0 -19
  518. package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
  519. package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
  520. package/dist/features/loyalty/schemas/index.d.ts +0 -85
  521. package/dist/features/loyalty/schemas/index.js +0 -40
  522. package/dist/features/loyalty/server.d.ts +0 -6
  523. package/dist/features/loyalty/server.js +0 -6
  524. package/dist/features/loyalty/types/index.d.ts +0 -31
  525. package/dist/features/loyalty/types/index.js +0 -1
  526. package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
  527. package/dist/features/loyalty/types/loyalty-config.js +0 -1
  528. package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
  529. package/dist/features/loyalty/types/loyalty-math.js +0 -27
  530. package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
  531. package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
@@ -12,9 +12,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
12
12
  *
13
13
  * Event handlers cannot be passed to Client Component props.
14
14
  *
15
- * at render. `ProductOwnerQuickActions` records that this exact mistake took
16
- * down every `/products/[slug]` page in production, with an opaque digest per
17
- * handler.
15
+ * at render. The now-deleted product-specific wrapper recorded that this exact
16
+ * mistake took down every `/products/[slug]` page in production, with an
17
+ * opaque digest per handler.
18
18
  *
19
19
  * That is why ten detail views were passing `editHref` and nothing else: the
20
20
  * bin and the clone are rendered behind `{showDelete && …}` / `{showClone && …}`,
@@ -23,20 +23,26 @@ import { jsx as _jsx } from "react/jsx-runtime";
23
23
  *
24
24
  * ## 🛑 Why ONE wrapper and not one per resource
25
25
  *
26
- * `ProductOwnerQuickActions` is resource-specific because products are the one
27
- * collection a SELLER can also own, so its endpoints live under
28
- * `SELLER_ENDPOINTS` and its clone has a bespoke redirect to the copy's editor.
29
- * Everything here is admin-owned and differs only by three strings, so eight
30
- * near-identical files would trip the Duplication Framework's Rule of Three
31
- * immediately. One table, one component.
26
+ * There used to be TWO wrappers — this one and `ProductOwnerQuickActions` —
27
+ * because a product is the only collection a SELLER can also own, so it needs
28
+ * `SELLER_ENDPOINTS`, a clone that lands on the copy's editor, and a
29
+ * post-delete target that is not an admin list.
30
+ *
31
+ * 🛑 THOSE THREE DIFFERENCES ARE NOW ROWS IN THE TABLE, NOT A SECOND FILE.
32
+ * Every one of them is real and every one survives — but none needed a
33
+ * separate component to express, and having two meant two places for the box,
34
+ * the placement and the visibility rule to drift. That drift is exactly what
35
+ * shipped: five card types pinned the toolbar to four different corners, one
36
+ * of them on top of its own CTA, and the category hero rendered it over the
37
+ * `<h1>`. One table, one component, one position everywhere.
32
38
  *
33
39
  * ## Why the redirect lands on the ADMIN list
34
40
  *
35
41
  * You deleted the record from its own public page, so that page is now a 404 —
36
42
  * staying is not an option and the public index tells you nothing about whether
37
43
  * the delete worked. The admin list is where the absence is verifiable.
38
- * `ProductOwnerQuickActions` differs deliberately: a seller may delete a
39
- * product and has no admin list to land on.
44
+ * PRODUCT differs deliberately, through its own `afterDelete`: a seller may
45
+ * delete a product and has no admin list to land on.
40
46
  *
41
47
  * @tag domain:admin
42
48
  * @tag layer:components
@@ -44,7 +50,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
44
50
  */
45
51
  import { useCallback } from "react";
46
52
  import { OwnerQuickActions } from "./OwnerQuickActions.js";
47
- import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
53
+ import { ADMIN_ENDPOINTS, SELLER_ENDPOINTS } from "../../../constants/api-endpoints.js";
48
54
  import { ROUTES } from "../../../next/routing/route-map.js";
49
55
  const WIRING = {
50
56
  CATEGORY: {
@@ -97,6 +103,18 @@ const WIRING = {
97
103
  editHref: (id) => String(ROUTES.ADMIN.CATEGORIES_EDIT(id)),
98
104
  afterDelete: String(ROUTES.ADMIN.CATEGORIES),
99
105
  },
106
+ PRODUCT: {
107
+ endpoint: SELLER_ENDPOINTS.PRODUCT_BY_ID,
108
+ editHref: (id) => String(ROUTES.STORE.PRODUCTS_EDIT(id)),
109
+ afterDelete: String(ROUTES.STORE.PRODUCTS),
110
+ clone: SELLER_ENDPOINTS.PRODUCT_DUPLICATE,
111
+ afterClone: (newId) => String(ROUTES.STORE.PRODUCTS_EDIT(newId)),
112
+ },
113
+ FAQ: {
114
+ endpoint: ADMIN_ENDPOINTS.FAQ_BY_ID,
115
+ editHref: (id) => String(ROUTES.ADMIN.FAQS_EDIT(id)),
116
+ afterDelete: String(ROUTES.ADMIN.FAQS),
117
+ },
100
118
  SUBLISTING: {
101
119
  endpoint: ADMIN_ENDPOINTS.SUBLISTING_CATEGORY_BY_ID,
102
120
  editHref: (id) => String(ROUTES.ADMIN.SUBLISTING_CATEGORIES_EDIT(id)),
@@ -112,7 +130,7 @@ export function RecordOwnerQuickActions({ resource, recordId, recordLabel, owner
112
130
  * navigates away — so a swallowed failure is indistinguishable from "it
113
131
  * worked but the page did not move", and the obvious user response is to
114
132
  * press the button again. Returning early on `!res.ok` is the bug
115
- * `ProductOwnerQuickActions` documents having had.
133
+ * the deleted product wrapper documented having had.
116
134
  */
117
135
  const handleDelete = useCallback(async () => {
118
136
  const res = await fetch(wiring.endpoint(recordId), { method: "DELETE" });
@@ -124,5 +142,34 @@ export function RecordOwnerQuickActions({ resource, recordId, recordLabel, owner
124
142
  window.location.assign(wiring.afterDelete);
125
143
  }
126
144
  }, [wiring, recordId]);
127
- return (_jsx(OwnerQuickActions, { resource: resource, placement: placement, onMedia: onMedia, className: className, recordLabel: recordLabel, ownerId: ownerId, storeId: storeId, editHref: wiring.editHref(recordId), onDelete: handleDelete }));
145
+ /*
146
+ * Clone, for the resources whose table entry declares one.
147
+ *
148
+ * 🛑 Built UNCONDITIONALLY — the hook cannot be called behind an `if` — but
149
+ * passed to `OwnerQuickActions` only when `wiring.clone` exists, which is
150
+ * what makes the button absent rather than present-and-broken for the
151
+ * resources that cannot be copied.
152
+ *
153
+ * 🛑 THROWS on failure, like `handleDelete` above and for the same reason:
154
+ * `OwnerQuickActions` catches and toasts, so returning quietly is
155
+ * indistinguishable from "it worked but the page did not move", and the
156
+ * obvious user response is to press it again. The previous product-specific
157
+ * implementation returned early after showing its own toast, which is the
158
+ * double-toast path this avoids.
159
+ */
160
+ const handleClone = useCallback(async () => {
161
+ if (!wiring.clone)
162
+ return;
163
+ const res = await fetch(wiring.clone(recordId), { method: "POST" });
164
+ if (!res.ok) {
165
+ const body = (await res.json().catch(() => null));
166
+ throw Object.assign(new Error("Clone failed"), { code: body?.code });
167
+ }
168
+ const json = (await res.json().catch(() => null));
169
+ const newId = json?.data?.id;
170
+ if (newId && wiring.afterClone && typeof window !== "undefined") {
171
+ window.location.assign(wiring.afterClone(newId));
172
+ }
173
+ }, [wiring, recordId]);
174
+ return (_jsx(OwnerQuickActions, { resource: resource, placement: placement, onMedia: onMedia, className: className, recordLabel: recordLabel, ownerId: ownerId, storeId: storeId, editHref: wiring.editHref(recordId), onDelete: handleDelete, onClone: wiring.clone ? handleClone : undefined }));
128
175
  }
@@ -9,6 +9,40 @@ export interface AdminStatCardProps {
9
9
  /** Named preset or raw CSS gradient string */
10
10
  gradient?: keyof typeof GRADIENTS | string;
11
11
  className?: string;
12
+ /**
13
+ * Change against the previous comparable period, as a SIGNED percentage.
14
+ * `12.4` renders "▲ 12.4%", `-3` renders "▼ 3%", `0` renders "no change".
15
+ *
16
+ * 🛑 OMIT IT WHEN THERE IS NO COMPARISON, and never pass `0` to mean "we
17
+ * did not measure". A number here is a factual claim about a previous
18
+ * period; `0` claims the figure held steady, which is a different and
19
+ * stronger statement than silence. The whole reason a trend is worth adding
20
+ * is that it is trusted, and a fabricated flat line is the cheapest way to
21
+ * lose that.
22
+ */
23
+ trendPercent?: number;
24
+ /**
25
+ * What `trendPercent` is measured against — "vs last week", "vs yesterday".
26
+ *
27
+ * 🛑 REQUIRED WHENEVER `trendPercent` IS PASSED, enforced by the discriminated
28
+ * shape below rather than by a comment. "▲ 12.4%" alone is unreadable: up
29
+ * on what? The same number is excellent against last month and alarming
30
+ * against last hour.
31
+ */
32
+ trendLabel?: string;
33
+ /**
34
+ * 🛑 DOES A HIGHER NUMBER MEAN BETTER? Defaults to `true`, and the exception
35
+ * is the reason this prop exists: refunds, cancellations, failed payments
36
+ * and error counts all go UP when things go WRONG. Colouring those green
37
+ * because the arrow points up is a dashboard actively misinforming the
38
+ * person reading it.
39
+ */
40
+ higherIsBetter?: boolean;
41
+ /**
42
+ * Recent values, oldest first, for the sparkline. Needs at least two points
43
+ * to draw a line; fewer renders nothing rather than a dot or a flat stub.
44
+ */
45
+ series?: readonly number[];
12
46
  }
13
- export declare function AdminStatCard({ label, value, sub, icon, gradient, className, }: AdminStatCardProps): React.JSX.Element;
47
+ export declare function AdminStatCard({ label, value, sub, icon, gradient, className, trendPercent, trendLabel, higherIsBetter, series, }: AdminStatCardProps): React.JSX.Element;
14
48
  export {};
@@ -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
  *