Skip to content

Commit c84f36e

Browse files
Feature: change theme mode (#42)
* Added theme Selector * Conflict bub.lock * Update changes
1 parent 43e21f3 commit c84f36e

File tree

11 files changed

+92
-65
lines changed

11 files changed

+92
-65
lines changed

apps/web/components/Appbar.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button } from "./ui/button";
55
import { Credits } from "./navbar/Credits";
66
import Link from "next/link";
77
import { motion } from "framer-motion";
8+
import { ThemeToggle } from "./ThemeToggle";
89

910
export function Appbar() {
1011
return (
@@ -19,7 +20,7 @@ export function Appbar() {
1920
initial={{ opacity: 0, scale: 0.95 }}
2021
animate={{ opacity: 1, scale: 1 }}
2122
transition={{ duration: 0.4, ease: "easeOut" }}
22-
className="mx-auto max-w-6xl px-4 sm:px-6 lg:px-8 backdrop-blur-xl rounded-2xl bg-background/50 border border-neutral-200 dark:border-neutral-700 shadow-lg"
23+
className="mx-auto max-w-6xl px-4 sm:px-6 lg:px-8 backdrop-blur-xl rounded-2xl bg-background/50 border border-neutral-300 dark:border-neutral-900 shadow-lg"
2324
>
2425
<div className="flex h-16 items-center justify-between">
2526
{/* Logo */}
@@ -47,7 +48,7 @@ export function Appbar() {
4748
</motion.div>
4849

4950
{/* Auth & Pricing */}
50-
<div className="flex items-center gap-4">
51+
<div className="flex items-center md:gap-4 gap-2">
5152
<SignedIn>
5253
<Button
5354
variant="ghost"
@@ -56,7 +57,7 @@ export function Appbar() {
5657
asChild
5758
>
5859
<Link href="/dashboard">Dashboard</Link>
59-
</Button>
60+
</Button>
6061
<Button
6162
variant="ghost"
6263
size="sm"
@@ -102,6 +103,7 @@ export function Appbar() {
102103
</Button>
103104
</motion.div>
104105
</SignedOut>
106+
<ThemeToggle />
105107
</div>
106108
</div>
107109
</motion.div>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"use client";
2+
3+
import { useTheme } from "next-themes";
4+
import { Switch } from "@/components/ui/switch";
5+
import { Sun, Moon } from "lucide-react";
6+
7+
export function ThemeToggle() {
8+
const { theme, setTheme } = useTheme();
9+
const isDark = theme === "dark";
10+
11+
return (
12+
<div className="flex items-center gap-2">
13+
<Sun className={`h-5 w-5 ${!isDark ? "text-pink-500" : ""}`} />
14+
<Switch
15+
checked={isDark}
16+
onCheckedChange={() => setTheme(isDark ? "light" : "dark")}
17+
/>
18+
<Moon className={`h-5 w-5 ${isDark ? "text-pink-500" : ""}`} />
19+
</div>
20+
);
21+
}

apps/web/components/home/Features.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,19 @@ export function Features() {
4242
<motion.div
4343
key={index}
4444
whileHover={{ y: -10 }}
45-
className="p-6 rounded-2xl bg-white/5 backdrop-blur-sm hover:bg-white/10 transition-all duration-300 border border-white/10 group"
45+
className="p-6 rounded-2xl bg-white/5 backdrop-blur-sm hover:bg-pink-50 dark:hover:bg-white/10 transition-all duration-300 border dark:border-white/10 border-pink-100 group"
4646
>
4747
<div
4848
className={`w-12 h-12 rounded-xl bg-gradient-to-r ${feature.gradient} p-0.5 mb-4 group-hover:scale-110 transition-transform duration-300`}
4949
>
50-
<div className="w-full h-full bg-gray-900 rounded-[10px] flex items-center justify-center">
50+
<div className="w-full h-full bg-neutral-900 rounded-[10px] flex items-center justify-center">
5151
{feature.icon}
5252
</div>
5353
</div>
54-
<h3 className="text-xl font-semibold mb-2 bg-gradient-to-r from-white to-gray-300 bg-clip-text text-transparent">
54+
<h3 className="text-xl font-semibold mb-2 dark:bg-gradient-to-r dark:from-white dark:to-neutral-300 bg-gradient-to-r from-neutral-900 to-neutral-700 bg-clip-text text-transparent">
5555
{feature.title}
56-
</h3>
57-
<p className="text-gray-400">{feature.description}</p>
56+
</h3>
57+
<p className="text-muted-foreground">{feature.description}</p>
5858
</motion.div>
5959
))}
6060
</motion.div>

apps/web/components/home/Hero.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { HowItWorks } from "./HowItWorks";
1717

1818
export function Hero() {
1919
return (
20-
<div className="bg-black" >
20+
<div className="dark:bg-black">
2121
<div className="relative min-h-screen bg-[radial-gradient(ellipse_at_top,_var(--tw-gradient-stops))] from-purple-900 via-gray-900 to-black text-white overflow-hidden">
2222
<BackgroundEffects />
2323

@@ -33,7 +33,7 @@ export function Hero() {
3333
{/* <TrustedBy /> */}
3434

3535
<section className="relative">
36-
<div className="absolute inset-0 bg-gradient-to-b from-transparent via-black/5 to-black/20 pointer-events-none" />
36+
<div className="absolute rounded-3xl inset-0 dark:bg-gradient-to-b from-transparent via-black/5 to-black/20 pointer-events-none" />
3737
<ImageCarousel />
3838
</section>
3939

@@ -42,12 +42,12 @@ export function Hero() {
4242
<StatsSection />
4343

4444
<section id="features" className="relative">
45-
<div className="absolute inset-0 bg-gradient-to-b from-black/20 to-transparent pointer-events-none" />
45+
<div className="absolute inset-0 dark:bg-gradient-to-b from-black/20 to-transparent pointer-events-none" />
4646
<Features />
4747
</section>
4848

4949
<section className="relative">
50-
<div className="absolute inset-0 bg-gradient-to-b from-transparent to-black/20 pointer-events-none" />
50+
<div className="absolute inset-0 dark:bg-gradient-to-b from-transparent to-black/20 pointer-events-none" />
5151
<Testimonials />
5252
</section>
5353

@@ -59,12 +59,12 @@ export function Hero() {
5959
transition={{ delay: 0.4, duration: 0.8 }}
6060
className="relative py-20"
6161
>
62-
<div className="absolute inset-0 bg-gradient-to-r from-purple-500/20 via-pink-500/20 to-red-500/20 blur-3xl" />
62+
<div className="absolute inset-0 bg-gradient-to-r from-purple-500/20 via-pink-500/20 to-red-500/20 blur-3xl dark:from-purple-500/20 dark:via-pink-500/20 dark:to-red-500/20" />
6363
<div className="relative text-center max-w-3xl mx-auto space-y-8">
64-
<h2 className="text-4xl md:text-5xl font-bold bg-gradient-to-r from-purple-400 via-pink-500 to-red-500 bg-clip-text text-transparent">
64+
<h2 className="text-4xl md:text-5xl font-bold bg-gradient-to-r from-purple-600 via-pink-600 to-red-600 dark:from-purple-400 dark:via-pink-500 dark:to-red-500 bg-clip-text text-transparent">
6565
Start Your AI Portrait Journey Today
6666
</h2>
67-
<p className="text-xl text-gray-300">
67+
<p className="text-muted-foreground text-xl">
6868
Join thousands of creators who have already transformed their
6969
photos with our AI technology.
7070
</p>
@@ -74,7 +74,7 @@ export function Hero() {
7474
<Button
7575
asChild
7676
size="lg"
77-
className="group bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700"
77+
className="group bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 text-white"
7878
>
7979
<SignInButton mode="modal">
8080
<span className="flex items-center">
@@ -86,7 +86,7 @@ export function Hero() {
8686
<Button
8787
variant="outline"
8888
size="lg"
89-
className="border-white/20 hover:bg-white/10"
89+
className="text-black dark:text-white"
9090
onClick={() =>
9191
document
9292
.getElementById("features")
@@ -100,17 +100,17 @@ export function Hero() {
100100

101101
<div className="pt-8 flex flex-wrap items-center justify-center gap-4 sm:gap-8">
102102
<div className="flex items-center gap-2 text-sm">
103-
<span className="flex items-center text-purple-300">
103+
<span className="flex items-center text-purple-600 dark:text-purple-300">
104104
<CheckCircle className="w-4 h-4 mr-1" />
105105
No credit card required
106106
</span>
107107
<span className="hidden sm:inline text-gray-500"></span>
108-
<span className="flex items-center text-pink-300">
108+
<span className="flex items-center text-pink-600 dark:text-pink-300">
109109
<Sparkles className="w-4 h-4 mr-1" />
110110
Free credits to start
111111
</span>
112112
<span className="hidden sm:inline text-gray-500"></span>
113-
<span className="flex items-center text-red-300">
113+
<span className="flex items-center text-red-600 dark:text-red-300">
114114
<Clock className="w-4 h-4 mr-1" />
115115
Cancel anytime
116116
</span>

apps/web/components/home/HeroHeader.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export function HeroHeader() {
2121
initial={{ opacity: 0, scale: 0.9 }}
2222
animate={{ opacity: 1, scale: 1 }}
2323
transition={{ delay: 0.2, duration: 0.5 }}
24-
className="px-4 py-2 rounded-full bg-purple-500/10 text-purple-300 text-sm font-medium flex items-center gap-2 border border-purple-500/20"
24+
className="px-4 py-2 rounded-full dark:bg-purple-500/10 dark:text-purple-300 text-sm font-medium flex items-center gap-2 border dark:border-purple-600/20 bg-purple-600/10 text-purple-500 border-purple-700/20"
2525
>
2626
<Sparkles className="w-4 h-4" />
2727
Next-Gen AI Portrait Generation
@@ -30,14 +30,14 @@ export function HeroHeader() {
3030
initial={{ opacity: 0, scale: 0.9 }}
3131
animate={{ opacity: 1, scale: 1 }}
3232
transition={{ delay: 0.4, duration: 0.5 }}
33-
className="px-4 py-2 rounded-full bg-pink-500/10 text-pink-300 text-sm font-medium flex items-center gap-2 border border-pink-500/20"
33+
className="px-4 py-2 rounded-full dark:bg-pink-500/10 dark:text-pink-300 text-sm font-medium flex items-center gap-2 border dark:border-pink-600/20 bg-pink-600/10 text-pink-500 border-pink-700/20"
3434
>
3535
<Zap className="w-4 h-4" />
3636
Powered by 100xDevs
3737
</motion.span>
3838
</div>
3939

40-
<h1 className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold tracking-tight max-w-4xl mx-auto leading-tight">
40+
<h1 className="text-4xl sm:text-5xl md:text-6xl text-primary lg:text-7xl font-bold tracking-tight max-w-4xl mx-auto leading-tight">
4141
Transform Your Photos with{" "}
4242
<span className="bg-gradient-to-r from-purple-400 via-pink-500 to-red-500 bg-clip-text text-transparent">
4343
AI Magic

apps/web/components/home/HowItWorks.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ export function HowItWorks() {
3737
className="space-y-12"
3838
>
3939
<div className="text-center space-y-4">
40-
<h2 className="text-3xl md:text-4xl font-bold">
40+
<h2 className="text-3xl md:text-4xl font-bold text-primary">
4141
How It{" "}
4242
<span className="bg-gradient-to-r from-purple-400 to-pink-500 bg-clip-text text-transparent">
4343
Works
4444
</span>
4545
</h2>
46-
<p className="text-gray-400 max-w-2xl mx-auto">
46+
<p className="text-muted-foreground max-w-2xl mx-auto">
4747
Transform your photos into stunning AI-powered portraits in three
4848
simple steps
4949
</p>
@@ -59,12 +59,14 @@ export function HowItWorks() {
5959
className="relative group"
6060
>
6161
<div className="absolute -inset-4 bg-gradient-to-r from-purple-600/20 to-pink-600/20 rounded-xl opacity-0 group-hover:opacity-100 transition duration-500 blur-xl" />
62-
<div className="relative space-y-4 text-center p-6 rounded-xl bg-white/5 border border-white/10">
62+
<div className="relative space-y-4 text-center p-6 rounded-xl bg-white/5 border border-black/10 dark:border-white/10">
6363
<div className="w-12 h-12 mx-auto rounded-full bg-gradient-to-r from-purple-500 to-pink-500 flex items-center justify-center">
6464
{step.icon}
6565
</div>
66-
<h3 className="text-xl font-semibold">{step.title}</h3>
67-
<p className="text-gray-400">{step.description}</p>
66+
<h3 className="text-xl font-semibold text-primary">
67+
{step.title}
68+
</h3>
69+
<p className="text-muted-foreground">{step.description}</p>
6870
</div>
6971
</motion.div>
7072
))}

apps/web/components/home/ImageCarousel.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export function ImageCarousel() {
123123
? image.title
124124
: ""}
125125
</h3>
126-
<p className="text-sm text-gray-200">
126+
<p className="text-sm text-neutral-200">
127127
{typeof image === "object" && "description" in image
128128
? image.description
129129
: ""}
@@ -141,7 +141,7 @@ export function ImageCarousel() {
141141
<motion.button
142142
whileHover={{ scale: 1.1 }}
143143
whileTap={{ scale: 0.9 }}
144-
className="p-3 rounded-full bg-white/10 hover:bg-white/20 backdrop-blur-sm transition-colors border border-white/20"
144+
className="p-3 rounded-full bg-neutral-100/60 hover:bg-neutral-200/60 backdrop-blur-sm transition-colors border border-neutral-200/60 text-neutral-700"
145145
onClick={scrollPrev}
146146
>
147147
<ArrowLeft className="w-5 h-5" />
@@ -150,30 +150,30 @@ export function ImageCarousel() {
150150
<div className="flex gap-3">
151151
{scrollSnaps.map((_, i) => (
152152
<motion.button
153-
key={i}
154-
className="group relative"
155-
onClick={() => scrollTo(i)}
153+
key={i}
154+
className="group relative"
155+
onClick={() => scrollTo(i)}
156156
>
157-
<div className="w-12 h-1.5 rounded-full bg-white/20 overflow-hidden">
158-
{i === selectedIndex && (
159-
<motion.div
160-
className="absolute inset-0 bg-gradient-to-r from-purple-500 to-pink-500"
161-
layoutId="activeSlide"
162-
transition={{
163-
type: "spring",
164-
bounce: 0.2,
165-
}}
166-
/>
167-
)}
168-
</div>
157+
<div className="w-12 h-1.5 rounded-full bg-neutral-200 overflow-hidden">
158+
{i === selectedIndex && (
159+
<motion.div
160+
className="absolute inset-0 bg-gradient-to-r from-purple-600 to-pink-600"
161+
layoutId="activeSlide"
162+
transition={{
163+
type: "spring",
164+
bounce: 0.2,
165+
}}
166+
/>
167+
)}
168+
</div>
169169
</motion.button>
170170
))}
171171
</div>
172172

173173
<motion.button
174174
whileHover={{ scale: 1.1 }}
175175
whileTap={{ scale: 0.9 }}
176-
className="p-3 rounded-full bg-white/10 hover:bg-white/20 backdrop-blur-sm transition-colors border border-white/20"
176+
className="p-3 rounded-full bg-neutral-100/60 hover:bg-neutral-200/60 backdrop-blur-sm transition-colors border border-neutral-200/60 text-neutral-700"
177177
onClick={scrollNext}
178178
>
179179
<ArrowRight className="w-5 h-5" />

apps/web/components/home/PricingSection.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ export function PricingSection() {
2020
className="space-y-12"
2121
>
2222
<div className="text-center space-y-4">
23-
<h2 className="text-3xl md:text-4xl font-bold">
23+
<h2 className="text-3xl md:text-4xl font-bold text-primary/80">
2424
Simple,{" "}
2525
<span className="bg-gradient-to-r from-purple-400 to-pink-500 bg-clip-text text-transparent">
2626
Transparent
2727
</span>{" "}
2828
Pricing
2929
</h2>
30-
<p className="text-gray-400 max-w-2xl mx-auto">
30+
<p className="text-muted-foreground max-w-2xl mx-auto">
3131
Choose the perfect plan for your needs. No hidden fees.
3232
</p>
3333
</div>
@@ -41,31 +41,33 @@ export function PricingSection() {
4141
transition={{ delay: index * 0.2, duration: 0.5 }}
4242
className={`relative group rounded-2xl ${
4343
plan.highlighted
44-
? "bg-gradient-to-b from-purple-600 to-pink-600"
45-
: "bg-white/5"
44+
? "bg-gradient-to-b from-purple-600 to-pink-600 dark:from-purple-600 dark:to-pink-600"
45+
: "bg-gray-50 border border-secondary dark:bg-white/5"
4646
} p-px`}
4747
>
4848
<div
4949
className={`rounded-2xl p-6 h-full ${
50-
plan.highlighted ? "bg-black/90" : "bg-transparent"
50+
plan.highlighted
51+
? "bg-white/95 dark:bg-black/90"
52+
: "bg-transparent"
5153
}`}
5254
>
53-
<div className="space-y-4">
55+
<div className="space-y-4 text-primary">
5456
<h3 className="text-xl font-semibold">{plan.name}</h3>
5557
<div className="text-3xl font-bold">{plan.price}</div>
5658
<ul className="space-y-3">
5759
{plan.features.map((feature) => (
5860
<li key={feature} className="flex items-center gap-2">
5961
<Check className="w-5 h-5 text-green-500" />
60-
<span className="text-gray-300">{feature}</span>
62+
<span className="text-muted-foreground">{feature}</span>
6163
</li>
6264
))}
6365
</ul>
6466
<Button
65-
className={`w-full ${
67+
className={`w-full text-primary ${
6668
plan.highlighted
6769
? "bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600"
68-
: "bg-white/10 hover:bg-white/20"
70+
: "bg-gray-100 hover:bg-gray-200 dark:bg-white/10 dark:hover:bg-white/20"
6971
}`}
7072
>
7173
Get Started

apps/web/components/home/StatsSection.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export function StatsSection() {
1616
transition={{ duration: 0.8 }}
1717
className="relative"
1818
>
19-
<div className="absolute inset-0 bg-gradient-to-b from-purple-500/10 via-transparent to-transparent" />
20-
<div className="relative grid grid-cols-2 md:grid-cols-4 gap-8 md:gap-12">
19+
<div className="absolute rounded-t-2xl inset-0 bg-gradient-to-b from-purple-500/10 via-transparent to-transparent" />
20+
<div className="relative pt-4 grid grid-cols-2 md:grid-cols-4 gap-8 md:gap-12">
2121
{stats.map((stat, index) => (
2222
<motion.div
2323
key={stat.label}
@@ -31,7 +31,7 @@ export function StatsSection() {
3131
<div className="text-4xl md:text-5xl font-bold bg-gradient-to-r from-purple-400 to-pink-500 bg-clip-text text-transparent">
3232
{stat.value}
3333
</div>
34-
<p className="text-gray-400 text-sm md:text-base">{stat.label}</p>
34+
<p className="text-muted-foreground text-sm md:text-base">{stat.label}</p>
3535
</motion.div>
3636
))}
3737
</div>

0 commit comments

Comments
 (0)