@beyondcorp/beyond-ui 1.2.53 → 1.2.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.
- package/dist/components/Blog/AllBlogsView.d.ts +8 -0
- package/dist/components/Blog/AllBlogsView.js +70 -0
- package/dist/components/Blog/AllBlogsView.js.map +1 -0
- package/dist/components/Blog/BlogCommentSection.d.ts +7 -0
- package/dist/components/Blog/BlogCommentSection.js +66 -0
- package/dist/components/Blog/BlogCommentSection.js.map +1 -0
- package/dist/components/Blog/BlogLayout.d.ts +11 -0
- package/dist/components/Blog/BlogLayout.js +29 -0
- package/dist/components/Blog/BlogLayout.js.map +1 -0
- package/dist/components/Blog/BlogShowcase.d.ts +2 -0
- package/dist/components/Blog/BlogShowcase.js +74 -0
- package/dist/components/Blog/BlogShowcase.js.map +1 -0
- package/dist/components/Blog/BlogSidebar.d.ts +10 -0
- package/dist/components/Blog/BlogSidebar.js +47 -0
- package/dist/components/Blog/BlogSidebar.js.map +1 -0
- package/dist/components/Blog/SingleBlogView.d.ts +8 -0
- package/dist/components/Blog/SingleBlogView.js +78 -0
- package/dist/components/Blog/SingleBlogView.js.map +1 -0
- package/dist/components/Blog/data/sampleData.d.ts +4 -0
- package/dist/components/Blog/data/sampleData.js +388 -0
- package/dist/components/Blog/data/sampleData.js.map +1 -0
- package/dist/components/Blog/hooks/index.d.ts +3 -0
- package/dist/components/Blog/hooks/useBlog.d.ts +22 -0
- package/dist/components/Blog/hooks/useBlog.js +148 -0
- package/dist/components/Blog/hooks/useBlog.js.map +1 -0
- package/dist/components/Blog/hooks/useBlogNavigation.d.ts +12 -0
- package/dist/components/Blog/hooks/useBlogNavigation.js +75 -0
- package/dist/components/Blog/hooks/useBlogNavigation.js.map +1 -0
- package/dist/components/Blog/hooks/useComments.d.ts +20 -0
- package/dist/components/Blog/hooks/useComments.js +108 -0
- package/dist/components/Blog/hooks/useComments.js.map +1 -0
- package/dist/components/Blog/index.d.ts +8 -0
- package/dist/components/Blog/types.d.ts +82 -0
- package/dist/components/CodeHighlight/CodeHighlight.d.ts +7 -0
- package/dist/components/CodeHighlight/CodeHighlight.js +18 -0
- package/dist/components/CodeHighlight/CodeHighlight.js.map +1 -0
- package/dist/components/CodeHighlight/index.d.ts +1 -0
- package/dist/components/Marketplace/AllProductsView.d.ts +3 -0
- package/dist/components/Marketplace/AllProductsView.js +7 -18
- package/dist/components/Marketplace/AllProductsView.js.map +1 -1
- package/dist/components/Marketplace/MarketplaceComponent.js +5 -1
- package/dist/components/Marketplace/MarketplaceComponent.js.map +1 -1
- package/dist/components/Marketplace/MarketplaceSidebar.js +31 -31
- package/dist/components/Marketplace/MarketplaceSidebar.js.map +1 -1
- package/dist/components/Marketplace/SingleProductView.js +3 -0
- package/dist/components/Marketplace/SingleProductView.js.map +1 -1
- package/dist/components/Marketplace/components/MarketplaceControls.d.ts +17 -0
- package/dist/components/Marketplace/components/MarketplaceControls.js +22 -0
- package/dist/components/Marketplace/components/MarketplaceControls.js.map +1 -0
- package/dist/components/Marketplace/components/MarketplaceDashboard.d.ts +3 -0
- package/dist/components/Marketplace/components/MarketplaceDashboard.js +20 -10
- package/dist/components/Marketplace/components/MarketplaceDashboard.js.map +1 -1
- package/dist/components/Marketplace/components/MarketplaceHeader.js +2 -3
- package/dist/components/Marketplace/components/MarketplaceHeader.js.map +1 -1
- package/dist/components/Marketplace/components/ProductCard.js +9 -2
- package/dist/components/Marketplace/components/ProductCard.js.map +1 -1
- package/dist/components/Marketplace/hooks/useScrollToTop.d.ts +10 -0
- package/dist/components/Marketplace/hooks/useScrollToTop.js +22 -0
- package/dist/components/Marketplace/hooks/useScrollToTop.js.map +1 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.js +10 -4
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/components/AllProductsView/AllProductsView.d.ts +0 -14
- package/dist/components/AllProductsView/AllProductsView.js +0 -61
- package/dist/components/AllProductsView/AllProductsView.js.map +0 -1
- package/dist/components/AllProductsView/CardGroup.d.ts +0 -6
- package/dist/components/AllProductsView/CardGroup.js +0 -11
- package/dist/components/AllProductsView/CardGroup.js.map +0 -1
- package/dist/components/AllProductsView/ProductCard.d.ts +0 -11
- package/dist/components/AllProductsView/ProductCard.js +0 -13
- package/dist/components/AllProductsView/ProductCard.js.map +0 -1
- package/dist/components/AllProductsView/index.d.ts +0 -2
- package/dist/components/BlogFeedView/BlogFeedView.d.ts +0 -22
- package/dist/components/BlogFeedView/BlogFeedView.js +0 -29
- package/dist/components/BlogFeedView/BlogFeedView.js.map +0 -1
- package/dist/components/BlogFeedView/index.d.ts +0 -1
- package/dist/components/BlogLayout/BlogLayout.d.ts +0 -13
- package/dist/components/BlogLayout/BlogLayout.js +0 -20
- package/dist/components/BlogLayout/BlogLayout.js.map +0 -1
- package/dist/components/BlogLayout/index.d.ts +0 -1
- package/dist/components/BlogSidebar/BlogSidebar.d.ts +0 -19
- package/dist/components/BlogSidebar/BlogSidebar.js +0 -10
- package/dist/components/BlogSidebar/BlogSidebar.js.map +0 -1
- package/dist/components/BlogSidebar/index.d.ts +0 -1
- package/dist/components/Checkout/CheckoutPage.d.ts +0 -16
- package/dist/components/Checkout/CheckoutPage.js +0 -44
- package/dist/components/Checkout/CheckoutPage.js.map +0 -1
- package/dist/components/Checkout/CheckoutSidebar.d.ts +0 -15
- package/dist/components/Checkout/CheckoutSidebar.js +0 -25
- package/dist/components/Checkout/CheckoutSidebar.js.map +0 -1
- package/dist/components/Checkout/index.d.ts +0 -3
- package/dist/components/Checkout/types.d.ts +0 -21
- package/dist/components/CommerceSidebar/CommerceSidebar.d.ts +0 -20
- package/dist/components/CommerceSidebar/CommerceSidebar.js +0 -14
- package/dist/components/CommerceSidebar/CommerceSidebar.js.map +0 -1
- package/dist/components/CommerceSidebar/index.d.ts +0 -1
- package/dist/components/MarketplaceLayout/MarketplaceLayout.d.ts +0 -17
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js +0 -22
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js.map +0 -1
- package/dist/components/MarketplaceLayout/index.d.ts +0 -1
- package/dist/components/ProfileManagement/ProfileManagementPage.d.ts +0 -16
- package/dist/components/ProfileManagement/ProfileManagementPage.js +0 -65
- package/dist/components/ProfileManagement/ProfileManagementPage.js.map +0 -1
- package/dist/components/SingleBlogView/SingleBlogView.d.ts +0 -26
- package/dist/components/SingleBlogView/SingleBlogView.js +0 -17
- package/dist/components/SingleBlogView/SingleBlogView.js.map +0 -1
- package/dist/components/SingleBlogView/index.d.ts +0 -1
- package/dist/components/SingleProductView/SingleProductView.d.ts +0 -31
- package/dist/components/SingleProductView/SingleProductView.js +0 -34
- package/dist/components/SingleProductView/SingleProductView.js.map +0 -1
- package/dist/components/SingleProductView/index.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleProductView.js","sources":["../../../src/components/Marketplace/SingleProductView.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { \n Star, \n Heart, \n Share2, \n ShoppingCart, \n Zap, \n Shield, \n Truck, \n RotateCcw,\n ChevronLeft,\n ChevronRight,\n Plus,\n Minus,\n Check,\n ThumbsUp\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar';\nimport { Input } from '../Input';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs';\nimport { showToast } from '../Toast';\nimport type { Product, Review } from './types';\nimport { sampleProducts, sampleReviews } from './data/sampleData';\n\ninterface SingleProductViewProps {\n product?: Product;\n reviews?: Review[];\n relatedProducts?: Product[];\n onAddToCart?: (product: Product, quantity: number) => void;\n onBuyNow?: (product: Product, quantity: number) => void;\n}\n\nexport const SingleProductView: React.FC<SingleProductViewProps> = ({\n product,\n reviews,\n relatedProducts,\n onAddToCart,\n onBuyNow,\n}) => {\n const productsData = sampleProducts;\n const reviewsData = sampleReviews;\n\n // Fallbacks for backward compatibility\n // Defensive: If product is undefined, show a fallback UI instead of crashing\n if (!product && (!productsData || productsData.length === 0)) {\n return <div className=\"text-red-600\">Product not found.</div>;\n }\n const productData = product ?? productsData[0];\n const reviewsList = reviews ?? reviewsData;\n const relatedProductsList = relatedProducts ?? productsData.slice(1, 5);\n \n // Defensive guards and fallbacks\n const images = Array.isArray(productData.images) && productData.images.length > 0\n ? productData.images\n : [\"/images/placeholder-product.png\"];\n const specifications = productData.specifications && Object.keys(productData.specifications).length > 0\n ? productData.specifications\n : { \"Info\": \"No specifications available\" };\n const vendor = productData.vendor && productData.vendor.name\n ? productData.vendor\n : { id: \"unknown\", name: \"Unknown Vendor\", rating: 0, logo: undefined };\n\n const [selectedImageIndex, setSelectedImageIndex] = useState(0);\n const [quantity, setQuantity] = useState(1);\n const [isWishlisted, setIsWishlisted] = useState(false);\n const [selectedTab, setSelectedTab] = useState('description');\n\n const handleAddToCart = () => {\n onAddToCart?.(productData, quantity);\n showToast.success(`Added ${quantity} item(s) to cart!`);\n };\n\n const handleBuyNow = () => {\n onBuyNow?.(productData, quantity);\n showToast.info('Redirecting to checkout...');\n };\n\n const handleShare = () => {\n navigator.clipboard.writeText(window.location.href);\n showToast.success('Product link copied to clipboard!');\n };\n\n const nextImage = () => {\n setSelectedImageIndex((prev) =>\n prev === productData.images.length - 1 ? 0 : prev + 1\n );\n };\n\n const prevImage = () => {\n setSelectedImageIndex((prev) =>\n prev === 0 ? productData.images.length - 1 : prev - 1\n );\n };\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Breadcrumb */}\n <nav className=\"flex items-center space-x-2 text-sm text-gray-600 mb-8\">\n <a href=\"/\" className=\"hover:text-primary-600\">Home</a>\n <span>/</span>\n <a href=\"/products\" className=\"hover:text-primary-600\">Products</a>\n <span>/</span>\n <a href={`/category/${productData.category.toLowerCase()}`} className=\"hover:text-primary-600\">\n {productData.category}\n </a>\n <span>/</span>\n <span className=\"text-gray-900\">{productData.name}</span>\n </nav>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n {/* Product Images */}\n <div>\n {/* Main Image */}\n <div className=\"relative aspect-square bg-gray-100 rounded-lg overflow-hidden mb-4\">\n <img\n src={images[selectedImageIndex] ?? \"/images/placeholder-product.png\"}\n alt={productData.name}\n className=\"w-full h-full object-cover\"\n />\n {images.length > 1 && (\n <>\n <button\n onClick={prevImage}\n className=\"absolute left-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n onClick={nextImage}\n className=\"absolute right-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </>\n )}\n {productData.discount && (\n <Badge variant=\"danger\" className=\"absolute top-4 left-4\">\n -{productData.discount}%\n </Badge>\n )}\n </div>\n\n {/* Thumbnail Images */}\n {images.length > 1 && (\n <div className=\"flex space-x-2 overflow-x-auto\">\n {images.map((image: string, index: number) => (\n <button\n key={index}\n onClick={() => setSelectedImageIndex(index)}\n className={`flex-shrink-0 w-20 h-20 rounded-lg overflow-hidden border-2 transition-colors ${\n selectedImageIndex === index\n ? 'border-primary-500'\n : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <img\n src={image}\n alt={`${productData.name} ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Product Details */}\n <div>\n {/* Vendor */}\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-sm text-gray-600\">Sold by</span>\n <div className=\"flex items-center space-x-2\">\n {vendor.logo ? (\n <Avatar size=\"sm\">\n <AvatarImage src={vendor.logo} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n ) : (\n <Avatar size=\"sm\">\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n )}\n <span className=\"font-medium text-primary-600\">{vendor.name}</span>\n <div className=\"flex items-center space-x-1\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n </div>\n </div>\n\n {/* Product Title */}\n <h1 className=\"text-3xl font-bold text-gray-900 mb-4\">{productData.name}</h1>\n\n {/* Rating and Reviews */}\n <div className=\"flex items-center space-x-4 mb-6\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-lg font-medium text-gray-900 ml-2\">\n {productData.rating}\n </span>\n </div>\n <span className=\"text-gray-600\">({productData.reviewCount} reviews)</span>\n <Badge variant={productData.inStock ? 'success' : 'danger'}>\n {productData.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-3xl font-bold text-gray-900\">\n ${productData.price.toFixed(2)}\n </span>\n {productData.originalPrice && (\n <span className=\"text-xl text-gray-500 line-through\">\n ${productData.originalPrice.toFixed(2)}\n </span>\n )}\n {productData.discount && (\n <Badge variant=\"danger\">Save {productData.discount}%</Badge>\n )}\n </div>\n </div>\n\n {/* Description */}\n <p className=\"text-gray-600 mb-6 leading-relaxed\">{productData.description}</p>\n\n {/* Quantity and Actions */}\n <div className=\"space-y-4 mb-8\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"font-medium text-gray-900\">Quantity:</span>\n <div className=\"flex items-center border border-gray-300 rounded-lg\">\n <button\n onClick={() => setQuantity(Math.max(1, quantity - 1))}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n disabled={quantity <= 1}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <Input\n type=\"number\"\n value={quantity}\n onChange={(e) => setQuantity(Math.max(1, parseInt(e.target.value) || 1))}\n className=\"w-16 text-center border-0 focus:ring-0\"\n min=\"1\"\n />\n <button\n onClick={() => setQuantity(quantity + 1)}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex space-x-4\">\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={handleAddToCart}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <ShoppingCart className=\"mr-2 h-5 w-5\" />\n Add to Cart\n </Button>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={handleBuyNow}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <Zap className=\"mr-2 h-5 w-5\" />\n Buy Now\n </Button>\n </div>\n\n <div className=\"flex space-x-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsWishlisted(!isWishlisted)}\n className=\"flex-1\"\n >\n <Heart className={`mr-2 h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\n {isWishlisted ? 'Wishlisted' : 'Add to Wishlist'}\n </Button>\n <Button variant=\"outline\" onClick={handleShare}>\n <Share2 className=\"h-5 w-5\" />\n </Button>\n </div>\n </div>\n\n {/* Features */}\n <div className=\"grid grid-cols-2 gap-4 mb-8\">\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Truck className=\"h-4 w-4 text-green-600\" />\n <span>Free shipping</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <RotateCcw className=\"h-4 w-4 text-blue-600\" />\n <span>30-day returns</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Shield className=\"h-4 w-4 text-purple-600\" />\n <span>2-year warranty</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Check className=\"h-4 w-4 text-green-600\" />\n <span>Authentic product</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Product Details Tabs */}\n <div className=\"mt-16\">\n <Tabs value={selectedTab} onValueChange={setSelectedTab}>\n <TabsList>\n <TabsTrigger value=\"description\">Description</TabsTrigger>\n <TabsTrigger value=\"specifications\">Specifications</TabsTrigger>\n <TabsTrigger value=\"reviews\">Reviews ({reviewsList.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"description\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Product Description</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-600 leading-relaxed mb-4\">\n {productData.description}\n </p>\n <p className=\"text-gray-600 leading-relaxed\">\n This premium product offers exceptional quality and performance, \n designed to meet the highest standards. With advanced features and \n reliable construction, it's perfect for both professional and personal use.\n </p>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"specifications\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Technical Specifications</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(specifications).map(([key, value]) => (\n <div key={key} className=\"flex justify-between py-2 border-b border-gray-100\">\n <span className=\"font-medium text-gray-900\">{key}:</span>\n <span className=\"text-gray-600\">{String(value)}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"reviews\" className=\"mt-8\">\n <div className=\"space-y-6\">\n {/* Reviews Summary */}\n <Card>\n <CardContent className=\"p-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n <div>\n <h3 className=\"text-xl font-semibold mb-4\">Customer Reviews</h3>\n <div className=\"flex items-center space-x-4 mb-4\">\n <span className=\"text-4xl font-bold text-gray-900\">\n {productData.rating}\n </span>\n <div>\n <div className=\"flex items-center space-x-1 mb-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-gray-600\">\n Based on {productData.reviewCount} reviews\n </span>\n </div>\n </div>\n </div>\n <div>\n <Button variant=\"primary\" className=\"w-full\">\n Write a Review\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Individual Reviews */}\n {reviewsList.map((review: Review) => (\n <Card key={review.id}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start space-x-4\">\n <Avatar>\n <AvatarImage src={review.userAvatar} />\n <AvatarFallback>{review.userName[0]}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium text-gray-900\">{review.userName}</span>\n {review.verified && (\n <Badge variant=\"success\" className=\"text-xs\">\n Verified Purchase\n </Badge>\n )}\n </div>\n <div className=\"flex items-center space-x-2 mb-2\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star: number) => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= review.rating\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-sm text-gray-600\">{review.date}</span>\n </div>\n <h4 className=\"font-medium text-gray-900 mb-2\">{review.title}</h4>\n <p className=\"text-gray-600 mb-4\">{review.comment}</p>\n <div className=\"flex items-center space-x-4\">\n <button className=\"flex items-center space-x-1 text-sm text-gray-600 hover:text-gray-900\">\n <ThumbsUp className=\"h-4 w-4\" />\n <span>Helpful ({review.helpful})</span>\n </button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Related Products */}\n <div className=\"mt-16\">\n <h2 className=\"text-2xl font-bold text-gray-900 mb-8\">Related Products</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {relatedProductsList.map((relatedProduct: Product) => (\n <Card key={relatedProduct.id} className=\"hover:shadow-lg transition-shadow\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={Array.isArray(relatedProduct.images) && relatedProduct.images.length > 0\n ? relatedProduct.images[0]\n : \"/images/placeholder-product.png\"}\n alt={relatedProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {relatedProduct.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {relatedProduct.rating} ({relatedProduct.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${relatedProduct.price.toFixed(2)}\n </span>\n <Button size=\"sm\" variant=\"outline\">\n View\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SingleProductView.js","sources":["../../../src/components/Marketplace/SingleProductView.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n Star,\n Heart,\n Share2,\n ShoppingCart,\n Zap,\n Shield,\n Truck,\n RotateCcw,\n ChevronLeft,\n ChevronRight,\n Plus,\n Minus,\n Check,\n ThumbsUp\n} from 'lucide-react';\nimport { Button } from '../Button';\nimport { Card, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar';\nimport { Input } from '../Input';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs';\nimport { showToast } from '../Toast';\nimport type { Product, Review } from './types';\nimport { sampleProducts, sampleReviews } from './data/sampleData';\nimport { useScrollToTop } from './hooks/useScrollToTop';\n\ninterface SingleProductViewProps {\n product?: Product;\n reviews?: Review[];\n relatedProducts?: Product[];\n onAddToCart?: (product: Product, quantity: number) => void;\n onBuyNow?: (product: Product, quantity: number) => void;\n}\n\nexport const SingleProductView: React.FC<SingleProductViewProps> = ({\n product,\n reviews,\n relatedProducts,\n onAddToCart,\n onBuyNow,\n}) => {\n const productsData = sampleProducts;\n const reviewsData = sampleReviews;\n\n // Fallbacks for backward compatibility\n // Defensive: If product is undefined, show a fallback UI instead of crashing\n if (!product && (!productsData || productsData.length === 0)) {\n return <div className=\"text-red-600\">Product not found.</div>;\n }\n const productData = product ?? productsData[0];\n const reviewsList = reviews ?? reviewsData;\n const relatedProductsList = relatedProducts ?? productsData.slice(1, 5);\n \n // Defensive guards and fallbacks\n const images = Array.isArray(productData.images) && productData.images.length > 0\n ? productData.images\n : [\"/images/placeholder-product.png\"];\n const specifications = productData.specifications && Object.keys(productData.specifications).length > 0\n ? productData.specifications\n : { \"Info\": \"No specifications available\" };\n const vendor = productData.vendor && productData.vendor.name\n ? productData.vendor\n : { id: \"unknown\", name: \"Unknown Vendor\", rating: 0, logo: undefined };\n\n const [selectedImageIndex, setSelectedImageIndex] = useState(0);\n const [quantity, setQuantity] = useState(1);\n const [isWishlisted, setIsWishlisted] = useState(false);\n const [selectedTab, setSelectedTab] = useState('description');\n\n // Scroll to top on product change/mount\n useScrollToTop([productData?.id]);\n\n const handleAddToCart = () => {\n onAddToCart?.(productData, quantity);\n showToast.success(`Added ${quantity} item(s) to cart!`);\n };\n\n const handleBuyNow = () => {\n onBuyNow?.(productData, quantity);\n showToast.info('Redirecting to checkout...');\n };\n\n const handleShare = () => {\n navigator.clipboard.writeText(window.location.href);\n showToast.success('Product link copied to clipboard!');\n };\n\n const nextImage = () => {\n setSelectedImageIndex((prev) =>\n prev === productData.images.length - 1 ? 0 : prev + 1\n );\n };\n\n const prevImage = () => {\n setSelectedImageIndex((prev) =>\n prev === 0 ? productData.images.length - 1 : prev - 1\n );\n };\n\n return (\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n {/* Breadcrumb */}\n <nav className=\"flex items-center space-x-2 text-sm text-gray-600 mb-8\">\n <a href=\"/\" className=\"hover:text-primary-600\">Home</a>\n <span>/</span>\n <a href=\"/products\" className=\"hover:text-primary-600\">Products</a>\n <span>/</span>\n <a href={`/category/${productData.category.toLowerCase()}`} className=\"hover:text-primary-600\">\n {productData.category}\n </a>\n <span>/</span>\n <span className=\"text-gray-900\">{productData.name}</span>\n </nav>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n {/* Product Images */}\n <div>\n {/* Main Image */}\n <div className=\"relative aspect-square bg-gray-100 rounded-lg overflow-hidden mb-4\">\n <img\n src={images[selectedImageIndex] ?? \"/images/placeholder-product.png\"}\n alt={productData.name}\n className=\"w-full h-full object-cover\"\n />\n {images.length > 1 && (\n <>\n <button\n onClick={prevImage}\n className=\"absolute left-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n <button\n onClick={nextImage}\n className=\"absolute right-4 top-1/2 transform -translate-y-1/2 bg-white/80 hover:bg-white rounded-full p-2 shadow-lg transition-colors\"\n >\n <ChevronRight className=\"h-5 w-5\" />\n </button>\n </>\n )}\n {productData.discount && (\n <Badge variant=\"danger\" className=\"absolute top-4 left-4\">\n -{productData.discount}%\n </Badge>\n )}\n </div>\n\n {/* Thumbnail Images */}\n {images.length > 1 && (\n <div className=\"flex space-x-2 overflow-x-auto\">\n {images.map((image: string, index: number) => (\n <button\n key={index}\n onClick={() => setSelectedImageIndex(index)}\n className={`flex-shrink-0 w-20 h-20 rounded-lg overflow-hidden border-2 transition-colors ${\n selectedImageIndex === index\n ? 'border-primary-500'\n : 'border-gray-200 hover:border-gray-300'\n }`}\n >\n <img\n src={image}\n alt={`${productData.name} ${index + 1}`}\n className=\"w-full h-full object-cover\"\n />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Product Details */}\n <div>\n {/* Vendor */}\n <div className=\"flex items-center space-x-2 mb-4\">\n <span className=\"text-sm text-gray-600\">Sold by</span>\n <div className=\"flex items-center space-x-2\">\n {vendor.logo ? (\n <Avatar size=\"sm\">\n <AvatarImage src={vendor.logo} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n ) : (\n <Avatar size=\"sm\">\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n )}\n <span className=\"font-medium text-primary-600\">{vendor.name}</span>\n <div className=\"flex items-center space-x-1\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n </div>\n </div>\n\n {/* Product Title */}\n <h1 className=\"text-3xl font-bold text-gray-900 mb-4\">{productData.name}</h1>\n\n {/* Rating and Reviews */}\n <div className=\"flex items-center space-x-4 mb-6\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-lg font-medium text-gray-900 ml-2\">\n {productData.rating}\n </span>\n </div>\n <span className=\"text-gray-600\">({productData.reviewCount} reviews)</span>\n <Badge variant={productData.inStock ? 'success' : 'danger'}>\n {productData.inStock ? 'In Stock' : 'Out of Stock'}\n </Badge>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-3xl font-bold text-gray-900\">\n ${productData.price.toFixed(2)}\n </span>\n {productData.originalPrice && (\n <span className=\"text-xl text-gray-500 line-through\">\n ${productData.originalPrice.toFixed(2)}\n </span>\n )}\n {productData.discount && (\n <Badge variant=\"danger\">Save {productData.discount}%</Badge>\n )}\n </div>\n </div>\n\n {/* Description */}\n <p className=\"text-gray-600 mb-6 leading-relaxed\">{productData.description}</p>\n\n {/* Quantity and Actions */}\n <div className=\"space-y-4 mb-8\">\n <div className=\"flex items-center space-x-4\">\n <span className=\"font-medium text-gray-900\">Quantity:</span>\n <div className=\"flex items-center border border-gray-300 rounded-lg\">\n <button\n onClick={() => setQuantity(Math.max(1, quantity - 1))}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n disabled={quantity <= 1}\n >\n <Minus className=\"h-4 w-4\" />\n </button>\n <Input\n type=\"number\"\n value={quantity}\n onChange={(e) => setQuantity(Math.max(1, parseInt(e.target.value) || 1))}\n className=\"w-16 text-center border-0 focus:ring-0\"\n min=\"1\"\n />\n <button\n onClick={() => setQuantity(quantity + 1)}\n className=\"p-2 hover:bg-gray-50 transition-colors\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex space-x-4\">\n <Button\n variant=\"primary\"\n size=\"lg\"\n onClick={handleAddToCart}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <ShoppingCart className=\"mr-2 h-5 w-5\" />\n Add to Cart\n </Button>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n onClick={handleBuyNow}\n disabled={!productData.inStock}\n className=\"flex-1\"\n >\n <Zap className=\"mr-2 h-5 w-5\" />\n Buy Now\n </Button>\n </div>\n\n <div className=\"flex space-x-2\">\n <Button\n variant=\"outline\"\n onClick={() => setIsWishlisted(!isWishlisted)}\n className=\"flex-1\"\n >\n <Heart className={`mr-2 h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\n {isWishlisted ? 'Wishlisted' : 'Add to Wishlist'}\n </Button>\n <Button variant=\"outline\" onClick={handleShare}>\n <Share2 className=\"h-5 w-5\" />\n </Button>\n </div>\n </div>\n\n {/* Features */}\n <div className=\"grid grid-cols-2 gap-4 mb-8\">\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Truck className=\"h-4 w-4 text-green-600\" />\n <span>Free shipping</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <RotateCcw className=\"h-4 w-4 text-blue-600\" />\n <span>30-day returns</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Shield className=\"h-4 w-4 text-purple-600\" />\n <span>2-year warranty</span>\n </div>\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n <Check className=\"h-4 w-4 text-green-600\" />\n <span>Authentic product</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Product Details Tabs */}\n <div className=\"mt-16\">\n <Tabs value={selectedTab} onValueChange={setSelectedTab}>\n <TabsList>\n <TabsTrigger value=\"description\">Description</TabsTrigger>\n <TabsTrigger value=\"specifications\">Specifications</TabsTrigger>\n <TabsTrigger value=\"reviews\">Reviews ({reviewsList.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"description\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Product Description</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-600 leading-relaxed mb-4\">\n {productData.description}\n </p>\n <p className=\"text-gray-600 leading-relaxed\">\n This premium product offers exceptional quality and performance, \n designed to meet the highest standards. With advanced features and \n reliable construction, it's perfect for both professional and personal use.\n </p>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"specifications\" className=\"mt-8\">\n <Card>\n <CardContent className=\"p-8\">\n <h3 className=\"text-xl font-semibold mb-4\">Technical Specifications</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {Object.entries(specifications).map(([key, value]) => (\n <div key={key} className=\"flex justify-between py-2 border-b border-gray-100\">\n <span className=\"font-medium text-gray-900\">{key}:</span>\n <span className=\"text-gray-600\">{String(value)}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"reviews\" className=\"mt-8\">\n <div className=\"space-y-6\">\n {/* Reviews Summary */}\n <Card>\n <CardContent className=\"p-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n <div>\n <h3 className=\"text-xl font-semibold mb-4\">Customer Reviews</h3>\n <div className=\"flex items-center space-x-4 mb-4\">\n <span className=\"text-4xl font-bold text-gray-900\">\n {productData.rating}\n </span>\n <div>\n <div className=\"flex items-center space-x-1 mb-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <Star\n key={star}\n className={`h-5 w-5 ${\n star <= Math.floor(productData.rating)\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-gray-600\">\n Based on {productData.reviewCount} reviews\n </span>\n </div>\n </div>\n </div>\n <div>\n <Button variant=\"primary\" className=\"w-full\">\n Write a Review\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Individual Reviews */}\n {reviewsList.map((review: Review) => (\n <Card key={review.id}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start space-x-4\">\n <Avatar>\n <AvatarImage src={review.userAvatar} />\n <AvatarFallback>{review.userName[0]}</AvatarFallback>\n </Avatar>\n <div className=\"flex-1\">\n <div className=\"flex items-center space-x-2 mb-2\">\n <span className=\"font-medium text-gray-900\">{review.userName}</span>\n {review.verified && (\n <Badge variant=\"success\" className=\"text-xs\">\n Verified Purchase\n </Badge>\n )}\n </div>\n <div className=\"flex items-center space-x-2 mb-2\">\n <div className=\"flex items-center space-x-1\">\n {[1, 2, 3, 4, 5].map((star: number) => (\n <Star\n key={star}\n className={`h-4 w-4 ${\n star <= review.rating\n ? 'text-yellow-400 fill-current'\n : 'text-gray-300'\n }`}\n />\n ))}\n </div>\n <span className=\"text-sm text-gray-600\">{review.date}</span>\n </div>\n <h4 className=\"font-medium text-gray-900 mb-2\">{review.title}</h4>\n <p className=\"text-gray-600 mb-4\">{review.comment}</p>\n <div className=\"flex items-center space-x-4\">\n <button className=\"flex items-center space-x-1 text-sm text-gray-600 hover:text-gray-900\">\n <ThumbsUp className=\"h-4 w-4\" />\n <span>Helpful ({review.helpful})</span>\n </button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Related Products */}\n <div className=\"mt-16\">\n <h2 className=\"text-2xl font-bold text-gray-900 mb-8\">Related Products</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {relatedProductsList.map((relatedProduct: Product) => (\n <Card key={relatedProduct.id} className=\"hover:shadow-lg transition-shadow\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={Array.isArray(relatedProduct.images) && relatedProduct.images.length > 0\n ? relatedProduct.images[0]\n : \"/images/placeholder-product.png\"}\n alt={relatedProduct.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {relatedProduct.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {relatedProduct.rating} ({relatedProduct.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${relatedProduct.price.toFixed(2)}\n </span>\n <Button size=\"sm\" variant=\"outline\">\n View\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;AAoCO,MAAM,iBAAiB,GAAqC,CAAC,EAClE,OAAO,EACP,OAAO,EACP,eAAe,EACf,WAAW,EACX,QAAQ,GACT,KAAI;IACH,MAAM,YAAY,GAAG,cAAc;IACnC,MAAM,WAAW,GAAG,aAAa;;;AAIjC,IAAA,IAAI,CAAC,OAAO,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;AAC5D,QAAA,OAAOA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,mCAAyB;IAC/D;IACA,MAAM,WAAW,GAAG,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC;AAC9C,IAAA,MAAM,WAAW,GAAG,OAAO,IAAI,WAAW;AAC1C,IAAA,MAAM,mBAAmB,GAAG,eAAe,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;AAGvE,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG;UAC5E,WAAW,CAAC;AACd,UAAE,CAAC,iCAAiC,CAAC;AACvC,IAAA,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG;UAClG,WAAW,CAAC;AACd,UAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;UACpD,WAAW,CAAC;AACd,UAAE,EAAiB,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;IAEzE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC;;AAG7D,IAAA,cAAc,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEjC,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,WAAW,GAAG,WAAW,EAAE,QAAQ,CAAC;AACpC,QAAA,SAAS,CAAC,OAAO,CAAC,SAAS,QAAQ,CAAA,iBAAA,CAAmB,CAAC;AACzD,IAAA,CAAC;IAED,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;AACjC,QAAA,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC9C,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;QACvB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnD,QAAA,SAAS,CAAC,OAAO,CAAC,mCAAmC,CAAC;AACxD,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;QACrB,qBAAqB,CAAC,CAAC,IAAI,KACzB,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CACtD;AACH,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,MAAK;QACrB,qBAAqB,CAAC,CAAC,IAAI,KACzB,IAAI,KAAK,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CACtD;AACH,IAAA,CAAC;IAED,QACEC,cAAK,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,CAE1DA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,CACrED,WAAG,IAAI,EAAC,GAAG,EAAC,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,MAAA,EAAA,CAAS,EACvDA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAC,WAAW,EAAC,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,UAAA,EAAA,CAAa,EACnEA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,CAAA,UAAA,EAAa,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAE,EAAE,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAC3F,WAAW,CAAC,QAAQ,GACnB,EACJA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,CAAc,EACdA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,WAAW,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,CACrD,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CAErDA,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAEEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,EAAA,QAAA,EAAA,CACjFD,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC,IAAI,iCAAiC,EACpE,GAAG,EAAE,WAAW,CAAC,IAAI,EACrB,SAAS,EAAC,4BAA4B,EAAA,CACtC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,KAChBC,4BACED,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,4HAA4H,EAAA,QAAA,EAEtIA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,SAAS,GAAG,EAAA,CAC5B,EACTA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,6HAA6H,EAAA,QAAA,EAEvIA,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CAC7B,IACR,CACJ,EACA,WAAW,CAAC,QAAQ,KACnBC,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,QAAQ,EAAC,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAAA,GAAA,EACrD,WAAW,CAAC,QAAQ,EAAA,GAAA,CAAA,EAAA,CAChB,CACT,CAAA,EAAA,CACG,EAGL,MAAM,CAAC,MAAM,GAAG,CAAC,KAChBD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,MACvCA,GAAA,CAAA,QAAA,EAAA,EAEE,OAAO,EAAE,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,CAAA,8EAAA,EACT,kBAAkB,KAAK;AACrB,0CAAE;0CACA,uCACN,CAAA,CAAE,EAAA,QAAA,EAEFA,aACE,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,CAAA,EAAG,WAAW,CAAC,IAAI,CAAA,CAAA,EAAI,KAAK,GAAG,CAAC,CAAA,CAAE,EACvC,SAAS,EAAC,4BAA4B,EAAA,CACtC,EAAA,EAZG,KAAK,CAaH,CACV,CAAC,EAAA,CACE,CACP,CAAA,EAAA,CACG,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CAEEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,aAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,SAAA,EAAA,CAAe,EACtDC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CACzC,MAAM,CAAC,IAAI,IACVA,IAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,IAAI,EAAA,QAAA,EAAA,CACfD,IAAC,WAAW,EAAA,EAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAA,CAAI,EACjCA,IAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAA,CAAkB,CAAA,EAAA,CAC1C,KAETA,IAAC,MAAM,EAAA,EAAC,IAAI,EAAC,IAAI,EAAA,QAAA,EACfA,GAAA,CAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAkB,EAAA,CAC1C,CACV,EACDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,GAAQ,EACnEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,IAAC,IAAI,EAAA,EAAC,SAAS,EAAC,sCAAsC,GAAG,EACzDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,MAAM,CAAC,MAAM,GAAQ,CAAA,EAAA,CAC1D,CAAA,EAAA,CACF,IACF,EAGNA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAE,WAAW,CAAC,IAAI,GAAM,EAG7EC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CACzC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MACxBD,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;AACnC,sDAAE;sDACA,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EACFA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,wCAAwC,YACrD,WAAW,CAAC,MAAM,EAAA,CACd,CAAA,EAAA,CACH,EACNC,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAAA,GAAA,EAAG,WAAW,CAAC,WAAW,iBAAiB,EAC1ED,GAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,GAAG,QAAQ,YACvD,WAAW,CAAC,OAAO,GAAG,UAAU,GAAG,cAAc,GAC5C,CAAA,EAAA,CACJ,EAGNA,aAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EACnBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,aAC1CA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAAA,GAAA,EAC9C,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CACzB,EACN,WAAW,CAAC,aAAa,KACxBA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oCAAoC,kBAChD,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IACjC,CACR,EACA,WAAW,CAAC,QAAQ,KACnBA,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,QAAQ,EAAA,QAAA,EAAA,CAAA,OAAA,EAAO,WAAW,CAAC,QAAQ,SAAU,CAC7D,CAAA,EAAA,CACG,GACF,EAGND,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,CAAC,WAAW,EAAA,CAAK,EAG/EC,cAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,cAAM,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,WAAA,EAAA,CAAiB,EAC5DC,cAAK,SAAS,EAAC,qDAAqD,EAAA,QAAA,EAAA,CAClED,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,EACrD,SAAS,EAAC,wCAAwC,EAClD,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAA,QAAA,EAEvBA,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CACtB,EACTA,GAAA,CAAC,KAAK,IACJ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EACxE,SAAS,EAAC,wCAAwC,EAClD,GAAG,EAAC,GAAG,EAAA,CACP,EACFA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,MAAM,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,EACxC,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAElDA,IAAC,IAAI,EAAA,EAAC,SAAS,EAAC,SAAS,GAAG,EAAA,CACrB,CAAA,EAAA,CACL,IACF,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,aAC7BA,IAAA,CAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,WAAW,CAAC,OAAO,EAC9B,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CAElBD,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,mBAElC,EACTC,IAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,WAAW,CAAC,OAAO,EAC9B,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CAElBD,IAAC,GAAG,EAAA,EAAC,SAAS,EAAC,cAAc,GAAG,EAAA,SAAA,CAAA,EAAA,CAEzB,CAAA,EAAA,CACL,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BA,KAAC,MAAM,EAAA,EACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,MAAM,eAAe,CAAC,CAAC,YAAY,CAAC,EAC7C,SAAS,EAAC,QAAQ,aAElBD,GAAA,CAAC,KAAK,IAAC,SAAS,EAAE,gBAAgB,YAAY,GAAG,2BAA2B,GAAG,EAAE,EAAE,EAAA,CAAI,EACtF,YAAY,GAAG,YAAY,GAAG,iBAAiB,IACzC,EACTA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,WAAW,YAC5CA,GAAA,CAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAAA,CACvB,IACL,CAAA,EAAA,CACF,EAGNC,cAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,aAChED,GAAA,CAAC,KAAK,IAAC,SAAS,EAAC,wBAAwB,EAAA,CAAG,EAC5CA,0CAA0B,CAAA,EAAA,CACtB,EACNC,cAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,uBAAuB,EAAA,CAAG,EAC/CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,CAA2B,CAAA,EAAA,CACvB,EACNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,IAAC,MAAM,EAAA,EAAC,SAAS,EAAC,yBAAyB,GAAG,EAC9CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,CAA4B,IACxB,EACNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAAA,CAChED,IAAC,KAAK,EAAA,EAAC,SAAS,EAAC,wBAAwB,GAAG,EAC5CA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,CAA8B,IAC1B,CAAA,EAAA,CACF,CAAA,EAAA,CACF,IACF,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,OAAO,YACpBC,IAAA,CAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAA,QAAA,EAAA,CACrDA,KAAC,QAAQ,EAAA,EAAA,QAAA,EAAA,CACPD,IAAC,WAAW,EAAA,EAAC,KAAK,EAAC,aAAa,4BAA0B,EAC1DA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAC,gBAAgB,EAAA,QAAA,EAAA,gBAAA,EAAA,CAA6B,EAChEC,KAAC,WAAW,EAAA,EAAC,KAAK,EAAC,SAAS,0BAAW,WAAW,CAAC,MAAM,EAAA,GAAA,CAAA,EAAA,CAAgB,CAAA,EAAA,CAChE,EAEXD,GAAA,CAAC,WAAW,IAAC,KAAK,EAAC,aAAa,EAAC,SAAS,EAAC,MAAM,EAAA,QAAA,EAC/CA,IAAC,IAAI,EAAA,EAAA,QAAA,EACHC,KAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,aAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAyB,EACnEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,CAC/BD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oCAAoC,YAC9C,WAAW,CAAC,WAAW,EAAA,CACtB,EACJA,WAAG,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAA,iNAAA,EAAA,CAIxC,CAAA,EAAA,CACA,IACM,EAAA,CACT,EAAA,CACK,EAEdA,GAAA,CAAC,WAAW,IAAC,KAAK,EAAC,gBAAgB,EAAC,SAAS,EAAC,MAAM,EAAA,QAAA,EAClDA,IAAC,IAAI,EAAA,EAAA,QAAA,EACHC,KAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,aAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,0BAAA,EAAA,CAA8B,EACxEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACnD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAC/CC,cAAe,SAAS,EAAC,oDAAoD,EAAA,QAAA,EAAA,CAC3EA,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,aAAE,GAAG,EAAA,GAAA,CAAA,EAAA,CAAS,EACzDD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,MAAM,CAAC,KAAK,CAAC,EAAA,CAAQ,CAAA,EAAA,EAF9C,GAAG,CAGP,CACP,CAAC,EAAA,CACE,CAAA,EAAA,CACM,EAAA,CACT,GACK,EAEdA,GAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,YAC3CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CAExBD,IAAC,IAAI,EAAA,EAAA,QAAA,EACHA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,YAC1BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,CACpDA,yBACED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAsB,EAChEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kCAAkC,YAC/C,WAAW,CAAC,MAAM,EAAA,CACd,EACPC,yBACED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MACxBA,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;AACnC,0FAAE;AACF,0FAAE,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EAAA,CACE,EACNC,eAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAAA,WAAA,EACnB,WAAW,CAAC,WAAW,EAAA,UAAA,CAAA,EAAA,CAC5B,CAAA,EAAA,CACH,CAAA,EAAA,CACF,IACF,EACND,GAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EACEA,IAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,gBAAA,EAAA,CAEnC,GACL,CAAA,EAAA,CACF,EAAA,CACM,GACT,EAGN,WAAW,CAAC,GAAG,CAAC,CAAC,MAAc,MAC9BA,GAAA,CAAC,IAAI,EAAA,EAAA,QAAA,EACHA,IAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,YAC1BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,aACzCA,IAAA,CAAC,MAAM,eACLD,GAAA,CAAC,WAAW,IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAA,CAAI,EACvCA,IAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAA,CAAkB,CAAA,EAAA,CAC9C,EACTC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CACrBA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,aAC/CD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAE,MAAM,CAAC,QAAQ,EAAA,CAAQ,EACnE,MAAM,CAAC,QAAQ,KACdA,GAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,mBAAA,EAAA,CAEpC,CACT,CAAA,EAAA,CACG,EACNC,cAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EACzC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,MAChCA,GAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAE,CAAA,QAAA,EACT,IAAI,IAAI,MAAM,CAAC;AACb,kFAAE;AACF,kFAAE,eACN,CAAA,CAAE,EAAA,EALG,IAAI,CAMT,CACH,CAAC,EAAA,CACE,EACNA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,EAAA,CAAQ,CAAA,EAAA,CACxD,EACNA,YAAI,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAE,MAAM,CAAC,KAAK,EAAA,CAAM,EAClEA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAE,MAAM,CAAC,OAAO,EAAA,CAAK,EACtDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAC1CC,IAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,uEAAuE,EAAA,QAAA,EAAA,CACvFD,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAChCC,IAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAgB,MAAM,CAAC,OAAO,EAAA,GAAA,CAAA,EAAA,CAAS,CAAA,EAAA,CAChC,GACL,CAAA,EAAA,CACF,CAAA,EAAA,CACF,EAAA,CACM,EAAA,EAzCL,MAAM,CAAC,EAAE,CA0Cb,CACR,CAAC,CAAA,EAAA,CACE,EAAA,CACM,CAAA,EAAA,CACT,EAAA,CACH,EAGNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,OAAO,EAAA,QAAA,EAAA,CACpBD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAsB,EAC3EA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EAClE,mBAAmB,CAAC,GAAG,CAAC,CAAC,cAAuB,MAC/CC,IAAA,CAAC,IAAI,IAAyB,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CACzED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wDAAwD,YACrEA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,GAAG;AAC1E,8CAAE,cAAc,CAAC,MAAM,CAAC,CAAC;8CACvB,iCAAiC,EACrC,GAAG,EAAE,cAAc,CAAC,IAAI,EACxB,SAAS,EAAC,4BAA4B,EAAA,CACtC,EAAA,CACE,EACNC,IAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,KAAK,EAAA,QAAA,EAAA,CAC1BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,6CAA6C,EAAA,QAAA,EACxD,cAAc,CAAC,IAAI,EAAA,CACjB,EACLC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,CAC/CD,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,sCAAsC,EAAA,CAAG,EACzDC,eAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpC,cAAc,CAAC,MAAM,EAAA,IAAA,EAAI,cAAc,CAAC,WAAW,EAAA,GAAA,CAAA,EAAA,CAC/C,IACH,EACNA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,eAAM,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAAA,GAAA,EAC7C,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAC5B,EACPD,GAAA,CAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAA,QAAA,EAAA,MAAA,EAAA,CAE1B,CAAA,EAAA,CACL,IACM,CAAA,EAAA,EA5BL,cAAc,CAAC,EAAE,CA6BrB,CACR,CAAC,EAAA,CACE,CAAA,EAAA,CACF,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface MarketplaceControlsProps {
|
|
2
|
+
searchQuery: string;
|
|
3
|
+
onSearchChange: (value: string) => void;
|
|
4
|
+
shouldFocusSearch?: boolean;
|
|
5
|
+
sortBy: string;
|
|
6
|
+
onSortChange: (value: string) => void;
|
|
7
|
+
viewMode: 'grid' | 'list';
|
|
8
|
+
onViewModeChange: (mode: 'grid' | 'list') => void;
|
|
9
|
+
onShowFilters: () => void;
|
|
10
|
+
sortOptions: {
|
|
11
|
+
value: string;
|
|
12
|
+
label: string;
|
|
13
|
+
}[];
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
import React from 'react';
|
|
17
|
+
export declare const MarketplaceControls: React.FC<MarketplaceControlsProps>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Search, Grid2x2, List, Filter } from 'lucide-react';
|
|
3
|
+
import { Button } from '../../Button/Button.js';
|
|
4
|
+
import { Input } from '../../Input/Input.js';
|
|
5
|
+
import { useRef, useEffect } from 'react';
|
|
6
|
+
|
|
7
|
+
const MarketplaceControls = ({ searchQuery, onSearchChange, shouldFocusSearch, sortBy, onSortChange, viewMode, onViewModeChange, onShowFilters, sortOptions, className = '', }) => {
|
|
8
|
+
const inputRef = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (shouldFocusSearch && inputRef.current) {
|
|
11
|
+
inputRef.current.focus();
|
|
12
|
+
// Move cursor to end
|
|
13
|
+
const val = inputRef.current.value;
|
|
14
|
+
inputRef.current.value = '';
|
|
15
|
+
inputRef.current.value = val;
|
|
16
|
+
}
|
|
17
|
+
}, [shouldFocusSearch]);
|
|
18
|
+
return (jsxs("div", { className: `flex flex-col gap-2 sm:flex-row sm:items-center sm:space-x-4 mt-2 lg:mt-0 w-full sm:w-auto ${className}`, children: [jsxs("div", { className: "relative w-full sm:w-auto", children: [jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { ref: inputRef, placeholder: "Search products...", value: searchQuery, onChange: (e) => onSearchChange(e.target.value), className: "pl-10 w-full sm:w-64" })] }), jsx("select", { value: sortBy, onChange: (e) => onSortChange(e.target.value), className: "border border-gray-300 rounded-lg px-3 py-2 bg-white w-full sm:w-auto", children: sortOptions.map(option => (jsx("option", { value: option.value, children: option.label }, option.value))) }), jsxs("div", { className: "flex items-center bg-gray-100 rounded-lg p-1 w-full sm:w-auto", children: [jsx(Button, { variant: viewMode === 'grid' ? 'primary' : 'ghost', size: "sm", onClick: () => onViewModeChange('grid'), className: "flex-1 sm:flex-none", children: jsx(Grid2x2, { className: "h-4 w-4" }) }), jsx(Button, { variant: viewMode === 'list' ? 'primary' : 'ghost', size: "sm", onClick: () => onViewModeChange('list'), className: "flex-1 sm:flex-none", children: jsx(List, { className: "h-4 w-4" }) })] }), jsxs(Button, { variant: "outline", onClick: onShowFilters, className: "sm:w-auto w-full lg:hidden", children: [jsx(Filter, { className: "mr-2 h-4 w-4" }), "Filters"] })] }));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { MarketplaceControls };
|
|
22
|
+
//# sourceMappingURL=MarketplaceControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarketplaceControls.js","sources":["../../../../src/components/Marketplace/components/MarketplaceControls.tsx"],"sourcesContent":["import { Search, Filter, Grid2x2 as Grid, List } from 'lucide-react';\r\nimport { Button } from '../../Button';\r\nimport { Input } from '../../Input';\r\n\r\nexport interface MarketplaceControlsProps {\r\n searchQuery: string;\r\n onSearchChange: (value: string) => void;\r\n shouldFocusSearch?: boolean;\r\n sortBy: string;\r\n onSortChange: (value: string) => void;\r\n viewMode: 'grid' | 'list';\r\n onViewModeChange: (mode: 'grid' | 'list') => void;\r\n onShowFilters: () => void;\r\n sortOptions: { value: string; label: string }[];\r\n className?: string;\r\n}\r\n\r\nimport React, { useRef, useEffect } from 'react';\r\n\r\nexport const MarketplaceControls: React.FC<MarketplaceControlsProps> = ({\r\n searchQuery,\r\n onSearchChange,\r\n shouldFocusSearch,\r\n sortBy,\r\n onSortChange,\r\n viewMode,\r\n onViewModeChange,\r\n onShowFilters,\r\n sortOptions,\r\n className = '',\r\n}) => {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n if (shouldFocusSearch && inputRef.current) {\r\n inputRef.current.focus();\r\n // Move cursor to end\r\n const val = inputRef.current.value;\r\n inputRef.current.value = '';\r\n inputRef.current.value = val;\r\n }\r\n }, [shouldFocusSearch]);\r\n\r\n return (\r\n <div className={`flex flex-col gap-2 sm:flex-row sm:items-center sm:space-x-4 mt-2 lg:mt-0 w-full sm:w-auto ${className}`}>\r\n <div className=\"relative w-full sm:w-auto\">\r\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\r\n <Input\r\n ref={inputRef}\r\n placeholder=\"Search products...\"\r\n value={searchQuery}\r\n onChange={(e) => onSearchChange(e.target.value)}\r\n className=\"pl-10 w-full sm:w-64\"\r\n />\r\n </div>\r\n <select\r\n value={sortBy}\r\n onChange={(e) => onSortChange(e.target.value)}\r\n className=\"border border-gray-300 rounded-lg px-3 py-2 bg-white w-full sm:w-auto\"\r\n >\r\n {sortOptions.map(option => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1 w-full sm:w-auto\">\r\n <Button\r\n variant={viewMode === 'grid' ? 'primary' : 'ghost'}\r\n size=\"sm\"\r\n onClick={() => onViewModeChange('grid')}\r\n className=\"flex-1 sm:flex-none\"\r\n >\r\n <Grid className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n variant={viewMode === 'list' ? 'primary' : 'ghost'}\r\n size=\"sm\"\r\n onClick={() => onViewModeChange('list')}\r\n className=\"flex-1 sm:flex-none\"\r\n >\r\n <List className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <Button\r\n variant=\"outline\"\r\n onClick={onShowFilters}\r\n className=\"sm:w-auto w-full lg:hidden\"\r\n >\r\n <Filter className=\"mr-2 h-4 w-4\" />\r\n Filters\r\n </Button>\r\n </div>\r\n );\r\n};"],"names":["_jsxs","_jsx","Grid"],"mappings":";;;;;;AAmBO,MAAM,mBAAmB,GAAuC,CAAC,EACtE,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,SAAS,GAAG,EAAE,GACf,KAAI;AACH,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC;IAE/C,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,iBAAiB,IAAI,QAAQ,CAAC,OAAO,EAAE;AACzC,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;;AAExB,YAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK;AAClC,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;AAC3B,YAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG;QAC9B;AACF,IAAA,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAEvB,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAA,2FAAA,EAA8F,SAAS,CAAA,CAAE,EAAA,QAAA,EAAA,CACvHA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,aACxCC,GAAA,CAAC,MAAM,EAAA,EAAC,SAAS,EAAC,0EAA0E,EAAA,CAAG,EAC/FA,GAAA,CAAC,KAAK,EAAA,EACJ,GAAG,EAAE,QAAQ,EACb,WAAW,EAAC,oBAAoB,EAChC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,SAAS,EAAC,sBAAsB,EAAA,CAChC,IACE,EACNA,GAAA,CAAA,QAAA,EAAA,EACE,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAC,uEAAuE,EAAA,QAAA,EAEhF,WAAW,CAAC,GAAG,CAAC,MAAM,KACrBA,GAAA,CAAA,QAAA,EAAA,EAA2B,KAAK,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EAC3C,MAAM,CAAC,KAAK,EAAA,EADF,MAAM,CAAC,KAAK,CAEhB,CACV,CAAC,EAAA,CACK,EACTD,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+DAA+D,aAC5EC,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,EAClD,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,MAAM,gBAAgB,CAAC,MAAM,CAAC,EACvC,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAE/BA,IAACC,OAAI,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,GACrB,EACTD,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,EAClD,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,MAAM,gBAAgB,CAAC,MAAM,CAAC,EACvC,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAE/BA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,GACrB,CAAA,EAAA,CACL,EACND,IAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CAEtCC,GAAA,CAAC,MAAM,EAAA,EAAC,SAAS,EAAC,cAAc,EAAA,CAAG,EAAA,SAAA,CAAA,EAAA,CAE5B,CAAA,EAAA,CACL;AAEV;;;;"}
|
|
@@ -7,6 +7,9 @@ export interface MarketplaceDashboardProps {
|
|
|
7
7
|
onProductClick: (product: Product) => void;
|
|
8
8
|
onAddToCart: (product: Product, quantity?: number) => void;
|
|
9
9
|
onViewAllProducts: () => void;
|
|
10
|
+
searchQuery: string;
|
|
11
|
+
onSearch: (query: string) => void;
|
|
12
|
+
setCurrentView: (view: 'dashboard' | 'products' | 'product' | 'checkout') => void;
|
|
10
13
|
className?: string;
|
|
11
14
|
}
|
|
12
15
|
/**
|
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { Star } from 'lucide-react';
|
|
3
4
|
import { Button } from '../../Button/Button.js';
|
|
4
5
|
import { Card, CardContent } from '../../Card/Card.js';
|
|
5
|
-
import { Badge } from '../../Badge/Badge.js';
|
|
6
6
|
import { Avatar, AvatarImage, AvatarFallback } from '../../Avatar/Avatar.js';
|
|
7
|
+
import { ProductCard } from './ProductCard.js';
|
|
8
|
+
import { MarketplaceControls } from './MarketplaceControls.js';
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Marketplace dashboard component showing overview, featured products, and vendor spotlight
|
|
10
12
|
* Extracted from main marketplace component for better modularity
|
|
11
13
|
*/
|
|
12
|
-
const MarketplaceDashboard = ({ featuredProducts, trendingProducts, recentlyViewed, onProductClick, onAddToCart, onViewAllProducts, className = '', }) => {
|
|
14
|
+
const MarketplaceDashboard = ({ featuredProducts, trendingProducts, recentlyViewed, onProductClick, onAddToCart, onViewAllProducts, searchQuery, onSearch, setCurrentView, className = '', }) => {
|
|
15
|
+
// Assume products and setCurrentView are available from parent/context
|
|
16
|
+
// For demo, featuredProducts used as products source
|
|
17
|
+
const [sortBy, setSortBy] = React__default.useState('relevance');
|
|
18
|
+
const [viewMode, setViewMode] = React__default.useState('grid');
|
|
19
|
+
const [showFilters, setShowFilters] = React__default.useState(false);
|
|
20
|
+
// Use searchQuery and onSearch from props
|
|
21
|
+
const sortOptions = [
|
|
22
|
+
{ value: 'relevance', label: 'Most Relevant' },
|
|
23
|
+
{ value: 'price-low', label: 'Price: Low to High' },
|
|
24
|
+
{ value: 'price-high', label: 'Price: High to Low' },
|
|
25
|
+
{ value: 'rating', label: 'Highest Rated' },
|
|
26
|
+
{ value: 'newest', label: 'Newest First' },
|
|
27
|
+
{ value: 'popular', label: 'Most Popular' },
|
|
28
|
+
];
|
|
13
29
|
const categories = [
|
|
14
30
|
{ name: 'Electronics', count: 156, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
15
31
|
{ name: 'Fashion', count: 234, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
@@ -21,13 +37,7 @@ const MarketplaceDashboard = ({ featuredProducts, trendingProducts, recentlyView
|
|
|
21
37
|
{ name: 'Fashion Hub', rating: 4.6, products: 76, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=64' },
|
|
22
38
|
{ name: 'Home Essentials', rating: 4.7, products: 65, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=64' },
|
|
23
39
|
];
|
|
24
|
-
return (jsxs("div", { className: `space-y-8 ${className}`, children: [jsxs("div", { children: [jsxs("div", { className: "flex items-center justify-between mb-6", children: [jsx("h2", { className: "text-2xl font-bold text-gray-900", children: "Featured Categories" }), jsx(Button, { variant: "outline", onClick: onViewAllProducts, children: "View All" })] }), jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: categories.map((category) => (jsxs(Card, { className: "hover:shadow-lg transition-shadow cursor-pointer", children: [jsx("div", { className: "aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: jsx("img", { src: category.image, alt: category.name, className: "w-full h-full object-cover" }) }), jsxs(CardContent, { className: "p-4 text-center", children: [jsx("h3", { className: "font-medium text-gray-900 mb-1", children: category.name }), jsxs("p", { className: "text-sm text-gray-600", children: [category.count, " products"] })] })] }, category.name))) })] }), jsxs("div", { children: [jsxs("div", { className: "flex items-center justify-between mb-6", children: [jsx("h2", { className: "text-2xl font-bold text-gray-900", children: "Featured Products" }), jsx(Button, { variant: "outline", onClick: onViewAllProducts, children: "View All" })] }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: featuredProducts.map((product) => (
|
|
25
|
-
e.stopPropagation();
|
|
26
|
-
onAddToCart(product);
|
|
27
|
-
}, children: "Add to Cart" })] })] })] }, product.id))) })] }), jsxs("div", { children: [jsx("h2", { className: "text-2xl font-bold text-gray-900 mb-6", children: "Top Sellers" }), jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: vendors.map((vendor) => (jsx(Card, { className: "hover:shadow-lg transition-shadow", children: jsxs(CardContent, { className: "p-6 text-center", children: [jsxs(Avatar, { size: "lg", className: "mx-auto mb-4", children: [jsx(AvatarImage, { src: vendor.image }), jsx(AvatarFallback, { children: vendor.name[0] })] }), jsx("h3", { className: "font-semibold text-gray-900 mb-2", children: vendor.name }), jsxs("div", { className: "flex items-center justify-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsx("span", { className: "text-sm text-gray-600", children: vendor.rating })] }), jsxs("p", { className: "text-sm text-gray-600 mb-4", children: [vendor.products, " products"] }), jsx(Button, { variant: "outline", size: "sm", children: "Visit Store" })] }) }, vendor.name))) })] }), recentlyViewed.length > 0 && (jsxs("div", { children: [jsx("h2", { className: "text-2xl font-bold text-gray-900 mb-6", children: "Recently Viewed" }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: recentlyViewed.map((product) => (jsxs(Card, { className: "hover:shadow-lg transition-shadow cursor-pointer", children: [jsx("div", { className: "aspect-square bg-gray-100 rounded-t-lg overflow-hidden", onClick: () => onProductClick(product), children: jsx("img", { src: product.images[0], alt: product.name, className: "w-full h-full object-cover" }) }), jsxs(CardContent, { className: "p-4", children: [jsx("h3", { className: "font-medium text-gray-900 mb-2 line-clamp-2", children: product.name }), jsxs("div", { className: "flex items-center justify-between", children: [jsxs("span", { className: "text-lg font-bold text-gray-900", children: ["$", product.price.toFixed(2)] }), jsx(Button, { size: "sm", onClick: (e) => {
|
|
28
|
-
e.stopPropagation();
|
|
29
|
-
onAddToCart(product);
|
|
30
|
-
}, children: jsx(ShoppingCart, { className: "h-4 w-4" }) })] })] })] }, product.id))) })] }))] }));
|
|
40
|
+
return (jsxs("div", { className: `space-y-8 ${className}`, children: [jsx(MarketplaceControls, { searchQuery: searchQuery, onSearchChange: onSearch, sortBy: sortBy, onSortChange: setSortBy, viewMode: viewMode, onViewModeChange: setViewMode, onShowFilters: () => setShowFilters(true), sortOptions: sortOptions }), jsxs("div", { children: [jsxs("div", { className: "flex items-center justify-between mb-6", children: [jsx("h2", { className: "text-2xl font-bold text-gray-900", children: "Featured Categories" }), jsx(Button, { variant: "outline", onClick: onViewAllProducts, children: "View All" })] }), jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: categories.map((category) => (jsxs(Card, { className: "hover:shadow-lg transition-shadow cursor-pointer", children: [jsx("div", { className: "aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: jsx("img", { src: category.image, alt: category.name, className: "w-full h-full object-cover" }) }), jsxs(CardContent, { className: "p-4 text-center", children: [jsx("h3", { className: "font-medium text-gray-900 mb-1", children: category.name }), jsxs("p", { className: "text-sm text-gray-600", children: [category.count, " products"] })] })] }, category.name))) })] }), jsxs("div", { children: [jsxs("div", { className: "flex items-center justify-between mb-6", children: [jsx("h2", { className: "text-2xl font-bold text-gray-900", children: "Featured Products" }), jsx(Button, { variant: "outline", onClick: onViewAllProducts, children: "View All" })] }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: featuredProducts.map((product) => (jsx("div", { className: "w-full", children: jsx(ProductCard, { product: product, onProductClick: onProductClick, onAddToCart: onAddToCart, className: "hover:shadow-lg transition-shadow cursor-pointer" }) }, product.id))) })] }), jsxs("div", { children: [jsx("h2", { className: "text-2xl font-bold text-gray-900 mb-6", children: "Top Sellers" }), jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: vendors.map((vendor) => (jsx(Card, { className: "hover:shadow-lg transition-shadow", children: jsxs(CardContent, { className: "p-6 text-center", children: [jsxs(Avatar, { size: "lg", className: "mx-auto mb-4", children: [jsx(AvatarImage, { src: vendor.image }), jsx(AvatarFallback, { children: vendor.name[0] })] }), jsx("h3", { className: "font-semibold text-gray-900 mb-2", children: vendor.name }), jsxs("div", { className: "flex items-center justify-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsx("span", { className: "text-sm text-gray-600", children: vendor.rating })] }), jsxs("p", { className: "text-sm text-gray-600 mb-4", children: [vendor.products, " products"] }), jsx(Button, { variant: "outline", size: "sm", children: "Visit Store" })] }) }, vendor.name))) })] }), recentlyViewed.length > 0 && (jsxs("div", { children: [jsx("h2", { className: "text-2xl font-bold text-gray-900 mb-6", children: "Recently Viewed" }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: recentlyViewed.map((product) => (jsx("div", { className: "w-full", children: jsx(ProductCard, { product: product, onProductClick: onProductClick, onAddToCart: onAddToCart, className: "hover:shadow-lg transition-shadow cursor-pointer" }) }, product.id))) })] }))] }));
|
|
31
41
|
};
|
|
32
42
|
|
|
33
43
|
export { MarketplaceDashboard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceDashboard.js","sources":["../../../../src/components/Marketplace/components/MarketplaceDashboard.tsx"],"sourcesContent":["import React from 'react';\nimport { Package, Users, DollarSign, Eye, TrendingUp, Star, ShoppingCart } from 'lucide-react';\nimport { Button } from '../../Button';\nimport { Card, CardContent } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../../Avatar';\nimport { StatsCard } from '../../StatsCard';\nimport type { Product } from '../types';\n\nexport interface MarketplaceDashboardProps {\n featuredProducts: Product[];\n trendingProducts: Product[];\n recentlyViewed: Product[];\n onProductClick: (product: Product) => void;\n onAddToCart: (product: Product, quantity?: number) => void;\n onViewAllProducts: () => void;\n className?: string;\n}\n\n/**\n * Marketplace dashboard component showing overview, featured products, and vendor spotlight\n * Extracted from main marketplace component for better modularity\n */\nexport const MarketplaceDashboard: React.FC<MarketplaceDashboardProps> = ({\n featuredProducts,\n trendingProducts,\n recentlyViewed,\n onProductClick,\n onAddToCart,\n onViewAllProducts,\n className = '',\n}) => {\n const categories = [\n { name: 'Electronics', count: 156, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Fashion', count: 234, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Home & Garden', count: 178, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Sports', count: 145, image: 'https://images.pexels.com/photos/863988/pexels-photo-863988.jpeg?auto=compress&cs=tinysrgb&w=400' },\n ];\n\n const vendors = [\n { name: 'TechWorld Store', rating: 4.8, products: 89, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Fashion Hub', rating: 4.6, products: 76, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Home Essentials', rating: 4.7, products: 65, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=64' },\n ];\n\n return (\n <div className={`space-y-8 ${className}`}>\n {/* Featured Categories */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Categories</h2>\n <Button variant=\"outline\" onClick={onViewAllProducts}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {categories.map((category) => (\n <Card key={category.name} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={category.image}\n alt={category.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4 text-center\">\n <h3 className=\"font-medium text-gray-900 mb-1\">{category.name}</h3>\n <p className=\"text-sm text-gray-600\">{category.count} products</p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Featured Products */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Products</h2>\n <Button variant=\"outline\" onClick={onViewAllProducts}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {featuredProducts.map((product) => (\n <Card key={product.id} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div \n className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden relative\"\n onClick={() => onProductClick(product)}\n >\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover\"\n />\n {product.discount && (\n <Badge variant=\"danger\" className=\"absolute top-2 left-2\">\n -{product.discount}%\n </Badge>\n )}\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {product.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {product.rating} ({product.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n {product.originalPrice && (\n <span className=\"text-sm text-gray-500 line-through\">\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n <Button\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n onAddToCart(product);\n }}\n >\n Add to Cart\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Vendor Spotlight */}\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Top Sellers</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {vendors.map((vendor) => (\n <Card key={vendor.name} className=\"hover:shadow-lg transition-shadow\">\n <CardContent className=\"p-6 text-center\">\n <Avatar size=\"lg\" className=\"mx-auto mb-4\">\n <AvatarImage src={vendor.image} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n <h3 className=\"font-semibold text-gray-900 mb-2\">{vendor.name}</h3>\n <div className=\"flex items-center justify-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n <p className=\"text-sm text-gray-600 mb-4\">{vendor.products} products</p>\n <Button variant=\"outline\" size=\"sm\">\n Visit Store\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Recently Viewed */}\n {recentlyViewed.length > 0 && (\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Recently Viewed</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {recentlyViewed.map((product) => (\n <Card key={product.id} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div \n className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\"\n onClick={() => onProductClick(product)}\n >\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {product.name}\n </h3>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n <Button\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n onAddToCart(product);\n }}\n >\n <ShoppingCart className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceDashboard.js","sources":["../../../../src/components/Marketplace/components/MarketplaceDashboard.tsx"],"sourcesContent":["import React from 'react';\nimport { Package, Users, DollarSign, Eye, TrendingUp, Star, ShoppingCart } from 'lucide-react';\nimport { Button } from '../../Button';\nimport { Card, CardContent } from '../../Card';\nimport { Badge } from '../../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../../Avatar';\nimport { StatsCard } from '../../StatsCard';\nimport type { Product } from '../types';\nimport { ProductCard } from './ProductCard';\nimport { MarketplaceControls } from './MarketplaceControls';\nimport { useSearch } from '../hooks/useSearch';\n\nexport interface MarketplaceDashboardProps {\n featuredProducts: Product[];\n trendingProducts: Product[];\n recentlyViewed: Product[];\n onProductClick: (product: Product) => void;\n onAddToCart: (product: Product, quantity?: number) => void;\n onViewAllProducts: () => void;\n searchQuery: string;\n onSearch: (query: string) => void;\n setCurrentView: (view: 'dashboard' | 'products' | 'product' | 'checkout') => void;\n className?: string;\n}\n\n/**\n * Marketplace dashboard component showing overview, featured products, and vendor spotlight\n * Extracted from main marketplace component for better modularity\n */\nexport const MarketplaceDashboard: React.FC<MarketplaceDashboardProps> = ({\n featuredProducts,\n trendingProducts,\n recentlyViewed,\n onProductClick,\n onAddToCart,\n onViewAllProducts,\n searchQuery,\n onSearch,\n setCurrentView,\n className = '',\n}) => {\n // Assume products and setCurrentView are available from parent/context\n // For demo, featuredProducts used as products source\n const [sortBy, setSortBy] = React.useState('relevance');\n const [viewMode, setViewMode] = React.useState<'grid' | 'list'>('grid');\n const [showFilters, setShowFilters] = React.useState(false);\n\n // Use searchQuery and onSearch from props\n\n const sortOptions = [\n { value: 'relevance', label: 'Most Relevant' },\n { value: 'price-low', label: 'Price: Low to High' },\n { value: 'price-high', label: 'Price: High to Low' },\n { value: 'rating', label: 'Highest Rated' },\n { value: 'newest', label: 'Newest First' },\n { value: 'popular', label: 'Most Popular' },\n ];\n\n const categories = [\n { name: 'Electronics', count: 156, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Fashion', count: 234, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Home & Garden', count: 178, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Sports', count: 145, image: 'https://images.pexels.com/photos/863988/pexels-photo-863988.jpeg?auto=compress&cs=tinysrgb&w=400' },\n ];\n\n const vendors = [\n { name: 'TechWorld Store', rating: 4.8, products: 89, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Fashion Hub', rating: 4.6, products: 76, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Home Essentials', rating: 4.7, products: 65, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=64' },\n ];\n\n return (\n <div className={`space-y-8 ${className}`}>\n {/* Marketplace Controls */}\n <MarketplaceControls\n searchQuery={searchQuery}\n onSearchChange={onSearch}\n sortBy={sortBy}\n onSortChange={setSortBy}\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n onShowFilters={() => setShowFilters(true)}\n sortOptions={sortOptions}\n />\n\n {/* Featured Categories */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Categories</h2>\n <Button variant=\"outline\" onClick={onViewAllProducts}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {categories.map((category) => (\n <Card key={category.name} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={category.image}\n alt={category.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4 text-center\">\n <h3 className=\"font-medium text-gray-900 mb-1\">{category.name}</h3>\n <p className=\"text-sm text-gray-600\">{category.count} products</p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Featured Products */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Products</h2>\n <Button variant=\"outline\" onClick={onViewAllProducts}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {featuredProducts.map((product) => (\n <div key={product.id} className=\"w-full\">\n <ProductCard\n product={product}\n onProductClick={onProductClick}\n onAddToCart={onAddToCart}\n className=\"hover:shadow-lg transition-shadow cursor-pointer\"\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Vendor Spotlight */}\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Top Sellers</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {vendors.map((vendor) => (\n <Card key={vendor.name} className=\"hover:shadow-lg transition-shadow\">\n <CardContent className=\"p-6 text-center\">\n <Avatar size=\"lg\" className=\"mx-auto mb-4\">\n <AvatarImage src={vendor.image} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n <h3 className=\"font-semibold text-gray-900 mb-2\">{vendor.name}</h3>\n <div className=\"flex items-center justify-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n <p className=\"text-sm text-gray-600 mb-4\">{vendor.products} products</p>\n <Button variant=\"outline\" size=\"sm\">\n Visit Store\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Recently Viewed */}\n {recentlyViewed.length > 0 && (\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Recently Viewed</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {recentlyViewed.map((product) => (\n <div key={product.id} className=\"w-full\">\n <ProductCard\n product={product}\n onProductClick={onProductClick}\n onAddToCart={onAddToCart}\n className=\"hover:shadow-lg transition-shadow cursor-pointer\"\n />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};"],"names":["React","_jsxs","_jsx"],"mappings":";;;;;;;;;AAyBA;;;AAGG;AACI,MAAM,oBAAoB,GAAwC,CAAC,EACxE,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,cAAc,EACd,SAAS,GAAG,EAAE,GACf,KAAI;;;AAGH,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;AACvD,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAK,CAAC,QAAQ,CAAkB,MAAM,CAAC;AACvE,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAI3D,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE;AAC9C,QAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,EAAE;AACnD,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,EAAE;AACpD,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;AAC3C,QAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE;AAC1C,QAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE;KAC5C;AAED,IAAA,MAAM,UAAU,GAAG;QACjB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,oGAAoG,EAAE;QAChJ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,oGAAoG,EAAE;QAC5I,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,oGAAoG,EAAE;QAClJ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,kGAAkG,EAAE;KAC1I;AAED,IAAA,MAAM,OAAO,GAAG;AACd,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,mGAAmG,EAAE;AAClK,QAAA,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,mGAAmG,EAAE;AAC9J,QAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,mGAAmG,EAAE;KACnK;IAED,QACEC,cAAK,SAAS,EAAE,aAAa,SAAS,CAAA,CAAE,EAAA,QAAA,EAAA,CAEtCC,GAAA,CAAC,mBAAmB,EAAA,EAClB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,QAAQ,EACxB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,WAAW,EAC7B,aAAa,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC,EACzC,WAAW,EAAE,WAAW,EAAA,CACxB,EAGFD,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,aACrDC,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAyB,EACzEA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,iBAAiB,yBAE3C,CAAA,EAAA,CACL,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,YACnD,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,MACvBD,IAAA,CAAC,IAAI,EAAA,EAAqB,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAAA,CACpFC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wDAAwD,EAAA,QAAA,EACrEA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,QAAQ,CAAC,KAAK,EACnB,GAAG,EAAE,QAAQ,CAAC,IAAI,EAClB,SAAS,EAAC,4BAA4B,EAAA,CACtC,EAAA,CACE,EACND,IAAA,CAAC,WAAW,EAAA,EAAC,SAAS,EAAC,iBAAiB,aACtCC,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAE,QAAQ,CAAC,IAAI,EAAA,CAAM,EACnED,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAAE,QAAQ,CAAC,KAAK,EAAA,WAAA,CAAA,EAAA,CAAc,IACtD,CAAA,EAAA,EAXL,QAAQ,CAAC,IAAI,CAYjB,CACR,CAAC,EAAA,CACE,CAAA,EAAA,CACF,EAGNA,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CACrDC,YAAI,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAuB,EACvEA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAE,iBAAiB,EAAA,QAAA,EAAA,UAAA,EAAA,CAE3C,IACL,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EAClE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,MAC5BA,GAAA,CAAA,KAAA,EAAA,EAAsB,SAAS,EAAC,QAAQ,YACtCA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAC,kDAAkD,EAAA,CAC5D,IANM,OAAO,CAAC,EAAE,CAOd,CACP,CAAC,GACE,CAAA,EAAA,CACF,EAGND,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEC,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,aAAA,EAAA,CAAiB,EACtEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,YACnD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,MAClBA,GAAA,CAAC,IAAI,IAAmB,SAAS,EAAC,mCAAmC,EAAA,QAAA,EACnED,IAAA,CAAC,WAAW,IAAC,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CACtCA,IAAA,CAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,CACxCC,GAAA,CAAC,WAAW,EAAA,EAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAA,CAAI,EAClCA,GAAA,CAAC,cAAc,EAAA,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAA,CAAkB,CAAA,EAAA,CAC1C,EACTA,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,EAAA,CAAM,EACnED,cAAK,SAAS,EAAC,iDAAiD,EAAA,QAAA,EAAA,CAC9DC,GAAA,CAAC,IAAI,IAAC,SAAS,EAAC,sCAAsC,EAAA,CAAG,EACzDA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,YAAE,MAAM,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,CAC1D,EACND,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CAAE,MAAM,CAAC,QAAQ,EAAA,WAAA,CAAA,EAAA,CAAc,EACxEC,IAAC,MAAM,EAAA,EAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,4BAE1B,CAAA,EAAA,CACG,EAAA,EAfL,MAAM,CAAC,IAAI,CAgBf,CACR,CAAC,EAAA,CACE,IACF,EAGL,cAAc,CAAC,MAAM,GAAG,CAAC,KACxBD,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEC,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,uCAAuC,gCAAqB,EAC1EA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,YAClE,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,MAC1BA,GAAA,CAAA,KAAA,EAAA,EAAsB,SAAS,EAAC,QAAQ,EAAA,QAAA,EACtCA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAC,kDAAkD,EAAA,CAC5D,IANM,OAAO,CAAC,EAAE,CAOd,CACP,CAAC,GACE,CAAA,EAAA,CACF,CACP,CAAA,EAAA,CACG;AAEV;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { Package, ShoppingCart, Bell } from 'lucide-react';
|
|
3
3
|
import { Button } from '../../Button/Button.js';
|
|
4
|
-
import { Input } from '../../Input/Input.js';
|
|
5
4
|
import { Badge } from '../../Badge/Badge.js';
|
|
6
5
|
import { Avatar, AvatarImage, AvatarFallback } from '../../Avatar/Avatar.js';
|
|
7
6
|
|
|
@@ -10,7 +9,7 @@ import { Avatar, AvatarImage, AvatarFallback } from '../../Avatar/Avatar.js';
|
|
|
10
9
|
* Extracted from main marketplace component for reusability
|
|
11
10
|
*/
|
|
12
11
|
const MarketplaceHeader = ({ searchQuery, onSearchChange, cartItemCount, onCartClick, onMenuToggle, userRole = 'buyer', className = '', }) => {
|
|
13
|
-
return (jsx("header", { className: `bg-white border-b border-gray-200 sticky top-0 z-40 ${className}`, children: jsx("div", { className: "px-6 py-4", children: jsxs("div", { className: "flex items-center justify-between", children: [
|
|
12
|
+
return (jsx("header", { className: `bg-white border-b border-gray-200 sticky top-0 z-40 ${className}`, children: jsx("div", { className: "px-6 py-4", children: jsxs("div", { className: "flex items-center justify-between", children: [jsx("div", { className: "flex items-center space-x-4", children: jsxs("div", { className: "flex items-center space-x-3", children: [jsx("div", { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: jsx(Package, { className: "h-5 w-5 text-white" }) }), jsxs("div", { children: [jsx("h1", { className: "font-bold text-xl text-gray-900", children: "MarketPlace" }), jsx("p", { className: "text-xs text-gray-500", children: "Your digital marketplace" })] })] }) }), jsxs("div", { className: "flex items-center space-x-3", children: [jsx("div", { className: "relative", children: jsxs(Button, { variant: "ghost", size: "sm", onClick: onCartClick, className: "relative", children: [jsx(ShoppingCart, { className: "h-5 w-5" }), cartItemCount > 0 && (jsx(Badge, { variant: "danger", className: "absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center", children: cartItemCount }))] }) }), jsxs(Button, { variant: "ghost", size: "sm", className: "relative", children: [jsx(Bell, { className: "h-5 w-5" }), jsx(Badge, { variant: "danger", className: "absolute -top-1 -right-1 h-4 w-4 text-xs p-0 flex items-center justify-center", children: "3" })] }), jsxs("div", { className: "flex items-center space-x-3 pl-3 border-l border-gray-200", children: [jsxs("div", { className: "hidden sm:block text-right", children: [jsx("p", { className: "text-sm font-medium text-gray-900", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500 capitalize", children: userRole })] }), jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] })] })] })] }) }) }));
|
|
14
13
|
};
|
|
15
14
|
|
|
16
15
|
export { MarketplaceHeader };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceHeader.js","sources":["../../../../src/components/Marketplace/components/MarketplaceHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { Search, ShoppingCart, Bell, Menu, Package } from 'lucide-react';\nimport { Button } from '../../Button';\nimport { Input } from '../../Input';\nimport { Badge } from '../../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../../Avatar';\n\nexport interface MarketplaceHeaderProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n cartItemCount: number;\n onCartClick: () => void;\n onMenuToggle: () => void;\n userRole?: 'buyer' | 'seller' | 'admin';\n className?: string;\n}\n\n/**\n * Marketplace header component with search, cart, and user controls\n * Extracted from main marketplace component for reusability\n */\nexport const MarketplaceHeader: React.FC<MarketplaceHeaderProps> = ({\n searchQuery,\n onSearchChange,\n cartItemCount,\n onCartClick,\n onMenuToggle,\n userRole = 'buyer',\n className = '',\n}) => {\n return (\n <header className={`bg-white border-b border-gray-200 sticky top-0 z-40 ${className}`}>\n <div className=\"px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n {/* Left Section */}\n <div className=\"flex items-center space-x-4\">\
|
|
1
|
+
{"version":3,"file":"MarketplaceHeader.js","sources":["../../../../src/components/Marketplace/components/MarketplaceHeader.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Search, ShoppingCart, Bell, Menu, Package } from 'lucide-react';\r\nimport { Button } from '../../Button';\r\nimport { Input } from '../../Input';\r\nimport { Badge } from '../../Badge';\r\nimport { Avatar, AvatarImage, AvatarFallback } from '../../Avatar';\r\n\r\nexport interface MarketplaceHeaderProps {\r\n searchQuery: string;\r\n onSearchChange: (query: string) => void;\r\n cartItemCount: number;\r\n onCartClick: () => void;\r\n onMenuToggle: () => void;\r\n userRole?: 'buyer' | 'seller' | 'admin';\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Marketplace header component with search, cart, and user controls\r\n * Extracted from main marketplace component for reusability\r\n */\r\nexport const MarketplaceHeader: React.FC<MarketplaceHeaderProps> = ({\r\n searchQuery,\r\n onSearchChange,\r\n cartItemCount,\r\n onCartClick,\r\n onMenuToggle,\r\n userRole = 'buyer',\r\n className = '',\r\n}) => {\r\n return (\r\n <header className={`bg-white border-b border-gray-200 sticky top-0 z-40 ${className}`}>\r\n <div className=\"px-6 py-4\">\r\n <div className=\"flex items-center justify-between\">\r\n {/* Left Section */}\r\n <div className=\"flex items-center space-x-4\">\r\n \r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center\">\r\n <Package className=\"h-5 w-5 text-white\" />\r\n </div>\r\n <div>\r\n <h1 className=\"font-bold text-xl text-gray-900\">MarketPlace</h1>\r\n <p className=\"text-xs text-gray-500\">Your digital marketplace</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n \r\n\r\n {/* Right Section */}\r\n <div className=\"flex items-center space-x-3\">\r\n {/* Cart */}\r\n <div className=\"relative\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={onCartClick}\r\n className=\"relative\"\r\n >\r\n <ShoppingCart className=\"h-5 w-5\" />\r\n {cartItemCount > 0 && (\r\n <Badge \r\n variant=\"danger\" \r\n className=\"absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center\"\r\n >\r\n {cartItemCount}\r\n </Badge>\r\n )}\r\n </Button>\r\n </div>\r\n\r\n {/* Notifications */}\r\n <Button variant=\"ghost\" size=\"sm\" className=\"relative\">\r\n <Bell className=\"h-5 w-5\" />\r\n <Badge \r\n variant=\"danger\" \r\n className=\"absolute -top-1 -right-1 h-4 w-4 text-xs p-0 flex items-center justify-center\"\r\n >\r\n 3\r\n </Badge>\r\n </Button>\r\n\r\n {/* User Profile */}\r\n <div className=\"flex items-center space-x-3 pl-3 border-l border-gray-200\">\r\n <div className=\"hidden sm:block text-right\">\r\n <p className=\"text-sm font-medium text-gray-900\">John Doe</p>\r\n <p className=\"text-xs text-gray-500 capitalize\">{userRole}</p>\r\n </div>\r\n <Avatar size=\"sm\">\r\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\r\n <AvatarFallback>JD</AvatarFallback>\r\n </Avatar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n );\r\n};"],"names":["_jsx","_jsxs"],"mappings":";;;;;;AAiBA;;;AAGG;AACI,MAAM,iBAAiB,GAAqC,CAAC,EAClE,WAAW,EACX,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,EAAE,GACf,KAAI;IACH,QACEA,gBAAQ,SAAS,EAAE,uDAAuD,SAAS,CAAA,CAAE,YACnFA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EACxBC,cAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAEhDD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAE1CC,cAAK,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAC1CD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oEAAoE,EAAA,QAAA,EACjFA,GAAA,CAAC,OAAO,EAAA,EAAC,SAAS,EAAC,oBAAoB,GAAG,EAAA,CACtC,EACNC,yBACED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,aAAA,EAAA,CAAiB,EAChEA,WAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,0BAAA,EAAA,CAA6B,CAAA,EAAA,CAC7D,IACF,EAAA,CACF,EAKNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6BAA6B,aAE1CD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EACvBC,KAAC,MAAM,EAAA,EACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,WAAW,EACpB,SAAS,EAAC,UAAU,EAAA,QAAA,EAAA,CAEpBD,GAAA,CAAC,YAAY,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EACnC,aAAa,GAAG,CAAC,KAChBA,GAAA,CAAC,KAAK,EAAA,EACJ,OAAO,EAAC,QAAQ,EAChB,SAAS,EAAC,+EAA+E,EAAA,QAAA,EAExF,aAAa,EAAA,CACR,CACT,IACM,EAAA,CACL,EAGNC,KAAC,MAAM,EAAA,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,UAAU,EAAA,QAAA,EAAA,CACpDD,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,CAAG,EAC5BA,IAAC,KAAK,EAAA,EACJ,OAAO,EAAC,QAAQ,EAChB,SAAS,EAAC,+EAA+E,EAAA,QAAA,EAAA,GAAA,EAAA,CAGnF,CAAA,EAAA,CACD,EAGTC,cAAK,SAAS,EAAC,2DAA2D,EAAA,QAAA,EAAA,CACxEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CACzCD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,UAAA,EAAA,CAAa,EAC7DA,WAAG,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAAE,QAAQ,EAAA,CAAK,CAAA,EAAA,CAC1D,EACNC,IAAA,CAAC,MAAM,EAAA,EAAC,IAAI,EAAC,IAAI,EAAA,QAAA,EAAA,CACfD,IAAC,WAAW,EAAA,EAAC,GAAG,EAAC,iGAAiG,EAAA,CAAG,EACrHA,GAAA,CAAC,cAAc,qBAAoB,CAAA,EAAA,CAC5B,CAAA,EAAA,CACL,IACF,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACC;AAEb;;;;"}
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { Star, ShoppingCart, Heart, Eye } from 'lucide-react';
|
|
3
3
|
import { Button } from '../../Button/Button.js';
|
|
4
4
|
import { Card, CardContent } from '../../Card/Card.js';
|
|
5
5
|
import { Badge } from '../../Badge/Badge.js';
|
|
6
|
+
import { useBreakpoint } from '../../../hooks/useBreakpoint.js';
|
|
6
7
|
|
|
8
|
+
/** Quick Actions Subcomponent */
|
|
9
|
+
const ProductQuickActions = ({ isWishlisted, onToggleWishlist, onQuickView, isMobile }) => (jsxs("div", { className: `flex ${isMobile ? 'flex-row gap-2 absolute bottom-2 left-2 z-10' : ''}`, "aria-label": "Product quick actions", children: [jsx(Button, { variant: "ghost", size: isMobile ? 'md' : 'sm', onClick: onToggleWishlist, className: `bg-white/80 hover:bg-white rounded-full p-2 focus:outline-none focus:ring-2 focus:ring-primary transition ${isMobile ? '' : 'opacity-0 group-hover:opacity-100 absolute top-2 right-2'}`, "aria-label": isWishlisted ? 'Remove from wishlist' : 'Add to wishlist', tabIndex: 0, children: jsx(Heart, { className: `h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}` }) }), jsx(Button, { variant: "ghost", size: isMobile ? 'md' : 'sm', onClick: onQuickView, className: `bg-white/80 hover:bg-white rounded-full p-2 focus:outline-none focus:ring-2 focus:ring-primary transition ${isMobile ? '' : 'opacity-0 group-hover:opacity-100 absolute bottom-2 right-2'}`, "aria-label": "Quick view", tabIndex: 0, children: jsx(Eye, { className: "h-5 w-5" }) })] }));
|
|
10
|
+
/** Overlay Subcomponent */
|
|
11
|
+
const ProductOverlay = ({ discount, inStock }) => (jsxs(Fragment, { children: [discount && (jsxs(Badge, { variant: "danger", className: "absolute top-2 left-2 text-xs px-2 py-1", children: ["-", discount, "%"] })), !inStock && (jsx("div", { className: "absolute inset-0 bg-black/50 flex items-center justify-center z-20", children: jsx(Badge, { variant: "secondary", className: "text-xs px-2 py-1", children: "Out of Stock" }) }))] }));
|
|
7
12
|
/**
|
|
8
13
|
* Reusable product card component for displaying product information
|
|
9
14
|
* Used across different marketplace views (grid, list, featured, etc.)
|
|
10
15
|
*/
|
|
11
16
|
const ProductCard = ({ product, onProductClick, onAddToCart, onQuickView, onToggleWishlist, isWishlisted = false, showQuickActions = true, className = '', }) => {
|
|
17
|
+
const { isBelow } = useBreakpoint();
|
|
18
|
+
const isMobile = isBelow('md');
|
|
12
19
|
const handleProductClick = () => {
|
|
13
20
|
onProductClick?.(product);
|
|
14
21
|
};
|
|
@@ -24,7 +31,7 @@ const ProductCard = ({ product, onProductClick, onAddToCart, onQuickView, onTogg
|
|
|
24
31
|
e.stopPropagation();
|
|
25
32
|
onToggleWishlist?.(product.id);
|
|
26
33
|
};
|
|
27
|
-
return (jsxs(Card, { className: `group hover:shadow-lg transition-all duration-300 cursor-pointer flex flex-col max-h-[28rem] ${className}`, children: [jsxs("div", { className: "relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: [jsx("img", { src: product.images[0], alt: product.name, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300", onClick: handleProductClick
|
|
34
|
+
return (jsxs(Card, { className: `group hover:shadow-lg transition-all duration-300 cursor-pointer flex flex-col max-h-[28rem] ${className}`, tabIndex: 0, "aria-label": `Product card for ${product.name}`, children: [jsxs("div", { className: "relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: [jsx("img", { src: product.images[0], alt: product.name, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300", onClick: handleProductClick, loading: "lazy", draggable: false }), jsx(ProductOverlay, { discount: product.discount, inStock: product.inStock }), showQuickActions && (jsx(ProductQuickActions, { isWishlisted: isWishlisted, onToggleWishlist: handleToggleWishlist, onQuickView: handleQuickView, isMobile: isMobile }))] }), jsxs(CardContent, { className: "p-3 sm:p-4 flex-1 flex flex-col", children: [jsxs("div", { className: "mb-2", children: [jsx("h3", { className: "font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600 text-base sm:text-lg", onClick: handleProductClick, tabIndex: 0, "aria-label": `View details for ${product.name}`, children: product.name }), jsx("p", { className: "text-sm text-gray-600 line-clamp-1", children: product.brand })] }), jsxs("div", { className: "flex items-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsxs("span", { className: "text-sm text-gray-600", children: [product.rating, " (", product.reviewCount, ")"] })] }), jsx("div", { className: "flex items-center justify-between mb-3", children: jsxs("div", { className: "flex items-center space-x-2", children: [jsxs("span", { className: "text-lg font-bold text-gray-900", children: ["$", product.price.toFixed(2)] }), product.originalPrice && (jsxs("span", { className: "text-sm text-gray-500 line-through", children: ["$", product.originalPrice.toFixed(2)] }))] }) }), jsx("div", { className: "mt-auto", children: jsxs(Button, { variant: "primary", size: isMobile ? 'md' : 'sm', onClick: handleAddToCart, disabled: !product.inStock, className: "w-full", "aria-label": "Add to cart", children: [jsx(ShoppingCart, { className: "mr-2 h-4 w-4" }), "Add to Cart"] }) })] })] }));
|
|
28
35
|
};
|
|
29
36
|
|
|
30
37
|
export { ProductCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductCard.js","sources":["../../../../src/components/Marketplace/components/ProductCard.tsx"],"sourcesContent":["import React from 'react';\nimport { Star, Heart, ShoppingCart, Eye } from 'lucide-react';\nimport { Button } from '../../Button';\nimport { Card, CardContent } from '../../Card';\nimport { Badge } from '../../Badge';\nimport type { Product } from '../types';\n\nexport interface ProductCardProps {\n product: Product;\n onProductClick?: (product: Product) => void;\n onAddToCart?: (product: Product) => void;\n onQuickView?: (product: Product) => void;\n onToggleWishlist?: (productId: string) => void;\n isWishlisted?: boolean;\n showQuickActions?: boolean;\n className?: string;\n}\n\n/**\n * Reusable product card component for displaying product information\n * Used across different marketplace views (grid, list, featured, etc.)\n */\nexport const ProductCard: React.FC<ProductCardProps> = ({\n product,\n onProductClick,\n onAddToCart,\n onQuickView,\n onToggleWishlist,\n isWishlisted = false,\n showQuickActions = true,\n className = '',\n}) => {\n const handleProductClick = () => {\n onProductClick?.(product);\n };\n\n const handleAddToCart = (e: React.MouseEvent) => {\n e.stopPropagation();\n onAddToCart?.(product);\n };\n\n const handleQuickView = (e: React.MouseEvent) => {\n e.stopPropagation();\n onQuickView?.(product);\n };\n\n const handleToggleWishlist = (e: React.MouseEvent) => {\n e.stopPropagation();\n onToggleWishlist?.(product.id);\n };\n\n return (\n <Card className={`group hover:shadow-lg transition-all duration-300 cursor-pointer flex flex-col max-h-[28rem] ${className}`}>\n <div className=\"relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n onClick={handleProductClick}\n />\n \n {/* Discount Badge */}\n {product.discount && (\n <Badge variant=\"danger\" className=\"absolute top-2 left-2\">\n -{product.discount}%\n </Badge>\n )}\n\n {/* Quick Actions */}\n {showQuickActions && (\n <>\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleToggleWishlist}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Heart className={`h-4 w-4 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\n </Button>\n </div>\n <div className=\"absolute bottom-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleQuickView}\n className=\"bg-white/80 hover:bg-white\"\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </div>\n </>\n )}\n\n {/* Out of Stock Overlay */}\n {!product.inStock && (\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center\">\n <Badge variant=\"secondary\">Out of Stock</Badge>\n </div>\n )}\n </div>\n\n <CardContent className=\"p-4 flex-1 flex flex-col overflow-y-auto\">\n <div className=\"mb-2\">\n <h3\n className=\"font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600\"\n onClick={handleProductClick}\n >\n {product.name}\n </h3>\n <p className=\"text-sm text-gray-600 line-clamp-1\">{product.brand}</p>\n </div>\n\n {/* Rating */}\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {product.rating} ({product.reviewCount})\n </span>\n </div>\n\n {/* Price */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n {product.originalPrice && (\n <span className=\"text-sm text-gray-500 line-through\">\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"mt-auto\">\n {/* Add to Cart Button */}\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={handleAddToCart}\n disabled={!product.inStock}\n className=\"w-full\"\n >\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\n Add to Cart\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n};"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProductCard.js","sources":["../../../../src/components/Marketplace/components/ProductCard.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Star, Heart, ShoppingCart, Eye } from 'lucide-react';\r\nimport { Button } from '../../Button';\r\nimport { Card, CardContent } from '../../Card';\r\nimport { Badge } from '../../Badge';\r\nimport type { Product } from '../types';\r\nimport { useBreakpoint } from '../../../hooks/useBreakpoint';\r\n\r\nexport interface ProductCardProps {\r\n product: Product;\r\n onProductClick?: (product: Product) => void;\r\n onAddToCart?: (product: Product) => void;\r\n onQuickView?: (product: Product) => void;\r\n onToggleWishlist?: (productId: string) => void;\r\n isWishlisted?: boolean;\r\n showQuickActions?: boolean;\r\n className?: string;\r\n}\r\n\r\n/** Quick Actions Subcomponent */\r\nconst ProductQuickActions: React.FC<{\r\n isWishlisted: boolean;\r\n onToggleWishlist: (e: React.MouseEvent) => void;\r\n onQuickView: (e: React.MouseEvent) => void;\r\n isMobile: boolean;\r\n}> = ({ isWishlisted, onToggleWishlist, onQuickView, isMobile }) => (\r\n <div\r\n className={`flex ${isMobile ? 'flex-row gap-2 absolute bottom-2 left-2 z-10' : ''}`}\r\n aria-label=\"Product quick actions\"\r\n >\r\n <Button\r\n variant=\"ghost\"\r\n size={isMobile ? 'md' : 'sm'}\r\n onClick={onToggleWishlist}\r\n className={`bg-white/80 hover:bg-white rounded-full p-2 focus:outline-none focus:ring-2 focus:ring-primary transition ${\r\n isMobile ? '' : 'opacity-0 group-hover:opacity-100 absolute top-2 right-2'\r\n }`}\r\n aria-label={isWishlisted ? 'Remove from wishlist' : 'Add to wishlist'}\r\n tabIndex={0}\r\n >\r\n <Heart className={`h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}`} />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size={isMobile ? 'md' : 'sm'}\r\n onClick={onQuickView}\r\n className={`bg-white/80 hover:bg-white rounded-full p-2 focus:outline-none focus:ring-2 focus:ring-primary transition ${\r\n isMobile ? '' : 'opacity-0 group-hover:opacity-100 absolute bottom-2 right-2'\r\n }`}\r\n aria-label=\"Quick view\"\r\n tabIndex={0}\r\n >\r\n <Eye className=\"h-5 w-5\" />\r\n </Button>\r\n </div>\r\n);\r\n\r\n/** Overlay Subcomponent */\r\nconst ProductOverlay: React.FC<{\r\n discount?: number;\r\n inStock: boolean;\r\n}> = ({ discount, inStock }) => (\r\n <>\r\n {discount && (\r\n <Badge variant=\"danger\" className=\"absolute top-2 left-2 text-xs px-2 py-1\">\r\n -{discount}%\r\n </Badge>\r\n )}\r\n {!inStock && (\r\n <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center z-20\">\r\n <Badge variant=\"secondary\" className=\"text-xs px-2 py-1\">Out of Stock</Badge>\r\n </div>\r\n )}\r\n </>\r\n);\r\n\r\n/**\r\n * Reusable product card component for displaying product information\r\n * Used across different marketplace views (grid, list, featured, etc.)\r\n */\r\nexport const ProductCard: React.FC<ProductCardProps> = ({\r\n product,\r\n onProductClick,\r\n onAddToCart,\r\n onQuickView,\r\n onToggleWishlist,\r\n isWishlisted = false,\r\n showQuickActions = true,\r\n className = '',\r\n}) => {\r\n const { isBelow } = useBreakpoint();\r\n const isMobile = isBelow('md');\r\n\r\n const handleProductClick = () => {\r\n onProductClick?.(product);\r\n };\r\n\r\n const handleAddToCart = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onAddToCart?.(product);\r\n };\r\n\r\n const handleQuickView = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onQuickView?.(product);\r\n };\r\n\r\n const handleToggleWishlist = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onToggleWishlist?.(product.id);\r\n };\r\n\r\n return (\r\n <Card\r\n className={`group hover:shadow-lg transition-all duration-300 cursor-pointer flex flex-col max-h-[28rem] ${className}`}\r\n tabIndex={0}\r\n aria-label={`Product card for ${product.name}`}\r\n >\r\n <div className=\"relative aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\r\n <img\r\n src={product.images[0]}\r\n alt={product.name}\r\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\r\n onClick={handleProductClick}\r\n loading=\"lazy\"\r\n draggable={false}\r\n />\r\n\r\n {/* Overlays */}\r\n <ProductOverlay discount={product.discount} inStock={product.inStock} />\r\n\r\n {/* Quick Actions */}\r\n {showQuickActions && (\r\n <ProductQuickActions\r\n isWishlisted={isWishlisted}\r\n onToggleWishlist={handleToggleWishlist}\r\n onQuickView={handleQuickView}\r\n isMobile={isMobile}\r\n />\r\n )}\r\n </div>\r\n\r\n <CardContent className=\"p-3 sm:p-4 flex-1 flex flex-col\">\r\n <div className=\"mb-2\">\r\n <h3\r\n className=\"font-medium text-gray-900 line-clamp-2 cursor-pointer hover:text-primary-600 text-base sm:text-lg\"\r\n onClick={handleProductClick}\r\n tabIndex={0}\r\n aria-label={`View details for ${product.name}`}\r\n >\r\n {product.name}\r\n </h3>\r\n <p className=\"text-sm text-gray-600 line-clamp-1\">{product.brand}</p>\r\n </div>\r\n\r\n {/* Rating */}\r\n <div className=\"flex items-center space-x-1 mb-2\">\r\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\r\n <span className=\"text-sm text-gray-600\">\r\n {product.rating} ({product.reviewCount})\r\n </span>\r\n </div>\r\n\r\n {/* Price */}\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <span className=\"text-lg font-bold text-gray-900\">\r\n ${product.price.toFixed(2)}\r\n </span>\r\n {product.originalPrice && (\r\n <span className=\"text-sm text-gray-500 line-through\">\r\n ${product.originalPrice.toFixed(2)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-auto\">\r\n {/* Add to Cart Button */}\r\n <Button\r\n variant=\"primary\"\r\n size={isMobile ? 'md' : 'sm'}\r\n onClick={handleAddToCart}\r\n disabled={!product.inStock}\r\n className=\"w-full\"\r\n aria-label=\"Add to cart\"\r\n >\r\n <ShoppingCart className=\"mr-2 h-4 w-4\" />\r\n Add to Cart\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n};"],"names":["_jsxs","_jsx"],"mappings":"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"}
|