diff --git a/next.config.ts b/next.config.ts index 9b88254..25ed264 100644 --- a/next.config.ts +++ b/next.config.ts @@ -4,7 +4,34 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { output: "standalone", images: { - unoptimized: true, + localPatterns: [ + { + pathname: "/mii/*/image", + }, + { + pathname: "/profile/*/picture", + }, + { + pathname: "/tutorial/**", + }, + { + pathname: "/guest.webp", + }, + ], + remotePatterns: [ + { + hostname: "avatars.githubusercontent.com", + }, + { + hostname: "cdn.discordapp.com", + }, + { + hostname: "studio.mii.nintendo.com", + }, + { + hostname: "*.googleusercontent.com", + }, + ], }, }; diff --git a/src/app/mii/[id]/page.tsx b/src/app/mii/[id]/page.tsx index 7eb0a06..8cd89f0 100644 --- a/src/app/mii/[id]/page.tsx +++ b/src/app/mii/[id]/page.tsx @@ -142,6 +142,7 @@ export default async function MiiPage({ params }: Props) { alt="mii qr code" width={128} height={128} + unoptimized className="border-2 border-amber-300 rounded-lg hover:brightness-90 transition-all" /> diff --git a/src/components/image-viewer.tsx b/src/components/image-viewer.tsx index 59819ac..8cc7a82 100644 --- a/src/components/image-viewer.tsx +++ b/src/components/image-viewer.tsx @@ -12,11 +12,12 @@ interface Props { alt: string; width: number; height: number; + unoptimized?: boolean; className?: string; images?: string[]; } -export default function ImageViewer({ src, alt, width, height, className, images = [] }: Props) { +export default function ImageViewer({ src, alt, width, height, unoptimized = false, className, images = [] }: Props) { const [isOpen, setIsOpen] = useState(false); const [isVisible, setIsVisible] = useState(false); @@ -73,7 +74,16 @@ export default function ImageViewer({ src, alt, width, height, className, images return ( <> {/* not inserting pixelated image-rendering here because i thought it looked a bit weird */} - {alt} setIsOpen(true)} className={`cursor-pointer ${className}`} /> + {alt} setIsOpen(true)} + className={`cursor-pointer ${className}`} + /> {isOpen && createPortal( @@ -104,6 +114,7 @@ export default function ImageViewer({ src, alt, width, height, className, images alt={alt} width={896} height={896} + unoptimized priority={index === selectedIndex} loading={Math.abs(index - selectedIndex) <= 1 ? "eager" : "lazy"} className="max-w-full max-h-full object-contain drop-shadow-lg" diff --git a/src/components/mii/voice-viewer.tsx b/src/components/mii/voice-viewer.tsx index 5e103f7..e709fde 100644 --- a/src/components/mii/voice-viewer.tsx +++ b/src/components/mii/voice-viewer.tsx @@ -5,13 +5,13 @@ import { ChangeEvent } from "react"; interface Props { data: SwitchMiiInstructions["voice"]; - onClick?: (e: ChangeEvent, label: string) => void; + onChange?: (e: ChangeEvent, label: string) => void; onClickTone?: (i: number) => void; } const VOICE_SETTINGS: string[] = ["Speed", "Pitch", "Depth", "Delivery"]; -export default function VoiceViewer({ data, onClick, onClickTone }: Props) { +export default function VoiceViewer({ data, onChange, onClickTone }: Props) { return (
{VOICE_SETTINGS.map((label) => ( @@ -28,9 +28,9 @@ export default function VoiceViewer({ data, onClick, onClickTone }: Props) { max={50} step={1} value={data[label as keyof typeof data] ?? 25} - disabled={!onClick} + disabled={!onChange} onChange={(e) => { - if (onClick) onClick(e, label); + if (onChange) onChange(e, label); }} />
@@ -50,7 +50,7 @@ export default function VoiceViewer({ data, onClick, onClickTone }: Props) { onClick={() => { if (onClickTone) onClickTone(i); }} - className={`transition-colors duration-100 rounded-xl ${data.tone === i ? "bg-orange-400!" : ""} ${onClick ? "hover:bg-orange-300 cursor-pointer" : ""}`} + className={`transition-colors duration-100 rounded-xl ${data.tone === i ? "bg-orange-400!" : ""} ${onClickTone ? "hover:bg-orange-300 cursor-pointer" : ""}`} > {i + 1} diff --git a/src/components/submit-form/mii-editor/tabs/misc.tsx b/src/components/submit-form/mii-editor/tabs/misc.tsx index 329ee0a..34c6e70 100644 --- a/src/components/submit-form/mii-editor/tabs/misc.tsx +++ b/src/components/submit-form/mii-editor/tabs/misc.tsx @@ -122,7 +122,7 @@ export default function HeadTab({ instructions }: Props) { { + onChange={(e, label) => { setVoice((p) => ({ ...p, [label]: e.target.valueAsNumber })); instructions.current.voice[label as keyof typeof voice] = e.target.valueAsNumber; }}