/* =====================================================================
 * fonts-ui.css — **UI 화면 폰트 단일 소스** (사용자 결정 2026-07-26: "전체 폰트를 Pretendard로")
 *
 * 이 파일 하나만 로드하면 어떤 화면이든 UI 서체가 Pretendard 로 고정된다.
 * 로드 대상: 신청서(layout/base.html) · 관리자(templates/pages/*) · 좌표 편집기(template-info.html)
 *            · 오류 페이지(templates/error/*).
 *   ↳ 원래 이 선언은 ui-i18n.css 안에 있었는데, ui-i18n.css 는 **번역 UI 전용**이라
 *     관리자 화면에 통째로 얹을 수 없어 폰트 부분만 이 파일로 분리했다(2026-07-26).
 *     ui-i18n.css 는 하위호환용 @import 만 남긴다 — 자세한 건 그쪽 주석 참고.
 *
 * ⚠⚠ 절대 건드리면 안 되는 경계 — 패밀리 이름이 'Pretendard' 가 **아니라** 'Pretendard UI' 인 이유
 *   `.overlay-text`(미리보기 값) · text-fit.js 의 canvas 측정 · 서버 AWT(ApplyFormController)가
 *   **같은 TTF 를 'Pretendard' 라는 이름으로** 쓰고 세 곳이 픽셀 단위로 일치해야 한다(미리보기 == PDF).
 *   원본 'Pretendard' 패밀리에 size-adjust 나 weight 를 추가하면 그 측정이 통째로 틀어진다.
 *   → UI 용은 **같은 파일을 다른 이름으로** 한 번 더 선언해서 쓴다. fonts.css 는 손대지 않는다.
 *   (실측 확인: canvas 는 전부 `ctx.font = "<px>px 'Pretendard', ..."` 로 **weight 미지정 = 400** 이라
 *    설령 원본 패밀리에 600 을 넣어도 측정은 안 바뀌지만, 굳이 위험을 지지 않는다.)
 *
 * 번들 폰트 (외부 의존성 원칙: 상업적 사용 가능 · CDN 금지 · 로컬 번들 · 버전 고정)
 *   Pretendard v1.3.9 (SIL OFL 1.1) — static/fonts/Pretendard-LICENSE-OFL.txt
 *     · Pretendard-Regular.woff2 / .ttf  (400) — 웹 UI + 서버 AWT 공용
 *     · Pretendard-SemiBold.woff2        (600) — 웹 UI 전용(서버는 Regular 만 씀)
 *   출처(둘 다 같은 릴리스 태그 v1.3.9, 바이트 크기까지 상류와 일치 확인):
 *     woff2 = packages/pretendard/dist/web/static/woff2/Pretendard-{Regular,SemiBold}.woff2
 *     ttf   = packages/pretendard/dist/public/static/alternative/Pretendard-Regular.ttf
 *   OFL 은 "Font Software" 전체(= 모든 굵기)에 적용되므로 라이선스 파일은 갱신 불필요
 *     (상류 LICENSE 와 바이트 동일 — 개행 차이만 있음. 실측 확인).
 *   SemiBold 는 .ttf 를 받지 않았다: 서버 AWT 는 Regular 만 로드하고, 웹은 woff2 를 100% 지원한다.
 *   (만약 woff2 를 못 쓰는 환경이면 600 요청이 Regular 합성 볼드로 떨어질 뿐 = 오늘과 같은 동작.)
 * ===================================================================== */

/* ─────────────────────────────────────────────────────────────────────
 * 1) 타이 문자 광학 크기 보정 (원래 ui-i18n.css 에 있던 것 — 그대로 옮김)
 *
 * 언어 전환 시 "글자 크기가 달라 보이는" 문제의 실측 결론: font-size 는 안 바뀐다.
 *   전 17개 언어에서 computed fontSize/lineHeight 가 완전히 동일하고(body 15px/22.95px 등),
 *   언어별로 크기를 바꾸는 CSS/JS 도 없다. 실제로 바뀌는 건 **스크립트별 폴백 폰트**다.
 * 실측한 본문 글자 높이(em=100, Chrome/Windows):
 *   한글 Noto Sans KR 83 · 맑은고딕 85.5 | 라틴 Segoe UI x=50,H=70 | CJK 77.5~80.5
 *   데바나가리 Nirmala UI 73 · 미얀마 Myanmar Text 51 · **타이 Tahoma 56**
 * 타이만 문장 대부분이 56/100 높이 자음이라 한국어 화면 대비 확연히 작아 보인다 → 타이만 보정.
 *   목표 0.66em(=한글 0.83em 의 80%, 라틴 소문자 0.50 과 대문자 0.70 사이) ÷ 0.56 = **118%**.
 *   행상자 초과 검증: 타이 최악 조합 "ที่ญุ๊โป" 잉크 1.20em × 1.18 = 1.416em < 행상자 1.53em (겹침 없음).
 * 미얀마 미보정 사유: 결합형 "ကို" 잉크가 이미 1.475em(행상자의 96%)라 105% 만 올려도 줄이 겹친다
 *   → 크기가 아니라 행간을 손대야 하는 별건.
 * ───────────────────────────────────────────────────────────────────── */
@font-face {
  font-family: 'UI Script Fit';
  /* Windows=Tahoma(Chrome 이 실제로 고르는 폰트) → 없으면 Leelawadee UI → macOS Thonburi → Noto */
  src: local('Tahoma'), local('Leelawadee UI'), local('Thonburi'), local('Noto Sans Thai');
  unicode-range: U+0E00-0E7F;   /* 타이 문자 블록만 */
  size-adjust: 118%;
  font-weight: 400;
  font-style: normal;
}
@font-face {
  /* 굵은 글씨(카드 헤더·라벨은 semibold)도 같은 배율로 올려야 한 화면에서 크기가 갈리지 않는다.
     실측: 400/500/600/700 전부 배율 1.179 로 균일. */
  font-family: 'UI Script Fit';
  src: local('Tahoma Bold'), local('Tahoma-Bold'), local('Leelawadee UI Bold'),
       local('Thonburi Bold'), local('Noto Sans Thai Bold');
  unicode-range: U+0E00-0E7F;
  size-adjust: 118%;
  font-weight: 700;
  font-style: normal;
}

