aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/app
diff options
context:
space:
mode:
authorLibravatarLibravatar Biswa Kalyan Bhuyan <[email protected]> 2025-05-28 19:44:26 +0530
committerLibravatarLibravatar Biswa Kalyan Bhuyan <[email protected]> 2025-05-28 19:44:26 +0530
commit5e3b37288d96277a6eacb7d6464760b63f72874a (patch)
treea511f27f5bc9bc69e6ce30dbea16d7994494c837 /frontend/src/app
parent7b85f1e2c3717ddd9eee0e668e3b4d48139e2407 (diff)
downloadblcklst-5e3b37288d96277a6eacb7d6464760b63f72874a.tar.gz
blcklst-5e3b37288d96277a6eacb7d6464760b63f72874a.tar.bz2
blcklst-5e3b37288d96277a6eacb7d6464760b63f72874a.zip
feat: improved UI and added dynamic theme toggle
- improved the nav bar components - added the theme toggle button to toggle theme - fixed the button background for the nav bar - fixed the theme color issue to the ThemeToggle funtion - added more vibrant colors - fixed the theme logo render
Diffstat (limited to 'frontend/src/app')
-rw-r--r--frontend/src/app/globals.css390
-rw-r--r--frontend/src/app/layout.tsx29
-rw-r--r--frontend/src/app/page.tsx20
3 files changed, 424 insertions, 15 deletions
diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css
index 92fb855..89de65b 100644
--- a/frontend/src/app/globals.css
+++ b/frontend/src/app/globals.css
@@ -120,3 +120,393 @@
@apply bg-background text-foreground;
}
}
+
+/* Complete override for ghost variant default styles */
+/* This targets the specific ghost variant classes from the button component */
+.nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ border: none !important;
+ border-color: transparent !important;
+ box-shadow: none !important;
+ --tw-bg-opacity: 0 !important;
+ --accent: transparent !important;
+ --background: transparent !important;
+ --tw-border-opacity: 0 !important;
+ --tw-shadow: none !important;
+ --tw-ring-shadow: none !important;
+ --tw-ring-offset-shadow: none !important;
+ cursor: pointer !important;
+}
+
+/* Force override ghost variant styles completely */
+button[class*="nav-button-transparent"],
+[data-slot="button"][class*="nav-button-transparent"],
+[data-slot="navigation-menu-trigger"][class*="nav-button-transparent"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+}
+
+/* Override ghost variant hover specifically */
+button[class*="nav-button-transparent"][class*="hover:bg-accent"],
+[data-slot="button"][class*="nav-button-transparent"][class*="hover:bg-accent"],
+[data-slot="navigation-menu-trigger"][class*="nav-button-transparent"][class*="hover:bg-accent"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Dark mode ghost variant overrides */
+.dark button[class*="nav-button-transparent"][class*="dark:hover:bg-accent"],
+.dark [data-slot="button"][class*="nav-button-transparent"][class*="dark:hover:bg-accent"],
+.dark [data-slot="navigation-menu-trigger"][class*="nav-button-transparent"][class*="dark:hover:bg-accent"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Remove focus rings and outlines for nav buttons */
+.nav-button-transparent:focus,
+.nav-button-transparent:focus-visible {
+ outline: none !important;
+ ring: none !important;
+ --tw-ring-shadow: none !important;
+ border: none !important;
+ background: transparent !important;
+ background-color: transparent !important;
+}
+
+/* Light mode subtle hover effects - only show on hover */
+.nav-button-transparent:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ --tw-bg-opacity: 1 !important;
+ border: none !important;
+ transition: background-color 0.2s ease-in-out !important;
+}
+
+/* Dark mode even more subtle hover effects */
+.dark .nav-button-transparent:hover {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+ transition: background-color 0.2s ease-in-out !important;
+}
+
+/* Override NavigationMenuTrigger specific classes with maximum specificity */
+.nav-button-transparent.bg-background {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Focus states - only subtle background, no borders or rings */
+.nav-button-transparent:focus:not(:hover) {
+ background: rgba(0, 0, 0, 0.04) !important;
+ background-color: rgba(0, 0, 0, 0.04) !important;
+ border: none !important;
+ box-shadow: none !important;
+}
+
+.dark .nav-button-transparent:focus:not(:hover) {
+ background: rgba(255, 255, 255, 0.03) !important;
+ background-color: rgba(255, 255, 255, 0.03) !important;
+ border: none !important;
+ box-shadow: none !important;
+}
+
+/* Override open states */
+.nav-button-transparent[data-state="open"] {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+}
+
+.dark .nav-button-transparent[data-state="open"] {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+ border: none !important;
+}
+
+/* Ensure all shadcn/ui utility classes are overridden with high specificity */
+button.nav-button-transparent,
+[data-slot="button"].nav-button-transparent,
+[data-slot="navigation-menu-trigger"].nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ border-color: transparent !important;
+ box-shadow: none !important;
+ cursor: pointer !important;
+}
+
+/* Hover states for all button types */
+button.nav-button-transparent:hover,
+[data-slot="button"].nav-button-transparent:hover,
+[data-slot="navigation-menu-trigger"].nav-button-transparent:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+ transition: background-color 0.2s ease-in-out !important;
+ cursor: pointer !important;
+}
+
+/* Focus states for all button types */
+button.nav-button-transparent:focus,
+[data-slot="button"].nav-button-transparent:focus,
+[data-slot="navigation-menu-trigger"].nav-button-transparent:focus {
+ background: rgba(0, 0, 0, 0.04) !important;
+ background-color: rgba(0, 0, 0, 0.04) !important;
+ border: none !important;
+ box-shadow: none !important;
+ outline: none !important;
+ cursor: pointer !important;
+}
+
+/* Dark mode hover and focus states */
+.dark button.nav-button-transparent:hover,
+.dark [data-slot="button"].nav-button-transparent:hover,
+.dark [data-slot="navigation-menu-trigger"].nav-button-transparent:hover {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+ border: none !important;
+ transition: background-color 0.2s ease-in-out !important;
+ cursor: pointer !important;
+}
+
+.dark button.nav-button-transparent:focus,
+.dark [data-slot="button"].nav-button-transparent:focus,
+.dark [data-slot="navigation-menu-trigger"].nav-button-transparent:focus {
+ background: rgba(255, 255, 255, 0.03) !important;
+ background-color: rgba(255, 255, 255, 0.03) !important;
+ border: none !important;
+ box-shadow: none !important;
+ outline: none !important;
+ cursor: pointer !important;
+}
+
+/* Dropdown and navigation item transparency */
+.nav-dropdown-transparent {
+ background: rgba(255, 255, 255, 0.98) !important;
+ backdrop-filter: blur(16px) saturate(180%) !important;
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1) !important;
+}
+
+.dark .nav-dropdown-transparent {
+ background: rgba(23, 23, 23, 0.98) !important;
+ border: 1px solid rgba(82, 82, 82, 0.4) !important;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;
+}
+
+.nav-dropdown-item {
+ background: transparent !important;
+ border: none !important;
+ transition: background-color 0.2s ease-in-out !important;
+}
+
+.nav-dropdown-item:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+}
+
+.dark .nav-dropdown-item:hover {
+ background: rgba(255, 255, 255, 0.08) !important;
+ border: none !important;
+}
+
+/* Additional overrides for complete transparency */
+/* Handle any remaining shadcn/ui styling conflicts */
+.nav-button-transparent[data-variant="ghost"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ cursor: pointer !important;
+}
+
+.nav-button-transparent[data-variant="ghost"]:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+ cursor: pointer !important;
+}
+
+.dark .nav-button-transparent[data-variant="ghost"]:hover {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+ border: none !important;
+ cursor: pointer !important;
+}
+
+/* Override any remaining background utilities */
+.nav-button-transparent.bg-transparent,
+.nav-button-transparent.bg-accent,
+.nav-button-transparent.hover\:bg-accent,
+.nav-button-transparent.focus\:bg-accent {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ cursor: pointer !important;
+}
+
+/* Ensure link elements in navigation also have transparent styling */
+a.nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ text-decoration: none !important;
+ cursor: pointer !important;
+}
+
+a.nav-button-transparent:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+ text-decoration: none !important;
+ cursor: pointer !important;
+}
+
+.dark a.nav-button-transparent:hover {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+ border: none !important;
+ text-decoration: none !important;
+ cursor: pointer !important;
+}
+
+/* Ultra-specific overrides to ensure transparency takes precedence */
+/* Handle all possible combinations of button classes */
+button.nav-button-transparent.hover\:bg-accent,
+button.nav-button-transparent.dark\:hover\:bg-accent\/50,
+button.nav-button-transparent[class*="hover:bg"],
+[data-slot="button"].nav-button-transparent.hover\:bg-accent,
+[data-slot="button"].nav-button-transparent.dark\:hover\:bg-accent\/50,
+[data-slot="button"].nav-button-transparent[class*="hover:bg"],
+[data-slot="navigation-menu-trigger"].nav-button-transparent.hover\:bg-accent,
+[data-slot="navigation-menu-trigger"].nav-button-transparent.dark\:hover\:bg-accent\/50,
+[data-slot="navigation-menu-trigger"].nav-button-transparent[class*="hover:bg"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Override any CSS custom properties that might affect background */
+.nav-button-transparent {
+ --tw-bg-accent: transparent !important;
+ --tw-bg-background: transparent !important;
+ --tw-bg-muted: transparent !important;
+ --tw-bg-secondary: transparent !important;
+}
+
+/* Ensure no background on any state for nav buttons */
+.nav-button-transparent,
+.nav-button-transparent:not(:hover):not(:focus):not(:active) {
+ background: transparent !important;
+ background-color: transparent !important;
+ box-shadow: none !important;
+ border: none !important;
+}
+
+/* Maximum specificity overrides - nuclear option for transparency */
+html body header button.nav-button-transparent,
+html body header [data-slot="button"].nav-button-transparent,
+html body header [data-slot="navigation-menu-trigger"].nav-button-transparent,
+html body header div button.nav-button-transparent,
+html body header div [data-slot="button"].nav-button-transparent,
+html body header div [data-slot="navigation-menu-trigger"].nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ border: none !important;
+ border-color: transparent !important;
+ box-shadow: none !important;
+ backdrop-filter: none !important;
+}
+
+/* Override any inline styles or computed styles */
+.nav-button-transparent[style*="background"] {
+ background: transparent !important;
+ background-color: transparent !important;
+}
+
+/* Target specific button classes that might have background */
+.nav-button-transparent.inline-flex,
+.nav-button-transparent[class*="inline-flex"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Enhanced link element transparency for Sale button and similar nav links */
+/* Apply maximum specificity for link elements in navigation */
+html body header a.nav-button-transparent,
+html body header div a.nav-button-transparent,
+html body header nav a.nav-button-transparent,
+[data-slot="navigation-menu-link"].nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ border: none !important;
+ border-color: transparent !important;
+ box-shadow: none !important;
+ backdrop-filter: none !important;
+ cursor: pointer !important;
+}
+
+/* Override any NavigationMenuLink default styles */
+a.nav-button-transparent[data-slot="navigation-menu-link"],
+[data-slot="navigation-menu-link"].nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+}
+
+/* Ensure link hover states maintain transparency in default state */
+a.nav-button-transparent:not(:hover):not(:focus):not(:active) {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Specific overrides for NavigationMenuLink component (Sale button) */
+[data-slot="navigation-menu-link"].nav-button-transparent {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+ box-shadow: none !important;
+ cursor: pointer !important;
+}
+
+/* Override NavigationMenuLink hover and focus states */
+[data-slot="navigation-menu-link"].nav-button-transparent.hover\:bg-accent,
+[data-slot="navigation-menu-link"].nav-button-transparent.focus\:bg-accent,
+[data-slot="navigation-menu-link"].nav-button-transparent[class*="hover:bg-accent"],
+[data-slot="navigation-menu-link"].nav-button-transparent[class*="focus:bg-accent"],
+[data-slot="navigation-menu-link"].nav-button-transparent[class*="data-[active=true]:bg-accent"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Override NavigationMenuLink data states */
+[data-slot="navigation-menu-link"].nav-button-transparent[data-active="true"] {
+ background: transparent !important;
+ background-color: transparent !important;
+ border: none !important;
+}
+
+/* Ensure NavigationMenuLink has proper hover effect */
+[data-slot="navigation-menu-link"].nav-button-transparent:hover {
+ background: rgba(0, 0, 0, 0.08) !important;
+ background-color: rgba(0, 0, 0, 0.08) !important;
+ border: none !important;
+ transition: background-color 0.2s ease-in-out !important;
+}
+
+.dark [data-slot="navigation-menu-link"].nav-button-transparent:hover {
+ background: rgba(255, 255, 255, 0.06) !important;
+ background-color: rgba(255, 255, 255, 0.06) !important;
+}
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx
index 50bb899..651acc8 100644
--- a/frontend/src/app/layout.tsx
+++ b/frontend/src/app/layout.tsx
@@ -1,9 +1,10 @@
import type { Metadata } from "next";
import "./globals.css";
import { Toaster } from "@/components/ui/sonner";
+import { ThemeProvider } from "@/components/theme-provider";
export const metadata: Metadata = {
- title: "blcklst - Modern Fashion Brand",
+ title: "blcklst - not everyone get blcklsted",
description: "not everyone gets blcklsted - discover carefully curated fashion pieces that define modern elegance.",
};
@@ -13,16 +14,36 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
- <html lang="en">
+ <html lang="en" suppressHydrationWarning>
<head>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"
rel="stylesheet"
/>
+ {/* Preload both logo variants for instant theme switching */}
+ <link
+ rel="preload"
+ href="/black-logo.png"
+ as="image"
+ type="image/png"
+ />
+ <link
+ rel="preload"
+ href="/white-logo.png"
+ as="image"
+ type="image/png"
+ />
</head>
<body className="font-sans antialiased">
- {children}
- <Toaster />
+ <ThemeProvider
+ attribute="class"
+ defaultTheme="system"
+ enableSystem
+ disableTransitionOnChange
+ >
+ {children}
+ <Toaster />
+ </ThemeProvider>
</body>
</html>
);
diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx
index 7a9bea6..7d6b7a2 100644
--- a/frontend/src/app/page.tsx
+++ b/frontend/src/app/page.tsx
@@ -93,10 +93,10 @@ export default function Home() {
<HeroSection />
{/* Featured Products Section */}
- <section className="py-16 bg-white">
+ <section className="py-16 bg-white dark:bg-neutral-950">
<div className="container mx-auto px-4">
<div className="text-center mb-12">
- <h2 className="text-3xl font-bold mb-4">Featured Products</h2>
+ <h2 className="text-3xl font-bold mb-4 text-foreground">Featured Products</h2>
<p className="text-muted-foreground max-w-2xl mx-auto">
Discover our handpicked selection of trending items that our customers love most.
</p>
@@ -117,7 +117,7 @@ export default function Home() {
</section>
{/* Categories Section */}
- <section className="py-16 bg-neutral-50">
+ <section className="py-16 bg-neutral-50 dark:bg-neutral-900">
<div className="container mx-auto px-4">
<div className="text-center mb-12">
<h2 className="text-3xl font-bold mb-4">Shop by Category</h2>
@@ -130,17 +130,15 @@ export default function Home() {
{[
{ name: "Women", image: "/api/placeholder/600/400", count: "2,345+ items" },
{ name: "Men", image: "/api/placeholder/600/400", count: "1,892+ items" },
- { name: "Kids", image: "/api/placeholder/600/400", count: "756+ items" },
+ { name: "Kids", image: "/api/placeholder/600/400", count: "956+ items" },
].map((category) => (
- <div
- key={category.name}
- className="relative group cursor-pointer overflow-hidden rounded-lg bg-gradient-to-br from-neutral-200 to-neutral-300 aspect-[4/3]"
- >
- <div className="absolute inset-0 bg-black/20 group-hover:bg-black/30 transition-colors" />
- <div className="absolute inset-0 flex flex-col justify-end p-6 text-white">
+ <div key={category.name} className="group relative overflow-hidden rounded-2xl bg-neutral-100 dark:bg-neutral-800 aspect-[4/3]">
+ <div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent" />
+ <div className="absolute bottom-6 left-6 text-white">
<h3 className="text-2xl font-bold mb-1">{category.name}</h3>
- <p className="text-sm opacity-90">{category.count}</p>
+ <p className="text-neutral-200">{category.count}</p>
</div>
+ <div className="absolute inset-0 bg-black/20 opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
</div>
))}
</div>