/* sebul — 시스템 한글 sans 자모를 탈네모꼴로 배치하는 세벌식 글꼴 폰트
 * 폰트 계약 v2(ADR-008): 모든 규칙은 font-kku.font/jamo/context 레이어 안에 있고,
 * 자모 노드에는 계층 변수(slot·role 값 — weight/stroke/clip 포함 — 과 --fy-jamo-* 및
 * --fy-ctx-* 보정)로만 닿는다. 페이지 전용 변수(--fy-clip 등)는 쓰지 않는다.
 *
 * 하위 호환 alias(`default`, `classic`)는 런타임이 canonical resolved
 * surface인 data-fy-font="sebul"로 정규화하므로 셀렉터에 나열하지 않는다.
 *
 * 현재 재료 글꼴은 외부 웹폰트가 아니라 font-kku.css와 같은 플랫폼 스택
 * (Apple SD Gothic Neo → Malgun Gothic → Noto Sans CJK KR → sans-serif)이다.
 * 따라서 이 profile만 사용하면 폰트 CDN 요청이 발생하지 않는다. 플랫폼별 글리프
 * 차이는 의도된 fallback 계약이며, 시각 baseline도 플랫폼별로 관리한다.
 *
 * 역사적 조형 기준 — round7 재작성 v2: 프로젝트가 당시 정의한 원본 기준(commit 5bbd349
 * "desquare font reference" = J해바라기 웹폰트, 당시 site/demo.css 변수)을
 * 직접 실측해 도출했다. 다만 후속 cmap·브라우저 실측에서 배포 WOFF2 subset에는
 * conjoining jamo(U+1100)가 없고 조합 자모는 이미 시스템 폰트로 fallback했음이
 * 확인됐다. CDN은 완성 음절 비교 렌더에는 쓰였지만 자모 재료에는 쓰이지 않았다.
 * 당시 J해바라기 완성 음절의 구조는:
 *  - 초성은 topology별로 신축 (가의 ㄱ은 좁고 길게, 고의 ㄱ은 전폭 납작하게)
 *  - 세로모음은 받침이 있으면 짧아짐 (가 y0.75 vs 각의 stem은 받침 위에서 멈춤)
 *  - 받침은 y0.60~0.99로 아래로 매달림 (탈네모꼴), 겹받침 오른칸은 모음 stem 열에 정렬
 * 수치는 scripts/glyph_measure_ref.py 실측(weight 500)에서 affine 사상으로 산출.
 *
 * round8 재교정 (2026-08-10): 위 결과를 출발점으로 J해바라기 Medium(500) 음절과
 * 조합 결과의 **잉크 마스크 IoU + 외곽상자 이탈 벌점**을 목적함수로 좌표하강
 * 적합했다 (표본 32자, 셀당 150px). 평균 IoU 0.373 → 0.593,
 * 최대 bbox 편차 0.030em (round7 게이트 0.05em 통과).
 * 리듬은 J해바라기 실측 metric에 정합: 음절 pitch 0.88em(= J advance),
 * space 0.37em(= J space advance 0.3696em). 이전 0.49em은 과대였다.
 *
 * round8b 구조 교정: IoU는 "잉크가 많을수록" 좋아지므로 받침이 커지고 가로모음이
 * 굵어져도 통과한다. 그래서 탈네모틀 조형원리(샘이깊은물체, LetterSeed 15)가 말하는
 * 구조 지표를 직접 재는 `scripts/glyph_metrics.py`를 게이트로 추가했다:
 *  - 윗선 정렬 / 받침 밑선 정렬 / 민글자 밑선이 받침 글자보다 높을 것
 *  - 가로모음 bar 두께 0.100em (m 1.25→1.096, mt 1.25→1.042. 1.25는 0.114~0.120em으로 과대)
 *  - 세로모음 기둥은 받침이 붙어도 충분히 내려올 것 (한 기둥 끝 0.627 — trc 0.651→0.754)
 *  - 받침 크기는 topology와 무관하게 한 벌 (brs가 b보다 21% 컸다 → 유효 가로배율 통일)
 * 자모를 축소 배치하면 획도 같은 비율로 얇아진다. 당시 JSunflower는 700이 상한이라
 * weight로는 못 채워 slot별 외곽선(--fy-<slot>-stroke)으로 보상했다.
 * 잉크 면적비 0.822 → 0.957, 평균 IoU 0.593 → 0.619.
 *
 * family 겹침 교정 (2026-09-27): release gate 표본을 48자 → family(≈1,055자)로 넓히자 노드 쌍
 * 307개가 15%를 넘었다(옭 67%, 뇩 35%, 휵 30%, 뿬 24%). 통짜·split 받침(bw·bbw·bbrs)을 한 벌
 * 크기로 되돌리고, ㅗ/ㅛ 꼭지·ㅜ/ㅠ 내림획·ㅓ/ㅖ 팔은 slot clip으로 밀착시키고, split head는
 * tail 기둥과 밀착까지만 좁혔다. family 0쌍(최대 9.8%), 11,172자 전수 3,173 → 0쌍.
 *
 * 남은 한계(CSS 배치로 해소 불가): J해바라기는 초성 높이에 따라 중성·종성의 세로
 * 적층을 바꾸고(글의 ㅡ가 늘의 ㅡ보다 높다) 자소를 서로 용접한다. 초성 ㄱ의 사선
 * 꺾임도 conjoining ᄀ 글리프에는 없다. codepoint당 글리프 1개를 affine 배치하는
 * 방식으로는 근사만 가능하며, 그 이상은 sprite trail이다.
 */

@layer font-kku.font, font-kku.jamo, font-kku.context;