/* ─────────────────────────────────────────────────────────────────────
 * 2) Pretendard UI — UI 전용 별칭 패밀리
 *
 * 배경: 테마 스택의 첫 폰트 "Public Sans" 는 프로젝트에 없다(실측 installed=false).
 *   그래서 UI 전체가 OS 폴백으로 그려졌고 **PC 마다 한국어 서체가 달랐다**
 *   (이 개발 PC=Noto Sans KR, 스톡 Windows=맑은 고딕). Pretendard 는 이미 번들돼 있으므로
 *   그것을 UI 스택 맨 앞에 세워 상태고정한다.
 *
 * ── size-adjust 106%(한글) 산출 근거 (전부 실측, em=1000 기준 잉크 높이/자간)
 *   Noto Sans KR(이 개발 PC) 잉크 90.63 · 10글자 폭 9.200em
 *   맑은 고딕(스톡 Windows)  잉크 95.31 · 10글자 폭 10.000em
 *   Pretendard              잉크 87.50 · 10글자 폭 8.643em
 *   두 지표(잉크/폭)가 갈리는 건 맑은고딕·Noto 가 **글자가 큰 게 아니라 자간이 넓기** 때문이다.
 *   폭에 맞추면(115.7%) 글자가 실제로 6% 커져 "크기 유지" 지시에 어긋난다 → **잉크 기준**.
 *   두 모집단(개발 PC=Noto / 판매자 PC=맑은고딕)의 체감 변화 최댓값을 줄이는 중간값
 *   (90.63+95.31)/2 = 92.97 → 92.97/87.50 = 106.3% → **106%** 채택
 *   (실측 잉크 92.75 = Noto 대비 +2.3% / 맑은고딕 대비 −2.7%. 15px 에서 0.3px = 육안 식별 불가).
 *   대안: 104% = 개발 PC 잉크 완전 일치(폭 −2.7%) · 109% = 맑은고딕 잉크 일치(폭 +1.9%).
 *   조정은 **한글 블록의 size-adjust 한 값만** 바꾸면 된다(600 face 도 같이 맞출 것).
 *
 * ── 커버리지: Pretendard 가 담지 않는 문자는 스택 뒤로 흘려보낸다(실측 표)
 *   한글·라틴(베트남어 성조 포함)·키릴 → Pretendard UI
 *   한자(zh/zh-Hant/ja)·가나·전각기호 → Noto Sans KR (오늘과 동일)
 *   타이 → 'UI Script Fit'(Tahoma, 118%) — 이 규칙이 스택 맨 앞이라 영향 없음(실측 불변)
 *   데바나가리 → Nirmala UI · 미얀마 → Myanmar Text (오늘과 동일)
 *   ⚠ **가나(U+3040-30FF)와 전각기호(U+FF00-FFEF)는 일부러 제외**했다. Pretendard 에 가나는
 *     있지만 한자는 없어서, 포함하면 일본어 한 문장이 Pretendard(가나)+Noto(한자) 로 갈라져
 *     오히려 크기가 들쭉날쭉해진다(실측 잉크 81 vs 88). 일본어는 오늘처럼 한 폰트로 둔다.
 *   제외 대상은 **선언한 unicode-range 밖**이라 폴백 경로가 오늘과 완전히 같다(회귀 0).
 *
 * ── 굵기 600(SemiBold): 2026-07-26 사용자 지시로 실물 파일 추가 번들.
 *   그전에는 400 하나뿐이라 600/700 이 **Chrome 합성 볼드**로 그려졌다
 *   (실측 잉크 400=37,879px → 600/700=54,622px = 1.44배. 자간(advance)은 400 과 완전히 동일).
 *   실물 SemiBold 로 바뀌면 잉크가 합성 볼드보다 가벼워지지만 그게 폰트 설계 원본이다.
 *   700(<strong>·fw-bold)은 700 face 가 없으므로 CSS 폰트 매칭 규칙에 따라 600 face 를 쓴다
 *   = 600 과 같은 굵기. **오늘도 600/700 이 똑같이 합성 볼드라 굵기 구분은 원래 없었다**(회귀 아님).
 *   700 을 더 굵게 하려면 같은 릴리스의 Pretendard-Bold.woff2 를 추가하고 아래 600 블록을
 *   복제해 font-weight: 700 으로 두면 된다(+791KB).
 * ───────────────────────────────────────────────────────────────────── */

/* 400 — 라틴/키릴/기호 (보정 없음) */
@font-face {
  font-family: 'Pretendard UI';
  src: url('/fonts/Pretendard-Regular.woff2') format('woff2'),
       url('/fonts/Pretendard-Regular.ttf') format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  /* 라틴 + 라틴확장(베트남어) + 수정문자(우즈베크 ʻ) + 그리스 + 키릴(러시아·몽골) + 문장부호/기호 */
  unicode-range: U+0000-00FF, U+0100-024F, U+0250-02AF, U+02B0-02FF, U+0300-036F,
                 U+0370-03FF, U+0400-04FF, U+0500-052F, U+1E00-1EFF,
                 U+2000-206F, U+2070-209F, U+20A0-20BF, U+2100-214F, U+2150-218F,
                 U+2190-21FF, U+2200-22FF, U+25A0-25FF, U+2600-26FF;
  size-adjust: 100%;
}
/* 400 — 한글 (크기 유지 보정 106%) */
@font-face {
  font-family: 'Pretendard UI';
  src: url('/fonts/Pretendard-Regular.woff2') format('woff2'),
       url('/fonts/Pretendard-Regular.ttf') format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  /* 한글 자모 + 호환자모 + 확장 + 음절 */
  unicode-range: U+1100-11FF, U+3130-318F, U+A960-A97F, U+AC00-D7A3, U+D7B0-D7FF;
  size-adjust: 106%;   /* ← 한국어 크기 유지 보정값. 위 산출 근거 참고 */
}
/* 600 — 라틴/키릴/기호. unicode-range·size-adjust 는 400 과 **반드시 동일**해야
   같은 문장 안에서 굵기만 바뀌고 크기는 안 바뀐다. */
