Compare commits

..

2 Commits

Author SHA1 Message Date
0c5f10ae18 fix(font): Pretendard 로컬 @font-face 제거 → CDN <link> 로 로드
로컬 /public/fonts/PretendardVariable.woff2 파일이 없어 404가 났다.
인터넷 연결 환경이므로 jsdelivr CDN(pretendard.min.css)으로 불러온다.
미로드 시 base.css 시스템 폰트 스택으로 폴백.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:34:33 +09:00
5e73bfdd28 fix: /favicon.ico 404 제거 — svg 파비콘으로 301 리다이렉트
브라우저가 페이지마다 자동 요청하는 /favicon.ico 라우트가 없어
모든 페이지 콘솔에 404가 떴다. /public/favicon.svg 로 넘긴다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:25:54 +09:00
3 changed files with 7 additions and 9 deletions

View File

@@ -1,14 +1,7 @@
/* 디자인 토큰 — 폰트 + CSS 변수(라이트/다크). 가장 먼저 로드. */ /* 디자인 토큰 — 폰트 + CSS 변수(라이트/다크). 가장 먼저 로드. */
/* Pretendard — 폐쇄망 대비 로컬 호스팅(가변 폰트 1개). 파일이 없으면 시스템 폰트로 폴백. /* Pretendard — CDN(jsdelivr)에서 로드. views/_header 의 <link> 로 불러온다(인터넷 연결 환경).
파일 받기: public/fonts/PretendardVariable.woff2 (README 안내 참고) */ 미로드 시 base.css 의 시스템 폰트 스택으로 폴백. */
@font-face {
font-family: 'Pretendard';
font-weight: 45 920;
font-style: normal;
font-display: swap;
src: url('/public/fonts/PretendardVariable.woff2') format('woff2-variations');
}
:root { :root {
color-scheme: light; color-scheme: light;

View File

@@ -44,6 +44,9 @@ app.use((req, res, next) => {
app.get("/healthz", (_req, res) => res.json({ ok: true })); app.get("/healthz", (_req, res) => res.json({ ok: true }));
// 브라우저가 페이지마다 자동 요청하는 /favicon.ico → svg 파비콘으로 넘긴다(콘솔 404 제거).
app.get("/favicon.ico", (_req, res) => res.redirect(301, "/public/favicon.svg"));
// fetch(AJAX) 요청인지: app.js 가 X-Requested-With 를 붙인다. // fetch(AJAX) 요청인지: app.js 가 X-Requested-With 를 붙인다.
const isAjax = (req) => const isAjax = (req) =>
req.get("X-Requested-With") === "fetch" || (req.get("Accept") || "").includes("application/json"); req.get("X-Requested-With") === "fetch" || (req.get("Accept") || "").includes("application/json");

View File

@@ -5,6 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><%= brand %></title> <title><%= brand %></title>
<link rel="icon" href="/public/favicon.svg" type="image/svg+xml" /> <link rel="icon" href="/public/favicon.svg" type="image/svg+xml" />
<!-- Pretendard 폰트 (CDN · 인터넷 연결 환경) -->
<link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css" />
<link rel="stylesheet" href="/public/css/tokens.css" /> <link rel="stylesheet" href="/public/css/tokens.css" />
<link rel="stylesheet" href="/public/css/base.css" /> <link rel="stylesheet" href="/public/css/base.css" />
<link rel="stylesheet" href="/public/css/layout.css" /> <link rel="stylesheet" href="/public/css/layout.css" />