@beyondcorp/beyond-ui 1.2.51 → 1.2.55
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 +6 -1
- package/dist/components/Marketplace/AllProductsView.js +42 -65
- package/dist/components/Marketplace/AllProductsView.js.map +1 -1
- package/dist/components/Marketplace/CheckoutCompact.d.ts +1 -0
- package/dist/components/Marketplace/CheckoutCompact.js +3 -3
- package/dist/components/Marketplace/CheckoutCompact.js.map +1 -1
- package/dist/components/Marketplace/CheckoutComponent.js +1 -1
- package/dist/components/Marketplace/CheckoutComponent.js.map +1 -1
- package/dist/components/Marketplace/MarketplaceComponent.js +31 -2
- package/dist/components/Marketplace/MarketplaceComponent.js.map +1 -1
- package/dist/components/Marketplace/MarketplaceSidebar.js +32 -32
- 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":"MarketplaceSidebar.js","sources":["../../../src/components/Marketplace/MarketplaceSidebar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { ChevronDown, ChevronRight, Star, X, Filter, Sliders, Tag, Store, Grid2x2 as Grid } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Checkbox } from '../Checkbox';\nimport { cn } from '../../utils/cn';\nimport type { FilterOptions } from './types';\n\ninterface MarketplaceSidebarProps {\n filters: FilterOptions;\n onFiltersChange: (filters: FilterOptions) => void;\n onClearFilters: () => void;\n className?: string;\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n}\n\ninterface CategoryNode {\n id: string;\n name: string;\n count: number;\n children?: CategoryNode[];\n}\n\nconst categoryTree: CategoryNode[] = [\n {\n id: 'electronics',\n name: 'Electronics',\n count: 156,\n children: [\n { id: 'smartphones', name: 'Smartphones', count: 45 },\n { id: 'laptops', name: 'Laptops', count: 32 },\n { id: 'headphones', name: 'Headphones', count: 28 },\n { id: 'cameras', name: 'Cameras', count: 21 },\n { id: 'accessories', name: 'Accessories', count: 30 },\n ],\n },\n {\n id: 'clothing',\n name: 'Clothing & Fashion',\n count: 234,\n children: [\n { id: 'mens', name: \"Men's Clothing\", count: 89 },\n { id: 'womens', name: \"Women's Clothing\", count: 112 },\n { id: 'shoes', name: 'Shoes', count: 67 },\n { id: 'accessories-fashion', name: 'Fashion Accessories', count: 45 },\n ],\n },\n {\n id: 'home',\n name: 'Home & Garden',\n count: 178,\n children: [\n { id: 'furniture', name: 'Furniture', count: 56 },\n { id: 'decor', name: 'Home Decor', count: 43 },\n { id: 'kitchen', name: 'Kitchen & Dining', count: 38 },\n { id: 'garden', name: 'Garden & Outdoor', count: 41 },\n ],\n },\n {\n id: 'sports',\n name: 'Sports & Outdoors',\n count: 145,\n children: [\n { id: 'fitness', name: 'Fitness Equipment', count: 34 },\n { id: 'outdoor', name: 'Outdoor Recreation', count: 52 },\n { id: 'sports-apparel', name: 'Sports Apparel', count: 59 },\n ],\n },\n];\n\nconst brands = [\n { name: 'Apple', count: 45 },\n { name: 'Samsung', count: 38 },\n { name: 'Nike', count: 67 },\n { name: 'Adidas', count: 54 },\n { name: 'Sony', count: 32 },\n { name: 'LG', count: 28 },\n { name: 'Canon', count: 21 },\n { name: 'Dell', count: 19 },\n];\n\nconst vendors = [\n { name: 'TechWorld Store', count: 89, rating: 4.8 },\n { name: 'Fashion Hub', count: 76, rating: 4.6 },\n { name: 'Home Essentials', count: 65, rating: 4.7 },\n { name: 'Sports Central', count: 54, rating: 4.5 },\n { name: 'Electronics Plus', count: 43, rating: 4.9 },\n];\n\nexport const MarketplaceSidebar: React.FC<MarketplaceSidebarProps> = ({\n filters,\n onFiltersChange,\n onClearFilters,\n className = '',\n collapsed = false,\n onToggleCollapse,\n}) => {\n const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set(['electronics']));\n const [expandedSections, setExpandedSections] = useState<Set<string>>(\n new Set(['categories', 'price', 'rating', 'brands'])\n );\n\n const toggleCategory = (categoryId: string) => {\n setExpandedCategories(prev => {\n const newSet = new Set(prev);\n if (newSet.has(categoryId)) {\n newSet.delete(categoryId);\n } else {\n newSet.add(categoryId);\n }\n return newSet;\n });\n };\n\n const toggleSection = (sectionId: string) => {\n setExpandedSections(prev => {\n const newSet = new Set(prev);\n if (newSet.has(sectionId)) {\n newSet.delete(sectionId);\n } else {\n newSet.add(sectionId);\n }\n return newSet;\n });\n };\n\n const handleFilterChange = (filterType: keyof FilterOptions, value: any) => {\n onFiltersChange({\n ...filters,\n [filterType]: value,\n });\n };\n\n const getActiveFiltersCount = () => {\n let count = 0;\n if (filters.categories.length > 0) count += filters.categories.length;\n if (filters.brands.length > 0) count += filters.brands.length;\n if (filters.vendors.length > 0) count += filters.vendors.length;\n if (filters.rating > 0) count += 1;\n if (filters.inStock) count += 1;\n if (filters.priceRange[0] > 0 || filters.priceRange[1] < 1000) count += 1;\n return count;\n };\n\n const renderCategoryTree = (categories: CategoryNode[], level = 0) => {\n return categories.map((category) => (\n <div key={category.id} className={cn('', level > 0 && 'ml-4')}>\n <div className=\"flex items-center justify-between py-1\">\n <label className=\"flex items-center space-x-2 flex-1 cursor-pointer\">\n <Checkbox\n checked={filters.categories.includes(category.id)}\n onChange={(e) => {\n const newCategories = e.target.checked\n ? [...filters.categories, category.id]\n : filters.categories.filter(c => c !== category.id);\n handleFilterChange('categories', newCategories);\n }}\n />\n <span className=\"text-sm text-gray-700 flex-1\">{category.name}</span>\n <span className=\"text-xs text-gray-500\">({category.count})</span>\n </label>\n {category.children && (\n <button\n onClick={() => toggleCategory(category.id)}\n className=\"p-1 hover:bg-gray-100 rounded\"\n >\n {expandedCategories.has(category.id) ? (\n <ChevronDown className=\"h-3 w-3 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-3 w-3 text-gray-400\" />\n )}\n </button>\n )}\n </div>\n {category.children && expandedCategories.has(category.id) && (\n <div className=\"mt-1\">\n {renderCategoryTree(category.children, level + 1)}\n </div>\n )}\n </div>\n ));\n };\n\n if (collapsed) {\n return (\n <div className={cn('w-16 flex-shrink-0', className)}>\n <Card className=\"sticky top-4\">\n <CardContent className=\"p-4\">\n <div className=\"flex flex-col items-center space-y-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onToggleCollapse}\n className=\"w-full\"\n >\n <Filter className=\"h-5 w-5\" />\n </Button>\n {getActiveFiltersCount() > 0 && (\n <Badge variant=\"default\" className=\"text-xs\">\n {getActiveFiltersCount()}\n </Badge>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className={cn('w-80 flex-shrink-0', className)}>\n <Card className=\"sticky top-4\">\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"flex items-center text-lg\">\n <Filter className=\"h-5 w-5 mr-2\" />\n Filters\n {getActiveFiltersCount() > 0 && (\n <Badge variant=\"default\" className=\"ml-2\">\n {getActiveFiltersCount()}\n </Badge>\n )}\n </CardTitle>\n <div className=\"flex items-center space-x-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\n Clear All\n </Button>\n {onToggleCollapse && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onToggleCollapse}>\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto\">\n {/* Categories */}\n <div>\n <button\n onClick={() => toggleSection('categories')}\n className=\"flex items-center justify-between w-full mb-3\"\n >\n <h3 className=\"font-medium text-gray-900 flex items-center\">\n <Grid className=\"h-4 w-4 mr-2\" />\n Categories\n </h3>\n {expandedSections.has('categories') ? (\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\n )}\n </button>\n {expandedSections.has('categories') && (\n <div className=\"space-y-1\">\n {renderCategoryTree(categoryTree)}\n </div>\n )}\n </div>\n\n {/* Price Range */}\n <div>\n <button\n onClick={() => toggleSection('price')}\n className=\"flex items-center justify-between w-full mb-3\"\n >\n <h3 className=\"font-medium text-gray-900 flex items-center\">\n <Tag className=\"h-4 w-4 mr-2\" />\n Price Range\n </h3>\n {expandedSections.has('price') ? (\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\n )}\n </button>\n {expandedSections.has('price') && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-2\">\n <Input\n type=\"number\"\n placeholder=\"Min\"\n value={filters.priceRange[0]}\n onChange={(e) => handleFilterChange('priceRange', [\n parseInt(e.target.value) || 0,\n filters.priceRange[1]\n ])}\n className=\"w-20 text-sm\"\n />\n <span className=\"text-gray-400\">-</span>\n <Input\n type=\"number\"\n placeholder=\"Max\"\n value={filters.priceRange[1]}\n onChange={(e) => handleFilterChange('priceRange', [\n filters.priceRange[0],\n parseInt(e.target.value) || 1000\n ])}\n className=\"w-20 text-sm\"\n />\n </div>\n \n {/* Quick Price Ranges */}\n <div className=\"space-y-1\">\n {[\n { label: 'Under $25', range: [0, 25] },\n { label: '$25 - $50', range: [25, 50] },\n { label: '$50 - $100', range: [50, 100] },\n { label: '$100 - $200', range: [100, 200] },\n { label: 'Over $200', range: [200, 1000] },\n ].map((option) => (\n <label key={option.label} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={\n filters.priceRange[0] === option.range[0] &&\n filters.priceRange[1] === option.range[1]\n }\n onChange={(e) => {\n if (e.target.checked) {\n handleFilterChange('priceRange', option.range);\n }\n }}\n />\n <span className=\"text-sm text-gray-700\">{option.label}</span>\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Rating */}\n <div>\n <button\n onClick={() => toggleSection('rating')}\n className=\"flex items-center justify-between w-full mb-3\"\n >\n <h3 className=\"font-medium text-gray-900 flex items-center\">\n <Star className=\"h-4 w-4 mr-2\" />\n Customer Rating\n </h3>\n {expandedSections.has('rating') ? (\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\n )}\n </button>\n {expandedSections.has('rating') && (\n <div className=\"space-y-2\">\n {[4, 3, 2, 1].map(rating => (\n <label key={rating} className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.rating === rating}\n onChange={(e) => {\n handleFilterChange('rating', e.target.checked ? rating : 0);\n }}\n />\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-4 w-4 ${\n star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'\n }`}\n />\n ))}\n <span className=\"text-sm text-gray-700\">& up</span>\n </div>\n </label>\n ))}\n </div>\n )}\n </div>\n\n {/* Brands */}\n <div>\n <button\n onClick={() => toggleSection('brands')}\n className=\"flex items-center justify-between w-full mb-3\"\n >\n <h3 className=\"font-medium text-gray-900 flex items-center\">\n <Tag className=\"h-4 w-4 mr-2\" />\n Brands\n </h3>\n {expandedSections.has('brands') ? (\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\n )}\n </button>\n {expandedSections.has('brands') && (\n <div className=\"space-y-2\">\n {brands.map(brand => (\n <label key={brand.name} className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.brands.includes(brand.name)}\n onChange={(e) => {\n const newBrands = e.target.checked\n ? [...filters.brands, brand.name]\n : filters.brands.filter(b => b !== brand.name);\n handleFilterChange('brands', newBrands);\n }}\n />\n <span className=\"text-sm text-gray-700\">{brand.name}</span>\n </div>\n <span className=\"text-xs text-gray-500\">({brand.count})</span>\n </label>\n ))}\n </div>\n )}\n </div>\n\n {/* Vendors */}\n <div>\n <button\n onClick={() => toggleSection('vendors')}\n className=\"flex items-center justify-between w-full mb-3\"\n >\n <h3 className=\"font-medium text-gray-900 flex items-center\">\n <Store className=\"h-4 w-4 mr-2\" />\n Sellers\n </h3>\n {expandedSections.has('vendors') ? (\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\n )}\n </button>\n {expandedSections.has('vendors') && (\n <div className=\"space-y-2\">\n {vendors.map(vendor => (\n <label key={vendor.name} className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.vendors.includes(vendor.name)}\n onChange={(e) => {\n const newVendors = e.target.checked\n ? [...filters.vendors, vendor.name]\n : filters.vendors.filter(v => v !== vendor.name);\n handleFilterChange('vendors', newVendors);\n }}\n />\n <div>\n <div className=\"text-sm text-gray-700\">{vendor.name}</div>\n <div className=\"flex items-center space-x-1\">\n <Star className=\"h-3 w-3 text-yellow-400 fill-current\" />\n <span className=\"text-xs text-gray-500\">{vendor.rating}</span>\n </div>\n </div>\n </div>\n <span className=\"text-xs text-gray-500\">({vendor.count})</span>\n </label>\n ))}\n </div>\n )}\n </div>\n\n {/* Availability */}\n <div>\n <h3 className=\"font-medium text-gray-900 mb-3 flex items-center\">\n <Sliders className=\"h-4 w-4 mr-2\" />\n Availability\n </h3>\n <div className=\"space-y-2\">\n <label className=\"flex items-center space-x-2\">\n <Checkbox\n checked={filters.inStock}\n onChange={(e) => handleFilterChange('inStock', e.target.checked)}\n />\n <span className=\"text-sm text-gray-700\">In Stock Only</span>\n </label>\n </div>\n </div>\n\n {/* Active Filters Summary */}\n {getActiveFiltersCount() > 0 && (\n <div className=\"pt-4 border-t border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"font-medium text-gray-900\">Active Filters</h3>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\n Clear All\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {filters.categories.map(category => (\n <Badge key={category} variant=\"outline\" className=\"text-xs\">\n {category}\n <button\n onClick={() => handleFilterChange('categories', \n filters.categories.filter(c => c !== category)\n )}\n className=\"ml-1 hover:text-red-600\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n {filters.brands.map(brand => (\n <Badge key={brand} variant=\"outline\" className=\"text-xs\">\n {brand}\n <button\n onClick={() => handleFilterChange('brands', \n filters.brands.filter(b => b !== brand)\n )}\n className=\"ml-1 hover:text-red-600\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n {filters.rating > 0 && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {filters.rating}+ stars\n <button\n onClick={() => handleFilterChange('rating', 0)}\n className=\"ml-1 hover:text-red-600\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n )}\n {filters.inStock && (\n <Badge variant=\"outline\" className=\"text-xs\">\n In Stock\n <button\n onClick={() => handleFilterChange('inStock', false)}\n className=\"ml-1 hover:text-red-600\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n )}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n};"],"names":["_jsxs","_jsx","Grid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceSidebar.js","sources":["../../../src/components/Marketplace/MarketplaceSidebar.tsx"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { ChevronDown, ChevronRight, Star, X, Filter, Sliders, Tag, Store, Grid2x2 as Grid } from 'lucide-react';\r\nimport { Button } from '../Button';\r\nimport { Input } from '../Input';\r\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\r\nimport { Badge } from '../Badge';\r\nimport { Checkbox } from '../Checkbox';\r\nimport { cn } from '../../utils/cn';\r\nimport type { FilterOptions } from './types';\r\n\r\ninterface MarketplaceSidebarProps {\r\n filters: FilterOptions;\r\n onFiltersChange: (filters: FilterOptions) => void;\r\n onClearFilters: () => void;\r\n className?: string;\r\n collapsed?: boolean;\r\n onToggleCollapse?: () => void;\r\n}\r\n\r\ninterface CategoryNode {\r\n id: string;\r\n name: string;\r\n count: number;\r\n children?: CategoryNode[];\r\n}\r\n\r\nconst categoryTree: CategoryNode[] = [\r\n {\r\n id: 'electronics',\r\n name: 'Electronics',\r\n count: 156,\r\n children: [\r\n { id: 'smartphones', name: 'Smartphones', count: 45 },\r\n { id: 'laptops', name: 'Laptops', count: 32 },\r\n { id: 'headphones', name: 'Headphones', count: 28 },\r\n { id: 'cameras', name: 'Cameras', count: 21 },\r\n { id: 'accessories', name: 'Accessories', count: 30 },\r\n ],\r\n },\r\n {\r\n id: 'clothing',\r\n name: 'Clothing & Fashion',\r\n count: 234,\r\n children: [\r\n { id: 'mens', name: \"Men's Clothing\", count: 89 },\r\n { id: 'womens', name: \"Women's Clothing\", count: 112 },\r\n { id: 'shoes', name: 'Shoes', count: 67 },\r\n { id: 'accessories-fashion', name: 'Fashion Accessories', count: 45 },\r\n ],\r\n },\r\n {\r\n id: 'home',\r\n name: 'Home & Garden',\r\n count: 178,\r\n children: [\r\n { id: 'furniture', name: 'Furniture', count: 56 },\r\n { id: 'decor', name: 'Home Decor', count: 43 },\r\n { id: 'kitchen', name: 'Kitchen & Dining', count: 38 },\r\n { id: 'garden', name: 'Garden & Outdoor', count: 41 },\r\n ],\r\n },\r\n {\r\n id: 'sports',\r\n name: 'Sports & Outdoors',\r\n count: 145,\r\n children: [\r\n { id: 'fitness', name: 'Fitness Equipment', count: 34 },\r\n { id: 'outdoor', name: 'Outdoor Recreation', count: 52 },\r\n { id: 'sports-apparel', name: 'Sports Apparel', count: 59 },\r\n ],\r\n },\r\n];\r\n\r\nconst brands = [\r\n { name: 'Apple', count: 45 },\r\n { name: 'Samsung', count: 38 },\r\n { name: 'Nike', count: 67 },\r\n { name: 'Adidas', count: 54 },\r\n { name: 'Sony', count: 32 },\r\n { name: 'LG', count: 28 },\r\n { name: 'Canon', count: 21 },\r\n { name: 'Dell', count: 19 },\r\n];\r\n\r\nconst vendors = [\r\n { name: 'TechWorld Store', count: 89, rating: 4.8 },\r\n { name: 'Fashion Hub', count: 76, rating: 4.6 },\r\n { name: 'Home Essentials', count: 65, rating: 4.7 },\r\n { name: 'Sports Central', count: 54, rating: 4.5 },\r\n { name: 'Electronics Plus', count: 43, rating: 4.9 },\r\n];\r\n\r\nexport const MarketplaceSidebar: React.FC<MarketplaceSidebarProps> = ({\r\n filters,\r\n onFiltersChange,\r\n onClearFilters,\r\n className = '',\r\n collapsed = false,\r\n onToggleCollapse,\r\n}) => {\r\n const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set(['electronics']));\r\n const [expandedSections, setExpandedSections] = useState<Set<string>>(\r\n new Set(['categories', 'price', 'rating', 'brands'])\r\n );\r\n\r\n const toggleCategory = (categoryId: string) => {\r\n setExpandedCategories(prev => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(categoryId)) {\r\n newSet.delete(categoryId);\r\n } else {\r\n newSet.add(categoryId);\r\n }\r\n return newSet;\r\n });\r\n };\r\n\r\n const toggleSection = (sectionId: string) => {\r\n setExpandedSections(prev => {\r\n const newSet = new Set(prev);\r\n if (newSet.has(sectionId)) {\r\n newSet.delete(sectionId);\r\n } else {\r\n newSet.add(sectionId);\r\n }\r\n return newSet;\r\n });\r\n };\r\n\r\n const handleFilterChange = (filterType: keyof FilterOptions, value: any) => {\r\n onFiltersChange({\r\n ...filters,\r\n [filterType]: value,\r\n });\r\n };\r\n\r\n const getActiveFiltersCount = () => {\r\n let count = 0;\r\n if (filters.categories.length > 0) count += filters.categories.length;\r\n if (filters.brands.length > 0) count += filters.brands.length;\r\n if (filters.vendors.length > 0) count += filters.vendors.length;\r\n if (filters.rating > 0) count += 1;\r\n if (filters.inStock) count += 1;\r\n if (filters.priceRange[0] > 0 || filters.priceRange[1] < 1000) count += 1;\r\n return count;\r\n };\r\n\r\n const renderCategoryTree = (categories: CategoryNode[], level = 0) => {\r\n return categories.map((category) => (\r\n <div key={category.id} className={cn('', level > 0 && 'ml-4')}>\r\n <div className=\"flex items-center justify-between py-1\">\r\n <label className=\"flex items-center space-x-2 flex-1 cursor-pointer\">\r\n <Checkbox\r\n checked={filters.categories.includes(category.id)}\r\n onChange={(e) => {\r\n const newCategories = e.target.checked\r\n ? [...filters.categories, category.id]\r\n : filters.categories.filter(c => c !== category.id);\r\n handleFilterChange('categories', newCategories);\r\n }}\r\n />\r\n <span className=\"text-sm text-gray-700 flex-1\">{category.name}</span>\r\n <span className=\"text-xs text-gray-500\">({category.count})</span>\r\n </label>\r\n {category.children && (\r\n <button\r\n onClick={() => toggleCategory(category.id)}\r\n className=\"p-1 hover:bg-gray-100 rounded\"\r\n >\r\n {expandedCategories.has(category.id) ? (\r\n <ChevronDown className=\"h-3 w-3 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-3 w-3 text-gray-400\" />\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n {category.children && expandedCategories.has(category.id) && (\r\n <div className=\"mt-1\">\r\n {renderCategoryTree(category.children, level + 1)}\r\n </div>\r\n )}\r\n </div>\r\n ));\r\n };\r\n\r\n if (collapsed) {\r\n return (\r\n <div className={cn('w-16 flex-shrink-0 bg-background border-r border-border rounded-xl hidden lg:block', className)}>\r\n {/* Fixed minimized sidebar for desktop */}\r\n <div className=\"fixed top-16 left-0 h-[calc(100vh-4rem)] w-16 z-40 bg-background border-r border-border rounded-xl\">\r\n <Card className=\"h-full shadow-none border-none bg-transparent\">\r\n <CardContent className=\"p-2\">\r\n <div className=\"flex flex-col items-center space-y-3\">\r\n {/* Main Filter Icon (Expand) */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Expand filters\"\r\n title=\"Expand filters\"\r\n onClick={onToggleCollapse}\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n >\r\n <Filter className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Categories */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Categories\"\r\n title=\"Categories\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Grid className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Price */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Price Range\"\r\n title=\"Price Range\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Tag className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Rating */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Customer Rating\"\r\n title=\"Customer Rating\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Star className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Brands */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Brands\"\r\n title=\"Brands\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Tag className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Vendors */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Sellers\"\r\n title=\"Sellers\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Store className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Availability */}\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n aria-label=\"Availability\"\r\n title=\"Availability\"\r\n className=\"w-10 h-10 flex items-center justify-center text-muted-foreground hover:bg-accent focus:ring-2 focus:ring-primary rounded-lg\"\r\n tabIndex={0}\r\n >\r\n <Sliders className=\"h-5 w-5\" />\r\n </Button>\r\n {/* Active Filter Count Badge */}\r\n {getActiveFiltersCount() > 0 && (\r\n <Badge variant=\"default\" className=\"text-xs bg-primary text-primary-foreground mt-2\">\r\n {getActiveFiltersCount()}\r\n </Badge>\r\n )}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={cn('w-80 flex-shrink-0 hidden lg:block', className)}>\r\n {/* Fixed sidebar for desktop */}\r\n {/* Adjust top offset to match navbar height (e.g., 64px = 16 * 4) */}\r\n <div className=\"fixed top-16 left-0 h-[calc(100vh-4rem)] w-80 z-30 bg-background border-r border-border pt-4\">\r\n <Card className=\"h-full shadow-none border-none bg-transparent\">\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <CardTitle className=\"flex items-center text-lg\">\r\n <Filter className=\"h-5 w-5 mr-2\" />\r\n Filters\r\n {getActiveFiltersCount() > 0 && (\r\n <Badge variant=\"default\" className=\"ml-2\">\r\n {getActiveFiltersCount()}\r\n </Badge>\r\n )}\r\n </CardTitle>\r\n <div className=\"flex items-center space-x-2\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\r\n Clear All\r\n </Button>\r\n {onToggleCollapse && (\r\n <Button variant=\"ghost\" size=\"sm\" onClick={onToggleCollapse}>\r\n <X className=\"h-4 w-4\" />\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n </CardHeader>\r\n\r\n <CardContent className=\"space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto\">\r\n {/* Categories */}\r\n <div>\r\n <button\r\n onClick={() => toggleSection('categories')}\r\n className=\"flex items-center justify-between w-full mb-3\"\r\n >\r\n <h3 className=\"font-medium text-gray-900 flex items-center\">\r\n <Grid className=\"h-4 w-4 mr-2\" />\r\n Categories\r\n </h3>\r\n {expandedSections.has('categories') ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\r\n )}\r\n </button>\r\n {expandedSections.has('categories') && (\r\n <div className=\"space-y-1\">\r\n {renderCategoryTree(categoryTree)}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Price Range */}\r\n <div>\r\n <button\r\n onClick={() => toggleSection('price')}\r\n className=\"flex items-center justify-between w-full mb-3\"\r\n >\r\n <h3 className=\"font-medium text-gray-900 flex items-center\">\r\n <Tag className=\"h-4 w-4 mr-2\" />\r\n Price Range\r\n </h3>\r\n {expandedSections.has('price') ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\r\n )}\r\n </button>\r\n {expandedSections.has('price') && (\r\n <div className=\"space-y-3\">\r\n <div className=\"flex items-center space-x-2\">\r\n <Input\r\n type=\"number\"\r\n placeholder=\"Min\"\r\n value={filters.priceRange[0]}\r\n onChange={(e) => handleFilterChange('priceRange', [\r\n parseInt(e.target.value) || 0,\r\n filters.priceRange[1]\r\n ])}\r\n className=\"w-20 text-sm\"\r\n />\r\n <span className=\"text-gray-400\">-</span>\r\n <Input\r\n type=\"number\"\r\n placeholder=\"Max\"\r\n value={filters.priceRange[1]}\r\n onChange={(e) => handleFilterChange('priceRange', [\r\n filters.priceRange[0],\r\n parseInt(e.target.value) || 1000\r\n ])}\r\n className=\"w-20 text-sm\"\r\n />\r\n </div>\r\n \r\n {/* Quick Price Ranges */}\r\n <div className=\"space-y-1\">\r\n {[\r\n { label: 'Under $25', range: [0, 25] },\r\n { label: '$25 - $50', range: [25, 50] },\r\n { label: '$50 - $100', range: [50, 100] },\r\n { label: '$100 - $200', range: [100, 200] },\r\n { label: 'Over $200', range: [200, 1000] },\r\n ].map((option) => (\r\n <label key={option.label} className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n checked={\r\n filters.priceRange[0] === option.range[0] &&\r\n filters.priceRange[1] === option.range[1]\r\n }\r\n onChange={(e) => {\r\n if (e.target.checked) {\r\n handleFilterChange('priceRange', option.range);\r\n }\r\n }}\r\n />\r\n <span className=\"text-sm text-gray-700\">{option.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Rating */}\r\n <div>\r\n <button\r\n onClick={() => toggleSection('rating')}\r\n className=\"flex items-center justify-between w-full mb-3\"\r\n >\r\n <h3 className=\"font-medium text-gray-900 flex items-center\">\r\n <Star className=\"h-4 w-4 mr-2\" />\r\n Customer Rating\r\n </h3>\r\n {expandedSections.has('rating') ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\r\n )}\r\n </button>\r\n {expandedSections.has('rating') && (\r\n <div className=\"space-y-2\">\r\n {[4, 3, 2, 1].map(rating => (\r\n <label key={rating} className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n checked={filters.rating === rating}\r\n onChange={(e) => {\r\n handleFilterChange('rating', e.target.checked ? rating : 0);\r\n }}\r\n />\r\n <div className=\"flex items-center space-x-1\">\r\n {[1, 2, 3, 4, 5].map(star => (\r\n <Star\r\n key={star}\r\n className={`h-4 w-4 ${\r\n star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'\r\n }`}\r\n />\r\n ))}\r\n <span className=\"text-sm text-gray-700\">& up</span>\r\n </div>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Brands */}\r\n <div>\r\n <button\r\n onClick={() => toggleSection('brands')}\r\n className=\"flex items-center justify-between w-full mb-3\"\r\n >\r\n <h3 className=\"font-medium text-gray-900 flex items-center\">\r\n <Tag className=\"h-4 w-4 mr-2\" />\r\n Brands\r\n </h3>\r\n {expandedSections.has('brands') ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\r\n )}\r\n </button>\r\n {expandedSections.has('brands') && (\r\n <div className=\"space-y-2\">\r\n {brands.map(brand => (\r\n <label key={brand.name} className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n checked={filters.brands.includes(brand.name)}\r\n onChange={(e) => {\r\n const newBrands = e.target.checked\r\n ? [...filters.brands, brand.name]\r\n : filters.brands.filter(b => b !== brand.name);\r\n handleFilterChange('brands', newBrands);\r\n }}\r\n />\r\n <span className=\"text-sm text-gray-700\">{brand.name}</span>\r\n </div>\r\n <span className=\"text-xs text-gray-500\">({brand.count})</span>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Vendors */}\r\n <div>\r\n <button\r\n onClick={() => toggleSection('vendors')}\r\n className=\"flex items-center justify-between w-full mb-3\"\r\n >\r\n <h3 className=\"font-medium text-gray-900 flex items-center\">\r\n <Store className=\"h-4 w-4 mr-2\" />\r\n Sellers\r\n </h3>\r\n {expandedSections.has('vendors') ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-400\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-400\" />\r\n )}\r\n </button>\r\n {expandedSections.has('vendors') && (\r\n <div className=\"space-y-2\">\r\n {vendors.map(vendor => (\r\n <label key={vendor.name} className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n checked={filters.vendors.includes(vendor.name)}\r\n onChange={(e) => {\r\n const newVendors = e.target.checked\r\n ? [...filters.vendors, vendor.name]\r\n : filters.vendors.filter(v => v !== vendor.name);\r\n handleFilterChange('vendors', newVendors);\r\n }}\r\n />\r\n <div>\r\n <div className=\"text-sm text-gray-700\">{vendor.name}</div>\r\n <div className=\"flex items-center space-x-1\">\r\n <Star className=\"h-3 w-3 text-yellow-400 fill-current\" />\r\n <span className=\"text-xs text-gray-500\">{vendor.rating}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <span className=\"text-xs text-gray-500\">({vendor.count})</span>\r\n </label>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Availability */}\r\n <div>\r\n <h3 className=\"font-medium text-gray-900 mb-3 flex items-center\">\r\n <Sliders className=\"h-4 w-4 mr-2\" />\r\n Availability\r\n </h3>\r\n <div className=\"space-y-2\">\r\n <label className=\"flex items-center space-x-2\">\r\n <Checkbox\r\n checked={filters.inStock}\r\n onChange={(e) => handleFilterChange('inStock', e.target.checked)}\r\n />\r\n <span className=\"text-sm text-gray-700\">In Stock Only</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n {/* Active Filters Summary */}\r\n {getActiveFiltersCount() > 0 && (\r\n <div className=\"pt-4 border-t border-gray-200\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h3 className=\"font-medium text-gray-900\">Active Filters</h3>\r\n <Button variant=\"ghost\" size=\"sm\" onClick={onClearFilters}>\r\n Clear All\r\n </Button>\r\n </div>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {filters.categories.map(category => (\r\n <Badge key={category} variant=\"outline\" className=\"text-xs\">\r\n {category}\r\n <button\r\n onClick={() => handleFilterChange('categories', \r\n filters.categories.filter(c => c !== category)\r\n )}\r\n className=\"ml-1 hover:text-red-600\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n </Badge>\r\n ))}\r\n {filters.brands.map(brand => (\r\n <Badge key={brand} variant=\"outline\" className=\"text-xs\">\r\n {brand}\r\n <button\r\n onClick={() => handleFilterChange('brands', \r\n filters.brands.filter(b => b !== brand)\r\n )}\r\n className=\"ml-1 hover:text-red-600\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n </Badge>\r\n ))}\r\n {filters.rating > 0 && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n {filters.rating}+ stars\r\n <button\r\n onClick={() => handleFilterChange('rating', 0)}\r\n className=\"ml-1 hover:text-red-600\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n </Badge>\r\n )}\r\n {filters.inStock && (\r\n <Badge variant=\"outline\" className=\"text-xs\">\r\n In Stock\r\n <button\r\n onClick={() => handleFilterChange('inStock', false)}\r\n className=\"ml-1 hover:text-red-600\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n </Badge>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </CardContent>\r\n </Card>\r\n </div>\r\n </div>\r\n );\r\n};"],"names":["_jsxs","_jsx","Grid"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { Input } from '../Input/Input.js';
|
|
|
9
9
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs/Tabs.js';
|
|
10
10
|
import { showToast } from '../Toast/Toast.js';
|
|
11
11
|
import { sampleProducts, sampleReviews } from './data/sampleData.js';
|
|
12
|
+
import { useScrollToTop } from './hooks/useScrollToTop.js';
|
|
12
13
|
|
|
13
14
|
const SingleProductView = ({ product, reviews, relatedProducts, onAddToCart, onBuyNow, }) => {
|
|
14
15
|
const productsData = sampleProducts;
|
|
@@ -35,6 +36,8 @@ const SingleProductView = ({ product, reviews, relatedProducts, onAddToCart, onB
|
|
|
35
36
|
const [quantity, setQuantity] = useState(1);
|
|
36
37
|
const [isWishlisted, setIsWishlisted] = useState(false);
|
|
37
38
|
const [selectedTab, setSelectedTab] = useState('description');
|
|
39
|
+
// Scroll to top on product change/mount
|
|
40
|
+
useScrollToTop([productData?.id]);
|
|
38
41
|
const handleAddToCart = () => {
|
|
39
42
|
onAddToCart?.(productData, quantity);
|
|
40
43
|
showToast.success(`Added ${quantity} item(s) to cart!`);
|
|
@@ -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":"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"}
|
|
@@ -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 };
|