5.3 글로벌 로딩/스켈레톤/에러 경계 패턴 정립 o

This commit is contained in:
koreacomp5
2025-10-09 15:33:01 +09:00
parent 563b162290
commit ca8fdc4fba
4 changed files with 55 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
export function Skeleton({ width = "100%", height = 16 }: { width?: number | string; height?: number | string }) {
return (
<div
style={{
width,
height,
borderRadius: 6,
background:
"linear-gradient(90deg, #eee 25%, #f5f5f5 37%, #eee 63%)",
backgroundSize: "400% 100%",
animation: "shine 1.2s ease-in-out infinite",
}}
>
<style>{`@keyframes shine{0%{background-position:100% 0}100%{background-position:0 0}}`}</style>
</div>
);
}

17
src/app/error.tsx Normal file
View File

@@ -0,0 +1,17 @@
"use client";
import { useEffect } from "react";
export default function GlobalError({ error, reset }: { error: Error & { digest?: string }; reset: () => void }) {
useEffect(() => {
console.error(error);
}, [error]);
return (
<div style={{ padding: 24 }}>
<h2> .</h2>
<p>{error.message}</p>
<button onClick={() => reset()}> </button>
</div>
);
}

18
src/app/loading.tsx Normal file
View File

@@ -0,0 +1,18 @@
export default function Loading() {
return (
<div style={{ padding: 24 }}>
<div style={{
width: 48,
height: 48,
borderRadius: "50%",
border: "4px solid #eee",
borderTopColor: "#111",
animation: "spin 1s linear infinite",
margin: "24px auto",
}} />
<style>{`@keyframes spin{to{transform:rotate(360deg)}}`}</style>
</div>
);
}