@layer font-kku.font {
  :where([data-fy-font="sebul"]) {
    --fy-font-id: sebul; /* 폰트 계약 메타데이터: CSS 도착 판정 */
    --fy-contract: 2;
    --fy-material: system; /* 재료: 플랫폼 한글 폰트 stack */
    --fy-expression-mode: sebeol; /* 세벌식 렌더링 선택. 예: sebul 전체 */
    --fy-font-jamo-depth: syllable; /* 기본 자모 깊이: 합자 모음은 완성형 head(고+ㅏ), 겹받침은 통짜(ㄼ).
                                  spec/fonts.json과 동시 변경해야 contract 게이트를 통과한다. */
    --fy-glyph-width: 0.96em; /* slot left% 기준 폭 */
    --fy-glyph-height: 1.17em; /* slot top% 기준 높이. 종성 잉크는 y 1.0em까지 내려옴 */
    --fy-glyph-gap: -0.095em; /* darwin 기준 시스템 한글 advance 0.865em에 맞춤 */
    --fy-space-width: 0.263em; /* darwin Apple SD Gothic Neo space advance 실측 */
    --fy-word-gap: 0px; /* 단어 wrapper 추가 간격은 없음 */
    --fy-line-gap: 0.12em; /* 종성 descender와 다음 줄 사이 여유 */
    --fy-font-family: "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans CJK KR", sans-serif; /* 외부 요청 없는 플랫폼 한글 폰트 stack */
    --fy-font-weight: 700; /* 축소된 자모 획 두께 보상 */
    --fy-font-stroke: 0.014em; /* 획 굵기 보상 — 시스템 자모를 slot별로 축소하면 native 음절 획보다
                                 얇아지므로 Bold(700) + 가는 외곽선으로 기준 굵기에 정합시킨다. */
    --fy-content-y: 0em; /* 비한글 content 세로 미세 보정. baseline은 CSS가 자동 정렬 */
    --fy-content-size: 1em; /* 비한글 content 크기. 1em이면 baseline이 한글과 정확히 일치 */
    --fy-content-side-bearing: 0em; /* 비한글 좌우 여백 (한글의 음수 gap 흡수) */
    --fy-content-scale-x: 1; /* 정본 폰트는 identity — 크기는 --fy-content-size로 */
    --fy-content-scale-y: 1; /* 정본 폰트는 identity — 크기는 --fy-content-size로 */
    /* Choseong — J해바라기처럼 topology별 신축. 실측 근거는 각 주석의 대표 글자 */
    --fy-tlo-top: -23%; --fy-tlo-left: 0.7%;   --fy-tlo-size: 0.834em; --fy-tlo-scale-x: 0.754; --fy-tlo-scale-y: 1.088; /* tlo: right-open 초성. 가의 ㄱ 잉크 x[0.115,0.575] y[0.015,0.52] */
    --fy-tlc-top: -21.1%; --fy-tlc-left: -0.4%; --fy-tlc-size: 0.784em; --fy-tlc-scale-x: 0.836; --fy-tlc-scale-y: 1.031; /* tlc: right-closed 초성. 한의 ㅎ x[0.065,0.545] y[-0.005,0.49] */
    --fy-t-top: -24.7%;   --fy-t-left: 10.3%;   --fy-t-size: 0.98em;    --fy-t-scale-x: 0.782;     --fy-t-scale-y: 1.073;  /* t: bottom-open 초성. 고/그의 ㄱ 전폭 x[0.025,0.75] y[0.035,0.48] */
    --fy-tt-top: -18%;  --fy-tt-left: 9.7%;  --fy-tt-size: 0.864em;    --fy-tt-scale-x: 0.891;    --fy-tt-scale-y: 0.755; /* tt: bottom-closed 초성. 글의 ㄱ x[0.025,0.75] y[0.035,0.34] */
    --fy-tls-top: -21.8%; --fy-tls-left: -8.6%; --fy-tls-size: 0.744em; --fy-tls-scale-x: 1.098;  --fy-tls-scale-y: 1.1; /* tls: split-open 초성. 의/와의 ㅇ x[0.015,0.42] y[0.0,0.42] */
    --fy-ttl-top: -19.1%; --fy-ttl-left: -7%; --fy-ttl-size: 0.772em; --fy-ttl-scale-x: 1.059;  --fy-ttl-scale-y: 0.919; /* ttl: split-closed 초성. 왕의 ㅇ 동일 */
    /* Jungseong 세로 — stem을 J 실측 열(0.605/0.635)에 정렬. 받침이 있으면 짧아진다 */
    --fy-tro-top: -7.8%;  --fy-tro-left: 32.6%; --fy-tro-size: 0.964em; --fy-tro-scale-x: 0.85; --fy-tro-scale-y: 0.852; /* tro: right-open 중성. 가의 ㅏ stem [0.605,0.715]. 소스 ᅡ의 곁줄기가 기준보다 길어(0.266 vs 0.233em) 가로 압축 — left/scale-x 짝 산출 */
    --fy-trc-top: -8.9%;  --fy-trc-left: 30.7%; --fy-trc-size: 0.912em; --fy-trc-scale-x: 0.922; --fy-trc-scale-y: 0.712; /* trc: right-closed 중성. 한의 ㅏ 기둥 끝 0.627 실측 정합 — 탈네모틀은 받침이 붙어도 기둥이 충분히 내려와야 한다(민글자 0.727에서 0.10em만 짧아짐) */
    --fy-trs-top: -12%;  --fy-trs-left: 30.9%; --fy-trs-size: 0.96em; --fy-trs-scale-x: 0.912; --fy-trs-scale-y: 0.917; /* trs: split-open tail. 의/와의 ㅣ/ㅏ stem [0.635,0.745] */
    --fy-ttr-top: -11.4%;  --fy-ttr-left: 28.8%; --fy-ttr-size: 1.03em; --fy-ttr-scale-x: 0.872; --fy-ttr-scale-y: 0.705; /* ttr: split-closed tail. 왕의 ㅏ (받침 위에서 멈춤) */
    /* Jungseong 가로 — bar 두께는 J(0.10em)에 맞춰 세로 확대(1.25). ㅗ/ㅜ는 per-jamo */
    /* 가로모음 막대 좌우 여백 — 막대가 글자 진행폭(0.865em)을 거의 다 채우면(x 0.015–0.855, 이웃 막대와
     * 0.025em) 받침 없는 글자가 이어질 때(누구보다·도로) 작은 크기에서 막대가 한 줄로 이어져 밑줄처럼
     * 읽혔다(2026-10-11 외부 제보). 기준 글꼴 완성형 막대는 x 0.030–0.835(이웃과 0.060em)다. 막대를
     * x 0.05–0.815(이웃과 0.10em, 12px에서 약 1.2px)로 좁혀 가운데 둔다 — 두께(scale-y)는 그대로. */
    --fy-m-top: -16.6%;  --fy-m-left: 1.97%;  --fy-m-size: 1em;     --fy-m-scale-x: 0.957; --fy-m-scale-y: 1.096; /* m: bottom-open 중성. 그의 ㅡ bar 두께 0.100em·[0.527,0.627] 실측 정합 (1.25는 0.114em으로 과대) */
    --fy-mt-top: -26.7%; --fy-mt-left: 1.94%; --fy-mt-size: 1.05em;    --fy-mt-scale-x: 0.915; --fy-mt-scale-y: 1.053; /* mt: bottom-closed 중성. 글/늘의 ㅡ bar 두께 0.100em 실측 정합 (1.25는 0.120em으로 과대) */
    --fy-ml-top: -29.3%; --fy-ml-left: -3.1%; --fy-ml-size: 0.81em; --fy-ml-scale-x: 1.137;    --fy-ml-scale-y: 1.57; /* ml: split-open base. 의의 ㅡ bar [0.505,0.605] x[0.015,0.62] */
    --fy-mtl-top: -31.3%; --fy-mtl-left: -1.9%; --fy-mtl-size: 0.83em; --fy-mtl-scale-x: 0.913;  --fy-mtl-scale-y: 1.64; /* mtl: split-closed base. 왕은 ㅗ per-jamo로 보정 */
    /* Jongseong — J 실측: 매달림 zone y[0.60,0.99].
     * role 1벌(--fy-jong-*)을 기본선으로 두되, J해바라기가 topology별로 받침을 다르게
     * 매다는 것이 실측으로 확인되어(가로모음 아래 b vs 세로모음 아래 brs) slot 단위로
     * 분리해 적합한다. role 값은 미선언 slot의 fallback으로 남는다.
     * scale도 다른 값과 같은 대체 체인이다(slot → 부모 slot → role). 2026-09 이전
     * 코어는 role scale을 slot scale에 곱했으므로, 그 곱을 아래 받침 slot의 scale
     * 값(host·depth·자모 규칙 모두)에 접어 넣어 렌더를 그대로 유지했다. */
    --fy-jong-main-top: 27.9%;
    --fy-jong-main-left: 2.2%;
    --fy-jong-main-size: 0.992em;
    --fy-jong-main-scale-x: 0.972;
    --fy-jong-main-scale-y: 0.878; /* jong single 기본선: 각/한/글/울의 받침 */
    --fy-jong-left-top: 26%;
    --fy-jong-left-left: 5.5%;
    --fy-jong-left-size: 0.588em;
    --fy-jong-left-scale-x: 0.961;
    --fy-jong-left-scale-y: 1.332; /* jong-left 기본선: 읽의 ㄹ */
    --fy-jong-right-top: 26.8%;
    --fy-jong-right-left: 30.9%;
    --fy-jong-right-size: 0.6em;
    --fy-jong-right-scale-x: 1;
    --fy-jong-right-scale-y: 1.223; /* jong-right 기본선: 읽의 ㄱ */
    /* single 받침 — b(가로모음 아래) / brs(세로모음 아래) / bbrs(split 아래) */
    --fy-b-top: 32.4%;    --fy-b-left: 10.1%;    --fy-b-size: 1.072em;  --fy-b-scale-x: 0.721224;  --fy-b-scale-y: 0.719082;
    --fy-brs-top: 28.3%;  --fy-brs-left: 16.6%;  --fy-brs-size: 1.008em; --fy-brs-scale-x: 0.754272; --fy-brs-scale-y: 0.770884; /* 받침은 topology와 무관하게 한 벌 크기 — b와 같은 유효 가로배율(≈0.79). 위치만 오른쪽으로 몰린다(세로모음 음절의 탈네모틀 관례) */
    --fy-bbrs-top: 48.341%; --fy-bbrs-left: -3.8%; --fy-bbrs-size: 1.042em; --fy-bbrs-scale-x: 0.966168; --fy-bbrs-scale-y: 0.709424;
    /* 겹받침 왼칸 — 초성 아래 */
    --fy-bl-top: 25.1%;   --fy-bl-left: 11.9%;   --fy-bl-size: 0.518em;  --fy-bl-scale-x: 0.923521;  --fy-bl-scale-y: 1.670328;
    --fy-blr-top: 23.2%;  --fy-blr-left: 10%;  --fy-blr-size: 0.51em; --fy-blr-scale-x: 1.038841; --fy-blr-scale-y: 1.722276;
    --fy-bbl-top: 26.7%;  --fy-bbl-left: 6.8%;  --fy-bbl-size: 0.568em; --fy-bbl-scale-x: 1.203172; --fy-bbl-scale-y: 1.503828;
    /* 겹받침 오른칸 — 모음 stem 열에 정렬 */
    --fy-br-top: 23.1%;   --fy-br-left: 30.9%;   --fy-br-size: 0.6em;  --fy-br-scale-x: 0.93;  --fy-br-scale-y: 1.567886;
    --fy-brd-top: 26.8%;  --fy-brd-left: 38.5%;  --fy-brd-size: 0.51em; --fy-brd-scale-x: 1.028; --fy-brd-scale-y: 1.581339;
    --fy-bbrd-top: 23.6%; --fy-bbrd-left: 25.8%; --fy-bbrd-size: 0.542em; --fy-bbrd-scale-x: 1.246; --fy-bbrd-scale-y: 1.660834;
  }

  /* slot stroke compensation (fit_weight.py --mode stroke) — 자모를 축소 배치하면 획도 같은
   * 비율로 얇아진다. 기준 폰트에 더 굵은 weight가 없을 때는 외곽선으로 보상한다. 값은 잉크
   * 면적비 기준 실측 적합. 이미 두께를 실측 정합한 슬롯(m, mt)은 font 기본값을 쓴다.
   * tro(ㅏ 계열)는 소스 곁줄기가 길어 가로로 0.81배 압축한다 → 세로줄기가 같은 비율로
   * 얇아지므로 외곽선으로 되살린다. 값은 줄기 두께 실측(기준 16px @150px em) 기준. */
  :where([data-fy-font="sebul"]) {
    --fy-b-stroke: 0.038em;
    --fy-bbl-stroke: 0.032em;
    --fy-bbrd-stroke: 0.032em;
    --fy-bbrs-stroke: 0.038em;
    --fy-bl-stroke: 0.038em;
    --fy-blr-stroke: 0.038em;
    --fy-br-stroke: 0.038em;
    --fy-brd-stroke: 0.038em;
    --fy-brs-stroke: 0.038em;
    --fy-ml-stroke: 0.026em;
    --fy-mtl-stroke: 0.038em;
    --fy-t-stroke: 0.026em;
    --fy-tlc-stroke: 0.038em;
    --fy-tlo-stroke: 0.038em;
    --fy-tls-stroke: 0.038em;
    --fy-trc-stroke: 0.038em;
    --fy-trs-stroke: 0.038em;
    --fy-tt-stroke: 0.038em;
    --fy-ttl-stroke: 0.038em;
    --fy-ttr-stroke: 0.038em;
    --fy-tro-stroke: 0.047em;
  }

  /* --- composite / syllable depth 전용 슬롯 -----------------------------------
   * atomic depth에서는 emit되지 않는다. 값은 실측 적합 대상이며 시드값에서 출발한다.
   * 통짜 겹받침은 topology와 무관하게 한 벌 크기다(2026-09-27 family 겹침 교정): bw·bbw는
   * brw와 같은 size·scale(잉크 ≈0.53×0.39em, 획 ≈0.08em)을 쓰고 위치만 다르다. 이전 bw는
   * native 네모꼴 IoU에 끌려 0.83×0.56em·획 0.12em의 덩어리였고(흙·옭·굵), 가로모음 bar와
   * 최대 67% 포개졌다. bw 밑선은 가로모음 홑받침 b(≈1.02~1.03em)에 맞춘다. */
  :where([data-fy-font="sebul"]) {
    --fy-mw-top: 8%; --fy-mw-left: 8%; --fy-mw-size: 0.62em; --fy-mw-scale-x: 1; --fy-mw-scale-y: 1;
    --fy-mtw-top: 6%; --fy-mtw-left: 8%; --fy-mtw-size: 0.58em; --fy-mtw-scale-x: 1; --fy-mtw-scale-y: 1;
    --fy-bw-top: 30.61%; --fy-bw-left: 4.75%; --fy-bw-size: 0.54em; --fy-bw-scale-x: 1.614492; --fy-bw-scale-y: 1.50577;
    --fy-brw-top: 26.76%; --fy-brw-left: 4.75%; --fy-brw-size: 0.54em; --fy-brw-scale-x: 1.614492; --fy-brw-scale-y: 1.50577;
    --fy-bbw-top: 61.0077%; --fy-bbw-left: 6.2%; --fy-bbw-size: 0.54em; --fy-bbw-scale-x: 1.04004; --fy-bbw-scale-y: 0.806882;
    --fy-hs-top: -5.1%; --fy-hs-left: -3.9%; --fy-hs-size: 0.852em; --fy-hs-scale-x: 1; --fy-hs-scale-y: 1;
    --fy-hts-top: -7.83%; --fy-hts-left: -2.9%; --fy-hts-size: 0.972em; --fy-hts-scale-x: 0.85; --fy-hts-scale-y: 0.833; /* 받침 head는 tail 기둥(x 0.627)과 밀착까지만 — 0.891은 오른끝(0.70)이 기둥을 덮어 hts×ttr 7~24% */
  }

  /* syllable depth 전용 미세 보정 — head가 초성+base를 대신하므로 tail과 받침의
   * 최적 위치가 atomic과 다르다. 공유 slot을 건드리지 않도록 depth로 게이트한다.
   * split 받침(bbrs·bbw)은 head 아래·tail 기둥 왼쪽에 한 벌 크기로 매단다: 잉크 윗선 ≈0.66em
   * (ㅗ계 head bar 밑과 밀착, ㅜ계 head 내림획 끝과 접촉), 밑선 ≈1.04em(bbrs ᆼ 1.033과 같은 선).
   * 이전 bbrs는 0.58×0.49em로 1.19em까지 처졌고(곽·획, glyph 상자 1.17em 밖), bbw는
   * 0.73×0.56em 덩어리가 head와 최대 24% 포개졌다. */
  :where([data-fy-font="sebul"][data-fy-vowel-depth="syllable"]) {
    --fy-trs-top: -10.5%; --fy-trs-left: 38%; --fy-trs-size: 0.94em; --fy-trs-scale-x: 0.912; --fy-trs-scale-y: 0.878;
    --fy-ttr-top: -7.5%; --fy-ttr-left: 31.6%; --fy-ttr-size: 1.018em; --fy-ttr-scale-x: 0.872; --fy-ttr-scale-y: 0.786;
    --fy-bbrs-top: 34.15%; --fy-bbrs-left: 1.77%; --fy-bbrs-size: 1.022em; --fy-bbrs-scale-x: 0.76; --fy-bbrs-scale-y: 0.744;
    --fy-bbw-top: 31.89%; --fy-bbw-left: -4.94%; --fy-bbw-size: 0.54em; --fy-bbw-scale-x: 1.614492; --fy-bbw-scale-y: 1.50577;
  }
}

