@mohasinac/appkit 2.4.11 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (889) hide show
  1. package/dist/_internal/client/features/products/index.d.ts +1 -0
  2. package/dist/_internal/client/features/products/index.js +3 -0
  3. package/dist/_internal/client/i18n/LabelsProvider.d.ts +13 -0
  4. package/dist/_internal/client/i18n/LabelsProvider.js +38 -0
  5. package/dist/_internal/client/index.d.ts +0 -0
  6. package/dist/_internal/client/index.js +4 -0
  7. package/dist/_internal/client/scaffolds/AppShell.d.ts +39 -0
  8. package/dist/_internal/client/scaffolds/AppShell.js +9 -0
  9. package/dist/_internal/client/scaffolds/DashboardScaffold.d.ts +34 -0
  10. package/dist/_internal/client/scaffolds/DashboardScaffold.js +23 -0
  11. package/dist/_internal/client/scaffolds/index.d.ts +4 -0
  12. package/dist/_internal/client/scaffolds/index.js +2 -0
  13. package/dist/_internal/server/features/account/actions.d.ts +7 -0
  14. package/dist/_internal/server/features/account/actions.js +7 -0
  15. package/dist/_internal/server/features/account/data.d.ts +17 -0
  16. package/dist/_internal/server/features/account/data.js +25 -0
  17. package/dist/_internal/server/features/account/index.d.ts +2 -0
  18. package/dist/_internal/server/features/account/index.js +2 -0
  19. package/dist/_internal/server/features/auctions/actions.d.ts +1 -0
  20. package/dist/_internal/server/features/auctions/actions.js +44 -0
  21. package/dist/_internal/server/features/auctions/data.d.ts +4 -0
  22. package/dist/_internal/server/features/auctions/data.js +9 -0
  23. package/dist/_internal/server/features/auctions/index.d.ts +5 -0
  24. package/dist/_internal/server/features/auctions/index.js +5 -0
  25. package/dist/_internal/server/features/auctions/og.d.ts +19 -0
  26. package/dist/_internal/server/features/auctions/og.js +51 -0
  27. package/dist/_internal/server/features/auctions/service.d.ts +13 -0
  28. package/dist/_internal/server/features/auctions/service.js +57 -0
  29. package/dist/_internal/server/features/auth/actions.d.ts +8 -0
  30. package/dist/_internal/server/features/auth/actions.js +8 -0
  31. package/dist/_internal/server/features/auth/index.d.ts +1 -0
  32. package/dist/_internal/server/features/auth/index.js +1 -0
  33. package/dist/_internal/server/features/blog/actions.d.ts +5 -0
  34. package/dist/_internal/server/features/blog/actions.js +51 -0
  35. package/dist/_internal/server/features/blog/data.d.ts +2 -0
  36. package/dist/_internal/server/features/blog/data.js +8 -0
  37. package/dist/_internal/server/features/blog/index.d.ts +5 -0
  38. package/dist/_internal/server/features/blog/index.js +5 -0
  39. package/dist/_internal/server/features/blog/og.d.ts +23 -0
  40. package/dist/_internal/server/features/blog/og.js +64 -0
  41. package/dist/_internal/server/features/blog/service.d.ts +3 -0
  42. package/dist/_internal/server/features/blog/service.js +18 -0
  43. package/dist/_internal/server/features/brands/actions.d.ts +4 -0
  44. package/dist/_internal/server/features/brands/actions.js +32 -0
  45. package/dist/_internal/server/features/brands/data.d.ts +12 -0
  46. package/dist/_internal/server/features/brands/data.js +16 -0
  47. package/dist/_internal/server/features/brands/index.d.ts +5 -0
  48. package/dist/_internal/server/features/brands/index.js +5 -0
  49. package/dist/_internal/server/features/brands/og.d.ts +17 -0
  50. package/dist/_internal/server/features/brands/og.js +37 -0
  51. package/dist/_internal/server/features/brands/service.d.ts +3 -0
  52. package/dist/_internal/server/features/brands/service.js +14 -0
  53. package/dist/_internal/server/features/bundles/data.d.ts +9 -0
  54. package/dist/_internal/server/features/bundles/data.js +9 -0
  55. package/dist/_internal/server/features/bundles/index.d.ts +2 -0
  56. package/dist/_internal/server/features/bundles/index.js +2 -0
  57. package/dist/_internal/server/features/cart/actions.d.ts +12 -0
  58. package/dist/_internal/server/features/cart/actions.js +35 -0
  59. package/dist/_internal/server/features/cart/data.d.ts +1 -0
  60. package/dist/_internal/server/features/cart/data.js +5 -0
  61. package/dist/_internal/server/features/cart/index.d.ts +4 -0
  62. package/dist/_internal/server/features/cart/index.js +4 -0
  63. package/dist/_internal/server/features/cart/service.d.ts +8 -0
  64. package/dist/_internal/server/features/cart/service.js +25 -0
  65. package/dist/_internal/server/features/categories/data.d.ts +13 -0
  66. package/dist/_internal/server/features/categories/data.js +40 -0
  67. package/dist/_internal/server/features/categories/index.d.ts +2 -0
  68. package/dist/_internal/server/features/categories/index.js +2 -0
  69. package/dist/_internal/server/features/checkout/actions.d.ts +35 -0
  70. package/dist/_internal/server/features/checkout/actions.js +327 -0
  71. package/dist/_internal/server/features/checkout/data.d.ts +13 -0
  72. package/dist/_internal/server/features/checkout/data.js +13 -0
  73. package/dist/_internal/server/features/checkout/index.d.ts +3 -0
  74. package/dist/_internal/server/features/checkout/index.js +3 -0
  75. package/dist/_internal/server/features/events/actions.d.ts +4 -0
  76. package/dist/_internal/server/features/events/actions.js +60 -0
  77. package/dist/_internal/server/features/events/data.d.ts +1 -0
  78. package/dist/_internal/server/features/events/data.js +5 -0
  79. package/dist/_internal/server/features/events/index.d.ts +5 -0
  80. package/dist/_internal/server/features/events/index.js +5 -0
  81. package/dist/_internal/server/features/events/og.d.ts +26 -0
  82. package/dist/_internal/server/features/events/og.js +87 -0
  83. package/dist/_internal/server/features/events/service.d.ts +2 -0
  84. package/dist/_internal/server/features/events/service.js +27 -0
  85. package/dist/_internal/server/features/grouped/data.d.ts +25 -0
  86. package/dist/_internal/server/features/grouped/data.js +116 -0
  87. package/dist/_internal/server/features/grouped/index.d.ts +2 -0
  88. package/dist/_internal/server/features/grouped/index.js +2 -0
  89. package/dist/_internal/server/features/history/actions.d.ts +8 -0
  90. package/dist/_internal/server/features/history/actions.js +15 -0
  91. package/dist/_internal/server/features/history/data.d.ts +7 -0
  92. package/dist/_internal/server/features/history/data.js +6 -0
  93. package/dist/_internal/server/features/history/index.d.ts +3 -0
  94. package/dist/_internal/server/features/history/index.js +3 -0
  95. package/dist/_internal/server/features/homepage/data.d.ts +18 -0
  96. package/dist/_internal/server/features/homepage/data.js +39 -0
  97. package/dist/_internal/server/features/homepage/index.d.ts +2 -0
  98. package/dist/_internal/server/features/homepage/index.js +2 -0
  99. package/dist/_internal/server/features/messages/actions.d.ts +6 -0
  100. package/dist/_internal/server/features/messages/actions.js +6 -0
  101. package/dist/_internal/server/features/messages/data.d.ts +10 -0
  102. package/dist/_internal/server/features/messages/data.js +24 -0
  103. package/dist/_internal/server/features/messages/index.d.ts +2 -0
  104. package/dist/_internal/server/features/messages/index.js +2 -0
  105. package/dist/_internal/server/features/orders/actions.d.ts +4 -0
  106. package/dist/_internal/server/features/orders/actions.js +50 -0
  107. package/dist/_internal/server/features/orders/adapters.d.ts +3 -0
  108. package/dist/_internal/server/features/orders/adapters.js +56 -0
  109. package/dist/_internal/server/features/orders/data.d.ts +10 -0
  110. package/dist/_internal/server/features/orders/data.js +18 -0
  111. package/dist/_internal/server/features/orders/index.d.ts +5 -0
  112. package/dist/_internal/server/features/orders/index.js +5 -0
  113. package/dist/_internal/server/features/orders/service.d.ts +4 -0
  114. package/dist/_internal/server/features/orders/service.js +30 -0
  115. package/dist/_internal/server/features/payments/actions.d.ts +30 -0
  116. package/dist/_internal/server/features/payments/actions.js +45 -0
  117. package/dist/_internal/server/features/payments/data.d.ts +11 -0
  118. package/dist/_internal/server/features/payments/data.js +14 -0
  119. package/dist/_internal/server/features/payments/index.d.ts +3 -0
  120. package/dist/_internal/server/features/payments/index.js +3 -0
  121. package/dist/_internal/server/features/pre-orders/actions.d.ts +7 -0
  122. package/dist/_internal/server/features/pre-orders/actions.js +26 -0
  123. package/dist/_internal/server/features/pre-orders/data.d.ts +4 -0
  124. package/dist/_internal/server/features/pre-orders/data.js +9 -0
  125. package/dist/_internal/server/features/pre-orders/index.d.ts +5 -0
  126. package/dist/_internal/server/features/pre-orders/index.js +5 -0
  127. package/dist/_internal/server/features/pre-orders/og.d.ts +19 -0
  128. package/dist/_internal/server/features/pre-orders/og.js +49 -0
  129. package/dist/_internal/server/features/pre-orders/service.d.ts +7 -0
  130. package/dist/_internal/server/features/pre-orders/service.js +30 -0
  131. package/dist/_internal/server/features/products/actions.d.ts +7 -0
  132. package/dist/_internal/server/features/products/actions.js +74 -0
  133. package/dist/_internal/server/features/products/data.d.ts +14 -0
  134. package/dist/_internal/server/features/products/data.js +48 -0
  135. package/dist/_internal/server/features/products/index.d.ts +5 -0
  136. package/dist/_internal/server/features/products/index.js +5 -0
  137. package/dist/_internal/server/features/products/og.d.ts +19 -0
  138. package/dist/_internal/server/features/products/og.js +43 -0
  139. package/dist/_internal/server/features/products/service.d.ts +11 -0
  140. package/dist/_internal/server/features/products/service.js +55 -0
  141. package/dist/_internal/server/features/profile/index.d.ts +1 -0
  142. package/dist/_internal/server/features/profile/index.js +1 -0
  143. package/dist/_internal/server/features/profile/og.d.ts +26 -0
  144. package/dist/_internal/server/features/profile/og.js +91 -0
  145. package/dist/_internal/server/features/promotions/actions.d.ts +9 -0
  146. package/dist/_internal/server/features/promotions/actions.js +38 -0
  147. package/dist/_internal/server/features/promotions/data.d.ts +1 -0
  148. package/dist/_internal/server/features/promotions/data.js +5 -0
  149. package/dist/_internal/server/features/promotions/index.d.ts +4 -0
  150. package/dist/_internal/server/features/promotions/index.js +4 -0
  151. package/dist/_internal/server/features/promotions/service.d.ts +3 -0
  152. package/dist/_internal/server/features/promotions/service.js +47 -0
  153. package/dist/_internal/server/features/reviews/actions.d.ts +4 -0
  154. package/dist/_internal/server/features/reviews/actions.js +66 -0
  155. package/dist/_internal/server/features/reviews/data.d.ts +10 -0
  156. package/dist/_internal/server/features/reviews/data.js +18 -0
  157. package/dist/_internal/server/features/reviews/index.d.ts +3 -0
  158. package/dist/_internal/server/features/reviews/index.js +3 -0
  159. package/dist/_internal/server/features/reviews/service.d.ts +5 -0
  160. package/dist/_internal/server/features/reviews/service.js +27 -0
  161. package/dist/_internal/server/features/scams/data.d.ts +10 -0
  162. package/dist/_internal/server/features/scams/data.js +22 -0
  163. package/dist/_internal/server/features/scams/index.d.ts +1 -0
  164. package/dist/_internal/server/features/scams/index.js +1 -0
  165. package/dist/_internal/server/features/search/actions.d.ts +15 -0
  166. package/dist/_internal/server/features/search/actions.js +18 -0
  167. package/dist/_internal/server/features/search/data.d.ts +15 -0
  168. package/dist/_internal/server/features/search/data.js +18 -0
  169. package/dist/_internal/server/features/search/index.d.ts +3 -0
  170. package/dist/_internal/server/features/search/index.js +2 -0
  171. package/dist/_internal/server/features/stores/data.d.ts +31 -0
  172. package/dist/_internal/server/features/stores/data.js +58 -0
  173. package/dist/_internal/server/features/stores/index.d.ts +3 -0
  174. package/dist/_internal/server/features/stores/index.js +3 -0
  175. package/dist/_internal/server/features/stores/og.d.ts +19 -0
  176. package/dist/_internal/server/features/stores/og.js +52 -0
  177. package/dist/_internal/server/features/sublisting-categories/data.d.ts +1 -0
  178. package/dist/_internal/server/features/sublisting-categories/data.js +5 -0
  179. package/dist/_internal/server/features/sublisting-categories/index.d.ts +2 -0
  180. package/dist/_internal/server/features/sublisting-categories/index.js +2 -0
  181. package/dist/_internal/server/features/sublisting-categories/og.d.ts +20 -0
  182. package/dist/_internal/server/features/sublisting-categories/og.js +56 -0
  183. package/dist/_internal/server/features/wishlist/actions.d.ts +13 -0
  184. package/dist/_internal/server/features/wishlist/actions.js +40 -0
  185. package/dist/_internal/server/features/wishlist/data.d.ts +8 -0
  186. package/dist/_internal/server/features/wishlist/data.js +9 -0
  187. package/dist/_internal/server/features/wishlist/index.d.ts +4 -0
  188. package/dist/_internal/server/features/wishlist/index.js +4 -0
  189. package/dist/_internal/server/index.d.ts +0 -0
  190. package/dist/_internal/server/index.js +4 -0
  191. package/dist/_internal/server/jobs/handlers/_helpers.d.ts +8 -0
  192. package/dist/_internal/server/jobs/handlers/_helpers.js +19 -0
  193. package/dist/_internal/server/jobs/handlers/adminAnalytics.d.ts +28 -0
  194. package/dist/_internal/server/jobs/handlers/adminAnalytics.js +98 -0
  195. package/dist/_internal/server/jobs/handlers/auctionSettlement.d.ts +2 -0
  196. package/dist/_internal/server/jobs/handlers/auctionSettlement.js +70 -0
  197. package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.d.ts +2 -0
  198. package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.js +110 -0
  199. package/dist/_internal/server/jobs/handlers/cartPrune.d.ts +2 -0
  200. package/dist/_internal/server/jobs/handlers/cartPrune.js +13 -0
  201. package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.d.ts +2 -0
  202. package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.js +45 -0
  203. package/dist/_internal/server/jobs/handlers/countersReconcile.d.ts +2 -0
  204. package/dist/_internal/server/jobs/handlers/countersReconcile.js +109 -0
  205. package/dist/_internal/server/jobs/handlers/couponExpiry.d.ts +2 -0
  206. package/dist/_internal/server/jobs/handlers/couponExpiry.js +13 -0
  207. package/dist/_internal/server/jobs/handlers/dailyDataCleanup.d.ts +2 -0
  208. package/dist/_internal/server/jobs/handlers/dailyDataCleanup.js +20 -0
  209. package/dist/_internal/server/jobs/handlers/index.d.ts +35 -0
  210. package/dist/_internal/server/jobs/handlers/index.js +35 -0
  211. package/dist/_internal/server/jobs/handlers/listingProcessor.d.ts +30 -0
  212. package/dist/_internal/server/jobs/handlers/listingProcessor.js +128 -0
  213. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.d.ts +14 -0
  214. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.js +69 -0
  215. package/dist/_internal/server/jobs/handlers/messages.d.ts +45 -0
  216. package/dist/_internal/server/jobs/handlers/messages.js +45 -0
  217. package/dist/_internal/server/jobs/handlers/notificationPrune.d.ts +2 -0
  218. package/dist/_internal/server/jobs/handlers/notificationPrune.js +13 -0
  219. package/dist/_internal/server/jobs/handlers/offerExpiry.d.ts +2 -0
  220. package/dist/_internal/server/jobs/handlers/offerExpiry.js +50 -0
  221. package/dist/_internal/server/jobs/handlers/onBidPlaced.d.ts +12 -0
  222. package/dist/_internal/server/jobs/handlers/onBidPlaced.js +63 -0
  223. package/dist/_internal/server/jobs/handlers/onCategoryWrite.d.ts +10 -0
  224. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +136 -0
  225. package/dist/_internal/server/jobs/handlers/onOrderCreate.d.ts +14 -0
  226. package/dist/_internal/server/jobs/handlers/onOrderCreate.js +83 -0
  227. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.d.ts +14 -0
  228. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +141 -0
  229. package/dist/_internal/server/jobs/handlers/onProductWrite.d.ts +8 -0
  230. package/dist/_internal/server/jobs/handlers/onProductWrite.js +92 -0
  231. package/dist/_internal/server/jobs/handlers/onReviewWrite.d.ts +2 -0
  232. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +51 -0
  233. package/dist/_internal/server/jobs/handlers/onStoreWrite.d.ts +10 -0
  234. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +9 -0
  235. package/dist/_internal/server/jobs/handlers/payoutBatch.d.ts +11 -0
  236. package/dist/_internal/server/jobs/handlers/payoutBatch.js +104 -0
  237. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.d.ts +8 -0
  238. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.js +33 -0
  239. package/dist/_internal/server/jobs/handlers/positionsReconcile.d.ts +7 -0
  240. package/dist/_internal/server/jobs/handlers/positionsReconcile.js +87 -0
  241. package/dist/_internal/server/jobs/handlers/productStatsSync.d.ts +8 -0
  242. package/dist/_internal/server/jobs/handlers/productStatsSync.js +36 -0
  243. package/dist/_internal/server/jobs/handlers/promotions.d.ts +12 -0
  244. package/dist/_internal/server/jobs/handlers/promotions.js +43 -0
  245. package/dist/_internal/server/jobs/handlers/storeAnalytics.d.ts +30 -0
  246. package/dist/_internal/server/jobs/handlers/storeAnalytics.js +109 -0
  247. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.d.ts +8 -0
  248. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.js +87 -0
  249. package/dist/_internal/server/jobs/index.d.ts +4 -0
  250. package/dist/_internal/server/jobs/index.js +3 -0
  251. package/dist/_internal/server/jobs/runtime/adapters/firebase.d.ts +50 -0
  252. package/dist/_internal/server/jobs/runtime/adapters/firebase.js +156 -0
  253. package/dist/_internal/server/jobs/runtime/types.d.ts +52 -0
  254. package/dist/_internal/server/jobs/runtime/types.js +13 -0
  255. package/dist/_internal/shared/config/index.d.ts +1 -0
  256. package/dist/_internal/shared/config/index.js +1 -0
  257. package/dist/_internal/shared/config/schema.d.ts +82 -0
  258. package/dist/_internal/shared/config/schema.js +1 -0
  259. package/dist/_internal/shared/constants/index.d.ts +1 -0
  260. package/dist/_internal/shared/constants/index.js +1 -0
  261. package/dist/_internal/shared/errors/index.d.ts +24 -0
  262. package/dist/_internal/shared/errors/index.js +46 -0
  263. package/dist/_internal/shared/features/auctions/config.d.ts +6 -0
  264. package/dist/_internal/shared/features/auctions/config.js +6 -0
  265. package/dist/_internal/shared/features/auctions/errors.d.ts +16 -0
  266. package/dist/_internal/shared/features/auctions/errors.js +31 -0
  267. package/dist/_internal/shared/features/auctions/schema.d.ts +30 -0
  268. package/dist/_internal/shared/features/auctions/schema.js +12 -0
  269. package/dist/_internal/shared/features/blog/config.d.ts +6 -0
  270. package/dist/_internal/shared/features/blog/config.js +6 -0
  271. package/dist/_internal/shared/features/blog/errors.d.ts +10 -0
  272. package/dist/_internal/shared/features/blog/errors.js +19 -0
  273. package/dist/_internal/shared/features/blog/schema.d.ts +81 -0
  274. package/dist/_internal/shared/features/blog/schema.js +17 -0
  275. package/dist/_internal/shared/features/brands/config.d.ts +4 -0
  276. package/dist/_internal/shared/features/brands/config.js +4 -0
  277. package/dist/_internal/shared/features/brands/errors.d.ts +7 -0
  278. package/dist/_internal/shared/features/brands/errors.js +13 -0
  279. package/dist/_internal/shared/features/brands/schema.d.ts +69 -0
  280. package/dist/_internal/shared/features/brands/schema.js +15 -0
  281. package/dist/_internal/shared/features/bundles/config.d.ts +6 -0
  282. package/dist/_internal/shared/features/bundles/config.js +6 -0
  283. package/dist/_internal/shared/features/cart/config.d.ts +3 -0
  284. package/dist/_internal/shared/features/cart/config.js +3 -0
  285. package/dist/_internal/shared/features/cart/errors.d.ts +10 -0
  286. package/dist/_internal/shared/features/cart/errors.js +19 -0
  287. package/dist/_internal/shared/features/cart/schema.d.ts +132 -0
  288. package/dist/_internal/shared/features/cart/schema.js +33 -0
  289. package/dist/_internal/shared/features/categories/config.d.ts +6 -0
  290. package/dist/_internal/shared/features/categories/config.js +6 -0
  291. package/dist/_internal/shared/features/checkout/config.d.ts +8 -0
  292. package/dist/_internal/shared/features/checkout/config.js +7 -0
  293. package/dist/_internal/shared/features/events/config.d.ts +5 -0
  294. package/dist/_internal/shared/features/events/config.js +5 -0
  295. package/dist/_internal/shared/features/events/errors.d.ts +16 -0
  296. package/dist/_internal/shared/features/events/errors.js +31 -0
  297. package/dist/_internal/shared/features/events/schema.d.ts +91 -0
  298. package/dist/_internal/shared/features/events/schema.js +21 -0
  299. package/dist/_internal/shared/features/grouped/config.d.ts +3 -0
  300. package/dist/_internal/shared/features/grouped/config.js +3 -0
  301. package/dist/_internal/shared/features/history/config.d.ts +2 -0
  302. package/dist/_internal/shared/features/history/config.js +2 -0
  303. package/dist/_internal/shared/features/homepage/config.d.ts +3 -0
  304. package/dist/_internal/shared/features/homepage/config.js +3 -0
  305. package/dist/_internal/shared/features/orders/config.d.ts +8 -0
  306. package/dist/_internal/shared/features/orders/config.js +8 -0
  307. package/dist/_internal/shared/features/orders/errors.d.ts +13 -0
  308. package/dist/_internal/shared/features/orders/errors.js +25 -0
  309. package/dist/_internal/shared/features/orders/schema.d.ts +114 -0
  310. package/dist/_internal/shared/features/orders/schema.js +33 -0
  311. package/dist/_internal/shared/features/payments/config.d.ts +2 -0
  312. package/dist/_internal/shared/features/payments/config.js +2 -0
  313. package/dist/_internal/shared/features/pre-orders/config.d.ts +4 -0
  314. package/dist/_internal/shared/features/pre-orders/config.js +4 -0
  315. package/dist/_internal/shared/features/pre-orders/errors.d.ts +13 -0
  316. package/dist/_internal/shared/features/pre-orders/errors.js +25 -0
  317. package/dist/_internal/shared/features/pre-orders/schema.d.ts +25 -0
  318. package/dist/_internal/shared/features/pre-orders/schema.js +10 -0
  319. package/dist/_internal/shared/features/products/config.d.ts +5 -0
  320. package/dist/_internal/shared/features/products/config.js +5 -0
  321. package/dist/_internal/shared/features/products/errors.d.ts +16 -0
  322. package/dist/_internal/shared/features/products/errors.js +31 -0
  323. package/dist/_internal/shared/features/products/schema.d.ts +364 -0
  324. package/dist/_internal/shared/features/products/schema.js +58 -0
  325. package/dist/_internal/shared/features/products/types.d.ts +46 -0
  326. package/dist/_internal/shared/features/products/types.js +1 -0
  327. package/dist/_internal/shared/features/promotions/config.d.ts +3 -0
  328. package/dist/_internal/shared/features/promotions/config.js +3 -0
  329. package/dist/_internal/shared/features/promotions/errors.d.ts +19 -0
  330. package/dist/_internal/shared/features/promotions/errors.js +37 -0
  331. package/dist/_internal/shared/features/promotions/schema.d.ts +242 -0
  332. package/dist/_internal/shared/features/promotions/schema.js +37 -0
  333. package/dist/_internal/shared/features/reviews/config.d.ts +8 -0
  334. package/dist/_internal/shared/features/reviews/config.js +8 -0
  335. package/dist/_internal/shared/features/reviews/errors.d.ts +13 -0
  336. package/dist/_internal/shared/features/reviews/errors.js +25 -0
  337. package/dist/_internal/shared/features/reviews/schema.d.ts +44 -0
  338. package/dist/_internal/shared/features/reviews/schema.js +18 -0
  339. package/dist/_internal/shared/features/stores/config.d.ts +4 -0
  340. package/dist/_internal/shared/features/stores/config.js +4 -0
  341. package/dist/_internal/shared/features/wishlist/config.d.ts +2 -0
  342. package/dist/_internal/shared/features/wishlist/config.js +2 -0
  343. package/dist/_internal/shared/features/wishlist/errors.d.ts +4 -0
  344. package/dist/_internal/shared/features/wishlist/errors.js +7 -0
  345. package/dist/_internal/shared/index.d.ts +2 -0
  346. package/dist/_internal/shared/index.js +4 -0
  347. package/dist/_internal/shared/serialization/index.d.ts +17 -0
  348. package/dist/_internal/shared/serialization/index.js +42 -0
  349. package/dist/_internal/shared/tokens/index.d.ts +137 -0
  350. package/dist/_internal/shared/tokens/index.js +159 -0
  351. package/dist/client-entry.d.ts +23 -0
  352. package/dist/client-entry.js +27 -0
  353. package/dist/client.d.ts +47 -5
  354. package/dist/client.js +68 -33
  355. package/dist/configs/eslint.d.ts +29 -0
  356. package/dist/configs/eslint.js +38 -0
  357. package/dist/configs/index.d.ts +14 -0
  358. package/dist/configs/index.js +14 -0
  359. package/dist/configs/next.d.ts +38 -0
  360. package/dist/configs/next.js +116 -0
  361. package/dist/configs/postcss.d.ts +22 -0
  362. package/dist/configs/postcss.js +22 -0
  363. package/dist/configs/tailwind.d.ts +59 -0
  364. package/dist/configs/tailwind.js +62 -0
  365. package/dist/constants/api-endpoints.d.ts +24 -0
  366. package/dist/constants/api-endpoints.js +8 -0
  367. package/dist/constants/index.d.ts +1 -0
  368. package/dist/constants/index.js +1 -0
  369. package/dist/constants/limits.d.ts +15 -0
  370. package/dist/constants/limits.js +15 -0
  371. package/dist/contracts/client-auth.d.ts +2 -0
  372. package/dist/errors/messages.d.ts +23 -0
  373. package/dist/errors/messages.js +25 -0
  374. package/dist/features/about/components/PublicProfileView.js +16 -9
  375. package/dist/features/account/components/AddressBook.d.ts +2 -1
  376. package/dist/features/account/components/AddressBook.js +2 -2
  377. package/dist/features/account/components/UserReturnsView.d.ts +10 -0
  378. package/dist/features/account/components/UserReturnsView.js +5 -0
  379. package/dist/features/account/components/index.d.ts +2 -0
  380. package/dist/features/account/components/index.js +1 -0
  381. package/dist/features/account/hooks/useProfile.d.ts +2 -0
  382. package/dist/features/account/schemas/index.d.ts +18 -18
  383. package/dist/features/admin/actions/chat-actions.d.ts +1 -1
  384. package/dist/features/admin/actions/chat-actions.js +10 -10
  385. package/dist/features/admin/components/AdminBlogEditorView.d.ts +2 -1
  386. package/dist/features/admin/components/AdminBlogEditorView.js +16 -14
  387. package/dist/features/admin/components/AdminBlogView.js +6 -3
  388. package/dist/features/admin/components/AdminBrandEditorView.d.ts +3 -1
  389. package/dist/features/admin/components/AdminBrandEditorView.js +16 -14
  390. package/dist/features/admin/components/AdminBrandsView.js +6 -3
  391. package/dist/features/admin/components/AdminCategoriesView.js +6 -3
  392. package/dist/features/admin/components/AdminCategoryEditorView.d.ts +2 -1
  393. package/dist/features/admin/components/AdminCategoryEditorView.js +16 -14
  394. package/dist/features/admin/components/AdminCouponEditorView.d.ts +2 -1
  395. package/dist/features/admin/components/AdminCouponEditorView.js +16 -14
  396. package/dist/features/admin/components/AdminCouponsView.js +6 -3
  397. package/dist/features/admin/components/AdminFaqEditorView.d.ts +2 -1
  398. package/dist/features/admin/components/AdminFaqEditorView.js +16 -14
  399. package/dist/features/admin/components/AdminFaqsView.js +6 -3
  400. package/dist/features/admin/components/AdminFeatureEditorView.d.ts +19 -0
  401. package/dist/features/admin/components/AdminFeatureEditorView.js +150 -0
  402. package/dist/features/admin/components/AdminFeaturesView.d.ts +4 -0
  403. package/dist/features/admin/components/AdminFeaturesView.js +95 -0
  404. package/dist/features/admin/components/AdminHistoryView.d.ts +4 -0
  405. package/dist/features/admin/components/AdminHistoryView.js +57 -0
  406. package/dist/features/admin/components/AdminMediaView.js +64 -2
  407. package/dist/features/admin/components/AdminOrdersView.js +31 -4
  408. package/dist/features/admin/components/AdminProductEditorView.d.ts +2 -1
  409. package/dist/features/admin/components/AdminProductEditorView.js +30 -19
  410. package/dist/features/admin/components/AdminProductsView.js +40 -3
  411. package/dist/features/admin/components/AdminSectionsView.js +138 -2
  412. package/dist/features/admin/components/AdminSiteSettingsView.js +22 -2
  413. package/dist/features/admin/components/AdminStoresView.js +5 -4
  414. package/dist/features/admin/components/AdminUserEditorView.d.ts +4 -1
  415. package/dist/features/admin/components/AdminUserEditorView.js +2 -2
  416. package/dist/features/admin/components/AdminUsersView.js +1 -1
  417. package/dist/features/admin/components/AdminWishlistsView.js +17 -15
  418. package/dist/features/admin/components/DataTable.d.ts +2 -1
  419. package/dist/features/admin/components/DataTable.js +14 -12
  420. package/dist/features/admin/components/DrawerFormFooter.d.ts +9 -21
  421. package/dist/features/admin/components/DrawerFormFooter.js +10 -2
  422. package/dist/features/admin/components/QuickEditMenu.d.ts +20 -0
  423. package/dist/features/admin/components/QuickEditMenu.js +31 -0
  424. package/dist/features/admin/components/analytics/AdminAnalyticsCharts.js +11 -23
  425. package/dist/features/admin/components/index.d.ts +8 -0
  426. package/dist/features/admin/components/index.js +4 -0
  427. package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +9 -1
  428. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +169 -9
  429. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +62 -1
  430. package/dist/features/admin/components/sections/adminSectionsTypes.js +57 -4
  431. package/dist/features/admin/hooks/useChat.d.ts +1 -1
  432. package/dist/features/admin/repository/chat.repository.d.ts +2 -2
  433. package/dist/features/admin/repository/chat.repository.js +7 -7
  434. package/dist/features/admin/schemas/firestore.d.ts +42 -7
  435. package/dist/features/admin/schemas/firestore.js +7 -7
  436. package/dist/features/admin/types/product.types.d.ts +2 -2
  437. package/dist/features/auctions/actions/bid-actions.js +3 -2
  438. package/dist/features/auctions/components/AuctionDetailPageView.d.ts +11 -1
  439. package/dist/features/auctions/components/AuctionDetailPageView.js +80 -68
  440. package/dist/features/auctions/components/AuctionsListView.js +11 -6
  441. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +2 -1
  442. package/dist/features/auctions/hooks/useAuctions.js +2 -1
  443. package/dist/features/auctions/repository/auctions.repository.js +4 -4
  444. package/dist/features/auctions/schemas/index.d.ts +24 -24
  445. package/dist/features/auctions/types/index.d.ts +2 -1
  446. package/dist/features/auth/hooks/useAuth.d.ts +8 -0
  447. package/dist/features/auth/hooks/useAuth.js +9 -0
  448. package/dist/features/auth/schemas/index.d.ts +2 -2
  449. package/dist/features/before-after/schemas/index.d.ts +2 -2
  450. package/dist/features/blog/actions/blog-actions.d.ts +63 -63
  451. package/dist/features/blog/components/BlogPostView.d.ts +3 -1
  452. package/dist/features/blog/components/BlogPostView.js +3 -2
  453. package/dist/features/blog/schemas/index.d.ts +41 -41
  454. package/dist/features/bundles/components/AdminBundleEditorView.d.ts +8 -0
  455. package/dist/features/bundles/components/AdminBundleEditorView.js +7 -0
  456. package/dist/features/bundles/components/BundleDetailPageView.d.ts +9 -0
  457. package/dist/features/bundles/components/BundleDetailPageView.js +45 -0
  458. package/dist/features/bundles/components/BundleForm.d.ts +12 -0
  459. package/dist/features/bundles/components/BundleForm.js +126 -0
  460. package/dist/features/bundles/components/BundleItemsPicker.d.ts +9 -0
  461. package/dist/features/bundles/components/BundleItemsPicker.js +77 -0
  462. package/dist/features/bundles/components/BundlesListingView.d.ts +17 -0
  463. package/dist/features/bundles/components/BundlesListingView.js +50 -0
  464. package/dist/features/bundles/components/FeaturedBundlesSection.d.ts +5 -0
  465. package/dist/features/bundles/components/FeaturedBundlesSection.js +55 -0
  466. package/dist/features/bundles/components/SellerBundleCreateView.d.ts +8 -0
  467. package/dist/features/bundles/components/SellerBundleCreateView.js +7 -0
  468. package/dist/features/bundles/components/SellerBundleEditView.d.ts +9 -0
  469. package/dist/features/bundles/components/SellerBundleEditView.js +7 -0
  470. package/dist/features/bundles/components/index.d.ts +16 -0
  471. package/dist/features/bundles/components/index.js +8 -0
  472. package/dist/features/bundles/constants/index.d.ts +32 -0
  473. package/dist/features/bundles/constants/index.js +35 -0
  474. package/dist/features/bundles/index.d.ts +2 -0
  475. package/dist/features/bundles/index.js +2 -0
  476. package/dist/features/bundles/repository/bundles.repository.d.ts +36 -0
  477. package/dist/features/bundles/repository/bundles.repository.js +148 -0
  478. package/dist/features/bundles/repository/index.d.ts +1 -0
  479. package/dist/features/bundles/repository/index.js +1 -0
  480. package/dist/features/bundles/schemas/firestore.d.ts +88 -0
  481. package/dist/features/bundles/schemas/firestore.js +29 -0
  482. package/dist/features/bundles/schemas/index.d.ts +1 -0
  483. package/dist/features/bundles/schemas/index.js +1 -0
  484. package/dist/features/cart/actions/cart-actions.js +2 -1
  485. package/dist/features/cart/repository/cart.repository.js +1 -2
  486. package/dist/features/cart/schemas/firestore.d.ts +9 -6
  487. package/dist/features/cart/schemas/firestore.js +1 -2
  488. package/dist/features/cart/schemas/index.d.ts +7 -7
  489. package/dist/features/cart/utils/guest-cart.d.ts +6 -0
  490. package/dist/features/cart/utils/guest-cart.js +14 -0
  491. package/dist/features/categories/components/BrandDetailPageView.d.ts +3 -1
  492. package/dist/features/categories/components/BrandDetailPageView.js +6 -6
  493. package/dist/features/categories/components/CategoryDetailPageView.js +3 -3
  494. package/dist/features/categories/components/CategoryProductsListing.js +1 -1
  495. package/dist/features/categories/schemas/index.d.ts +24 -24
  496. package/dist/features/collections/schemas/index.d.ts +3 -3
  497. package/dist/features/consultation/schemas/index.d.ts +7 -7
  498. package/dist/features/corporate/schemas/index.d.ts +1 -1
  499. package/dist/features/events/components/AdminEventEditorView.d.ts +2 -1
  500. package/dist/features/events/components/AdminEventEditorView.js +10 -8
  501. package/dist/features/events/components/AdminEventsView.js +6 -3
  502. package/dist/features/events/components/EventDetailView.d.ts +7 -1
  503. package/dist/features/events/components/EventDetailView.js +4 -1
  504. package/dist/features/events/components/EventRafflesSection.d.ts +12 -0
  505. package/dist/features/events/components/EventRafflesSection.js +17 -0
  506. package/dist/features/events/components/index.d.ts +2 -0
  507. package/dist/features/events/components/index.js +1 -0
  508. package/dist/features/events/schemas/index.d.ts +41 -41
  509. package/dist/features/faq/actions/faq-actions.d.ts +16 -16
  510. package/dist/features/faq/schemas/index.d.ts +12 -12
  511. package/dist/features/history/actions/history-actions.d.ts +24 -0
  512. package/dist/features/history/actions/history-actions.js +43 -0
  513. package/dist/features/history/actions/index.d.ts +1 -0
  514. package/dist/features/history/actions/index.js +1 -0
  515. package/dist/features/history/components/HistoryTracker.d.ts +8 -0
  516. package/dist/features/history/components/HistoryTracker.js +18 -0
  517. package/dist/features/history/hooks/useHistory.d.ts +16 -0
  518. package/dist/features/history/hooks/useHistory.js +148 -0
  519. package/dist/features/history/hooks/useHistoryMergeOnLogin.d.ts +1 -0
  520. package/dist/features/history/hooks/useHistoryMergeOnLogin.js +41 -0
  521. package/dist/features/history/index.d.ts +5 -0
  522. package/dist/features/history/index.js +4 -0
  523. package/dist/features/history/repository/user-history.repository.d.ts +59 -0
  524. package/dist/features/history/repository/user-history.repository.js +203 -0
  525. package/dist/features/history/server.d.ts +6 -0
  526. package/dist/features/history/server.js +6 -0
  527. package/dist/features/history/utils/guest-history.d.ts +24 -0
  528. package/dist/features/history/utils/guest-history.js +66 -0
  529. package/dist/features/homepage/actions/homepage-section-actions.d.ts +4 -4
  530. package/dist/features/homepage/components/BrandsSection.d.ts +7 -1
  531. package/dist/features/homepage/components/BrandsSection.js +26 -4
  532. package/dist/features/homepage/components/CollectionCardsSection.d.ts +13 -0
  533. package/dist/features/homepage/components/CollectionCardsSection.js +41 -0
  534. package/dist/features/homepage/components/FAQSection.d.ts +14 -4
  535. package/dist/features/homepage/components/FAQSection.js +63 -13
  536. package/dist/features/homepage/components/FeaturedProductsSection.d.ts +8 -1
  537. package/dist/features/homepage/components/FeaturedProductsSection.js +42 -2
  538. package/dist/features/homepage/components/MarketplaceHomepageView.js +17 -8
  539. package/dist/features/homepage/components/ShopByCategorySection.d.ts +8 -1
  540. package/dist/features/homepage/components/ShopByCategorySection.js +44 -4
  541. package/dist/features/homepage/components/SocialFeedSection.js +22 -2
  542. package/dist/features/homepage/components/SocialPostCard.js +20 -5
  543. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  544. package/dist/features/homepage/components/WhatsAppCommunitySection.d.ts +0 -1
  545. package/dist/features/homepage/components/WhatsAppCommunitySection.js +4 -4
  546. package/dist/features/homepage/lib/live-stats.d.ts +18 -5
  547. package/dist/features/homepage/lib/live-stats.js +60 -29
  548. package/dist/features/homepage/lib/section-renderer.d.ts +2 -1
  549. package/dist/features/homepage/lib/section-renderer.js +50 -11
  550. package/dist/features/homepage/repository/carousels.repository.d.ts +38 -0
  551. package/dist/features/homepage/repository/carousels.repository.js +142 -0
  552. package/dist/features/homepage/schemas/firestore.d.ts +177 -21
  553. package/dist/features/homepage/schemas/firestore.js +24 -0
  554. package/dist/features/layout/AppLayoutShell.d.ts +3 -1
  555. package/dist/features/layout/AppLayoutShell.js +2 -2
  556. package/dist/features/layout/TitleBarLayout.d.ts +3 -1
  557. package/dist/features/layout/TitleBarLayout.js +5 -4
  558. package/dist/features/layout/index.d.ts +1 -1
  559. package/dist/features/media/MediaPickerModal.js +67 -3
  560. package/dist/features/media/types/index.d.ts +2 -2
  561. package/dist/features/media/upload/MediaUploadField.js +21 -5
  562. package/dist/features/messages/actions/index.d.ts +2 -0
  563. package/dist/features/messages/actions/index.js +2 -0
  564. package/dist/features/messages/actions/messages-actions.d.ts +15 -0
  565. package/dist/features/messages/actions/messages-actions.js +33 -0
  566. package/dist/features/messages/actions/ping-rtdb.d.ts +2 -0
  567. package/dist/features/messages/actions/ping-rtdb.js +24 -0
  568. package/dist/features/messages/hooks/useConversation.d.ts +22 -0
  569. package/dist/features/messages/hooks/useConversation.js +125 -0
  570. package/dist/features/messages/hooks/useConversations.d.ts +9 -0
  571. package/dist/features/messages/hooks/useConversations.js +62 -0
  572. package/dist/features/messages/index.d.ts +6 -0
  573. package/dist/features/messages/index.js +4 -0
  574. package/dist/features/messages/realtime.d.ts +32 -0
  575. package/dist/features/messages/realtime.js +39 -0
  576. package/dist/features/messages/repository/conversations.repository.d.ts +35 -0
  577. package/dist/features/messages/repository/conversations.repository.js +180 -0
  578. package/dist/features/messages/server.d.ts +6 -0
  579. package/dist/features/messages/server.js +6 -0
  580. package/dist/features/orders/schemas/firestore.d.ts +21 -0
  581. package/dist/features/orders/schemas/index.d.ts +28 -28
  582. package/dist/features/orders/utils/order-splitter.d.ts +12 -2
  583. package/dist/features/orders/utils/order-splitter.js +13 -2
  584. package/dist/features/payments/schemas/index.d.ts +6 -6
  585. package/dist/features/pre-orders/api/route.js +10 -11
  586. package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +11 -1
  587. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +45 -35
  588. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +24 -7
  589. package/dist/features/pre-orders/components/PreOrdersListView.js +10 -5
  590. package/dist/features/pre-orders/schemas/index.d.ts +6 -6
  591. package/dist/features/products/actions/product-actions.d.ts +2 -2
  592. package/dist/features/products/actions/product-actions.js +21 -16
  593. package/dist/features/products/api/[id]/route.js +4 -4
  594. package/dist/features/products/api/route.js +21 -6
  595. package/dist/features/products/components/AuctionsIndexListing.js +1 -1
  596. package/dist/features/products/components/CompareOverlay.d.ts +51 -0
  597. package/dist/features/products/components/CompareOverlay.js +154 -0
  598. package/dist/features/products/components/FeatureBadge.d.ts +28 -0
  599. package/dist/features/products/components/FeatureBadge.js +63 -0
  600. package/dist/features/products/components/GroupSettingsPanel.js +1 -1
  601. package/dist/features/products/components/NonRefundableConsentModal.d.ts +23 -0
  602. package/dist/features/products/components/NonRefundableConsentModal.js +55 -0
  603. package/dist/features/products/components/PrizeDrawsSection.d.ts +12 -0
  604. package/dist/features/products/components/PrizeDrawsSection.js +17 -0
  605. package/dist/features/products/components/ProductDetailPageView.d.ts +16 -1
  606. package/dist/features/products/components/ProductDetailPageView.js +65 -60
  607. package/dist/features/products/components/ProductFeaturesContext.d.ts +9 -0
  608. package/dist/features/products/components/ProductFeaturesContext.js +11 -0
  609. package/dist/features/products/components/ProductFeaturesSelector.d.ts +12 -0
  610. package/dist/features/products/components/ProductFeaturesSelector.js +72 -0
  611. package/dist/features/products/components/ProductForm.js +9 -3
  612. package/dist/features/products/components/ProductGrid.js +9 -3
  613. package/dist/features/products/components/ProductsIndexListing.js +24 -8
  614. package/dist/features/products/components/ProductsIndexPageView.js +12 -7
  615. package/dist/features/products/components/ShowGroupSection.js +2 -1
  616. package/dist/features/products/components/SublistingCarouselSection.js +3 -2
  617. package/dist/features/products/components/index.d.ts +12 -0
  618. package/dist/features/products/components/index.js +6 -0
  619. package/dist/features/products/constants/action-defs.d.ts +209 -0
  620. package/dist/features/products/constants/action-defs.js +270 -0
  621. package/dist/features/products/constants/product-features.constants.d.ts +23 -0
  622. package/dist/features/products/constants/product-features.constants.js +50 -0
  623. package/dist/features/products/hooks/useProducts.d.ts +1 -0
  624. package/dist/features/products/hooks/useProducts.js +15 -6
  625. package/dist/features/products/hooks/useRelatedProducts.d.ts +5 -0
  626. package/dist/features/products/hooks/useRelatedProducts.js +9 -1
  627. package/dist/features/products/index.d.ts +3 -1
  628. package/dist/features/products/index.js +3 -1
  629. package/dist/features/products/repository/loadProductFeatures.d.ts +2 -0
  630. package/dist/features/products/repository/loadProductFeatures.js +23 -0
  631. package/dist/features/products/repository/product-features.repository.d.ts +27 -0
  632. package/dist/features/products/repository/product-features.repository.js +141 -0
  633. package/dist/features/products/repository/product-templates.repository.d.ts +12 -0
  634. package/dist/features/products/repository/product-templates.repository.js +61 -0
  635. package/dist/features/products/repository/products.repository.d.ts +16 -1
  636. package/dist/features/products/repository/products.repository.js +126 -6
  637. package/dist/features/products/schemas/firestore.d.ts +43 -5
  638. package/dist/features/products/schemas/firestore.js +6 -7
  639. package/dist/features/products/schemas/index.d.ts +147 -51
  640. package/dist/features/products/schemas/index.js +32 -3
  641. package/dist/features/products/schemas/product-features.d.ts +84 -0
  642. package/dist/features/products/schemas/product-features.js +33 -0
  643. package/dist/features/products/schemas/product-features.validators.d.ts +107 -0
  644. package/dist/features/products/schemas/product-features.validators.js +64 -0
  645. package/dist/features/products/schemas/product-templates.d.ts +28 -0
  646. package/dist/features/products/schemas/product-templates.js +6 -0
  647. package/dist/features/products/types/index.d.ts +13 -5
  648. package/dist/features/products/utils/listing-type.d.ts +23 -2
  649. package/dist/features/products/utils/listing-type.js +14 -7
  650. package/dist/features/products/utils/sanitize.d.ts +2 -0
  651. package/dist/features/products/utils/sanitize.js +25 -0
  652. package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
  653. package/dist/features/promotions/components/CouponsIndexListing.d.ts +4 -4
  654. package/dist/features/promotions/components/CouponsIndexListing.js +3 -3
  655. package/dist/features/promotions/hooks/useCouponValidate.d.ts +2 -2
  656. package/dist/features/promotions/repository/coupons.repository.d.ts +2 -2
  657. package/dist/features/promotions/repository/coupons.repository.js +5 -5
  658. package/dist/features/promotions/schemas/index.d.ts +18 -18
  659. package/dist/features/reviews/schemas/index.d.ts +16 -16
  660. package/dist/features/search/actions/search-actions.js +4 -5
  661. package/dist/features/search/api/route.js +13 -10
  662. package/dist/features/search/columns/index.d.ts +1 -1
  663. package/dist/features/search/columns/index.js +4 -4
  664. package/dist/features/search/repository/search.repository.js +4 -6
  665. package/dist/features/search/schemas/index.d.ts +5 -5
  666. package/dist/features/search/types/index.d.ts +4 -3
  667. package/dist/features/seller/actions/offer-actions.js +1 -2
  668. package/dist/features/seller/components/BrandInlineSelect.d.ts +9 -0
  669. package/dist/features/seller/components/BrandInlineSelect.js +26 -0
  670. package/dist/features/seller/components/CategoryInlineSelect.d.ts +9 -0
  671. package/dist/features/seller/components/CategoryInlineSelect.js +26 -0
  672. package/dist/features/seller/components/SellerFeaturesView.d.ts +1 -0
  673. package/dist/features/seller/components/SellerFeaturesView.js +61 -0
  674. package/dist/features/seller/components/SellerProductShell.d.ts +15 -1
  675. package/dist/features/seller/components/SellerProductShell.js +7 -7
  676. package/dist/features/seller/components/SellerProductsView.js +17 -17
  677. package/dist/features/seller/components/SellerStorefrontView.d.ts +7 -0
  678. package/dist/features/seller/components/SellerStorefrontView.js +12 -2
  679. package/dist/features/seller/components/analytics/SellerRevenueChart.js +9 -17
  680. package/dist/features/seller/components/index.d.ts +6 -0
  681. package/dist/features/seller/components/index.js +4 -0
  682. package/dist/features/seller/schemas/index.d.ts +26 -26
  683. package/dist/features/shell/FormShell.d.ts +9 -1
  684. package/dist/features/shell/FormShell.js +5 -3
  685. package/dist/features/stores/actions/store-query-actions.js +2 -2
  686. package/dist/features/stores/api/[storeSlug]/auctions/route.js +11 -15
  687. package/dist/features/stores/api/[storeSlug]/products/route.js +11 -15
  688. package/dist/features/stores/api/route.js +12 -14
  689. package/dist/features/stores/components/StoreAuctionsListing.d.ts +2 -4
  690. package/dist/features/stores/components/StoreAuctionsListing.js +3 -4
  691. package/dist/features/stores/components/StoreAuctionsPageView.js +1 -1
  692. package/dist/features/stores/components/StoreDetailLayoutView.js +3 -3
  693. package/dist/features/stores/components/StorePreOrdersListing.d.ts +1 -3
  694. package/dist/features/stores/components/StorePreOrdersListing.js +2 -3
  695. package/dist/features/stores/components/StorePreOrdersPageView.js +1 -1
  696. package/dist/features/stores/components/StoreProductsListing.d.ts +2 -4
  697. package/dist/features/stores/components/StoreProductsListing.js +2 -3
  698. package/dist/features/stores/components/StoreProductsPageView.d.ts +4 -1
  699. package/dist/features/stores/components/StoreProductsPageView.js +17 -11
  700. package/dist/features/stores/repository/store.repository.d.ts +10 -0
  701. package/dist/features/stores/repository/store.repository.js +39 -0
  702. package/dist/features/stores/schemas/firestore.d.ts +7 -0
  703. package/dist/features/stores/schemas/index.d.ts +8 -8
  704. package/dist/features/stores/types/index.d.ts +4 -3
  705. package/dist/features/wishlist/actions/wishlist-actions.d.ts +8 -6
  706. package/dist/features/wishlist/actions/wishlist-actions.js +9 -7
  707. package/dist/features/wishlist/components/WishlistCapWatcher.d.ts +1 -0
  708. package/dist/features/wishlist/components/WishlistCapWatcher.js +24 -0
  709. package/dist/features/wishlist/components/index.d.ts +1 -0
  710. package/dist/features/wishlist/components/index.js +1 -0
  711. package/dist/features/wishlist/hooks/useWishlistCount.d.ts +17 -0
  712. package/dist/features/wishlist/hooks/useWishlistCount.js +36 -1
  713. package/dist/features/wishlist/index.d.ts +2 -0
  714. package/dist/features/wishlist/index.js +1 -0
  715. package/dist/features/wishlist/repository/user-wishlist.repository.d.ts +52 -7
  716. package/dist/features/wishlist/repository/user-wishlist.repository.js +154 -44
  717. package/dist/features/wishlist/schemas/index.d.ts +2 -2
  718. package/dist/features/wishlist/server.d.ts +1 -1
  719. package/dist/features/wishlist/server.js +1 -1
  720. package/dist/features/wishlist/types/index.d.ts +2 -2
  721. package/dist/index.d.ts +87 -5
  722. package/dist/index.js +101 -12
  723. package/dist/next/api/routeHandler.d.ts +7 -0
  724. package/dist/next/api/routeHandler.js +8 -0
  725. package/dist/next/routing/route-map.d.ts +68 -0
  726. package/dist/next/routing/route-map.js +32 -0
  727. package/dist/providers/db-firebase/filter-aliases.d.ts +20 -0
  728. package/dist/providers/db-firebase/filter-aliases.js +29 -0
  729. package/dist/providers/db-firebase/index.d.ts +2 -2
  730. package/dist/providers/db-firebase/index.js +1 -1
  731. package/dist/providers/db-firebase/sieve.d.ts +9 -0
  732. package/dist/providers/db-firebase/sieve.js +24 -6
  733. package/dist/providers/firebase-client/auth.d.ts +1 -0
  734. package/dist/providers/firebase-client/auth.js +9 -1
  735. package/dist/providers/shipping-shiprocket/index.d.ts +9 -0
  736. package/dist/providers/shipping-shiprocket/index.js +11 -0
  737. package/dist/react/hooks/use-action-dispatch.d.ts +25 -0
  738. package/dist/react/hooks/use-action-dispatch.js +30 -0
  739. package/dist/react/hooks/use-panel-url-sync.d.ts +15 -0
  740. package/dist/react/hooks/use-panel-url-sync.js +46 -0
  741. package/dist/react/hooks/useInfiniteScroll.d.ts +52 -0
  742. package/dist/react/hooks/useInfiniteScroll.js +45 -0
  743. package/dist/repositories/index.d.ts +9 -1
  744. package/dist/repositories/index.js +8 -1
  745. package/dist/seed/_bundle-constants.d.ts +14 -0
  746. package/dist/seed/_bundle-constants.js +14 -0
  747. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  748. package/dist/seed/bids-seed-data.js +165 -0
  749. package/dist/seed/blog-posts-seed-data.js +393 -0
  750. package/dist/seed/bundles-seed-data.d.ts +13 -0
  751. package/dist/seed/bundles-seed-data.js +229 -0
  752. package/dist/seed/carousels-seed-data.d.ts +2 -0
  753. package/dist/seed/carousels-seed-data.js +16 -0
  754. package/dist/seed/cart-seed-data.js +161 -16
  755. package/dist/seed/categories-seed-data.js +168 -0
  756. package/dist/seed/coupons-seed-data.js +174 -0
  757. package/dist/seed/events-seed-data.js +161 -0
  758. package/dist/seed/history-seed-data.d.ts +19 -0
  759. package/dist/seed/history-seed-data.js +61 -0
  760. package/dist/seed/homepage-sections-seed-data.js +97 -1
  761. package/dist/seed/index.d.ts +4 -3
  762. package/dist/seed/index.js +9 -3
  763. package/dist/seed/manifest.js +23 -1
  764. package/dist/seed/notifications-seed-data.js +60 -0
  765. package/dist/seed/orders-seed-data.js +2 -2
  766. package/dist/seed/product-features-seed-data.d.ts +10 -0
  767. package/dist/seed/product-features-seed-data.js +162 -0
  768. package/dist/seed/products-auctions-seed-data.d.ts +6 -1
  769. package/dist/seed/products-auctions-seed-data.js +495 -24
  770. package/dist/seed/products-preorders-seed-data.d.ts +6 -1
  771. package/dist/seed/products-preorders-seed-data.js +27 -18
  772. package/dist/seed/products-standard-seed-data.d.ts +5 -0
  773. package/dist/seed/products-standard-seed-data.js +208 -297
  774. package/dist/seed/runner.js +95 -16
  775. package/dist/seed/server.d.ts +2 -0
  776. package/dist/seed/server.js +7 -0
  777. package/dist/seed/site-settings-seed-data.js +11 -1
  778. package/dist/seed/types.d.ts +58 -1
  779. package/dist/seed/types.js +14 -1
  780. package/dist/seed/wishlists-seed-data.d.ts +14 -7
  781. package/dist/seed/wishlists-seed-data.js +52 -109
  782. package/dist/seo/json-ld.d.ts +2 -1
  783. package/dist/server-entry.d.ts +60 -0
  784. package/dist/server-entry.js +93 -0
  785. package/dist/server.d.ts +26 -3
  786. package/dist/server.js +39 -7
  787. package/dist/stores/panel-store.d.ts +9 -0
  788. package/dist/stores/panel-store.js +8 -0
  789. package/dist/tailwind-utilities.css +1 -1
  790. package/dist/tokens/tokens.css +182 -12
  791. package/dist/ui/DataTable.style.css +192 -190
  792. package/dist/ui/components/Accordion.style.css +82 -82
  793. package/dist/ui/components/ActiveFilterChips.style.css +12 -12
  794. package/dist/ui/components/Alert.style.css +187 -187
  795. package/dist/ui/components/Avatar.style.css +71 -71
  796. package/dist/ui/components/AvatarDisplay.style.css +3 -3
  797. package/dist/ui/components/Badge.style.css +114 -114
  798. package/dist/ui/components/BaseListingCard.style.css +86 -86
  799. package/dist/ui/components/Breadcrumb.style.css +10 -10
  800. package/dist/ui/components/BulkActionBar.style.css +196 -196
  801. package/dist/ui/components/BulkActionsBar.d.ts +2 -0
  802. package/dist/ui/components/BulkActionsBar.js +5 -2
  803. package/dist/ui/components/Button.d.ts +3 -1
  804. package/dist/ui/components/Button.js +12 -2
  805. package/dist/ui/components/Button.style.css +160 -160
  806. package/dist/ui/components/Card.style.css +190 -190
  807. package/dist/ui/components/Checkbox.style.css +111 -111
  808. package/dist/ui/components/ConfirmDeleteModal.style.css +89 -89
  809. package/dist/ui/components/DashboardStatsCard.style.css +68 -68
  810. package/dist/ui/components/DescriptionField.style.css +36 -36
  811. package/dist/ui/components/DetailViewShell.js +1 -2
  812. package/dist/ui/components/Divider.style.css +39 -39
  813. package/dist/ui/components/Drawer.style.css +150 -150
  814. package/dist/ui/components/Dropdown.style.css +110 -110
  815. package/dist/ui/components/DynamicSelect.style.css +101 -101
  816. package/dist/ui/components/EmptyState.style.css +2 -2
  817. package/dist/ui/components/FilterDrawer.style.css +61 -61
  818. package/dist/ui/components/FlowDiagram.style.css +3 -3
  819. package/dist/ui/components/Form.style.css +27 -27
  820. package/dist/ui/components/FormActionBar.d.ts +22 -0
  821. package/dist/ui/components/FormActionBar.js +8 -0
  822. package/dist/ui/components/FormActionBar.style.css +77 -0
  823. package/dist/ui/components/FormField.style.css +30 -30
  824. package/dist/ui/components/HorizontalScroller.style.css +10 -10
  825. package/dist/ui/components/IconButton.style.css +103 -103
  826. package/dist/ui/components/ImageGallery.style.css +4 -4
  827. package/dist/ui/components/InlineCreateSelect.d.ts +13 -3
  828. package/dist/ui/components/InlineCreateSelect.js +9 -4
  829. package/dist/ui/components/Input.style.css +28 -28
  830. package/dist/ui/components/Layout.d.ts +2 -0
  831. package/dist/ui/components/Layout.js +2 -0
  832. package/dist/ui/components/Layout.style.css +22 -5
  833. package/dist/ui/components/ListingLayout.style.css +491 -491
  834. package/dist/ui/components/Modal.style.css +106 -106
  835. package/dist/ui/components/Pagination.style.css +76 -76
  836. package/dist/ui/components/PasswordStrengthIndicator.style.css +56 -56
  837. package/dist/ui/components/PriceDisplay.style.css +47 -47
  838. package/dist/ui/components/Progress.style.css +81 -81
  839. package/dist/ui/components/Radio.style.css +153 -153
  840. package/dist/ui/components/RatingDisplay.style.css +50 -50
  841. package/dist/ui/components/RowActionMenu.style.css +91 -91
  842. package/dist/ui/components/SectionTabs.style.css +18 -18
  843. package/dist/ui/components/Select.style.css +177 -177
  844. package/dist/ui/components/SideDrawer.style.css +206 -206
  845. package/dist/ui/components/SideModal.style.css +73 -73
  846. package/dist/ui/components/SiteLogo.d.ts +26 -0
  847. package/dist/ui/components/SiteLogo.js +18 -0
  848. package/dist/ui/components/Skeleton.style.css +55 -55
  849. package/dist/ui/components/SkipToMain.style.css +3 -3
  850. package/dist/ui/components/Slider.style.css +15 -15
  851. package/dist/ui/components/Spinner.style.css +84 -84
  852. package/dist/ui/components/StarRating.style.css +44 -44
  853. package/dist/ui/components/StatsGrid.style.css +96 -96
  854. package/dist/ui/components/StepperNav.style.css +110 -110
  855. package/dist/ui/components/SummaryCard.style.css +80 -82
  856. package/dist/ui/components/TabStrip.style.css +97 -97
  857. package/dist/ui/components/TablePagination.style.css +89 -89
  858. package/dist/ui/components/Tabs.style.css +44 -44
  859. package/dist/ui/components/TagInput.style.css +121 -121
  860. package/dist/ui/components/TextLink.style.css +94 -94
  861. package/dist/ui/components/Textarea.style.css +30 -30
  862. package/dist/ui/components/Toast.style.css +112 -112
  863. package/dist/ui/components/Toggle.style.css +105 -105
  864. package/dist/ui/components/Tooltip.style.css +114 -114
  865. package/dist/ui/components/Typography.style.css +178 -178
  866. package/dist/ui/components/UnsavedChangesModal.style.css +1 -1
  867. package/dist/ui/components/ViewToggle.style.css +8 -8
  868. package/dist/ui/components/index.style.css +1 -0
  869. package/dist/ui/index.d.ts +4 -0
  870. package/dist/ui/index.js +2 -0
  871. package/dist/ui/rich-text/RichText.style.css +40 -40
  872. package/dist/utils/index.d.ts +1 -0
  873. package/dist/utils/index.js +1 -0
  874. package/dist/utils/listing-params.d.ts +86 -0
  875. package/dist/utils/listing-params.js +121 -0
  876. package/dist/validation/schemas.d.ts +22 -22
  877. package/package.json +61 -9
  878. package/scripts/audit-violations.mjs +77 -0
  879. package/scripts/init-config.mjs +76 -0
  880. package/scripts/labels-extract.mjs +64 -0
  881. package/scripts/seed-cli-loader.mjs +37 -0
  882. package/scripts/seed-cli.mjs +660 -0
  883. package/scripts/sieve-audit.mjs +475 -0
  884. package/scripts/smoke-bundle.mjs +60 -0
  885. package/scripts/smoke-ssr.mjs +81 -0
  886. package/scripts/smoke-theme.mjs +105 -0
  887. package/scripts/verify-css-build.mjs +49 -0
  888. package/scripts/verify-entries.mjs +55 -0
  889. package/tsconfig.base.json +16 -0
@@ -1,20 +1,70 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
3
+ import { useState, useMemo } from "react";
4
4
  import { THEME_CONSTANTS } from "../../../tokens";
5
- import { Button, Heading, Section, Span, Text, TextLink } from "../../../ui";
5
+ import { Button, Heading, RichText, Section, Span, Text, TextLink } from "../../../ui";
6
6
  import { ChevronDown } from "lucide-react";
7
+ // --- Constants ----------------------------------------------------------------
8
+ const CATEGORY_LABELS = {
9
+ general: "General",
10
+ orders_payment: "Orders & Payment",
11
+ shipping_delivery: "Shipping",
12
+ returns_refunds: "Returns & Refunds",
13
+ product_information: "Products",
14
+ account_security: "Account",
15
+ technical_support: "Support",
16
+ };
17
+ // --- Helpers -----------------------------------------------------------------
18
+ function isHtml(s) {
19
+ return /<[a-z][\s\S]*>/i.test(s);
20
+ }
7
21
  // --- Section -----------------------------------------------------------------
8
- export function FAQSection({ title, subtitle, items, viewMoreHref, viewMoreLabel = "View all →", hasMore = false, moreCount = 0, renderTabs, className = "", }) {
9
- const { themed, spacing, flex } = THEME_CONSTANTS;
10
- const [openFaqId, setOpenFaqId] = useState(null);
11
- const toggleFaq = (faqId) => {
12
- setOpenFaqId(openFaqId === faqId ? null : faqId);
22
+ export function FAQSection({ title, subtitle, items, tabs: tabsProp, showCategoryTabs = false, allowMultipleOpen = false, defaultOpenCount = 0, viewMoreHref, viewMoreLabel = "View all FAQs →", hasMore = false, moreCount = 0, className = "", }) {
23
+ const { themed, flex } = THEME_CONSTANTS;
24
+ // Derive tabs from items when not explicitly provided
25
+ const derivedTabs = useMemo(() => {
26
+ if (!showCategoryTabs)
27
+ return [];
28
+ if (tabsProp && tabsProp.length > 0)
29
+ return tabsProp;
30
+ const seen = new Set();
31
+ const result = [];
32
+ for (const item of items) {
33
+ const cat = item.category ?? "general";
34
+ if (!seen.has(cat)) {
35
+ seen.add(cat);
36
+ result.push({ value: cat, label: CATEGORY_LABELS[cat] ?? cat });
37
+ }
38
+ }
39
+ return result;
40
+ }, [showCategoryTabs, tabsProp, items]);
41
+ const showTabs = showCategoryTabs && derivedTabs.length > 1;
42
+ const [activeTab, setActiveTab] = useState("all");
43
+ // Pre-open the first N items
44
+ const defaultOpen = useMemo(() => new Set(items.slice(0, defaultOpenCount).map((i) => i.id)), [items, defaultOpenCount]);
45
+ const [openIds, setOpenIds] = useState(defaultOpen);
46
+ const toggle = (id) => {
47
+ setOpenIds((prev) => {
48
+ const next = new Set(prev);
49
+ if (next.has(id)) {
50
+ next.delete(id);
51
+ }
52
+ else {
53
+ if (!allowMultipleOpen)
54
+ next.clear();
55
+ next.add(id);
56
+ }
57
+ return next;
58
+ });
13
59
  };
14
- return (_jsx(Section, { className: `p-8 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "w-full max-w-7xl mx-auto", "data-section": "faqsection-div-320", children: [_jsxs("div", { className: "text-center mb-8", "data-section": "faqsection-div-321", children: [_jsx(Heading, { level: 2, variant: "none", className: "bg-gradient-to-r from-primary to-cobalt bg-clip-text text-transparent text-3xl md:text-4xl font-bold mb-3", children: title }), subtitle && (_jsx(Text, { className: `text-base ${themed.textSecondary}`, children: subtitle }))] }), renderTabs && _jsx("div", { className: "mb-8 -mx-8", "data-section": "faqsection-div-322", children: renderTabs() }), _jsxs("div", { className: `${spacing.stack} max-w-5xl mx-auto`, "data-section": "faqsection-div-323", children: [items.length === 0 && (_jsx(Text, { className: `text-center py-8 ${themed.textSecondary}`, children: "No FAQs found." })), items.map((faq) => {
15
- const isOpen = openFaqId === faq.id;
16
- return (_jsxs("div", { className: `${themed.bgPrimary} rounded-2xl overflow-hidden transition-all border-l-4 ${isOpen
17
- ? "border-primary bg-primary/5 dark:bg-primary/10"
18
- : "border-transparent"}`, "data-section": "faqsection-div-324", children: [_jsxs(Button, { variant: "ghost", className: `w-full text-left p-6 ${flex.between} gap-4 hover:bg-zinc-50 dark:hover:bg-slate-800 transition-colors`, onClick: () => toggleFaq(faq.id), "aria-expanded": isOpen, children: [_jsx(Span, { className: `text-base ${themed.textPrimary} font-medium flex-1`, children: faq.question }), _jsx(ChevronDown, { className: `w-5 h-5 flex-shrink-0 ${themed.textSecondary} transition-transform duration-300 ${isOpen ? "rotate-180" : ""}` })] }), _jsx("div", { className: `overflow-hidden transition-all duration-300 ease-out ${isOpen ? "max-h-96 opacity-100" : "max-h-0 opacity-0"}`, "data-section": "faqsection-div-325", children: _jsx("div", { className: "p-6 pt-0", "data-section": "faqsection-div-326", children: _jsx(Text, { className: `text-base ${themed.textSecondary} rounded-md ${themed.bgTertiary} p-4`, children: faq.answer }) }) })] }, faq.id));
19
- })] }), viewMoreHref && (_jsx("div", { className: "text-center mt-8", "data-section": "faqsection-div-327", children: _jsxs(TextLink, { href: viewMoreHref, className: "inline-flex items-center gap-2 px-6 py-2.5 rounded-full text-sm font-medium bg-primary/10 text-primary hover:bg-primary/20 dark:bg-primary/15 dark:text-primary-400 transition-colors", children: [viewMoreLabel, hasMore && moreCount > 0 && (_jsxs(Span, { className: "bg-primary dark:bg-primary/80 text-white text-xs px-2 py-0.5 rounded-full", children: ["+", moreCount] }))] }) }))] }) }));
60
+ // Filter by selected tab
61
+ const visibleItems = useMemo(() => {
62
+ if (!showTabs || activeTab === "all")
63
+ return items;
64
+ return items.filter((i) => (i.category ?? "general") === activeTab);
65
+ }, [items, showTabs, activeTab]);
66
+ return (_jsx(Section, { className: `py-16 px-4 sm:px-8 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "w-full max-w-4xl mx-auto", "data-section": "faqsection-div-320", children: [_jsxs("div", { className: "text-center mb-10", "data-section": "faqsection-div-321", children: [_jsx(Heading, { level: 2, variant: "none", className: "bg-gradient-to-r from-primary to-cobalt bg-clip-text text-transparent text-3xl md:text-4xl font-bold mb-3", children: title }), subtitle && (_jsx(Text, { className: `text-base max-w-xl mx-auto ${themed.textSecondary}`, children: subtitle }))] }), showTabs && (_jsxs("div", { className: `${flex.center} flex-wrap gap-2 mb-8`, "data-section": "faqsection-div-322", children: [_jsx(Button, { variant: activeTab === "all" ? "primary" : "ghost", size: "sm", onClick: () => setActiveTab("all"), className: "rounded-full", children: "All" }), derivedTabs.map((tab) => (_jsx(Button, { variant: activeTab === tab.value ? "primary" : "ghost", size: "sm", onClick: () => setActiveTab(tab.value), className: "rounded-full", children: tab.label }, tab.value)))] })), _jsxs("div", { className: "space-y-2", "data-section": "faqsection-div-323", children: [visibleItems.length === 0 && (_jsx(Text, { className: `text-center py-12 ${themed.textSecondary}`, children: "No FAQs in this category yet." })), visibleItems.map((faq) => {
67
+ const isOpen = openIds.has(faq.id);
68
+ return (_jsxs("div", { className: `${themed.bgPrimary} rounded-xl overflow-hidden border transition-all duration-200 ${isOpen ? "border-primary/40 shadow-sm" : `${themed.border}`}`, "data-section": "faqsection-div-324", children: [_jsxs(Button, { variant: "ghost", className: `w-full text-left px-5 py-4 ${flex.between} gap-4 hover:${themed.bgTertiary} transition-colors rounded-none`, onClick: () => toggle(faq.id), "aria-expanded": isOpen, children: [_jsx(Span, { className: `text-sm font-medium flex-1 leading-snug ${isOpen ? "text-primary" : themed.textPrimary}`, children: faq.question }), _jsx(ChevronDown, { className: `w-4 h-4 flex-shrink-0 transition-transform duration-250 ${isOpen ? "rotate-180 text-primary" : themed.textSecondary}` })] }), _jsx("div", { className: `grid transition-all duration-300 ease-out ${isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"}`, "data-section": "faqsection-div-325", children: _jsx("div", { className: "overflow-hidden", "data-section": "faqsection-div-326", children: _jsx("div", { className: "px-5 pb-5 pt-0", children: isHtml(faq.answer) ? (_jsx(RichText, { html: faq.answer, proseClass: "prose prose-sm max-w-none dark:prose-invert", className: themed.textSecondary })) : (_jsx(Text, { className: `text-sm leading-relaxed ${themed.textSecondary}`, children: faq.answer })) }) }) })] }, faq.id));
69
+ })] }), viewMoreHref && (_jsx("div", { className: "text-center mt-10", "data-section": "faqsection-div-327", children: _jsxs(TextLink, { href: viewMoreHref, className: "inline-flex items-center gap-2 px-6 py-2.5 rounded-full text-sm font-medium bg-primary/10 text-primary hover:bg-primary/20 dark:bg-primary/15 transition-colors", children: [viewMoreLabel, hasMore && moreCount > 0 && (_jsxs(Span, { className: "bg-primary text-white text-xs px-2 py-0.5 rounded-full", children: ["+", moreCount] }))] }) }))] }) }));
20
70
  }
