mirror of https://github.com/kern/filepizza
Add dark mode
parent
3fb4af543f
commit
eeb1869cfc
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,56 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import { useTheme } from 'next-themes'
|
||||||
|
|
||||||
|
function LightModeIcon(): JSX.Element {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
strokeWidth={1.5}
|
||||||
|
stroke="currentColor"
|
||||||
|
className="w-4 h-4 block dark:hidden"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function DarkModeIcon(): JSX.Element {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
strokeWidth={1.5}
|
||||||
|
stroke="currentColor"
|
||||||
|
className="w-4 h-4 hidden dark:block"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ModeToggle(): JSX.Element {
|
||||||
|
const { setTheme, resolvedTheme } = useTheme()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}
|
||||||
|
className="fixed top-4 right-4 border rounded-md w-6 h-6 flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<span className="sr-only">Toggle mode</span>
|
||||||
|
<LightModeIcon />
|
||||||
|
<DarkModeIcon />
|
||||||
|
</button>
|
||||||
|
)
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import * as React from "react";
|
||||||
|
import { ThemeProvider as NextThemesProvider } from "next-themes";
|
||||||
|
import type { ThemeProviderProps } from "next-themes/dist/types";
|
||||||
|
|
||||||
|
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
|
||||||
|
return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
|
||||||
|
}
|
||||||
@ -1,21 +1,25 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
|
||||||
function getTypeColor(fileType: string): string {
|
function getTypeColor(fileType: string): string {
|
||||||
if (fileType.startsWith('image/')) return 'bg-blue-100 text-blue-800'
|
if (fileType.startsWith('image/'))
|
||||||
if (fileType.startsWith('text/')) return 'bg-green-100 text-green-800'
|
return 'bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200'
|
||||||
if (fileType.startsWith('audio/')) return 'bg-purple-100 text-purple-800'
|
if (fileType.startsWith('text/'))
|
||||||
if (fileType.startsWith('video/')) return 'bg-red-100 text-red-800'
|
return 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200'
|
||||||
return 'bg-stone-100 text-stone-800'
|
if (fileType.startsWith('audio/'))
|
||||||
|
return 'bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200'
|
||||||
|
if (fileType.startsWith('video/'))
|
||||||
|
return 'bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-200'
|
||||||
|
return 'bg-stone-100 dark:bg-stone-900 text-stone-800 dark:text-stone-200'
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function TypeBadge({ type }: { type: string }): JSX.Element {
|
export default function TypeBadge({ type }: { type: string }): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<span
|
<div
|
||||||
className={`px-2 py-1 text-[10px] font-semibold rounded ${getTypeColor(
|
className={`px-2 py-1 text-[10px] font-semibold rounded ${getTypeColor(
|
||||||
type,
|
type,
|
||||||
)} transition-all duration-300`}
|
)} transition-all duration-300`}
|
||||||
>
|
>
|
||||||
{type}
|
{type}
|
||||||
</span>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue