@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,350 @@
1
+ /*
2
+ * WHY: `PrintCenterView` sized its labels `w-[200px]` and emitted no `@page`
3
+ * rule at all, so printing to a thermal label printer produced the
4
+ * browser's default page — A4 — with a 200-pixel card floating in the
5
+ * corner of it. Nothing errored. The operator discovered it by holding a
6
+ * mostly-blank 50 x 25 mm label.
7
+ * WHAT: Every label stock this project can target, in MILLIMETRES, plus the
8
+ * check that says whether a given payload actually fits on one.
9
+ *
10
+ * 🛑 IMPORTS `page-sizes.ts` RATHER THAN RESTATING IT. That module already owns
11
+ * `MM_PER_INCH`, `inchesToMm` and the A4/Letter geometry, and its own header
12
+ * explains why: three copies of a page table disagree the first time one of
13
+ * them is corrected, and the symptom is a print that is subtly the wrong size,
14
+ * discoverable only after it has been printed.
15
+ *
16
+ * EXPORTS:
17
+ * LabelProfileId, LabelProfile, SheetLayout, LABEL_PROFILES,
18
+ * LABEL_PROFILE_IDS, labelProfileById, labelPageCss, labelFitsProfile,
19
+ * code128WidthMm, SAFE_MODULE_MM, MIN_SCANNABLE_MODULE_MM
20
+ *
21
+ * @tag domain:print
22
+ * @tag layer:shared
23
+ * @tag access:isomorphic
24
+ * @tag sideEffects:none
25
+ */
26
+ import { MM_PER_INCH, PRINT_PAGE_SIZES, } from "../sticker-trace/export/page-sizes.js";
27
+ // ── Barcode physics ─────────────────────────────────────────────────────────
28
+ /**
29
+ * CODE128 module width at which essentially every handheld scanner reads
30
+ * reliably, including cheap CCD units at an angle. 0.25 mm ≈ 10 mil.
31
+ */
32
+ export const SAFE_MODULE_MM = 0.25;
33
+ /**
34
+ * The floor. Below this a symbol is a lottery: good scanners manage it under
35
+ * good light at a good angle, and a receive station is none of those things.
36
+ */
37
+ export const MIN_SCANNABLE_MODULE_MM = 0.19;
38
+ /**
39
+ * How wide a CODE128-B symbol must be, in mm, INCLUDING its quiet zones.
40
+ *
41
+ * Structure, from the symbology itself rather than from a chart:
42
+ * start 11 modules
43
+ * each data character 11 modules
44
+ * check 11 modules
45
+ * stop 13 modules
46
+ * quiet 10 modules each side (the spec minimum)
47
+ *
48
+ * so `11 x (n + 2) + 13 + 20` modules for `n` data characters.
49
+ *
50
+ * 🛑 THE QUIET ZONE IS PART OF THE SYMBOL, not padding around it. A label sized
51
+ * to the bars alone prints a barcode whose first bar touches the die-cut edge,
52
+ * and a scanner has nothing to lock onto — it reads as a smudged or damaged
53
+ * label rather than as a layout mistake.
54
+ *
55
+ * 🛑 This also CORRECTS a number already written down elsewhere. The
56
+ * barcode-vs-SKU header in `id-generators.ts` derives "a ~42 mm minimum" from
57
+ * the 12-character `LIR-XXXXXXXX` form; that figure omits the quiet zones.
58
+ * 11 x 14 + 13 = 167 modules of bars, but 187 with them, which is 46.75 mm at
59
+ * `SAFE_MODULE_MM` — not 42. The smaller figure is the dangerous direction to
60
+ * be wrong in, because it says yes to stock that cannot carry the symbol.
61
+ */
62
+ export function code128WidthMm(characters, moduleMm = SAFE_MODULE_MM) {
63
+ if (!(characters > 0)) {
64
+ throw new Error(`code128WidthMm: characters must be > 0 (got ${characters})`);
65
+ }
66
+ if (!(moduleMm > 0)) {
67
+ throw new Error(`code128WidthMm: moduleMm must be > 0 (got ${moduleMm})`);
68
+ }
69
+ const modules = 11 * (characters + 2) + 13 + 20;
70
+ return modules * moduleMm;
71
+ }
72
+ /*
73
+ * 🛑 THE A4 SHEET GEOMETRY BELOW IS FROM AVERY'S PUBLISHED TEMPLATE SPECS, NOT
74
+ * MEASURED. That distinction matters more here than almost anywhere else in
75
+ * this codebase: a pitch that is wrong by half a millimetre is invisible on
76
+ * label one and has drifted off the die-cut entirely by label thirteen, and the
77
+ * cost is a whole sheet of label stock per attempt.
78
+ *
79
+ * PRINT ONE SHEET ON PLAIN PAPER AND HOLD IT AGAINST THE LABEL STOCK BEFORE ANY
80
+ * BATCH RUN. That is the only check that settles it, and it costs one sheet of
81
+ * paper. Corrections belong here, with the date and the stock they were
82
+ * measured against.
83
+ */
84
+ const A4 = PRINT_PAGE_SIZES.a4;
85
+ const a4Page = { widthMm: A4.widthMm, heightMm: A4.heightMm };
86
+ /** Thermal page = one label, so margins are zero by construction. */
87
+ function thermal(id, label, widthMm, heightMm) {
88
+ return {
89
+ id,
90
+ label,
91
+ widthMm,
92
+ heightMm,
93
+ /*
94
+ * 1.5 mm, which is a DIE-CUT tolerance rather than a design margin.
95
+ * Thermal label rolls wander laterally by about a millimetre as they feed,
96
+ * so ink placed closer than this to the edge lands on the liner on some
97
+ * labels and not others — the defect appears on one label in ten and reads
98
+ * as a printer fault.
99
+ */
100
+ paddingMm: 1.5,
101
+ page: { widthMm, heightMm },
102
+ sheet: null,
103
+ isThermal: true,
104
+ };
105
+ }
106
+ export const LABEL_PROFILES = {
107
+ "thermal-50x25": thermal("thermal-50x25", "Thermal roll 50 x 25 mm", 50, 25),
108
+ "thermal-38x25": thermal("thermal-38x25", "Thermal roll 38 x 25 mm", 38, 25),
109
+ "thermal-100x50": thermal("thermal-100x50", "Thermal roll 100 x 50 mm (box labels)", 100, 50),
110
+ "a4-65up": {
111
+ id: "a4-65up",
112
+ label: "A4 sheet, 65-up (38.1 x 21.2 mm — Avery L7651)",
113
+ widthMm: 38.1,
114
+ heightMm: 21.2,
115
+ paddingMm: 1,
116
+ page: a4Page,
117
+ sheet: {
118
+ columns: 5,
119
+ rows: 13,
120
+ marginLeftMm: 4.65,
121
+ marginTopMm: 10.7,
122
+ pitchXMm: 40.6,
123
+ pitchYMm: 21.2,
124
+ },
125
+ isThermal: false,
126
+ },
127
+ "a4-24up": {
128
+ id: "a4-24up",
129
+ label: "A4 sheet, 24-up (63.5 x 33.9 mm — Avery L7159)",
130
+ widthMm: 63.5,
131
+ heightMm: 33.9,
132
+ paddingMm: 1.5,
133
+ page: a4Page,
134
+ sheet: {
135
+ columns: 3,
136
+ rows: 8,
137
+ marginLeftMm: 7.1,
138
+ marginTopMm: 13.1,
139
+ pitchXMm: 66.0,
140
+ pitchYMm: 34.0,
141
+ },
142
+ isThermal: false,
143
+ },
144
+ "a4-8up": {
145
+ id: "a4-8up",
146
+ label: "A4 sheet, 8-up (99.1 x 67.7 mm — Avery L7165)",
147
+ widthMm: 99.1,
148
+ heightMm: 67.7,
149
+ paddingMm: 2,
150
+ page: a4Page,
151
+ sheet: {
152
+ columns: 2,
153
+ rows: 4,
154
+ marginLeftMm: 4.65,
155
+ marginTopMm: 13.1,
156
+ pitchXMm: 101.6,
157
+ pitchYMm: 67.7,
158
+ },
159
+ isThermal: false,
160
+ },
161
+ };
162
+ /** Thermal first — it is what the warehouse actually uses day to day. */
163
+ export const LABEL_PROFILE_IDS = [
164
+ "thermal-50x25",
165
+ "thermal-38x25",
166
+ "thermal-100x50",
167
+ "a4-65up",
168
+ "a4-24up",
169
+ "a4-8up",
170
+ ];
171
+ export function labelProfileById(id) {
172
+ return LABEL_PROFILES[id];
173
+ }
174
+ // ── The @page rule ──────────────────────────────────────────────────────────
175
+ /**
176
+ * The real print geometry, as CSS.
177
+ *
178
+ * 🛑 `@page { size: <w>mm <h>mm; margin: 0 }` IS THE WHOLE POINT OF THIS
179
+ * MODULE. Without it the browser prints the user's default paper and the label
180
+ * is a small rectangle somewhere on an A4 sheet. `margin: 0` is not tidiness:
181
+ * a thermal page IS one label, so any page margin shrinks the label and the
182
+ * content no longer lines up with the die-cut.
183
+ *
184
+ * 🛑 `@page` IS DOCUMENT-GLOBAL AND CANNOT BE SCOPED. Two components each
185
+ * emitting one does not give two geometries — the later in document order
186
+ * wins, silently. So exactly ONE owner may call this per printable view, and
187
+ * that owner is the thing that knows which profile the user picked.
188
+ *
189
+ * The screen preview is deliberately NOT styled from here. A label shown at its
190
+ * true physical size on a 27-inch monitor is a postage stamp nobody can read,
191
+ * and mm in a browser depend on a reported DPI that is usually a guess.
192
+ */
193
+ export function labelPageCss(profile) {
194
+ const { widthMm, heightMm } = profile.page;
195
+ return [
196
+ `@page { size: ${widthMm}mm ${heightMm}mm; margin: 0; }`,
197
+ `@media print {`,
198
+ ` html, body { margin: 0; padding: 0; }`,
199
+ ` .no-print { display: none !important; }`,
200
+ /*
201
+ * One label per page on thermal: the printer advances to the next label on
202
+ * a page break, so a break after each one is what keeps content and
203
+ * die-cut aligned. On a sheet the labels are positioned within one page
204
+ * instead, so breaking after each would waste 64 of 65.
205
+ */
206
+ profile.isThermal
207
+ ? ` .appkit-label { break-after: page; page-break-after: always; }`
208
+ : ` .appkit-label-sheet { break-inside: avoid; page-break-inside: avoid; }`,
209
+ ` .appkit-label { break-inside: avoid; page-break-inside: avoid; }`,
210
+ `}`,
211
+ ].join("\n");
212
+ }
213
+ /**
214
+ * The `@page` rule for an ordinary printed DOCUMENT — a packing slip, a box
215
+ * contents sheet — rather than a label.
216
+ *
217
+ * 🛑 Lives here rather than in the view for one reason: `audit-label-profiles`
218
+ * R3 allows exactly one module to author `@page`, because the rule is
219
+ * document-global and a second author does not add a geometry — the later one
220
+ * silently wins. A view that needed A4 would otherwise have to write its own
221
+ * and defeat that guarantee.
222
+ *
223
+ * 🛑 It takes explicit mm, never `size: A4`. A named paper size is the original
224
+ * bug this module exists to fix: the browser prints its default page, which is
225
+ * A4 for some users and Letter for others, and the layout silently differs by
226
+ * 18 mm of height between them.
227
+ */
228
+ export function documentPageCss(page = {
229
+ widthMm: PRINT_PAGE_SIZES.a4.widthMm,
230
+ heightMm: PRINT_PAGE_SIZES.a4.heightMm,
231
+ }, marginMm = 0) {
232
+ return [
233
+ `@page { size: ${page.widthMm}mm ${page.heightMm}mm; margin: ${marginMm}mm; }`,
234
+ `@media print {`,
235
+ ` html, body { margin: 0; padding: 0; }`,
236
+ ` .no-print { display: none !important; }`,
237
+ ` .appkit-label-sheet { break-inside: avoid; page-break-inside: avoid; }`,
238
+ `}`,
239
+ ].join("\n");
240
+ }
241
+ /**
242
+ * Does a barcode of `characters` length fit this label — and if not, why.
243
+ *
244
+ * 🛑 THIS REPORTS. IT NEVER SCALES, AND THAT IS THE ENTIRE DESIGN.
245
+ *
246
+ * Scaling a barcode to fit is the obvious, wrong answer, and it fails in the
247
+ * worst possible way: the label looks perfect. The bars are narrower, the
248
+ * proportions are right, a human sees a barcode — and the module width has
249
+ * dropped below what a scanner can resolve, so it does not read. The failure
250
+ * surfaces weeks later at a receive station as "the scanner is broken", and the
251
+ * labels have all been printed and stuck to things by then.
252
+ *
253
+ * A refusal to print is noticed in the second it happens, by the person who can
254
+ * still choose different stock. That is the only trade this function makes.
255
+ *
256
+ * 🛑 COMPUTED AGAINST THE PROFILES ABOVE, NOT ASSERTED. A 12-character
257
+ * `LIR-XXXXXXXX` symbol needs 187 modules = 46.75 mm at `SAFE_MODULE_MM`, and
258
+ * the six stocks answer differently enough that a single "does it fit" boolean
259
+ * would have been a lie:
260
+ *
261
+ * thermal-100x50 97.0 mm 0.519 mm/module comfortable
262
+ * a4-8up 95.1 mm 0.509 mm/module comfortable
263
+ * a4-24up 60.5 mm 0.324 mm/module comfortable
264
+ * thermal-50x25 47.0 mm 0.251 mm/module fits by 0.25 mm — no slack
265
+ * a4-65up 36.1 mm 0.193 mm/module over the floor by 0.003 mm
266
+ * thermal-38x25 35.0 mm 0.187 mm/module BELOW the floor
267
+ *
268
+ * 🛑 An earlier draft of this comment claimed `a4-65up` "cannot carry" the
269
+ * symbol. It can, barely — 0.193 against a 0.19 floor — and overstating it
270
+ * would have had someone discard working stock. The two genuinely notable rows
271
+ * are the last two, and they are notable for opposite reasons: 65-up is
272
+ * technically above the floor with no margin whatsoever for a worn printhead,
273
+ * and 38x25 is the one stock that simply cannot do it.
274
+ *
275
+ * All six stay in the list. 38x25 is fine for a shorter code or a text-only
276
+ * label, and silently dropping stock the warehouse already owns teaches nobody
277
+ * why it was dropped.
278
+ */
279
+ export function labelFitsProfile(profile, characters) {
280
+ const availableMm = profile.widthMm - profile.paddingMm * 2;
281
+ const requiredMm = code128WidthMm(characters, SAFE_MODULE_MM);
282
+ const modules = 11 * (characters + 2) + 13 + 20;
283
+ const impliedModuleMm = availableMm / modules;
284
+ const fits = availableMm >= requiredMm;
285
+ if (fits) {
286
+ return {
287
+ fits: true,
288
+ requiredMm,
289
+ availableMm,
290
+ impliedModuleMm,
291
+ reason: `${characters}-character barcode fits ${profile.label} with ${(availableMm - requiredMm).toFixed(1)} mm to spare.`,
292
+ };
293
+ }
294
+ /*
295
+ * Two different refusals, because they have different remedies. "Too narrow
296
+ * but still scannable" means the stock works and the margin is thin; "below
297
+ * the scanning floor" means no amount of care will make it read, and the
298
+ * answer is different stock or a shorter code.
299
+ */
300
+ const scannable = impliedModuleMm >= MIN_SCANNABLE_MODULE_MM;
301
+ return {
302
+ fits: false,
303
+ requiredMm,
304
+ availableMm,
305
+ impliedModuleMm,
306
+ reason: scannable
307
+ ? `${profile.label} offers ${availableMm.toFixed(1)} mm of printable width; a ${characters}-character CODE128 needs ${requiredMm.toFixed(1)} mm at a comfortable density. It would print at ${impliedModuleMm.toFixed(3)} mm per module — above the ${MIN_SCANNABLE_MODULE_MM} mm floor, so it should still scan, but with no margin for a worn printhead or an angled read.`
308
+ : `${profile.label} cannot carry a ${characters}-character CODE128. It offers ${availableMm.toFixed(1)} mm against the ${requiredMm.toFixed(1)} mm needed, which would force ${impliedModuleMm.toFixed(3)} mm per module — below the ${MIN_SCANNABLE_MODULE_MM} mm scanning floor. Pick wider stock, or shorten the code.`,
309
+ };
310
+ }
311
+ /**
312
+ * Where label `index` sits on a sheet, in mm from the page's top-left.
313
+ *
314
+ * Returns null past the last position on the sheet, which the caller must read
315
+ * as "start a new page" rather than as an error — a 70-label job on 65-up stock
316
+ * is two pages, not a failure.
317
+ */
318
+ export function sheetPositionMm(sheet, index) {
319
+ const perPage = sheet.columns * sheet.rows;
320
+ if (index < 0 || index >= perPage)
321
+ return null;
322
+ const col = index % sheet.columns;
323
+ const row = Math.floor(index / sheet.columns);
324
+ return {
325
+ leftMm: sheet.marginLeftMm + col * sheet.pitchXMm,
326
+ topMm: sheet.marginTopMm + row * sheet.pitchYMm,
327
+ };
328
+ }
329
+ /**
330
+ * Sanity check that a sheet's own grid fits on its own page.
331
+ *
332
+ * 🛑 Exists because the Avery figures above are transcribed, and a transposed
333
+ * digit in a pitch is invisible until a batch has been printed. The last
334
+ * label's far edge is `margin + (n - 1) x pitch + size`; if that exceeds the
335
+ * page, the grid is wrong on paper and nothing else in this module would say
336
+ * so. Call it from the audit, not at render time.
337
+ */
338
+ export function sheetOverflowMm(profile) {
339
+ const s = profile.sheet;
340
+ if (!s)
341
+ return null;
342
+ const right = s.marginLeftMm + (s.columns - 1) * s.pitchXMm + profile.widthMm;
343
+ const bottom = s.marginTopMm + (s.rows - 1) * s.pitchYMm + profile.heightMm;
344
+ return {
345
+ rightMm: right - profile.page.widthMm,
346
+ bottomMm: bottom - profile.page.heightMm,
347
+ };
348
+ }
349
+ /** Re-exported so a caller converting a legacy inch figure need not hunt. */
350
+ export { MM_PER_INCH };
@@ -20,17 +20,45 @@
20
20
  * rather than a barrel. Keep this file free of any server-only import so a
