@bloxwap/font 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +82 -1
  2. package/bloxwap-font.css +156 -10
  3. package/css/mono-arabic.css +27 -0
  4. package/css/mono-armenian.css +34 -0
  5. package/css/mono-core.css +68 -0
  6. package/css/mono-full.css +18 -0
  7. package/css/mono-georgian.css +34 -0
  8. package/css/mono-hebrew.css +27 -0
  9. package/css/mono-jp.css +27 -0
  10. package/css/mono-kr.css +27 -0
  11. package/css/mono-sc.css +27 -0
  12. package/css/mono.css +243 -0
  13. package/css/pixel-core.css +68 -0
  14. package/css/pixel-full.css +18 -0
  15. package/css/pixel.css +68 -0
  16. package/css/sans-arabic.css +27 -0
  17. package/css/sans-armenian.css +34 -0
  18. package/css/sans-core.css +68 -0
  19. package/css/sans-full.css +18 -0
  20. package/css/sans-georgian.css +34 -0
  21. package/css/sans-hebrew.css +27 -0
  22. package/css/sans-jp.css +27 -0
  23. package/css/sans-kr.css +27 -0
  24. package/css/sans-sc.css +27 -0
  25. package/css/sans.css +243 -0
  26. package/fonts/BloxwapMono/BloxwapMono-Italic-Variable.cyrillic.woff2 +0 -0
  27. package/fonts/BloxwapMono/BloxwapMono-Italic-Variable.greek.woff2 +0 -0
  28. package/fonts/BloxwapMono/BloxwapMono-Italic-Variable.latin.woff2 +0 -0
  29. package/fonts/BloxwapMono/BloxwapMono-Italic-Variable.other.woff2 +0 -0
  30. package/fonts/BloxwapMono/BloxwapMono-Variable.cyrillic.woff2 +0 -0
  31. package/fonts/BloxwapMono/BloxwapMono-Variable.greek.woff2 +0 -0
  32. package/fonts/BloxwapMono/BloxwapMono-Variable.latin.woff2 +0 -0
  33. package/fonts/BloxwapMono/BloxwapMono-Variable.other.woff2 +0 -0
  34. package/fonts/BloxwapMono/LICENSE +93 -0
  35. package/fonts/BloxwapMonoArabic/LICENSE +93 -0
  36. package/fonts/BloxwapMonoArmenian/LICENSE +93 -0
  37. package/fonts/BloxwapMonoGeorgian/LICENSE +93 -0
  38. package/fonts/BloxwapMonoHebrew/LICENSE +93 -0
  39. package/fonts/BloxwapMonoJP/LICENSE +93 -0
  40. package/fonts/BloxwapMonoKR/LICENSE +93 -0
  41. package/fonts/BloxwapMonoSC/LICENSE +93 -0
  42. package/fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.cyrillic.woff2 +0 -0
  43. package/fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.greek.woff2 +0 -0
  44. package/fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.latin.woff2 +0 -0
  45. package/fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.other.woff2 +0 -0
  46. package/fonts/BloxwapPixel/BloxwapPixel-Variable.cyrillic.woff2 +0 -0
  47. package/fonts/BloxwapPixel/BloxwapPixel-Variable.greek.woff2 +0 -0
  48. package/fonts/BloxwapPixel/BloxwapPixel-Variable.latin.woff2 +0 -0
  49. package/fonts/BloxwapPixel/BloxwapPixel-Variable.other.woff2 +0 -0
  50. package/fonts/BloxwapPixel/LICENSE +93 -0
  51. package/fonts/BloxwapSans/BloxwapSans-Italic-Variable.cyrillic.woff2 +0 -0
  52. package/fonts/BloxwapSans/BloxwapSans-Italic-Variable.greek.woff2 +0 -0
  53. package/fonts/BloxwapSans/BloxwapSans-Italic-Variable.latin.woff2 +0 -0
  54. package/fonts/BloxwapSans/BloxwapSans-Italic-Variable.other.woff2 +0 -0
  55. package/fonts/BloxwapSans/BloxwapSans-Variable.cyrillic.woff2 +0 -0
  56. package/fonts/BloxwapSans/BloxwapSans-Variable.greek.woff2 +0 -0
  57. package/fonts/BloxwapSans/BloxwapSans-Variable.latin.woff2 +0 -0
  58. package/fonts/BloxwapSans/BloxwapSans-Variable.other.woff2 +0 -0
  59. package/fonts/BloxwapSans/LICENSE +93 -0
  60. package/fonts/BloxwapSansArabic/LICENSE +93 -0
  61. package/fonts/BloxwapSansArmenian/LICENSE +93 -0
  62. package/fonts/BloxwapSansGeorgian/LICENSE +93 -0
  63. package/fonts/BloxwapSansHebrew/LICENSE +93 -0
  64. package/fonts/BloxwapSansJP/LICENSE +93 -0
  65. package/fonts/BloxwapSansKR/LICENSE +93 -0
  66. package/fonts/BloxwapSansSC/LICENSE +93 -0
  67. package/manifest.json +7373 -0
  68. package/package.json +13 -5
  69. package/src/manifest.d.ts +35 -0
  70. package/src/mono-italic.js +19 -0
  71. package/src/mono.d.ts +4 -0
  72. package/src/mono.js +11 -5
  73. package/src/pixel-italic.js +19 -0
  74. package/src/pixel.d.ts +4 -0
  75. package/src/pixel.js +9 -5
  76. package/src/sans-italic.js +19 -0
  77. package/src/sans.d.ts +4 -0
  78. package/src/sans.js +11 -5
package/README.md CHANGED
@@ -9,6 +9,8 @@ npm install @bloxwap/font
9
9
 
10
10
  ## Next.js
11
11
 
12
+ The `next/font` exports need Next.js 15 or later.
13
+
12
14
  ```tsx title="app/layout.tsx"
13
15
  import { BloxwapSans } from '@bloxwap/font/sans';
14
16
  import { BloxwapMono } from '@bloxwap/font/mono';
@@ -22,7 +24,9 @@ export default function RootLayout({ children }: { children: React.ReactNode })
22
24
  }
23
25
  ```
