@mohasinac/appkit 2.1.3 → 2.3.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 (820) hide show
  1. package/README.md +80 -30
  2. package/dist/index.d.ts +3124 -0
  3. package/dist/index.js +5836 -0
  4. package/package.json +67 -383
  5. package/src/cli/index.ts +0 -221
  6. package/src/contracts/auth.ts +0 -63
  7. package/src/contracts/config.ts +0 -58
  8. package/src/contracts/email.ts +0 -37
  9. package/src/contracts/extend.ts +0 -195
  10. package/src/contracts/feature.ts +0 -60
  11. package/src/contracts/index.ts +0 -122
  12. package/src/contracts/infra.ts +0 -50
  13. package/src/contracts/payment.ts +0 -50
  14. package/src/contracts/registry.ts +0 -44
  15. package/src/contracts/repository.ts +0 -87
  16. package/src/contracts/search.ts +0 -49
  17. package/src/contracts/shipping.ts +0 -77
  18. package/src/contracts/storage.ts +0 -37
  19. package/src/contracts/style.ts +0 -25
  20. package/src/contracts/table.ts +0 -148
  21. package/src/core/CacheManager.ts +0 -85
  22. package/src/core/EventBus.ts +0 -89
  23. package/src/core/Logger.ts +0 -209
  24. package/src/core/Queue.ts +0 -126
  25. package/src/core/StorageManager.ts +0 -167
  26. package/src/core/copilot-log.repository.ts +0 -106
  27. package/src/core/index.ts +0 -39
  28. package/src/core/newsletter.repository.ts +0 -193
  29. package/src/core/site-config.ts +0 -109
  30. package/src/errors/api-error.ts +0 -7
  31. package/src/errors/authentication-error.ts +0 -7
  32. package/src/errors/authorization-error.ts +0 -7
  33. package/src/errors/base-error.ts +0 -30
  34. package/src/errors/database-error.ts +0 -7
  35. package/src/errors/error-codes.ts +0 -106
  36. package/src/errors/error-handler.ts +0 -74
  37. package/src/errors/index.ts +0 -11
  38. package/src/errors/not-found-error.ts +0 -7
  39. package/src/errors/validation-error.ts +0 -7
  40. package/src/features/about/components/AboutView.tsx +0 -142
  41. package/src/features/about/components/index.ts +0 -7
  42. package/src/features/about/index.ts +0 -7
  43. package/src/features/account/api/[userId]/addresses/route.ts +0 -131
  44. package/src/features/account/api/[userId]/route.ts +0 -107
  45. package/src/features/account/columns/index.ts +0 -61
  46. package/src/features/account/components/AddressBook.tsx +0 -109
  47. package/src/features/account/components/BecomeSellerView.tsx +0 -44
  48. package/src/features/account/components/ChatList.tsx +0 -43
  49. package/src/features/account/components/ChatWindow.tsx +0 -52
  50. package/src/features/account/components/MessagesView.tsx +0 -60
  51. package/src/features/account/components/OrderDetailView.tsx +0 -50
  52. package/src/features/account/components/ProfileView.tsx +0 -40
  53. package/src/features/account/components/UserAccountHubView.tsx +0 -40
  54. package/src/features/account/components/UserAddressesView.tsx +0 -44
  55. package/src/features/account/components/UserNotificationsView.tsx +0 -52
  56. package/src/features/account/components/UserOffersView.tsx +0 -37
  57. package/src/features/account/components/UserOrderTrackView.tsx +0 -36
  58. package/src/features/account/components/UserOrdersView.tsx +0 -45
  59. package/src/features/account/components/UserSettingsView.tsx +0 -48
  60. package/src/features/account/components/index.ts +0 -54
  61. package/src/features/account/hooks/useAccount.ts +0 -25
  62. package/src/features/account/index.ts +0 -7
  63. package/src/features/account/manifest.ts +0 -29
  64. package/src/features/account/messages/en.json +0 -12
  65. package/src/features/account/repository/account.repository.ts +0 -28
  66. package/src/features/account/schemas/index.ts +0 -56
  67. package/src/features/account/types/index.ts +0 -124
  68. package/src/features/admin/api/bids/route.ts +0 -63
  69. package/src/features/admin/api/coupons/route.ts +0 -63
  70. package/src/features/admin/api/products/route.ts +0 -64
  71. package/src/features/admin/api/reviews/route.ts +0 -63
  72. package/src/features/admin/components/AdminAnalyticsView.tsx +0 -124
  73. package/src/features/admin/components/AdminBidsView.tsx +0 -29
  74. package/src/features/admin/components/AdminBlogView.tsx +0 -32
  75. package/src/features/admin/components/AdminCarouselView.tsx +0 -57
  76. package/src/features/admin/components/AdminCategoriesView.tsx +0 -57
  77. package/src/features/admin/components/AdminCouponsView.tsx +0 -32
  78. package/src/features/admin/components/AdminDashboardView.tsx +0 -50
  79. package/src/features/admin/components/AdminFaqsView.tsx +0 -29
  80. package/src/features/admin/components/AdminFeatureFlagsView.tsx +0 -33
  81. package/src/features/admin/components/AdminMediaView.tsx +0 -57
  82. package/src/features/admin/components/AdminNavigationView.tsx +0 -57
  83. package/src/features/admin/components/AdminOrdersView.tsx +0 -29
  84. package/src/features/admin/components/AdminPayoutsView.tsx +0 -29
  85. package/src/features/admin/components/AdminProductsView.tsx +0 -32
  86. package/src/features/admin/components/AdminReviewsView.tsx +0 -38
  87. package/src/features/admin/components/AdminSectionsView.tsx +0 -57
  88. package/src/features/admin/components/AdminSessionsManager.tsx +0 -28
  89. package/src/features/admin/components/AdminSidebar.tsx +0 -28
  90. package/src/features/admin/components/AdminSiteView.tsx +0 -34
  91. package/src/features/admin/components/AdminStoresView.tsx +0 -29
  92. package/src/features/admin/components/AdminTopBar.tsx +0 -22
  93. package/src/features/admin/components/AdminUsersView.tsx +0 -32
  94. package/src/features/admin/components/DashboardStats.tsx +0 -95
  95. package/src/features/admin/components/DataTable.tsx +0 -115
  96. package/src/features/admin/components/DemoSeedView.tsx +0 -22
  97. package/src/features/admin/components/QuickActionsPanel.tsx +0 -62
  98. package/src/features/admin/components/analytics/AdminAnalyticsCharts.tsx +0 -114
  99. package/src/features/admin/components/analytics/AdminStatCard.tsx +0 -36
  100. package/src/features/admin/components/analytics/AdminTopProductsTable.tsx +0 -61
  101. package/src/features/admin/components/analytics/index.ts +0 -3
  102. package/src/features/admin/components/index.ts +0 -71
  103. package/src/features/admin/hooks/useAdmin.ts +0 -19
  104. package/src/features/admin/index.ts +0 -5
  105. package/src/features/admin/manifest.ts +0 -15
  106. package/src/features/admin/messages/en.json +0 -13
  107. package/src/features/admin/permission-map.ts +0 -27
  108. package/src/features/admin/server.ts +0 -10
  109. package/src/features/admin/types/index.ts +0 -75
  110. package/src/features/auctions/api/route.ts +0 -83
  111. package/src/features/auctions/columns/index.ts +0 -91
  112. package/src/features/auctions/components/AuctionCard.tsx +0 -149
  113. package/src/features/auctions/components/index.ts +0 -1
  114. package/src/features/auctions/hooks/useAuctions.ts +0 -145
  115. package/src/features/auctions/hooks/usePlaceBid.ts +0 -48
  116. package/src/features/auctions/hooks/useRealtimeBids.ts +0 -100
  117. package/src/features/auctions/index.ts +0 -9
  118. package/src/features/auctions/manifest.ts +0 -19
  119. package/src/features/auctions/messages/en.json +0 -18
  120. package/src/features/auctions/repository/auctions.repository.ts +0 -57
  121. package/src/features/auctions/schemas/index.ts +0 -69
  122. package/src/features/auctions/server.ts +0 -7
  123. package/src/features/auctions/types/index.ts +0 -90
  124. package/src/features/auth/api/route.ts +0 -63
  125. package/src/features/auth/components/AuthStatusPanel.tsx +0 -67
  126. package/src/features/auth/components/ForgotPasswordView.tsx +0 -114
  127. package/src/features/auth/components/Guards.tsx +0 -60
  128. package/src/features/auth/components/LoginForm.tsx +0 -180
  129. package/src/features/auth/components/RegisterForm.tsx +0 -232
  130. package/src/features/auth/components/ResetPasswordView.tsx +0 -144
  131. package/src/features/auth/components/SocialAuthButtons.tsx +0 -60
  132. package/src/features/auth/components/VerifyEmailView.tsx +0 -118
  133. package/src/features/auth/components/index.ts +0 -13
  134. package/src/features/auth/hooks/useAuth.ts +0 -33
  135. package/src/features/auth/index.ts +0 -5
  136. package/src/features/auth/manifest.ts +0 -23
  137. package/src/features/auth/messages/en.json +0 -13
  138. package/src/features/auth/schemas/index.ts +0 -48
  139. package/src/features/auth/server.ts +0 -17
  140. package/src/features/auth/types/index.ts +0 -36
  141. package/src/features/before-after/api/[id]/route.ts +0 -143
  142. package/src/features/before-after/api/route.ts +0 -104
  143. package/src/features/before-after/columns/index.ts +0 -72
  144. package/src/features/before-after/components/BeforeAfterGallery.tsx +0 -41
  145. package/src/features/before-after/components/BeforeAfterSlider.tsx +0 -89
  146. package/src/features/before-after/components/index.ts +0 -2
  147. package/src/features/before-after/hooks/useBeforeAfter.ts +0 -33
  148. package/src/features/before-after/index.ts +0 -7
  149. package/src/features/before-after/manifest.ts +0 -12
  150. package/src/features/before-after/messages/en.json +0 -8
  151. package/src/features/before-after/repository/before-after.repository.ts +0 -44
  152. package/src/features/before-after/schemas/index.ts +0 -25
  153. package/src/features/before-after/types/index.ts +0 -19
  154. package/src/features/blog/api/[slug]/route.ts +0 -73
  155. package/src/features/blog/api/route.ts +0 -81
  156. package/src/features/blog/columns/index.ts +0 -68
  157. package/src/features/blog/components/BlogFeaturedCard.tsx +0 -108
  158. package/src/features/blog/components/BlogListView.tsx +0 -219
  159. package/src/features/blog/components/BlogPostForm.tsx +0 -254
  160. package/src/features/blog/components/BlogPostView.tsx +0 -221
  161. package/src/features/blog/components/index.ts +0 -12
  162. package/src/features/blog/hooks/useBlog.ts +0 -67
  163. package/src/features/blog/index.ts +0 -7
  164. package/src/features/blog/manifest.ts +0 -16
  165. package/src/features/blog/messages/en.json +0 -14
  166. package/src/features/blog/repository/blog.repository.ts +0 -73
  167. package/src/features/blog/schemas/index.ts +0 -74
  168. package/src/features/blog/server.ts +0 -9
  169. package/src/features/blog/types/index.ts +0 -58
  170. package/src/features/cart/api/[id]/route.ts +0 -98
  171. package/src/features/cart/api/route.ts +0 -104
  172. package/src/features/cart/columns/index.ts +0 -73
  173. package/src/features/cart/components/CartDrawer.tsx +0 -183
  174. package/src/features/cart/components/CartSummary.tsx +0 -43
  175. package/src/features/cart/components/CartView.tsx +0 -47
  176. package/src/features/cart/components/CheckoutAddressStep.tsx +0 -68
  177. package/src/features/cart/components/CheckoutOtpModal.tsx +0 -39
  178. package/src/features/cart/components/CheckoutSuccessView.tsx +0 -31
  179. package/src/features/cart/components/CheckoutView.tsx +0 -70
  180. package/src/features/cart/components/index.ts +0 -16
  181. package/src/features/cart/hooks/useCart.ts +0 -30
  182. package/src/features/cart/hooks/useCartQuery.ts +0 -22
  183. package/src/features/cart/hooks/useCheckoutReadQueries.ts +0 -34
  184. package/src/features/cart/hooks/useOrder.ts +0 -35
  185. package/src/features/cart/index.ts +0 -11
  186. package/src/features/cart/manifest.ts +0 -12
  187. package/src/features/cart/messages/en.json +0 -10
  188. package/src/features/cart/repository/cart.repository.ts +0 -50
  189. package/src/features/cart/schemas/index.ts +0 -36
  190. package/src/features/cart/types/index.ts +0 -29
  191. package/src/features/cart/utils/guest-cart.ts +0 -149
  192. package/src/features/categories/api/[id]/route.ts +0 -144
  193. package/src/features/categories/api/route.ts +0 -253
  194. package/src/features/categories/columns/index.ts +0 -51
  195. package/src/features/categories/components/BreadcrumbTrail.tsx +0 -80
  196. package/src/features/categories/components/CategoriesListView.tsx +0 -77
  197. package/src/features/categories/components/CategoryGrid.tsx +0 -93
  198. package/src/features/categories/components/CategoryProductsView.tsx +0 -116
  199. package/src/features/categories/components/CategoryTree.tsx +0 -156
  200. package/src/features/categories/components/ConcernCard.tsx +0 -45
  201. package/src/features/categories/components/ConcernGrid.tsx +0 -25
  202. package/src/features/categories/components/index.ts +0 -17
  203. package/src/features/categories/hooks/useCategories.ts +0 -72
  204. package/src/features/categories/index.ts +0 -7
  205. package/src/features/categories/manifest.ts +0 -22
  206. package/src/features/categories/messages/en.json +0 -14
  207. package/src/features/categories/repository/categories.repository.ts +0 -76
  208. package/src/features/categories/schemas/index.ts +0 -74
  209. package/src/features/categories/server.ts +0 -12
  210. package/src/features/categories/types/index.ts +0 -60
  211. package/src/features/checkout/components/CheckoutStepper.tsx +0 -45
  212. package/src/features/checkout/components/index.ts +0 -1
  213. package/src/features/checkout/hooks/useCheckout.ts +0 -38
  214. package/src/features/checkout/index.ts +0 -4
  215. package/src/features/checkout/manifest.ts +0 -19
  216. package/src/features/checkout/messages/en.json +0 -10
  217. package/src/features/checkout/types/index.ts +0 -62
  218. package/src/features/cms/index.ts +0 -6
  219. package/src/features/collections/api/[slug]/route.ts +0 -167
  220. package/src/features/collections/api/route.ts +0 -104
  221. package/src/features/collections/columns/index.ts +0 -77
  222. package/src/features/collections/components/CollectionCard.tsx +0 -61
  223. package/src/features/collections/components/index.ts +0 -1
  224. package/src/features/collections/hooks/useCollections.ts +0 -31
  225. package/src/features/collections/index.ts +0 -7
  226. package/src/features/collections/manifest.ts +0 -18
  227. package/src/features/collections/messages/en.json +0 -10
  228. package/src/features/collections/repository/collections.repository.ts +0 -19
  229. package/src/features/collections/schemas/index.ts +0 -36
  230. package/src/features/collections/types/index.ts +0 -26
  231. package/src/features/consultation/api/[id]/route.ts +0 -143
  232. package/src/features/consultation/api/route.ts +0 -104
  233. package/src/features/consultation/columns/index.ts +0 -76
  234. package/src/features/consultation/components/ConsultationForm.tsx +0 -161
  235. package/src/features/consultation/components/index.ts +0 -1
  236. package/src/features/consultation/hooks/useBookConsultation.ts +0 -19
  237. package/src/features/consultation/index.ts +0 -7
  238. package/src/features/consultation/manifest.ts +0 -14
  239. package/src/features/consultation/messages/en.json +0 -25
  240. package/src/features/consultation/repository/consultations.repository.ts +0 -35
  241. package/src/features/consultation/schemas/index.ts +0 -51
  242. package/src/features/consultation/types/index.ts +0 -36
  243. package/src/features/contact/components/ContactForm.tsx +0 -202
  244. package/src/features/contact/components/ContactInfoSidebar.tsx +0 -85
  245. package/src/features/contact/components/index.ts +0 -7
  246. package/src/features/contact/index.ts +0 -1
  247. package/src/features/copilot/components/AdminCopilotView.tsx +0 -157
  248. package/src/features/copilot/components/index.ts +0 -2
  249. package/src/features/copilot/hooks/useCopilotChat.ts +0 -86
  250. package/src/features/copilot/index.ts +0 -2
  251. package/src/features/corporate/api/[id]/route.ts +0 -149
  252. package/src/features/corporate/api/route.ts +0 -108
  253. package/src/features/corporate/columns/index.ts +0 -76
  254. package/src/features/corporate/components/CorporateInquiryForm.tsx +0 -155
  255. package/src/features/corporate/components/index.ts +0 -1
  256. package/src/features/corporate/hooks/useSubmitCorporateInquiry.ts +0 -19
  257. package/src/features/corporate/index.ts +0 -7
  258. package/src/features/corporate/manifest.ts +0 -14
  259. package/src/features/corporate/messages/en.json +0 -26
  260. package/src/features/corporate/repository/corporate.repository.ts +0 -39
  261. package/src/features/corporate/schemas/index.ts +0 -53
  262. package/src/features/corporate/types/index.ts +0 -40
  263. package/src/features/cron/firebase-adapters.ts +0 -117
  264. package/src/features/cron/index.ts +0 -28
  265. package/src/features/cron/jobs/auction-expiry.job.ts +0 -76
  266. package/src/features/cron/jobs/preorder-reminder.job.ts +0 -64
  267. package/src/features/cron/registry.ts +0 -115
  268. package/src/features/cron/types.ts +0 -83
  269. package/src/features/events/api/[id]/route.ts +0 -123
  270. package/src/features/events/api/route.ts +0 -110
  271. package/src/features/events/columns/index.ts +0 -54
  272. package/src/features/events/components/AdminEventEntriesView.tsx +0 -39
  273. package/src/features/events/components/AdminEventsView.tsx +0 -47
  274. package/src/features/events/components/EventCard.tsx +0 -88
  275. package/src/features/events/components/EventDetailView.tsx +0 -51
  276. package/src/features/events/components/EventFormDrawer.tsx +0 -47
  277. package/src/features/events/components/EventLeaderboard.tsx +0 -76
  278. package/src/features/events/components/EventParticipateView.tsx +0 -48
  279. package/src/features/events/components/EventStatusBadge.tsx +0 -28
  280. package/src/features/events/components/EventsListView.tsx +0 -100
  281. package/src/features/events/components/index.ts +0 -15
  282. package/src/features/events/hooks/useEvent.ts +0 -94
  283. package/src/features/events/hooks/useEvents.ts +0 -59
  284. package/src/features/events/index.ts +0 -11
  285. package/src/features/events/manifest.ts +0 -26
  286. package/src/features/events/messages/en.json +0 -28
  287. package/src/features/events/repository/events.repository.ts +0 -110
  288. package/src/features/events/schemas/index.ts +0 -98
  289. package/src/features/events/server.ts +0 -8
  290. package/src/features/events/types/index.ts +0 -185
  291. package/src/features/faq/api/route.ts +0 -61
  292. package/src/features/faq/columns/index.ts +0 -60
  293. package/src/features/faq/components/ContactCTA.tsx +0 -115
  294. package/src/features/faq/components/FAQAccordion.tsx +0 -150
  295. package/src/features/faq/components/FAQCategorySidebar.tsx +0 -124
  296. package/src/features/faq/components/FAQHelpfulButtons.tsx +0 -110
  297. package/src/features/faq/components/FAQPageContent.tsx +0 -217
  298. package/src/features/faq/components/FAQSortDropdown.tsx +0 -43
  299. package/src/features/faq/components/RelatedFAQs.tsx +0 -74
  300. package/src/features/faq/components/index.ts +0 -9
  301. package/src/features/faq/hooks/useFAQs.ts +0 -50
  302. package/src/features/faq/hooks/useFaqList.ts +0 -53
  303. package/src/features/faq/index.ts +0 -8
  304. package/src/features/faq/manifest.ts +0 -12
  305. package/src/features/faq/messages/en.json +0 -14
  306. package/src/features/faq/repository/faqs.repository.ts +0 -61
  307. package/src/features/faq/schemas/index.ts +0 -69
  308. package/src/features/faq/server.ts +0 -7
  309. package/src/features/faq/types/index.ts +0 -63
  310. package/src/features/filters/FilterFacetSection.tsx +0 -205
  311. package/src/features/filters/FilterPanel.tsx +0 -227
  312. package/src/features/filters/RangeFilter.tsx +0 -291
  313. package/src/features/filters/SwitchFilter.tsx +0 -143
  314. package/src/features/filters/filterUtils.ts +0 -24
  315. package/src/features/filters/index.ts +0 -28
  316. package/src/features/forms/Checkbox.tsx +0 -100
  317. package/src/features/forms/Form.tsx +0 -105
  318. package/src/features/forms/Input.tsx +0 -127
  319. package/src/features/forms/Radio.tsx +0 -126
  320. package/src/features/forms/Select.tsx +0 -101
  321. package/src/features/forms/Slider.tsx +0 -119
  322. package/src/features/forms/Textarea.tsx +0 -99
  323. package/src/features/forms/Toggle.tsx +0 -110
  324. package/src/features/forms/index.ts +0 -34
  325. package/src/features/forms/utils.ts +0 -25
  326. package/src/features/homepage/api/[id]/route.ts +0 -145
  327. package/src/features/homepage/api/carousel/[id]/route.ts +0 -169
  328. package/src/features/homepage/api/carousel/route.ts +0 -188
  329. package/src/features/homepage/api/route.ts +0 -167
  330. package/src/features/homepage/api/sections/[id]/route.ts +0 -143
  331. package/src/features/homepage/api/sections/route.ts +0 -104
  332. package/src/features/homepage/components/AdvertisementBanner.tsx +0 -202
  333. package/src/features/homepage/components/BeforeAfterCard.tsx +0 -147
  334. package/src/features/homepage/components/CharacterHotspot.tsx +0 -742
  335. package/src/features/homepage/components/CharacterHotspotForm.tsx +0 -1002
  336. package/src/features/homepage/components/CustomerReviewsSection.tsx +0 -108
  337. package/src/features/homepage/components/FAQSection.tsx +0 -154
  338. package/src/features/homepage/components/FeaturedResultsSection.tsx +0 -97
  339. package/src/features/homepage/components/HeroBanner.tsx +0 -283
  340. package/src/features/homepage/components/HeroCarousel.tsx +0 -442
  341. package/src/features/homepage/components/HeroSection.tsx +0 -50
  342. package/src/features/homepage/components/HomepageSkeleton.tsx +0 -88
  343. package/src/features/homepage/components/HomepageView.tsx +0 -77
  344. package/src/features/homepage/components/HowItWorksInfoView.tsx +0 -161
  345. package/src/features/homepage/components/HowItWorksSection.tsx +0 -194
  346. package/src/features/homepage/components/NewsletterBanner.tsx +0 -130
  347. package/src/features/homepage/components/NewsletterSection.tsx +0 -85
  348. package/src/features/homepage/components/PromoGrid.tsx +0 -130
  349. package/src/features/homepage/components/SectionCarousel.tsx +0 -284
  350. package/src/features/homepage/components/SecurityHighlightsSection.tsx +0 -149
  351. package/src/features/homepage/components/SiteFeaturesSection.tsx +0 -86
  352. package/src/features/homepage/components/StatsCounterSection.tsx +0 -118
  353. package/src/features/homepage/components/TestimonialsCarousel.tsx +0 -96
  354. package/src/features/homepage/components/TrustBadges.tsx +0 -155
  355. package/src/features/homepage/components/TrustFeaturesSection.tsx +0 -168
  356. package/src/features/homepage/components/TrustIndicatorsSection.tsx +0 -59
  357. package/src/features/homepage/components/WelcomeSection.tsx +0 -178
  358. package/src/features/homepage/components/WhatsAppCommunitySection.tsx +0 -187
  359. package/src/features/homepage/components/index.ts +0 -91
  360. package/src/features/homepage/hooks/useBlogArticles.ts +0 -46
  361. package/src/features/homepage/hooks/useFeaturedAuctions.ts +0 -39
  362. package/src/features/homepage/hooks/useFeaturedPreOrders.ts +0 -39
  363. package/src/features/homepage/hooks/useFeaturedProducts.ts +0 -44
  364. package/src/features/homepage/hooks/useHeroCarousel.ts +0 -19
  365. package/src/features/homepage/hooks/useHomepage.ts +0 -25
  366. package/src/features/homepage/hooks/useTopBrands.ts +0 -17
  367. package/src/features/homepage/hooks/useTopCategories.ts +0 -19
  368. package/src/features/homepage/index.ts +0 -10
  369. package/src/features/homepage/manifest.ts +0 -16
  370. package/src/features/homepage/messages/en.json +0 -6
  371. package/src/features/homepage/repository/homepage.repository.ts +0 -38
  372. package/src/features/homepage/server.ts +0 -14
  373. package/src/features/homepage/types/index.ts +0 -183
  374. package/src/features/layout/AutoBreadcrumbs.tsx +0 -143
  375. package/src/features/layout/BackToTop.tsx +0 -58
  376. package/src/features/layout/BottomNavItem.tsx +0 -71
  377. package/src/features/layout/BottomNavLayout.tsx +0 -34
  378. package/src/features/layout/BottomSheet.tsx +0 -120
  379. package/src/features/layout/Breadcrumbs.tsx +0 -83
  380. package/src/features/layout/FooterLayout.tsx +0 -215
  381. package/src/features/layout/ListingLayout.tsx +0 -383
  382. package/src/features/layout/LocaleSwitcher.tsx +0 -44
  383. package/src/features/layout/NavbarLayout.tsx +0 -108
  384. package/src/features/layout/SidebarLayout.tsx +0 -75
  385. package/src/features/layout/TitleBarLayout.tsx +0 -285
  386. package/src/features/layout/index.ts +0 -46
  387. package/src/features/loyalty/api/admin/loyalty/grant/route.ts +0 -51
  388. package/src/features/loyalty/api/balance/route.ts +0 -53
  389. package/src/features/loyalty/api/earn/route.ts +0 -51
  390. package/src/features/loyalty/api/history/route.ts +0 -74
  391. package/src/features/loyalty/api/redeem/route.ts +0 -51
  392. package/src/features/loyalty/columns/index.ts +0 -61
  393. package/src/features/loyalty/components/CoinsDisplay.tsx +0 -36
  394. package/src/features/loyalty/components/index.ts +0 -1
  395. package/src/features/loyalty/hooks/useLoyaltyBalance.ts +0 -17
  396. package/src/features/loyalty/index.ts +0 -7
  397. package/src/features/loyalty/manifest.ts +0 -18
  398. package/src/features/loyalty/messages/en.json +0 -19
  399. package/src/features/loyalty/repository/loyalty.repository.ts +0 -29
  400. package/src/features/loyalty/schemas/index.ts +0 -44
  401. package/src/features/loyalty/types/index.ts +0 -43
  402. package/src/features/loyalty/types/loyalty-math.ts +0 -36
  403. package/src/features/media/MediaAvatar.tsx +0 -37
  404. package/src/features/media/MediaImage.tsx +0 -119
  405. package/src/features/media/MediaLightbox.tsx +0 -520
  406. package/src/features/media/MediaVideo.tsx +0 -94
  407. package/src/features/media/components/MediaSlider.tsx +0 -53
  408. package/src/features/media/hooks/useMedia.ts +0 -118
  409. package/src/features/media/index.ts +0 -74
  410. package/src/features/media/messages/en.json +0 -63
  411. package/src/features/media/modals/ImageCropModal.tsx +0 -270
  412. package/src/features/media/modals/VideoThumbnailSelector.tsx +0 -117
  413. package/src/features/media/modals/VideoTrimModal.tsx +0 -193
  414. package/src/features/media/types/index.ts +0 -69
  415. package/src/features/media/upload/CameraCapture.tsx +0 -150
  416. package/src/features/media/upload/ImageUpload.tsx +0 -358
  417. package/src/features/media/upload/MediaUploadField.tsx +0 -442
  418. package/src/features/media/upload/MediaUploadList.tsx +0 -255
  419. package/src/features/orders/columns/index.ts +0 -47
  420. package/src/features/orders/components/OrdersList.tsx +0 -168
  421. package/src/features/orders/components/index.ts +0 -1
  422. package/src/features/orders/hooks/useOrders.ts +0 -53
  423. package/src/features/orders/index.ts +0 -8
  424. package/src/features/orders/manifest.ts +0 -20
  425. package/src/features/orders/messages/en.json +0 -15
  426. package/src/features/orders/repository/orders.repository.ts +0 -47
  427. package/src/features/orders/schemas/index.ts +0 -82
  428. package/src/features/orders/types/index.ts +0 -97
  429. package/src/features/orders/utils/order-splitter.ts +0 -48
  430. package/src/features/payments/columns/index.ts +0 -67
  431. package/src/features/payments/components/index.ts +0 -1
  432. package/src/features/payments/hooks/usePayments.ts +0 -23
  433. package/src/features/payments/index.ts +0 -6
  434. package/src/features/payments/manifest.ts +0 -14
  435. package/src/features/payments/messages/en.json +0 -11
  436. package/src/features/payments/repository/payments.repository.ts +0 -57
  437. package/src/features/payments/schemas/index.ts +0 -47
  438. package/src/features/payments/types/index.ts +0 -50
  439. package/src/features/pre-orders/api/[id]/route.ts +0 -143
  440. package/src/features/pre-orders/api/[slug]/route.ts +0 -61
  441. package/src/features/pre-orders/api/admin/[id]/route.ts +0 -105
  442. package/src/features/pre-orders/api/admin/route.ts +0 -69
  443. package/src/features/pre-orders/api/route.ts +0 -96
  444. package/src/features/pre-orders/columns/index.ts +0 -90
  445. package/src/features/pre-orders/components/PreOrderBadge.tsx +0 -52
  446. package/src/features/pre-orders/components/PreorderCard.tsx +0 -90
  447. package/src/features/pre-orders/components/index.ts +0 -1
  448. package/src/features/pre-orders/hooks/usePreOrders.ts +0 -31
  449. package/src/features/pre-orders/index.ts +0 -7
  450. package/src/features/pre-orders/manifest.ts +0 -19
  451. package/src/features/pre-orders/messages/en.json +0 -13
  452. package/src/features/pre-orders/repository/pre-orders.repository.ts +0 -75
  453. package/src/features/pre-orders/repository/preorders.repository.ts +0 -24
  454. package/src/features/pre-orders/schemas/index.ts +0 -28
  455. package/src/features/pre-orders/server.ts +0 -12
  456. package/src/features/pre-orders/types/index.ts +0 -49
  457. package/src/features/products/api/[id]/route.ts +0 -200
  458. package/src/features/products/api/route.ts +0 -242
  459. package/src/features/products/columns/index.ts +0 -90
  460. package/src/features/products/components/AuctionDetailView.tsx +0 -58
  461. package/src/features/products/components/AuctionsView.tsx +0 -48
  462. package/src/features/products/components/BidHistory.tsx +0 -83
  463. package/src/features/products/components/BuyBar.tsx +0 -36
  464. package/src/features/products/components/MakeOfferForm.tsx +0 -43
  465. package/src/features/products/components/PlaceBidForm.tsx +0 -42
  466. package/src/features/products/components/PreOrderDetailView.tsx +0 -50
  467. package/src/features/products/components/PreOrdersView.tsx +0 -39
  468. package/src/features/products/components/ProductDetailView.tsx +0 -52
  469. package/src/features/products/components/ProductFeatureBadges.tsx +0 -192
  470. package/src/features/products/components/ProductGrid.tsx +0 -424
  471. package/src/features/products/components/ProductInfo.tsx +0 -44
  472. package/src/features/products/components/ProductTabs.tsx +0 -84
  473. package/src/features/products/components/ProductsView.tsx +0 -48
  474. package/src/features/products/components/RelatedProducts.tsx +0 -51
  475. package/src/features/products/components/index.ts +0 -28
  476. package/src/features/products/hooks/useProductDetail.ts +0 -44
  477. package/src/features/products/hooks/useProducts.ts +0 -112
  478. package/src/features/products/index.ts +0 -9
  479. package/src/features/products/manifest.ts +0 -18
  480. package/src/features/products/messages/en.json +0 -11
  481. package/src/features/products/repository/products.repository.ts +0 -83
  482. package/src/features/products/schemas/index.ts +0 -185
  483. package/src/features/products/server.ts +0 -12
  484. package/src/features/products/types/index.ts +0 -142
  485. package/src/features/products/utils/listing-type.ts +0 -12
  486. package/src/features/promotions/api/route.ts +0 -105
  487. package/src/features/promotions/columns/index.ts +0 -60
  488. package/src/features/promotions/components/CouponCard.tsx +0 -79
  489. package/src/features/promotions/components/PromotionsView.tsx +0 -129
  490. package/src/features/promotions/components/index.ts +0 -7
  491. package/src/features/promotions/hooks/usePromotions.ts +0 -59
  492. package/src/features/promotions/index.ts +0 -7
  493. package/src/features/promotions/manifest.ts +0 -16
  494. package/src/features/promotions/messages/en.json +0 -20
  495. package/src/features/promotions/repository/promotions.repository.ts +0 -62
  496. package/src/features/promotions/schemas/index.ts +0 -63
  497. package/src/features/promotions/server.ts +0 -7
  498. package/src/features/promotions/types/index.ts +0 -65
  499. package/src/features/reviews/api/[id]/route.ts +0 -163
  500. package/src/features/reviews/api/route.ts +0 -216
  501. package/src/features/reviews/columns/index.ts +0 -57
  502. package/src/features/reviews/components/ReviewModal.tsx +0 -133
  503. package/src/features/reviews/components/ReviewSummary.tsx +0 -82
  504. package/src/features/reviews/components/ReviewsList.tsx +0 -182
  505. package/src/features/reviews/components/ReviewsListView.tsx +0 -100
  506. package/src/features/reviews/components/index.ts +0 -11
  507. package/src/features/reviews/hooks/useReviews.ts +0 -67
  508. package/src/features/reviews/index.ts +0 -7
  509. package/src/features/reviews/manifest.ts +0 -12
  510. package/src/features/reviews/messages/en.json +0 -10
  511. package/src/features/reviews/repository/reviews.repository.ts +0 -69
  512. package/src/features/reviews/schemas/index.ts +0 -74
  513. package/src/features/reviews/server.ts +0 -12
  514. package/src/features/reviews/types/index.ts +0 -68
  515. package/src/features/search/api/route.ts +0 -100
  516. package/src/features/search/columns/index.ts +0 -70
  517. package/src/features/search/components/SearchFiltersRow.tsx +0 -118
  518. package/src/features/search/components/SearchResultsSection.tsx +0 -195
  519. package/src/features/search/components/SearchView.tsx +0 -99
  520. package/src/features/search/components/index.ts +0 -6
  521. package/src/features/search/hooks/useSearch.ts +0 -41
  522. package/src/features/search/index.ts +0 -7
  523. package/src/features/search/manifest.ts +0 -12
  524. package/src/features/search/messages/en.json +0 -15
  525. package/src/features/search/repository/search.repository.ts +0 -64
  526. package/src/features/search/schemas/index.ts +0 -36
  527. package/src/features/search/server.ts +0 -3
  528. package/src/features/search/types/index.ts +0 -59
  529. package/src/features/seller/api/coupons/route.ts +0 -57
  530. package/src/features/seller/api/offers/route.ts +0 -73
  531. package/src/features/seller/api/products/route.ts +0 -75
  532. package/src/features/seller/api/store/route.ts +0 -41
  533. package/src/features/seller/columns/index.ts +0 -103
  534. package/src/features/seller/components/SellerAddressesView.tsx +0 -32
  535. package/src/features/seller/components/SellerAnalyticsView.tsx +0 -38
  536. package/src/features/seller/components/SellerAuctionsView.tsx +0 -48
  537. package/src/features/seller/components/SellerCouponsView.tsx +0 -48
  538. package/src/features/seller/components/SellerCreateProductView.tsx +0 -27
  539. package/src/features/seller/components/SellerDashboardView.tsx +0 -41
  540. package/src/features/seller/components/SellerEditProductView.tsx +0 -27
  541. package/src/features/seller/components/SellerGuideView.tsx +0 -34
  542. package/src/features/seller/components/SellerOffersView.tsx +0 -46
  543. package/src/features/seller/components/SellerOrdersView.tsx +0 -46
  544. package/src/features/seller/components/SellerPayoutHistoryTable.tsx +0 -44
  545. package/src/features/seller/components/SellerPayoutSettingsView.tsx +0 -27
  546. package/src/features/seller/components/SellerPayoutStats.tsx +0 -24
  547. package/src/features/seller/components/SellerPayoutsView.tsx +0 -46
  548. package/src/features/seller/components/SellerProductsView.tsx +0 -51
  549. package/src/features/seller/components/SellerShippingView.tsx +0 -30
  550. package/src/features/seller/components/SellerSidebar.tsx +0 -84
  551. package/src/features/seller/components/SellerStatCard.tsx +0 -44
  552. package/src/features/seller/components/SellerStoreSetupView.tsx +0 -31
  553. package/src/features/seller/components/SellerStoreView.tsx +0 -27
  554. package/src/features/seller/components/SellerStorefrontView.tsx +0 -49
  555. package/src/features/seller/components/SellersListView.tsx +0 -43
  556. package/src/features/seller/components/analytics/SellerAnalyticsStats.tsx +0 -87
  557. package/src/features/seller/components/analytics/SellerRevenueChart.tsx +0 -99
  558. package/src/features/seller/components/analytics/SellerTopProducts.tsx +0 -76
  559. package/src/features/seller/components/analytics/index.ts +0 -3
  560. package/src/features/seller/components/index.ts +0 -47
  561. package/src/features/seller/hooks/useSellerPayouts.ts +0 -51
  562. package/src/features/seller/hooks/useSellerStore.ts +0 -60
  563. package/src/features/seller/index.ts +0 -12
  564. package/src/features/seller/manifest.ts +0 -76
  565. package/src/features/seller/messages/en.json +0 -32
  566. package/src/features/seller/permission-map.ts +0 -18
  567. package/src/features/seller/repository/seller.repository.ts +0 -100
  568. package/src/features/seller/schemas/index.ts +0 -113
  569. package/src/features/seller/server.ts +0 -10
  570. package/src/features/seller/types/index.ts +0 -185
  571. package/src/features/stores/api/[storeSlug]/auctions/route.ts +0 -134
  572. package/src/features/stores/api/[storeSlug]/products/route.ts +0 -139
  573. package/src/features/stores/api/[storeSlug]/reviews/route.ts +0 -155
  574. package/src/features/stores/api/[storeSlug]/route.ts +0 -120
  575. package/src/features/stores/api/route.ts +0 -128
  576. package/src/features/stores/columns/index.ts +0 -58
  577. package/src/features/stores/components/StoreAboutView.tsx +0 -134
  578. package/src/features/stores/components/StoreAuctionsView.tsx +0 -46
  579. package/src/features/stores/components/StoreHeader.tsx +0 -115
  580. package/src/features/stores/components/StoreNavTabs.tsx +0 -77
  581. package/src/features/stores/components/StoreProductsView.tsx +0 -77
  582. package/src/features/stores/components/StoreReviewsView.tsx +0 -45
  583. package/src/features/stores/components/StoresListView.tsx +0 -142
  584. package/src/features/stores/components/index.ts +0 -12
  585. package/src/features/stores/hooks/useStores.ts +0 -130
  586. package/src/features/stores/index.ts +0 -7
  587. package/src/features/stores/manifest.ts +0 -37
  588. package/src/features/stores/messages/en.json +0 -21
  589. package/src/features/stores/repository/stores.repository.ts +0 -51
  590. package/src/features/stores/schemas/index.ts +0 -42
  591. package/src/features/stores/server.ts +0 -11
  592. package/src/features/stores/types/index.ts +0 -123
  593. package/src/features/user/components/BecomeSellerView.tsx +0 -36
  594. package/src/features/user/components/MessagesView.tsx +0 -37
  595. package/src/features/user/components/OrderDetailView.tsx +0 -36
  596. package/src/features/user/components/ProfileView.tsx +0 -33
  597. package/src/features/user/components/UserAccountHub.tsx +0 -30
  598. package/src/features/user/components/UserAddressesView.tsx +0 -32
  599. package/src/features/user/components/UserNotificationsView.tsx +0 -38
  600. package/src/features/user/components/UserOffersView.tsx +0 -35
  601. package/src/features/user/components/UserOrdersView.tsx +0 -39
  602. package/src/features/user/components/UserSettingsView.tsx +0 -31
  603. package/src/features/user/components/UserSidebar.tsx +0 -27
  604. package/src/features/user/components/index.ts +0 -22
  605. package/src/features/user/index.ts +0 -1
  606. package/src/features/whatsapp-bot/api/send-status/route.ts +0 -48
  607. package/src/features/whatsapp-bot/api/webhook/route.ts +0 -55
  608. package/src/features/whatsapp-bot/components/WhatsAppChatButton.tsx +0 -38
  609. package/src/features/whatsapp-bot/components/index.ts +0 -1
  610. package/src/features/whatsapp-bot/helpers/whatsapp.ts +0 -137
  611. package/src/features/whatsapp-bot/index.ts +0 -4
  612. package/src/features/whatsapp-bot/manifest.ts +0 -15
  613. package/src/features/whatsapp-bot/messages/en.json +0 -7
  614. package/src/features/whatsapp-bot/types/index.ts +0 -61
  615. package/src/features/wishlist/columns/index.ts +0 -65
  616. package/src/features/wishlist/components/WishlistPage.tsx +0 -118
  617. package/src/features/wishlist/components/WishlistToggleButton.tsx +0 -68
  618. package/src/features/wishlist/components/WishlistView.tsx +0 -150
  619. package/src/features/wishlist/components/index.ts +0 -4
  620. package/src/features/wishlist/hooks/useUserWishlist.ts +0 -39
  621. package/src/features/wishlist/hooks/useWishlist.ts +0 -31
  622. package/src/features/wishlist/index.ts +0 -8
  623. package/src/features/wishlist/manifest.ts +0 -14
  624. package/src/features/wishlist/messages/en.json +0 -7
  625. package/src/features/wishlist/repository/wishlist.repository.ts +0 -43
  626. package/src/features/wishlist/schemas/index.ts +0 -25
  627. package/src/features/wishlist/types/index.ts +0 -17
  628. package/src/http/ApiClient.ts +0 -247
  629. package/src/http/index.ts +0 -10
  630. package/src/index.ts +0 -22
  631. package/src/instrumentation/index.ts +0 -77
  632. package/src/monitoring/cache-metrics.ts +0 -105
  633. package/src/monitoring/client-logger.ts +0 -83
  634. package/src/monitoring/error-tracking.ts +0 -115
  635. package/src/monitoring/index.ts +0 -52
  636. package/src/monitoring/performance.ts +0 -64
  637. package/src/monitoring/runtime.ts +0 -33
  638. package/src/monitoring/server-logger.ts +0 -93
  639. package/src/next/IAuthVerifier.ts +0 -56
  640. package/src/next/api/api-response.ts +0 -72
  641. package/src/next/api/apiHandler.ts +0 -178
  642. package/src/next/api/errorHandler.ts +0 -125
  643. package/src/next/api/routeHandler.ts +0 -175
  644. package/src/next/cache-middleware.ts +0 -112
  645. package/src/next/components/ErrorView.tsx +0 -73
  646. package/src/next/components/GlobalError.tsx +0 -75
  647. package/src/next/components/NotFoundView.tsx +0 -56
  648. package/src/next/components/UnauthorizedView.tsx +0 -61
  649. package/src/next/index.ts +0 -82
  650. package/src/next/middleware/chain.ts +0 -117
  651. package/src/next/middleware/index.ts +0 -14
  652. package/src/next/middleware/pii-redactor.ts +0 -112
  653. package/src/next/middleware/pii-scrubber.ts +0 -56
  654. package/src/next/middleware/types.ts +0 -26
  655. package/src/next/request-helpers.ts +0 -76
  656. package/src/next/routing/route-map.ts +0 -221
  657. package/src/providers/auth-firebase/browser-stub.ts +0 -32
  658. package/src/providers/auth-firebase/helpers.ts +0 -150
  659. package/src/providers/auth-firebase/index.ts +0 -26
  660. package/src/providers/auth-firebase/provider.ts +0 -163
  661. package/src/providers/auth-firebase/session.ts +0 -111
  662. package/src/providers/db-firebase/admin-app-lite.ts +0 -66
  663. package/src/providers/db-firebase/admin-auth-lite.ts +0 -16
  664. package/src/providers/db-firebase/admin-storage-lite.ts +0 -19
  665. package/src/providers/db-firebase/admin.ts +0 -217
  666. package/src/providers/db-firebase/base.ts +0 -243
  667. package/src/providers/db-firebase/browser-stub.ts +0 -47
  668. package/src/providers/db-firebase/helpers.ts +0 -88
  669. package/src/providers/db-firebase/index.ts +0 -60
  670. package/src/providers/db-firebase/realtime.ts +0 -185
  671. package/src/providers/db-firebase/sieve.ts +0 -136
  672. package/src/providers/email-resend/index.ts +0 -16
  673. package/src/providers/email-resend/provider.ts +0 -103
  674. package/src/providers/payment-razorpay/index.ts +0 -165
  675. package/src/providers/shipping-shiprocket/index.ts +0 -402
  676. package/src/providers/storage-firebase/index.ts +0 -17
  677. package/src/providers/storage-firebase/provider.ts +0 -131
  678. package/src/react/ErrorBoundary.tsx +0 -130
  679. package/src/react/hooks/useBreakpoint.ts +0 -41
  680. package/src/react/hooks/useBulkAction.ts +0 -161
  681. package/src/react/hooks/useBulkSelection.ts +0 -119
  682. package/src/react/hooks/useCamera.ts +0 -191
  683. package/src/react/hooks/useClickOutside.ts +0 -87
  684. package/src/react/hooks/useContainerGrid.ts +0 -77
  685. package/src/react/hooks/useCountdown.ts +0 -73
  686. package/src/react/hooks/useGesture.ts +0 -255
  687. package/src/react/hooks/useKeyPress.ts +0 -113
  688. package/src/react/hooks/useLongPress.ts +0 -62
  689. package/src/react/hooks/useMediaQuery.ts +0 -40
  690. package/src/react/hooks/usePendingFilters.ts +0 -138
  691. package/src/react/hooks/usePendingTable.ts +0 -84
  692. package/src/react/hooks/usePullToRefresh.ts +0 -111
  693. package/src/react/hooks/useSwipe.ts +0 -240
  694. package/src/react/hooks/useUnsavedChanges.ts +0 -104
  695. package/src/react/hooks/useUrlTable.ts +0 -189
  696. package/src/react/hooks/useVisibleItems.ts +0 -110
  697. package/src/react/index.ts +0 -99
  698. package/src/react/useModalStack.ts +0 -86
  699. package/src/security/authorization.ts +0 -92
  700. package/src/security/csp.ts +0 -44
  701. package/src/security/index.ts +0 -50
  702. package/src/security/pii-encrypt.ts +0 -117
  703. package/src/security/pii-redact.ts +0 -133
  704. package/src/security/rate-limit.ts +0 -170
  705. package/src/security/rbac/Can.tsx +0 -50
  706. package/src/security/rbac/default-roles.ts +0 -86
  707. package/src/security/rbac/hook.ts +0 -55
  708. package/src/security/rbac/index.ts +0 -14
  709. package/src/security/rbac/middleware.ts +0 -103
  710. package/src/security/rbac/resolver.ts +0 -69
  711. package/src/security/rbac/server.ts +0 -52
  712. package/src/security/rbac/types.ts +0 -27
  713. package/src/seed/defaults/categories.ts +0 -13
  714. package/src/seed/defaults/faqs.ts +0 -40
  715. package/src/seed/defaults/homepage-sections.ts +0 -63
  716. package/src/seed/factories/address.factory.ts +0 -106
  717. package/src/seed/factories/bid.factory.ts +0 -50
  718. package/src/seed/factories/blog-post.factory.ts +0 -40
  719. package/src/seed/factories/carousel.factory.ts +0 -30
  720. package/src/seed/factories/cart.factory.ts +0 -66
  721. package/src/seed/factories/category.factory.ts +0 -30
  722. package/src/seed/factories/coupon.factory.ts +0 -67
  723. package/src/seed/factories/faq.factory.ts +0 -28
  724. package/src/seed/factories/homepage-section.factory.ts +0 -35
  725. package/src/seed/factories/notification.factory.ts +0 -68
  726. package/src/seed/factories/order.factory.ts +0 -43
  727. package/src/seed/factories/payout.factory.ts +0 -62
  728. package/src/seed/factories/product.factory.ts +0 -120
  729. package/src/seed/factories/review.factory.ts +0 -67
  730. package/src/seed/factories/session.factory.ts +0 -49
  731. package/src/seed/factories/store.factory.ts +0 -69
  732. package/src/seed/factories/user.factory.ts +0 -88
  733. package/src/seed/index.ts +0 -84
  734. package/src/seed/runner.ts +0 -57
  735. package/src/seed/test-utils.ts +0 -155
  736. package/src/seed/types.ts +0 -40
  737. package/src/seo/index.ts +0 -2
  738. package/src/seo/json-ld.ts +0 -241
  739. package/src/seo/metadata.ts +0 -302
  740. package/src/style/tailwind/index.ts +0 -66
  741. package/src/style/vanilla/index.ts +0 -57
  742. package/src/tokens/index.ts +0 -864
  743. package/src/tokens/tokens.css +0 -221
  744. package/src/ui/DataTable.tsx +0 -655
  745. package/src/ui/animation.helper.ts +0 -20
  746. package/src/ui/color.helper.ts +0 -37
  747. package/src/ui/components/Accordion.tsx +0 -189
  748. package/src/ui/components/ActiveFilterChips.tsx +0 -81
  749. package/src/ui/components/Alert.tsx +0 -167
  750. package/src/ui/components/Badge.tsx +0 -65
  751. package/src/ui/components/Breadcrumb.tsx +0 -61
  752. package/src/ui/components/BulkActionBar.tsx +0 -246
  753. package/src/ui/components/Button.tsx +0 -75
  754. package/src/ui/components/CountdownDisplay.tsx +0 -87
  755. package/src/ui/components/DescriptionField.tsx +0 -55
  756. package/src/ui/components/Div.tsx +0 -29
  757. package/src/ui/components/Divider.tsx +0 -52
  758. package/src/ui/components/Drawer.tsx +0 -178
  759. package/src/ui/components/Form.tsx +0 -25
  760. package/src/ui/components/FormGrid.tsx +0 -82
  761. package/src/ui/components/HorizontalScroller.tsx +0 -183
  762. package/src/ui/components/IconButton.tsx +0 -71
  763. package/src/ui/components/ImageLightbox.tsx +0 -187
  764. package/src/ui/components/Input.tsx +0 -17
  765. package/src/ui/components/ItemRow.tsx +0 -38
  766. package/src/ui/components/Layout.tsx +0 -391
  767. package/src/ui/components/ListingLayout.tsx +0 -514
  768. package/src/ui/components/Modal.tsx +0 -162
  769. package/src/ui/components/Pagination.tsx +0 -182
  770. package/src/ui/components/PriceDisplay.tsx +0 -63
  771. package/src/ui/components/Progress.tsx +0 -154
  772. package/src/ui/components/RatingDisplay.tsx +0 -56
  773. package/src/ui/components/Select.tsx +0 -221
  774. package/src/ui/components/Semantic.tsx +0 -257
  775. package/src/ui/components/SideModal.tsx +0 -137
  776. package/src/ui/components/Skeleton.tsx +0 -82
  777. package/src/ui/components/Slider.tsx +0 -35
  778. package/src/ui/components/SortDropdown.tsx +0 -43
  779. package/src/ui/components/Spinner.tsx +0 -48
  780. package/src/ui/components/StarRating.tsx +0 -85
  781. package/src/ui/components/StatsGrid.tsx +0 -56
  782. package/src/ui/components/StatusBadge.tsx +0 -130
  783. package/src/ui/components/StepperNav.tsx +0 -89
  784. package/src/ui/components/SummaryCard.tsx +0 -66
  785. package/src/ui/components/TabStrip.tsx +0 -142
  786. package/src/ui/components/TablePagination.tsx +0 -134
  787. package/src/ui/components/TagInput.tsx +0 -133
  788. package/src/ui/components/TextLink.tsx +0 -68
  789. package/src/ui/components/Textarea.tsx +0 -17
  790. package/src/ui/components/Tooltip.tsx +0 -190
  791. package/src/ui/components/Typography.tsx +0 -270
  792. package/src/ui/components/ViewToggle.tsx +0 -133
  793. package/src/ui/index.ts +0 -248
  794. package/src/ui/rich-text/RichText.tsx +0 -243
  795. package/src/ui/rich-text/index.ts +0 -2
  796. package/src/ui/style.helper.ts +0 -18
  797. package/src/utils/animation.helper.ts +0 -22
  798. package/src/utils/array.helper.ts +0 -73
  799. package/src/utils/color.helper.ts +0 -57
  800. package/src/utils/cookie.converter.ts +0 -32
  801. package/src/utils/date.formatter.ts +0 -228
  802. package/src/utils/event-manager.ts +0 -168
  803. package/src/utils/filter.helper.ts +0 -24
  804. package/src/utils/id-generators.ts +0 -629
  805. package/src/utils/index.ts +0 -31
  806. package/src/utils/media-field.ts +0 -13
  807. package/src/utils/number.formatter.ts +0 -107
  808. package/src/utils/object.helper.ts +0 -111
  809. package/src/utils/pagination.helper.ts +0 -46
  810. package/src/utils/sorting.helper.ts +0 -21
  811. package/src/utils/string.formatter.ts +0 -178
  812. package/src/utils/type.converter.ts +0 -86
  813. package/src/validation/email.validator.ts +0 -37
  814. package/src/validation/index.ts +0 -17
  815. package/src/validation/input.validator.ts +0 -38
  816. package/src/validation/password.validator.ts +0 -97
  817. package/src/validation/phone.validator.ts +0 -38
  818. package/src/validation/schemas.ts +0 -106
  819. package/src/validation/url.validator.ts +0 -46
  820. package/src/validation/zod-error-map.ts +0 -96