@font-face {
  font-family: 'Pretendard UI';
  src: url('/fonts/Pretendard-SemiBold.woff2') format('woff2');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0100-024F, U+0250-02AF, U+02B0-02FF, U+0300-036F,
                 U+0370-03FF, U+0400-04FF, U+0500-052F, U+1E00-1EFF,
                 U+2000-206F, U+2070-209F, U+20A0-20BF, U+2100-214F, U+2150-218F,
                 U+2190-21FF, U+2200-22FF, U+25A0-25FF, U+2600-26FF;
  size-adjust: 100%;
}
/* 600 — 한글 (400 과 같은 106%) */
@font-face {
  font-family: 'Pretendard UI';
  src: url('/fonts/Pretendard-SemiBold.woff2') format('woff2');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
  unicode-range: U+1100-11FF, U+3130-318F, U+A960-A97F, U+AC00-D7A3, U+D7B0-D7FF;
  size-adjust: 106%;
}

/* `html:root`(0,1,1) 로 테마 core.css 의 `:root`(0,1,0) 를 이긴다 — **로드 순서에 의존하지 않기 위해서다.**
   실제로 base.html 은 core.css 를 이 파일보다 **뒤에** 로드하는데도 이 선언이 이긴다(실측 확인).
   순서: 타이 보정(UI Script Fit) → Pretendard UI → 기존 테마 꼬리(그대로 유지 = 미커버 문자
   폴백이 오늘과 동일). "Public Sans" 는 없는 폰트지만 **테마 원본과의 차이를 최소화**하려고 남긴다. */
html:root {
  --bs-font-sans-serif: 'UI Script Fit', 'Pretendard UI', "Public Sans", -apple-system, BlinkMacSystemFont, "Segoe UI",
    "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
}

/* ─────────────────────────────────────────────────────────────────────
 * 3) 자기 폰트 스택을 박아 쓰는 서드파티 위젯 되돌리기
 *
 * 전 화면 실측(CSS.getPlatformFontsForNode 로 텍스트 요소를 전수 조사)에서 **여기만** 폴백으로 샜다.
 * Summernote(자료등록 화면 WYSIWYG)는 자체 CSS 가 `.note-frame/.note-popover/.note-tooltip-content`
 * 에 `font-family: sans-serif` 를 박아서 한국어가 Noto Sans KR 로 그려졌다(실측).
 * ⚠ 특이도 주의: summernote CSS 가 이 파일보다 **뒤에** 로드되므로 같은 (0,1,0) 으로는 진다.
 *   `html` 을 붙여 (0,1,1) 로 이긴다. 이 세션에서 "선언은 있는데 캐스케이드에 눌려 죽는" 사고가
 *   여러 번 있었으니 값 수정 후에는 반드시 getComputedStyle 로 실측 확인할 것.
 * ⚠ 툴바 아이콘(`[class^=note-icon]:before`)은 `font-family: summernote` 를 **의사요소에** 걸어
 *   쓰므로 건드리지 않는다(아이콘 깨짐 방지). 코드보기(.note-codable)의 monospace 도 유지된다. */
html .note-frame,
html .note-popover,
html .note-tooltip-content {
  font-family: var(--bs-font-sans-serif);
}