@layer font-kku.jamo {
  /* 세로 모음 per-jamo 가로 보정 — 역사적 J해바라기 완성 음절의 stem 목표를 em으로 정렬
   * (ᅡ 0.38 / ᅵ 0.40 / ᅧ 0.465 / ᅥ 0.47 / ᅢ 0.50 / ᅦ 0.53) */
  :where([data-fy-font="sebul"]) :is([data-jamo="ᅥ"], [data-jamo="ᅧ"]) {
    --fy-jamo-dx: -0.065em;
    /* J의 조합용 ᅥ는 팔이 낮게 그려져 있다 — 합자 기준(터/버)의 팔 높이로 올린다 */
    --fy-jamo-dy: -0.07em;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="bbrs"][data-jamo="ᆫ"] {
    /* split 받침 ㄴ — 한 벌 크기(0.45×0.38em)로 head 아래(y 0.66~1.04, x 0.11~0.57)에 둔다.
     * 이전 값(좁고 높은 ㄴ, y 0.34~0.83)은 세로획이 head bar를 관통했다(환·횐 22%).
     * 세로획이 ㅜ계 head 내림획(x≈0.3) 왼쪽에 오도록 generic bbrs보다 0.02em 왼쪽.
     * atomic depth에서도 같은 절대값을 쓴다(depth와 무관한 자모 규칙). */
    --fy-bbrs-scale-x: 0.7533;
    --fy-bbrs-scale-y: 0.7458;
    --fy-bbrs-left: -0.63%;
    --fy-bbrs-top: 34.4%;
  }
  /* ㅜ/ㅠ계 base의 head(구/두/우)는 잉크가 em 상자에서 낮게 앉는다 — 크기는 이미
   * 기준과 같으므로(실측: fk 0.73em ≈ ref 0.73em) 위로만 올린다(-0.06em 상당).
   * 확대는 금물: 오버레이에서 "덮여 보이는" 착시로 과대 판정했다가 IoU 붕괴를
   * 실측했다(궈 best-shift 0.61→0.37). ㅗ계(고/오)는 불변. data-jamo-base 분기 */
  :where([data-fy-font="sebul"]) :is([data-fy-pos="hs"], [data-fy-pos="hts"]):is([data-jamo-base="ᅮ"], [data-jamo-base="ᅲ"]) {
    --fy-hs-top: -9%;
    --fy-hts-top: -9.9%;
    /* ㅜ계 head는 bar 오른끝이 tail(ㅓ/ㅔ/ㅣ) 기둥 밑으로, 넓은 초성(ㅃ ㅉ ㅈ ㅍ)이 tail 팔로
     * 들어간다 — 기둥과 밀착까지만 좁힌다(구 전용 0.849 보정을 ㅜ계 전체로 일반화).
     * family 감사: 뿬·줜 hts×ttr 24%, 쮀 hs×trs 15% → 10% 이하. */
    --fy-hs-scale-x: 0.95;
    --fy-hts-scale-x: 0.82;
  }
  /* head는 data-jamo가 완성형이라 특정 head를 직접 지정할 수 있다 — 웨의 우 좌측 정렬 */
  :where([data-fy-font="sebul"]) [data-fy-pos="hs"][data-jamo="우"] {
    --fy-hs-left: -8%;
  }
  /* 읽/없: tlc의 ㅇ이 기준보다 0.04em 왼쪽 (best-shift 판정 — 없 0.57→0.75, 읽 0.59→0.78) */
  :where([data-fy-font="sebul"]) [data-fy-pos="tlc"][data-jamo="ᄋ"] {
    --fy-tlc-left: 0.9%;
  }
  /* split tail 자리의 ㅓ 계열(궈/권/훼)은 기준에서 팔이 상단 1/3에 붙는다.
   * 같은 jamo 레이어에서 [data-fy-pos][data-jamo]가 위 [data-jamo] 규칙보다 특이도가
   * 높으므로 --fy-jamo-dy는 누적이 아니라 대체된다: ᅥ/ᅧ는 일반 보정 -0.07em 대신
   * -0.06em(0.01em 덜 올림), ᅦ/ᅨ는 일반 규칙에 dy가 없어 여기서 -0.06em을 새로 얻는다.
   * 렌더는 v1 그대로 유지한다(ADR-008 Open Questions). */
  :where([data-fy-font="sebul"]) :is([data-fy-pos="trs"], [data-fy-pos="ttr"]):is([data-jamo="ᅥ"], [data-jamo="ᅧ"], [data-jamo="ᅦ"], [data-jamo="ᅨ"]) {
    --fy-jamo-dy: -0.06em;
  }
  /* 받침 있는 ㅝ의 tail ㅓ — 팔(0.16em)이 head 초성 오른쪽으로 파고든다(훤·뭔 hts×ttr 17~24%).
   * 팔 왼쪽 끝만 잘라 초성과 밀착시킨다(잘라낼 x 0.50em, 노드 상자 기준 34%). */
  :where([data-fy-font="sebul"]) [data-fy-pos="ttr"][data-jamo="ᅥ"] {
    --fy-ttr-clip: inset(-1em -1em -1em 34%);
  }
  /* 받침 있는 ㅙ/ㅞ의 tail — ttr 자리는 trs보다 0.06em 왼쪽이라, 세로모음용 ᅢ/ᅦ 왼쪽 보정
   * (-0.048/-0.071em)까지 더하면 head와 20% 넘게 포개진다. tail 자리에서는 보정을 끈다
   * (head 폭은 context 레이어의 ㅙ/ㅞ 규칙). */
  :where([data-fy-font="sebul"]) [data-fy-pos="ttr"]:is([data-jamo="ᅢ"], [data-jamo="ᅦ"]) {
    --fy-jamo-dx: 0em;
  }
  :where([data-fy-font="sebul"]) :is([data-jamo="ᅢ"], [data-jamo="ᅤ"]) {
    --fy-jamo-dx: -0.048em;
  }
  :where([data-fy-font="sebul"]) :is([data-jamo="ᅦ"], [data-jamo="ᅨ"]) {
    --fy-jamo-dx: -0.071em;
  }
  :where([data-fy-font="sebul"]) [data-jamo="ᅵ"] {
    --fy-jamo-dx: -0.019em;
  }

  /* 자모별 초성 상자 보정 (glyph_fit_jamo_box.py, slot=t) —
   * 한 slot의 affine은 대표 자음 하나에만 맞는다. 나머지 자음은 여기서 잡는다. */
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄂ"]) {
    --fy-t-left: 9.64%;
    --fy-t-scale-x: 0.817;
    --fy-t-top: -21.71%;
    --fy-t-scale-y: 0.768;
    /* 세로로 많이 눌린 ㄴ(0.768) — t 자리 기본 보상(0.026em)으로는 밑획이 0.080em이라 나(tlo)의
     * ㄴ 0.107em보다 25% 넘게 얇았다(획 굵기 감사 A). 다른 자리의 외곽선 보상만큼 올린다. */
    --fy-t-stroke: 0.038em;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄃ"], [data-jamo="ᄄ"]) {
    --fy-t-left: 10.42%;
    --fy-t-scale-x: 0.771;
    --fy-t-top: -23.36%;
    --fy-t-scale-y: 0.806;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄅ"]) {
    --fy-t-left: 11.11%;
    --fy-t-scale-x: 0.747;
    --fy-t-top: -25.64%;
    --fy-t-scale-y: 0.906;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄆ"]) {
    --fy-t-left: 11.11%;
    --fy-t-scale-x: 0.757;
    --fy-t-top: -22.79%;
    --fy-t-scale-y: 0.795;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄇ"], [data-jamo="ᄈ"]) {
    --fy-t-left: 11.11%;
    --fy-t-scale-x: 0.757;
    --fy-t-top: -22.22%;
    --fy-t-scale-y: 0.801;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄉ"], [data-jamo="ᄊ"]) {
    --fy-t-left: 9.03%;
    --fy-t-scale-x: 0.8;
    --fy-t-top: -22.22%;
    --fy-t-scale-y: 0.788;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄌ"], [data-jamo="ᄍ"]) {
    --fy-t-left: 8.33%;
    --fy-t-scale-x: 0.772;
    --fy-t-top: -22.79%;
    --fy-t-scale-y: 0.796;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄎ"]) {
    --fy-t-left: 8.33%;
    --fy-t-scale-x: 0.782;
    --fy-t-top: -19.37%;
    --fy-t-scale-y: 0.71;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄐ"]) {
    --fy-t-left: 11.11%;
    --fy-t-scale-x: 0.746;
    --fy-t-top: -26.78%;
    --fy-t-scale-y: 0.932;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄑ"]) {
    --fy-t-left: 9.72%;
    --fy-t-scale-x: 0.785;
    --fy-t-top: -23.93%;
    --fy-t-scale-y: 0.806;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="t"]:is([data-jamo="ᄒ"]) {
    --fy-t-left: 7.64%;
    --fy-t-scale-x: 0.839;
    --fy-t-top: -22.22%;
    --fy-t-scale-y: 0.799;
  }

  /* slot clip은 자르는 한 변만 자르고 나머지 세 변은 -1em으로 열어 둔다(2026-10) — 0으로 두면 꾸밈의
   * 빛번짐·그림자까지 노드 상자에 갇혀 네모로 잘린다. 자르는 변 너머의 빛은 여전히 잘린다(clip은
   * 그림자를 그린 뒤에 자른다). 다각형으로 획 너비만 파내 보았지만 파낸 자리가 어두운 사각형으로
   * 남아 더 눈에 띄었다. */
  /* ㅗ/ㅛ — 가로 막대는 ㅡ와 같은 두께 0.100em(기준 글꼴 실측 0.093~0.097em, 문맥 무관)이다.
   * 2026-10 이전에는 표준 ᅩ의 긴 꼭지를 세로로 눌러(0.361/0.409) 막대가 0.040em으로 얇았다
   * — 그 옆의 그·글은 0.100em이라 한 줄에서 굵기가 두 배 차이 났다(획 굵기 감사 B 41~54%).
   * 이제 ㅡ처럼 거의 눌리지 않게 두고(막대 = 그의 ㅡ [0.44,0.54], 글의 ㅡ [0.317,0.417] 높이),
   * 길어진 꼭지는 slot clip의 위쪽만 잘라 예전 꼭지 끝(0.333em / 받침 글자 0.223em)에서
   * 시작하게 한다. 나머지 세 변은 -1em으로 열어 둔다 — 0으로 두면 꾸밈의 빛번짐·그림자까지
   * 노드 상자에 갇혀 네모로 잘린다. 굵기 보상 외곽선(0.04em)도 필요 없어 font 기본으로 돌린다. */
  :where([data-fy-font="sebul"]) :is([data-fy-pos="m"], [data-fy-pos="mt"]):is([data-jamo="ᅩ"], [data-jamo="ᅭ"]) {
    --fy-m-top: -14.9%;
    --fy-m-scale-y: 1.083;
    --fy-m-clip: inset(46.8% -1em -1em -1em);
    --fy-mt-top: -24.72%;
    --fy-mt-scale-y: 1.022;
    --fy-mt-clip: inset(47.7% -1em -1em -1em);
  }
  /* split 계열(과/와/획/왕)의 ㅗ — bar 두께 0.100em과 위치를 기준 실측에 맞춘다.
   * 이전 값(0.68/0.627)은 bar를 0.060em으로 눌러 놓아 가로획이 실처럼 얇았다. */
  :where([data-fy-font="sebul"]) :is([data-fy-pos="ml"], [data-fy-pos="mtl"]):is([data-jamo="ᅩ"], [data-jamo="ᅭ"]) {
    --fy-ml-top: -10.7%;
    --fy-ml-scale-y: 1.222;
    --fy-mtl-top: -10.6%;
    --fy-mtl-scale-y: 1.045;
  }

  /* ㅜ/ㅠ — 막대 두께는 ㅡ와 같은 0.100em. 2026-10 이전 값(0.56)은 막대를 0.053em으로 눌러
   * "두"의 ㅜ가 "크"의 ㅡ의 절반 굵기였다(사용자 지적, 획 굵기 감사 B 54%). 막대 윗선은 그대로
   * [0.42,0.52]에 두고, 길어진 내림획은 slot clip의 아래쪽만 잘라 예전 끝(0.677em)에서 멈춘다. */
  :where([data-fy-font="sebul"]) [data-fy-pos="m"]:is([data-jamo="ᅮ"], [data-jamo="ᅲ"]) {
    --fy-m-top: -0.1%;
    --fy-m-scale-y: 1.05;
    --fy-m-clip: inset(-1em -1em 35.4% -1em);
  }
  /* ㅜ/ㅠ + 받침 — 소스 ᅮ의 내림획이 기준(0.07em)보다 5배 이상 길어, 균일 스케일로는
   * "bar를 제 높이에 두면 내림획이 받침을 관통"하는 딜레마가 생긴다. bar 높이·두께를
   * 실측(bar [0.427,0.527], 두께 0.100em)에 맞춘 뒤 내림획만 slot clip으로 잘라낸다.
   * 내림획 끝은 받침 윗선(b ≈0.64em)에 밀착 — 31%(끝 0.78em)는 받침 윗획을 뚫었다
   * (육·휵 mt×b 30%). 자를 y 0.655em, 노드 원점 -0.009em, 높이 1.142em → 41.9%. */
  :where([data-fy-font="sebul"]) [data-fy-pos="mt"]:is([data-jamo="ᅮ"], [data-jamo="ᅲ"]) {
    --fy-mt-top: -11%;
    --fy-mt-scale-y: 1.088;
    --fy-mt-clip: inset(-1em -1em 41.9% -1em);
  }
  /* split 계열(워/위/월/원)의 ㅜ — mt와 같은 이유로 bar를 기준 위치·두께(0.100em)에
   * 맞추고, 과도하게 긴 내림획은 clip으로 잘라 받침/세로줄기와 충돌시키지 않는다. */
  :where([data-fy-font="sebul"]) :is([data-fy-pos="ml"], [data-fy-pos="mtl"]):is([data-jamo="ᅮ"], [data-jamo="ᅲ"]) {
    --fy-ml-top: -9.5%;
    --fy-ml-scale-y: 1.25;
    --fy-mtl-top: -6.1%;
    --fy-mtl-scale-y: 1.076;
    --fy-ml-clip: inset(-1em -1em 31% -1em);
    --fy-mtl-clip: inset(-1em -1em 31% -1em);
  }

  /* 둥근 초성(ㅇ/ㅎ)의 bottom 조합 — J 실측: 오의 ㅇ은 작은 원(x[0.285,0.595] y[0,0.47]),
   * 옷은 더 납작. ㅗ/ㅜ 기둥은 링 하단 아래에서 시작해야 관통이 없다. */
  :where([data-fy-font="sebul"]) [data-fy-pos="t"][data-jamo="ᄋ"] {
    --fy-t-top: -22.9%;
    --fy-t-left: 18.4%;
    --fy-t-size: 0.592em;
    --fy-t-scale-x: 1.053;
    --fy-t-scale-y: 1.512;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="tt"][data-jamo="ᄋ"] {
    --fy-tt-top: -21.9%;
    --fy-tt-left: 15.6%;
    --fy-tt-size: 0.584em;
    --fy-tt-scale-x: 1.153;
    --fy-tt-scale-y: 1.356;
  }

  /* 초성 ㅇ — split 슬롯(의/왕)에서도 각진 자음과 다른 원 비례를 쓴다.
   * 값은 t/tt의 ㅇ 블록과 같은 근거(J의 작은 원)에서 슬롯별로 적합. */
  :where([data-fy-font="sebul"]) [data-fy-pos="tls"][data-jamo="ᄋ"] {
    --fy-tls-top: -18.6%;
    --fy-tls-left: 3.4%;
    --fy-tls-size: 0.72em;
    --fy-tls-scale-x: 0.933;
    --fy-tls-scale-y: 1.019;
  }
  /* ㅎ 초성 + split (획/훤) — 소스 ᅙ...ᄒ 글리프가 기준 조합보다 0.07em 넓어 왼쪽으로
   * 밀려 나오고 ㅗ 기둥과 겹친다. 기준 실측 x[0.120,0.553]에 맞춰 가로 압축·우측 이동. */
  :where([data-fy-font="sebul"]) [data-fy-pos="ttl"][data-jamo="ᄒ"] {
    --fy-ttl-left: 3%;
    --fy-ttl-scale-x: 0.904;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="tls"][data-jamo="ᄒ"] {
    --fy-tls-left: 3%;
    --fy-tls-scale-x: 0.904;
  }

  :where([data-fy-font="sebul"]) [data-fy-pos="ttl"][data-jamo="ᄋ"] {
    --fy-ttl-top: -17.5%;
    --fy-ttl-left: 1.3%;
    --fy-ttl-size: 0.76em;
    --fy-ttl-scale-x: 0.908;
    --fy-ttl-scale-y: 0.919;
  }

  /* 받침 ㅇ — J해바라기는 매달린 받침 ㅇ을 각진 받침보다 작고 둥글게 그린다.
   * role 1벌(--fy-jong-main-*)로는 표현되지 않아 슬롯별로 분리한다 (강/왕/응). */
  :where([data-fy-font="sebul"]) [data-fy-pos="b"][data-jamo="ᆼ"] {
    --fy-b-top: 27.1%;
    --fy-b-left: -0.3%;
    --fy-b-size: 0.992em;
    --fy-b-scale-x: 0.982692;
    --fy-b-scale-y: 0.709424;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="brs"][data-jamo="ᆼ"] {
    --fy-brs-top: 30.7%;
    --fy-brs-left: 19.6%;
    --fy-brs-size: 1.006em;
    --fy-brs-scale-x: 0.71928; /* 받침 ㅇ은 각진 받침보다 좁다 (강 실측 폭 0.400em) */
    --fy-brs-scale-y: 0.74191;
  }
  :where([data-fy-font="sebul"]) [data-fy-pos="bbrs"][data-jamo="ᆼ"] {
    --fy-bbrs-top: 18%;
    --fy-bbrs-left: 15%;
    --fy-bbrs-size: 1.022em;
    --fy-bbrs-scale-x: 0.8748;
    --fy-bbrs-scale-y: 0.7463;
    --fy-jamo-dx: -5.6%; /* split-coda 하강 (overlap 감사 유도) */
    --fy-jamo-dy: 15.1795%;
  }

  :where([data-fy-font="sebul"]) [data-fy-pos="hs"][data-jamo="으"] {
    /* 의 head 좌측 이탈(-0.035em)로 이웃(늘) 충돌 — 우측 보정 */
    --fy-jamo-dx: 2.8%;
  }
}