24
26
 
25
- `BloxwapSans`, `BloxwapMono` and `BloxwapPixel` come from `next/font/local`, so Next.js self-hosts and preloads them.
27
+ `BloxwapSans`, `BloxwapMono` and `BloxwapPixel` come from `next/font/local`, so Next.js self-hosts them and preloads
28
+ the complete normal face. `next/font/local` accepts only path, weight and style per source;
29
+ it cannot assign a different `unicode-range` to each source. Use the CSS entries below for core subsetting. The italic is in the same family but isn't preloaded: a page downloads it only when it renders italic text.
26
30
  `.variable` defines `--font-bloxwap-sans`, `--font-bloxwap-mono` and `--font-bloxwap-pixel`:
27
31
 
28
32
  ```css
@@ -44,12 +48,89 @@ code { font-family: "Bloxwap Mono", ui-monospace, monospace; }
44
48
  .score { font-family: "Bloxwap Pixel", monospace; font-variation-settings: "ROND" 60; }
45
49
  ```
46
50
 
51
+ Core CSS uses `latin`, `greek`, `cyrillic` and `other` variable WOFF2s.
52
+ Greek and Cyrillic include the documented shared combining marks, numbers and punctuation;
53
+ Latin is declared last and supplies independently matched common characters.
54
+ Latin includes all Latin Extended, IPA, Vietnamese, Latin combining marks, punctuation and currency.
55
+ Latin-only Sans upright loads 184,980 bytes instead of 310,848 bytes.
47
56
  One family name per style covers every script. Each companion is also available under its own name (for example
48
57
  `"Bloxwap Sans Arabic"`). The WOFF2 files are at `@bloxwap/font/fonts/<Family>/<Family>-Variable.woff2` (and `-Italic-Variable.woff2`).
49
58
 
59
+ Subset files use `<Family>-Variable.<subset>.woff2` and `-Italic-Variable.<subset>.woff2`.
60
+ The complete variable files remain available at the original paths for self-hosting and Next.js.
61
+
62
+ Shaping across mixed-script boundaries, such as Latin next to Greek inside one word, is outside the subset guarantee.
63
+ The `css/{sans,mono,pixel}-full` entries load complete core fonts for applications that need them.
64
+
50
65
  Weights 100–900 on one variable axis, with italics for Sans, Mono, Pixel, Armenian and Georgian. Desktop formats
