anycoder-82edf70e / index.html
moaazhosam69's picture
Upload folder using huggingface_hub
493cbfd verified
Raw
History Blame Contribute Delete
26.4 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Voltix Marketplace | Multi-Vendor eCommerce Platform</title>
<!-- Icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+Arabic:wght@400;700&display=swap" rel="stylesheet">
<style>
/* --- CSS VARIABLES & THEME --- */
:root {
--primary: #4f46e5;
--primary-hover: #4338ca;
--secondary: #ec4899;
--accent: #06b6d4;
--bg-body: #f3f4f6;
--bg-card: #ffffff;
--text-main: #111827;
--text-muted: #6b7280;
--border: #e5e7eb;
--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--radius: 0.75rem;
--transition: all 0.3s ease;
--font-en: 'Inter', sans-serif;
--font-ar: 'Noto Sans Arabic', sans-serif;
}
[data-theme="dark"] {
--bg-body: #0f172a;
--bg-card: #1e293b;
--text-main: #f8fafc;
--text-muted: #94a3b8;
--border: #334155;
--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.5);
}
/* --- RESET & BASE --- */
* { box-sizing: box-sizing; margin: 0; padding: 0; }
body {
font-family: var(--font-en);
background-color: var(--bg-body);
color: var(--text-main);
transition: var(--transition);
line-height: 1.6;
overflow-x: hidden;
}
body.rtl { font-family: var(--font-ar); direction: rtl; }
a { text-decoration: none; color: inherit; }
ul { list-style: none; }
img { max-width: 100%; display: block; }
button, input, select { font-family: inherit; }
/* --- UTILITIES --- */
.container { max-width: 1280px; margin: 0 auto; padding: 0 1.5rem; }
.flex { display: flex; }
.flex-col { display: flex; flex-direction: column; }
.items-center { align-items: center; }
.justify-between { justify-content: space-between; }
.gap-2 { gap: 0.5rem; }
.gap-4 { gap: 1rem; }
.grid { display: grid; }
.text-center { text-align: center; }
.text-primary { color: var(--primary); }
.bg-primary { background-color: var(--primary); }
.rounded { border-radius: var(--radius); }
.shadow { box-shadow: var(--shadow); }
.p-4 { padding: 1rem; }
.m-4 { margin: 1rem; }
.hidden { display: none; }
.btn {
display: inline-flex; align-items: center; justify-content: center;
padding: 0.6rem 1.2rem; border-radius: var(--radius);
font-weight: 600; cursor: pointer; transition: var(--transition);
border: none; gap: 0.5rem;
}
.btn-primary { background: var(--primary); color: white; }
.btn-primary:hover { background: var(--primary-hover); transform: translateY(-2px); }
.btn-outline { border: 1px solid var(--border); background: transparent; color: var(--text-main); }
.btn-outline:hover { border-color: var(--primary); color: var(--primary); }
/* --- HEADER --- */
header {
background: var(--bg-card); border-bottom: 1px solid var(--border);
position: sticky; top: 0; z-index: 100;
}
.top-bar { padding: 0.8rem 0; }
.nav-links a { margin-left: 1.5rem; font-weight: 500; color: var(--text-muted); }
.nav-links a:hover { color: var(--primary); }
.rtl .nav-links a { margin-left: 0; margin-right: 1.5rem; }
/* --- HERO SECTION --- */
.hero {
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
color: white; padding: 4rem 0;
border-radius: 0 0 2rem 2rem;
margin-bottom: 2rem;
}
.hero-content { max-width: 600px; }
.hero h1 { font-size: 2.5rem; margin-bottom: 1rem; line-height: 1.2; }
.hero p { font-size: 1.1rem; opacity: 0.9; margin-bottom: 2rem; }
/* --- GRID LAYOUTS --- */
.product-grid {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1.5rem;
}
.plan-grid {
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
}
/* --- CARDS --- */
.card {
background: var(--bg-card); border: 1px solid var(--border);
border-radius: var(--radius); overflow: hidden;
transition: var(--transition);
}
.card:hover { transform: translateY(-5px); box-shadow: var(--shadow); }
.card-img { height: 200px; background: #ddd; position: relative; }
.card-img img { width: 100%; height: 100%; object-fit: cover; }
.badge {
position: absolute; top: 10px; right: 10px;
background: var(--secondary); color: white;
padding: 0.2rem 0.6rem; font-size: 0.8rem; rounded: 4px;
}
.rtl .badge { right: auto; left: 10px; }
.card-body { padding: 1rem; }
.card-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; }
.card-price { font-size: 1.2rem; font-weight: 700; color: var(--primary); }
.card-meta { font-size: 0.85rem; color: var(--text-muted); margin-bottom: 0.5rem; }
/* --- STOREFRONT --- */
.store-header {
background: var(--bg-card); padding: 2rem; border-radius: var(--radius);
margin-bottom: 2rem; display: flex; align-items: center; gap: 2rem;
}
.store-logo { width: 100px; height: 100px; rounded: 50%; border: 3px solid var(--border); }
.store-stats { display: flex; gap: 2rem; margin-top: 1rem; }
.stat-item { font-size: 0.9rem; color: var(--text-muted); }
.stat-item span { font-weight: 700; color: var(--text-main); }
/* --- DASHBOARD --- */
.dashboard-layout { display: grid; grid-template-columns: 250px 1fr; gap: 2rem; min-height: 80vh; }
.sidebar { background: var(--bg-card); padding: 1.5rem; border-radius: var(--radius); }
.sidebar li { padding: 0.8rem; cursor: pointer; border-radius: 0.5rem; margin-bottom: 0.5rem; color: var(--text-muted); }
.sidebar li:hover, .sidebar li.active { background: var(--bg-body); color: var(--primary); font-weight: 600; }
.dash-content { background: var(--bg-card); padding: 2rem; border-radius: var(--radius); }
.stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 2rem; }
.stat-box { background: var(--bg-body); padding: 1.5rem; rounded: var(--radius); text-align: center; }
.stat-box h3 { font-size: 2rem; color: var(--primary); }
/* --- PLANS --- */
.plan-card { border: 1px solid var(--border); padding: 2rem; rounded: var(--radius); text-align: center; position: relative; }
.plan-card.featured { border: 2px solid var(--primary); background: rgba(79, 46, 225, 0.05); }
.plan-price { font-size: 2.5rem; font-weight: 700; margin: 1rem 0; }
.plan-features li { margin: 0.5rem 0; color: var(--text-muted); }
/* --- MODAL --- */
.modal {
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
background: rgba(0,0,0,0.5); z-index: 1000;
display: flex; align-items: center; justify-content: center;
opacity: 0; pointer-events: none; transition: 0.3s;
}
.modal.open { opacity: 1; pointer-events: auto; }
.modal-content {
background: var(--bg-card); width: 400px; padding: 2rem;
rounded: var(--radius); transform: scale(0.9); transition: 0.3s;
}
.modal.open .modal-content { transform: scale(1); }
/* --- RESPONSIVE --- */
@media (max-width: 768px) {
.dashboard-layout { grid-template-columns: 1fr; }
.hero { padding: 2rem 0; text-align: center; }
.store-header { flex-direction: column; text-align: center; }
.nav-links { display: none; } /* Simplified for mobile demo */
.stat-grid { grid-template-columns: repeat(2, 1fr); }
}
</style>
</head>
<body>
<!-- Header -->
<header>
<div class="container top-bar flex justify-between items-center">
<a href="#" onclick="app.navigate('home')" class="flex items-center gap-2" style="font-size: 1.5rem; font-weight: 800;">
<i class="fa-solid fa-bolt text-primary"></i> Voltix
</a>
<div class="nav-links flex items-center">
<a href="#" onclick="app.navigate('home')">Home</a>
<a href="#" onclick="app.navigate('store')">Storefront</a>
<a href="#" onclick="app.navigate('plans')">Plans</a>
<a href="#" onclick="app.navigate('dashboard')">Dashboard</a>
</div>
<div class="flex items-center gap-4">
<button class="btn btn-outline" onclick="app.toggleTheme()">
<i class="fa-solid fa-moon"></i>
</button>
<button class="btn btn-outline" onclick="app.toggleLang()">
<span id="lang-text">EN</span>
</button>
<button class="btn btn-primary" onclick="app.openModal('login')">
<i class="fa-solid fa-user"></i> Login
</button>
<button class="btn btn-outline" style="position: relative;">
<i class="fa-solid fa-shopping-cart"></i>
<span style="position:absolute; top:-8px; right:-8px; background:var(--secondary); color:white; font-size:0.7rem; padding:2px 6px; rounded:10px;">2</span>
</button>
</div>
</div>
</header>
<!-- Main Content Injection Point -->
<main id="app-root"></main>
<!-- Modal Template -->
<div class="modal" id="auth-modal">
<div class="modal-content">
<div class="flex justify-between items-center mb-4">
<h2>Welcome Back</h2>
<button onclick="app.closeModal()" style="background:none; border:none; cursor:pointer;"><i class="fa-solid fa-xmark"></i></button>
</div>
<form onsubmit="app.handleLogin(event)">
<div class="flex-col gap-2">
<input type="email" placeholder="Email" class="p-4 rounded" style="background:var(--bg-body); border:1px solid var(--border); color:var(--text-main);">
<input type="password" placeholder="Password" class="p-4 rounded" style="background:var(--bg-body); border:1px solid var(--border); color:var(--text-main);">
<button type="submit" class="btn btn-primary mt-4">Sign In</button>
</div>
</form>
</div>
</div>
<script>
// --- MOCK DATA ---
const PRODUCTS = [
{ id: 1, name: "Quantum Wireless Headphones", price: 129.99, img: "https://images.unsplash.com/photo-1505740420928-5b52d58b4468?w=500", vendor: "TechNova", rating: 4.8 },
{ id: 2, name: "Ergonomic Mechanical Keyboard", price: 89.50, img: "https://images.unsplash.com/photo-1587829741301-dc798b91a45e?w=500", vendor: "KeyMasters", rating: 4.6 },
{ id: 3, name: "Smart Fitness Watch Pro", price: 199.00, img: "https://images.unsplash.com/photo-1523275335681-00071a7dc1c1?w=500", vendor: "FitLife", rating: 4.9 },
{ id: 4, name: "Minimalist Leather Backpack", price: 145.00, img: "https://images.unsplash.com/photo-1553062407-98eeb64c6a62?w=500", vendor: "UrbanStyle", rating: 4.5 },
{ id: 5, name: "4K Ultra Monitor", price: 350.00, img: "https://images.unsplash.com/photo-1527443224154-c4a3942d3acf?w=500", vendor: "TechNova", rating: 4.7 },
{ id: 6, name: "Ceramic Coffee Mug Set", price: 24.99, img: "https://images.unsplash.com/photo-1514228742587-6b1558fcca3d?w=500", vendor: "HomeEssentials", rating: 4.3 },
];
const PLANS = [
{ name: "Free", price: 0, features: ["10 Products", "Basic Analytics", "Standard Support"] },
{ name: "Basic", price: 19, features: ["50 Products", "Advanced Analytics", "Email Support", "Custom Domain"] },
{ name: "Professional", price: 49, features: ["500 Products", "AI Tools", "Priority Support", "Lower Fees"], featured: true },
{ name: "Enterprise", price: 99, features: ["Unlimited Products", "API Access", "24/7 Support", "Dedicated Manager"] }
];
// --- APP LOGIC ---
const app = {
state: {
theme: 'light',
lang: 'en',
currentView: 'home'
},
init() {
this.navigate('home');
// Check system theme
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
this.toggleTheme();
}
},
// Navigation Logic
navigate(view) {
this.state.currentView = view;
const root = document.getElementById('app-root');
root.innerHTML = ''; // Clear content
// Scroll to top
window.scrollTo(0, 0);
if(view === 'home') this.renderHome(root);
if(view === 'store') this.renderStore(root);
if(view === 'plans') this.renderPlans(root);
if(view === 'dashboard') this.renderDashboard(root);
},
// --- RENDERERS ---
renderHome(container) {
// Hero
const hero = `
<div class="hero">
<div class="container hero-content">
<h1>The Future of Digital Commerce</h1>
<p>Rent a storefront, sell globally, and scale your business with Voltix Marketplace.</p>
<div class="flex gap-4">
<button class="btn btn-outline" style="background:white; color:var(--primary)" onclick="app.navigate('plans')">Start Selling</button>
<button class="btn btn-outline" style="border:white; color:white">Browse Stores</button>
</div>
</div>
</div>
`;
// Featured Products
let productsHtml = PRODUCTS.map(p => this.createProductCard(p)).join('');
const section = `
<div class="container">
<div class="flex justify-between items-center mb-4">
<h2 class="text-2xl font-bold">Trending Products</h2>
<button class="btn btn-outline">View All</button>
</div>
<div class="grid product-grid">
${productsHtml}
</div>
</div>
<div class="container mt-4">
<h2 class="text-2xl font-bold mb-4">Top Categories</h2>
<div class="flex gap-4" style="overflow-x:auto; padding-bottom:1rem;">
<div class="card p-4" style="min-width:150px; text-align:center;">Electronics</div>
<div class="card p-4" style="min-width:150px; text-align:center;">Fashion</div>
<div class="card p-4" style="min-width:150px; text-align:center;">Home</div>
<div class="card p-4" style="min-width:150px; text-align:center;">Digital</div>
<div class="card p-4" style="min-width:150px; text-align:center;">Services</div>
</div>
</div>
`;
container.innerHTML = hero + section;
},
renderStore(container) {
const storeHtml = `
<div class="container mt-4">
<div class="store-header shadow">
<img src="https://images.unsplash.com/photo-1560179707-f14e90ef3dab?w=200" class="store-logo rounded">
<div class="flex-col">
<h2 style="font-size:2rem; font-weight:700;">TechNova Electronics</h2>
<p class="text-muted">Premium gadgets for the modern lifestyle. Verified Seller since 2023.</p>
<div class="store-stats">
<div class="stat-item"><span>4.9</span> Rating</div>
<div class="stat-item"><span>1.2k</span> Sales</div>
<div class="stat-item"><span>24h</span> Response Time</div>
</div>
<div class="flex gap-2 mt-2">
<button class="btn btn-primary"><i class="fa-solid fa-heart"></i> Follow</button>
<button class="btn btn-outline"><i class="fa-solid fa-message"></i> Contact</button>
</div>
</div>
</div>
<h3 class="mb-4">Shop Products</h3>
<div class="grid product-grid">
${PRODUCTS.filter(p => p.vendor === 'TechNova').map(p => this.createProductCard(p)).join('')}
${PRODUCTS.filter(p => p.vendor === 'TechNova').map(p => this.createProductCard(p)).join('')}
</div>
</div>
`;
container.innerHTML = storeHtml;
},
renderPlans(container) {
const plansHtml = PLANS.map(plan => `
<div class="plan-card ${plan.featured ? 'featured' : ''}">
${plan.featured ? '<span class="badge">Most Popular</span>' : ''}
<h3>${plan.name}</h3>
<div class="plan-price">$${plan.price}<span style="font-size:1rem; color:var(--text-muted)">/mo</span></div>
<ul class="plan-features">
${plan.features.map(f => `<li><i class="fa-solid fa-check text-primary"></i> ${f}</li>`).join('')}
</ul>
<button class="btn btn-primary mt-4 w-100" style="width:100%">Select Plan</button>
</div>
`).join('');
container.innerHTML = `
<div class="container mt-4">
<div class="text-center mb-4">
<h1 style="font-size:2.5rem; margin-bottom:0.5rem;">Choose Your Plan</h1>
<p class="text-muted">Scale your store with features tailored to your growth.</p>
</div>
<div class="grid plan-grid">
${plansHtml}
</div>
</div>
`;
},
renderDashboard(container) {
const dashHtml = `
<div class="dashboard-layout">
<div class="sidebar">
<ul>
<li class="active"><i class="fa-solid fa-chart-line"></i> Overview</li>
<li><i class="fa-solid fa-box"></i> Products</li>
<li><i class="fa-solid fa-users"></i> Customers</li>
<li><i class="fa-solid fa-file-invoice-dollar"></i> Orders</li>
<li><i class="fa-solid fa-store"></i> Store Settings</li>
<li><i class="fa-solid fa-credit-card"></i> Subscription</li>
</ul>
</div>
<div class="dash-content">
<h2 class="mb-4">Seller Dashboard</h2>
<div class="stat-grid">
<div class="stat-box">
<h3>$4,250</h3>
<p>Total Revenue</p>
</div>
<div class="stat-box">
<h3>128</h3>
<p>Orders</p>
</div>
<div class="stat-box">
<h3>45</h3>
<p>Products</p>
</div>
<div class="stat-box">
<h3>98%</h3>
<p>Rating</p>
</div>
</div>
<h3 class="mb-4">Recent Orders</h3>
<div style="overflow-x:auto;">
<table style="width:100%; text-align:left; border-collapse:collapse;">
<thead>
<tr style="background:var(--bg-body); border-bottom:1px solid var(--border);">
<th class="p-4">Order ID</th>
<th class="p-4">Product</th>
<th class="p-4">Status</th>
<th class="p-4">Amount</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid var(--border);">
<td class="p-4">#ORD-992</td>
<td class="p-4">Quantum Headphones</td>
<td class="p-4"><span style="background:#e0f2fe; padding:2px 8px; rounded:4px; font-size:0.8rem;">Processing</span></td>
<td class="p-4">$129.99</td>
</tr>
<tr style="border-bottom:1px solid var(--border);">
<td class="p-4">#ORD-991</td>
<td class="p-4">Mechanical Keyboard</td>
<td class="p-4"><span style="background:#dcfce7; padding:2px 8px; rounded:4px; font-size:0.8rem;">Completed</span></td>
<td class="p-4">$89.50</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
`;
container.innerHTML = dashHtml;
},
// --- UTILS ---
createProductCard(product) {
return `
<div class="card">
<div class="card-img">
<span class="badge">Best Seller</span>
<img src="${product.img}" alt="${product.name}">
</div>
<div class="card-body">
<div class="card-meta flex justify-between">
<span>${product.vendor}</span>
<span><i class="fa-solid fa-star text-primary"></i> ${product.rating}</span>
</div>
<h3 class="card-title">${product.name}</h3>
<div class="flex justify-between items-center mt-2">
<span class="card-price">$${product.price}</span>
<button class="btn btn-outline" style="padding:0.4rem 0.8rem; font-size:0.8rem;" onclick="app.addToCart('${product.name}')">
<i class="fa-solid fa-cart-plus"></i> Add
</button>
</div>
</div>
</div>
`;
},
toggleTheme() {
this.state.theme = this.state.theme === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', this.state.theme);
},
toggleLang() {
this.state.lang = this.state.lang === 'en' ? 'ar' : 'en';
document.body.classList.toggle('rtl');
document.getElementById('lang-text').innerText = this.state.lang === 'en' ? 'EN' : 'AR';
// Re-render current view to simulate language change (in real app, would translate strings)
this.navigate(this.state.currentView);
},
openModal(type) {
document.getElementById('auth-modal').classList.add('open');
},
closeModal() {
document.getElementById('auth-modal').classList.remove('open');
},
handleLogin(e) {
e.preventDefault();
this.closeModal();
alert("Simulated Login Successful! Redirecting to Dashboard...");
this.navigate('dashboard');
},
addToCart(item) {
alert(`${item} added to cart!`);
}
};
// Initialize App
document.addEventListener('DOMContentLoaded', () => {
app.init();
});
</script>
</body>
</html>