@@ -1,4 +1,5 @@
1
1
  import type { ProductItem } from "../../products/types";
2
+ import type { SectionPagination } from "../schemas/firestore";
2
3
  export interface FeaturedProductsSectionProps {
3
4
  title?: string;
4
5
  description?: string;
@@ -7,5 +8,11 @@ export interface FeaturedProductsSectionProps {
7
8
  className?: string;
8
9
  filterByBrand?: string;
9
10
  initialItems?: ProductItem[];
11
+ /** Number of grid rows (1–4). When 1 (default), renders the existing horizontal carousel. */
12
+ rows?: number;
13
+ /** Maximum items to show. Clamped to 5–20. */
14
+ maxItems?: number;
15
+ /** Pagination strategy for rows > 1. */
16
+ pagination?: SectionPagination;
10
17
  }
11
- export declare function FeaturedProductsSection({ title, description, viewMoreHref, viewMoreLabel, className, filterByBrand, initialItems, }: FeaturedProductsSectionProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function FeaturedProductsSection({ title, description, viewMoreHref, viewMoreLabel, className, filterByBrand, initialItems, rows, maxItems, pagination, }: FeaturedProductsSectionProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,10 +1,43 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import Link from "next/link";
3
5
  import { SectionCarousel } from "./SectionCarousel";
4
6
  import { useFeaturedProducts } from "../hooks/useFeaturedProducts";
5
7
  import { InteractiveProductCard } from "../../products/components/InteractiveProductCard";
6
8
  import { ROUTES } from "../../../next";
7
- export function FeaturedProductsSection({ title = "Featured Products", description, viewMoreHref, viewMoreLabel = "View all products →", className = "", filterByBrand, initialItems, }) {
9
+ import { Section, Heading, Text } from "../../../ui";
10
+ import { THEME_CONSTANTS } from "../../../tokens";
11
+ // --- Multi-row grid + pagination -----------------------------------------------
12
+ function ProductGrid({ items, rows, maxItems, pagination, viewMoreHref, viewMoreLabel, title, description, }) {
13
+ const { themed } = THEME_CONSTANTS;
14
+ const pageSize = Math.min(rows * 5, maxItems);
15
+ const [offset, setOffset] = useState(0);
16
+ const timerRef = useRef(null);
17
+ const totalItems = Math.min(items.length, maxItems);
18
+ const visible = items.slice(offset, Math.min(offset + pageSize, totalItems));
19
+ const canNext = offset + pageSize < totalItems;
20
+ const canPrev = offset > 0;
21
+ const next = () => setOffset((o) => Math.min(o + pageSize, totalItems - pageSize));
22
+ const prev = () => setOffset((o) => Math.max(o - pageSize, 0));
23
+ useEffect(() => {
24
+ if (pagination !== "auto-scroll")
25
+ return;
26
+ timerRef.current = setInterval(() => {
27
+ setOffset((o) => {
28
+ const nextOffset = o + pageSize;
29
+ return nextOffset >= totalItems ? 0 : nextOffset;
30
+ });
31
+ }, 5000);
32
+ return () => { if (timerRef.current)
33
+ clearInterval(timerRef.current); };
34
+ }, [pagination, pageSize, totalItems]);
35
+ return (_jsx(Section, { className: `py-12 px-4 ${themed.bgPrimary}`, children: _jsxs("div", { className: "mx-auto max-w-7xl", children: [_jsxs("div", { className: "mb-6 flex items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx(Heading, { level: 2, className: `text-2xl font-bold md:text-3xl ${themed.textPrimary}`, children: title }), description && (_jsx(Text, { variant: "muted", className: "mt-1 text-sm", children: description }))] }), pagination === "arrows" && (_jsxs("div", { className: "flex shrink-0 gap-2", children: [_jsx("button", { type: "button", onClick: prev, disabled: !canPrev, "aria-label": "Previous", className: "flex h-9 w-9 items-center justify-center rounded-full border border-zinc-200 bg-white text-zinc-600 hover:border-[var(--appkit-color-primary)] hover:text-[var(--appkit-color-primary)] disabled:opacity-40 dark:border-slate-700 dark:bg-slate-900 dark:text-zinc-300", children: "\u2039" }), _jsx("button", { type: "button", onClick: next, disabled: !canNext, "aria-label": "Next", className: "flex h-9 w-9 items-center justify-center rounded-full border border-zinc-200 bg-white text-zinc-600 hover:border-[var(--appkit-color-primary)] hover:text-[var(--appkit-color-primary)] disabled:opacity-40 dark:border-slate-700 dark:bg-slate-900 dark:text-zinc-300", children: "\u203A" })] }))] }), _jsx("div", { className: "grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5", children: visible.map((product) => (_jsx(InteractiveProductCard, { product: product, href: String(ROUTES.PUBLIC.PRODUCT_DETAIL(product.slug ?? product.id ?? "")) }, product.id))) }), pagination === "load-more" && canNext && (_jsx("div", { className: "mt-8 text-center", children: _jsx("button", { type: "button", onClick: next, className: "rounded-lg border border-zinc-300 bg-white px-6 py-2 text-sm font-medium text-zinc-700 hover:border-[var(--appkit-color-primary)] hover:text-[var(--appkit-color-primary)] dark:border-slate-600 dark:bg-slate-900 dark:text-zinc-300", children: "Load more" }) })), viewMoreHref && (_jsx("div", { className: "mt-6 text-center", children: _jsx(Link, { href: viewMoreHref, className: "text-sm font-medium text-[var(--appkit-color-primary)] hover:opacity-80", children: viewMoreLabel }) }))] }) }));
36
+ }
37
+ // --- Main component -----------------------------------------------------------
38
+ export function FeaturedProductsSection({ title = "Featured Products", description, viewMoreHref, viewMoreLabel = "View all products →", className = "", filterByBrand, initialItems, rows = 1, maxItems, pagination = "load-more", }) {
39
+ const effectiveRows = Math.min(Math.max(rows, 1), 4);
40
+ const effectiveMaxItems = Math.min(Math.max(maxItems ?? effectiveRows * 5, 5), 20);
8
41
  const { data, isLoading } = useFeaturedProducts({
9
42
  filterByBrand,
10
43
  initialData: initialItems?.length
@@ -12,5 +45,12 @@ export function FeaturedProductsSection({ title = "Featured Products", descripti
12
45
  : undefined,
13
46
  });
14
47
  const items = data?.items ?? [];
48
+ // Multi-row mode — render grid with pagination
49
+ if (effectiveRows > 1) {
50
+ if (isLoading)
51
+ return null;
52
+ return (_jsx(ProductGrid, { items: items, rows: effectiveRows, maxItems: effectiveMaxItems, pagination: pagination, viewMoreHref: viewMoreHref, viewMoreLabel: viewMoreLabel, title: title, description: description }));
53
+ }
54
+ // Single-row mode — original horizontal carousel (backward-compat)
15
55
  return (_jsx(SectionCarousel, { title: title, description: description, pillLabel: "Featured Products", headingVariant: "editorial", viewMoreHref: viewMoreHref, viewMoreLabel: viewMoreLabel, items: items, isLoading: isLoading, skeletonCount: 4, gap: 16, keyExtractor: (product) => product.id, renderItem: (product) => (_jsx(InteractiveProductCard, { product: product, href: String(ROUTES.PUBLIC.PRODUCT_DETAIL(product.slug ?? product.id ?? "")) })), className: className }));
16
56
  }
@@ -32,19 +32,27 @@ export async function MarketplaceHomepageView({ adSlots, newsletterFormSlot, } =
32
32
  homepageSectionsRepository.getEnabledSections().catch(() => []),
33
33
  faqsRepository.getHomepageFAQs().catch(() => []),
34
34
  ]);
35
- // Collect only the live metric keys that are actually configured in this deployment
36
- const liveMetricsNeeded = new Set();
35
+ // Collect live metric requests from all enabled stats sections
36
+ const liveStatRequests = [];
37
37
  for (const section of enabledSections) {
38
- if (section.type === "stats") {
39
- const cfg = section.config;
40
- for (const stat of cfg?.stats ?? []) {
41
- if (stat.source === "live" && stat.metric) {
42
- liveMetricsNeeded.add(stat.metric);
38
+ if (section.type !== "stats")
39
+ continue;
40
+ const cfg = section.config;
41
+ for (const stat of cfg?.stats ?? []) {
42
+ const src = stat.source;
43
+ if (src === "live" || src === "live-preset") {
44
+ if (stat.metric) {
45
+ liveStatRequests.push({ key: stat.key, source: src, preset: stat.metric });
46
+ }
47
+ }
48
+ else if (src === "live-collection") {
49
+ if (stat.collectionQuery) {
50
+ liveStatRequests.push({ key: stat.key, source: src, collectionQuery: stat.collectionQuery });
43
51
  }
44
52
  }
45
53
  }
46
54
  }
47
- const liveStats = liveMetricsNeeded.size > 0 ? await fetchLiveStats([...liveMetricsNeeded]) : {};
55
+ const liveStats = liveStatRequests.length > 0 ? await fetchLiveStats(liveStatRequests) : {};
48
56
  const orderedSections = [...enabledSections].sort((a, b) => {
49
57
  if (a.order !== b.order)
50
58
  return a.order - b.order;
@@ -58,6 +66,7 @@ export async function MarketplaceHomepageView({ adSlots, newsletterFormSlot, } =
58
66
  id: faq.id,
59
67
  question: faq.question,
60
68
  answer: typeof faq.answer === "string" ? faq.answer : faq.answer.text,
69
+ category: faq.category ?? "general",
61
70
  }));
62
71
  // Determine which data-driven section types are active so we only fetch what's needed
63
72
  const activeTypes = new Set(orderedSections.map((s) => s.type));
@@ -1,4 +1,5 @@
1
1
  import type { CategoryItem } from "../../categories/types";
2
+ import type { SectionCTA } from "../schemas/firestore";
2
3
  export interface ShopByCategorySectionProps {
3
4
  title?: string;
4
5
  subtitle?: string;
@@ -7,5 +8,11 @@ export interface ShopByCategorySectionProps {
7
8
  viewMoreLabel?: string;
8
9
  className?: string;
9
10
  initialItems?: CategoryItem[];
11
+ cta?: SectionCTA;
12
+ filters?: {
13
+ featuredOnly?: boolean;
14
+ rootOnly?: boolean;
15
+ rootCategoryId?: string;
16
+ };
10
17
  }
11
- export declare function ShopByCategorySection({ title, subtitle, limit, viewMoreHref, viewMoreLabel, className, initialItems, }: ShopByCategorySectionProps): import("react/jsx-runtime").JSX.Element | null;
18
+ export declare function ShopByCategorySection({ title, subtitle, limit, viewMoreHref, viewMoreLabel, className, initialItems, cta, filters, }: ShopByCategorySectionProps): import("react/jsx-runtime").JSX.Element | null;
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
3
4
  import Image from "next/image";
4
5
  import Link from "next/link";
5
6
  import { THEME_CONSTANTS } from "../../../tokens";
@@ -16,10 +17,49 @@ function CategoryChip({ category }) {
16
17
  const productCount = category.metrics?.productCount ?? 0;
17
18
  return (_jsxs(Link, { href: ROUTES.PUBLIC.CATEGORY_DETAIL(category.slug), className: "group flex w-full min-h-[220px] flex-col overflow-hidden rounded-xl border border-zinc-200 bg-white shadow-sm transition-all hover:border-primary-300 hover:shadow-md dark:border-slate-700 dark:bg-slate-900 dark:hover:border-primary-600", children: [coverImage && isImageUrl(coverImage) ? (_jsx("div", { className: "aspect-video w-full overflow-hidden bg-zinc-100 dark:bg-slate-800", children: _jsx(Image, { src: coverImage, alt: category.name, width: 320, height: 180, className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" }) })) : (_jsx("div", { className: "aspect-video w-full bg-gradient-to-br from-zinc-100 to-zinc-200 dark:from-slate-800 dark:to-slate-700" })), _jsxs("div", { className: "flex flex-1 flex-col p-3 text-left", children: [_jsx("div", { className: "mb-2 flex h-9 w-9 items-center justify-center rounded-lg bg-primary-100 text-sm font-bold text-primary-700 dark:bg-primary-900 dark:text-primary-300", children: iconSrc && isImageUrl(iconSrc) ? (_jsx(Image, { src: iconSrc, alt: "", width: 24, height: 24, className: "h-6 w-6 rounded object-cover", "aria-hidden": true })) : iconSrc ? (_jsx("span", { "aria-hidden": "true", className: "text-lg leading-none", children: iconSrc })) : (initial) }), _jsx(Text, { className: `${THEME_CONSTANTS.utilities.textClamp2} text-sm font-semibold text-zinc-800 dark:text-zinc-200`, children: category.name }), _jsxs(Text, { className: "mt-1 text-xs text-zinc-500 dark:text-zinc-400", children: [productCount.toLocaleString(), " items"] }), _jsx(Text, { className: "mt-auto pt-3 text-xs font-medium text-primary dark:text-primary-400", children: "Browse category \u2192" })] })] }));
18
19
  }
19
- export function ShopByCategorySection({ title = "Shop by Category", subtitle, limit = 12, viewMoreHref, viewMoreLabel = "View all categories →", className = "", initialItems, }) {
20
+ const CTA_CLASSES = {
21
+ filled: "rounded-lg bg-[var(--appkit-color-primary)] px-5 py-2 text-sm font-semibold text-white hover:opacity-90",
22
+ outline: "rounded-lg border border-[var(--appkit-color-primary)] px-5 py-2 text-sm font-semibold text-[var(--appkit-color-primary)] hover:bg-[var(--appkit-color-primary)]/10",
23
+ text: "text-sm font-medium text-[var(--appkit-color-primary)] hover:underline",
24
+ };
25
+ function FilterChip({ label, active, onClick, }) {
26
+ return (_jsx("button", { type: "button", onClick: onClick, className: [
27
+ "whitespace-nowrap rounded-full border px-3 py-1 text-xs font-medium transition-colors",
28
+ active
29
+ ? "border-[var(--appkit-color-primary)] bg-[var(--appkit-color-primary)] text-white"
30
+ : "border-zinc-300 bg-white text-zinc-600 hover:border-[var(--appkit-color-primary)] dark:border-slate-600 dark:bg-slate-800 dark:text-zinc-300",
31
+ ].join(" "), children: label }));
32
+ }
33
+ export function ShopByCategorySection({ title = "Shop by Category", subtitle, limit = 12, viewMoreHref, viewMoreLabel = "View all categories →", className = "", initialItems, cta, filters, }) {
20
34
  const { themed } = THEME_CONSTANTS;
21
- const { data: categories = [], isLoading } = useTopCategories(limit, { initialData: initialItems });
22
- if (!isLoading && categories.length === 0)
35
+ const { data: allCategories = [], isLoading } = useTopCategories(limit, { initialData: initialItems });
36
+ const [activeFilter, setActiveFilter] = useState("all");
37
+ // Build client-side filter chip options from root-level parent IDs
38
+ const rootIds = filters?.rootCategoryId
39
+ ? [filters.rootCategoryId]
40
+ : Array.from(new Set(allCategories.flatMap((c) => c.parentIds ?? [c.id]).filter(Boolean)));
41
+ const hasFilters = !!(filters?.featuredOnly !== undefined ||
42
+ filters?.rootCategoryId ||
43
+ rootIds.length > 1);
44
+ const filtered = allCategories.filter((cat) => {
45
+ if (activeFilter !== "all") {
46
+ const inParents = cat.parentIds?.includes(activeFilter) ?? false;
47
+ if (!inParents && cat.id !== activeFilter)
48
+ return false;
49
+ }
50
+ if (filters?.featuredOnly && !cat.isFeatured)
51
+ return false;
52
+ if (filters?.rootOnly && (cat.parentIds?.length ?? 0) > 0)
53
+ return false;
54
+ return true;
55
+ });
56
+ const categories = filtered.length > 0 ? filtered : allCategories;
57
+ if (!isLoading && allCategories.length === 0)
23
58
  return null;
24
- return (_jsx(Section, { className: `py-12 px-4 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "mx-auto max-w-7xl", children: [_jsxs("div", { className: "mb-6 text-center", children: [_jsx(Heading, { level: 2, className: `text-2xl font-bold md:text-3xl ${themed.textPrimary}`, children: title }), subtitle && (_jsx(Text, { variant: "secondary", className: "mt-1 text-sm", children: subtitle }))] }), isLoading ? (_jsx("div", { className: "flex gap-3 overflow-hidden px-1", children: Array.from({ length: 6 }).map((_, i) => (_jsx("div", { className: "flex-none h-[104px] w-[108px] animate-pulse rounded-xl bg-zinc-200 dark:bg-slate-700" }, i))) })) : (_jsx(HorizontalScroller, { items: categories, renderItem: (cat) => _jsx(CategoryChip, { category: cat }), perView: THEME_CONSTANTS.carousel.perView.standard, gap: 16, keyExtractor: (cat) => cat.id, autoScroll: true, autoScrollInterval: 3500, showArrows: true, snapToItems: true, showFadeEdges: true, showScrollbar: false, pauseOnHover: true })), viewMoreHref && !isLoading && (_jsx("div", { className: "mt-6 text-center", children: _jsx(Link, { href: viewMoreHref, className: "inline-flex items-center gap-1 text-sm font-medium text-primary hover:text-primary/80", children: viewMoreLabel }) }))] }) }));
59
+ return (_jsx(Section, { className: `py-12 px-4 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "mx-auto max-w-7xl", children: [_jsxs("div", { className: "mb-6 text-center", children: [_jsx(Heading, { level: 2, className: `text-2xl font-bold md:text-3xl ${themed.textPrimary}`, children: title }), subtitle && (_jsx(Text, { variant: "secondary", className: "mt-1 text-sm", children: subtitle }))] }), hasFilters && !isLoading && (_jsxs("div", { className: "mb-4 flex flex-wrap gap-2", children: [_jsx(FilterChip, { label: "All", active: activeFilter === "all", onClick: () => setActiveFilter("all") }), rootIds.slice(0, 5).map((id) => {
60
+ const cat = allCategories.find((c) => c.id === id);
61
+ if (!cat)
62
+ return null;
63
+ return (_jsx(FilterChip, { label: cat.name, active: activeFilter === id, onClick: () => setActiveFilter(activeFilter === id ? "all" : id) }, id));
64
+ })] })), isLoading ? (_jsx("div", { className: "flex gap-3 overflow-hidden px-1", children: Array.from({ length: 6 }).map((_, i) => (_jsx("div", { className: "flex-none h-[104px] w-[108px] animate-pulse rounded-xl bg-zinc-200 dark:bg-slate-700" }, i))) })) : (_jsx(HorizontalScroller, { items: categories, renderItem: (cat) => _jsx(CategoryChip, { category: cat }), perView: THEME_CONSTANTS.carousel.perView.standard, gap: 16, keyExtractor: (cat) => cat.id, autoScroll: true, autoScrollInterval: 3500, showArrows: true, snapToItems: true, showFadeEdges: true, showScrollbar: false, pauseOnHover: true })), cta && !isLoading && (_jsx("div", { className: "mt-6 text-center", children: _jsx(Link, { href: cta.href, className: CTA_CLASSES[cta.variant], children: cta.label }) })), !cta && viewMoreHref && !isLoading && (_jsx("div", { className: "mt-6 text-center", children: _jsx(Link, { href: viewMoreHref, className: "inline-flex items-center gap-1 text-sm font-medium text-[var(--appkit-color-primary)] hover:opacity-80", children: viewMoreLabel }) }))] }) }));
25
65
  }
@@ -10,6 +10,7 @@ const PLATFORM_LABELS = {
10
10
  facebook: "Facebook",
11
11
  tiktok: "TikTok",
12
12
  deviantart: "DeviantArt",
13
+ youtube: "YouTube",
13
14
  };
14
15
  function platformProfileUrl(platform, handle) {
15
16
  switch (platform) {
@@ -17,6 +18,7 @@ function platformProfileUrl(platform, handle) {
17
18
  case "facebook": return `https://www.facebook.com/${handle}`;
18
19
  case "tiktok": return `https://www.tiktok.com/@${handle}`;
19
20
  case "deviantart": return `https://www.deviantart.com/${handle}`;
21
+ case "youtube": return `https://www.youtube.com/@${handle}`;
20
22
  }
21
23
  }
22
24
  // --- Skeleton ----------------------------------------------------------------
@@ -29,7 +31,24 @@ function SocialFeedEmpty({ platform }) {
29
31
  }
30
32
  // --- Server fetch ------------------------------------------------------------
31
33
  async function loadPosts(config) {
32
- const { platform, handle, postType, count } = config;
34
+ const { platform, handle, postType, count, posts: staticPosts } = config;
35
+ // YouTube: no API token needed — render from static posts in config
36
+ if (platform === "youtube") {
37
+ const posts = (staticPosts ?? []).map((p) => ({
38
+ id: p.id,
39
+ platform: "youtube",
40
+ permalink: `https://youtu.be/${p.videoId ?? ""}`,
41
+ videoId: p.videoId,
42
+ channelName: p.channelName,
43
+ caption: p.caption,
44
+ mediaType: "video",
45
+ imageUrl: p.videoId ? `https://img.youtube.com/vi/${p.videoId}/maxresdefault.jpg` : undefined,
46
+ stats: {},
47
+ }));
48
+ return { posts };
49
+ }
50
+ if (!handle)
51
+ return { posts: [], error: `A handle is required for ${PLATFORM_LABELS[platform]}.` };
33
52
  try {
34
53
  const credentials = await siteSettingsRepository.getDecryptedCredentials().catch(() => null);
35
54
  switch (platform) {
@@ -72,6 +91,7 @@ export async function SocialFeedSection(config) {
72
91
  const { title, subtitle, platform, handle, layout, showCaption, showStats, count } = config;
73
92
  const { themed } = THEME_CONSTANTS;
74
93
  const { posts, error } = await loadPosts(config);
94
+ const profileUrl = handle ? platformProfileUrl(platform, handle) : null;
75
95
  const gridClass = layout === "carousel"
76
96
  ? "flex gap-3 overflow-x-auto pb-2 snap-x snap-mandatory"
77
97
  : layout === "masonry"
@@ -82,5 +102,5 @@ export async function SocialFeedSection(config) {
82
102
  : layout === "masonry"
83
103
  ? "break-inside-avoid"
84
104
  : "";
85
- return (_jsx(Section, { className: `py-12 ${themed.bgPrimary}`, children: _jsxs("div", { className: "w-full max-w-7xl mx-auto px-4", children: [_jsxs("div", { className: "mb-8 flex items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx(Heading, { level: 2, className: "mb-1", children: title || `${PLATFORM_LABELS[platform]} Feed` }), subtitle && (_jsx(Text, { size: "sm", variant: "muted", children: subtitle }))] }), _jsxs("a", { href: platformProfileUrl(platform, handle), target: "_blank", rel: "noopener noreferrer", className: "shrink-0 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline", children: ["Follow on ", PLATFORM_LABELS[platform], " \u2192"] })] }), error ? (_jsx("div", { className: "py-12 text-center text-zinc-400 text-sm", children: error })) : posts.length === 0 ? (_jsx(SocialFeedEmpty, { platform: platform })) : (_jsx("div", { className: gridClass, children: posts.slice(0, count).map((post) => (_jsx("div", { className: cardClass, children: _jsx(SocialPostCard, { post: post, showCaption: showCaption, showStats: showStats }) }, post.id))) }))] }) }));
105
+ return (_jsx(Section, { className: `py-12 ${themed.bgPrimary}`, children: _jsxs("div", { className: "w-full max-w-7xl mx-auto px-4", children: [_jsxs("div", { className: "mb-8 flex items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx(Heading, { level: 2, className: "mb-1", children: title || `${PLATFORM_LABELS[platform]} Feed` }), subtitle && (_jsx(Text, { size: "sm", variant: "muted", children: subtitle }))] }), profileUrl && (_jsxs("a", { href: profileUrl, target: "_blank", rel: "noopener noreferrer", className: "shrink-0 text-sm font-medium text-[var(--appkit-color-primary)] hover:opacity-80", children: ["Follow on ", PLATFORM_LABELS[platform], " \u2192"] }))] }), error ? (_jsx("div", { className: "py-12 text-center text-zinc-400 text-sm", children: error })) : posts.length === 0 ? (_jsx(SocialFeedEmpty, { platform: platform })) : (_jsx("div", { className: gridClass, children: posts.slice(0, count).map((post) => (_jsx("div", { className: cardClass, children: _jsx(SocialPostCard, { post: post, showCaption: showCaption, showStats: showStats }) }, post.id))) }))] }) }));
86
106
  }
@@ -4,24 +4,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  const PLATFORM_META = {
5
5
  instagram: {
6
6
  label: "Instagram",
7
- color: "bg-gradient-to-br from-purple-500 via-pink-500 to-orange-400",
7
+ colorClass: "bg-gradient-to-br from-purple-500 via-pink-500 to-orange-400",
8
8
  icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z" }) })),
9
9
  },
10
10
  facebook: {
11
11
  label: "Facebook",
12
- color: "bg-blue-600",
12
+ colorClass: "bg-[var(--appkit-color-facebook,#1877F2)]",
13
13
  icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" }) })),
14
14
  },
15
15
  tiktok: {
16
16
  label: "TikTok",
17
- color: "bg-black",
17
+ colorClass: "bg-[var(--appkit-color-tiktok,#010101)]",
18
18
  icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z" }) })),
19
19
  },
20
20
  deviantart: {
21
21
  label: "DeviantArt",
22
- color: "bg-green-600",
22
+ colorClass: "bg-[var(--appkit-color-deviantart,#05CC47)]",
23
23
  icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M19.207 4.794l.23-.43V0h-4.169l-.321.33-1.445 2.698-.428.33H4.793v5.994l.289.321 1.156 2.168v.065l-1.156 2.168-.289.321V19.8h8.481l.428.33 1.445 2.698.321.329h4.169v-4.364l-.23-.43-1.09-2.044v-.064l1.09-2.044.23-.43V4.794zM14.72 14.058h-4.53v-4.116h4.53v4.116z" }) })),
24
24
  },
25
+ youtube: {
26
+ label: "YouTube",
27
+ colorClass: "bg-[var(--appkit-color-youtube,#FF0000)]",
28
+ icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" }) })),
29
+ },
25
30
  };
26
31
  // --- Stats formatter ---------------------------------------------------------
27
32
  function formatCount(n) {
@@ -33,7 +38,17 @@ function formatCount(n) {
33
38
  return `${(n / 1000).toFixed(1)}K`;
34
39
  return String(n);
35
40
  }
41
+ // --- YouTube card (16:9 aspect, play overlay, channel chip) ------------------
42
+ function YouTubeCard({ post, showCaption }) {
43
+ const thumbnail = `https://img.youtube.com/vi/${post.videoId}/maxresdefault.jpg`;
44
+ const href = `https://youtu.be/${post.videoId}`;
45
+ const meta = PLATFORM_META.youtube;
46
+ return (_jsxs("a", { href: href, target: "_blank", rel: "noopener noreferrer", className: "group relative block aspect-video w-full overflow-hidden rounded-xl bg-zinc-900 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--appkit-color-youtube,#FF0000)]", "aria-label": post.caption ?? `Watch on YouTube`, children: [_jsx("img", { src: thumbnail, alt: post.caption ?? "YouTube video", className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105", loading: "lazy" }), _jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: _jsx("div", { className: "flex h-14 w-14 items-center justify-center rounded-full bg-[var(--appkit-color-youtube,#FF0000)] shadow-lg transition-transform duration-200 group-hover:scale-110", children: _jsx("svg", { className: "ml-1 h-6 w-6 text-white", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M8 5v14l11-7z" }) }) }) }), _jsxs("div", { className: `absolute right-2 top-2 flex items-center gap-1 rounded px-1.5 py-1 text-xs font-medium text-white ${meta.colorClass}`, children: [meta.icon, _jsx("span", { className: "hidden sm:inline", children: meta.label })] }), post.channelName && (_jsx("div", { className: "absolute bottom-2 left-2 rounded bg-black/60 px-2 py-0.5 text-xs text-white backdrop-blur-sm", children: post.channelName })), showCaption && post.caption && (_jsx("div", { className: "absolute inset-0 flex flex-col justify-end bg-black/60 p-3 opacity-0 transition-opacity duration-200 group-hover:opacity-100", children: _jsx("p", { className: "line-clamp-2 text-xs text-white", children: post.caption }) }))] }));
47
+ }
36
48
  export function SocialPostCard({ post, showCaption = true, showStats = true }) {
49
+ if (post.platform === "youtube") {
50
+ return _jsx(YouTubeCard, { post: post, showCaption: showCaption });
51
+ }
37
52
  const meta = PLATFORM_META[post.platform];
38
- return (_jsxs("a", { href: post.permalink, target: "_blank", rel: "noopener noreferrer", className: "group relative block rounded-xl overflow-hidden bg-zinc-100 dark:bg-zinc-800 aspect-square focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500", "aria-label": post.caption ?? `View on ${meta.label}`, children: [post.imageUrl ? (_jsx("img", { src: post.imageUrl, alt: post.caption ?? `${meta.label} post`, className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105", loading: "lazy" })) : (_jsx("div", { className: "w-full h-full flex items-center justify-center bg-zinc-200 dark:bg-zinc-700", children: _jsx("span", { className: "text-zinc-400 text-sm", children: "No preview" }) })), post.mediaType === "video" && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: _jsx("div", { className: "w-12 h-12 rounded-full bg-black/50 backdrop-blur-sm flex items-center justify-center", children: _jsx("svg", { className: "w-5 h-5 text-white ml-1", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M8 5v14l11-7z" }) }) }) })), post.mediaType === "carousel" && (_jsx("div", { className: "absolute top-2 right-2 pointer-events-none", children: _jsx("div", { className: "w-6 h-6 rounded bg-black/50 backdrop-blur-sm flex items-center justify-center", children: _jsxs("svg", { className: "w-3.5 h-3.5 text-white", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("rect", { x: "2", y: "3", width: "15", height: "15", rx: "2" }), _jsx("path", { d: "M7 8h14M7 12h14M7 16h14" })] }) }) })), _jsxs("div", { className: `absolute top-2 left-2 flex items-center gap-1 px-1.5 py-1 rounded text-white text-xs font-medium ${meta.color}`, children: [meta.icon, _jsx("span", { className: "hidden sm:inline", children: meta.label })] }), _jsxs("div", { className: "absolute inset-0 bg-black/70 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex flex-col justify-end p-3 pointer-events-none", children: [showCaption && post.caption && (_jsx("p", { className: "text-white text-xs line-clamp-3 mb-2", children: post.caption })), showStats && (_jsxs("div", { className: "flex items-center gap-3 text-white/80 text-xs", children: [post.stats.likes != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" }) }), formatCount(post.stats.likes)] })), post.stats.views != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" }) }), formatCount(post.stats.views)] })), post.stats.comments != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }), formatCount(post.stats.comments)] }))] }))] })] }));
53
+ return (_jsxs("a", { href: post.permalink, target: "_blank", rel: "noopener noreferrer", className: "group relative block aspect-square overflow-hidden rounded-xl bg-zinc-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--appkit-color-primary)] dark:bg-zinc-800", "aria-label": post.caption ?? `View on ${meta.label}`, children: [post.imageUrl ? (_jsx("img", { src: post.imageUrl, alt: post.caption ?? `${meta.label} post`, className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105", loading: "lazy" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-zinc-200 dark:bg-zinc-700", children: _jsx("span", { className: "text-sm text-zinc-400", children: "No preview" }) })), post.mediaType === "video" && (_jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: _jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-black/50 backdrop-blur-sm", children: _jsx("svg", { className: "ml-1 h-5 w-5 text-white", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M8 5v14l11-7z" }) }) }) })), post.mediaType === "carousel" && (_jsx("div", { className: "pointer-events-none absolute right-2 top-2", children: _jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded bg-black/50 backdrop-blur-sm", children: _jsxs("svg", { className: "h-3.5 w-3.5 text-white", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("rect", { x: "2", y: "3", width: "15", height: "15", rx: "2" }), _jsx("path", { d: "M7 8h14M7 12h14M7 16h14" })] }) }) })), _jsxs("div", { className: `absolute left-2 top-2 flex items-center gap-1 rounded px-1.5 py-1 text-xs font-medium text-white ${meta.colorClass}`, children: [meta.icon, _jsx("span", { className: "hidden sm:inline", children: meta.label })] }), _jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col justify-end bg-black/70 p-3 opacity-0 transition-opacity duration-200 group-hover:opacity-100", children: [showCaption && post.caption && (_jsx("p", { className: "mb-2 line-clamp-3 text-xs text-white", children: post.caption })), showStats && (_jsxs("div", { className: "flex items-center gap-3 text-xs text-white/80", children: [post.stats.likes != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" }) }), formatCount(post.stats.likes)] })), post.stats.views != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" }) }), formatCount(post.stats.views)] })), post.stats.comments != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }), formatCount(post.stats.comments)] }))] }))] })] }));
39
54
  }
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { THEME_CONSTANTS } from "../../../tokens";
4
- import { Button, Grid, Heading, Row, Section, Span, Text, TextLink } from "../../../ui";
4
+ import { Button, Grid, Heading, Row, Section, SiteLogo, Span, Text, TextLink } from "../../../ui";
5
5
  // --- Component ---------------------------------------------------------------
6
6
  export function WelcomeSection({ title, subtitle, pillLabel, showCTA = true, ctaLabel = "Shop now", ctaHref, onCtaClick, secondaryCtaLabel = "Browse products", secondaryCtaHref, onSecondaryCtaClick, trustChips = [], isLoading = false, brandLogoText = "", className = "", }) {
7
7
  const { themed, flex } = THEME_CONSTANTS;
8
8
  if (isLoading) {
9
9
  return (_jsx(Section, { className: `relative overflow-hidden py-16 md:py-24 px-4 ${className}`, children: _jsxs("div", { className: "animate-pulse max-w-4xl mx-auto text-center", "data-section": "welcomesection-div-382", children: [_jsx("div", { className: "h-6 bg-zinc-200 dark:bg-slate-700 rounded-full w-52 mx-auto mb-6" }), _jsx("div", { className: "h-20 bg-zinc-200 dark:bg-slate-700 rounded-lg mb-4 max-w-2xl mx-auto" }), _jsx("div", { className: "h-6 bg-zinc-200 dark:bg-slate-700 rounded-lg mb-8 max-w-lg mx-auto" }), _jsxs("div", { className: "flex justify-center gap-4", "data-section": "welcomesection-div-383", children: [_jsx("div", { className: "h-12 bg-zinc-200 dark:bg-slate-700 rounded-xl w-36" }), _jsx("div", { className: "h-12 bg-zinc-200 dark:bg-slate-700 rounded-xl w-36" })] })] }) }));
10
10
  }
11
- return (_jsxs(Section, { className: `relative overflow-hidden py-20 md:py-28 px-4 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -top-32 -left-32 w-[28rem] h-[28rem] rounded-full bg-primary/10 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "pointer-events-none absolute -bottom-40 -right-40 w-[36rem] h-[36rem] rounded-full bg-secondary/10 dark:bg-secondary/15 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "relative z-10 max-w-7xl mx-auto", "data-section": "welcomesection-div-384", children: _jsxs(Grid, { gap: "2xl", className: "grid-cols-1 lg:grid-cols-2 xl:grid-cols-2 2xl:grid-cols-2 items-center", children: [_jsxs("div", { className: "text-center lg:text-left", "data-section": "welcomesection-div-385", children: [pillLabel && (_jsx("div", { "data-section": "welcomesection-div-386", children: _jsxs(Span, { className: "inline-flex items-center gap-2 rounded-full border border-primary-500/30 bg-primary-500/10 px-5 py-1.5 text-xs font-medium tracking-[0.2em] uppercase text-primary-700 dark:text-primary-400 backdrop-blur-sm", children: [_jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" }), pillLabel, _jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" })] }) })), _jsx(Heading, { level: 1, variant: "none", className: "mt-4 font-display text-5xl md:text-6xl lg:text-7xl xl:text-8xl bg-gradient-to-r from-primary-700 via-cobalt to-secondary-400 dark:from-primary dark:via-cobalt-400 dark:to-primary-300 bg-clip-text text-transparent leading-[1.1] tracking-tight", children: title }), subtitle && (_jsx(Text, { className: `mt-4 text-xl ${themed.textSecondary} max-w-xl leading-relaxed mx-auto lg:mx-0`, children: subtitle })), showCTA && (_jsxs(Row, { wrap: true, gap: "md", className: "mt-8 justify-center lg:justify-start", children: [ctaHref ? (_jsx(TextLink, { href: ctaHref, className: "inline-flex items-center justify-center rounded-xl px-8 py-3.5 text-base font-bold !bg-primary hover:!bg-primary-600 text-white dark:!bg-primary dark:hover:!bg-primary-600 dark:text-white btn-glow transition-all hover:scale-[1.02]", children: ctaLabel })) : (_jsx(Button, { variant: "primary", size: "lg", onClick: onCtaClick, children: ctaLabel })), secondaryCtaHref ? (_jsx(TextLink, { href: secondaryCtaHref, className: "inline-flex items-center justify-center rounded-xl border-2 border-cobalt/40 dark:border-cobalt-400/40 px-8 py-3.5 text-base font-semibold text-cobalt-700 dark:text-cobalt-300 hover:bg-cobalt-50 dark:hover:bg-cobalt-900/20 transition-all hover:scale-[1.02]", children: secondaryCtaLabel })) : (_jsx(Button, { variant: "outline", size: "lg", onClick: onSecondaryCtaClick, children: secondaryCtaLabel }))] })), trustChips.length > 0 && (_jsx(Row, { wrap: true, gap: "sm", className: "mt-6 justify-center lg:justify-start", children: trustChips.map((chip) => (_jsxs(Span, { className: "inline-flex items-center gap-1.5 bg-zinc-100 dark:bg-slate-800 border border-zinc-200 dark:border-slate-700 rounded-full px-3.5 py-1.5 text-xs font-medium text-zinc-700 dark:text-zinc-300", children: [chip.emoji, " ", chip.label] }, chip.key))) }))] }), _jsx("div", { className: "hidden lg:block", "data-section": "welcomesection-div-387", children: _jsxs("div", { className: `relative rounded-3xl overflow-hidden aspect-[4/3] bg-gradient-to-br from-primary-100 via-cobalt-100/60 to-secondary-100 dark:from-primary-950/60 dark:via-cobalt-950/40 dark:to-secondary-950/60 border ${themed.border} shadow-2xl`, "data-section": "welcomesection-div-388", children: [_jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-cobalt/5" }), _jsx("div", { className: `absolute inset-0 ${flex.center}`, "data-section": "welcomesection-div-389", children: _jsx(Span, { className: "font-display text-9xl font-black text-primary-400/30 dark:text-secondary-400/30 select-none", children: brandLogoText }) })] }) })] }) })] }));
11
+ return (_jsxs(Section, { className: `relative overflow-hidden py-20 md:py-28 px-4 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -top-32 -left-32 w-[28rem] h-[28rem] rounded-full bg-primary/10 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "pointer-events-none absolute -bottom-40 -right-40 w-[36rem] h-[36rem] rounded-full bg-secondary/10 dark:bg-secondary/15 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "relative z-10 max-w-7xl mx-auto", "data-section": "welcomesection-div-384", children: _jsxs(Grid, { gap: "2xl", className: "grid-cols-1 lg:grid-cols-2 xl:grid-cols-2 2xl:grid-cols-2 items-center", children: [_jsxs("div", { className: "text-center lg:text-left", "data-section": "welcomesection-div-385", children: [pillLabel && (_jsx("div", { "data-section": "welcomesection-div-386", children: _jsxs(Span, { className: "inline-flex items-center gap-2 rounded-full border border-primary-500/30 bg-primary-500/10 px-5 py-1.5 text-xs font-medium tracking-[0.2em] uppercase text-primary-700 dark:text-primary-400 backdrop-blur-sm", children: [_jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" }), pillLabel, _jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" })] }) })), _jsx(Heading, { level: 1, variant: "none", className: "mt-4 font-display text-5xl md:text-6xl lg:text-7xl xl:text-8xl bg-gradient-to-r from-primary-700 via-cobalt to-secondary-400 dark:from-primary dark:via-cobalt-400 dark:to-primary-300 bg-clip-text text-transparent leading-[1.1] tracking-tight", children: title }), subtitle && (_jsx(Text, { className: `mt-4 text-xl ${themed.textSecondary} max-w-xl leading-relaxed mx-auto lg:mx-0`, children: subtitle })), showCTA && (_jsxs(Row, { wrap: true, gap: "md", className: "mt-8 justify-center lg:justify-start", children: [ctaHref ? (_jsx(TextLink, { href: ctaHref, className: "inline-flex items-center justify-center rounded-xl px-8 py-3.5 text-base font-bold !bg-primary hover:!bg-primary-600 text-white dark:!bg-primary dark:hover:!bg-primary-600 dark:text-white btn-glow transition-all hover:scale-[1.02]", children: ctaLabel })) : (_jsx(Button, { variant: "primary", size: "lg", onClick: onCtaClick, children: ctaLabel })), secondaryCtaHref ? (_jsx(TextLink, { href: secondaryCtaHref, className: "inline-flex items-center justify-center rounded-xl border-2 border-cobalt/40 dark:border-cobalt-400/40 px-8 py-3.5 text-base font-semibold text-cobalt-700 dark:text-cobalt-300 hover:bg-cobalt-50 dark:hover:bg-cobalt-900/20 transition-all hover:scale-[1.02]", children: secondaryCtaLabel })) : (_jsx(Button, { variant: "outline", size: "lg", onClick: onSecondaryCtaClick, children: secondaryCtaLabel }))] })), trustChips.length > 0 && (_jsx(Row, { wrap: true, gap: "sm", className: "mt-6 justify-center lg:justify-start", children: trustChips.map((chip) => (_jsxs(Span, { className: "inline-flex items-center gap-1.5 bg-zinc-100 dark:bg-slate-800 border border-zinc-200 dark:border-slate-700 rounded-full px-3.5 py-1.5 text-xs font-medium text-zinc-700 dark:text-zinc-300", children: [chip.emoji, " ", chip.label] }, chip.key))) }))] }), _jsx("div", { className: "hidden lg:block", "data-section": "welcomesection-div-387", children: _jsxs("div", { className: `relative rounded-3xl overflow-hidden aspect-[4/3] bg-gradient-to-br from-primary-100 via-cobalt-100/60 to-secondary-100 dark:from-primary-950/60 dark:via-cobalt-950/40 dark:to-secondary-950/60 border ${themed.border} shadow-2xl`, "data-section": "welcomesection-div-388", children: [_jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-cobalt/5" }), _jsx("div", { className: `absolute inset-0 ${flex.center} px-10`, "data-section": "welcomesection-div-389", children: _jsx(SiteLogo, { title: brandLogoText || "LetItRip.in", className: "h-24 xl:h-32 2xl:h-40 max-w-full" }) })] }) })] }) })] }));
12
12
  }
