@mohasinac/appkit 4.62.0 → 4.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +8 -29
  3. package/dist/_internal/client/features/layout/filterNavItems.d.ts +28 -0
  4. package/dist/_internal/client/features/layout/filterNavItems.js +35 -0
  5. package/dist/_internal/server/features/ads/booking.d.ts +118 -0
  6. package/dist/_internal/server/features/ads/booking.js +326 -0
  7. package/dist/_internal/server/features/checkout/actions.d.ts +129 -9
  8. package/dist/_internal/server/features/checkout/actions.js +850 -79
  9. package/dist/_internal/server/features/checkout/expand-order-items.d.ts +1 -2
  10. package/dist/_internal/server/features/checkout/expand-order-items.js +32 -0
  11. package/dist/_internal/server/features/checkout/freeze-parts.d.ts +50 -0
  12. package/dist/_internal/server/features/checkout/freeze-parts.js +94 -0
  13. package/dist/_internal/server/features/checkout/value-otp-gate.d.ts +55 -0
  14. package/dist/_internal/server/features/checkout/value-otp-gate.js +60 -0
  15. package/dist/_internal/server/features/dashboard/attention.d.ts +128 -0
  16. package/dist/_internal/server/features/dashboard/attention.js +183 -0
  17. package/dist/_internal/server/features/dashboard/data.d.ts +47 -0
  18. package/dist/_internal/server/features/dashboard/data.js +82 -0
  19. package/dist/_internal/server/features/inventory/reservations.d.ts +99 -0
  20. package/dist/_internal/server/features/inventory/reservations.js +273 -0
  21. package/dist/_internal/server/features/invoicing/allocate.d.ts +63 -0
  22. package/dist/_internal/server/features/invoicing/allocate.js +162 -0
  23. package/dist/_internal/server/features/invoicing/credit-note.d.ts +57 -0
  24. package/dist/_internal/server/features/invoicing/credit-note.js +126 -0
  25. package/dist/_internal/server/features/invoicing/gstr1.d.ts +74 -0
  26. package/dist/_internal/server/features/invoicing/gstr1.js +251 -0
  27. package/dist/_internal/server/features/invoicing/issue.d.ts +96 -0
  28. package/dist/_internal/server/features/invoicing/issue.js +202 -0
  29. package/dist/_internal/server/features/offers/destinations.d.ts +40 -0
  30. package/dist/_internal/server/features/offers/destinations.js +65 -0
  31. package/dist/_internal/server/features/orders/actions.d.ts +8 -1
  32. package/dist/_internal/server/features/orders/actions.js +81 -8
  33. package/dist/_internal/server/features/orders/adapters.js +54 -0
  34. package/dist/_internal/server/features/orders/amend-delivery.d.ts +56 -0
  35. package/dist/_internal/server/features/orders/amend-delivery.js +124 -0
  36. package/dist/_internal/server/features/orders/balance.d.ts +89 -0
  37. package/dist/_internal/server/features/orders/balance.js +256 -0
  38. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +15 -9
  39. package/dist/_internal/server/features/orders/cancellation-refund.js +15 -9
  40. package/dist/_internal/server/features/points/award.js +46 -4
  41. package/dist/_internal/server/features/pricing/actions.d.ts +58 -0
  42. package/dist/_internal/server/features/pricing/actions.js +144 -0
  43. package/dist/_internal/server/features/refunds/actions.js +26 -0
  44. package/dist/_internal/server/features/shipping/book-split.d.ts +86 -0
  45. package/dist/_internal/server/features/shipping/book-split.js +130 -0
  46. package/dist/_internal/server/features/shipping/book.d.ts +61 -0
  47. package/dist/_internal/server/features/shipping/book.js +176 -0
  48. package/dist/_internal/server/features/shipping/courier-block.d.ts +69 -0
  49. package/dist/_internal/server/features/shipping/courier-block.js +264 -0
  50. package/dist/_internal/server/features/site-settings/adapters.d.ts +2 -2
  51. package/dist/_internal/server/features/site-settings/adapters.js +29 -0
  52. package/dist/_internal/server/features/stores/adapters.d.ts +2 -2
  53. package/dist/_internal/server/features/stores/adapters.js +65 -0
  54. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  55. package/dist/_internal/server/functions/scheduled.js +95 -2
  56. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +11 -2
  57. package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +4 -0
  58. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +19 -2
  59. package/dist/_internal/server/jobs/core/index.d.ts +2 -1
  60. package/dist/_internal/server/jobs/core/index.js +2 -1
  61. package/dist/_internal/server/jobs/core/jobRunners.js +45 -0
  62. package/dist/_internal/server/jobs/core/onJobCreated.d.ts +30 -7
  63. package/dist/_internal/server/jobs/core/onJobCreated.js +78 -45
  64. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +7 -0
  65. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +65 -0
  66. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +33 -0
  67. package/dist/_internal/server/jobs/core/reservationExpiry.d.ts +17 -0
  68. package/dist/_internal/server/jobs/core/reservationExpiry.js +40 -0
  69. package/dist/_internal/server/jobs/core/runJobOnce.d.ts +48 -0
  70. package/dist/_internal/server/jobs/core/runJobOnce.js +195 -0
  71. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +25 -2
  72. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  73. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  74. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +17 -0
  75. package/dist/_internal/server/jobs/handlers/reservationExpiry.d.ts +2 -0
  76. package/dist/_internal/server/jobs/handlers/reservationExpiry.js +2 -0
  77. package/dist/_internal/server/notifications/channel-health.d.ts +26 -3
  78. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  79. package/dist/_internal/shared/actions/action-registry.js +296 -0
  80. package/dist/_internal/shared/checkout/coupon-discount.d.ts +43 -1
  81. package/dist/_internal/shared/checkout/coupon-discount.js +26 -1
  82. package/dist/_internal/shared/checkout/order-math.d.ts +174 -0
  83. package/dist/_internal/shared/checkout/order-math.js +159 -0
  84. package/dist/_internal/shared/checkout/refundable-base.d.ts +25 -0
  85. package/dist/_internal/shared/checkout/refundable-base.js +13 -1
  86. package/dist/_internal/shared/checkout/rules/index.d.ts +1 -1
  87. package/dist/_internal/shared/checkout/rules/index.js +1 -1
  88. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +18 -0
  89. package/dist/_internal/shared/checkout/rules/payment-gate.js +25 -0
  90. package/dist/_internal/shared/checkout/split.d.ts +75 -0
  91. package/dist/_internal/shared/checkout/split.js +120 -0
  92. package/dist/_internal/shared/content/disclaimers.d.ts +88 -0
  93. package/dist/_internal/shared/content/disclaimers.js +217 -0
  94. package/dist/_internal/shared/content/published-values.d.ts +93 -0
  95. package/dist/_internal/shared/content/published-values.js +206 -0
  96. package/dist/_internal/shared/features/admin/integrations.d.ts +139 -0
  97. package/dist/_internal/shared/features/admin/integrations.js +263 -0
  98. package/dist/_internal/shared/features/dashboard/hub-sections.d.ts +72 -0
  99. package/dist/_internal/shared/features/dashboard/hub-sections.js +75 -0
  100. package/dist/_internal/shared/features/emi/choice.d.ts +98 -0
  101. package/dist/_internal/shared/features/emi/choice.js +69 -0
  102. package/dist/_internal/shared/features/emi/group.d.ts +84 -0
  103. package/dist/_internal/shared/features/emi/group.js +126 -0
  104. package/dist/_internal/shared/features/ledger/posting.d.ts +107 -0
  105. package/dist/_internal/shared/features/ledger/posting.js +165 -0
  106. package/dist/_internal/shared/features/ledger/reports.d.ts +76 -0
  107. package/dist/_internal/shared/features/ledger/reports.js +127 -0
  108. package/dist/_internal/shared/features/ledger/rules.d.ts +170 -0
  109. package/dist/_internal/shared/features/ledger/rules.js +221 -0
  110. package/dist/_internal/shared/features/offers/coordination.d.ts +122 -0
  111. package/dist/_internal/shared/features/offers/coordination.js +80 -0
  112. package/dist/_internal/shared/features/orders/delivery-snapshot.d.ts +114 -0
  113. package/dist/_internal/shared/features/orders/delivery-snapshot.js +116 -0
  114. package/dist/_internal/shared/features/orders/dispute-reasons.d.ts +113 -0
  115. package/dist/_internal/shared/features/orders/dispute-reasons.js +181 -0
  116. package/dist/_internal/shared/features/orders/refund-copy.d.ts +1 -1
  117. package/dist/_internal/shared/features/orders/refund-copy.js +18 -1
  118. package/dist/_internal/shared/features/payouts/pay-period.d.ts +91 -0
  119. package/dist/_internal/shared/features/payouts/pay-period.js +104 -0
  120. package/dist/_internal/shared/features/points/accepts.d.ts +29 -0
  121. package/dist/_internal/shared/features/points/accepts.js +49 -0
  122. package/dist/_internal/shared/features/pricing/rate-registry.d.ts +150 -0
  123. package/dist/_internal/shared/features/pricing/rate-registry.js +246 -0
  124. package/dist/_internal/shared/features/shipping/parcel.d.ts +123 -0
  125. package/dist/_internal/shared/features/shipping/parcel.js +139 -0
  126. package/dist/_internal/shared/features/shipping/shared-purchase.d.ts +91 -0
  127. package/dist/_internal/shared/features/shipping/shared-purchase.js +108 -0
  128. package/dist/_internal/shared/features/site-settings/fees.d.ts +16 -8
  129. package/dist/_internal/shared/features/site-settings/fees.js +12 -8
  130. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  131. package/dist/_internal/shared/fees/calculator.d.ts +33 -1
  132. package/dist/_internal/shared/fees/calculator.js +32 -2
  133. package/dist/_internal/shared/fees/explain.d.ts +81 -0
  134. package/dist/_internal/shared/fees/explain.js +101 -0
  135. package/dist/_internal/shared/history/index.d.ts +1 -1
  136. package/dist/_internal/shared/history/index.js +1 -1
  137. package/dist/_internal/shared/history/types.d.ts +7 -1
  138. package/dist/_internal/shared/history/types.js +25 -0
  139. package/dist/client.d.ts +21 -0
  140. package/dist/client.js +43 -0
  141. package/dist/constants/api-endpoints.d.ts +114 -0
  142. package/dist/constants/api-endpoints.js +55 -0
  143. package/dist/constants/field-names.d.ts +42 -0
  144. package/dist/constants/field-names.js +52 -0
  145. package/dist/contracts/index.d.ts +1 -1
  146. package/dist/contracts/shipping.d.ts +45 -0
  147. package/dist/contracts/shipping.js +15 -0
  148. package/dist/features/about/components/AboutView.js +1 -1
  149. package/dist/features/account/components/BuyerAuctionsGuideView.js +4 -1
  150. package/dist/features/account/components/UserOrdersView.js +47 -35
  151. package/dist/features/admin/components/AdminCouponEditorView.js +17 -0
  152. package/dist/features/admin/components/AdminIntegrationsView.d.ts +55 -0
  153. package/dist/features/admin/components/AdminIntegrationsView.js +74 -0
  154. package/dist/features/admin/components/AdminInvoicingView.d.ts +2 -0
  155. package/dist/features/admin/components/AdminInvoicingView.js +65 -0
  156. package/dist/features/admin/components/AdminOrderEditorView.d.ts +33 -1
  157. package/dist/features/admin/components/AdminOrderEditorView.js +81 -3
  158. package/dist/features/admin/components/AdminOrdersGuideView.js +23 -2
  159. package/dist/features/admin/components/AdminOrdersView.js +86 -5
  160. package/dist/features/admin/components/OwnerQuickActions.js +24 -2
  161. package/dist/features/admin/constants/filter-tabs.d.ts +6 -0
  162. package/dist/features/admin/constants/filter-tabs.js +6 -0
  163. package/dist/features/admin/constants/site-settings-tabs.d.ts +1 -1
  164. package/dist/features/admin/hooks/useAdminListingData.js +16 -0
  165. package/dist/features/admin/schemas/admin-user-form.d.ts +2 -2
  166. package/dist/features/admin/schemas/firestore.d.ts +62 -0
  167. package/dist/features/admin/schemas/firestore.js +5 -0
  168. package/dist/features/ads/schemas/booking-write.d.ts +120 -0
  169. package/dist/features/ads/schemas/booking-write.js +75 -0
  170. package/dist/features/ads/schemas/creative-form.d.ts +18 -0
  171. package/dist/features/ads/schemas/creative-form.js +51 -0
  172. package/dist/features/ads/schemas/firestore.d.ts +140 -0
  173. package/dist/features/ads/schemas/firestore.js +109 -0
  174. package/dist/features/auctions/repository/bid.repository.js +3 -1
  175. package/dist/features/audit-log/schemas/firestore.d.ts +140 -0
  176. package/dist/features/audit-log/schemas/firestore.js +89 -0
  177. package/dist/features/auth/actions/profile-actions.d.ts +69 -1
  178. package/dist/features/auth/actions/profile-actions.js +62 -1
  179. package/dist/features/auth/permissions/constants.js +13 -0
  180. package/dist/features/auth/schemas/firestore.d.ts +16 -2
  181. package/dist/features/auth/schemas/firestore.js +2 -1
  182. package/dist/features/blog/actions/blog-actions.d.ts +6 -0
  183. package/dist/features/blog/actions/blog-actions.js +17 -2
  184. package/dist/features/blog/api/route.js +4 -1
  185. package/dist/features/blog/columns/index.js +5 -0
  186. package/dist/features/blog/components/BlogIndexPageView.js +2 -1
  187. package/dist/features/blog/repository/blog.repository.d.ts +4 -0
  188. package/dist/features/blog/repository/blog.repository.js +5 -0
  189. package/dist/features/blog/schemas/blog-form.d.ts +3 -0
  190. package/dist/features/blog/schemas/blog-form.js +1 -0
  191. package/dist/features/blog/schemas/firestore.d.ts +38 -1
  192. package/dist/features/blog/schemas/firestore.js +23 -0
  193. package/dist/features/blog/schemas/index.d.ts +6 -0
  194. package/dist/features/blog/schemas/index.js +2 -0
  195. package/dist/features/blog/types/index.d.ts +2 -0
  196. package/dist/features/cart/components/CartPriceBreakdown.d.ts +25 -1
  197. package/dist/features/cart/components/CartPriceBreakdown.js +29 -6
  198. package/dist/features/cart/components/PointsTenderPicker.d.ts +61 -0
  199. package/dist/features/cart/components/PointsTenderPicker.js +15 -0
  200. package/dist/features/cart/components/StoreAddonsPicker.js +2 -1
  201. package/dist/features/cart/components/index.d.ts +2 -0
  202. package/dist/features/cart/components/index.js +1 -0
  203. package/dist/features/cart/repository/cart.repository.d.ts +33 -0
  204. package/dist/features/cart/repository/cart.repository.js +47 -0
  205. package/dist/features/cart/schemas/firestore.d.ts +116 -0
  206. package/dist/features/contact/email.d.ts +27 -10
  207. package/dist/features/contact/email.js +20 -3
  208. package/dist/features/dashboard/components/DashboardHubView.d.ts +83 -0
  209. package/dist/features/dashboard/components/DashboardHubView.js +56 -0
  210. package/dist/features/dashboard/components/DashboardSectionsClient.d.ts +23 -0
  211. package/dist/features/dashboard/components/DashboardSectionsClient.js +66 -0
  212. package/dist/features/dispute-reasons/components/AdminDisputeReasonsView.d.ts +55 -0
  213. package/dist/features/dispute-reasons/components/AdminDisputeReasonsView.js +175 -0
  214. package/dist/features/dispute-reasons/repository/dispute-reasons.repository.d.ts +62 -0
  215. package/dist/features/dispute-reasons/repository/dispute-reasons.repository.js +108 -0
  216. package/dist/features/dispute-reasons/schemas/firestore.d.ts +62 -0
  217. package/dist/features/dispute-reasons/schemas/firestore.js +40 -0
  218. package/dist/features/events/components/EventSaleBanner.js +1 -1
  219. package/dist/features/faq/components/FAQAccordion.d.ts +13 -1
  220. package/dist/features/faq/components/FAQAccordion.js +29 -4
  221. package/dist/features/faq/components/FAQPageContent.js +2 -2
  222. package/dist/features/gateway-events/schemas/index.d.ts +2 -2
  223. package/dist/features/homepage/schemas/index.d.ts +8 -8
  224. package/dist/features/inventory/schemas/stock-reservation.d.ts +114 -0
  225. package/dist/features/inventory/schemas/stock-reservation.js +103 -0
  226. package/dist/features/invoicing/schemas/firestore.d.ts +112 -0
  227. package/dist/features/invoicing/schemas/firestore.js +45 -0
  228. package/dist/features/invoicing/utils/financial-year.d.ts +43 -0
  229. package/dist/features/invoicing/utils/financial-year.js +53 -0
  230. package/dist/features/jobs/actions/enqueue-job.js +18 -1
  231. package/dist/features/jobs/repository/jobs.repository.d.ts +62 -1
  232. package/dist/features/jobs/repository/jobs.repository.js +84 -1
  233. package/dist/features/jobs/schemas/firestore.d.ts +80 -0
  234. package/dist/features/jobs/schemas/firestore.js +37 -0
  235. package/dist/features/layout/AppLayoutShell.d.ts +9 -1
  236. package/dist/features/layout/AppLayoutShell.js +12 -4
  237. package/dist/features/layout/BottomActions.js +2 -1
  238. package/dist/features/layout/BottomNavbar.d.ts +10 -2
  239. package/dist/features/layout/SideActionDock.js +52 -2
  240. package/dist/features/layout/TitleBarLayout.js +13 -4
  241. package/dist/features/layout/TitleBarLayout.style.css +59 -0
  242. package/dist/features/layout/useCtaReveal.d.ts +16 -1
  243. package/dist/features/layout/useCtaReveal.js +17 -26
  244. package/dist/features/ledger/repository/journal.repository.d.ts +110 -0
  245. package/dist/features/ledger/repository/journal.repository.js +312 -0
  246. package/dist/features/ledger/schemas/expenses.d.ts +87 -0
  247. package/dist/features/ledger/schemas/expenses.js +27 -0
  248. package/dist/features/ledger/schemas/firestore.d.ts +183 -0
  249. package/dist/features/ledger/schemas/firestore.js +69 -0
  250. package/dist/features/lottery/schemas/zod.d.ts +6 -6
  251. package/dist/features/media/MediaImage.js +22 -1
  252. package/dist/features/media/upload/ImageUpload.js +1 -1
  253. package/dist/features/obligations/constants/policies.js +24 -1
  254. package/dist/features/orders/components/BalancePaymentPanel.d.ts +12 -0
  255. package/dist/features/orders/components/BalancePaymentPanel.js +94 -0
  256. package/dist/features/orders/components/OrderPaymentSummary.js +10 -1
  257. package/dist/features/orders/components/OrderProvenanceCard.d.ts +8 -0
  258. package/dist/features/orders/components/OrderProvenanceCard.js +185 -0
  259. package/dist/features/orders/components/RaiseDisputeForm.d.ts +14 -0
  260. package/dist/features/orders/components/RaiseDisputeForm.js +119 -0
  261. package/dist/features/orders/components/RefundRequestView.js +19 -1
  262. package/dist/features/orders/components/index.d.ts +4 -0
  263. package/dist/features/orders/components/index.js +2 -0
  264. package/dist/features/orders/constants/order-lane-tabs.d.ts +69 -0
  265. package/dist/features/orders/constants/order-lane-tabs.js +88 -0
  266. package/dist/features/orders/repository/orders.repository.d.ts +85 -1
  267. package/dist/features/orders/repository/orders.repository.js +205 -6
  268. package/dist/features/orders/schemas/balance.d.ts +40 -0
  269. package/dist/features/orders/schemas/balance.js +47 -0
  270. package/dist/features/orders/schemas/firestore.d.ts +398 -1
  271. package/dist/features/orders/schemas/firestore.js +43 -0
  272. package/dist/features/orders/schemas/index.d.ts +56 -8
  273. package/dist/features/orders/schemas/index.js +12 -0
  274. package/dist/features/orders/types/index.d.ts +47 -0
  275. package/dist/features/orders/utils/courier-block.d.ts +25 -0
  276. package/dist/features/orders/utils/courier-block.js +23 -0
  277. package/dist/features/payment-cases/schemas/firestore.d.ts +26 -1
  278. package/dist/features/payment-cases/schemas/firestore.js +1 -0
  279. package/dist/features/payments/repository/payout.repository.js +3 -2
  280. package/dist/features/payments/schemas/firestore.d.ts +92 -1
  281. package/dist/features/payments/schemas/firestore.js +23 -0
  282. package/dist/features/pricing/components/AdminPricingView.d.ts +13 -0
  283. package/dist/features/pricing/components/AdminPricingView.js +157 -0
  284. package/dist/features/products/components/PrizeDrawDetailPageView.js +2 -2
  285. package/dist/features/products/components/ProductDetailPageView.d.ts +17 -1
  286. package/dist/features/products/components/ProductDetailPageView.js +2 -2
  287. package/dist/features/products/schemas/firestore.d.ts +26 -1
  288. package/dist/features/products/schemas/firestore.js +2 -0
  289. package/dist/features/products/schemas/index.d.ts +2 -2
  290. package/dist/features/products/schemas/product-features.validators.d.ts +10 -10
  291. package/dist/features/promotions/actions/coupon-stacking.d.ts +30 -3
  292. package/dist/features/promotions/actions/coupon-stacking.js +21 -2
  293. package/dist/features/promotions/components/CouponCard.js +13 -0
  294. package/dist/features/promotions/constants/coupon-help.d.ts +2 -2
  295. package/dist/features/promotions/constants/coupon-help.js +9 -1
  296. package/dist/features/promotions/schemas/firestore.d.ts +24 -0
  297. package/dist/features/promotions/schemas/firestore.js +4 -0
  298. package/dist/features/promotions/types/index.d.ts +19 -1
  299. package/dist/features/reviews/repository/reviews.repository.d.ts +14 -0
  300. package/dist/features/reviews/repository/reviews.repository.js +16 -0
  301. package/dist/features/scams/components/ScamProfileView.js +2 -2
  302. package/dist/features/scams/components/ScamRegistryView.js +2 -2
  303. package/dist/features/scams/repository/scammer.repository.js +2 -1
  304. package/dist/features/scams/schemas/firestore.d.ts +2 -1
  305. package/dist/features/scams/schemas/firestore.js +2 -1
  306. package/dist/features/search/action-index/tab-entries.js +1 -1
  307. package/dist/features/seller/actions/offer-actions.js +56 -0
  308. package/dist/features/seller/actions/seller-actions.d.ts +1 -1
  309. package/dist/features/seller/actions/seller-actions.js +37 -3
  310. package/dist/features/seller/components/DispatchForm.d.ts +11 -0
  311. package/dist/features/seller/components/DispatchForm.js +190 -0
  312. package/dist/features/seller/components/SellerOrdersView.js +221 -27
  313. package/dist/features/seller/components/index.d.ts +1 -0
  314. package/dist/features/seller/components/index.js +1 -0
  315. package/dist/features/seller/hooks/useSellerListingData.js +25 -0
  316. package/dist/features/seller/repository/offer.repository.js +4 -3
  317. package/dist/features/seller/schemas/firestore.d.ts +23 -2
  318. package/dist/features/seller/schemas/firestore.js +3 -2
  319. package/dist/features/seller/schemas/index.d.ts +4 -4
  320. package/dist/features/seller/schemas/order-forms.d.ts +61 -4
  321. package/dist/features/seller/schemas/order-forms.js +41 -8
  322. package/dist/features/shipments/schemas/firestore.d.ts +25 -0
  323. package/dist/features/shipments/schemas/validation.d.ts +4 -4
  324. package/dist/features/shipping-boxes/repository/shipping-boxes.repository.d.ts +82 -0
  325. package/dist/features/shipping-boxes/repository/shipping-boxes.repository.js +145 -0
  326. package/dist/features/shipping-boxes/schemas/firestore.d.ts +80 -0
  327. package/dist/features/shipping-boxes/schemas/firestore.js +53 -0
  328. package/dist/features/store-extensions/schemas/report-create-form.d.ts +2 -2
  329. package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +2 -2
  330. package/dist/features/stores/components/StoreOrdersGuideView.js +6 -1
  331. package/dist/features/stores/repository/store.repository.d.ts +18 -0
  332. package/dist/features/stores/repository/store.repository.js +27 -1
  333. package/dist/features/stores/schemas/firestore.d.ts +112 -0
  334. package/dist/features/stores/schemas/firestore.js +20 -0
  335. package/dist/features/stores/schemas/index.d.ts +6 -6
  336. package/dist/features/stores/types/index.d.ts +19 -0
  337. package/dist/features/support/repository/support.repository.js +72 -6
  338. package/dist/features/support/schemas/firestore.d.ts +17 -0
  339. package/dist/features/support/schemas/index.d.ts +8 -8
  340. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  341. package/dist/index.d.ts +11 -1
  342. package/dist/index.js +33 -1
  343. package/dist/next/routing/route-map.d.ts +112 -0
  344. package/dist/next/routing/route-map.js +63 -0
  345. package/dist/providers/shipping-shiprocket/index.d.ts +27 -1
  346. package/dist/providers/shipping-shiprocket/index.js +84 -1
  347. package/dist/react/contexts/SessionContext.d.ts +17 -1
  348. package/dist/schemas/registry.d.ts +69 -34
  349. package/dist/schemas/sieve.d.ts +2 -2
  350. package/dist/security/pii-schemas.d.ts +1 -1
  351. package/dist/security/pii-schemas.js +45 -0
  352. package/dist/server-entry.d.ts +2 -2
  353. package/dist/server-entry.js +8 -1
  354. package/dist/server.d.ts +36 -1
  355. package/dist/server.js +183 -1
  356. package/dist/styles.css +412 -80
  357. package/dist/tailwind-utilities.css +1 -1
  358. package/dist/tokens/themes/default-dark.js +1 -0
  359. package/dist/tokens/themes/default-light.js +1 -0
  360. package/dist/tokens/themes/required.d.ts +1 -1
  361. package/dist/tokens/themes/required.js +1 -0
  362. package/dist/tokens/tokens.css +15 -0
  363. package/dist/ui/components/Button.d.ts +10 -1
  364. package/dist/ui/components/Button.js +25 -3
  365. package/dist/ui/components/Chart.d.ts +63 -0
  366. package/dist/ui/components/Chart.js +169 -0
  367. package/dist/ui/components/Chart.style.css +214 -0
  368. package/dist/ui/components/Disclaimer.d.ts +19 -0
  369. package/dist/ui/components/Disclaimer.js +83 -0
  370. package/dist/ui/components/OverflowRow.js +54 -2
  371. package/dist/ui/components/OverflowRow.style.css +38 -0
  372. package/dist/ui/components/RichTextEditor.js +99 -8
  373. package/dist/ui/components/chart-spec.d.ts +68 -0
  374. package/dist/ui/components/chart-spec.js +140 -0
  375. package/dist/ui/components/index.style.css +1 -0
  376. package/dist/ui/components/surface-tokens.d.ts +1 -1
  377. package/dist/ui/components/surface-tokens.js +9 -0
  378. package/dist/ui/components/tabs-overflow.js +64 -11
  379. package/dist/ui/components/toolbar-collapse.d.ts +13 -0
  380. package/dist/ui/components/toolbar-collapse.js +10 -1
  381. package/dist/ui/index.d.ts +8 -0
  382. package/dist/ui/index.js +9 -0
  383. package/dist/ui/rich-text/RichText.d.ts +10 -1
  384. package/dist/ui/rich-text/RichText.js +33 -2
  385. package/dist/ui/rich-text/RichText.style.css +83 -79
  386. package/dist/ui/rich-text/RichTextRenderer.d.ts +30 -1
  387. package/dist/ui/rich-text/RichTextRenderer.js +34 -2
  388. package/dist/ui/rich-text/chart-blocks.d.ts +62 -0
  389. package/dist/ui/rich-text/chart-blocks.js +87 -0
  390. package/package.json +1 -1
  391. package/scripts/seed-cli.mjs +1834 -1822
