File tree Expand file tree Collapse file tree 4 files changed +80
-4
lines changed
invite/meet/[meetId]/src/components Expand file tree Collapse file tree 4 files changed +80
-4
lines changed Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ import GradientBackground from '@/app/invite/meet/[meetId]/src/components/Gradie
88import InviteProposalContent from '@/app/invite/meet/[meetId]/src/components/InviteProposalContent' ;
99import InviteProposalErrorFallback from '@/app/invite/meet/[meetId]/src/components/InviteProposalErrorFallback' ;
1010import InviteProposalSkeleton from '@/app/invite/meet/[meetId]/src/components/InviteProposalSkeleton' ;
11+ import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard' ;
1112import { Button } from '@/shared/components' ;
1213import AppInstallBanner from '@/shared/components/AppInstallBanner' ;
1314import { cn } from '@/shared/lib' ;
@@ -58,9 +59,11 @@ const InviteProposal = () => {
5859 < QueryErrorResetBoundary >
5960 { ( { reset } ) => (
6061 < ErrorBoundary onReset = { reset } FallbackComponent = { InviteProposalErrorFallback } >
61- < Suspense fallback = { < InviteProposalSkeleton /> } >
62- < InviteProposalContent />
63- </ Suspense >
62+ < SkeletonGuard minMs = { 250 } skeleton = { < InviteProposalSkeleton /> } >
63+ < Suspense fallback = { < InviteProposalSkeleton /> } >
64+ < InviteProposalContent />
65+ </ Suspense >
66+ </ SkeletonGuard >
6467 </ ErrorBoundary >
6568 ) }
6669 </ QueryErrorResetBoundary >
Original file line number Diff line number Diff line change 1+ // components/SkeletonGuard.tsx
2+ 'use client' ;
3+ import { ReactNode , useEffect , useState } from 'react' ;
4+
5+ export default function SkeletonGuard ( {
6+ minMs = 250 ,
7+ skeleton,
8+ children,
9+ } : {
10+ minMs ?: number ;
11+ skeleton : ReactNode ;
12+ children : ReactNode ;
13+ } ) {
14+ const [ showSkeleton , setShowSkeleton ] = useState ( true ) ;
15+
16+ useEffect ( ( ) => {
17+ const t = setTimeout ( ( ) => setShowSkeleton ( false ) , minMs ) ;
18+ return ( ) => clearTimeout ( t ) ;
19+ } , [ minMs ] ) ;
20+
21+ return (
22+ < div className = "relative" >
23+ { /* 콘텐츠 영역 */ }
24+ < div
25+ className = { `transition-opacity duration-200 ${ showSkeleton ? 'opacity-0' : 'opacity-100' } ` }
26+ >
27+ { children }
28+ </ div >
29+
30+ { /* 오버레이 스켈레톤: 최소 minMs 동안은 확실히 보이게 */ }
31+ { showSkeleton && < div className = "absolute inset-0" > { skeleton } </ div > }
32+ </ div >
33+ ) ;
34+ }
Original file line number Diff line number Diff line change 11import type { Metadata } from 'next' ;
2+ import Head from 'next/head' ;
23
34import ClientProvider from '@/shared/components/provider/ClientProvider' ;
45import ReactQueryProvider from '@/shared/components/provider/ReactQueryProvider' ;
@@ -25,6 +26,44 @@ export default function RootLayout({
2526} > ) {
2627 return (
2728 < html lang = "en" >
29+ < Head >
30+ < link
31+ rel = "preload"
32+ href = "/fonts/Pretendard-Regular.otf"
33+ as = "font"
34+ type = "font/otf"
35+ crossOrigin = "anonymous"
36+ />
37+ < link
38+ rel = "preload"
39+ href = "/fonts/Pretendard-Medium.otf"
40+ as = "font"
41+ type = "font/otf"
42+ crossOrigin = "anonymous"
43+ />
44+ < link
45+ rel = "preload"
46+ href = "/fonts/Pretendard-Bold.otf"
47+ as = "font"
48+ type = "font/otf"
49+ crossOrigin = "anonymous"
50+ />
51+
52+ < link
53+ rel = "preload"
54+ href = "/fonts/NotoSans-serif-Regular.otf"
55+ as = "font"
56+ type = "font/otf"
57+ crossOrigin = "anonymous"
58+ />
59+ < link
60+ rel = "preload"
61+ href = "/fonts/NotoSans-serif-Medium.otf"
62+ as = "font"
63+ type = "font/otf"
64+ crossOrigin = "anonymous"
65+ />
66+ </ Head >
2867 < body >
2968 < ReactQueryProvider >
3069 < ClientProvider > { children } </ ClientProvider >
Original file line number Diff line number Diff line change @@ -30,7 +30,7 @@ module.exports = {
3030 } ,
3131 gray : {
3232 50 : '#FAFAFA' ,
33- 100 : 'F5F5F5' ,
33+ 100 : '# F5F5F5' ,
3434 200 : '#EAEAEA' ,
3535 300 : '#E1E1E1' ,
3636 500 : '#CCCCCC' ,
You can’t perform that action at this time.
0 commit comments