51
66
  (OTF, TTF) are in the [GitHub release](https://github.com/bloxwap/font/releases/latest).
52
67
 
53
68
  ## License
54
69
 
55
70
  [SIL Open Font License 1.1](https://github.com/bloxwap/font/blob/main/LICENSE). © 2026 Bloxwap, Inc.
71
+
72
+ ## HIG / selective web and native assets (0.1.3)
73
+
74
+ Published in 0.1.3. To build from a pinned checkout, use
75
+ Python with `fonttools[woff,unicode]==4.66.1` and `brotli==1.2.0`; set `FONT_PYTHON`
76
+ to that interpreter before `npm pack`. No glyph sources are changed by packaging.
77
+
78
+ - `@bloxwap/font/manifest`: every built face's path, weight, style, ISO 15924 scripts,
79
+ internal font version, package version, bytes and SHA-256. Static faces include
80
+ their package, package-qualified asset import path, unique registration name and variable source hash.
81
+ - `@bloxwap/font/css/{sans,mono,pixel}`: one role with its companions.
82
+ - `@bloxwap/font/css/{sans,mono}-core` and `pixel-core`: core only.
83
+ - `@bloxwap/font/css/{sans,mono}-{arabic,hebrew,armenian,georgian,jp,kr,sc}`:
84
+ script only, retaining unicode-range and swap behavior.
85
+ - `@bloxwap/font-native/assets/BloxwapSans/BloxwapSans-SemiBold.ttf`: direct
86
+ Metro `require()` entry for a chosen face, without bundling other weights.
87
+ - `@bloxwap/font-native/BloxwapSans` (or another published family): typed Metro
88
+ asset map, e.g. `faces['BloxwapSans-SemiBold']`. Maps bundle every face in that family; prefer direct entries for strict budgets.
89
+ Register only selected TTFs;
90
+ use their exact keys as fontFamily with no fontWeight/fontStyle override.
91
+ Native TTFs decode hash-pinned static WOFF2s without changing glyphs or hinting;
92
+ OS/2 registration weights normalize to named tiers, with sourceWeight retained.
93
+ Static Pixel uses ROND 50. All nine weights and available italics are included.
94
+
95
+ Native assets ship separately from the web package. Install only the packages you need:
96
+
97
+ ```sh
98
+ npm install @bloxwap/font-native
99
+ # Optional script companions, for example:
100
+ npm install @bloxwap/font-native-jp
101
+ ```
102
+
103
+ `@bloxwap/font-native` contains Sans, Mono and Pixel. Packages suffixed `-arabic`,
104
+ `-hebrew`, `-armenian`, `-georgian`, `-jp`, `-kr` and `-sc` each contain that
105
+ script's Sans and Mono families. Use `@bloxwap/font-native-jp/BloxwapSansJP` or
106
+ `@bloxwap/font-native-jp/assets/BloxwapSansJP/BloxwapSansJP-Regular.ttf` for Japanese.
107
+ All packages have matching versions and include LICENSE with `OFL-1.1` licensing.
108
+ This pre-1.0 move replaces the never-published native exports under the web
109
+ package, with unchanged registration names and TTF bytes and no compatibility shim.
110
+ The web package retains the complete manifest and enforces a 20 MB unpacked budget.
111
+
112
+ Static sources are pinned in `static-sources.json` to a release tag, family zip SHA-256,
113
+ and every inner WOFF2 SHA-256. The build verifies `packages/font/fonts/<Family>/woff2/`
114
+ first, then downloads only missing families from public release zips. An existing input
115
+ with a mismatched hash fails the build. The default zip cache is
116
+ `~/.cache/bloxwap-font/static-sources/<tag>/`; set `BLOXWAP_STATIC_SOURCES_CACHE`
117
+ to override its root. CI uses job-local storage without GitHub cache saves. The manifest's
118
+ `source` records `<asset>.zip:<family>/woff2/<file>.woff2@<tag>` and `sourceSha256`
119
+ records the original WOFF2 bytes. Release zips and all packages retain the OFL license.
120
+
121
+ After rebuilding fonts, run `packages/font/.venv/bin/python packages/npm/scripts/static_sources.py lock --tag v<upcoming-version>`
122
+ from the repository root and commit the lock alongside the rebuilt variable fonts and site data.
123
+ `lock` reads local zips in `apps/docs/public/downloads/`; `fetch` verifies dist inputs and
124
+ fetches missing families (optionally `--family BloxwapSans`). The release script refreshes
125
+ the lock before uploading; the pinned release assets must be available before npm CI builds.
126
+
127
+ The shared build generates all packages in parallel using one process per CPU.
128
+ Source and output hashes validate cached native TTFs, so unchanged builds and packs
129
+ skip decoding and rewriting them. Run `FONT_PYTHON=../font/.venv/bin/python npm test`
130
+ after building from `packages/npm`. For timings and pack sizes, see the repository's
131
+ [benchmark harness](../../bench/README.md).
132
+
133
+ Read [Cross-platform typography](https://bloxwap.github.io/font/docs/cross-platform/)
134
+ for Next.js and Expo recipes, locale selection, scaling, licensing and limitations.
135
+ `npm test` checks the manifest against the actual built files and binary metadata.
136
+ Physical native rendering still requires host/device validation.
package/bloxwap-font.css CHANGED
@@ -6,19 +6,67 @@
6
6
  /* Bloxwap Sans (+ SC, JP, KR, Arabic, Hebrew, Armenian, Georgian via unicode-range) */
7
7
  @font-face {
8
8
  font-family: "Bloxwap Sans";
9
- src: url("./fonts/BloxwapSans/BloxwapSans-Variable.woff2") format("woff2");
9
+ src: url("./fonts/BloxwapSans/BloxwapSans-Variable.other.woff2") format("woff2");
10
10
  font-weight: 100 900;
11
11
  font-style: normal;
12
12
  font-display: swap;
13
- unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374-3F9, U+400-4F9, U+510-525, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+1F00-1FFE, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2103-2139, U+2150-2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+2C6D-2C6F, U+2E2E, U+A789-A7B0, U+FB00-FB06, U+FEFF;
13
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
14
14
  }
15
15
  @font-face {
16
16
  font-family: "Bloxwap Sans";
17
- src: url("./fonts/BloxwapSans/BloxwapSans-Italic-Variable.woff2") format("woff2");
17
+ src: url("./fonts/BloxwapSans/BloxwapSans-Variable.cyrillic.woff2") format("woff2");
18
+ font-weight: 100 900;
19
+ font-style: normal;
20
+ font-display: swap;
21
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
22
+ }
23
+ @font-face {
24
+ font-family: "Bloxwap Sans";
25
+ src: url("./fonts/BloxwapSans/BloxwapSans-Variable.greek.woff2") format("woff2");
26
+ font-weight: 100 900;
27
+ font-style: normal;
28
+ font-display: swap;
29
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
30
+ }
31
+ @font-face {
32
+ font-family: "Bloxwap Sans";
33
+ src: url("./fonts/BloxwapSans/BloxwapSans-Variable.latin.woff2") format("woff2");
34
+ font-weight: 100 900;
35
+ font-style: normal;
36
+ font-display: swap;
37
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FB00-FB06, U+FEFF;
38
+ }
39
+ @font-face {
40
+ font-family: "Bloxwap Sans";
41
+ src: url("./fonts/BloxwapSans/BloxwapSans-Italic-Variable.other.woff2") format("woff2");
42
+ font-weight: 100 900;
43
+ font-style: italic;
44
+ font-display: swap;
45
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
46
+ }
47
+ @font-face {
48
+ font-family: "Bloxwap Sans";
49
+ src: url("./fonts/BloxwapSans/BloxwapSans-Italic-Variable.cyrillic.woff2") format("woff2");
50
+ font-weight: 100 900;
51
+ font-style: italic;
52
+ font-display: swap;
53
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
54
+ }
55
+ @font-face {
56
+ font-family: "Bloxwap Sans";
57
+ src: url("./fonts/BloxwapSans/BloxwapSans-Italic-Variable.greek.woff2") format("woff2");
58
+ font-weight: 100 900;
59
+ font-style: italic;
60
+ font-display: swap;
61
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
62
+ }
63
+ @font-face {
64
+ font-family: "Bloxwap Sans";
65
+ src: url("./fonts/BloxwapSans/BloxwapSans-Italic-Variable.latin.woff2") format("woff2");
18
66
  font-weight: 100 900;
19
67
  font-style: italic;
20
68
  font-display: swap;
21
- unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374-3F9, U+400-4F9, U+510-525, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+1F00-1FFE, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2103-2139, U+2150-2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+2C6D-2C6F, U+2E2E, U+A789-A7B0, U+FB00-FB06, U+FEFF;
69
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FB00-FB06, U+FEFF;
22
70
  }
23
71
  @font-face {
24
72
  font-family: "Bloxwap Sans";
@@ -136,19 +184,67 @@
136
184
  /* Bloxwap Mono (+ SC, JP, KR, Arabic, Hebrew, Armenian, Georgian via unicode-range) */
137
185
  @font-face {
138
186
  font-family: "Bloxwap Mono";
139
- src: url("./fonts/BloxwapMono/BloxwapMono-Variable.woff2") format("woff2");
187
+ src: url("./fonts/BloxwapMono/BloxwapMono-Variable.other.woff2") format("woff2");
188
+ font-weight: 100 900;
189
+ font-style: normal;
190
+ font-display: swap;
191
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
192
+ }
193
+ @font-face {
194
+ font-family: "Bloxwap Mono";
195
+ src: url("./fonts/BloxwapMono/BloxwapMono-Variable.cyrillic.woff2") format("woff2");
196
+ font-weight: 100 900;
197
+ font-style: normal;
198
+ font-display: swap;
199
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
200
+ }
201
+ @font-face {
202
+ font-family: "Bloxwap Mono";
203
+ src: url("./fonts/BloxwapMono/BloxwapMono-Variable.greek.woff2") format("woff2");
204
+ font-weight: 100 900;
205
+ font-style: normal;
206
+ font-display: swap;
207
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
208
+ }
209
+ @font-face {
210
+ font-family: "Bloxwap Mono";
211
+ src: url("./fonts/BloxwapMono/BloxwapMono-Variable.latin.woff2") format("woff2");
140
212
  font-weight: 100 900;
141
213
  font-style: normal;
142
214
  font-display: swap;
143
- unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374-3F9, U+400-4F9, U+510-525, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+1F00-1FFE, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2103-2139, U+2150-2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+2C6D-2C6F, U+2E2E, U+A789-A7B0, U+FEFF;
215
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FEFF;
144
216
  }
145
217
  @font-face {
146
218
  font-family: "Bloxwap Mono";
147
- src: url("./fonts/BloxwapMono/BloxwapMono-Italic-Variable.woff2") format("woff2");
219
+ src: url("./fonts/BloxwapMono/BloxwapMono-Italic-Variable.other.woff2") format("woff2");
148
220
  font-weight: 100 900;
149
221
  font-style: italic;
150
222
  font-display: swap;
151
- unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374-3F9, U+400-4F9, U+510-525, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+1F00-1FFE, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2103-2139, U+2150-2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+2C6D-2C6F, U+2E2E, U+A789-A7B0, U+FEFF;
223
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
224
+ }
225
+ @font-face {
226
+ font-family: "Bloxwap Mono";
227
+ src: url("./fonts/BloxwapMono/BloxwapMono-Italic-Variable.cyrillic.woff2") format("woff2");
228
+ font-weight: 100 900;
229
+ font-style: italic;
230
+ font-display: swap;
231
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
232
+ }
233
+ @font-face {
234
+ font-family: "Bloxwap Mono";
235
+ src: url("./fonts/BloxwapMono/BloxwapMono-Italic-Variable.greek.woff2") format("woff2");
236
+ font-weight: 100 900;
237
+ font-style: italic;
238
+ font-display: swap;
239
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
240
+ }
241
+ @font-face {
242
+ font-family: "Bloxwap Mono";
243
+ src: url("./fonts/BloxwapMono/BloxwapMono-Italic-Variable.latin.woff2") format("woff2");
244
+ font-weight: 100 900;
245
+ font-style: italic;
246
+ font-display: swap;
247
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FEFF;
152
248
  }
153
249
  @font-face {
154
250
  font-family: "Bloxwap Mono";
@@ -266,17 +362,67 @@
266
362
  /* Bloxwap Pixel */
267
363
  @font-face {
268
364
  font-family: "Bloxwap Pixel";
269
- src: url("./fonts/BloxwapPixel/BloxwapPixel-Variable.woff2") format("woff2");
365
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Variable.other.woff2") format("woff2");
366
+ font-weight: 100 900;
367
+ font-style: normal;
368
+ font-display: swap;
369
+ unicode-range: U+374, U+37E, U+385, U+387, U+2102-210F, U+2115, U+2117-2120, U+2124, U+2127, U+212E, U+2139, U+2190-21E9, U+2200-22F1, U+2300-23FD, U+2423, U+2500-26AB, U+2709-27A4, U+27E6-27EF, U+27F5-27FA, U+2B05-2B9F;
370
+ }
371
+ @font-face {
372
+ font-family: "Bloxwap Pixel";
373
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Variable.cyrillic.woff2") format("woff2");
374
+ font-weight: 100 900;
375
+ font-style: normal;
376
+ font-display: swap;
377
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+2E5-2E9, U+300-35B, U+374, U+37E, U+387, U+400-52F, U+2000-2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113, U+2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E18-2E3B, U+FEFF, U+FFFD;
378
+ }
379
+ @font-face {
380
+ font-family: "Bloxwap Pixel";
381
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Variable.greek.woff2") format("woff2");
382
+ font-weight: 100 900;
383
+ font-style: normal;
384
+ font-display: swap;
385
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+2E5-2E9, U+300-35B, U+372-384, U+386-3FF, U+1D26-1D2A, U+1F00-1FFE, U+2000-2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113, U+2116, U+2122, U+2126, U+2190, U+2192, U+2194, U+21D2, U+2E18-2E3B, U+FEFF, U+FFFD;
386
+ }
387
+ @font-face {
388
+ font-family: "Bloxwap Pixel";
389
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Variable.latin.woff2") format("woff2");
270
390
  font-weight: 100 900;
271
391
  font-style: normal;
272
392
  font-display: swap;
393
+ unicode-range: U+20-7E, U+A0-2A2, U+2B0-2E9, U+300-35B, U+374, U+37E, U+387, U+1D00-1D22, U+1D43-1D7E, U+1D9C-1DBB, U+1E00-1EF9, U+2000-209C, U+20A1-20BF, U+2113, U+2116, U+2122, U+212A-212B, U+2132, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C65-2C7F, U+2E18-2E3B, U+A726-A7B7, U+FB00-FB02, U+FEFF, U+FFFD;
394
+ }
395
+ @font-face {
396
+ font-family: "Bloxwap Pixel";
397
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.other.woff2") format("woff2");
398
+ font-weight: 100 900;
399
+ font-style: italic;
400
+ font-display: swap;
401
+ unicode-range: U+374, U+37E, U+385, U+387, U+2102-210F, U+2115, U+2117-2120, U+2124, U+2127, U+212E, U+2139, U+2190-21E9, U+2200-22F1, U+2300-23FD, U+2423, U+2500-26AB, U+2709-27A4, U+27E6-27EF, U+27F5-27FA, U+2B05-2B9F;
402
+ }
403
+ @font-face {
404
+ font-family: "Bloxwap Pixel";
405
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.cyrillic.woff2") format("woff2");
406
+ font-weight: 100 900;
407
+ font-style: italic;
408
+ font-display: swap;
409
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+2E5-2E9, U+300-35B, U+374, U+37E, U+387, U+400-52F, U+2000-2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113, U+2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E18-2E3B, U+FEFF, U+FFFD;
410
+ }
411
+ @font-face {
412
+ font-family: "Bloxwap Pixel";
413
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.greek.woff2") format("woff2");
414
+ font-weight: 100 900;
415
+ font-style: italic;
416
+ font-display: swap;
417
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+2E5-2E9, U+300-35B, U+372-384, U+386-3FF, U+1D26-1D2A, U+1F00-1FFE, U+2000-2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113, U+2116, U+2122, U+2126, U+2190, U+2192, U+2194, U+21D2, U+2E18-2E3B, U+FEFF, U+FFFD;
273
418
  }
274
419
  @font-face {
275
420
  font-family: "Bloxwap Pixel";
276
- src: url("./fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.woff2") format("woff2");
421
+ src: url("./fonts/BloxwapPixel/BloxwapPixel-Italic-Variable.latin.woff2") format("woff2");
277
422
  font-weight: 100 900;
278
423
  font-style: italic;
279
424
  font-display: swap;
425
+ unicode-range: U+20-7E, U+A0-2A2, U+2B0-2E9, U+300-35B, U+374, U+37E, U+387, U+1D00-1D22, U+1D43-1D7E, U+1D9C-1DBB, U+1E00-1EF9, U+2000-209C, U+20A1-20BF, U+2113, U+2116, U+2122, U+212A-212B, U+2132, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C65-2C7F, U+2E18-2E3B, U+A726-A7B7, U+FB00-FB02, U+FEFF, U+FFFD;
280
426
  }
281
427
 
282
428
  /* Companion families under their own names (complete fonts, including Latin). */
@@ -0,0 +1,27 @@
1
+ /*
2
+ * mono-arabic
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoArabic/BloxwapMonoArabic-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoArabic/BloxwapMonoArabic-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+60C-6FF, U+750-77F, U+8A0-8C7, U+FB50-FD3F, U+FE80-FEFC;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono Arabic";
23
+ src: url("../fonts/BloxwapMonoArabic/BloxwapMonoArabic-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
@@ -0,0 +1,34 @@
1
+ /*
2
+ * mono-armenian
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoArmenian/BloxwapMonoArmenian-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+531-58F, U+FB13-FB17;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoArmenian/BloxwapMonoArmenian-Italic-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+531-58F, U+FB13-FB17;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono Armenian";
23
+ src: url("../fonts/BloxwapMonoArmenian/BloxwapMonoArmenian-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
28
+ @font-face {
29
+ font-family: "Bloxwap Mono Armenian";
30
+ src: url("../fonts/BloxwapMonoArmenian/BloxwapMonoArmenian-Italic-Variable.woff2") format("woff2");
31
+ font-weight: 100 900;
32
+ font-style: italic;
33
+ font-display: swap;
34
+ }
@@ -0,0 +1,68 @@
1
+ /*
2
+ * mono-core
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMono/BloxwapMono-Variable.other.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMono/BloxwapMono-Variable.cyrillic.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: normal;
18
+ font-display: swap;
19
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono";
23
+ src: url("../fonts/BloxwapMono/BloxwapMono-Variable.greek.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
28
+ }
29
+ @font-face {
30
+ font-family: "Bloxwap Mono";
31
+ src: url("../fonts/BloxwapMono/BloxwapMono-Variable.latin.woff2") format("woff2");
32
+ font-weight: 100 900;
33
+ font-style: normal;
34
+ font-display: swap;
35
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FEFF;
36
+ }
37
+ @font-face {
38
+ font-family: "Bloxwap Mono";
39
+ src: url("../fonts/BloxwapMono/BloxwapMono-Italic-Variable.other.woff2") format("woff2");
40
+ font-weight: 100 900;
41
+ font-style: italic;
42
+ font-display: swap;
43
+ unicode-range: U+374, U+37E, U+385, U+387, U+2103-2109, U+2117-2120, U+212E-2139, U+2150-215F, U+2189, U+2190-21E7, U+2200-22C5, U+2302-23FD, U+2460-24EA, U+2500-25E6, U+2605-26A1, U+2713-2794, U+27E8-27E9, U+27F5-27F7, U+A789;
44
+ }
45
+ @font-face {
46
+ font-family: "Bloxwap Mono";
47
+ src: url("../fonts/BloxwapMono/BloxwapMono-Italic-Variable.cyrillic.woff2") format("woff2");
48
+ font-weight: 100 900;
49
+ font-style: italic;
50
+ font-display: swap;
51
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374, U+37E, U+387, U+400-4F9, U+510-525, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
52
+ }
53
+ @font-face {
54
+ font-family: "Bloxwap Mono";
55
+ src: url("../fonts/BloxwapMono/BloxwapMono-Italic-Variable.greek.woff2") format("woff2");
56
+ font-weight: 100 900;
57
+ font-style: italic;
58
+ font-display: swap;
59
+ unicode-range: U+20-40, U+5B-60, U+7B-7E, U+A0-A9, U+AB-B9, U+BB-BF, U+D7, U+F7, U+2B9-2DD, U+300-34F, U+374-384, U+386-3F9, U+1F00-1FFE, U+2000-2060, U+2070, U+2074-207E, U+2080-208E, U+20A1-20BF, U+2113-2116, U+2122-2126, U+2190, U+2192, U+2194, U+21D2, U+2E2E, U+FEFF;
60
+ }
61
+ @font-face {
62
+ font-family: "Bloxwap Mono";
63
+ src: url("../fonts/BloxwapMono/BloxwapMono-Italic-Variable.latin.woff2") format("woff2");
64
+ font-weight: 100 900;
65
+ font-style: italic;
66
+ font-display: swap;
67
+ unicode-range: U+20-7E, U+A0-24D, U+250-2A7, U+2B0-2E4, U+300-34F, U+374, U+37E, U+387, U+1D2C-1D5B, U+1D9B-1DBE, U+1E00-1EF9, U+2000-2060, U+2070-208E, U+20A1-20BF, U+2113-2116, U+2122, U+212A-212B, U+2160-217F, U+2190, U+2192, U+2194, U+21D2, U+2C6D-2C6F, U+2E2E, U+A78B-A7B0, U+FEFF;
68
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * mono: complete core fonts
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMono/BloxwapMono-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ }
12
+ @font-face {
13
+ font-family: "Bloxwap Mono";
14
+ src: url("../fonts/BloxwapMono/BloxwapMono-Italic-Variable.woff2") format("woff2");
15
+ font-weight: 100 900;
16
+ font-style: italic;
17
+ font-display: swap;
18
+ }
@@ -0,0 +1,34 @@
1
+ /*
2
+ * mono-georgian
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoGeorgian/BloxwapMonoGeorgian-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+10D0-10FF, U+1C90-1CBF;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoGeorgian/BloxwapMonoGeorgian-Italic-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+10D0-10FF, U+1C90-1CBF;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono Georgian";
23
+ src: url("../fonts/BloxwapMonoGeorgian/BloxwapMonoGeorgian-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
28
+ @font-face {
29
+ font-family: "Bloxwap Mono Georgian";
30
+ src: url("../fonts/BloxwapMonoGeorgian/BloxwapMonoGeorgian-Italic-Variable.woff2") format("woff2");
31
+ font-weight: 100 900;
32
+ font-style: italic;
33
+ font-display: swap;
34
+ }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * mono-hebrew
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoHebrew/BloxwapMonoHebrew-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+5B0-5F4, U+FB1D-FB4F;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoHebrew/BloxwapMonoHebrew-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+5B0-5F4, U+FB1D-FB4F;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono Hebrew";
23
+ src: url("../fonts/BloxwapMonoHebrew/BloxwapMonoHebrew-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * mono-jp
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoJP/BloxwapMonoJP-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, U+4E21, U+4E26, U+4E3C, U+4E57, U+4E80, U+4E9C, U+4ECF, U+4ED5, U+4EEE, U+4F0E, U+4F1D, U+4F75, U+4FA1, U+4FB6, U+4FC2, U+4FF3-4FF8, U+5009-500B, U+5023-5024, U+502B-5039, U+5049, U+5074-5075, U+507D, U+5091-5099, U+50B5-50B7, U+50BE-50CD, U+50D5, U+5100-5104, U+511F-512A, U+5150, U+5186, U+518A, U+51CD, U+51E6, U+5208, U+5225, U+5247, U+525B-5264, U+5270, U+5275, U+5287, U+52B4-52BE, U+52C5, U+52D5, U+52D9-52DD, U+52E2, U+52E7-52F2, U+5302, U+5354, U+5358, U+5384, U+53B3, U+53CE, U+5442, U+5449, U+546A, U+54B2, U+54E1, U+5504, U+554F-5553, U+559A, U+55A9-55AB, U+55B6, U+55E3, U+5606, U+5674-5687, U+56E3, U+56F2-56F3, U+570F-5712, U+5727, U+5742, U+57A3, U+57F7, U+57FC-5800, U+5805, U+5831-5834, U+5840-584A, U+5857, U+585A, U+5861-5869, U+587E, U+5897, U+589C, U+58B3-58BE, U+58C7-58CC, U+58F1-58F2, U+5909, U+5922, U+5968-596E, U+598A, U+59AC, U+59C9, U+59EB, U+5A20, U+5A2F, U+5A66, U+5A9B, U+5AE1, U+5B22, U+5B6B, U+5B9F, U+5BAE, U+5BDB, U+5BE7, U+5BE9-5BEE, U+5BFE, U+5C02, U+5C0B-5C0E, U+5C3B, U+5C64, U+5C90, U+5CA1, U+5CAC, U+5CE0, U+5CF6, U+5D50, U+5DE3, U+5DFB, U+5E25, U+5E2B, U+5E2F-5E33, U+5E63, U+5E79, U+5E7E, U+5E81-5E83, U+5EAB, U+5EC3, U+5F01, U+5F10, U+5F14, U+5F35-5F37, U+5F3E, U+5F59, U+5F6B, U+5F8C, U+5F93, U+5FA9, U+5FB3-5FB4, U+5FB9, U+5FDC, U+6063, U+6065, U+6075, U+60A9-60AA, U+611B, U+6144, U+614B, U+6163, U+616E, U+6176, U+6182, U+61A4-61A7, U+61A9-61B6, U+61C7, U+61D0, U+61F2-61F8, U+6226, U+622F, U+6238-623B, U+6249, U+6255, U+6271, U+629C-629E, U+62DD, U+62E0-62E1, U+62F6, U+6319, U+633F, U+6357-635C, U+6368, U+6383, U+639B, U+63A1, U+63B2, U+63DA-63DB, U+63EE, U+63FA, U+640D, U+643E-6442, U+646F, U+6483, U+64B2, U+64C1, U+64EC, U+6557, U+6575, U+6589, U+658E, U+65AC, U+6607, U+6642, U+6669, U+6681, U+66A6-66AB, U+66C7-66D6, U+66DC, U+66F8, U+66FD, U+6715, U+672D, U+6771, U+67A0, U+67F5-67FB, U+6803-6804, U+6841, U+685C-685F, U+68C4, U+68DF, U+691C, U+696D-6975, U+697D, U+69CB, U+69D8, U+6A19, U+6A29, U+6A39, U+6A4B, U+6A5F, U+6B04, U+6B53, U+6B69, U+6B6F-6B74, U+6BBA-6BBB, U+6BC0, U+6BCE, U+6C17, U+6C37, U+6C3E, U+6C4E, U+6C5A, U+6C7A, U+6C96, U+6CA2, U+6CC1, U+6D44, U+6D5C, U+6D99, U+6DBC, U+6E07-6E09, U+6E0B, U+6E13, U+6E1B, U+6E26, U+6E2C, U+6E67-6E6F, U+6E80, U+6E96, U+6E9D, U+6EC5, U+6EDD, U+6F01, U+6F22, U+6F2C, U+6F38, U+6F54, U+6F5F-6F64, U+6F70, U+6FC1-6FC3, U+6FEB-6FEF, U+702C, U+707D, U+70BA, U+7121, U+713C, U+7159, U+7169, U+71B1, U+72A0, U+72D9, U+72E9, U+731F, U+7336, U+7344-7372, U+73FE, U+7460, U+74B0-74BD, U+7523, U+753A, U+7551, U+755D, U+7570-7573, U+757F, U+758E, U+75E9, U+760D, U+7642, U+7652-7656, U+767A, U+76E3-76E4, U+770C, U+773A, U+77EF, U+7815, U+7832, U+7881, U+78BA, U+790E, U+7949, U+798D, U+7A2E-7A32, U+7A40-7A42, U+7A4D-7A4F, U+7A6B, U+7A93, U+7AAE-7AAF, U+7ADC, U+7AF6, U+7B46, U+7B87-7B8B, U+7BB8-7BC4, U+7BC9, U+7BE4, U+7C21, U+7C60, U+7C8B, U+7C9B, U+7CA7, U+7CE7, U+7CF8, U+7CFE-7D05, U+7D0B-7D1B, U+7D21, U+7D30-7D66, U+7D71-7E3E, U+7E4A-7E70, U+7F36, U+7F70, U+7F75-7F85, U+7FA8-7FA9, U+7FCC-7FD2, U+8056, U+805E, U+8074-8077, U+80F4, U+8105, U+8107-8108, U+8133, U+814E, U+816B, U+8178, U+819A, U+81B3, U+81C6, U+81D3, U+81E8, U+8208, U+820E, U+8217, U+8237, U+8266, U+8276, U+82B8, U+8328, U+8358, U+83D3, U+83EF, U+8449, U+84CB, U+8535, U+85A6, U+85AB-85AC, U+85CD, U+85E9, U+865C-865E, U+86CD, U+8846, U+8853, U+885B-885D, U+88CF, U+88DC, U+88FD-88FE, U+8907, U+8972, U+8987-89B3, U+8A02-8A87, U+8A8C-8A8D, U+8A95-8B5C, U+8B70-8B77, U+8C4A, U+8C9D-8D08, U+8DE1, U+8E74, U+8E8D, U+8ECA-8F44, U+8FB2, U+8FBA-8FBC, U+9013, U+9023, U+9031-9032, U+9045, U+904A-904B, U+904E, U+9054-9055, U+905C-9061, U+9069, U+9077-907A, U+9084, U+90B8, U+90E1, U+90F5-90F7, U+914E, U+9154, U+9162, U+919C-91B8, U+91C8, U+91DC-9271, U+9280-9451, U+9577, U+9580-95D8, U+961C, U+962A, U+965B, U+9663, U+9665, U+9670-9673, U+9678-967D, U+968A, U+968E, U+969B, U+96A0-96A3, U+96B7-96BB, U+96D1, U+96E2-96E3, U+96F0-96F2, U+96FB, U+970A, U+9727, U+97D3, U+97FB-9867, U+98A8, U+98DB, U+98E2-990C, U+9913-9928, U+99AC-9A5A, U+9AB8-9AC4, U+9AEA, U+9B31, U+9B5A-9BE8, U+9CE5-9DB4, U+9E93-9E97, U+9EBA, U+9ED2, U+9ED9, U+9F62, U+FF65-FF9F, U+20B9F;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoJP/BloxwapMonoJP-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+3041-309F, U+30A1-30FA, U+30FC-30FF, U+31F0-31FF, U+4E21, U+4E26, U+4E3C, U+4E57, U+4E80, U+4E9C, U+4ECF, U+4ED5, U+4EEE, U+4F0E, U+4F1D, U+4F75, U+4FA1, U+4FB6, U+4FC2, U+4FF3-4FF8, U+5009-500B, U+5023-5024, U+502B-5039, U+5049, U+5074-5075, U+507D, U+5091-5099, U+50B5-50B7, U+50BE-50CD, U+50D5, U+5100-5104, U+511F-512A, U+5150, U+5186, U+518A, U+51CD, U+51E6, U+5208, U+5225, U+5247, U+525B-5264, U+5270, U+5275, U+5287, U+52B4-52BE, U+52C5, U+52D5, U+52D9-52DD, U+52E2, U+52E7-52F2, U+5302, U+5354, U+5358, U+5384, U+53B3, U+53CE, U+5442, U+5449, U+546A, U+54B2, U+54E1, U+5504, U+554F-5553, U+559A, U+55A9-55AB, U+55B6, U+55E3, U+5606, U+5674-5687, U+56E3, U+56F2-56F3, U+570F-5712, U+5727, U+5742, U+57A3, U+57F7, U+57FC-5800, U+5805, U+5831-5834, U+5840-584A, U+5857, U+585A, U+5861-5869, U+587E, U+5897, U+589C, U+58B3-58BE, U+58C7-58CC, U+58F1-58F2, U+5909, U+5922, U+5968-596E, U+598A, U+59AC, U+59C9, U+59EB, U+5A20, U+5A2F, U+5A66, U+5A9B, U+5AE1, U+5B22, U+5B6B, U+5B9F, U+5BAE, U+5BDB, U+5BE7, U+5BE9-5BEE, U+5BFE, U+5C02, U+5C0B-5C0E, U+5C3B, U+5C64, U+5C90, U+5CA1, U+5CAC, U+5CE0, U+5CF6, U+5D50, U+5DE3, U+5DFB, U+5E25, U+5E2B, U+5E2F-5E33, U+5E63, U+5E79, U+5E7E, U+5E81-5E83, U+5EAB, U+5EC3, U+5F01, U+5F10, U+5F14, U+5F35-5F37, U+5F3E, U+5F59, U+5F6B, U+5F8C, U+5F93, U+5FA9, U+5FB3-5FB4, U+5FB9, U+5FDC, U+6063, U+6065, U+6075, U+60A9-60AA, U+611B, U+6144, U+614B, U+6163, U+616E, U+6176, U+6182, U+61A4-61A7, U+61A9-61B6, U+61C7, U+61D0, U+61F2-61F8, U+6226, U+622F, U+6238-623B, U+6249, U+6255, U+6271, U+629C-629E, U+62DD, U+62E0-62E1, U+62F6, U+6319, U+633F, U+6357-635C, U+6368, U+6383, U+639B, U+63A1, U+63B2, U+63DA-63DB, U+63EE, U+63FA, U+640D, U+643E-6442, U+646F, U+6483, U+64B2, U+64C1, U+64EC, U+6557, U+6575, U+6589, U+658E, U+65AC, U+6607, U+6642, U+6669, U+6681, U+66A6-66AB, U+66C7-66D6, U+66DC, U+66F8, U+66FD, U+6715, U+672D, U+6771, U+67A0, U+67F5-67FB, U+6803-6804, U+6841, U+685C-685F, U+68C4, U+68DF, U+691C, U+696D-6975, U+697D, U+69CB, U+69D8, U+6A19, U+6A29, U+6A39, U+6A4B, U+6A5F, U+6B04, U+6B53, U+6B69, U+6B6F-6B74, U+6BBA-6BBB, U+6BC0, U+6BCE, U+6C17, U+6C37, U+6C3E, U+6C4E, U+6C5A, U+6C7A, U+6C96, U+6CA2, U+6CC1, U+6D44, U+6D5C, U+6D99, U+6DBC, U+6E07-6E09, U+6E0B, U+6E13, U+6E1B, U+6E26, U+6E2C, U+6E67-6E6F, U+6E80, U+6E96, U+6E9D, U+6EC5, U+6EDD, U+6F01, U+6F22, U+6F2C, U+6F38, U+6F54, U+6F5F-6F64, U+6F70, U+6FC1-6FC3, U+6FEB-6FEF, U+702C, U+707D, U+70BA, U+7121, U+713C, U+7159, U+7169, U+71B1, U+72A0, U+72D9, U+72E9, U+731F, U+7336, U+7344-7372, U+73FE, U+7460, U+74B0-74BD, U+7523, U+753A, U+7551, U+755D, U+7570-7573, U+757F, U+758E, U+75E9, U+760D, U+7642, U+7652-7656, U+767A, U+76E3-76E4, U+770C, U+773A, U+77EF, U+7815, U+7832, U+7881, U+78BA, U+790E, U+7949, U+798D, U+7A2E-7A32, U+7A40-7A42, U+7A4D-7A4F, U+7A6B, U+7A93, U+7AAE-7AAF, U+7ADC, U+7AF6, U+7B46, U+7B87-7B8B, U+7BB8-7BC4, U+7BC9, U+7BE4, U+7C21, U+7C60, U+7C8B, U+7C9B, U+7CA7, U+7CE7, U+7CF8, U+7CFE-7D05, U+7D0B-7D1B, U+7D21, U+7D30-7D66, U+7D71-7E3E, U+7E4A-7E70, U+7F36, U+7F70, U+7F75-7F85, U+7FA8-7FA9, U+7FCC-7FD2, U+8056, U+805E, U+8074-8077, U+80F4, U+8105, U+8107-8108, U+8133, U+814E, U+816B, U+8178, U+819A, U+81B3, U+81C6, U+81D3, U+81E8, U+8208, U+820E, U+8217, U+8237, U+8266, U+8276, U+82B8, U+8328, U+8358, U+83D3, U+83EF, U+8449, U+84CB, U+8535, U+85A6, U+85AB-85AC, U+85CD, U+85E9, U+865C-865E, U+86CD, U+8846, U+8853, U+885B-885D, U+88CF, U+88DC, U+88FD-88FE, U+8907, U+8972, U+8987-89B3, U+8A02-8A87, U+8A8C-8A8D, U+8A95-8B5C, U+8B70-8B77, U+8C4A, U+8C9D-8D08, U+8DE1, U+8E74, U+8E8D, U+8ECA-8F44, U+8FB2, U+8FBA-8FBC, U+9013, U+9023, U+9031-9032, U+9045, U+904A-904B, U+904E, U+9054-9055, U+905C-9061, U+9069, U+9077-907A, U+9084, U+90B8, U+90E1, U+90F5-90F7, U+914E, U+9154, U+9162, U+919C-91B8, U+91C8, U+91DC-9271, U+9280-9451, U+9577, U+9580-95D8, U+961C, U+962A, U+965B, U+9663, U+9665, U+9670-9673, U+9678-967D, U+968A, U+968E, U+969B, U+96A0-96A3, U+96B7-96BB, U+96D1, U+96E2-96E3, U+96F0-96F2, U+96FB, U+970A, U+9727, U+97D3, U+97FB-9867, U+98A8, U+98DB, U+98E2-990C, U+9913-9928, U+99AC-9A5A, U+9AB8-9AC4, U+9AEA, U+9B31, U+9B5A-9BE8, U+9CE5-9DB4, U+9E93-9E97, U+9EBA, U+9ED2, U+9ED9, U+9F62, U+FF65-FF9F, U+20B9F;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono JP";
23
+ src: url("../fonts/BloxwapMonoJP/BloxwapMonoJP-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * mono-kr
3
+ * @bloxwap/font — https://bloxwap.github.io/font/ — SIL Open Font License 1.1. © 2026 Bloxwap, Inc.
4
+ */
5
+ @font-face {
6
+ font-family: "Bloxwap Mono";
7
+ src: url("../fonts/BloxwapMonoKR/BloxwapMonoKR-Variable.woff2") format("woff2");
8
+ font-weight: 100 900;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
12
+ }
13
+ @font-face {
14
+ font-family: "Bloxwap Mono";
15
+ src: url("../fonts/BloxwapMonoKR/BloxwapMonoKR-Variable.woff2") format("woff2");
16
+ font-weight: 100 900;
17
+ font-style: italic;
18
+ font-display: swap;
19
+ unicode-range: U+1100-11C2, U+3131-318E, U+3200-327B, U+AC00-D7A3;
20
+ }
21
+ @font-face {
22
+ font-family: "Bloxwap Mono KR";
23
+ src: url("../fonts/BloxwapMonoKR/BloxwapMonoKR-Variable.woff2") format("woff2");
24
+ font-weight: 100 900;
25
+ font-style: normal;
26
+ font-display: swap;
27
+ }