@mohasinac/appkit 4.70.0 → 4.71.2

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 (2242) hide show
  1. package/PROVIDERS.md +190 -0
  2. package/dist/.build-stamp.json +4 -4
  3. package/dist/_internal/client/edit-mode/EditModeProvider.d.ts +32 -0
  4. package/dist/_internal/client/edit-mode/EditModeProvider.js +33 -0
  5. package/dist/_internal/client/edit-mode/index.d.ts +2 -0
  6. package/dist/_internal/client/edit-mode/index.js +1 -0
  7. package/dist/_internal/client/features/giveaway/ClearanceGiveawayDetailView.d.ts +32 -0
  8. package/dist/_internal/client/features/giveaway/ClearanceGiveawayDetailView.js +29 -0
  9. package/dist/_internal/client/features/giveaway/GiveawayAdminEditView.d.ts +66 -0
  10. package/dist/_internal/client/features/giveaway/GiveawayAdminEditView.js +187 -0
  11. package/dist/_internal/client/features/giveaway/GiveawayAdminSlotView.d.ts +18 -0
  12. package/dist/_internal/client/features/giveaway/GiveawayAdminSlotView.js +52 -0
  13. package/dist/_internal/client/features/giveaway/GiveawayDetailView.d.ts +40 -0
  14. package/dist/_internal/client/features/giveaway/GiveawayDetailView.js +49 -0
  15. package/dist/_internal/client/features/giveaway/GiveawayEntriesView.d.ts +34 -0
  16. package/dist/_internal/client/features/giveaway/GiveawayEntriesView.js +64 -0
  17. package/dist/_internal/client/features/giveaway/GiveawayListView.d.ts +39 -0
  18. package/dist/_internal/client/features/giveaway/GiveawayListView.js +45 -0
  19. package/dist/_internal/client/features/giveaway/GiveawayPullForm.d.ts +31 -0
  20. package/dist/_internal/client/features/giveaway/GiveawayPullForm.js +94 -0
  21. package/dist/_internal/client/features/giveaway/GiveawaySlotGrid.d.ts +14 -0
  22. package/dist/_internal/client/features/giveaway/GiveawaySlotGrid.js +23 -0
  23. package/dist/_internal/client/features/giveaway/slot-collage-items.d.ts +15 -0
  24. package/dist/_internal/client/features/giveaway/slot-collage-items.js +13 -0
  25. package/dist/_internal/client/features/layout/DashboardLayoutClient.d.ts +34 -1
  26. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +79 -9
  27. package/dist/_internal/client/features/layout/PortalBackLink.d.ts +15 -0
  28. package/dist/_internal/client/features/layout/PortalBackLink.js +58 -0
  29. package/dist/_internal/client/features/layout/SidebarCollapseToggle.js +37 -1
  30. package/dist/_internal/client/features/layout/filterNavItems.d.ts +11 -6
  31. package/dist/_internal/client/features/layout/filterNavItems.js +36 -4
  32. package/dist/_internal/client/features/layout/sidebarPositionClasses.js +10 -2
  33. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.d.ts +6 -1
  34. package/dist/_internal/client/features/maintenance/views/AnalysisRunnerView.js +4 -3
  35. package/dist/_internal/client/features/maintenance/views/CacheInvalidationPanel.js +1 -1
  36. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +4 -1
  37. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +4 -3
  38. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.d.ts +4 -1
  39. package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +4 -2
  40. package/dist/_internal/client/features/maintenance/views/RepositoryCacheStatusPanel.d.ts +15 -0
  41. package/dist/_internal/client/features/maintenance/views/RepositoryCacheStatusPanel.js +161 -0
  42. package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.d.ts +4 -1
  43. package/dist/_internal/client/features/maintenance/views/ServerErrorDetailView.js +3 -2
  44. package/dist/_internal/client/features/maintenance/views/ServerErrorsListView.d.ts +11 -1
  45. package/dist/_internal/client/features/maintenance/views/ServerErrorsListView.js +3 -2
  46. package/dist/_internal/server/features/ads/booking.d.ts +1 -1
  47. package/dist/_internal/server/features/ads/booking.js +1 -1
  48. package/dist/_internal/server/features/assistant/actions.d.ts +29 -0
  49. package/dist/_internal/server/features/assistant/actions.js +170 -0
  50. package/dist/_internal/server/features/assistant/budget.d.ts +28 -0
  51. package/dist/_internal/server/features/assistant/budget.js +132 -0
  52. package/dist/_internal/server/features/assistant/escalate.d.ts +25 -0
  53. package/dist/_internal/server/features/assistant/escalate.js +108 -0
  54. package/dist/_internal/server/features/assistant/guard.d.ts +10 -0
  55. package/dist/_internal/server/features/assistant/guard.js +110 -0
  56. package/dist/_internal/server/features/assistant/handles.d.ts +42 -0
  57. package/dist/_internal/server/features/assistant/handles.js +172 -0
  58. package/dist/_internal/server/features/assistant/history-store.d.ts +16 -0
  59. package/dist/_internal/server/features/assistant/history-store.js +63 -0
  60. package/dist/_internal/server/features/assistant/model-routing.d.ts +70 -0
  61. package/dist/_internal/server/features/assistant/model-routing.js +80 -0
  62. package/dist/_internal/server/features/assistant/quorum.d.ts +32 -0
  63. package/dist/_internal/server/features/assistant/quorum.js +128 -0
  64. package/dist/_internal/server/features/assistant/redaction.d.ts +68 -0
  65. package/dist/_internal/server/features/assistant/redaction.js +69 -0
  66. package/dist/_internal/server/features/assistant/severity.d.ts +41 -0
  67. package/dist/_internal/server/features/assistant/severity.js +93 -0
  68. package/dist/_internal/server/features/assistant/tools/admin/search-nav.d.ts +39 -0
  69. package/dist/_internal/server/features/assistant/tools/admin/search-nav.js +27 -0
  70. package/dist/_internal/server/features/assistant/tools/builtin/get-my-orders.d.ts +15 -0
  71. package/dist/_internal/server/features/assistant/tools/builtin/get-my-orders.js +116 -0
  72. package/dist/_internal/server/features/assistant/tools/builtin/get-toggle-state.d.ts +8 -0
  73. package/dist/_internal/server/features/assistant/tools/builtin/get-toggle-state.js +64 -0
  74. package/dist/_internal/server/features/assistant/tools/builtin/index.d.ts +38 -0
  75. package/dist/_internal/server/features/assistant/tools/builtin/index.js +29 -0
  76. package/dist/_internal/server/features/assistant/tools/builtin/search-faqs.d.ts +8 -0
  77. package/dist/_internal/server/features/assistant/tools/builtin/search-faqs.js +62 -0
  78. package/dist/_internal/server/features/assistant/tools/builtin/search-products.d.ts +16 -0
  79. package/dist/_internal/server/features/assistant/tools/builtin/search-products.js +79 -0
  80. package/dist/_internal/server/features/assistant/tools/define.d.ts +85 -0
  81. package/dist/_internal/server/features/assistant/tools/define.js +8 -0
  82. package/dist/_internal/server/features/assistant/tools/json-schema.d.ts +34 -0
  83. package/dist/_internal/server/features/assistant/tools/json-schema.js +79 -0
  84. package/dist/_internal/server/features/assistant/tools/manifest.d.ts +22 -0
  85. package/dist/_internal/server/features/assistant/tools/manifest.js +27 -0
  86. package/dist/_internal/server/features/assistant/tools/registry.d.ts +22 -0
  87. package/dist/_internal/server/features/assistant/tools/registry.js +43 -0
  88. package/dist/_internal/server/features/assistant/turn.d.ts +43 -0
  89. package/dist/_internal/server/features/assistant/turn.js +281 -0
  90. package/dist/_internal/server/features/auth/permissions.d.ts +65 -10
  91. package/dist/_internal/server/features/auth/permissions.js +74 -15
  92. package/dist/_internal/server/features/brands/actions.js +3 -3
  93. package/dist/_internal/server/features/bundles/actions.js +3 -3
  94. package/dist/_internal/server/features/categories/adapters.d.ts +2 -2
  95. package/dist/_internal/server/features/categories/adapters.js +17 -8
  96. package/dist/_internal/server/features/checkout/actions.d.ts +142 -15
  97. package/dist/_internal/server/features/checkout/actions.js +1031 -150
  98. package/dist/_internal/server/features/checkout/gateway-selection.d.ts +68 -0
  99. package/dist/_internal/server/features/checkout/gateway-selection.js +124 -0
  100. package/dist/_internal/server/features/checkout/index.d.ts +5 -0
  101. package/dist/_internal/server/features/checkout/index.js +18 -0
  102. package/dist/_internal/server/features/checkout/locked-lines.d.ts +10 -10
  103. package/dist/_internal/server/features/checkout/locked-lines.js +37 -37
  104. package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +1 -1
  105. package/dist/_internal/server/features/checkout/prize-bundle-gates.js +1 -1
  106. package/dist/_internal/server/features/checkout/source-context.js +17 -17
  107. package/dist/_internal/server/features/checkout/split-settlement.d.ts +100 -0
  108. package/dist/_internal/server/features/checkout/split-settlement.js +205 -0
  109. package/dist/_internal/server/features/checkout/upi-resolution.js +8 -1
  110. package/dist/_internal/server/features/clearance/actions.d.ts +2 -0
  111. package/dist/_internal/server/features/clearance/actions.js +33 -0
  112. package/dist/_internal/server/features/clearance/data.d.ts +1 -0
  113. package/dist/_internal/server/features/clearance/data.js +2 -0
  114. package/dist/_internal/server/features/clearance/index.d.ts +4 -0
  115. package/dist/_internal/server/features/clearance/index.js +4 -0
  116. package/dist/_internal/server/features/clearance/og.d.ts +32 -0
  117. package/dist/_internal/server/features/clearance/og.js +47 -0
  118. package/dist/_internal/server/features/clearance/service.d.ts +3 -0
  119. package/dist/_internal/server/features/clearance/service.js +19 -0
  120. package/dist/_internal/server/features/collector-drops/actions.js +76 -0
  121. package/dist/_internal/server/features/collector-drops/data.d.ts +2 -0
  122. package/dist/_internal/server/features/collector-drops/data.js +3 -0
  123. package/dist/_internal/server/features/collector-drops/index.d.ts +5 -0
  124. package/dist/_internal/server/features/collector-drops/index.js +5 -0
  125. package/dist/_internal/server/features/collector-drops/og.d.ts +22 -0
  126. package/dist/_internal/server/features/collector-drops/og.js +30 -0
  127. package/dist/_internal/server/features/collector-drops/service.d.ts +20 -0
  128. package/dist/_internal/server/features/collector-drops/service.js +65 -0
  129. package/dist/_internal/server/features/dashboard/page-regions.d.ts +33 -0
  130. package/dist/_internal/server/features/dashboard/page-regions.js +53 -0
  131. package/dist/_internal/server/features/digital-code/pool.d.ts +14 -1
  132. package/dist/_internal/server/features/digital-code/pool.js +21 -2
  133. package/dist/_internal/server/features/digital-code/release.d.ts +79 -0
  134. package/dist/_internal/server/features/digital-code/release.js +176 -0
  135. package/dist/_internal/server/features/events/adapters.d.ts +7 -7
  136. package/dist/_internal/server/features/events/adapters.js +6 -6
  137. package/dist/_internal/server/features/events/data.d.ts +17 -1
  138. package/dist/_internal/server/features/events/data.js +51 -0
  139. package/dist/_internal/server/features/events/service.d.ts +2 -2
  140. package/dist/_internal/server/features/forms/field-visibility.d.ts +35 -0
  141. package/dist/_internal/server/features/forms/field-visibility.js +89 -0
  142. package/dist/_internal/server/features/giveaway/actions.d.ts +43 -0
  143. package/dist/_internal/server/features/giveaway/actions.js +369 -0
  144. package/dist/_internal/server/features/giveaway/adapters.d.ts +15 -0
  145. package/dist/_internal/server/features/giveaway/adapters.js +31 -0
  146. package/dist/_internal/server/features/giveaway/data.d.ts +19 -0
  147. package/dist/_internal/server/features/giveaway/data.js +56 -0
  148. package/dist/_internal/server/features/giveaway/metadata.d.ts +6 -0
  149. package/dist/_internal/server/features/giveaway/metadata.js +31 -0
  150. package/dist/_internal/server/features/giveaway/og.d.ts +40 -0
  151. package/dist/_internal/server/features/giveaway/og.js +79 -0
  152. package/dist/_internal/server/features/homepage/index.js +1 -1
  153. package/dist/_internal/server/features/inventory/reservations.d.ts +1 -1
  154. package/dist/_internal/server/features/inventory/reservations.js +1 -1
  155. package/dist/_internal/server/features/maintenance/cache-admin.d.ts +44 -0
  156. package/dist/_internal/server/features/maintenance/cache-admin.js +85 -0
  157. package/dist/_internal/server/features/media/contextGuards.d.ts +2 -2
  158. package/dist/_internal/server/features/media/contextGuards.js +4 -4
  159. package/dist/_internal/server/features/messages/actions.js +11 -0
  160. package/dist/_internal/server/features/order-completion/actions.js +1 -1
  161. package/dist/_internal/server/features/orders/actions.d.ts +3 -2
  162. package/dist/_internal/server/features/orders/actions.js +69 -17
  163. package/dist/_internal/server/features/orders/adapters.js +38 -3
  164. package/dist/_internal/server/features/orders/balance.d.ts +5 -2
  165. package/dist/_internal/server/features/orders/balance.js +14 -3
  166. package/dist/_internal/server/features/orders/cancellation-refund.d.ts +0 -89
  167. package/dist/_internal/server/features/orders/cancellation-refund.js +3 -2
  168. package/dist/_internal/server/features/payouts/actions.js +2 -1
  169. package/dist/_internal/server/features/points/award.js +3 -2
  170. package/dist/_internal/server/features/products/actions.d.ts +1 -1
  171. package/dist/_internal/server/features/products/actions.js +8 -8
  172. package/dist/_internal/server/features/products/data.js +5 -4
  173. package/dist/_internal/server/features/products/index.d.ts +1 -1
  174. package/dist/_internal/server/features/products/index.js +1 -1
  175. package/dist/_internal/server/features/products/list-public.js +18 -12
  176. package/dist/_internal/server/features/products/listing-tab-counts.d.ts +1 -1
  177. package/dist/_internal/server/features/products/listing-tab-counts.js +8 -8
  178. package/dist/_internal/server/features/products/og.js +1 -1
  179. package/dist/_internal/server/features/products/service.d.ts +51 -14
  180. package/dist/_internal/server/features/products/service.js +95 -29
  181. package/dist/_internal/server/features/protection-claims/actions.js +2 -1
  182. package/dist/_internal/server/features/refunds/actions.js +3 -2
  183. package/dist/_internal/server/features/scams/og.d.ts +1 -1
  184. package/dist/_internal/server/features/search/entity-index.d.ts +14 -0
  185. package/dist/_internal/server/features/search/entity-index.js +87 -0
  186. package/dist/_internal/server/features/search/index-build/build.js +13 -4
  187. package/dist/_internal/server/features/search/index-build/sources.d.ts +2 -0
  188. package/dist/_internal/server/features/search/index-build/sources.js +4 -2
  189. package/dist/_internal/server/features/search/search-everything.d.ts +2 -0
  190. package/dist/_internal/server/features/search/search-sources.js +5 -3
  191. package/dist/_internal/server/features/seo/index.d.ts +1 -1
  192. package/dist/_internal/server/features/seo/index.js +1 -1
  193. package/dist/_internal/server/features/seo/manifest.js +3 -3
  194. package/dist/_internal/server/features/seo/product-detail-types.js +2 -1
  195. package/dist/_internal/server/features/seo/robots.js +19 -4
  196. package/dist/_internal/server/features/seo/sitemap.js +62 -94
  197. package/dist/_internal/server/features/seo/static-params.d.ts +0 -18
  198. package/dist/_internal/server/features/seo/static-params.js +0 -55
  199. package/dist/_internal/server/features/shared/listing-data-factory.js +3 -3
  200. package/dist/_internal/server/features/shipping/courier-block.js +5 -2
  201. package/dist/_internal/server/features/shipping/reconcile.js +3 -2
  202. package/dist/_internal/server/features/shipping/reimbursement.js +3 -2
  203. package/dist/_internal/server/features/site-settings/actions.d.ts +36 -0
  204. package/dist/_internal/server/features/site-settings/actions.js +57 -1
  205. package/dist/_internal/server/features/site-settings/adapters.d.ts +3 -3
  206. package/dist/_internal/server/features/site-settings/adapters.js +39 -4
  207. package/dist/_internal/server/features/sticker-trace/promote-to-listings.js +2 -2
  208. package/dist/_internal/server/features/sticker-trace/sweep.d.ts +13 -0
  209. package/dist/_internal/server/features/sticker-trace/sweep.js +49 -0
  210. package/dist/_internal/server/features/stores/activation.d.ts +22 -0
  211. package/dist/_internal/server/features/stores/activation.js +73 -0
  212. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  213. package/dist/_internal/server/features/stores/adapters.js +34 -2
  214. package/dist/_internal/server/features/stores/data.d.ts +1 -1
  215. package/dist/_internal/server/features/stores/data.js +1 -1
  216. package/dist/_internal/server/features/stores/index.d.ts +2 -1
  217. package/dist/_internal/server/features/stores/index.js +7 -1
  218. package/dist/_internal/server/features/stores/tabs.js +6 -11
  219. package/dist/_internal/server/features/widgets/widget-instances.d.ts +34 -0
  220. package/dist/_internal/server/features/widgets/widget-instances.js +169 -0
  221. package/dist/_internal/server/functions/define.d.ts +4 -4
  222. package/dist/_internal/server/functions/define.js +4 -4
  223. package/dist/_internal/server/functions/firestore.d.ts +3 -3
  224. package/dist/_internal/server/functions/firestore.js +18 -9
  225. package/dist/_internal/server/functions/https.js +1 -1
  226. package/dist/_internal/server/functions/scheduled.d.ts +26 -3
  227. package/dist/_internal/server/functions/scheduled.js +49 -12
  228. package/dist/_internal/server/jobs/core/assignSpinPrize.js +5 -1
  229. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +13 -11
  230. package/dist/_internal/server/jobs/core/bundleStockSync.js +1 -1
  231. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +2 -2
  232. package/dist/_internal/server/jobs/core/clearanceAssignWinner.d.ts +60 -0
  233. package/dist/_internal/server/jobs/core/clearanceAssignWinner.js +227 -0
  234. package/dist/_internal/server/jobs/core/clearanceExpiryReveal.d.ts +14 -0
  235. package/dist/_internal/server/jobs/core/clearanceExpiryReveal.js +71 -0
  236. package/dist/_internal/server/jobs/core/clearanceSoldOutReveal.d.ts +22 -0
  237. package/dist/_internal/server/jobs/core/clearanceSoldOutReveal.js +67 -0
  238. package/dist/_internal/server/jobs/core/collectorDropSettlement.d.ts +2 -0
  239. package/dist/_internal/server/jobs/core/collectorDropSettlement.js +240 -0
  240. package/dist/_internal/server/jobs/core/countersReconcile.js +21 -21
  241. package/dist/_internal/server/jobs/core/dailyStatusDigest.js +7 -3
  242. package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +2 -1
  243. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +4 -2
  244. package/dist/_internal/server/jobs/core/event-draw-reasons.js +6 -4
  245. package/dist/_internal/server/jobs/core/index.d.ts +5 -5
  246. package/dist/_internal/server/jobs/core/index.js +5 -5
  247. package/dist/_internal/server/jobs/core/jobRunners.d.ts +1 -1
  248. package/dist/_internal/server/jobs/core/jobRunners.js +25 -0
  249. package/dist/_internal/server/jobs/core/obligationSweep.js +5 -4
  250. package/dist/_internal/server/jobs/core/offerExpiry.js +23 -23
  251. package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +1 -1
  252. package/dist/_internal/server/jobs/core/onClearancePaymentConfirmed.d.ts +19 -0
  253. package/dist/_internal/server/jobs/core/onClearancePaymentConfirmed.js +32 -0
  254. package/dist/_internal/server/jobs/core/onProductWrite.d.ts +1 -1
  255. package/dist/_internal/server/jobs/core/onProductWrite.js +23 -23
  256. package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +1 -1
  257. package/dist/_internal/server/jobs/core/onScamReportCreate.js +2 -1
  258. package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +1 -1
  259. package/dist/_internal/server/jobs/core/paymentReconcile.js +5 -4
  260. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +1 -1
  261. package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +1 -1
  262. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +1 -1
  263. package/dist/_internal/server/jobs/core/priceIndexRollup.d.ts +1 -1
  264. package/dist/_internal/server/jobs/core/priceIndexRollup.js +5 -5
  265. package/dist/_internal/server/jobs/core/promotions.js +1 -1
  266. package/dist/_internal/server/jobs/core/revalidateNotify.d.ts +1 -1
  267. package/dist/_internal/server/jobs/core/revalidateNotify.js +2 -2
  268. package/dist/_internal/server/jobs/core/settlementVendorRegister.d.ts +47 -0
  269. package/dist/_internal/server/jobs/core/settlementVendorRegister.js +414 -0
  270. package/dist/_internal/server/jobs/core/stickerTraceSweep.d.ts +9 -0
  271. package/dist/_internal/server/jobs/core/stickerTraceSweep.js +25 -0
  272. package/dist/_internal/server/jobs/core/surfaceCountsRollup.js +47 -7
  273. package/dist/_internal/server/jobs/core/testDataCleanup.js +1 -1
  274. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +2 -2
  275. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +17 -12
  276. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +10 -8
  277. package/dist/_internal/server/jobs/handlers/clearanceExpiryReveal.d.ts +2 -0
  278. package/dist/_internal/server/jobs/handlers/clearanceExpiryReveal.js +2 -0
  279. package/dist/_internal/server/jobs/handlers/clearanceSoldOutReveal.d.ts +3 -0
  280. package/dist/_internal/server/jobs/handlers/clearanceSoldOutReveal.js +4 -0
  281. package/dist/_internal/server/jobs/handlers/collectorDropSettlement.d.ts +2 -0
  282. package/dist/_internal/server/jobs/handlers/collectorDropSettlement.js +2 -0
  283. package/dist/_internal/server/jobs/handlers/index.d.ts +6 -5
  284. package/dist/_internal/server/jobs/handlers/index.js +11 -9
  285. package/dist/_internal/server/jobs/handlers/messages.d.ts +4 -4
  286. package/dist/_internal/server/jobs/handlers/messages.js +13 -13
  287. package/dist/_internal/server/jobs/handlers/onCatalogueSubmittedForApproval.d.ts +1 -1
  288. package/dist/_internal/server/jobs/handlers/onClearancePaymentConfirmed.d.ts +3 -0
  289. package/dist/_internal/server/jobs/handlers/onClearancePaymentConfirmed.js +11 -0
  290. package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +1 -1
  291. package/dist/_internal/server/jobs/handlers/onReviewWrite.d.ts +1 -1
  292. package/dist/_internal/server/jobs/handlers/onScamReportCreate.d.ts +1 -1
  293. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.d.ts +1 -1
  294. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.d.ts +1 -1
  295. package/dist/_internal/server/jobs/handlers/onShipmentDeleted.d.ts +1 -1
  296. package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.d.ts +1 -1
  297. package/dist/_internal/server/jobs/handlers/onSiteSettingsWrite.d.ts +2 -2
  298. package/dist/_internal/server/jobs/handlers/onSiteSettingsWrite.js +1 -1
  299. package/dist/_internal/server/jobs/handlers/onSupportTicketCreate.d.ts +1 -1
  300. package/dist/_internal/server/jobs/handlers/onSupportTicketUpdate.d.ts +1 -1
  301. package/dist/_internal/server/jobs/handlers/onUserBanChange.d.ts +1 -1
  302. package/dist/_internal/server/jobs/handlers/stickerTraceSweep.d.ts +2 -0
  303. package/dist/_internal/server/jobs/handlers/stickerTraceSweep.js +2 -0
  304. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -1
  305. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +1 -1
  306. package/dist/_internal/server/jobs/runtime/adapters/firebase.d.ts +1 -1
  307. package/dist/_internal/server/jobs/runtime/adapters/firebase.js +1 -1
  308. package/dist/_internal/server/jobs/runtime/types.d.ts +1 -1
  309. package/dist/_internal/server/payments/policy-consent.d.ts +170 -0
  310. package/dist/_internal/server/payments/policy-consent.js +287 -0
  311. package/dist/_internal/server/payments/webhook-registry.d.ts +162 -0
  312. package/dist/_internal/server/payments/webhook-registry.js +228 -0
  313. package/dist/_internal/shared/actions/action-registry.d.ts +40 -6
  314. package/dist/_internal/shared/actions/action-registry.js +318 -312
  315. package/dist/_internal/shared/cache/revalidate-targets.d.ts +2 -2
  316. package/dist/_internal/shared/cache/revalidate-targets.js +8 -8
  317. package/dist/_internal/shared/checkout/lanes.d.ts +25 -25
  318. package/dist/_internal/shared/checkout/lanes.js +35 -35
  319. package/dist/_internal/shared/checkout/order-math.d.ts +50 -50
  320. package/dist/_internal/shared/checkout/order-math.js +108 -50
  321. package/dist/_internal/shared/checkout/payout-base.d.ts +51 -0
  322. package/dist/_internal/shared/checkout/payout-base.js +84 -0
  323. package/dist/_internal/shared/checkout/policy-consent.d.ts +182 -0
  324. package/dist/_internal/shared/checkout/policy-consent.js +214 -0
  325. package/dist/_internal/shared/checkout/rules/_limits.d.ts +35 -4
  326. package/dist/_internal/shared/checkout/rules/_limits.js +35 -4
  327. package/dist/_internal/shared/checkout/rules/_registry.js +6 -8
  328. package/dist/_internal/shared/checkout/rules/art-and-stickers.rule.d.ts +13 -0
  329. package/dist/_internal/shared/checkout/rules/art-and-stickers.rule.js +5 -0
  330. package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +24 -6
  331. package/dist/_internal/shared/checkout/rules/bundle.rule.js +4 -1
  332. package/dist/_internal/shared/checkout/rules/clearance.rule.d.ts +2 -0
  333. package/dist/_internal/shared/checkout/rules/clearance.rule.js +148 -0
  334. package/dist/_internal/shared/checkout/rules/collector-drop.rule.d.ts +2 -0
  335. package/dist/_internal/shared/checkout/rules/collector-drop.rule.js +50 -0
  336. package/dist/_internal/shared/checkout/rules/index.d.ts +4 -5
  337. package/dist/_internal/shared/checkout/rules/index.js +4 -5
  338. package/dist/_internal/shared/checkout/rules/payment-gate.d.ts +24 -3
  339. package/dist/_internal/shared/checkout/rules/payment-gate.js +24 -6
  340. package/dist/_internal/shared/checkout/rules/preorder.rule.js +39 -0
  341. package/dist/_internal/shared/checkout/rules/types.d.ts +26 -5
  342. package/dist/_internal/shared/checkout/settlement-split.d.ts +136 -0
  343. package/dist/_internal/shared/checkout/settlement-split.js +198 -0
  344. package/dist/_internal/shared/checkout/settlement.d.ts +186 -0
  345. package/dist/_internal/shared/checkout/settlement.js +0 -0
  346. package/dist/_internal/shared/config/index.d.ts +1 -1
  347. package/dist/_internal/shared/config/schema.d.ts +50 -1
  348. package/dist/_internal/shared/content/composite-sentences/en.d.ts +31 -0
  349. package/dist/_internal/shared/content/composite-sentences/en.js +173 -0
  350. package/dist/_internal/shared/content/composite-sentences/index.d.ts +21 -0
  351. package/dist/_internal/shared/content/composite-sentences/index.js +26 -0
  352. package/dist/_internal/shared/content/composite-sentences/registry.d.ts +41 -0
  353. package/dist/_internal/shared/content/composite-sentences/registry.js +50 -0
  354. package/dist/_internal/shared/content/disclaimers.d.ts +4 -4
  355. package/dist/_internal/shared/content/disclaimers.js +32 -10
  356. package/dist/_internal/shared/content/fragmented-paragraphs/en.d.ts +20 -0
  357. package/dist/_internal/shared/content/fragmented-paragraphs/en.js +16 -0
  358. package/dist/_internal/shared/content/fragmented-paragraphs/index.d.ts +16 -0
  359. package/dist/_internal/shared/content/fragmented-paragraphs/index.js +22 -0
  360. package/dist/_internal/shared/content/fragments.d.ts +114 -0
  361. package/dist/_internal/shared/content/fragments.js +88 -0
  362. package/dist/_internal/shared/content/published-values.d.ts +2 -2
  363. package/dist/_internal/shared/content/published-values.js +33 -12
  364. package/dist/_internal/shared/features/admin/integrations.d.ts +2 -1
  365. package/dist/_internal/shared/features/admin/integrations.js +34 -16
  366. package/dist/_internal/shared/features/admin/row-widget-resources.d.ts +4 -0
  367. package/dist/_internal/shared/features/admin/row-widget-resources.js +29 -0
  368. package/dist/_internal/shared/features/blog/schema.d.ts +7 -7
  369. package/dist/_internal/shared/features/cart/schema.d.ts +8 -8
  370. package/dist/_internal/shared/features/cart/schema.js +3 -4
  371. package/dist/_internal/shared/features/categories/bundle-config.d.ts +3 -3
  372. package/dist/_internal/shared/features/categories/bundle-config.js +3 -3
  373. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +1 -1
  374. package/dist/_internal/shared/features/categories/bundle-copy.js +1 -1
  375. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +49 -49
  376. package/dist/_internal/shared/features/categories/bundle-schemas.js +1 -1
  377. package/dist/_internal/shared/features/checkout/config.d.ts +2 -0
  378. package/dist/_internal/shared/features/checkout/config.js +23 -0
  379. package/dist/_internal/shared/features/collector-drops/config.d.ts +100 -0
  380. package/dist/_internal/shared/features/collector-drops/config.js +136 -0
  381. package/dist/_internal/shared/features/collector-drops/errors.d.ts +16 -0
  382. package/dist/_internal/shared/features/collector-drops/errors.js +32 -0
  383. package/dist/_internal/shared/features/collector-drops/schema.d.ts +42 -0
  384. package/dist/_internal/shared/features/collector-drops/schema.js +24 -0
  385. package/dist/_internal/shared/features/content-tags/registry.d.ts +55 -0
  386. package/dist/_internal/shared/features/content-tags/registry.js +54 -0
  387. package/dist/_internal/shared/features/dashboard/recent-entry.d.ts +466 -0
  388. package/dist/_internal/shared/features/dashboard/recent-entry.js +132 -0
  389. package/dist/_internal/shared/features/events/config.d.ts +1 -1
  390. package/dist/_internal/shared/features/events/config.js +1 -1
  391. package/dist/_internal/shared/features/events/schema.d.ts +4 -4
  392. package/dist/_internal/shared/features/layout/config.d.ts +9 -1
  393. package/dist/_internal/shared/features/layout/config.js +23 -3
  394. package/dist/_internal/shared/features/notifications/action-url.js +1 -1
  395. package/dist/_internal/shared/features/notifications/email-eligibility.d.ts +4 -4
  396. package/dist/_internal/shared/features/notifications/email-eligibility.js +9 -9
  397. package/dist/_internal/shared/features/offers/config.js +1 -1
  398. package/dist/_internal/shared/features/orders/refund-copy.js +3 -2
  399. package/dist/_internal/shared/features/orders/schema.d.ts +2 -2
  400. package/dist/_internal/shared/features/orders/workflow-registry.d.ts +145 -0
  401. package/dist/_internal/shared/features/orders/workflow-registry.js +197 -0
  402. package/dist/_internal/shared/features/payouts/destination.d.ts +101 -0
  403. package/dist/_internal/shared/features/payouts/destination.js +221 -0
  404. package/dist/_internal/shared/features/print/label-profiles.d.ts +1 -1
  405. package/dist/_internal/shared/features/print/label-profiles.js +1 -1
  406. package/dist/_internal/shared/features/products/composite.d.ts +104 -0
  407. package/dist/_internal/shared/features/products/composite.js +188 -0
  408. package/dist/_internal/shared/features/products/group-rules.d.ts +28 -2
  409. package/dist/_internal/shared/features/products/group-rules.js +29 -0
  410. package/dist/_internal/shared/features/products/pdp-section-ids.d.ts +13 -0
  411. package/dist/_internal/shared/features/products/pdp-section-ids.js +14 -0
  412. package/dist/_internal/shared/features/products/schema.d.ts +31 -13
  413. package/dist/_internal/shared/features/products/schema.js +75 -10
  414. package/dist/_internal/shared/features/products/to-product-item.js +1 -1
  415. package/dist/_internal/shared/features/products/types.d.ts +1 -1
  416. package/dist/_internal/shared/features/promotions/errors.js +2 -1
  417. package/dist/_internal/shared/features/promotions/schema.d.ts +4 -4
  418. package/dist/_internal/shared/features/shipping/offer.d.ts +408 -0
  419. package/dist/_internal/shared/features/shipping/offer.js +440 -0
  420. package/dist/_internal/shared/features/site-settings/fees.d.ts +32 -3
  421. package/dist/_internal/shared/features/site-settings/fees.js +1 -1
  422. package/dist/_internal/shared/features/site-settings/settings-preview-registry.d.ts +17 -0
  423. package/dist/_internal/shared/features/site-settings/settings-preview-registry.js +56 -0
  424. package/dist/_internal/shared/features/site-settings/toggle-catalog.d.ts +68 -0
  425. package/dist/_internal/shared/features/site-settings/toggle-catalog.js +204 -0
  426. package/dist/_internal/shared/features/site-settings/types.d.ts +27 -1
  427. package/dist/_internal/shared/fees/calculator.d.ts +256 -21
  428. package/dist/_internal/shared/fees/calculator.js +269 -26
  429. package/dist/_internal/shared/fees/explain.d.ts +20 -5
  430. package/dist/_internal/shared/fees/explain.js +38 -18
  431. package/dist/_internal/shared/listing-types/_registry.d.ts +30 -15
  432. package/dist/_internal/shared/listing-types/_registry.js +39 -16
  433. package/dist/_internal/shared/listing-types/action-tracker.d.ts +1 -1
  434. package/dist/_internal/shared/listing-types/art-and-stickers/config.d.ts +94 -0
  435. package/dist/_internal/shared/listing-types/art-and-stickers/config.js +57 -0
  436. package/dist/_internal/shared/listing-types/art-and-stickers/ctas.js +3 -0
  437. package/dist/_internal/shared/listing-types/art-and-stickers/schema.d.ts +2 -0
  438. package/dist/_internal/shared/listing-types/art-and-stickers/schema.js +3 -0
  439. package/dist/_internal/shared/listing-types/availability.js +2 -2
  440. package/dist/_internal/shared/listing-types/capabilities.d.ts +77 -1
  441. package/dist/_internal/shared/listing-types/capabilities.js +72 -13
  442. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  443. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  444. package/dist/_internal/shared/listing-types/clearance/config.d.ts +74 -0
  445. package/dist/_internal/shared/listing-types/clearance/config.js +46 -0
  446. package/dist/_internal/shared/listing-types/clearance/schema.d.ts +3 -0
  447. package/dist/_internal/shared/listing-types/clearance/schema.js +13 -0
  448. package/dist/_internal/shared/listing-types/collector-drop/config.d.ts +85 -0
  449. package/dist/_internal/shared/listing-types/collector-drop/config.js +59 -0
  450. package/dist/_internal/shared/listing-types/collector-drop/schema.d.ts +3 -0
  451. package/dist/_internal/shared/listing-types/collector-drop/schema.js +11 -0
  452. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  453. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  454. package/dist/_internal/shared/listing-types/feature-flags.d.ts +125 -8
  455. package/dist/_internal/shared/listing-types/feature-flags.js +149 -12
  456. package/dist/_internal/shared/listing-types/hidden-surfaces.d.ts +19 -10
  457. package/dist/_internal/shared/listing-types/hidden-surfaces.js +6 -5
  458. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  459. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  460. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  461. package/dist/_internal/shared/listing-types/pre-order/config.js +20 -5
  462. package/dist/_internal/shared/listing-types/pre-order/schema.d.ts +45 -0
  463. package/dist/_internal/shared/listing-types/pre-order/schema.js +60 -2
  464. package/dist/_internal/shared/listing-types/route-gating.d.ts +11 -11
  465. package/dist/_internal/shared/listing-types/route-gating.js +15 -14
  466. package/dist/_internal/shared/listing-types/spares/config.d.ts +1 -0
  467. package/dist/_internal/shared/listing-types/spares/config.js +1 -0
  468. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  469. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  470. package/dist/_internal/shared/listing-types/tiers.d.ts +2 -2
  471. package/dist/_internal/shared/listing-types/tiers.js +6 -7
  472. package/dist/_internal/shared/search/index-record.d.ts +10 -4
  473. package/dist/_internal/shared/search/index-record.js +18 -1
  474. package/dist/_internal/shared/search/match.d.ts +3 -1
  475. package/dist/_internal/shared/search/match.js +2 -1
  476. package/dist/_internal/shared/search/to-groups.js +1 -0
  477. package/dist/_internal/shared/templating/placeholders.d.ts +18 -0
  478. package/dist/_internal/shared/templating/placeholders.js +24 -0
  479. package/dist/_internal/shared/tester/window.d.ts +1 -1
  480. package/dist/_internal/shared/tester/window.js +5 -5
  481. package/dist/_internal/shared/tokens/index.d.ts +1 -1
  482. package/dist/_internal/shared/tokens/index.js +1 -1
  483. package/dist/cli/index.d.ts +1 -1
  484. package/dist/cli/index.js +2 -2
  485. package/dist/client-entry.d.ts +1 -1
  486. package/dist/client.d.ts +49 -40
  487. package/dist/client.js +97 -32
  488. package/dist/configs/next.d.ts +1 -1
  489. package/dist/configs/tailwind.d.ts +12 -0
  490. package/dist/configs/tailwind.js +14 -0
  491. package/dist/constants/api-endpoints.d.ts +93 -51
  492. package/dist/constants/api-endpoints.js +53 -28
  493. package/dist/constants/field-names.d.ts +63 -20
  494. package/dist/constants/field-names.js +64 -21
  495. package/dist/constants/index.d.ts +2 -2
  496. package/dist/constants/index.js +2 -2
  497. package/dist/constants/notification-types.d.ts +1 -1
  498. package/dist/constants/pagination-presets.d.ts +2 -2
  499. package/dist/constants/pagination-presets.js +2 -2
  500. package/dist/constants/seed-meta.d.ts +1 -1
  501. package/dist/constants/storage-keys.d.ts +96 -0
  502. package/dist/constants/storage-keys.js +131 -0
  503. package/dist/constants/table-keys.d.ts +3 -2
  504. package/dist/constants/table-keys.js +3 -2
  505. package/dist/contracts/ai.d.ts +183 -0
  506. package/dist/contracts/ai.js +2 -0
  507. package/dist/contracts/auth.d.ts +16 -1
  508. package/dist/contracts/client-live-edit.d.ts +29 -0
  509. package/dist/contracts/client-live-edit.js +23 -0
  510. package/dist/contracts/feature.d.ts +1 -1
  511. package/dist/contracts/index.d.ts +1 -1
  512. package/dist/contracts/payment.d.ts +280 -0
  513. package/dist/contracts/payment.js +125 -0
  514. package/dist/contracts/registry.d.ts +37 -1
  515. package/dist/contracts/tax.d.ts +118 -0
  516. package/dist/contracts/tax.js +3 -0
  517. package/dist/core/CacheManager.d.ts +21 -0
  518. package/dist/core/CacheManager.js +38 -0
  519. package/dist/core/brand-resolver.d.ts +92 -0
  520. package/dist/core/brand-resolver.js +120 -0
  521. package/dist/core/brand-text.d.ts +15 -0
  522. package/dist/core/brand-text.js +73 -0
  523. package/dist/core/hooks/useNewsletterSubscribe.d.ts +30 -0
  524. package/dist/core/hooks/useNewsletterSubscribe.js +121 -0
  525. package/dist/core/integration-keys.d.ts +6 -0
  526. package/dist/core/integration-keys.js +14 -0
  527. package/dist/core/mutation-events.d.ts +3 -3
  528. package/dist/core/mutation-events.js +7 -5
  529. package/dist/core/site-config.js +1 -1
  530. package/dist/core/unit-of-work.d.ts +1 -2
  531. package/dist/core/unit-of-work.js +1 -5
  532. package/dist/edit-mode/index.d.ts +11 -0
  533. package/dist/edit-mode/index.js +10 -0
  534. package/dist/errors/error-codes.d.ts +7 -7
  535. package/dist/errors/error-codes.js +7 -7
  536. package/dist/errors/error-display-map.js +8 -8
  537. package/dist/errors/messages.d.ts +8 -8
  538. package/dist/errors/messages.js +8 -8
  539. package/dist/features/_guide-cls.d.ts +1 -0
  540. package/dist/features/_guide-cls.js +10 -1
  541. package/dist/features/about/components/DeveloperView.d.ts +4 -1
  542. package/dist/features/about/components/DeveloperView.js +4 -2
  543. package/dist/features/about/components/FeesView.d.ts +4 -1
  544. package/dist/features/about/components/FeesView.js +3 -2
  545. package/dist/features/about/components/GstExplainerView.d.ts +4 -1
  546. package/dist/features/about/components/GstExplainerView.js +3 -2
  547. package/dist/features/about/components/GuidesHubView.d.ts +5 -2
  548. package/dist/features/about/components/GuidesHubView.js +7 -6
  549. package/dist/features/about/components/HelpPageView.d.ts +10 -1
  550. package/dist/features/about/components/HelpPageView.js +6 -5
  551. package/dist/features/about/components/HowCheckoutWorksView.d.ts +4 -1
  552. package/dist/features/about/components/HowCheckoutWorksView.js +4 -14
  553. package/dist/features/about/components/HowCollectorDropsWorkView.d.ts +6 -0
  554. package/dist/features/about/components/HowCollectorDropsWorkView.js +105 -0
  555. package/dist/features/about/components/HowEmiWorksView.d.ts +4 -1
  556. package/dist/features/about/components/HowEmiWorksView.js +4 -14
  557. package/dist/features/about/components/HowOffersWorkView.d.ts +4 -1
  558. package/dist/features/about/components/HowOffersWorkView.js +3 -16
  559. package/dist/features/about/components/HowOrdersWorkView.d.ts +4 -1
  560. package/dist/features/about/components/HowOrdersWorkView.js +3 -10
  561. package/dist/features/about/components/HowPayoutsWorkView.d.ts +4 -1
  562. package/dist/features/about/components/HowPayoutsWorkView.js +5 -15
  563. package/dist/features/about/components/HowPreOrdersWorkView.d.ts +4 -1
  564. package/dist/features/about/components/HowPreOrdersWorkView.js +5 -15
  565. package/dist/features/about/components/HowReviewsWorkView.d.ts +4 -1
  566. package/dist/features/about/components/HowReviewsWorkView.js +5 -15
  567. package/dist/features/about/components/PolicyPageView.d.ts +79 -3
  568. package/dist/features/about/components/PolicyPageView.js +63 -4
  569. package/dist/features/about/components/PublicProfileView.d.ts +11 -1
  570. package/dist/features/about/components/PublicProfileView.js +9 -8
  571. package/dist/features/about/components/SecurityPrivacyView.d.ts +4 -1
  572. package/dist/features/about/components/SecurityPrivacyView.js +3 -2
  573. package/dist/features/about/components/ShippingPolicyView.d.ts +4 -1
  574. package/dist/features/about/components/ShippingPolicyView.js +4 -3
  575. package/dist/features/about/components/SpotAFakeView.d.ts +4 -1
  576. package/dist/features/about/components/SpotAFakeView.js +3 -2
  577. package/dist/features/about/components/TrackOrderView.d.ts +4 -1
  578. package/dist/features/about/components/TrackOrderView.js +3 -2
  579. package/dist/features/about/index.d.ts +2 -2
  580. package/dist/features/about/index.js +1 -1
  581. package/dist/features/about/schemas/index.d.ts +18 -18
  582. package/dist/features/account/components/AddressBook.d.ts +1 -1
  583. package/dist/features/account/components/AddressForm.js +25 -1
  584. package/dist/features/account/components/BecomeSellerView.d.ts +4 -1
  585. package/dist/features/account/components/BecomeSellerView.js +3 -2
  586. package/dist/features/account/components/BuyerAccountGuideView.d.ts +6 -1
  587. package/dist/features/account/components/BuyerAccountGuideView.js +5 -4
  588. package/dist/features/account/components/BuyerCollectorDropsGuideView.d.ts +7 -0
  589. package/dist/features/account/components/BuyerCollectorDropsGuideView.js +46 -0
  590. package/dist/features/account/components/BuyerOrdersGuideView.d.ts +6 -1
  591. package/dist/features/account/components/BuyerOrdersGuideView.js +8 -7
  592. package/dist/features/account/components/BuyerShoppingGuideView.d.ts +6 -1
  593. package/dist/features/account/components/BuyerShoppingGuideView.js +7 -6
  594. package/dist/features/account/components/NotificationBell.js +1 -1
  595. package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
  596. package/dist/features/account/components/OrderDetailView.d.ts +4 -1
  597. package/dist/features/account/components/OrderDetailView.js +3 -1
  598. package/dist/features/account/components/UserAccountHubView.d.ts +4 -1
  599. package/dist/features/account/components/UserAccountHubView.js +8 -2
  600. package/dist/features/account/components/UserBidsView.d.ts +6 -1
  601. package/dist/features/account/components/UserBidsView.js +17 -8
  602. package/dist/features/account/components/UserOffersPanel.js +2 -1
  603. package/dist/features/account/components/UserOrderTrackView.d.ts +4 -1
  604. package/dist/features/account/components/UserOrderTrackView.js +3 -1
  605. package/dist/features/account/components/UserOrdersView.d.ts +4 -1
  606. package/dist/features/account/components/UserOrdersView.js +6 -5
  607. package/dist/features/account/components/UserReturnsView.d.ts +4 -1
  608. package/dist/features/account/components/UserReturnsView.js +4 -3
  609. package/dist/features/account/components/UserSidebar.js +14 -4
  610. package/dist/features/account/hooks/useCollapsedSections.js +5 -3
  611. package/dist/features/account/hooks/useNotifications.d.ts +1 -1
  612. package/dist/features/account/hooks/useProfile.d.ts +13 -0
  613. package/dist/features/account/hooks/usePublicProfile.d.ts +11 -1
  614. package/dist/features/account/hooks/usePublicProfile.js +6 -1
  615. package/dist/features/account/schemas/index.d.ts +4 -4
  616. package/dist/features/account/schemas/index.js +1 -1
  617. package/dist/features/addresses/schemas/address-form.d.ts +12 -12
  618. package/dist/features/addresses/schemas/index.d.ts +2 -2
  619. package/dist/features/admin/actions/admin-actions.js +4 -4
  620. package/dist/features/admin/actions/admin-read-actions.d.ts +1 -1
  621. package/dist/features/admin/actions/admin-read-actions.js +1 -1
  622. package/dist/features/admin/actions/notification-actions.js +13 -6
  623. package/dist/features/admin/actions/site-settings-actions.d.ts +1 -1
  624. package/dist/features/admin/api/bids/route.js +7 -1
  625. package/dist/features/admin/api/coupons/route.js +7 -1
  626. package/dist/features/admin/api/products/route.js +7 -1
  627. package/dist/features/admin/api/reviews/route.js +7 -1
  628. package/dist/features/admin/components/AdminActionIndexView.d.ts +4 -1
  629. package/dist/features/admin/components/AdminActionIndexView.js +3 -2
  630. package/dist/features/admin/components/AdminAdEditorView.d.ts +6 -1
  631. package/dist/features/admin/components/AdminAdEditorView.js +3 -1
  632. package/dist/features/admin/components/AdminAddressBookView.d.ts +4 -1
  633. package/dist/features/admin/components/AdminAddressBookView.js +3 -2
  634. package/dist/features/admin/components/AdminAddressClustersView.d.ts +4 -1
  635. package/dist/features/admin/components/AdminAddressClustersView.js +3 -2
  636. package/dist/features/admin/components/AdminAddressEditorView.d.ts +6 -1
  637. package/dist/features/admin/components/AdminAddressEditorView.js +13 -2
  638. package/dist/features/admin/components/AdminAddressesView.d.ts +4 -1
  639. package/dist/features/admin/components/AdminAddressesView.js +3 -2
  640. package/dist/features/admin/components/AdminAdsView.d.ts +4 -1
  641. package/dist/features/admin/components/AdminAdsView.js +3 -2
  642. package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +6 -2
  643. package/dist/features/admin/components/AdminAllEventEntriesView.js +3 -2
  644. package/dist/features/admin/components/AdminAnalyticsGuideView.d.ts +6 -1
  645. package/dist/features/admin/components/AdminAnalyticsGuideView.js +4 -2
  646. package/dist/features/admin/components/AdminArtAndStickersView.d.ts +20 -0
  647. package/dist/features/admin/components/AdminArtAndStickersView.js +39 -0
  648. package/dist/features/admin/components/AdminAuditLogView.d.ts +6 -2
  649. package/dist/features/admin/components/AdminAuditLogView.js +5 -1
  650. package/dist/features/admin/components/AdminBidsView.d.ts +6 -2
  651. package/dist/features/admin/components/AdminBidsView.js +5 -3
  652. package/dist/features/admin/components/AdminBlogEditorView.d.ts +6 -1
  653. package/dist/features/admin/components/AdminBlogEditorView.js +5 -2
  654. package/dist/features/admin/components/AdminBlogView.d.ts +6 -2
  655. package/dist/features/admin/components/AdminBlogView.js +4 -2
  656. package/dist/features/admin/components/AdminBrandEditorView.d.ts +6 -1
  657. package/dist/features/admin/components/AdminBrandEditorView.js +6 -2
  658. package/dist/features/admin/components/AdminBrandsView.d.ts +6 -2
  659. package/dist/features/admin/components/AdminBrandsView.js +7 -3
  660. package/dist/features/admin/components/AdminBundleEditorView.d.ts +10 -1
  661. package/dist/features/admin/components/AdminBundleEditorView.js +6 -2
  662. package/dist/features/admin/components/AdminBundlesView.d.ts +4 -1
  663. package/dist/features/admin/components/AdminBundlesView.js +12 -4
  664. package/dist/features/admin/components/AdminCartsView.d.ts +6 -2
  665. package/dist/features/admin/components/AdminCartsView.js +7 -2
  666. package/dist/features/admin/components/AdminCatalogGuideView.d.ts +6 -1
  667. package/dist/features/admin/components/AdminCatalogGuideView.js +5 -3
  668. package/dist/features/admin/components/AdminCategoriesView.d.ts +6 -2
  669. package/dist/features/admin/components/AdminCategoriesView.js +7 -3
  670. package/dist/features/admin/components/AdminCategoryEditorView.d.ts +6 -1
  671. package/dist/features/admin/components/AdminCategoryEditorView.js +13 -9
  672. package/dist/features/admin/components/AdminClassifiedView.d.ts +6 -2
  673. package/dist/features/admin/components/AdminClassifiedView.js +8 -3
  674. package/dist/features/admin/components/AdminClearanceView.d.ts +8 -0
  675. package/dist/features/admin/components/AdminClearanceView.js +156 -0
  676. package/dist/features/admin/components/AdminContactView.d.ts +4 -1
  677. package/dist/features/admin/components/AdminContactView.js +3 -1
  678. package/dist/features/admin/components/AdminContentGuideView.d.ts +6 -1
  679. package/dist/features/admin/components/AdminContentGuideView.js +5 -3
  680. package/dist/features/admin/components/AdminCouponEditorView.d.ts +6 -1
  681. package/dist/features/admin/components/AdminCouponEditorView.js +9 -5
  682. package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
  683. package/dist/features/admin/components/AdminCouponsView.js +4 -2
  684. package/dist/features/admin/components/AdminDashboardView.d.ts +4 -1
  685. package/dist/features/admin/components/AdminDashboardView.js +3 -1
  686. package/dist/features/admin/components/AdminDigitalCodesView.d.ts +6 -2
  687. package/dist/features/admin/components/AdminDigitalCodesView.js +4 -3
  688. package/dist/features/admin/components/AdminEmployeeEditorView.d.ts +36 -1
  689. package/dist/features/admin/components/AdminEmployeeEditorView.js +15 -7
  690. package/dist/features/admin/components/AdminFaqEditorView.d.ts +6 -1
  691. package/dist/features/admin/components/AdminFaqEditorView.js +84 -5
  692. package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
  693. package/dist/features/admin/components/AdminFaqsView.js +5 -4
  694. package/dist/features/admin/components/AdminFeatureEditorView.d.ts +6 -1
  695. package/dist/features/admin/components/AdminFeatureEditorView.js +6 -2
  696. package/dist/features/admin/components/AdminFeaturesView.d.ts +6 -2
  697. package/dist/features/admin/components/AdminFeaturesView.js +10 -4
  698. package/dist/features/admin/components/AdminFulfillmentView.d.ts +4 -1
  699. package/dist/features/admin/components/AdminFulfillmentView.js +3 -2
  700. package/dist/features/admin/components/AdminGatewayEventsView.d.ts +6 -2
  701. package/dist/features/admin/components/AdminGatewayEventsView.js +5 -3
  702. package/dist/features/admin/components/AdminGroupedListingsView.d.ts +6 -2
  703. package/dist/features/admin/components/AdminGroupedListingsView.js +3 -2
  704. package/dist/features/admin/components/AdminGuideHubView.d.ts +7 -1
  705. package/dist/features/admin/components/AdminGuideHubView.js +6 -3
  706. package/dist/features/admin/components/AdminHistoryView.d.ts +6 -2
  707. package/dist/features/admin/components/AdminHistoryView.js +7 -6
  708. package/dist/features/admin/components/AdminInvoicingView.d.ts +6 -1
  709. package/dist/features/admin/components/AdminInvoicingView.js +3 -2
  710. package/dist/features/admin/components/AdminLiveView.d.ts +6 -2
  711. package/dist/features/admin/components/AdminLiveView.js +4 -3
  712. package/dist/features/admin/components/AdminMediaView.d.ts +4 -1
  713. package/dist/features/admin/components/AdminMediaView.js +15 -3
  714. package/dist/features/admin/components/AdminMoneyCasesView.d.ts +6 -2
  715. package/dist/features/admin/components/AdminMoneyCasesView.js +5 -3
  716. package/dist/features/admin/components/AdminNavEditorView.d.ts +12 -1
  717. package/dist/features/admin/components/AdminNavEditorView.js +4 -3
  718. package/dist/features/admin/components/AdminNavigationView.d.ts +4 -1
  719. package/dist/features/admin/components/AdminNavigationView.js +3 -1
  720. package/dist/features/admin/components/AdminNewsletterView.d.ts +4 -1
  721. package/dist/features/admin/components/AdminNewsletterView.js +3 -2
  722. package/dist/features/admin/components/AdminNotificationsView.d.ts +6 -2
  723. package/dist/features/admin/components/AdminNotificationsView.js +19 -7
  724. package/dist/features/admin/components/AdminOffersView.d.ts +6 -2
  725. package/dist/features/admin/components/AdminOffersView.js +4 -3
  726. package/dist/features/admin/components/AdminOrderEditorView.d.ts +1 -1
  727. package/dist/features/admin/components/AdminOrderEditorView.js +1 -1
  728. package/dist/features/admin/components/AdminOrdersGuideView.d.ts +6 -1
  729. package/dist/features/admin/components/AdminOrdersGuideView.js +6 -4
  730. package/dist/features/admin/components/AdminOrdersView.d.ts +6 -2
  731. package/dist/features/admin/components/AdminOrdersView.js +46 -5
  732. package/dist/features/admin/components/AdminPaymentClustersView.d.ts +4 -1
  733. package/dist/features/admin/components/AdminPaymentClustersView.js +3 -2
  734. package/dist/features/admin/components/AdminPaymentMethodsView.d.ts +4 -1
  735. package/dist/features/admin/components/AdminPaymentMethodsView.js +3 -2
  736. package/dist/features/admin/components/AdminPaymentsGuideView.d.ts +6 -1
  737. package/dist/features/admin/components/AdminPaymentsGuideView.js +3 -2
  738. package/dist/features/admin/components/AdminPayoutsView.d.ts +6 -2
  739. package/dist/features/admin/components/AdminPayoutsView.js +3 -2
  740. package/dist/features/admin/components/AdminProductEditorView.d.ts +6 -1
  741. package/dist/features/admin/components/AdminProductEditorView.js +7 -3
  742. package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
  743. package/dist/features/admin/components/AdminProductsView.js +80 -48
  744. package/dist/features/admin/components/AdminReturnRequestsView.d.ts +4 -1
  745. package/dist/features/admin/components/AdminReturnRequestsView.js +3 -2
  746. package/dist/features/admin/components/AdminReviewsView.d.ts +6 -2
  747. package/dist/features/admin/components/AdminReviewsView.js +3 -2
  748. package/dist/features/admin/components/AdminScammersView.d.ts +6 -2
  749. package/dist/features/admin/components/AdminScammersView.js +3 -2
  750. package/dist/features/admin/components/AdminSectionsView.d.ts +4 -1
  751. package/dist/features/admin/components/AdminSectionsView.js +42 -40
  752. package/dist/features/admin/components/AdminSessionsView.d.ts +6 -2
  753. package/dist/features/admin/components/AdminSessionsView.js +3 -2
  754. package/dist/features/admin/components/AdminSidebar.js +19 -5
  755. package/dist/features/admin/components/AdminSiteConfigGuideView.d.ts +6 -1
  756. package/dist/features/admin/components/AdminSiteConfigGuideView.js +4 -3
  757. package/dist/features/admin/components/AdminSiteSettingsView.d.ts +4 -1
  758. package/dist/features/admin/components/AdminSiteSettingsView.js +1161 -646
  759. package/dist/features/admin/components/AdminSparesView.d.ts +7 -3
  760. package/dist/features/admin/components/AdminSparesView.js +5 -4
  761. package/dist/features/admin/components/AdminStoreAddressesView.d.ts +4 -1
  762. package/dist/features/admin/components/AdminStoreAddressesView.js +3 -2
  763. package/dist/features/admin/components/AdminStoreEditorView.js +4 -3
  764. package/dist/features/admin/components/AdminStoresGuideView.d.ts +6 -1
  765. package/dist/features/admin/components/AdminStoresGuideView.js +4 -2
  766. package/dist/features/admin/components/AdminStoresView.d.ts +6 -2
  767. package/dist/features/admin/components/AdminStoresView.js +3 -2
  768. package/dist/features/admin/components/AdminSublistingCategoriesView.d.ts +4 -1
  769. package/dist/features/admin/components/AdminSublistingCategoriesView.js +4 -3
  770. package/dist/features/admin/components/AdminSublistingCategoryEditorView.d.ts +6 -1
  771. package/dist/features/admin/components/AdminSublistingCategoryEditorView.js +3 -1
  772. package/dist/features/admin/components/AdminSupportTicketDetailView.js +2 -1
  773. package/dist/features/admin/components/AdminSupportTicketsView.d.ts +6 -2
  774. package/dist/features/admin/components/AdminSupportTicketsView.js +3 -2
  775. package/dist/features/admin/components/AdminTaxCodesView.d.ts +6 -2
  776. package/dist/features/admin/components/AdminTaxCodesView.js +4 -3
  777. package/dist/features/admin/components/AdminTeamGuideView.d.ts +6 -1
  778. package/dist/features/admin/components/AdminTeamGuideView.js +5 -2
  779. package/dist/features/admin/components/AdminTeamView.d.ts +4 -1
  780. package/dist/features/admin/components/AdminTeamView.js +22 -28
  781. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.d.ts +6 -1
  782. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +6 -2
  783. package/dist/features/admin/components/AdminTesterChecklistView.d.ts +4 -1
  784. package/dist/features/admin/components/AdminTesterChecklistView.js +5 -4
  785. package/dist/features/admin/components/AdminTrustGuideView.d.ts +6 -1
  786. package/dist/features/admin/components/AdminTrustGuideView.js +5 -3
  787. package/dist/features/admin/components/AdminUserEditorView.js +2 -1
  788. package/dist/features/admin/components/AdminUsersGuideView.d.ts +6 -1
  789. package/dist/features/admin/components/AdminUsersGuideView.js +4 -2
  790. package/dist/features/admin/components/AdminUsersView.d.ts +6 -2
  791. package/dist/features/admin/components/AdminUsersView.js +38 -6
  792. package/dist/features/admin/components/AdminViewCards.js +1 -1
  793. package/dist/features/admin/components/AdminWishlistsView.d.ts +6 -2
  794. package/dist/features/admin/components/AdminWishlistsView.js +7 -6
  795. package/dist/features/admin/components/DashboardStats.js +20 -23
  796. package/dist/features/admin/components/DataListingView.js +16 -2
  797. package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
  798. package/dist/features/admin/components/OwnerQuickActions.js +18 -2
  799. package/dist/features/admin/components/QuickEditMenu.js +1 -1
  800. package/dist/features/admin/components/ViewNotificationModal.js +1 -1
  801. package/dist/features/admin/components/analytics/AdminStatCard.d.ts +1 -5
  802. package/dist/features/admin/components/analytics/AdminStatCard.js +2 -14
  803. package/dist/features/admin/components/index.d.ts +4 -12
  804. package/dist/features/admin/components/index.js +4 -8
  805. package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +5 -5
  806. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +22 -22
  807. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +8 -7
  808. package/dist/features/admin/components/sections/adminSectionsTypes.js +14 -14
  809. package/dist/features/admin/constants/filter-tabs.d.ts +27 -17
  810. package/dist/features/admin/constants/filter-tabs.js +40 -12
  811. package/dist/features/admin/constants/site-settings-tabs.d.ts +4 -4
  812. package/dist/features/admin/constants/site-settings-tabs.js +3 -3
  813. package/dist/features/admin/hooks/build-filter-panel.d.ts +50 -0
  814. package/dist/features/admin/hooks/build-filter-panel.js +55 -0
  815. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  816. package/dist/features/admin/hooks/useAdminListingData.js +14 -1
  817. package/dist/features/admin/hooks/useAdminSiteSettingsPreview.d.ts +6 -0
  818. package/dist/features/admin/hooks/useAdminSiteSettingsPreview.js +46 -0
  819. package/dist/features/admin/repository/site-settings.repository.d.ts +26 -25
  820. package/dist/features/admin/repository/site-settings.repository.js +73 -21
  821. package/dist/features/admin/schemas/admin-editor-forms.d.ts +2 -2
  822. package/dist/features/admin/schemas/admin-user-form.d.ts +7 -7
  823. package/dist/features/admin/schemas/admin-user-form.js +6 -6
  824. package/dist/features/admin/schemas/firestore.d.ts +265 -41
  825. package/dist/features/admin/schemas/firestore.js +10 -10
  826. package/dist/features/admin/schemas/nav-item-form.d.ts +2 -2
  827. package/dist/features/admin/schemas/site-settings-about-form.d.ts +162 -0
  828. package/dist/features/admin/schemas/site-settings-about-form.js +142 -0
  829. package/dist/features/admin/schemas/site-settings-announcement-form.d.ts +18 -0
  830. package/dist/features/admin/schemas/site-settings-announcement-form.js +53 -0
  831. package/dist/features/admin/schemas/site-settings-appearance-form.d.ts +93 -0
  832. package/dist/features/admin/schemas/site-settings-appearance-form.js +75 -0
  833. package/dist/features/admin/schemas/site-settings-branding-form.d.ts +30 -0
  834. package/dist/features/admin/schemas/site-settings-branding-form.js +77 -0
  835. package/dist/features/admin/schemas/site-settings-collector-drop-form.d.ts +30 -0
  836. package/dist/features/admin/schemas/site-settings-collector-drop-form.js +63 -0
  837. package/dist/features/admin/schemas/site-settings-contact-form.d.ts +42 -0
  838. package/dist/features/admin/schemas/site-settings-contact-form.js +85 -0
  839. package/dist/features/admin/schemas/site-settings-emi-form.d.ts +27 -0
  840. package/dist/features/admin/schemas/site-settings-emi-form.js +68 -0
  841. package/dist/features/admin/schemas/site-settings-fees-form.d.ts +78 -0
  842. package/dist/features/admin/schemas/site-settings-fees-form.js +161 -0
  843. package/dist/features/admin/schemas/site-settings-form.d.ts +3 -3
  844. package/dist/features/admin/schemas/site-settings-form.js +1 -1
  845. package/dist/features/admin/schemas/site-settings-gst-form.d.ts +18 -0
  846. package/dist/features/admin/schemas/site-settings-gst-form.js +57 -0
  847. package/dist/features/admin/schemas/site-settings-integrations-form.d.ts +99 -0
  848. package/dist/features/admin/schemas/site-settings-integrations-form.js +172 -0
  849. package/dist/features/admin/schemas/site-settings-legal-form.d.ts +38 -0
  850. package/dist/features/admin/schemas/site-settings-legal-form.js +76 -0
  851. package/dist/features/admin/schemas/site-settings-limits-form.d.ts +15 -0
  852. package/dist/features/admin/schemas/site-settings-limits-form.js +48 -0
  853. package/dist/features/admin/schemas/site-settings-listings-form.d.ts +15 -0
  854. package/dist/features/admin/schemas/site-settings-listings-form.js +78 -0
  855. package/dist/features/admin/schemas/site-settings-notifications-form.d.ts +60 -0
  856. package/dist/features/admin/schemas/site-settings-notifications-form.js +160 -0
  857. package/dist/features/admin/schemas/site-settings-procurement-form.d.ts +12 -0
  858. package/dist/features/admin/schemas/site-settings-procurement-form.js +48 -0
  859. package/dist/features/admin/schemas/site-settings-seo-form.d.ts +21 -0
  860. package/dist/features/admin/schemas/site-settings-seo-form.js +42 -0
  861. package/dist/features/admin/schemas/site-settings-shipping-form.d.ts +48 -0
  862. package/dist/features/admin/schemas/site-settings-shipping-form.js +132 -0
  863. package/dist/features/admin/schemas/site-settings-watermark-form.d.ts +34 -0
  864. package/dist/features/admin/schemas/site-settings-watermark-form.js +68 -0
  865. package/dist/features/admin/schemas/site-settings-whatsapp-form.d.ts +36 -0
  866. package/dist/features/admin/schemas/site-settings-whatsapp-form.js +62 -0
  867. package/dist/features/admin/types/product.types.d.ts +6 -6
  868. package/dist/features/admin/types/product.types.js +1 -1
  869. package/dist/features/analytics/types.d.ts +1 -1
  870. package/dist/features/analytics/types.js +3 -3
  871. package/dist/features/assistant/components/AdminAssistantWidget.d.ts +1 -0
  872. package/dist/features/assistant/components/AdminAssistantWidget.js +84 -0
  873. package/dist/features/assistant/components/AssistantPageView.d.ts +6 -0
  874. package/dist/features/assistant/components/AssistantPageView.js +54 -0
  875. package/dist/features/assistant/components/AssistantWidget.d.ts +5 -0
  876. package/dist/features/assistant/components/AssistantWidget.js +127 -0
  877. package/dist/features/assistant/schemas/ask.d.ts +15 -0
  878. package/dist/features/assistant/schemas/ask.js +10 -0
  879. package/dist/features/audit-log/schemas/firestore.d.ts +94 -0
  880. package/dist/features/audit-log/schemas/firestore.js +51 -0
  881. package/dist/features/auth/actions/profile-actions.d.ts +8 -6
  882. package/dist/features/auth/actions/profile-actions.js +17 -8
  883. package/dist/features/auth/actions/user-slug.js +21 -2
  884. package/dist/features/auth/auth-helpers.d.ts +186 -2
  885. package/dist/features/auth/auth-helpers.js +320 -4
  886. package/dist/features/auth/components/Guards.d.ts +10 -0
  887. package/dist/features/auth/components/Guards.js +30 -6
  888. package/dist/features/auth/components/OAuthLoadingView.d.ts +6 -1
  889. package/dist/features/auth/components/OAuthLoadingView.js +3 -2
  890. package/dist/features/auth/hooks/useAuth.js +11 -4
  891. package/dist/features/auth/hooks/useRBAC.d.ts +29 -1
  892. package/dist/features/auth/hooks/useRBAC.js +46 -12
  893. package/dist/features/auth/permissions/constants.d.ts +130 -5
  894. package/dist/features/auth/permissions/constants.js +176 -2
  895. package/dist/features/auth/repository/user.repository.d.ts +89 -29
  896. package/dist/features/auth/repository/user.repository.js +218 -79
  897. package/dist/features/auth/role-predicates.d.ts +64 -8
  898. package/dist/features/auth/role-predicates.js +104 -12
  899. package/dist/features/auth/schemas/firestore.d.ts +107 -8
  900. package/dist/features/auth/schemas/firestore.js +19 -2
  901. package/dist/features/auth/schemas/index.d.ts +26 -6
  902. package/dist/features/auth/schemas/index.js +17 -0
  903. package/dist/features/auth/types/index.d.ts +23 -1
  904. package/dist/features/before-after/schemas/index.d.ts +2 -2
  905. package/dist/features/blog/actions/blog-actions.d.ts +31 -31
  906. package/dist/features/blog/actions/blog-actions.js +1 -1
  907. package/dist/features/blog/components/BlogFeaturedCard.js +1 -1
  908. package/dist/features/blog/components/BlogIndexListing.js +2 -1
  909. package/dist/features/blog/components/BlogIndexPageView.d.ts +4 -1
  910. package/dist/features/blog/components/BlogIndexPageView.js +3 -2
  911. package/dist/features/blog/components/BlogListView.js +1 -1
  912. package/dist/features/blog/components/BlogPostView.js +33 -2
  913. package/dist/features/blog/schemas/blog-category.schema.d.ts +2 -0
  914. package/dist/features/blog/schemas/blog-category.schema.js +8 -0
  915. package/dist/features/blog/schemas/blog-form.d.ts +4 -4
  916. package/dist/features/blog/schemas/blog-form.js +1 -1
  917. package/dist/features/blog/schemas/index.d.ts +67 -67
  918. package/dist/features/blog/schemas/index.js +3 -7
  919. package/dist/features/cart/actions/cart-actions.d.ts +5 -5
  920. package/dist/features/cart/actions/cart-actions.js +7 -7
  921. package/dist/features/cart/components/CartDrawer.js +1 -1
  922. package/dist/features/cart/components/CartGroupLineRow.js +1 -1
  923. package/dist/features/cart/components/CartView.d.ts +1 -1
  924. package/dist/features/cart/hooks/useCartQuery.d.ts +1 -1
  925. package/dist/features/cart/hooks/useCheckoutReadQueries.d.ts +1 -1
  926. package/dist/features/cart/repository/cart.repository.d.ts +3 -3
  927. package/dist/features/cart/repository/cart.repository.js +6 -6
  928. package/dist/features/cart/schemas/firestore.d.ts +21 -21
  929. package/dist/features/cart/schemas/firestore.js +2 -2
  930. package/dist/features/cart/schemas/index.d.ts +15 -15
  931. package/dist/features/cart/utils/pending-ops.d.ts +1 -1
  932. package/dist/features/cart/utils/pending-ops.js +16 -3
  933. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.d.ts +6 -1
  934. package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +3 -1
  935. package/dist/features/catalogue/components/CatalogueItemEditorView.d.ts +6 -1
  936. package/dist/features/catalogue/components/CatalogueItemEditorView.js +3 -2
  937. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.d.ts +4 -1
  938. package/dist/features/catalogue/components/PublicCatalogueItemDetailView.js +4 -3
  939. package/dist/features/catalogue/components/PublicCatalogueView.js +1 -1
  940. package/dist/features/catalogue/components/UserCatalogueView.d.ts +4 -1
  941. package/dist/features/catalogue/components/UserCatalogueView.js +4 -3
  942. package/dist/features/catalogue/utils/product-from-item.d.ts +18 -2
  943. package/dist/features/catalogue/utils/product-from-item.js +23 -4
  944. package/dist/features/categories/api/[id]/description-template/route.js +1 -24
  945. package/dist/features/categories/api/[id]/price-guidance/route.js +6 -1
  946. package/dist/features/categories/api/[id]/route.js +20 -3
  947. package/dist/features/categories/api/route.js +1 -1
  948. package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -1
  949. package/dist/features/categories/components/BrandDetailPageView.js +50 -10
  950. package/dist/features/categories/components/BrandDetailTabs.d.ts +12 -3
  951. package/dist/features/categories/components/BrandDetailTabs.js +10 -9
  952. package/dist/features/categories/components/BundleCollage.d.ts +1 -1
  953. package/dist/features/categories/components/BundleCollage.js +2 -2
  954. package/dist/features/categories/components/BundleDetailView.d.ts +4 -1
  955. package/dist/features/categories/components/BundleDetailView.js +4 -3
  956. package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +1 -1
  957. package/dist/features/categories/components/BundleDynamicRuleEditor.js +1 -1
  958. package/dist/features/categories/components/BundleItemsPicker.js +2 -1
  959. package/dist/features/categories/components/BundlesListView.d.ts +4 -1
  960. package/dist/features/categories/components/BundlesListView.js +3 -2
  961. package/dist/features/categories/components/CategoriesIndexListing.js +10 -3
  962. package/dist/features/categories/components/CategoriesIndexPageView.d.ts +4 -1
  963. package/dist/features/categories/components/CategoriesIndexPageView.js +3 -2
  964. package/dist/features/categories/components/CategoryBundlesListing.js +7 -3
  965. package/dist/features/categories/components/CategoryDetailPageView.d.ts +4 -1
  966. package/dist/features/categories/components/CategoryDetailPageView.js +135 -101
  967. package/dist/features/categories/components/CategoryDetailTabs.d.ts +12 -3
  968. package/dist/features/categories/components/CategoryDetailTabs.js +10 -10
  969. package/dist/features/categories/components/CategoryForm.js +2 -1
  970. package/dist/features/categories/components/CategoryGrid.js +1 -1
  971. package/dist/features/categories/components/CategoryProductsListing.d.ts +1 -1
  972. package/dist/features/categories/components/CategoryProductsListing.js +6 -5
  973. package/dist/features/categories/components/CategoryTableColumns.js +1 -1
  974. package/dist/features/categories/components/ConcernCard.js +1 -1
  975. package/dist/features/categories/components/ContextualTrail.d.ts +9 -2
  976. package/dist/features/categories/components/ContextualTrail.js +11 -3
  977. package/dist/features/categories/components/FranchiseDetailPageView.d.ts +4 -1
  978. package/dist/features/categories/components/FranchiseDetailPageView.js +24 -5
  979. package/dist/features/categories/components/FranchisesIndexView.d.ts +6 -1
  980. package/dist/features/categories/components/FranchisesIndexView.js +4 -3
  981. package/dist/features/categories/components/LastCategoryBeacon.js +2 -2
  982. package/dist/features/categories/components/SubcategoryCardRow.js +1 -1
  983. package/dist/features/categories/hooks/useCategorySelector.d.ts +1 -1
  984. package/dist/features/categories/hooks/useCategoryTree.js +1 -1
  985. package/dist/features/categories/repository/categories.repository.d.ts +43 -6
  986. package/dist/features/categories/repository/categories.repository.js +75 -22
  987. package/dist/features/categories/repository/price-index.repository.d.ts +2 -2
  988. package/dist/features/categories/schemas/bundle-form.d.ts +21 -21
  989. package/dist/features/categories/schemas/bundle-form.js +1 -1
  990. package/dist/features/categories/schemas/category-content.d.ts +3 -3
  991. package/dist/features/categories/schemas/category-counts.d.ts +5 -5
  992. package/dist/features/categories/schemas/category-counts.js +4 -4
  993. package/dist/features/categories/schemas/firestore.d.ts +36 -18
  994. package/dist/features/categories/schemas/firestore.js +9 -9
  995. package/dist/features/categories/schemas/index.d.ts +122 -116
  996. package/dist/features/categories/schemas/index.js +10 -6
  997. package/dist/features/categories/types/index.d.ts +13 -10
  998. package/dist/features/checkout/actions/checkout-value-otp-actions.js +9 -1
  999. package/dist/features/checkout/manifest.js +15 -6
  1000. package/dist/features/checkout/repository/buyer-policy-consent.repository.d.ts +44 -0
  1001. package/dist/features/checkout/repository/buyer-policy-consent.repository.js +66 -0
  1002. package/dist/features/checkout/schemas/firestore.d.ts +37 -0
  1003. package/dist/features/checkout/schemas/firestore.js +1 -0
  1004. package/dist/features/classified/components/ClassifiedDetailPageView.d.ts +4 -1
  1005. package/dist/features/classified/components/ClassifiedDetailPageView.js +35 -21
  1006. package/dist/features/collections/components/CollectionCard.js +1 -1
  1007. package/dist/features/collections/schemas/index.d.ts +4 -4
  1008. package/dist/features/collector-drops/actions/bid-actions.d.ts +50 -0
  1009. package/dist/features/collector-drops/actions/bid-actions.js +454 -0
  1010. package/dist/features/collector-drops/api/route.d.ts +14 -0
  1011. package/dist/features/collector-drops/api/route.js +62 -0
  1012. package/dist/features/collector-drops/columns/index.d.ts +14 -0
  1013. package/dist/features/collector-drops/columns/index.js +63 -0
  1014. package/dist/features/collector-drops/components/CollapsibleBidHistory.js +41 -0
  1015. package/dist/features/collector-drops/components/CollectorDropBidsTable.d.ts +27 -0
  1016. package/dist/features/collector-drops/components/CollectorDropBidsTable.js +96 -0
  1017. package/dist/features/collector-drops/components/CollectorDropBottomActions.d.ts +23 -0
  1018. package/dist/features/collector-drops/components/CollectorDropBottomActions.js +89 -0
  1019. package/dist/features/collector-drops/components/CollectorDropDetailPageView.d.ts +25 -0
  1020. package/dist/features/collector-drops/components/CollectorDropDetailPageView.js +314 -0
  1021. package/dist/features/collector-drops/components/CollectorDropFilters.d.ts +16 -0
  1022. package/dist/features/collector-drops/components/CollectorDropFilters.js +18 -0
  1023. package/dist/features/collector-drops/components/CollectorDropLiveStatusBadge.d.ts +20 -0
  1024. package/dist/features/collector-drops/components/CollectorDropLiveStatusBadge.js +21 -0
  1025. package/dist/features/collector-drops/components/CollectorDropsListView.d.ts +9 -0
  1026. package/dist/features/collector-drops/components/CollectorDropsListView.js +23 -0
  1027. package/dist/features/collector-drops/components/LiveBidPrice.d.ts +19 -0
  1028. package/dist/features/collector-drops/components/LiveBidPrice.js +19 -0
  1029. package/dist/features/collector-drops/components/LiveMinIncrement.d.ts +18 -0
  1030. package/dist/features/collector-drops/components/LiveMinIncrement.js +25 -0
  1031. package/dist/features/collector-drops/components/MarketplaceCollectorDropCard.d.ts +99 -0
  1032. package/dist/features/collector-drops/components/MarketplaceCollectorDropCard.js +212 -0
  1033. package/dist/features/collector-drops/components/MarketplaceCollectorDropGrid.d.ts +21 -0
  1034. package/dist/features/collector-drops/components/MarketplaceCollectorDropGrid.js +47 -0
  1035. package/dist/features/collector-drops/components/PlaceBidFormClient.d.ts +65 -0
  1036. package/dist/features/collector-drops/components/PlaceBidFormClient.js +306 -0
  1037. package/dist/features/collector-drops/components/bid-detail-fields.js +103 -0
  1038. package/dist/features/collector-drops/components/index.d.ts +7 -0
  1039. package/dist/features/collector-drops/components/index.js +5 -0
  1040. package/dist/features/collector-drops/hooks/useBids.d.ts +33 -0
  1041. package/dist/features/collector-drops/hooks/useBids.js +32 -0
  1042. package/dist/features/collector-drops/hooks/useCollectorDrops.d.ts +51 -0
  1043. package/dist/features/collector-drops/hooks/useCollectorDrops.js +105 -0
  1044. package/dist/features/collector-drops/hooks/useIsCollectorDropEnded.d.ts +41 -0
  1045. package/dist/features/collector-drops/hooks/useIsCollectorDropEnded.js +76 -0
  1046. package/dist/features/collector-drops/hooks/useLiveCollectorDropBid.d.ts +20 -0
  1047. package/dist/features/collector-drops/hooks/useLiveCollectorDropBid.js +23 -0
  1048. package/dist/features/collector-drops/hooks/usePlaceBid.d.ts +25 -0
  1049. package/dist/features/collector-drops/hooks/usePlaceBid.js +28 -0
  1050. package/dist/features/collector-drops/hooks/useRealtimeBids.d.ts +41 -0
  1051. package/dist/features/collector-drops/hooks/useRealtimeBids.js +170 -0
  1052. package/dist/features/collector-drops/index.d.ts +8 -0
  1053. package/dist/features/collector-drops/index.js +8 -0
  1054. package/dist/features/collector-drops/manifest.js +17 -0
  1055. package/dist/features/collector-drops/messages/en.json +18 -0
  1056. package/dist/features/collector-drops/repository/bid.repository.d.ts +256 -0
  1057. package/dist/features/collector-drops/repository/bid.repository.js +575 -0
  1058. package/dist/features/collector-drops/schemas/bid-input.d.ts +30 -0
  1059. package/dist/features/collector-drops/schemas/bid-input.js +28 -0
  1060. package/dist/features/collector-drops/schemas/firestore.d.ts +120 -0
  1061. package/dist/features/collector-drops/schemas/firestore.js +73 -0
  1062. package/dist/features/collector-drops/schemas/index.d.ts +170 -0
  1063. package/dist/features/collector-drops/schemas/index.js +64 -0
  1064. package/dist/features/collector-drops/server.d.ts +8 -0
  1065. package/dist/features/collector-drops/server.js +8 -0
  1066. package/dist/features/collector-drops/types/index.d.ts +74 -0
  1067. package/dist/features/consultation/schemas/index.d.ts +6 -6
  1068. package/dist/features/contact/components/ContactInfoSidebar.d.ts +3 -1
  1069. package/dist/features/contact/components/ContactInfoSidebar.js +3 -2
  1070. package/dist/features/contact/components/ContactPageView.d.ts +4 -1
  1071. package/dist/features/contact/components/ContactPageView.js +7 -6
  1072. package/dist/features/contact/email.d.ts +1 -1
  1073. package/dist/features/contact/email.js +11 -12
  1074. package/dist/features/contact/schemas/inquiry-forms.js +2 -2
  1075. package/dist/features/corporate/schemas/index.d.ts +5 -5
  1076. package/dist/features/cron/firebase-adapters.d.ts +3 -3
  1077. package/dist/features/cron/firebase-adapters.js +3 -3
  1078. package/dist/features/cron/index.d.ts +0 -1
  1079. package/dist/features/cron/index.js +9 -1
  1080. package/dist/features/cron/jobs/preorder-reminder.job.d.ts +1 -1
  1081. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  1082. package/dist/features/cron/registry.d.ts +4 -4
  1083. package/dist/features/cron/registry.js +4 -4
  1084. package/dist/features/dashboard/components/AdminComposableRegion.d.ts +49 -0
  1085. package/dist/features/dashboard/components/AdminComposableRegion.js +42 -0
  1086. package/dist/features/dashboard/components/DashboardCardRenderer.d.ts +73 -0
  1087. package/dist/features/dashboard/components/DashboardCardRenderer.js +434 -0
  1088. package/dist/features/dashboard/components/DashboardHubView.d.ts +19 -1
  1089. package/dist/features/dashboard/components/DashboardHubView.js +11 -6
  1090. package/dist/features/dashboard/components/DashboardQuickJump.d.ts +90 -0
  1091. package/dist/features/dashboard/components/DashboardQuickJump.js +255 -0
  1092. package/dist/features/dashboard/components/DashboardSectionsClient.js +7 -0
  1093. package/dist/features/dashboard/components/EditableWidget.d.ts +51 -0
  1094. package/dist/features/dashboard/components/EditableWidget.js +44 -0
  1095. package/dist/features/dashboard/components/HiddenHubCardGate.d.ts +25 -0
  1096. package/dist/features/dashboard/components/HiddenHubCardGate.js +44 -0
  1097. package/dist/features/dashboard/components/RecentVisitTracker.d.ts +35 -0
  1098. package/dist/features/dashboard/components/RecentVisitTracker.js +33 -0
  1099. package/dist/features/dashboard/components/WidgetInstanceEditor.d.ts +91 -0
  1100. package/dist/features/dashboard/components/WidgetInstanceEditor.js +91 -0
  1101. package/dist/features/dashboard/hooks/useHiddenHubCards.d.ts +9 -0
  1102. package/dist/features/dashboard/hooks/useHiddenHubCards.js +101 -0
  1103. package/dist/features/dashboard/hooks/usePageRegion.d.ts +27 -0
  1104. package/dist/features/dashboard/hooks/usePageRegion.js +106 -0
  1105. package/dist/features/dashboard/hooks/useRecentlyVisited.d.ts +9 -0
  1106. package/dist/features/dashboard/hooks/useRecentlyVisited.js +127 -0
  1107. package/dist/features/dashboard/hooks/useSavedCards.d.ts +23 -0
  1108. package/dist/features/dashboard/hooks/useSavedCards.js +147 -0
  1109. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.d.ts +4 -1
  1110. package/dist/features/digital-codes/components/DigitalCodeDetailPageView.js +29 -13
  1111. package/dist/features/email/notification-templates.js +7 -8
  1112. package/dist/features/email/render-static-markup.d.ts +34 -0
  1113. package/dist/features/email/render-static-markup.js +4 -0
  1114. package/dist/features/events/actions/event-actions.d.ts +11 -3
  1115. package/dist/features/events/actions/event-actions.js +21 -11
  1116. package/dist/features/events/api/[id]/route.js +1 -1
  1117. package/dist/features/events/components/AdminEventEditorView.d.ts +6 -1
  1118. package/dist/features/events/components/AdminEventEditorView.js +81 -21
  1119. package/dist/features/events/components/AdminEventEntriesView.d.ts +4 -1
  1120. package/dist/features/events/components/AdminEventEntriesView.js +3 -2
  1121. package/dist/features/events/components/AdminEventsView.d.ts +6 -2
  1122. package/dist/features/events/components/AdminEventsView.js +5 -4
  1123. package/dist/features/events/components/BonusSpinView.d.ts +27 -0
  1124. package/dist/features/events/components/BonusSpinView.js +151 -0
  1125. package/dist/features/events/components/EventCard.js +1 -1
  1126. package/dist/features/events/components/EventFilters.js +13 -5
  1127. package/dist/features/events/components/EventGiveawayEntryForm.d.ts +24 -0
  1128. package/dist/features/events/components/EventGiveawayEntryForm.js +46 -0
  1129. package/dist/features/events/components/EventGiveawayWinnerView.d.ts +38 -0
  1130. package/dist/features/events/components/EventGiveawayWinnerView.js +40 -0
  1131. package/dist/features/events/components/EventGiveawaysSection.d.ts +48 -0
  1132. package/dist/features/events/components/EventGiveawaysSection.js +102 -0
  1133. package/dist/features/events/components/EventsIndexListing.js +7 -3
  1134. package/dist/features/events/components/EventsListPageView.d.ts +4 -1
  1135. package/dist/features/events/components/EventsListPageView.js +4 -2
  1136. package/dist/features/events/components/RelatedEventsCarousel.js +1 -1
  1137. package/dist/features/events/components/event-entry-detail-fields.d.ts +1 -1
  1138. package/dist/features/events/components/event-entry-detail-fields.js +1 -1
  1139. package/dist/features/events/components/index.d.ts +8 -8
  1140. package/dist/features/events/components/index.js +4 -4
  1141. package/dist/features/events/constants/event-type-meta.d.ts +14 -6
  1142. package/dist/features/events/constants/event-type-meta.js +40 -14
  1143. package/dist/features/events/manifest.js +31 -0
  1144. package/dist/features/events/repository/events.repository.js +1 -1
  1145. package/dist/features/events/schemas/event-form.d.ts +40 -10
  1146. package/dist/features/events/schemas/event-form.js +32 -1
  1147. package/dist/features/events/schemas/firestore.d.ts +55 -13
  1148. package/dist/features/events/schemas/firestore.js +15 -10
  1149. package/dist/features/events/schemas/index.d.ts +144 -133
  1150. package/dist/features/events/schemas/index.js +24 -11
  1151. package/dist/features/events/types/index.d.ts +32 -7
  1152. package/dist/features/events/types/index.js +45 -8
  1153. package/dist/features/events/utils/carousel-slide.d.ts +12 -14
  1154. package/dist/features/events/utils/carousel-slide.js +23 -26
  1155. package/dist/features/events/utils/event-charts.js +2 -1
  1156. package/dist/features/faq/actions/faq-actions.d.ts +197 -6
  1157. package/dist/features/faq/actions/faq-actions.js +79 -2
  1158. package/dist/features/faq/components/FAQAccordion.js +2 -1
  1159. package/dist/features/faq/manifest.js +9 -1
  1160. package/dist/features/faq/schemas/firestore.d.ts +26 -1
  1161. package/dist/features/faq/schemas/firestore.js +1 -0
  1162. package/dist/features/faq/schemas/index.d.ts +2 -2
  1163. package/dist/features/faq/utils/getHomepageFaqsCached.d.ts +9 -0
  1164. package/dist/features/faq/utils/getHomepageFaqsCached.js +21 -1
  1165. package/dist/features/faq/utils/resolveFaqAnswer.d.ts +9 -0
  1166. package/dist/features/faq/utils/resolveFaqAnswer.js +18 -0
  1167. package/dist/features/gateway-events/schemas/index.d.ts +2 -2
  1168. package/dist/features/giveaway/repository/giveaway-entry.repository.d.ts +48 -0
  1169. package/dist/features/giveaway/repository/giveaway-entry.repository.js +172 -0
  1170. package/dist/features/giveaway/schemas/config-write.d.ts +145 -0
  1171. package/dist/features/giveaway/schemas/config-write.js +199 -0
  1172. package/dist/features/giveaway/schemas/firestore.d.ts +77 -0
  1173. package/dist/features/giveaway/schemas/firestore.js +42 -0
  1174. package/dist/features/giveaway/schemas/zod.d.ts +113 -0
  1175. package/dist/features/giveaway/schemas/zod.js +39 -0
  1176. package/dist/features/giveaway/types/index.d.ts +72 -0
  1177. package/dist/features/giveaway/types/index.js +68 -0
  1178. package/dist/features/grouped/components/GroupedListingDetailView.d.ts +4 -1
  1179. package/dist/features/grouped/components/GroupedListingDetailView.js +4 -3
  1180. package/dist/features/grouped/components/GroupedListingEditorView.d.ts +10 -1
  1181. package/dist/features/grouped/components/GroupedListingEditorView.js +3 -2
  1182. package/dist/features/grouped/schemas/index.d.ts +2 -2
  1183. package/dist/features/history/repository/user-history.repository.d.ts +1 -1
  1184. package/dist/features/history/utils/guest-history.d.ts +1 -1
  1185. package/dist/features/homepage/actions/index.d.ts +0 -1
  1186. package/dist/features/homepage/actions/index.js +0 -1
  1187. package/dist/features/homepage/api/carousel/route.d.ts +12 -6
  1188. package/dist/features/homepage/api/carousel/route.js +15 -137
  1189. package/dist/features/homepage/components/AdSlot.js +1 -1
  1190. package/dist/features/homepage/components/AnnouncementBar.js +5 -3
  1191. package/dist/features/homepage/components/CTABannerSection.js +2 -2
  1192. package/dist/features/homepage/components/CollectionCardsSection.d.ts +2 -2
  1193. package/dist/features/homepage/components/CollectionCardsSection.js +4 -4
  1194. package/dist/features/homepage/components/CustomCardsSection.js +1 -1
  1195. package/dist/features/homepage/components/FeaturedCollectorDropsSection.d.ts +18 -0
  1196. package/dist/features/homepage/components/FeaturedCollectorDropsSection.js +12 -0
  1197. package/dist/features/homepage/components/GoogleReviewsSection.js +1 -1
  1198. package/dist/features/homepage/components/HeroCarousel.js +7 -6
  1199. package/dist/features/homepage/components/HomepageSectionBoundary.d.ts +1 -1
  1200. package/dist/features/homepage/components/HomepageSectionBoundary.js +1 -1
  1201. package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +4 -1
  1202. package/dist/features/homepage/components/MarketplaceHomepageView.js +23 -32
  1203. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  1204. package/dist/features/homepage/components/ShopByCategorySection.js +12 -2
  1205. package/dist/features/homepage/components/SocialPostCard.js +1 -1
  1206. package/dist/features/homepage/components/TrustFeaturesSection.js +11 -1
  1207. package/dist/features/homepage/components/WelcomeSection.d.ts +3 -1
  1208. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  1209. package/dist/features/homepage/components/index.d.ts +2 -2
  1210. package/dist/features/homepage/components/index.js +1 -1
  1211. package/dist/features/homepage/constants/carousel.d.ts +8 -0
  1212. package/dist/features/homepage/constants/carousel.js +8 -0
  1213. package/dist/features/homepage/constants/section-copy.d.ts +2 -2
  1214. package/dist/features/homepage/constants/section-copy.js +5 -5
  1215. package/dist/features/homepage/hooks/homepage-query.js +2 -2
  1216. package/dist/features/homepage/hooks/useActiveAd.d.ts +1 -1
  1217. package/dist/features/homepage/hooks/useActiveAd.js +1 -1
  1218. package/dist/features/homepage/hooks/useFeaturedCollectorDrops.d.ts +15 -0
  1219. package/dist/features/homepage/hooks/useFeaturedCollectorDrops.js +49 -0
  1220. package/dist/features/homepage/index.d.ts +1 -1
  1221. package/dist/features/homepage/index.js +1 -1
  1222. package/dist/features/homepage/lib/section-gating.d.ts +1 -1
  1223. package/dist/features/homepage/lib/section-gating.js +1 -1
  1224. package/dist/features/homepage/lib/section-renderer.d.ts +11 -2
  1225. package/dist/features/homepage/lib/section-renderer.js +24 -13
  1226. package/dist/features/homepage/lib/slide-gating.d.ts +5 -5
  1227. package/dist/features/homepage/lib/slide-gating.js +6 -6
  1228. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +1 -1
  1229. package/dist/features/homepage/schemas/firestore.d.ts +48 -169
  1230. package/dist/features/homepage/schemas/firestore.js +12 -57
  1231. package/dist/features/homepage/schemas/index.d.ts +2 -885
  1232. package/dist/features/homepage/schemas/index.js +7 -112
  1233. package/dist/features/homepage/server.d.ts +1 -3
  1234. package/dist/features/homepage/server.js +1 -3
  1235. package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +6 -1
  1236. package/dist/features/inventory/components/AdminMoveLedgerView.js +3 -2
  1237. package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +6 -1
  1238. package/dist/features/inventory/components/AdminStorageBoxesView.js +4 -3
  1239. package/dist/features/inventory/components/ReceiveStationView.d.ts +4 -1
  1240. package/dist/features/inventory/components/ReceiveStationView.js +3 -2
  1241. package/dist/features/jobs/actions/enqueue-job.d.ts +1 -1
  1242. package/dist/features/jobs/schemas/firestore.d.ts +1 -1
  1243. package/dist/features/layout/AppLayoutShell.d.ts +32 -1
  1244. package/dist/features/layout/AppLayoutShell.js +44 -14
  1245. package/dist/features/layout/AutoBreadcrumbs.js +6 -7
  1246. package/dist/features/layout/BottomActions.js +1 -1
  1247. package/dist/features/layout/BottomNavbar.d.ts +1 -1
  1248. package/dist/features/layout/BottomNavbar.js +1 -1
  1249. package/dist/features/layout/EditModeToggle.d.ts +8 -0
  1250. package/dist/features/layout/EditModeToggle.js +17 -0
  1251. package/dist/features/layout/LanguageSwitcher.d.ts +27 -0
  1252. package/dist/features/layout/LanguageSwitcher.js +28 -0
  1253. package/dist/features/layout/NavbarLayout.js +2 -2
  1254. package/dist/features/layout/SideActionDock.js +2 -2
  1255. package/dist/features/layout/SidebarLayout.js +11 -1
  1256. package/dist/features/layout/TitleBarLayout.d.ts +21 -1
  1257. package/dist/features/layout/TitleBarLayout.js +2 -2
  1258. package/dist/features/layout/index.d.ts +6 -6
  1259. package/dist/features/layout/index.js +3 -3
  1260. package/dist/features/live/components/LiveItemDetailPageView.d.ts +4 -1
  1261. package/dist/features/live/components/LiveItemDetailPageView.js +21 -3
  1262. package/dist/features/media/MediaPickerModal.js +1 -1
  1263. package/dist/features/media/hooks/useMedia.d.ts +1 -1
  1264. package/dist/features/media/index.d.ts +0 -8
  1265. package/dist/features/media/index.js +2 -5
  1266. package/dist/features/media/modals/ImageCropModal.d.ts +2 -8
  1267. package/dist/features/media/types/index.d.ts +4 -4
  1268. package/dist/features/media/upload/ImageUpload.js +1 -1
  1269. package/dist/features/media/upload/MediaUploadField.js +2 -2
  1270. package/dist/features/media/upload/MediaUploadList.js +2 -2
  1271. package/dist/features/media/upload/register-form-field-renderers.d.ts +1 -0
  1272. package/dist/features/media/upload/register-form-field-renderers.js +34 -0
  1273. package/dist/features/messages/components/ConversationThreadView.d.ts +4 -1
  1274. package/dist/features/messages/components/ConversationThreadView.js +4 -3
  1275. package/dist/features/messages/components/ConversationsInboxView.d.ts +6 -1
  1276. package/dist/features/messages/components/ConversationsInboxView.js +26 -3
  1277. package/dist/features/messages/schemas/firestore.d.ts +26 -3
  1278. package/dist/features/messages/schemas/firestore.js +10 -0
  1279. package/dist/features/obligations/constants/policies.js +71 -2
  1280. package/dist/features/obligations/schemas/firestore.d.ts +17 -1
  1281. package/dist/features/obligations/schemas/firestore.js +1 -0
  1282. package/dist/features/orders/actions/order-actions.js +39 -0
  1283. package/dist/features/orders/actions/refund-actions.js +3 -2
  1284. package/dist/features/orders/components/OrderPaymentSummary.js +1 -0
  1285. package/dist/features/orders/components/OrderProvenanceCard.js +11 -11
  1286. package/dist/features/orders/components/OrdersList.js +6 -4
  1287. package/dist/features/orders/components/RefundRequestView.d.ts +4 -1
  1288. package/dist/features/orders/components/RefundRequestView.js +18 -4
  1289. package/dist/features/orders/constants/order-lane-tabs.d.ts +3 -3
  1290. package/dist/features/orders/constants/order-lane-tabs.js +8 -8
  1291. package/dist/features/orders/hooks/useOrders.d.ts +2 -0
  1292. package/dist/features/orders/hooks/useOrders.js +7 -1
  1293. package/dist/features/orders/repository/orders.repository.js +4 -3
  1294. package/dist/features/orders/schemas/firestore.d.ts +197 -26
  1295. package/dist/features/orders/schemas/firestore.js +1 -1
  1296. package/dist/features/orders/schemas/index.d.ts +69 -29
  1297. package/dist/features/orders/schemas/index.js +19 -1
  1298. package/dist/features/orders/types/index.d.ts +45 -4
  1299. package/dist/features/orders/utils/order-splitter.d.ts +3 -3
  1300. package/dist/features/orders/utils/order-splitter.js +8 -8
  1301. package/dist/features/orders/utils/payment-proof-message.js +5 -2
  1302. package/dist/features/payments/repository/payout.repository.d.ts +80 -0
  1303. package/dist/features/payments/repository/payout.repository.js +116 -0
  1304. package/dist/features/payments/schemas/firestore.d.ts +29 -0
  1305. package/dist/features/payments/schemas/firestore.js +15 -0
  1306. package/dist/features/payments/schemas/index.d.ts +2 -2
  1307. package/dist/features/payments/types/index.d.ts +1 -1
  1308. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
  1309. package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +5 -0
  1310. package/dist/features/pre-orders/components/PreOrderActionsClient.js +8 -5
  1311. package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +4 -1
  1312. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +30 -10
  1313. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +1 -1
  1314. package/dist/features/pre-orders/components/PreOrdersListView.d.ts +4 -1
  1315. package/dist/features/pre-orders/components/PreOrdersListView.js +3 -2
  1316. package/dist/features/pre-orders/schemas/index.d.ts +8 -8
  1317. package/dist/features/price-index/components/PriceIndexToolView.d.ts +4 -1
  1318. package/dist/features/price-index/components/PriceIndexToolView.js +12 -11
  1319. package/dist/features/price-index/lookup-target.js +1 -1
  1320. package/dist/features/pricing/components/AdminPricingView.js +2 -1
  1321. package/dist/features/print/components/BoxLabelPrintView.d.ts +4 -1
  1322. package/dist/features/print/components/BoxLabelPrintView.js +3 -2
  1323. package/dist/features/print/components/labels.js +2 -1
  1324. package/dist/features/products/actions/product-actions.d.ts +9 -9
  1325. package/dist/features/products/actions/product-actions.js +19 -19
  1326. package/dist/features/products/api/[id]/route.js +31 -10
  1327. package/dist/features/products/api/route.d.ts +2 -2
  1328. package/dist/features/products/api/route.js +11 -4
  1329. package/dist/features/products/columns/productTableColumns.js +1 -1
  1330. package/dist/features/products/components/ArtStickersListView.d.ts +4 -1
  1331. package/dist/features/products/components/ArtStickersListView.js +7 -6
  1332. package/dist/features/products/components/AvailabilityTabs.js +2 -2
  1333. package/dist/features/products/components/BidHistory.d.ts +3 -0
  1334. package/dist/features/products/components/BidHistory.js +3 -1
  1335. package/dist/features/products/components/CardStoreLine.d.ts +2 -2
  1336. package/dist/features/products/components/CardStoreLine.js +1 -1
  1337. package/dist/features/products/components/CityCollectiblesView.d.ts +4 -1
  1338. package/dist/features/products/components/CityCollectiblesView.js +4 -2
  1339. package/dist/features/products/components/ClearanceBottomActions.d.ts +6 -0
  1340. package/dist/features/products/components/ClearanceBottomActions.js +6 -0
  1341. package/dist/features/products/components/ClearanceCollage.d.ts +35 -0
  1342. package/dist/features/products/components/ClearanceCollage.js +91 -0
  1343. package/dist/features/products/components/ClearanceDetailPageView.d.ts +37 -0
  1344. package/dist/features/products/components/ClearanceDetailPageView.js +156 -0
  1345. package/dist/features/products/components/ClearanceEntryActions.d.ts +32 -0
  1346. package/dist/features/products/components/ClearanceEntryActions.js +104 -0
  1347. package/dist/features/products/components/ClearanceIndexListing.d.ts +8 -0
  1348. package/dist/features/products/components/ClearanceIndexListing.js +108 -0
  1349. package/dist/features/products/components/ClearanceItemsEditor.d.ts +13 -0
  1350. package/dist/features/products/components/ClearanceItemsEditor.js +101 -0
  1351. package/dist/features/products/components/ClearanceListingView.d.ts +18 -0
  1352. package/dist/features/products/components/ClearanceListingView.js +38 -0
  1353. package/dist/features/products/components/ClearanceSection.d.ts +15 -0
  1354. package/dist/features/products/components/ClearanceSection.js +49 -0
  1355. package/dist/features/products/components/ClearanceWinnerMappingView.d.ts +14 -0
  1356. package/dist/features/products/components/ClearanceWinnerMappingView.js +43 -0
  1357. package/dist/features/products/components/CollectorDropDetailView.d.ts +16 -0
  1358. package/dist/features/products/components/CollectorDropDetailView.js +13 -0
  1359. package/dist/features/products/components/CollectorDropsIndexListing.d.ts +8 -0
  1360. package/dist/features/products/components/CollectorDropsIndexListing.js +170 -0
  1361. package/dist/features/products/components/CompareOverlay.d.ts +2 -2
  1362. package/dist/features/products/components/CompareOverlay.js +5 -5
  1363. package/dist/features/products/components/CustomSectionTabContent.d.ts +1 -1
  1364. package/dist/features/products/components/CustomSectionTabContent.js +1 -1
  1365. package/dist/features/products/components/GroupMemberPicker.js +1 -1
  1366. package/dist/features/products/components/GroupSettingsPanel.d.ts +2 -2
  1367. package/dist/features/products/components/GroupSettingsPanel.js +4 -4
  1368. package/dist/features/products/components/ListingBottomActions.d.ts +4 -4
  1369. package/dist/features/products/components/ListingBottomActions.js +1 -1
  1370. package/dist/features/products/components/MakeOfferButton.js +2 -1
  1371. package/dist/features/products/components/MarketplaceBundleCard.js +1 -1
  1372. package/dist/features/products/components/MarketplaceClearanceCard.d.ts +34 -0
  1373. package/dist/features/products/components/MarketplaceClearanceCard.js +129 -0
  1374. package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
  1375. package/dist/features/products/components/NonRefundableConsentModal.js +2 -2
  1376. package/dist/features/products/components/PdpSectionJumpNav.d.ts +4 -0
  1377. package/dist/features/products/components/PdpSectionJumpNav.js +41 -0
  1378. package/dist/features/products/components/PlaceBidForm.d.ts +1 -1
  1379. package/dist/features/products/components/PrizeRevealModal.js +32 -8
  1380. package/dist/features/products/components/ProductDetailActions.js +1 -1
  1381. package/dist/features/products/components/ProductDetailPageView.d.ts +4 -1
  1382. package/dist/features/products/components/ProductDetailPageView.js +128 -98
  1383. package/dist/features/products/components/ProductFeatureBadges.js +10 -7
  1384. package/dist/features/products/components/ProductFilters.js +1 -1
  1385. package/dist/features/products/components/ProductForm.d.ts +1 -1
  1386. package/dist/features/products/components/ProductForm.js +20 -21
  1387. package/dist/features/products/components/ProductGalleryClient.js +1 -1
  1388. package/dist/features/products/components/ProductGradingTab.js +1 -1
  1389. package/dist/features/products/components/ProductGrid.d.ts +18 -1
  1390. package/dist/features/products/components/ProductGrid.js +91 -22
  1391. package/dist/features/products/components/ProductsIndexListing.d.ts +1 -1
  1392. package/dist/features/products/components/ProductsIndexListing.js +85 -18
  1393. package/dist/features/products/components/ProductsIndexPageView.d.ts +4 -1
  1394. package/dist/features/products/components/ProductsIndexPageView.js +12 -11
  1395. package/dist/features/products/components/RelatedItemsSection.d.ts +82 -2
  1396. package/dist/features/products/components/RelatedItemsSection.js +152 -9
  1397. package/dist/features/products/components/ShowGroupSection.js +30 -2
  1398. package/dist/features/products/components/SparesListView.d.ts +4 -1
  1399. package/dist/features/products/components/SparesListView.js +3 -2
  1400. package/dist/features/products/components/SublistingCarouselSection.js +1 -1
  1401. package/dist/features/products/components/TrustBadgeRow.d.ts +15 -0
  1402. package/dist/features/products/components/TrustBadgeRow.js +13 -0
  1403. package/dist/features/products/components/index.d.ts +16 -16
  1404. package/dist/features/products/components/index.js +9 -9
  1405. package/dist/features/products/config/listing-type-listing-config.js +1 -1
  1406. package/dist/features/products/constants/action-defs.d.ts +24 -25
  1407. package/dist/features/products/constants/action-defs.js +35 -36
  1408. package/dist/features/products/constants/card-badges.d.ts +3 -3
  1409. package/dist/features/products/constants/card-badges.js +3 -3
  1410. package/dist/features/products/constants/listing-tabs.d.ts +11 -5
  1411. package/dist/features/products/constants/listing-tabs.js +21 -22
  1412. package/dist/features/products/constants/preorder-window.d.ts +101 -0
  1413. package/dist/features/products/constants/preorder-window.js +172 -0
  1414. package/dist/features/products/constants/product-features.constants.js +3 -3
  1415. package/dist/features/products/constants/sieve.d.ts +4 -4
  1416. package/dist/features/products/constants/sieve.js +14 -14
  1417. package/dist/features/products/hooks/useProducts.js +1 -1
  1418. package/dist/features/products/hooks/useRelatedProducts.d.ts +2 -2
  1419. package/dist/features/products/hooks/useRelatedProducts.js +5 -5
  1420. package/dist/features/products/index.d.ts +1 -1
  1421. package/dist/features/products/index.js +3 -3
  1422. package/dist/features/products/messages/en.json +1 -1
  1423. package/dist/features/products/repository/category-assignment.js +2 -2
  1424. package/dist/features/products/repository/products.repository.d.ts +9 -6
  1425. package/dist/features/products/repository/products.repository.js +56 -30
  1426. package/dist/features/products/schemas/firestore.d.ts +81 -29
  1427. package/dist/features/products/schemas/firestore.js +84 -14
  1428. package/dist/features/products/schemas/index.d.ts +61 -40
  1429. package/dist/features/products/schemas/index.js +26 -10
  1430. package/dist/features/products/schemas/part-slots.d.ts +84 -0
  1431. package/dist/features/products/schemas/part-slots.js +231 -0
  1432. package/dist/features/products/schemas/product-features.d.ts +3 -3
  1433. package/dist/features/products/schemas/product-features.validators.d.ts +40 -40
  1434. package/dist/features/products/schemas/product-features.validators.js +3 -3
  1435. package/dist/features/products/schemas/surface-counts.d.ts +1 -1
  1436. package/dist/features/products/schemas/surface-counts.js +1 -1
  1437. package/dist/features/products/types/index.d.ts +7 -7
  1438. package/dist/features/products/utils/listing-badge-variant.d.ts +1 -1
  1439. package/dist/features/products/utils/listing-badge-variant.js +5 -6
  1440. package/dist/features/products/utils/listing-type.d.ts +6 -9
  1441. package/dist/features/products/utils/listing-type.js +30 -9
  1442. package/dist/features/promotions/actions/seller-coupon-actions.d.ts +2 -2
  1443. package/dist/features/promotions/actions/seller-coupon-actions.js +2 -2
  1444. package/dist/features/promotions/components/CouponCard.d.ts +1 -1
  1445. package/dist/features/promotions/components/CouponCard.js +3 -2
  1446. package/dist/features/promotions/components/CouponHelpDetails.js +2 -1
  1447. package/dist/features/promotions/components/CouponsIndexListing.js +3 -1
  1448. package/dist/features/promotions/constants/coupon-help.d.ts +1 -1
  1449. package/dist/features/promotions/constants/coupon-help.js +8 -1
  1450. package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
  1451. package/dist/features/promotions/repository/coupons.repository.d.ts +2 -5
  1452. package/dist/features/promotions/repository/coupons.repository.js +22 -11
  1453. package/dist/features/promotions/schemas/firestore.d.ts +11 -3
  1454. package/dist/features/promotions/schemas/index.d.ts +23 -23
  1455. package/dist/features/promotions/schemas/index.js +3 -3
  1456. package/dist/features/reviews/actions/review-actions.js +1 -1
  1457. package/dist/features/reviews/api/[id]/route.js +34 -10
  1458. package/dist/features/reviews/components/ReviewDetailPageView.d.ts +4 -1
  1459. package/dist/features/reviews/components/ReviewDetailPageView.js +29 -2
  1460. package/dist/features/reviews/components/ReviewDetailShell.js +2 -2
  1461. package/dist/features/reviews/components/ReviewModal.js +1 -1
  1462. package/dist/features/reviews/components/ReviewsIndexPageView.d.ts +4 -1
  1463. package/dist/features/reviews/components/ReviewsIndexPageView.js +4 -3
  1464. package/dist/features/reviews/components/ReviewsList.js +1 -1
  1465. package/dist/features/reviews/components/ReviewsListingPanel.d.ts +1 -1
  1466. package/dist/features/reviews/schemas/firestore.d.ts +1 -1
  1467. package/dist/features/reviews/schemas/index.d.ts +20 -20
  1468. package/dist/features/scams/actions/scam-actions.js +1 -1
  1469. package/dist/features/scams/components/ScamAwarenessModal.js +2 -1
  1470. package/dist/features/scams/components/ScamProfileView.d.ts +4 -1
  1471. package/dist/features/scams/components/ScamProfileView.js +9 -6
  1472. package/dist/features/scams/components/ScamRegistryView.d.ts +4 -1
  1473. package/dist/features/scams/components/ScamRegistryView.js +7 -4
  1474. package/dist/features/scams/constants/scam-types.d.ts +13 -1
  1475. package/dist/features/scams/constants/scam-types.js +67 -23
  1476. package/dist/features/scams/schemas/firestore.js +1 -1
  1477. package/dist/features/scams/schemas/index.d.ts +8 -8
  1478. package/dist/features/scams/schemas/report-form.d.ts +4 -4
  1479. package/dist/features/search/action-index/repository.d.ts +1 -1
  1480. package/dist/features/search/action-index/repository.js +1 -1
  1481. package/dist/features/search/action-index/settings-entries.js +6 -6
  1482. package/dist/features/search/components/Search.d.ts +1 -1
  1483. package/dist/features/search/components/Search.js +5 -1
  1484. package/dist/features/search/components/SearchFacetRail.js +2 -2
  1485. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  1486. package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
  1487. package/dist/features/search/hooks/useNavSuggestions.js +1 -1
  1488. package/dist/features/search/hooks/useSiteSearch.js +1 -1
  1489. package/dist/features/seller/actions/offer-actions.js +50 -12
  1490. package/dist/features/seller/actions/seller-actions.d.ts +19 -0
  1491. package/dist/features/seller/actions/seller-actions.js +163 -44
  1492. package/dist/features/seller/api/coupons/route.js +6 -1
  1493. package/dist/features/seller/api/products/route.js +6 -1
  1494. package/dist/features/seller/api/store/route.js +6 -1
  1495. package/dist/features/seller/components/DispatchForm.js +3 -2
  1496. package/dist/features/seller/components/FulfillmentView.d.ts +4 -1
  1497. package/dist/features/seller/components/FulfillmentView.js +3 -2
  1498. package/dist/features/seller/components/PrintCenterView.d.ts +4 -1
  1499. package/dist/features/seller/components/PrintCenterView.js +6 -3
  1500. package/dist/features/seller/components/SellerAddressesView.d.ts +4 -1
  1501. package/dist/features/seller/components/SellerAddressesView.js +3 -2
  1502. package/dist/features/seller/components/SellerAnalyticsAlertsView.d.ts +4 -1
  1503. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +3 -2
  1504. package/dist/features/seller/components/SellerAnalyticsView.d.ts +4 -1
  1505. package/dist/features/seller/components/SellerAnalyticsView.js +3 -1
  1506. package/dist/features/seller/components/SellerArtAndStickersView.d.ts +18 -0
  1507. package/dist/features/seller/components/SellerArtAndStickersView.js +7 -0
  1508. package/dist/features/seller/components/SellerBidsView.d.ts +4 -1
  1509. package/dist/features/seller/components/SellerBidsView.js +9 -8
  1510. package/dist/features/seller/components/SellerBundlesView.d.ts +4 -1
  1511. package/dist/features/seller/components/SellerBundlesView.js +5 -3
  1512. package/dist/features/seller/components/SellerClassifiedView.d.ts +6 -2
  1513. package/dist/features/seller/components/SellerClassifiedView.js +4 -3
  1514. package/dist/features/seller/components/SellerCouponEditorView.d.ts +4 -1
  1515. package/dist/features/seller/components/SellerCouponEditorView.js +3 -2
  1516. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +6 -2
  1517. package/dist/features/seller/components/SellerDigitalCodesView.js +4 -3
  1518. package/dist/features/seller/components/SellerFeaturesView.d.ts +6 -1
  1519. package/dist/features/seller/components/SellerFeaturesView.js +8 -3
  1520. package/dist/features/seller/components/SellerGoogleReviewsView.d.ts +4 -1
  1521. package/dist/features/seller/components/SellerGoogleReviewsView.js +3 -2
  1522. package/dist/features/seller/components/SellerGuideView.d.ts +11 -1
  1523. package/dist/features/seller/components/SellerGuideView.js +7 -2
  1524. package/dist/features/seller/components/SellerListingTypeView.d.ts +2 -2
  1525. package/dist/features/seller/components/SellerListingTypeView.js +14 -20
  1526. package/dist/features/seller/components/SellerLiveView.d.ts +6 -2
  1527. package/dist/features/seller/components/SellerLiveView.js +4 -3
  1528. package/dist/features/seller/components/SellerOffersView.d.ts +4 -1
  1529. package/dist/features/seller/components/SellerOffersView.js +4 -3
  1530. package/dist/features/seller/components/SellerOrdersView.d.ts +4 -1
  1531. package/dist/features/seller/components/SellerOrdersView.js +44 -47
  1532. package/dist/features/seller/components/SellerPayoutRequestView.d.ts +4 -1
  1533. package/dist/features/seller/components/SellerPayoutRequestView.js +3 -2
  1534. package/dist/features/seller/components/SellerPayoutSettingsView.js +127 -14
  1535. package/dist/features/seller/components/SellerProductShell.d.ts +3 -3
  1536. package/dist/features/seller/components/SellerProductShell.js +77 -28
  1537. package/dist/features/seller/components/SellerProductsCards.js +3 -3
  1538. package/dist/features/seller/components/SellerProductsView.js +24 -123
  1539. package/dist/features/seller/components/SellerReviewsView.d.ts +10 -1
  1540. package/dist/features/seller/components/SellerReviewsView.js +3 -2
  1541. package/dist/features/seller/components/SellerShippingOfferView.d.ts +5 -0
  1542. package/dist/features/seller/components/SellerShippingOfferView.js +164 -0
  1543. package/dist/features/seller/components/SellerShippingView.d.ts +4 -1
  1544. package/dist/features/seller/components/SellerShippingView.js +6 -5
  1545. package/dist/features/seller/components/SellerSidebar.js +29 -5
  1546. package/dist/features/seller/components/SellerSparesView.d.ts +6 -2
  1547. package/dist/features/seller/components/SellerSparesView.js +4 -3
  1548. package/dist/features/seller/components/SellerStoreCategoriesView.d.ts +4 -1
  1549. package/dist/features/seller/components/SellerStoreCategoriesView.js +3 -2
  1550. package/dist/features/seller/components/SellerStorefrontView.d.ts +4 -1
  1551. package/dist/features/seller/components/SellerStorefrontView.js +6 -5
  1552. package/dist/features/seller/components/SellerSupportView.d.ts +4 -1
  1553. package/dist/features/seller/components/SellerSupportView.js +3 -2
  1554. package/dist/features/seller/components/analytics/SellerAnalyticsStats.d.ts +8 -1
  1555. package/dist/features/seller/components/analytics/SellerAnalyticsStats.js +1 -1
  1556. package/dist/features/seller/components/index.d.ts +2 -4
  1557. package/dist/features/seller/components/index.js +1 -2
  1558. package/dist/features/seller/constants/store-tabs.d.ts +4 -0
  1559. package/dist/features/seller/constants/store-tabs.js +12 -0
  1560. package/dist/features/seller/hooks/useSellerStorefront.js +18 -1
  1561. package/dist/features/seller/repository/seller-profile.repository.d.ts +32 -0
  1562. package/dist/features/seller/repository/seller-profile.repository.js +98 -0
  1563. package/dist/features/seller/schemas/coupon-form.d.ts +15 -15
  1564. package/dist/features/seller/schemas/coupon-form.js +2 -2
  1565. package/dist/features/seller/schemas/index.d.ts +6 -6
  1566. package/dist/features/seller/schemas/product-form.d.ts +9 -9
  1567. package/dist/features/seller/schemas/product-form.js +4 -4
  1568. package/dist/features/seller/schemas/seller-profile-firestore.d.ts +48 -0
  1569. package/dist/features/seller/schemas/seller-profile-firestore.js +38 -0
  1570. package/dist/features/server-errors/schemas/index.d.ts +4 -4
  1571. package/dist/features/shell/CommandPalette.d.ts +53 -4
  1572. package/dist/features/shell/CommandPalette.js +144 -11
  1573. package/dist/features/shell/QuickFormDrawer.d.ts +2 -14
  1574. package/dist/features/shell/SectionForm.js +1 -1
  1575. package/dist/features/shell/SectionVisibilityGate.d.ts +36 -0
  1576. package/dist/features/shell/SectionVisibilityGate.js +46 -0
  1577. package/dist/features/shell/WizardFormSteps.d.ts +7 -0
  1578. package/dist/features/shell/WizardFormSteps.js +53 -0
  1579. package/dist/features/shell/build-sections.d.ts +95 -2
  1580. package/dist/features/shell/build-sections.js +177 -6
  1581. package/dist/features/shell/field-ui-meta.d.ts +69 -0
  1582. package/dist/features/shell/field-ui-meta.js +56 -0
  1583. package/dist/features/shell/index.d.ts +2 -0
  1584. package/dist/features/shell/index.js +1 -0
  1585. package/dist/features/shell/searchNavItems.d.ts +22 -0
  1586. package/dist/features/shell/searchNavItems.js +61 -0
  1587. package/dist/features/shell/useFieldVisibility.d.ts +43 -0
  1588. package/dist/features/shell/useFieldVisibility.js +126 -0
  1589. package/dist/features/shipments/components/AdminShipmentEditorView.d.ts +6 -1
  1590. package/dist/features/shipments/components/AdminShipmentEditorView.js +3 -2
  1591. package/dist/features/shipments/components/AdminShipmentLotItemsView.d.ts +4 -1
  1592. package/dist/features/shipments/components/AdminShipmentLotItemsView.js +3 -2
  1593. package/dist/features/shipments/components/AdminShipmentProjectionsView.d.ts +6 -1
  1594. package/dist/features/shipments/components/AdminShipmentProjectionsView.js +3 -9
  1595. package/dist/features/shipments/components/AdminShipmentsView.d.ts +6 -2
  1596. package/dist/features/shipments/components/AdminShipmentsView.js +5 -4
  1597. package/dist/features/shipments/schemas/validation.d.ts +19 -19
  1598. package/dist/features/shipments/schemas/validation.js +3 -4
  1599. package/dist/features/site-settings/components/ActionPermissionsManager.js +21 -9
  1600. package/dist/features/site-settings/components/NavPermissionsManager.d.ts +20 -1
  1601. package/dist/features/site-settings/components/NavPermissionsManager.js +82 -6
  1602. package/dist/features/site-settings/components/ThemeManagerView.js +22 -2
  1603. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +8 -1
  1604. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +43 -11
  1605. package/dist/features/sticker-trace/components/StickerTraceStudio.js +34 -13
  1606. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +1 -1
  1607. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +1 -1
  1608. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +8 -0
  1609. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +15 -0
  1610. package/dist/features/store-extensions/repository/store-extensions.repositories.d.ts +32 -5
  1611. package/dist/features/store-extensions/repository/store-extensions.repositories.js +62 -7
  1612. package/dist/features/store-extensions/schemas/admin-notification-form.d.ts +2 -2
  1613. package/dist/features/store-extensions/schemas/analytics-forms.d.ts +2 -2
  1614. package/dist/features/store-extensions/schemas/firestore.d.ts +34 -5
  1615. package/dist/features/store-extensions/schemas/firestore.js +23 -4
  1616. package/dist/features/store-extensions/schemas/listing-template-form.d.ts +10 -10
  1617. package/dist/features/store-extensions/schemas/listing-template-form.js +3 -4
  1618. package/dist/features/store-extensions/schemas/payout-method-form.d.ts +10 -10
  1619. package/dist/features/store-extensions/schemas/report-create-form.d.ts +2 -2
  1620. package/dist/features/store-extensions/schemas/shipping-config-form.d.ts +33 -20
  1621. package/dist/features/store-extensions/schemas/shipping-config-form.js +11 -0
  1622. package/dist/features/store-extensions/schemas/store-category-form.d.ts +6 -6
  1623. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  1624. package/dist/features/stores/actions/store-query-actions.js +5 -5
  1625. package/dist/features/stores/api/[storeSlug]/collector-drops/route.d.ts +23 -0
  1626. package/dist/features/stores/api/[storeSlug]/collector-drops/route.js +83 -0
  1627. package/dist/features/stores/api/[storeSlug]/products/route.d.ts +1 -1
  1628. package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
  1629. package/dist/features/stores/components/InteractiveStoreCard.js +1 -1
  1630. package/dist/features/stores/components/StoreArtStickersPageView.d.ts +4 -1
  1631. package/dist/features/stores/components/StoreArtStickersPageView.js +6 -5
  1632. package/dist/features/stores/components/StoreBundlesPageView.d.ts +5 -2
  1633. package/dist/features/stores/components/StoreBundlesPageView.js +5 -4
  1634. package/dist/features/stores/components/StoreCapabilitiesGuideView.d.ts +6 -2
  1635. package/dist/features/stores/components/StoreCapabilitiesGuideView.js +13 -11
  1636. package/dist/features/stores/components/StoreClassifiedsPageView.d.ts +4 -1
  1637. package/dist/features/stores/components/StoreClassifiedsPageView.js +4 -3
  1638. package/dist/features/stores/components/StoreClearancePageView.d.ts +11 -0
  1639. package/dist/features/stores/components/StoreClearancePageView.js +25 -0
  1640. package/dist/features/stores/components/StoreCollectorDropsListing.d.ts +7 -0
  1641. package/dist/features/stores/components/StoreCollectorDropsListing.js +138 -0
  1642. package/dist/features/stores/components/StoreCollectorDropsPageView.d.ts +11 -0
  1643. package/dist/features/stores/components/StoreCollectorDropsPageView.js +25 -0
  1644. package/dist/features/stores/components/StoreCollectorDropsView.d.ts +17 -0
  1645. package/dist/features/stores/components/StoreCollectorDropsView.js +5 -0
  1646. package/dist/features/stores/components/StoreCreateForm.js +16 -2
  1647. package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -1
  1648. package/dist/features/stores/components/StoreDetailLayoutView.js +7 -1
  1649. package/dist/features/stores/components/StoreDigitalCodesPageView.d.ts +4 -1
  1650. package/dist/features/stores/components/StoreDigitalCodesPageView.js +4 -3
  1651. package/dist/features/stores/components/StoreFinanceGuideView.d.ts +6 -2
  1652. package/dist/features/stores/components/StoreFinanceGuideView.js +9 -7
  1653. package/dist/features/stores/components/StoreGuideHubView.d.ts +4 -1
  1654. package/dist/features/stores/components/StoreGuideHubView.js +7 -4
  1655. package/dist/features/stores/components/StoreHeader.js +1 -1
  1656. package/dist/features/stores/components/StoreListingsGuideView.d.ts +6 -2
  1657. package/dist/features/stores/components/StoreListingsGuideView.js +14 -12
  1658. package/dist/features/stores/components/StoreLiveItemsPageView.d.ts +4 -1
  1659. package/dist/features/stores/components/StoreLiveItemsPageView.js +4 -3
  1660. package/dist/features/stores/components/StoreNavTabs.d.ts +1 -1
  1661. package/dist/features/stores/components/StoreOrdersGuideView.d.ts +6 -2
  1662. package/dist/features/stores/components/StoreOrdersGuideView.js +11 -9
  1663. package/dist/features/stores/components/StorePreOrdersPageView.d.ts +4 -1
  1664. package/dist/features/stores/components/StorePreOrdersPageView.js +4 -3
  1665. package/dist/features/stores/components/StoreProductsPageView.d.ts +12 -1
  1666. package/dist/features/stores/components/StoreProductsPageView.js +4 -3
  1667. package/dist/features/stores/components/StoreReviewsPageView.d.ts +4 -1
  1668. package/dist/features/stores/components/StoreReviewsPageView.js +4 -3
  1669. package/dist/features/stores/components/StoreSettingsGuideView.d.ts +6 -2
  1670. package/dist/features/stores/components/StoreSettingsGuideView.js +5 -3
  1671. package/dist/features/stores/components/StoreSparesPageView.d.ts +4 -1
  1672. package/dist/features/stores/components/StoreSparesPageView.js +10 -9
  1673. package/dist/features/stores/components/StoresIndexListing.js +16 -11
  1674. package/dist/features/stores/components/StoresIndexPageView.d.ts +10 -1
  1675. package/dist/features/stores/components/StoresIndexPageView.js +3 -2
  1676. package/dist/features/stores/components/index.d.ts +5 -5
  1677. package/dist/features/stores/components/index.js +2 -2
  1678. package/dist/features/stores/hooks/useStores.d.ts +4 -4
  1679. package/dist/features/stores/hooks/useStores.js +4 -4
  1680. package/dist/features/stores/manifest.js +3 -3
  1681. package/dist/features/stores/messages/en.json +1 -1
  1682. package/dist/features/stores/repository/store.repository.d.ts +80 -0
  1683. package/dist/features/stores/repository/store.repository.js +98 -0
  1684. package/dist/features/stores/schemas/firestore.d.ts +193 -1
  1685. package/dist/features/stores/schemas/firestore.js +66 -0
  1686. package/dist/features/stores/schemas/index.d.ts +16 -16
  1687. package/dist/features/stores/server.d.ts +1 -1
  1688. package/dist/features/stores/server.js +1 -1
  1689. package/dist/features/stores/types/index.d.ts +5 -5
  1690. package/dist/features/support/schemas/firestore.d.ts +1 -1
  1691. package/dist/features/support/schemas/firestore.js +1 -1
  1692. package/dist/features/support/schemas/index.d.ts +12 -12
  1693. package/dist/features/support/schemas/index.js +1 -1
  1694. package/dist/features/tax-codes/schemas/tax-code-form.d.ts +4 -4
  1695. package/dist/features/tax-codes/schemas/tax-codes.validators.d.ts +4 -4
  1696. package/dist/features/tax-codes/schemas/tax-codes.validators.js +1 -1
  1697. package/dist/features/tester/actions/checklist-item-actions.d.ts +3 -3
  1698. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +1 -1
  1699. package/dist/features/tester/components/AdminTesterFeedbackView.d.ts +6 -1
  1700. package/dist/features/tester/components/AdminTesterFeedbackView.js +3 -2
  1701. package/dist/features/tester/schemas/checklist-item-form.d.ts +2 -2
  1702. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -2
  1703. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +5 -3
  1704. package/dist/features/whatsapp-bot/helpers/whatsapp.js +5 -2
  1705. package/dist/features/wishlist/components/WishlistHeartButton.d.ts +2 -2
  1706. package/dist/features/wishlist/components/WishlistHeartButton.js +2 -2
  1707. package/dist/features/wishlist/components/WishlistPage.js +1 -1
  1708. package/dist/features/wishlist/components/WishlistView.d.ts +1 -1
  1709. package/dist/features/wishlist/hooks/useGuestWishlist.d.ts +6 -6
  1710. package/dist/features/wishlist/hooks/useUserWishlist.d.ts +1 -1
  1711. package/dist/features/wishlist/hooks/useWishlistCount.js +1 -1
  1712. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +6 -6
  1713. package/dist/features/wishlist/repository/user-wishlist.repository.d.ts +1 -1
  1714. package/dist/features/wishlist/utils/guest-wishlist.d.ts +14 -5
  1715. package/dist/index.d.ts +182 -202
  1716. package/dist/index.js +284 -232
  1717. package/dist/jobs.d.ts +1 -1
  1718. package/dist/jobs.js +3 -3
  1719. package/dist/next/api/api-response.d.ts +1 -1
  1720. package/dist/next/api/parseJsonBody.d.ts +1 -1
  1721. package/dist/next/api/routeHandler.d.ts +5 -0
  1722. package/dist/next/api/routeHandler.js +24 -2
  1723. package/dist/next/components/UnauthorizedView.d.ts +4 -1
  1724. package/dist/next/components/UnauthorizedView.js +3 -2
  1725. package/dist/next/index.d.ts +3 -1
  1726. package/dist/next/index.js +5 -1
  1727. package/dist/next/routing/portals.d.ts +266 -0
  1728. package/dist/next/routing/portals.js +379 -0
  1729. package/dist/next/routing/route-map.d.ts +114 -71
  1730. package/dist/next/routing/route-map.js +137 -45
  1731. package/dist/providers/ai-groq/index.d.ts +18 -0
  1732. package/dist/providers/ai-groq/index.js +241 -0
  1733. package/dist/providers/auth-firebase/claims.d.ts +85 -0
  1734. package/dist/providers/auth-firebase/claims.js +116 -0
  1735. package/dist/providers/auth-firebase/helpers.d.ts +6 -1
  1736. package/dist/providers/auth-firebase/helpers.js +26 -2
  1737. package/dist/providers/auth-firebase/provider.js +9 -4
  1738. package/dist/providers/auth-firebase/session.js +32 -1
  1739. package/dist/providers/db-firebase/admin.d.ts +24 -1
  1740. package/dist/providers/db-firebase/admin.js +29 -5
  1741. package/dist/providers/db-firebase/base.repository.d.ts +1 -1
  1742. package/dist/providers/db-firebase/filter-aliases.d.ts +2 -2
  1743. package/dist/providers/db-firebase/rtdb-url.js +1 -1
  1744. package/dist/providers/db-firebase/sieve.js +2 -2
  1745. package/dist/providers/payment-cashfree/easy-split.d.ts +119 -0
  1746. package/dist/providers/payment-cashfree/easy-split.js +206 -0
  1747. package/dist/providers/payment-cashfree/index.d.ts +341 -0
  1748. package/dist/providers/payment-cashfree/index.js +714 -0
  1749. package/dist/providers/payment-manual/index.d.ts +11 -0
  1750. package/dist/providers/payment-manual/index.js +13 -0
  1751. package/dist/providers/payment-phonepe/index.d.ts +24 -8
  1752. package/dist/providers/payment-phonepe/index.js +29 -1
  1753. package/dist/providers/payment-razorpay/index.d.ts +14 -1
  1754. package/dist/providers/payment-razorpay/index.js +21 -1
  1755. package/dist/providers/shipping-shiprocket/index.d.ts +40 -5
  1756. package/dist/providers/shipping-shiprocket/index.js +49 -5
  1757. package/dist/providers/tax-india-gst/index.d.ts +45 -0
  1758. package/dist/providers/tax-india-gst/index.js +78 -0
  1759. package/dist/providers.d.ts +3 -0
  1760. package/dist/providers.js +5 -0
  1761. package/dist/react/contexts/SessionContext.d.ts +18 -2
  1762. package/dist/react/contexts/SessionContext.js +23 -1
  1763. package/dist/react/hooks/useBrowsePageFlags.d.ts +2 -2
  1764. package/dist/react/hooks/useBrowsePageFlags.js +11 -5
  1765. package/dist/react/hooks/useCanSeePrices.js +1 -1
  1766. package/dist/react/hooks/useCountdown.d.ts +1 -1
  1767. package/dist/react/hooks/useCountdown.js +1 -1
  1768. package/dist/react/hooks/useListingSurfaceVisibility.js +12 -2
  1769. package/dist/react/hooks/useListingTypeFlags.d.ts +62 -8
  1770. package/dist/react/hooks/useListingTypeFlags.js +14 -7
  1771. package/dist/react/hooks/useScrollToTop.d.ts +5 -0
  1772. package/dist/react/hooks/useScrollToTop.js +70 -0
  1773. package/dist/repositories/index.d.ts +3 -4
  1774. package/dist/repositories/index.js +4 -5
  1775. package/dist/schemas/registry.d.ts +320 -899
  1776. package/dist/schemas/registry.js +7 -7
  1777. package/dist/schemas/sieve.d.ts +2 -2
  1778. package/dist/schemas/webhooks/google-oauth.d.ts +4 -4
  1779. package/dist/security/authorization.d.ts +27 -5
  1780. package/dist/security/authorization.js +53 -13
  1781. package/dist/security/index.d.ts +1 -1
  1782. package/dist/security/index.js +1 -1
  1783. package/dist/security/pii-mask.d.ts +1 -1
  1784. package/dist/security/pii-mask.js +1 -1
  1785. package/dist/security/pii-schemas.d.ts +26 -2
  1786. package/dist/security/pii-schemas.js +26 -2
  1787. package/dist/seo/json-ld.d.ts +6 -6
  1788. package/dist/seo/json-ld.js +32 -11
  1789. package/dist/seo/metadata.d.ts +3 -3
  1790. package/dist/seo/metadata.js +7 -7
  1791. package/dist/server-entry.d.ts +13 -13
  1792. package/dist/server-entry.js +54 -15
  1793. package/dist/server.d.ts +79 -46
  1794. package/dist/server.js +158 -74
  1795. package/dist/stores/panel-store.d.ts +1 -1
  1796. package/dist/styles.css +380 -183
  1797. package/dist/tailwind-utilities.css +1 -1
  1798. package/dist/tokens/contrast.d.ts +61 -0
  1799. package/dist/tokens/contrast.js +128 -0
  1800. package/dist/tokens/themes/cobalt-night.js +10 -3
  1801. package/dist/tokens/themes/default-dark.d.ts +5 -4
  1802. package/dist/tokens/themes/default-dark.js +48 -40
  1803. package/dist/tokens/themes/default-light.d.ts +5 -5
  1804. package/dist/tokens/themes/default-light.js +64 -36
  1805. package/dist/tokens/themes/required.d.ts +1 -1
  1806. package/dist/tokens/themes/required.js +40 -0
  1807. package/dist/tokens/themes/sunset.js +14 -2
  1808. package/dist/tokens/tokens.css +117 -85
  1809. package/dist/ui/chrome/BottomActionsContext.d.ts +190 -0
  1810. package/dist/ui/chrome/BottomActionsContext.js +198 -0
  1811. package/dist/ui/chrome/useBottomActions.d.ts +37 -0
  1812. package/dist/ui/chrome/useBottomActions.js +86 -0
  1813. package/dist/ui/columns/cell-renderers.d.ts +10 -5
  1814. package/dist/ui/columns/cell-renderers.js +9 -7
  1815. package/dist/ui/columns/column-renderers.js +13 -4
  1816. package/dist/ui/components/AdminFilterFacets.d.ts +37 -0
  1817. package/dist/ui/components/AdminFilterFacets.js +126 -0
  1818. package/dist/ui/components/Avatar.js +1 -1
  1819. package/dist/ui/components/AvatarDisplay.d.ts +1 -1
  1820. package/dist/ui/components/BaseListingCard.js +1 -1
  1821. package/dist/ui/components/Button.js +2 -13
  1822. package/dist/ui/components/Button.style.css +91 -0
  1823. package/dist/ui/components/Card.d.ts +1 -1
  1824. package/dist/ui/components/Card.js +0 -9
  1825. package/dist/ui/components/Card.style.css +0 -70
  1826. package/dist/ui/components/ClaimCouponButton.d.ts +1 -1
  1827. package/dist/ui/components/ConfirmDeleteModal.d.ts +1 -1
  1828. package/dist/ui/components/ConfirmDeleteModal.js +2 -18
  1829. package/dist/ui/components/ConfirmDeleteModal.style.css +53 -1
  1830. package/dist/ui/components/DetailPageGallery.d.ts +1 -1
  1831. package/dist/ui/components/DetailPageGallery.js +2 -2
  1832. package/dist/ui/components/DetailPageHero.d.ts +1 -1
  1833. package/dist/ui/components/DetailPageHero.js +1 -1
  1834. package/dist/ui/components/DetailPageTabs.d.ts +1 -1
  1835. package/dist/ui/components/DetailPageTabs.js +1 -1
  1836. package/dist/ui/components/DetailViewShell.d.ts +27 -2
  1837. package/dist/ui/components/DetailViewShell.js +5 -1
  1838. package/dist/ui/components/Disclaimer.js +11 -2
  1839. package/dist/ui/components/Drawer.js +19 -2
  1840. package/dist/ui/components/FilterChipGroup.d.ts +2 -2
  1841. package/dist/ui/components/Form.js +1 -1
  1842. package/dist/ui/components/FormField.d.ts +19 -2
  1843. package/dist/ui/components/FormField.js +88 -21
  1844. package/dist/ui/components/GatedPrice.d.ts +1 -1
  1845. package/dist/ui/components/GatedPrice.js +1 -1
  1846. package/dist/ui/components/ImageGallery.js +1 -1
  1847. package/dist/ui/components/ImageLightbox.js +5 -2
  1848. package/dist/ui/components/ImageMosaic.js +1 -1
  1849. package/dist/ui/components/ListingToolbar.d.ts +56 -1
  1850. package/dist/ui/components/ListingToolbar.js +54 -4
  1851. package/dist/ui/components/LiveEditableRegion.d.ts +29 -0
  1852. package/dist/ui/components/LiveEditableRegion.js +54 -0
  1853. package/dist/ui/components/MediaAvatar.js +13 -0
  1854. package/dist/ui/components/MediaImage.d.ts +116 -0
  1855. package/dist/ui/components/MediaImage.js +194 -0
  1856. package/dist/ui/components/MediaLightbox.js +246 -0
  1857. package/dist/ui/components/MediaVideo.js +141 -0
  1858. package/dist/ui/components/Modal.d.ts +1 -1
  1859. package/dist/ui/components/Modal.js +18 -47
  1860. package/dist/ui/components/Modal.style.css +43 -0
  1861. package/dist/ui/components/PaginatedSelect.d.ts +1 -1
  1862. package/dist/ui/components/QuickCreateModal.js +4 -1
  1863. package/dist/ui/components/RecordDetailModal.js +1 -1
  1864. package/dist/ui/components/RowActionMenu.js +11 -51
  1865. package/dist/ui/components/RowActionMenu.style.css +64 -10
  1866. package/dist/ui/components/SideDrawer.style.css +11 -16
  1867. package/dist/ui/components/SiteLogo.d.ts +20 -2
  1868. package/dist/ui/components/SiteLogo.js +29 -7
  1869. package/dist/ui/components/SiteMark.d.ts +1 -1
  1870. package/dist/ui/components/SiteMark.js +22 -7
  1871. package/dist/ui/components/SpecTable.d.ts +1 -1
  1872. package/dist/ui/components/SplitTile.js +1 -1
  1873. package/dist/ui/components/dialog-shell.d.ts +32 -0
  1874. package/dist/ui/components/dialog-shell.js +23 -0
  1875. package/dist/ui/components/form-field-registry.d.ts +43 -0
  1876. package/dist/ui/components/form-field-registry.js +7 -0
  1877. package/dist/ui/components/surface-tokens.d.ts +6 -2
  1878. package/dist/ui/components/surface-tokens.js +3 -1
  1879. package/dist/ui/design-pack.d.ts +21 -0
  1880. package/dist/ui/design-pack.js +47 -0
  1881. package/dist/ui/forms/FormShell.js +14 -1
  1882. package/dist/ui/forms/useFormBottomActions.d.ts +78 -0
  1883. package/dist/ui/forms/useFormBottomActions.js +128 -0
  1884. package/dist/ui/icons/icon-registry.d.ts +6 -1
  1885. package/dist/ui/icons/icon-registry.js +12 -3
  1886. package/dist/ui/rich-text/RichText.js +35 -8
  1887. package/dist/ui/types/image-crop.d.ts +8 -0
  1888. package/dist/ui/types/quick-field.d.ts +33 -0
  1889. package/dist/ui/widgets/index.d.ts +7 -0
  1890. package/dist/ui/widgets/index.js +3 -0
  1891. package/dist/ui/widgets/merge.d.ts +85 -0
  1892. package/dist/ui/widgets/merge.js +162 -0
  1893. package/dist/ui/widgets/pilot-registry.d.ts +104 -0
  1894. package/dist/ui/widgets/pilot-registry.js +305 -0
  1895. package/dist/ui/widgets/resolve.d.ts +109 -0
  1896. package/dist/ui/widgets/resolve.js +442 -0
  1897. package/dist/ui/widgets/types.d.ts +252 -0
  1898. package/dist/ui/widgets/types.js +45 -0
  1899. package/dist/utils/date.formatter.d.ts +20 -0
  1900. package/dist/utils/date.formatter.js +25 -0
  1901. package/dist/utils/id-generators.d.ts +5 -5
  1902. package/dist/utils/id-generators.js +14 -10
  1903. package/dist/utils/listing-params.d.ts +1 -1
  1904. package/dist/utils/listing-params.js +1 -1
  1905. package/dist/utils/number.formatter.d.ts +47 -0
  1906. package/dist/utils/number.formatter.js +79 -1
  1907. package/dist/utils/pack-by-span.d.ts +21 -0
  1908. package/dist/utils/pack-by-span.js +84 -0
  1909. package/dist/utils/search-txt-builders.d.ts +2 -2
  1910. package/dist/utils/search-txt-builders.js +1 -1
  1911. package/dist/validation/phone.validator.d.ts +0 -1
  1912. package/dist/validation/phone.validator.js +17 -3
  1913. package/dist/validation/schemas.d.ts +17 -17
  1914. package/package.json +86 -10
  1915. package/scripts/dedupe-peer-deps.mjs +17 -0
  1916. package/scripts/seed-cli.mjs +33 -16
  1917. package/scripts/sieve-audit.mjs +14 -14
  1918. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +0 -66
  1919. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +0 -187
  1920. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +0 -15
  1921. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +0 -50
  1922. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +0 -37
  1923. package/dist/_internal/client/features/lottery/LotteryDetailView.js +0 -48
  1924. package/dist/_internal/client/features/lottery/LotteryEntriesView.d.ts +0 -24
  1925. package/dist/_internal/client/features/lottery/LotteryEntriesView.js +0 -63
  1926. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +0 -29
  1927. package/dist/_internal/client/features/lottery/LotteryListView.js +0 -44
  1928. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +0 -31
  1929. package/dist/_internal/client/features/lottery/LotteryPullForm.js +0 -94
  1930. package/dist/_internal/client/features/lottery/LotterySlotGrid.d.ts +0 -14
  1931. package/dist/_internal/client/features/lottery/LotterySlotGrid.js +0 -23
  1932. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.d.ts +0 -29
  1933. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +0 -28
  1934. package/dist/_internal/client/features/lottery/slot-collage-items.d.ts +0 -15
  1935. package/dist/_internal/client/features/lottery/slot-collage-items.js +0 -13
  1936. package/dist/_internal/server/features/auctions/actions.js +0 -76
  1937. package/dist/_internal/server/features/auctions/data.d.ts +0 -2
  1938. package/dist/_internal/server/features/auctions/data.js +0 -3
  1939. package/dist/_internal/server/features/auctions/index.d.ts +0 -5
  1940. package/dist/_internal/server/features/auctions/index.js +0 -5
  1941. package/dist/_internal/server/features/auctions/og.d.ts +0 -22
  1942. package/dist/_internal/server/features/auctions/og.js +0 -30
  1943. package/dist/_internal/server/features/auctions/service.d.ts +0 -20
  1944. package/dist/_internal/server/features/auctions/service.js +0 -65
  1945. package/dist/_internal/server/features/beys/data.d.ts +0 -44
  1946. package/dist/_internal/server/features/beys/data.js +0 -107
  1947. package/dist/_internal/server/features/beys/og.d.ts +0 -42
  1948. package/dist/_internal/server/features/beys/og.js +0 -89
  1949. package/dist/_internal/server/features/checkout/freeze-parts.d.ts +0 -50
  1950. package/dist/_internal/server/features/checkout/freeze-parts.js +0 -94
  1951. package/dist/_internal/server/features/lottery/actions.d.ts +0 -43
  1952. package/dist/_internal/server/features/lottery/actions.js +0 -365
  1953. package/dist/_internal/server/features/lottery/adapters.d.ts +0 -15
  1954. package/dist/_internal/server/features/lottery/adapters.js +0 -31
  1955. package/dist/_internal/server/features/lottery/data.d.ts +0 -19
  1956. package/dist/_internal/server/features/lottery/data.js +0 -41
  1957. package/dist/_internal/server/features/lottery/metadata.d.ts +0 -6
  1958. package/dist/_internal/server/features/lottery/metadata.js +0 -31
  1959. package/dist/_internal/server/features/lottery/og.d.ts +0 -40
  1960. package/dist/_internal/server/features/lottery/og.js +0 -79
  1961. package/dist/_internal/server/features/parts/assembly.d.ts +0 -126
  1962. package/dist/_internal/server/features/parts/assembly.js +0 -246
  1963. package/dist/_internal/server/features/parts/buildable.d.ts +0 -47
  1964. package/dist/_internal/server/features/parts/buildable.js +0 -159
  1965. package/dist/_internal/server/features/parts/data.d.ts +0 -65
  1966. package/dist/_internal/server/features/parts/data.js +0 -171
  1967. package/dist/_internal/server/features/parts/og.d.ts +0 -34
  1968. package/dist/_internal/server/features/parts/og.js +0 -66
  1969. package/dist/_internal/server/features/prize-draws/actions.d.ts +0 -2
  1970. package/dist/_internal/server/features/prize-draws/actions.js +0 -33
  1971. package/dist/_internal/server/features/prize-draws/data.d.ts +0 -1
  1972. package/dist/_internal/server/features/prize-draws/data.js +0 -2
  1973. package/dist/_internal/server/features/prize-draws/index.d.ts +0 -4
  1974. package/dist/_internal/server/features/prize-draws/index.js +0 -4
  1975. package/dist/_internal/server/features/prize-draws/og.d.ts +0 -32
  1976. package/dist/_internal/server/features/prize-draws/og.js +0 -47
  1977. package/dist/_internal/server/features/prize-draws/service.d.ts +0 -3
  1978. package/dist/_internal/server/features/prize-draws/service.js +0 -19
  1979. package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +0 -2
  1980. package/dist/_internal/server/jobs/core/auctionSettlement.js +0 -240
  1981. package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.d.ts +0 -19
  1982. package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.js +0 -30
  1983. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.d.ts +0 -20
  1984. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +0 -114
  1985. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.d.ts +0 -14
  1986. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +0 -71
  1987. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.d.ts +0 -22
  1988. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +0 -67
  1989. package/dist/_internal/server/jobs/handlers/auctionSettlement.d.ts +0 -2
  1990. package/dist/_internal/server/jobs/handlers/auctionSettlement.js +0 -2
  1991. package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.d.ts +0 -3
  1992. package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.js +0 -11
  1993. package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.d.ts +0 -2
  1994. package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.js +0 -2
  1995. package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.d.ts +0 -3
  1996. package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.js +0 -4
  1997. package/dist/_internal/shared/checkout/rules/art.rule.d.ts +0 -9
  1998. package/dist/_internal/shared/checkout/rules/art.rule.js +0 -5
  1999. package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +0 -2
  2000. package/dist/_internal/shared/checkout/rules/auction.rule.js +0 -19
  2001. package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +0 -2
  2002. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +0 -112
  2003. package/dist/_internal/shared/checkout/rules/stickers.rule.d.ts +0 -9
  2004. package/dist/_internal/shared/checkout/rules/stickers.rule.js +0 -5
  2005. package/dist/_internal/shared/features/auctions/config.d.ts +0 -100
  2006. package/dist/_internal/shared/features/auctions/config.js +0 -136
  2007. package/dist/_internal/shared/features/auctions/errors.d.ts +0 -16
  2008. package/dist/_internal/shared/features/auctions/errors.js +0 -31
  2009. package/dist/_internal/shared/features/auctions/schema.d.ts +0 -42
  2010. package/dist/_internal/shared/features/auctions/schema.js +0 -24
  2011. package/dist/_internal/shared/listing-types/art/config.d.ts +0 -74
  2012. package/dist/_internal/shared/listing-types/art/config.js +0 -36
  2013. package/dist/_internal/shared/listing-types/art/ctas.js +0 -3
  2014. package/dist/_internal/shared/listing-types/art/schema.d.ts +0 -2
  2015. package/dist/_internal/shared/listing-types/art/schema.js +0 -3
  2016. package/dist/_internal/shared/listing-types/auction/config.d.ts +0 -84
  2017. package/dist/_internal/shared/listing-types/auction/config.js +0 -58
  2018. package/dist/_internal/shared/listing-types/auction/schema.d.ts +0 -3
  2019. package/dist/_internal/shared/listing-types/auction/schema.js +0 -7
  2020. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +0 -73
  2021. package/dist/_internal/shared/listing-types/prize-draw/config.js +0 -45
  2022. package/dist/_internal/shared/listing-types/prize-draw/schema.d.ts +0 -3
  2023. package/dist/_internal/shared/listing-types/prize-draw/schema.js +0 -13
  2024. package/dist/_internal/shared/listing-types/stickers/config.d.ts +0 -74
  2025. package/dist/_internal/shared/listing-types/stickers/config.js +0 -36
  2026. package/dist/_internal/shared/listing-types/stickers/ctas.d.ts +0 -1
  2027. package/dist/_internal/shared/listing-types/stickers/ctas.js +0 -3
  2028. package/dist/_internal/shared/listing-types/stickers/schema.d.ts +0 -2
  2029. package/dist/_internal/shared/listing-types/stickers/schema.js +0 -3
  2030. package/dist/_internal/shared/listing-types/stickers/seed-factory.d.ts +0 -1
  2031. package/dist/_internal/shared/listing-types/stickers/seed-factory.js +0 -1
  2032. package/dist/features/about/components/HowAuctionsWorkView.d.ts +0 -3
  2033. package/dist/features/about/components/HowAuctionsWorkView.js +0 -104
  2034. package/dist/features/account/components/BuyerAuctionsGuideView.d.ts +0 -2
  2035. package/dist/features/account/components/BuyerAuctionsGuideView.js +0 -45
  2036. package/dist/features/admin/components/AdminArtView.d.ts +0 -13
  2037. package/dist/features/admin/components/AdminArtView.js +0 -31
  2038. package/dist/features/admin/components/AdminBeysView.d.ts +0 -27
  2039. package/dist/features/admin/components/AdminBeysView.js +0 -180
  2040. package/dist/features/admin/components/AdminCarouselEditorView.d.ts +0 -9
  2041. package/dist/features/admin/components/AdminCarouselEditorView.js +0 -299
  2042. package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +0 -14
  2043. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +0 -96
  2044. package/dist/features/admin/components/AdminCarouselView.d.ts +0 -6
  2045. package/dist/features/admin/components/AdminCarouselView.js +0 -273
  2046. package/dist/features/admin/components/AdminPartsView.d.ts +0 -27
  2047. package/dist/features/admin/components/AdminPartsView.js +0 -162
  2048. package/dist/features/admin/components/AdminPrizeDrawsView.d.ts +0 -4
  2049. package/dist/features/admin/components/AdminPrizeDrawsView.js +0 -155
  2050. package/dist/features/admin/components/AdminStickersView.d.ts +0 -13
  2051. package/dist/features/admin/components/AdminStickersView.js +0 -31
  2052. package/dist/features/auctions/actions/bid-actions.d.ts +0 -50
  2053. package/dist/features/auctions/actions/bid-actions.js +0 -454
  2054. package/dist/features/auctions/api/route.d.ts +0 -14
  2055. package/dist/features/auctions/api/route.js +0 -62
  2056. package/dist/features/auctions/columns/index.d.ts +0 -14
  2057. package/dist/features/auctions/columns/index.js +0 -63
  2058. package/dist/features/auctions/components/AuctionBidsTable.d.ts +0 -27
  2059. package/dist/features/auctions/components/AuctionBidsTable.js +0 -96
  2060. package/dist/features/auctions/components/AuctionBottomActions.d.ts +0 -23
  2061. package/dist/features/auctions/components/AuctionBottomActions.js +0 -89
  2062. package/dist/features/auctions/components/AuctionDetailPageView.d.ts +0 -22
  2063. package/dist/features/auctions/components/AuctionDetailPageView.js +0 -246
  2064. package/dist/features/auctions/components/AuctionFilters.d.ts +0 -16
  2065. package/dist/features/auctions/components/AuctionFilters.js +0 -18
  2066. package/dist/features/auctions/components/AuctionLiveStatusBadge.d.ts +0 -20
  2067. package/dist/features/auctions/components/AuctionLiveStatusBadge.js +0 -21
  2068. package/dist/features/auctions/components/AuctionsListView.d.ts +0 -6
  2069. package/dist/features/auctions/components/AuctionsListView.js +0 -22
  2070. package/dist/features/auctions/components/CollapsibleBidHistory.js +0 -34
  2071. package/dist/features/auctions/components/LiveBidPrice.d.ts +0 -19
  2072. package/dist/features/auctions/components/LiveBidPrice.js +0 -19
  2073. package/dist/features/auctions/components/LiveMinIncrement.d.ts +0 -18
  2074. package/dist/features/auctions/components/LiveMinIncrement.js +0 -25
  2075. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +0 -99
  2076. package/dist/features/auctions/components/MarketplaceAuctionCard.js +0 -212
  2077. package/dist/features/auctions/components/MarketplaceAuctionGrid.d.ts +0 -21
  2078. package/dist/features/auctions/components/MarketplaceAuctionGrid.js +0 -47
  2079. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +0 -65
  2080. package/dist/features/auctions/components/PlaceBidFormClient.js +0 -306
  2081. package/dist/features/auctions/components/bid-detail-fields.js +0 -103
  2082. package/dist/features/auctions/components/index.d.ts +0 -7
  2083. package/dist/features/auctions/components/index.js +0 -5
  2084. package/dist/features/auctions/hooks/useAuctions.d.ts +0 -51
  2085. package/dist/features/auctions/hooks/useAuctions.js +0 -105
  2086. package/dist/features/auctions/hooks/useBids.d.ts +0 -33
  2087. package/dist/features/auctions/hooks/useBids.js +0 -32
  2088. package/dist/features/auctions/hooks/useIsAuctionEnded.d.ts +0 -41
  2089. package/dist/features/auctions/hooks/useIsAuctionEnded.js +0 -76
  2090. package/dist/features/auctions/hooks/useLiveAuctionBid.d.ts +0 -20
  2091. package/dist/features/auctions/hooks/useLiveAuctionBid.js +0 -23
  2092. package/dist/features/auctions/hooks/usePlaceBid.d.ts +0 -25
  2093. package/dist/features/auctions/hooks/usePlaceBid.js +0 -28
  2094. package/dist/features/auctions/hooks/useRealtimeBids.d.ts +0 -41
  2095. package/dist/features/auctions/hooks/useRealtimeBids.js +0 -170
  2096. package/dist/features/auctions/index.d.ts +0 -8
  2097. package/dist/features/auctions/index.js +0 -8
  2098. package/dist/features/auctions/manifest.js +0 -17
  2099. package/dist/features/auctions/messages/en.json +0 -18
  2100. package/dist/features/auctions/repository/bid.repository.d.ts +0 -256
  2101. package/dist/features/auctions/repository/bid.repository.js +0 -575
  2102. package/dist/features/auctions/schemas/bid-input.d.ts +0 -30
  2103. package/dist/features/auctions/schemas/bid-input.js +0 -28
  2104. package/dist/features/auctions/schemas/firestore.d.ts +0 -120
  2105. package/dist/features/auctions/schemas/firestore.js +0 -73
  2106. package/dist/features/auctions/schemas/index.d.ts +0 -170
  2107. package/dist/features/auctions/schemas/index.js +0 -64
  2108. package/dist/features/auctions/server.d.ts +0 -8
  2109. package/dist/features/auctions/server.js +0 -8
  2110. package/dist/features/auctions/types/index.d.ts +0 -74
  2111. package/dist/features/beys/components/BeyDetailPageView.d.ts +0 -50
  2112. package/dist/features/beys/components/BeyDetailPageView.js +0 -104
  2113. package/dist/features/beys/schemas/firestore.d.ts +0 -417
  2114. package/dist/features/beys/schemas/firestore.js +0 -65
  2115. package/dist/features/cron/jobs/auction-expiry.job.d.ts +0 -27
  2116. package/dist/features/cron/jobs/auction-expiry.job.js +0 -43
  2117. package/dist/features/events/components/EventRaffleEntryForm.d.ts +0 -24
  2118. package/dist/features/events/components/EventRaffleEntryForm.js +0 -46
  2119. package/dist/features/events/components/EventRaffleWinnerView.d.ts +0 -35
  2120. package/dist/features/events/components/EventRaffleWinnerView.js +0 -39
  2121. package/dist/features/events/components/EventRafflesSection.d.ts +0 -42
  2122. package/dist/features/events/components/EventRafflesSection.js +0 -96
  2123. package/dist/features/events/components/SpinWheelView.d.ts +0 -27
  2124. package/dist/features/events/components/SpinWheelView.js +0 -151
  2125. package/dist/features/homepage/actions/carousel-actions.d.ts +0 -38
  2126. package/dist/features/homepage/actions/carousel-actions.js +0 -54
  2127. package/dist/features/homepage/api/carousel/[id]/route.d.ts +0 -23
  2128. package/dist/features/homepage/api/carousel/[id]/route.js +0 -125
  2129. package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +0 -18
  2130. package/dist/features/homepage/components/FeaturedAuctionsSection.js +0 -12
  2131. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +0 -15
  2132. package/dist/features/homepage/hooks/useFeaturedAuctions.js +0 -49
  2133. package/dist/features/homepage/repository/carousel.repository.d.ts +0 -100
  2134. package/dist/features/homepage/repository/carousel.repository.js +0 -258
  2135. package/dist/features/homepage/repository/carousels.repository.d.ts +0 -38
  2136. package/dist/features/homepage/repository/carousels.repository.js +0 -149
  2137. package/dist/features/layout/BottomActionsContext.d.ts +0 -173
  2138. package/dist/features/layout/BottomActionsContext.js +0 -175
  2139. package/dist/features/layout/hooks/useBottomActions.d.ts +0 -37
  2140. package/dist/features/layout/hooks/useBottomActions.js +0 -86
  2141. package/dist/features/layout/hooks/useFormBottomActions.d.ts +0 -78
  2142. package/dist/features/layout/hooks/useFormBottomActions.js +0 -128
  2143. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +0 -48
  2144. package/dist/features/lottery/repository/lottery-entry.repository.js +0 -172
  2145. package/dist/features/lottery/schemas/config-write.d.ts +0 -145
  2146. package/dist/features/lottery/schemas/config-write.js +0 -199
  2147. package/dist/features/lottery/schemas/firestore.d.ts +0 -77
  2148. package/dist/features/lottery/schemas/firestore.js +0 -25
  2149. package/dist/features/lottery/schemas/zod.d.ts +0 -113
  2150. package/dist/features/lottery/schemas/zod.js +0 -39
  2151. package/dist/features/lottery/types/index.d.ts +0 -72
  2152. package/dist/features/lottery/types/index.js +0 -68
  2153. package/dist/features/media/MediaAvatar.js +0 -13
  2154. package/dist/features/media/MediaImage.d.ts +0 -116
  2155. package/dist/features/media/MediaImage.js +0 -194
  2156. package/dist/features/media/MediaLightbox.js +0 -246
  2157. package/dist/features/media/MediaVideo.js +0 -140
  2158. package/dist/features/parts/components/AssemblyDrawer.d.ts +0 -107
  2159. package/dist/features/parts/components/AssemblyDrawer.js +0 -257
  2160. package/dist/features/parts/components/ModelCompositionPanel.d.ts +0 -37
  2161. package/dist/features/parts/components/ModelCompositionPanel.js +0 -38
  2162. package/dist/features/parts/components/PartDetailPageView.d.ts +0 -61
  2163. package/dist/features/parts/components/PartDetailPageView.js +0 -123
  2164. package/dist/features/parts/components/PartsIndexPageView.d.ts +0 -42
  2165. package/dist/features/parts/components/PartsIndexPageView.js +0 -29
  2166. package/dist/features/parts/components/PartsSearchBox.d.ts +0 -9
  2167. package/dist/features/parts/components/PartsSearchBox.js +0 -136
  2168. package/dist/features/parts/schemas/admin-edit.d.ts +0 -81
  2169. package/dist/features/parts/schemas/admin-edit.js +0 -89
  2170. package/dist/features/parts/schemas/firestore.d.ts +0 -925
  2171. package/dist/features/parts/schemas/firestore.js +0 -384
  2172. package/dist/features/parts/utils/colourway-match.d.ts +0 -62
  2173. package/dist/features/parts/utils/colourway-match.js +0 -98
  2174. package/dist/features/parts/utils/part-breakdown.d.ts +0 -53
  2175. package/dist/features/parts/utils/part-breakdown.js +0 -77
  2176. package/dist/features/products/components/AuctionDetailView.d.ts +0 -16
  2177. package/dist/features/products/components/AuctionDetailView.js +0 -13
  2178. package/dist/features/products/components/AuctionsIndexListing.d.ts +0 -8
  2179. package/dist/features/products/components/AuctionsIndexListing.js +0 -170
  2180. package/dist/features/products/components/MarketplacePrizeDrawCard.d.ts +0 -34
  2181. package/dist/features/products/components/MarketplacePrizeDrawCard.js +0 -129
  2182. package/dist/features/products/components/PrizeDrawBottomActions.d.ts +0 -6
  2183. package/dist/features/products/components/PrizeDrawBottomActions.js +0 -6
  2184. package/dist/features/products/components/PrizeDrawCollage.d.ts +0 -35
  2185. package/dist/features/products/components/PrizeDrawCollage.js +0 -90
  2186. package/dist/features/products/components/PrizeDrawDetailPageView.d.ts +0 -27
  2187. package/dist/features/products/components/PrizeDrawDetailPageView.js +0 -136
  2188. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +0 -32
  2189. package/dist/features/products/components/PrizeDrawEntryActions.js +0 -104
  2190. package/dist/features/products/components/PrizeDrawItemsEditor.d.ts +0 -13
  2191. package/dist/features/products/components/PrizeDrawItemsEditor.js +0 -101
  2192. package/dist/features/products/components/PrizeDrawWinnerMappingView.d.ts +0 -14
  2193. package/dist/features/products/components/PrizeDrawWinnerMappingView.js +0 -43
  2194. package/dist/features/products/components/PrizeDrawsIndexListing.d.ts +0 -8
  2195. package/dist/features/products/components/PrizeDrawsIndexListing.js +0 -108
  2196. package/dist/features/products/components/PrizeDrawsListingView.d.ts +0 -15
  2197. package/dist/features/products/components/PrizeDrawsListingView.js +0 -37
  2198. package/dist/features/products/components/PrizeDrawsSection.d.ts +0 -15
  2199. package/dist/features/products/components/PrizeDrawsSection.js +0 -49
  2200. package/dist/features/seller/components/SellerArtView.d.ts +0 -15
  2201. package/dist/features/seller/components/SellerArtView.js +0 -6
  2202. package/dist/features/seller/components/SellerStickersView.d.ts +0 -15
  2203. package/dist/features/seller/components/SellerStickersView.js +0 -6
  2204. package/dist/features/stores/api/[storeSlug]/auctions/route.d.ts +0 -23
  2205. package/dist/features/stores/api/[storeSlug]/auctions/route.js +0 -83
  2206. package/dist/features/stores/components/StoreAuctionsListing.d.ts +0 -7
  2207. package/dist/features/stores/components/StoreAuctionsListing.js +0 -138
  2208. package/dist/features/stores/components/StoreAuctionsPageView.d.ts +0 -8
  2209. package/dist/features/stores/components/StoreAuctionsPageView.js +0 -24
  2210. package/dist/features/stores/components/StoreAuctionsView.d.ts +0 -17
  2211. package/dist/features/stores/components/StoreAuctionsView.js +0 -5
  2212. package/dist/features/stores/components/StorePrizeDrawsPageView.d.ts +0 -8
  2213. package/dist/features/stores/components/StorePrizeDrawsPageView.js +0 -24
  2214. /package/dist/_internal/server/features/{auctions → collector-drops}/actions.d.ts +0 -0
  2215. /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/ctas.d.ts +0 -0
  2216. /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/og.d.ts +0 -0
  2217. /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/og.js +0 -0
  2218. /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/seed-factory.d.ts +0 -0
  2219. /package/dist/_internal/shared/listing-types/{art → art-and-stickers}/seed-factory.js +0 -0
  2220. /package/dist/_internal/shared/listing-types/{auction → clearance}/ctas.d.ts +0 -0
  2221. /package/dist/_internal/shared/listing-types/{auction → clearance}/ctas.js +0 -0
  2222. /package/dist/_internal/shared/listing-types/{auction → clearance}/og.d.ts +0 -0
  2223. /package/dist/_internal/shared/listing-types/{auction → clearance}/og.js +0 -0
  2224. /package/dist/_internal/shared/listing-types/{auction → clearance}/seed-factory.d.ts +0 -0
  2225. /package/dist/_internal/shared/listing-types/{auction → clearance}/seed-factory.js +0 -0
  2226. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/ctas.d.ts +0 -0
  2227. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/ctas.js +0 -0
  2228. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/og.d.ts +0 -0
  2229. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/og.js +0 -0
  2230. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/seed-factory.d.ts +0 -0
  2231. /package/dist/_internal/shared/listing-types/{prize-draw → collector-drop}/seed-factory.js +0 -0
  2232. /package/dist/features/{auctions → collector-drops}/actions/index.d.ts +0 -0
  2233. /package/dist/features/{auctions → collector-drops}/actions/index.js +0 -0
  2234. /package/dist/features/{auctions → collector-drops}/components/CollapsibleBidHistory.d.ts +0 -0
  2235. /package/dist/features/{auctions → collector-drops}/components/bid-detail-fields.d.ts +0 -0
  2236. /package/dist/features/{auctions → collector-drops}/manifest.d.ts +0 -0
  2237. /package/dist/features/{auctions → collector-drops}/types/index.js +0 -0
  2238. /package/dist/{features/media → ui/components}/MediaAvatar.d.ts +0 -0
  2239. /package/dist/{features/media → ui/components}/MediaLightbox.d.ts +0 -0
  2240. /package/dist/{features/media → ui/components}/MediaVideo.d.ts +0 -0
  2241. /package/dist/{_internal/shared/listing-types/stickers/og.d.ts → ui/types/image-crop.js} +0 -0
  2242. /package/dist/{_internal/shared/listing-types/stickers/og.js → ui/types/quick-field.js} +0 -0
@@ -16,14 +16,13 @@ import { MediaUploadField } from "../../media/upload/MediaUploadField.js";
16
16
  import { useMediaUpload } from "../../media/hooks/useMedia.js";
17
17
  import { apiClient } from "../../../http/index.js";
18
18
  import { ADMIN_ENDPOINTS } from "../../../constants/api-endpoints.js";
19
- import { ROUTES } from "../../../next/routing/route-map.js";
20
19
  import { NOTIFICATION_TYPE_TABS } from "../../../constants/notification-types.js";
21
- import { ALL_LISTING_TYPES, ALL_BROWSE_PAGES, } from "../../../_internal/shared/listing-types/feature-flags.js";
20
+ import { ALL_LISTING_TYPES, ALL_BROWSE_PAGES, FLAG_CHOICE_OPTIONS, flagValueToChoice, choiceToFlagValue, } from "../../../_internal/shared/listing-types/feature-flags.js";
22
21
  import { pluginFor } from "../../../_internal/shared/listing-types/_registry.js";
23
22
  import { SITE_SETTINGS_TABS, isSiteSettingsTabId, } from "../constants/site-settings-tabs.js";
24
23
  import { ThemeManagerView, } from "../../site-settings/components/ThemeManagerView.js";
25
24
  import { DEFAULT_LIGHT_THEME, DEFAULT_DARK_THEME } from "../../../tokens/themes/index.js";
26
- import { DEFAULT_AUCTION_BID_INCREMENT_TIERS, } from "../../../_internal/shared/features/auctions/config.js";
25
+ import { DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS, } from "../../../_internal/shared/features/collector-drops/config.js";
27
26
  import { validateGstEnablement } from "../../../_internal/shared/features/site-settings/gst-registration.js";
28
27
  /*
29
28
  * 🛑 The SAME constant the checkout page and the server-side gate read. An
@@ -32,9 +31,37 @@ import { validateGstEnablement } from "../../../_internal/shared/features/site-s
32
31
  */
33
32
  import { COD_MAX_ORDER_VALUE_FALLBACK } from "../schemas/firestore.js";
34
33
  import { siteSettingsFormSchema } from "../schemas/site-settings-form.js";
34
+ import { siteSettingsBrandingFormSchema, } from "../schemas/site-settings-branding-form.js";
35
+ import { siteSettingsAnnouncementFormSchema, } from "../schemas/site-settings-announcement-form.js";
36
+ import { siteSettingsSeoFormSchema, } from "../schemas/site-settings-seo-form.js";
37
+ import { siteSettingsContactFormSchema, } from "../schemas/site-settings-contact-form.js";
38
+ import { siteSettingsWatermarkFormSchema, } from "../schemas/site-settings-watermark-form.js";
39
+ import { siteSettingsFeesFormSchema, } from "../schemas/site-settings-fees-form.js";
40
+ import { siteSettingsProcurementFormSchema, } from "../schemas/site-settings-procurement-form.js";
41
+ import { siteSettingsLimitsFormSchema, } from "../schemas/site-settings-limits-form.js";
42
+ import { siteSettingsNotificationsFormSchema, } from "../schemas/site-settings-notifications-form.js";
43
+ import { siteSettingsShippingFormSchema, } from "../schemas/site-settings-shipping-form.js";
44
+ import { siteSettingsGstFormSchema, } from "../schemas/site-settings-gst-form.js";
45
+ import { siteSettingsEmiFormSchema, } from "../schemas/site-settings-emi-form.js";
46
+ import { siteSettingsLegalFormSchema, LEGAL_PAGE_FIELDS, } from "../schemas/site-settings-legal-form.js";
47
+ import { siteSettingsWhatsappFormSchema, } from "../schemas/site-settings-whatsapp-form.js";
48
+ import { siteSettingsIntegrationsFormSchema, MASKED_CREDENTIAL_FIELDS, } from "../schemas/site-settings-integrations-form.js";
49
+ import { siteSettingsCollectorDropFormSchema, } from "../schemas/site-settings-collector-drop-form.js";
50
+ import { siteSettingsListingsFormSchema, } from "../schemas/site-settings-listings-form.js";
51
+ import { siteSettingsAppearanceFormSchema, } from "../schemas/site-settings-appearance-form.js";
52
+ import { siteSettingsAboutFormSchema, } from "../schemas/site-settings-about-form.js";
53
+ import { Repeater } from "../../../ui/components/Repeater.js";
35
54
  import { FormErrorSummary } from "../../../ui/forms/FormErrorSummary.js";
36
55
  import { SectionForm } from "../../shell/SectionForm.js";
37
- import { useFormShellState, FormShellContext, applyZodIssues } from "../../../ui/forms/index.js";
56
+ import { buildSectionsFromSchema, resolveFields } from "../../shell/build-sections.js";
57
+ import { useFieldVisibility } from "../../shell/useFieldVisibility.js";
58
+ import { swapFieldOrder } from "../../shell/field-ui-meta.js";
59
+ import { useEditMode } from "../../../_internal/client/edit-mode/EditModeProvider.js";
60
+ import { useFormShellState, FormShellContext, applyZodIssues, FieldInput, FieldTextarea } from "../../../ui/forms/index.js";
61
+ import { FieldCheckbox } from "../../../ui/forms/FieldCheckbox.js";
62
+ import { humaniseFieldName } from "../../shell/entity-form.js";
63
+ import { getBrandName, getBrandDomain } from "../../../core/brand-resolver.js";
64
+ import { AdminComposableRegion } from "../../dashboard/components/AdminComposableRegion.js";
38
65
  const __O = {
39
66
  hidden: "overflow-hidden",
40
67
  };
@@ -50,13 +77,39 @@ function MaskedInput({ label, value, onChange, placeholder, helperText, }) {
50
77
  const [revealed, setRevealed] = React.useState(false);
51
78
  return (_jsxs(Div, { className: "relative", children: [_jsx(Input, { label: label, value: value, onChange: (e) => onChange(e.target.value), type: revealed ? "text" : "password", placeholder: placeholder, helperText: helperText }), _jsx(Button, { type: "button", variant: "ghost", textSize: "xs", textColor: "faint", paddingX: "none", paddingY: "none", onClick: () => setRevealed((r) => !r), className: "absolute right-3 top-8", children: revealed ? "Hide" : "Reveal" })] }));
52
79
  }
53
- const NOTIF_CHANNEL_INDENT = "space-y-4 pl-4 border-l-2 border-[var(--appkit-color-border)]";
54
80
  const PRIORITY_OPTIONS = [
55
81
  { label: "Low (send all)", value: "low" },
56
82
  { label: "Normal", value: "normal" },
57
83
  { label: "High", value: "high" },
58
84
  { label: "Critical only", value: "critical" },
59
85
  ];
86
+ /*
87
+ * Moved to module scope from inside the component body (2026-11-04,
88
+ * Shipping tab migration) — `buildSectionsFromSchema`'s `opts.options` is a
89
+ * plain object evaluated eagerly at the point the `useMemo` factory runs,
90
+ * unlike a `renderers` function value, so a component-scoped `const`
91
+ * declared textually AFTER that `useMemo` call would be a TDZ error at
92
+ * runtime. A module-level const has no such ordering constraint.
93
+ */
94
+ const CARRIER_OPTIONS = [
95
+ { label: "Custom / Other", value: "custom" },
96
+ { label: "Shiprocket", value: "shiprocket" },
97
+ { label: "Delhivery", value: "delhivery" },
98
+ { label: "Bluedart", value: "bluedart" },
99
+ { label: "FedEx", value: "fedex" },
100
+ ];
101
+ /*
102
+ * Shared by every gateway that has a sandbox/production split (PhonePe,
103
+ * Cashfree). Was `PHONEPE_ENVIRONMENT_OPTIONS`; renamed when the second
104
+ * gateway needed the identical two options, because a provider-named
105
+ * constant used by two providers is how a name stops meaning anything.
106
+ * Module scope for the same eager-evaluation reason as `CARRIER_OPTIONS`
107
+ * above (2026-11-04, Integrations tab migration).
108
+ */
109
+ const GATEWAY_ENVIRONMENT_OPTIONS = [
110
+ { label: "Sandbox (test)", value: "sandbox" },
111
+ { label: "Production (live)", value: "production" },
112
+ ];
60
113
  /** Single persistent save action for the whole settings form — every tab writes
61
114
  * into the same combined payload, so one save covers whichever tabs were edited
62
115
  * regardless of which one is currently active. */
@@ -84,11 +137,47 @@ function SettingsTabForm({ id, label, children, }) {
84
137
  * on every render of a 20-tab page.
85
138
  */
86
139
  const EMPTY_TAB_VALUES = {};
140
+ /** 1A-v (overhaul brief) — `ActionKind` display text, for the listing-type
141
+ * toggle grid's own label only; not reused anywhere a translated or
142
+ * buyer-facing string is needed. */
143
+ const ACTION_KIND_LABELS = {
144
+ "buy-now": "Buy Now",
145
+ bid: "Bid",
146
+ reserve: "Reserve",
147
+ "enter-draw": "Enter Draw",
148
+ "make-offer": "Make Offer",
149
+ };
150
+ /**
151
+ * Reproduces the generator's default `kind: "toggle"` rendering
152
+ * (`FieldCheckbox`, see `build-sections.tsx`'s `renderField`), wrapped in an
153
+ * `id`-bearing anchor — fixed 2026-11-05. The old hand-written JSX carried
154
+ * 13 literal `id="setting-*"` attributes (`settings-preview-registry.ts`'s
155
+ * own header comment records the count), used by the dashboard's "jump to
156
+ * this setting" cards and the `?tab=X#setting-Y` search-index deep links.
157
+ * The generator has no per-field DOM-id mechanism, so the Universal Template
158
+ * System migration silently dropped all of them — flagged as a known gap in
159
+ * the Branding tab's own commit message at the time, and confirmed as a
160
+ * real regression by `audit-widget-descriptor-sync`/`audit-action-index`
161
+ * once the whole migration was gated.
162
+ *
163
+ * 🛑 A component taking `id` as a real JSX attribute, NOT a function
164
+ * returning a closure over a string parameter — `audit-widget-descriptor-sync`/
165
+ * `audit-action-index` both do a literal SOURCE-TEXT search for
166
+ * `id="setting-X"` (`adminSiteSettingsSrc.includes('id="${anchorId}"')`,
167
+ * not a DOM/runtime check), so `id={someVariable}` passes functionally but
168
+ * fails the audit textually. Writing `id="setting-x"` as a literal at each
169
+ * call site satisfies both. Not a generic `domId` mechanism on
170
+ * `FieldUiMeta` — adding one for 8 current call sites would be new
171
+ * infrastructure for a need that has not recurred beyond this list.
172
+ */
173
+ function AnchoredToggle({ id, field, values, onChange, }) {
174
+ return (_jsx("div", { id: id, children: _jsx(FieldCheckbox, { name: field.name, label: field.meta.label ?? humaniseFieldName(field.name), hint: field.meta.help, checked: Boolean(values[field.name]), onChange: (v) => onChange({ [field.name]: v }) }) }));
175
+ }
87
176
  function SaveAllBar({ isPending, onSave }) {
88
177
  return (_jsxs(_Fragment, { children: [_jsx(FormErrorSummary, {}), _jsx(FormActions, { align: "right", children: _jsx(Button, { type: "button", isLoading: isPending, disabled: isPending, onClick: onSave, children: isPending ? "Saving…" : "Save all changes" }) })] }));
89
178
  }
90
179
  // --- Component ---------------------------------------------------------------
91
- export function AdminSiteSettingsView({ labels = {}, ...rest }) {
180
+ export function AdminSiteSettingsView({ labels = {}, pageRegionCards = [], ...rest }) {
92
181
  const queryClient = useQueryClient();
93
182
  const { showToast } = useToast();
94
183
  /*
@@ -116,295 +205,608 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
116
205
  },
117
206
  });
118
207
  const s = (data ?? {});
119
- // ① Branding
120
- const [siteName, setSiteName] = React.useState("");
121
- const [tagline, setTagline] = React.useState("");
122
- const [logoUrl, setLogoUrl] = React.useState("");
123
- const [faviconUrl, setFaviconUrl] = React.useState("");
124
- const [maintenanceMode, setMaintenanceMode] = React.useState(false);
125
- const [maintenanceMessage, setMaintenanceMessage] = React.useState("");
126
- // ② Appearance — background image/gradient/color/video (light + dark).
208
+ // ① Branding — first tab migrated to the Universal Template System
209
+ // (schema + buildSectionsFromSchema), 2026-11-04. One combined object
210
+ // instead of eight useState calls; `chatEnabled` defaults false (D9,
211
+ // opt-in) and `assistantEnabled` defaults true (kill switch on an
212
+ // already-shipped path, matching assertAssistantEnabled's server-side
213
+ // polarity) — same defaults the eight separate calls used.
214
+ const [brandingForm, setBrandingForm] = React.useState({
215
+ siteName: "", tagline: "", logoUrl: "", faviconUrl: "",
216
+ maintenanceMode: false, maintenanceMessage: "",
217
+ chatEnabled: false, assistantEnabled: true,
218
+ });
219
+ const { editMode } = useEditMode();
220
+ const { fields: brandingVisibilityFields, setVisible: setBrandingFieldVisible, fieldOrder: brandingFieldOrder, setFieldOrder: setBrandingFieldOrder, } = useFieldVisibility("admin-site-settings-branding");
221
+ const brandingSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsBrandingFormSchema, {
222
+ renderers: {
223
+ logoUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Logo", currentImage: values.logoUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ logoUrl: url }) })),
224
+ faviconUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Favicon", currentImage: values.faviconUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ faviconUrl: url }) })),
225
+ },
226
+ fieldVisibility: brandingVisibilityFields,
227
+ editMode,
228
+ onToggleFieldVisibility: setBrandingFieldVisible,
229
+ fieldOrder: brandingFieldOrder,
230
+ onMoveField: (fieldName, neighborName) => setBrandingFieldOrder(swapFieldOrder(brandingFieldOrder, resolveFields(siteSettingsBrandingFormSchema).map((f) => f.name), fieldName, neighborName)),
231
+ }), [brandingVisibilityFields, editMode, setBrandingFieldVisible, brandingFieldOrder, setBrandingFieldOrder, upload]);
232
+ // ② Appearance — eighteenth tab migrated to the Universal Template
233
+ // System, 2026-11-04. Ten useState calls collapsed into two combined
234
+ // objects (`lightBg`/`darkBg`), each a structured value rather than a
235
+ // scalar — see site-settings-appearance-form.ts's header for why.
236
+ //
127
237
  // The old primaryColor/secondaryColor/accentColor/fontFamily/defaultTheme
128
238
  // fields here were dead (saved to Firestore, never read back anywhere —
129
239
  // redundant with the working Theme Manager tab below). Removed 2026-08-09.
130
- const [lightBgType, setLightBgType] = React.useState("color");
131
- const [lightBgValue, setLightBgValue] = React.useState("");
132
- const [lightBgOverlayEnabled, setLightBgOverlayEnabled] = React.useState(false);
133
- const [lightBgOverlayColor, setLightBgOverlayColor] = React.useState("#000000");
134
- const [lightBgOverlayOpacity, setLightBgOverlayOpacity] = React.useState(30);
135
- const [darkBgType, setDarkBgType] = React.useState("color");
136
- const [darkBgValue, setDarkBgValue] = React.useState("");
137
- const [darkBgOverlayEnabled, setDarkBgOverlayEnabled] = React.useState(false);
138
- const [darkBgOverlayColor, setDarkBgOverlayColor] = React.useState("#000000");
139
- const [darkBgOverlayOpacity, setDarkBgOverlayOpacity] = React.useState(30);
240
+ const [appearanceForm, setAppearanceForm] = React.useState({
241
+ lightBg: { type: "color", value: "", overlayEnabled: false, overlayColor: "#000000", overlayOpacity: 30 },
242
+ darkBg: { type: "color", value: "", overlayEnabled: false, overlayColor: "#000000", overlayOpacity: 30 },
243
+ });
244
+ const { fields: appearanceVisibilityFields, setVisible: setAppearanceFieldVisible, fieldOrder: appearanceFieldOrder, setFieldOrder: setAppearanceFieldOrder, } = useFieldVisibility("admin-site-settings-appearance");
245
+ /*
246
+ * Shared by both `lightBg` and `darkBg` — the original JSX was already
247
+ * byte-structurally identical for both modes apart from the default
248
+ * swatch color and the `<BackgroundRenderer mode>` prop, so this is the
249
+ * ONE renderer, parameterized, rather than two hand-written copies.
250
+ */
251
+ const buildBackgroundModeRenderer = React.useCallback((mode, defaultColor) => ({ values, onChange }) => {
252
+ const fieldName = mode === "light" ? "lightBg" : "darkBg";
253
+ const bg = values[fieldName];
254
+ const setBg = (patch) => onChange({ [fieldName]: { ...bg, ...patch } });
255
+ return (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: mode === "light" ? "Light mode" : "Dark mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: bg.type, onValueChange: (v) => setBg({ type: v }) }), bg.type === "color" ? (_jsx(Input, { type: "color", label: "Color", value: bg.value || defaultColor, onChange: (e) => setBg({ value: e.target.value }), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : bg.type === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: bg.value, onChange: (e) => setBg({ value: e.target.value }), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: bg.type === "video" ? "Background video" : "Background image", kind: bg.type === "video" ? "video" : "image", value: bg.value, onChange: (v) => setBg({ value: v }), onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: bg.overlayEnabled, onChange: (v) => setBg({ overlayEnabled: v }) }), bg.overlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: bg.overlayColor, onChange: (e) => setBg({ overlayColor: e.target.value }), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: bg.overlayOpacity, onChange: (v) => setBg({ overlayOpacity: v }) })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: mode, lightMode: mode === "light"
256
+ ? { type: bg.type, value: bg.value, overlay: { enabled: bg.overlayEnabled, color: bg.overlayColor, opacity: bg.overlayOpacity / 100 } }
257
+ : { type: "color", value: "" }, darkMode: mode === "dark"
258
+ ? { type: bg.type, value: bg.value, overlay: { enabled: bg.overlayEnabled, color: bg.overlayColor, opacity: bg.overlayOpacity / 100 } }
259
+ : { type: "color", value: "" } }) })] }));
260
+ }, [upload]);
261
+ const appearanceSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAppearanceFormSchema, {
262
+ renderers: {
263
+ lightBg: buildBackgroundModeRenderer("light", "#ffffff"),
264
+ darkBg: buildBackgroundModeRenderer("dark", "#000000"),
265
+ },
266
+ fieldVisibility: appearanceVisibilityFields,
267
+ editMode,
268
+ onToggleFieldVisibility: setAppearanceFieldVisible,
269
+ fieldOrder: appearanceFieldOrder,
270
+ onMoveField: (fieldName, neighborName) => setAppearanceFieldOrder(swapFieldOrder(appearanceFieldOrder, resolveFields(siteSettingsAppearanceFormSchema).map((f) => f.name), fieldName, neighborName)),
271
+ }), [appearanceVisibilityFields, editMode, setAppearanceFieldVisible, appearanceFieldOrder, setAppearanceFieldOrder, buildBackgroundModeRenderer]);
140
272
  // Theme registry (custom themes + default-light / default-dark pointers).
141
273
  const [themeRegistry, setThemeRegistry] = React.useState({
142
274
  themes: [],
143
275
  defaultLightThemeId: DEFAULT_LIGHT_THEME.id,
144
276
  defaultDarkThemeId: DEFAULT_DARK_THEME.id,
145
277
  });
146
- // ③ Announcement
147
- const [announcementEnabled, setAnnouncementEnabled] = React.useState(false);
148
- const [announcementText, setAnnouncementText] = React.useState("");
149
- const [announcementLink, setAnnouncementLink] = React.useState("");
150
- const [announcementBg, setAnnouncementBg] = React.useState("");
151
- // ④ SEO
152
- const [seoTitle, setSeoTitle] = React.useState("");
153
- const [seoDescription, setSeoDescription] = React.useState("");
154
- const [seoOgImage, setSeoOgImage] = React.useState("");
155
- const [seoNoIndex, setSeoNoIndex] = React.useState(false);
156
- const [canonicalUrl, setCanonicalUrl] = React.useState("");
157
- // ⑤ Contact & Social
158
- const [supportEmail, setSupportEmail] = React.useState("");
159
- const [supportPhone, setSupportPhone] = React.useState("");
160
- const [supportAddress, setSupportAddress] = React.useState("");
161
- const [supportHours, setSupportHours] = React.useState("");
162
- const [instagram, setInstagram] = React.useState("");
163
- const [twitter, setTwitter] = React.useState("");
164
- const [facebook, setFacebook] = React.useState("");
165
- const [youtube, setYoutube] = React.useState("");
166
- const [whatsapp, setWhatsapp] = React.useState("");
167
- /*
168
- * 🛑 Load-bearing, and its absence was a live bug until 2026-10-19.
169
- *
170
- * `buildFullPayload()` writes the WHOLE `contact` group, so a key this
171
- * component does not carry in state is erased on the next save of ANY tab.
172
- * `contact.upiVpa` is the site-wide fallback `resolveDisplayedUpiId` uses
173
- * when a seller has no UPI configured or the store is admin-owned — i.e.
174
- * the VPA a manual-payment buyer is told to pay into. Saving the Watermark
175
- * tab silently blanked it.
176
- */
177
- const [upiVpa, setUpiVpa] = React.useState("");
178
- const [linkedin, setLinkedin] = React.useState("");
179
- const [pinterest, setPinterest] = React.useState("");
180
- // ⑥ Watermark
181
- const [watermarkType, setWatermarkType] = React.useState("text");
182
- const [watermarkText, setWatermarkText] = React.useState("letitrip.in");
183
- const [watermarkImageUrl, setWatermarkImageUrl] = React.useState("");
184
- const [watermarkSize, setWatermarkSize] = React.useState(10);
185
- const [watermarkOpacity, setWatermarkOpacity] = React.useState(10);
186
- // 4 corners + center are picked from the Select; "custom" is only ever set
187
- // by the offset toggle below, never a 6th Select option (keeps the picker
188
- // at 5 options — see PaginatedSelect rule for >5).
189
- const [watermarkPosition, setWatermarkPosition] = React.useState("center");
190
- const [watermarkUseCustomOffset, setWatermarkUseCustomOffset] = React.useState(false);
191
- const [watermarkOffsetX, setWatermarkOffsetX] = React.useState(0);
192
- const [watermarkOffsetY, setWatermarkOffsetY] = React.useState(0);
278
+ // ③ Announcement — second tab migrated to the Universal Template System,
279
+ // 2026-11-04. One combined object instead of four useState calls.
280
+ const [announcementForm, setAnnouncementForm] = React.useState({
281
+ announcementEnabled: false, announcementText: "", announcementLink: "", announcementBg: "",
282
+ });
283
+ const { fields: announcementVisibilityFields, setVisible: setAnnouncementFieldVisible, fieldOrder: announcementFieldOrder, setFieldOrder: setAnnouncementFieldOrder, } = useFieldVisibility("admin-site-settings-announcement");
284
+ const announcementSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAnnouncementFormSchema, {
285
+ renderers: {
286
+ announcementBg: ({ values, onChange }) => (_jsxs(Stack, { gap: "none", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "mb-1", children: "Background color" }), _jsx(Input, { type: "color", "aria-label": "Background color", value: values.announcementBg || "#1d4ed8", onChange: (e) => onChange({ announcementBg: e.target.value }), className: "h-10 w-32 cursor-pointer", bare: true }), " "] })),
287
+ announcementEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-announcement-bar", ...props }),
288
+ },
289
+ fieldVisibility: announcementVisibilityFields,
290
+ editMode,
291
+ onToggleFieldVisibility: setAnnouncementFieldVisible,
292
+ fieldOrder: announcementFieldOrder,
293
+ onMoveField: (fieldName, neighborName) => setAnnouncementFieldOrder(swapFieldOrder(announcementFieldOrder, resolveFields(siteSettingsAnnouncementFormSchema).map((f) => f.name), fieldName, neighborName)),
294
+ }), [announcementVisibilityFields, editMode, setAnnouncementFieldVisible, announcementFieldOrder, setAnnouncementFieldOrder]);
295
+ // ④ SEO — third tab migrated to the Universal Template System, 2026-11-04.
296
+ const [seoForm, setSeoForm] = React.useState({
297
+ seoTitle: "", seoDescription: "", seoOgImage: "", canonicalUrl: "", seoNoIndex: false,
298
+ });
299
+ const { fields: seoVisibilityFields, setVisible: setSeoFieldVisible, fieldOrder: seoFieldOrder, setFieldOrder: setSeoFieldOrder, } = useFieldVisibility("admin-site-settings-seo");
300
+ const seoSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsSeoFormSchema, {
301
+ renderers: {
302
+ seoOgImage: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Default OG image", currentImage: values.seoOgImage ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ seoOgImage: url }) })),
303
+ seoNoIndex: (props) => _jsx(AnchoredToggle, { id: "setting-robots-noindex", ...props }),
304
+ },
305
+ fieldVisibility: seoVisibilityFields,
306
+ editMode,
307
+ onToggleFieldVisibility: setSeoFieldVisible,
308
+ fieldOrder: seoFieldOrder,
309
+ onMoveField: (fieldName, neighborName) => setSeoFieldOrder(swapFieldOrder(seoFieldOrder, resolveFields(siteSettingsSeoFormSchema).map((f) => f.name), fieldName, neighborName)),
310
+ }), [seoVisibilityFields, editMode, setSeoFieldVisible, seoFieldOrder, setSeoFieldOrder, upload]);
311
+ // ⑤ Contact & Social — fourth tab migrated to the Universal Template
312
+ // System, 2026-11-04. One combined object instead of twelve useState
313
+ // calls.
314
+ //
315
+ // 🛑 `upiVpa` specifically is load-bearing, and its absence from this
316
+ // object was a live bug until 2026-10-19 under the old per-field state.
317
+ // `buildFullPayload()` writes the WHOLE `contact` group, so a key this
318
+ // component does not carry is erased on the next save of ANY tab.
319
+ // `contact.upiVpa` is the site-wide fallback `resolveDisplayedUpiId` uses
320
+ // when a seller has no UPI configured or the store is admin-owned — i.e.
321
+ // the VPA a manual-payment buyer is told to pay into. Carried through
322
+ // unconditionally below, same as every other field in this object.
323
+ const [contactForm, setContactForm] = React.useState({
324
+ supportEmail: "", supportPhone: "", supportAddress: "", supportHours: "",
325
+ instagram: "", twitter: "", facebook: "", youtube: "", whatsapp: "",
326
+ upiVpa: "", linkedin: "", pinterest: "",
327
+ });
328
+ const { fields: contactVisibilityFields, setVisible: setContactFieldVisible, fieldOrder: contactFieldOrder, setFieldOrder: setContactFieldOrder, } = useFieldVisibility("admin-site-settings-contact");
329
+ const contactSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsContactFormSchema, {
330
+ fieldVisibility: contactVisibilityFields,
331
+ editMode,
332
+ onToggleFieldVisibility: setContactFieldVisible,
333
+ fieldOrder: contactFieldOrder,
334
+ onMoveField: (fieldName, neighborName) => setContactFieldOrder(swapFieldOrder(contactFieldOrder, resolveFields(siteSettingsContactFormSchema).map((f) => f.name), fieldName, neighborName)),
335
+ }), [contactVisibilityFields, editMode, setContactFieldVisible, contactFieldOrder, setContactFieldOrder]);
336
+ // ⑥ Watermark — fifth tab migrated to the Universal Template System,
337
+ // 2026-11-04. One combined object instead of nine useState calls.
338
+ //
339
+ // "custom" is only ever set by the offset toggle, never a 6th Select
340
+ // option (keeps the picker at 5 options — see PaginatedSelect rule for >5)
341
+ // — `watermarkPosition` itself stays the 5-value enum; `buildFullPayload()`
342
+ // still substitutes "custom" for the SAVED `position` key when the offset
343
+ // toggle is on, exactly as the old single-field version did.
344
+ const [watermarkForm, setWatermarkForm] = React.useState({
345
+ watermarkType: "text", watermarkText: getBrandDomain(), watermarkImageUrl: "",
346
+ watermarkSize: 10, watermarkOpacity: 10, watermarkPosition: "center",
347
+ watermarkUseCustomOffset: false, watermarkOffsetX: 0, watermarkOffsetY: 0,
348
+ });
349
+ const { fields: watermarkVisibilityFields, setVisible: setWatermarkFieldVisible, fieldOrder: watermarkFieldOrder, setFieldOrder: setWatermarkFieldOrder, } = useFieldVisibility("admin-site-settings-watermark");
350
+ const watermarkSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsWatermarkFormSchema, {
351
+ renderers: {
352
+ watermarkImageUrl: ({ values, onChange }) => (_jsx(ImageUpload, { label: "Watermark image", currentImage: values.watermarkImageUrl ?? "", onUpload: (file) => upload(file, "store"), onChange: (url) => onChange({ watermarkImageUrl: url }) })),
353
+ watermarkSize: ({ values, onChange }) => (_jsx(Slider, { label: `Size — ${values.watermarkSize}% of image width`, value: values.watermarkSize, onChange: (v) => onChange({ watermarkSize: v }), min: 5, max: 100, step: 5 })),
354
+ watermarkOpacity: ({ values, onChange }) => (_jsx(Slider, { label: `Opacity — ${values.watermarkOpacity}%`, value: values.watermarkOpacity, onChange: (v) => onChange({ watermarkOpacity: v }), min: 5, max: 100, step: 5 })),
355
+ watermarkPosition: ({ values, onChange }) => (_jsx(Select, { label: "Position", options: [
356
+ { label: "Center", value: "center" },
357
+ { label: "Top left", value: "top-left" },
358
+ { label: "Top right", value: "top-right" },
359
+ { label: "Bottom left", value: "bottom-left" },
360
+ { label: "Bottom right", value: "bottom-right" },
361
+ ], value: values.watermarkPosition, onValueChange: (v) => onChange({ watermarkPosition: v }), disabled: Boolean(values.watermarkUseCustomOffset) })),
362
+ watermarkOffsetX: ({ values, onChange }) => (_jsx(Input, { label: "X offset (%) \u2014 + right / \u2212 left of center", value: String(values.watermarkOffsetX), onChange: (e) => onChange({ watermarkOffsetX: Math.max(-45, Math.min(45, parseInt(e.target.value) || 0)) }), type: "number", min: -45, max: 45 })),
363
+ watermarkOffsetY: ({ values, onChange }) => (_jsx(Input, { label: "Y offset (%) \u2014 + down / \u2212 up from center", value: String(values.watermarkOffsetY), onChange: (e) => onChange({ watermarkOffsetY: Math.max(-45, Math.min(45, parseInt(e.target.value) || 0)) }), type: "number", min: -45, max: 45 })),
364
+ },
365
+ fieldVisibility: watermarkVisibilityFields,
366
+ editMode,
367
+ onToggleFieldVisibility: setWatermarkFieldVisible,
368
+ fieldOrder: watermarkFieldOrder,
369
+ onMoveField: (fieldName, neighborName) => setWatermarkFieldOrder(swapFieldOrder(watermarkFieldOrder, resolveFields(siteSettingsWatermarkFormSchema).map((f) => f.name), fieldName, neighborName)),
370
+ }), [watermarkVisibilityFields, editMode, setWatermarkFieldVisible, watermarkFieldOrder, setWatermarkFieldOrder, upload]);
193
371
  const watermarkPreviewRef = React.useRef(null);
194
372
  React.useEffect(() => {
195
373
  const el = watermarkPreviewRef.current;
196
374
  if (!el)
197
375
  return;
198
- el.style.fontSize = `${Math.max(10, watermarkSize / 5)}px`;
199
- el.style.opacity = String(watermarkOpacity / 100);
200
- }, [watermarkSize, watermarkOpacity]);
201
- // ⑦ Fees — all read/written under commissions key
202
- const [laborHourlyRate, setLaborHourlyRate] = React.useState(200);
203
- const [laborMaxHoursPerDay, setLaborMaxHoursPerDay] = React.useState(6);
204
- // ⑯ EMI — site-wide installment settings
205
- const [emiEnabled, setEmiEnabled] = React.useState(false);
206
- const [emiMinOrderValue, setEmiMinOrderValue] = React.useState(10000);
207
- const [emiTenureOptionsText, setEmiTenureOptionsText] = React.useState("2,3,4,5,6");
208
- const [emiTokenPercent, setEmiTokenPercent] = React.useState(20);
209
- const [emiBillingDay, setEmiBillingDay] = React.useState(5);
210
- const [emiSurchargePercentPerMonth, setEmiSurchargePercentPerMonth] = React.useState(2);
211
- const [emiSurchargeSellerSharePercent, setEmiSurchargeSellerSharePercent] = React.useState(50);
212
- // ⑰ GST — Indian tax compliance
213
- const [gstEnabled, setGstEnabled] = React.useState(false);
214
- const [gstin, setGstin] = React.useState("");
215
- const [gstLegalName, setGstLegalName] = React.useState("");
216
- const [gstAddress, setGstAddress] = React.useState("");
217
- /*
218
- * Shown inline, live, and ONLY while the toggle is on — the same rule the
219
- * server enforces. `/api/admin/site` rejects the save, so without this the
220
- * admin would get a generic "save failed" with no indication of which of the
221
- * four fields it meant.
222
- *
223
- * Live rather than on-submit because the toggle is the action: an admin who
224
- * flips it on sees immediately what else is needed, instead of discovering
225
- * it after a round trip. Empty when the toggle is off, so an admin editing
226
- * their address with GST disabled is never shown errors about it
227
- * (Root Cause #74 — a summary that accuses before anything was attempted).
228
- */
229
- const gstProblems = React.useMemo(() => validateGstEnablement({
230
- enabled: gstEnabled,
231
- gstin,
232
- legalName: gstLegalName,
233
- address: gstAddress,
234
- }), [gstEnabled, gstin, gstLegalName, gstAddress]);
235
- const [platformFeePercent, setPlatformFeePercent] = React.useState(5);
236
- const [gstPercent, setGstPercent] = React.useState(18);
237
- const [minimumTransactionFee, setMinimumTransactionFee] = React.useState(0);
238
- const [platformFeeMax, setPlatformFeeMax] = React.useState(10);
239
- const [gatewayFeePercent, setGatewayFeePercent] = React.useState(2);
240
- const [payoutHoldDays, setPayoutHoldDays] = React.useState(7);
241
- const [minPayoutAmount, setMinPayoutAmount] = React.useState(100);
242
- const [auctionListingFee, setAuctionListingFee] = React.useState(0);
243
- const [preOrderListingFee, setPreOrderListingFee] = React.useState(0);
244
- const [featuredSlotFee, setFeaturedSlotFee] = React.useState(999);
245
- const [promotedSlotFee, setPromotedSlotFee] = React.useState(499);
246
- const [whatsappNotifyFeeEnabled, setWhatsappNotifyFeeEnabled] = React.useState(false);
247
- const [whatsappNotifyFee, setWhatsappNotifyFee] = React.useState(10);
248
- const [giftWrapFeeEnabled, setGiftWrapFeeEnabled] = React.useState(false);
249
- const [giftWrapFee, setGiftWrapFee] = React.useState(49);
250
- const [shipmentProtectionFeeEnabled, setShipmentProtectionFeeEnabled] = React.useState(false);
251
- /*
252
- * 🛑 D13 — these five had NO state, NO field and NO control, while
253
- * `updateSingleton` replaced the whole `commissions` map on every save. So
254
- * the first save of any commissions field DELETED them: sale protection
255
- * stopped being sold (a product we charge 3%, min ₹49 for) and COD handling
256
- * silently reverted to code defaults, both with no error.
257
- *
258
- * The repository now writes dotted paths, so an omitted key survives — but
259
- * the controls still have to exist, or CLAUDE.md's stated remediation
260
- * ("enable them at Admin → Site Settings → Commissions") remains impossible.
261
- * Defaults mirror the schema: sale protection ON at platform level, because
262
- * the platform tier defaults true and the SELLER tier is the opt-in.
263
- */
264
- const [saleProtectionFeeEnabled, setSaleProtectionFeeEnabled] = React.useState(true);
265
- const [saleProtectionFeePercent, setSaleProtectionFeePercent] = React.useState(3);
266
- const [saleProtectionFeeMin, setSaleProtectionFeeMin] = React.useState(49);
267
- const [codHandlingFeePercent, setCodHandlingFeePercent] = React.useState(10);
268
- const [codHandlingFeeCap, setCodHandlingFeeCap] = React.useState(200);
269
- const [shipmentProtectionFeePercent, setShipmentProtectionFeePercent] = React.useState(2);
270
- const [shipmentProtectionFeeMin, setShipmentProtectionFeeMin] = React.useState(30);
271
- const [codDepositPercent, setCodDepositPercent] = React.useState(10);
272
- const [sellerShippingFixed, setSellerShippingFixed] = React.useState(0);
273
- const [platformShippingPercent, setPlatformShippingPercent] = React.useState(10);
274
- const [platformShippingFixedMin, setPlatformShippingFixedMin] = React.useState(0);
275
- // ⑧ Integrations
276
- const [razorpayKeyId, setRazorpayKeyId] = React.useState("");
277
- const [razorpayKeySecret, setRazorpayKeySecret] = React.useState("");
278
- const [razorpayWebhookSecret, setRazorpayWebhookSecret] = React.useState("");
279
- const [phonepeClientId, setPhonepeClientId] = React.useState("");
280
- const [phonepeClientSecret, setPhonepeClientSecret] = React.useState("");
281
- const [phonepeClientVersion, setPhonepeClientVersion] = React.useState("1");
282
- const [phonepeEnvironment, setPhonepeEnvironment] = React.useState("sandbox");
283
- const [phonepeWebhookUsername, setPhonepeWebhookUsername] = React.useState("");
284
- const [phonepeWebhookPassword, setPhonepeWebhookPassword] = React.useState("");
285
- const [smtpHost, setSmtpHost] = React.useState("");
286
- const [smtpPort, setSmtpPort] = React.useState("587");
287
- const [smtpUser, setSmtpUser] = React.useState("");
288
- const [smtpFrom, setSmtpFrom] = React.useState("");
289
- const [googleMapsApiKey, setGoogleMapsApiKey] = React.useState("");
290
- const [googlePlaceId, setGooglePlaceId] = React.useState("");
291
- const [gaMeasurementId, setGaMeasurementId] = React.useState("");
292
- const [fbPixelId, setFbPixelId] = React.useState("");
293
- const [gtmContainerId, setGtmContainerId] = React.useState("");
294
- // D7b — Microsoft Clarity. Blank keeps it OFF; there is no enable toggle, and
295
- // the absence of an id IS the off state (the same shape as the other three).
296
- const [clarityProjectId, setClarityProjectId] = React.useState("");
297
- // Social platform API credentials (for Social Feed section)
298
- const [metaPageAccessToken, setMetaPageAccessToken] = React.useState("");
299
- const [metaPageId, setMetaPageId] = React.useState("");
300
- const [tiktokClientKey, setTiktokClientKey] = React.useState("");
301
- const [tiktokClientSecret, setTiktokClientSecret] = React.useState("");
302
- const [tiktokAccessToken, setTiktokAccessToken] = React.useState("");
303
- const [deviantartClientId, setDeviantartClientId] = React.useState("");
304
- const [deviantartClientSecret, setDeviantartClientSecret] = React.useState("");
305
- // ⑨ Shipping
306
- const [freeShippingThreshold, setFreeShippingThreshold] = React.useState(999);
307
- const [defaultCarrier, setDefaultCarrier] = React.useState("custom");
308
- const [maxDeliveryRadius, setMaxDeliveryRadius] = React.useState(0);
309
- // ⑨ Payment methods (siteSettings.payment — read by checkout for method eligibility)
310
- const [razorpayEnabled, setRazorpayEnabled] = React.useState(false);
311
- const [phonepeEnabled, setPhonepeEnabled] = React.useState(false);
312
- const [upiManualEnabled, setUpiManualEnabled] = React.useState(true);
313
- const [codEnabled, setCodEnabled] = React.useState(true);
314
- const [otpCheckoutThreshold, setOtpCheckoutThreshold] = React.useState(5000);
315
- const [codMaxOrderValue, setCodMaxOrderValue] = React.useState(COD_MAX_ORDER_VALUE_FALLBACK);
316
- // Per-listing-type / per-category-type visibility flags.
317
- const [listingTypeFlags, setListingTypeFlags] = React.useState({});
318
- const [categoryTypeFlags, setCategoryTypeFlags] = React.useState({});
319
- const [browsePageFlags, setBrowsePageFlags] = React.useState({});
320
- // Per-channel notification-type allowlists — empty array means "all types".
321
- const [notifEmailTypes, setNotifEmailTypes] = React.useState([]);
322
- const [notifWhatsappTypes, setNotifWhatsappTypes] = React.useState([]);
323
- // ⑩ Auction
324
- const [bidIncrementTiers, setBidIncrementTiers] = React.useState(DEFAULT_AUCTION_BID_INCREMENT_TIERS);
325
- const [autoExtendWindow, setAutoExtendWindow] = React.useState(5);
326
- const [settlementGrace, setSettlementGrace] = React.useState(24);
327
- // ⑪ Platform Limits
328
- const [maxProductsPerStore, setMaxProductsPerStore] = React.useState(100);
329
- const [maxCustomFields, setMaxCustomFields] = React.useState(50);
330
- const [orderCancelWindow, setOrderCancelWindow] = React.useState(24);
331
- // ⑫ Legal
332
- const [termsHtml, setTermsHtml] = React.useState("");
333
- const [privacyHtml, setPrivacyHtml] = React.useState("");
334
- const [refundHtml, setRefundHtml] = React.useState("");
335
- const [shippingPolicyHtml, setShippingPolicyHtml] = React.useState("");
336
- const [cookieHtml, setCookieHtml] = React.useState("");
337
- const [ethicsHtml, setEthicsHtml] = React.useState("");
338
- const [conductHtml, setConductHtml] = React.useState("");
339
- /*
340
- * 🛑 D19 — `cancellation` and `grievance` are declared on
341
- * `SiteSettingsDocument.legalPages` and were omitted from BOTH the load and
342
- * the payload here. Under the old wholesale-map replace that meant an
343
- * override written to either key was ERASED on the next Legal-tab save —
344
- * the same cause as D13, one group over, which is the evidence that the
345
- * repository fix (dotted paths) was the right level to fix it at.
346
- *
347
- * The grievance page in particular is a statutory channel, so an override
348
- * silently reverting to the bundled default is a compliance problem rather
349
- * than a content one.
350
- */
351
- const [cancellationHtml, setCancellationHtml] = React.useState("");
352
- const [grievanceHtml, setGrievanceHtml] = React.useState("");
353
- // ⑬ WhatsApp Business Cloud API (platform-level)
354
- const [waPhoneNumberId, setWaPhoneNumberId] = React.useState("");
355
- const [waCloudApiToken, setWaCloudApiToken] = React.useState("");
356
- const [waAdminNotifyNumbers, setWaAdminNotifyNumbers] = React.useState("");
357
- const [waTemplateLanguage, setWaTemplateLanguage] = React.useState("en");
358
- const [waTemplateOrderPlaced, setWaTemplateOrderPlaced] = React.useState("");
359
- const [waTemplateOrderConfirmed, setWaTemplateOrderConfirmed] = React.useState("");
360
- const [waTemplateOrderShipped, setWaTemplateOrderShipped] = React.useState("");
361
- const [waTemplateOrderDelivered, setWaTemplateOrderDelivered] = React.useState("");
362
- const [waTemplateOrderCancelled, setWaTemplateOrderCancelled] = React.useState("");
363
- const [waTemplateRefundInitiated, setWaTemplateRefundInitiated] = React.useState("");
364
- // ⓪ About
365
- const [aboutTitle, setAboutTitle] = React.useState("");
366
- const [aboutSubtitle, setAboutSubtitle] = React.useState("");
367
- const [aboutMissionTitle, setAboutMissionTitle] = React.useState("");
368
- const [aboutMissionText, setAboutMissionText] = React.useState("");
369
- const [aboutHowItWorksTitle, setAboutHowItWorksTitle] = React.useState("");
370
- const [aboutHowItems, setAboutHowItems] = React.useState([]);
371
- const [aboutValuesTitle, setAboutValuesTitle] = React.useState("");
372
- const [aboutValuesSubtitle, setAboutValuesSubtitle] = React.useState("");
373
- const [aboutValueItems, setAboutValueItems] = React.useState([]);
374
- const [aboutMilestonesTitle, setAboutMilestonesTitle] = React.useState("");
375
- const [aboutMilestones, setAboutMilestones] = React.useState([]);
376
- const [aboutTeamTitle, setAboutTeamTitle] = React.useState("");
377
- const [aboutTeamSubtitle, setAboutTeamSubtitle] = React.useState("");
378
- const [aboutTeamMembers, setAboutTeamMembers] = React.useState([]);
379
- const [aboutCtaTitle, setAboutCtaTitle] = React.useState("");
380
- const [aboutCtaSell, setAboutCtaSell] = React.useState("");
381
- const [aboutCtaShop, setAboutCtaShop] = React.useState("");
382
- // ⑭ Notification channels
383
- const [notifEmailEnabled, setNotifEmailEnabled] = React.useState(false);
384
- const [notifEmailMinPriority, setNotifEmailMinPriority] = React.useState("normal");
385
- const [notifWhatsappEnabled, setNotifWhatsappEnabled] = React.useState(false);
386
- const [notifWhatsappMinPriority, setNotifWhatsappMinPriority] = React.useState("high");
387
- const [notifWhatsappOtpEnabled, setNotifWhatsappOtpEnabled] = React.useState(false);
388
- const [notifSmsEnabled, setNotifSmsEnabled] = React.useState(false);
389
- const [notifSmsMinPriority, setNotifSmsMinPriority] = React.useState("high");
390
- // Resend API key + sender identity (used by the email channel)
391
- const [resendApiKey, setResendApiKey] = React.useState("");
392
- const [notifFromEmail, setNotifFromEmail] = React.useState("");
393
- const [notifFromName, setNotifFromName] = React.useState("");
394
- // Daily ops digest — recipients are edited as one-per-line text, split on save.
395
- const [digestEnabled, setDigestEnabled] = React.useState(false);
396
- const [digestRecipients, setDigestRecipients] = React.useState("");
397
- /*
398
- * Outbound messaging: the kill switch and the daily ceiling.
399
- *
400
- * `emailEnabled` suppresses USER-facing mail only. Staff mail — the daily
401
- * digest, the payout summary — keeps flowing regardless, because switching
402
- * off customer email must never also blind the operator.
403
- */
404
- const [msgEmailEnabled, setMsgEmailEnabled] = React.useState(false);
405
- const [msgWhatsappEnabled, setMsgWhatsappEnabled] = React.useState(false);
406
- const [msgCeilingEmail, setMsgCeilingEmail] = React.useState(80);
407
- const [msgCeilingWhatsapp, setMsgCeilingWhatsapp] = React.useState(200);
376
+ el.style.fontSize = `${Math.max(10, watermarkForm.watermarkSize / 5)}px`;
377
+ el.style.opacity = String(watermarkForm.watermarkOpacity / 100);
378
+ }, [watermarkForm.watermarkSize, watermarkForm.watermarkOpacity]);
379
+ // ⑮ Procurement — seventh tab migrated to the Universal Template System,
380
+ // 2026-11-04. Two useState calls collapsed into one combined object.
381
+ const [procurementForm, setProcurementForm] = React.useState({
382
+ laborHourlyRate: 200, laborMaxHoursPerDay: 6,
383
+ });
384
+ const { fields: procurementVisibilityFields, setVisible: setProcurementFieldVisible, fieldOrder: procurementFieldOrder, setFieldOrder: setProcurementFieldOrder, } = useFieldVisibility("admin-site-settings-procurement");
385
+ const procurementSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsProcurementFormSchema, {
386
+ fieldVisibility: procurementVisibilityFields,
387
+ editMode,
388
+ onToggleFieldVisibility: setProcurementFieldVisible,
389
+ fieldOrder: procurementFieldOrder,
390
+ onMoveField: (fieldName, neighborName) => setProcurementFieldOrder(swapFieldOrder(procurementFieldOrder, resolveFields(siteSettingsProcurementFormSchema).map((f) => f.name), fieldName, neighborName)),
391
+ }), [procurementVisibilityFields, editMode, setProcurementFieldVisible, procurementFieldOrder, setProcurementFieldOrder]);
392
+ // ⑯ EMI — twelfth tab migrated to the Universal Template System,
393
+ // 2026-11-04. Seven useState calls collapsed into one combined object.
394
+ const [emiForm, setEmiForm] = React.useState({
395
+ emiEnabled: false, emiMinOrderValue: 10000, emiTenureOptionsText: "2,3,4,5,6",
396
+ emiTokenPercent: 20, emiBillingDay: 5,
397
+ emiSurchargePercentPerMonth: 2, emiSurchargeSellerSharePercent: 50,
398
+ });
399
+ const { fields: emiVisibilityFields, setVisible: setEmiFieldVisible, fieldOrder: emiFieldOrder, setFieldOrder: setEmiFieldOrder, } = useFieldVisibility("admin-site-settings-emi");
400
+ const emiSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsEmiFormSchema, {
401
+ fieldVisibility: emiVisibilityFields,
402
+ editMode,
403
+ onToggleFieldVisibility: setEmiFieldVisible,
404
+ fieldOrder: emiFieldOrder,
405
+ onMoveField: (fieldName, neighborName) => setEmiFieldOrder(swapFieldOrder(emiFieldOrder, resolveFields(siteSettingsEmiFormSchema).map((f) => f.name), fieldName, neighborName)),
406
+ }), [emiVisibilityFields, editMode, setEmiFieldVisible, emiFieldOrder, setEmiFieldOrder]);
407
+ // ⑰ GST — eleventh tab migrated to the Universal Template System,
408
+ // 2026-11-04. Four useState calls collapsed into one combined object.
409
+ //
410
+ // `validateGstEnablement()` is shown inline, live, and ONLY while the
411
+ // toggle is on — the same rule the server enforces. `/api/admin/site`
412
+ // rejects the save, so without this the admin would get a generic "save
413
+ // failed" with no indication of which of the four fields it meant. Live
414
+ // rather than on-submit because the toggle is the action: an admin who
415
+ // flips it on sees immediately what else is needed, instead of
416
+ // discovering it after a round trip. Empty when the toggle is off, so an
417
+ // admin editing their address with GST disabled is never shown errors
418
+ // about it (Root Cause #74 — a summary that accuses before anything was
419
+ // attempted). Computed LIVE inside each custom renderer below, against
420
+ // that renderer's own `values` parameter, rather than a separate
421
+ // `useMemo` — simpler, and provably reactive to exactly what's on screen.
422
+ const [gstForm, setGstForm] = React.useState({
423
+ gstEnabled: false, gstin: "", gstLegalName: "", gstAddress: "",
424
+ });
425
+ const { fields: gstVisibilityFields, setVisible: setGstFieldVisible, fieldOrder: gstFieldOrder, setFieldOrder: setGstFieldOrder, } = useFieldVisibility("admin-site-settings-gst");
426
+ const gstSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsGstFormSchema, {
427
+ renderers: {
428
+ gstin: ({ values, onChange }) => {
429
+ const problems = validateGstEnablement({
430
+ enabled: Boolean(values.gstEnabled),
431
+ gstin: values.gstin,
432
+ legalName: values.gstLegalName,
433
+ address: values.gstAddress,
434
+ });
435
+ return (_jsx(FieldInput, { name: "gstin", label: "GSTIN", hint: "15-character GST Identification Number.", error: problems.gstin, value: values.gstin ?? "", onChange: (v) => onChange({ gstin: v }), placeholder: "29AAAAA0000A1Z5", maxLength: 15 }));
436
+ },
437
+ gstLegalName: ({ values, onChange }) => {
438
+ const problems = validateGstEnablement({
439
+ enabled: Boolean(values.gstEnabled),
440
+ gstin: values.gstin,
441
+ legalName: values.gstLegalName,
442
+ address: values.gstAddress,
443
+ });
444
+ return (_jsx(FieldInput, { name: "gstLegalName", label: "Legal name", hint: "Registered business name for invoices.", error: problems.legalName, value: values.gstLegalName ?? "", onChange: (v) => onChange({ gstLegalName: v }), placeholder: `${getBrandName()} Pvt Ltd` }));
445
+ },
446
+ gstAddress: ({ values, onChange }) => {
447
+ const problems = validateGstEnablement({
448
+ enabled: Boolean(values.gstEnabled),
449
+ gstin: values.gstin,
450
+ legalName: values.gstLegalName,
451
+ address: values.gstAddress,
452
+ });
453
+ return (_jsx(FieldTextarea, { name: "gstAddress", label: "Registered address", error: problems.address, value: values.gstAddress ?? "", onChange: (v) => onChange({ gstAddress: v }), placeholder: "Registered business address for GST invoices\u2026", rows: 3 }));
454
+ },
455
+ },
456
+ fieldVisibility: gstVisibilityFields,
457
+ editMode,
458
+ onToggleFieldVisibility: setGstFieldVisible,
459
+ fieldOrder: gstFieldOrder,
460
+ onMoveField: (fieldName, neighborName) => setGstFieldOrder(swapFieldOrder(gstFieldOrder, resolveFields(siteSettingsGstFormSchema).map((f) => f.name), fieldName, neighborName)),
461
+ }), [gstVisibilityFields, editMode, setGstFieldVisible, gstFieldOrder, setGstFieldOrder]);
462
+ // ⑦ Fees & Commissions — sixth tab migrated to the Universal Template
463
+ // System, 2026-11-04. Twenty-four useState calls collapsed into one
464
+ // combined object. 🛑 D13 — `saleProtectionFee*`/`codHandlingFee*` had NO
465
+ // state, NO field and NO control at all until that fix, while
466
+ // `updateSingleton` replaced the whole `commissions` map on every save —
467
+ // so the first save of any commissions field silently deleted them (sale
468
+ // protection stopped being sold, COD handling reverted to code defaults).
469
+ // The repository now writes dotted paths, so an omitted key survives, but
470
+ // the controls still have to exist. `saleProtectionFeeEnabled` defaults
471
+ // true to match the platform-tier default (the SELLER tier is the opt-in).
472
+ const [feesForm, setFeesForm] = React.useState({
473
+ platformFeePercent: 5, gstPercent: 18, minimumTransactionFee: 0, platformFeeMax: 10,
474
+ gatewayFeePercent: 2, payoutHoldDays: 7, minPayoutAmount: 100,
475
+ collectorDropListingFee: 0, preOrderListingFee: 0, featuredSlotFee: 999, promotedSlotFee: 499,
476
+ codDepositPercent: 10,
477
+ whatsappNotifyFeeEnabled: false, whatsappNotifyFee: 10,
478
+ giftWrapFeeEnabled: false, giftWrapFee: 49,
479
+ shipmentProtectionFeeEnabled: false, shipmentProtectionFeePercent: 2, shipmentProtectionFeeMin: 30,
480
+ saleProtectionFeeEnabled: true, saleProtectionFeePercent: 3, saleProtectionFeeMin: 49,
481
+ codHandlingFeePercent: 10, codHandlingFeeCap: 200,
482
+ });
483
+ const { fields: feesVisibilityFields, setVisible: setFeesFieldVisible, fieldOrder: feesFieldOrder, setFieldOrder: setFeesFieldOrder, } = useFieldVisibility("admin-site-settings-fees");
484
+ const feesSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsFeesFormSchema, {
485
+ fieldVisibility: feesVisibilityFields,
486
+ editMode,
487
+ onToggleFieldVisibility: setFeesFieldVisible,
488
+ fieldOrder: feesFieldOrder,
489
+ onMoveField: (fieldName, neighborName) => setFeesFieldOrder(swapFieldOrder(feesFieldOrder, resolveFields(siteSettingsFeesFormSchema).map((f) => f.name), fieldName, neighborName)),
490
+ }), [feesVisibilityFields, editMode, setFeesFieldVisible, feesFieldOrder, setFeesFieldOrder]);
491
+ // ⑧ Integrations — fifteenth tab migrated to the Universal Template
492
+ // System, 2026-11-04, and the largest by field count (30). Thirty
493
+ // useState calls collapsed into one combined object.
494
+ //
495
+ // D7b — Microsoft Clarity. Blank keeps it OFF; there is no enable toggle,
496
+ // and the absence of an id IS the off state (the same shape as the other
497
+ // three analytics fields).
498
+ const [integrationsForm, setIntegrationsForm] = React.useState({
499
+ razorpayKeyId: "", razorpayKeySecret: "", razorpayWebhookSecret: "",
500
+ cashfreeAppId: "", cashfreeSecretKey: "", cashfreeEnvironment: "sandbox",
501
+ phonepeClientId: "", phonepeClientSecret: "", phonepeClientVersion: "1",
502
+ phonepeEnvironment: "sandbox", phonepeWebhookUsername: "", phonepeWebhookPassword: "",
503
+ smtpHost: "", smtpPort: "587", smtpUser: "", smtpFrom: "",
504
+ googleMapsApiKey: "", googlePlaceId: "",
505
+ gaMeasurementId: "", fbPixelId: "", gtmContainerId: "", clarityProjectId: "",
506
+ metaPageAccessToken: "", metaPageId: "",
507
+ tiktokClientKey: "", tiktokClientSecret: "", tiktokAccessToken: "",
508
+ deviantartClientId: "", deviantartClientSecret: "",
509
+ });
510
+ const { fields: integrationsVisibilityFields, setVisible: setIntegrationsFieldVisible, fieldOrder: integrationsFieldOrder, setFieldOrder: setIntegrationsFieldOrder, } = useFieldVisibility("admin-site-settings-integrations");
511
+ const integrationsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsIntegrationsFormSchema, {
512
+ renderers: {
513
+ ...Object.fromEntries(MASKED_CREDENTIAL_FIELDS.map(({ name, label, placeholder }) => [
514
+ name,
515
+ ({ values, onChange }) => (_jsx(MaskedInput, { label: label, value: values[name] ?? "", onChange: (v) => onChange({ [name]: v }), placeholder: placeholder })),
516
+ ])),
517
+ },
518
+ options: {
519
+ phonepeEnvironment: GATEWAY_ENVIRONMENT_OPTIONS,
520
+ cashfreeEnvironment: GATEWAY_ENVIRONMENT_OPTIONS,
521
+ },
522
+ fieldVisibility: integrationsVisibilityFields,
523
+ editMode,
524
+ onToggleFieldVisibility: setIntegrationsFieldVisible,
525
+ fieldOrder: integrationsFieldOrder,
526
+ onMoveField: (fieldName, neighborName) => setIntegrationsFieldOrder(swapFieldOrder(integrationsFieldOrder, resolveFields(siteSettingsIntegrationsFormSchema).map((f) => f.name), fieldName, neighborName)),
527
+ }), [integrationsVisibilityFields, editMode, setIntegrationsFieldVisible, integrationsFieldOrder, setIntegrationsFieldOrder]);
528
+ // ⑨ Shipping (Payment methods + Shipping Defaults + Seller shipping charge
529
+ // defaults) — tenth tab migrated to the Universal Template System,
530
+ // 2026-11-04. Fourteen useState calls collapsed into one combined object,
531
+ // including the 3 `commissions.*` fields shared with the Fees tab (its
532
+ // buildFullPayload() spread now reads them from `shippingForm` instead of
533
+ // bare vars — see that schema's own header for the seam).
534
+ //
535
+ // 🛑 `platformStoreId` defaults to EMPTY, which means "every store is
536
+ // third-party" and therefore refuses online collection for every cart.
537
+ // That is the fail-closed direction and it must not be "helpfully"
538
+ // defaulted to a store id here — a wrong guess would authorise collecting
539
+ // another seller's money into the platform's own account (the RBI
540
+ // commingling), and it would present as a completely successful checkout.
541
+ const [shippingForm, setShippingForm] = React.useState({
542
+ razorpayEnabled: false, phonepeEnabled: false, cashfreeEnabled: false,
543
+ platformStoreId: "", upiManualEnabled: true, codEnabled: true,
544
+ freeShippingThreshold: 999, defaultCarrier: "custom", maxDeliveryRadius: 0,
545
+ codMaxOrderValue: COD_MAX_ORDER_VALUE_FALLBACK, otpCheckoutThreshold: 5000,
546
+ sellerShippingFixed: 0, platformShippingPercent: 10, platformShippingFixedMin: 0,
547
+ });
548
+ const { fields: shippingVisibilityFields, setVisible: setShippingFieldVisible, fieldOrder: shippingFieldOrder, setFieldOrder: setShippingFieldOrder, } = useFieldVisibility("admin-site-settings-shipping");
549
+ const shippingSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsShippingFormSchema, {
550
+ options: { defaultCarrier: CARRIER_OPTIONS },
551
+ renderers: {
552
+ phonepeEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-phonepe-enabled", ...props }),
553
+ upiManualEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-manual-payment-enabled", ...props }),
554
+ codEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-cod-enabled", ...props }),
555
+ },
556
+ fieldVisibility: shippingVisibilityFields,
557
+ editMode,
558
+ onToggleFieldVisibility: setShippingFieldVisible,
559
+ fieldOrder: shippingFieldOrder,
560
+ onMoveField: (fieldName, neighborName) => setShippingFieldOrder(swapFieldOrder(shippingFieldOrder, resolveFields(siteSettingsShippingFormSchema).map((f) => f.name), fieldName, neighborName)),
561
+ }), [shippingVisibilityFields, editMode, setShippingFieldVisible, shippingFieldOrder, setShippingFieldOrder]);
562
+ // ⑱ Listings — seventeenth tab migrated to the Universal Template
563
+ // System, 2026-11-04. Three Record<string, boolean> useState calls
564
+ // collapsed into one combined object. All three are DYNAMIC
565
+ // registry-driven toggle grids (keys come from LISTING_TYPE_KEYS/
566
+ // CATEGORY_TYPE_KEYS/BROWSE_PAGE_KEYS, declared further down this
567
+ // component body) rather than fixed scalar fields — see
568
+ // site-settings-listings-form.ts's header for why that's a Record field
569
+ // with a custom renderer rather than per-key schema fields.
570
+ const [listingsForm, setListingsForm] = React.useState({
571
+ listingTypeFlags: {}, categoryTypeFlags: {}, browsePageFlags: {},
572
+ });
573
+ const { fields: listingsVisibilityFields, setVisible: setListingsFieldVisible, fieldOrder: listingsFieldOrder, setFieldOrder: setListingsFieldOrder, } = useFieldVisibility("admin-site-settings-listings");
574
+ const listingsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsListingsFormSchema, {
575
+ renderers: {
576
+ /*
577
+ * 🛑 A THREE-STATE SELECT, not a Toggle — all three grids.
578
+ *
579
+ * Every one of these axes stores `boolean | "unlisted"`, and
580
+ * `"unlisted"` is the state the owner asked for on 2026-11-07:
581
+ * *"do not show their links or filters or any way to jump to them,
582
+ * but do not 404 their pages."* A `Toggle` cannot carry it. Worse
583
+ * than cannot: a stored `"unlisted"` is a truthy STRING, so the
584
+ * toggle drew it fully ON — indistinguishable from "listed" — and
585
+ * flipping it wrote a boolean, destroying the state with no way to
586
+ * put it back from this screen. The only way to set it was editing
587
+ * Firestore by hand, which is precisely the "code change to flip a
588
+ * flag" the capability model exists to abolish.
589
+ *
590
+ * Labels come from `FLAG_CHOICE_OPTIONS` and say what each state
591
+ * DOES, because the one thing an admin must not get wrong here is
592
+ * that "unlisted" keeps serving the page and "off" 404s it.
593
+ */
594
+ listingTypeFlags: ({ values, onChange }) => {
595
+ const flags = values.listingTypeFlags ?? {};
596
+ return (_jsx(Grid, { cols: 2, gap: "sm", children: LISTING_TYPE_KEYS.map((key) => (_jsx(Select, {
597
+ // The plugin's own display label, not the raw key — the
598
+ // literal version rendered "pre-order" and
599
+ // "digital-code" at an admin. 1A-v — the primary action
600
+ // kind appended so an admin can tell at a glance what
601
+ // disabling this type actually turns off (bid/reserve/
602
+ // offer, not just "buy").
603
+ label: `${pluginFor(key).typeLabel} — ${ACTION_KIND_LABELS[pluginFor(key).primaryActionKind]}`, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
604
+ listingTypeFlags: {
605
+ ...flags,
606
+ [key]: choiceToFlagValue(choice),
607
+ },
608
+ }) }, key))) }));
609
+ },
610
+ categoryTypeFlags: ({ values, onChange }) => {
611
+ const flags = values.categoryTypeFlags ?? {};
612
+ return (_jsx(Grid, { cols: 2, gap: "sm", children: CATEGORY_TYPE_KEYS.map((key) => (_jsx(Select, { label: key, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
613
+ categoryTypeFlags: {
614
+ ...flags,
615
+ [key]: choiceToFlagValue(choice),
616
+ },
617
+ }) }, key))) }));
618
+ },
619
+ browsePageFlags: ({ values, onChange }) => {
620
+ const flags = values.browsePageFlags ?? {};
621
+ return (_jsx(Grid, { cols: 2, gap: "sm", children: BROWSE_PAGE_KEYS.map((key) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Select, { label: BROWSE_PAGE_META[key]?.label ?? key, value: flagValueToChoice(flags[key]), options: [...FLAG_CHOICE_OPTIONS], onValueChange: (choice) => onChange({
622
+ browsePageFlags: {
623
+ ...flags,
624
+ [key]: choiceToFlagValue(choice),
625
+ },
626
+ }) }), _jsx(Text, { size: "xs", color: "muted", children: BROWSE_PAGE_META[key]?.hint })] }, key))) }));
627
+ },
628
+ },
629
+ fieldVisibility: listingsVisibilityFields,
630
+ editMode,
631
+ onToggleFieldVisibility: setListingsFieldVisible,
632
+ fieldOrder: listingsFieldOrder,
633
+ onMoveField: (fieldName, neighborName) => setListingsFieldOrder(swapFieldOrder(listingsFieldOrder, resolveFields(siteSettingsListingsFormSchema).map((f) => f.name), fieldName, neighborName)),
634
+ }), [listingsVisibilityFields, editMode, setListingsFieldVisible, listingsFieldOrder, setListingsFieldOrder]);
635
+ // ⑩ Collector Drop — sixteenth tab migrated to the Universal Template
636
+ // System, 2026-11-04. Three useState calls collapsed into one combined
637
+ // object. `bidIncrementTiers` keeps its original hand-written add/remove
638
+ // UI as a custom renderer — see site-settings-collector-drop-form.ts's
639
+ // header for why it does not fit the generic `<Repeater>` primitive.
640
+ const [collectorDropForm, setCollectorDropForm] = React.useState({
641
+ bidIncrementTiers: DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS,
642
+ autoExtendWindow: 5, settlementGrace: 24,
643
+ });
644
+ const { fields: collectorDropVisibilityFields, setVisible: setCollectorDropFieldVisible, fieldOrder: collectorDropFieldOrder, setFieldOrder: setCollectorDropFieldOrder, } = useFieldVisibility("admin-site-settings-collector-drop");
645
+ const collectorDropSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsCollectorDropFormSchema, {
646
+ renderers: {
647
+ bidIncrementTiers: ({ values, onChange }) => {
648
+ const tiers = values.bidIncrementTiers ?? [];
649
+ const setTiers = (next) => onChange({ bidIncrementTiers: next });
650
+ return (_jsxs(Stack, { gap: "sm", children: [tiers.map((tier, i) => {
651
+ const isLast = i === tiers.length - 1;
652
+ return (_jsxs(Grid, { align: "end", gap: "xs", className: "grid-cols-12", children: [_jsx(Div, { className: "col-span-5", children: isLast ? (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", weight: "medium", className: "mb-1", children: "Up to (\u20B9)" }), _jsx(Text, { size: "sm", color: "muted", children: "and above" })] })) : (_jsx(Input, { label: "Up to (\u20B9)", type: "number", min: 1, value: String(tier.upTo ?? ""), onChange: (e) => setTiers(tiers.map((t, j) => (j === i ? { ...t, upTo: parseInt(e.target.value) || 0 } : t))) })) }), _jsx(Div, { className: "col-span-5", children: _jsx(Input, { label: "Increment (\u20B9)", type: "number", min: 1, value: String(tier.increment), onChange: (e) => setTiers(tiers.map((t, j) => (j === i ? { ...t, increment: parseInt(e.target.value) || 0 } : t))) }) }), _jsx(Row, { centered: true, className: "col-span-2", padding: "b-xs", children: _jsx(Button, { variant: "ghost", type: "button", disabled: tiers.length <= 1, onClick: () => setTiers(tiers.filter((_, j) => j !== i)), "aria-label": "Remove tier", children: "\u00D7" }) })] }, i));
653
+ }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setTiers([
654
+ ...tiers.slice(0, -1),
655
+ { upTo: 100, increment: 10 },
656
+ tiers[tiers.length - 1] ?? { upTo: null, increment: 1000 },
657
+ ]), children: "+ Add tier" })] }));
658
+ },
659
+ },
660
+ fieldVisibility: collectorDropVisibilityFields,
661
+ editMode,
662
+ onToggleFieldVisibility: setCollectorDropFieldVisible,
663
+ fieldOrder: collectorDropFieldOrder,
664
+ onMoveField: (fieldName, neighborName) => setCollectorDropFieldOrder(swapFieldOrder(collectorDropFieldOrder, resolveFields(siteSettingsCollectorDropFormSchema).map((f) => f.name), fieldName, neighborName)),
665
+ }), [collectorDropVisibilityFields, editMode, setCollectorDropFieldVisible, collectorDropFieldOrder, setCollectorDropFieldOrder]);
666
+ // ⑪ Platform Limits — eighth tab migrated to the Universal Template
667
+ // System, 2026-11-04. Three useState calls collapsed into one combined
668
+ // object.
669
+ const [limitsForm, setLimitsForm] = React.useState({
670
+ maxProductsPerStore: 100, maxCustomFields: 50, orderCancelWindow: 24,
671
+ });
672
+ const { fields: limitsVisibilityFields, setVisible: setLimitsFieldVisible, fieldOrder: limitsFieldOrder, setFieldOrder: setLimitsFieldOrder, } = useFieldVisibility("admin-site-settings-limits");
673
+ const limitsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsLimitsFormSchema, {
674
+ fieldVisibility: limitsVisibilityFields,
675
+ editMode,
676
+ onToggleFieldVisibility: setLimitsFieldVisible,
677
+ fieldOrder: limitsFieldOrder,
678
+ onMoveField: (fieldName, neighborName) => setLimitsFieldOrder(swapFieldOrder(limitsFieldOrder, resolveFields(siteSettingsLimitsFormSchema).map((f) => f.name), fieldName, neighborName)),
679
+ }), [limitsVisibilityFields, editMode, setLimitsFieldVisible, limitsFieldOrder, setLimitsFieldOrder]);
680
+ // ⑫ Legal — thirteenth tab migrated to the Universal Template System,
681
+ // 2026-11-04. Nine useState calls collapsed into one combined object.
682
+ //
683
+ // 🛑 D19 — `cancellation` and `grievance` are declared on
684
+ // `SiteSettingsDocument.legalPages` and were once omitted from BOTH the
685
+ // load and the payload here. Under the old wholesale-map replace that
686
+ // meant an override written to either key was ERASED on the next
687
+ // Legal-tab save — the same cause as D13, one group over, which is the
688
+ // evidence that the repository fix (dotted paths) was the right level to
689
+ // fix it at. The grievance page in particular is a statutory channel, so
690
+ // an override silently reverting to the bundled default is a compliance
691
+ // problem rather than a content one. Both are carried unconditionally
692
+ // below, same as every other field.
693
+ const [legalForm, setLegalForm] = React.useState({
694
+ termsHtml: "", privacyHtml: "", refundHtml: "", shippingPolicyHtml: "",
695
+ cookieHtml: "", ethicsHtml: "", conductHtml: "", cancellationHtml: "", grievanceHtml: "",
696
+ });
697
+ const { fields: legalVisibilityFields, setVisible: setLegalFieldVisible, fieldOrder: legalFieldOrder, setFieldOrder: setLegalFieldOrder, } = useFieldVisibility("admin-site-settings-legal");
698
+ const legalSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsLegalFormSchema, {
699
+ renderers: Object.fromEntries(LEGAL_PAGE_FIELDS.map(({ name, label }) => [
700
+ name,
701
+ ({ values, onChange }) => (_jsx(Textarea, { label: label, value: values[name] ?? "", onChange: (e) => onChange({ [name]: e.target.value }), placeholder: `Enter ${label} HTML here…`, rows: 6, className: "font-mono" })),
702
+ ])),
703
+ fieldVisibility: legalVisibilityFields,
704
+ editMode,
705
+ onToggleFieldVisibility: setLegalFieldVisible,
706
+ fieldOrder: legalFieldOrder,
707
+ onMoveField: (fieldName, neighborName) => setLegalFieldOrder(swapFieldOrder(legalFieldOrder, resolveFields(siteSettingsLegalFormSchema).map((f) => f.name), fieldName, neighborName)),
708
+ }), [legalVisibilityFields, editMode, setLegalFieldVisible, legalFieldOrder, setLegalFieldOrder]);
709
+ // ⑬ WhatsApp Business Cloud API (platform-level) — fourteenth tab
710
+ // migrated to the Universal Template System, 2026-11-04. Ten useState
711
+ // calls collapsed into one combined object.
712
+ const [whatsappForm, setWhatsappForm] = React.useState({
713
+ waPhoneNumberId: "", waCloudApiToken: "", waAdminNotifyNumbers: "",
714
+ waTemplateLanguage: "en", waTemplateOrderPlaced: "", waTemplateOrderConfirmed: "",
715
+ waTemplateOrderShipped: "", waTemplateOrderDelivered: "",
716
+ waTemplateOrderCancelled: "", waTemplateRefundInitiated: "",
717
+ });
718
+ const { fields: whatsappVisibilityFields, setVisible: setWhatsappFieldVisible, fieldOrder: whatsappFieldOrder, setFieldOrder: setWhatsappFieldOrder, } = useFieldVisibility("admin-site-settings-whatsapp");
719
+ const whatsappSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsWhatsappFormSchema, {
720
+ renderers: {
721
+ waCloudApiToken: ({ values, onChange }) => (_jsx(MaskedInput, { label: "Cloud API System User Token", value: values.waCloudApiToken ?? "", onChange: (v) => onChange({ waCloudApiToken: v }), placeholder: "EAAxxxxxxxx\u2026", helperText: "Long-lived system user access token with WhatsApp Business permissions" })),
722
+ },
723
+ fieldVisibility: whatsappVisibilityFields,
724
+ editMode,
725
+ onToggleFieldVisibility: setWhatsappFieldVisible,
726
+ fieldOrder: whatsappFieldOrder,
727
+ onMoveField: (fieldName, neighborName) => setWhatsappFieldOrder(swapFieldOrder(whatsappFieldOrder, resolveFields(siteSettingsWhatsappFormSchema).map((f) => f.name), fieldName, neighborName)),
728
+ }), [whatsappVisibilityFields, editMode, setWhatsappFieldVisible, whatsappFieldOrder, setWhatsappFieldOrder]);
729
+ // ⓪ About — nineteenth (and last field-by-field) tab migrated to the
730
+ // Universal Template System, 2026-11-04. Seventeen useState calls
731
+ // collapsed into one combined object. The four list fields use the
732
+ // generic `<Repeater>` primitive — see site-settings-about-form.ts's
733
+ // header for why that's the right fit here (unlike Collector Drop's
734
+ // bid-tier array, none of these four carry special last-row rules).
735
+ const [aboutForm, setAboutForm] = React.useState({
736
+ aboutTitle: "", aboutSubtitle: "", aboutMissionTitle: "", aboutMissionText: "",
737
+ aboutHowItWorksTitle: "", aboutHowItems: [],
738
+ aboutValuesTitle: "", aboutValuesSubtitle: "", aboutValueItems: [],
739
+ aboutMilestonesTitle: "", aboutMilestones: [],
740
+ aboutTeamTitle: "", aboutTeamSubtitle: "", aboutTeamMembers: [],
741
+ aboutCtaTitle: "", aboutCtaSell: "", aboutCtaShop: "",
742
+ });
743
+ const { fields: aboutVisibilityFields, setVisible: setAboutFieldVisible, fieldOrder: aboutFieldOrder, setFieldOrder: setAboutFieldOrder, } = useFieldVisibility("admin-site-settings-about");
744
+ const aboutSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsAboutFormSchema, {
745
+ renderers: {
746
+ aboutHowItems: ({ values, onChange }) => {
747
+ const rows = values.aboutHowItems ?? [];
748
+ return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutHowItems: next }), blank: () => ({ title: "", text: "", icon: "✨", tone: "indigo" }), addLabel: "+ Add step", max: 6, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Icon (emoji)", value: row.icon, onChange: (e) => set({ icon: e.target.value }), placeholder: "\uD83D\uDED2" }), _jsx(Input, { label: "Title", value: row.title, onChange: (e) => set({ title: e.target.value }) }), _jsx(Textarea, { value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 })] })) }));
749
+ },
750
+ aboutValueItems: ({ values, onChange }) => {
751
+ const rows = values.aboutValueItems ?? [];
752
+ return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutValueItems: next }), blank: () => ({ title: "", text: "", icon: "✨" }), addLabel: "+ Add value", max: 8, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Icon (emoji)", value: row.icon, onChange: (e) => set({ icon: e.target.value }), placeholder: "\uD83D\uDEE1\uFE0F" }), _jsx(Input, { label: "Title", value: row.title, onChange: (e) => set({ title: e.target.value }) }), _jsx(Textarea, { label: "Text", value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 }), _jsx(Textarea, { label: "Detail (optional)", value: row.detail ?? "", onChange: (e) => set({ detail: e.target.value }), rows: 2, placeholder: "How this value is actually enforced" })] })) }));
753
+ },
754
+ aboutMilestones: ({ values, onChange }) => {
755
+ const rows = values.aboutMilestones ?? [];
756
+ return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutMilestones: next }), blank: () => ({ year: "", text: "" }), addLabel: "+ Add milestone", max: 10, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(Input, { label: "Year", value: row.year, onChange: (e) => set({ year: e.target.value }), placeholder: "2024" }), _jsx(Textarea, { value: row.text, onChange: (e) => set({ text: e.target.value }), rows: 2 })] })) }));
757
+ },
758
+ aboutTeamMembers: ({ values, onChange }) => {
759
+ const rows = values.aboutTeamMembers ?? [];
760
+ return (_jsx(Repeater, { rows: rows, onChange: (next) => onChange({ aboutTeamMembers: next }), blank: () => ({ name: "", role: "", bio: "" }), addLabel: "+ Add team member", max: 12, renderRow: (row, set) => (_jsxs(_Fragment, { children: [_jsx(ImageUpload, { label: "Photo", currentImage: row.photoUrl, onUpload: (file) => upload(file, "store"), onChange: (url) => set({ photoUrl: url }) }), _jsx(Input, { label: "Name", value: row.name, onChange: (e) => set({ name: e.target.value }) }), _jsx(Input, { label: "Role", value: row.role, onChange: (e) => set({ role: e.target.value }), placeholder: "Founder & Developer" }), _jsx(Textarea, { value: row.bio, onChange: (e) => set({ bio: e.target.value }), rows: 3 }), _jsxs(Row, { gap: "md", children: [_jsx(Toggle, { label: "Founder", checked: !!row.isFounder, onChange: (v) => set({ isFounder: v }) }), _jsx(Toggle, { label: "Developer", checked: !!row.isDeveloper, onChange: (v) => set({ isDeveloper: v }) })] })] })) }));
761
+ },
762
+ },
763
+ fieldVisibility: aboutVisibilityFields,
764
+ editMode,
765
+ onToggleFieldVisibility: setAboutFieldVisible,
766
+ fieldOrder: aboutFieldOrder,
767
+ onMoveField: (fieldName, neighborName) => setAboutFieldOrder(swapFieldOrder(aboutFieldOrder, resolveFields(siteSettingsAboutFormSchema).map((f) => f.name), fieldName, neighborName)),
768
+ }), [aboutVisibilityFields, editMode, setAboutFieldVisible, aboutFieldOrder, setAboutFieldOrder, upload]);
769
+ // ⑭ Notification channels — ninth tab migrated to the Universal Template
770
+ // System, 2026-11-04. Eighteen useState calls collapsed into one combined
771
+ // object. Writes across FOUR save-payload groups in buildFullPayload()
772
+ // (`messaging`, `notificationChannels`, part of `emailSettings`, and
773
+ // `credentials.resendApiKey`) — see site-settings-notifications-form.ts's
774
+ // header for the full breakdown.
775
+ //
776
+ // `msgEmailEnabled`/`msgWhatsappEnabled` suppress USER-facing mail only.
777
+ // Staff mail — the daily digest, the payout summary — keeps flowing
778
+ // regardless, because switching off customer email must never also blind
779
+ // the operator.
780
+ const [notificationsForm, setNotificationsForm] = React.useState({
781
+ msgEmailEnabled: false, msgWhatsappEnabled: false, msgCeilingEmail: 80, msgCeilingWhatsapp: 200,
782
+ notifEmailEnabled: false, notifEmailMinPriority: "normal", resendApiKey: "",
783
+ notifFromEmail: "", notifFromName: "", notifEmailTypes: [],
784
+ digestEnabled: false, digestRecipients: "",
785
+ notifWhatsappEnabled: false, notifWhatsappMinPriority: "high",
786
+ notifWhatsappOtpEnabled: false, notifWhatsappTypes: [],
787
+ notifSmsEnabled: false, notifSmsMinPriority: "high",
788
+ });
789
+ const { fields: notificationsVisibilityFields, setVisible: setNotificationsFieldVisible, fieldOrder: notificationsFieldOrder, setFieldOrder: setNotificationsFieldOrder, } = useFieldVisibility("admin-site-settings-notifications");
790
+ const notificationsSections = React.useMemo(() => buildSectionsFromSchema(siteSettingsNotificationsFormSchema, {
791
+ renderers: {
792
+ msgEmailEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-email-notifications", ...props }),
793
+ msgWhatsappEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-whatsapp-notifications", ...props }),
794
+ digestEnabled: (props) => _jsx(AnchoredToggle, { id: "setting-daily-digest", ...props }),
795
+ resendApiKey: ({ values, onChange }) => (_jsx(MaskedInput, { label: "Resend API Key", value: values.resendApiKey ?? "", onChange: (v) => onChange({ resendApiKey: v }), placeholder: "re_live_\u2026", helperText: "Get your key at resend.com \u2014 used for all transactional notifications." })),
796
+ notifEmailTypes: ({ values, onChange }) => (_jsx(PaginatedSelect, { ariaLabel: "Notification types", multiple: true, options: NOTIF_TYPE_OPTIONS, value: values.notifEmailTypes, onChange: (v) => onChange({ notifEmailTypes: v }), placeholder: "All notification types" })),
797
+ notifWhatsappTypes: ({ values, onChange }) => (_jsx(PaginatedSelect, { multiple: true, ariaLabel: "Notification types to send over WhatsApp", options: NOTIF_TYPE_OPTIONS, value: values.notifWhatsappTypes, onChange: (v) => onChange({ notifWhatsappTypes: v }), placeholder: "All notification types" })),
798
+ },
799
+ options: {
800
+ notifEmailMinPriority: PRIORITY_OPTIONS,
801
+ notifWhatsappMinPriority: PRIORITY_OPTIONS,
802
+ notifSmsMinPriority: PRIORITY_OPTIONS,
803
+ },
804
+ fieldVisibility: notificationsVisibilityFields,
805
+ editMode,
806
+ onToggleFieldVisibility: setNotificationsFieldVisible,
807
+ fieldOrder: notificationsFieldOrder,
808
+ onMoveField: (fieldName, neighborName) => setNotificationsFieldOrder(swapFieldOrder(notificationsFieldOrder, resolveFields(siteSettingsNotificationsFormSchema).map((f) => f.name), fieldName, neighborName)),
809
+ }), [notificationsVisibilityFields, editMode, setNotificationsFieldVisible, notificationsFieldOrder, setNotificationsFieldOrder]);
408
810
  // Snapshot of the masked placeholder strings the server returned for every
409
811
  // credentials.* field, captured once per load. A combined single-save has
410
812
  // to send the FULL credentials object on every save (not just the group the
@@ -418,214 +820,282 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
418
820
  React.useEffect(() => {
419
821
  if (!s || !Object.keys(s).length)
420
822
  return;
421
- setSiteName(s.siteName ?? "");
422
- setTagline(s.tagline ?? "");
423
- setLogoUrl(s.logo ?? "");
424
- setFaviconUrl(s.favicon ?? "");
425
- setMaintenanceMode(s.maintenance?.enabled ?? false);
426
- setMaintenanceMessage(s.maintenance?.message ?? "");
427
- setLightBgType(s.background?.light?.type ?? "color");
428
- setLightBgValue(s.background?.light?.value ?? "");
429
- setLightBgOverlayEnabled(s.background?.light?.overlay?.enabled ?? false);
430
- setLightBgOverlayColor(s.background?.light?.overlay?.color ?? "#000000");
431
- setLightBgOverlayOpacity(Math.round((s.background?.light?.overlay?.opacity ?? 0.3) * 100));
432
- setDarkBgType(s.background?.dark?.type ?? "color");
433
- setDarkBgValue(s.background?.dark?.value ?? "");
434
- setDarkBgOverlayEnabled(s.background?.dark?.overlay?.enabled ?? false);
435
- setDarkBgOverlayColor(s.background?.dark?.overlay?.color ?? "#000000");
436
- setDarkBgOverlayOpacity(Math.round((s.background?.dark?.overlay?.opacity ?? 0.3) * 100));
823
+ setBrandingForm({
824
+ siteName: s.siteName ?? "",
825
+ tagline: s.tagline ?? "",
826
+ logoUrl: s.logo ?? "",
827
+ faviconUrl: s.favicon ?? "",
828
+ maintenanceMode: s.maintenance?.enabled ?? false,
829
+ maintenanceMessage: s.maintenance?.message ?? "",
830
+ chatEnabled: s.chat?.enabled ?? false,
831
+ assistantEnabled: s.assistant?.enabled ?? true,
832
+ });
833
+ setAppearanceForm({
834
+ lightBg: {
835
+ type: (s.background?.light?.type ?? "color"),
836
+ value: s.background?.light?.value ?? "",
837
+ overlayEnabled: s.background?.light?.overlay?.enabled ?? false,
838
+ overlayColor: s.background?.light?.overlay?.color ?? "#000000",
839
+ overlayOpacity: Math.round((s.background?.light?.overlay?.opacity ?? 0.3) * 100),
840
+ },
841
+ darkBg: {
842
+ type: (s.background?.dark?.type ?? "color"),
843
+ value: s.background?.dark?.value ?? "",
844
+ overlayEnabled: s.background?.dark?.overlay?.enabled ?? false,
845
+ overlayColor: s.background?.dark?.overlay?.color ?? "#000000",
846
+ overlayOpacity: Math.round((s.background?.dark?.overlay?.opacity ?? 0.3) * 100),
847
+ },
848
+ });
437
849
  const themeBlock = s.theme;
438
850
  setThemeRegistry({
439
851
  themes: (themeBlock?.themes ?? []),
440
852
  defaultLightThemeId: themeBlock?.defaultLightThemeId ?? DEFAULT_LIGHT_THEME.id,
441
853
  defaultDarkThemeId: themeBlock?.defaultDarkThemeId ?? DEFAULT_DARK_THEME.id,
442
854
  });
443
- setAnnouncementEnabled(s.announcementBar?.enabled ?? false);
444
- setAnnouncementText(s.announcementBar?.message ?? "");
445
- setAnnouncementLink(s.announcementBar?.link ?? "");
446
- setAnnouncementBg(s.announcementBar?.backgroundColor ?? "");
447
- setSeoTitle(s.seo?.defaultTitle ?? "");
448
- setSeoDescription(s.seo?.defaultDescription ?? "");
449
- setSeoOgImage(s.seo?.defaultOgImage ?? "");
450
- setSeoNoIndex(s.seo?.noIndex ?? false);
451
- setCanonicalUrl(s.seo?.canonicalBaseUrl ?? "");
452
- setSupportEmail(s.contact?.email ?? "");
453
- setSupportPhone(s.contact?.phone ?? "");
454
- setSupportAddress(s.contact?.address ?? "");
455
- setSupportHours(s.contact?.supportHours ?? "");
456
- setInstagram(s.socialLinks?.instagram ?? "");
457
- setTwitter(s.socialLinks?.twitter ?? "");
458
- setFacebook(s.socialLinks?.facebook ?? "");
459
- setYoutube(s.socialLinks?.youtube ?? "");
460
- setWhatsapp(s.contact?.whatsappNumber ?? "");
461
- setUpiVpa(s.contact?.upiVpa ?? "");
462
- setLinkedin(s.socialLinks?.linkedin ?? "");
463
- setPinterest(s.socialLinks?.pinterest ?? "");
464
- setWatermarkType(s.watermark?.type ?? "text");
465
- setWatermarkText(s.watermark?.text ?? "letitrip.in");
466
- setWatermarkImageUrl(s.watermark?.imageUrl ?? "");
467
- setWatermarkSize(s.watermark?.size ?? 10);
468
- setWatermarkOpacity(s.watermark?.opacity ?? 10);
469
- const loadedPosition = s.watermark?.position ?? "center";
470
- setWatermarkUseCustomOffset(loadedPosition === "custom");
471
- setWatermarkPosition(loadedPosition === "custom" ? "center" : loadedPosition);
472
- setWatermarkOffsetX(s.watermark?.offsetX ?? 0);
473
- setWatermarkOffsetY(s.watermark?.offsetY ?? 0);
474
- setPlatformFeePercent(s.commissions?.platformFeePercent ?? 5);
475
- setGstPercent(s.commissions?.gstPercent ?? 18);
476
- setMinimumTransactionFee(s.commissions?.minimumTransactionFee ?? 0);
477
- setPlatformFeeMax(s.commissions?.platformFeeMax ?? 10);
478
- setGatewayFeePercent(s.commissions?.gatewayFeePercent ?? 2);
855
+ setAnnouncementForm({
856
+ announcementEnabled: s.announcementBar?.enabled ?? false,
857
+ announcementText: s.announcementBar?.message ?? "",
858
+ announcementLink: s.announcementBar?.link ?? "",
859
+ announcementBg: s.announcementBar?.backgroundColor ?? "",
860
+ });
861
+ setSeoForm({
862
+ seoTitle: s.seo?.defaultTitle ?? "",
863
+ seoDescription: s.seo?.defaultDescription ?? "",
864
+ seoOgImage: s.seo?.defaultOgImage ?? "",
865
+ seoNoIndex: s.seo?.noIndex ?? false,
866
+ canonicalUrl: s.seo?.canonicalBaseUrl ?? "",
867
+ });
868
+ setContactForm({
869
+ supportEmail: s.contact?.email ?? "",
870
+ supportPhone: s.contact?.phone ?? "",
871
+ supportAddress: s.contact?.address ?? "",
872
+ supportHours: s.contact?.supportHours ?? "",
873
+ instagram: s.socialLinks?.instagram ?? "",
874
+ twitter: s.socialLinks?.twitter ?? "",
875
+ facebook: s.socialLinks?.facebook ?? "",
876
+ youtube: s.socialLinks?.youtube ?? "",
877
+ whatsapp: s.contact?.whatsappNumber ?? "",
878
+ upiVpa: s.contact?.upiVpa ?? "",
879
+ linkedin: s.socialLinks?.linkedin ?? "",
880
+ pinterest: s.socialLinks?.pinterest ?? "",
881
+ });
882
+ const loadedWatermarkPosition = s.watermark?.position ?? "center";
883
+ setWatermarkForm({
884
+ watermarkType: s.watermark?.type ?? "text",
885
+ watermarkText: s.watermark?.text ?? getBrandDomain(),
886
+ watermarkImageUrl: s.watermark?.imageUrl ?? "",
887
+ watermarkSize: s.watermark?.size ?? 10,
888
+ watermarkOpacity: s.watermark?.opacity ?? 10,
889
+ watermarkUseCustomOffset: loadedWatermarkPosition === "custom",
890
+ watermarkPosition: loadedWatermarkPosition === "custom"
891
+ ? "center"
892
+ : loadedWatermarkPosition,
893
+ watermarkOffsetX: s.watermark?.offsetX ?? 0,
894
+ watermarkOffsetY: s.watermark?.offsetY ?? 0,
895
+ });
896
+ setFeesForm({
897
+ platformFeePercent: s.commissions?.platformFeePercent ?? 5,
898
+ gstPercent: s.commissions?.gstPercent ?? 18,
899
+ minimumTransactionFee: s.commissions?.minimumTransactionFee ?? 0,
900
+ platformFeeMax: s.commissions?.platformFeeMax ?? 10,
901
+ gatewayFeePercent: s.commissions?.gatewayFeePercent ?? 2,
902
+ /*
903
+ * 🛑 Clamped UP to the floor on load, deliberately.
904
+ *
905
+ * The live document is seeded `2`, and the payload Zod schema now
906
+ * refuses anything below `PAYOUT_HOLD_FLOOR_DAYS` (7) — so without this
907
+ * clamp an admin opening this tab would load 2, change something
908
+ * unrelated, and be blocked from saving by a field they never touched.
909
+ * The honoured value is already 7 (`resolvePayoutHoldDays` clamps at
910
+ * read time), so showing 7 is showing the truth, not silently
911
+ * overriding them.
912
+ */
913
+ payoutHoldDays: Math.max(s.commissions?.payoutHoldDays ?? 7, PAYOUT_HOLD_FLOOR_DAYS),
914
+ minPayoutAmount: s.commissions?.minPayoutAmount ?? 100,
915
+ collectorDropListingFee: s.commissions?.collectorDropListingFee ?? 0,
916
+ preOrderListingFee: s.commissions?.preOrderListingFee ?? 0,
917
+ featuredSlotFee: s.commissions?.featuredSlotFee ?? 999,
918
+ promotedSlotFee: s.commissions?.promotedSlotFee ?? 499,
919
+ codDepositPercent: s.commissions?.codDepositPercent ?? 10,
920
+ whatsappNotifyFeeEnabled: s.commissions?.whatsappNotifyFeeEnabled ?? false,
921
+ whatsappNotifyFee: s.commissions?.whatsappNotifyFee ?? 10,
922
+ giftWrapFeeEnabled: s.commissions?.giftWrapFeeEnabled ?? false,
923
+ giftWrapFee: s.commissions?.giftWrapFee ?? 49,
924
+ shipmentProtectionFeeEnabled: s.commissions?.shipmentProtectionFeeEnabled ?? false,
925
+ shipmentProtectionFeePercent: s.commissions?.shipmentProtectionFeePercent ?? 2,
926
+ shipmentProtectionFeeMin: s.commissions?.shipmentProtectionFeeMin ?? 30,
927
+ saleProtectionFeeEnabled: s.commissions?.saleProtectionFeeEnabled ?? true,
928
+ saleProtectionFeePercent: s.commissions?.saleProtectionFeePercent ?? 3,
929
+ saleProtectionFeeMin: s.commissions?.saleProtectionFeeMin ?? 49,
930
+ codHandlingFeePercent: s.commissions?.codHandlingFeePercent ?? 10,
931
+ codHandlingFeeCap: s.commissions?.codHandlingFeeCap ?? 200,
932
+ });
933
+ setProcurementForm({
934
+ laborHourlyRate: s.laborRate?.hourlyRate ?? 200,
935
+ laborMaxHoursPerDay: s.laborRate?.maxHoursPerDay ?? 6,
936
+ });
937
+ setEmiForm({
938
+ emiEnabled: s.emi?.enabled ?? false,
939
+ emiMinOrderValue: s.emi?.minOrderValue ?? 10000,
940
+ emiTenureOptionsText: (s.emi?.tenureOptions ?? [2, 3, 4, 5, 6]).join(","),
941
+ emiTokenPercent: s.emi?.tokenPercent ?? 20,
942
+ emiBillingDay: s.emi?.billingDay ?? 5,
943
+ emiSurchargePercentPerMonth: s.emi?.surchargePercentPerMonth ?? 2,
944
+ emiSurchargeSellerSharePercent: s.emi?.surchargeSellerSharePercent ?? 50,
945
+ });
946
+ setGstForm({
947
+ gstEnabled: s.gst?.enabled ?? false,
948
+ gstin: s.gst?.gstin ?? "",
949
+ gstLegalName: s.gst?.legalName ?? "",
950
+ gstAddress: s.gst?.address ?? "",
951
+ });
952
+ setIntegrationsForm({
953
+ razorpayKeyId: s.credentialsMasked?.razorpayKeyId ?? "",
954
+ razorpayKeySecret: s.credentialsMasked?.razorpayKeySecret ?? "",
955
+ razorpayWebhookSecret: s.credentialsMasked?.razorpayWebhookSecret ?? "",
956
+ cashfreeAppId: s.credentialsMasked?.cashfreeAppId ?? "",
957
+ cashfreeSecretKey: s.credentialsMasked?.cashfreeSecretKey ?? "",
958
+ cashfreeEnvironment: s.credentialsMasked?.cashfreeEnvironment ?? "sandbox",
959
+ phonepeClientId: s.credentialsMasked?.phonepeClientId ?? "",
960
+ phonepeClientSecret: s.credentialsMasked?.phonepeClientSecret ?? "",
961
+ phonepeClientVersion: s.credentialsMasked?.phonepeClientVersion ?? "1",
962
+ phonepeEnvironment: s.credentialsMasked?.phonepeEnvironment ?? "sandbox",
963
+ phonepeWebhookUsername: s.credentialsMasked?.phonepeWebhookUsername ?? "",
964
+ phonepeWebhookPassword: s.credentialsMasked?.phonepeWebhookPassword ?? "",
965
+ googleMapsApiKey: s.credentialsMasked?.googleMapsApiKey ?? "",
966
+ googlePlaceId: s.credentialsMasked?.googlePlaceId ?? "",
967
+ smtpHost: s.emailSettings?.host ?? "",
968
+ smtpPort: String(s.emailSettings?.port ?? 587),
969
+ smtpUser: s.emailSettings?.user ?? "",
970
+ smtpFrom: s.emailSettings?.fromAddress ?? "",
971
+ gaMeasurementId: s.integrations?.googleAnalyticsId ?? "",
972
+ fbPixelId: s.integrations?.facebookPixelId ?? "",
973
+ gtmContainerId: s.integrations?.gtmContainerId ?? "",
974
+ clarityProjectId: s.integrations?.clarityProjectId ?? "",
975
+ metaPageAccessToken: s.credentialsMasked?.metaPageAccessToken ?? "",
976
+ metaPageId: s.credentialsMasked?.metaPageId ?? "",
977
+ tiktokClientKey: s.credentialsMasked?.tiktokClientKey ?? "",
978
+ tiktokClientSecret: s.credentialsMasked?.tiktokClientSecret ?? "",
979
+ tiktokAccessToken: s.credentialsMasked?.tiktokAccessToken ?? "",
980
+ deviantartClientId: s.credentialsMasked?.deviantartClientId ?? "",
981
+ deviantartClientSecret: s.credentialsMasked?.deviantartClientSecret ?? "",
982
+ });
479
983
  /*
480
- * 🛑 Clamped UP to the floor on load, deliberately.
481
- *
482
- * The live document is seeded `2`, and the payload Zod schema now refuses
483
- * anything below `PAYOUT_HOLD_FLOOR_DAYS` (7) — so without this clamp an
484
- * admin opening this tab would load 2, change something unrelated, and be
485
- * blocked from saving by a field they never touched. The honoured value is
486
- * already 7 (`resolvePayoutHoldDays` clamps at read time), so showing 7 is
487
- * showing the truth, not silently overriding them.
984
+ * 🛑 The HYDRATE leg, and skipping it is the live risk this file's own
985
+ * comments name: a key that is SAVED but never hydrated renders its
986
+ * default — here the empty string — and the next save writes that default
987
+ * over the stored value. For this field that silently turns online
988
+ * collection off for the whole site on the first unrelated settings save.
488
989
  */
489
- setPayoutHoldDays(Math.max(s.commissions?.payoutHoldDays ?? 7, PAYOUT_HOLD_FLOOR_DAYS));
490
- setMinPayoutAmount(s.commissions?.minPayoutAmount ?? 100);
491
- setAuctionListingFee(s.commissions?.auctionListingFee ?? 0);
492
- setPreOrderListingFee(s.commissions?.preOrderListingFee ?? 0);
493
- setFeaturedSlotFee(s.commissions?.featuredSlotFee ?? 999);
494
- setPromotedSlotFee(s.commissions?.promotedSlotFee ?? 499);
495
- setWhatsappNotifyFeeEnabled(s.commissions?.whatsappNotifyFeeEnabled ?? false);
496
- setWhatsappNotifyFee(s.commissions?.whatsappNotifyFee ?? 10);
497
- setGiftWrapFeeEnabled(s.commissions?.giftWrapFeeEnabled ?? false);
498
- setGiftWrapFee(s.commissions?.giftWrapFee ?? 49);
499
- setShipmentProtectionFeeEnabled(s.commissions?.shipmentProtectionFeeEnabled ?? false);
500
- setSaleProtectionFeeEnabled(s.commissions?.saleProtectionFeeEnabled ?? true);
501
- setSaleProtectionFeePercent(s.commissions?.saleProtectionFeePercent ?? 3);
502
- setSaleProtectionFeeMin(s.commissions?.saleProtectionFeeMin ?? 49);
503
- setCodHandlingFeePercent(s.commissions?.codHandlingFeePercent ?? 10);
504
- setCodHandlingFeeCap(s.commissions?.codHandlingFeeCap ?? 200);
505
- setShipmentProtectionFeePercent(s.commissions?.shipmentProtectionFeePercent ?? 2);
506
- setShipmentProtectionFeeMin(s.commissions?.shipmentProtectionFeeMin ?? 30);
507
- setCodDepositPercent(s.commissions?.codDepositPercent ?? 10);
508
- setSellerShippingFixed(s.commissions?.sellerShippingFixed ?? 0);
509
- setPlatformShippingPercent(s.commissions?.platformShippingPercent ?? 10);
510
- setPlatformShippingFixedMin(s.commissions?.platformShippingFixedMin ?? 0);
511
- setLaborHourlyRate(s.laborRate?.hourlyRate ?? 200);
512
- setLaborMaxHoursPerDay(s.laborRate?.maxHoursPerDay ?? 6);
513
- setEmiEnabled(s.emi?.enabled ?? false);
514
- setEmiMinOrderValue(s.emi?.minOrderValue ?? 10000);
515
- setEmiTenureOptionsText((s.emi?.tenureOptions ?? [2, 3, 4, 5, 6]).join(","));
516
- setEmiTokenPercent(s.emi?.tokenPercent ?? 20);
517
- setEmiBillingDay(s.emi?.billingDay ?? 5);
518
- setEmiSurchargePercentPerMonth(s.emi?.surchargePercentPerMonth ?? 2);
519
- setEmiSurchargeSellerSharePercent(s.emi?.surchargeSellerSharePercent ?? 50);
520
- setGstEnabled(s.gst?.enabled ?? false);
521
- setGstin(s.gst?.gstin ?? "");
522
- setGstLegalName(s.gst?.legalName ?? "");
523
- setGstAddress(s.gst?.address ?? "");
524
- setRazorpayKeyId(s.credentialsMasked?.razorpayKeyId ?? "");
525
- setRazorpayKeySecret(s.credentialsMasked?.razorpayKeySecret ?? "");
526
- setRazorpayWebhookSecret(s.credentialsMasked?.razorpayWebhookSecret ?? "");
527
- setPhonepeClientId(s.credentialsMasked?.phonepeClientId ?? "");
528
- setPhonepeClientSecret(s.credentialsMasked?.phonepeClientSecret ?? "");
529
- setPhonepeClientVersion(s.credentialsMasked?.phonepeClientVersion ?? "1");
530
- setPhonepeEnvironment(s.credentialsMasked?.phonepeEnvironment ?? "sandbox");
531
- setPhonepeWebhookUsername(s.credentialsMasked?.phonepeWebhookUsername ?? "");
532
- setPhonepeWebhookPassword(s.credentialsMasked?.phonepeWebhookPassword ?? "");
533
- setGoogleMapsApiKey(s.credentialsMasked?.googleMapsApiKey ?? "");
534
- setGooglePlaceId(s.credentialsMasked?.googlePlaceId ?? "");
535
- setSmtpHost(s.emailSettings?.host ?? "");
536
- setSmtpPort(String(s.emailSettings?.port ?? 587));
537
- setSmtpUser(s.emailSettings?.user ?? "");
538
- setSmtpFrom(s.emailSettings?.fromAddress ?? "");
539
- setGaMeasurementId(s.integrations?.googleAnalyticsId ?? "");
540
- setFbPixelId(s.integrations?.facebookPixelId ?? "");
541
- setGtmContainerId(s.integrations?.gtmContainerId ?? "");
542
- setClarityProjectId(s.integrations?.clarityProjectId ?? "");
543
- setMetaPageAccessToken(s.credentialsMasked?.metaPageAccessToken ?? "");
544
- setMetaPageId(s.credentialsMasked?.metaPageId ?? "");
545
- setTiktokClientKey(s.credentialsMasked?.tiktokClientKey ?? "");
546
- setTiktokClientSecret(s.credentialsMasked?.tiktokClientSecret ?? "");
547
- setTiktokAccessToken(s.credentialsMasked?.tiktokAccessToken ?? "");
548
- setDeviantartClientId(s.credentialsMasked?.deviantartClientId ?? "");
549
- setDeviantartClientSecret(s.credentialsMasked?.deviantartClientSecret ?? "");
550
- setFreeShippingThreshold(s.shipping?.freeShippingThreshold ?? 999);
551
- setDefaultCarrier(s.shipping?.defaultCarrier ?? "custom");
552
- setMaxDeliveryRadius(s.shipping?.maxDeliveryRadius ?? 0);
553
- setRazorpayEnabled(s.payment?.razorpayEnabled ?? false);
554
- setPhonepeEnabled(s.payment?.phonepeEnabled ?? false);
555
- setUpiManualEnabled(s.payment?.upiManualEnabled ?? true);
556
- setCodEnabled(s.payment?.codEnabled ?? true);
557
- setOtpCheckoutThreshold(s.payment?.otpCheckoutThreshold ?? 5000);
558
- setCodMaxOrderValue(s.payment?.codMaxOrderValue ?? COD_MAX_ORDER_VALUE_FALLBACK);
559
- setListingTypeFlags(s.listings?.listingTypes ?? {});
560
- setCategoryTypeFlags(s.listings?.categoryTypes ?? {});
561
- setBrowsePageFlags(s.listings?.browsePages ?? {});
562
- setNotifEmailTypes(s.notificationChannels?.email?.types ?? []);
563
- setNotifWhatsappTypes(s.notificationChannels?.whatsapp?.types ?? []);
564
- setBidIncrementTiers(s.auctionConfig?.bidIncrementTiers ?? DEFAULT_AUCTION_BID_INCREMENT_TIERS);
565
- setAutoExtendWindow(s.auctionConfig?.autoExtendWindowMinutes ?? 5);
566
- setSettlementGrace(s.auctionConfig?.settlementGracePeriodHours ?? 24);
567
- setMaxProductsPerStore(s.platformLimits?.maxProductsPerStore ?? 100);
568
- setMaxCustomFields(s.platformLimits?.maxCustomFieldsPerProduct ?? 50);
569
- setOrderCancelWindow(s.platformLimits?.orderCancellationWindowHours ?? 24);
570
- setTermsHtml(s.legalPages?.terms ?? "");
571
- setPrivacyHtml(s.legalPages?.privacy ?? "");
572
- setRefundHtml(s.legalPages?.refundPolicy ?? "");
573
- setShippingPolicyHtml(s.legalPages?.shipping ?? "");
574
- setCookieHtml(s.legalPages?.cookies ?? "");
575
- setEthicsHtml(s.legalPages?.ethics ?? "");
576
- setCancellationHtml(s.legalPages?.cancellation ?? "");
577
- setGrievanceHtml(s.legalPages?.grievance ?? "");
578
- setConductHtml(s.legalPages?.codeOfConduct ?? "");
579
- setAboutTitle(s.aboutContent?.title ?? "");
580
- setAboutSubtitle(s.aboutContent?.subtitle ?? "");
581
- setAboutMissionTitle(s.aboutContent?.missionTitle ?? "");
582
- setAboutMissionText(s.aboutContent?.missionText ?? "");
583
- setAboutHowItWorksTitle(s.aboutContent?.howItWorksTitle ?? "");
584
- setAboutHowItems(s.aboutContent?.howItems ?? []);
585
- setAboutValuesTitle(s.aboutContent?.valuesTitle ?? "");
586
- setAboutValuesSubtitle(s.aboutContent?.valuesSubtitle ?? "");
587
- setAboutValueItems(s.aboutContent?.valueItems ?? []);
588
- setAboutMilestonesTitle(s.aboutContent?.milestonesTitle ?? "");
589
- setAboutMilestones(s.aboutContent?.milestones ?? []);
590
- setAboutTeamTitle(s.aboutContent?.teamTitle ?? "");
591
- setAboutTeamSubtitle(s.aboutContent?.teamSubtitle ?? "");
592
- setAboutTeamMembers(s.aboutContent?.teamMembers ?? []);
593
- setAboutCtaTitle(s.aboutContent?.ctaTitle ?? "");
594
- setAboutCtaSell(s.aboutContent?.ctaSell ?? "");
595
- setAboutCtaShop(s.aboutContent?.ctaShop ?? "");
596
- setWaPhoneNumberId(s.credentialsMasked?.whatsappPhoneNumberId ?? "");
597
- setWaCloudApiToken(s.credentialsMasked?.whatsappCloudApiToken ?? "");
598
- setWaAdminNotifyNumbers(s.credentialsMasked?.whatsappAdminNotifyNumbers ?? "");
599
- setWaTemplateLanguage(s.credentialsMasked?.whatsappTemplateLanguage ?? "en");
600
- setWaTemplateOrderPlaced(s.credentialsMasked?.whatsappTemplateOrderPlaced ?? "");
601
- setWaTemplateOrderConfirmed(s.credentialsMasked?.whatsappTemplateOrderConfirmed ?? "");
602
- setWaTemplateOrderShipped(s.credentialsMasked?.whatsappTemplateOrderShipped ?? "");
603
- setWaTemplateOrderDelivered(s.credentialsMasked?.whatsappTemplateOrderDelivered ?? "");
604
- setWaTemplateOrderCancelled(s.credentialsMasked?.whatsappTemplateOrderCancelled ?? "");
605
- setWaTemplateRefundInitiated(s.credentialsMasked?.whatsappTemplateRefundInitiated ?? "");
606
- setNotifEmailEnabled(s.notificationChannels?.email?.enabled ?? false);
607
- setNotifEmailMinPriority(s.notificationChannels?.email?.minPriority ?? "normal");
608
- setNotifWhatsappEnabled(s.notificationChannels?.whatsapp?.enabled ?? false);
609
- setNotifWhatsappMinPriority(s.notificationChannels?.whatsapp?.minPriority ?? "high");
610
- setNotifWhatsappOtpEnabled(s.notificationChannels?.whatsapp?.otpEnabled ?? false);
611
- setNotifSmsEnabled(s.notificationChannels?.sms?.enabled ?? false);
612
- setNotifSmsMinPriority(s.notificationChannels?.sms?.minPriority ?? "high");
613
- setResendApiKey(s.credentialsMasked?.resendApiKey ?? "");
614
- setNotifFromEmail(s.emailSettings?.fromEmail ?? "");
615
- setNotifFromName(s.emailSettings?.fromName ?? "");
616
- setDigestEnabled(s.emailSettings?.dailyDigest?.enabled ?? false);
617
- setDigestRecipients((s.emailSettings?.dailyDigest?.recipients ?? []).join("\n"));
618
- // Defaults mirror MESSAGE_BUDGET_DEFAULTS — both channels OFF, so a
619
- // settings document written before this feature existed reads as quiet
620
- // rather than as "on and unmetered".
621
- setMsgEmailEnabled(s.messaging?.emailEnabled ?? false);
622
- setMsgWhatsappEnabled(s.messaging?.whatsappEnabled ?? false);
623
- setMsgCeilingEmail(s.messaging?.dailyCeiling?.email ?? 80);
624
- setMsgCeilingWhatsapp(s.messaging?.dailyCeiling?.whatsapp ?? 200);
990
+ setShippingForm({
991
+ razorpayEnabled: s.payment?.razorpayEnabled ?? false,
992
+ phonepeEnabled: s.payment?.phonepeEnabled ?? false,
993
+ cashfreeEnabled: s.payment?.cashfreeEnabled ?? false,
994
+ platformStoreId: s.payment?.platformStoreId ?? "",
995
+ upiManualEnabled: s.payment?.upiManualEnabled ?? true,
996
+ codEnabled: s.payment?.codEnabled ?? true,
997
+ otpCheckoutThreshold: s.payment?.otpCheckoutThreshold ?? 5000,
998
+ codMaxOrderValue: s.payment?.codMaxOrderValue ?? COD_MAX_ORDER_VALUE_FALLBACK,
999
+ freeShippingThreshold: s.shipping?.freeShippingThreshold ?? 999,
1000
+ defaultCarrier: s.shipping?.defaultCarrier ?? "custom",
1001
+ maxDeliveryRadius: s.shipping?.maxDeliveryRadius ?? 0,
1002
+ sellerShippingFixed: s.commissions?.sellerShippingFixed ?? 0,
1003
+ platformShippingPercent: s.commissions?.platformShippingPercent ?? 10,
1004
+ platformShippingFixedMin: s.commissions?.platformShippingFixedMin ?? 0,
1005
+ });
1006
+ /*
1007
+ * 🛑 `FlagValue`, not `boolean`. These three maps store
1008
+ * `boolean | "unlisted"`; the old `as Record<string, boolean>` cast was a
1009
+ * lie that let a truthy `"unlisted"` string flow into a two-state Toggle,
1010
+ * which rendered it as "on" and overwrote it on the next click.
1011
+ */
1012
+ setListingsForm({
1013
+ listingTypeFlags: s.listings?.listingTypes ?? {},
1014
+ categoryTypeFlags: s.listings?.categoryTypes ?? {},
1015
+ browsePageFlags: s.listings?.browsePages ?? {},
1016
+ });
1017
+ setCollectorDropForm({
1018
+ bidIncrementTiers: s.collectorDropConfig?.bidIncrementTiers ?? DEFAULT_COLLECTOR_DROP_BID_INCREMENT_TIERS,
1019
+ autoExtendWindow: s.collectorDropConfig?.autoExtendWindowMinutes ?? 5,
1020
+ settlementGrace: s.collectorDropConfig?.settlementGracePeriodHours ?? 24,
1021
+ });
1022
+ setLimitsForm({
1023
+ maxProductsPerStore: s.platformLimits?.maxProductsPerStore ?? 100,
1024
+ maxCustomFields: s.platformLimits?.maxCustomFieldsPerProduct ?? 50,
1025
+ orderCancelWindow: s.platformLimits?.orderCancellationWindowHours ?? 24,
1026
+ });
1027
+ setLegalForm({
1028
+ termsHtml: s.legalPages?.terms ?? "",
1029
+ privacyHtml: s.legalPages?.privacy ?? "",
1030
+ refundHtml: s.legalPages?.refundPolicy ?? "",
1031
+ shippingPolicyHtml: s.legalPages?.shipping ?? "",
1032
+ cookieHtml: s.legalPages?.cookies ?? "",
1033
+ ethicsHtml: s.legalPages?.ethics ?? "",
1034
+ cancellationHtml: s.legalPages?.cancellation ?? "",
1035
+ grievanceHtml: s.legalPages?.grievance ?? "",
1036
+ conductHtml: s.legalPages?.codeOfConduct ?? "",
1037
+ });
1038
+ setAboutForm({
1039
+ aboutTitle: s.aboutContent?.title ?? "",
1040
+ aboutSubtitle: s.aboutContent?.subtitle ?? "",
1041
+ aboutMissionTitle: s.aboutContent?.missionTitle ?? "",
1042
+ aboutMissionText: s.aboutContent?.missionText ?? "",
1043
+ aboutHowItWorksTitle: s.aboutContent?.howItWorksTitle ?? "",
1044
+ aboutHowItems: s.aboutContent?.howItems ?? [],
1045
+ aboutValuesTitle: s.aboutContent?.valuesTitle ?? "",
1046
+ aboutValuesSubtitle: s.aboutContent?.valuesSubtitle ?? "",
1047
+ aboutValueItems: s.aboutContent?.valueItems ?? [],
1048
+ aboutMilestonesTitle: s.aboutContent?.milestonesTitle ?? "",
1049
+ aboutMilestones: s.aboutContent?.milestones ?? [],
1050
+ aboutTeamTitle: s.aboutContent?.teamTitle ?? "",
1051
+ aboutTeamSubtitle: s.aboutContent?.teamSubtitle ?? "",
1052
+ aboutTeamMembers: s.aboutContent?.teamMembers ?? [],
1053
+ aboutCtaTitle: s.aboutContent?.ctaTitle ?? "",
1054
+ aboutCtaSell: s.aboutContent?.ctaSell ?? "",
1055
+ aboutCtaShop: s.aboutContent?.ctaShop ?? "",
1056
+ });
1057
+ setWhatsappForm({
1058
+ waPhoneNumberId: s.credentialsMasked?.whatsappPhoneNumberId ?? "",
1059
+ waCloudApiToken: s.credentialsMasked?.whatsappCloudApiToken ?? "",
1060
+ waAdminNotifyNumbers: s.credentialsMasked?.whatsappAdminNotifyNumbers ?? "",
1061
+ waTemplateLanguage: s.credentialsMasked?.whatsappTemplateLanguage ?? "en",
1062
+ waTemplateOrderPlaced: s.credentialsMasked?.whatsappTemplateOrderPlaced ?? "",
1063
+ waTemplateOrderConfirmed: s.credentialsMasked?.whatsappTemplateOrderConfirmed ?? "",
1064
+ waTemplateOrderShipped: s.credentialsMasked?.whatsappTemplateOrderShipped ?? "",
1065
+ waTemplateOrderDelivered: s.credentialsMasked?.whatsappTemplateOrderDelivered ?? "",
1066
+ waTemplateOrderCancelled: s.credentialsMasked?.whatsappTemplateOrderCancelled ?? "",
1067
+ waTemplateRefundInitiated: s.credentialsMasked?.whatsappTemplateRefundInitiated ?? "",
1068
+ });
1069
+ setNotificationsForm({
1070
+ notifEmailEnabled: s.notificationChannels?.email?.enabled ?? false,
1071
+ notifEmailMinPriority: s.notificationChannels?.email?.minPriority ?? "normal",
1072
+ notifWhatsappEnabled: s.notificationChannels?.whatsapp?.enabled ?? false,
1073
+ notifWhatsappMinPriority: s.notificationChannels?.whatsapp?.minPriority ?? "high",
1074
+ notifWhatsappOtpEnabled: s.notificationChannels?.whatsapp?.otpEnabled ?? false,
1075
+ notifSmsEnabled: s.notificationChannels?.sms?.enabled ?? false,
1076
+ notifSmsMinPriority: s.notificationChannels?.sms?.minPriority ?? "high",
1077
+ notifEmailTypes: s.notificationChannels?.email?.types ?? [],
1078
+ notifWhatsappTypes: s.notificationChannels?.whatsapp?.types ?? [],
1079
+ resendApiKey: s.credentialsMasked?.resendApiKey ?? "",
1080
+ notifFromEmail: s.emailSettings?.fromEmail ?? "",
1081
+ notifFromName: s.emailSettings?.fromName ?? "",
1082
+ digestEnabled: s.emailSettings?.dailyDigest?.enabled ?? false,
1083
+ digestRecipients: (s.emailSettings?.dailyDigest?.recipients ?? []).join("\n"),
1084
+ // Defaults mirror MESSAGE_BUDGET_DEFAULTS — both channels OFF, so a
1085
+ // settings document written before this feature existed reads as
1086
+ // quiet rather than as "on and unmetered".
1087
+ msgEmailEnabled: s.messaging?.emailEnabled ?? false,
1088
+ msgWhatsappEnabled: s.messaging?.whatsappEnabled ?? false,
1089
+ msgCeilingEmail: s.messaging?.dailyCeiling?.email ?? 80,
1090
+ msgCeilingWhatsapp: s.messaging?.dailyCeiling?.whatsapp ?? 200,
1091
+ });
625
1092
  originalMaskedRef.current = {
626
1093
  razorpayKeyId: s.credentialsMasked?.razorpayKeyId ?? "",
627
1094
  razorpayKeySecret: s.credentialsMasked?.razorpayKeySecret ?? "",
628
1095
  razorpayWebhookSecret: s.credentialsMasked?.razorpayWebhookSecret ?? "",
1096
+ cashfreeAppId: s.credentialsMasked?.cashfreeAppId ?? "",
1097
+ cashfreeSecretKey: s.credentialsMasked?.cashfreeSecretKey ?? "",
1098
+ cashfreeEnvironment: s.credentialsMasked?.cashfreeEnvironment ?? "",
629
1099
  phonepeClientId: s.credentialsMasked?.phonepeClientId ?? "",
630
1100
  phonepeClientSecret: s.credentialsMasked?.phonepeClientSecret ?? "",
631
1101
  phonepeClientVersion: s.credentialsMasked?.phonepeClientVersion ?? "",
@@ -660,36 +1130,47 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
660
1130
  function buildFullPayload() {
661
1131
  return {
662
1132
  aboutContent: {
663
- title: aboutTitle,
664
- subtitle: aboutSubtitle,
665
- missionTitle: aboutMissionTitle,
666
- missionText: aboutMissionText,
667
- howItWorksTitle: aboutHowItWorksTitle,
668
- howItems: aboutHowItems,
669
- valuesTitle: aboutValuesTitle,
670
- valuesSubtitle: aboutValuesSubtitle,
671
- valueItems: aboutValueItems,
672
- milestonesTitle: aboutMilestonesTitle,
673
- milestones: aboutMilestones,
674
- teamTitle: aboutTeamTitle,
675
- teamSubtitle: aboutTeamSubtitle,
676
- teamMembers: aboutTeamMembers,
677
- ctaTitle: aboutCtaTitle,
678
- ctaSell: aboutCtaSell,
679
- ctaShop: aboutCtaShop,
680
- },
681
- siteName, tagline, logo: logoUrl, favicon: faviconUrl,
682
- maintenance: { enabled: maintenanceMode, message: maintenanceMessage },
1133
+ title: aboutForm.aboutTitle,
1134
+ subtitle: aboutForm.aboutSubtitle,
1135
+ missionTitle: aboutForm.aboutMissionTitle,
1136
+ missionText: aboutForm.aboutMissionText,
1137
+ howItWorksTitle: aboutForm.aboutHowItWorksTitle,
1138
+ howItems: aboutForm.aboutHowItems,
1139
+ valuesTitle: aboutForm.aboutValuesTitle,
1140
+ valuesSubtitle: aboutForm.aboutValuesSubtitle,
1141
+ valueItems: aboutForm.aboutValueItems,
1142
+ milestonesTitle: aboutForm.aboutMilestonesTitle,
1143
+ milestones: aboutForm.aboutMilestones,
1144
+ teamTitle: aboutForm.aboutTeamTitle,
1145
+ teamSubtitle: aboutForm.aboutTeamSubtitle,
1146
+ teamMembers: aboutForm.aboutTeamMembers,
1147
+ ctaTitle: aboutForm.aboutCtaTitle,
1148
+ ctaSell: aboutForm.aboutCtaSell,
1149
+ ctaShop: aboutForm.aboutCtaShop,
1150
+ },
1151
+ siteName: brandingForm.siteName, tagline: brandingForm.tagline,
1152
+ logo: brandingForm.logoUrl, favicon: brandingForm.faviconUrl,
1153
+ maintenance: { enabled: brandingForm.maintenanceMode, message: brandingForm.maintenanceMessage },
1154
+ chat: { enabled: brandingForm.chatEnabled },
1155
+ assistant: { enabled: brandingForm.assistantEnabled },
683
1156
  background: {
684
1157
  light: {
685
- type: lightBgType,
686
- value: lightBgValue,
687
- overlay: { enabled: lightBgOverlayEnabled, color: lightBgOverlayColor, opacity: lightBgOverlayOpacity / 100 },
1158
+ type: appearanceForm.lightBg.type,
1159
+ value: appearanceForm.lightBg.value,
1160
+ overlay: {
1161
+ enabled: appearanceForm.lightBg.overlayEnabled,
1162
+ color: appearanceForm.lightBg.overlayColor,
1163
+ opacity: appearanceForm.lightBg.overlayOpacity / 100,
1164
+ },
688
1165
  },
689
1166
  dark: {
690
- type: darkBgType,
691
- value: darkBgValue,
692
- overlay: { enabled: darkBgOverlayEnabled, color: darkBgOverlayColor, opacity: darkBgOverlayOpacity / 100 },
1167
+ type: appearanceForm.darkBg.type,
1168
+ value: appearanceForm.darkBg.value,
1169
+ overlay: {
1170
+ enabled: appearanceForm.darkBg.overlayEnabled,
1171
+ color: appearanceForm.darkBg.overlayColor,
1172
+ opacity: appearanceForm.darkBg.overlayOpacity / 100,
1173
+ },
693
1174
  },
694
1175
  },
695
1176
  theme: {
@@ -698,81 +1179,117 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
698
1179
  defaultDarkThemeId: themeRegistry.defaultDarkThemeId,
699
1180
  },
700
1181
  // message, not text — text was never read by AnnouncementBar or the homepage.
701
- announcementBar: { enabled: announcementEnabled, message: announcementText, link: announcementLink, backgroundColor: announcementBg },
702
- seo: { defaultTitle: seoTitle, defaultDescription: seoDescription, defaultOgImage: seoOgImage, noIndex: seoNoIndex, canonicalBaseUrl: canonicalUrl },
703
- contact: { email: supportEmail, phone: supportPhone, address: supportAddress, supportHours, whatsappNumber: whatsapp, upiVpa },
704
- socialLinks: { instagram, twitter, facebook, youtube, linkedin, pinterest },
1182
+ announcementBar: {
1183
+ enabled: announcementForm.announcementEnabled,
1184
+ message: announcementForm.announcementText,
1185
+ link: announcementForm.announcementLink,
1186
+ backgroundColor: announcementForm.announcementBg,
1187
+ },
1188
+ seo: {
1189
+ defaultTitle: seoForm.seoTitle,
1190
+ defaultDescription: seoForm.seoDescription,
1191
+ defaultOgImage: seoForm.seoOgImage,
1192
+ noIndex: seoForm.seoNoIndex,
1193
+ canonicalBaseUrl: seoForm.canonicalUrl,
1194
+ },
1195
+ contact: {
1196
+ email: contactForm.supportEmail,
1197
+ phone: contactForm.supportPhone,
1198
+ address: contactForm.supportAddress,
1199
+ supportHours: contactForm.supportHours,
1200
+ whatsappNumber: contactForm.whatsapp,
1201
+ upiVpa: contactForm.upiVpa,
1202
+ },
1203
+ socialLinks: {
1204
+ instagram: contactForm.instagram,
1205
+ twitter: contactForm.twitter,
1206
+ facebook: contactForm.facebook,
1207
+ youtube: contactForm.youtube,
1208
+ linkedin: contactForm.linkedin,
1209
+ pinterest: contactForm.pinterest,
1210
+ },
705
1211
  watermark: {
706
- type: watermarkType,
707
- text: watermarkText,
708
- imageUrl: watermarkImageUrl,
709
- size: watermarkSize,
710
- opacity: watermarkOpacity,
711
- position: watermarkUseCustomOffset ? "custom" : watermarkPosition,
712
- offsetX: watermarkOffsetX,
713
- offsetY: watermarkOffsetY,
714
- },
715
- commissions: { platformFeePercent, gstPercent, minimumTransactionFee, platformFeeMax, gatewayFeePercent, payoutHoldDays, whatsappNotifyFee, whatsappNotifyFeeEnabled, minPayoutAmount, auctionListingFee, preOrderListingFee, featuredSlotFee, promotedSlotFee, giftWrapFeeEnabled, giftWrapFee, shipmentProtectionFeeEnabled, shipmentProtectionFeePercent, shipmentProtectionFeeMin, saleProtectionFeeEnabled, saleProtectionFeePercent, saleProtectionFeeMin, codHandlingFeePercent, codHandlingFeeCap, codDepositPercent, sellerShippingFixed, platformShippingPercent, platformShippingFixedMin },
716
- laborRate: { hourlyRate: laborHourlyRate, maxHoursPerDay: laborMaxHoursPerDay },
1212
+ type: watermarkForm.watermarkType,
1213
+ text: watermarkForm.watermarkText,
1214
+ imageUrl: watermarkForm.watermarkImageUrl,
1215
+ size: watermarkForm.watermarkSize,
1216
+ opacity: watermarkForm.watermarkOpacity,
1217
+ position: watermarkForm.watermarkUseCustomOffset ? "custom" : watermarkForm.watermarkPosition,
1218
+ offsetX: watermarkForm.watermarkOffsetX,
1219
+ offsetY: watermarkForm.watermarkOffsetY,
1220
+ },
1221
+ commissions: {
1222
+ ...feesForm,
1223
+ sellerShippingFixed: shippingForm.sellerShippingFixed,
1224
+ platformShippingPercent: shippingForm.platformShippingPercent,
1225
+ platformShippingFixedMin: shippingForm.platformShippingFixedMin,
1226
+ },
1227
+ laborRate: { hourlyRate: procurementForm.laborHourlyRate, maxHoursPerDay: procurementForm.laborMaxHoursPerDay },
717
1228
  emi: {
718
- enabled: emiEnabled,
719
- minOrderValue: emiMinOrderValue,
720
- tenureOptions: emiTenureOptionsText
1229
+ enabled: emiForm.emiEnabled,
1230
+ minOrderValue: emiForm.emiMinOrderValue,
1231
+ tenureOptions: (emiForm.emiTenureOptionsText ?? "")
721
1232
  .split(",")
722
1233
  .map((v) => parseInt(v.trim(), 10))
723
1234
  .filter((v) => !isNaN(v) && v > 0),
724
- tokenPercent: emiTokenPercent,
725
- billingDay: emiBillingDay,
726
- surchargePercentPerMonth: emiSurchargePercentPerMonth,
727
- surchargeSellerSharePercent: emiSurchargeSellerSharePercent,
1235
+ tokenPercent: emiForm.emiTokenPercent,
1236
+ billingDay: emiForm.emiBillingDay,
1237
+ surchargePercentPerMonth: emiForm.emiSurchargePercentPerMonth,
1238
+ surchargeSellerSharePercent: emiForm.emiSurchargeSellerSharePercent,
728
1239
  },
729
1240
  gst: {
730
- enabled: gstEnabled,
731
- gstin: gstin.trim().toUpperCase(),
732
- legalName: gstLegalName.trim(),
733
- address: gstAddress.trim(),
1241
+ enabled: gstForm.gstEnabled,
1242
+ gstin: (gstForm.gstin ?? "").trim().toUpperCase(),
1243
+ legalName: (gstForm.gstLegalName ?? "").trim(),
1244
+ address: (gstForm.gstAddress ?? "").trim(),
734
1245
  },
735
1246
  // Masked credential fields resolve to "" when untouched — the repository's
736
1247
  // mergeEncryptedCredentials preserves the existing encrypted value for any
737
1248
  // "" field, so an unedited tab never overwrites a real secret with its
738
1249
  // own masked display string.
739
1250
  credentials: {
740
- razorpayKeyId: maskedOrReal("razorpayKeyId", razorpayKeyId),
741
- razorpayKeySecret: maskedOrReal("razorpayKeySecret", razorpayKeySecret),
742
- razorpayWebhookSecret: maskedOrReal("razorpayWebhookSecret", razorpayWebhookSecret),
743
- phonepeClientId: maskedOrReal("phonepeClientId", phonepeClientId),
744
- phonepeClientSecret: maskedOrReal("phonepeClientSecret", phonepeClientSecret),
745
- phonepeClientVersion: maskedOrReal("phonepeClientVersion", phonepeClientVersion),
746
- phonepeEnvironment: maskedOrReal("phonepeEnvironment", phonepeEnvironment),
747
- phonepeWebhookUsername: maskedOrReal("phonepeWebhookUsername", phonepeWebhookUsername),
748
- phonepeWebhookPassword: maskedOrReal("phonepeWebhookPassword", phonepeWebhookPassword),
749
- googleMapsApiKey: maskedOrReal("googleMapsApiKey", googleMapsApiKey),
750
- googlePlaceId: maskedOrReal("googlePlaceId", googlePlaceId),
751
- metaPageAccessToken: maskedOrReal("metaPageAccessToken", metaPageAccessToken),
752
- metaPageId: maskedOrReal("metaPageId", metaPageId),
753
- tiktokClientKey: maskedOrReal("tiktokClientKey", tiktokClientKey),
754
- tiktokClientSecret: maskedOrReal("tiktokClientSecret", tiktokClientSecret),
755
- tiktokAccessToken: maskedOrReal("tiktokAccessToken", tiktokAccessToken),
756
- deviantartClientId: maskedOrReal("deviantartClientId", deviantartClientId),
757
- deviantartClientSecret: maskedOrReal("deviantartClientSecret", deviantartClientSecret),
758
- whatsappPhoneNumberId: maskedOrReal("whatsappPhoneNumberId", waPhoneNumberId),
759
- whatsappCloudApiToken: maskedOrReal("whatsappCloudApiToken", waCloudApiToken),
760
- whatsappAdminNotifyNumbers: maskedOrReal("whatsappAdminNotifyNumbers", waAdminNotifyNumbers),
761
- whatsappTemplateLanguage: maskedOrReal("whatsappTemplateLanguage", waTemplateLanguage),
762
- whatsappTemplateOrderPlaced: maskedOrReal("whatsappTemplateOrderPlaced", waTemplateOrderPlaced),
763
- whatsappTemplateOrderConfirmed: maskedOrReal("whatsappTemplateOrderConfirmed", waTemplateOrderConfirmed),
764
- whatsappTemplateOrderShipped: maskedOrReal("whatsappTemplateOrderShipped", waTemplateOrderShipped),
765
- whatsappTemplateOrderDelivered: maskedOrReal("whatsappTemplateOrderDelivered", waTemplateOrderDelivered),
766
- whatsappTemplateOrderCancelled: maskedOrReal("whatsappTemplateOrderCancelled", waTemplateOrderCancelled),
767
- whatsappTemplateRefundInitiated: maskedOrReal("whatsappTemplateRefundInitiated", waTemplateRefundInitiated),
768
- resendApiKey: maskedOrReal("resendApiKey", resendApiKey),
1251
+ razorpayKeyId: maskedOrReal("razorpayKeyId", integrationsForm.razorpayKeyId ?? ""),
1252
+ razorpayKeySecret: maskedOrReal("razorpayKeySecret", integrationsForm.razorpayKeySecret ?? ""),
1253
+ razorpayWebhookSecret: maskedOrReal("razorpayWebhookSecret", integrationsForm.razorpayWebhookSecret ?? ""),
1254
+ cashfreeAppId: maskedOrReal("cashfreeAppId", integrationsForm.cashfreeAppId ?? ""),
1255
+ cashfreeSecretKey: maskedOrReal("cashfreeSecretKey", integrationsForm.cashfreeSecretKey ?? ""),
1256
+ cashfreeEnvironment: maskedOrReal("cashfreeEnvironment", integrationsForm.cashfreeEnvironment ?? ""),
1257
+ phonepeClientId: maskedOrReal("phonepeClientId", integrationsForm.phonepeClientId ?? ""),
1258
+ phonepeClientSecret: maskedOrReal("phonepeClientSecret", integrationsForm.phonepeClientSecret ?? ""),
1259
+ phonepeClientVersion: maskedOrReal("phonepeClientVersion", integrationsForm.phonepeClientVersion ?? ""),
1260
+ phonepeEnvironment: maskedOrReal("phonepeEnvironment", integrationsForm.phonepeEnvironment ?? ""),
1261
+ phonepeWebhookUsername: maskedOrReal("phonepeWebhookUsername", integrationsForm.phonepeWebhookUsername ?? ""),
1262
+ phonepeWebhookPassword: maskedOrReal("phonepeWebhookPassword", integrationsForm.phonepeWebhookPassword ?? ""),
1263
+ googleMapsApiKey: maskedOrReal("googleMapsApiKey", integrationsForm.googleMapsApiKey ?? ""),
1264
+ googlePlaceId: maskedOrReal("googlePlaceId", integrationsForm.googlePlaceId ?? ""),
1265
+ metaPageAccessToken: maskedOrReal("metaPageAccessToken", integrationsForm.metaPageAccessToken ?? ""),
1266
+ metaPageId: maskedOrReal("metaPageId", integrationsForm.metaPageId ?? ""),
1267
+ tiktokClientKey: maskedOrReal("tiktokClientKey", integrationsForm.tiktokClientKey ?? ""),
1268
+ tiktokClientSecret: maskedOrReal("tiktokClientSecret", integrationsForm.tiktokClientSecret ?? ""),
1269
+ tiktokAccessToken: maskedOrReal("tiktokAccessToken", integrationsForm.tiktokAccessToken ?? ""),
1270
+ deviantartClientId: maskedOrReal("deviantartClientId", integrationsForm.deviantartClientId ?? ""),
1271
+ deviantartClientSecret: maskedOrReal("deviantartClientSecret", integrationsForm.deviantartClientSecret ?? ""),
1272
+ whatsappPhoneNumberId: maskedOrReal("whatsappPhoneNumberId", whatsappForm.waPhoneNumberId ?? ""),
1273
+ whatsappCloudApiToken: maskedOrReal("whatsappCloudApiToken", whatsappForm.waCloudApiToken ?? ""),
1274
+ whatsappAdminNotifyNumbers: maskedOrReal("whatsappAdminNotifyNumbers", whatsappForm.waAdminNotifyNumbers ?? ""),
1275
+ whatsappTemplateLanguage: maskedOrReal("whatsappTemplateLanguage", whatsappForm.waTemplateLanguage ?? ""),
1276
+ whatsappTemplateOrderPlaced: maskedOrReal("whatsappTemplateOrderPlaced", whatsappForm.waTemplateOrderPlaced ?? ""),
1277
+ whatsappTemplateOrderConfirmed: maskedOrReal("whatsappTemplateOrderConfirmed", whatsappForm.waTemplateOrderConfirmed ?? ""),
1278
+ whatsappTemplateOrderShipped: maskedOrReal("whatsappTemplateOrderShipped", whatsappForm.waTemplateOrderShipped ?? ""),
1279
+ whatsappTemplateOrderDelivered: maskedOrReal("whatsappTemplateOrderDelivered", whatsappForm.waTemplateOrderDelivered ?? ""),
1280
+ whatsappTemplateOrderCancelled: maskedOrReal("whatsappTemplateOrderCancelled", whatsappForm.waTemplateOrderCancelled ?? ""),
1281
+ whatsappTemplateRefundInitiated: maskedOrReal("whatsappTemplateRefundInitiated", whatsappForm.waTemplateRefundInitiated ?? ""),
1282
+ resendApiKey: maskedOrReal("resendApiKey", notificationsForm.resendApiKey ?? ""),
769
1283
  },
770
1284
  emailSettings: {
771
- host: smtpHost, port: Number(smtpPort), user: smtpUser, fromAddress: smtpFrom,
772
- fromEmail: notifFromEmail, fromName: notifFromName,
1285
+ host: integrationsForm.smtpHost,
1286
+ port: Number(integrationsForm.smtpPort),
1287
+ user: integrationsForm.smtpUser,
1288
+ fromAddress: integrationsForm.smtpFrom,
1289
+ fromEmail: notificationsForm.notifFromEmail, fromName: notificationsForm.notifFromName,
773
1290
  dailyDigest: {
774
- enabled: digestEnabled,
775
- recipients: splitEmailList(digestRecipients),
1291
+ enabled: notificationsForm.digestEnabled,
1292
+ recipients: splitEmailList(notificationsForm.digestRecipients ?? ""),
776
1293
  // Always empty — the CC field is gone (see the Notifications tab).
777
1294
  // Sent explicitly rather than omitted so a save clears any CC list a
778
1295
  // pre-existing document still carries.
@@ -780,36 +1297,88 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
780
1297
  },
781
1298
  },
782
1299
  messaging: {
783
- emailEnabled: msgEmailEnabled,
784
- whatsappEnabled: msgWhatsappEnabled,
1300
+ emailEnabled: notificationsForm.msgEmailEnabled,
1301
+ whatsappEnabled: notificationsForm.msgWhatsappEnabled,
785
1302
  dailyCeiling: {
786
- email: msgCeilingEmail,
787
- whatsapp: msgCeilingWhatsapp,
1303
+ email: notificationsForm.msgCeilingEmail,
1304
+ whatsapp: notificationsForm.msgCeilingWhatsapp,
788
1305
  // No SMS sender exists; the ceiling is carried so one cannot ship
789
1306
  // uncapped if somebody adds a provider later.
790
1307
  sms: 50,
791
1308
  },
792
1309
  },
793
- integrations: { googleAnalyticsId: gaMeasurementId, facebookPixelId: fbPixelId, gtmContainerId, clarityProjectId },
794
- shipping: { freeShippingThreshold, defaultCarrier, maxDeliveryRadius },
795
- payment: { razorpayEnabled, phonepeEnabled, upiManualEnabled, codEnabled, codMaxOrderValue, otpCheckoutThreshold },
796
- auctionConfig: { bidIncrementTiers: bidIncrementTiers, autoExtendWindowMinutes: autoExtendWindow, settlementGracePeriodHours: settlementGrace },
797
- platformLimits: { maxProductsPerStore, maxCustomFieldsPerProduct: maxCustomFields, orderCancellationWindowHours: orderCancelWindow },
798
- legalPages: { terms: termsHtml, privacy: privacyHtml, refundPolicy: refundHtml, shipping: shippingPolicyHtml, cookies: cookieHtml, ethics: ethicsHtml, codeOfConduct: conductHtml, cancellation: cancellationHtml, grievance: grievanceHtml },
1310
+ integrations: {
1311
+ googleAnalyticsId: integrationsForm.gaMeasurementId,
1312
+ facebookPixelId: integrationsForm.fbPixelId,
1313
+ gtmContainerId: integrationsForm.gtmContainerId,
1314
+ clarityProjectId: integrationsForm.clarityProjectId,
1315
+ },
1316
+ shipping: {
1317
+ freeShippingThreshold: shippingForm.freeShippingThreshold,
1318
+ defaultCarrier: shippingForm.defaultCarrier,
1319
+ maxDeliveryRadius: shippingForm.maxDeliveryRadius,
1320
+ },
1321
+ /*
1322
+ * `platformStoreId` is trimmed and sent as `undefined` when blank rather
1323
+ * than as `""` — the resolver treats an empty-ish value as unset anyway,
1324
+ * but writing a literal empty string would record a DECISION ("no store
1325
+ * is ours") where none was made, and a stored `""` reads differently
1326
+ * from an absent key to anyone inspecting the document.
1327
+ */
1328
+ payment: {
1329
+ razorpayEnabled: shippingForm.razorpayEnabled,
1330
+ phonepeEnabled: shippingForm.phonepeEnabled,
1331
+ cashfreeEnabled: shippingForm.cashfreeEnabled,
1332
+ platformStoreId: (shippingForm.platformStoreId ?? "").trim() || undefined,
1333
+ upiManualEnabled: shippingForm.upiManualEnabled,
1334
+ codEnabled: shippingForm.codEnabled,
1335
+ codMaxOrderValue: shippingForm.codMaxOrderValue,
1336
+ otpCheckoutThreshold: shippingForm.otpCheckoutThreshold,
1337
+ },
1338
+ collectorDropConfig: {
1339
+ bidIncrementTiers: collectorDropForm.bidIncrementTiers,
1340
+ autoExtendWindowMinutes: collectorDropForm.autoExtendWindow,
1341
+ settlementGracePeriodHours: collectorDropForm.settlementGrace,
1342
+ },
1343
+ platformLimits: {
1344
+ maxProductsPerStore: limitsForm.maxProductsPerStore,
1345
+ maxCustomFieldsPerProduct: limitsForm.maxCustomFields,
1346
+ orderCancellationWindowHours: limitsForm.orderCancelWindow,
1347
+ },
1348
+ legalPages: {
1349
+ terms: legalForm.termsHtml,
1350
+ privacy: legalForm.privacyHtml,
1351
+ refundPolicy: legalForm.refundHtml,
1352
+ shipping: legalForm.shippingPolicyHtml,
1353
+ cookies: legalForm.cookieHtml,
1354
+ ethics: legalForm.ethicsHtml,
1355
+ codeOfConduct: legalForm.conductHtml,
1356
+ cancellation: legalForm.cancellationHtml,
1357
+ grievance: legalForm.grievanceHtml,
1358
+ },
799
1359
  // Both keys are always sent: Firestore's update() replaces a nested map
800
1360
  // wholesale, so omitting one here would wipe it. The load-time spread this
801
1361
  // used to carry existed to preserve `adminCheckoutBypass`, which is now a
802
1362
  // permission rather than a stored flag.
803
1363
  listings: {
804
- listingTypes: listingTypeFlags,
805
- categoryTypes: categoryTypeFlags,
806
- browsePages: browsePageFlags,
1364
+ listingTypes: listingsForm.listingTypeFlags,
1365
+ categoryTypes: listingsForm.categoryTypeFlags,
1366
+ browsePages: listingsForm.browsePageFlags,
807
1367
  },
808
1368
  notificationChannels: {
809
1369
  inApp: { enabled: true, readOnly: true },
810
- email: { enabled: notifEmailEnabled, minPriority: notifEmailMinPriority, types: notifEmailTypes },
811
- whatsapp: { enabled: notifWhatsappEnabled, minPriority: notifWhatsappMinPriority, otpEnabled: notifWhatsappOtpEnabled, types: notifWhatsappTypes },
812
- sms: { enabled: notifSmsEnabled, minPriority: notifSmsMinPriority },
1370
+ email: {
1371
+ enabled: notificationsForm.notifEmailEnabled,
1372
+ minPriority: notificationsForm.notifEmailMinPriority,
1373
+ types: notificationsForm.notifEmailTypes,
1374
+ },
1375
+ whatsapp: {
1376
+ enabled: notificationsForm.notifWhatsappEnabled,
1377
+ minPriority: notificationsForm.notifWhatsappMinPriority,
1378
+ otpEnabled: notificationsForm.notifWhatsappOtpEnabled,
1379
+ types: notificationsForm.notifWhatsappTypes,
1380
+ },
1381
+ sms: { enabled: notificationsForm.notifSmsEnabled, minPriority: notificationsForm.notifSmsMinPriority },
813
1382
  },
814
1383
  };
815
1384
  }
@@ -844,17 +1413,6 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
844
1413
  { label: "Image", value: "image" },
845
1414
  { label: "Video", value: "video" },
846
1415
  ];
847
- const CARRIER_OPTIONS = [
848
- { label: "Custom / Other", value: "custom" },
849
- { label: "Shiprocket", value: "shiprocket" },
850
- { label: "Delhivery", value: "delhivery" },
851
- { label: "Bluedart", value: "bluedart" },
852
- { label: "FedEx", value: "fedex" },
853
- ];
854
- const PHONEPE_ENVIRONMENT_OPTIONS = [
855
- { label: "Sandbox (test)", value: "sandbox" },
856
- { label: "Production (live)", value: "production" },
857
- ];
858
1416
  /*
859
1417
  * 🛑 DERIVED. This was a hand-written literal and it had drifted in both
860
1418
  * directions at once: `art` and `stickers` were MISSING — so an admin had no
@@ -901,61 +1459,18 @@ export function AdminSiteSettingsView({ labels = {}, ...rest }) {
901
1459
  }
902
1460
  saveAllMutation.mutate();
903
1461
  };
904
- return (_jsx(StackedViewShell, { portal: "admin", ...rest, title: labels.title ?? "Site Settings", sections: [
905
- isLoading ? (_jsx(Alert, { variant: "info", title: "Loading", children: "Fetching site settings\u2026" }, "loading")) : null,
906
- error ? (_jsx(Alert, { variant: "error", title: "Load failed", children: error instanceof Error ? error.message : "Unknown error" }, "error")) : null,
907
- _jsxs(FormShellContext.Provider, { value: shellCtx, children: [_jsxs(Tabs, { value: activeTab,
908
- /*
909
- * `Tabs` hands back a bare string, so it is narrowed here rather
910
- * than cast. An unknown value is ignored instead of being written
911
- * into state — the same reason `?tab=` is validated on the way in.
912
- */
913
- onChange: (next) => {
914
- if (isSiteSettingsTabId(next))
915
- setActiveTab(next);
916
- }, children: [_jsx(TabsList, { children: SITE_SETTINGS_TABS.map((tab) => (_jsx(TabsTrigger, { value: tab.id, children: tab.label }, tab.id))) }), _jsx(TabsContent, { value: "about", children: _jsxs(SettingsTabForm, { id: "about", label: "About", children: [_jsx(Text, { size: "xs", color: "muted", children: "Override the About page content. Leave blank to use the platform defaults." }), _jsx(Input, { label: "Hero title", value: aboutTitle, onChange: (e) => setAboutTitle(e.target.value), placeholder: "About LetItRip" }), _jsx(Input, { label: "Hero subtitle", value: aboutSubtitle, onChange: (e) => setAboutSubtitle(e.target.value), placeholder: "Connecting buyers, sellers, and bidders in one vibrant marketplace" }), _jsx(Input, { label: "Mission section title", value: aboutMissionTitle, onChange: (e) => setAboutMissionTitle(e.target.value), placeholder: "Our Mission" }), _jsx(_Fragment, { children: _jsx(Textarea, { label: "Mission text", value: aboutMissionText, onChange: (e) => setAboutMissionText(e.target.value), placeholder: "LetItRip was built to democratise commerce\u2026", rows: 4 }) }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: '"How it works" section title', value: aboutHowItWorksTitle, onChange: (e) => setAboutHowItWorksTitle(e.target.value), placeholder: "How It Works" }), aboutHowItems.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Step ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutHowItems(aboutHowItems.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Icon (emoji)", value: item.icon, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, icon: e.target.value }; setAboutHowItems(next); }, placeholder: "\uD83D\uDED2" }), _jsx(Input, { label: "Title", value: item.title, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, title: e.target.value }; setAboutHowItems(next); } }), _jsx(Textarea, { value: item.text, onChange: (e) => { const next = [...aboutHowItems]; next[i] = { ...item, text: e.target.value }; setAboutHowItems(next); }, rows: 2 })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutHowItems([...aboutHowItems, { title: "", text: "", icon: "✨", tone: "indigo" }]), children: "+ Add step" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Values section title", value: aboutValuesTitle, onChange: (e) => setAboutValuesTitle(e.target.value), placeholder: "Our Values" }), _jsx(Input, { label: "Values section subtitle", value: aboutValuesSubtitle, onChange: (e) => setAboutValuesSubtitle(e.target.value), placeholder: "Optional intro line under the heading" }), aboutValueItems.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Value ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutValueItems(aboutValueItems.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Icon (emoji)", value: item.icon, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, icon: e.target.value }; setAboutValueItems(next); }, placeholder: "\uD83D\uDEE1\uFE0F" }), _jsx(Input, { label: "Title", value: item.title, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, title: e.target.value }; setAboutValueItems(next); } }), _jsx(Textarea, { label: "Text", value: item.text, onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, text: e.target.value }; setAboutValueItems(next); }, rows: 2 }), _jsx(Textarea, { label: "Detail (optional)", value: item.detail ?? "", onChange: (e) => { const next = [...aboutValueItems]; next[i] = { ...item, detail: e.target.value }; setAboutValueItems(next); }, rows: 2, placeholder: "How this value is actually enforced" })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutValueItems([...aboutValueItems, { title: "", text: "", icon: "✨" }]), children: "+ Add value" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Milestones section title", value: aboutMilestonesTitle, onChange: (e) => setAboutMilestonesTitle(e.target.value), placeholder: "Our Journey" }), aboutMilestones.map((item, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Milestone ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutMilestones(aboutMilestones.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(Input, { label: "Year", value: item.year, onChange: (e) => { const next = [...aboutMilestones]; next[i] = { ...item, year: e.target.value }; setAboutMilestones(next); }, placeholder: "2024" }), _jsx(Textarea, { value: item.text, onChange: (e) => { const next = [...aboutMilestones]; next[i] = { ...item, text: e.target.value }; setAboutMilestones(next); }, rows: 2 })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutMilestones([...aboutMilestones, { year: "", text: "" }]), children: "+ Add milestone" })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Input, { label: "Team section title", value: aboutTeamTitle, onChange: (e) => setAboutTeamTitle(e.target.value), placeholder: "Meet the Team" }), _jsx(Input, { label: "Team section subtitle", value: aboutTeamSubtitle, onChange: (e) => setAboutTeamSubtitle(e.target.value), placeholder: "The people building LetItRip" }), aboutTeamMembers.map((member, i) => (_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsxs(Row, { justify: "between", align: "center", children: [_jsxs(Text, { size: "xs", weight: "medium", color: "muted", children: ["Team member ", i + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setAboutTeamMembers(aboutTeamMembers.filter((_, idx) => idx !== i)), children: "\u2715" })] }), _jsx(ImageUpload, { label: "Photo", currentImage: member.photoUrl, onUpload: (file) => upload(file, "store"), onChange: (url) => { const next = [...aboutTeamMembers]; next[i] = { ...member, photoUrl: url }; setAboutTeamMembers(next); } }), _jsx(Input, { label: "Name", value: member.name, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, name: e.target.value }; setAboutTeamMembers(next); } }), _jsx(Input, { label: "Role", value: member.role, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, role: e.target.value }; setAboutTeamMembers(next); }, placeholder: "Founder & Developer" }), _jsx(Textarea, { value: member.bio, onChange: (e) => { const next = [...aboutTeamMembers]; next[i] = { ...member, bio: e.target.value }; setAboutTeamMembers(next); }, rows: 3 }), _jsxs(Row, { gap: "md", children: [_jsx(Toggle, { label: "Founder", checked: !!member.isFounder, onChange: (v) => { const next = [...aboutTeamMembers]; next[i] = { ...member, isFounder: v }; setAboutTeamMembers(next); } }), _jsx(Toggle, { label: "Developer", checked: !!member.isDeveloper, onChange: (v) => { const next = [...aboutTeamMembers]; next[i] = { ...member, isDeveloper: v }; setAboutTeamMembers(next); } })] })] }, i))), _jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setAboutTeamMembers([...aboutTeamMembers, { name: "", role: "", bio: "" }]), children: "+ Add team member" })] }), _jsx(Input, { label: "CTA banner title", value: aboutCtaTitle, onChange: (e) => setAboutCtaTitle(e.target.value), placeholder: "Ready to get started?" }), _jsx(Input, { label: "Sell CTA copy", value: aboutCtaSell, onChange: (e) => setAboutCtaSell(e.target.value), placeholder: "Start selling in minutes" }), _jsx(Input, { label: "Shop CTA copy", value: aboutCtaShop, onChange: (e) => setAboutCtaShop(e.target.value), placeholder: "Browse the marketplace" })] }) }), _jsx(TabsContent, { value: "branding", children: _jsxs(SettingsTabForm, { id: "branding", label: "Branding", children: [_jsx(Input, { label: "Site name", value: siteName, onChange: (e) => setSiteName(e.target.value), placeholder: "LetItRip" }), _jsx(Input, { label: "Tagline", value: tagline, onChange: (e) => setTagline(e.target.value), placeholder: "India's Largest Collectibles Marketplace" }), _jsx(ImageUpload, { label: "Logo", currentImage: logoUrl, onUpload: (file) => upload(file, "store"), onChange: setLogoUrl }), _jsx(ImageUpload, { label: "Favicon", currentImage: faviconUrl, onUpload: (file) => upload(file, "store"), onChange: setFaviconUrl }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-maintenance-mode", children: _jsx(Toggle, { label: "Maintenance mode", checked: maintenanceMode, onChange: setMaintenanceMode }) }), _jsx(Input, { label: "Maintenance message", value: maintenanceMessage, onChange: (e) => setMaintenanceMessage(e.target.value), placeholder: "We're back soon.", disabled: !maintenanceMode })] })] }) }), _jsx(TabsContent, { value: "appearance", children: _jsxs(SettingsTabForm, { id: "appearance", label: "Appearance", children: [_jsx(Text, { size: "xs", color: "muted", children: "Sets the background behind the public shell, dashboard sidebars, and any Section/Card that opts into it. Leave the value blank for a plain surface." }), _jsxs(Grid, { cols: 2, gap: "lg", children: [_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Light mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: lightBgType, onValueChange: (v) => setLightBgType(v) }), lightBgType === "color" ? (_jsx(Input, { type: "color", label: "Color", value: lightBgValue || "#ffffff", onChange: (e) => setLightBgValue(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : lightBgType === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: lightBgValue, onChange: (e) => setLightBgValue(e.target.value), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: lightBgType === "video" ? "Background video" : "Background image", kind: lightBgType === "video" ? "video" : "image", value: lightBgValue, onChange: setLightBgValue, onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: lightBgOverlayEnabled, onChange: setLightBgOverlayEnabled }), lightBgOverlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: lightBgOverlayColor, onChange: (e) => setLightBgOverlayColor(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: lightBgOverlayOpacity, onChange: setLightBgOverlayOpacity })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: "light", lightMode: {
917
- type: lightBgType,
918
- value: lightBgValue,
919
- overlay: { enabled: lightBgOverlayEnabled, color: lightBgOverlayColor, opacity: lightBgOverlayOpacity / 100 },
920
- }, darkMode: { type: "color", value: "" } }) })] }), _jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Dark mode" }), _jsx(Select, { label: "Type", options: BG_TYPE_OPTIONS, value: darkBgType, onValueChange: (v) => setDarkBgType(v) }), darkBgType === "color" ? (_jsx(Input, { type: "color", label: "Color", value: darkBgValue || "#000000", onChange: (e) => setDarkBgValue(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }) /* audit-hex-tokens-ok: native color picker requires literal hex string fallback */) : darkBgType === "gradient" ? (_jsx(Textarea, { label: "CSS gradient expression", rows: 2, value: darkBgValue, onChange: (e) => setDarkBgValue(e.target.value), placeholder: "linear-gradient(...)" })) : (_jsx(MediaUploadField, { label: darkBgType === "video" ? "Background video" : "Background image", kind: darkBgType === "video" ? "video" : "image", value: darkBgValue, onChange: setDarkBgValue, onUpload: (file) => upload(file, "store") })), _jsx(Toggle, { label: "Dim overlay", checked: darkBgOverlayEnabled, onChange: setDarkBgOverlayEnabled }), darkBgOverlayEnabled && (_jsxs(_Fragment, { children: [_jsx(Input, { type: "color", label: "Overlay color", value: darkBgOverlayColor, onChange: (e) => setDarkBgOverlayColor(e.target.value), className: "h-10 w-full cursor-pointer", bare: true }), " ", _jsx(Slider, { label: "Overlay opacity", min: 0, max: 100, value: darkBgOverlayOpacity, onChange: setDarkBgOverlayOpacity })] })), _jsx(Text, { size: "xs", color: "muted", children: "Preview" }), _jsx(Div, { className: "relative h-24 w-full", overflow: "hidden", rounded: "md", border: "default", children: _jsx(BackgroundRenderer, { mode: "dark", lightMode: { type: "color", value: "" }, darkMode: {
921
- type: darkBgType,
922
- value: darkBgValue,
923
- overlay: { enabled: darkBgOverlayEnabled, color: darkBgOverlayColor, opacity: darkBgOverlayOpacity / 100 },
924
- } }) })] })] })] }) }), _jsx(TabsContent, { value: "themes", children: _jsx(SettingsTabForm, { id: "themes", label: "Themes", children: _jsx(ThemeManagerView, { value: themeRegistry, onChange: setThemeRegistry, previewOrigin: "/" }) }) }), _jsx(TabsContent, { value: "announcement", children: _jsxs(SettingsTabForm, { id: "announcement", label: "Announcement", children: [_jsx(Div, { id: "setting-announcement-bar", children: _jsx(Toggle, { label: "Show announcement bar", checked: announcementEnabled, onChange: setAnnouncementEnabled }) }), _jsx(Input, { label: "Announcement text", value: announcementText, onChange: (e) => setAnnouncementText(e.target.value), placeholder: "\uD83C\uDF89 Free shipping on orders \u20B9999+", disabled: !announcementEnabled }), _jsx(Input, { label: "Link URL (optional)", value: announcementLink, onChange: (e) => setAnnouncementLink(e.target.value), placeholder: String(ROUTES.PUBLIC.PRODUCTS), disabled: !announcementEnabled }), _jsxs(Stack, { gap: "none", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "mb-1", children: "Background color" }), _jsx(Input, { type: "color", "aria-label": "Background color", value: announcementBg || "#1d4ed8", onChange: (e) => setAnnouncementBg(e.target.value), className: "h-10 w-32 cursor-pointer", bare: true, disabled: !announcementEnabled }), " "] })] }) }), _jsx(TabsContent, { value: "seo", children: _jsxs(SettingsTabForm, { id: "seo", label: "Seo", children: [_jsx(Input, { label: "Default meta title", value: seoTitle, onChange: (e) => setSeoTitle(e.target.value), placeholder: "LetItRip \u2014 Buy, Sell & Auction Collectibles in India", maxLength: 60, helperText: "Max 60 chars. Use {page} token for dynamic insertion." }), _jsx(Input, { label: "Default meta description", value: seoDescription, onChange: (e) => setSeoDescription(e.target.value), placeholder: "India's largest collectibles marketplace\u2026", maxLength: 160, helperText: "Max 160 chars." }), _jsx(ImageUpload, { label: "Default OG image", currentImage: seoOgImage, onUpload: (file) => upload(file, "store"), onChange: setSeoOgImage }), _jsx(Input, { label: "Canonical base URL", value: canonicalUrl, onChange: (e) => setCanonicalUrl(e.target.value), placeholder: "https://letitrip.in" }), _jsx(Div, { id: "setting-robots-noindex", children: _jsx(Toggle, { label: "Robots noindex (disables search indexing \u2014 use carefully)", checked: seoNoIndex, onChange: setSeoNoIndex }) })] }) }), _jsx(TabsContent, { value: "contact", children: _jsxs(SettingsTabForm, { id: "contact", label: "Contact", children: [_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Support email", value: supportEmail, onChange: (e) => setSupportEmail(e.target.value), type: "email", placeholder: "support@letitrip.in" }), _jsx(Input, { label: "Support phone", value: supportPhone, onChange: (e) => setSupportPhone(e.target.value), placeholder: "+91 XXXXX XXXXX" })] }), _jsx(Input, { label: "Physical address", value: supportAddress, onChange: (e) => setSupportAddress(e.target.value), placeholder: "Mumbai, Maharashtra, India" }), _jsx(Input, { label: "Support hours", value: supportHours, onChange: (e) => setSupportHours(e.target.value), placeholder: "Mon\u2013Fri, 10 AM \u2013 6 PM IST" }), _jsx(Text, { className: "pt-[0.5rem]", color: "muted", size: "sm", weight: "medium", children: "Social links" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Instagram URL", value: instagram, onChange: (e) => setInstagram(e.target.value), placeholder: "https://instagram.com/letitrip" }), _jsx(Input, { label: "Twitter / X URL", value: twitter, onChange: (e) => setTwitter(e.target.value), placeholder: "https://twitter.com/letitrip" }), _jsx(Input, { label: "Facebook URL", value: facebook, onChange: (e) => setFacebook(e.target.value), placeholder: "https://facebook.com/letitrip" }), _jsx(Input, { label: "YouTube URL", value: youtube, onChange: (e) => setYoutube(e.target.value), placeholder: "https://youtube.com/@letitrip" }), _jsx(Input, { label: "WhatsApp number", value: whatsapp, onChange: (e) => setWhatsapp(e.target.value), placeholder: "+91XXXXXXXXXX" }), _jsx(Input, { label: "Business UPI VPA", value: upiVpa, onChange: (e) => setUpiVpa(e.target.value), placeholder: "name@bank" }), _jsx(Input, { label: "LinkedIn URL", value: linkedin, onChange: (e) => setLinkedin(e.target.value), placeholder: "https://linkedin.com/company/letitrip" }), _jsx(Input, { label: "Pinterest URL", value: pinterest, onChange: (e) => setPinterest(e.target.value), placeholder: "https://pinterest.com/letitrip" })] })] }) }), _jsx(TabsContent, { value: "watermark", children: _jsxs(SettingsTabForm, { id: "watermark", label: "Watermark", children: [_jsx(Select, { label: "Watermark type", options: [{ label: "Text", value: "text" }, { label: "Image", value: "image" }], value: watermarkType, onValueChange: (v) => setWatermarkType(v) }), watermarkType === "text" ? (_jsx(Input, { label: "Watermark text", value: watermarkText, onChange: (e) => setWatermarkText(e.target.value), placeholder: "letitrip.in" })) : (_jsx(ImageUpload, { label: "Watermark image", currentImage: watermarkImageUrl, onUpload: (file) => upload(file, "store"), onChange: setWatermarkImageUrl })), _jsx(Slider, { label: `Size — ${watermarkSize}% of image width`, value: watermarkSize, onChange: setWatermarkSize, min: 5, max: 100, step: 5 }), _jsx(Slider, { label: `Opacity — ${watermarkOpacity}%`, value: watermarkOpacity, onChange: setWatermarkOpacity, min: 5, max: 100, step: 5 }), _jsx(Select, { label: "Position", options: [
925
- { label: "Center", value: "center" },
926
- { label: "Top left", value: "top-left" },
927
- { label: "Top right", value: "top-right" },
928
- { label: "Bottom left", value: "bottom-left" },
929
- { label: "Bottom right", value: "bottom-right" },
930
- ], value: watermarkPosition, onValueChange: (v) => setWatermarkPosition(v), disabled: watermarkUseCustomOffset }), _jsx(Toggle, { checked: watermarkUseCustomOffset, onChange: setWatermarkUseCustomOffset, label: "Use a custom X/Y offset instead" }), watermarkUseCustomOffset && (_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "X offset (%) \u2014 + right / \u2212 left of center", value: String(watermarkOffsetX), onChange: (e) => setWatermarkOffsetX(Math.max(-45, Math.min(45, parseInt(e.target.value) || 0))), type: "number", min: -45, max: 45 }), _jsx(Input, { label: "Y offset (%) \u2014 + down / \u2212 up from center", value: String(watermarkOffsetY), onChange: (e) => setWatermarkOffsetY(Math.max(-45, Math.min(45, parseInt(e.target.value) || 0))), type: "number", min: -45, max: 45 })] })), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "xs", color: "muted", children: "Preview (text watermark only)" }), _jsx(Row, { surface: "default", justify: "end", align: "end", className: `relative h-32 ${__O.hidden}`, rounded: "default", children: _jsx(Span, { ref: watermarkPreviewRef, weight: "medium", color: "faint", padding: "1", className: "select-none", children: watermarkText }) })] })] }) }), _jsx(TabsContent, { value: "fees", children: _jsxs(SettingsTabForm, { id: "fees", label: "Fees", children: [_jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Platform fee \u2014 our cut (%)", helperText: "% charged on order value. Buyer pays this.", value: String(platformFeePercent), onChange: (e) => setPlatformFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "GST on platform fee (%)", helperText: "Applied to our fee only (not full order). Usually 18%.", value: String(gstPercent), onChange: (e) => setGstPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "PhonePe gateway cost (%)", helperText: "Gateway's own fee \u2014 absorbed by platform, not passed through.", value: String(gatewayFeePercent), onChange: (e) => setGatewayFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 10, step: 0.01 }), _jsx(Input, { label: "Minimum transaction fee (\u20B9)", helperText: "Per-transaction floor. Total charge will never be below base + this.", value: String(minimumTransactionFee), onChange: (e) => setMinimumTransactionFee(parseFloat(e.target.value) || 0), type: "number", min: 0, step: 0.01 }), _jsx(Input, { label: "Maximum platform fee (\u20B9)", helperText: "Ceiling on the buyer's platform commission, charged once per checkout on every payment method. GST is calculated on the capped amount.", value: String(platformFeeMax), onChange: (e) => setPlatformFeeMax(parseFloat(e.target.value) || 0), type: "number", min: 0, step: 0.01 }), _jsx(Input, { label: "Seller payout hold (days)", value: String(payoutHoldDays), onChange: (e) => setPayoutHoldDays(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Minimum payout amount (\u20B9)", value: String(minPayoutAmount), onChange: (e) => setMinPayoutAmount(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Auction listing fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it.", value: String(auctionListingFee), onChange: (e) => setAuctionListingFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Pre-order listing fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it.", value: String(preOrderListingFee), onChange: (e) => setPreOrderListingFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Featured slot fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it. /admin/deals sets isPromoted for free today.", value: String(featuredSlotFee), onChange: (e) => setFeaturedSlotFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Promoted slot fee (\u20B9)", helperText: "Not charged yet \u2014 no billing path exists for seller listing fees. Setting a value records the intended price; nothing collects it. /admin/deals sets isPromoted for free today.", value: String(promotedSlotFee), onChange: (e) => setPromotedSlotFee(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "COD deposit (%)", helperText: "% of order collected upfront on COD orders; remainder paid on delivery.", value: String(codDepositPercent), onChange: (e) => setCodDepositPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 })] }), _jsx(Toggle, { checked: whatsappNotifyFeeEnabled, onChange: setWhatsappNotifyFeeEnabled, label: "Offer the WhatsApp order-updates addon at checkout" }), _jsx(Grid, { cols: 2, gap: "md", children: _jsx(Input, { label: "WhatsApp addon fee (\u20B9)", helperText: "Flat fee charged to the buyer when they opt in. Requires WhatsApp credentials + at least one approved template \u2014 see the WhatsApp tab.", value: String(whatsappNotifyFee), onChange: (e) => setWhatsappNotifyFee(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !whatsappNotifyFeeEnabled }) }), _jsx(Toggle, { checked: giftWrapFeeEnabled, onChange: setGiftWrapFeeEnabled, label: "Offer the gift-wrap addon at checkout" }), _jsx(Grid, { cols: 2, gap: "md", children: _jsx(Input, { label: "Gift wrap fee (\u20B9)", helperText: "Flat fee charged to the buyer when they opt in.", value: String(giftWrapFee), onChange: (e) => setGiftWrapFee(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !giftWrapFeeEnabled }) }), _jsx(Toggle, { checked: shipmentProtectionFeeEnabled, onChange: setShipmentProtectionFeeEnabled, label: "Offer the shipment-protection addon at checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Shipment protection (%)", helperText: "% of order subtotal, charged when the buyer opts in.", value: String(shipmentProtectionFeePercent), onChange: (e) => setShipmentProtectionFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1, disabled: !shipmentProtectionFeeEnabled }), _jsx(Input, { label: "Shipment protection minimum (\u20B9)", helperText: "Floor for the shipment-protection fee.", value: String(shipmentProtectionFeeMin), onChange: (e) => setShipmentProtectionFeeMin(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !shipmentProtectionFeeEnabled })] }), _jsx(Toggle, { checked: saleProtectionFeeEnabled, onChange: setSaleProtectionFeeEnabled, label: "Offer the sale-protection addon at checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Sale protection (%)", helperText: "% of order subtotal, charged when the buyer opts in. Covers the item against not-as-described and counterfeit claims.", value: String(saleProtectionFeePercent), onChange: (e) => setSaleProtectionFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1, disabled: !saleProtectionFeeEnabled }), _jsx(Input, { label: "Sale protection minimum (\u20B9)", helperText: "Floor for the sale-protection fee.", value: String(saleProtectionFeeMin), onChange: (e) => setSaleProtectionFeeMin(parseFloat(e.target.value) || 0), type: "number", min: 0, disabled: !saleProtectionFeeEnabled })] }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "COD handling fee (%)", helperText: "% of order subtotal, charged on Cash-on-Delivery orders only.", value: String(codHandlingFeePercent), onChange: (e) => setCodHandlingFeePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "COD handling fee cap (\u20B9)", helperText: "Ceiling for the COD handling fee, however large the order.", value: String(codHandlingFeeCap), onChange: (e) => setCodHandlingFeeCap(parseFloat(e.target.value) || 0), type: "number", min: 0 })] })] }) }), _jsx(TabsContent, { value: "procurement", children: _jsxs(SettingsTabForm, { id: "procurement", label: "Procurement", children: [_jsx(Text, { size: "xs", color: "muted", children: "Used to compute each procurement shipment's labor cost (hours spent \u00D7 hourly rate) and its estimated processing time (hours spent \u00F7 max hours/day)." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Hourly rate (\u20B9)", helperText: "Your effective hourly wage for sorting/categorizing/listing a shipment.", value: String(laborHourlyRate), onChange: (e) => setLaborHourlyRate(Math.round((parseFloat(e.target.value) || 0) * 100) / 100), type: "number", min: 0 }), _jsx(Input, { label: "Max hours per day", helperText: "Used only to project how many days a shipment's tracked hours will take.", value: String(laborMaxHoursPerDay), onChange: (e) => setLaborMaxHoursPerDay(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 24 })] })] }) }), _jsx(TabsContent, { value: "emi", children: _jsxs(SettingsTabForm, { id: "emi", label: "Emi", children: [_jsx(Text, { size: "xs", color: "muted", children: "A seller must also opt in via their own Payout Settings for EMI to appear at checkout on their items. See the \"How EMI Works\" public page for buyer-facing copy." }), _jsx(Toggle, { checked: emiEnabled, onChange: setEmiEnabled, label: "Enable EMI platform-wide" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Minimum order value (\u20B9)", helperText: "A seller's cart subtotal must exceed this for EMI to appear as an option.", value: String(emiMinOrderValue), onChange: (e) => setEmiMinOrderValue(Math.round((parseFloat(e.target.value) || 0) * 100) / 100), type: "number", min: 0 }), _jsx(Input, { label: "Tenure options (months, comma-separated)", helperText: "e.g. 2,3,4,5,6", value: emiTenureOptionsText, onChange: (e) => setEmiTenureOptionsText(e.target.value) }), _jsx(Input, { label: "Token / down-payment (%)", helperText: "Collected upfront at checkout.", value: String(emiTokenPercent), onChange: (e) => setEmiTokenPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100 }), _jsx(Input, { label: "Billing day (1\u201310)", helperText: "Day of month each installment is due.", value: String(emiBillingDay), onChange: (e) => setEmiBillingDay(parseFloat(e.target.value) || 1), type: "number", min: 1, max: 10 }), _jsx(Input, { label: "Surcharge (% of principal per month)", helperText: "The 'excess EMI fee' the buyer pays for spreading payment.", value: String(emiSurchargePercentPerMonth), onChange: (e) => setEmiSurchargePercentPerMonth(parseFloat(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Seller's share of surcharge (%)", helperText: "The rest of the surcharge goes to the platform.", value: String(emiSurchargeSellerSharePercent), onChange: (e) => setEmiSurchargeSellerSharePercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100 })] })] }) }), _jsx(TabsContent, { value: "gst", children: _jsxs(SettingsTabForm, { id: "gst", label: "Gst", children: [_jsx(Text, { size: "xs", color: "muted", children: "Required before enabling GST-inclusive checkout (P-8). Also set a GST rate + HSN code on each taxable product for the tax breakdown to appear." }), _jsx(Toggle, { checked: gstEnabled, onChange: setGstEnabled, label: "Enable GST on checkout" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "GSTIN", helperText: "15-character GST Identification Number.", error: gstProblems.gstin, value: gstin, onChange: (e) => setGstin(e.target.value), placeholder: "29AAAAA0000A1Z5", maxLength: 15 }), _jsx(Input, { label: "Legal name", helperText: "Registered business name for invoices.", error: gstProblems.legalName, value: gstLegalName, onChange: (e) => setGstLegalName(e.target.value), placeholder: "LetItRip Collectibles Pvt Ltd" })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Textarea, { label: "Registered address", value: gstAddress, onChange: (e) => setGstAddress(e.target.value), placeholder: "Registered business address for GST invoices\u2026", rows: 3 }), gstProblems.address ? (_jsx(Text, { size: "sm", variant: "error", role: "alert", children: gstProblems.address })) : null] })] }) }), _jsx(TabsContent, { value: "listings", children: _jsxs(SettingsTabForm, { id: "listings", label: "Listings", children: [_jsx(Text, { size: "xs", color: "muted", children: "Which listing and category types the marketplace offers. A disabled type is hidden from every browse surface and rejected on create and add-to-cart \u2014 existing data is untouched, it just becomes unreachable until re-enabled." }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Listing types" }), _jsx(Text, { size: "xs", color: "muted", children: "Disabled types are hidden from listings and reject create/add-to-cart." }), _jsx(Grid, { cols: 2, gap: "sm", children: LISTING_TYPE_KEYS.map((key) => (_jsx(Toggle, {
931
- // The plugin's own display label, not the raw key — the
932
- // literal version rendered "pre-order" and
933
- // "digital-code" at an admin.
934
- label: pluginFor(key).typeLabel, checked: listingTypeFlags[key] ?? true, onChange: (v) => setListingTypeFlags((prev) => ({ ...prev, [key]: v })) }, key))) })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Category types" }), _jsx(Grid, { cols: 2, gap: "sm", children: CATEGORY_TYPE_KEYS.map((key) => (_jsx(Toggle, { label: key, checked: categoryTypeFlags[key] ?? true, onChange: (v) => setCategoryTypeFlags((prev) => ({ ...prev, [key]: v })) }, key))) })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Browse sections" }), _jsx(Text, { size: "xs", color: "muted", children: "A closed section returns Not Found and disappears from the navbar, the sidebar, the mobile menu, the footer and the sitemap. Products, categories and stores are untouched \u2014 only the public way in is withdrawn, and re-opening restores it." }), _jsx(Grid, { cols: 2, gap: "sm", children: BROWSE_PAGE_KEYS.map((key) => (_jsxs(Stack, { gap: "xs", children: [_jsx(Toggle, { label: BROWSE_PAGE_META[key]?.label ?? key, checked: browsePageFlags[key] ?? true, onChange: (v) => setBrowsePageFlags((prev) => ({ ...prev, [key]: v })) }), _jsx(Text, { size: "xs", color: "muted", children: BROWSE_PAGE_META[key]?.hint })] }, key))) })] })] }) }), _jsx(TabsContent, { value: "integrations", children: _jsxs(SettingsTabForm, { id: "integrations", label: "Integrations", children: [_jsx(Text, { size: "xs", color: "muted", children: "Keys are masked in transit and stored encrypted. Click Reveal to view." }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Razorpay" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Razorpay Key ID", value: razorpayKeyId, onChange: setRazorpayKeyId, placeholder: "rzp_test_\u2026 / rzp_live_\u2026" }), _jsx(MaskedInput, { label: "Razorpay Key Secret", value: razorpayKeySecret, onChange: setRazorpayKeySecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "Razorpay Webhook Secret", value: razorpayWebhookSecret, onChange: setRazorpayWebhookSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "PhonePe" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "PhonePe Client ID", value: phonepeClientId, onChange: setPhonepeClientId, placeholder: "MERCHANTID_\u2026" }), _jsx(MaskedInput, { label: "PhonePe Client Secret", value: phonepeClientSecret, onChange: setPhonepeClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(Input, { label: "PhonePe Client Version", value: phonepeClientVersion, onChange: (e) => setPhonepeClientVersion(e.target.value), placeholder: "1" }), _jsx(Select, { label: "PhonePe Environment", options: PHONEPE_ENVIRONMENT_OPTIONS, value: phonepeEnvironment, onValueChange: setPhonepeEnvironment }), _jsx(MaskedInput, { label: "PhonePe Webhook Username", value: phonepeWebhookUsername, onChange: setPhonepeWebhookUsername, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "PhonePe Webhook Password", value: phonepeWebhookPassword, onChange: setPhonepeWebhookPassword, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "SMTP / Email" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "SMTP host", value: smtpHost, onChange: (e) => setSmtpHost(e.target.value), placeholder: "smtp.sendgrid.net" }), _jsx(Input, { label: "SMTP port", value: smtpPort, onChange: (e) => setSmtpPort(e.target.value), type: "number", placeholder: "587" }), _jsx(Input, { label: "SMTP user", value: smtpUser, onChange: (e) => setSmtpUser(e.target.value), placeholder: "apikey" })] }), _jsx(Input, { label: "From address", value: smtpFrom, onChange: (e) => setSmtpFrom(e.target.value), placeholder: "noreply@letitrip.in", type: "email" }), _jsx(Text, { size: "xs", color: "muted", children: "Transactional email is delivered through Resend \u2014 set the Resend API key below. These SMTP fields are stored but not currently used for delivery." })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Google Places (store reviews)" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Google Maps API key", value: googleMapsApiKey, onChange: setGoogleMapsApiKey, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(Input, { label: "Default Google Place ID", value: googlePlaceId, onChange: (e) => setGooglePlaceId(e.target.value), placeholder: "ChIJ\u2026" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Analytics & Tracking" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Google Analytics ID", value: gaMeasurementId, onChange: (e) => setGaMeasurementId(e.target.value), placeholder: "G-XXXXXXXXXX" }), _jsx(Input, { label: "Facebook Pixel ID", value: fbPixelId, onChange: (e) => setFbPixelId(e.target.value), placeholder: "XXXXXXXXXXXXXXXX" }), _jsx(Input, { label: "GTM Container ID", value: gtmContainerId, onChange: (e) => setGtmContainerId(e.target.value), placeholder: "GTM-XXXXXXX" }), _jsx(Input, { label: "Microsoft Clarity Project ID", value: clarityProjectId, onChange: (e) => setClarityProjectId(e.target.value), placeholder: "abcdefghij", helperText: "Heatmaps and session replay. Recording is strictly masked \u2014 no text or input values are captured. Leave blank to keep Clarity off." })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Meta (Instagram & Facebook Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Used by the Social Feed section to fetch Instagram and Facebook posts via Meta Graph API v19." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Page Access Token", value: metaPageAccessToken, onChange: setMetaPageAccessToken, placeholder: "EAAxxxxxxx\u2026" }), _jsx(Input, { label: "Page ID (or handle)", value: metaPageId, onChange: (e) => setMetaPageId(e.target.value), placeholder: "letitrip" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "TikTok for Developers (Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Client credentials + long-lived access token from TikTok for Developers. Used to list your account's public videos." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Client Key", value: tiktokClientKey, onChange: setTiktokClientKey, placeholder: "aw\u2026" }), _jsx(MaskedInput, { label: "Client Secret", value: tiktokClientSecret, onChange: setTiktokClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" }), _jsx(MaskedInput, { label: "Access Token (long-lived)", value: tiktokAccessToken, onChange: setTiktokAccessToken, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "DeviantArt OAuth2 (Social Feed)" }), _jsx(Text, { size: "xs", color: "muted", children: "Client credentials for DeviantArt gallery fetching (client-credentials OAuth2 flow \u2014 no user login required)." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(MaskedInput, { label: "Client ID", value: deviantartClientId, onChange: setDeviantartClientId, placeholder: "1234" }), _jsx(MaskedInput, { label: "Client Secret", value: deviantartClientSecret, onChange: setDeviantartClientSecret, placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" })] })] })] }) }), _jsx(TabsContent, { value: "shipping", children: _jsxs(SettingsTabForm, { id: "shipping", label: "Shipping", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "Payment methods" }), _jsx(Div, { id: "setting-razorpay-enabled", children: _jsx(Toggle, { label: "Razorpay (online card/UPI/netbanking) enabled \u2014 needs Key ID + Key Secret under Credentials", checked: razorpayEnabled, onChange: setRazorpayEnabled }) }), _jsx(Div, { id: "setting-phonepe-enabled", children: _jsx(Toggle, { label: "PhonePe (online card/UPI) enabled \u2014 ignored while Razorpay is on; only one online gateway runs at a time", checked: phonepeEnabled, onChange: setPhonepeEnabled }) }), _jsx(Div, { id: "setting-manual-payment-enabled", children: _jsx(Toggle, { label: "Manual UPI/bank transfer enabled", checked: upiManualEnabled, onChange: setUpiManualEnabled }) }), _jsx(Div, { id: "setting-cod-enabled", children: _jsx(Toggle, { label: "Cash on delivery (COD) enabled", checked: codEnabled, onChange: setCodEnabled }) }), _jsx(Input, { label: "Free shipping threshold (\u20B9)", value: String(freeShippingThreshold), onChange: (e) => setFreeShippingThreshold(parseInt(e.target.value) || 0), type: "number", min: 0, helperText: "Orders above this amount get free shipping." }), _jsx(Select, { label: "Default carrier", options: CARRIER_OPTIONS, value: defaultCarrier, onValueChange: setDefaultCarrier }), _jsx(Input, { label: "Max delivery radius (km, 0 = no limit)", value: String(maxDeliveryRadius), onChange: (e) => setMaxDeliveryRadius(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "COD maximum order value (\u20B9)",
935
- /*
936
- 🛑 A MAXIMUM, sitting directly above a THRESHOLD that is a
937
- minimum. The helper text says which way each one runs,
938
- because the two fields look identical and mean opposite
939
- things — and getting it backwards here either refuses every
940
- COD order or refuses none.
941
- */
942
- helperText: "Carts ABOVE this subtotal cannot pay by cash on delivery; the option is shown disabled with the reason. 0 = COD off for every cart.", value: String(codMaxOrderValue), onChange: (e) => setCodMaxOrderValue(parseInt(e.target.value) || 0), type: "number", min: 0, disabled: !codEnabled }), _jsx(Input, { label: "High-value checkout OTP threshold (\u20B9)", helperText: "Carts at or above this subtotal require an extra OTP verification step before payment (0 = disabled).", value: String(otpCheckoutThreshold), onChange: (e) => setOtpCheckoutThreshold(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Text, { size: "sm", weight: "medium", color: "muted", className: "pt-[var(--appkit-space-2)]", children: "Seller shipping charge defaults" }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Seller shipping fixed (\u20B9)", helperText: "Flat shipping charge collected on the seller's behalf.", value: String(sellerShippingFixed), onChange: (e) => setSellerShippingFixed(parseFloat(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Platform shipping (%)", helperText: "Platform's own shipping markup, as a % of order value.", value: String(platformShippingPercent), onChange: (e) => setPlatformShippingPercent(parseFloat(e.target.value) || 0), type: "number", min: 0, max: 100, step: 0.1 }), _jsx(Input, { label: "Platform shipping minimum (\u20B9)", helperText: "Floor for the platform shipping markup.", value: String(platformShippingFixedMin), onChange: (e) => setPlatformShippingFixedMin(parseFloat(e.target.value) || 0), type: "number", min: 0 })] })] }) }), _jsx(TabsContent, { value: "auction", children: _jsxs(SettingsTabForm, { id: "auction", label: "Auction", children: [_jsxs(Stack, { gap: "sm", rounded: "lg", border: "default", padding: "sm", children: [_jsx(Text, { size: "xs", weight: "medium", color: "muted", children: "Bid increment tiers" }), _jsx(Text, { size: "xs", color: "muted", children: "The minimum jump a new bid must clear, based on the current bid amount. A seller's per-listing override can require more than the matching tier, but can never undercut it." }), bidIncrementTiers.map((tier, i) => {
943
- const isLast = i === bidIncrementTiers.length - 1;
944
- return (_jsxs(Grid, { align: "end", gap: "xs", className: "grid-cols-12", children: [_jsx(Div, { className: "col-span-5", children: isLast ? (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", weight: "medium", className: "mb-1", children: "Up to (\u20B9)" }), _jsx(Text, { size: "sm", color: "muted", children: "and above" })] })) : (_jsx(Input, { label: "Up to (\u20B9)", type: "number", min: 1, value: String(tier.upTo ?? ""), onChange: (e) => setBidIncrementTiers(bidIncrementTiers.map((t, j) => j === i ? { ...t, upTo: parseInt(e.target.value) || 0 } : t)) })) }), _jsx(Div, { className: "col-span-5", children: _jsx(Input, { label: "Increment (\u20B9)", type: "number", min: 1, value: String(tier.increment), onChange: (e) => setBidIncrementTiers(bidIncrementTiers.map((t, j) => j === i ? { ...t, increment: parseInt(e.target.value) || 0 } : t)) }) }), _jsx(Row, { centered: true, className: "col-span-2", padding: "b-xs", children: _jsx(Button, { variant: "ghost", type: "button", disabled: bidIncrementTiers.length <= 1, onClick: () => setBidIncrementTiers(bidIncrementTiers.filter((_, j) => j !== i)), "aria-label": "Remove tier", children: "\u00D7" }) })] }, i));
945
- }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setBidIncrementTiers([
946
- ...bidIncrementTiers.slice(0, -1),
947
- { upTo: 100, increment: 10 },
948
- bidIncrementTiers[bidIncrementTiers.length - 1] ?? { upTo: null, increment: 1000 },
949
- ]), children: "+ Add tier" })] }), _jsx(Input, { label: "Auto-extend window (minutes before end)", value: String(autoExtendWindow), onChange: (e) => setAutoExtendWindow(parseInt(e.target.value) || 0), type: "number", min: 0, helperText: "Extend auction end time if a bid arrives within this window." }), _jsx(Input, { label: "Settlement grace period (hours)", value: String(settlementGrace), onChange: (e) => setSettlementGrace(parseInt(e.target.value) || 0), type: "number", min: 1, helperText: "Time winner has to pay before the auction is re-listed." })] }) }), _jsx(TabsContent, { value: "limits", children: _jsx(SettingsTabForm, { id: "limits", label: "Limits", children: _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Max products per store", value: String(maxProductsPerStore), onChange: (e) => setMaxProductsPerStore(parseInt(e.target.value) || 0), type: "number", min: 1 }), _jsx(Input, { label: "Max custom fields per product", value: String(maxCustomFields), onChange: (e) => setMaxCustomFields(parseInt(e.target.value) || 0), type: "number", min: 0 }), _jsx(Input, { label: "Order cancellation window (hours)", value: String(orderCancelWindow), onChange: (e) => setOrderCancelWindow(parseInt(e.target.value) || 0), type: "number", min: 0 })] }) }) }), _jsx(TabsContent, { value: "whatsapp", children: _jsxs(SettingsTabForm, { id: "whatsapp", label: "Whatsapp", children: [_jsx(Text, { size: "xs", color: "muted", children: "Platform-level WhatsApp Business Cloud API credentials. Used for automated purchase announcements to admin numbers when orders are placed. Store owners configure their own credentials in Store \u2192 WhatsApp." }), _jsx(Input, { label: "Phone Number ID", value: waPhoneNumberId, onChange: (e) => setWaPhoneNumberId(e.target.value), placeholder: "987654321098765", helperText: "From Meta for Developers \u2192 App \u2192 WhatsApp \u2192 API Setup" }), _jsx(MaskedInput, { label: "Cloud API System User Token", value: waCloudApiToken, onChange: setWaCloudApiToken, placeholder: "EAAxxxxxxxx\u2026", helperText: "Long-lived system user access token with WhatsApp Business permissions" }), _jsx(Input, { label: "Admin Notify Numbers", value: waAdminNotifyNumbers, onChange: (e) => setWaAdminNotifyNumbers(e.target.value), placeholder: "919876543210,918765432109", helperText: "Comma-separated, digits-only, include country code. These receive a WhatsApp message when any order is placed." }), _jsx(Text, { size: "xs", color: "muted", children: "Approved Meta message templates for the buyer-facing WhatsApp order-updates addon (Fees tab). Meta rejects business-initiated free-text WhatsApp messages outside a 24h customer-service window \u2014 a real template name here is required for that notification type to actually deliver. Leave blank to skip WhatsApp for that type (in-app + email still fire)." }), _jsx(Input, { label: "Template language code", value: waTemplateLanguage, onChange: (e) => setWaTemplateLanguage(e.target.value), placeholder: "en", helperText: "BCP-47 code the templates below were approved in, e.g. en or en_US." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Order placed template name", value: waTemplateOrderPlaced, onChange: (e) => setWaTemplateOrderPlaced(e.target.value), placeholder: "order_placed_update" }), _jsx(Input, { label: "Order confirmed template name", value: waTemplateOrderConfirmed, onChange: (e) => setWaTemplateOrderConfirmed(e.target.value), placeholder: "order_confirmed_update" }), _jsx(Input, { label: "Order shipped template name", value: waTemplateOrderShipped, onChange: (e) => setWaTemplateOrderShipped(e.target.value), placeholder: "order_shipped_update" }), _jsx(Input, { label: "Order delivered template name", value: waTemplateOrderDelivered, onChange: (e) => setWaTemplateOrderDelivered(e.target.value), placeholder: "order_delivered_update" }), _jsx(Input, { label: "Order cancelled template name", value: waTemplateOrderCancelled, onChange: (e) => setWaTemplateOrderCancelled(e.target.value), placeholder: "order_cancelled_update" }), _jsx(Input, { label: "Refund initiated template name", value: waTemplateRefundInitiated, onChange: (e) => setWaTemplateRefundInitiated(e.target.value), placeholder: "refund_initiated_update" })] })] }) }), _jsx(TabsContent, { value: "notifications", children: _jsxs(SettingsTabForm, { id: "notifications", label: "Notifications", children: [_jsx(Text, { size: "xs", color: "muted", children: "In-app notifications are always on. Enable external channels below to let the platform fan out to email, WhatsApp, or SMS. Users can further restrict which types they receive." }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "sm", weight: "semibold", children: "Outbound messaging budget" }), _jsxs(Text, { size: "xs", color: "muted", children: ["The master switches. These suppress ", _jsx(Span, { weight: "semibold", children: "user-facing" }), " messages only \u2014 the daily status digest always reaches staff, so turning customer email off never leaves the site unwatched. Transactional messages (checkout verification codes, order receipts) also keep sending, because suppressing those breaks checkout rather than quietening it."] }), _jsx(Toggle, { label: "Send user-facing email", checked: msgEmailEnabled, onChange: setMsgEmailEnabled }), _jsx(Toggle, { label: "Send user-facing WhatsApp", checked: msgWhatsappEnabled, onChange: setMsgWhatsappEnabled }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "Daily email ceiling", type: "number", value: String(msgCeilingEmail), onChange: (e) => setMsgCeilingEmail(Number(e.target.value) || 0), helperText: "Resend's free tier is 100/day. 80 leaves headroom for password-reset mail and in-flight sends." }), _jsx(Input, { label: "Daily WhatsApp ceiling", type: "number", value: String(msgCeilingWhatsapp), onChange: (e) => setMsgCeilingWhatsapp(Number(e.target.value) || 0), helperText: "A sanity bound. Meta bills per conversation, not per message." })] }), _jsx(Text, { size: "xs", color: "muted", children: "Some notification types never email regardless of these settings \u2014 losing an auction, being outbid, marketing, review activity and ticket updates are shown in the notification bell only. That is deliberate: those were the highest-volume sends and the ones most likely to exhaust the day's allowance. A support reply can still be emailed one-off from the ticket screen." })] }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsxs(Row, { justify: "between", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "In-app (notification bell)" }), _jsx(Span, { color: "success", surface: "success-surface", size: "xs", weight: "semibold", rounded: "full", padding: "pill-xs", children: "Always on" })] }), _jsx(Text, { size: "xs", color: "muted", children: "Displayed in the notification bell and inbox. Cannot be disabled." })] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-email-notifications", children: _jsx(Toggle, { label: "Email notifications", checked: notifEmailEnabled, onChange: setNotifEmailEnabled }) }), notifEmailEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send email", options: PRIORITY_OPTIONS, value: notifEmailMinPriority, onValueChange: setNotifEmailMinPriority }), _jsx(Text, { size: "xs", weight: "medium", color: "muted", className: "pt-[0.25rem]", children: "Resend API (for transactional email)" }), _jsx(MaskedInput, { label: "Resend API Key", value: resendApiKey, onChange: setResendApiKey, placeholder: "re_live_\u2026", helperText: "Get your key at resend.com \u2014 used for all transactional notifications." }), _jsxs(Grid, { cols: 2, gap: "md", children: [_jsx(Input, { label: "From email", value: notifFromEmail, onChange: (e) => setNotifFromEmail(e.target.value), placeholder: "noreply@letitrip.in", type: "email" }), _jsx(Input, { label: "From name", value: notifFromName, onChange: (e) => setNotifFromName(e.target.value), placeholder: "LetItRip" })] }), _jsx(Text, { size: "xs", weight: "medium", color: "muted", className: "pt-[0.25rem]", children: "Notification types (leave empty to send all types)" }), _jsx(PaginatedSelect, { ariaLabel: "Notification types", multiple: true, options: NOTIF_TYPE_OPTIONS, value: notifEmailTypes, onChange: (values) => setNotifEmailTypes(values), placeholder: "All notification types" })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-daily-digest", children: _jsx(Toggle, { label: "Daily status digest", checked: digestEnabled, onChange: setDigestEnabled }) }), digestEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Text, { size: "xs", color: "muted", children: "Sent every morning at 10:00 IST with the previous 24 hours of order activity. Its arrival doubles as the platform health check \u2014 if it stops landing, something needs a look." }), _jsx(Textarea, { label: "Recipients (To)", value: digestRecipients, onChange: (e) => setDigestRecipients(e.target.value), placeholder: "mohasin@letitrip.in", rows: 3, helperText: "One address per line. Each address is billed as a separate send against the daily allowance \u2014 keep this list short." })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Div, { id: "setting-whatsapp-notifications", children: _jsx(Toggle, { label: "WhatsApp notifications", checked: notifWhatsappEnabled, onChange: setNotifWhatsappEnabled }) }), notifWhatsappEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send WhatsApp", options: PRIORITY_OPTIONS, value: notifWhatsappMinPriority, onValueChange: setNotifWhatsappMinPriority }), _jsx(Toggle, { label: "Enable WhatsApp OTP (for login and verification)", checked: notifWhatsappOtpEnabled, onChange: setNotifWhatsappOtpEnabled }), _jsx(Text, { size: "xs", color: "muted", children: "WhatsApp credentials are configured in the WhatsApp tab (\u246C). OTP messages use the same phone number." }), _jsx(PaginatedSelect, { multiple: true, ariaLabel: "Notification types to send over WhatsApp", options: NOTIF_TYPE_OPTIONS, value: notifWhatsappTypes, onChange: (values) => setNotifWhatsappTypes(values), placeholder: "All notification types" }), _jsx(Text, { size: "xs", color: "muted", children: "Leave empty to send all types." })] }))] }), _jsxs(Stack, { gap: "md", rounded: "lg", border: "default", padding: "md", children: [_jsx(Toggle, { label: "SMS notifications", checked: notifSmsEnabled, onChange: setNotifSmsEnabled }), notifSmsEnabled && (_jsxs(Stack, { gap: "md", className: NOTIF_CHANNEL_INDENT, children: [_jsx(Select, { label: "Minimum priority to send SMS", options: PRIORITY_OPTIONS, value: notifSmsMinPriority, onValueChange: setNotifSmsMinPriority }), _jsx(Text, { size: "xs", color: "muted", children: "SMS gateway credentials (e.g. Twilio, MSG91) can be configured in the Integrations tab once an SMS provider is connected." })] }))] })] }) }), _jsx(TabsContent, { value: "legal", children: _jsx(SettingsTabForm, { id: "legal", label: "Legal", children: [
950
- ["Terms of Service", termsHtml, setTermsHtml],
951
- ["Privacy Policy", privacyHtml, setPrivacyHtml],
952
- ["Refund Policy", refundHtml, setRefundHtml],
953
- ["Shipping Policy", shippingPolicyHtml, setShippingPolicyHtml],
954
- ["Cookie Policy", cookieHtml, setCookieHtml],
955
- ["Our Ethics", ethicsHtml, setEthicsHtml],
956
- ["Code of Conduct", conductHtml, setConductHtml],
957
- ["Cancellation Policy", cancellationHtml, setCancellationHtml],
958
- ["Grievance Redressal", grievanceHtml, setGrievanceHtml],
959
- ].map(([label, value, setter]) => (_jsx(Textarea, { label: label, value: value, onChange: (e) => setter(e.target.value), placeholder: `Enter ${label} HTML here…`, rows: 6, className: "font-mono" }, label))) }) })] }), _jsx(SaveAllBar, { isPending: saveAllMutation.isPending, onSave: handleSaveAll })] }, "settings-form"),
960
- ] }));
1462
+ return (_jsxs(_Fragment, { children: [_jsx(AdminComposableRegion, { pageId: "admin-site", initialCards: pageRegionCards }), _jsx(StackedViewShell, { portal: "admin", ...rest, title: labels.title ?? "Site Settings", sections: [
1463
+ isLoading ? (_jsx(Alert, { variant: "info", title: "Loading", children: "Fetching site settings\u2026" }, "loading")) : null,
1464
+ error ? (_jsx(Alert, { variant: "error", title: "Load failed", children: error instanceof Error ? error.message : "Unknown error" }, "error")) : null,
1465
+ _jsxs(FormShellContext.Provider, { value: shellCtx, children: [_jsxs(Tabs, { value: activeTab,
1466
+ /*
1467
+ * `Tabs` hands back a bare string, so it is narrowed here rather
1468
+ * than cast. An unknown value is ignored instead of being written
1469
+ * into state — the same reason `?tab=` is validated on the way in.
1470
+ */
1471
+ onChange: (next) => {
1472
+ if (isSiteSettingsTabId(next))
1473
+ setActiveTab(next);
1474
+ }, children: [_jsx(TabsList, { children: SITE_SETTINGS_TABS.map((tab) => (_jsx(TabsTrigger, { value: tab.id, children: tab.label }, tab.id))) }), _jsx(TabsContent, { value: "about", children: _jsx(SectionForm, { sections: aboutSections, values: aboutForm, onChange: (partial) => setAboutForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAboutFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "branding", children: _jsx(SectionForm, { sections: brandingSections, values: brandingForm, onChange: (partial) => setBrandingForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsBrandingFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "appearance", children: _jsx(SectionForm, { sections: appearanceSections, values: appearanceForm, onChange: (partial) => setAppearanceForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAppearanceFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "themes", children: _jsx(SettingsTabForm, { id: "themes", label: "Themes", children: _jsx(ThemeManagerView, { value: themeRegistry, onChange: setThemeRegistry, previewOrigin: "/" }) }) }), _jsx(TabsContent, { value: "announcement", children: _jsx(SectionForm, { sections: announcementSections, values: announcementForm, onChange: (partial) => setAnnouncementForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsAnnouncementFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "seo", children: _jsx(SectionForm, { sections: seoSections, values: seoForm, onChange: (partial) => setSeoForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsSeoFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "contact", children: _jsx(SectionForm, { sections: contactSections, values: contactForm, onChange: (partial) => setContactForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsContactFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "watermark", children: [_jsx(SectionForm, { sections: watermarkSections, values: watermarkForm, onChange: (partial) => setWatermarkForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsWatermarkFormSchema, hideActions: true }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", children: [_jsx(Text, { size: "xs", color: "muted", children: "Preview (text watermark only)" }), _jsx(Row, { surface: "default", justify: "end", align: "end", className: `relative h-32 ${__O.hidden}`, rounded: "default", children: _jsx(Span, { ref: watermarkPreviewRef, weight: "medium", color: "faint", padding: "1", className: "select-none", children: watermarkForm.watermarkText }) })] })] }), _jsx(TabsContent, { value: "fees", children: _jsx(SectionForm, { sections: feesSections, values: feesForm, onChange: (partial) => setFeesForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsFeesFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "procurement", children: [_jsx(Text, { size: "xs", color: "muted", className: "mb-2", children: "Used to compute each procurement shipment's labor cost (hours spent \u00D7 hourly rate) and its estimated processing time (hours spent \u00F7 max hours/day)." }), _jsx(SectionForm, { sections: procurementSections, values: procurementForm, onChange: (partial) => setProcurementForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsProcurementFormSchema, hideActions: true })] }), _jsx(TabsContent, { value: "emi", children: _jsx(SectionForm, { sections: emiSections, values: emiForm, onChange: (partial) => setEmiForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsEmiFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "gst", children: _jsx(SectionForm, { sections: gstSections, values: gstForm, onChange: (partial) => setGstForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsGstFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "listings", children: _jsx(SectionForm, { sections: listingsSections, values: listingsForm, onChange: (partial) => setListingsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsListingsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "integrations", children: _jsx(SectionForm, { sections: integrationsSections, values: integrationsForm, onChange: (partial) => setIntegrationsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsIntegrationsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "shipping", children: _jsx(SectionForm, { sections: shippingSections, values: shippingForm, onChange: (partial) => setShippingForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsShippingFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "collector-drop", children: _jsx(SectionForm, { sections: collectorDropSections, values: collectorDropForm, onChange: (partial) => setCollectorDropForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsCollectorDropFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "limits", children: _jsx(SectionForm, { sections: limitsSections, values: limitsForm, onChange: (partial) => setLimitsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsLimitsFormSchema, hideActions: true }) }), _jsx(TabsContent, { value: "whatsapp", children: _jsx(SectionForm, { sections: whatsappSections, values: whatsappForm, onChange: (partial) => setWhatsappForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsWhatsappFormSchema, hideActions: true }) }), _jsxs(TabsContent, { value: "notifications", children: [_jsx(Text, { size: "xs", color: "muted", className: "mb-2", children: "In-app notifications are always on. Enable external channels below to let the platform fan out to email, WhatsApp, or SMS. Users can further restrict which types they receive." }), _jsxs(Stack, { gap: "xs", surface: "muted", rounded: "lg", border: "default", padding: "md", className: "mb-4", children: [_jsxs(Row, { justify: "between", gap: "sm", children: [_jsx(Text, { size: "sm", weight: "medium", color: "muted", children: "In-app (notification bell)" }), _jsx(Span, { color: "success", surface: "success-surface", size: "xs", weight: "semibold", rounded: "full", padding: "pill-xs", children: "Always on" })] }), _jsx(Text, { size: "xs", color: "muted", children: "Displayed in the notification bell and inbox. Cannot be disabled." })] }), _jsx(SectionForm, { sections: notificationsSections, values: notificationsForm, onChange: (partial) => setNotificationsForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsNotificationsFormSchema, hideActions: true })] }), _jsx(TabsContent, { value: "legal", children: _jsx(SectionForm, { sections: legalSections, values: legalForm, onChange: (partial) => setLegalForm((prev) => ({ ...prev, ...partial })), onSubmit: () => undefined, schema: siteSettingsLegalFormSchema, hideActions: true }) })] }), _jsx(SaveAllBar, { isPending: saveAllMutation.isPending, onSave: handleSaveAll })] }, "settings-form"),
1475
+ ] })] }));
961
1476
  }