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'
|
||||
|
||||
function getTypeColor(fileType: string): string {
|
||||
if (fileType.startsWith('image/')) return 'bg-blue-100 text-blue-800'
|
||||
if (fileType.startsWith('text/')) return 'bg-green-100 text-green-800'
|
||||
if (fileType.startsWith('audio/')) return 'bg-purple-100 text-purple-800'
|
||||
if (fileType.startsWith('video/')) return 'bg-red-100 text-red-800'
|
||||
return 'bg-stone-100 text-stone-800'
|
||||
if (fileType.startsWith('image/'))
|
||||
return 'bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200'
|
||||
if (fileType.startsWith('text/'))
|
||||
return 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200'
|
||||
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 {
|
||||
return (
|
||||
<span
|
||||
<div
|
||||
className={`px-2 py-1 text-[10px] font-semibold rounded ${getTypeColor(
|
||||
type,
|
||||
)} transition-all duration-300`}
|
||||
>
|
||||
{type}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue