@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
@@ -0,0 +1,122 @@
1
+ /**
2
+ * How much of an order can still be refunded, and what is withheld.
3
+ *
4
+ * ONE owner for two numbers that were previously computed four different ways
5
+ * and disagreed with each other and with the money actually moved.
6
+ *
7
+ * WHY:
8
+ *
9
+ * · **D1** — the over-refund guard compared `amount > order.totalPrice`, i.e.
10
+ * against the ORDER TOTAL rather than the remaining balance, while its own
11
+ * docstring promised "≤ remaining refundable amount". So ₹500 and then
12
+ * another ₹500 both passed on a ₹600 order: **₹1,000 refunded, two real
13
+ * gateway calls, both successful.**
14
+ *
15
+ * · **D3** — `isFull` was `amount >= order.totalPrice`, so a split refund
16
+ * (₹300 + ₹200 of ₹500) never reached `status: "refunded"` and the order
17
+ * stayed fully refundable forever.
18
+ *
19
+ * · **D32** — the platform fee is non-refundable by policy, and the only code
20
+ * implementing that withheld ~10x too much (see `platformFeeWithheld`).
21
+ */
22
+ import { roundRupees } from "../../../utils/number.formatter.js";
23
+ /**
24
+ * Half a paisa. The tolerance exists because these are IEEE-754 sums of 2dp
25
+ * components: `0.1 + 0.2 > 0.3` is TRUE in floating point, so an exact
26
+ * comparison would reject a legitimate final refund that exactly exhausts the
27
+ * balance. Half a paisa is below the smallest representable money unit, so it
28
+ * cannot admit a real over-refund.
29
+ */
30
+ export const MONEY_EPSILON = 0.005;
31
+ /**
32
+ * The platform fee actually withheld on a refund: the amount CHARGED, never a
33
+ * recomputed percentage.
34
+ *
35
+ * 🛑 This replaces the single worst money defect found in the audit (D32).
36
+ * `previewCancellationRefund` did:
37
+ *
38
+ * const effectiveRate = platformFeePercent * (1 + gstPercent / 100);
39
+ * const feeDeducted = (grossRefund * effectiveRate) / 100;
40
+ *
41
+ * — a PERCENTAGE OF THE REFUND, which ignores `commissions.platformFeeMax`
42
+ * (default **₹10**) entirely and ignores `order.platformFee`, the amount that
43
+ * was actually collected and is stored on the order. On a ₹5,000 order at 2% +
44
+ * 18% GST it deducted **₹118** from a buyer who had paid **₹11.80** — keeping
45
+ * roughly ₹106 of their goods money and labelling it a platform fee. The
46
+ * overcharge grows with order value, so it is largest exactly where it is most
47
+ * noticeable.
48
+ *
49
+ * `platformFeeGst` is read from the order and only DERIVED for rows written
50
+ * before that field existed (2026-10-21). The derivation takes `gstPercent`
51
+ * from the caller rather than reading settings itself, so this stays pure and
52
+ * so a caller cannot accidentally reach for today's rate when the order is
53
+ * from last year — which is the mistake the whole function exists to undo.
54
+ */
55
+ export function platformFeeWithheld(order,
56
+ /** Only consulted for legacy orders with no stored `platformFeeGst`. */
57
+ legacyGstPercent) {
58
+ const fee = order.platformFee ?? 0;
59
+ if (fee <= 0)
60
+ return 0;
61
+ const gst = order.platformFeeGst ??
62
+ (typeof legacyGstPercent === "number" ? roundRupees((fee * legacyGstPercent) / 100) : 0);
63
+ return roundRupees(fee + gst);
64
+ }
65
+ /**
66
+ * The ceiling every refund is measured against.
67
+ *
68
+ * 🛑 `totalPrice − platformFeeWithheld`, NOT `totalPrice`. The platform fee is
69
+ * non-refundable in every scenario — a decided policy, and one the product
70
+ * already states: `REFUND_COPY.request.acknowledgments[2]` tells the buyer
71
+ * "platform fees may be non-recoverable".
72
+ *
73
+ * This correction matters twice over. Phase 1's cumulative cap has to compare
74
+ * against THIS, or a refund can exceed what the buyer is owed; and `isFull`
75
+ * has to compare against THIS, or the largest possible refund is strictly less
76
+ * than `totalPrice` and **an order can never reach `status: "refunded"`** —
77
+ * which is what the old `amount >= totalPrice` test guaranteed.
78
+ */
79
+ export function refundableBase(order, legacyGstPercent) {
80
+ return roundRupees(Math.max(0, order.totalPrice - platformFeeWithheld(order, legacyGstPercent)));
81
+ }
82
+ /**
83
+ * Sum of refunds that have COMMITTED money, i.e. everything not `failed`.
84
+ *
85
+ * 🛑 A `reserved` entry counts. The two-phase write reserves before calling the
86
+ * provider and settles after, so between those two points the money may well
87
+ * have left — excluding reserved entries would let a concurrent request refund
88
+ * against a balance that is already spoken for, which is the TOCTOU the
89
+ * reservation exists to close. A `failed` entry releases its reservation by
90
+ * being skipped here, which is why no explicit release step is needed.
91
+ *
92
+ * `status` is optional on `OrderRefundEvent`: rows written before the
93
+ * two-phase scheme have none, and those are all committed refunds, so a
94
+ * missing status must count.
95
+ */
96
+ export function committedRefundTotal(order) {
97
+ return roundRupees((order.refunds ?? [])
98
+ .filter((r) => r.status !== "failed")
99
+ .reduce((sum, r) => sum + (r.amount ?? 0), 0));
100
+ }
101
+ /** Everything a caller needs to decide and to EXPLAIN a refund decision. */
102
+ export function refundCapacity(order, legacyGstPercent) {
103
+ const base = refundableBase(order, legacyGstPercent);
104
+ const committed = committedRefundTotal(order);
105
+ return {
106
+ base,
107
+ committed,
108
+ remaining: roundRupees(Math.max(0, base - committed)),
109
+ withheld: platformFeeWithheld(order, legacyGstPercent),
110
+ };
111
+ }
112
+ /**
113
+ * Would this refund exhaust the refundable base?
114
+ *
115
+ * Measured against `base`, not `totalPrice` — see `refundableBase`. The
116
+ * epsilon makes an exactly-exhausting refund count as full rather than
117
+ * leaving a sub-paisa residue that keeps the order refundable forever.
118
+ */
119
+ export function wouldBeFullRefund(order, amount, legacyGstPercent) {
120
+ const { base, committed } = refundCapacity(order, legacyGstPercent);
121
+ return committed + amount >= base - MONEY_EPSILON;
122
+ }
@@ -55,6 +55,19 @@ export interface BuyNowAvailabilityInput {
55
55
  currentBid: number | null | undefined;
56
56
  isEnded: boolean;
57
57
  isSold?: boolean;
58
+ /**
59
+ * The seller's floor for the item (D53). Buy-Now below it is refused.
60
+ *
61
+ * 🛑 OPTIONAL so every existing call site keeps compiling — but a caller
62
+ * that has the product and omits it silently reopens the hole, which is the
63
+ * weakness of this shape. The two server call sites that decide money
64
+ * (`placeBuyNow`, and the capability gate it consults) both pass it; a
65
+ * display-only caller that omits it renders a button the server will refuse,
66
+ * which is a worse UX than a hidden button but is not an exploit.
67
+ *
68
+ * Absent / 0 / non-finite means NO reserve — the common case.
69
+ */
70
+ reservePrice?: number | null;
58
71
  }
