Merge version_1 into main #12

Merged
bender merged 4 commits from version_1 into main 2026-03-12 13:38:33 +00:00
4 changed files with 52 additions and 131 deletions

View File

@@ -8,7 +8,7 @@ import Link from "next/link";
import { useState } from "react";
import type { LucideIcon } from "lucide-react";
const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
const TikTok = (props: React.SVGProps<SVGSVGElement>) => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
@@ -19,7 +19,7 @@ const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
>
<path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.68v13.67a2.4 2.4 0 1 1-2.4-2.4c.34 0 .67.03 1 .09V9.41a7.12 7.12 0 0 0-1-.08C5.89 9.33 2 13.46 2 18.13s3.88 8.81 8.74 8.81c4.65 0 8.6-3.36 8.6-7.53 0-.13 0-.26 0-.39a5.5 5.5 0 0 0-.56-1.78h.09c4.87 0 8.82-3.37 8.82-7.53 0-4.16-3.96-7.53-8.82-7.53z"/>
</svg>
) as LucideIcon;
) as unknown as LucideIcon;
export default function CartPage() {
const navItems = [

View File

@@ -13,7 +13,7 @@ import Link from "next/link";
import { Sparkles, TrendingUp, Instagram, Twitter, Youtube } from "lucide-react";
import type { LucideIcon } from "lucide-react";
const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
const TikTok = (props: React.SVGProps<SVGSVGElement>) => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
@@ -24,7 +24,7 @@ const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
>
<path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.68v13.67a2.4 2.4 0 1 1-2.4-2.4c.34 0 .67.03 1 .09V9.41a7.12 7.12 0 0 0-1-.08C5.89 9.33 2 13.46 2 18.13s3.88 8.81 8.74 8.81c4.65 0 8.6-3.36 8.6-7.53 0-.13 0-.26 0-.39a5.5 5.5 0 0 0-.56-1.78h.09c4.87 0 8.82-3.37 8.82-7.53 0-4.16-3.96-7.53-8.82-7.53z"/>
</svg>
) as LucideIcon;
) as unknown as LucideIcon;
export default function HomePage() {
const navItems = [

View File

@@ -3,12 +3,11 @@
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered";
import FooterCard from "@/components/sections/footer/FooterCard";
import { Instagram, Twitter, Youtube, Heart, ShoppingCart } from "lucide-react";
import { Instagram, Twitter, Youtube } from "lucide-react";
import Link from "next/link";
import { useState } from "react";
import type { LucideIcon } from "lucide-react";
const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
const TikTok = (props: React.SVGProps<SVGSVGElement>) => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
@@ -19,9 +18,29 @@ const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
>
<path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.68v13.67a2.4 2.4 0 1 1-2.4-2.4c.34 0 .67.03 1 .09V9.41a7.12 7.12 0 0 0-1-.08C5.89 9.33 2 13.46 2 18.13s3.88 8.81 8.74 8.81c4.65 0 8.6-3.36 8.6-7.53 0-.13 0-.26 0-.39a5.5 5.5 0 0 0-.56-1.78h.09c4.87 0 8.82-3.37 8.82-7.53 0-4.16-3.96-7.53-8.82-7.53z"/>
</svg>
) as LucideIcon;
) as unknown as LucideIcon;
const productDetails: { [key: string]: { name: string; price: number; image: string; description: string; sizes: string[]; colors: string[] } } = {
"1": {
name: "Classic Black Hoodie", price: 89.99,
image: "http://img.b2bpic.net/free-photo/medium-shot-man-posing-with-hoodie-indoors_23-2149359859.jpg", description: "Premium oversized hoodie crafted from 100% organic cotton. Perfect for layering or wearing solo. Features a kangaroo pocket and adjustable drawstrings. Comfortable, durable, and timeless.", sizes: ["XS", "S", "M", "L", "XL", "XXL"],
colors: ["Black", "Charcoal", "Navy", "White"],
},
"2": {
name: "Vintage Denim Jacket", price: 129.99,
image: "http://img.b2bpic.net/free-photo/fashionable-woman-wearing-denim-jacket_23-2148859621.jpg", description: "Authentic vintage-inspired denim jacket with a modern fit. Featuring button closure, multiple pockets, and classic denim construction. A versatile staple for any wardrobe.", sizes: ["XS", "S", "M", "L", "XL"],
colors: ["Indigo", "Light Blue", "Black"],
},
"3": {
name: "Cargo Pants - Khaki", price: 79.99,
image: "http://img.b2bpic.net/free-photo/young-woman-wearing-trucker-hat_23-2149432334.jpg", description: "Comfortable cargo pants with multiple pockets and adjustable straps. Perfect for everyday wear with a practical, streetwear aesthetic. Premium cotton blend fabric.", sizes: ["XS", "S", "M", "L", "XL", "XXL"],
colors: ["Khaki", "Black", "Olive"],
},
};
export default function ProductPage({ params }: { params: { id: string } }) {
const product = productDetails[params.id as keyof typeof productDetails] || productDetails["1"];
export default function ProductPage() {
const navItems = [
{ name: "Shop", id: "products" },
{ name: "Collections", id: "collections" },
@@ -30,11 +49,6 @@ export default function ProductPage() {
{ name: "Contact", id: "contact" },
];
const [selectedSize, setSelectedSize] = useState("M");
const [selectedColor, setSelectedColor] = useState("Black");
const [quantity, setQuantity] = useState(1);
const [isFavorited, setIsFavorited] = useState(false);
const socialLinks: Array<{ icon: LucideIcon; href: string; ariaLabel: string }> = [
{ icon: Instagram, href: "https://instagram.com/umbra", ariaLabel: "Instagram" },
{ icon: Twitter, href: "https://twitter.com/umbra", ariaLabel: "Twitter" },
@@ -71,39 +85,23 @@ export default function ProductPage() {
</Link>
<div className="grid grid-cols-1 md:grid-cols-2 gap-12">
{/* Product Image */}
<div className="flex items-center justify-center bg-card/50 border border-accent/20 rounded-soft h-96 md:h-auto">
<img
src="http://img.b2bpic.net/free-photo/medium-shot-man-posing-with-hoodie-indoors_23-2149359859.jpg"
alt="Classic Black Hoodie"
className="w-full h-full object-cover rounded-soft"
/>
<div className="bg-card/30 rounded-soft overflow-hidden h-96 md:h-full">
<img src={product.image} alt={product.name} className="w-full h-full object-cover" />
</div>
{/* Product Details */}
<div>
<div className="mb-6">
<p className="text-accent text-sm font-semibold mb-2">Premium Collection</p>
<h1 className="text-4xl font-semibold text-foreground mb-3">Classic Black Hoodie</h1>
<p className="text-2xl font-bold text-background-accent mb-4">$89.99</p>
<p className="text-foreground/70 leading-relaxed">
Experience the perfect blend of comfort and style with our Classic Black Hoodie. Crafted from premium materials, this versatile piece is ideal for layering or wearing alone. The spacious fit and quality construction make it a wardrobe essential for any streetwear enthusiast.
</p>
</div>
<div className="flex flex-col justify-center">
<h1 className="text-4xl font-bold text-foreground mb-4">{product.name}</h1>
<p className="text-2xl font-semibold text-background-accent mb-6">${product.price.toFixed(2)}</p>
{/* Color Selection */}
<div className="mb-6">
<label className="block text-foreground font-semibold mb-3">Color</label>
<p className="text-foreground/80 text-lg mb-8 leading-relaxed">{product.description}</p>
<div className="mb-8">
<h3 className="text-lg font-semibold text-foreground mb-4">Colors</h3>
<div className="flex gap-3">
{["Black", "Grey", "Navy"].map((color) => (
{product.colors.map((color) => (
<button
key={color}
onClick={() => setSelectedColor(color)}
className={`px-4 py-2 rounded-soft border-2 transition-all ${
selectedColor === color
? "border-background-accent bg-background-accent/10"
: "border-accent/30 hover:border-accent/50"
}`}
className="px-4 py-2 border border-accent/30 rounded-soft text-foreground hover:border-background-accent transition-colors"
>
{color}
</button>
@@ -111,19 +109,13 @@ export default function ProductPage() {
</div>
</div>
{/* Size Selection */}
<div className="mb-6">
<label className="block text-foreground font-semibold mb-3">Size</label>
<div className="flex gap-3">
{["XS", "S", "M", "L", "XL", "XXL"].map((size) => (
<div className="mb-8">
<h3 className="text-lg font-semibold text-foreground mb-4">Sizes</h3>
<div className="flex flex-wrap gap-3">
{product.sizes.map((size) => (
<button
key={size}
onClick={() => setSelectedSize(size)}
className={`w-10 h-10 rounded-soft border-2 transition-all flex items-center justify-center ${
selectedSize === size
? "border-background-accent bg-background-accent/10"
: "border-accent/30 hover:border-accent/50"
}`}
className="px-4 py-2 border border-accent/30 rounded-soft text-foreground hover:border-background-accent transition-colors"
>
{size}
</button>
@@ -131,84 +123,13 @@ export default function ProductPage() {
</div>
</div>
{/* Quantity */}
<div className="mb-8">
<label className="block text-foreground font-semibold mb-3">Quantity</label>
<div className="flex items-center gap-4 w-fit">
<button
onClick={() => setQuantity(Math.max(1, quantity - 1))}
className="w-10 h-10 rounded-soft border border-accent/30 flex items-center justify-center hover:bg-accent/10"
>
</button>
<span className="text-lg font-semibold text-foreground w-8 text-center">{quantity}</span>
<button
onClick={() => setQuantity(quantity + 1)}
className="w-10 h-10 rounded-soft border border-accent/30 flex items-center justify-center hover:bg-accent/10"
>
+
</button>
</div>
</div>
<button className="px-8 py-4 bg-background-accent text-primary-cta-text font-semibold rounded-soft hover:bg-primary-cta transition-colors w-full mb-4">
Add to Cart
</button>
{/* Action Buttons */}
<div className="flex gap-4 mb-8">
<button className="flex-1 px-6 py-3 bg-background-accent text-primary-cta-text font-semibold rounded-soft hover:bg-primary-cta transition-colors flex items-center justify-center gap-2">
<ShoppingCart size={20} />
Add to Cart
</button>
<button
onClick={() => setIsFavorited(!isFavorited)}
className="px-6 py-3 border border-accent/50 text-foreground font-semibold rounded-soft hover:bg-accent/10 transition-colors flex items-center justify-center gap-2"
>
<Heart size={20} fill={isFavorited ? "currentColor" : "none"} />
</button>
</div>
{/* Product Info */}
<div className="bg-card/50 border border-accent/20 rounded-soft p-6 space-y-4">
<div>
<p className="text-accent font-semibold text-sm">Material</p>
<p className="text-foreground">100% Premium Cotton</p>
</div>
<div>
<p className="text-accent font-semibold text-sm">Shipping</p>
<p className="text-foreground">Free shipping on orders over $150</p>
</div>
<div>
<p className="text-accent font-semibold text-sm">Returns</p>
<p className="text-foreground">30-day return policy</p>
</div>
</div>
</div>
</div>
{/* Related Products */}
<div className="mt-20">
<h2 className="text-3xl font-semibold text-foreground mb-8">Related Products</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{[
{
name: "Vintage Denim Jacket", price: "$129.99", image: "http://img.b2bpic.net/free-photo/fashionable-woman-wearing-denim-jacket_23-2148859621.jpg"},
{
name: "Cargo Pants - Khaki", price: "$79.99", image: "http://img.b2bpic.net/free-photo/young-woman-wearing-trucker-hat_23-2149432334.jpg"},
{
name: "Oversized T-Shirt", price: "$49.99", image: "http://img.b2bpic.net/free-photo/teenager-boy-stylish-clothes-posing_23-2149085228.jpg"},
].map((product, i) => (
<Link key={i} href="#" className="group">
<div className="bg-card/50 border border-accent/20 rounded-soft overflow-hidden mb-4 h-60">
<img
src={product.image}
alt={product.name}
className="w-full h-full object-cover group-hover:scale-105 transition-transform"
/>
</div>
<h3 className="text-foreground font-semibold mb-2 group-hover:text-background-accent transition-colors">
{product.name}
</h3>
<p className="text-background-accent font-semibold">{product.price}</p>
</Link>
))}
<button className="px-8 py-4 border border-accent/50 text-foreground font-semibold rounded-soft hover:bg-accent/10 transition-colors w-full">
Save for Later
</button>
</div>
</div>
</div>

View File

@@ -10,7 +10,7 @@ import Link from "next/link";
import { TrendingUp, Instagram, Twitter, Youtube } from "lucide-react";
import type { LucideIcon } from "lucide-react";
const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
const TikTok = (props: React.SVGProps<SVGSVGElement>) => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
@@ -21,7 +21,7 @@ const TikTok: LucideIcon = (props: React.SVGProps<SVGSVGElement>) => (
>
<path d="M19.59 6.69a4.83 4.83 0 0 1-3.77-4.25V2h-3.68v13.67a2.4 2.4 0 1 1-2.4-2.4c.34 0 .67.03 1 .09V9.41a7.12 7.12 0 0 0-1-.08C5.89 9.33 2 13.46 2 18.13s3.88 8.81 8.74 8.81c4.65 0 8.6-3.36 8.6-7.53 0-.13 0-.26 0-.39a5.5 5.5 0 0 0-.56-1.78h.09c4.87 0 8.82-3.37 8.82-7.53 0-4.16-3.96-7.53-8.82-7.53z"/>
</svg>
) as LucideIcon;
) as unknown as LucideIcon;
export default function ShopPage() {
const navItems = [