@mohasinac/appkit 2.3.2 → 2.4.1
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.
- package/dist/client.d.ts +48 -12
- package/dist/client.js +25 -6
- package/dist/constants/api-endpoints.d.ts +380 -22
- package/dist/constants/api-endpoints.js +66 -13
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/core/hooks/useSyncManager.d.ts +1 -0
- package/dist/core/hooks/useSyncManager.js +83 -0
- package/dist/core/integration-keys.d.ts +4 -0
- package/dist/core/integration-keys.js +8 -0
- package/dist/features/about/components/FAQPageView.js +9 -11
- package/dist/features/about/components/PolicyPageView.js +32 -11
- package/dist/features/about/components/PublicProfileView.js +77 -11
- package/dist/features/account/components/AddressesIndexListing.js +63 -38
- package/dist/features/account/components/UserOffersPanel.d.ts +8 -0
- package/dist/features/account/components/UserOffersPanel.js +81 -0
- package/dist/features/account/components/UserSettingsView.d.ts +2 -1
- package/dist/features/account/components/UserSettingsView.js +2 -1
- package/dist/features/account/components/UserSidebar.d.ts +6 -1
- package/dist/features/account/components/UserSidebar.js +48 -42
- package/dist/features/account/components/index.d.ts +2 -0
- package/dist/features/account/components/index.js +1 -0
- package/dist/features/admin/actions/admin-actions.d.ts +1 -1
- package/dist/features/admin/actions/admin-actions.js +13 -3
- package/dist/features/admin/components/AdminAdEditorView.js +6 -7
- package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +4 -0
- package/dist/features/admin/components/AdminAllEventEntriesView.js +102 -0
- package/dist/features/admin/components/AdminBidsView.js +94 -8
- package/dist/features/admin/components/AdminBlogEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBlogEditorView.js +162 -0
- package/dist/features/admin/components/AdminBlogView.d.ts +4 -1
- package/dist/features/admin/components/AdminBlogView.js +61 -31
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +104 -0
- package/dist/features/admin/components/AdminBrandsView.d.ts +4 -0
- package/dist/features/admin/components/AdminBrandsView.js +76 -0
- package/dist/features/admin/components/AdminCarouselEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminCarouselEditorView.js +204 -0
- package/dist/features/admin/components/AdminCarouselView.js +153 -34
- package/dist/features/admin/components/AdminCartsView.d.ts +4 -0
- package/dist/features/admin/components/AdminCartsView.js +82 -0
- package/dist/features/admin/components/AdminCategoriesView.d.ts +4 -1
- package/dist/features/admin/components/AdminCategoriesView.js +66 -48
- package/dist/features/admin/components/AdminCategoryEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCategoryEditorView.js +115 -0
- package/dist/features/admin/components/AdminContactEditorView.d.ts +11 -0
- package/dist/features/admin/components/AdminContactEditorView.js +32 -0
- package/dist/features/admin/components/AdminContactView.js +111 -20
- package/dist/features/admin/components/AdminCouponEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCouponEditorView.js +179 -0
- package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
- package/dist/features/admin/components/AdminCouponsView.js +57 -9
- package/dist/features/admin/components/AdminDashboardView.js +3 -0
- package/dist/features/admin/components/AdminFaqEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminFaqEditorView.js +128 -0
- package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
- package/dist/features/admin/components/AdminFaqsView.js +55 -23
- package/dist/features/admin/components/AdminFeatureFlagsView.js +33 -24
- package/dist/features/admin/components/AdminListingScaffold.d.ts +7 -1
- package/dist/features/admin/components/AdminListingScaffold.js +2 -2
- package/dist/features/admin/components/AdminMediaView.js +18 -8
- package/dist/features/admin/components/AdminNavEditorView.d.ts +20 -0
- package/dist/features/admin/components/AdminNavEditorView.js +84 -0
- package/dist/features/admin/components/AdminNavigationView.d.ts +1 -7
- package/dist/features/admin/components/AdminNavigationView.js +84 -72
- package/dist/features/admin/components/AdminNewsletterView.js +102 -20
- package/dist/features/admin/components/AdminNotificationsView.d.ts +4 -0
- package/dist/features/admin/components/AdminNotificationsView.js +119 -0
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminOrderEditorView.js +74 -0
- package/dist/features/admin/components/AdminOrdersView.js +64 -8
- package/dist/features/admin/components/AdminPayoutsView.js +122 -13
- package/dist/features/admin/components/AdminProductEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminProductEditorView.js +143 -0
- package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
- package/dist/features/admin/components/AdminProductsView.js +119 -30
- package/dist/features/admin/components/AdminReturnRequestsView.d.ts +5 -0
- package/dist/features/admin/components/AdminReturnRequestsView.js +101 -0
- package/dist/features/admin/components/AdminReviewsView.js +138 -28
- package/dist/features/admin/components/AdminSectionsView.js +361 -472
- package/dist/features/admin/components/AdminSessionsView.d.ts +4 -0
- package/dist/features/admin/components/AdminSessionsView.js +119 -0
- package/dist/features/admin/components/AdminSidebar.d.ts +18 -3
- package/dist/features/admin/components/AdminSidebar.js +51 -4
- package/dist/features/admin/components/AdminSiteSettingsView.d.ts +7 -0
- package/dist/features/admin/components/AdminSiteSettingsView.js +319 -0
- package/dist/features/admin/components/AdminStoreAddressesView.d.ts +5 -0
- package/dist/features/admin/components/AdminStoreAddressesView.js +52 -0
- package/dist/features/admin/components/AdminStoreEditorView.d.ts +9 -0
- package/dist/features/admin/components/AdminStoreEditorView.js +55 -0
- package/dist/features/admin/components/AdminStoresView.js +62 -20
- package/dist/features/admin/components/AdminUserEditorView.d.ts +10 -0
- package/dist/features/admin/components/AdminUserEditorView.js +72 -0
- package/dist/features/admin/components/AdminUsersView.js +70 -36
- package/dist/features/admin/components/AdminWishlistsView.d.ts +4 -0
- package/dist/features/admin/components/AdminWishlistsView.js +53 -0
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +36 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +35 -0
- package/dist/features/admin/components/DataTable.d.ts +4 -2
- package/dist/features/admin/components/DataTable.js +26 -6
- package/dist/features/admin/components/index.d.ts +47 -1
- package/dist/features/admin/components/index.js +23 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +48 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +653 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +298 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +278 -0
- package/dist/features/admin/schemas/firestore.d.ts +26 -0
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/types/product.types.d.ts +2 -3
- package/dist/features/auctions/actions/bid-actions.js +6 -2
- package/dist/features/auctions/components/AuctionDetailPageView.d.ts +3 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +38 -12
- package/dist/features/auctions/components/AuctionFilters.d.ts +3 -1
- package/dist/features/auctions/components/AuctionFilters.js +6 -2
- package/dist/features/auctions/components/CollapsibleBidHistory.d.ts +7 -0
- package/dist/features/auctions/components/CollapsibleBidHistory.js +8 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +4 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +43 -9
- package/dist/features/auctions/components/MarketplaceAuctionGrid.js +1 -0
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +18 -0
- package/dist/features/auctions/components/PlaceBidFormClient.js +33 -0
- package/dist/features/auctions/hooks/useAuctions.d.ts +1 -0
- package/dist/features/auctions/hooks/useAuctions.js +1 -0
- package/dist/features/auctions/schemas/index.d.ts +22 -12
- package/dist/features/auth/actions/profile-actions.d.ts +5 -3
- package/dist/features/auth/actions/profile-actions.js +30 -11
- package/dist/features/auth/auth-helpers.js +1 -0
- package/dist/features/auth/components/LoginForm.js +2 -1
- package/dist/features/auth/hooks/useAuth.js +16 -4
- package/dist/features/auth/permissions/constants.d.ts +63 -0
- package/dist/features/auth/permissions/constants.js +323 -0
- package/dist/features/auth/schemas/firestore.d.ts +20 -0
- package/dist/features/auth/schemas/index.d.ts +4 -4
- package/dist/features/auth/schemas/index.js +3 -2
- package/dist/features/auth/types/index.d.ts +1 -1
- package/dist/features/before-after/schemas/index.d.ts +2 -2
- package/dist/features/blog/actions/blog-actions.d.ts +15 -15
- package/dist/features/blog/components/BlogFilters.js +1 -1
- package/dist/features/blog/components/BlogIndexListing.js +57 -5
- package/dist/features/blog/components/BlogIndexPageView.js +14 -2
- package/dist/features/blog/components/BlogPostForm.js +6 -2
- package/dist/features/blog/components/BlogPostView.js +2 -1
- package/dist/features/blog/hooks/useBlog.d.ts +2 -0
- package/dist/features/blog/hooks/useBlog.js +2 -0
- package/dist/features/blog/schemas/index.d.ts +46 -12
- package/dist/features/brands/actions/brand-actions.d.ts +2 -0
- package/dist/features/brands/actions/brand-actions.js +5 -0
- package/dist/features/brands/index.d.ts +3 -0
- package/dist/features/brands/index.js +3 -0
- package/dist/features/brands/repository/brands.repository.d.ts +13 -0
- package/dist/features/brands/repository/brands.repository.js +60 -0
- package/dist/features/brands/schemas/index.d.ts +33 -0
- package/dist/features/brands/schemas/index.js +15 -0
- package/dist/features/brands/server.d.ts +7 -0
- package/dist/features/brands/server.js +7 -0
- package/dist/features/cart/actions/cart-actions.js +2 -2
- package/dist/features/cart/components/CartDrawer.d.ts +5 -1
- package/dist/features/cart/components/CartDrawer.js +3 -3
- package/dist/features/cart/hooks/useCartCount.d.ts +3 -2
- package/dist/features/cart/hooks/useCartCount.js +4 -2
- package/dist/features/cart/hooks/useGuestCartMerge.js +1 -1
- package/dist/features/cart/index.d.ts +1 -0
- package/dist/features/cart/index.js +1 -0
- package/dist/features/cart/repository/cart.repository.d.ts +5 -1
- package/dist/features/cart/repository/cart.repository.js +36 -5
- package/dist/features/cart/schemas/firestore.d.ts +25 -6
- package/dist/features/cart/schemas/firestore.js +2 -2
- package/dist/features/cart/schemas/index.d.ts +9 -9
- package/dist/features/cart/schemas/index.js +1 -1
- package/dist/features/cart/types/index.d.ts +1 -1
- package/dist/features/cart/utils/pending-ops.d.ts +33 -0
- package/dist/features/cart/utils/pending-ops.js +102 -0
- package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -0
- package/dist/features/categories/components/BrandDetailPageView.js +54 -0
- package/dist/features/categories/components/BrandDetailTabs.d.ts +10 -0
- package/dist/features/categories/components/BrandDetailTabs.js +22 -0
- package/dist/features/categories/components/CategoriesIndexListing.d.ts +3 -1
- package/dist/features/categories/components/CategoriesIndexListing.js +83 -7
- package/dist/features/categories/components/CategoryDetailPageView.js +42 -21
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -7
- package/dist/features/categories/components/CategoryFilters.js +1 -1
- package/dist/features/categories/components/CategoryForm.js +10 -4
- package/dist/features/categories/components/CategoryProductsListing.d.ts +4 -1
- package/dist/features/categories/components/CategoryProductsListing.js +34 -5
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/categories/hooks/useCategories.js +2 -0
- package/dist/features/categories/repository/categories.repository.js +2 -3
- package/dist/features/categories/schemas/firestore.d.ts +23 -2
- package/dist/features/categories/schemas/firestore.js +8 -0
- package/dist/features/categories/schemas/index.d.ts +8 -8
- package/dist/features/categories/types/index.d.ts +1 -0
- package/dist/features/collections/schemas/index.d.ts +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +2 -2
- package/dist/features/events/components/AdminEventsView.d.ts +4 -1
- package/dist/features/events/components/AdminEventsView.js +64 -38
- package/dist/features/events/components/EventCard.js +1 -1
- package/dist/features/events/components/EventFilters.js +1 -1
- package/dist/features/events/components/EventPollWidget.d.ts +12 -0
- package/dist/features/events/components/EventPollWidget.js +62 -0
- package/dist/features/events/components/EventsIndexListing.js +57 -5
- package/dist/features/events/components/EventsListPageView.js +1 -1
- package/dist/features/events/components/index.d.ts +2 -0
- package/dist/features/events/components/index.js +1 -0
- package/dist/features/events/hooks/useEvents.d.ts +1 -0
- package/dist/features/events/hooks/useEvents.js +1 -0
- package/dist/features/events/repository/events.repository.js +3 -0
- package/dist/features/events/schemas/firestore.d.ts +1 -0
- package/dist/features/events/schemas/index.d.ts +44 -0
- package/dist/features/events/types/index.d.ts +2 -0
- package/dist/features/faq/actions/faq-actions.d.ts +16 -16
- package/dist/features/faq/hooks/useFaqList.js +1 -1
- package/dist/features/faq/schemas/firestore.d.ts +2 -2
- package/dist/features/faq/schemas/firestore.js +2 -1
- package/dist/features/faq/schemas/index.d.ts +4 -4
- package/dist/features/filters/FilterFacetSection.d.ts +1 -0
- package/dist/features/filters/FilterFacetSection.js +13 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/grouped/schemas/firestore.d.ts +32 -0
- package/dist/features/grouped/schemas/firestore.js +19 -0
- package/dist/features/homepage/components/AdSlot.d.ts +1 -3
- package/dist/features/homepage/components/AdSlot.js +15 -14
- package/dist/features/homepage/components/BlogArticlesSection.d.ts +3 -1
- package/dist/features/homepage/components/BlogArticlesSection.js +2 -2
- package/dist/features/homepage/components/BrandsSection.d.ts +3 -1
- package/dist/features/homepage/components/BrandsSection.js +4 -3
- package/dist/features/homepage/components/CustomCardsSection.d.ts +3 -0
- package/dist/features/homepage/components/CustomCardsSection.js +76 -0
- package/dist/features/homepage/components/EventsSection.d.ts +3 -1
- package/dist/features/homepage/components/EventsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
- package/dist/features/homepage/components/FeaturedProductsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedProductsSection.js +8 -3
- package/dist/features/homepage/components/FeaturedStoresSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
- package/dist/features/homepage/components/GoogleReviewsSection.d.ts +3 -0
- package/dist/features/homepage/components/GoogleReviewsSection.js +65 -0
- package/dist/features/homepage/components/HeroCarousel.js +128 -84
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +2 -20
- package/dist/features/homepage/components/MarketplaceHomepageView.js +73 -230
- package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
- package/dist/features/homepage/components/SectionCarousel.js +2 -0
- package/dist/features/homepage/components/ShopByCategorySection.d.ts +3 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +8 -4
- package/dist/features/homepage/components/SocialFeedSection.d.ts +3 -0
- package/dist/features/homepage/components/SocialFeedSection.js +86 -0
- package/dist/features/homepage/components/SocialPostCard.d.ts +7 -0
- package/dist/features/homepage/components/SocialPostCard.js +39 -0
- package/dist/features/homepage/components/StatsCounterSection.js +1 -1
- package/dist/features/homepage/components/WelcomeSection.js +1 -1
- package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -1
- package/dist/features/homepage/hooks/useActiveAd.d.ts +23 -0
- package/dist/features/homepage/hooks/useActiveAd.js +20 -0
- package/dist/features/homepage/hooks/useBlogArticles.d.ts +1 -0
- package/dist/features/homepage/hooks/useBlogArticles.js +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedPreOrders.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedProducts.d.ts +1 -0
- package/dist/features/homepage/hooks/useFeaturedProducts.js +6 -3
- package/dist/features/homepage/hooks/useFeaturedStores.d.ts +3 -1
- package/dist/features/homepage/hooks/useFeaturedStores.js +2 -1
- package/dist/features/homepage/hooks/useHomepageEvents.d.ts +3 -1
- package/dist/features/homepage/hooks/useHomepageEvents.js +2 -1
- package/dist/features/homepage/hooks/useTopBrands.d.ts +3 -1
- package/dist/features/homepage/hooks/useTopBrands.js +2 -1
- package/dist/features/homepage/index.d.ts +2 -0
- package/dist/features/homepage/index.js +1 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.d.ts +14 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.js +27 -0
- package/dist/features/homepage/lib/live-stats.d.ts +14 -0
- package/dist/features/homepage/lib/live-stats.js +62 -0
- package/dist/features/homepage/lib/section-defaults.d.ts +11 -0
- package/dist/features/homepage/lib/section-defaults.js +45 -0
- package/dist/features/homepage/lib/section-helpers.d.ts +5 -0
- package/dist/features/homepage/lib/section-helpers.js +25 -0
- package/dist/features/homepage/lib/section-renderer.d.ts +33 -0
- package/dist/features/homepage/lib/section-renderer.js +164 -0
- package/dist/features/homepage/lib/social-feed-fetcher.d.ts +5 -0
- package/dist/features/homepage/lib/social-feed-fetcher.js +193 -0
- package/dist/features/homepage/schemas/firestore.d.ts +180 -29
- package/dist/features/homepage/schemas/firestore.js +5 -0
- package/dist/features/homepage/types/index.d.ts +48 -19
- package/dist/features/layout/AppLayoutShell.d.ts +6 -1
- package/dist/features/layout/AppLayoutShell.js +25 -9
- package/dist/features/layout/BottomActions.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +15 -1
- package/dist/features/layout/BottomNavbar.js +8 -2
- package/dist/features/layout/FooterLayout.d.ts +7 -1
- package/dist/features/layout/FooterLayout.js +3 -3
- package/dist/features/layout/ListingLayout.js +2 -2
- package/dist/features/layout/MainNavbar.d.ts +6 -14
- package/dist/features/layout/MainNavbar.js +4 -16
- package/dist/features/layout/NavItem.js +1 -1
- package/dist/features/layout/NavbarLayout.d.ts +3 -1
- package/dist/features/layout/NavbarLayout.js +5 -5
- package/dist/features/layout/TitleBar.d.ts +4 -2
- package/dist/features/layout/TitleBar.js +5 -3
- package/dist/features/layout/TitleBarLayout.d.ts +3 -1
- package/dist/features/layout/TitleBarLayout.js +2 -2
- package/dist/features/layout/index.d.ts +1 -1
- package/dist/features/media/MediaPickerModal.d.ts +30 -0
- package/dist/features/media/MediaPickerModal.js +72 -0
- package/dist/features/media/index.d.ts +3 -1
- package/dist/features/media/index.js +1 -0
- package/dist/features/media/types/index.d.ts +12 -0
- package/dist/features/media/types/index.js +4 -2
- package/dist/features/media/upload/MediaUploadField.d.ts +5 -1
- package/dist/features/media/upload/MediaUploadField.js +56 -3
- package/dist/features/messages/schemas/firestore.d.ts +36 -0
- package/dist/features/messages/schemas/firestore.js +16 -0
- package/dist/features/orders/repository/orders.repository.d.ts +2 -2
- package/dist/features/orders/repository/orders.repository.js +2 -2
- package/dist/features/orders/schemas/firestore.d.ts +17 -4
- package/dist/features/orders/schemas/firestore.js +2 -2
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/schemas/index.js +3 -3
- package/dist/features/orders/types/index.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +4 -4
- package/dist/features/payments/repository/payout.repository.js +7 -7
- package/dist/features/payments/schemas/firestore.d.ts +6 -6
- package/dist/features/payments/schemas/firestore.js +6 -6
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +11 -10
- package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +11 -0
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +28 -0
- package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +2 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +27 -9
- package/dist/features/pre-orders/components/PreOrderFilters.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrderFilters.js +9 -6
- package/dist/features/pre-orders/components/PreOrdersIndexListing.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +132 -36
- package/dist/features/pre-orders/components/PreOrdersListView.js +3 -3
- package/dist/features/pre-orders/components/PreorderCard.js +1 -1
- package/dist/features/pre-orders/schemas/index.d.ts +10 -0
- package/dist/features/products/actions/product-actions.d.ts +2 -2
- package/dist/features/products/actions/product-actions.js +5 -5
- package/dist/features/products/api/[id]/route.js +5 -2
- package/dist/features/products/api/route.js +10 -14
- package/dist/features/products/columns/productTableColumns.js +2 -2
- package/dist/features/products/components/AuctionDetailView.d.ts +2 -1
- package/dist/features/products/components/AuctionDetailView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.d.ts +3 -1
- package/dist/features/products/components/AuctionsIndexListing.js +93 -31
- package/dist/features/products/components/BidHistory.d.ts +2 -1
- package/dist/features/products/components/BidHistory.js +18 -2
- package/dist/features/products/components/MakeOfferButton.d.ts +10 -0
- package/dist/features/products/components/MakeOfferButton.js +68 -0
- package/dist/features/products/components/ProductDetailPageView.d.ts +11 -1
- package/dist/features/products/components/ProductDetailPageView.js +27 -8
- package/dist/features/products/components/ProductFilters.d.ts +7 -1
- package/dist/features/products/components/ProductFilters.js +4 -2
- package/dist/features/products/components/ProductForm.d.ts +19 -1
- package/dist/features/products/components/ProductForm.js +24 -6
- package/dist/features/products/components/ProductGrid.d.ts +10 -2
- package/dist/features/products/components/ProductGrid.js +76 -29
- package/dist/features/products/components/ProductsIndexListing.js +131 -45
- package/dist/features/products/components/RelatedProductsCarousel.js +1 -1
- package/dist/features/products/components/ShareButton.d.ts +7 -0
- package/dist/features/products/components/ShareButton.js +22 -0
- package/dist/features/products/components/index.d.ts +2 -0
- package/dist/features/products/components/index.js +1 -0
- package/dist/features/products/hooks/useProducts.d.ts +7 -0
- package/dist/features/products/hooks/useProducts.js +6 -4
- package/dist/features/products/repository/products.repository.d.ts +4 -8
- package/dist/features/products/repository/products.repository.js +17 -50
- package/dist/features/products/schemas/firestore.d.ts +11 -9
- package/dist/features/products/schemas/firestore.js +11 -3
- package/dist/features/products/schemas/index.d.ts +51 -50
- package/dist/features/products/schemas/index.js +2 -5
- package/dist/features/products/types/index.d.ts +13 -5
- package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
- package/dist/features/promotions/actions/coupon-actions.js +1 -1
- package/dist/features/promotions/actions/seller-coupon-actions.js +11 -6
- package/dist/features/promotions/api/route.js +3 -3
- package/dist/features/promotions/components/CouponCard.js +16 -7
- package/dist/features/promotions/components/CouponsIndexListing.js +3 -9
- package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
- package/dist/features/promotions/hooks/usePromotions.js +2 -2
- package/dist/features/promotions/repository/coupons.repository.d.ts +21 -15
- package/dist/features/promotions/repository/coupons.repository.js +97 -125
- package/dist/features/promotions/schemas/firestore.d.ts +31 -2
- package/dist/features/promotions/schemas/firestore.js +29 -0
- package/dist/features/promotions/schemas/index.d.ts +9 -12
- package/dist/features/promotions/schemas/index.js +1 -2
- package/dist/features/promotions/types/index.d.ts +1 -2
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewDetailPageView.js +5 -9
- package/dist/features/reviews/components/ReviewFilters.js +1 -1
- package/dist/features/reviews/components/ReviewsIndexListing.js +58 -7
- package/dist/features/reviews/components/ReviewsList.js +2 -2
- package/dist/features/reviews/hooks/useReviews.d.ts +1 -0
- package/dist/features/reviews/hooks/useReviews.js +2 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +9 -4
- package/dist/features/reviews/repository/reviews.repository.js +18 -7
- package/dist/features/reviews/schemas/firestore.d.ts +5 -2
- package/dist/features/reviews/schemas/firestore.js +1 -0
- package/dist/features/reviews/schemas/index.d.ts +19 -16
- package/dist/features/reviews/schemas/index.js +3 -2
- package/dist/features/reviews/types/index.d.ts +3 -2
- package/dist/features/scams/actions/scam-actions.d.ts +29 -0
- package/dist/features/scams/actions/scam-actions.js +62 -0
- package/dist/features/scams/components/ScamProfileView.d.ts +10 -0
- package/dist/features/scams/components/ScamProfileView.js +51 -0
- package/dist/features/scams/components/ScamRegistryView.d.ts +6 -0
- package/dist/features/scams/components/ScamRegistryView.js +41 -0
- package/dist/features/scams/components/index.d.ts +4 -0
- package/dist/features/scams/components/index.js +2 -0
- package/dist/features/scams/constants/scam-types.d.ts +38 -0
- package/dist/features/scams/constants/scam-types.js +443 -0
- package/dist/features/scams/repository/scammer.repository.d.ts +67 -0
- package/dist/features/scams/repository/scammer.repository.js +160 -0
- package/dist/features/scams/schemas/firestore.d.ts +362 -0
- package/dist/features/scams/schemas/firestore.js +233 -0
- package/dist/features/search/components/Search.d.ts +12 -2
- package/dist/features/search/components/Search.js +26 -7
- package/dist/features/search/components/index.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.js +2 -2
- package/dist/features/search/schemas/index.d.ts +7 -7
- package/dist/features/seller/actions/offer-actions.js +52 -36
- package/dist/features/seller/actions/seller-actions.js +19 -13
- package/dist/features/seller/api/products/route.js +9 -4
- package/dist/features/seller/components/SellerAddressesView.d.ts +3 -12
- package/dist/features/seller/components/SellerAddressesView.js +144 -4
- package/dist/features/seller/components/SellerAuctionsView.js +58 -5
- package/dist/features/seller/components/SellerBidsView.d.ts +4 -0
- package/dist/features/seller/components/SellerBidsView.js +131 -0
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +19 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +67 -0
- package/dist/features/seller/components/SellerCouponsView.d.ts +5 -3
- package/dist/features/seller/components/SellerCouponsView.js +135 -13
- package/dist/features/seller/components/SellerCreateProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerCreateProductView.js +4 -3
- package/dist/features/seller/components/SellerEditProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerEditProductView.js +4 -3
- package/dist/features/seller/components/SellerOffersPanel.d.ts +20 -0
- package/dist/features/seller/components/SellerOffersPanel.js +138 -0
- package/dist/features/seller/components/SellerOffersView.js +56 -5
- package/dist/features/seller/components/SellerOrdersView.d.ts +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +185 -16
- package/dist/features/seller/components/SellerPayoutRequestView.d.ts +7 -0
- package/dist/features/seller/components/SellerPayoutRequestView.js +63 -0
- package/dist/features/seller/components/SellerPayoutSettingsView.d.ts +3 -10
- package/dist/features/seller/components/SellerPayoutSettingsView.js +89 -3
- package/dist/features/seller/components/SellerPayoutsView.js +56 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +68 -0
- package/dist/features/seller/components/SellerProductShell.js +179 -0
- package/dist/features/seller/components/SellerProductsView.d.ts +2 -3
- package/dist/features/seller/components/SellerProductsView.js +194 -18
- package/dist/features/seller/components/SellerReviewsView.d.ts +5 -0
- package/dist/features/seller/components/SellerReviewsView.js +100 -0
- package/dist/features/seller/components/SellerShippingView.d.ts +3 -11
- package/dist/features/seller/components/SellerShippingView.js +87 -3
- package/dist/features/seller/components/SellerSidebar.d.ts +11 -3
- package/dist/features/seller/components/SellerSidebar.js +52 -8
- package/dist/features/seller/components/SellerStorefrontView.d.ts +26 -11
- package/dist/features/seller/components/SellerStorefrontView.js +45 -7
- package/dist/features/seller/components/index.d.ts +16 -2
- package/dist/features/seller/components/index.js +7 -0
- package/dist/features/seller/hooks/useSellerListingData.d.ts +3 -1
- package/dist/features/seller/hooks/useSellerListingData.js +6 -4
- package/dist/features/seller/repository/offer.repository.d.ts +3 -3
- package/dist/features/seller/repository/offer.repository.js +6 -6
- package/dist/features/seller/schemas/firestore.d.ts +7 -7
- package/dist/features/seller/schemas/firestore.js +4 -4
- package/dist/features/seller/schemas/index.d.ts +16 -16
- package/dist/features/shell/FormShell.d.ts +29 -0
- package/dist/features/shell/FormShell.js +103 -0
- package/dist/features/shell/QuickFormDrawer.d.ts +29 -0
- package/dist/features/shell/QuickFormDrawer.js +117 -0
- package/dist/features/shell/StepForm.d.ts +44 -0
- package/dist/features/shell/StepForm.js +81 -0
- package/dist/features/shell/index.d.ts +6 -0
- package/dist/features/shell/index.js +3 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -3
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +2 -2
- package/dist/features/stores/components/InteractiveStoreCard.js +21 -7
- package/dist/features/stores/components/StoreAboutView.js +1 -1
- package/dist/features/stores/components/StoreAuctionsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreAuctionsListing.js +81 -8
- package/dist/features/stores/components/StoreAuctionsPageView.js +8 -7
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -0
- package/dist/features/stores/components/StoreDetailLayoutView.js +29 -5
- package/dist/features/stores/components/StoreHeader.js +2 -1
- package/dist/features/stores/components/StorePreOrdersListing.d.ts +4 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +59 -7
- package/dist/features/stores/components/StorePreOrdersPageView.js +8 -7
- package/dist/features/stores/components/StoreProductsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreProductsListing.js +97 -8
- package/dist/features/stores/components/StoreProductsPageView.js +8 -7
- package/dist/features/stores/components/StoreReviewsListing.js +2 -2
- package/dist/features/stores/components/StoresIndexListing.js +74 -11
- package/dist/features/stores/components/StoresListView.js +1 -1
- package/dist/features/stores/hooks/useStores.d.ts +1 -0
- package/dist/features/stores/hooks/useStores.js +1 -0
- package/dist/features/stores/schemas/firestore.d.ts +34 -0
- package/dist/features/stores/schemas/index.d.ts +8 -8
- package/dist/features/sublisting/schemas/firestore.d.ts +30 -0
- package/dist/features/sublisting/schemas/firestore.js +19 -0
- package/dist/features/support/schemas/firestore.d.ts +113 -0
- package/dist/features/support/schemas/firestore.js +95 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +143 -0
- package/dist/features/whatsapp-bot/components/index.d.ts +2 -0
- package/dist/features/whatsapp-bot/components/index.js +1 -0
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +23 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +104 -0
- package/dist/features/whatsapp-bot/server.d.ts +1 -0
- package/dist/features/whatsapp-bot/server.js +1 -0
- package/dist/features/whatsapp-bot/types/index.d.ts +49 -0
- package/dist/features/wishlist/components/WishlistView.d.ts +0 -10
- package/dist/features/wishlist/components/WishlistView.js +13 -6
- package/dist/features/wishlist/hooks/useWishlist.js +2 -0
- package/dist/features/wishlist/hooks/useWishlistCount.d.ts +11 -3
- package/dist/features/wishlist/hooks/useWishlistCount.js +89 -25
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/features/wishlist/schemas/index.d.ts +2 -2
- package/dist/features/wishlist/types/index.d.ts +16 -0
- package/dist/http/api-handler.js +8 -1
- package/dist/index.d.ts +114 -16
- package/dist/index.js +136 -28
- package/dist/monitoring/server-logger.js +9 -3
- package/dist/next/routing/route-map.d.ts +120 -6
- package/dist/next/routing/route-map.js +53 -2
- package/dist/providers/db-firebase/realtime.d.ts +1 -1
- package/dist/react/contexts/SessionContext.js +17 -26
- package/dist/react/hooks/useBulkSelection.d.ts +7 -24
- package/dist/react/hooks/useBulkSelection.js +27 -34
- package/dist/react/hooks/useLongPress.d.ts +3 -16
- package/dist/react/hooks/useLongPress.js +6 -25
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +2 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.js +2 -0
- package/dist/seed/actions/demo-seed-actions.d.ts +2 -2
- package/dist/seed/actions/demo-seed-actions.js +1 -1
- package/dist/seed/anime-figures-seed-data.d.ts +8 -0
- package/dist/seed/anime-figures-seed-data.js +1033 -0
- package/dist/seed/beyblade-seed-data.js +206 -24
- package/dist/seed/bids-seed-data.d.ts +4 -10
- package/dist/seed/bids-seed-data.js +365 -238
- package/dist/seed/blog-posts-seed-data.d.ts +3 -2
- package/dist/seed/blog-posts-seed-data.js +250 -511
- package/dist/seed/brands-seed-data.d.ts +7 -0
- package/dist/seed/brands-seed-data.js +410 -0
- package/dist/seed/carousel-slides-seed-data.d.ts +3 -2
- package/dist/seed/carousel-slides-seed-data.js +177 -216
- package/dist/seed/cart-seed-data.d.ts +9 -9
- package/dist/seed/cart-seed-data.js +73 -73
- package/dist/seed/categories-seed-data.d.ts +4 -2
- package/dist/seed/categories-seed-data.js +720 -879
- package/dist/seed/conversations-seed-data.d.ts +8 -0
- package/dist/seed/conversations-seed-data.js +388 -0
- package/dist/seed/cosplay-accessories-seed-data.d.ts +8 -0
- package/dist/seed/cosplay-accessories-seed-data.js +647 -0
- package/dist/seed/coupon-usage-seed-data.d.ts +25 -0
- package/dist/seed/coupon-usage-seed-data.js +69 -0
- package/dist/seed/coupons-seed-data.d.ts +6 -3
- package/dist/seed/coupons-seed-data.js +375 -3
- package/dist/seed/events-seed-data.d.ts +4 -2
- package/dist/seed/events-seed-data.js +128 -430
- package/dist/seed/factories/cart.factory.d.ts +0 -1
- package/dist/seed/factories/cart.factory.js +2 -2
- package/dist/seed/faq-seed-data.d.ts +11 -18
- package/dist/seed/faq-seed-data.js +786 -1817
- package/dist/seed/grouped-listings-seed-data.d.ts +8 -0
- package/dist/seed/grouped-listings-seed-data.js +201 -0
- package/dist/seed/homepage-sections-seed-data.d.ts +3 -13
- package/dist/seed/homepage-sections-seed-data.js +228 -252
- package/dist/seed/hot-wheels-seed-data.js +285 -38
- package/dist/seed/index.d.ts +12 -11
- package/dist/seed/index.js +10 -12
- package/dist/seed/letitrip-official-seed-data.d.ts +8 -0
- package/dist/seed/letitrip-official-seed-data.js +399 -0
- package/dist/seed/manifest.d.ts +15 -0
- package/dist/seed/manifest.js +140 -0
- package/dist/seed/notifications-seed-data.d.ts +4 -2
- package/dist/seed/notifications-seed-data.js +117 -440
- package/dist/seed/orders-seed-data.d.ts +4 -2
- package/dist/seed/orders-seed-data.js +1090 -521
- package/dist/seed/payouts-seed-data.d.ts +4 -2
- package/dist/seed/payouts-seed-data.js +522 -145
- package/dist/seed/pokemon-carousel-slides-seed-data.js +6 -1
- package/dist/seed/pokemon-categories-seed-data.js +81 -81
- package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-homepage-sections-seed-data.js +116 -23
- package/dist/seed/pokemon-products-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-products-seed-data.js +83 -73
- package/dist/seed/pokemon-seed-bundle.d.ts +5 -1
- package/dist/seed/pokemon-seed-bundle.js +21 -2
- package/dist/seed/pokemon-stores-seed-data.js +85 -9
- package/dist/seed/pokemon-users-seed-data.js +107 -8
- package/dist/seed/products-auctions-seed-data.d.ts +10 -0
- package/dist/seed/products-auctions-seed-data.js +689 -0
- package/dist/seed/products-preorders-seed-data.d.ts +9 -0
- package/dist/seed/products-preorders-seed-data.js +483 -0
- package/dist/seed/products-seed-data.js +34 -13
- package/dist/seed/products-standard-seed-data.d.ts +8 -0
- package/dist/seed/products-standard-seed-data.js +4179 -0
- package/dist/seed/retro-gaming-seed-data.d.ts +8 -0
- package/dist/seed/retro-gaming-seed-data.js +801 -0
- package/dist/seed/reviews-seed-data.d.ts +4 -17
- package/dist/seed/reviews-seed-data.js +1043 -515
- package/dist/seed/scammers-seed-data.d.ts +17 -0
- package/dist/seed/scammers-seed-data.js +118 -0
- package/dist/seed/site-settings-seed-data.js +25 -2
- package/dist/seed/store-addresses-seed-data.js +188 -84
- package/dist/seed/stores-seed-data.d.ts +3 -9
- package/dist/seed/stores-seed-data.js +212 -102
- package/dist/seed/sublisting-categories-seed-data.d.ts +7 -0
- package/dist/seed/sublisting-categories-seed-data.js +315 -0
- package/dist/seed/transformers-seed-data.js +34 -14
- package/dist/seed/users-seed-data.d.ts +3 -2
- package/dist/seed/users-seed-data.js +531 -440
- package/dist/seed/wishlists-seed-data.js +13 -13
- package/dist/server.d.ts +9 -2
- package/dist/server.js +12 -4
- package/dist/tokens/tokens.css +76 -31
- package/dist/ui/components/Avatar.style.css +10 -12
- package/dist/ui/components/BaseListingCard.d.ts +8 -3
- package/dist/ui/components/BaseListingCard.js +17 -6
- package/dist/ui/components/BaseListingCard.style.css +3 -1
- package/dist/ui/components/BulkActionsBar.d.ts +16 -0
- package/dist/ui/components/BulkActionsBar.js +22 -0
- package/dist/ui/components/Button.style.css +23 -23
- package/dist/ui/components/Card.style.css +60 -62
- package/dist/ui/components/Checkbox.style.css +19 -21
- package/dist/ui/components/DashboardStatsCard.style.css +12 -14
- package/dist/ui/components/Drawer.style.css +18 -14
- package/dist/ui/components/Dropdown.style.css +25 -27
- package/dist/ui/components/EmptyState.style.css +2 -4
- package/dist/ui/components/HorizontalScroller.d.ts +3 -1
- package/dist/ui/components/HorizontalScroller.js +116 -21
- package/dist/ui/components/HorizontalScroller.style.css +2 -2
- package/dist/ui/components/ImageLightbox.d.ts +0 -9
- package/dist/ui/components/ImageLightbox.js +43 -9
- package/dist/ui/components/InlineCreateSelect.d.ts +38 -0
- package/dist/ui/components/InlineCreateSelect.js +70 -0
- package/dist/ui/components/ListingLayout.style.css +41 -77
- package/dist/ui/components/ListingToolbar.d.ts +54 -0
- package/dist/ui/components/ListingToolbar.js +34 -0
- package/dist/ui/components/Modal.style.css +14 -10
- package/dist/ui/components/PageLoader.d.ts +11 -0
- package/dist/ui/components/PageLoader.js +21 -0
- package/dist/ui/components/Radio.style.css +34 -36
- package/dist/ui/components/RichTextEditor.js +1 -1
- package/dist/ui/components/RowActionMenu.d.ts +1 -0
- package/dist/ui/components/RowActionMenu.js +4 -2
- package/dist/ui/components/SectionTabs.js +1 -1
- package/dist/ui/components/SectionTabs.style.css +1 -0
- package/dist/ui/components/SideModal.style.css +4 -8
- package/dist/ui/components/Slider.style.css +2 -4
- package/dist/ui/components/Tabs.style.css +8 -10
- package/dist/ui/components/Toast.style.css +22 -24
- package/dist/ui/components/Toggle.style.css +11 -13
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/rich-text/RichText.js +2 -1
- package/dist/ui/rich-text/RichText.style.css +292 -5
- package/dist/ui/rich-text/RichTextRenderer.d.ts +15 -0
- package/dist/ui/rich-text/RichTextRenderer.js +15 -0
- package/dist/utils/id-generators.d.ts +10 -0
- package/dist/utils/id-generators.js +12 -0
- package/dist/validation/schemas.d.ts +9 -9
- package/package.json +5 -1
- package/README.md +0 -116
|
@@ -1,25 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
export
|
|
3
|
-
/** Rendered immediately after the hero carousel. Good for a full-width banner. */
|
|
4
|
-
afterHero?: React.ReactNode;
|
|
5
|
-
/** Rendered between featured products and featured auctions. */
|
|
6
|
-
afterFeaturedProducts?: React.ReactNode;
|
|
7
|
-
/** Rendered after the customer reviews section. */
|
|
8
|
-
afterReviews?: React.ReactNode;
|
|
9
|
-
/** Rendered after the FAQ section. */
|
|
10
|
-
afterFAQ?: React.ReactNode;
|
|
11
|
-
}
|
|
2
|
+
export type { MarketplaceHomepageViewAdSlots } from "../lib/section-renderer";
|
|
12
3
|
export interface MarketplaceHomepageViewProps {
|
|
13
|
-
|
|
14
|
-
* Optional ad slot content injected at key positions in the homepage.
|
|
15
|
-
* Pass `<AdSlot id="..." />` as values; they render nothing when the slot
|
|
16
|
-
* is not configured or consent hasn't been granted.
|
|
17
|
-
*/
|
|
18
|
-
adSlots?: MarketplaceHomepageViewAdSlots;
|
|
19
|
-
/**
|
|
20
|
-
* Optional newsletter form content for homepage section #16.
|
|
21
|
-
* Provide a client component wired to live subscribe actions/API.
|
|
22
|
-
*/
|
|
4
|
+
adSlots?: import("../lib/section-renderer").MarketplaceHomepageViewAdSlots;
|
|
23
5
|
newsletterFormSlot?: React.ReactNode;
|
|
24
6
|
}
|
|
25
7
|
export declare function MarketplaceHomepageView({ adSlots, newsletterFormSlot, }?: MarketplaceHomepageViewProps): Promise<import("react/jsx-runtime").JSX.Element>;
|
|
@@ -1,239 +1,28 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React from "react";
|
|
3
2
|
import { Main } from "../../../ui";
|
|
4
3
|
import { carouselRepository, faqsRepository, siteSettingsRepository } from "../../../repositories";
|
|
5
|
-
import {
|
|
6
|
-
import { AnnouncementBar } from "
|
|
7
|
-
import { HeroCarousel } from "./HeroCarousel";
|
|
8
|
-
import { StatsCounterSection } from "./StatsCounterSection";
|
|
9
|
-
import { TrustFeaturesSection } from "./TrustFeaturesSection";
|
|
10
|
-
import { ShopByCategorySection } from "./ShopByCategorySection";
|
|
11
|
-
import { FeaturedProductsSection } from "./FeaturedProductsSection";
|
|
12
|
-
import { FeaturedAuctionsSection } from "./FeaturedAuctionsSection";
|
|
13
|
-
import { FeaturedPreOrdersSection } from "./FeaturedPreOrdersSection";
|
|
14
|
-
import { FeaturedStoresSection } from "./FeaturedStoresSection";
|
|
15
|
-
import { EventsSection } from "./EventsSection";
|
|
16
|
-
import { CTABannerSection } from "./CTABannerSection";
|
|
17
|
-
import { HomepageCustomerReviewsSection } from "./HomepageCustomerReviewsSection";
|
|
18
|
-
import { SecurityHighlightsSection } from "./SecurityHighlightsSection";
|
|
19
|
-
import { WhatsAppCommunitySection } from "./WhatsAppCommunitySection";
|
|
20
|
-
import { FAQSection } from "./FAQSection";
|
|
21
|
-
import { NewsletterSection } from "./NewsletterSection";
|
|
22
|
-
import { BlogArticlesSection } from "./BlogArticlesSection";
|
|
23
|
-
import { WelcomeSection } from "./WelcomeSection";
|
|
24
|
-
import { BrandsSection } from "./BrandsSection";
|
|
4
|
+
import { fetchLiveStats } from "../lib/live-stats";
|
|
5
|
+
import { renderSection, AnnouncementBar } from "../lib/section-renderer";
|
|
25
6
|
import { homepageSectionsRepository } from "../repository/homepage-sections.repository";
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
iconName: "fast-delivery",
|
|
34
|
-
title: "Fast Delivery",
|
|
35
|
-
description: "Fast shipping with reliable nationwide logistics partners.",
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
iconName: "easy-returns",
|
|
39
|
-
title: "Easy Returns",
|
|
40
|
-
description: "Hassle-free returns within the policy window.",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
iconName: "support",
|
|
44
|
-
title: "24/7 Support",
|
|
45
|
-
description: "Real help from our team across pre and post purchase.",
|
|
46
|
-
},
|
|
47
|
-
];
|
|
48
|
-
const DEFAULT_HOW_IT_WORKS = [
|
|
49
|
-
{
|
|
50
|
-
number: 1,
|
|
51
|
-
title: "Browse & Discover",
|
|
52
|
-
desc: "Search 10,000+ listings across products, auctions, and pre-orders.",
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
number: 2,
|
|
56
|
-
title: "Bid or Buy Now",
|
|
57
|
-
desc: "Place a bid on live auctions or buy instantly at the listed price.",
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
number: 3,
|
|
61
|
-
title: "Get Delivered",
|
|
62
|
-
desc: "Track your order end-to-end until it arrives at your door.",
|
|
63
|
-
},
|
|
64
|
-
];
|
|
65
|
-
const DEFAULT_SECURITY_ITEMS = [
|
|
66
|
-
{
|
|
67
|
-
key: "encryption",
|
|
68
|
-
title: "End-to-End Encryption",
|
|
69
|
-
description: "All sensitive data is encrypted in transit and at rest.",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
key: "tls",
|
|
73
|
-
title: "TLS 1.3 in Transit",
|
|
74
|
-
description: "Every API call and page load is secured with modern TLS.",
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
key: "rbac",
|
|
78
|
-
title: "Role-Based Access",
|
|
79
|
-
description: "Strict role boundaries keep buyer, seller, and admin data separate.",
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
key: "min-priv",
|
|
83
|
-
title: "Minimum-Privilege Tokens",
|
|
84
|
-
description: "Short-lived, scoped tokens minimise exposure on every request.",
|
|
85
|
-
},
|
|
86
|
-
];
|
|
87
|
-
// --- Helpers -----------------------------------------------------------------
|
|
88
|
-
/** Strip leading emoji/symbols that admins sometimes prefix onto DB titles. */
|
|
89
|
-
function cleanTitle(raw) {
|
|
90
|
-
if (!raw)
|
|
91
|
-
return raw;
|
|
92
|
-
const cleaned = raw.replace(/^[^\p{L}\p{N}]+/u, "").trim();
|
|
93
|
-
return cleaned || raw;
|
|
94
|
-
}
|
|
95
|
-
function parseWelcomeDescription(description) {
|
|
96
|
-
if (!description)
|
|
97
|
-
return "";
|
|
98
|
-
try {
|
|
99
|
-
const parsed = JSON.parse(description);
|
|
100
|
-
const extracted = parsed.content
|
|
101
|
-
?.flatMap((node) => node.content ?? [])
|
|
102
|
-
.map((leaf) => leaf.text ?? "")
|
|
103
|
-
.join(" ")
|
|
104
|
-
.trim();
|
|
105
|
-
return extracted || description;
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return description;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
7
|
+
import { getFeaturedProducts, getFeaturedAuctions, getFeaturedPreOrders } from "../../products/actions/product-actions";
|
|
8
|
+
import { listTopLevelCategories, listBrandCategories } from "../../categories/actions/category-actions";
|
|
9
|
+
import { listStores } from "../../stores/actions/store-query-actions";
|
|
10
|
+
import { getFeaturedBlogPosts } from "../../blog/actions/blog-actions";
|
|
11
|
+
import { listPublicEvents } from "../../events/actions/event-actions";
|
|
111
12
|
/**
|
|
112
|
-
*
|
|
13
|
+
* Converts Firestore CarouselSlideDocument[] (Date fields) to the API-shaped
|
|
14
|
+
* CarouselSlide[] (string dates) expected by HeroCarousel / useHeroCarousel.
|
|
15
|
+
* The two types share all display-relevant fields; only createdAt/updatedAt
|
|
16
|
+
* and internal-only fields (analytics, createdBy) diverge.
|
|
113
17
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
};
|
|
120
|
-
function renderSection(section, adSlots, newsletterFormSlot, faqItems, slides) {
|
|
121
|
-
const { type, config } = section;
|
|
122
|
-
const adSlotKey = AD_SLOT_MAP[type];
|
|
123
|
-
const sectionElement = (() => {
|
|
124
|
-
switch (type) {
|
|
125
|
-
case "carousel":
|
|
126
|
-
return _jsx(HeroCarousel, { initialSlides: slides });
|
|
127
|
-
case "welcome": {
|
|
128
|
-
const cfg = config;
|
|
129
|
-
const title = cleanTitle(cfg?.h1) || "Discover Amazing Products";
|
|
130
|
-
const subtitle = parseWelcomeDescription(cfg?.description);
|
|
131
|
-
const ctaText = cfg?.ctaText || "Shop Now";
|
|
132
|
-
const ctaLink = cfg?.ctaLink || ROUTES.PUBLIC.PRODUCTS;
|
|
133
|
-
return (_jsx(WelcomeSection, { title: title, subtitle: subtitle, pillLabel: "India's #1 Marketplace", showCTA: cfg?.showCTA ?? true, ctaLabel: ctaText, ctaHref: ctaLink, secondaryCtaLabel: "Browse All", secondaryCtaHref: ROUTES.PUBLIC.PRODUCTS, trustChips: [
|
|
134
|
-
{ key: "delivery", emoji: "🚀", label: "Fast Delivery" },
|
|
135
|
-
{ key: "secure", emoji: "🔒", label: "Secure Payments" },
|
|
136
|
-
{ key: "rating", emoji: "⭐", label: "4.8+ Rated" },
|
|
137
|
-
{ key: "returns", emoji: "↩️", label: "Easy Returns" },
|
|
138
|
-
], brandLogoText: "LIR" }));
|
|
139
|
-
}
|
|
140
|
-
case "categories": {
|
|
141
|
-
const cfg = config;
|
|
142
|
-
return (_jsx(ShopByCategorySection, { title: cleanTitle(cfg?.title) || "Shop by Category", viewMoreHref: ROUTES.PUBLIC.CATEGORIES, viewMoreLabel: "All categories \u2192" }));
|
|
143
|
-
}
|
|
144
|
-
case "stats": {
|
|
145
|
-
const cfg = config;
|
|
146
|
-
const stats = Array.isArray(cfg?.stats)
|
|
147
|
-
? cfg.stats
|
|
148
|
-
.filter((item) => typeof item?.label === "string" &&
|
|
149
|
-
item.label.trim().length > 0 &&
|
|
150
|
-
typeof item?.value === "string" &&
|
|
151
|
-
item.value.trim().length > 0)
|
|
152
|
-
.map((item, index) => ({
|
|
153
|
-
key: typeof item?.key === "string" && item.key.trim().length > 0
|
|
154
|
-
? item.key
|
|
155
|
-
: `stat-${index}`,
|
|
156
|
-
label: item.label,
|
|
157
|
-
value: item.value,
|
|
158
|
-
}))
|
|
159
|
-
: [];
|
|
160
|
-
if (stats.length === 0) {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return _jsx(StatsCounterSection, { stats: stats });
|
|
164
|
-
}
|
|
165
|
-
case "products": {
|
|
166
|
-
const cfg = config;
|
|
167
|
-
return (_jsx(FeaturedProductsSection, { title: cleanTitle(cfg?.title) || "Featured Products", viewMoreHref: ROUTES.PUBLIC.PRODUCTS, viewMoreLabel: "View all products \u2192" }));
|
|
168
|
-
}
|
|
169
|
-
case "auctions": {
|
|
170
|
-
const cfg = config;
|
|
171
|
-
return (_jsx(FeaturedAuctionsSection, { title: cleanTitle(cfg?.title) || "Live Auctions", viewMoreHref: ROUTES.PUBLIC.AUCTIONS, viewMoreLabel: "View all auctions \u2192" }));
|
|
172
|
-
}
|
|
173
|
-
case "pre-orders": {
|
|
174
|
-
const cfg = config;
|
|
175
|
-
return (_jsx(FeaturedPreOrdersSection, { title: cleanTitle(cfg?.title) || "Reserve Before It Ships", viewMoreHref: ROUTES.PUBLIC.PRE_ORDERS, viewMoreLabel: "View all pre-orders \u2192" }));
|
|
176
|
-
}
|
|
177
|
-
case "stores": {
|
|
178
|
-
const cfg = config;
|
|
179
|
-
return (_jsx(FeaturedStoresSection, { title: cleanTitle(cfg?.title) || "Featured Stores", viewMoreHref: ROUTES.PUBLIC.STORES, viewMoreLabel: "View all stores \u2192" }));
|
|
180
|
-
}
|
|
181
|
-
case "events": {
|
|
182
|
-
const cfg = config;
|
|
183
|
-
return (_jsx(EventsSection, { title: cleanTitle(cfg?.title) || "Events & Offers", viewMoreHref: ROUTES.PUBLIC.EVENTS, viewMoreLabel: "View all events \u2192" }));
|
|
184
|
-
}
|
|
185
|
-
case "reviews": {
|
|
186
|
-
const cfg = config;
|
|
187
|
-
return (_jsx(HomepageCustomerReviewsSection, { title: cleanTitle(cfg?.title) || "What Our Customers Say", viewMoreHref: ROUTES.PUBLIC.REVIEWS, viewMoreLabel: "See all reviews \u2192" }));
|
|
188
|
-
}
|
|
189
|
-
case "banner": {
|
|
190
|
-
const cfg = config;
|
|
191
|
-
return (_jsx(CTABannerSection, { title: cfg?.content?.title || "Thousands of collectibles. One marketplace.", primaryLabel: "Shop All Products \u2192", primaryHref: ROUTES.PUBLIC.PRODUCTS, secondaryLabel: "Browse Auctions \u2192", secondaryHref: ROUTES.PUBLIC.AUCTIONS }));
|
|
192
|
-
}
|
|
193
|
-
case "trust-indicators": {
|
|
194
|
-
const cfg = config;
|
|
195
|
-
return (_jsx(TrustFeaturesSection, { title: cleanTitle(cfg?.title) || "Why Buyers Trust LetiTrip", items: DEFAULT_TRUST_FEATURES }));
|
|
196
|
-
}
|
|
197
|
-
case "features": {
|
|
198
|
-
const cfg = config;
|
|
199
|
-
return (_jsx(SecurityHighlightsSection, { title: cleanTitle(cfg?.title) || "Security You Can Trust", pillLabel: "Built for trust", items: DEFAULT_SECURITY_ITEMS, learnMoreHref: ROUTES.PUBLIC.SECURITY, learnMoreLabel: "Learn about our security \u2192" }));
|
|
200
|
-
}
|
|
201
|
-
case "whatsapp-community": {
|
|
202
|
-
const cfg = config;
|
|
203
|
-
return (_jsx(WhatsAppCommunitySection, { title: cleanTitle(cfg?.title) || "Join Our WhatsApp Community", descriptionHtml: cfg?.description || "5,000+ members. Get deal alerts, auction updates, and exclusive drops before anyone else.", memberCount: cfg?.memberCount || 5000, groupLink: cfg?.groupLink || "https://chat.whatsapp.com/" }));
|
|
204
|
-
}
|
|
205
|
-
case "faq": {
|
|
206
|
-
const cfg = config;
|
|
207
|
-
if (!cfg?.showOnHomepage) {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
return (_jsx(FAQSection, { title: cleanTitle(cfg?.title) || "Frequently Asked Questions", tabs: [], activeTab: "", items: faqItems, viewMoreHref: ROUTES.PUBLIC.FAQS, viewMoreLabel: "View all FAQs \u2192" }));
|
|
211
|
-
}
|
|
212
|
-
case "blog-articles": {
|
|
213
|
-
const cfg = config;
|
|
214
|
-
return (_jsx(BlogArticlesSection, { title: cleanTitle(cfg?.title) || "From Our Blog", viewMoreHref: ROUTES.BLOG.LIST, viewMoreLabel: "View all posts \u2192" }));
|
|
215
|
-
}
|
|
216
|
-
case "newsletter": {
|
|
217
|
-
const cfg = config;
|
|
218
|
-
return (_jsx(NewsletterSection, { title: cleanTitle(cfg?.title) || "Stay Updated", subtitle: cfg?.description || "Get the latest drops, auctions, and deals in your inbox.", renderForm: () => newsletterFormSlot ?? null }));
|
|
219
|
-
}
|
|
220
|
-
case "brands": {
|
|
221
|
-
const cfg = config;
|
|
222
|
-
return (_jsx(BrandsSection, { title: cleanTitle(cfg?.title) || "Top Brands", subtitle: cfg?.subtitle, limit: cfg?.maxBrands || 12, viewMoreHref: ROUTES.PUBLIC.CATEGORIES, viewMoreLabel: "All brands \u2192" }));
|
|
223
|
-
}
|
|
224
|
-
default:
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
})();
|
|
228
|
-
// Return section with optional ad slot before it
|
|
229
|
-
if (!sectionElement) {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
return (_jsxs(React.Fragment, { children: [sectionElement, adSlots && adSlotKey !== undefined && adSlotKey in adSlots && adSlots[adSlotKey]] }, section.id));
|
|
18
|
+
function toCarouselSlides(docs) {
|
|
19
|
+
return docs.map(({ createdAt, updatedAt, analytics: _analytics, createdBy: _createdBy, ...rest }) => ({
|
|
20
|
+
...rest,
|
|
21
|
+
createdAt: createdAt instanceof Date ? createdAt.toISOString() : undefined,
|
|
22
|
+
updatedAt: updatedAt instanceof Date ? updatedAt.toISOString() : undefined,
|
|
23
|
+
}));
|
|
233
24
|
}
|
|
234
|
-
// --- Main View ---------------------------------------------------------------
|
|
235
25
|
export async function MarketplaceHomepageView({ adSlots, newsletterFormSlot, } = {}) {
|
|
236
|
-
// Load carousel slides and sections from DB
|
|
237
26
|
const slides = await carouselRepository.getActiveSlides().catch(() => []);
|
|
238
27
|
const siteSettings = await siteSettingsRepository.getSingleton().catch(() => null);
|
|
239
28
|
const announcementMessage = siteSettings?.announcementBar?.message?.trim() ||
|
|
@@ -243,6 +32,19 @@ export async function MarketplaceHomepageView({ adSlots, newsletterFormSlot, } =
|
|
|
243
32
|
homepageSectionsRepository.getEnabledSections().catch(() => []),
|
|
244
33
|
faqsRepository.getHomepageFAQs().catch(() => []),
|
|
245
34
|
]);
|
|
35
|
+
// Collect only the live metric keys that are actually configured in this deployment
|
|
36
|
+
const liveMetricsNeeded = new Set();
|
|
37
|
+
for (const section of enabledSections) {
|
|
38
|
+
if (section.type === "stats") {
|
|
39
|
+
const cfg = section.config;
|
|
40
|
+
for (const stat of cfg?.stats ?? []) {
|
|
41
|
+
if (stat.source === "live" && stat.metric) {
|
|
42
|
+
liveMetricsNeeded.add(stat.metric);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const liveStats = liveMetricsNeeded.size > 0 ? await fetchLiveStats([...liveMetricsNeeded]) : {};
|
|
246
48
|
const orderedSections = [...enabledSections].sort((a, b) => {
|
|
247
49
|
if (a.order !== b.order)
|
|
248
50
|
return a.order - b.order;
|
|
@@ -257,6 +59,47 @@ export async function MarketplaceHomepageView({ adSlots, newsletterFormSlot, } =
|
|
|
257
59
|
question: faq.question,
|
|
258
60
|
answer: typeof faq.answer === "string" ? faq.answer : faq.answer.text,
|
|
259
61
|
}));
|
|
260
|
-
//
|
|
261
|
-
|
|
62
|
+
// Determine which data-driven section types are active so we only fetch what's needed
|
|
63
|
+
const activeTypes = new Set(orderedSections.map((s) => s.type));
|
|
64
|
+
const [productsResult, auctionsResult, preOrdersResult, categoriesResult, brandsResult, storesResult, blogResult, eventsResult,] = await Promise.all([
|
|
65
|
+
activeTypes.has("products") ? getFeaturedProducts(12).catch(() => null) : null,
|
|
66
|
+
activeTypes.has("auctions") ? getFeaturedAuctions(12).catch(() => null) : null,
|
|
67
|
+
activeTypes.has("pre-orders") ? getFeaturedPreOrders(12).catch(() => null) : null,
|
|
68
|
+
activeTypes.has("categories") ? listTopLevelCategories(12).catch(() => null) : null,
|
|
69
|
+
activeTypes.has("brands") ? listBrandCategories(12).catch(() => null) : null,
|
|
70
|
+
activeTypes.has("stores") ? listStores({ pageSize: 8, sorts: "-averageRating" }).catch(() => null) : null,
|
|
71
|
+
activeTypes.has("blog-articles") ? getFeaturedBlogPosts(6).catch(() => null) : null,
|
|
72
|
+
activeTypes.has("events") ? listPublicEvents({ filters: "status==active", pageSize: 6 }).catch(() => null) : null,
|
|
73
|
+
]);
|
|
74
|
+
// ProductDocument / BlogDocument / EventDocument have Date fields and extra Firestore-only
|
|
75
|
+
// fields absent from the corresponding *Item types. The casts below are safe: section
|
|
76
|
+
// components only read display fields that are present on both document and item shapes.
|
|
77
|
+
const sectionData = {
|
|
78
|
+
products: productsResult?.items?.length
|
|
79
|
+
? productsResult.items
|
|
80
|
+
: undefined,
|
|
81
|
+
auctions: auctionsResult?.items?.length
|
|
82
|
+
? auctionsResult.items
|
|
83
|
+
: undefined,
|
|
84
|
+
preOrders: preOrdersResult?.items?.length
|
|
85
|
+
? preOrdersResult.items
|
|
86
|
+
: undefined,
|
|
87
|
+
categories: categoriesResult?.length
|
|
88
|
+
? categoriesResult
|
|
89
|
+
: undefined,
|
|
90
|
+
brands: brandsResult?.length
|
|
91
|
+
? brandsResult
|
|
92
|
+
: undefined,
|
|
93
|
+
stores: storesResult?.items?.length
|
|
94
|
+
? storesResult.items
|
|
95
|
+
: undefined,
|
|
96
|
+
blog: blogResult?.length
|
|
97
|
+
? blogResult
|
|
98
|
+
: undefined,
|
|
99
|
+
events: eventsResult?.items?.length
|
|
100
|
+
? eventsResult.items
|
|
101
|
+
: undefined,
|
|
102
|
+
};
|
|
103
|
+
const carouselSlides = toCarouselSlides(slides);
|
|
104
|
+
return (_jsxs(Main, { children: [showAnnouncement ? _jsx(AnnouncementBar, { message: announcementMessage }) : null, orderedSections.map((section) => renderSection(section, adSlots, newsletterFormSlot ?? null, faqItems, carouselSlides, liveStats, sectionData))] }));
|
|
262
105
|
}
|
|
@@ -72,4 +72,4 @@ export interface SectionCarouselProps<T = unknown> {
|
|
|
72
72
|
*/
|
|
73
73
|
minItemWidth?: number;
|
|
74
74
|
}
|
|
75
|
-
export declare function SectionCarousel<T = unknown>({ title, description, headingVariant, pillLabel, backgroundImage, viewMoreHref, viewMoreLabel, items, renderItem, perView, gap, autoScroll, autoScrollInterval, keyExtractor, rows, className, isLoading, skeletonCount, lightText, showPeek, minItemWidth, }: SectionCarouselProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
export declare function SectionCarousel<T = unknown>({ title, description, headingVariant, pillLabel, backgroundImage, viewMoreHref, viewMoreLabel, items, renderItem, perView, gap, autoScroll, autoScrollInterval, keyExtractor, rows, className, isLoading, skeletonCount, lightText, showPeek, minItemWidth, }: SectionCarouselProps<T>): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -9,6 +9,8 @@ function CarouselSkeleton({ count }) {
|
|
|
9
9
|
}
|
|
10
10
|
// --- Component ---------------------------------------------------------------
|
|
11
11
|
export function SectionCarousel({ title, description, headingVariant = "editorial", pillLabel, backgroundImage, viewMoreHref, viewMoreLabel = "View all →", items, renderItem, perView = THEME_CONSTANTS.carousel.perView.standard, gap = 16, autoScroll = false, autoScrollInterval = 3500, keyExtractor, rows = 1, className = "", isLoading = false, skeletonCount = 4, lightText, showPeek = false, minItemWidth = 220, }) {
|
|
12
|
+
if (!isLoading && items.length === 0)
|
|
13
|
+
return null;
|
|
12
14
|
const hasBg = Boolean(backgroundImage);
|
|
13
15
|
const useLightText = lightText ?? hasBg;
|
|
14
16
|
const { themed, flex } = THEME_CONSTANTS;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CategoryItem } from "../../categories/types";
|
|
1
2
|
export interface ShopByCategorySectionProps {
|
|
2
3
|
title?: string;
|
|
3
4
|
subtitle?: string;
|
|
@@ -5,5 +6,6 @@ export interface ShopByCategorySectionProps {
|
|
|
5
6
|
viewMoreHref?: string;
|
|
6
7
|
viewMoreLabel?: string;
|
|
7
8
|
className?: string;
|
|
9
|
+
initialItems?: CategoryItem[];
|
|
8
10
|
}
|
|
9
|
-
export declare function ShopByCategorySection({ title, subtitle, limit, viewMoreHref, viewMoreLabel, className, }: ShopByCategorySectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
export declare function ShopByCategorySection({ title, subtitle, limit, viewMoreHref, viewMoreLabel, className, initialItems, }: ShopByCategorySectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Image from "next/image";
|
|
3
4
|
import Link from "next/link";
|
|
4
5
|
import { THEME_CONSTANTS } from "../../../tokens";
|
|
5
6
|
import { Heading, HorizontalScroller, Section, Text } from "../../../ui";
|
|
6
7
|
import { ROUTES } from "../../../next";
|
|
7
8
|
import { useTopCategories } from "../hooks/useTopCategories";
|
|
9
|
+
function isImageUrl(s) {
|
|
10
|
+
return s.startsWith("http") || s.startsWith("/") || s.startsWith("data:");
|
|
11
|
+
}
|
|
8
12
|
function CategoryChip({ category }) {
|
|
9
13
|
const iconSrc = category.display?.icon;
|
|
10
14
|
const coverImage = category.display?.coverImage;
|
|
11
15
|
const initial = category.name[0]?.toUpperCase() ?? "?";
|
|
12
16
|
const productCount = category.metrics?.productCount ?? 0;
|
|
13
|
-
return (_jsxs(Link, { href: ROUTES.PUBLIC.CATEGORY_DETAIL(category.slug), className: "group flex w-full min-h-[220px] flex-col overflow-hidden rounded-xl border border-zinc-200 bg-white shadow-sm transition-all hover:border-primary-300 hover:shadow-md dark:border-slate-700 dark:bg-slate-900 dark:hover:border-primary-600", children: [coverImage ? (_jsx("div", { className: "aspect-video w-full overflow-hidden bg-zinc-100 dark:bg-slate-800",
|
|
17
|
+
return (_jsxs(Link, { href: ROUTES.PUBLIC.CATEGORY_DETAIL(category.slug), className: "group flex w-full min-h-[220px] flex-col overflow-hidden rounded-xl border border-zinc-200 bg-white shadow-sm transition-all hover:border-primary-300 hover:shadow-md dark:border-slate-700 dark:bg-slate-900 dark:hover:border-primary-600", children: [coverImage && isImageUrl(coverImage) ? (_jsx("div", { className: "aspect-video w-full overflow-hidden bg-zinc-100 dark:bg-slate-800", children: _jsx(Image, { src: coverImage, alt: category.name, width: 320, height: 180, className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" }) })) : (_jsx("div", { className: "aspect-video w-full bg-gradient-to-br from-zinc-100 to-zinc-200 dark:from-slate-800 dark:to-slate-700" })), _jsxs("div", { className: "flex flex-1 flex-col p-3 text-left", children: [_jsx("div", { className: "mb-2 flex h-9 w-9 items-center justify-center rounded-lg bg-primary-100 text-sm font-bold text-primary-700 dark:bg-primary-900 dark:text-primary-300", children: iconSrc && isImageUrl(iconSrc) ? (_jsx(Image, { src: iconSrc, alt: "", width: 24, height: 24, className: "h-6 w-6 rounded object-cover", "aria-hidden": true })) : iconSrc ? (_jsx("span", { "aria-hidden": "true", className: "text-lg leading-none", children: iconSrc })) : (initial) }), _jsx(Text, { className: `${THEME_CONSTANTS.utilities.textClamp2} text-sm font-semibold text-zinc-800 dark:text-zinc-200`, children: category.name }), _jsxs(Text, { className: "mt-1 text-xs text-zinc-500 dark:text-zinc-400", children: [productCount.toLocaleString(), " items"] }), _jsx(Text, { className: "mt-auto pt-3 text-xs font-medium text-primary dark:text-primary-400", children: "Browse category \u2192" })] })] }));
|
|
14
18
|
}
|
|
15
|
-
export function ShopByCategorySection({ title = "Shop by Category", subtitle, limit = 12, viewMoreHref, viewMoreLabel = "View all categories →", className = "", }) {
|
|
19
|
+
export function ShopByCategorySection({ title = "Shop by Category", subtitle, limit = 12, viewMoreHref, viewMoreLabel = "View all categories →", className = "", initialItems, }) {
|
|
16
20
|
const { themed } = THEME_CONSTANTS;
|
|
17
|
-
const { data: categories = [], isLoading } = useTopCategories(limit);
|
|
21
|
+
const { data: categories = [], isLoading } = useTopCategories(limit, { initialData: initialItems });
|
|
18
22
|
if (!isLoading && categories.length === 0)
|
|
19
23
|
return null;
|
|
20
|
-
return (_jsx(Section, { className: `py-12 px-4 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "mx-auto max-w-7xl",
|
|
24
|
+
return (_jsx(Section, { className: `py-12 px-4 ${themed.bgSecondary} ${className}`, children: _jsxs("div", { className: "mx-auto max-w-7xl", children: [_jsxs("div", { className: "mb-6 text-center", children: [_jsx(Heading, { level: 2, className: `text-2xl font-bold md:text-3xl ${themed.textPrimary}`, children: title }), subtitle && (_jsx(Text, { variant: "secondary", className: "mt-1 text-sm", children: subtitle }))] }), isLoading ? (_jsx("div", { className: "flex gap-3 overflow-hidden px-1", children: Array.from({ length: 6 }).map((_, i) => (_jsx("div", { className: "flex-none h-[104px] w-[108px] animate-pulse rounded-xl bg-zinc-200 dark:bg-slate-700" }, i))) })) : (_jsx(HorizontalScroller, { items: categories, renderItem: (cat) => _jsx(CategoryChip, { category: cat }), perView: THEME_CONSTANTS.carousel.perView.standard, gap: 16, keyExtractor: (cat) => cat.id, autoScroll: true, autoScrollInterval: 3500, showArrows: true, snapToItems: true, showFadeEdges: true, showScrollbar: false, pauseOnHover: true })), viewMoreHref && !isLoading && (_jsx("div", { className: "mt-6 text-center", children: _jsx(Link, { href: viewMoreHref, className: "inline-flex items-center gap-1 text-sm font-medium text-primary hover:text-primary/80", children: viewMoreLabel }) }))] }) }));
|
|
21
25
|
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Heading, Section, Text } from "../../../ui";
|
|
3
|
+
import { THEME_CONSTANTS } from "../../../tokens";
|
|
4
|
+
import { SocialPostCard } from "./SocialPostCard";
|
|
5
|
+
import { fetchInstagramPosts, fetchFacebookPosts, fetchTikTokPosts, fetchDeviantArtPosts, } from "../lib/social-feed-fetcher";
|
|
6
|
+
import { siteSettingsRepository } from "../../admin/repository/site-settings.repository";
|
|
7
|
+
// --- Platform labels ---------------------------------------------------------
|
|
8
|
+
const PLATFORM_LABELS = {
|
|
9
|
+
instagram: "Instagram",
|
|
10
|
+
facebook: "Facebook",
|
|
11
|
+
tiktok: "TikTok",
|
|
12
|
+
deviantart: "DeviantArt",
|
|
13
|
+
};
|
|
14
|
+
function platformProfileUrl(platform, handle) {
|
|
15
|
+
switch (platform) {
|
|
16
|
+
case "instagram": return `https://www.instagram.com/${handle}/`;
|
|
17
|
+
case "facebook": return `https://www.facebook.com/${handle}`;
|
|
18
|
+
case "tiktok": return `https://www.tiktok.com/@${handle}`;
|
|
19
|
+
case "deviantart": return `https://www.deviantart.com/${handle}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// --- Skeleton ----------------------------------------------------------------
|
|
23
|
+
function SocialFeedSkeleton({ count }) {
|
|
24
|
+
return (_jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3", children: Array.from({ length: count }).map((_, i) => (_jsx("div", { className: "aspect-square rounded-xl bg-zinc-200 dark:bg-zinc-700 animate-pulse" }, i))) }));
|
|
25
|
+
}
|
|
26
|
+
// --- Empty state -------------------------------------------------------------
|
|
27
|
+
function SocialFeedEmpty({ platform }) {
|
|
28
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-zinc-400", children: [_jsxs("svg", { className: "w-10 h-10 mb-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "3" }), _jsx("path", { d: "M9 9h6M9 12h6M9 15h4" })] }), _jsxs(Text, { size: "sm", children: ["No posts from ", PLATFORM_LABELS[platform], " yet."] })] }));
|
|
29
|
+
}
|
|
30
|
+
// --- Server fetch ------------------------------------------------------------
|
|
31
|
+
async function loadPosts(config) {
|
|
32
|
+
const { platform, handle, postType, count } = config;
|
|
33
|
+
try {
|
|
34
|
+
const credentials = await siteSettingsRepository.getDecryptedCredentials().catch(() => null);
|
|
35
|
+
switch (platform) {
|
|
36
|
+
case "instagram": {
|
|
37
|
+
const token = credentials?.metaPageAccessToken;
|
|
38
|
+
if (!token)
|
|
39
|
+
return { posts: [], error: "Instagram access token not configured in Site Settings." };
|
|
40
|
+
return { posts: await fetchInstagramPosts(handle, postType, count, token) };
|
|
41
|
+
}
|
|
42
|
+
case "facebook": {
|
|
43
|
+
const token = credentials?.metaPageAccessToken;
|
|
44
|
+
if (!token)
|
|
45
|
+
return { posts: [], error: "Facebook access token not configured in Site Settings." };
|
|
46
|
+
return { posts: await fetchFacebookPosts(handle, postType, count, token) };
|
|
47
|
+
}
|
|
48
|
+
case "tiktok": {
|
|
49
|
+
const token = credentials?.tiktokAccessToken;
|
|
50
|
+
if (!token)
|
|
51
|
+
return { posts: [], error: "TikTok access token not configured in Site Settings." };
|
|
52
|
+
return { posts: await fetchTikTokPosts(handle, postType, count, token) };
|
|
53
|
+
}
|
|
54
|
+
case "deviantart": {
|
|
55
|
+
const clientId = credentials?.deviantartClientId;
|
|
56
|
+
const clientSecret = credentials?.deviantartClientSecret;
|
|
57
|
+
if (!clientId || !clientSecret)
|
|
58
|
+
return { posts: [], error: "DeviantArt credentials not configured in Site Settings." };
|
|
59
|
+
return { posts: await fetchDeviantArtPosts(handle, postType, count, clientId, clientSecret) };
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
return { posts: [], error: "Unsupported platform." };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const message = err instanceof Error ? err.message : "Unknown error";
|
|
67
|
+
console.error(`[SocialFeedSection] ${platform} fetch failed:`, message);
|
|
68
|
+
return { posts: [], error: `Could not load ${PLATFORM_LABELS[platform]} posts right now.` };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function SocialFeedSection(config) {
|
|
72
|
+
const { title, subtitle, platform, handle, layout, showCaption, showStats, count } = config;
|
|
73
|
+
const { themed } = THEME_CONSTANTS;
|
|
74
|
+
const { posts, error } = await loadPosts(config);
|
|
75
|
+
const gridClass = layout === "carousel"
|
|
76
|
+
? "flex gap-3 overflow-x-auto pb-2 snap-x snap-mandatory"
|
|
77
|
+
: layout === "masonry"
|
|
78
|
+
? "columns-2 sm:columns-3 lg:columns-4 gap-3 space-y-3"
|
|
79
|
+
: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3";
|
|
80
|
+
const cardClass = layout === "carousel"
|
|
81
|
+
? "flex-shrink-0 w-48 sm:w-56 snap-start"
|
|
82
|
+
: layout === "masonry"
|
|
83
|
+
? "break-inside-avoid"
|
|
84
|
+
: "";
|
|
85
|
+
return (_jsx(Section, { className: `py-12 ${themed.bgPrimary}`, children: _jsxs("div", { className: "w-full max-w-7xl mx-auto px-4", children: [_jsxs("div", { className: "mb-8 flex items-end justify-between gap-4", children: [_jsxs("div", { children: [_jsx(Heading, { level: 2, className: "mb-1", children: title || `${PLATFORM_LABELS[platform]} Feed` }), subtitle && (_jsx(Text, { size: "sm", variant: "muted", children: subtitle }))] }), _jsxs("a", { href: platformProfileUrl(platform, handle), target: "_blank", rel: "noopener noreferrer", className: "shrink-0 text-sm font-medium text-blue-600 dark:text-blue-400 hover:underline", children: ["Follow on ", PLATFORM_LABELS[platform], " \u2192"] })] }), error ? (_jsx("div", { className: "py-12 text-center text-zinc-400 text-sm", children: error })) : posts.length === 0 ? (_jsx(SocialFeedEmpty, { platform: platform })) : (_jsx("div", { className: gridClass, children: posts.slice(0, count).map((post) => (_jsx("div", { className: cardClass, children: _jsx(SocialPostCard, { post: post, showCaption: showCaption, showStats: showStats }) }, post.id))) }))] }) }));
|
|
86
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SocialPost } from "../schemas";
|
|
2
|
+
export interface SocialPostCardProps {
|
|
3
|
+
post: SocialPost;
|
|
4
|
+
showCaption?: boolean;
|
|
5
|
+
showStats?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function SocialPostCard({ post, showCaption, showStats }: SocialPostCardProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
// --- Platform brand colours & icons ------------------------------------------
|
|
4
|
+
const PLATFORM_META = {
|
|
5
|
+
instagram: {
|
|
6
|
+
label: "Instagram",
|
|
7
|
+
color: "bg-gradient-to-br from-purple-500 via-pink-500 to-orange-400",
|
|
8
|
+
icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z" }) })),
|
|
9
|
+
},
|
|
10
|
+
facebook: {
|
|
11
|
+
label: "Facebook",
|
|
12
|
+
color: "bg-blue-600",
|
|
13
|
+
icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" }) })),
|
|
14
|
+
},
|
|
15
|
+
tiktok: {
|
|
16
|
+
label: "TikTok",
|
|
17
|
+
color: "bg-black",
|
|
18
|
+
icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z" }) })),
|
|
19
|
+
},
|
|
20
|
+
deviantart: {
|
|
21
|
+
label: "DeviantArt",
|
|
22
|
+
color: "bg-green-600",
|
|
23
|
+
icon: (_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M19.207 4.794l.23-.43V0h-4.169l-.321.33-1.445 2.698-.428.33H4.793v5.994l.289.321 1.156 2.168v.065l-1.156 2.168-.289.321V19.8h8.481l.428.33 1.445 2.698.321.329h4.169v-4.364l-.23-.43-1.09-2.044v-.064l1.09-2.044.23-.43V4.794zM14.72 14.058h-4.53v-4.116h4.53v4.116z" }) })),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
// --- Stats formatter ---------------------------------------------------------
|
|
27
|
+
function formatCount(n) {
|
|
28
|
+
if (n == null)
|
|
29
|
+
return null;
|
|
30
|
+
if (n >= 1000000)
|
|
31
|
+
return `${(n / 1000000).toFixed(1)}M`;
|
|
32
|
+
if (n >= 1000)
|
|
33
|
+
return `${(n / 1000).toFixed(1)}K`;
|
|
34
|
+
return String(n);
|
|
35
|
+
}
|
|
36
|
+
export function SocialPostCard({ post, showCaption = true, showStats = true }) {
|
|
37
|
+
const meta = PLATFORM_META[post.platform];
|
|
38
|
+
return (_jsxs("a", { href: post.permalink, target: "_blank", rel: "noopener noreferrer", className: "group relative block rounded-xl overflow-hidden bg-zinc-100 dark:bg-zinc-800 aspect-square focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500", "aria-label": post.caption ?? `View on ${meta.label}`, children: [post.imageUrl ? (_jsx("img", { src: post.imageUrl, alt: post.caption ?? `${meta.label} post`, className: "w-full h-full object-cover transition-transform duration-300 group-hover:scale-105", loading: "lazy" })) : (_jsx("div", { className: "w-full h-full flex items-center justify-center bg-zinc-200 dark:bg-zinc-700", children: _jsx("span", { className: "text-zinc-400 text-sm", children: "No preview" }) })), post.mediaType === "video" && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: _jsx("div", { className: "w-12 h-12 rounded-full bg-black/50 backdrop-blur-sm flex items-center justify-center", children: _jsx("svg", { className: "w-5 h-5 text-white ml-1", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M8 5v14l11-7z" }) }) }) })), post.mediaType === "carousel" && (_jsx("div", { className: "absolute top-2 right-2 pointer-events-none", children: _jsx("div", { className: "w-6 h-6 rounded bg-black/50 backdrop-blur-sm flex items-center justify-center", children: _jsxs("svg", { className: "w-3.5 h-3.5 text-white", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("rect", { x: "2", y: "3", width: "15", height: "15", rx: "2" }), _jsx("path", { d: "M7 8h14M7 12h14M7 16h14" })] }) }) })), _jsxs("div", { className: `absolute top-2 left-2 flex items-center gap-1 px-1.5 py-1 rounded text-white text-xs font-medium ${meta.color}`, children: [meta.icon, _jsx("span", { className: "hidden sm:inline", children: meta.label })] }), _jsxs("div", { className: "absolute inset-0 bg-black/70 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex flex-col justify-end p-3 pointer-events-none", children: [showCaption && post.caption && (_jsx("p", { className: "text-white text-xs line-clamp-3 mb-2", children: post.caption })), showStats && (_jsxs("div", { className: "flex items-center gap-3 text-white/80 text-xs", children: [post.stats.likes != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" }) }), formatCount(post.stats.likes)] })), post.stats.views != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" }) }), formatCount(post.stats.views)] })), post.stats.comments != null && (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "currentColor", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }), formatCount(post.stats.comments)] }))] }))] })] }));
|
|
39
|
+
}
|
|
@@ -9,7 +9,7 @@ function StatCard({ stat, visible, delay, isLast, }) {
|
|
|
9
9
|
"transition-all duration-700",
|
|
10
10
|
visible ? "translate-y-0 opacity-100" : "translate-y-6 opacity-0",
|
|
11
11
|
!isLast ? "border-r border-zinc-200 dark:border-slate-700" : "",
|
|
12
|
-
].join(" "), style: { transitionDelay: `${delay}ms` }, children: [stat.renderIcon && (_jsx(Div, { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary-50 dark:bg-primary-950/40 border border-primary-100 dark:border-primary-900/30", children: stat.renderIcon({ className: "w-7 h-7" }) })), _jsx(Heading, { level: 2, variant: "none", className: "mb-1 font-display text-4xl font-black bg-gradient-to-r from-primary
|
|
12
|
+
].join(" "), style: { transitionDelay: `${delay}ms` }, children: [stat.renderIcon && (_jsx(Div, { className: "mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary-50 dark:bg-primary-950/40 border border-primary-100 dark:border-primary-900/30", children: stat.renderIcon({ className: "w-7 h-7" }) })), _jsx(Heading, { level: 2, variant: "none", className: "mb-1 font-display text-4xl font-black bg-gradient-to-r from-primary to-secondary dark:from-primary dark:to-cobalt-400 bg-clip-text text-transparent md:text-5xl", children: stat.value }), _jsx(Text, { variant: "none", className: "text-xs uppercase tracking-widest text-zinc-500 dark:text-zinc-400 font-medium", children: stat.label })] }));
|
|
13
13
|
}
|
|
14
14
|
// --- Sectmon -----------------------------------------------------------------
|
|
15
15
|
export function StatsCounterSection({ stats, className = "", }) {
|
|
@@ -8,5 +8,5 @@ export function WelcomeSection({ title, subtitle, pillLabel, showCTA = true, cta
|
|
|
8
8
|
if (isLoading) {
|
|
9
9
|
return (_jsx(Section, { className: `relative overflow-hidden py-16 md:py-24 px-4 ${className}`, children: _jsxs("div", { className: "animate-pulse max-w-4xl mx-auto text-center", "data-section": "welcomesection-div-382", children: [_jsx("div", { className: "h-6 bg-zinc-200 dark:bg-slate-700 rounded-full w-52 mx-auto mb-6" }), _jsx("div", { className: "h-20 bg-zinc-200 dark:bg-slate-700 rounded-lg mb-4 max-w-2xl mx-auto" }), _jsx("div", { className: "h-6 bg-zinc-200 dark:bg-slate-700 rounded-lg mb-8 max-w-lg mx-auto" }), _jsxs("div", { className: "flex justify-center gap-4", "data-section": "welcomesection-div-383", children: [_jsx("div", { className: "h-12 bg-zinc-200 dark:bg-slate-700 rounded-xl w-36" }), _jsx("div", { className: "h-12 bg-zinc-200 dark:bg-slate-700 rounded-xl w-36" })] })] }) }));
|
|
10
10
|
}
|
|
11
|
-
return (_jsxs(Section, { className: `relative overflow-hidden py-20 md:py-28 px-4 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -top-32 -left-32 w-[28rem] h-[28rem] rounded-full bg-primary/10 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "pointer-events-none absolute -bottom-40 -right-40 w-[36rem] h-[36rem] rounded-full bg-secondary/10 dark:bg-secondary/15 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "relative z-10 max-w-7xl mx-auto", "data-section": "welcomesection-div-384", children: _jsxs(Grid, { gap: "2xl", className: "grid-cols-1 lg:grid-cols-2 xl:grid-cols-2 2xl:grid-cols-2 items-center", children: [_jsxs("div", { className: "text-center lg:text-left", "data-section": "welcomesection-div-385", children: [pillLabel && (_jsx("div", { "data-section": "welcomesection-div-386", children: _jsxs(Span, { className: "inline-flex items-center gap-2 rounded-full border border-primary-500/30 bg-primary-500/10 px-5 py-1.5 text-xs font-medium tracking-[0.2em] uppercase text-primary-700 dark:text-primary-400 backdrop-blur-sm", children: [_jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" }), pillLabel, _jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" })] }) })), _jsx(Heading, { level: 1, variant: "none", className: "mt-4 font-display text-5xl md:text-6xl lg:text-7xl xl:text-8xl bg-gradient-to-r from-primary-
|
|
11
|
+
return (_jsxs(Section, { className: `relative overflow-hidden py-20 md:py-28 px-4 ${className}`, children: [_jsx("div", { className: "pointer-events-none absolute -top-32 -left-32 w-[28rem] h-[28rem] rounded-full bg-primary/10 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "pointer-events-none absolute -bottom-40 -right-40 w-[36rem] h-[36rem] rounded-full bg-secondary/10 dark:bg-secondary/15 blur-3xl", "aria-hidden": "true" }), _jsx("div", { className: "relative z-10 max-w-7xl mx-auto", "data-section": "welcomesection-div-384", children: _jsxs(Grid, { gap: "2xl", className: "grid-cols-1 lg:grid-cols-2 xl:grid-cols-2 2xl:grid-cols-2 items-center", children: [_jsxs("div", { className: "text-center lg:text-left", "data-section": "welcomesection-div-385", children: [pillLabel && (_jsx("div", { "data-section": "welcomesection-div-386", children: _jsxs(Span, { className: "inline-flex items-center gap-2 rounded-full border border-primary-500/30 bg-primary-500/10 px-5 py-1.5 text-xs font-medium tracking-[0.2em] uppercase text-primary-700 dark:text-primary-400 backdrop-blur-sm", children: [_jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" }), pillLabel, _jsx(Span, { className: "w-1.5 h-1.5 rounded-full bg-primary-500 inline-block", "aria-hidden": "true" })] }) })), _jsx(Heading, { level: 1, variant: "none", className: "mt-4 font-display text-5xl md:text-6xl lg:text-7xl xl:text-8xl bg-gradient-to-r from-primary-700 via-cobalt to-secondary-400 dark:from-primary dark:via-cobalt-400 dark:to-primary-300 bg-clip-text text-transparent leading-[1.1] tracking-tight", children: title }), subtitle && (_jsx(Text, { className: `mt-4 text-xl ${themed.textSecondary} max-w-xl leading-relaxed mx-auto lg:mx-0`, children: subtitle })), showCTA && (_jsxs(Row, { wrap: true, gap: "md", className: "mt-8 justify-center lg:justify-start", children: [ctaHref ? (_jsx(TextLink, { href: ctaHref, className: "inline-flex items-center justify-center rounded-xl px-8 py-3.5 text-base font-bold !bg-primary hover:!bg-primary-600 text-white dark:!bg-primary dark:hover:!bg-primary-600 dark:text-white btn-glow transition-all hover:scale-[1.02]", children: ctaLabel })) : (_jsx(Button, { variant: "primary", size: "lg", onClick: onCtaClick, children: ctaLabel })), secondaryCtaHref ? (_jsx(TextLink, { href: secondaryCtaHref, className: "inline-flex items-center justify-center rounded-xl border-2 border-cobalt/40 dark:border-cobalt-400/40 px-8 py-3.5 text-base font-semibold text-cobalt-700 dark:text-cobalt-300 hover:bg-cobalt-50 dark:hover:bg-cobalt-900/20 transition-all hover:scale-[1.02]", children: secondaryCtaLabel })) : (_jsx(Button, { variant: "outline", size: "lg", onClick: onSecondaryCtaClick, children: secondaryCtaLabel }))] })), trustChips.length > 0 && (_jsx(Row, { wrap: true, gap: "sm", className: "mt-6 justify-center lg:justify-start", children: trustChips.map((chip) => (_jsxs(Span, { className: "inline-flex items-center gap-1.5 bg-zinc-100 dark:bg-slate-800 border border-zinc-200 dark:border-slate-700 rounded-full px-3.5 py-1.5 text-xs font-medium text-zinc-700 dark:text-zinc-300", children: [chip.emoji, " ", chip.label] }, chip.key))) }))] }), _jsx("div", { className: "hidden lg:block", "data-section": "welcomesection-div-387", children: _jsxs("div", { className: `relative rounded-3xl overflow-hidden aspect-[4/3] bg-gradient-to-br from-primary-100 via-cobalt-100/60 to-secondary-100 dark:from-primary-950/60 dark:via-cobalt-950/40 dark:to-secondary-950/60 border ${themed.border} shadow-2xl`, "data-section": "welcomesection-div-388", children: [_jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-cobalt/5" }), _jsx("div", { className: `absolute inset-0 ${flex.center}`, "data-section": "welcomesection-div-389", children: _jsx(Span, { className: "font-display text-9xl font-black text-primary-400/30 dark:text-secondary-400/30 select-none", children: brandLogoText }) })] }) })] }) })] }));
|
|
12
12
|
}
|