@layer font-kku.context {
  /* ㅇ/ㅎ 초성 + ㅗ/ㅛ — 링이 길어(받침 글자의 tt ㅇ 끝 0.293em) 막대를 [0.357,0.457]로 조금
   * 내리고, 꼭지는 링 아랫선(0.343 / 0.26em)에서 시작하게 위쪽만 자른다. 세로 배율(두께)은
   * 자모 규칙 그대로다. */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([part~="choseong"]:is([data-jamo="ᄋ"], [data-jamo="ᄒ"])) :is([data-fy-pos="m"], [data-fy-pos="mt"]):is([data-jamo="ᅩ"], [data-jamo="ᅭ"]) {
    --fy-m-top: -14.12%;
    --fy-m-clip: inset(46.9% -1em -1em -1em);
    --fy-mt-top: -21.53%;
    --fy-mt-clip: inset(47.7% -1em -1em -1em);
  }

  /* ㄱ/ㅋ 초성 + ㅗ/ㅛ — J의 고/곡은 기둥이 길게 올라가 ㄱ 내림획과 나란히 선다
   * (인터리브). ㄱ 중앙이 비어 있어 관통이 없고, 압축이 불필요해 bar도 두껍다. */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([part~="choseong"]:is([data-jamo="ᄀ"], [data-jamo="ᄁ"], [data-jamo="ᄏ"])) :is([data-fy-pos="m"], [data-fy-pos="mt"]):is([data-jamo="ᅩ"], [data-jamo="ᅭ"]) {
    /* 막대는 다른 ㅗ와 같은 자리·두께(0.100em), 꼭지는 위쪽만 잘라 ㄱ 내림획 옆(0.143 / 0.013em)에서 시작 */
    --fy-m-top: -13.72%;
    --fy-m-scale-y: 1.062;
    --fy-m-clip: inset(28.6% -1em -1em -1em);
    --fy-mt-top: -22.17%;
    --fy-mt-scale-y: 0.975;
    --fy-mt-clip: inset(26.6% -1em -1em -1em);
  }
  /* 인터리브는 기둥 하나가 ㄱ 속 빈자리에 설 때만 성립한다. ㅛ의 오른 기둥은 ㄱ 내림획과,
   * ㄲ 속 ㅗ 기둥은 앞 ㄱ 내림획과 포개진다(쿅 26%, 굑 20%, 쿄 23%, 꼬 18%). 두꺼운 bar는
   * 두고 기둥 윗부분만 잘라 초성 밑에서 시작하게 한다 — 같은 specificity라 위 규칙 뒤에 둔다.
   * 자를 y — 받침 없음 0.343em, 받침 0.227em(노드 원점·배율은 위 ㄱ 문맥 규칙). */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([part~="choseong"]:is([data-jamo="ᄀ"], [data-jamo="ᄁ"], [data-jamo="ᄏ"])) :is([data-fy-pos="m"], [data-fy-pos="mt"])[data-jamo="ᅭ"],
  :where([data-fy-font="sebul"]) [part="glyph"]:has([part~="choseong"][data-jamo="ᄁ"]) :is([data-fy-pos="m"], [data-fy-pos="mt"])[data-jamo="ᅩ"] {
    --fy-m-clip: inset(47.4% -1em -1em -1em);
    --fy-mt-clip: inset(47.5% -1em -1em -1em);
  }

  /* ㄱ/ㄲ/ㅋ 초성 + ㅖ — 두 팔이 초성 내림획(x ≈0.46em)을 뚫는다(곗 19%, 계 18%).
   * 팔 왼쪽 끝만 잘라 내림획과 밀착(자를 x ≈0.445em). */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([part~="choseong"]:is([data-jamo="ᄀ"], [data-jamo="ᄁ"], [data-jamo="ᄏ"])) :is([data-fy-pos="tro"], [data-fy-pos="trc"])[data-jamo="ᅨ"] {
    --fy-tro-clip: inset(-1em -1em -1em 28.3%);
    --fy-trc-clip: inset(-1em -1em -1em 30.3%);
  }

  /* ㅜ/ㅠ + 받침 ㅇ — 받침 ㅇ은 b 자리에서 bar 바로 밑(0.56em)에 매달려, 잘라낸 내림획
   * (끝 0.655em)이 링 윗획과 포개진다(흉·융 21%). 내림획 끝까지 링을 내린다 — 링 밑선이
   * 다른 가로모음 받침(≈1.02em)과 같아진다. */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([data-fy-pos="mt"]:is([data-jamo="ᅮ"], [data-jamo="ᅲ"])) [data-fy-pos="b"][data-jamo="ᆼ"] {
    --fy-ctx-dy: 0.095em;
  }

  /* ㅙ/ㅞ — tail ㅐ/ㅔ가 넓어 head가 tail 첫 기둥까지 덮는다(괘·뽸 hs×trs 23%, 괭·뾓
   * hts×ttr 34%). native도 ㅙ/ㅞ에서는 head를 55% 폭으로 줄인다. tail 첫 기둥과 밀착까지만
   * head를 좁힌다(받침 있는 tail의 ᅢ/ᅦ 왼쪽 보정은 jamo 레이어에서 껐다). */
  :where([data-fy-font="sebul"]) [part="glyph"]:has([data-fy-pos="trs"][data-jamo="ᅢ"]) [data-fy-pos="hs"] {
    --fy-hs-scale-x: 0.82;
  }
  :where([data-fy-font="sebul"]) [part="glyph"]:has([data-fy-pos="ttr"]:is([data-jamo="ᅢ"], [data-jamo="ᅦ"])) [data-fy-pos="hts"] {
    --fy-hts-scale-x: 0.78;
  }
}