@@ -1,1002 +0,0 @@
1
- "use client";
2
-
3
- import React, { useState, useRef } from "react";
4
- import Image from "next/image";
5
- import {
6
- Button,
7
- Div,
8
- Heading,
9
- Input,
10
- Label,
11
- Li,
12
- Span,
13
- Text,
14
- Textarea,
15
- Ul,
16
- } from "../../../ui";
17
- import type { CharacterHotspotConfig, HotspotPin } from "../types";
18
-
19
- type WizardStep = "image" | "place" | "details" | "review";
20
-
21
- interface DraftPosition {
22
- id: string;
23
- xPct: number;
24
- yPct: number;
25
- }
26
-
27
- function randomId() {
28
- return Math.random().toString(36).slice(2, 9);
29
- }
30
-
31
- export interface CharacterHotspotFormProps {
32
- initial?: CharacterHotspotConfig | null;
33
- /**
34
- * Upload an image and return its public URL.
35
- * Implement however suits your storage backend:
36
- * ```ts
37
- * onUploadImage={async (file) => {
38
- * const storage = getStorage(getFirebaseApp());
39
- * const storageRef = ref(storage, `character-hotspot/${Date.now()}_${file.name}`);
40
- * await uploadBytes(storageRef, file);
41
- * return getDownloadURL(storageRef);
42
- * }}
43
- * ```
44
- */
45
- onUploadImage: (file: File) => Promise<string>;
46
- /**
47
- * Persist the final config (e.g. write to Firestore).
48
- */
49
- onSave: (config: CharacterHotspotConfig) => Promise<void>;
50
- /**
51
- * Optional callback after a successful save (e.g. revalidate cache).
52
- */
53
- onAfterSave?: () => void | Promise<void>;
54
- }
55
-
56
- export function CharacterHotspotForm({
57
- initial,
58
- onUploadImage,
59
- onSave,
60
- onAfterSave,
61
- }: CharacterHotspotFormProps) {
62
- const [imageUrl, setImageUrl] = useState(initial?.imageUrl ?? "");
63
- const [imageAlt, setImageAlt] = useState(
64
- initial?.imageAlt ?? "DC, Marvel and Anime characters",
65
- );
66
- const [active, setActive] = useState(initial?.active ?? true);
67
- const [pins, setPins] = useState<HotspotPin[]>(initial?.pins ?? []);
68
- const [step, setStep] = useState<WizardStep>(
69
- initial?.imageUrl ? "review" : "image",
70
- );
71
-
72
- const [draftPos, setDraftPos] = useState<DraftPosition | null>(null);
73
- const [draftName, setDraftName] = useState("");
74
- const [draftUniverse, setDraftUniverse] = useState("");
75
- const [draftDescription, setDraftDescription] = useState("");
76
- const [draftHref, setDraftHref] = useState("");
77
- const [draftBuyText, setDraftBuyText] = useState("Shop Now");
78
- const [draftBadge, setDraftBadge] = useState("");
79
- const [draftAccent, setDraftAccent] = useState("#E8001C");
80
-
81
- const [uploading, setUploading] = useState(false);
82
- const [saving, setSaving] = useState(false);
83
- const [error, setError] = useState<string | null>(null);
84
- const [success, setSuccess] = useState(false);
85
-
86
- const containerRef = useRef<HTMLDivElement>(null);
87
-
88
- async function handleImageUpload(e: React.ChangeEvent<HTMLInputElement>) {
89
- const file = e.target.files?.[0];
90
- if (!file) return;
91
- setUploading(true);
92
- setError(null);
93
- try {
94
- const url = await onUploadImage(file);
95
- setImageUrl(url);
96
- } catch {
97
- setError("Image upload failed.");
98
- } finally {
99
- setUploading(false);
100
- }
101
- }
102
-
103
- function handleImageClick(e: React.MouseEvent<HTMLDivElement>) {
104
- if (!containerRef.current) return;
105
- const rect = containerRef.current.getBoundingClientRect();
106
- const xPct =
107
- Math.round(
108
- Math.max(
109
- 1,
110
- Math.min(99, ((e.clientX - rect.left) / rect.width) * 100),
111
- ) * 10,
112
- ) / 10;
113
- const yPct =
114
- Math.round(
115
- Math.max(
116
- 1,
117
- Math.min(99, ((e.clientY - rect.top) / rect.height) * 100),
118
- ) * 10,
119
- ) / 10;
120
- setDraftPos((prev) => ({ id: prev?.id ?? randomId(), xPct, yPct }));
121
- }
122
-
123
- function commitDraftPin() {
124
- if (!draftPos) return;
125
- setPins((prev) => [
126
- ...prev,
127
- {
128
- id: draftPos.id,
129
- name: draftName,
130
- universe: draftUniverse,
131
- description: draftDescription,
132
- href: draftHref,
133
- xPct: draftPos.xPct,
134
- yPct: draftPos.yPct,
135
- accent: draftAccent,
136
- badge: draftBadge,
137
- buyText: draftBuyText,
138
- },
139
- ]);
140
- setDraftPos(null);
141
- setDraftName("");
142
- setDraftUniverse("");
143
- setDraftDescription("");
144
- setDraftHref("");
145
- setDraftBuyText("Shop Now");
146
- setDraftBadge("");
147
- setDraftAccent("#E8001C");
148
- }
149
-
150
- function deletePin(id: string) {
151
- setPins((prev) => prev.filter((p) => p.id !== id));
152
- }
153
-
154
- async function handleSave() {
155
- if (!imageUrl) return;
156
- setSaving(true);
157
- setError(null);
158
- setSuccess(false);
159
- try {
160
- await onSave({ imageUrl, imageAlt, active, pins });
161
- await onAfterSave?.();
162
- setSuccess(true);
163
- } catch {
164
- setError("Save failed. Check your connection and try again.");
165
- } finally {
166
- setSaving(false);
167
- }
168
- }
169
-
170
- const STEPS: { key: WizardStep; label: string }[] = [
171
- { key: "image", label: "Image" },
172
- { key: "place", label: "Place Pin" },
173
- { key: "details", label: "Pin Details" },
174
- { key: "review", label: "Review & Save" },
175
- ];
176
- const stepIndex = STEPS.findIndex((s) => s.key === step);
177
-
178
- return (
179
- <Div className="mx-auto max-w-3xl space-y-6">
180
- {error && (
181
- <Text className="rounded border border-red-200 bg-red-50 px-4 py-2 text-sm font-bold text-red-600">
182
- {error}
183
- </Text>
184
- )}
185
- {success && (
186
- <Text className="rounded border border-green-200 bg-green-50 px-4 py-2 text-sm font-bold text-green-700">
187
- Saved to database successfully!
188
- </Text>
189
- )}
190
-
191
- {/* Progress stepper */}
192
- <Div className="flex items-start">
193
- {STEPS.map((s, i) => (
194
- <Div key={s.key} className="flex flex-1 flex-col items-center">
195
- <Div className="flex w-full items-center">
196
- {i > 0 && (
197
- <Div
198
- className="h-0.5 flex-1"
199
- style={{
200
- background:
201
- i <= stepIndex
202
- ? "var(--color-black)"
203
- : "var(--border-ink)",
204
- }}
205
- />
206
- )}
207
- <Div
208
- className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-sm font-bold"
209
- style={{
210
- background:
211
- i < stepIndex
212
- ? "var(--color-black)"
213
- : i === stepIndex
214
- ? "var(--color-yellow)"
215
- : "var(--surface-elevated)",
216
- color:
217
- i < stepIndex
218
- ? "var(--color-yellow)"
219
- : "var(--color-black)",
220
- border:
221
- i <= stepIndex
222
- ? "2px solid var(--color-black)"
223
- : "2px solid var(--border-ink)",
224
- }}
225
- >
226
- {i < stepIndex ? "✓" : i + 1}
227
- </Div>
228
- {i < STEPS.length - 1 && (
229
- <Div
230
- className="h-0.5 flex-1"
231
- style={{
232
- background:
233
- i < stepIndex
234
- ? "var(--color-black)"
235
- : "var(--border-ink)",
236
- }}
237
- />
238
- )}
239
- </Div>
240
- <Span
241
- className="mt-1 text-center text-[10px] font-medium"
242
- style={{ color: "var(--color-muted)" }}
243
- >
244
- {s.label}
245
- </Span>
246
- </Div>
247
- ))}
248
- </Div>
249
-
250
- {/* ── Step 1: Upload Image ── */}
251
- {step === "image" && (
252
- <Div
253
- className="space-y-4 rounded-lg border-2 p-6"
254
- style={{
255
- borderColor: "var(--border-ink)",
256
- background: "var(--surface-elevated)",
257
- }}
258
- >
259
- <Heading level={2} className="text-lg font-bold">
260
- Upload Background Image
261
- </Heading>
262
- <Text className="text-sm" style={{ color: "var(--color-muted)" }}>
263
- Choose a wide panoramic image that shows all the characters. You
264
- will place pins on it in the next step.
265
- </Text>
266
-
267
- <Label
268
- className="flex cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors hover:opacity-80"
269
- style={{ borderColor: "var(--border-ink)" }}
270
- >
271
- <Span className="text-3xl">🖼</Span>
272
- <Span className="font-medium">
273
- {uploading ? "Uploading…" : "Click to choose image"}
274
- </Span>
275
- <Span className="text-xs" style={{ color: "var(--color-muted)" }}>
276
- JPG, PNG, WebP — wide landscape images work best
277
- </Span>
278
- <Input
279
- type="file"
280
- accept="image/*"
281
- className="hidden"
282
- onChange={handleImageUpload}
283
- disabled={uploading}
284
- />
285
- </Label>
286
-
287
- {imageUrl && (
288
- <Div className="space-y-1">
289
- <Div
290
- className="relative w-full overflow-hidden rounded-lg"
291
- style={{ paddingTop: "37.5%" }}
292
- >
293
- <Image
294
- src={imageUrl}
295
- alt={imageAlt}
296
- fill
297
- className="object-cover"
298
- sizes="680px"
299
- />
300
- </Div>
301
- <Text className="text-xs font-medium text-green-700">
302
- ✓ Image uploaded
303
- </Text>
304
- </Div>
305
- )}
306
-
307
- <Div className="flex flex-col gap-1">
308
- <Label className="text-sm font-bold">Image Alt Text</Label>
309
- <Input
310
- type="text"
311
- value={imageAlt}
312
- onChange={(e) => setImageAlt(e.target.value)}
313
- placeholder="DC, Marvel and Anime characters"
314
- className="rounded border-2 px-3 py-2 text-sm outline-none"
315
- style={{
316
- borderColor: "var(--border-ink)",
317
- background: "var(--surface-elevated)",
318
- color: "var(--color-black)",
319
- }}
320
- />
321
- </Div>
322
-
323
- <Label className="inline-flex cursor-pointer items-center gap-2 text-sm font-medium">
324
- <Input
325
- type="checkbox"
326
- checked={active}
327
- onChange={(e) => setActive(e.target.checked)}
328
- className="h-4 w-4 rounded"
329
- />
330
- Active (show on homepage)
331
- </Label>
332
-
333
- <Div
334
- className="flex items-center justify-end gap-3 border-t pt-4"
335
- style={{ borderColor: "var(--border-ink)" }}
336
- >
337
- {(initial?.pins?.length ?? 0) > 0 && (
338
- <Button
339
- type="button"
340
- onClick={() => setStep("review")}
341
- variant="ghost"
342
- className="px-4 py-2 text-sm font-medium rounded transition-opacity hover:opacity-70"
343
- style={{
344
- background: "transparent",
345
- color: "var(--color-black)",
346
- }}
347
- >
348
- Skip to Review
349
- </Button>
350
- )}
351
- <Button
352
- type="button"
353
- onClick={() => setStep("place")}
354
- disabled={!imageUrl || uploading}
355
- variant="primary"
356
- className="px-4 py-2 text-sm font-bold rounded transition-opacity disabled:opacity-50"
357
- style={{
358
- background: "var(--color-black)",
359
- color: "var(--color-yellow)",
360
- }}
361
- >
362
- Next: Place Pins →
363
- </Button>
364
- </Div>
365
- </Div>
366
- )}
367
-
368
- {/* ── Step 2: Place Pin ── */}
369
- {step === "place" && (
370
- <Div
371
- className="space-y-4 rounded-lg border-2 p-6"
372
- style={{
373
- borderColor: "var(--border-ink)",
374
- background: "var(--surface-elevated)",
375
- }}
376
- >
377
- <Heading level={2} className="text-lg font-bold">
378
- Place a Pin
379
- </Heading>
380
- <Text className="text-sm" style={{ color: "var(--color-muted)" }}>
381
- <strong>Click anywhere on the image</strong> to drop a pin, or enter
382
- exact coordinates below.
383
- </Text>
384
-
385
- <Div
386
- ref={containerRef}
387
- className="relative w-full overflow-hidden rounded-lg"
388
- style={{
389
- paddingTop: "56.25%",
390
- cursor: "crosshair",
391
- background: "#111",
392
- }}
393
- onClick={handleImageClick}
394
- >
395
- <Image
396
- src={imageUrl}
397
- alt={imageAlt}
398
- fill
399
- className="object-cover"
400
- sizes="(max-width: 680px) 100vw"
401
- />
402
-
403
- {pins.map((pin) => (
404
- <Div
405
- key={pin.id}
406
- className="pointer-events-none absolute"
407
- style={{
408
- left: `${pin.xPct}%`,
409
- top: `${pin.yPct}%`,
410
- transform: "translate(-50%, -50%)",
411
- zIndex: 10,
412
- }}
413
- >
414
- <Div
415
- className="flex items-center justify-center rounded-full text-xs font-bold text-white"
416
- style={{
417
- width: 24,
418
- height: 24,
419
- background: pin.accent || "#E8001C",
420
- border: "2px solid white",
421
- boxShadow: "0 1px 4px rgba(0,0,0,0.5)",
422
- }}
423
- >
424
- +
425
- </Div>
426
- {pin.name && (
427
- <Div
428
- className="pointer-events-none absolute left-7 top-1/2 -translate-y-1/2 whitespace-nowrap rounded px-1.5 py-0.5 text-[9px] font-bold text-white"
429
- style={{ background: "#0D0D0D" }}
430
- >
431
- {pin.name}
432
- </Div>
433
- )}
434
- </Div>
435
- ))}
436
-
437
- {draftPos && (
438
- <Div
439
- className="absolute"
440
- style={{
441
- left: `${draftPos.xPct}%`,
442
- top: `${draftPos.yPct}%`,
443
- transform: "translate(-50%, -50%)",
444
- zIndex: 20,
445
- }}
446
- >
447
- <Span
448
- className="absolute animate-ping rounded-full"
449
- style={{
450
- inset: -6,
451
- background: "rgba(255,228,0,0.4)",
452
- pointerEvents: "none",
453
- }}
454
- />
455
- <Div
456
- className="relative flex items-center justify-center rounded-full font-bold"
457
- style={{
458
- width: 32,
459
- height: 32,
460
- background: "var(--color-yellow)",
461
- border: "3px solid var(--color-black)",
462
- boxShadow: "0 2px 8px rgba(0,0,0,0.55)",
463
- color: "var(--color-black)",
464
- fontSize: 18,
465
- }}
466
- >
467
-
468
- </Div>
469
- <Div
470
- className="pointer-events-none absolute left-9 top-1/2 -translate-y-1/2 whitespace-nowrap rounded px-2 py-0.5 text-[10px] font-bold"
471
- style={{
472
- background: "var(--color-black)",
473
- color: "var(--color-yellow)",
474
- }}
475
- >
476
- NEW PIN
477
- </Div>
478
- </Div>
479
- )}
480
- </Div>
481
-
482
- <Div className="grid grid-cols-2 gap-3">
483
- {(
484
- [
485
- {
486
- label: "X Position (%)",
487
- field: "xPct",
488
- value: draftPos?.xPct ?? "",
489
- onChange: (v: number) =>
490
- setDraftPos((prev) => ({
491
- id: prev?.id ?? randomId(),
492
- xPct: Math.max(1, Math.min(99, v)),
493
- yPct: prev?.yPct ?? 50,
494
- })),
495
- },
496
- {
497
- label: "Y Position (%)",
498
- field: "yPct",
499
- value: draftPos?.yPct ?? "",
500
- onChange: (v: number) =>
501
- setDraftPos((prev) => ({
502
- id: prev?.id ?? randomId(),
503
- xPct: prev?.xPct ?? 50,
504
- yPct: Math.max(1, Math.min(99, v)),
505
- })),
506
- },
507
- ] as const
508
- ).map(({ label, field, value, onChange }) => (
509
- <Div key={field} className="flex flex-col gap-1">
510
- <Label className="text-sm font-bold">{label}</Label>
511
- <Input
512
- type="number"
513
- min={1}
514
- max={99}
515
- step={0.1}
516
- value={value}
517
- placeholder="e.g. 42.5"
518
- onChange={(e) => {
519
- const v = parseFloat(e.target.value);
520
- if (!isNaN(v)) onChange(v);
521
- }}
522
- className="rounded border-2 px-3 py-2 text-sm outline-none"
523
- style={{
524
- borderColor: "var(--border-ink)",
525
- background: "var(--surface-elevated)",
526
- color: "var(--color-black)",
527
- }}
528
- />
529
- </Div>
530
- ))}
531
- </Div>
532
-
533
- {pins.length > 0 && (
534
- <Text className="text-xs" style={{ color: "var(--color-muted)" }}>
535
- {pins.length} pin{pins.length !== 1 ? "s" : ""} already placed on
536
- this image.
537
- </Text>
538
- )}
539
-
540
- <Div
541
- className="flex items-center justify-between border-t pt-4"
542
- style={{ borderColor: "var(--border-ink)" }}
543
- >
544
- <Button
545
- type="button"
546
- onClick={() => setStep("image")}
547
- variant="ghost"
548
- className="px-4 py-2 text-sm font-medium rounded transition-opacity hover:opacity-70"
549
- style={{ background: "transparent", color: "var(--color-black)" }}
550
- >
551
- ← Back
552
- </Button>
553
- <Div className="flex items-center gap-3">
554
- {pins.length > 0 && (
555
- <Button
556
- type="button"
557
- onClick={() => setStep("review")}
558
- variant="outline"
559
- className="px-4 py-2 text-sm font-bold rounded transition-opacity"
560
- style={{
561
- background: "var(--surface-warm)",
562
- color: "var(--color-black)",
563
- border: "2px solid var(--border-ink)",
564
- }}
565
- >
566
- Done Adding Pins
567
- </Button>
568
- )}
569
- <Button
570
- type="button"
571
- onClick={() => setStep("details")}
572
- disabled={!draftPos}
573
- variant="primary"
574
- className="px-4 py-2 text-sm font-bold rounded transition-opacity disabled:opacity-50"
575
- style={{
576
- background: "var(--color-black)",
577
- color: "var(--color-yellow)",
578
- }}
579
- >
580
- Continue: Add Details →
581
- </Button>
582
- </Div>
583
- </Div>
584
- </Div>
585
- )}
586
-
587
- {/* ── Step 3: Pin Details ── */}
588
- {step === "details" && (
589
- <Div
590
- className="space-y-4 rounded-lg border-2 p-6"
591
- style={{
592
- borderColor: "var(--border-ink)",
593
- background: "var(--surface-elevated)",
594
- }}
595
- >
596
- <Heading level={2} className="text-lg font-bold">
597
- Pin Details
598
- </Heading>
599
- <Text className="text-sm" style={{ color: "var(--color-muted)" }}>
600
- Fill in the details for the pin at{" "}
601
- <strong>
602
- {draftPos?.xPct}%, {draftPos?.yPct}%
603
- </strong>
604
- .
605
- </Text>
606
-
607
- <Div className="grid grid-cols-2 gap-3">
608
- {(
609
- [
610
- {
611
- label: "Name *",
612
- value: draftName,
613
- onChange: setDraftName,
614
- placeholder: "SPIDER-MAN",
615
- },
616
- {
617
- label: "Universe / Category *",
618
- value: draftUniverse,
619
- onChange: setDraftUniverse,
620
- placeholder: "Marvel",
621
- },
622
- ] as const
623
- ).map(({ label, value, onChange, placeholder }) => (
624
- <Div key={label} className="flex flex-col gap-1">
625
- <Label className="text-sm font-bold">{label}</Label>
626
- <Input
627
- type="text"
628
- value={value}
629
- onChange={(e) =>
630
- (onChange as (v: string) => void)(e.target.value)
631
- }
632
- placeholder={placeholder}
633
- className="rounded border-2 px-3 py-2 text-sm outline-none"
634
- style={{
635
- borderColor: "var(--border-ink)",
636
- background: "var(--surface-elevated)",
637
- color: "var(--color-black)",
638
- }}
639
- />
640
- </Div>
641
- ))}
642
- </Div>
643
-
644
- <Div className="flex flex-col gap-1">
645
- <Label className="text-sm font-bold">Description *</Label>
646
- <Textarea
647
- rows={3}
648
- value={draftDescription}
649
- onChange={(e) => setDraftDescription(e.target.value)}
650
- className="resize-none rounded border-2 px-3 py-2 text-sm outline-none"
651
- style={{
652
- borderColor: "var(--border-ink)",
653
- background: "var(--surface-elevated)",
654
- color: "var(--color-black)",
655
- }}
656
- placeholder="Short description shown in the popup…"
657
- />
658
- </Div>
659
-
660
- <Div className="flex flex-col gap-1">
661
- <Label className="text-sm font-bold">Link (href) *</Label>
662
- <Input
663
- type="text"
664
- value={draftHref}
665
- onChange={(e) => setDraftHref(e.target.value)}
666
- placeholder="/franchise/marvel"
667
- className="rounded border-2 px-3 py-2 text-sm outline-none"
668
- style={{
669
- borderColor: "var(--border-ink)",
670
- background: "var(--surface-elevated)",
671
- color: "var(--color-black)",
672
- }}
673
- />
674
- </Div>
675
-
676
- <Div className="grid grid-cols-2 gap-3">
677
- {(
678
- [
679
- {
680
- label: "Button Text *",
681
- value: draftBuyText,
682
- onChange: setDraftBuyText,
683
- placeholder: "Get Spider-Man Figures",
684
- },
685
- {
686
- label: "Badge Label",
687
- value: draftBadge,
688
- onChange: setDraftBadge,
689
- placeholder: "MARVEL",
690
- },
691
- ] as const
692
- ).map(({ label, value, onChange, placeholder }) => (
693
- <Div key={label} className="flex flex-col gap-1">
694
- <Label className="text-sm font-bold">{label}</Label>
695
- <Input
696
- type="text"
697
- value={value}
698
- onChange={(e) =>
699
- (onChange as (v: string) => void)(e.target.value)
700
- }
701
- placeholder={placeholder}
702
- className="rounded border-2 px-3 py-2 text-sm outline-none"
703
- style={{
704
- borderColor: "var(--border-ink)",
705
- background: "var(--surface-elevated)",
706
- color: "var(--color-black)",
707
- }}
708
- />
709
- </Div>
710
- ))}
711
- </Div>
712
-
713
- <Div className="flex items-end gap-3">
714
- <Div className="flex-1 flex flex-col gap-1">
715
- <Label className="text-sm font-bold">Accent Colour (hex)</Label>
716
- <Input
717
- type="text"
718
- value={draftAccent}
719
- onChange={(e) => setDraftAccent(e.target.value)}
720
- placeholder="#E8001C"
721
- className="rounded border-2 px-3 py-2 text-sm outline-none"
722
- style={{
723
- borderColor: "var(--border-ink)",
724
- background: "var(--surface-elevated)",
725
- color: "var(--color-black)",
726
- }}
727
- />
728
- </Div>
729
- <Input
730
- type="color"
731
- value={draftAccent}
732
- onChange={(e) => setDraftAccent(e.target.value)}
733
- className="mb-0.5 h-10 w-10 cursor-pointer rounded border-2"
734
- style={{ borderColor: "var(--border-ink)" }}
735
- title="Pick colour"
736
- />
737
- </Div>
738
-
739
- <Div
740
- className="flex items-center justify-between border-t pt-4"
741
- style={{ borderColor: "var(--border-ink)" }}
742
- >
743
- <Button
744
- type="button"
745
- onClick={() => setStep("place")}
746
- variant="ghost"
747
- className="px-4 py-2 text-sm font-medium rounded transition-opacity hover:opacity-70"
748
- style={{ background: "transparent", color: "var(--color-black)" }}
749
- >
750
- ← Back
751
- </Button>
752
- <Div className="flex items-center gap-3">
753
- <Button
754
- type="button"
755
- disabled={!draftName || !draftHref}
756
- onClick={() => {
757
- commitDraftPin();
758
- setStep("review");
759
- }}
760
- variant="outline"
761
- className="px-4 py-2 text-sm font-bold rounded transition-opacity disabled:opacity-50"
762
- style={{
763
- background: "var(--surface-warm)",
764
- color: "var(--color-black)",
765
- border: "2px solid var(--border-ink)",
766
- }}
767
- >
768
- Save Pin &amp; Finish
769
- </Button>
770
- <Button
771
- type="button"
772
- disabled={!draftName || !draftHref}
773
- onClick={() => {
774
- commitDraftPin();
775
- setStep("place");
776
- }}
777
- variant="primary"
778
- className="px-4 py-2 text-sm font-bold rounded transition-opacity disabled:opacity-50"
779
- style={{
780
- background: "var(--color-black)",
781
- color: "var(--color-yellow)",
782
- }}
783
- >
784
- Save Pin &amp; Add Another →
785
- </Button>
786
- </Div>
787
- </Div>
788
- </Div>
789
- )}
790
-
791
- {/* ── Step 4: Review & Save ── */}
792
- {step === "review" && (
793
- <Div
794
- className="space-y-4 rounded-lg border-2 p-6"
795
- style={{
796
- borderColor: "var(--border-ink)",
797
- background: "var(--surface-elevated)",
798
- }}
799
- >
800
- <Div className="flex items-center justify-between">
801
- <Heading level={2} className="text-lg font-bold">
802
- Review &amp; Save
803
- </Heading>
804
- <Span
805
- className="rounded-full px-3 py-1 text-sm font-bold"
806
- style={{ background: "var(--surface-warm)" }}
807
- >
808
- {pins.length} pin{pins.length !== 1 ? "s" : ""}
809
- </Span>
810
- </Div>
811
-
812
- {/* Preview image */}
813
- <Div
814
- className="relative w-full overflow-hidden rounded-lg"
815
- style={{ paddingTop: "56.25%", background: "#111" }}
816
- >
817
- <Image
818
- src={imageUrl}
819
- alt={imageAlt}
820
- fill
821
- className="object-cover"
822
- sizes="(max-width: 680px) 100vw"
823
- />
824
- {pins.map((pin) => (
825
- <Div
826
- key={pin.id}
827
- className="pointer-events-none absolute"
828
- style={{
829
- left: `${pin.xPct}%`,
830
- top: `${pin.yPct}%`,
831
- transform: "translate(-50%, -50%)",
832
- zIndex: 10,
833
- }}
834
- >
835
- <Div
836
- className="flex items-center justify-center rounded-full text-xs font-bold text-white"
837
- style={{
838
- width: 28,
839
- height: 28,
840
- background: pin.accent || "#E8001C",
841
- border: "2px solid white",
842
- boxShadow: "0 2px 6px rgba(0,0,0,0.55)",
843
- }}
844
- >
845
- +
846
- </Div>
847
- {pin.name && (
848
- <Div
849
- className="pointer-events-none absolute left-8 top-1/2 -translate-y-1/2 whitespace-nowrap rounded px-1.5 py-0.5 text-[9px] font-bold text-white"
850
- style={{ background: "#0D0D0D" }}
851
- >
852
- {pin.name}
853
- </Div>
854
- )}
855
- </Div>
856
- ))}
857
- </Div>
858
-
859
- {/* Pin list */}
860
- {pins.length > 0 ? (
861
- <Ul
862
- className="divide-y rounded-lg border"
863
- style={{ borderColor: "var(--border-ink)" }}
864
- >
865
- {pins.map((pin, i) => (
866
- <Li key={pin.id} className="flex items-center gap-3 px-4 py-3">
867
- <Span
868
- className="flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold text-white"
869
- style={{ background: pin.accent || "#E8001C" }}
870
- >
871
- {i + 1}
872
- </Span>
873
- <Div className="min-w-0 flex-1">
874
- <Text className="truncate text-sm font-bold">
875
- {pin.name || (
876
- <Span
877
- className="italic"
878
- style={{ color: "var(--color-muted)" }}
879
- >
880
- Unnamed
881
- </Span>
882
- )}
883
- </Text>
884
- <Text
885
- className="text-xs"
886
- style={{ color: "var(--color-muted)" }}
887
- >
888
- {pin.universe} · {pin.xPct.toFixed(0)}%,{" "}
889
- {pin.yPct.toFixed(0)}%
890
- </Text>
891
- </Div>
892
- <Button
893
- type="button"
894
- onClick={() => deletePin(pin.id)}
895
- variant="ghost"
896
- className="shrink-0 rounded p-1 text-xs text-red-500 hover:bg-red-50"
897
- title="Remove pin"
898
- >
899
-
900
- </Button>
901
- </Li>
902
- ))}
903
- </Ul>
904
- ) : (
905
- <Div
906
- className="rounded-lg border-2 border-dashed p-8 text-center text-sm"
907
- style={{
908
- borderColor: "var(--border-ink)",
909
- color: "var(--color-muted)",
910
- }}
911
- >
912
- No pins yet — add some using the button below.
913
- </Div>
914
- )}
915
-
916
- {/* Image settings */}
917
- <details
918
- className="rounded-lg border p-3"
919
- style={{ borderColor: "var(--border-ink)" }}
920
- >
921
- <summary className="cursor-pointer text-sm font-medium">
922
- Image Settings
923
- </summary>
924
- <Div className="mt-3 space-y-3">
925
- <Label
926
- className="inline-flex cursor-pointer items-center gap-2 rounded border-2 border-dashed px-3 py-1.5 text-sm font-medium transition-colors hover:opacity-80"
927
- style={{ borderColor: "var(--border-ink)" }}
928
- >
929
- {uploading ? "Uploading…" : "Replace Image"}
930
- <Input
931
- type="file"
932
- accept="image/*"
933
- className="hidden"
934
- onChange={handleImageUpload}
935
- disabled={uploading}
936
- />
937
- </Label>
938
- <Div className="flex flex-col gap-1">
939
- <Label className="text-sm font-bold">Image Alt Text</Label>
940
- <Input
941
- type="text"
942
- value={imageAlt}
943
- onChange={(e) => setImageAlt(e.target.value)}
944
- className="rounded border-2 px-3 py-2 text-sm outline-none"
945
- style={{
946
- borderColor: "var(--border-ink)",
947
- background: "var(--surface-elevated)",
948
- color: "var(--color-black)",
949
- }}
950
- />
951
- </Div>
952
- <Label className="inline-flex cursor-pointer items-center gap-2 text-sm font-medium">
953
- <Input
954
- type="checkbox"
955
- checked={active}
956
- onChange={(e) => setActive(e.target.checked)}
957
- className="h-4 w-4 rounded"
958
- />
959
- Active (show on homepage)
960
- </Label>
961
- </Div>
962
- </details>
963
-
964
- <Div
965
- className="flex items-center justify-between border-t pt-4"
966
- style={{ borderColor: "var(--border-ink)" }}
967
- >
968
- <Button
969
- type="button"
970
- onClick={() => {
971
- setDraftPos(null);
972
- setStep("place");
973
- }}
974
- variant="outline"
975
- className="px-4 py-2 text-sm font-bold rounded transition-opacity"
976
- style={{
977
- background: "var(--surface-warm)",
978
- color: "var(--color-black)",
979
- border: "2px solid var(--border-ink)",
980
- }}
981
- >
982
- + Add Another Pin
983
- </Button>
984
- <Button
985
- type="button"
986
- onClick={handleSave}
987
- disabled={!imageUrl || saving || pins.length === 0}
988
- variant="primary"
989
- className="px-4 py-2 text-sm font-bold rounded transition-opacity disabled:opacity-50"
990
- style={{
991
- background: "var(--color-black)",
992
- color: "var(--color-yellow)",
993
- }}
994
- >
995
- {saving ? "Saving…" : "Save to Database"}
996
- </Button>
997
- </Div>
998
- </Div>
999
- )}
1000
- </Div>
1001
- );
1002
- }