@@ -129,6 +129,10 @@ export const ADMIN_ENDPOINTS = {
129
129
  /** The action-index control plane (W7 / D7) — GET the whole index, PATCH one override. */
130
130
  ACTION_INDEX: "/api/admin/action-index",
131
131
  AD_BY_ID: (id) => `/api/admin/ads/${id}`,
132
+ /** D56 — the self-serve creative moderation queue. */
133
+ AD_BOOKINGS: "/api/admin/ads/bookings",
134
+ /** D56 — approve or reject one creative. A rejection REQUIRES a note. */
135
+ AD_BOOKING_MODERATE: (id) => `/api/admin/ads/bookings/${id}/moderate`,
132
136
  PAYMENTS_SETTINGS: "/api/admin/payments/settings",
133
137
  PRODUCTS: "/api/admin/products",
134
138
  PRODUCT_BY_ID: (id) => `/api/admin/products/${id}`,
@@ -141,6 +145,12 @@ export const ADMIN_ENDPOINTS = {
141
145
  ORDER_PAYMENT_VERIFY: (id) => `/api/admin/orders/${id}/payment-verify`,
142
146
  ORDER_PAYMENT_REUPLOAD: (id) => `/api/admin/orders/${id}/payment-reupload`,
143
147
  ORDER_PAYMENT_REJECT_FRAUD: (id) => `/api/admin/orders/${id}/payment-reject-fraud`,
148
+ /*
149
+ * D55 — approve or reject a pre-order BALANCE proof. Separate from the
150
+ * three `ORDER_PAYMENT_*` routes above, which review the DEPOSIT: the two
151
+ * payments are months apart and each carries its own proof, status and note.
152
+ */
153
+ ORDER_BALANCE_REVIEW: (id) => `/api/admin/orders/${id}/balance-review`,
144
154
  USERS: "/api/admin/users",
145
155
  USERS_BULK: "/api/admin/users/bulk",
146
156
  USER_BY_ID: (uid) => `/api/admin/users/${uid}`,
@@ -187,6 +197,14 @@ export const ADMIN_ENDPOINTS = {
187
197
  PAYOUTS_EXPORT: "/api/admin/payouts/export",
188
198
  AUDIT_LOG: "/api/admin/audit-log",
189
199
  AUDIT_LOG_BY_ID: (id) => `/api/admin/audit-log/${id}`,
200
+ /**
201
+ * Phase 7 — the GSTR-1 DRAFT export. Takes `?from=&to=` as YYYY-MM-DD and
202
+ * returns a CSV.
203
+ *
204
+ * 🛑 "draft" is in the filename for a reason: nothing in this codebase talks
205
+ * to the GST portal, and the file is the input to a human filing.
206
+ */
207
+ INVOICING_GSTR1: "/api/admin/invoicing/gstr1",
190
208
  /*
191
209
  * Payment protection. `payment-cases` is NOT under `maintenance/` — see the
192
210
  * route-map entry for why: maintenance means "something broke, look when you
@@ -325,6 +343,19 @@ export const CART_ENDPOINTS = {
325
343
  SELECTION: "/api/cart/selection",
326
344
  /** Per-store paid add-on selections — the source of truth for what's charged. */
327
345
  ADDONS: "/api/cart/addons",
346
+ /**
347
+ * Pay with points, on or off (D46/D47). A boolean and nothing else — the
348
+ * AMOUNT is derived server-side from the live balance and the 50% cap, which
349
+ * is why there is no `/api/cart/points/amount`.
350
+ */
351
+ POINTS: "/api/cart/points",
352
+ /**
353
+ * The instalment plan — a TENURE and nothing else. It lives on the cart,
354
+ * not in a checkout body, because the online path needs the same answer in
355
+ * two requests (`/api/payment/create-order` captures, `/api/payment/verify`
356
+ * writes the order). Same reasoning as `POINTS` and `ADDONS` above.
357
+ */
358
+ EMI: "/api/cart/emi",
328
359
  COUPON: "/api/cart/coupon",
329
360
  /**
330
361
  * Add a buyer-assembled group selection as ONE line. Separate from `GET`'s
@@ -575,6 +606,13 @@ export const ORDER_ENDPOINTS = {
575
606
  BY_ID: (id) => `/api/orders/${id}`,
576
607
  TRACK: (trackingId) => `/api/orders/track/${trackingId}`,
577
608
  PAYMENT_PROOF: (id) => `/api/orders/${id}/payment-proof`,
609
+ /*
610
+ * D55 — proof of paying a pre-order BALANCE. Deliberately a separate
611
+ * endpoint from `PAYMENT_PROOF`, which is the DEPOSIT's: a pre-order has
612
+ * two payments months apart, and writing the second over the first would
613
+ * destroy the evidence for the payment that created the order.
614
+ */
615
+ BALANCE_PROOF: (id) => `/api/orders/${id}/balance-proof`,
578
616
  DISPUTE: (id) => `/api/orders/${id}/dispute`,
579
617
  };
580
618
  // ---------------------------------------------------------------------------
@@ -643,6 +681,23 @@ export const SELLER_ENDPOINTS = {
643
681
  PRODUCTS: "/api/store/products",
644
682
  ORDERS: "/api/store/orders",
645
683
  ORDERS_BY_ID: (orderId) => `/api/store/orders/${orderId}`,
684
+ /**
685
+ * Dispatch — BOTH branches of `shipOrderSchema`'s discriminated union.
686
+ *
687
+ * `method: "custom"` records a carrier the seller posted themselves;
688
+ * `method: "platform"` enqueues a booking through our own account. One
689
+ * route, because they are one decision — a second endpoint for the
690
+ * platform branch would be the same handler behind two ceilings, which is
691
+ * Root Cause #85.
692
+ */
693
+ ORDER_SHIP: (orderId) => `/api/store/orders/${orderId}/ship`,
694
+ /*
695
+ * D55 — "the goods have landed, the balance is now payable". An EVENT, not
696
+ * a derived state: a pre-order's premise is that the item does not exist
697
+ * yet, so the balance becomes collectable when the seller says stock
698
+ * arrived, and the buyer's 7-day window runs from that moment.
699
+ */
700
+ ORDER_OPEN_BALANCE: (orderId) => `/api/store/orders/${orderId}/open-balance`,
646
701
  AUCTIONS: "/api/store/products",
647
702
  COUPONS: "/api/store/coupons",
648
703
  COUPON_BY_ID: (id) => `/api/store/coupons/${id}`,
@@ -230,6 +230,17 @@ export declare const ORDER_FIELDS: {
230
230
  readonly TOTAL_AMOUNT: "totalAmount";
231
231
  readonly BUYER_ID: "buyerId";
232
232
  readonly BUNDLE_ID: "bundleId";
233
+ /**
234
+ * Which checkout LANE produced this order (`standard` / `auction` / `offer`
235
+ * / `preorder` / `prize-draw`) — see § "Checkout Lanes".
236
+ *
237
+ * 🛑 Never filter `orderType == "standard"` in a query. Orders written
238
+ * before the field existed carry no value at all, and a Firestore equality
239
+ * cannot match an absent field, so that filter silently drops every legacy
240
+ * order. `UserOrdersView` filters the standard lane in memory for exactly
241
+ * this reason; the other four values are safe as equalities.
242
+ */
243
+ readonly ORDER_TYPE: "orderType";
233
244
  readonly CREATED_AT: "createdAt";
234
245
  readonly UPDATED_AT: "updatedAt";
235
246
  readonly PAYMENT_DEADLINE: "paymentDeadline";
@@ -835,6 +846,7 @@ export declare const COUPON_FIELDS: {
835
846
  readonly FIXED: "fixed";
836
847
  readonly FREE_SHIPPING: "free_shipping";
837
848
  readonly BUY_X_GET_Y: "buy_x_get_y";
849
+ readonly POINTS_EARN: "points_earn";
838
850
  };
839
851
  readonly SCOPE_VALUES: {
840
852
  readonly ADMIN: "admin";
@@ -999,6 +1011,36 @@ export declare const REFUND_CLAIM_FIELDS: {
999
1011
  export declare const PRICE_OBSERVATION_FIELDS: {
1000
1012
  readonly CATEGORY_ID: "categoryId";
1001
1013
  };
1014
+ /**
1015
+ * A TTL-bounded hold on units of a product. See
1016
+ * `features/inventory/schemas/stock-reservation.ts` for why a reservation is
1017
+ * its own document rather than a counter on the product: the row and the
1018
+ * counter move in ONE transaction, so a crash between them is impossible.
1019
+ */
1020
+ export declare const STOCK_RESERVATION_FIELDS: {
1021
+ readonly PRODUCT_ID: "productId";
1022
+ readonly QUANTITY: "quantity";
1023
+ readonly HOLDER_KIND: "holderKind";
1024
+ readonly HOLDER_ID: "holderId";
1025
+ readonly CREATED_BY: "createdBy";
1026
+ readonly STATUS: "status";
1027
+ readonly EXPIRES_AT: "expiresAt";
1028
+ readonly ENDED_AT: "endedAt";
1029
+ readonly ENDED_REASON: "endedReason";
1030
+ };
1031
+ /**
1032
+ * One advertiser's booking of one placement for one period. The document id
1033
+ * IS the lock (`adBookingId`), so there is deliberately no `period`+`placementId`
1034
+ * uniqueness query to write — see `features/ads/schemas/firestore.ts`.
1035
+ */
1036
+ export declare const AD_BOOKING_FIELDS: {
1037
+ readonly PLACEMENT_ID: "placementId";
1038
+ readonly PERIOD: "period";
1039
+ readonly ADVERTISER_UID: "advertiserUid";
1040
+ readonly PAYMENT_STATE: "paymentState";
1041
+ readonly CANCELLED_AT: "cancelledAt";
1042
+ readonly CREATED_AT: "createdAt";
1043
+ };
1002
1044
  export declare const OAUTH_STATE_VALUES: {
1003
1045
  readonly PENDING: "pending";
1004
1046
  readonly USED: "used";
@@ -258,6 +258,17 @@ export const ORDER_FIELDS = {
258
258
  TOTAL_AMOUNT: "totalAmount",
259
259
  BUYER_ID: "buyerId",
260
260
  BUNDLE_ID: "bundleId",
261
+ /**
262
+ * Which checkout LANE produced this order (`standard` / `auction` / `offer`
263
+ * / `preorder` / `prize-draw`) — see § "Checkout Lanes".
264
+ *
265
+ * 🛑 Never filter `orderType == "standard"` in a query. Orders written
266
+ * before the field existed carry no value at all, and a Firestore equality
267
+ * cannot match an absent field, so that filter silently drops every legacy
268
+ * order. `UserOrdersView` filters the standard lane in memory for exactly
269
+ * this reason; the other four values are safe as equalities.
270
+ */
271
+ ORDER_TYPE: "orderType",
261
272
  CREATED_AT: "createdAt",
262
273
  UPDATED_AT: "updatedAt",
263
274
  PAYMENT_DEADLINE: "paymentDeadline",
@@ -1003,6 +1014,11 @@ export const COUPON_FIELDS = {
1003
1014
  FIXED: "fixed",
1004
1015
  FREE_SHIPPING: "free_shipping",
1005
1016
  BUY_X_GET_Y: "buy_x_get_y",
1017
+ // D51. 🛑 This file calls itself canonical and has been stale twice
1018
+ // (EVENT_FIELDS invented a "published" status, SCAMMER_FIELDS lost
1019
+ // "removed") — Root Cause #34. The authority is `CouponType` in
1020
+ // features/promotions/types; this mirror has to follow it.
1021
+ POINTS_EARN: "points_earn",
1006
1022
  },
1007
1023
  SCOPE_VALUES: {
1008
1024
  ADMIN: "admin",
@@ -1198,6 +1214,42 @@ export const PRICE_OBSERVATION_FIELDS = {
1198
1214
  CATEGORY_ID: "categoryId",
1199
1215
  };
1200
1216
  // ============================================================================
1217
+ // STOCK RESERVATIONS
1218
+ // ============================================================================
1219
+ /**
1220
+ * A TTL-bounded hold on units of a product. See
1221
+ * `features/inventory/schemas/stock-reservation.ts` for why a reservation is
1222
+ * its own document rather than a counter on the product: the row and the
1223
+ * counter move in ONE transaction, so a crash between them is impossible.
1224
+ */
1225
+ export const STOCK_RESERVATION_FIELDS = {
1226
+ PRODUCT_ID: "productId",
1227
+ QUANTITY: "quantity",
1228
+ HOLDER_KIND: "holderKind",
1229
+ HOLDER_ID: "holderId",
1230
+ CREATED_BY: "createdBy",
1231
+ STATUS: "status",
1232
+ EXPIRES_AT: "expiresAt",
1233
+ ENDED_AT: "endedAt",
1234
+ ENDED_REASON: "endedReason",
1235
+ };
1236
+ // ============================================================================
1237
+ // AD BOOKINGS
1238
+ // ============================================================================
1239
+ /**
1240
+ * One advertiser's booking of one placement for one period. The document id
1241
+ * IS the lock (`adBookingId`), so there is deliberately no `period`+`placementId`
1242
+ * uniqueness query to write — see `features/ads/schemas/firestore.ts`.
1243
+ */
1244
+ export const AD_BOOKING_FIELDS = {
1245
+ PLACEMENT_ID: "placementId",
1246
+ PERIOD: "period",
1247
+ ADVERTISER_UID: "advertiserUid",
1248
+ PAYMENT_STATE: "paymentState",
1249
+ CANCELLED_AT: "cancelledAt",
1250
+ CREATED_AT: "createdAt",
1251
+ };
1252
+ // ============================================================================
1201
1253
  // OAUTH STATE VALUES
1202
1254
  // ============================================================================
1203
1255
  export const OAUTH_STATE_VALUES = {
@@ -4,7 +4,7 @@ export type { EmailAttachment, EmailOptions, EmailResult, IEmailProvider, } from
4
4
  export type { UploadOptions, StorageFile, IStorageProvider } from "./storage";
5
5
  export type { PaymentOrder, PaymentCapture, Refund, Dispute, GatewayPaymentRecord, } from "./payment";
6
6
  export { IPaymentProvider } from "./payment";
7
- export type { ShippingAddress, CreateShipmentInput, Shipment, TrackingEvent, TrackingInfo, ServiceabilityResult, } from "./shipping";
7
+ export type { ShippingAddress, CreateShipmentInput, Shipment, TrackingEvent, TrackingInfo, ServiceabilityResult, WalletBalance, } from "./shipping";
8
8
  export { IShippingProvider } from "./shipping";
9
9
  export type { SearchOptions, SearchHit, SearchResult, SuggestOptions, ISearchProvider, } from "./search";
10
10
  export type { ICacheProvider, QueueJob, IQueueProvider, EventHandler, IEventBus, } from "./infra";
@@ -50,6 +50,38 @@ export interface ServiceabilityResult {
50
50
  rate: number;
51
51
  }>;
52
52
  }
53
+ /**
54
+ * A courier provider's prepaid balance.
55
+ *
56
+ * 🛑 THREE states, not two, and collapsing them is the whole hazard:
57
+ *
58
+ * - `{ known: false, supported: false }` — this provider has no wallet at all
59
+ * (manual shipping). Nothing to check, ever.
60
+ * - `{ known: false, supported: true }` — it HAS one and we could not read it
61
+ * right now (network, malformed payload, auth). **Treat as "attempt the
62
+ * booking"**: the attempt's own failure is the authority, and refusing on an
63
+ * unreadable balance would degrade every order on a transient blip.
64
+ * - `{ known: true, amount }` — a real figure.
65
+ *
66
+ * A balance of `0` is the LAST of those, and is a decision to skip. "I could
67
+ * not read it" is not "there is no money".
68
+ *
69
+ * 🛑 There is deliberately NO `creditLimit` field. Measured against the live
70
+ * Shiprocket API 2026-10-22: `GET /account/details/wallet-balance` returns
71
+ * `{ data: { balance_amount: string } }` and nothing else, and
72
+ * `/account/details` is a 404. So postpaid credit is not readable, and a field
73
+ * with no producer is the speculative-infra pattern this codebase refuses.
74
+ * When postpaid is granted, re-probe and add it then.
75
+ */
76
+ export type WalletBalance = {
77
+ known: true;
78
+ amount: number;
79
+ currency?: string;
80
+ } | {
81
+ known: false;
82
+ supported: boolean;
83
+ reason?: string;
84
+ };
53
85
  /**
54
86
  * Shipping carrier adapter contract. An abstract base class rather than a
55
87
  * plain interface so every provider (manual, and any future carrier
@@ -66,4 +98,17 @@ export declare abstract class IShippingProvider {
66
98
  abstract cancelShipment(shipmentId: string): Promise<void>;
67
99
  abstract checkServiceability(pincode: string, weight: number): Promise<ServiceabilityResult>;
68
100
  abstract generateLabel(shipmentId: string): Promise<ArrayBuffer>;
101
+ /**
102
+ * The provider's prepaid balance, when it HAS one.
103
+ *
104
+ * 🛑 Deliberately NOT abstract. Manual shipping has no wallet — a seller
105
+ * posts the parcel and claims the cost back — so an abstract member would
106
+ * force every implementation to invent an answer. A non-abstract default is
107
+ * the established shape here for a capability a provider lacks (the dispute
108
+ * contract's `listDisputes() => []` is the precedent).
109
+ *
110
+ * The default says "I do not have one", which is TRUE for manual and is not
111
+ * the same statement as "I have one and it is empty".
112
+ */
113
+ getWalletBalance(): Promise<WalletBalance>;
69
114
  }
@@ -9,4 +9,19 @@
9
9
  * Implemented by the manual provider (default) and its mock.
10
10
  */
11
11
  export class IShippingProvider {
12
+ /**
13
+ * The provider's prepaid balance, when it HAS one.
14
+ *
15
+ * 🛑 Deliberately NOT abstract. Manual shipping has no wallet — a seller
16
+ * posts the parcel and claims the cost back — so an abstract member would
17
+ * force every implementation to invent an answer. A non-abstract default is
18
+ * the established shape here for a capability a provider lacks (the dispute
19
+ * contract's `listDisputes() => []` is the precedent).
20
+ *
21
+ * The default says "I do not have one", which is TRUE for manual and is not
22
+ * the same statement as "I have one and it is empty".
23
+ */
24
+ async getWalletBalance() {
25
+ return { known: false, supported: false };
26
+ }
12
27
  }
@@ -2,5 +2,5 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Anchor, Avatar, Badge, Card, Div, Heading, Row, Section, Span, Stack, Text, TextLink } from "../../../ui/index.js";
3
3
  import { ROUTES } from "../../../constants/index.js";
4
4
  export function AboutView({ labels = {}, howItems = [], valueItems = [], milestones = [], teamMembers = [], ctaBannerClass = "", renderCtaButtons, }) {
5
- return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "y-4xl", children: _jsxs(Div, { paddingX: "x-page", className: "max-w-4xl mx-auto text-center", children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-6", mdSize: "5xl", size: "4xl", weight: "bold", children: labels.title }), _jsx(Text, { color: "inverse-muted", variant: "none", className: "max-w-2xl mx-auto", size: "xl", children: labels.subtitle })] }) }), _jsxs(Div, { paddingX: "x-page", className: "max-w-5xl mx-auto", padding: "y-4xl", children: [_jsxs(Section, { className: "text-center max-w-3xl mx-auto", children: [_jsx(Heading, { level: 2, className: "mb-4", children: labels.missionTitle }), _jsx(Text, { size: "lg", variant: "secondary", className: "leading-relaxed", children: labels.missionText })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-12", align: "center", children: labels.howItWorksTitle }), _jsx(Div, { className: "grid md:grid-cols-3", gap: "6", children: howItems.map(({ title, text, icon, tone }) => (_jsxs(Card, { variant: `gradient-${tone ?? "indigo"}`, padding: "md", spacing: "sm", children: [_jsx(Div, { children: _jsx(Span, { size: "4xl", children: icon }) }), _jsx(Heading, { level: 3, children: title }), _jsx(Text, { size: "sm", variant: "secondary", className: "leading-relaxed", children: text })] }, title))) })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: labels.valuesSubtitle ? "mb-3" : "mb-12", align: "center", children: labels.valuesTitle }), labels.valuesSubtitle && (_jsx(Text, { size: "base", variant: "secondary", align: "center", className: "mb-12 max-w-2xl mx-auto leading-relaxed", children: labels.valuesSubtitle })), _jsx(Div, { className: "grid md:grid-cols-3", gap: "5", children: valueItems.map(({ title, text, icon, detail }) => (_jsxs(Stack, { gap: "3", surface: "default", padding: "lg", rounded: "xl", border: "default", children: [_jsx(Div, { children: _jsx(Span, { size: "3xl", children: icon }) }), _jsx(Heading, { level: 3, children: title }), _jsx(Text, { size: "sm", variant: "secondary", className: "leading-relaxed", children: text }), detail && (_jsx(Text, { size: "sm", color: "muted", className: "leading-relaxed", children: detail }))] }, title))) }), labels.valuesLinkLabel && (_jsx(Div, { className: "mt-8 text-center", children: _jsx(TextLink, { href: String(ROUTES.PUBLIC.ETHICS), size: "sm", children: labels.valuesLinkLabel }) }))] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-10", align: "center", children: labels.milestonesTitle }), _jsx(Stack, { className: "relative border-l-2 border-primary/30 max-w-2xl mx-auto pl-[2rem]", gap: "xl", children: milestones.map(({ year, text }) => (_jsxs(Div, { className: "relative", children: [_jsx(Div, { className: "absolute -left-10 top-1 w-4 h-4 bg-primary border-2 border-white", rounded: "full" }), _jsx(Span, { size: "xs", weight: "bold", className: "text-primary tracking-wide", transform: "uppercase", children: year }), _jsx(Text, { className: "mt-1", children: text })] }, year))) })] }), teamMembers.length > 0 && (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-2", align: "center", children: labels.teamTitle }), labels.teamSubtitle && (_jsx(Text, { size: "lg", variant: "secondary", align: "center", className: "mb-12 max-w-2xl mx-auto", children: labels.teamSubtitle })), _jsx(Div, { className: "grid md:grid-cols-3", gap: "6", children: teamMembers.map((member) => (_jsxs(Stack, { gap: "3", surface: "default", padding: "lg", rounded: "xl", border: "default", align: "center", className: "text-center", children: [_jsx(Avatar, { src: member.photoUrl, name: member.name, alt: member.name, size: "lg" }), _jsx(Heading, { level: 3, children: member.name }), _jsxs(Row, { gap: "xs", wrap: true, justify: "center", children: [_jsx(Span, { size: "xs", weight: "bold", className: "text-primary tracking-wide", transform: "uppercase", children: member.role }), member.isFounder && _jsx(Badge, { variant: "primary", size: "xs", children: "Founder" }), member.isDeveloper && _jsx(Badge, { variant: "secondary", size: "xs", children: "Developer" })] }), _jsx(Text, { size: "sm", variant: "secondary", className: "leading-relaxed", children: member.bio }), member.githubUrl && (_jsx(Anchor, { href: member.githubUrl, tone: "muted", size: "sm", underline: "hover", children: "GitHub \u2197" }))] }, member.name))) })] })), _jsxs(Section, { color: "inverse", tone: "accent-banner", className: `text-center ${ctaBannerClass}`, padding: "xl", rounded: "2xl", children: [_jsx(Heading, { color: "inverse", level: 2, variant: "none", className: "mb-8", size: "3xl", weight: "bold", children: labels.ctaTitle }), renderCtaButtons ? (renderCtaButtons()) : (_jsx(Row, { justify: "center", gap: "3", wrap: true, children: _jsxs(Span, { color: "inverse-muted", size: "sm", children: [labels.ctaSell, " \u00B7 ", labels.ctaShop] }) }))] })] })] }));
5
+ return (_jsxs(Div, { className: "-mx-4 md:-mx-6 lg:-mx-8 -mt-6 sm:-mt-8 lg:-mt-10", children: [_jsx(Section, { color: "inverse", tone: "accent-banner", padding: "y-4xl", children: _jsxs(Div, { paddingX: "x-page", className: "max-w-4xl mx-auto text-center", children: [_jsx(Heading, { color: "inverse", level: 1, variant: "none", className: "mb-6", mdSize: "5xl", size: "4xl", weight: "bold", children: labels.title }), _jsx(Text, { color: "inverse-muted", variant: "none", className: "max-w-2xl mx-auto", size: "xl", children: labels.subtitle })] }) }), _jsxs(Stack, { gap: "section", paddingX: "x-page", className: "max-w-5xl mx-auto", padding: "y-4xl", children: [_jsxs(Section, { className: "text-center max-w-3xl mx-auto", children: [_jsx(Heading, { level: 2, className: "mb-4", children: labels.missionTitle }), _jsx(Text, { size: "lg", variant: "secondary", className: "leading-relaxed", children: labels.missionText })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-12", align: "center", children: labels.howItWorksTitle }), _jsx(Div, { className: "grid md:grid-cols-3", gap: "6", children: howItems.map(({ title, text, icon, tone }) => (_jsxs(Card, { variant: `gradient-${tone ?? "indigo"}`, padding: "md", spacing: "sm", children: [_jsx(Div, { children: _jsx(Span, { size: "4xl", children: icon }) }), _jsx(Heading, { level: 3, color: "inverse", variant: "none", children: title }), _jsx(Text, { size: "sm", color: "inverse-muted", variant: "none", className: "leading-relaxed", children: text })] }, title))) })] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: labels.valuesSubtitle ? "mb-3" : "mb-12", align: "center", children: labels.valuesTitle }), labels.valuesSubtitle && (_jsx(Text, { size: "base", variant: "secondary", align: "center", className: "mb-12 max-w-2xl mx-auto leading-relaxed", children: labels.valuesSubtitle })), _jsx(Div, { className: "grid md:grid-cols-3", gap: "5", children: valueItems.map(({ title, text, icon, detail }) => (_jsxs(Stack, { gap: "3", surface: "default", padding: "lg", rounded: "xl", border: "default", children: [_jsx(Div, { children: _jsx(Span, { size: "3xl", children: icon }) }), _jsx(Heading, { level: 3, children: title }), _jsx(Text, { size: "sm", variant: "secondary", className: "leading-relaxed", children: text }), detail && (_jsx(Text, { size: "sm", color: "muted", className: "leading-relaxed", children: detail }))] }, title))) }), labels.valuesLinkLabel && (_jsx(Div, { className: "mt-8 text-center", children: _jsx(TextLink, { href: String(ROUTES.PUBLIC.ETHICS), size: "sm", children: labels.valuesLinkLabel }) }))] }), _jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-10", align: "center", children: labels.milestonesTitle }), _jsx(Stack, { className: "relative border-l-2 border-primary/30 max-w-2xl mx-auto pl-[2rem]", gap: "xl", children: milestones.map(({ year, text }) => (_jsxs(Div, { className: "relative", children: [_jsx(Div, { className: "absolute -left-10 top-1 w-4 h-4 bg-primary border-2 border-white", rounded: "full" }), _jsx(Span, { size: "xs", weight: "bold", className: "text-primary tracking-wide", transform: "uppercase", children: year }), _jsx(Text, { className: "mt-1", children: text })] }, year))) })] }), teamMembers.length > 0 && (_jsxs(Section, { children: [_jsx(Heading, { level: 2, className: "mb-2", align: "center", children: labels.teamTitle }), labels.teamSubtitle && (_jsx(Text, { size: "lg", variant: "secondary", align: "center", className: "mb-12 max-w-2xl mx-auto", children: labels.teamSubtitle })), _jsx(Div, { className: "grid md:grid-cols-3", gap: "6", children: teamMembers.map((member) => (_jsxs(Stack, { gap: "3", surface: "default", padding: "lg", rounded: "xl", border: "default", align: "center", className: "text-center", children: [_jsx(Avatar, { src: member.photoUrl, name: member.name, alt: member.name, size: "lg" }), _jsx(Heading, { level: 3, children: member.name }), _jsxs(Row, { gap: "xs", wrap: true, justify: "center", children: [_jsx(Span, { size: "xs", weight: "bold", className: "text-primary tracking-wide", transform: "uppercase", children: member.role }), member.isFounder && _jsx(Badge, { variant: "primary", size: "xs", children: "Founder" }), member.isDeveloper && _jsx(Badge, { variant: "secondary", size: "xs", children: "Developer" })] }), _jsx(Text, { size: "sm", variant: "secondary", className: "leading-relaxed", children: member.bio }), member.githubUrl && (_jsx(Anchor, { href: member.githubUrl, tone: "muted", size: "sm", underline: "hover", children: "GitHub \u2197" }))] }, member.name))) })] })), _jsxs(Section, { color: "inverse", tone: "accent-banner", className: `text-center ${ctaBannerClass}`, padding: "xl", rounded: "2xl", children: [_jsx(Heading, { color: "inverse", level: 2, variant: "none", className: "mb-8", size: "3xl", weight: "bold", children: labels.ctaTitle }), renderCtaButtons ? (renderCtaButtons()) : (_jsx(Row, { justify: "center", gap: "3", wrap: true, children: _jsxs(Span, { color: "inverse-muted", size: "sm", children: [labels.ctaSell, " \u00B7 ", labels.ctaShop] }) }))] })] })] }));
6
6
  }