@@ -1,6 +1,5 @@
1
1
  export interface WhatsAppCommunitySectionProps {
2
2
  title: string;
3
- /** HTML string for the description (safe server-rendered HTML). */
4
3
  descriptionHtml?: string;
5
4
  memberCount?: number;
6
5
  memberCountLabel?: string;
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { THEME_CONSTANTS } from "../../../tokens";
4
- import { Button, Grid, Heading, RichText, Section, Span, Text } from "../../../ui";
5
- import { MessageCircle } from "lucide-react";
4
+ import { Button, Heading, RichText, Section, Span, Text } from "../../../ui";
5
+ import { Users } from "lucide-react";
6
6
  import { getDefaultLocale } from "../../../core/baseline-resolver";
7
7
  // --- Section -----------------------------------------------------------------
8
8
  export function WhatsAppCommunitySection({ title, descriptionHtml, memberCount, memberCountLabel = "members", testimonial, benefits = [], buttonText = "Join our WhatsApp community", groupLink, isLoading = false, className = "", }) {
9
9
  const { themed, flex } = THEME_CONSTANTS;
10
10
  if (isLoading) {
11
- return (_jsx(Section, { className: `p-8 ${themed.bgSecondary} ${className}`, children: _jsx("div", { className: "w-full max-w-7xl mx-auto", "data-section": "whatsappcommunitysection-div-390", children: _jsx("div", { className: "h-80 bg-zinc-200 dark:bg-slate-700 rounded-2xl animate-pulse" }) }) }));
11
+ return (_jsx(Section, { className: `py-16 px-4 sm:px-8 ${themed.bgSecondary} ${className}`, children: _jsx("div", { className: "w-full max-w-4xl mx-auto", children: _jsx("div", { className: "h-72 bg-zinc-200 dark:bg-slate-700 rounded-2xl animate-pulse" }) }) }));
12
12
  }
13
13
  if (!title && !groupLink)
14
14
  return null;
@@ -16,5 +16,5 @@ export function WhatsAppCommunitySection({ title, descriptionHtml, memberCount,
16
16
  if (groupLink)
17
17
  window.open(groupLink, "_blank");
18
18
  };
19
- return (_jsx(Section, { className: `p-8 ${themed.bgSecondary} ${className}`, children: _jsx("div", { className: "w-full max-w-7xl mx-auto", "data-section": "whatsappcommunitysection-div-391", children: _jsxs("div", { className: "bg-gradient-to-br from-green-700 to-green-800 dark:from-emerald-800 dark:to-emerald-900 rounded-2xl p-8 text-white overflow-hidden relative", "data-section": "whatsappcommunitysection-div-392", children: [_jsx("div", { className: "absolute inset-0 opacity-10", "aria-hidden": true, "data-section": "whatsappcommunitysection-div-393", children: _jsxs("svg", { width: "100%", height: "100%", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("defs", { children: _jsx("pattern", { id: "wa-dots", x: "0", y: "0", width: "40", height: "40", patternUnits: "userSpaceOnUse", children: _jsx("circle", { cx: "20", cy: "20", r: "2", fill: "white" }) }) }), _jsx("rect", { width: "100%", height: "100%", fill: "url(#wa-dots)" })] }) }), _jsxs("div", { className: "relative z-10 text-center", "data-section": "whatsappcommunitysection-div-394", children: [_jsx("div", { className: `inline-flex items-center justify-center w-20 h-20 rounded-full bg-white/20 backdrop-blur-sm mb-6 mx-auto`, "data-section": "whatsappcommunitysection-div-395", children: _jsx(MessageCircle, { className: "w-10 h-10 text-white" }) }), _jsx(Heading, { level: 2, className: "mb-3 text-white", children: title }), descriptionHtml && (_jsx(RichText, { html: descriptionHtml, proseClass: "prose max-w-none prose-invert prose-sm", className: "text-lg md:text-xl mb-2 opacity-90" })), memberCount && (_jsxs("div", { className: `${flex.center} gap-3 mb-4`, "data-section": "whatsappcommunitysection-div-396", children: [_jsx("div", { className: "flex -space-x-2", "data-section": "whatsappcommunitysection-div-397", children: ["A", "R", "S", "M", "P"].map((initial, i) => (_jsx("div", { className: `w-8 h-8 rounded-full border-2 border-white bg-green-700 ${flex.center} text-white text-xs font-bold`, "data-section": "whatsappcommunitysection-div-398", children: initial }, i))) }), _jsxs(Text, { variant: "none", className: "text-white font-bold", children: [_jsx(Span, { className: "text-xl font-extrabold", children: memberCount.toLocaleString(getDefaultLocale()) }), " ", memberCountLabel] })] })), testimonial && (_jsxs(Text, { size: "sm", variant: "none", className: "italic text-white/90 max-w-sm mx-auto mb-6", children: ["\u201C", testimonial, "\u201D"] })), benefits.length > 0 && (_jsx(Grid, { className: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 xl:grid-cols-4 2xl:grid-cols-4 max-w-2xl mx-auto my-8", children: benefits.slice(0, 4).map((benefit, index) => (_jsxs("div", { className: "flex items-start gap-3 text-left bg-white/10 backdrop-blur-sm p-4 rounded-lg", "data-section": "whatsappcommunitysection-div-399", children: [_jsx("svg", { className: "w-6 h-6 mt-0.5 flex-shrink-0", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), _jsx(Span, { className: "text-sm md:text-base", children: benefit })] }, index))) })), groupLink && (_jsxs("div", { className: "relative inline-block", "data-section": "whatsappcommunitysection-div-400", children: [_jsx("div", { className: "absolute inset-0 rounded-full bg-lime-400/30 animate-pulse blur-md scale-110", "aria-hidden": true }), _jsxs(Button, { variant: "primary", size: "lg", "aria-label": buttonText, onClick: handleJoin, className: "relative !bg-white !text-green-700 hover:!bg-zinc-100 shadow-xl hover:shadow-2xl", children: [_jsx("svg", { className: "w-6 h-6 mr-2", fill: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { d: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z" }) }), buttonText] })] }))] })] }) }) }));
19
+ return (_jsx(Section, { className: `py-16 px-4 sm:px-8 ${themed.bgSecondary} ${className}`, children: _jsx("div", { className: "w-full max-w-4xl mx-auto", "data-section": "whatsappcommunitysection-div-391", children: _jsxs("div", { className: "relative rounded-2xl overflow-hidden bg-gradient-to-br from-primary via-cobalt to-primary/80 dark:from-primary/90 dark:via-cobalt/90 dark:to-primary/70 text-white shadow-xl", "data-section": "whatsappcommunitysection-div-392", children: [_jsx("div", { className: "absolute inset-0 opacity-[0.06] pointer-events-none bg-[repeating-linear-gradient(45deg,white_0,white_1px,transparent_0,transparent_50%)] bg-[size:10px_10px]", "aria-hidden": true }), _jsxs("div", { className: "relative z-10 px-6 py-10 sm:px-10 sm:py-12", "data-section": "whatsappcommunitysection-div-394", children: [_jsxs("div", { className: `${flex.between} flex-wrap gap-4 mb-8`, "data-section": "whatsappcommunitysection-div-top", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "w-12 h-12 rounded-xl bg-[#25D366] flex items-center justify-center shadow-lg flex-shrink-0", children: _jsx("svg", { className: "w-7 h-7 text-white", fill: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { d: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z" }) }) }), _jsx(Span, { className: "text-white/80 text-sm font-medium tracking-wide uppercase", children: "WhatsApp Community" })] }), memberCount && (_jsxs("div", { className: "flex items-center gap-2 bg-white/15 backdrop-blur-sm rounded-full px-4 py-1.5", children: [_jsx(Users, { className: "w-4 h-4 text-white/80" }), _jsxs(Span, { className: "text-white text-sm font-semibold", children: [memberCount.toLocaleString(getDefaultLocale()), "+ ", memberCountLabel] })] }))] }), _jsx(Heading, { level: 2, className: "text-white text-2xl sm:text-3xl font-bold mb-3 leading-tight", children: title }), descriptionHtml && (_jsx(RichText, { html: descriptionHtml, proseClass: "prose prose-sm max-w-none prose-invert", className: "text-white/80 text-base mb-6 max-w-2xl leading-relaxed" })), benefits.length > 0 && (_jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 mb-8 max-w-2xl", "data-section": "whatsappcommunitysection-div-benefits", children: benefits.slice(0, 4).map((benefit, i) => (_jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "mt-0.5 flex-shrink-0 w-5 h-5 rounded-full bg-white/20 flex items-center justify-center", children: _jsx("svg", { className: "w-3 h-3 text-white", fill: "currentColor", viewBox: "0 0 20 20", "aria-hidden": "true", children: _jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) }), _jsx(Span, { className: "text-white/90 text-sm leading-snug", children: benefit })] }, i))) })), testimonial && (_jsx("blockquote", { className: "border-l-2 border-white/30 pl-4 mb-8 max-w-xl", children: _jsxs(Text, { variant: "none", className: "text-white/75 text-sm italic leading-relaxed", children: ["\u201C", testimonial, "\u201D"] }) })), groupLink && (_jsxs(Button, { variant: "primary", size: "lg", onClick: handleJoin, "aria-label": buttonText, className: "!bg-[#25D366] hover:!bg-[#1ebe5d] !text-white !border-0 shadow-lg font-semibold gap-2.5", children: [_jsx("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { d: "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z" }) }), buttonText] }))] })] }) }) }));
20
20
  }
@@ -5,10 +5,23 @@
5
5
  * individual metric are silently swallowed — the section falls back to the
6
6
  * static `value` from the Firestore section config.
7
7
  */
8
- import type { LiveStatMetric } from "../schemas/firestore";
9
- export type LiveStatsMap = Partial<Record<LiveStatMetric, string>>;
8
+ import type { LiveStatPreset, CollectionQueryMetric } from "../schemas/firestore";
9
+ export interface LiveStatRequest {
10
+ /** The stat's unique key in StatsSectionConfig — used as the result map key. */
11
+ key: string;
12
+ source: "live" | "live-preset" | "live-collection";
13
+ /** Set when source is "live" or "live-preset". */
14
+ preset?: LiveStatPreset;
15
+ /** Set when source is "live-collection". */
16
+ collectionQuery?: CollectionQueryMetric;
17
+ }
18
+ /** Result map keyed by stat.key from StatsSectionConfig. Raw values, no suffix. */
19
+ export type LiveStatsMap = Record<string, string>;
10
20
  /**
11
- * Fetch live stats for the requested metrics only.
12
- * Pass the exact metric keys needed so unused Firestore queries are skipped.
21
+ * Fetch live stats for all requested metrics.
22
+ * Preset metrics are deduped so each Firestore query runs at most once.
23
+ * Collection-query metrics run their own queries; unknown collections are
24
+ * blocked by the ALLOWED_LIVE_COLLECTIONS allowlist.
25
+ * Returns raw count strings — suffix is applied by the caller (section-renderer).
13
26
  */
14
- export declare function fetchLiveStats(metrics: LiveStatMetric[]): Promise<LiveStatsMap>;
27
+ export declare function fetchLiveStats(requests: LiveStatRequest[]): Promise<LiveStatsMap>;