59
72
  /**
60
73
  * The single definition of "can this auction be bought outright right now".
@@ -75,7 +88,7 @@ export interface BuyNowAvailabilityInput {
75
88
  * `isSold` is optional because client callers rendering a live auction page
76
89
  * already know it isn't sold; server callers should always pass it.
77
90
  */
78
- export declare function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, }: BuyNowAvailabilityInput): boolean;
91
+ export declare function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, reservePrice, }: BuyNowAvailabilityInput): boolean;
79
92
  /**
80
93
  * Preset step multipliers offered by the bid form, as multiples of the
81
94
  * effective minimum increment. With a ₹100 increment this renders
@@ -89,12 +89,41 @@ export function resolveMinBid(currentBidAmount, tiers, override, opts) {
89
89
  * `isSold` is optional because client callers rendering a live auction page
90
90
  * already know it isn't sold; server callers should always pass it.
91
91
  */
92
- export function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, }) {
92
+ export function isBuyNowAvailable({ buyNowPrice, currentBid, isEnded, isSold, reservePrice, }) {
93
93
  if (isEnded || isSold === true)
94
94
  return false;
95
95
  if (typeof buyNowPrice !== "number" || !Number.isFinite(buyNowPrice) || buyNowPrice <= 0) {
96
96
  return false;
97
97
  }
98
+ /*
99
+ * ── D53: BUY-NOW MUST CLEAR THE RESERVE ─────────────────────────────────
100
+ *
101
+ * 🛑 This function consulted end state, sold state and the standing bid —
102
+ * and never `reservePrice`, which was enforced in ONE place:
103
+ * `auctionSettlement`, i.e. only on the competitive path. So a Buy-Now
104
+ * priced below the reserve completed, and the seller was bound to a price
105
+ * the reserve existed to refuse.
106
+ *
107
+ * The reserve is the seller's floor for the ITEM, not for a particular sale
108
+ * mechanism. A buyout that undercuts it defeats it entirely — and does so on
109
+ * the path with no competing bidders to push the price up, which is the one
110
+ * where the floor matters most.
111
+ *
112
+ * 🛑 Checked here rather than at the call site, deliberately: this is the
113
+ * gate `placeBuyNow` already consults AND the predicate the UI uses to
114
+ * decide whether to render the button at all, so one change closes the
115
+ * exploit and stops offering a control that must then refuse.
116
+ *
117
+ * Absent/zero/non-finite reserve means NO reserve — which is the common case
118
+ * and must stay permissive, or every reserve-less auction would lose its
119
+ * Buy-Now.
120
+ */
121
+ if (typeof reservePrice === "number" &&
122
+ Number.isFinite(reservePrice) &&
123
+ reservePrice > 0 &&
124
+ buyNowPrice < reservePrice) {
125
+ return false;
126
+ }
98
127
  return buyNowPrice > (currentBid ?? 0);
99
128
  }
100
129
  /**
@@ -9,26 +9,47 @@ export declare const brandInputSchema: z.ZodObject<{
9
9
  founded: z.ZodOptional<z.ZodNumber>;
10
10
  isActive: z.ZodDefault<z.ZodBoolean>;
11
11
  displayOrder: z.ZodDefault<z.ZodNumber>;
12
+ highlights: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
13
+ faqs: z.ZodOptional<z.ZodArray<z.ZodObject<{
14
+ question: z.ZodString;
15
+ answer: z.ZodString;
16
+ }, "strip", z.ZodTypeAny, {
17
+ question: string;
18
+ answer: string;
19
+ }, {
20
+ question: string;
21
+ answer: string;
22
+ }>, "many">>;
12
23
  }, "strip", z.ZodTypeAny, {
13
24
  name: string;
14
25
  slug: string;
15
26
  isActive: boolean;
16
27
  displayOrder: number;
17
28
  country?: string | undefined;
29
+ faqs?: {
30
+ question: string;
31
+ answer: string;
32
+ }[] | undefined;
18
33
  description?: string | undefined;
19
34
  logoURL?: string | undefined;
20
35
  website?: string | undefined;
21
36
  founded?: number | undefined;
37
+ highlights?: string[] | undefined;
22
38
  }, {
23
39
  name: string;
24
40
  slug: string;
25
41
  country?: string | undefined;
42
+ faqs?: {
43
+ question: string;
44
+ answer: string;
45
+ }[] | undefined;
26
46
  description?: string | undefined;
27
47
  isActive?: boolean | undefined;
28
48
  displayOrder?: number | undefined;
29
49
  logoURL?: string | undefined;
30
50
  website?: string | undefined;
31
51
  founded?: number | undefined;
52
+ highlights?: string[] | undefined;
32
53
  }>;
33
54
  export declare const brandUpdateSchema: z.ZodObject<Omit<{
34
55
  name: z.ZodOptional<z.ZodString>;
@@ -40,24 +61,45 @@ export declare const brandUpdateSchema: z.ZodObject<Omit<{
40
61
  founded: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
41
62
  isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
42
63
  displayOrder: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
64
+ highlights: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
65
+ faqs: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodObject<{
66
+ question: z.ZodString;
67
+ answer: z.ZodString;
68
+ }, "strip", z.ZodTypeAny, {
69
+ question: string;
70
+ answer: string;
71
+ }, {
72
+ question: string;
73
+ answer: string;
74
+ }>, "many">>>;
43
75
  }, "slug">, "strip", z.ZodTypeAny, {
44
76
  country?: string | undefined;
45
77
  name?: string | undefined;
78
+ faqs?: {
79
+ question: string;
80
+ answer: string;
81
+ }[] | undefined;
46
82
  description?: string | undefined;
47
83
  isActive?: boolean | undefined;
48
84
  displayOrder?: number | undefined;
49
85
  logoURL?: string | undefined;
50
86
  website?: string | undefined;
51
87
  founded?: number | undefined;
88
+ highlights?: string[] | undefined;
52
89
  }, {
53
90
  country?: string | undefined;
54
91
  name?: string | undefined;
92
+ faqs?: {
93
+ question: string;
94
+ answer: string;
95
+ }[] | undefined;
55
96
  description?: string | undefined;
56
97
  isActive?: boolean | undefined;
57
98
  displayOrder?: number | undefined;
58
99
  logoURL?: string | undefined;
59
100
  website?: string | undefined;
60
101
  founded?: number | undefined;
102
+ highlights?: string[] | undefined;
61
103
  }>;
62
104
  export type BrandInput = z.infer<typeof brandInputSchema>;
63
105
  export type BrandUpdate = z.infer<typeof brandUpdateSchema>;
@@ -12,5 +12,23 @@ export const brandInputSchema = z.object({
12
12
  founded: z.number().int().min(1800).max(new Date().getFullYear()).optional(),
13
13
  isActive: z.boolean().default(true),
14
14
  displayOrder: z.number().int().min(0).default(0),
15
+ /*
16
+ * Editorial content, rendered by `CategoryHighlightsAndFaqSection` on the
17
+ * brand page and previously unauthorable — the form did not carry them, so
18
+ * this schema did not need them either.
19
+ *
20
+ * 🛑 CAPPED, both of them. These render in a fixed block above the fold on
21
+ * a public page, and an unbounded list is how a form becomes a way to break
22
+ * the page it feeds. The numbers match what the category editor already
23
+ * enforces for the same two fields on the same renderer.
24
+ */
25
+ highlights: z.array(z.string().min(1).max(200)).max(8).optional(),
26
+ faqs: z
27
+ .array(z.object({
28
+ question: z.string().min(1).max(300),
29
+ answer: z.string().min(1).max(2000),
30
+ }))
31
+ .max(8)
32
+ .optional(),
15
33
  });
