Skip to content

Commit

Permalink
Update theme toggler ui, and extract to a different component, that a…
Browse files Browse the repository at this point in the history
…ccepts children
  • Loading branch information
aahnik committed Jan 10, 2025
1 parent c544e8a commit ea1c3b5
Show file tree
Hide file tree
Showing 6 changed files with 195 additions and 63 deletions.
35 changes: 1 addition & 34 deletions app/skeleton/page.tsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,7 @@
"use client";

import { PageSkeleton } from "@/components/ui/page-skeleton";
import { Button } from "@/components/ui/button";
import { useTheme } from "@/contexts/theme-context";

export default function SkeletonDebugPage() {
const { theme, setTheme } = useTheme();

return (
<div className="min-h-screen">
<div className="container mx-auto p-4">
<div className="flex justify-end mb-4 gap-2">
<Button
variant="outline"
onClick={() => setTheme("light")}
className={theme === "light" ? "border-primary" : ""}
>
Light
</Button>
<Button
variant="outline"
onClick={() => setTheme("dark")}
className={theme === "dark" ? "border-primary" : ""}
>
Dark
</Button>
<Button
variant="outline"
onClick={() => setTheme("system")}
className={theme === "system" ? "border-primary" : ""}
>
System
</Button>
</div>
</div>
<PageSkeleton />
</div>
);
return <PageSkeleton />;
}
43 changes: 43 additions & 0 deletions components/theme-toggler-frame.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"use client";

import { Switch } from "@/components/ui/switch";
import { Sun, Moon } from "lucide-react";
import { useTheme } from "@/contexts/theme-context";
import { ReactNode, useEffect, useState } from "react";

interface ThemeTogglerFrameProps {
children: ReactNode;
}

export default function ThemeTogglerFrame({ children }: ThemeTogglerFrameProps) {
const { theme, setTheme } = useTheme();
const [mounted, setMounted] = useState(false);

useEffect(() => {
setMounted(true);
}, []);

if (!mounted) {
return <div className="min-h-screen">{children}</div>;
}

return (
<div className="min-h-screen">
<div className="container mx-auto p-4">
<div className="flex justify-end mb-4 items-center gap-2">
{theme === "dark" && (
<Sun className="h-4 w-4 text-muted-foreground hover:text-foreground transition-colors" />
)}
<Switch
checked={theme === "dark"}
onCheckedChange={(checked) => setTheme(checked ? "dark" : "light")}
/>
{theme === "light" && (
<Moon className="h-4 w-4 text-muted-foreground hover:text-foreground transition-colors" />
)}
</div>
</div>
{children}
</div>
);
}
63 changes: 34 additions & 29 deletions components/ui/page-skeleton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,46 @@

import { Skeleton } from "@/components/ui/skeleton";
import { Card } from "@/components/ui/card";
import ThemeTogglerFrame from "@/components/theme-toggler-frame";

export function PageSkeleton() {
return (
<div className="container mx-auto p-6 space-y-8">
{/* Header Section */}
<div className="space-y-4">
<Skeleton className="h-8 w-[250px]" />
<Skeleton className="h-4 w-[350px]" />
</div>

{/* Content Grid */}
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{[1, 2, 3].map((i) => (
<Card key={i} className="p-6 space-y-4">
<Skeleton className="h-4 w-[100px]" />
<Skeleton className="h-20 w-full" />
<div className="space-y-2">
<Skeleton className="h-3 w-[140px]" />
<Skeleton className="h-3 w-[100px]" />
</div>
</Card>
))}
</div>
<>
<ThemeTogglerFrame>
<div className="container mx-auto p-6 space-y-8">
{/* Header Section */}
<div className="space-y-4">
<Skeleton className="h-8 w-[250px]" />
<Skeleton className="h-4 w-[350px]" />
</div>

{/* Table/List Section */}
<Card className="p-6">
<div className="space-y-4">
<Skeleton className="h-6 w-[200px]" />
<div className="space-y-2">
{[1, 2, 3, 4].map((i) => (
<Skeleton key={i} className="h-12 w-full" />
{/* Content Grid */}
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{[1, 2, 3].map((i) => (
<Card key={i} className="p-6 space-y-4 border-border/50">
<Skeleton className="h-4 w-[100px]" />
<Skeleton className="h-20 w-full" />
<div className="space-y-2">
<Skeleton className="h-3 w-[140px]" />
<Skeleton className="h-3 w-[100px]" />
</div>
</Card>
))}
</div>

{/* Table/List Section */}
<Card className="p-6 border-border/50">
<div className="space-y-4">
<Skeleton className="h-6 w-[200px]" />
<div className="space-y-2">
{[1, 2, 3, 4].map((i) => (
<Skeleton key={i} className="h-12 w-full" />
))}
</div>
</div>
</Card>
</div>
</Card>
</div>
</ThemeTogglerFrame>
</>
);
}
29 changes: 29 additions & 0 deletions components/ui/switch.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"use client"

import * as React from "react"
import * as SwitchPrimitives from "@radix-ui/react-switch"

import { cn } from "@/lib/utils"

const Switch = React.forwardRef<
React.ElementRef<typeof SwitchPrimitives.Root>,
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
>(({ className, ...props }, ref) => (
<SwitchPrimitives.Root
className={cn(
"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
className
)}
{...props}
ref={ref}
>
<SwitchPrimitives.Thumb
className={cn(
"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"
)}
/>
</SwitchPrimitives.Root>
))
Switch.displayName = SwitchPrimitives.Root.displayName

export { Switch }
87 changes: 87 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"@radix-ui/react-select": "^2.1.1",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.2",
"@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-toast": "^1.2.2",
"@radix-ui/react-tooltip": "^1.1.4",
Expand Down

0 comments on commit ea1c3b5

Please sign in to comment.