/*
 * DayBeau self-hosted fonts -- Phase 1b asset optimization.
 *
 * Spectral (SIL OFL 1.1, Google Fonts) -- headline/quote serif only
 * (constitution: H1/H2/quotes/big-number typography). Weights 300/400/500/600
 * + italic 300/400, matching the constitution's typography ladder exactly.
 * License: ./spectral/OFL.txt
 *
 * Pretendard Variable (SIL OFL 1.1, github.com/orioncactus/pretendard) --
 * body/UI sans (constitution: '본문·UI·라벨 = Pretendard Variable'). Self-hosted
 * because jsDelivr (the previous CDN source) is blocked in mainland China,
 * the site's primary target market.
 * License: ./pretendard/LICENSE.txt
 *
 * NOTE on Pretendard glyph coverage: these 16 files are Pretendard's own
 * pre-built 'dynamic subset' chunks (github.com/orioncactus/pretendard
 * v1.3.9, woff2-dynamic-subset/), selected to cover every non-Hangul
 * character actually found rendering on the 39 source .dc.html files
 * (see docs/ASSET_OPTIMIZATION_REPORT.md for the scan method and full
 * character list). They were used as-is rather than re-subset locally
 * because the only font-subsetting tool available in this environment
 * (harfbuzz's hb-subset) cannot decode WOFF2 input here (no brotli glue
 * compiled in) and no network install of fonttools/pyftsubset was done.
 * Because Pretendard's own chunking groups characters by co-occurrence
 * frequency in Korean corpora rather than by script, a handful of common
 * Hangul syllables ride along in some of these chunks as an accepted
 * side effect -- see the report for the full disclosure. This does NOT
 * reintroduce Noto Serif KR (a much larger, separate font family that
 * this project deliberately excludes -- see report 'Font decisions').
 *
 * ROUND 2 FIX (Codex FAIL item 3): 5 of these chunks' unicode-range
 * declarations previously claimed coverage for 繁(U+7E41)/中(U+4E2D)/
 * 日(U+65E5)/本(U+672C)/語(U+8A9E) that the chunk's actual binary cmap does
 * not contain (verified with `fontkitten`'s hasGlyphForCodePoint against
 * all 16 self-hosted .woff2 files, not just the declared-range text the
 * original audit compared against -- see docs/ASSET_OPTIMIZATION_REPORT.md
 * §6 "Round 2 correction"). Declaring a codepoint a font doesn't actually
 * have wastes a download (the browser fetches the chunk because
 * unicode-range matched) for a character that still won't render from it.
 * Those 5 ranges were trimmed to match the real cmap. They, plus ท/ย/ไ
 * (U+0E17/U+0E22/U+0E44) and 简(U+7B80), are the site's language-switcher
 * labels (`langs = ['EN','繁中','简中','日本語','ไทย']`) -- Pretendard has no
 * glyphs for any of the 9 at all, in any of its 92 upstream chunks, so no
 * amount of re-subsetting fixes this; per the supplementary remediation
 * plan item 7 the language switcher is being reduced to EN-only, which
 * makes the gap moot rather than something to design around here.
 *
 * 2026-09-28 Representative Decision 29: translated Chinese, Japanese,
 * Thai, and Arabic pages use device-default fonts. Pretendard Variable
 * subsets and the Pretendard Hangul Fallback and Noto Serif KR local
 * bridges now exclude kana, Han, and fullwidth forms; Pretendard Fallback
 * and Spectral Fallback now exclude Arabic. Korean fonts otherwise capture
 * kana and Han first and show Korean glyph forms, while Latin local
 * fallbacks capture Arabic first. These unicode-range exclusions pass those
 * scripts to device fonts selected for the html lang. English and Korean
 * pages have no visible affected characters, so their appearance does not
 * change. This supersedes the earlier "language switcher is being reduced
 * to EN-only" note: the switcher now renders published languages from
 * i18n/languages.json, and each link's lang lets device fonts choose.
 *
 * 2026-09-28: missing characters in additional languages (es, tr, and vi)
 * are filled by Inter (the original design for Pretendard Latin) and the
 * Spectral Vietnamese subset. Inter faces limit unicode-range to letters
 * only and are declared before Pretendard faces, so Pretendard is used for
 * overlapping characters.
 */