16
34
  export const brandUpdateSchema = brandInputSchema.partial().omit({ slug: true });
@@ -40,6 +40,28 @@ export declare const REFUND_COPY: {
40
40
  readonly siblingPayments: {
41
41
  readonly heading: (count: number) => string;
42
42
  };
43
+ /**
44
+ * What to tell the buyer about the money, immediately after they cancel.
45
+ *
46
+ * 🛑 Here rather than inline in the route, because there are two cancel
47
+ * endpoints plus the buyer's cancel page, and three copies of "we owe you
48
+ * ₹X" is how a refund timeline comes to be published three different ways
49
+ * (D20/D31). It is a function of the OUTCOME, so the sentence cannot
50
+ * disagree with what actually happened — which is the specific failure D14
51
+ * was: the page said one thing and the money did another.
52
+ *
53
+ * 🛑 It deliberately quotes **no timeline**. "5–7 business days" is published
54
+ * in three contradicting places already and reconciling them is Phase 9; a
55
+ * fourth statement of it here would be a new owner of a number that needs
56
+ * fewer, not more.
57
+ */
58
+ readonly cancellation: {
59
+ readonly message: (outcome: {
60
+ moved: "none" | "gateway" | "owed";
61
+ amount: number;
62
+ why?: string;
63
+ }) => string;
64
+ };
43
65
  readonly shipping: {
44
66
  readonly noOptions: "No shipping options available for this item.";
45
67
  readonly freeLabel: "Free";
@@ -44,6 +44,40 @@ export const REFUND_COPY = {
44
44
  siblingPayments: {
45
45
  heading: (count) => `Other orders from this payment (${count})`,
46
46
  },
47
+ /**
48
+ * What to tell the buyer about the money, immediately after they cancel.
49
+ *
50
+ * 🛑 Here rather than inline in the route, because there are two cancel
51
+ * endpoints plus the buyer's cancel page, and three copies of "we owe you
52
+ * ₹X" is how a refund timeline comes to be published three different ways
53
+ * (D20/D31). It is a function of the OUTCOME, so the sentence cannot
54
+ * disagree with what actually happened — which is the specific failure D14
55
+ * was: the page said one thing and the money did another.
56
+ *
57
+ * 🛑 It deliberately quotes **no timeline**. "5–7 business days" is published
58
+ * in three contradicting places already and reconciling them is Phase 9; a
59
+ * fourth statement of it here would be a new owner of a number that needs
60
+ * fewer, not more.
61
+ */
62
+ cancellation: {
63
+ message: (outcome) => {
64
+ if (outcome.moved === "gateway") {
65
+ return `Order cancelled. A refund of ₹${outcome.amount.toFixed(2)} has been sent back to your original payment method.`;
66
+ }
67
+ if (outcome.moved === "owed") {
68
+ return `Order cancelled. We owe you ₹${outcome.amount.toFixed(2)} — it needs to be sent manually, and our team has been notified.`;
69
+ }
70
+ /*
71
+ * `none` splits two very different situations and must not blur them: an
72
+ * unpaid order has nothing to refund, while an already-refunded one has
73
+ * had its money returned. Telling the second buyer "no payment was
74
+ * taken" would read as a denial that they ever paid.
75
+ */
76
+ return outcome.why === "nothing-refundable"
77
+ ? "Order cancelled. Its payment had already been refunded in full, so nothing further is owed."
78
+ : "Order cancelled. No payment had been taken, so there is nothing to refund.";
79
+ },
80
+ },
47
81
  shipping: {
48
82
  noOptions: "No shipping options available for this item.",
49
83
  freeLabel: "Free",
@@ -0,0 +1,198 @@
1
+ import { MM_PER_INCH, type PrintPageSize } from "../sticker-trace/export/page-sizes";
2
+ /**
3
+ * CODE128 module width at which essentially every handheld scanner reads
4
+ * reliably, including cheap CCD units at an angle. 0.25 mm ≈ 10 mil.
5
+ */
6
+ export declare const SAFE_MODULE_MM = 0.25;
7
+ /**
8
+ * The floor. Below this a symbol is a lottery: good scanners manage it under
9
+ * good light at a good angle, and a receive station is none of those things.
10
+ */
11
+ export declare const MIN_SCANNABLE_MODULE_MM = 0.19;
12
+ /**
13
+ * How wide a CODE128-B symbol must be, in mm, INCLUDING its quiet zones.
14
+ *
15
+ * Structure, from the symbology itself rather than from a chart:
16
+ * start 11 modules
17
+ * each data character 11 modules
18
+ * check 11 modules
19
+ * stop 13 modules
20
+ * quiet 10 modules each side (the spec minimum)
21
+ *
22
+ * so `11 x (n + 2) + 13 + 20` modules for `n` data characters.
23
+ *
24
+ * 🛑 THE QUIET ZONE IS PART OF THE SYMBOL, not padding around it. A label sized
25
+ * to the bars alone prints a barcode whose first bar touches the die-cut edge,
26
+ * and a scanner has nothing to lock onto — it reads as a smudged or damaged
27
+ * label rather than as a layout mistake.
28
+ *
29
+ * 🛑 This also CORRECTS a number already written down elsewhere. The
30
+ * barcode-vs-SKU header in `id-generators.ts` derives "a ~42 mm minimum" from
31
+ * the 12-character `LIR-XXXXXXXX` form; that figure omits the quiet zones.
32
+ * 11 x 14 + 13 = 167 modules of bars, but 187 with them, which is 46.75 mm at
33
+ * `SAFE_MODULE_MM` — not 42. The smaller figure is the dangerous direction to
34
+ * be wrong in, because it says yes to stock that cannot carry the symbol.
35
+ */
36
+ export declare function code128WidthMm(characters: number, moduleMm?: number): number;
37
+ /**
38
+ * An A4 sheet of die-cut labels: where the first one starts and how far apart
39
+ * they are. `null` on a thermal profile, where the page IS the label.
40
+ *
41
+ * 🛑 PITCH, NOT GAP. Pitch is centre-to-centre and is what positions label
42
+ * number 40; a gap has to be added to a width to get there, and any rounding in
43
+ * the width then accumulates down the column. Avery publish pitch for the same
44
+ * reason.
45
+ */
46
+ export interface SheetLayout {
47
+ readonly columns: number;
48
+ readonly rows: number;
49
+ /** Distance from the page's left edge to the first label's left edge. */
50
+ readonly marginLeftMm: number;
51
+ /** Distance from the page's top edge to the first label's top edge. */
52
+ readonly marginTopMm: number;
53
+ /** Centre-to-centre horizontal spacing. */
54
+ readonly pitchXMm: number;
55
+ /** Centre-to-centre vertical spacing. */
56
+ readonly pitchYMm: number;
57
+ }
58
+ export type LabelProfileId = "thermal-50x25" | "thermal-38x25" | "thermal-100x50" | "a4-65up" | "a4-24up" | "a4-8up";
59
+ export interface LabelProfile {
60
+ readonly id: LabelProfileId;
61
+ readonly label: string;
62
+ /** One label's die-cut size. */
63
+ readonly widthMm: number;
64
+ readonly heightMm: number;
65
+ /** Printable inset inside the label. */
66
+ readonly paddingMm: number;
67
+ /** The page the printer is fed. For thermal, the page is one label. */
68
+ readonly page: {
69
+ readonly widthMm: number;
70
+ readonly heightMm: number;
71
+ };
72
+ /** Null for thermal — a roll has no grid. */
73
+ readonly sheet: SheetLayout | null;
74
+ readonly isThermal: boolean;
75
+ }
76
+ export declare const LABEL_PROFILES: Readonly<Record<LabelProfileId, LabelProfile>>;
77
+ /** Thermal first — it is what the warehouse actually uses day to day. */
78
+ export declare const LABEL_PROFILE_IDS: readonly LabelProfileId[];
79
+ export declare function labelProfileById(id: LabelProfileId): LabelProfile;
80
+ /**
81
+ * The real print geometry, as CSS.
82
+ *
83
+ * 🛑 `@page { size: <w>mm <h>mm; margin: 0 }` IS THE WHOLE POINT OF THIS
84
+ * MODULE. Without it the browser prints the user's default paper and the label
85
+ * is a small rectangle somewhere on an A4 sheet. `margin: 0` is not tidiness:
86
+ * a thermal page IS one label, so any page margin shrinks the label and the
87
+ * content no longer lines up with the die-cut.
88
+ *
89
+ * 🛑 `@page` IS DOCUMENT-GLOBAL AND CANNOT BE SCOPED. Two components each
90
+ * emitting one does not give two geometries — the later in document order
91
+ * wins, silently. So exactly ONE owner may call this per printable view, and
92
+ * that owner is the thing that knows which profile the user picked.
93
+ *
94
+ * The screen preview is deliberately NOT styled from here. A label shown at its
95
+ * true physical size on a 27-inch monitor is a postage stamp nobody can read,
96
+ * and mm in a browser depend on a reported DPI that is usually a guess.
97
+ */
98
+ export declare function labelPageCss(profile: LabelProfile): string;
99
+ /**
100
+ * The `@page` rule for an ordinary printed DOCUMENT — a packing slip, a box
101
+ * contents sheet — rather than a label.
102
+ *
103
+ * 🛑 Lives here rather than in the view for one reason: `audit-label-profiles`
104
+ * R3 allows exactly one module to author `@page`, because the rule is
105
+ * document-global and a second author does not add a geometry — the later one
106
+ * silently wins. A view that needed A4 would otherwise have to write its own
107
+ * and defeat that guarantee.
108
+ *
109
+ * 🛑 It takes explicit mm, never `size: A4`. A named paper size is the original
110
+ * bug this module exists to fix: the browser prints its default page, which is
111
+ * A4 for some users and Letter for others, and the layout silently differs by
112
+ * 18 mm of height between them.
113
+ */
114
+ export declare function documentPageCss(page?: {
115
+ widthMm: number;
116
+ heightMm: number;
117
+ }, marginMm?: number): string;
118
+ export interface LabelFitReport {
119
+ readonly fits: boolean;
120
+ /** Width the symbol needs at `SAFE_MODULE_MM`, quiet zones included. */
121
+ readonly requiredMm: number;
122
+ /** Width the label actually offers once padding is removed. */
123
+ readonly availableMm: number;
124
+ /**
125
+ * The module width this stock would force. Compare against
126
+ * `MIN_SCANNABLE_MODULE_MM` — below it the symbol is unreliable rather than
127
+ * merely small.
128
+ */
129
+ readonly impliedModuleMm: number;
130
+ /** Plain-language reason, safe to show an operator verbatim. */
131
+ readonly reason: string;
132
+ }
133
+ /**
134
+ * Does a barcode of `characters` length fit this label — and if not, why.
135
+ *
136
+ * 🛑 THIS REPORTS. IT NEVER SCALES, AND THAT IS THE ENTIRE DESIGN.
137
+ *
138
+ * Scaling a barcode to fit is the obvious, wrong answer, and it fails in the
139
+ * worst possible way: the label looks perfect. The bars are narrower, the
140
+ * proportions are right, a human sees a barcode — and the module width has
141
+ * dropped below what a scanner can resolve, so it does not read. The failure
142
+ * surfaces weeks later at a receive station as "the scanner is broken", and the
143
+ * labels have all been printed and stuck to things by then.
144
+ *
145
+ * A refusal to print is noticed in the second it happens, by the person who can
146
+ * still choose different stock. That is the only trade this function makes.
147
+ *
148
+ * 🛑 COMPUTED AGAINST THE PROFILES ABOVE, NOT ASSERTED. A 12-character
149
+ * `LIR-XXXXXXXX` symbol needs 187 modules = 46.75 mm at `SAFE_MODULE_MM`, and
150
+ * the six stocks answer differently enough that a single "does it fit" boolean
151
+ * would have been a lie:
152
+ *
153
+ * thermal-100x50 97.0 mm 0.519 mm/module comfortable
154
+ * a4-8up 95.1 mm 0.509 mm/module comfortable
155
+ * a4-24up 60.5 mm 0.324 mm/module comfortable
156
+ * thermal-50x25 47.0 mm 0.251 mm/module fits by 0.25 mm — no slack
157
+ * a4-65up 36.1 mm 0.193 mm/module over the floor by 0.003 mm
158
+ * thermal-38x25 35.0 mm 0.187 mm/module BELOW the floor
159
+ *
160
+ * 🛑 An earlier draft of this comment claimed `a4-65up` "cannot carry" the
161
+ * symbol. It can, barely — 0.193 against a 0.19 floor — and overstating it
162
+ * would have had someone discard working stock. The two genuinely notable rows
163
+ * are the last two, and they are notable for opposite reasons: 65-up is
164
+ * technically above the floor with no margin whatsoever for a worn printhead,
165
+ * and 38x25 is the one stock that simply cannot do it.
166
+ *
167
+ * All six stay in the list. 38x25 is fine for a shorter code or a text-only
168
+ * label, and silently dropping stock the warehouse already owns teaches nobody
169
+ * why it was dropped.
170
+ */
171
+ export declare function labelFitsProfile(profile: LabelProfile, characters: number): LabelFitReport;
172
+ /**
173
+ * Where label `index` sits on a sheet, in mm from the page's top-left.
174
+ *
175
+ * Returns null past the last position on the sheet, which the caller must read
176
+ * as "start a new page" rather than as an error — a 70-label job on 65-up stock
177
+ * is two pages, not a failure.
178
+ */
179
+ export declare function sheetPositionMm(sheet: SheetLayout, index: number): {
180
+ leftMm: number;
181
+ topMm: number;
182
+ } | null;
183
+ /**
184
+ * Sanity check that a sheet's own grid fits on its own page.
185
+ *
186
+ * 🛑 Exists because the Avery figures above are transcribed, and a transposed
187
+ * digit in a pitch is invisible until a batch has been printed. The last
188
+ * label's far edge is `margin + (n - 1) x pitch + size`; if that exceeds the
189
+ * page, the grid is wrong on paper and nothing else in this module would say
190
+ * so. Call it from the audit, not at render time.
191
+ */
192
+ export declare function sheetOverflowMm(profile: LabelProfile): {
193
+ rightMm: number;
194
+ bottomMm: number;
195
+ } | null;
196
+ /** Re-exported so a caller converting a legacy inch figure need not hunt. */
197
+ export { MM_PER_INCH };
198
+ export type { PrintPageSize };