Skip to content

fix: 카드 폰트가 OS 기본 폰트로 대체되는 문제 수정 - #20

Merged
with-developer merged 4 commits into
mainfrom
dev
Oct 30, 2026
Merged

with-developer merged 4 commits into
mainfrom
dev

Conversation

@with-developer

Copy link
Copy Markdown
Owner

배경

카드 SVG는 <style> 안에서 @import url('https://fonts.googleapis.com/...')로 JetBrains Mono를 불러오고 있었습니다. 그런데 SVG가 <img>로 렌더링되면(GitHub README의 camo 프록시, 메인페이지 미리보기) 브라우저가 외부 리소스 로드를 전부 차단해서, README에서는 JetBrains Mono가 한 번도 적용되지 않고 OS 기본 monospace 폰트로 표시되고 있었습니다.

환경 실제로 표시되던 폰트
macOS Chrome / Firefox Menlo (글자 폭·모양이 JetBrains Mono와 비슷해 눈에 잘 띄지 않음)
macOS Safari Courier
Windows 등 각 OS의 기본 monospace 폰트

또한 Vercel이 Node.js 20 지원을 종료(2026-10-01)해서, 프로젝트 설정(20.x) 그대로는 배포가 실패하는 상태였습니다.

변경 사항

카드 폰트 임베드

  • JetBrains Mono v2.304 가변 폰트를 카드에서 쓰는 굵기(wght 400~700)와 ASCII(U+0020–007E)만 남겨 서브셋한 woff2(8.3KB)를 base64 @font-face로 SVG에 직접 임베드
    • 리거처 등 레이아웃 기능은 제외하고, 라이선스 정보(name ID 13, 14)는 유지
  • scripts/generate-font-subset.sh 추가: 버전을 고정해 다운로드 → SHA-256 검증 → 서브셋 → src/utils/fonts/jetbrainsMono.ts 생성 (다시 실행해도 결과가 같음)
  • 폰트 라이선스 src/utils/fonts/OFL.txt (SIL OFL 1.1) 추가, README License 섹션에 명시
  • generateStatsSvg.ts, generateCategorySvg.ts: @import 대신 임베드 폰트 사용
  • 응답 크기 증가: stats 2.5KB → 13.6KB, category 4.3KB → 15.4KB
  • 한글처럼 서브셋에 없는 글자는 이전과 같이 시스템 폰트로 표시

Node.js 24.x 지정

  • package.json에 engines.node: "24.x" 추가 → Vercel 프로젝트 설정(20.x)보다 우선 적용되어 빌드와 함수 런타임이 24.x로 동작
  • CI 테스트 Node 버전도 18 → 24로 맞춤

테스트

  • jest 50개 전부 통과 (폰트 임베드 확인 테스트 2개 추가), tsc --noEmit, next build 통과
  • next dev의 실제 API 응답을 <img>로 렌더링해 Chrome / Firefox / WebKit(Safari 엔진)에서 확인
    • 세 엔진 모두 <img> 렌더링이 SVG를 문서로 직접 연 결과와 픽셀 단위로 동일
    • Google Fonts로 로드한 기준 화면과는 안티에일리어싱 수준 차이만 있음 (Google Fonts는 v2.211을 제공, 글자 폭 동일)
  • GitHub camo와 같은 응답 헤더(CSP default-src 'none'; img-src data:; style-src 'unsafe-inline')로 서빙해도 <img> 렌더링은 세 엔진 모두 동일
    • 단, README 이미지를 클릭해 camo URL을 새 탭(문서)으로 열면 CSP 때문에 기본 폰트로 보임 — 수정 전에도 같았던 동작
  • 다크 테마, 한글 닉네임 렌더링 확인
  • Node 22 / 24 각각에서 jest, next build, next start 후 실제 API 호출(200, 폰트 임베드) 확인 → 지원 기간이 더 긴 24.x 선택
  • dev 푸시 시 CI 테스트 및 Vercel Preview 배포 확인

🤖 Generated with Claude Code

https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd

Others 카테고리가 새로 생기며 Most Solved Categories 범례가 4개에서
5개로 늘어나 박스 하단이 빡빡해진 문제 수정. 범례 시작점을 위로 올리고
배경 박스를 키워 5개 항목의 상하 여백 균형을 맞춤.
SVG가 <img>로 렌더링되면(GitHub README, 메인페이지 미리보기) 브라우저가
외부 리소스를 불러오지 않아 Google Fonts @import가 무시되고, OS 기본
monospace 폰트(macOS Chrome은 Menlo, Safari는 Courier 등)로 표시되던 문제 수정.
JetBrains Mono 가변 폰트를 카드에 쓰는 굵기(400~700)와 ASCII 문자만 남겨
서브셋한 뒤 base64 @font-face로 SVG에 직접 임베드하고, 서브셋 생성
스크립트와 폰트 라이선스(OFL)를 함께 추가.

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
Vercel이 Node.js 20 지원을 종료해(2026-10-01) 배포가 실패하므로
package.json engines로 Vercel 빌드/함수 런타임을 24.x로 지정하고,
CI 테스트도 같은 버전으로 맞춤.

Claude-Session: https://claude.ai/code/session_01AGcght9Lc8cAYdvYCrdSzd
@with-developer
with-developer merged commit 1b1c49b into main Oct 30, 2026
6 checks passed

This branch was previously deployed

1 inactive deployment
Preview — 68fcb662 Deployed Oct 30, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant