diff --git a/src/app/globals.css b/src/app/globals.css index fb4bd21..9bcedc3 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -7,11 +7,9 @@ --background: #ffffff; } -@media (prefers-color-scheme: dark) { - :root { - --foreground: #ededed; - --background: #0a0a0a; - } +.dark { + --foreground: #ededed; + --background: #0a0a0a; } body { diff --git a/src/app/groups/[id]/page.tsx b/src/app/groups/[id]/page.tsx index 02ab880..e583af0 100644 --- a/src/app/groups/[id]/page.tsx +++ b/src/app/groups/[id]/page.tsx @@ -41,8 +41,8 @@ export default function GroupDetailPage() {
-

{group.name}

-

+

{group.name}

+

{formatAmount(group.contributionAmount)} tokens per cycle

@@ -65,8 +65,8 @@ export default function GroupDetailPage() {
-
-

+
+

Actions

@@ -86,30 +86,30 @@ export default function GroupDetailPage() {
-
-

+
+

Group Info

-
Status
-
{group.status}
+
Status
+
{group.status}
-
Members
-
+
Members
+
{group.members.length}/{group.maxMembers}
-
Cycle
-
+
Cycle
+
{group.cycleLength / 86400} days
-
Pot Size
-
+
Pot Size
+
{formatAmount( group.contributionAmount * BigInt(group.members.length) )}{" "} diff --git a/src/app/groups/new/page.tsx b/src/app/groups/new/page.tsx index afe0804..05fe426 100644 --- a/src/app/groups/new/page.tsx +++ b/src/app/groups/new/page.tsx @@ -6,7 +6,7 @@ export default function NewGroupPage() { <>
-

+

Create a Savings Group

diff --git a/src/app/groups/page.tsx b/src/app/groups/page.tsx index 7592365..22b431d 100644 --- a/src/app/groups/page.tsx +++ b/src/app/groups/page.tsx @@ -47,11 +47,11 @@ export default function GroupsPage() {
-

Savings Groups

+

Savings Groups

{groups.length === 0 ? ( -
+
No groups found. Create the first one!
) : ( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 17200f3..2766af7 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -14,8 +14,8 @@ export default function RootLayout({ children: React.ReactNode; }) { return ( - - + + {children} diff --git a/src/app/page.tsx b/src/app/page.tsx index 670d0c6..2d5322e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -39,7 +39,7 @@ export default function Home() { {/* How it works */}
-

+

How It Works

@@ -73,10 +73,10 @@ export default function Home() {
{item.step}
-

+

{item.title}

-

{item.description}

+

{item.description}

))}
@@ -84,9 +84,9 @@ export default function Home() {
{/* Features */} -
+
-

+

Why SoroSave?

@@ -109,12 +109,12 @@ export default function Home() { ].map((feature) => (
-

+

{feature.title}

-

{feature.description}

+

{feature.description}

))}
diff --git a/src/app/providers.tsx b/src/app/providers.tsx index 98f8bf5..c66664f 100644 --- a/src/app/providers.tsx +++ b/src/app/providers.tsx @@ -1,6 +1,12 @@ "use client"; -import React, { createContext, useContext, useState, useCallback, useEffect } from "react"; +import React, { + createContext, + useContext, + useState, + useCallback, + useEffect, +} from "react"; import { connectWallet, getPublicKey, isFreighterInstalled } from "@/lib/wallet"; interface WalletContextType { @@ -11,6 +17,14 @@ interface WalletContextType { disconnect: () => void; } +type Theme = "light" | "dark"; + +interface ThemeContextType { + theme: Theme; + setTheme: (theme: Theme) => void; + toggleTheme: () => void; +} + const WalletContext = createContext({ address: null, isConnected: false, @@ -19,13 +33,43 @@ const WalletContext = createContext({ disconnect: () => {}, }); +const ThemeContext = createContext({ + theme: "light", + setTheme: () => {}, + toggleTheme: () => {}, +}); + export function useWallet() { return useContext(WalletContext); } +export function useTheme() { + return useContext(ThemeContext); +} + export function Providers({ children }: { children: React.ReactNode }) { const [address, setAddress] = useState(null); const [isFreighterAvailable, setIsFreighterAvailable] = useState(false); + const [theme, setTheme] = useState("light"); + + useEffect(() => { + const storedTheme = window.localStorage.getItem("sorosave-theme"); + if (storedTheme === "light" || storedTheme === "dark") { + setTheme(storedTheme); + return; + } + + const prefersDark = window.matchMedia( + "(prefers-color-scheme: dark)" + ).matches; + setTheme(prefersDark ? "dark" : "light"); + }, []); + + useEffect(() => { + document.documentElement.classList.toggle("dark", theme === "dark"); + document.documentElement.style.colorScheme = theme; + window.localStorage.setItem("sorosave-theme", theme); + }, [theme]); useEffect(() => { isFreighterInstalled().then(setIsFreighterAvailable); @@ -44,17 +88,23 @@ export function Providers({ children }: { children: React.ReactNode }) { setAddress(null); }, []); + const toggleTheme = useCallback(() => { + setTheme((prev) => (prev === "dark" ? "light" : "dark")); + }, []); + return ( - - {children} - + + + {children} + + ); } diff --git a/src/components/ConnectWallet.tsx b/src/components/ConnectWallet.tsx index f039a0e..0e2a7ce 100644 --- a/src/components/ConnectWallet.tsx +++ b/src/components/ConnectWallet.tsx @@ -13,7 +13,7 @@ export function ConnectWallet() { href="https://www.freighter.app/" target="_blank" rel="noopener noreferrer" - className="bg-gray-200 text-gray-700 px-4 py-2 rounded-lg text-sm font-medium hover:bg-gray-300" + className="rounded-lg bg-gray-200 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-300 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700" > Install Freighter @@ -23,12 +23,12 @@ export function ConnectWallet() { if (isConnected && address) { return (
- + {shortenAddress(address)} diff --git a/src/components/ContributeModal.tsx b/src/components/ContributeModal.tsx index 0d9d539..9629edf 100644 --- a/src/components/ContributeModal.tsx +++ b/src/components/ContributeModal.tsx @@ -50,15 +50,17 @@ export function ContributeModal({ return (
-
-

+
+

Confirm Contribution

-
+
-

Amount to contribute

-

+

+ Amount to contribute +

+

{formatAmount(contributionAmount)} tokens

@@ -73,7 +75,7 @@ export function ContributeModal({
diff --git a/src/components/CreateGroupForm.tsx b/src/components/CreateGroupForm.tsx index 0a1a767..41fc3ce 100644 --- a/src/components/CreateGroupForm.tsx +++ b/src/components/CreateGroupForm.tsx @@ -53,7 +53,7 @@ export function CreateGroupForm() { if (!isConnected) { return ( -
+
Please connect your wallet to create a group.
); @@ -62,7 +62,7 @@ export function CreateGroupForm() { return (
-
-
-
-
-
{error && ( -
+
{error}
)} diff --git a/src/components/GroupCard.tsx b/src/components/GroupCard.tsx index 34e0616..5b08e1f 100644 --- a/src/components/GroupCard.tsx +++ b/src/components/GroupCard.tsx @@ -8,44 +8,44 @@ interface GroupCardProps { } const statusColors: Record = { - Forming: "bg-blue-100 text-blue-800", - Active: "bg-green-100 text-green-800", - Completed: "bg-gray-100 text-gray-800", - Disputed: "bg-red-100 text-red-800", - Paused: "bg-yellow-100 text-yellow-800", + Forming: "bg-blue-100 text-blue-800 dark:bg-blue-950/40 dark:text-blue-300", + Active: "bg-green-100 text-green-800 dark:bg-green-950/40 dark:text-green-300", + Completed: "bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200", + Disputed: "bg-red-100 text-red-800 dark:bg-red-950/40 dark:text-red-300", + Paused: "bg-yellow-100 text-yellow-800 dark:bg-yellow-950/40 dark:text-yellow-300", }; export function GroupCard({ group }: GroupCardProps) { return ( -
+
-

{group.name}

+

{group.name}

{getStatusLabel(group.status)}
-
+
Contribution - + {formatAmount(group.contributionAmount)} tokens
Members - + {group.members.length} / {group.maxMembers}
Round - + {group.currentRound} / {group.totalRounds || group.maxMembers}
diff --git a/src/components/MemberList.tsx b/src/components/MemberList.tsx index bd469e1..8e53fe8 100644 --- a/src/components/MemberList.tsx +++ b/src/components/MemberList.tsx @@ -16,8 +16,8 @@ export function MemberList({ currentRound, }: MemberListProps) { return ( -
-

Members

+
+

Members

{members.map((member, index) => { const payoutRound = @@ -30,14 +30,14 @@ export function MemberList({ return (
{index + 1}
- + {shortenAddress(member, 6)} {member === admin && ( @@ -54,12 +54,12 @@ export function MemberList({ )} {hasReceived && ( - + Received )} {payoutRound && !hasReceived && !isCurrentRecipient && ( - + Round {payoutRound} )} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 2d673aa..22990f4 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -2,32 +2,36 @@ import Link from "next/link"; import { ConnectWallet } from "./ConnectWallet"; +import { ThemeToggle } from "./ThemeToggle"; export function Navbar() { return ( -