Skip to content

Commit 88fd52c

Browse files
committed
feat: font preload 추가, skeleton guard 추가
1 parent 7261309 commit 88fd52c

File tree

4 files changed

+80
-4
lines changed

4 files changed

+80
-4
lines changed

apps/tuk-web/src/app/invite/meet/[meetId]/src/components/InviteProposal.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import GradientBackground from '@/app/invite/meet/[meetId]/src/components/Gradie
88
import InviteProposalContent from '@/app/invite/meet/[meetId]/src/components/InviteProposalContent';
99
import InviteProposalErrorFallback from '@/app/invite/meet/[meetId]/src/components/InviteProposalErrorFallback';
1010
import InviteProposalSkeleton from '@/app/invite/meet/[meetId]/src/components/InviteProposalSkeleton';
11+
import SkeletonGuard from '@/app/invite/meet/[meetId]/src/components/SkeletonGuard';
1112
import { Button } from '@/shared/components';
1213
import AppInstallBanner from '@/shared/components/AppInstallBanner';
1314
import { 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>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
}

apps/tuk-web/src/app/layout.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Metadata } from 'next';
2+
import Head from 'next/head';
23

34
import ClientProvider from '@/shared/components/provider/ClientProvider';
45
import 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>

apps/tuk-web/tailwind.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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',

0 commit comments

Comments
 (0)