One family for every script
The combined bloxwap-font.css merges Arabic, Armenian, Georgian, Hebrew and CJK companions into Bloxwap Sans and Bloxwap Mono with unicode-range.
Bloxwap Sans and Bloxwap Mono have companion families for Arabic, Armenian, Georgian, Hebrew, Japanese (JP), Korean (KR) and Simplified Chinese (SC). Each is a separate font file, so pages download the scripts they use.
The combined stylesheet hides that split. It declares one family name per style, and gives each file a unicode-range:
| Text | Served by |
|---|---|
| Latin, Greek, Cyrillic, figures, symbols | Bloxwap Sans / Bloxwap Mono |
| Arabic | Bloxwap Sans Arabic / Bloxwap Mono Arabic |
| Armenian | Bloxwap Sans Armenian / Bloxwap Mono Armenian |
| Georgian (Mkhedruli and Mtavruli) | Bloxwap Sans Georgian / Bloxwap Mono Georgian |
| Hebrew and Niqqud | Bloxwap Sans Hebrew / Bloxwap Mono Hebrew |
| Japanese kana | Bloxwap Sans JP / Bloxwap Mono JP |
| Hangul | Bloxwap Sans KR / Bloxwap Mono KR |
| Han (hanzi) and shared CJK punctuation | Bloxwap Sans SC / Bloxwap Mono SC |
The browser downloads a companion file only when the page contains characters in its range. An English page loads one file; a page with a Korean name in it loads the KR file too.
<link rel="stylesheet" href="https://bloxwap.github.io/font/bloxwap-font.css">body { font-family: "Bloxwap Sans", system-ui, sans-serif; }<p>Balance: $1,204.50</p>
<p lang="ko">잔액: $1,204.50</p>
<p lang="zh-Hans">余额:$1,204.50</p>
<p lang="ar" dir="rtl">الرصيد: $1,204.50</p>
<p lang="he" dir="rtl">שָׁלוֹם עוֹלָם</p>
<p lang="hy">Հայաստան, Երևան</p>
<p lang="ka">ქართული ენა · ᲥᲐᲠᲗᲣᲚᲘ</p>All these lines use the same font-family.
How the ranges are computed
The stylesheet is generated by packages/font/tools/webfonts.py on every font build, from the fonts themselves:
- The base family claims every character it contains.
- Each companion claims the characters it has that the base family does not. Shared characters go to the first font in this order: SC, JP, KR, Arabic, Hebrew, Armenian, Georgian. For Japanese kanji and punctuation, use the JP family by name to select its complete repertoire.
- Runs of characters are merged into ranges within each Unicode block, so 3,500 scattered hanzi become one range instead of thousands.
Each companion is also declared under its own name ("Bloxwap Sans KR", "Bloxwap Mono Arabic", …) for when you want the complete font, Latin included, as a single file.
The file
This is the stylesheet that ships with this site, generated from the current fonts. Long unicode-range lists are shortened here.
/*
* Bloxwap Font — https://bloxwap.github.io/font/
* GENERATED by tools/webfonts.py (run by tools/postprocess.py). Do not edit by hand.
* SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
*
* One family name per style. Companion scripts are merged in with unicode-range,
* so browsers download a companion font only when a page uses its script.
*/
/* Bloxwap Sans (+ SC, JP, KR, Arabic, Hebrew, Armenian, Georgian via unicode-range) */
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSans/variable/BloxwapSans%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, … /* 31 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSans/variable/BloxwapSans-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, … /* 31 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansSC/variable/BloxwapSansSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+3000-303A, U+30FB, U+4E00-4E1D, U+4E22-4E25, … /* 448 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansSC/variable/BloxwapSansSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+3000-303A, U+30FB, U+4E00-4E1D, U+4E22-4E25, … /* 448 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansJP/variable/BloxwapSansJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, … /* 449 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansJP/variable/BloxwapSansJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, … /* 449 ranges */;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansKR/variable/BloxwapSansKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansKR/variable/BloxwapSansKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansArabic/variable/BloxwapSansArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansArabic/variable/BloxwapSansArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansHebrew/variable/BloxwapSansHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+5B0-5F4, U+FB1D-FB4F;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansHebrew/variable/BloxwapSansHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+5B0-5F4, U+FB1D-FB4F;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansArmenian/variable/BloxwapSansArmenian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+531-58F, U+FB13-FB17;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansArmenian/variable/BloxwapSansArmenian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+531-58F, U+FB13-FB17;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansGeorgian/variable/BloxwapSansGeorgian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+10D0-10FF, U+1C90-1CBF;
}
@font-face {
font-family: "Bloxwap Sans";
src: url("fonts/BloxwapSansGeorgian/variable/BloxwapSansGeorgian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+10D0-10FF, U+1C90-1CBF;
}
/* Bloxwap Mono (+ SC, JP, KR, Arabic, Hebrew, Armenian, Georgian via unicode-range) */
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMono/variable/BloxwapMono%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, … /* 30 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMono/variable/BloxwapMono-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, … /* 30 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoSC/variable/BloxwapMonoSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+3000-303A, U+30FB, U+4E00-4E1D, U+4E22-4E25, … /* 448 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoSC/variable/BloxwapMonoSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+3000-303A, U+30FB, U+4E00-4E1D, U+4E22-4E25, … /* 448 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoJP/variable/BloxwapMonoJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, … /* 449 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoJP/variable/BloxwapMonoJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, … /* 449 ranges */;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoKR/variable/BloxwapMonoKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoKR/variable/BloxwapMonoKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoArabic/variable/BloxwapMonoArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoArabic/variable/BloxwapMonoArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoHebrew/variable/BloxwapMonoHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+5B0-5F4, U+FB1D-FB4F;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoHebrew/variable/BloxwapMonoHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+5B0-5F4, U+FB1D-FB4F;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoArmenian/variable/BloxwapMonoArmenian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+531-58F, U+FB13-FB17;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoArmenian/variable/BloxwapMonoArmenian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+531-58F, U+FB13-FB17;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoGeorgian/variable/BloxwapMonoGeorgian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
unicode-range: U+10D0-10FF, U+1C90-1CBF;
}
@font-face {
font-family: "Bloxwap Mono";
src: url("fonts/BloxwapMonoGeorgian/variable/BloxwapMonoGeorgian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
unicode-range: U+10D0-10FF, U+1C90-1CBF;
}
/* Bloxwap Pixel */
@font-face {
font-family: "Bloxwap Pixel";
src: url("fonts/BloxwapPixel/variable/BloxwapPixel%5BROND%2Cwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Pixel";
src: url("fonts/BloxwapPixel/variable/BloxwapPixel-Italic%5BROND%2Cwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
}
/* Companion families under their own names (complete fonts, including Latin). */
@font-face {
font-family: "Bloxwap Sans SC";
src: url("fonts/BloxwapSansSC/variable/BloxwapSansSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans JP";
src: url("fonts/BloxwapSansJP/variable/BloxwapSansJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans KR";
src: url("fonts/BloxwapSansKR/variable/BloxwapSansKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Arabic";
src: url("fonts/BloxwapSansArabic/variable/BloxwapSansArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Hebrew";
src: url("fonts/BloxwapSansHebrew/variable/BloxwapSansHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Armenian";
src: url("fonts/BloxwapSansArmenian/variable/BloxwapSansArmenian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Armenian";
src: url("fonts/BloxwapSansArmenian/variable/BloxwapSansArmenian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Georgian";
src: url("fonts/BloxwapSansGeorgian/variable/BloxwapSansGeorgian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Sans Georgian";
src: url("fonts/BloxwapSansGeorgian/variable/BloxwapSansGeorgian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono SC";
src: url("fonts/BloxwapMonoSC/variable/BloxwapMonoSC%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono JP";
src: url("fonts/BloxwapMonoJP/variable/BloxwapMonoJP%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono KR";
src: url("fonts/BloxwapMonoKR/variable/BloxwapMonoKR%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Arabic";
src: url("fonts/BloxwapMonoArabic/variable/BloxwapMonoArabic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Hebrew";
src: url("fonts/BloxwapMonoHebrew/variable/BloxwapMonoHebrew%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Armenian";
src: url("fonts/BloxwapMonoArmenian/variable/BloxwapMonoArmenian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Armenian";
src: url("fonts/BloxwapMonoArmenian/variable/BloxwapMonoArmenian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Georgian";
src: url("fonts/BloxwapMonoGeorgian/variable/BloxwapMonoGeorgian%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bloxwap Mono Georgian";
src: url("fonts/BloxwapMonoGeorgian/variable/BloxwapMonoGeorgian-Italic%5Bwght%5D.woff2?v=388e7417ad") format("woff2");
font-weight: 100 900;
font-style: italic;
font-display: swap;
}Every built family is included in the stylesheet:
| Family | Style | Scripts | Status |
|---|---|---|---|
| Bloxwap Sans | Proportional + italics | Latin, Greek, Cyrillic and symbols | 2,617 glyphs |
| Bloxwap Mono | Monospaced + italics | Latin, Greek, Cyrillic and symbols | 2,611 glyphs |
| Bloxwap Sans Arabic | Proportional | Latin, Greek, Cyrillic and symbols + Arabic | 3,480 glyphs |
| Bloxwap Mono Arabic | Monospaced | Latin, Greek, Cyrillic and symbols + Arabic | 3,474 glyphs |
| Bloxwap Sans KR | Proportional | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Korean Hangul | 14,950 glyphs |
| Bloxwap Mono KR | Monospaced | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Korean Hangul | 14,944 glyphs |
| Bloxwap Sans SC | Proportional | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Simplified Chinese hanzi | 6,259 glyphs |
| Bloxwap Mono SC | Monospaced | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Simplified Chinese hanzi | 6,253 glyphs |
| Bloxwap Sans JP | Proportional | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Japanese kana + Japanese kanji | 5,157 glyphs |
| Bloxwap Mono JP | Monospaced | Latin, Greek, Cyrillic and symbols + CJK punctuation and symbols + Japanese kana + Japanese kanji | 5,151 glyphs |
| Bloxwap Sans Hebrew | Proportional | Latin, Greek, Cyrillic and symbols + Hebrew | 2,720 glyphs |
| Bloxwap Mono Hebrew | Monospaced | Latin, Greek, Cyrillic and symbols + Hebrew | 2,714 glyphs |
| Bloxwap Sans Armenian | Proportional + italics | Latin, Greek, Cyrillic and symbols + Armenian | 2,716 glyphs |
| Bloxwap Mono Armenian | Monospaced + italics | Latin, Greek, Cyrillic and symbols + Armenian | 2,710 glyphs |
| Bloxwap Sans Georgian | Proportional + italics | Latin, Greek, Cyrillic and symbols + Georgian | 2,711 glyphs |
| Bloxwap Mono Georgian | Monospaced + italics | Latin, Greek, Cyrillic and symbols + Georgian | 2,705 glyphs |
| Bloxwap Pixel | Pixel display + italics | Latin, Greek, Cyrillic and symbols | 2,435 glyphs |
Self-hosting it
Download bloxwap-font.css and the fonts/ folder it points to, and keep their relative layout: the CSS refers to fonts/<Family>/variable/<file>.woff2 relative to itself.
your-site/
bloxwap-font.css
fonts/
BloxwapSans/variable/BloxwapSans[wght].woff2
BloxwapSans/variable/BloxwapSans-Italic[wght].woff2
BloxwapMono/variable/…
BloxwapPixel/variable/…
BloxwapSansKR/variable/…
BloxwapSansHebrew/variable/…
BloxwapSansArmenian/variable/…
BloxwapSansGeorgian/variable/…The ?v= query on each URL is a content hash for cache-busting; it is harmless on any server.
Caveats
-
Italics. Armenian and Georgian include italic faces. Arabic, Hebrew and the CJK companions use their upright faces in italic text.
-
Language. Set
langon content in other scripts (ar,hy,ka,he,ja,ko,zh-Hans). It drives line breaking, localized forms and screen readers. -
Direction. Arabic and Hebrew need
dir="rtl"on their containers; editable mixed-script text can usedir="auto". -
Line height. Companions use taller vertical metrics than the Latin fonts, to fit Arabic marks and full-height CJK characters:
Fonts Ascender Descender Latin (Sans, Mono, Pixel) 960 −240 Arabic 1060 −440 Hebrew 980 −560 Armenian and Georgian 960 −240 Japanese, Korean and Chinese 1000 −300 With
line-height: normal, a line that mixes scripts can be taller than a Latin-only line. Set an explicit unitlessline-height(for example1.5) so lines stay even.