@mohasinac/appkit 2.7.56 → 2.7.57

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 (276) hide show
  1. package/dist/_internal/shared/actions/action-registry.js +31 -5
  2. package/dist/client.d.ts +1 -3
  3. package/dist/client.js +1 -2
  4. package/dist/constants/field-names.d.ts +3 -0
  5. package/dist/constants/field-names.js +3 -0
  6. package/dist/features/about/components/FAQPageView.js +2 -2
  7. package/dist/features/about/components/FeesView.js +1 -1
  8. package/dist/features/about/components/PolicyPageView.js +1 -1
  9. package/dist/features/about/components/PublicProfileView.js +1 -1
  10. package/dist/features/account/components/AddressesIndexListing.js +1 -1
  11. package/dist/features/account/components/MessagesView.js +1 -1
  12. package/dist/features/account/components/NotificationPreferencesPanel.js +12 -3
  13. package/dist/features/account/components/UserOffersPanel.js +2 -2
  14. package/dist/features/account/components/UserSidebar.js +3 -3
  15. package/dist/features/account/components/UserSupportView.js +1 -1
  16. package/dist/features/admin/components/AdminAllEventEntriesView.js +1 -1
  17. package/dist/features/admin/components/AdminBidsView.js +5 -1
  18. package/dist/features/admin/components/AdminBlogView.js +6 -1
  19. package/dist/features/admin/components/AdminBrandsView.js +6 -1
  20. package/dist/features/admin/components/AdminBundleEditorView.js +13 -9
  21. package/dist/features/admin/components/AdminBundlesView.js +3 -1
  22. package/dist/features/admin/components/AdminCarouselEditorView.js +7 -8
  23. package/dist/features/admin/components/AdminCarouselView.js +4 -2
  24. package/dist/features/admin/components/AdminCartsView.js +1 -1
  25. package/dist/features/admin/components/AdminCategoriesView.js +6 -1
  26. package/dist/features/admin/components/AdminContactView.js +3 -1
  27. package/dist/features/admin/components/AdminCouponsView.js +4 -2
  28. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -1
  29. package/dist/features/admin/components/AdminFaqsView.js +3 -1
  30. package/dist/features/admin/components/AdminFeatureFlagsView.js +1 -1
  31. package/dist/features/admin/components/AdminFeaturesView.js +4 -0
  32. package/dist/features/admin/components/AdminMediaView.js +10 -5
  33. package/dist/features/admin/components/AdminNavigationView.js +1 -1
  34. package/dist/features/admin/components/AdminNewsletterView.js +3 -1
  35. package/dist/features/admin/components/AdminNotificationsView.js +6 -1
  36. package/dist/features/admin/components/AdminOrdersView.js +10 -1
  37. package/dist/features/admin/components/AdminPayoutsView.js +5 -1
  38. package/dist/features/admin/components/AdminPrizeDrawsView.js +4 -0
  39. package/dist/features/admin/components/AdminProductsView.js +13 -1
  40. package/dist/features/admin/components/AdminReviewsView.js +6 -1
  41. package/dist/features/admin/components/AdminScammersView.js +1 -1
  42. package/dist/features/admin/components/AdminSectionsView.js +1 -1
  43. package/dist/features/admin/components/AdminSessionsView.js +5 -1
  44. package/dist/features/admin/components/AdminSidebar.js +3 -3
  45. package/dist/features/admin/components/AdminSiteSettingsView.js +1 -1
  46. package/dist/features/admin/components/AdminStoreEditorView.js +1 -1
  47. package/dist/features/admin/components/AdminStoresView.js +6 -1
  48. package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
  49. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  50. package/dist/features/admin/components/AdminSupportTicketsView.js +1 -1
  51. package/dist/features/admin/components/AdminTeamView.js +3 -1
  52. package/dist/features/admin/components/AdminUserEditorView.js +1 -1
  53. package/dist/features/admin/components/AdminUsersView.js +5 -1
  54. package/dist/features/admin/components/AdminViewCards.js +2 -2
  55. package/dist/features/admin/constants/filter-tabs.d.ts +9 -0
  56. package/dist/features/admin/constants/filter-tabs.js +3 -0
  57. package/dist/features/auctions/components/AuctionBottomActions.d.ts +7 -0
  58. package/dist/features/auctions/components/AuctionBottomActions.js +24 -0
  59. package/dist/features/auctions/components/AuctionDetailPageView.js +7 -7
  60. package/dist/features/auctions/components/AuctionsListView.js +1 -1
  61. package/dist/features/auctions/components/MarketplaceAuctionGrid.js +1 -1
  62. package/dist/features/auctions/components/PlaceBidFormClient.js +1 -1
  63. package/dist/features/auth/components/LoginForm.js +1 -1
  64. package/dist/features/auth/components/VerifyEmailView.js +2 -2
  65. package/dist/features/before-after/components/BeforeAfterGallery.js +1 -1
  66. package/dist/features/blog/components/BlogFeaturedCard.js +1 -1
  67. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  68. package/dist/features/blog/components/BlogListView.js +2 -2
  69. package/dist/features/blog/components/BlogPostView.js +8 -8
  70. package/dist/features/cart/components/CartDrawer.js +1 -1
  71. package/dist/features/cart/repository/cart.repository.js +11 -4
  72. package/dist/features/cart/schemas/firestore.d.ts +3 -0
  73. package/dist/features/categories/components/BrandDetailPageView.js +1 -1
  74. package/dist/features/categories/components/CategoriesIndexListing.js +1 -1
  75. package/dist/features/categories/components/CategoryDetailPageView.js +39 -3
  76. package/dist/features/categories/components/CategoryDetailTabs.d.ts +4 -1
  77. package/dist/features/categories/components/CategoryDetailTabs.js +7 -2
  78. package/dist/features/categories/components/CategoryGrid.js +1 -1
  79. package/dist/features/categories/components/CategoryProductsView.js +1 -1
  80. package/dist/features/categories/components/CategoryStoresListing.d.ts +5 -0
  81. package/dist/features/categories/components/CategoryStoresListing.js +11 -0
  82. package/dist/features/categories/components/CategoryTableColumns.js +2 -2
  83. package/dist/features/categories/components/CategoryTree.js +1 -1
  84. package/dist/features/categories/components/index.d.ts +2 -0
  85. package/dist/features/categories/components/index.js +1 -0
  86. package/dist/features/checkout/components/CheckoutStepper.js +1 -1
  87. package/dist/features/classified/components/ClassifiedIndexListing.js +2 -0
  88. package/dist/features/classified/components/ClassifiedListView.js +1 -1
  89. package/dist/features/contact/components/ContactInfoSidebar.js +1 -1
  90. package/dist/features/digital-codes/components/DigitalCodesIndexListing.js +2 -0
  91. package/dist/features/digital-codes/components/DigitalCodesListView.js +1 -1
  92. package/dist/features/events/components/AdminEventsView.js +5 -1
  93. package/dist/features/events/components/EventCard.js +1 -1
  94. package/dist/features/events/components/EventPollWidget.js +1 -1
  95. package/dist/features/events/components/EventStatusBadge.js +5 -5
  96. package/dist/features/events/components/EventsIndexListing.js +1 -1
  97. package/dist/features/events/components/EventsListView.js +2 -2
  98. package/dist/features/events/components/SpinWheelView.js +4 -2
  99. package/dist/features/filters/AsyncFacetSection.js +3 -3
  100. package/dist/features/filters/FilterFacetSection.js +5 -5
  101. package/dist/features/filters/RangeFilter.js +1 -1
  102. package/dist/features/forms/Input.js +2 -2
  103. package/dist/features/forms/Select.js +1 -1
  104. package/dist/features/forms/Slider.js +1 -1
  105. package/dist/features/forms/Textarea.js +1 -1
  106. package/dist/features/forms/utils.d.ts +1 -1
  107. package/dist/features/forms/utils.js +1 -1
  108. package/dist/features/history/hooks/useHistory.js +23 -10
  109. package/dist/features/homepage/components/AdvertisementBanner.js +2 -2
  110. package/dist/features/homepage/components/FeaturedResultsSection.js +1 -1
  111. package/dist/features/homepage/components/HeroSection.js +1 -1
  112. package/dist/features/homepage/components/NewsletterSection.js +1 -1
  113. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  114. package/dist/features/live/components/LiveItemsIndexListing.js +2 -0
  115. package/dist/features/live/components/LiveItemsListView.js +1 -1
  116. package/dist/features/orders/components/OrdersList.js +12 -12
  117. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
  118. package/dist/features/pre-orders/components/PreOrderActionsClient.js +1 -1
  119. package/dist/features/pre-orders/components/PreOrderBadge.js +5 -5
  120. package/dist/features/pre-orders/components/PreOrderBottomActions.d.ts +5 -0
  121. package/dist/features/pre-orders/components/PreOrderBottomActions.js +22 -0
  122. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +5 -5
  123. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +47 -0
  124. package/dist/features/pre-orders/components/PreOrdersListView.js +1 -1
  125. package/dist/features/pre-orders/components/PreorderCard.js +3 -3
  126. package/dist/features/products/components/AuctionsIndexListing.js +23 -0
  127. package/dist/features/products/components/BidHistory.js +2 -2
  128. package/dist/features/products/components/CompareOverlay.js +1 -1
  129. package/dist/features/products/components/CustomFieldsEditor.js +1 -1
  130. package/dist/features/products/components/CustomSectionTabContent.js +1 -1
  131. package/dist/features/products/components/CustomSectionsEditor.js +1 -1
  132. package/dist/features/products/components/GroupSettingsPanel.js +2 -2
  133. package/dist/features/products/components/MakeOfferButton.js +1 -1
  134. package/dist/features/products/components/PrizeDrawBottomActions.d.ts +6 -0
  135. package/dist/features/products/components/PrizeDrawBottomActions.js +24 -0
  136. package/dist/features/products/components/PrizeDrawDetailPageView.js +3 -5
  137. package/dist/features/products/components/PrizeDrawEntryActions.js +5 -18
  138. package/dist/features/products/components/PrizeRevealModal.js +5 -2
  139. package/dist/features/products/components/ProductDetailActions.d.ts +6 -1
  140. package/dist/features/products/components/ProductDetailActions.js +36 -6
  141. package/dist/features/products/components/ProductDetailPageView.js +17 -16
  142. package/dist/features/products/components/ProductGalleryClient.js +1 -1
  143. package/dist/features/products/components/ProductGrid.js +6 -6
  144. package/dist/features/products/components/ProductTabs.js +1 -1
  145. package/dist/features/products/components/ProductTabsShell.js +1 -1
  146. package/dist/features/products/components/ProductsIndexListing.js +47 -0
  147. package/dist/features/products/components/RelatedProducts.js +1 -1
  148. package/dist/features/products/components/ShowGroupSection.js +1 -1
  149. package/dist/features/products/components/SublistingCarouselSection.js +1 -1
  150. package/dist/features/products/components/SublistingCategorySelect.js +1 -1
  151. package/dist/features/products/components/index.d.ts +0 -2
  152. package/dist/features/products/components/index.js +0 -1
  153. package/dist/features/products/constants/action-defs.d.ts +7 -0
  154. package/dist/features/products/constants/action-defs.js +14 -0
  155. package/dist/features/products/constants/listing-tabs.d.ts +6 -0
  156. package/dist/features/products/constants/listing-tabs.js +1 -0
  157. package/dist/features/promotions/components/CouponCard.js +2 -2
  158. package/dist/features/promotions/components/CouponsIndexListing.js +2 -2
  159. package/dist/features/reviews/components/ReviewDetailPageView.js +1 -1
  160. package/dist/features/reviews/components/ReviewDetailShell.js +3 -3
  161. package/dist/features/reviews/components/ReviewModal.js +2 -2
  162. package/dist/features/reviews/components/ReviewSummary.js +1 -1
  163. package/dist/features/reviews/components/ReviewsIndexListing.js +1 -1
  164. package/dist/features/reviews/components/ReviewsList.js +1 -1
  165. package/dist/features/seller/components/SellerAddressesView.js +4 -3
  166. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +1 -1
  167. package/dist/features/seller/components/SellerAuctionsView.js +10 -3
  168. package/dist/features/seller/components/SellerBidsView.js +22 -7
  169. package/dist/features/seller/components/SellerBundlesView.js +10 -3
  170. package/dist/features/seller/components/SellerClassifiedView.js +10 -3
  171. package/dist/features/seller/components/SellerCouponsView.js +13 -4
  172. package/dist/features/seller/components/SellerDigitalCodesView.js +10 -3
  173. package/dist/features/seller/components/SellerGoogleReviewsView.js +10 -5
  174. package/dist/features/seller/components/SellerGroupedListingsView.js +2 -0
  175. package/dist/features/seller/components/SellerLiveView.js +10 -3
  176. package/dist/features/seller/components/SellerOffersPanel.js +2 -2
  177. package/dist/features/seller/components/SellerOffersView.js +1 -1
  178. package/dist/features/seller/components/SellerOrdersView.js +40 -17
  179. package/dist/features/seller/components/SellerPayoutMethodsView.js +13 -4
  180. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  181. package/dist/features/seller/components/SellerPreOrdersView.js +7 -2
  182. package/dist/features/seller/components/SellerPrizeDrawsView.js +7 -2
  183. package/dist/features/seller/components/SellerProductShell.js +27 -9
  184. package/dist/features/seller/components/SellerProductsCards.js +2 -1
  185. package/dist/features/seller/components/SellerProductsView.js +21 -8
  186. package/dist/features/seller/components/SellerReviewsView.js +8 -0
  187. package/dist/features/seller/components/SellerShippingConfigsView.js +13 -4
  188. package/dist/features/seller/components/SellerSidebar.js +2 -2
  189. package/dist/features/seller/components/SellerStoreCategoriesView.js +10 -3
  190. package/dist/features/seller/components/SellerTemplatesView.js +19 -6
  191. package/dist/features/shell/StepForm.js +9 -3
  192. package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
  193. package/dist/features/site-settings/components/NavPermissionsManager.js +1 -1
  194. package/dist/features/stores/components/InteractiveStoreCard.js +1 -1
  195. package/dist/features/stores/components/StoreDetailLayoutView.js +1 -1
  196. package/dist/features/stores/components/StoreReviewsListing.js +1 -1
  197. package/dist/features/stores/components/StoresIndexListing.js +17 -1
  198. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
  199. package/dist/features/wishlist/components/WishlistPage.js +2 -2
  200. package/dist/features/wishlist/hooks/useWishlistToggle.js +6 -1
  201. package/dist/index.d.ts +3 -2
  202. package/dist/index.js +6 -3
  203. package/dist/react/hooks/use-action-dispatch.d.ts +5 -0
  204. package/dist/react/hooks/use-action-dispatch.js +10 -0
  205. package/dist/seed/cart-seed-data.js +50 -3
  206. package/dist/seed/categories-seed-data.js +80 -16
  207. package/dist/seed/index.d.ts +3 -0
  208. package/dist/seed/index.js +3 -0
  209. package/dist/seed/manifest.js +15 -1
  210. package/dist/seed/products-classifieds-seed-data.d.ts +10 -0
  211. package/dist/seed/products-classifieds-seed-data.js +197 -0
  212. package/dist/seed/products-digital-codes-seed-data.d.ts +10 -0
  213. package/dist/seed/products-digital-codes-seed-data.js +204 -0
  214. package/dist/seed/products-live-items-seed-data.d.ts +13 -0
  215. package/dist/seed/products-live-items-seed-data.js +190 -0
  216. package/dist/styles.css +16 -1
  217. package/dist/tailwind-utilities.css +1 -1
  218. package/dist/tokens/index.d.ts +3 -3
  219. package/dist/tokens/index.js +3 -3
  220. package/dist/ui/DataTable.js +3 -3
  221. package/dist/ui/components/Button.style.css +15 -0
  222. package/dist/ui/components/Input.js +1 -1
  223. package/dist/ui/components/ListingToolbar.js +1 -1
  224. package/dist/ui/components/Select.js +1 -1
  225. package/dist/ui/components/StatsGrid.js +1 -1
  226. package/dist/ui/index.d.ts +0 -4
  227. package/dist/ui/index.js +0 -2
  228. package/package.json +1 -1
  229. package/dist/_internal/client/features/seller/print-center/InventoryLabel.d.ts +0 -12
  230. package/dist/_internal/client/features/seller/print-center/InventoryLabel.js +0 -49
  231. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.d.ts +0 -7
  232. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.js +0 -32
  233. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.d.ts +0 -28
  234. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.js +0 -33
  235. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.d.ts +0 -12
  236. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.js +0 -30
  237. package/dist/_internal/client/features/seller/print-center/PrintCenterView.d.ts +0 -12
  238. package/dist/_internal/client/features/seller/print-center/PrintCenterView.js +0 -102
  239. package/dist/_internal/client/features/seller/print-center/PrintGrid.d.ts +0 -12
  240. package/dist/_internal/client/features/seller/print-center/PrintGrid.js +0 -13
  241. package/dist/_internal/client/features/seller/print-center/StoreCard.d.ts +0 -19
  242. package/dist/_internal/client/features/seller/print-center/StoreCard.js +0 -30
  243. package/dist/_internal/client/features/seller/print-center/WebsiteCard.d.ts +0 -11
  244. package/dist/_internal/client/features/seller/print-center/WebsiteCard.js +0 -25
  245. package/dist/_internal/client/features/seller/print-center/index.d.ts +0 -11
  246. package/dist/_internal/client/features/seller/print-center/index.js +0 -10
  247. package/dist/_internal/client/features/seller/print-center/types.d.ts +0 -20
  248. package/dist/_internal/client/features/seller/print-center/types.js +0 -20
  249. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.d.ts +0 -18
  250. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.js +0 -76
  251. package/dist/features/account/repository/address.repository.d.ts +0 -17
  252. package/dist/features/account/repository/address.repository.js +0 -184
  253. package/dist/features/auctions/components/AuctionCard.d.ts +0 -29
  254. package/dist/features/auctions/components/AuctionCard.js +0 -38
  255. package/dist/features/categories/components/BundleAddToCartCta.d.ts +0 -16
  256. package/dist/features/categories/components/BundleAddToCartCta.js +0 -54
  257. package/dist/features/categories/components/CategoriesListView.d.ts +0 -31
  258. package/dist/features/categories/components/CategoriesListView.js +0 -27
  259. package/dist/features/products/components/AuctionsView.d.ts +0 -6
  260. package/dist/features/products/components/AuctionsView.js +0 -5
  261. package/dist/features/products/components/BuyBar.d.ts +0 -21
  262. package/dist/features/products/components/BuyBar.js +0 -19
  263. package/dist/features/products/components/PreOrdersView.d.ts +0 -6
  264. package/dist/features/products/components/PreOrdersView.js +0 -5
  265. package/dist/features/reviews/components/ReviewsListView.d.ts +0 -31
  266. package/dist/features/reviews/components/ReviewsListView.js +0 -16
  267. package/dist/features/stores/components/StoresListView.d.ts +0 -19
  268. package/dist/features/stores/components/StoresListView.js +0 -25
  269. package/dist/features/stores/repository/store-address.repository.d.ts +0 -55
  270. package/dist/features/stores/repository/store-address.repository.js +0 -187
  271. package/dist/ui/components/BulkActionsBar.d.ts +0 -18
  272. package/dist/ui/components/BulkActionsBar.js +0 -25
  273. package/dist/ui/components/CollageLightbox.d.ts +0 -18
  274. package/dist/ui/components/CollageLightbox.js +0 -41
  275. package/dist/ui/components/StickyBottomBar.d.ts +0 -22
  276. package/dist/ui/components/StickyBottomBar.js +0 -20
@@ -1,13 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useEffect } from "react";
4
- import { Button } from "../../../../../ui/components/Button";
5
- export function PrintGrid({ items, columns = 4, autoprint = false, onBack, onDownloadPdf, isGeneratingPdf = false }) {
6
- useEffect(() => {
7
- if (!autoprint || items.length === 0)
8
- return;
9
- const t = setTimeout(() => window.print(), 500);
10
- return () => clearTimeout(t);
11
- }, [autoprint, items.length]);
12
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "appkit-print-hide", style: { display: "flex", gap: "8px", marginBottom: "16px", alignItems: "center" }, children: [onBack && _jsx(Button, { variant: "ghost", onClick: onBack, children: "Back" }), _jsx(Button, { variant: "outline", onClick: () => window.print(), children: "Print" }), onDownloadPdf && (_jsx(Button, { variant: "primary", onClick: onDownloadPdf, disabled: isGeneratingPdf, children: isGeneratingPdf ? "Generating..." : "Download PDF" }))] }), _jsx("style", { children: `@media print { .appkit-print-hide { display: none !important; } body { margin: 0; } }` }), _jsx("div", { style: { display: "grid", gridTemplateColumns: `repeat(${columns}, auto)`, gap: "4mm", justifyContent: "start" }, children: items.map((item, i) => (_jsx("div", { style: { pageBreakInside: "avoid" }, children: item }, i))) })] }));
13
- }
@@ -1,19 +0,0 @@
1
- import type { LabelDesign } from "./types";
2
- export interface StoreForCard {
3
- id: string;
4
- storeName: string;
5
- storeDescription?: string;
6
- storeLogoURL?: string;
7
- storeCategory?: string;
8
- primaryAddress?: string;
9
- }
10
- interface StoreCardProps {
11
- store: StoreForCard;
12
- publicBaseUrl: string;
13
- design: LabelDesign;
14
- qrDataUrl?: string;
15
- barcodeDataUrl?: string;
16
- brandName?: string;
17
- }
18
- export declare function StoreCard({ store, publicBaseUrl, design, qrDataUrl, barcodeDataUrl, brandName }: StoreCardProps): import("react/jsx-runtime").JSX.Element;
19
- export {};
@@ -1,30 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- export function StoreCard({ store, publicBaseUrl, design, qrDataUrl, barcodeDataUrl, brandName }) {
4
- const { size, show, colorScheme } = design;
5
- const isDark = colorScheme === "dark";
6
- const bg = isDark ? "#1a1a1a" : "#ffffff";
7
- const fg = isDark ? "#f5f5f5" : "#111111";
8
- const muted = isDark ? "#999999" : "#666666";
9
- const border = isDark ? "#333333" : "#e5e5e5";
10
- const desc = store.storeDescription
11
- ? store.storeDescription.slice(0, 80) + (store.storeDescription.length > 80 ? "..." : "")
12
- : null;
13
- return (_jsxs("div", { style: {
14
- width: `${size.widthMm}mm`,
15
- height: `${size.heightMm}mm`,
16
- background: bg,
17
- color: fg,
18
- border: `1px solid ${border}`,
19
- borderRadius: "3px",
20
- padding: "3mm",
21
- fontFamily: "sans-serif",
22
- fontSize: "7pt",
23
- display: "flex",
24
- flexDirection: "column",
25
- gap: "1.5mm",
26
- overflow: "hidden",
27
- boxSizing: "border-box",
28
- pageBreakInside: "avoid",
29
- }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: "2mm" }, children: [show.logo && store.storeLogoURL && (_jsx("img", { src: store.storeLogoURL, alt: store.storeName, style: { width: "8mm", height: "8mm", borderRadius: "2px", objectFit: "cover" } })), _jsxs(_Fragment, { children: [_jsx("div", { style: { fontWeight: 700, fontSize: "9pt" }, children: store.storeName }), store.storeCategory && _jsx("div", { style: { fontSize: "6pt", color: muted }, children: store.storeCategory })] })] }), desc && _jsx("div", { style: { fontSize: "6pt", color: muted, flex: 1 }, children: desc }), store.primaryAddress && _jsx("div", { style: { fontSize: "6pt", color: muted }, children: store.primaryAddress }), (show.barcode || qrDataUrl) && (_jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-end", marginTop: "auto" }, children: [show.barcode && barcodeDataUrl && (_jsx("img", { src: barcodeDataUrl, alt: "barcode", style: { height: "7mm", maxWidth: "55%" } })), qrDataUrl && _jsx("img", { src: qrDataUrl, alt: "qr", style: { width: "12mm", height: "12mm" } })] })), brandName && (_jsxs("div", { style: { fontSize: "5pt", color: muted, textAlign: "center", borderTop: `1px solid ${border}`, paddingTop: "1mm" }, children: [brandName, " \u00B7 ", publicBaseUrl.replace(/^https?:\/\//, "")] }))] }));
30
- }
@@ -1,11 +0,0 @@
1
- import type { StoreForCard } from "./StoreCard";
2
- import type { LabelDesign } from "./types";
3
- interface WebsiteCardProps {
4
- store: StoreForCard;
5
- publicBaseUrl: string;
6
- design: LabelDesign;
7
- qrDataUrl?: string;
8
- brandName?: string;
9
- }
10
- export declare function WebsiteCard({ store, publicBaseUrl, design, qrDataUrl, brandName }: WebsiteCardProps): import("react/jsx-runtime").JSX.Element;
11
- export {};
@@ -1,25 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- export function WebsiteCard({ store, publicBaseUrl, design, qrDataUrl, brandName = "" }) {
4
- const { size, colorScheme } = design;
5
- const isDark = colorScheme === "dark";
6
- const bg = isDark ? "#2d1b69" : "#6d28d9";
7
- return (_jsxs("div", { style: {
8
- width: `${size.widthMm}mm`,
9
- height: `${size.heightMm}mm`,
10
- background: bg,
11
- color: "#ffffff",
12
- borderRadius: "3px",
13
- padding: "3mm",
14
- fontFamily: "sans-serif",
15
- fontSize: "7pt",
16
- display: "flex",
17
- flexDirection: "column",
18
- alignItems: "center",
19
- justifyContent: "space-between",
20
- overflow: "hidden",
21
- boxSizing: "border-box",
22
- pageBreakInside: "avoid",
23
- textAlign: "center",
24
- }, children: [brandName && _jsx("div", { style: { fontWeight: 800, fontSize: "11pt", letterSpacing: "0.05em" }, children: brandName }), qrDataUrl && (_jsx("img", { src: qrDataUrl, alt: "qr", style: { width: "16mm", height: "16mm", background: "#fff", padding: "1mm", borderRadius: "2px" } })), _jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: "8pt", fontWeight: 600 }, children: "Scan to shop" }), _jsxs("div", { style: { fontSize: "6pt", color: "rgba(255,255,255,0.75)" }, children: [store.storeName, brandName ? ` on ${brandName}` : ""] }), _jsx("div", { style: { fontSize: "5pt", color: "rgba(255,255,255,0.55)", marginTop: "0.5mm" }, children: publicBaseUrl.replace(/^https?:\/\//, "") })] })] }));
25
- }
@@ -1,11 +0,0 @@
1
- export { InventoryLabel } from "./InventoryLabel";
2
- export { OrderPackingLabel, type OrderForLabel } from "./OrderPackingLabel";
3
- export { StoreCard } from "./StoreCard";
4
- export { WebsiteCard } from "./WebsiteCard";
5
- export { LabelDesignPicker } from "./LabelDesignPicker";
6
- export { PrintGrid } from "./PrintGrid";
7
- export { PhysicalLocationModal } from "./PhysicalLocationModal";
8
- export { PrintCenterView } from "./PrintCenterView";
9
- export { useInventoryPdf } from "./useInventoryPdf";
10
- export type { LabelDesign } from "./types";
11
- export { DEFAULT_PRODUCT_LABEL_DESIGN, DEFAULT_ORDER_LABEL_DESIGN, DEFAULT_CARD_DESIGN, LABEL_DESIGN_STORAGE_KEY, } from "./types";
@@ -1,10 +0,0 @@
1
- export { InventoryLabel } from "./InventoryLabel";
2
- export { OrderPackingLabel } from "./OrderPackingLabel";
3
- export { StoreCard } from "./StoreCard";
4
- export { WebsiteCard } from "./WebsiteCard";
5
- export { LabelDesignPicker } from "./LabelDesignPicker";
6
- export { PrintGrid } from "./PrintGrid";
7
- export { PhysicalLocationModal } from "./PhysicalLocationModal";
8
- export { PrintCenterView } from "./PrintCenterView";
9
- export { useInventoryPdf } from "./useInventoryPdf";
10
- export { DEFAULT_PRODUCT_LABEL_DESIGN, DEFAULT_ORDER_LABEL_DESIGN, DEFAULT_CARD_DESIGN, LABEL_DESIGN_STORAGE_KEY, } from "./types";
@@ -1,20 +0,0 @@
1
- export interface LabelDesign {
2
- template: "minimal" | "detailed" | "branded";
3
- colorScheme: "light" | "dark" | "store-primary";
4
- size: {
5
- widthMm: number;
6
- heightMm: number;
7
- };
8
- show: {
9
- logo: boolean;
10
- price: boolean;
11
- stock: boolean;
12
- barcode: boolean;
13
- location: boolean;
14
- listingTypeBadge: boolean;
15
- };
16
- }
17
- export declare const LABEL_DESIGN_STORAGE_KEY = "print-center:label-design";
18
- export declare const DEFAULT_PRODUCT_LABEL_DESIGN: LabelDesign;
19
- export declare const DEFAULT_ORDER_LABEL_DESIGN: LabelDesign;
20
- export declare const DEFAULT_CARD_DESIGN: LabelDesign;
@@ -1,20 +0,0 @@
1
- "use client";
2
- export const LABEL_DESIGN_STORAGE_KEY = "print-center:label-design";
3
- export const DEFAULT_PRODUCT_LABEL_DESIGN = {
4
- template: "detailed",
5
- colorScheme: "light",
6
- size: { widthMm: 62, heightMm: 38 },
7
- show: { logo: true, price: true, stock: true, barcode: true, location: true, listingTypeBadge: true },
8
- };
9
- export const DEFAULT_ORDER_LABEL_DESIGN = {
10
- template: "detailed",
11
- colorScheme: "light",
12
- size: { widthMm: 100, heightMm: 70 },
13
- show: { logo: true, price: false, stock: false, barcode: true, location: true, listingTypeBadge: false },
14
- };
15
- export const DEFAULT_CARD_DESIGN = {
16
- template: "branded",
17
- colorScheme: "light",
18
- size: { widthMm: 85, heightMm: 54 },
19
- show: { logo: true, price: false, stock: false, barcode: true, location: false, listingTypeBadge: false },
20
- };
@@ -1,18 +0,0 @@
1
- import type { ProductItem } from "../../../../../features/products/types";
2
- import type { OrderForLabel } from "./OrderPackingLabel";
3
- import type { StoreForCard } from "./StoreCard";
4
- import type { LabelDesign } from "./types";
5
- interface UseInventoryPdfOptions {
6
- products?: ProductItem[];
7
- orders?: OrderForLabel[];
8
- storeCards?: StoreForCard[];
9
- websiteCards?: StoreForCard[];
10
- design: LabelDesign;
11
- publicBaseUrl: string;
12
- brandName?: string;
13
- }
14
- export declare function useInventoryPdf({ products, orders, storeCards, websiteCards, design, publicBaseUrl, brandName, }: UseInventoryPdfOptions): {
15
- downloadPdf: () => Promise<void>;
16
- isGenerating: boolean;
17
- };
18
- export {};
@@ -1,76 +0,0 @@
1
- "use client";
2
- import { useState, useCallback } from "react";
3
- const MM_TO_PT = 2.8346;
4
- export function useInventoryPdf({ products = [], orders = [], storeCards = [], websiteCards = [], design, publicBaseUrl, brandName = "", }) {
5
- const [isGenerating, setIsGenerating] = useState(false);
6
- const downloadPdf = useCallback(async () => {
7
- setIsGenerating(true);
8
- try {
9
- const [{ jsPDF }, qrcode, jsbarcodeModule] = await Promise.all([
10
- import("jspdf"),
11
- import("qrcode"),
12
- import("jsbarcode"),
13
- ]);
14
- const JsBarcode = jsbarcodeModule.default;
15
- const wPt = design.size.widthMm * MM_TO_PT;
16
- const hPt = design.size.heightMm * MM_TO_PT;
17
- const pdf = new jsPDF({
18
- orientation: wPt > hPt ? "landscape" : "portrait",
19
- unit: "pt",
20
- format: [wPt, hPt],
21
- });
22
- let isFirst = true;
23
- const genQr = (url) => qrcode.toDataURL(url, { width: 80, margin: 1 });
24
- const genBarcode = (value) => {
25
- const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
26
- JsBarcode(svg, value, { format: "CODE128", width: 1, height: 25, displayValue: false });
27
- const xml = new XMLSerializer().serializeToString(svg);
28
- return "data:image/svg+xml;base64," + btoa(xml);
29
- };
30
- const addPage = async (title, subtitle, qrUrl, barcodeValue, id) => {
31
- if (!isFirst)
32
- pdf.addPage([wPt, hPt]);
33
- isFirst = false;
34
- const qr = await genQr(qrUrl);
35
- const barSvg = genBarcode(barcodeValue);
36
- pdf.setFontSize(6);
37
- pdf.setTextColor(150, 150, 150);
38
- if (brandName)
39
- pdf.text(brandName, 5, 9);
40
- pdf.setFontSize(8);
41
- pdf.setTextColor(20, 20, 20);
42
- pdf.text(title.slice(0, 50), 5, 18);
43
- if (subtitle) {
44
- pdf.setFontSize(6);
45
- pdf.setTextColor(100, 100, 100);
46
- pdf.text(subtitle.slice(0, 60), 5, 25);
47
- }
48
- if (design.show.barcode) {
49
- pdf.addImage(barSvg, "SVG", 5, hPt - 20, wPt * 0.6, 12);
50
- }
51
- pdf.addImage(qr, "PNG", wPt - 30, hPt - 32, 26, 26);
52
- pdf.setFontSize(5);
53
- pdf.setTextColor(180, 180, 180);
54
- pdf.text(id, wPt / 2, hPt - 3, { align: "center" });
55
- };
56
- for (const p of products) {
57
- const priceStr = p.price != null ? `Rs.${(p.price / 100).toFixed(2)}` : "";
58
- await addPage(p.title, priceStr, `${publicBaseUrl}/products/${p.id}`, p.id, p.id);
59
- }
60
- for (const o of orders) {
61
- await addPage(`Order: ${o.id}`, `${o.items.length} item(s)`, `${publicBaseUrl}/store/orders/${o.id}/view`, o.id, o.id);
62
- }
63
- for (const s of storeCards) {
64
- await addPage(s.storeName, s.storeDescription?.slice(0, 60) ?? "", `${publicBaseUrl}/stores/${s.id}`, s.id, s.id);
65
- }
66
- for (const s of websiteCards) {
67
- await addPage(brandName ? `${brandName} - ${s.storeName}` : s.storeName, "Scan to shop", `${publicBaseUrl}/stores/${s.id}`, s.id, s.id);
68
- }
69
- pdf.save(`labels-${Date.now()}.pdf`);
70
- }
71
- finally {
72
- setIsGenerating(false);
73
- }
74
- }, [products, orders, storeCards, websiteCards, design, publicBaseUrl]);
75
- return { downloadPdf, isGenerating };
76
- }
@@ -1,17 +0,0 @@
1
- import { type AddressCreateInput, type AddressDocument, type AddressUpdateInput } from "../schemas";
2
- export declare class AddressRepository {
3
- private getCollection;
4
- private decryptAddress;
5
- private encryptAddressData;
6
- findByUser(userId: string): Promise<AddressDocument[]>;
7
- findById(userId: string, addressId: string): Promise<AddressDocument | null>;
8
- findByIdOrFail(userId: string, addressId: string): Promise<AddressDocument>;
9
- count(userId: string): Promise<number>;
10
- create(userId: string, input: AddressCreateInput): Promise<AddressDocument>;
11
- update(userId: string, addressId: string, input: AddressUpdateInput): Promise<AddressDocument>;
12
- delete(userId: string, addressId: string): Promise<void>;
13
- setDefault(userId: string, addressId: string): Promise<AddressDocument>;
14
- private clearDefaultFlag;
15
- deleteAllByUser(userId: string): Promise<number>;
16
- }
17
- export declare const addressRepository: AddressRepository;
@@ -1,184 +0,0 @@
1
- import { DatabaseError, NotFoundError } from "../../../errors";
2
- import { serverLogger } from "../../../monitoring";
3
- import { deserializeTimestamps, getFirestoreCount, getAdminDb, prepareForFirestore, } from "../../../providers/db-firebase";
4
- import { ADDRESS_PII_FIELDS, decryptPiiFields, encryptPiiFields, } from "../../../security";
5
- import { USER_COLLECTION } from "../../auth";
6
- import { ADDRESS_FIELDS, ADDRESS_SUBCOLLECTION, } from "../schemas";
7
- export class AddressRepository {
8
- getCollection(userId) {
9
- return getAdminDb()
10
- .collection(USER_COLLECTION)
11
- .doc(userId)
12
- .collection(ADDRESS_SUBCOLLECTION);
13
- }
14
- decryptAddress(doc) {
15
- return decryptPiiFields(doc, [
16
- ...ADDRESS_PII_FIELDS,
17
- ]);
18
- }
19
- encryptAddressData(data) {
20
- return encryptPiiFields(data, [...ADDRESS_PII_FIELDS]);
21
- }
22
- async findByUser(userId) {
23
- try {
24
- const snapshot = await this.getCollection(userId)
25
- .orderBy(ADDRESS_FIELDS.CREATED_AT, "desc")
26
- .get();
27
- return snapshot.docs.map((doc) => this.decryptAddress(deserializeTimestamps({
28
- id: doc.id,
29
- ...doc.data(),
30
- })));
31
- }
32
- catch (error) {
33
- throw new DatabaseError(`Failed to list addresses for user: ${userId}`, error);
34
- }
35
- }
36
- async findById(userId, addressId) {
37
- try {
38
- const doc = await this.getCollection(userId).doc(addressId).get();
39
- if (!doc.exists)
40
- return null;
41
- return this.decryptAddress(deserializeTimestamps({ id: doc.id, ...doc.data() }));
42
- }
43
- catch (error) {
44
- throw new DatabaseError(`Failed to find address ${addressId} for user ${userId}`, error);
45
- }
46
- }
47
- async findByIdOrFail(userId, addressId) {
48
- const address = await this.findById(userId, addressId);
49
- if (!address) {
50
- throw new NotFoundError(`Address not found: ${addressId}`);
51
- }
52
- return address;
53
- }
54
- async count(userId) {
55
- try {
56
- return await getFirestoreCount(this.getCollection(userId));
57
- }
58
- catch (error) {
59
- throw new DatabaseError(`Failed to count addresses for user: ${userId}`, error);
60
- }
61
- }
62
- async create(userId, input) {
63
- try {
64
- const collection = this.getCollection(userId);
65
- if (input.isDefault) {
66
- await this.clearDefaultFlag(userId);
67
- }
68
- const now = new Date();
69
- const docRef = collection.doc();
70
- const addressData = {
71
- ...input,
72
- createdAt: now,
73
- updatedAt: now,
74
- };
75
- const encrypted = this.encryptAddressData(addressData);
76
- await docRef.set(prepareForFirestore(encrypted));
77
- serverLogger.info("Address created", {
78
- userId,
79
- addressId: docRef.id,
80
- label: input.label,
81
- });
82
- return { id: docRef.id, ...addressData };
83
- }
84
- catch (error) {
85
- if (error instanceof DatabaseError || error instanceof NotFoundError) {
86
- throw error;
87
- }
88
- throw new DatabaseError(`Failed to create address for user: ${userId}`, error);
89
- }
90
- }
91
- async update(userId, addressId, input) {
92
- try {
93
- await this.findByIdOrFail(userId, addressId);
94
- if (input.isDefault) {
95
- await this.clearDefaultFlag(userId);
96
- }
97
- const encryptedInput = this.encryptAddressData(input);
98
- const updateData = {
99
- ...prepareForFirestore(encryptedInput),
100
- [ADDRESS_FIELDS.UPDATED_AT]: new Date(),
101
- };
102
- await this.getCollection(userId).doc(addressId).update(updateData);
103
- const updated = await this.findByIdOrFail(userId, addressId);
104
- serverLogger.info("Address updated", { userId, addressId });
105
- return updated;
106
- }
107
- catch (error) {
108
- if (error instanceof DatabaseError || error instanceof NotFoundError) {
109
- throw error;
110
- }
111
- throw new DatabaseError(`Failed to update address ${addressId} for user ${userId}`, error);
112
- }
113
- }
114
- async delete(userId, addressId) {
115
- try {
116
- await this.findByIdOrFail(userId, addressId);
117
- await this.getCollection(userId).doc(addressId).delete();
118
- serverLogger.info("Address deleted", { userId, addressId });
119
- }
120
- catch (error) {
121
- if (error instanceof DatabaseError || error instanceof NotFoundError) {
122
- throw error;
123
- }
124
- throw new DatabaseError(`Failed to delete address ${addressId} for user ${userId}`, error);
125
- }
126
- }
127
- async setDefault(userId, addressId) {
128
- try {
129
- await this.findByIdOrFail(userId, addressId);
130
- await this.clearDefaultFlag(userId);
131
- await this.getCollection(userId)
132
- .doc(addressId)
133
- .update({
134
- [ADDRESS_FIELDS.IS_DEFAULT]: true,
135
- [ADDRESS_FIELDS.UPDATED_AT]: new Date(),
136
- });
137
- serverLogger.info("Default address set", { userId, addressId });
138
- return this.findByIdOrFail(userId, addressId);
139
- }
140
- catch (error) {
141
- if (error instanceof DatabaseError || error instanceof NotFoundError) {
142
- throw error;
143
- }
144
- throw new DatabaseError(`Failed to set default address ${addressId} for user ${userId}`, error);
145
- }
146
- }
147
- async clearDefaultFlag(userId) {
148
- try {
149
- const db = getAdminDb();
150
- const snapshot = await this.getCollection(userId)
151
- .where(ADDRESS_FIELDS.IS_DEFAULT, "==", true)
152
- .get();
153
- if (snapshot.empty)
154
- return;
155
- const batch = db.batch();
156
- snapshot.docs.forEach((doc) => {
157
- batch.update(doc.ref, {
158
- [ADDRESS_FIELDS.IS_DEFAULT]: false,
159
- [ADDRESS_FIELDS.UPDATED_AT]: new Date(),
160
- });
161
- });
162
- await batch.commit();
163
- }
164
- catch (error) {
165
- throw new DatabaseError(`Failed to clear default flag for user: ${userId}`, error);
166
- }
167
- }
168
- async deleteAllByUser(userId) {
169
- try {
170
- const db = getAdminDb();
171
- const snapshot = await this.getCollection(userId).get();
172
- if (snapshot.empty)
173
- return 0;
174
- const batch = db.batch();
175
- snapshot.docs.forEach((doc) => batch.delete(doc.ref));
176
- await batch.commit();
177
- return snapshot.size;
178
- }
179
- catch (error) {
180
- throw new DatabaseError(`Failed to delete all addresses for user: ${userId}`, error);
181
- }
182
- }
183
- }
184
- export const addressRepository = new AddressRepository();
@@ -1,29 +0,0 @@
1
- import type { AuctionItem } from "../types";
2
- interface AuctionCountdownProps {
3
- endsAt: string;
4
- className?: string;
5
- labels?: {
6
- ended?: string;
7
- hours?: string;
8
- mins?: string;
9
- secs?: string;
10
- };
11
- }
12
- export declare function AuctionCountdown({ endsAt, className, labels, }: AuctionCountdownProps): import("react/jsx-runtime").JSX.Element;
13
- interface AuctionCardProps {
14
- auction: AuctionItem;
15
- labels?: {
16
- currentBid?: string;
17
- startingBid?: string;
18
- bids?: string;
19
- placeBid?: string;
20
- ended?: string;
21
- };
22
- onBid?: (auction: AuctionItem) => void;
23
- className?: string;
24
- selectable?: boolean;
25
- isSelected?: boolean;
26
- onSelect?: (id: string, selected: boolean) => void;
27
- }
28
- export declare function AuctionCard({ auction, labels, onBid, className, selectable, isSelected, onSelect, }: AuctionCardProps): import("react/jsx-runtime").JSX.Element;
29
- export {};
@@ -1,38 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useEffect } from "react";
4
- import { Article, BaseListingCard, Button, Div, Heading, Row, Span, Text } from "../../../ui";
5
- import { formatCurrency } from "../../../utils/number.formatter";
6
- import { getDefaultCurrency } from "../../../core/baseline-resolver";
7
- import { THEME_CONSTANTS } from "../../../tokens";
8
- import { useLongPress } from "../../../react/hooks/useLongPress";
9
- function useCountdown(endsAt) {
10
- const [msLeft, setMsLeft] = useState(() => new Date(endsAt).getTime() - Date.now());
11
- useEffect(() => {
12
- const id = setInterval(() => {
13
- setMsLeft(new Date(endsAt).getTime() - Date.now());
14
- }, 1000);
15
- return () => clearInterval(id);
16
- }, [endsAt]);
17
- if (msLeft <= 0)
18
- return null;
19
- const totalSecs = Math.floor(msLeft / 1000);
20
- const h = Math.floor(totalSecs / 3600);
21
- const m = Math.floor((totalSecs % 3600) / 60);
22
- const s = totalSecs % 60;
23
- return { h, m, s };
24
- }
25
- export function AuctionCountdown({ endsAt, className = "", labels = {}, }) {
26
- const countdown = useCountdown(endsAt);
27
- if (!countdown) {
28
- return (_jsx(Span, { className: `text-sm font-medium text-red-600 ${className}`, children: labels.ended ?? "Ended" }));
29
- }
30
- const pad = (n) => String(n).padStart(2, "0");
31
- return (_jsxs(Row, { className: `gap-1 text-sm font-mono ${className}`, children: [_jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.h) }), _jsx(Span, { className: "text-gray-400 dark:text-zinc-500", children: ":" }), _jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.m) }), _jsx(Span, { className: "text-gray-400 dark:text-zinc-500", children: ":" }), _jsx(Span, { className: "rounded bg-gray-900 dark:bg-slate-700 px-1.5 py-0.5 text-white", children: pad(countdown.s) })] }));
32
- }
33
- export function AuctionCard({ auction, labels = {}, onBid, className = "", selectable = false, isSelected = false, onSelect, }) {
34
- const hasEnded = new Date(auction.auctionEndDate) <= new Date();
35
- const displayBid = auction.currentBid ?? auction.startingBid;
36
- const longPress = useLongPress(() => onSelect?.(auction.id, !isSelected));
37
- return (_jsxs(Article, { className: `group relative rounded-xl border bg-white dark:bg-slate-900 overflow-hidden shadow-sm hover:shadow-md transition-shadow ${isSelected ? "border-primary outline outline-2 outline-primary" : "border-gray-200 dark:border-slate-700"} ${className}`, onMouseDown: onSelect && !isSelected ? longPress.onMouseDown : undefined, onMouseUp: onSelect && !isSelected ? longPress.onMouseUp : undefined, onMouseLeave: onSelect && !isSelected ? longPress.onMouseLeave : undefined, onTouchStart: onSelect && !isSelected ? longPress.onTouchStart : undefined, onTouchEnd: onSelect && !isSelected ? longPress.onTouchEnd : undefined, children: [onSelect && (_jsx(BaseListingCard.Checkbox, { selected: isSelected, onSelect: (e) => { e.preventDefault(); onSelect(auction.id, !isSelected); }, label: isSelected ? "Deselect auction" : "Select auction", position: "top-2 right-2", className: selectable || isSelected ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity" })), auction.mainImage && (_jsxs(Div, { className: "aspect-square overflow-hidden relative", children: [_jsx(Div, { role: "img", "aria-label": auction.title, className: "h-full w-full bg-center bg-cover", style: { backgroundImage: `url(${auction.mainImage})` } }), _jsx(Span, { className: "absolute top-2 left-2 rounded-full bg-orange-500 px-2 py-0.5 text-xs font-bold text-white", children: "AUCTION" })] })), _jsxs(Div, { className: "p-4", children: [_jsx(Heading, { level: 3, className: `font-semibold text-gray-900 dark:text-zinc-100 text-sm leading-snug mb-2 ${THEME_CONSTANTS.utilities.textClamp2}`, children: auction.title }), _jsxs(Row, { justify: "between", className: "mb-2", children: [_jsxs(Div, { children: [_jsx(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: labels.currentBid ?? "Current bid" }), _jsx(Text, { className: "text-base font-bold text-gray-900 dark:text-zinc-100", children: formatCurrency(displayBid, getDefaultCurrency()) })] }), _jsx(Div, { className: "text-right", children: _jsxs(Text, { className: "text-xs text-gray-400 dark:text-zinc-500", children: [auction.bidCount, " ", labels.bids ?? "bids"] }) })] }), _jsx(Div, { className: "mb-3", children: _jsx(AuctionCountdown, { endsAt: auction.auctionEndDate, labels: { ended: labels.ended } }) }), !hasEnded && onBid && (_jsx(Button, { type: "button", variant: "warning", onClick: () => onBid(auction), className: "w-full rounded-lg bg-orange-500 py-2 text-sm font-medium text-white hover:bg-orange-600 transition-colors", children: labels.placeBid ?? "Place Bid" }))] })] }));
38
- }
@@ -1,16 +0,0 @@
1
- export interface BundleAddToCartCtaProps {
2
- /** Bundle slug — `categories/{bundle-...}` row. */
3
- bundleSlug: string;
4
- /** True when bundleStockStatus === "out_of_stock". Renders disabled CTA. */
5
- outOfStock?: boolean;
6
- /**
7
- * Server-action callback. Returning successfully marks the toast as success;
8
- * any thrown error surfaces inline + as an error toast. Typed as a generic
9
- * async fn so consumers can wrap the underlying action however they like.
10
- */
11
- onAddToCart: (input: {
12
- bundleSlug: string;
13
- quantity: number;
14
- }) => Promise<unknown>;
15
- }
16
- export declare function BundleAddToCartCta({ bundleSlug, outOfStock, onAddToCart, }: BundleAddToCartCtaProps): import("react/jsx-runtime").JSX.Element;
@@ -1,54 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- /**
4
- * BundleAddToCartCta — S-SBUNI-5 2026-05-13.
5
- *
6
- * Client island for the bundle detail page CTA. Replaces the "coming soon"
7
- * disabled-CTA notice from S-SBUNI-3 + S-SBUNI-4 now that the cart-line
8
- * foundation + per-member stock decrement at checkout are wired.
9
- *
10
- * Receives the bundle slug + an `onAddToCart` callback (typically the
11
- * `addBundleToCartAction` server action from the consumer app). Renders
12
- * a qty input + Add button + inline error / toast feedback.
13
- *
14
- * Out-of-stock bundles render a disabled button with `ctaOutOfStock` text.
15
- */
16
- import { useState, useCallback } from "react";
17
- import { Button, Input, Row, Stack, Text } from "../../../ui";
18
- import { useToast } from "../../../ui";
19
- import { BUNDLE_COPY } from "../../../_internal/shared/features/categories/bundle-copy";
20
- const MIN_QTY = 1;
21
- const MAX_QTY = 10;
22
- export function BundleAddToCartCta({ bundleSlug, outOfStock = false, onAddToCart, }) {
23
- const { showToast } = useToast();
24
- const [quantity, setQuantity] = useState(MIN_QTY);
25
- const [submitting, setSubmitting] = useState(false);
26
- const [error, setError] = useState(null);
27
- const handleClick = useCallback(async () => {
28
- setError(null);
29
- setSubmitting(true);
30
- try {
31
- await onAddToCart({ bundleSlug, quantity });
32
- showToast(BUNDLE_COPY.detail.ctaSuccess, "success");
33
- }
34
- catch (err) {
35
- const message = err instanceof Error ? err.message : BUNDLE_COPY.detail.ctaErrorFallback;
36
- setError(message);
37
- showToast(message, "error");
38
- }
39
- finally {
40
- setSubmitting(false);
41
- }
42
- }, [bundleSlug, quantity, onAddToCart, showToast]);
43
- if (outOfStock) {
44
- return (_jsxs(Stack, { gap: "xs", "aria-live": "polite", children: [_jsx(Button, { variant: "primary", disabled: true, "aria-disabled": true, children: BUNDLE_COPY.detail.ctaOutOfStock }), _jsx(Text, { size: "xs", color: "muted", children: BUNDLE_COPY.detail.ctaHint })] }));
45
- }
46
- return (_jsxs(Stack, { gap: "sm", children: [_jsxs(Row, { gap: "sm", align: "center", className: "flex-wrap", children: [_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "xs", color: "muted", children: BUNDLE_COPY.detail.qtyLabel }), _jsx(Input, { type: "number", inputMode: "numeric", min: MIN_QTY, max: MAX_QTY, step: 1, value: String(quantity), "aria-label": BUNDLE_COPY.detail.qtyAriaLabel, onChange: (e) => {
47
- const next = Number(e.target.value);
48
- if (Number.isFinite(next)) {
49
- setQuantity(Math.min(Math.max(MIN_QTY, Math.floor(next)), MAX_QTY));
50
- }
51
- }, disabled: submitting, className: "w-20" })] }), _jsx(Button, { variant: "primary", onClick: handleClick, disabled: submitting, "aria-busy": submitting, children: submitting
52
- ? BUNDLE_COPY.detail.ctaAdding
53
- : BUNDLE_COPY.detail.ctaAddToCart })] }), error && (_jsx(Text, { size: "sm", color: "danger", role: "alert", children: error }))] }));
54
- }
@@ -1,31 +0,0 @@
1
- import React from "react";
2
- import type { CategoryItem } from "../types";
3
- import type { UrlTable } from "../../filters/FilterPanel";
4
- import type { CategoryFilterVariant } from "./CategoryFilters";
5
- export interface CategoriesListViewProps {
6
- initialData?: CategoryItem[];
7
- labels?: {
8
- title?: string;
9
- subtitle?: string;
10
- emptyTitle?: string;
11
- emptyDescription?: string;
12
- };
13
- /** Optional UrlTable-compatible state source for shared filter/sort controls */
14
- table?: UrlTable;
15
- /** Filter/sort preset for admin/seller/public listing behavior */
16
- filterVariant?: CategoryFilterVariant;
17
- /** Controlled sort value override */
18
- sortValue?: string;
19
- /** Controlled sort change callback */
20
- onSortChange?: (value: string) => void;
21
- renderSearch?: (value: string, onChange: (v: string) => void) => React.ReactNode;
22
- renderSort?: (value: string, onChange: (v: string) => void) => React.ReactNode;
23
- renderFilters?: () => React.ReactNode;
24
- renderCategories: (items: CategoryItem[], isLoading: boolean) => React.ReactNode;
25
- renderPagination?: (total: number) => React.ReactNode;
26
- items?: CategoryItem[];
27
- total?: number;
28
- isLoading?: boolean;
29
- className?: string;
30
- }
31
- export declare function CategoriesListView({ labels, table, filterVariant, sortValue, onSortChange, renderSearch, renderSort, renderFilters, renderCategories, renderPagination, items, total, isLoading, className, }: CategoriesListViewProps): import("react/jsx-runtime").JSX.Element;