/* ===================== Spectral (serif -- H1/H2/quotes/big numbers only) ===================== */

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('./spectral/spectral-500-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('./spectral/spectral-500-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('./spectral/spectral-600-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('./spectral/spectral-600-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300italic-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400italic-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('./spectral/spectral-500-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Spectral';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('./spectral/spectral-600-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 300;
  font-display: swap;
  src: url('./spectral/spectral-300italic-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Spectral';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('./spectral/spectral-400italic-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./inter/inter-latin.woff2') format('woff2-variations');
  unicode-range: U+00A1, U+00BF, U+00C0-00D6, U+00D8-00F6, U+00F8-00FF, U+0131, U+0152-0153;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./inter/inter-latin-ext.woff2') format('woff2-variations');
  unicode-range: U+0100-0130, U+0132-0151, U+0154-024F, U+1E00-1E9F, U+1EF2-1EFF;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./inter/inter-vietnamese.woff2') format('woff2-variations');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+1EA0-1EF9;
}

/* ===================== Pretendard Variable (sans -- body/UI/labels) ===================== */

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.71.woff2') format('woff2-variations');
  unicode-range: U+81-82, U+84, U+a2-a5, U+a7-a8, U+aa, U+ac, U+b1-b3, U+b6, U+b8-ba, U+bc-be, U+c0, U+c2, U+c6-cb, U+ce-d0, U+d4, U+d8-d9, U+db-dc, U+de-df, U+e6, U+eb, U+ee-f0, U+f4, U+f7-f9, U+fb, U+fe-ff, U+111, U+126-127, U+132-133, U+138, U+13f-142, U+149-14b, U+152-153, U+166-167, U+2bc, U+2c7, U+2d0, U+2d8-2d9, U+2db-2dd, U+391-394, U+396-3a1, U+3a3-3a9, U+3b2-3b6, U+3b8, U+3bc, U+3be-3c1, U+3c3-3c9, U+2010, U+2015-2016, U+2018-2019, U+201b, U+201f-2021, U+2025, U+2030, U+2033-2036, U+203c, U+203e, U+2042, U+2074, U+207a-207f, U+2081-2084, U+2109, U+2113, U+2116, U+2121, U+2126, U+212b, U+2153-2154;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.75.woff2') format('woff2-variations');
  unicode-range: U+B4, U+20A9, U+20AC, U+2190, U+24D8, U+2502, U+2514, U+2592, U+25C7-25C8, U+2663, U+339E, U+AC38, U+AD76, U+AE84, U+AECC, U+B07D, U+B0B1, U+B215, U+B2A0, U+B310, U+B3D7, U+B52A, U+B618, U+B775, U+B797, U+BCD5, U+BD59, U+BE80, U+BEA8, U+BED1, U+BEE4-BEE5, U+C060, U+C2EF, U+C329, U+C3DC, U+C597, U+C5BD, U+C5E5, U+C69C, U+C9D6, U+CA29, U+CA5C, U+CA84, U+CC39, U+CC3B, U+CE89, U+CEE5, U+CF65, U+CF85, U+D058, U+D145, U+D22D, U+D325, U+D37D, U+D3AD, U+D769;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.77.woff2') format('woff2-variations');
  unicode-range: U+2103, U+2463, U+25C6, U+25CB, U+266C, U+3001, U+300A, U+314F, U+AC2F, U+AC4D, U+ADC4, U+ADE4, U+AE41, U+AE4D-AE4E, U+AED1, U+AFB9, U+B0E0, U+B299, U+B365, U+B46C, U+B480, U+B4C8, U+B7B4, U+B819, U+B918, U+BAAB, U+BAB9, U+BE8F, U+BED7, U+C0EC, U+C19F, U+C1A5, U+C3D9, U+C464, U+C53D, U+C553, U+C570, U+C5CC, U+C633, U+C6A4, U+C7A3, U+C7A6, U+C886, U+C9D9-C9DA, U+C9EC, U+CA0C, U+CC21, U+CD1B, U+CD78, U+CDC4, U+CEF8, U+CFE4, U+D0A5, U+D0B5, U+D0EC, U+D15D, U+D188, U+D23C, U+D2AC, U+D729, U+D79B;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.78.woff2') format('woff2-variations');
  unicode-range: U+2039-203A, U+223C, U+25B3, U+25B7, U+25BD, U+25CF, U+266A, U+3002, U+300B, U+33A1, U+AC94, U+AEBE, U+AECD, U+AF08, U+AF41, U+AF49, U+B010, U+B053, U+B109, U+B11B, U+B128, U+B154, U+B291, U+B2E6, U+B301, U+B385, U+B525, U+B5B4, U+B729, U+B72F, U+B738, U+B7FF, U+B837, U+B975, U+BA67, U+BB47, U+BC1F, U+BD90, U+BFD4, U+C27C, U+C324, U+C379, U+C3E0, U+C465, U+C53B, U+C58C, U+C610, U+C653, U+C6CD, U+C813, U+C82F, U+C999, U+C9E0, U+CAC4, U+CAD3, U+CBD4, U+CC10, U+CC22, U+CCB8, U+CCBC, U+CDA5, U+CE84, U+CEA3, U+CF67, U+CFE1, U+D241, U+D30D, U+D31C, U+D391, U+D401, U+D479, U+D5C9, U+D5DB, U+D649, U+D6D4;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.79.woff2') format('woff2-variations');
  unicode-range: U+B0, U+E9, U+2193, U+2462, U+260E, U+261E, U+300E-300F, U+314D, U+AC89, U+AC9C, U+ACC1, U+AD04, U+AD75, U+AD7D, U+AE45, U+AE61, U+AF42, U+B0AB, U+B0AF, U+B0B3, U+B12C, U+B194, U+B1A8, U+B220, U+B258, U+B284, U+B2FF, U+B315, U+B371, U+B3D4-B3D5, U+B460, U+B527, U+B534, U+B810, U+B818, U+B98E, U+BA55, U+BBAC, U+BC0B, U+BC40, U+BCA1, U+BCCD, U+BD93, U+BE54, U+BE5A, U+BF08, U+BF50, U+BF55, U+BFDC, U+C0C0, U+C0D0, U+C0F4, U+C100, U+C11E, U+C170, U+C20D, U+C274, U+C290, U+C308, U+C369, U+C539, U+C587, U+C5FF, U+C6EC, U+C70C, U+C7AD, U+C7C8, U+C83C, U+C881, U+CB48, U+CC60, U+CE69, U+CE6B, U+CE75, U+CF04, U+CF08, U+CF55, U+CF70, U+CFFC, U+D0B7, U+D1A8, U+D2C8, U+D384, U+D47C, U+D48B, U+D5DD, U+D5E8, U+D720, U+D759;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.80.woff2') format('woff2-variations');
  unicode-range: U+E0, U+E2, U+395, U+3B7, U+3BA, U+2460-2461, U+25A0, U+3010-3011, U+314A, U+314C, U+AD49, U+AE0B, U+AE0D, U+AE43, U+AE5D, U+AECF, U+AF3C, U+AF64, U+AFD4, U+B080, U+B084, U+B0C5, U+B10C, U+B1E8, U+B2AC, U+B36E, U+B451, U+B515, U+B540, U+B561, U+B6AB, U+B6B1, U+B72C, U+B730, U+B744, U+B800, U+B8EC, U+B8F0, U+B904, U+B968, U+B96D, U+B987, U+B9D9, U+BB36, U+BB49, U+BC2D, U+BC43, U+BCF6, U+BD89, U+BE57, U+BE61, U+BED4, U+C090, U+C130, U+C148, U+C19C, U+C2F9, U+C36C, U+C37C, U+C384, U+C3DF, U+C575, U+C584, U+C660, U+C719, U+C816, U+CA4D, U+CA54, U+CABC, U+CB49, U+CC14, U+CFF5, U+D004, U+D038, U+D0B4, U+D0D3, U+D0E0, U+D0ED, U+D131, U+D1B0, U+D31F, U+D33D, U+D3A0, U+D3AB, U+D514, U+D584, U+D6A1, U+D6CC, U+D749, U+D760, U+D799;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.81.woff2') format('woff2-variations');
  unicode-range: U+24, U+60, U+3B9, U+3BB, U+3BD, U+2191, U+2606, U+300C-300D, U+3131, U+3134, U+3139, U+3141-3142, U+3148, U+3161, U+3163, U+321C, U+AC31, U+AC77, U+AC9F, U+ACB9, U+ACF0-ACF1, U+ACFD, U+AD73, U+AF3D, U+B00C, U+B04A, U+B057, U+B0C4, U+B188, U+B1CC, U+B214, U+B2DB, U+B2EE, U+B304, U+B4ED, U+B518, U+B5BC, U+B625, U+B69C-B69D, U+B7AC, U+B801, U+B86C, U+B959, U+B95C, U+B985, U+BA48, U+BB58, U+BC0C, U+BC38, U+BC85, U+BC9A, U+BF40, U+C068, U+C0BD, U+C0CC, U+C12F, U+C149, U+C1E0, U+C22B, U+C22D, U+C250, U+C2FC, U+C300, U+C313, U+C370, U+C3D8, U+C557, U+C580, U+C5E3, U+C62E, U+C634, U+C6F0, U+C74D, U+C783, U+C78E, U+C796, U+C7BC, U+C92C, U+CA4C, U+CC1C, U+CC54, U+CC59, U+CE04, U+CF30, U+CFC4, U+D140, U+D321, U+D38C, U+D399, U+D54F, U+D587, U+D5D0, U+D6E8, U+D770;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.82.woff2') format('woff2-variations');
  unicode-range: U+D7, U+EA, U+FC, U+2192, U+25BC, U+3000, U+3137, U+3145, U+315C, U+AC13, U+AC71, U+AC90, U+ACB8, U+ACE7, U+AD7F, U+AE50, U+AEF4, U+AF34, U+AFBC, U+B048, U+B09A, U+B0AD, U+B0BC, U+B113, U+B125, U+B141, U+B20C, U+B2D9, U+B2ED, U+B367, U+B369, U+B374, U+B3CB, U+B4EC, U+B611, U+B760, U+B81B, U+B834, U+B8B0, U+B8E1, U+B989, U+B9D1, U+B9E1, U+B9FA, U+BA4D, U+BA78, U+BB35, U+BB54, U+BBF9, U+BC11, U+BCB3, U+BD05, U+BD95, U+BDD4, U+BE10, U+BED0, U+BF51, U+C0D8, U+C232, U+C2B7, U+C2EB, U+C378, U+C500, U+C52C, U+C549, U+C568, U+C598, U+C5C9, U+C61B, U+C639, U+C67C, U+C717, U+C78A, U+C80A, U+C90C-C90D, U+C950, U+C9E7, U+CBE4, U+CCA9, U+CCE4, U+CDB0, U+CE78, U+CE94, U+CE98, U+CF8C, U+D018, U+D034, U+D0F1, U+D1B1, U+D280, U+D2F8, U+D338, U+D380, U+D3B4, U+D610, U+D69F, U+D6FC, U+D758;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.83.woff2') format('woff2-variations');
  unicode-range: U+e7, U+2022, U+203b, U+25c0, U+2605, U+2661, U+3147, U+318d, U+acaa, U+acbc, U+ad1c, U+ae4a, U+ae5c, U+b044, U+b054, U+b0c8-b0c9, U+b2a6, U+b2d0, U+b35c, U+b364, U+b428, U+b454, U+b465, U+b4b7, U+b4e3, U+b51c, U+b5a1, U+b784, U+b790, U+b7ab, U+b7f4, U+b82c, U+b835, U+b8e9, U+b8f8, U+b9d8, U+b9f9, U+ba5c, U+ba64, U+babd, U+bb18, U+bb3b, U+bbff, U+bc0d, U+bc45, U+bc97, U+bcbc, U+be45, U+be75, U+be7c, U+bfcc, U+c0b6, U+c0f7, U+c14b, U+c2b4, U+c30d, U+c4f8, U+c5bb, U+c5d1, U+c5e0, U+c5ee, U+c5fd, U+c606, U+c6c5, U+c6e0, U+c708, U+c81d, U+c820, U+c824, U+c878, U+c918, U+c96c, U+c9e4, U+c9f1, U+cc2e, U+cd09, U+cea1, U+cef5, U+cef7, U+cf64, U+cf69, U+cfe8, U+d035, U+d0ac, U+d230, U+d234, U+d2f4, U+d31d, U+d575, U+d578, U+d608, U+d614, U+d718, U+d751, U+d761, U+d78c, U+d790;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.84.woff2') format('woff2-variations');
  unicode-range: U+2665, U+3160, U+AC12, U+AC14, U+AC16, U+AC81, U+AD34, U+ADE0, U+AE54, U+AEBC, U+AF2C, U+AFC0, U+AFC8, U+B04C, U+B08C, U+B099, U+B0A9, U+B0AC, U+B0AE, U+B0B8, U+B123, U+B179, U+B2E5, U+B2F7, U+B4C0, U+B531, U+B538, U+B545, U+B550, U+B5A8, U+B6F0, U+B728, U+B73B, U+B7AD, U+B7ED, U+B809, U+B864, U+B86D, U+B871, U+B9BF, U+B9F5, U+BA40, U+BA4B, U+BA58, U+BA87, U+BAAC, U+BBC0, U+BC16, U+BC34, U+BD07, U+BD99, U+BE59, U+BFD0, U+C058, U+C0E4, U+C0F5, U+C12D, U+C139, U+C228, U+C529, U+C5C7, U+C635, U+C637, U+C735, U+C77D, U+C787, U+C789, U+C8C4, U+C989, U+C98C, U+C9D0, U+C9D3, U+CC0C, U+CC99, U+CD0C, U+CD2C, U+CD98, U+CDA4, U+CE59, U+CE60, U+CE6D, U+CEA0, U+D0D0-D0D1, U+D0D5, U+D14D, U+D1A4, U+D29C, U+D2F1, U+D301, U+D39C, U+D3BC, U+D4E8, U+D540, U+D5EC, U+D640, U+D750;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.85.woff2') format('woff2-variations');
  unicode-range: U+5e, U+25b2, U+25b6, U+314e, U+ac24, U+ace1, U+ace4, U+ae68, U+af2d, U+b0d0, U+b0e5, U+b150, U+b155, U+b193, U+b2c9, U+b2dd, U+b3c8, U+b3fc, U+b410, U+b458, U+b4dd, U+b5a0, U+b5a4, U+b5bb, U+b7b5, U+b838, U+b840, U+b86f, U+b8f9, U+b960, U+b9e5, U+bab8, U+bb50, U+bc1d, U+bc24-bc25, U+bca8, U+bcbd, U+bd04, U+bd10, U+bd24, U+be48, U+be5b, U+be68, U+c05c, U+c12c, U+c140, U+c15c, U+c168, U+c194, U+c219, U+c27d, U+c2a8, U+c2f1, U+c2f8, U+c368, U+c554-c555, U+c559, U+c564, U+c5d8, U+c5fc, U+c625, U+c65c, U+c6b1, U+c728, U+c794, U+c84c, U+c88c, U+c8e0, U+c8fd, U+c998, U+c9dd, U+cc0d, U+cc30, U+ceec, U+cf13, U+cf1c, U+cf5c, U+d050, U+d07c, U+d0a8, U+d134, U+d138, U+d154, U+d1f4, U+d2bc, U+d329, U+d32c, U+d3d0, U+d3f4, U+d3fc, U+d56b, U+d5cc, U+d600-d601, U+d639, U+d6c8, U+d754, U+d765;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.86.woff2') format('woff2-variations');
  unicode-range: U+3c-3d, U+2026, U+24d2, U+314b, U+ac11, U+acf3, U+ad74, U+ad81, U+adf9, U+ae34, U+af43, U+afb8, U+b05d, U+b07c, U+b110, U+b118, U+b17c, U+b180, U+b18d, U+b192, U+b2cc, U+b355, U+b378, U+b4a4, U+b4ef, U+b78d, U+b799, U+b7a9, U+b7fd, U+b807, U+b80c, U+b839, U+b9b4, U+b9db, U+ba3c, U+bab0, U+bba4, U+bc94, U+be4c, U+c154, U+c1c4, U+c26c, U+c2ac, U+c2ed, U+c4f4, U+c55e, U+c561, U+c571, U+c5b5, U+c5c4, U+c654-c655, U+c695, U+c6e8, U+c6f9, U+c724, U+c751, U+c775, U+c7a0, U+c7c1, U+c874, U+c880, U+c9d5, U+c9f8, U+cabd, U+cc29, U+cc2c, U+cca8, U+ccab, U+ccd0, U+ce21, U+ce35, U+ce7c, U+ce90, U+cee8, U+cef4, U+cfe0, U+d070, U+d0b9, U+d0c1, U+d0c4, U+d0c8, U+d15c, U+d1a1, U+d2c0, U+d300, U+d314, U+d3ed, U+d478, U+d480, U+d48d, U+d508, U+d53d, U+d5e4, U+d611, U+d61c, U+d68d, U+d6a8, U+d798;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.87.woff2') format('woff2-variations');
  unicode-range: U+23, U+25, U+5f, U+a9, U+ac08, U+ac78, U+aca8, U+acac, U+ace8, U+ad70, U+adc0, U+addc, U+b137, U+b140, U+b208, U+b290, U+b2f5, U+b3c5, U+b3cc, U+b420, U+b429, U+b529, U+b530, U+b77d, U+b79c, U+b7a8, U+b7c9, U+b7f0, U+b7fc, U+b828, U+b860, U+b9ad, U+b9c1, U+b9c9, U+b9dd-b9de, U+b9e8, U+ba38-ba39, U+babb, U+bc00, U+bc8c, U+bca0, U+bca4, U+bcd1, U+bcfc, U+bd09, U+bdf0, U+be60, U+c0ad, U+c0b4, U+c0bc, U+c190, U+c1fc, U+c220, U+c288, U+c2b9, U+c2f6, U+c528, U+c545, U+c558, U+c5bc, U+c5d4, U+c600, U+c644, U+c6c0, U+c6c3, U+c721, U+c798, U+c7a1, U+c811, U+c838, U+c871, U+c904, U+c990, U+c9dc, U+cc38, U+cc44, U+cca0, U+cd1d, U+cd95, U+cda9, U+ce5c, U+cf00, U+cf58, U+d150, U+d22c, U+d305, U+d328, U+d37c, U+d3f0, U+d551, U+d5a5, U+d5c8, U+d5d8, U+d63c, U+d64d, U+d669, U+d734, U+d76c;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.88.woff2') format('woff2-variations');
  unicode-range: U+26, U+2b, U+3e, U+40, U+7e, U+ac01, U+ac19, U+ac1d, U+aca0, U+aca9, U+acb0, U+ad8c, U+ae09, U+ae38, U+ae40, U+aed8, U+b09c, U+b0a0, U+b108, U+b204, U+b298, U+b2d8, U+b2eb-b2ec, U+b2f4, U+b313, U+b358, U+b450, U+b4e0, U+b54c, U+b610, U+b780, U+b78c, U+b791, U+b8e8, U+b958, U+b974, U+b984, U+b9b0, U+b9bc-b9bd, U+b9ce, U+ba70, U+bbfc, U+bc0f, U+bc15, U+bc1b, U+bc31, U+bc95, U+bcc0, U+bcc4, U+bd81, U+bd88, U+c0c8, U+c11d, U+c13c, U+c158, U+c18d, U+c1a1, U+c21c, U+c4f0, U+c54a, U+c560, U+c5b8, U+c5c8, U+c5f4, U+c628, U+c62c, U+c678, U+c6cc, U+c808, U+c810, U+c885, U+c88b, U+c900, U+c988, U+c99d, U+c9c8, U+cc3d-cc3e, U+cc45, U+cd08, U+ce20, U+cee4, U+d074, U+d0a4, U+d0dd, U+d2b9, U+d3b8, U+d3c9, U+d488, U+d544, U+d559, U+d56d, U+d588, U+d615, U+d648, U+d655, U+d658, U+d65c;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.89.woff2') format('woff2-variations');
  unicode-range: U+d, U+7c, U+ac10, U+ac15, U+ac74, U+ac80, U+ac83, U+acc4, U+ad11, U+ad50, U+ad6d, U+adfc, U+ae00, U+ae08, U+ae4c, U+b0a8, U+b124, U+b144, U+b178, U+b274, U+b2a5, U+b2e8, U+b2f9, U+b354, U+b370, U+b418, U+b41c, U+b4f1, U+b514, U+b798, U+b808, U+b824-b825, U+b8cc, U+b978, U+b9d0, U+b9e4, U+baa9, U+bb3c, U+bc18, U+bc1c, U+bc30, U+bc84, U+bcf5, U+bcf8, U+bd84, U+be0c, U+be14, U+c0b0, U+c0c9, U+c0dd, U+c124, U+c2dd, U+c2e4, U+c2ec, U+c54c, U+c57c-c57d, U+c591, U+c5c5-c5c6, U+c5ed, U+c608, U+c640, U+c6b8, U+c6d4, U+c784, U+c7ac, U+c800-c801, U+c9c1, U+c9d1, U+cc28, U+cc98, U+cc9c, U+ccad, U+cd5c, U+cd94, U+cd9c, U+cde8, U+ce68, U+cf54, U+d0dc, U+d14c, U+d1a0, U+d1b5, U+d2f0, U+d30c, U+d310, U+d398, U+d45c, U+d50c, U+d53c, U+d560, U+d568, U+d589, U+d604, U+d6c4, U+d788;
}

@font-face {
  font-family: 'Pretendard Variable';
  font-style: normal;
  font-weight: 45 920;
  font-display: swap;
  src: url('./pretendard/woff2-dynamic-subset/PretendardVariable.subset.91.woff2') format('woff2-variations');
  unicode-range: U+20-22, U+27-2a, U+2c-39, U+3a-3b, U+3f, U+41-4e, U+4f-5d, U+61-7b, U+7d, U+a0-a1, U+ab, U+ad-ae, U+b7, U+bb, U+bf, U+2013-2014, U+201c-201d, U+2122, U+ac00, U+ace0, U+ae30, U+b2e4, U+b85c, U+b9ac, U+c0ac, U+c2a4, U+c2dc, U+c774, U+c778, U+c9c0, U+d558;
}

/* ===================== Metric-matched fallbacks (layout-shift mitigation) ===================== */
/*
 * These synthesize a local-system-font stand-in sized/positioned to closely
 * match Spectral/Pretendard's own vertical metrics and average glyph width,
 * so the swap from fallback -> webfont (font-display: swap) causes minimal
 * reflow/CLS. Values were computed from real metrics extracted directly out
 * of the actual font files (OS/2 sTypoAscender/sTypoDescender/sTypoLineGap,
 * head.unitsPerEm, and the true average advance width of a-z from hmtx/cmap
 * -- not the OS/2 xAvgCharWidth field, which is unreliable on Pretendard
 * because it is skewed by full-width CJK glyphs baked into the base font).
 * See docs/ASSET_OPTIMIZATION_REPORT.md for the derivation and raw numbers.
 */

@font-face {
  font-family: 'Spectral Fallback';
  src: local('Georgia'), local('Times New Roman');
  unicode-range: U+0-5FF, U+700-74F, U+780-86F, U+900-FB4F, U+FE00-FE6F, U+FF00-10FFFF;
  size-adjust: 100.65%;
  ascent-override: 105.22%;
  descent-override: 46.00%;
  line-gap-override: 0.00%;
}

@font-face {
  font-family: 'Pretendard Fallback';
  src: local('Arial'), local('Helvetica Neue'), local('Helvetica');
  unicode-range: U+0-5FF, U+700-74F, U+780-86F, U+900-FB4F, U+FE00-FE6F, U+FF00-10FFFF;
  size-adjust: 103.42%;
  ascent-override: 92.07%;
  descent-override: 23.32%;
  line-gap-override: 0.00%;
}

/*
 * ROUND 2 ADDITION (Codex FAIL item 4): temporary Hangul bridge, NOT Noto
 * Serif KR.
 *
 * The exclusion of Noto Serif KR itself is still correct and permanent --
 * see the Noto section of docs/ASSET_OPTIMIZATION_REPORT.md §6 for the
 * full reasoning (constitution mandates all-English copy; Noto is a large
 * CJK font family this project deliberately doesn't ship). But one of the
 * two live routes that currently still contain genuine (non-comment,
 * non-placeholder, non-alt) Korean text is NOT a hypothetical: DayBeau
 * Treatments.dc.html is `status:"ready"`, `url:"/en/treatments/"`,
 * `currentHost:["gangnam"]` in tools/route-manifest.json -- i.e. live
 * today -- and its JS-literal treatment names/filter labels are still in
 * Korean ('콜라겐 본딩 프로그램', '추천순', ...). Arial/Helvetica (the
 * 'Pretendard Fallback' face above) have zero Hangul glyphs, so without
 * this bridge that text falls through to the browser's un-named,
 * automatic last-resort CJK substitution -- functionally not tofu, but an
 * uncontrolled font swap on a live page.
 *
 * (DayBeau Thermage Tip Process.dc.html was reported in round 1 as the
 * OTHER live route with Korean text -- that was wrong. Its actual
 * route-manifest.json record is `url:null`, `currentHost:[]`,
 * `status:"blocked"` -- not live, not routed. Corrected here; that page
 * does not need this bridge.)
 *
 * Fix chosen: name explicit Korean system fonts as a fallback family,
 * NOT a self-hosted Noto subset. Rationale: (a) zero added bytes --
 * local() only, no network fetch; (b) the broken strings are body/UI text
 * (treatment names, filter labels), not H1/H2/quote content, so Noto
 * SERIF KR would have been the wrong family for them even if shipped;
 * (c) avoids re-introducing the CJK font weight the constitution's "전
 * 텍스트 EN" intent excludes, for a defect that's slated to be fixed as
 * content, not typography.
 *
 * REMOVAL CONDITION: delete this @font-face and its entry in the two
 * usage stacks below once Treatments.dc.html's Korean JS-literal strings
 * are translated to English (tracked as a content defect, not a font
 * requirement -- see report §6/§7). At that point no live route needs
 * Hangul coverage and this bridge becomes dead weight.
 */
@font-face {
  font-family: 'Pretendard Hangul Fallback';
  src: local('Apple SD Gothic Neo'), local('Malgun Gothic'), local('Noto Sans KR'), local('NanumGothic');
  unicode-range: U+0-303F, U+3100-31EF, U+3200-33FF, U+4DC0-4DFF, U+A000-F8FF, U+FB00-FEFF, U+FFF0-10FFFF;
}

/*
 * ROUND 3 ADDITION (Codex R2 item 4): the sans bridge above has no serif
 * counterpart, but the serif stack needs one too. `DayBeau Treatments.dc.html`
 * (the same live, `status:"ready"` route the sans bridge above was added
 * for) sets Korean text directly in the SERIF stack, not just the sans one
 * -- e.g. line 101's H1 and line 166/210's category labels/slogan all use
 * `font-family:'Spectral','Noto Serif KR',serif` verbatim (33 occurrences
 * across the 39 .dc.html files; only Treatments among them is live -- the
 * other 4 are Seal Kit / Thermage Tip Process / Visual Tone / lab, all
 * non-routed per tools/route-manifest.json, same check as the sans bridge
 * above). Today those pages load 'Noto Serif KR' from the Google Fonts CDN
 * `<link>` still present in their own <helmet> (a Phase 2 concern, not
 * touched here) -- but once that CDN link is replaced by this self-hosted
 * fonts.css (the whole point of self-hosting), 'Noto Serif KR' would have
 * no @font-face backing it at all, and this literal, unmodifiable (.dc.html
 * is frozen) font-family name would fall through to the browser's
 * uncontrolled last-resort CJK substitution -- exactly the same defect the
 * sans bridge above exists to prevent, just on the serif side.
 *
 * Fix: register 'Noto Serif KR' itself (the literal name already baked
 * into every affected .dc.html's inline style -- not a new stack entry
 * that would require editing those frozen files) as a local()-only
 * system-font bridge, matched to serif-leaning Korean system fonts where
 * available (falling through gracefully where they aren't -- local()
 * entries that don't match the visitor's OS are simply skipped, same as
 * the sans bridge's mixed OS-specific list). Zero added bytes -- local()
 * only, no network fetch, no self-hosted Noto binary shipped (Noto Serif
 * KR the *font family* itself remains permanently excluded, per the
 * report's Noto section -- this only makes the exact name the frozen
 * markup already references resolve to *something* with real Hangul
 * glyphs instead of nothing).
 *
 * REMOVAL CONDITION: identical to the sans bridge above -- delete this
 * @font-face once Treatments.dc.html's Korean JS-literal strings are
 * translated to English (tracked as a content defect, not a font
 * requirement). At that point no live route sets Korean text in the serif
 * stack and this bridge becomes dead weight.
 */
@font-face {
  font-family: 'Noto Serif KR';
  src: local('AppleMyungjo'), local('Batang'), local('BatangChe'), local('Apple SD Gothic Neo'), local('Malgun Gothic'), local('Noto Serif KR'), local('NanumMyeongjo'), local('NanumGothic');
  unicode-range: U+0-303F, U+3100-31EF, U+3200-33FF, U+4DC0-4DFF, U+A000-F8FF, U+FB00-FEFF, U+FFF0-10FFFF;
}

/*
 * Usage (drop-in for the inline @import/<link> font-family stacks currently
 * in every .dc.html <helmet>):
 *   H1/H2/quote/big-number: font-family: 'Spectral', 'Spectral Fallback', serif;
 *   body/UI/labels/forms:   font-family: 'Pretendard Variable', 'Pretendard Fallback', 'Pretendard Hangul Fallback', -apple-system, sans-serif;
 * Noto Serif KR (the self-hosted family) is intentionally NOT included --
 * see report. The 'Noto Serif KR' @font-face immediately above is a
 * different thing: a same-named, zero-byte local() bridge that exists
 * only because that literal name is already hard-coded into frozen,
 * unmodifiable .dc.html markup (Treatments.dc.html) as a fallback after
 * 'Spectral' -- it is not "shipping Noto Serif KR" in the sense the report
 * argues against (a real, large, self-hosted CJK font family); it's a
 * system-font stand-in that happens to need the same family name to be
 * reachable from markup this project cannot edit. Both Hangul-fallback
 * faces (sans above, serif here) are temporary bridges for the still-
 * Korean Treatments hub only -- see each one's removal condition.
 */
