@beyondcorp/beyond-ui 1.2.26 → 1.2.30
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/AllProductsView/AllProductsView.d.ts +0 -11
- package/dist/components/AllProductsView/AllProductsView.js +2 -9
- package/dist/components/AllProductsView/AllProductsView.js.map +1 -1
- package/dist/components/AllProductsView/ProductCard.js +4 -2
- package/dist/components/AllProductsView/ProductCard.js.map +1 -1
- package/dist/components/Card/Card.js +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/DashboardGrid/DashboardGrid.d.ts +3 -22
- package/dist/components/DashboardGrid/DashboardGrid.js +10 -48
- package/dist/components/DashboardGrid/DashboardGrid.js.map +1 -1
- package/dist/components/Marketplace/AllProductsView.d.ts +8 -0
- package/dist/components/Marketplace/AllProductsView.js +185 -0
- package/dist/components/Marketplace/AllProductsView.js.map +1 -0
- package/dist/components/Marketplace/CheckoutCompact.d.ts +10 -0
- package/dist/components/Marketplace/CheckoutCompact.js +66 -0
- package/dist/components/Marketplace/CheckoutCompact.js.map +1 -0
- package/dist/components/Marketplace/CheckoutComponent.d.ts +8 -0
- package/dist/components/Marketplace/CheckoutComponent.js +123 -0
- package/dist/components/Marketplace/CheckoutComponent.js.map +1 -0
- package/dist/components/Marketplace/MarketplaceComponent.d.ts +8 -0
- package/dist/components/Marketplace/MarketplaceComponent.js +108 -0
- package/dist/components/Marketplace/MarketplaceComponent.js.map +1 -0
- package/dist/components/Marketplace/MarketplaceSidebar.d.ts +12 -0
- package/dist/components/Marketplace/MarketplaceSidebar.js +167 -0
- package/dist/components/Marketplace/MarketplaceSidebar.js.map +1 -0
- package/dist/components/Marketplace/SingleProductView.d.ts +9 -0
- package/dist/components/Marketplace/SingleProductView.js +52 -0
- package/dist/components/Marketplace/SingleProductView.js.map +1 -0
- package/dist/components/Marketplace/data/sampleData.d.ts +3 -0
- package/dist/components/Marketplace/data/sampleData.js +153 -0
- package/dist/components/Marketplace/data/sampleData.js.map +1 -0
- package/dist/components/Marketplace/index.d.ts +7 -0
- package/dist/components/Marketplace/types.d.ts +82 -0
- package/dist/components/MarketplaceLayout/MarketplaceLayout.d.ts +0 -10
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js +3 -3
- package/dist/components/MarketplaceLayout/MarketplaceLayout.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.js +6 -5
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Menu, Package, Search, ShoppingCart, Bell, Users, DollarSign, Eye, Star } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Input } from '../Input/Input.js';
|
|
6
|
+
import { Card, CardContent } from '../Card/Card.js';
|
|
7
|
+
import { Badge } from '../Badge/Badge.js';
|
|
8
|
+
import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar.js';
|
|
9
|
+
import { StatsCard } from '../StatsCard/StatsCard.js';
|
|
10
|
+
import { showToast } from '../Toast/Toast.js';
|
|
11
|
+
import { MarketplaceSidebar } from './MarketplaceSidebar.js';
|
|
12
|
+
import { AllProductsView } from './AllProductsView.js';
|
|
13
|
+
import { SingleProductView } from './SingleProductView.js';
|
|
14
|
+
import { CheckoutCompact } from './CheckoutCompact.js';
|
|
15
|
+
import { sampleProducts } from './data/sampleData.js';
|
|
16
|
+
|
|
17
|
+
const MarketplaceComponent = ({ userRole = 'buyer', onProductClick, }) => {
|
|
18
|
+
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
|
|
19
|
+
const [currentView, setCurrentView] = useState('dashboard');
|
|
20
|
+
const [selectedProduct, setSelectedProduct] = useState(null);
|
|
21
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
22
|
+
const [cartItems, setCartItems] = useState([]);
|
|
23
|
+
const [showCheckout, setShowCheckout] = useState(false);
|
|
24
|
+
const [filters, setFilters] = useState({
|
|
25
|
+
categories: [],
|
|
26
|
+
brands: [],
|
|
27
|
+
priceRange: [0, 1000],
|
|
28
|
+
rating: 0,
|
|
29
|
+
inStock: false,
|
|
30
|
+
vendors: [],
|
|
31
|
+
});
|
|
32
|
+
const featuredProducts = sampleProducts.slice(0, 4);
|
|
33
|
+
const recentlyViewed = sampleProducts.slice(8, 12);
|
|
34
|
+
const handleProductClick = (product) => {
|
|
35
|
+
setSelectedProduct(product);
|
|
36
|
+
setCurrentView('product');
|
|
37
|
+
onProductClick?.(product);
|
|
38
|
+
};
|
|
39
|
+
const handleAddToCart = (product, quantity = 1) => {
|
|
40
|
+
setCartItems(prev => {
|
|
41
|
+
const existingItem = prev.find(item => item.product.id === product.id);
|
|
42
|
+
if (existingItem) {
|
|
43
|
+
return prev.map(item => item.product.id === product.id
|
|
44
|
+
? { ...item, quantity: item.quantity + quantity }
|
|
45
|
+
: item);
|
|
46
|
+
}
|
|
47
|
+
return [...prev, { product, quantity }];
|
|
48
|
+
});
|
|
49
|
+
showToast.success(`${product.name} added to cart!`);
|
|
50
|
+
};
|
|
51
|
+
const handleSearch = (query) => {
|
|
52
|
+
setSearchQuery(query);
|
|
53
|
+
if (query.trim()) {
|
|
54
|
+
setCurrentView('products');
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const renderHeader = () => (jsx("header", { className: "bg-white border-b border-gray-200 sticky top-0 z-40", children: jsx("div", { className: "px-6 py-4", children: jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center space-x-4", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: () => setSidebarCollapsed(!sidebarCollapsed), className: "lg:hidden", children: jsx(Menu, { className: "h-5 w-5" }) }), jsxs("div", { className: "flex items-center space-x-3", children: [jsx("div", { className: "w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center", children: jsx(Package, { className: "h-5 w-5 text-white" }) }), jsxs("div", { children: [jsx("h1", { className: "font-bold text-xl text-gray-900", children: "MarketPlace" }), jsx("p", { className: "text-xs text-gray-500", children: "Your digital marketplace" })] })] })] }), jsx("div", { className: "flex-1 max-w-2xl mx-8", children: jsxs("div", { className: "relative", children: [jsx(Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { placeholder: "Search products, brands, categories...", value: searchQuery, onChange: (e) => handleSearch(e.target.value), className: "pl-10 bg-gray-50 border-gray-200 focus:bg-white" })] }) }), jsxs("div", { className: "flex items-center space-x-3", children: [jsx("div", { className: "relative", children: jsxs(Button, { variant: "ghost", size: "sm", onClick: () => setShowCheckout(!showCheckout), className: "relative", children: [jsx(ShoppingCart, { className: "h-5 w-5" }), cartItems.length > 0 && (jsx(Badge, { variant: "danger", className: "absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center", children: cartItems.reduce((sum, item) => sum + item.quantity, 0) }))] }) }), jsxs(Button, { variant: "ghost", size: "sm", className: "relative", children: [jsx(Bell, { className: "h-5 w-5" }), jsx(Badge, { variant: "danger", className: "absolute -top-1 -right-1 h-4 w-4 text-xs p-0 flex items-center justify-center", children: "3" })] }), jsxs("div", { className: "flex items-center space-x-3 pl-3 border-l border-gray-200", children: [jsxs("div", { className: "hidden sm:block text-right", children: [jsx("p", { className: "text-sm font-medium text-gray-900", children: "John Doe" }), jsx("p", { className: "text-xs text-gray-500 capitalize", children: userRole })] }), jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: "https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64" }), jsx(AvatarFallback, { children: "JD" })] })] })] })] }) }) }));
|
|
58
|
+
const renderDashboard = () => (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6", children: [jsx(StatsCard, { title: "Total Products", value: "2,543", trend: {
|
|
59
|
+
direction: "up",
|
|
60
|
+
value: "+12%",
|
|
61
|
+
label: "from last month"
|
|
62
|
+
}, icon: jsx(Package, { className: "h-6 w-6 text-primary-600" }) }), jsx(StatsCard, { title: "Active Sellers", value: "156", trend: {
|
|
63
|
+
direction: "up",
|
|
64
|
+
value: "+8%",
|
|
65
|
+
label: "from last month"
|
|
66
|
+
}, icon: jsx(Users, { className: "h-6 w-6 text-success-600" }) }), jsx(StatsCard, { title: "Total Sales", value: "$45,231", trend: {
|
|
67
|
+
direction: "up",
|
|
68
|
+
value: "+15%",
|
|
69
|
+
label: "from last month"
|
|
70
|
+
}, icon: jsx(DollarSign, { className: "h-6 w-6 text-warning-600" }) }), jsx(StatsCard, { title: "Page Views", value: "89,432", trend: {
|
|
71
|
+
direction: "up",
|
|
72
|
+
value: "+23%",
|
|
73
|
+
label: "from last month"
|
|
74
|
+
}, icon: jsx(Eye, { className: "h-6 w-6 text-danger-600" }) })] }), 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: () => setCurrentView('products'), children: "View All" })] }), jsx("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: [
|
|
75
|
+
{ name: 'Electronics', count: 156, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
76
|
+
{ name: 'Fashion', count: 234, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
77
|
+
{ name: 'Home & Garden', count: 178, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
78
|
+
{ name: 'Sports', count: 145, image: 'https://images.pexels.com/photos/863988/pexels-photo-863988.jpeg?auto=compress&cs=tinysrgb&w=400' },
|
|
79
|
+
].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: () => setCurrentView('products'), children: "View All" })] }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: featuredProducts.map((product) => (jsxs(Card, { className: "hover:shadow-lg transition-shadow cursor-pointer", children: [jsxs("div", { className: "aspect-square bg-gray-100 rounded-t-lg overflow-hidden", onClick: () => handleProductClick(product), children: [jsx("img", { src: product.images[0], alt: product.name, className: "w-full h-full object-cover" }), product.discount && (jsxs(Badge, { variant: "danger", className: "absolute top-2 left-2", children: ["-", product.discount, "%"] }))] }), 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 space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsxs("span", { className: "text-sm text-gray-600", children: [product.rating, " (", product.reviewCount, ")"] })] }), jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsxs("span", { className: "text-lg font-bold text-gray-900", children: ["$", product.price.toFixed(2)] }), product.originalPrice && (jsxs("span", { className: "text-sm text-gray-500 line-through", children: ["$", product.originalPrice.toFixed(2)] }))] }), jsx(Button, { size: "sm", onClick: (e) => {
|
|
80
|
+
e.stopPropagation();
|
|
81
|
+
handleAddToCart(product);
|
|
82
|
+
}, 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: [
|
|
83
|
+
{ name: 'TechWorld Store', rating: 4.8, products: 89, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=64' },
|
|
84
|
+
{ 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' },
|
|
85
|
+
{ 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' },
|
|
86
|
+
].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: () => handleProductClick(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) => {
|
|
87
|
+
e.stopPropagation();
|
|
88
|
+
handleAddToCart(product);
|
|
89
|
+
}, children: jsx(ShoppingCart, { className: "h-4 w-4" }) })] })] })] }, product.id))) })] }))] }));
|
|
90
|
+
return (jsxs("div", { className: "min-h-screen bg-gray-50", children: [renderHeader(), jsxs("div", { className: "flex", children: [(currentView === 'products' || currentView === 'dashboard') && (jsx(MarketplaceSidebar, { filters: filters, onFiltersChange: setFilters, onClearFilters: () => setFilters({
|
|
91
|
+
categories: [],
|
|
92
|
+
brands: [],
|
|
93
|
+
priceRange: [0, 1000],
|
|
94
|
+
rating: 0,
|
|
95
|
+
inStock: false,
|
|
96
|
+
vendors: [],
|
|
97
|
+
}), collapsed: sidebarCollapsed, onToggleCollapse: () => setSidebarCollapsed(!sidebarCollapsed) })), jsxs("main", { className: "flex-1 p-6", children: [currentView === 'dashboard' && renderDashboard(), currentView === 'products' && (jsx(AllProductsView, { onProductClick: handleProductClick, onAddToCart: handleAddToCart })), currentView === 'product' && selectedProduct && (jsx(SingleProductView, { productId: selectedProduct.id, onAddToCart: handleAddToCart, onBuyNow: (product, quantity) => {
|
|
98
|
+
handleAddToCart(product, quantity);
|
|
99
|
+
setShowCheckout(true);
|
|
100
|
+
} }))] }), showCheckout && (jsx("div", { className: "fixed right-4 top-20 z-50", children: jsx(CheckoutCompact, { cartItems: cartItems, onClose: () => setShowCheckout(false), onCheckout: (items) => {
|
|
101
|
+
showToast.success('Order placed successfully!');
|
|
102
|
+
setCartItems([]);
|
|
103
|
+
setShowCheckout(false);
|
|
104
|
+
} }) }))] })] }));
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export { MarketplaceComponent };
|
|
108
|
+
//# sourceMappingURL=MarketplaceComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarketplaceComponent.js","sources":["../../../src/components/Marketplace/MarketplaceComponent.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Search, ShoppingCart, User, Bell, Menu, TrendingUp, Star, Eye, Package, DollarSign, Users, BarChart3, Filter, Grid2x2 as Grid, List } from 'lucide-react';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Card, CardHeader, CardTitle, CardContent } from '../Card';\nimport { Badge } from '../Badge';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar';\nimport { StatsCard } from '../StatsCard';\nimport { showToast } from '../Toast';\nimport { MarketplaceSidebar } from './MarketplaceSidebar';\nimport { AllProductsView } from './AllProductsView';\nimport { SingleProductView } from './SingleProductView';\nimport { CheckoutCompact } from './CheckoutCompact';\nimport type { Product, FilterOptions, CartItem } from './types';\nimport { sampleProducts } from './data/sampleData';\n\ninterface MarketplaceComponentProps {\n userRole?: 'buyer' | 'seller' | 'admin';\n onProductClick?: (product: Product) => void;\n}\n\nexport const MarketplaceComponent: React.FC<MarketplaceComponentProps> = ({\n userRole = 'buyer',\n onProductClick,\n}) => {\n const [sidebarCollapsed, setSidebarCollapsed] = useState(false);\n const [currentView, setCurrentView] = useState<'dashboard' | 'products' | 'product' | 'checkout'>('dashboard');\n const [selectedProduct, setSelectedProduct] = useState<Product | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n const [cartItems, setCartItems] = useState<CartItem[]>([]);\n const [showCheckout, setShowCheckout] = useState(false);\n const [filters, setFilters] = useState<FilterOptions>({\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n });\n\n const featuredProducts = sampleProducts.slice(0, 4);\n const trendingProducts = sampleProducts.slice(4, 8);\n const recentlyViewed = sampleProducts.slice(8, 12);\n\n const handleProductClick = (product: Product) => {\n setSelectedProduct(product);\n setCurrentView('product');\n onProductClick?.(product);\n };\n\n const handleAddToCart = (product: Product, quantity: number = 1) => {\n setCartItems(prev => {\n const existingItem = prev.find(item => item.product.id === product.id);\n if (existingItem) {\n return prev.map(item =>\n item.product.id === product.id\n ? { ...item, quantity: item.quantity + quantity }\n : item\n );\n }\n return [...prev, { product, quantity }];\n });\n showToast.success(`${product.name} added to cart!`);\n };\n\n const handleSearch = (query: string) => {\n setSearchQuery(query);\n if (query.trim()) {\n setCurrentView('products');\n }\n };\n\n const renderHeader = () => (\n <header className=\"bg-white border-b border-gray-200 sticky top-0 z-40\">\n <div className=\"px-6 py-4\">\n <div className=\"flex items-center justify-between\">\n {/* Left Section */}\n <div className=\"flex items-center space-x-4\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setSidebarCollapsed(!sidebarCollapsed)}\n className=\"lg:hidden\"\n >\n <Menu className=\"h-5 w-5\" />\n </Button>\n \n <div className=\"flex items-center space-x-3\">\n <div className=\"w-8 h-8 bg-primary-600 rounded-lg flex items-center justify-center\">\n <Package className=\"h-5 w-5 text-white\" />\n </div>\n <div>\n <h1 className=\"font-bold text-xl text-gray-900\">MarketPlace</h1>\n <p className=\"text-xs text-gray-500\">Your digital marketplace</p>\n </div>\n </div>\n </div>\n\n {/* Center Section - Search */}\n <div className=\"flex-1 max-w-2xl mx-8\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <Input\n placeholder=\"Search products, brands, categories...\"\n value={searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"pl-10 bg-gray-50 border-gray-200 focus:bg-white\"\n />\n </div>\n </div>\n\n {/* Right Section */}\n <div className=\"flex items-center space-x-3\">\n {/* Cart */}\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowCheckout(!showCheckout)}\n className=\"relative\"\n >\n <ShoppingCart className=\"h-5 w-5\" />\n {cartItems.length > 0 && (\n <Badge \n variant=\"danger\" \n className=\"absolute -top-1 -right-1 h-5 w-5 text-xs p-0 flex items-center justify-center\"\n >\n {cartItems.reduce((sum, item) => sum + item.quantity, 0)}\n </Badge>\n )}\n </Button>\n </div>\n\n {/* Notifications */}\n <Button variant=\"ghost\" size=\"sm\" className=\"relative\">\n <Bell className=\"h-5 w-5\" />\n <Badge \n variant=\"danger\" \n className=\"absolute -top-1 -right-1 h-4 w-4 text-xs p-0 flex items-center justify-center\"\n >\n 3\n </Badge>\n </Button>\n\n {/* User Profile */}\n <div className=\"flex items-center space-x-3 pl-3 border-l border-gray-200\">\n <div className=\"hidden sm:block text-right\">\n <p className=\"text-sm font-medium text-gray-900\">John Doe</p>\n <p className=\"text-xs text-gray-500 capitalize\">{userRole}</p>\n </div>\n <Avatar size=\"sm\">\n <AvatarImage src=\"https://images.pexels.com/photos/774909/pexels-photo-774909.jpeg?auto=compress&cs=tinysrgb&w=64\" />\n <AvatarFallback>JD</AvatarFallback>\n </Avatar>\n </div>\n </div>\n </div>\n </div>\n </header>\n );\n\n const renderDashboard = () => (\n <div className=\"space-y-8\">\n {/* Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n <StatsCard\n title=\"Total Products\"\n value=\"2,543\"\n trend={{\n direction: \"up\",\n value: \"+12%\",\n label: \"from last month\"\n }}\n icon={<Package className=\"h-6 w-6 text-primary-600\" />}\n />\n <StatsCard\n title=\"Active Sellers\"\n value=\"156\"\n trend={{\n direction: \"up\",\n value: \"+8%\",\n label: \"from last month\"\n }}\n icon={<Users className=\"h-6 w-6 text-success-600\" />}\n />\n <StatsCard\n title=\"Total Sales\"\n value=\"$45,231\"\n trend={{\n direction: \"up\",\n value: \"+15%\",\n label: \"from last month\"\n }}\n icon={<DollarSign className=\"h-6 w-6 text-warning-600\" />}\n />\n <StatsCard\n title=\"Page Views\"\n value=\"89,432\"\n trend={{\n direction: \"up\",\n value: \"+23%\",\n label: \"from last month\"\n }}\n icon={<Eye className=\"h-6 w-6 text-danger-600\" />}\n />\n </div>\n\n {/* Featured Categories */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Categories</h2>\n <Button variant=\"outline\" onClick={() => setCurrentView('products')}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n { name: 'Electronics', count: 156, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Fashion', count: 234, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Home & Garden', count: 178, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=400' },\n { name: 'Sports', count: 145, image: 'https://images.pexels.com/photos/863988/pexels-photo-863988.jpeg?auto=compress&cs=tinysrgb&w=400' },\n ].map((category) => (\n <Card key={category.name} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\">\n <img\n src={category.image}\n alt={category.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4 text-center\">\n <h3 className=\"font-medium text-gray-900 mb-1\">{category.name}</h3>\n <p className=\"text-sm text-gray-600\">{category.count} products</p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Featured Products */}\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900\">Featured Products</h2>\n <Button variant=\"outline\" onClick={() => setCurrentView('products')}>\n View All\n </Button>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {featuredProducts.map((product) => (\n <Card key={product.id} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div \n className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\"\n onClick={() => handleProductClick(product)}\n >\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover\"\n />\n {product.discount && (\n <Badge variant=\"danger\" className=\"absolute top-2 left-2\">\n -{product.discount}%\n </Badge>\n )}\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {product.name}\n </h3>\n <div className=\"flex items-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">\n {product.rating} ({product.reviewCount})\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n {product.originalPrice && (\n <span className=\"text-sm text-gray-500 line-through\">\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n <Button\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n handleAddToCart(product);\n }}\n >\n Add to Cart\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Vendor Spotlight */}\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Top Sellers</h2>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {[\n { name: 'TechWorld Store', rating: 4.8, products: 89, image: 'https://images.pexels.com/photos/3394650/pexels-photo-3394650.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Fashion Hub', rating: 4.6, products: 76, image: 'https://images.pexels.com/photos/1926769/pexels-photo-1926769.jpeg?auto=compress&cs=tinysrgb&w=64' },\n { name: 'Home Essentials', rating: 4.7, products: 65, image: 'https://images.pexels.com/photos/1571460/pexels-photo-1571460.jpeg?auto=compress&cs=tinysrgb&w=64' },\n ].map((vendor) => (\n <Card key={vendor.name} className=\"hover:shadow-lg transition-shadow\">\n <CardContent className=\"p-6 text-center\">\n <Avatar size=\"lg\" className=\"mx-auto mb-4\">\n <AvatarImage src={vendor.image} />\n <AvatarFallback>{vendor.name[0]}</AvatarFallback>\n </Avatar>\n <h3 className=\"font-semibold text-gray-900 mb-2\">{vendor.name}</h3>\n <div className=\"flex items-center justify-center space-x-1 mb-2\">\n <Star className=\"h-4 w-4 text-yellow-400 fill-current\" />\n <span className=\"text-sm text-gray-600\">{vendor.rating}</span>\n </div>\n <p className=\"text-sm text-gray-600 mb-4\">{vendor.products} products</p>\n <Button variant=\"outline\" size=\"sm\">\n Visit Store\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n {/* Recently Viewed */}\n {recentlyViewed.length > 0 && (\n <div>\n <h2 className=\"text-2xl font-bold text-gray-900 mb-6\">Recently Viewed</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {recentlyViewed.map((product) => (\n <Card key={product.id} className=\"hover:shadow-lg transition-shadow cursor-pointer\">\n <div \n className=\"aspect-square bg-gray-100 rounded-t-lg overflow-hidden\"\n onClick={() => handleProductClick(product)}\n >\n <img\n src={product.images[0]}\n alt={product.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <CardContent className=\"p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2 line-clamp-2\">\n {product.name}\n </h3>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-lg font-bold text-gray-900\">\n ${product.price.toFixed(2)}\n </span>\n <Button\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n handleAddToCart(product);\n }}\n >\n <ShoppingCart className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n {/* Header */}\n {renderHeader()}\n\n <div className=\"flex\">\n {/* Sidebar */}\n {(currentView === 'products' || currentView === 'dashboard') && (\n <MarketplaceSidebar\n filters={filters}\n onFiltersChange={setFilters}\n onClearFilters={() => setFilters({\n categories: [],\n brands: [],\n priceRange: [0, 1000],\n rating: 0,\n inStock: false,\n vendors: [],\n })}\n collapsed={sidebarCollapsed}\n onToggleCollapse={() => setSidebarCollapsed(!sidebarCollapsed)}\n />\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 p-6\">\n {currentView === 'dashboard' && renderDashboard()}\n \n {currentView === 'products' && (\n <AllProductsView\n onProductClick={handleProductClick}\n onAddToCart={handleAddToCart}\n />\n )}\n \n {currentView === 'product' && selectedProduct && (\n <SingleProductView\n productId={selectedProduct.id}\n onAddToCart={handleAddToCart}\n onBuyNow={(product, quantity) => {\n handleAddToCart(product, quantity);\n setShowCheckout(true);\n }}\n />\n )}\n </main>\n\n {/* Checkout Sidebar */}\n {showCheckout && (\n <div className=\"fixed right-4 top-20 z-50\">\n <CheckoutCompact\n cartItems={cartItems}\n onClose={() => setShowCheckout(false)}\n onCheckout={(items) => {\n showToast.success('Order placed successfully!');\n setCartItems([]);\n setShowCheckout(false);\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n};"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FilterOptions } from './types';
|
|
3
|
+
interface MarketplaceSidebarProps {
|
|
4
|
+
filters: FilterOptions;
|
|
5
|
+
onFiltersChange: (filters: FilterOptions) => void;
|
|
6
|
+
onClearFilters: () => void;
|
|
7
|
+
className?: string;
|
|
8
|
+
collapsed?: boolean;
|
|
9
|
+
onToggleCollapse?: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare const MarketplaceSidebar: React.FC<MarketplaceSidebarProps>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Filter, X, Grid2x2, ChevronDown, ChevronRight, Tag, Star, Store, Sliders } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Input } from '../Input/Input.js';
|
|
6
|
+
import { Card, CardContent, CardHeader, CardTitle } from '../Card/Card.js';
|
|
7
|
+
import { Badge } from '../Badge/Badge.js';
|
|
8
|
+
import { Checkbox } from '../Checkbox/Checkbox.js';
|
|
9
|
+
import { cn } from '../../utils/cn.js';
|
|
10
|
+
|
|
11
|
+
const categoryTree = [
|
|
12
|
+
{
|
|
13
|
+
id: 'electronics',
|
|
14
|
+
name: 'Electronics',
|
|
15
|
+
count: 156,
|
|
16
|
+
children: [
|
|
17
|
+
{ id: 'smartphones', name: 'Smartphones', count: 45 },
|
|
18
|
+
{ id: 'laptops', name: 'Laptops', count: 32 },
|
|
19
|
+
{ id: 'headphones', name: 'Headphones', count: 28 },
|
|
20
|
+
{ id: 'cameras', name: 'Cameras', count: 21 },
|
|
21
|
+
{ id: 'accessories', name: 'Accessories', count: 30 },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'clothing',
|
|
26
|
+
name: 'Clothing & Fashion',
|
|
27
|
+
count: 234,
|
|
28
|
+
children: [
|
|
29
|
+
{ id: 'mens', name: "Men's Clothing", count: 89 },
|
|
30
|
+
{ id: 'womens', name: "Women's Clothing", count: 112 },
|
|
31
|
+
{ id: 'shoes', name: 'Shoes', count: 67 },
|
|
32
|
+
{ id: 'accessories-fashion', name: 'Fashion Accessories', count: 45 },
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'home',
|
|
37
|
+
name: 'Home & Garden',
|
|
38
|
+
count: 178,
|
|
39
|
+
children: [
|
|
40
|
+
{ id: 'furniture', name: 'Furniture', count: 56 },
|
|
41
|
+
{ id: 'decor', name: 'Home Decor', count: 43 },
|
|
42
|
+
{ id: 'kitchen', name: 'Kitchen & Dining', count: 38 },
|
|
43
|
+
{ id: 'garden', name: 'Garden & Outdoor', count: 41 },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'sports',
|
|
48
|
+
name: 'Sports & Outdoors',
|
|
49
|
+
count: 145,
|
|
50
|
+
children: [
|
|
51
|
+
{ id: 'fitness', name: 'Fitness Equipment', count: 34 },
|
|
52
|
+
{ id: 'outdoor', name: 'Outdoor Recreation', count: 52 },
|
|
53
|
+
{ id: 'sports-apparel', name: 'Sports Apparel', count: 59 },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
const brands = [
|
|
58
|
+
{ name: 'Apple', count: 45 },
|
|
59
|
+
{ name: 'Samsung', count: 38 },
|
|
60
|
+
{ name: 'Nike', count: 67 },
|
|
61
|
+
{ name: 'Adidas', count: 54 },
|
|
62
|
+
{ name: 'Sony', count: 32 },
|
|
63
|
+
{ name: 'LG', count: 28 },
|
|
64
|
+
{ name: 'Canon', count: 21 },
|
|
65
|
+
{ name: 'Dell', count: 19 },
|
|
66
|
+
];
|
|
67
|
+
const vendors = [
|
|
68
|
+
{ name: 'TechWorld Store', count: 89, rating: 4.8 },
|
|
69
|
+
{ name: 'Fashion Hub', count: 76, rating: 4.6 },
|
|
70
|
+
{ name: 'Home Essentials', count: 65, rating: 4.7 },
|
|
71
|
+
{ name: 'Sports Central', count: 54, rating: 4.5 },
|
|
72
|
+
{ name: 'Electronics Plus', count: 43, rating: 4.9 },
|
|
73
|
+
];
|
|
74
|
+
const MarketplaceSidebar = ({ filters, onFiltersChange, onClearFilters, className = '', collapsed = false, onToggleCollapse, }) => {
|
|
75
|
+
const [expandedCategories, setExpandedCategories] = useState(new Set(['electronics']));
|
|
76
|
+
const [expandedSections, setExpandedSections] = useState(new Set(['categories', 'price', 'rating', 'brands']));
|
|
77
|
+
const toggleCategory = (categoryId) => {
|
|
78
|
+
setExpandedCategories(prev => {
|
|
79
|
+
const newSet = new Set(prev);
|
|
80
|
+
if (newSet.has(categoryId)) {
|
|
81
|
+
newSet.delete(categoryId);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
newSet.add(categoryId);
|
|
85
|
+
}
|
|
86
|
+
return newSet;
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const toggleSection = (sectionId) => {
|
|
90
|
+
setExpandedSections(prev => {
|
|
91
|
+
const newSet = new Set(prev);
|
|
92
|
+
if (newSet.has(sectionId)) {
|
|
93
|
+
newSet.delete(sectionId);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
newSet.add(sectionId);
|
|
97
|
+
}
|
|
98
|
+
return newSet;
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
const handleFilterChange = (filterType, value) => {
|
|
102
|
+
onFiltersChange({
|
|
103
|
+
...filters,
|
|
104
|
+
[filterType]: value,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const getActiveFiltersCount = () => {
|
|
108
|
+
let count = 0;
|
|
109
|
+
if (filters.categories.length > 0)
|
|
110
|
+
count += filters.categories.length;
|
|
111
|
+
if (filters.brands.length > 0)
|
|
112
|
+
count += filters.brands.length;
|
|
113
|
+
if (filters.vendors.length > 0)
|
|
114
|
+
count += filters.vendors.length;
|
|
115
|
+
if (filters.rating > 0)
|
|
116
|
+
count += 1;
|
|
117
|
+
if (filters.inStock)
|
|
118
|
+
count += 1;
|
|
119
|
+
if (filters.priceRange[0] > 0 || filters.priceRange[1] < 1000)
|
|
120
|
+
count += 1;
|
|
121
|
+
return count;
|
|
122
|
+
};
|
|
123
|
+
const renderCategoryTree = (categories, level = 0) => {
|
|
124
|
+
return categories.map((category) => (jsxs("div", { className: cn('', level > 0 && 'ml-4'), children: [jsxs("div", { className: "flex items-center justify-between py-1", children: [jsxs("label", { className: "flex items-center space-x-2 flex-1 cursor-pointer", children: [jsx(Checkbox, { checked: filters.categories.includes(category.id), onChange: (e) => {
|
|
125
|
+
const newCategories = e.target.checked
|
|
126
|
+
? [...filters.categories, category.id]
|
|
127
|
+
: filters.categories.filter(c => c !== category.id);
|
|
128
|
+
handleFilterChange('categories', newCategories);
|
|
129
|
+
} }), jsx("span", { className: "text-sm text-gray-700 flex-1", children: category.name }), jsxs("span", { className: "text-xs text-gray-500", children: ["(", category.count, ")"] })] }), category.children && (jsx("button", { onClick: () => toggleCategory(category.id), className: "p-1 hover:bg-gray-100 rounded", children: expandedCategories.has(category.id) ? (jsx(ChevronDown, { className: "h-3 w-3 text-gray-400" })) : (jsx(ChevronRight, { className: "h-3 w-3 text-gray-400" })) }))] }), category.children && expandedCategories.has(category.id) && (jsx("div", { className: "mt-1", children: renderCategoryTree(category.children, level + 1) }))] }, category.id)));
|
|
130
|
+
};
|
|
131
|
+
if (collapsed) {
|
|
132
|
+
return (jsx("div", { className: cn('w-16 flex-shrink-0', className), children: jsx(Card, { className: "sticky top-4", children: jsx(CardContent, { className: "p-4", children: jsxs("div", { className: "flex flex-col items-center space-y-4", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: onToggleCollapse, className: "w-full", children: jsx(Filter, { className: "h-5 w-5" }) }), getActiveFiltersCount() > 0 && (jsx(Badge, { variant: "default", className: "text-xs", children: getActiveFiltersCount() }))] }) }) }) }));
|
|
133
|
+
}
|
|
134
|
+
return (jsx("div", { className: cn('w-80 flex-shrink-0', className), children: jsxs(Card, { className: "sticky top-4", children: [jsx(CardHeader, { className: "pb-3", children: jsxs("div", { className: "flex items-center justify-between", children: [jsxs(CardTitle, { className: "flex items-center text-lg", children: [jsx(Filter, { className: "h-5 w-5 mr-2" }), "Filters", getActiveFiltersCount() > 0 && (jsx(Badge, { variant: "default", className: "ml-2", children: getActiveFiltersCount() }))] }), jsxs("div", { className: "flex items-center space-x-2", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: onClearFilters, children: "Clear All" }), onToggleCollapse && (jsx(Button, { variant: "ghost", size: "sm", onClick: onToggleCollapse, children: jsx(X, { className: "h-4 w-4" }) }))] })] }) }), jsxs(CardContent, { className: "space-y-6 max-h-[calc(100vh-200px)] overflow-y-auto", children: [jsxs("div", { children: [jsxs("button", { onClick: () => toggleSection('categories'), className: "flex items-center justify-between w-full mb-3", children: [jsxs("h3", { className: "font-medium text-gray-900 flex items-center", children: [jsx(Grid2x2, { className: "h-4 w-4 mr-2" }), "Categories"] }), expandedSections.has('categories') ? (jsx(ChevronDown, { className: "h-4 w-4 text-gray-400" })) : (jsx(ChevronRight, { className: "h-4 w-4 text-gray-400" }))] }), expandedSections.has('categories') && (jsx("div", { className: "space-y-1", children: renderCategoryTree(categoryTree) }))] }), jsxs("div", { children: [jsxs("button", { onClick: () => toggleSection('price'), className: "flex items-center justify-between w-full mb-3", children: [jsxs("h3", { className: "font-medium text-gray-900 flex items-center", children: [jsx(Tag, { className: "h-4 w-4 mr-2" }), "Price Range"] }), expandedSections.has('price') ? (jsx(ChevronDown, { className: "h-4 w-4 text-gray-400" })) : (jsx(ChevronRight, { className: "h-4 w-4 text-gray-400" }))] }), expandedSections.has('price') && (jsxs("div", { className: "space-y-3", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsx(Input, { type: "number", placeholder: "Min", value: filters.priceRange[0], onChange: (e) => handleFilterChange('priceRange', [
|
|
135
|
+
parseInt(e.target.value) || 0,
|
|
136
|
+
filters.priceRange[1]
|
|
137
|
+
]), className: "w-20 text-sm" }), jsx("span", { className: "text-gray-400", children: "-" }), jsx(Input, { type: "number", placeholder: "Max", value: filters.priceRange[1], onChange: (e) => handleFilterChange('priceRange', [
|
|
138
|
+
filters.priceRange[0],
|
|
139
|
+
parseInt(e.target.value) || 1000
|
|
140
|
+
]), className: "w-20 text-sm" })] }), jsx("div", { className: "space-y-1", children: [
|
|
141
|
+
{ label: 'Under $25', range: [0, 25] },
|
|
142
|
+
{ label: '$25 - $50', range: [25, 50] },
|
|
143
|
+
{ label: '$50 - $100', range: [50, 100] },
|
|
144
|
+
{ label: '$100 - $200', range: [100, 200] },
|
|
145
|
+
{ label: 'Over $200', range: [200, 1000] },
|
|
146
|
+
].map((option) => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.priceRange[0] === option.range[0] &&
|
|
147
|
+
filters.priceRange[1] === option.range[1], onChange: (e) => {
|
|
148
|
+
if (e.target.checked) {
|
|
149
|
+
handleFilterChange('priceRange', option.range);
|
|
150
|
+
}
|
|
151
|
+
} }), jsx("span", { className: "text-sm text-gray-700", children: option.label })] }, option.label))) })] }))] }), jsxs("div", { children: [jsxs("button", { onClick: () => toggleSection('rating'), className: "flex items-center justify-between w-full mb-3", children: [jsxs("h3", { className: "font-medium text-gray-900 flex items-center", children: [jsx(Star, { className: "h-4 w-4 mr-2" }), "Customer Rating"] }), expandedSections.has('rating') ? (jsx(ChevronDown, { className: "h-4 w-4 text-gray-400" })) : (jsx(ChevronRight, { className: "h-4 w-4 text-gray-400" }))] }), expandedSections.has('rating') && (jsx("div", { className: "space-y-2", children: [4, 3, 2, 1].map(rating => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.rating === rating, onChange: (e) => {
|
|
152
|
+
handleFilterChange('rating', e.target.checked ? rating : 0);
|
|
153
|
+
} }), jsxs("div", { className: "flex items-center space-x-1", children: [[1, 2, 3, 4, 5].map(star => (jsx(Star, { className: `h-4 w-4 ${star <= rating ? 'text-yellow-400 fill-current' : 'text-gray-300'}` }, star))), jsx("span", { className: "text-sm text-gray-700", children: "& up" })] })] }, rating))) }))] }), jsxs("div", { children: [jsxs("button", { onClick: () => toggleSection('brands'), className: "flex items-center justify-between w-full mb-3", children: [jsxs("h3", { className: "font-medium text-gray-900 flex items-center", children: [jsx(Tag, { className: "h-4 w-4 mr-2" }), "Brands"] }), expandedSections.has('brands') ? (jsx(ChevronDown, { className: "h-4 w-4 text-gray-400" })) : (jsx(ChevronRight, { className: "h-4 w-4 text-gray-400" }))] }), expandedSections.has('brands') && (jsx("div", { className: "space-y-2", children: brands.map(brand => (jsxs("label", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.brands.includes(brand.name), onChange: (e) => {
|
|
154
|
+
const newBrands = e.target.checked
|
|
155
|
+
? [...filters.brands, brand.name]
|
|
156
|
+
: filters.brands.filter(b => b !== brand.name);
|
|
157
|
+
handleFilterChange('brands', newBrands);
|
|
158
|
+
} }), jsx("span", { className: "text-sm text-gray-700", children: brand.name })] }), jsxs("span", { className: "text-xs text-gray-500", children: ["(", brand.count, ")"] })] }, brand.name))) }))] }), jsxs("div", { children: [jsxs("button", { onClick: () => toggleSection('vendors'), className: "flex items-center justify-between w-full mb-3", children: [jsxs("h3", { className: "font-medium text-gray-900 flex items-center", children: [jsx(Store, { className: "h-4 w-4 mr-2" }), "Sellers"] }), expandedSections.has('vendors') ? (jsx(ChevronDown, { className: "h-4 w-4 text-gray-400" })) : (jsx(ChevronRight, { className: "h-4 w-4 text-gray-400" }))] }), expandedSections.has('vendors') && (jsx("div", { className: "space-y-2", children: vendors.map(vendor => (jsxs("label", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.vendors.includes(vendor.name), onChange: (e) => {
|
|
159
|
+
const newVendors = e.target.checked
|
|
160
|
+
? [...filters.vendors, vendor.name]
|
|
161
|
+
: filters.vendors.filter(v => v !== vendor.name);
|
|
162
|
+
handleFilterChange('vendors', newVendors);
|
|
163
|
+
} }), jsxs("div", { children: [jsx("div", { className: "text-sm text-gray-700", children: vendor.name }), jsxs("div", { className: "flex items-center space-x-1", children: [jsx(Star, { className: "h-3 w-3 text-yellow-400 fill-current" }), jsx("span", { className: "text-xs text-gray-500", children: vendor.rating })] })] })] }), jsxs("span", { className: "text-xs text-gray-500", children: ["(", vendor.count, ")"] })] }, vendor.name))) }))] }), jsxs("div", { children: [jsxs("h3", { className: "font-medium text-gray-900 mb-3 flex items-center", children: [jsx(Sliders, { className: "h-4 w-4 mr-2" }), "Availability"] }), jsx("div", { className: "space-y-2", children: jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: filters.inStock, onChange: (e) => handleFilterChange('inStock', e.target.checked) }), jsx("span", { className: "text-sm text-gray-700", children: "In Stock Only" })] }) })] }), getActiveFiltersCount() > 0 && (jsxs("div", { className: "pt-4 border-t border-gray-200", children: [jsxs("div", { className: "flex items-center justify-between mb-2", children: [jsx("h3", { className: "font-medium text-gray-900", children: "Active Filters" }), jsx(Button, { variant: "ghost", size: "sm", onClick: onClearFilters, children: "Clear All" })] }), jsxs("div", { className: "flex flex-wrap gap-2", children: [filters.categories.map(category => (jsxs(Badge, { variant: "outline", className: "text-xs", children: [category, jsx("button", { onClick: () => handleFilterChange('categories', filters.categories.filter(c => c !== category)), className: "ml-1 hover:text-red-600", children: jsx(X, { className: "h-3 w-3" }) })] }, category))), filters.brands.map(brand => (jsxs(Badge, { variant: "outline", className: "text-xs", children: [brand, jsx("button", { onClick: () => handleFilterChange('brands', filters.brands.filter(b => b !== brand)), className: "ml-1 hover:text-red-600", children: jsx(X, { className: "h-3 w-3" }) })] }, brand))), filters.rating > 0 && (jsxs(Badge, { variant: "outline", className: "text-xs", children: [filters.rating, "+ stars", jsx("button", { onClick: () => handleFilterChange('rating', 0), className: "ml-1 hover:text-red-600", children: jsx(X, { className: "h-3 w-3" }) })] })), filters.inStock && (jsxs(Badge, { variant: "outline", className: "text-xs", children: ["In Stock", jsx("button", { onClick: () => handleFilterChange('inStock', false), className: "ml-1 hover:text-red-600", children: jsx(X, { className: "h-3 w-3" }) })] }))] })] }))] })] }) }));
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export { MarketplaceSidebar };
|
|
167
|
+
//# sourceMappingURL=MarketplaceSidebar.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Product } from './types';
|
|
3
|
+
interface SingleProductViewProps {
|
|
4
|
+
productId?: string;
|
|
5
|
+
onAddToCart?: (product: Product, quantity: number) => void;
|
|
6
|
+
onBuyNow?: (product: Product, quantity: number) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const SingleProductView: React.FC<SingleProductViewProps>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ChevronLeft, ChevronRight, Star, Minus, Plus, ShoppingCart, Zap, Heart, Share2, Truck, RotateCcw, Shield, Check, ThumbsUp } from 'lucide-react';
|
|
4
|
+
import { Button } from '../Button/Button.js';
|
|
5
|
+
import { Card, CardContent } from '../Card/Card.js';
|
|
6
|
+
import { Badge } from '../Badge/Badge.js';
|
|
7
|
+
import { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar.js';
|
|
8
|
+
import { Input } from '../Input/Input.js';
|
|
9
|
+
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs/Tabs.js';
|
|
10
|
+
import { showToast } from '../Toast/Toast.js';
|
|
11
|
+
import { sampleProducts, sampleReviews } from './data/sampleData.js';
|
|
12
|
+
|
|
13
|
+
const SingleProductView = ({ productId = '1', onAddToCart, onBuyNow, }) => {
|
|
14
|
+
const [selectedImageIndex, setSelectedImageIndex] = useState(0);
|
|
15
|
+
const [quantity, setQuantity] = useState(1);
|
|
16
|
+
const [isWishlisted, setIsWishlisted] = useState(false);
|
|
17
|
+
const [selectedTab, setSelectedTab] = useState('description');
|
|
18
|
+
// Get product data (in real app, this would come from API)
|
|
19
|
+
const product = sampleProducts.find(p => p.id === productId) || sampleProducts[0];
|
|
20
|
+
const reviews = sampleReviews;
|
|
21
|
+
const relatedProducts = sampleProducts.slice(1, 5);
|
|
22
|
+
const handleAddToCart = () => {
|
|
23
|
+
onAddToCart?.(product, quantity);
|
|
24
|
+
showToast.success(`Added ${quantity} item(s) to cart!`);
|
|
25
|
+
};
|
|
26
|
+
const handleBuyNow = () => {
|
|
27
|
+
onBuyNow?.(product, quantity);
|
|
28
|
+
showToast.info('Redirecting to checkout...');
|
|
29
|
+
};
|
|
30
|
+
const handleShare = () => {
|
|
31
|
+
navigator.clipboard.writeText(window.location.href);
|
|
32
|
+
showToast.success('Product link copied to clipboard!');
|
|
33
|
+
};
|
|
34
|
+
const nextImage = () => {
|
|
35
|
+
setSelectedImageIndex((prev) => prev === product.images.length - 1 ? 0 : prev + 1);
|
|
36
|
+
};
|
|
37
|
+
const prevImage = () => {
|
|
38
|
+
setSelectedImageIndex((prev) => prev === 0 ? product.images.length - 1 : prev - 1);
|
|
39
|
+
};
|
|
40
|
+
return (jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8", children: [jsxs("nav", { className: "flex items-center space-x-2 text-sm text-gray-600 mb-8", children: [jsx("a", { href: "/", className: "hover:text-primary-600", children: "Home" }), jsx("span", { children: "/" }), jsx("a", { href: "/products", className: "hover:text-primary-600", children: "Products" }), jsx("span", { children: "/" }), jsx("a", { href: `/category/${product.category.toLowerCase()}`, className: "hover:text-primary-600", children: product.category }), jsx("span", { children: "/" }), jsx("span", { className: "text-gray-900", children: product.name })] }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12", children: [jsxs("div", { children: [jsxs("div", { className: "relative aspect-square bg-gray-100 rounded-lg overflow-hidden mb-4", children: [jsx("img", { src: product.images[selectedImageIndex], alt: product.name, className: "w-full h-full object-cover" }), product.images.length > 1 && (jsxs(Fragment, { children: [jsx("button", { onClick: prevImage, 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", children: jsx(ChevronLeft, { className: "h-5 w-5" }) }), jsx("button", { onClick: nextImage, 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", children: jsx(ChevronRight, { className: "h-5 w-5" }) })] })), product.discount && (jsxs(Badge, { variant: "danger", className: "absolute top-4 left-4", children: ["-", product.discount, "%"] }))] }), product.images.length > 1 && (jsx("div", { className: "flex space-x-2 overflow-x-auto", children: product.images.map((image, index) => (jsx("button", { onClick: () => setSelectedImageIndex(index), className: `flex-shrink-0 w-20 h-20 rounded-lg overflow-hidden border-2 transition-colors ${selectedImageIndex === index
|
|
41
|
+
? 'border-primary-500'
|
|
42
|
+
: 'border-gray-200 hover:border-gray-300'}`, children: jsx("img", { src: image, alt: `${product.name} ${index + 1}`, className: "w-full h-full object-cover" }) }, index))) }))] }), jsxs("div", { children: [jsxs("div", { className: "flex items-center space-x-2 mb-4", children: [jsx("span", { className: "text-sm text-gray-600", children: "Sold by" }), jsxs("div", { className: "flex items-center space-x-2", children: [product.vendor.logo && (jsxs(Avatar, { size: "sm", children: [jsx(AvatarImage, { src: product.vendor.logo }), jsx(AvatarFallback, { children: product.vendor.name[0] })] })), jsx("span", { className: "font-medium text-primary-600", children: product.vendor.name }), jsxs("div", { className: "flex items-center space-x-1", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsx("span", { className: "text-sm text-gray-600", children: product.vendor.rating })] })] })] }), jsx("h1", { className: "text-3xl font-bold text-gray-900 mb-4", children: product.name }), jsxs("div", { className: "flex items-center space-x-4 mb-6", children: [jsxs("div", { className: "flex items-center space-x-1", children: [[1, 2, 3, 4, 5].map((star) => (jsx(Star, { className: `h-5 w-5 ${star <= Math.floor(product.rating)
|
|
43
|
+
? 'text-yellow-400 fill-current'
|
|
44
|
+
: 'text-gray-300'}` }, star))), jsx("span", { className: "text-lg font-medium text-gray-900 ml-2", children: product.rating })] }), jsxs("span", { className: "text-gray-600", children: ["(", product.reviewCount, " reviews)"] }), jsx(Badge, { variant: product.inStock ? 'success' : 'danger', children: product.inStock ? 'In Stock' : 'Out of Stock' })] }), jsx("div", { className: "mb-6", children: jsxs("div", { className: "flex items-center space-x-3", children: [jsxs("span", { className: "text-3xl font-bold text-gray-900", children: ["$", product.price.toFixed(2)] }), product.originalPrice && (jsxs("span", { className: "text-xl text-gray-500 line-through", children: ["$", product.originalPrice.toFixed(2)] })), product.discount && (jsxs(Badge, { variant: "danger", children: ["Save ", product.discount, "%"] }))] }) }), jsx("p", { className: "text-gray-600 mb-6 leading-relaxed", children: product.description }), jsxs("div", { className: "space-y-4 mb-8", children: [jsxs("div", { className: "flex items-center space-x-4", children: [jsx("span", { className: "font-medium text-gray-900", children: "Quantity:" }), jsxs("div", { className: "flex items-center border border-gray-300 rounded-lg", children: [jsx("button", { onClick: () => setQuantity(Math.max(1, quantity - 1)), className: "p-2 hover:bg-gray-50 transition-colors", disabled: quantity <= 1, children: jsx(Minus, { className: "h-4 w-4" }) }), jsx(Input, { type: "number", value: quantity, onChange: (e) => setQuantity(Math.max(1, parseInt(e.target.value) || 1)), className: "w-16 text-center border-0 focus:ring-0", min: "1" }), jsx("button", { onClick: () => setQuantity(quantity + 1), className: "p-2 hover:bg-gray-50 transition-colors", children: jsx(Plus, { className: "h-4 w-4" }) })] })] }), jsxs("div", { className: "flex space-x-4", children: [jsxs(Button, { variant: "primary", size: "lg", onClick: handleAddToCart, disabled: !product.inStock, className: "flex-1", children: [jsx(ShoppingCart, { className: "mr-2 h-5 w-5" }), "Add to Cart"] }), jsxs(Button, { variant: "secondary", size: "lg", onClick: handleBuyNow, disabled: !product.inStock, className: "flex-1", children: [jsx(Zap, { className: "mr-2 h-5 w-5" }), "Buy Now"] })] }), jsxs("div", { className: "flex space-x-2", children: [jsxs(Button, { variant: "outline", onClick: () => setIsWishlisted(!isWishlisted), className: "flex-1", children: [jsx(Heart, { className: `mr-2 h-5 w-5 ${isWishlisted ? 'fill-current text-red-500' : ''}` }), isWishlisted ? 'Wishlisted' : 'Add to Wishlist'] }), jsx(Button, { variant: "outline", onClick: handleShare, children: jsx(Share2, { className: "h-5 w-5" }) })] })] }), jsxs("div", { className: "grid grid-cols-2 gap-4 mb-8", children: [jsxs("div", { className: "flex items-center space-x-2 text-sm text-gray-600", children: [jsx(Truck, { className: "h-4 w-4 text-green-600" }), jsx("span", { children: "Free shipping" })] }), jsxs("div", { className: "flex items-center space-x-2 text-sm text-gray-600", children: [jsx(RotateCcw, { className: "h-4 w-4 text-blue-600" }), jsx("span", { children: "30-day returns" })] }), jsxs("div", { className: "flex items-center space-x-2 text-sm text-gray-600", children: [jsx(Shield, { className: "h-4 w-4 text-purple-600" }), jsx("span", { children: "2-year warranty" })] }), jsxs("div", { className: "flex items-center space-x-2 text-sm text-gray-600", children: [jsx(Check, { className: "h-4 w-4 text-green-600" }), jsx("span", { children: "Authentic product" })] })] })] })] }), jsx("div", { className: "mt-16", children: jsxs(Tabs, { value: selectedTab, onValueChange: setSelectedTab, children: [jsxs(TabsList, { children: [jsx(TabsTrigger, { value: "description", children: "Description" }), jsx(TabsTrigger, { value: "specifications", children: "Specifications" }), jsxs(TabsTrigger, { value: "reviews", children: ["Reviews (", reviews.length, ")"] })] }), jsx(TabsContent, { value: "description", className: "mt-8", children: jsx(Card, { children: jsxs(CardContent, { className: "p-8", children: [jsx("h3", { className: "text-xl font-semibold mb-4", children: "Product Description" }), jsxs("div", { className: "prose max-w-none", children: [jsx("p", { className: "text-gray-600 leading-relaxed mb-4", children: product.description }), jsx("p", { className: "text-gray-600 leading-relaxed", children: "This premium product offers exceptional quality and performance, designed to meet the highest standards. With advanced features and reliable construction, it's perfect for both professional and personal use." })] })] }) }) }), jsx(TabsContent, { value: "specifications", className: "mt-8", children: jsx(Card, { children: jsxs(CardContent, { className: "p-8", children: [jsx("h3", { className: "text-xl font-semibold mb-4", children: "Technical Specifications" }), jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: Object.entries(product.specifications).map(([key, value]) => (jsxs("div", { className: "flex justify-between py-2 border-b border-gray-100", children: [jsxs("span", { className: "font-medium text-gray-900", children: [key, ":"] }), jsx("span", { className: "text-gray-600", children: value })] }, key))) })] }) }) }), jsx(TabsContent, { value: "reviews", className: "mt-8", children: jsxs("div", { className: "space-y-6", children: [jsx(Card, { children: jsx(CardContent, { className: "p-8", children: jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8", children: [jsxs("div", { children: [jsx("h3", { className: "text-xl font-semibold mb-4", children: "Customer Reviews" }), jsxs("div", { className: "flex items-center space-x-4 mb-4", children: [jsx("span", { className: "text-4xl font-bold text-gray-900", children: product.rating }), jsxs("div", { children: [jsx("div", { className: "flex items-center space-x-1 mb-1", children: [1, 2, 3, 4, 5].map((star) => (jsx(Star, { className: `h-5 w-5 ${star <= Math.floor(product.rating)
|
|
45
|
+
? 'text-yellow-400 fill-current'
|
|
46
|
+
: 'text-gray-300'}` }, star))) }), jsxs("span", { className: "text-gray-600", children: ["Based on ", product.reviewCount, " reviews"] })] })] })] }), jsx("div", { children: jsx(Button, { variant: "primary", className: "w-full", children: "Write a Review" }) })] }) }) }), reviews.map((review) => (jsx(Card, { children: jsx(CardContent, { className: "p-6", children: jsxs("div", { className: "flex items-start space-x-4", children: [jsxs(Avatar, { children: [jsx(AvatarImage, { src: review.userAvatar }), jsx(AvatarFallback, { children: review.userName[0] })] }), jsxs("div", { className: "flex-1", children: [jsxs("div", { className: "flex items-center space-x-2 mb-2", children: [jsx("span", { className: "font-medium text-gray-900", children: review.userName }), review.verified && (jsx(Badge, { variant: "success", className: "text-xs", children: "Verified Purchase" }))] }), jsxs("div", { className: "flex items-center space-x-2 mb-2", children: [jsx("div", { className: "flex items-center space-x-1", children: [1, 2, 3, 4, 5].map((star) => (jsx(Star, { className: `h-4 w-4 ${star <= review.rating
|
|
47
|
+
? 'text-yellow-400 fill-current'
|
|
48
|
+
: 'text-gray-300'}` }, star))) }), jsx("span", { className: "text-sm text-gray-600", children: review.date })] }), jsx("h4", { className: "font-medium text-gray-900 mb-2", children: review.title }), jsx("p", { className: "text-gray-600 mb-4", children: review.comment }), jsx("div", { className: "flex items-center space-x-4", children: jsxs("button", { className: "flex items-center space-x-1 text-sm text-gray-600 hover:text-gray-900", children: [jsx(ThumbsUp, { className: "h-4 w-4" }), jsxs("span", { children: ["Helpful (", review.helpful, ")"] })] }) })] })] }) }) }, review.id)))] }) })] }) }), jsxs("div", { className: "mt-16", children: [jsx("h2", { className: "text-2xl font-bold text-gray-900 mb-8", children: "Related Products" }), jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6", children: relatedProducts.map((relatedProduct) => (jsxs(Card, { className: "hover:shadow-lg transition-shadow", children: [jsx("div", { className: "aspect-square bg-gray-100 rounded-t-lg overflow-hidden", children: jsx("img", { src: relatedProduct.images[0], alt: relatedProduct.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: relatedProduct.name }), jsxs("div", { className: "flex items-center space-x-1 mb-2", children: [jsx(Star, { className: "h-4 w-4 text-yellow-400 fill-current" }), jsxs("span", { className: "text-sm text-gray-600", children: [relatedProduct.rating, " (", relatedProduct.reviewCount, ")"] })] }), jsxs("div", { className: "flex items-center justify-between", children: [jsxs("span", { className: "text-lg font-bold text-gray-900", children: ["$", relatedProduct.price.toFixed(2)] }), jsx(Button, { size: "sm", variant: "outline", children: "View" })] })] })] }, relatedProduct.id))) })] })] }));
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { SingleProductView };
|
|
52
|
+
//# sourceMappingURL=SingleProductView.js.map
|