Skip to content

Commit 93388b5

Browse files
Fix theme issues in dev and added footer
1 parent f576ced commit 93388b5

7 files changed

Lines changed: 69 additions & 48 deletions

File tree

src/components/footer.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Github, ExternalLink, Heart } from "lucide-react";
2+
3+
export function Footer() {
4+
return (
5+
<footer className="mt-auto border-t border-slate-200/60 dark:border-slate-700/60 bg-white/70 dark:bg-slate-800/70 backdrop-blur-sm">
6+
<div className="container mx-auto px-4 py-6 max-w-6xl">
7+
<div className="flex flex-col sm:flex-row items-center justify-between gap-4 text-sm text-slate-600 dark:text-slate-400">
8+
{/* Left side - Author info */}
9+
<div className="flex items-center gap-2">
10+
<span>Built with</span>
11+
<Heart className="h-4 w-4 text-red-500 fill-current animate-pulse" />
12+
<span>by</span>
13+
<a
14+
href="https://usmans.me"
15+
target="_blank"
16+
rel="noopener noreferrer"
17+
className="font-medium text-slate-900 dark:text-slate-100 hover:text-blue-600 dark:hover:text-blue-400 transition-colors duration-200 flex items-center gap-1"
18+
>
19+
Usman S.
20+
<ExternalLink className="h-3 w-3" />
21+
</a>
22+
</div>
23+
24+
{/* Right side - Open source info */}
25+
<div className="flex items-center gap-4">
26+
<span className="text-xs">Open Source</span>
27+
<a
28+
href="https://github.com/max-programming/whim"
29+
target="_blank"
30+
rel="noopener noreferrer"
31+
className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-slate-100/80 dark:bg-slate-700/80 hover:bg-slate-200/80 dark:hover:bg-slate-600/80 transition-all duration-200 text-slate-700 dark:text-slate-300"
32+
>
33+
<Github className="h-4 w-4" />
34+
<span className="text-xs font-medium">View on GitHub</span>
35+
</a>
36+
</div>
37+
</div>
38+
</div>
39+
</footer>
40+
);
41+
}

src/components/theme-provider.tsx

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/components/theme-toggle.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1-
import { useTheme } from "~/components/theme-provider";
1+
import { type Theme } from "~/server/theme";
22
import { Button } from "./ui/button";
33
import { Moon, Sun } from "lucide-react";
4+
import { useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
5+
import { themeQuery } from "~/lib/queries";
6+
import { setThemeServerFn } from "~/server/theme";
47

58
export function ThemeToggle() {
6-
const { theme, setTheme } = useTheme();
9+
const queryClient = useQueryClient();
10+
const { data: theme } = useSuspenseQuery(themeQuery);
11+
12+
function setTheme(val: Theme) {
13+
queryClient.setQueryData(themeQuery.queryKey, val);
14+
setThemeServerFn({ data: val });
15+
}
716

817
return (
918
<Button

src/routes/$whimId.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function OtpEntry({ whimId, otp, onOtpChange, onSubmit }: OtpEntryProps) {
7777
const isComplete = otp.length === 4;
7878

7979
return (
80-
<div className="min-h-screen bg-gradient-to-br from-slate-50 to-indigo-50 dark:from-slate-900 dark:to-indigo-950 flex items-center justify-center p-4">
80+
<div className="flex-1 bg-gradient-to-br from-slate-50 to-indigo-50 dark:from-slate-900 dark:to-indigo-950 flex items-center justify-center p-4">
8181
<div className="w-full max-w-md">
8282
{/* Header */}
8383
<div className="text-center mb-8">
@@ -185,7 +185,7 @@ function WhimDisplay({ whimId, otp }: WhimDisplayProps) {
185185

186186
if (isLoading) {
187187
return (
188-
<div className="min-h-screen bg-gradient-to-br from-slate-50 to-indigo-50 dark:from-slate-900 dark:to-indigo-950 flex items-center justify-center">
188+
<div className="flex-1 bg-gradient-to-br from-slate-50 to-indigo-50 dark:from-slate-900 dark:to-indigo-950 flex items-center justify-center">
189189
<div className="text-center">
190190
<div className="animate-spin w-8 h-8 border-4 border-indigo-600 dark:border-indigo-400 border-t-transparent rounded-full mx-auto mb-4"></div>
191191
<p className="text-slate-600 dark:text-slate-300">
@@ -198,7 +198,7 @@ function WhimDisplay({ whimId, otp }: WhimDisplayProps) {
198198

199199
if (error) {
200200
return (
201-
<div className="min-h-screen bg-gradient-to-br from-red-50 to-pink-50 dark:from-red-950 dark:to-pink-950 flex items-center justify-center p-4">
201+
<div className="flex-1 bg-gradient-to-br from-red-50 to-pink-50 dark:from-red-950 dark:to-pink-950 flex items-center justify-center p-4">
202202
<Card className="w-full max-w-md border-2 border-red-200 dark:border-red-800">
203203
<CardContent className="text-center p-8">
204204
<div className="w-16 h-16 bg-red-100 dark:bg-red-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
@@ -224,7 +224,7 @@ function WhimDisplay({ whimId, otp }: WhimDisplayProps) {
224224
}
225225

226226
return (
227-
<div className="min-h-screen bg-gradient-to-br from-green-50 to-emerald-50 dark:from-green-950 dark:to-emerald-950 p-4">
227+
<div className="flex-1 bg-gradient-to-br from-green-50 to-emerald-50 dark:from-green-950 dark:to-emerald-950 p-4">
228228
<div className="max-w-4xl mx-auto">
229229
{/* Success Header */}
230230
<div className="text-center mb-8 pt-8">

src/routes/__root.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// <reference types="vite/client" />
2-
import type { QueryClient } from "@tanstack/react-query";
2+
import { useSuspenseQuery, type QueryClient } from "@tanstack/react-query";
33
import {
44
Outlet,
55
HeadContent,
@@ -10,8 +10,8 @@ import {
1010
import { wrapCreateRootRouteWithSentry } from "@sentry/tanstackstart-react";
1111
import appCss from "~/styles/app.css?url";
1212
import { seo } from "~/lib/seo";
13-
import { ThemeProvider, useTheme } from "~/components/theme-provider";
1413
import { ThemeToggle } from "~/components/theme-toggle";
14+
import { Footer } from "~/components/footer";
1515
import { themeQuery } from "~/lib/queries";
1616

1717
export const Route = wrapCreateRootRouteWithSentry(
@@ -52,16 +52,14 @@ export const Route = wrapCreateRootRouteWithSentry(
5252

5353
function RootComponent() {
5454
return (
55-
<ThemeProvider>
56-
<RootDocument>
57-
<Outlet />
58-
</RootDocument>
59-
</ThemeProvider>
55+
<RootDocument>
56+
<Outlet />
57+
</RootDocument>
6058
);
6159
}
6260

6361
function RootDocument({ children }: Readonly<{ children: React.ReactNode }>) {
64-
const { theme } = useTheme();
62+
const { data: theme } = useSuspenseQuery(themeQuery);
6563

6664
return (
6765
<html className={theme} suppressHydrationWarning>
@@ -76,8 +74,10 @@ function RootDocument({ children }: Readonly<{ children: React.ReactNode }>) {
7674
></script>
7775
)}
7876
</head>
79-
<body>
80-
{children}
77+
<body className="min-h-screen flex flex-col">
78+
<main className="flex-1 flex flex-col">{children}</main>
79+
80+
<Footer />
8181

8282
{/* Theme Toggle - Fixed position in top-right corner */}
8383
<div className="fixed top-4 right-4 z-50">

src/routes/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const Route = createFileRoute("/")({
1616

1717
function LandingPage() {
1818
return (
19-
<div className="min-h-screen content-center bg-gradient-to-br from-slate-50 via-white to-slate-100 dark:from-slate-900 dark:via-slate-800 dark:to-slate-900">
19+
<div className="flex-1 flex items-center bg-gradient-to-br from-slate-50 via-white to-slate-100 dark:from-slate-900 dark:via-slate-800 dark:to-slate-900">
2020
<div className="container mx-auto px-4 py-6 max-w-6xl">
2121
<div className="bg-white/70 dark:bg-slate-800/70 backdrop-blur-sm rounded-2xl border border-slate-200/60 dark:border-slate-700/60 shadow-lg p-6 lg:p-8">
2222
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6 lg:gap-8 items-center">

src/server/theme.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { type Theme } from "~/components/theme-provider";
21
import { createServerFn } from "@tanstack/react-start";
32
import { getCookie, setCookie } from "@tanstack/react-start/server";
43

4+
export type Theme = "light" | "dark";
5+
56
const storageKey = "ui-theme";
67

78
export const getThemeServerFn = createServerFn().handler(async () => {

0 commit comments

Comments
 (0)