21
21
  * client component can always call it directly.
22
22
  */
23
+ /*
24
+ * Client-safe: `products/schemas/firestore.ts` imports only `id-generators`
25
+ * as a value (pure, `globalThis.crypto`) plus erased types — it does not reach
26
+ * `providers/db-firebase`, so the header's rule above still holds. Checked
27
+ * rather than assumed, because that rule is what this file exists for.
28
+ */
29
+ import { productImageUrls } from "../../../../features/products/schemas/firestore.js";
23
30
  export function toProductItem(doc) {
24
31
  return {
25
32
  id: String(doc.id ?? ""),
26
33
  title: String(doc.title ?? doc.name ?? ""),
27
34
  price: typeof doc.price === "number" ? doc.price : 0,
28
35
  originalPrice: typeof doc.originalPrice === "number" ? doc.originalPrice : undefined,
29
- mainImage: Array.isArray(doc.images)
30
- ? doc.images[0]
31
- : typeof doc.mainImage === "string"
32
- ? doc.mainImage
33
- : undefined,
36
+ /*
37
+ * 🛑 `images` is `ProductImage[]` — OBJECTS — not `string[]`.
38
+ *
39
+ * This read `doc.images[0] as string`, and the cast is what hid it from
40
+ * the compiler. `MediaImage` then received `{ url: "/media/…" }`,
41
+ * `resolveMediaUrl` type-guarded the non-string and returned `undefined`,
42
+ * and every related card rendered the 📦 placeholder — with **no network
43
+ * request at all**, which is what distinguishes this from a genuine 404
44
+ * (those retry three times before latching).
45
+ *
46
+ * Blast radius was every related carousel on all seven listing-type
47
+ * detail pages, plus `GroupedListingsCarousel` and
48
+ * `FranchiseDetailPageView`. The PDP gallery had already been fixed for
49
+ * the identical reason and its comment says so; this was the last site
50
+ * still doing `doc.images[0] as string`.
51
+ *
52
+ * `mainImage` FIRST, gallery as fallback — the seller chose `mainImage`
53
+ * deliberately, and this matches the precedence every other card mapper
54
+ * uses (e.g. `StoreAuctionsListing`). `productImageUrls` is the one
55
+ * normaliser and it also accepts the legacy `string[]`.
56
+ */
57
+ mainImage: (typeof doc.mainImage === "string" ? doc.mainImage : undefined) ??
58
+ productImageUrls(doc.images)[0],
59
+ // Carried so a card that needs a second image does not have to re-read the
60
+ // document. Previously dropped entirely, which left the tile no fallback.
61
+ images: productImageUrls(doc.images),
34
62
  status: doc.status ?? "published",
35
63
  slug: typeof doc.slug === "string" ? doc.slug : undefined,
36
64
  storeName: typeof doc.storeName === "string" ? doc.storeName : undefined,
@@ -70,10 +70,39 @@ export interface PayoutDeduction {
70
70
  gstOnFee: number;
71
71
  /** platformFee + gatewayFee + gstOnFee. */
72
72
  totalDeduction: number;
73
- /** grossAmount - totalDeduction, floored at 0. */
73
+ /** grossAmount - totalDeduction + shippingReimbursement, floored at 0. */
74
74
  netAmount: number;
75
+ /**
76
+ * Postage refunded to the seller, added AFTER the deductions (D45).
77
+ *
78
+ * Reported separately so a payout can be explained: "₹951 goods less ₹10 fee
79
+ * plus ₹80 postage" is a sentence; one net figure is not.
80
+ */
81
+ shippingReimbursement: number;
75
82
  }
76
- export declare function computePayoutDeduction(grossAmount: number, commissions: FeeCommissionRates): PayoutDeduction;
83
+ /**
84
+ * What a seller is actually paid.
85
+ *
86
+ * ## 🛑 `shippingReimbursement` is added AFTER the fee bases, never into them
87
+ *
88
+ * D45 makes postage a **cost being refunded**, not revenue. So it is the one
89
+ * term in this function that is added to `netAmount` while being excluded from
90
+ * `platformFee` and `gatewayFee` — because commissioning a seller's postage
91
+ * would mean charging them for the privilege of posting the parcel, and taking
92
+ * a gateway percentage of it would mean charging them a card fee on money that
93
+ * is reimbursing a cash outlay.
94
+ *
95
+ * That is also why it is a parameter here rather than something a caller adds
96
+ * to `grossAmount` before calling: `grossAmount` IS the commission base, so
97
+ * folding postage into it silently commissions it. Four payout paths call this
98
+ * (the seller's own earnings view, the manual request, and both jobs) and all
99
+ * four must agree to the rupee — a seller shown one number and paid another is
100
+ * worse than either number being wrong alone. One owner is what guarantees it.
101
+ *
102
+ * Defaulted to 0, so the three call sites that do not yet pass it keep their
103
+ * current behaviour exactly rather than silently gaining a term.
104
+ */
105
+ export declare function computePayoutDeduction(grossAmount: number, commissions: FeeCommissionRates, shippingReimbursement?: number): PayoutDeduction;
77
106
  export interface CodHandlingFeeRates {
78
107
  /**
79
108
  * Rupee CEILING on the COD handling fee. Optional so a `siteSettings`
@@ -15,6 +15,7 @@
15
15
  * All money amounts are in decimal rupees.
16
16
  */
17
17
  import { roundRupees } from "../../../utils/number.formatter.js";
18
+ import { resolveStateKey } from "./india-states.js";
18
19
  /** Buyer-facing platform commission ceiling, in decimal rupees. */
19
20
  const DEFAULT_PLATFORM_FEE_MAX = 10;
20
21
  /**
@@ -49,7 +50,34 @@ export function allocateCheckoutFees(groupSubtotals, fees) {
49
50
  if (groupSubtotals.length === 0)
50
51
  return allocation;
51
52
  const total = groupSubtotals.reduce((sum, [, subtotal]) => sum + subtotal, 0);
52
- let platformRemaining = fees.platformFee;
53
+ /*
54
+ * ── D41: THE `minimumTransactionFee` FLOOR IS APPLIED HERE, ONCE ──────────
55
+ *
56
+ * `computeCheckoutFees` computes `totalFee = max(platformFee + gstOnFee,
57
+ * minimumTransactionFee)` — and **`totalFee` had ZERO consumers.** Measured:
58
+ * the only references were its own declaration, its computation and its
59
+ * return. So the floor existed in a field nothing read.
60
+ *
61
+ * The capture route re-derived it by hand instead
62
+ * (`max(rawTotal, discountedSubtotal + minimumTransactionFee + …)`), while
63
+ * this allocator apportioned the UNFLOORED `platformFee`/`gstOnFee` to each
64
+ * order group. Consequence where the floor bit: **the gateway captured the
65
+ * floored amount and the orders recorded less than was collected.** The
66
+ * buyer's statement and our own records disagreed, by exactly the shortfall.
67
+ *
68
+ * The shortfall is treated as additional PLATFORM FEE, with no GST of its
69
+ * own, because the floor is defined on `platformFee + gstOnFee` COMBINED —
70
+ * so `flooredPlatformFee + gstOnFee` is exactly `totalFee`, which is exactly
71
+ * what the capture route charges. Adding GST on top of the shortfall would
72
+ * push the captured total above the floor and reintroduce the mismatch in
73
+ * the other direction.
74
+ *
75
+ * A floor nothing applies is not a floor; a floor applied in one of two
76
+ * places is worse, because the two then disagree about money.
77
+ */
78
+ const feeShortfall = Math.max(0, roundRupees(fees.totalFee - (fees.platformFee + fees.gstOnFee)));
79
+ const flooredPlatformFee = roundRupees(fees.platformFee + feeShortfall);
80
+ let platformRemaining = flooredPlatformFee;
53
81
  let gstRemaining = fees.gstOnFee;
54
82
  groupSubtotals.forEach(([storeId, subtotal], index) => {
55
83
  const isLast = index === groupSubtotals.length - 1;
@@ -57,7 +85,7 @@ export function allocateCheckoutFees(groupSubtotals, fees) {
57
85
  // whole (necessarily zero-ish) fee to the last group rather than dividing
58
86
  // by zero.
59
87
  const share = total > 0 ? subtotal / total : 0;
60
- const platformFee = isLast ? roundRupees(platformRemaining) : roundRupees(fees.platformFee * share);
88
+ const platformFee = isLast ? roundRupees(platformRemaining) : roundRupees(flooredPlatformFee * share);
61
89
  const gstOnFee = isLast ? roundRupees(gstRemaining) : roundRupees(fees.gstOnFee * share);
62
90
  platformRemaining = roundRupees(platformRemaining - platformFee);
63
91
  gstRemaining = roundRupees(gstRemaining - gstOnFee);
@@ -65,13 +93,45 @@ export function allocateCheckoutFees(groupSubtotals, fees) {
65
93
  });
66
94
  return allocation;
67
95
  }
68
- export function computePayoutDeduction(grossAmount, commissions) {
96
+ /**
97
+ * What a seller is actually paid.
98
+ *
99
+ * ## 🛑 `shippingReimbursement` is added AFTER the fee bases, never into them
100
+ *
101
+ * D45 makes postage a **cost being refunded**, not revenue. So it is the one
102
+ * term in this function that is added to `netAmount` while being excluded from
103
+ * `platformFee` and `gatewayFee` — because commissioning a seller's postage
104
+ * would mean charging them for the privilege of posting the parcel, and taking
105
+ * a gateway percentage of it would mean charging them a card fee on money that
106
+ * is reimbursing a cash outlay.
107
+ *
108
+ * That is also why it is a parameter here rather than something a caller adds
109
+ * to `grossAmount` before calling: `grossAmount` IS the commission base, so
110
+ * folding postage into it silently commissions it. Four payout paths call this
111
+ * (the seller's own earnings view, the manual request, and both jobs) and all
112
+ * four must agree to the rupee — a seller shown one number and paid another is
113
+ * worse than either number being wrong alone. One owner is what guarantees it.
114
+ *
115
+ * Defaulted to 0, so the three call sites that do not yet pass it keep their
116
+ * current behaviour exactly rather than silently gaining a term.
117
+ */
118
+ export function computePayoutDeduction(grossAmount, commissions, shippingReimbursement = 0) {
69
119
  const platformFee = roundRupees(grossAmount * (commissions.platformFeePercent / 100));
70
120
  const gatewayFee = roundRupees(grossAmount * ((commissions.gatewayFeePercent ?? 0) / 100));
71
121
  const gstOnFee = roundRupees(platformFee * (commissions.gstPercent / 100));
72
122
  const totalDeduction = roundRupees(platformFee + gatewayFee + gstOnFee);
73
- const netAmount = Math.max(0, roundRupees(grossAmount - totalDeduction));
74
- return { platformFee, gatewayFee, gstOnFee, totalDeduction, netAmount };
123
+ const postage = Number.isFinite(shippingReimbursement)
124
+ ? Math.max(0, shippingReimbursement)
125
+ : 0;
126
+ const netAmount = Math.max(0, roundRupees(grossAmount - totalDeduction + postage));
127
+ return {
128
+ platformFee,
129
+ gatewayFee,
130
+ gstOnFee,
131
+ totalDeduction,
132
+ netAmount,
133
+ shippingReimbursement: roundRupees(postage),
134
+ };
75
135
  }
76
136
  /** Buyer-facing COD handling ceiling, in decimal rupees. */
77
137
  const DEFAULT_COD_HANDLING_FEE_CAP = 200;
@@ -183,6 +243,44 @@ export const DEFAULT_GST_RATE = 5;
183
243
  * than guess.
184
244
  */
185
245
  export function isIntraStateSupply(storeState, buyerState) {
246
+ /*
247
+ * ── G2: resolve through the state TABLE first, not string equality ───────
248
+ *
249
+ * This was `normaliseStateName(a) === normaliseStateName(b)` — lowercase,
250
+ * strip non-letters, compare. Correct only when both sides happen to be
251
+ * spelled the same way, and they are not: a seller types their pickup
252
+ * state, a buyer types their delivery state, and a GSTIN carries the state
253
+ * as a two-digit CODE. So `"KA"` vs `"Karnataka"` compared unequal and the
254
+ * supply read as INTER-state, recording **IGST where CGST+SGST was due**.
255
+ *
256
+ * Worse, the old normaliser's `.replace(/[^a-z\s]/g, " ")` DESTROYED
257
+ * digits, so a state held as `"29"` — or a full GSTIN — normalised to the
258
+ * empty string and returned `null`, i.e. "place of supply undetermined",
259
+ * which both callers then resolve to IGST with a warning.
260
+ *
261
+ * None of this changed the TOTAL (IGST total == CGST+SGST total), which is
262
+ * precisely why it could live indefinitely: no figure in the system
263
+ * disagreed with any other. Only the split was wrong, and the split is what
264
+ * a GST return is built from.
265
+ *
266
+ * Verified against the table: "KA", "29", "29ABCDE1234F1Z5" and
267
+ * "karnataka." all resolve to one key; "AP" vs "Arunachal Pradesh", "MP" vs
268
+ * "Maharashtra" and "Punjab" vs "Puducherry" stay distinct (7 negative
269
+ * controls, 0 false positives).
270
+ */
271
+ const keyA = resolveStateKey(storeState);
272
+ const keyB = resolveStateKey(buyerState);
273
+ if (keyA && keyB)
274
+ return keyA === keyB;
275
+ /*
276
+ * 🛑 The string fallback STAYS, and it is a widening rather than a
277
+ * replacement. An input the table cannot resolve — a typo, a non-Indian
278
+ * state — used to be handled by plain equality, and for the case where BOTH
279
+ * sides carry the SAME unrecognised spelling ("Karnatka" twice) that
280
+ * produced the right answer. Dropping it would turn those into
281
+ * "undetermined", which resolves to IGST, so a pure replacement would
282
+ * REGRESS exactly the inputs the table was added to improve.
283
+ */
186
284
  const a = normaliseStateName(storeState);
187
285
  const b = normaliseStateName(buyerState);
188
286
  if (!a || !b)