@@ -2,6 +2,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { Gavel, TrendingUp, Trophy, AlertTriangle, Package, XCircle, ShieldCheck } from "lucide-react";
3
3
  import { Alert, Div, Heading, Li, Row, Section, Span, Stack, Text, Ul } from "../../../ui/index.js";
4
4
  import { GC } from "../../_guide-cls.js";
5
+ import { resolvePublishedValues } from "../../../_internal/shared/content/published-values.js";
6
+ /* Phase 9 — one definition of the refund timeline. See the 🛑 at the call site. */
7
+ const { refundBusinessDaysMin: REFUND_DAYS_MIN, refundBusinessDaysMax: REFUND_DAYS_MAX } = resolvePublishedValues();
5
8
  const SECTIONS = [
6
9
  {
7
10
  Icon: Gavel, title: "How Auctions Work",
@@ -25,7 +28,7 @@ const SECTIONS = [
25
28
  },
26
29
  {
27
30
  Icon: XCircle, iconCls: "w-5 h-5 text-rose-500", title: "Pre-order Cancellations",
28
- content: (_jsxs(_Fragment, { children: [_jsxs(Text, { className: `${GC.textMuted} mb-3`, children: ["To cancel a pre-order before the item is shipped, open a support ticket with category ", _jsx(Span, { weight: "bold", children: "Billing & Payment" }), " or ", _jsx(Span, { weight: "bold", children: "Order Issue" }), " and reference your order ID."] }), _jsx(Text, { className: GC.textMuted, children: "After cancellation is accepted, refunds follow the standard timeline: 3\u20137 business days to your original payment method." })] })),
31
+ content: (_jsxs(_Fragment, { children: [_jsxs(Text, { className: `${GC.textMuted} mb-3`, children: ["To cancel a pre-order before the item is shipped, open a support ticket with category ", _jsx(Span, { weight: "bold", children: "Billing & Payment" }), " or ", _jsx(Span, { weight: "bold", children: "Order Issue" }), " and reference your order ID."] }), _jsxs(Text, { className: GC.textMuted, children: ["After cancellation is accepted, refunds follow the standard timeline:", " ", REFUND_DAYS_MIN, "\u2013", REFUND_DAYS_MAX, " business days to your original payment method."] })] })),
29
32
  },
30
33
  {
31
34
  Icon: ShieldCheck, iconCls: "w-5 h-5 text-emerald-500", title: "Bidding Safety Tips",
@@ -9,6 +9,7 @@ import { PaginatedSelect } from "../../../ui/components/PaginatedSelect.js";
9
9
  import { DataListingView } from "../../admin/components/DataListingView.js";
10
10
  import { OrderCard } from "../../orders/components/OrdersList.js";
11
11
  import { useOrderScope } from "../../orders/components/OrderScopeTabs.js";
12
+ import { ORDER_LANE_TABS } from "../../orders/constants/order-lane-tabs.js";
12
13
  import { useSearchParams } from "next/navigation.js";
13
14
  const CANCELLABLE_STATUSES = new Set(["pending", "confirmed", "processing"]);
14
15
  /*
@@ -34,40 +35,20 @@ const SORT_OPTIONS = [
34
35
  { value: sortBy("totalPrice", "DESC"), label: "Highest total" },
35
36
  { value: sortBy("totalPrice", "ASC"), label: "Lowest total" },
36
37
  ];
37
- /**
38
- * Lane tabs — the same auction > offer > standard split the cart and checkout
39
- * use, viewed after the fact. Every `id` is EXACTLY a stored
40
- * `OrderDocument.orderType` value (or "" for All): a tab id that doesn't
41
- * match a real stored value returns zero rows forever with no error anywhere
42
- * (CLAUDE.md Root Cause #33).
38
+ /*
39
+ * Lane tabs now come from `features/orders/constants/order-lane-tabs`, shared
40
+ * with the seller's order list.
43
41
  *
44
- * "standard" is filtered in memory server-side, because orders written before
45
- * `orderType` existed have no such field and a Firestore `==` would exclude
46
- * every one of them.
42
+ * They were defined here as a local array literal, which meant the seller's
43
+ * list could not have them without a tenth hand-written copy of one union
44
+ * (Root Cause #61). The shared version derives from a
45
+ * `Record<OrderType, string>`, so a sixth lane is a compile error rather than
46
+ * a tab that silently never appears — which is the bug this array already had
47
+ * once, shipping four tabs for five lanes.
48
+ *
49
+ * Every id-correctness note that lived here (byte-exact stored values, the
50
+ * unhyphenated `preorder`, and the in-memory `standard` filter) moved with it.
47
51
  */
48
- const ORDER_LANE_TABS = [
49
- { id: "", label: "All" },
50
- { id: "standard", label: "Normal" },
51
- { id: "auction", label: "Auction wins" },
52
- { id: "offer", label: "Offer wins" },
53
- /*
54
- * 🛑 `"preorder"` WITHOUT A HYPHEN, and this is not a typo to tidy up.
55
- *
56
- * `OrderType` (`orders/utils/order-splitter.ts`) spells it `"preorder"`,
57
- * while `ListingType` spells the same concept `"pre-order"` WITH a hyphen.
58
- * Two unions, two spellings, and the tab must match the one actually stored
59
- * on `OrderDocument.orderType` — a tab id matching no stored value returns
60
- * zero rows forever with no error anywhere (Root Cause #33), which is
61
- * exactly the failure this file's own comment above warns about.
62
- *
63
- * These two lanes existed in the union and had no tab, so pre-order and
64
- * prize-draw orders were reachable only by landing on "All" and scrolling.
65
- * Five lanes, four tabs — the eighth instance this session of a
66
- * hand-written enumeration drifting from the union it filters.
67
- */
68
- { id: "preorder", label: "Pre-orders" },
69
- { id: "prize-draw", label: "Prize draws" },
70
- ];
71
52
  /**
72
53
  * Payment-method tabs — a THIRD axis, independent of the lane tabs above and
73
54
  * the lifecycle scope beside them.
@@ -83,9 +64,25 @@ const ORDER_LANE_TABS = [
83
64
  * clause is silently dropped and the chip returns the ENTIRE order list while
84
65
  * looking like a filter (Root Cause #62).
85
66
  */
67
+ /*
68
+ * 🛑 MEASURED 2026-10-22 — this chip group was INERT, and the comment above it
69
+ * explained why it should not have been while describing the wrong half.
70
+ *
71
+ * `buildFilters` emits `paymentMethod==emi` inside `filters`, and
72
+ * `/api/user/orders` regex-extracts only `status==` and `orderType==` from
73
+ * that string. Every other clause is silently dropped — so all three chips
74
+ * returned the buyer's ENTIRE order list while looking exactly like a working
75
+ * filter. The note above was careful about the SIEVE allowlist (Root Cause
76
+ * #62) and the route's own parser was the break, one layer earlier.
77
+ *
78
+ * 🛑 And "EMI plans" could not be a `paymentMethod` value any more regardless:
79
+ * since 0f an instalment order's tender is `online` / `upi_manual` / `cash`,
80
+ * so the id is now `emiEnabled`, refined in memory by the route alongside the
81
+ * other two. `cod` and `online` stay real stored `paymentMethod` values.
82
+ */
86
83
  const PAYMENT_METHOD_TABS = [
87
84
  { id: "", label: "Any" },
88
- { id: "emi", label: "EMI plans" },
85
+ { id: "emiEnabled", label: "EMI plans" },
89
86
  { id: "cod", label: "Cash on delivery" },
90
87
  { id: "online", label: "Paid online" },
91
88
  ];
@@ -153,7 +150,17 @@ export function UserOrdersView({ onOrderClick }) {
153
150
  buildFilters: (state) => [
154
151
  state.status ? sieveFilter("status", SIEVE_OP.EQ, state.status) : null,
155
152
  state.orderType ? sieveFilter("orderType", SIEVE_OP.EQ, state.orderType) : null,
156
- state.paymentMethod ? sieveFilter("paymentMethod", SIEVE_OP.EQ, state.paymentMethod) : null,
153
+ /*
154
+ * 🛑 `emiEnabled` is NOT a `paymentMethod`, so it gets its own clause
155
+ * key — the route refines both in memory (see its note), and emitting
156
+ * `paymentMethod==emiEnabled` would be a filter for a value no order
157
+ * can hold.
158
+ */
159
+ state.paymentMethod
160
+ ? state.paymentMethod === "emiEnabled"
161
+ ? sieveFilter("emiEnabled", SIEVE_OP.EQ, "true")
162
+ : sieveFilter("paymentMethod", SIEVE_OP.EQ, state.paymentMethod)
163
+ : null,
157
164
  ]
158
165
  .filter(Boolean)
159
166
  .join(",") || undefined,
@@ -162,7 +169,12 @@ export function UserOrdersView({ onOrderClick }) {
162
169
  // in flight" without those two questions fighting over one control.
163
170
  buildExtraParams: () => orderScope.extraParams,
164
171
  renderAboveContent: orderScope.renderAboveContent,
165
- renderFilterPanel: ({ pendingFilters, setPendingFilters }) => (_jsxs(Stack, { gap: "md", children: [_jsx(FilterChipGroup, { label: "Type", tabs: ORDER_LANE_TABS, value: pendingFilters.orderType ?? "", onChange: (id) => setPendingFilters((prev) => ({ ...prev, orderType: id })) }), _jsx(FilterChipGroup, { label: "Payment", tabs: PAYMENT_METHOD_TABS, value: pendingFilters.paymentMethod ?? "", onChange: (id) => setPendingFilters((prev) => ({ ...prev, paymentMethod: id })) }), _jsx(Div, { children: _jsx(PaginatedSelect, { value: pendingFilters.status || null, onChange: (v) => setPendingFilters((p) => ({ ...p, status: v ?? "" })), options: STATUS_OPTIONS, placeholder: "All statuses", ariaLabel: "Filter by order status" }) })] })),
172
+ renderFilterPanel: ({ pendingFilters, setPendingFilters }) => (_jsxs(Stack, { gap: "md", children: [_jsx(FilterChipGroup, { label: "Type",
173
+ // No cast: `FilterChipGroup.tabs` is `readonly FilterChipGroupTab[]`,
174
+ // which the shared constant already satisfies. The `as unknown as`
175
+ // here was working around the local `as const` literal, not a real
176
+ // mismatch.
177
+ tabs: ORDER_LANE_TABS, value: pendingFilters.orderType ?? "", onChange: (id) => setPendingFilters((prev) => ({ ...prev, orderType: id })) }), _jsx(FilterChipGroup, { label: "Payment", tabs: PAYMENT_METHOD_TABS, value: pendingFilters.paymentMethod ?? "", onChange: (id) => setPendingFilters((prev) => ({ ...prev, paymentMethod: id })) }), _jsx(Div, { children: _jsx(PaginatedSelect, { value: pendingFilters.status || null, onChange: (v) => setPendingFilters((p) => ({ ...p, status: v ?? "" })), options: STATUS_OPTIONS, placeholder: "All statuses", ariaLabel: "Filter by order status" }) })] })),
166
178
  renderCards: (rows, _view, _selection, isLoading) => {
167
179
  if (isLoading) {
168
180
  return (_jsx(Stack, { gap: "md", children: Array.from({ length: 3 }).map((_, i) => (_jsx(Div, { className: "h-24 animate-pulse border border-[var(--appkit-color-border)]", rounded: "xl" }, i))) }));
@@ -22,11 +22,28 @@ const __P = {
22
22
  const __O = {
23
23
  yAuto: "overflow-y-auto",
24
24
  };
25
+ /*
26
+ * 🛑 Not derived from `COUPON_TYPE_LABELS` on purpose, and the reason is the
27
+ * opposite of what the duplication framework usually says.
28
+ *
29
+ * `points_earn` is OFFERED here, so an admin can create a points offer — but
30
+ * the editor's discount fields (`discount.value`, `maxDiscount`,
31
+ * `minPurchase`) are meaningless for it, and it carries `pointsPercent`
32
+ * instead. Deriving the list would silently add the option the moment the
33
+ * union grew, which is how `AdminEventsView` ended up offering `contest`,
34
+ * `giveaway` and `flash-sale` — three values `EventType` never had, each
35
+ * matching zero rows forever (Root Cause #72).
36
+ *
37
+ * So the list is explicit and the entry is deliberate.
38
+ * `audit-filter-tab-enums` covers the chip row, which is the surface where
39
+ * coverage actually matters.
40
+ */
25
41
  const TYPE_OPTIONS = [
26
42
  { label: "Percentage Discount", value: "percentage" },
27
43
  { label: "Fixed Amount Discount", value: "fixed" },
28
44
  { label: "Free Shipping", value: "free_shipping" },
29
45
  { label: "Buy X Get Y", value: "buy_x_get_y" },
46
+ { label: "Points Back (awards points, no discount)", value: "points_earn" },
30
47
  ];
31
48
  // --- Helpers -----------------------------------------------------------------
32
49
  function toCouponCode(str) {
@@ -0,0 +1,55 @@
1
+ import React from "react";
2
+ import { type IntegrationPatch } from "../../../_internal/shared/features/admin/integrations";
3
+ import type { SiteSettingsDocument } from "../schemas/firestore";
4
+ /**
5
+ * Admin → Site → Integrations. The four switches that decide whether we take
6
+ * money online, send customer email, book couriers, and offer buyers a support
7
+ * surface.
8
+ *
9
+ * ## Why this page exists rather than a Site Settings tab
10
+ *
11
+ * A kill switch for payments has to be findable without hunting a tab strip.
12
+ * It is also the one surface where the four switches are visible TOGETHER,
13
+ * which matters because their off-states are not comparable: three of them
14
+ * stop something and one of them selects a working alternative.
15
+ *
16
+ * ## 🛑 The model is the authority; this file renders it
17
+ *
18
+ * Every label, summary, consequence, severity and settings path comes from
19
+ * `INTEGRATIONS`, and the current state comes from `readIntegrationStates` —
20
+ * **the same expression the route guards resolve through**. That is the whole
21
+ * point: `withOnlinePaymentEnabled` used to hand-write the payments half, and
22
+ * the first draft of the model reproduced it WRONG (it read `razorpayEnabled`
23
+ * alone against a guard that is an OR across both gateways), so with PhonePe
24
+ * on and Razorpay off a page would have reported "payments OFF" while all six
25
+ * `/api/payment` routes were open and taking money.
26
+ *
27
+ * So this view must never derive a state, a consequence or a field name of its
28
+ * own. If a row needs a new fact, it goes on the descriptor.
29
+ *
30
+ * ## 🛑 `offConsequence` IS the confirmation body
31
+ *
32
+ * The registry's `disable-integration` ActionDef deliberately ships an empty
33
+ * `body`, because the consequence differs per integration and copying each
34
+ * string into the registry would be a second place for it to drift from. The
35
+ * dialog is composed here, from the descriptor, at render time.
36
+ */
37
+ export interface AdminIntegrationsViewProps {
38
+ /**
39
+ * The settings document, server-fetched.
40
+ *
41
+ * 🛑 `Partial` because this page must render against an older document that
42
+ * predates `support.enabled`. `readIntegrationStates` chooses a per-field
43
+ * default for exactly that case — and they are NOT a uniform `?? false`:
44
+ * email and support default ON, because a missing field must not read as
45
+ * "we stopped talking to customers".
46
+ */
47
+ settings: Partial<SiteSettingsDocument> | null;
48
+ /**
49
+ * Persist a settings patch. Supplied by the consumer page so this component
50
+ * carries no endpoint and no fetch — `PUT /api/admin/site`, which already
51
+ * records one `recordAdminAction` per write.
52
+ */
53
+ onSave: (patch: IntegrationPatch) => Promise<void>;
54
+ }
55
+ export declare function AdminIntegrationsView({ settings, onSave }: AdminIntegrationsViewProps): React.JSX.Element;