@nebutra/fonts 4.0.0 → 4.0.1
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.
- package/CHANGELOG.md +26 -0
- package/NOTICE-FONTS.md +16 -10
- package/dist/next.js +19 -19
- package/dist/next.js.map +1 -1
- package/generated/dm-sans.woff2 +0 -0
- package/generated/registry/dm-sans-latin-wght-normal.woff2 +0 -0
- package/generated/registry/figtree-latin-wght-normal.woff2 +0 -0
- package/generated/registry/fira-code-latin-wght-normal.woff2 +0 -0
- package/generated/registry/fraunces-latin-wght-normal.woff2 +0 -0
- package/generated/registry/inter-latin-wght-normal.woff2 +0 -0
- package/generated/registry/inter-tight-latin-wght-normal.woff2 +0 -0
- package/generated/registry/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/generated/registry/lexend-latin-wght-normal.woff2 +0 -0
- package/generated/registry/manrope-latin-wght-normal.woff2 +0 -0
- package/generated/registry/montserrat-latin-wght-normal.woff2 +0 -0
- package/generated/registry/outfit-latin-wght-normal.woff2 +0 -0
- package/generated/registry/playfair-display-latin-wght-normal.woff2 +0 -0
- package/generated/registry/plus-jakarta-sans-latin-wght-normal.woff2 +0 -0
- package/generated/registry/roboto-mono-latin-wght-normal.woff2 +0 -0
- package/generated/registry/sora-latin-wght-normal.woff2 +0 -0
- package/generated/registry/source-code-pro-latin-wght-normal.woff2 +0 -0
- package/generated/registry/source-serif-4-latin-wght-normal.woff2 +0 -0
- package/generated/registry/space-grotesk-latin-wght-normal.woff2 +0 -0
- package/generated/registry/work-sans-latin-wght-normal.woff2 +0 -0
- package/package.json +8 -5
- package/src/next-cjk.test.ts +9 -0
- package/src/next.test.ts +20 -8
- package/src/next.ts +42 -31
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @nebutra/fonts
|
|
2
2
|
|
|
3
|
+
## 4.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`076251c`](https://github.com/Nebutra/Nebutra-Sailor/commit/076251c6f5a1d74bf98192727d0b1895d88fe607) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Fix `next/font/local` paths in `@nebutra/fonts/next` breaking on a hoisted
|
|
8
|
+
`npm install` of the published package. The 19 registry faces pointed at
|
|
9
|
+
`../node_modules/@fontsource-variable/<name>/files/...`, which only resolved
|
|
10
|
+
because pnpm nests a workspace package's own dependencies under its own
|
|
11
|
+
node_modules; npm commonly hoists `@fontsource-variable/*` to the installing
|
|
12
|
+
project's top-level node_modules instead, so `next build` failed to resolve
|
|
13
|
+
the font file there.
|
|
14
|
+
|
|
15
|
+
The woff2 bytes are now vendored into the package itself
|
|
16
|
+
(`generated/registry/`, copied at build/prepack time by
|
|
17
|
+
`scripts/copy-registry-fonts.mjs` and committed to git, same pattern as the
|
|
18
|
+
existing `generated/dm-sans.woff2`), and `next.ts` references them by a
|
|
19
|
+
package-relative path instead. `@fontsource-variable/*` moved from
|
|
20
|
+
`dependencies` to `devDependencies` — they are only needed to vendor the
|
|
21
|
+
bytes at build time, never at runtime by a consumer.
|
|
22
|
+
|
|
23
|
+
Also fixes `generated/dm-sans.woff2` itself being omitted from the npm
|
|
24
|
+
`files` list — the same class of bug, just not yet hit by a downstream build.
|
|
25
|
+
|
|
26
|
+
- Updated dependencies []:
|
|
27
|
+
- @nebutra/brand@4.0.1
|
|
28
|
+
|
|
3
29
|
## 4.0.0
|
|
4
30
|
|
|
5
31
|
### Patch Changes
|
package/NOTICE-FONTS.md
CHANGED
|
@@ -19,21 +19,27 @@ License 1.1. Licence text: `vendor/dm-sans/OFL.txt`.
|
|
|
19
19
|
|
|
20
20
|
## Theme / DESIGN.md registry faces
|
|
21
21
|
|
|
22
|
-
`src/next.ts` loads 19 faces from
|
|
22
|
+
`src/next.ts` loads 19 faces from woff2 files vendored under
|
|
23
|
+
`generated/registry/`, sourced from `@fontsource-variable/*` npm packages
|
|
23
24
|
(Fontsource, version 5.3.0), each licensed under the **SIL Open Font License
|
|
24
25
|
1.1**, which permits use, embedding and redistribution, including bundling with
|
|
25
26
|
software: Inter, Inter Tight, Space Grotesk, Playfair Display, Source Serif 4,
|
|
26
27
|
Fraunces, JetBrains Mono, Manrope, Sora, Work Sans, DM Sans, Plus Jakarta Sans,
|
|
27
28
|
Outfit, Figtree, Montserrat, Lexend, Fira Code, Roboto Mono, Source Code Pro.
|
|
28
|
-
Each package carries its licence text (`LICENSE`) and copyright notice
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
Each package carries its licence text (`LICENSE`) and copyright notice. The
|
|
30
|
+
`@fontsource-variable/*` packages are devDependencies only, used to vendor the
|
|
31
|
+
woff2 bytes at build time (`scripts/copy-registry-fonts.mjs`, wired into
|
|
32
|
+
`build` and `prepack`); they are not required at runtime by anything that
|
|
33
|
+
depends on `@nebutra/fonts`.
|
|
31
34
|
|
|
32
35
|
## Distribution
|
|
33
36
|
|
|
34
|
-
The DM Sans subset (`generated/dm-sans.woff2`)
|
|
35
|
-
`
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
The DM Sans subset (`generated/dm-sans.woff2`) and the 19 registry faces
|
|
38
|
+
(`generated/registry/*.woff2`) are committed to git AND included in the npm
|
|
39
|
+
`files` list, so `next/font/local`'s package-relative `path` resolves the
|
|
40
|
+
same whether the package is a pnpm workspace symlink or a hoisted `npm
|
|
41
|
+
install` of the published tarball — the installing project's node_modules
|
|
42
|
+
layout no longer matters. MiSans subsets are the one exception: never
|
|
43
|
+
committed and never shipped, because the licence forbids distributing the
|
|
44
|
+
font on its own; they are uploaded to the deployment's asset CDN and
|
|
45
|
+
`<CjkFontFace />` points at them instead.
|
package/dist/next.js
CHANGED
|
@@ -11,7 +11,7 @@ import localFont from "next/font/local";
|
|
|
11
11
|
var inter = localFont({
|
|
12
12
|
src: [
|
|
13
13
|
{
|
|
14
|
-
path: "../
|
|
14
|
+
path: "../generated/registry/inter-latin-wght-normal.woff2",
|
|
15
15
|
weight: "100 900",
|
|
16
16
|
style: "normal"
|
|
17
17
|
}
|
|
@@ -23,7 +23,7 @@ var inter = localFont({
|
|
|
23
23
|
var interTight = localFont({
|
|
24
24
|
src: [
|
|
25
25
|
{
|
|
26
|
-
path: "../
|
|
26
|
+
path: "../generated/registry/inter-tight-latin-wght-normal.woff2",
|
|
27
27
|
weight: "100 900",
|
|
28
28
|
style: "normal"
|
|
29
29
|
}
|
|
@@ -35,7 +35,7 @@ var interTight = localFont({
|
|
|
35
35
|
var spaceGrotesk = localFont({
|
|
36
36
|
src: [
|
|
37
37
|
{
|
|
38
|
-
path: "../
|
|
38
|
+
path: "../generated/registry/space-grotesk-latin-wght-normal.woff2",
|
|
39
39
|
weight: "300 700",
|
|
40
40
|
style: "normal"
|
|
41
41
|
}
|
|
@@ -47,7 +47,7 @@ var spaceGrotesk = localFont({
|
|
|
47
47
|
var playfairDisplay = localFont({
|
|
48
48
|
src: [
|
|
49
49
|
{
|
|
50
|
-
path: "../
|
|
50
|
+
path: "../generated/registry/playfair-display-latin-wght-normal.woff2",
|
|
51
51
|
weight: "400 900",
|
|
52
52
|
style: "normal"
|
|
53
53
|
}
|
|
@@ -60,7 +60,7 @@ var playfairDisplay = localFont({
|
|
|
60
60
|
var fraunces = localFont({
|
|
61
61
|
src: [
|
|
62
62
|
{
|
|
63
|
-
path: "../
|
|
63
|
+
path: "../generated/registry/fraunces-latin-wght-normal.woff2",
|
|
64
64
|
weight: "100 900",
|
|
65
65
|
style: "normal"
|
|
66
66
|
}
|
|
@@ -73,7 +73,7 @@ var fraunces = localFont({
|
|
|
73
73
|
var jetbrainsMono = localFont({
|
|
74
74
|
src: [
|
|
75
75
|
{
|
|
76
|
-
path: "../
|
|
76
|
+
path: "../generated/registry/jetbrains-mono-latin-wght-normal.woff2",
|
|
77
77
|
weight: "100 800",
|
|
78
78
|
style: "normal"
|
|
79
79
|
}
|
|
@@ -85,7 +85,7 @@ var jetbrainsMono = localFont({
|
|
|
85
85
|
var manrope = localFont({
|
|
86
86
|
src: [
|
|
87
87
|
{
|
|
88
|
-
path: "../
|
|
88
|
+
path: "../generated/registry/manrope-latin-wght-normal.woff2",
|
|
89
89
|
weight: "200 800",
|
|
90
90
|
style: "normal"
|
|
91
91
|
}
|
|
@@ -97,7 +97,7 @@ var manrope = localFont({
|
|
|
97
97
|
var sora = localFont({
|
|
98
98
|
src: [
|
|
99
99
|
{
|
|
100
|
-
path: "../
|
|
100
|
+
path: "../generated/registry/sora-latin-wght-normal.woff2",
|
|
101
101
|
weight: "100 800",
|
|
102
102
|
style: "normal"
|
|
103
103
|
}
|
|
@@ -109,7 +109,7 @@ var sora = localFont({
|
|
|
109
109
|
var workSans = localFont({
|
|
110
110
|
src: [
|
|
111
111
|
{
|
|
112
|
-
path: "../
|
|
112
|
+
path: "../generated/registry/work-sans-latin-wght-normal.woff2",
|
|
113
113
|
weight: "100 900",
|
|
114
114
|
style: "normal"
|
|
115
115
|
}
|
|
@@ -121,7 +121,7 @@ var workSans = localFont({
|
|
|
121
121
|
var dmSans2 = localFont({
|
|
122
122
|
src: [
|
|
123
123
|
{
|
|
124
|
-
path: "../
|
|
124
|
+
path: "../generated/registry/dm-sans-latin-wght-normal.woff2",
|
|
125
125
|
weight: "100 1000",
|
|
126
126
|
style: "normal"
|
|
127
127
|
}
|
|
@@ -133,7 +133,7 @@ var dmSans2 = localFont({
|
|
|
133
133
|
var plusJakartaSans = localFont({
|
|
134
134
|
src: [
|
|
135
135
|
{
|
|
136
|
-
path: "../
|
|
136
|
+
path: "../generated/registry/plus-jakarta-sans-latin-wght-normal.woff2",
|
|
137
137
|
weight: "200 800",
|
|
138
138
|
style: "normal"
|
|
139
139
|
}
|
|
@@ -145,7 +145,7 @@ var plusJakartaSans = localFont({
|
|
|
145
145
|
var outfit = localFont({
|
|
146
146
|
src: [
|
|
147
147
|
{
|
|
148
|
-
path: "../
|
|
148
|
+
path: "../generated/registry/outfit-latin-wght-normal.woff2",
|
|
149
149
|
weight: "100 900",
|
|
150
150
|
style: "normal"
|
|
151
151
|
}
|
|
@@ -157,7 +157,7 @@ var outfit = localFont({
|
|
|
157
157
|
var figtree = localFont({
|
|
158
158
|
src: [
|
|
159
159
|
{
|
|
160
|
-
path: "../
|
|
160
|
+
path: "../generated/registry/figtree-latin-wght-normal.woff2",
|
|
161
161
|
weight: "300 900",
|
|
162
162
|
style: "normal"
|
|
163
163
|
}
|
|
@@ -169,7 +169,7 @@ var figtree = localFont({
|
|
|
169
169
|
var montserrat = localFont({
|
|
170
170
|
src: [
|
|
171
171
|
{
|
|
172
|
-
path: "../
|
|
172
|
+
path: "../generated/registry/montserrat-latin-wght-normal.woff2",
|
|
173
173
|
weight: "100 900",
|
|
174
174
|
style: "normal"
|
|
175
175
|
}
|
|
@@ -181,7 +181,7 @@ var montserrat = localFont({
|
|
|
181
181
|
var lexend = localFont({
|
|
182
182
|
src: [
|
|
183
183
|
{
|
|
184
|
-
path: "../
|
|
184
|
+
path: "../generated/registry/lexend-latin-wght-normal.woff2",
|
|
185
185
|
weight: "100 900",
|
|
186
186
|
style: "normal"
|
|
187
187
|
}
|
|
@@ -193,7 +193,7 @@ var lexend = localFont({
|
|
|
193
193
|
var firaCode = localFont({
|
|
194
194
|
src: [
|
|
195
195
|
{
|
|
196
|
-
path: "../
|
|
196
|
+
path: "../generated/registry/fira-code-latin-wght-normal.woff2",
|
|
197
197
|
weight: "300 700",
|
|
198
198
|
style: "normal"
|
|
199
199
|
}
|
|
@@ -205,7 +205,7 @@ var firaCode = localFont({
|
|
|
205
205
|
var robotoMono = localFont({
|
|
206
206
|
src: [
|
|
207
207
|
{
|
|
208
|
-
path: "../
|
|
208
|
+
path: "../generated/registry/roboto-mono-latin-wght-normal.woff2",
|
|
209
209
|
weight: "100 700",
|
|
210
210
|
style: "normal"
|
|
211
211
|
}
|
|
@@ -217,7 +217,7 @@ var robotoMono = localFont({
|
|
|
217
217
|
var sourceSerif4 = localFont({
|
|
218
218
|
src: [
|
|
219
219
|
{
|
|
220
|
-
path: "../
|
|
220
|
+
path: "../generated/registry/source-serif-4-latin-wght-normal.woff2",
|
|
221
221
|
weight: "200 900",
|
|
222
222
|
style: "normal"
|
|
223
223
|
}
|
|
@@ -230,7 +230,7 @@ var sourceSerif4 = localFont({
|
|
|
230
230
|
var sourceCodePro = localFont({
|
|
231
231
|
src: [
|
|
232
232
|
{
|
|
233
|
-
path: "../
|
|
233
|
+
path: "../generated/registry/source-code-pro-latin-wght-normal.woff2",
|
|
234
234
|
weight: "200 900",
|
|
235
235
|
style: "normal"
|
|
236
236
|
}
|
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next.ts"],"sourcesContent":["/**\n * @nebutra/fonts/next — the theme / DESIGN.md registry faces (server-only).\n *\n * Every face is loaded through `next/font/local` from an `@fontsource-variable/*`\n * package that arrives with `pnpm install` — the build and the dev server make\n * NO request to fonts.googleapis.com / fonts.gstatic.com. That is the point:\n * with `next/font/google`, a machine that cannot reach Google (mainland China,\n * a corporate proxy, a plane) failed `next build` outright and answered 500 from\n * the Turbopack dev server (\"Can't resolve '@vercel/turbopack-next/internal/font/google/font'\"),\n * so a scaffold's preview site was dead on arrival. npm packages are mirrored\n * everywhere (npmmirror in China); Google Fonts is not.\n *\n * The files are the same Google Fonts builds (same font version, same `wght`\n * axis, identical shaping — checked glyph by glyph against what\n * next/font/google downloaded): Fontsource republishes them under the SIL OFL\n * 1.1, which permits redistribution. Each face is the Latin subset of the\n * upright variable font, the subset the registry declared (`subsets: [\"latin\"]`)\n * and the only one it preloaded. Weight ranges are the ones Google served.\n * Serif faces take Times New Roman as the metric-matched fallback, as\n * next/font/google did; the rest take Arial. Each face keeps its Google family\n * name through `declarations` — without it next/font/local names the family\n * after the const, and this file's `dmSans` collided with the brand `dmSans` in\n * ./next-cjk: two @font-face rules under one family, and the heading face\n * rendered from the wrong file.\n *\n * Each face exposes a CSS variable; the browser only fetches a given file when\n * an element resolves to that variable, so declaring the whole registry is\n * cheap. Apply `fontRegistryClassName` to <html> so the `--font-*` variables\n * exist; the appearance layer then prepends the matching `var(--font-*)` (see\n * the client-safe map in `@nebutra/fonts`) when a theme / DESIGN.md font\n * matches. Keep the `variable` names in sync with FONT_REGISTRY in `../index.ts`.\n *\n * next/font is a compile-time transform: SWC statically analyses each call, so\n * every options object is a literal and every `path` a string literal. The path\n * is relative to this file and goes through the package's own node_modules\n * (pnpm links every dependency there), so it resolves the same from `src/` and\n * `dist/`. `scripts/lint-no-google-fonts.mjs` keeps `next/font/google` out of\n * template-shipped code.\n *\n * The brand faces live in `./next-cjk` — DM Sans (next/font/local) and\n * <CjkFontFace /> for the CDN-hosted MiSans — and are re-exported here for\n * discoverability. They are NOT folded into `fontRegistryClassName`: they are\n * core typography, not optional theme faces, and every app wires them the same\n * way — `${cjkFontClassName}` on <html> beside the Geist loaders and\n * <CjkFontFace /> in the root layout. Apps that only need them should import\n * `@nebutra/fonts/next/cjk` directly so they don't pull in the registry below.\n */\n\nimport localFont from \"next/font/local\";\n\nexport { brandFontClassName, CjkFontFace, cjkFontClassName, dmSans } from \"./next-cjk\";\n\nconst inter = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Inter'\" }],\n variable: \"--font-inter\",\n});\nconst interTight = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/inter-tight/files/inter-tight-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Inter Tight'\" }],\n variable: \"--font-reg-inter-tight\",\n});\nconst spaceGrotesk = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/space-grotesk/files/space-grotesk-latin-wght-normal.woff2\",\n weight: \"300 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Space Grotesk'\" }],\n variable: \"--font-space-grotesk\",\n});\nconst playfairDisplay = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/playfair-display/files/playfair-display-latin-wght-normal.woff2\",\n weight: \"400 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Playfair Display'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-playfair-display\",\n});\nconst fraunces = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/fraunces/files/fraunces-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Fraunces'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-reg-fraunces\",\n});\nconst jetbrainsMono = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2\",\n weight: \"100 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'JetBrains Mono'\" }],\n variable: \"--font-jetbrains-mono\",\n});\nconst manrope = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/manrope/files/manrope-latin-wght-normal.woff2\",\n weight: \"200 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Manrope'\" }],\n variable: \"--font-reg-manrope\",\n});\nconst sora = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/sora/files/sora-latin-wght-normal.woff2\",\n weight: \"100 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Sora'\" }],\n variable: \"--font-reg-sora\",\n});\nconst workSans = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/work-sans/files/work-sans-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Work Sans'\" }],\n variable: \"--font-reg-work-sans\",\n});\nconst dmSans = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/dm-sans/files/dm-sans-latin-wght-normal.woff2\",\n weight: \"100 1000\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'DM Sans'\" }],\n variable: \"--font-reg-dm-sans\",\n});\nconst plusJakartaSans = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/plus-jakarta-sans/files/plus-jakarta-sans-latin-wght-normal.woff2\",\n weight: \"200 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Plus Jakarta Sans'\" }],\n variable: \"--font-reg-plus-jakarta-sans\",\n});\nconst outfit = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/outfit/files/outfit-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Outfit'\" }],\n variable: \"--font-reg-outfit\",\n});\nconst figtree = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/figtree/files/figtree-latin-wght-normal.woff2\",\n weight: \"300 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Figtree'\" }],\n variable: \"--font-reg-figtree\",\n});\nconst montserrat = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/montserrat/files/montserrat-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Montserrat'\" }],\n variable: \"--font-reg-montserrat\",\n});\nconst lexend = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Lexend'\" }],\n variable: \"--font-reg-lexend\",\n});\nconst firaCode = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/fira-code/files/fira-code-latin-wght-normal.woff2\",\n weight: \"300 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Fira Code'\" }],\n variable: \"--font-reg-fira-code\",\n});\nconst robotoMono = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/roboto-mono/files/roboto-mono-latin-wght-normal.woff2\",\n weight: \"100 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Roboto Mono'\" }],\n variable: \"--font-reg-roboto-mono\",\n});\nconst sourceSerif4 = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/source-serif-4/files/source-serif-4-latin-wght-normal.woff2\",\n weight: \"200 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Source Serif 4'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-reg-source-serif-4\",\n});\nconst sourceCodePro = localFont({\n src: [\n {\n path: \"../node_modules/@fontsource-variable/source-code-pro/files/source-code-pro-latin-wght-normal.woff2\",\n weight: \"200 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Source Code Pro'\" }],\n variable: \"--font-reg-source-code-pro\",\n});\n\n/** All registry faces, in declaration order. */\nexport const FONT_REGISTRY_FACES = [\n inter,\n interTight,\n spaceGrotesk,\n playfairDisplay,\n sourceSerif4,\n fraunces,\n jetbrainsMono,\n manrope,\n sora,\n workSans,\n dmSans,\n plusJakartaSans,\n outfit,\n figtree,\n montserrat,\n lexend,\n firaCode,\n robotoMono,\n sourceCodePro,\n] as const;\n\n/**\n * Space-joined `.variable` classNames for every registry face. Apply to <html>\n * so all `--font-*` registry variables are defined (font files lazy-load on\n * first use). Combine with the app's own Geist faces.\n */\nexport const fontRegistryClassName = FONT_REGISTRY_FACES.map((face) => face.variable).join(\" \");\n"],"mappings":";;;;;;;;;AAgDA,OAAO,eAAe;AAItB,IAAM,QAAQ,UAAU;AAAA,EACtB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,UAAU,CAAC;AAAA,EACxD,UAAU;AACZ,CAAC;AACD,IAAM,aAAa,UAAU;AAAA,EAC3B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,gBAAgB,CAAC;AAAA,EAC9D,UAAU;AACZ,CAAC;AACD,IAAM,eAAe,UAAU;AAAA,EAC7B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,kBAAkB,CAAC;AAAA,EAChE,UAAU;AACZ,CAAC;AACD,IAAM,kBAAkB,UAAU;AAAA,EAChC,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,qBAAqB,CAAC;AAAA,EACnE,oBAAoB;AAAA,EACpB,UAAU;AACZ,CAAC;AACD,IAAM,WAAW,UAAU;AAAA,EACzB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,aAAa,CAAC;AAAA,EAC3D,oBAAoB;AAAA,EACpB,UAAU;AACZ,CAAC;AACD,IAAM,gBAAgB,UAAU;AAAA,EAC9B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,mBAAmB,CAAC;AAAA,EACjE,UAAU;AACZ,CAAC;AACD,IAAM,UAAU,UAAU;AAAA,EACxB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,YAAY,CAAC;AAAA,EAC1D,UAAU;AACZ,CAAC;AACD,IAAM,OAAO,UAAU;AAAA,EACrB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,SAAS,CAAC;AAAA,EACvD,UAAU;AACZ,CAAC;AACD,IAAM,WAAW,UAAU;AAAA,EACzB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,cAAc,CAAC;AAAA,EAC5D,UAAU;AACZ,CAAC;AACD,IAAMA,UAAS,UAAU;AAAA,EACvB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,YAAY,CAAC;AAAA,EAC1D,UAAU;AACZ,CAAC;AACD,IAAM,kBAAkB,UAAU;AAAA,EAChC,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,sBAAsB,CAAC;AAAA,EACpE,UAAU;AACZ,CAAC;AACD,IAAM,SAAS,UAAU;AAAA,EACvB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,WAAW,CAAC;AAAA,EACzD,UAAU;AACZ,CAAC;AACD,IAAM,UAAU,UAAU;AAAA,EACxB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,YAAY,CAAC;AAAA,EAC1D,UAAU;AACZ,CAAC;AACD,IAAM,aAAa,UAAU;AAAA,EAC3B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,eAAe,CAAC;AAAA,EAC7D,UAAU;AACZ,CAAC;AACD,IAAM,SAAS,UAAU;AAAA,EACvB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,WAAW,CAAC;AAAA,EACzD,UAAU;AACZ,CAAC;AACD,IAAM,WAAW,UAAU;AAAA,EACzB,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,cAAc,CAAC;AAAA,EAC5D,UAAU;AACZ,CAAC;AACD,IAAM,aAAa,UAAU;AAAA,EAC3B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,gBAAgB,CAAC;AAAA,EAC9D,UAAU;AACZ,CAAC;AACD,IAAM,eAAe,UAAU;AAAA,EAC7B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,mBAAmB,CAAC;AAAA,EACjE,oBAAoB;AAAA,EACpB,UAAU;AACZ,CAAC;AACD,IAAM,gBAAgB,UAAU;AAAA,EAC9B,KAAK;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,cAAc,CAAC,EAAE,MAAM,eAAe,OAAO,oBAAoB,CAAC;AAAA,EAClE,UAAU;AACZ,CAAC;AAGM,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,IAAM,wBAAwB,oBAAoB,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,KAAK,GAAG;","names":["dmSans"]}
|
|
1
|
+
{"version":3,"sources":["../src/next.ts"],"sourcesContent":["/**\n * @nebutra/fonts/next — the theme / DESIGN.md registry faces (server-only).\n *\n * Every face is loaded through `next/font/local` from a woff2 vendored into\n * this package's own `../generated/registry/` — the build and the dev server\n * make NO request to fonts.googleapis.com / fonts.gstatic.com. That is the\n * point: with `next/font/google`, a machine that cannot reach Google\n * (mainland China, a corporate proxy, a plane) failed `next build` outright\n * and answered 500 from the Turbopack dev server (\"Can't resolve\n * '@vercel/turbopack-next/internal/font/google/font'\"), so a scaffold's\n * preview site was dead on arrival. npm packages are mirrored everywhere\n * (npmmirror in China); Google Fonts is not.\n *\n * The files are the same Google Fonts builds (same font version, same `wght`\n * axis, identical shaping — checked glyph by glyph against what\n * next/font/google downloaded): Fontsource republishes them under the SIL OFL\n * 1.1, which permits redistribution. Each face is the Latin subset of the\n * upright variable font, the subset the registry declared (`subsets: [\"latin\"]`)\n * and the only one it preloaded. Weight ranges are the ones Google served.\n * Serif faces take Times New Roman as the metric-matched fallback, as\n * next/font/google did; the rest take Arial. Each face keeps its Google family\n * name through `declarations` — without it next/font/local names the family\n * after the const, and this file's `dmSans` collided with the brand `dmSans` in\n * ./next-cjk: two @font-face rules under one family, and the heading face\n * rendered from the wrong file.\n *\n * Each face exposes a CSS variable; the browser only fetches a given file when\n * an element resolves to that variable, so declaring the whole registry is\n * cheap. Apply `fontRegistryClassName` to <html> so the `--font-*` variables\n * exist; the appearance layer then prepends the matching `var(--font-*)` (see\n * the client-safe map in `@nebutra/fonts`) when a theme / DESIGN.md font\n * matches. Keep the `variable` names in sync with FONT_REGISTRY in `../index.ts`.\n *\n * next/font is a compile-time transform: SWC statically analyses each call, so\n * every options object is a literal and every `path` a string literal,\n * resolved relative to this file. It used to point at\n * `../node_modules/@fontsource-variable/<name>/files/...`, which only exists\n * because pnpm nests every workspace package's own dependencies under its own\n * node_modules — a hoisted `npm install` of the published `@nebutra/fonts`\n * commonly resolves `@fontsource-variable/*` to the installing project's\n * top-level node_modules instead, so that path did not exist there and\n * `next build` failed to resolve the font file. The woff2 files are copied\n * into `../generated/registry/` by `scripts/copy-registry-fonts.mjs` (wired\n * into `build` and `prepack`, and the copies are committed so a clean clone\n * works without running it) and committed to git — same pattern as\n * `../generated/dm-sans.woff2` below — so the path is package-relative and\n * resolves the same regardless of how npm/pnpm/yarn laid out node_modules.\n * `scripts/lint-no-google-fonts.mjs` keeps `next/font/google` out of\n * template-shipped code.\n *\n * The brand faces live in `./next-cjk` — DM Sans (next/font/local) and\n * <CjkFontFace /> for the CDN-hosted MiSans — and are re-exported here for\n * discoverability. They are NOT folded into `fontRegistryClassName`: they are\n * core typography, not optional theme faces, and every app wires them the same\n * way — `${cjkFontClassName}` on <html> beside the Geist loaders and\n * <CjkFontFace /> in the root layout. Apps that only need them should import\n * `@nebutra/fonts/next/cjk` directly so they don't pull in the registry below.\n */\n\nimport localFont from \"next/font/local\";\n\nexport { brandFontClassName, CjkFontFace, cjkFontClassName, dmSans } from \"./next-cjk\";\n\nconst inter = localFont({\n src: [\n {\n path: \"../generated/registry/inter-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Inter'\" }],\n variable: \"--font-inter\",\n});\nconst interTight = localFont({\n src: [\n {\n path: \"../generated/registry/inter-tight-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Inter Tight'\" }],\n variable: \"--font-reg-inter-tight\",\n});\nconst spaceGrotesk = localFont({\n src: [\n {\n path: \"../generated/registry/space-grotesk-latin-wght-normal.woff2\",\n weight: \"300 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Space Grotesk'\" }],\n variable: \"--font-space-grotesk\",\n});\nconst playfairDisplay = localFont({\n src: [\n {\n path: \"../generated/registry/playfair-display-latin-wght-normal.woff2\",\n weight: \"400 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Playfair Display'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-playfair-display\",\n});\nconst fraunces = localFont({\n src: [\n {\n path: \"../generated/registry/fraunces-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Fraunces'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-reg-fraunces\",\n});\nconst jetbrainsMono = localFont({\n src: [\n {\n path: \"../generated/registry/jetbrains-mono-latin-wght-normal.woff2\",\n weight: \"100 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'JetBrains Mono'\" }],\n variable: \"--font-jetbrains-mono\",\n});\nconst manrope = localFont({\n src: [\n {\n path: \"../generated/registry/manrope-latin-wght-normal.woff2\",\n weight: \"200 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Manrope'\" }],\n variable: \"--font-reg-manrope\",\n});\nconst sora = localFont({\n src: [\n {\n path: \"../generated/registry/sora-latin-wght-normal.woff2\",\n weight: \"100 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Sora'\" }],\n variable: \"--font-reg-sora\",\n});\nconst workSans = localFont({\n src: [\n {\n path: \"../generated/registry/work-sans-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Work Sans'\" }],\n variable: \"--font-reg-work-sans\",\n});\nconst dmSans = localFont({\n src: [\n {\n path: \"../generated/registry/dm-sans-latin-wght-normal.woff2\",\n weight: \"100 1000\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'DM Sans'\" }],\n variable: \"--font-reg-dm-sans\",\n});\nconst plusJakartaSans = localFont({\n src: [\n {\n path: \"../generated/registry/plus-jakarta-sans-latin-wght-normal.woff2\",\n weight: \"200 800\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Plus Jakarta Sans'\" }],\n variable: \"--font-reg-plus-jakarta-sans\",\n});\nconst outfit = localFont({\n src: [\n {\n path: \"../generated/registry/outfit-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Outfit'\" }],\n variable: \"--font-reg-outfit\",\n});\nconst figtree = localFont({\n src: [\n {\n path: \"../generated/registry/figtree-latin-wght-normal.woff2\",\n weight: \"300 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Figtree'\" }],\n variable: \"--font-reg-figtree\",\n});\nconst montserrat = localFont({\n src: [\n {\n path: \"../generated/registry/montserrat-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Montserrat'\" }],\n variable: \"--font-reg-montserrat\",\n});\nconst lexend = localFont({\n src: [\n {\n path: \"../generated/registry/lexend-latin-wght-normal.woff2\",\n weight: \"100 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Lexend'\" }],\n variable: \"--font-reg-lexend\",\n});\nconst firaCode = localFont({\n src: [\n {\n path: \"../generated/registry/fira-code-latin-wght-normal.woff2\",\n weight: \"300 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Fira Code'\" }],\n variable: \"--font-reg-fira-code\",\n});\nconst robotoMono = localFont({\n src: [\n {\n path: \"../generated/registry/roboto-mono-latin-wght-normal.woff2\",\n weight: \"100 700\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Roboto Mono'\" }],\n variable: \"--font-reg-roboto-mono\",\n});\nconst sourceSerif4 = localFont({\n src: [\n {\n path: \"../generated/registry/source-serif-4-latin-wght-normal.woff2\",\n weight: \"200 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Source Serif 4'\" }],\n adjustFontFallback: \"Times New Roman\",\n variable: \"--font-reg-source-serif-4\",\n});\nconst sourceCodePro = localFont({\n src: [\n {\n path: \"../generated/registry/source-code-pro-latin-wght-normal.woff2\",\n weight: \"200 900\",\n style: \"normal\",\n },\n ],\n display: \"swap\",\n declarations: [{ prop: \"font-family\", value: \"'Source Code Pro'\" }],\n variable: \"--font-reg-source-code-pro\",\n});\n\n/** All registry faces, in declaration order. */\nexport const FONT_REGISTRY_FACES = [\n inter,\n interTight,\n spaceGrotesk,\n playfairDisplay,\n sourceSerif4,\n fraunces,\n jetbrainsMono,\n manrope,\n sora,\n workSans,\n dmSans,\n plusJakartaSans,\n outfit,\n figtree,\n montserrat,\n lexend,\n firaCode,\n robotoMono,\n sourceCodePro,\n] as const;\n\n/**\n * Space-joined `.variable` classNames for every registry face. Apply to <html>\n * so all `--font-*` registry variables are defined (font files lazy-load on\n * first use). Combine with the app's own Geist faces.\n */\nexport const fontRegistryClassName = FONT_REGISTRY_FACES.map((face) => face.variable).join(\" \");\n"],"mappings":"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","names":["dmSans"]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nebutra/fonts",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Self-hosted OSS font registry — build-time next/font faces + a name→CSS-var resolver so theme / DESIGN.md fonts render with zero runtime external requests",
|
|
6
6
|
"private": false,
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"src",
|
|
28
28
|
"generated/subset-manifest.json",
|
|
29
29
|
"generated/index.ts",
|
|
30
|
+
"generated/dm-sans.woff2",
|
|
31
|
+
"generated/registry",
|
|
30
32
|
"vendor/misans/LICENSE.txt",
|
|
31
33
|
"vendor/dm-sans/OFL.txt",
|
|
32
34
|
"NOTICE-FONTS.md",
|
|
@@ -69,6 +71,9 @@
|
|
|
69
71
|
}
|
|
70
72
|
},
|
|
71
73
|
"dependencies": {
|
|
74
|
+
"@nebutra/brand": "4.0.1"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
72
77
|
"@fontsource-variable/dm-sans": "5.3.0",
|
|
73
78
|
"@fontsource-variable/figtree": "5.3.0",
|
|
74
79
|
"@fontsource-variable/fira-code": "5.3.0",
|
|
@@ -88,9 +93,6 @@
|
|
|
88
93
|
"@fontsource-variable/source-serif-4": "5.3.0",
|
|
89
94
|
"@fontsource-variable/space-grotesk": "5.3.0",
|
|
90
95
|
"@fontsource-variable/work-sans": "5.3.0",
|
|
91
|
-
"@nebutra/brand": "4.0.0"
|
|
92
|
-
},
|
|
93
|
-
"devDependencies": {
|
|
94
96
|
"@types/react": "^19.2.14",
|
|
95
97
|
"typescript": "^5.9.3",
|
|
96
98
|
"vitest": "^4.1.4",
|
|
@@ -105,8 +107,9 @@
|
|
|
105
107
|
},
|
|
106
108
|
"scripts": {
|
|
107
109
|
"subset:cjk": "node scripts/subset-cjk.mjs",
|
|
110
|
+
"fonts:registry": "node scripts/copy-registry-fonts.mjs",
|
|
108
111
|
"test": "vitest run",
|
|
109
112
|
"typecheck": "tsc --noEmit",
|
|
110
|
-
"build": "tsup"
|
|
113
|
+
"build": "pnpm run fonts:registry && tsup"
|
|
111
114
|
}
|
|
112
115
|
}
|
package/src/next-cjk.test.ts
CHANGED
|
@@ -53,4 +53,13 @@ describe("DM Sans wiring", () => {
|
|
|
53
53
|
expect(NEXT_CJK_SOURCE).toContain('variable: "--font-dm-sans"');
|
|
54
54
|
expect(FONT_REGISTRY["dm sans display"]).toBe("--font-dm-sans");
|
|
55
55
|
});
|
|
56
|
+
|
|
57
|
+
it("ships generated/dm-sans.woff2 in the npm `files` list", () => {
|
|
58
|
+
// Previously omitted: `path` is package-relative (correct — see next.ts),
|
|
59
|
+
// but the woff2 wasn't in `files`, so a published install never actually
|
|
60
|
+
// had the byte the path points at. Same root cause as the 19 registry
|
|
61
|
+
// faces, caught by the same audit.
|
|
62
|
+
const pkg = JSON.parse(read("../package.json")) as { files: string[] };
|
|
63
|
+
expect(pkg.files).toContain("generated/dm-sans.woff2");
|
|
64
|
+
});
|
|
56
65
|
});
|
package/src/next.test.ts
CHANGED
|
@@ -37,25 +37,37 @@ describe("registry faces (@nebutra/fonts/next)", () => {
|
|
|
37
37
|
expect(faces.map((f) => f.name).sort()).toEqual([...names].sort());
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
it("loads each face from
|
|
40
|
+
it("loads each face from the package's own vendored generated/registry/ (not node_modules)", () => {
|
|
41
|
+
// Package-relative, not `../node_modules/@fontsource-variable/...`: that
|
|
42
|
+
// path only existed because pnpm nests a workspace package's own deps
|
|
43
|
+
// under its own node_modules. A hoisted `npm install` of the published
|
|
44
|
+
// package resolves @fontsource-variable/* elsewhere, so the woff2 bytes
|
|
45
|
+
// are vendored into the package itself (scripts/copy-registry-fonts.mjs)
|
|
46
|
+
// and referenced from a path that resolves the same everywhere.
|
|
41
47
|
for (const { path } of faces) {
|
|
42
|
-
expect(path).toMatch(
|
|
43
|
-
/^\.\.\/node_modules\/@fontsource-variable\/([a-z0-9-]+)\/files\/\1-latin-wght-normal\.woff2$/,
|
|
44
|
-
);
|
|
48
|
+
expect(path).toMatch(/^\.\.\/generated\/registry\/([a-z0-9-]+)-latin-wght-normal\.woff2$/);
|
|
45
49
|
expect(existsSync(here(path)), path).toBe(true);
|
|
46
50
|
}
|
|
47
51
|
});
|
|
48
52
|
|
|
49
|
-
it("depends on every package it
|
|
53
|
+
it("depends on every @fontsource-variable package it vendors from, pinned (devDependency)", () => {
|
|
50
54
|
const pkg = JSON.parse(readFileSync(here("../package.json"), "utf8")) as {
|
|
51
|
-
|
|
55
|
+
devDependencies: Record<string, string>;
|
|
52
56
|
};
|
|
53
57
|
for (const { path } of faces) {
|
|
54
|
-
const
|
|
55
|
-
|
|
58
|
+
const fileName = /registry\/([a-z0-9-]+)-latin-wght-normal\.woff2$/.exec(path)?.[1] ?? "";
|
|
59
|
+
const name = `@fontsource-variable/${fileName}`;
|
|
60
|
+
expect(pkg.devDependencies[name], name).toMatch(/^\d+\.\d+\.\d+$/);
|
|
56
61
|
}
|
|
57
62
|
});
|
|
58
63
|
|
|
64
|
+
it("ships the vendored registry woff2 files in the npm `files` list", () => {
|
|
65
|
+
const pkg = JSON.parse(readFileSync(here("../package.json"), "utf8")) as {
|
|
66
|
+
files: string[];
|
|
67
|
+
};
|
|
68
|
+
expect(pkg.files).toContain("generated/registry");
|
|
69
|
+
});
|
|
70
|
+
|
|
59
71
|
it("keeps the variables FONT_REGISTRY resolves to, and distinct family names", () => {
|
|
60
72
|
const registryVars = new Set(Object.values(FONT_REGISTRY));
|
|
61
73
|
for (const { variable } of faces) expect(registryVars.has(variable), variable).toBe(true);
|
package/src/next.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @nebutra/fonts/next — the theme / DESIGN.md registry faces (server-only).
|
|
3
3
|
*
|
|
4
|
-
* Every face is loaded through `next/font/local` from
|
|
5
|
-
* package
|
|
6
|
-
* NO request to fonts.googleapis.com / fonts.gstatic.com. That is the
|
|
7
|
-
* with `next/font/google`, a machine that cannot reach Google
|
|
8
|
-
* a corporate proxy, a plane) failed `next build` outright
|
|
9
|
-
* the Turbopack dev server ("Can't resolve
|
|
10
|
-
* so a scaffold's
|
|
11
|
-
*
|
|
4
|
+
* Every face is loaded through `next/font/local` from a woff2 vendored into
|
|
5
|
+
* this package's own `../generated/registry/` — the build and the dev server
|
|
6
|
+
* make NO request to fonts.googleapis.com / fonts.gstatic.com. That is the
|
|
7
|
+
* point: with `next/font/google`, a machine that cannot reach Google
|
|
8
|
+
* (mainland China, a corporate proxy, a plane) failed `next build` outright
|
|
9
|
+
* and answered 500 from the Turbopack dev server ("Can't resolve
|
|
10
|
+
* '@vercel/turbopack-next/internal/font/google/font'"), so a scaffold's
|
|
11
|
+
* preview site was dead on arrival. npm packages are mirrored everywhere
|
|
12
|
+
* (npmmirror in China); Google Fonts is not.
|
|
12
13
|
*
|
|
13
14
|
* The files are the same Google Fonts builds (same font version, same `wght`
|
|
14
15
|
* axis, identical shaping — checked glyph by glyph against what
|
|
@@ -31,10 +32,20 @@
|
|
|
31
32
|
* matches. Keep the `variable` names in sync with FONT_REGISTRY in `../index.ts`.
|
|
32
33
|
*
|
|
33
34
|
* next/font is a compile-time transform: SWC statically analyses each call, so
|
|
34
|
-
* every options object is a literal and every `path` a string literal
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* every options object is a literal and every `path` a string literal,
|
|
36
|
+
* resolved relative to this file. It used to point at
|
|
37
|
+
* `../node_modules/@fontsource-variable/<name>/files/...`, which only exists
|
|
38
|
+
* because pnpm nests every workspace package's own dependencies under its own
|
|
39
|
+
* node_modules — a hoisted `npm install` of the published `@nebutra/fonts`
|
|
40
|
+
* commonly resolves `@fontsource-variable/*` to the installing project's
|
|
41
|
+
* top-level node_modules instead, so that path did not exist there and
|
|
42
|
+
* `next build` failed to resolve the font file. The woff2 files are copied
|
|
43
|
+
* into `../generated/registry/` by `scripts/copy-registry-fonts.mjs` (wired
|
|
44
|
+
* into `build` and `prepack`, and the copies are committed so a clean clone
|
|
45
|
+
* works without running it) and committed to git — same pattern as
|
|
46
|
+
* `../generated/dm-sans.woff2` below — so the path is package-relative and
|
|
47
|
+
* resolves the same regardless of how npm/pnpm/yarn laid out node_modules.
|
|
48
|
+
* `scripts/lint-no-google-fonts.mjs` keeps `next/font/google` out of
|
|
38
49
|
* template-shipped code.
|
|
39
50
|
*
|
|
40
51
|
* The brand faces live in `./next-cjk` — DM Sans (next/font/local) and
|
|
@@ -53,7 +64,7 @@ export { brandFontClassName, CjkFontFace, cjkFontClassName, dmSans } from "./nex
|
|
|
53
64
|
const inter = localFont({
|
|
54
65
|
src: [
|
|
55
66
|
{
|
|
56
|
-
path: "../
|
|
67
|
+
path: "../generated/registry/inter-latin-wght-normal.woff2",
|
|
57
68
|
weight: "100 900",
|
|
58
69
|
style: "normal",
|
|
59
70
|
},
|
|
@@ -65,7 +76,7 @@ const inter = localFont({
|
|
|
65
76
|
const interTight = localFont({
|
|
66
77
|
src: [
|
|
67
78
|
{
|
|
68
|
-
path: "../
|
|
79
|
+
path: "../generated/registry/inter-tight-latin-wght-normal.woff2",
|
|
69
80
|
weight: "100 900",
|
|
70
81
|
style: "normal",
|
|
71
82
|
},
|
|
@@ -77,7 +88,7 @@ const interTight = localFont({
|
|
|
77
88
|
const spaceGrotesk = localFont({
|
|
78
89
|
src: [
|
|
79
90
|
{
|
|
80
|
-
path: "../
|
|
91
|
+
path: "../generated/registry/space-grotesk-latin-wght-normal.woff2",
|
|
81
92
|
weight: "300 700",
|
|
82
93
|
style: "normal",
|
|
83
94
|
},
|
|
@@ -89,7 +100,7 @@ const spaceGrotesk = localFont({
|
|
|
89
100
|
const playfairDisplay = localFont({
|
|
90
101
|
src: [
|
|
91
102
|
{
|
|
92
|
-
path: "../
|
|
103
|
+
path: "../generated/registry/playfair-display-latin-wght-normal.woff2",
|
|
93
104
|
weight: "400 900",
|
|
94
105
|
style: "normal",
|
|
95
106
|
},
|
|
@@ -102,7 +113,7 @@ const playfairDisplay = localFont({
|
|
|
102
113
|
const fraunces = localFont({
|
|
103
114
|
src: [
|
|
104
115
|
{
|
|
105
|
-
path: "../
|
|
116
|
+
path: "../generated/registry/fraunces-latin-wght-normal.woff2",
|
|
106
117
|
weight: "100 900",
|
|
107
118
|
style: "normal",
|
|
108
119
|
},
|
|
@@ -115,7 +126,7 @@ const fraunces = localFont({
|
|
|
115
126
|
const jetbrainsMono = localFont({
|
|
116
127
|
src: [
|
|
117
128
|
{
|
|
118
|
-
path: "../
|
|
129
|
+
path: "../generated/registry/jetbrains-mono-latin-wght-normal.woff2",
|
|
119
130
|
weight: "100 800",
|
|
120
131
|
style: "normal",
|
|
121
132
|
},
|
|
@@ -127,7 +138,7 @@ const jetbrainsMono = localFont({
|
|
|
127
138
|
const manrope = localFont({
|
|
128
139
|
src: [
|
|
129
140
|
{
|
|
130
|
-
path: "../
|
|
141
|
+
path: "../generated/registry/manrope-latin-wght-normal.woff2",
|
|
131
142
|
weight: "200 800",
|
|
132
143
|
style: "normal",
|
|
133
144
|
},
|
|
@@ -139,7 +150,7 @@ const manrope = localFont({
|
|
|
139
150
|
const sora = localFont({
|
|
140
151
|
src: [
|
|
141
152
|
{
|
|
142
|
-
path: "../
|
|
153
|
+
path: "../generated/registry/sora-latin-wght-normal.woff2",
|
|
143
154
|
weight: "100 800",
|
|
144
155
|
style: "normal",
|
|
145
156
|
},
|
|
@@ -151,7 +162,7 @@ const sora = localFont({
|
|
|
151
162
|
const workSans = localFont({
|
|
152
163
|
src: [
|
|
153
164
|
{
|
|
154
|
-
path: "../
|
|
165
|
+
path: "../generated/registry/work-sans-latin-wght-normal.woff2",
|
|
155
166
|
weight: "100 900",
|
|
156
167
|
style: "normal",
|
|
157
168
|
},
|
|
@@ -163,7 +174,7 @@ const workSans = localFont({
|
|
|
163
174
|
const dmSans = localFont({
|
|
164
175
|
src: [
|
|
165
176
|
{
|
|
166
|
-
path: "../
|
|
177
|
+
path: "../generated/registry/dm-sans-latin-wght-normal.woff2",
|
|
167
178
|
weight: "100 1000",
|
|
168
179
|
style: "normal",
|
|
169
180
|
},
|
|
@@ -175,7 +186,7 @@ const dmSans = localFont({
|
|
|
175
186
|
const plusJakartaSans = localFont({
|
|
176
187
|
src: [
|
|
177
188
|
{
|
|
178
|
-
path: "../
|
|
189
|
+
path: "../generated/registry/plus-jakarta-sans-latin-wght-normal.woff2",
|
|
179
190
|
weight: "200 800",
|
|
180
191
|
style: "normal",
|
|
181
192
|
},
|
|
@@ -187,7 +198,7 @@ const plusJakartaSans = localFont({
|
|
|
187
198
|
const outfit = localFont({
|
|
188
199
|
src: [
|
|
189
200
|
{
|
|
190
|
-
path: "../
|
|
201
|
+
path: "../generated/registry/outfit-latin-wght-normal.woff2",
|
|
191
202
|
weight: "100 900",
|
|
192
203
|
style: "normal",
|
|
193
204
|
},
|
|
@@ -199,7 +210,7 @@ const outfit = localFont({
|
|
|
199
210
|
const figtree = localFont({
|
|
200
211
|
src: [
|
|
201
212
|
{
|
|
202
|
-
path: "../
|
|
213
|
+
path: "../generated/registry/figtree-latin-wght-normal.woff2",
|
|
203
214
|
weight: "300 900",
|
|
204
215
|
style: "normal",
|
|
205
216
|
},
|
|
@@ -211,7 +222,7 @@ const figtree = localFont({
|
|
|
211
222
|
const montserrat = localFont({
|
|
212
223
|
src: [
|
|
213
224
|
{
|
|
214
|
-
path: "../
|
|
225
|
+
path: "../generated/registry/montserrat-latin-wght-normal.woff2",
|
|
215
226
|
weight: "100 900",
|
|
216
227
|
style: "normal",
|
|
217
228
|
},
|
|
@@ -223,7 +234,7 @@ const montserrat = localFont({
|
|
|
223
234
|
const lexend = localFont({
|
|
224
235
|
src: [
|
|
225
236
|
{
|
|
226
|
-
path: "../
|
|
237
|
+
path: "../generated/registry/lexend-latin-wght-normal.woff2",
|
|
227
238
|
weight: "100 900",
|
|
228
239
|
style: "normal",
|
|
229
240
|
},
|
|
@@ -235,7 +246,7 @@ const lexend = localFont({
|
|
|
235
246
|
const firaCode = localFont({
|
|
236
247
|
src: [
|
|
237
248
|
{
|
|
238
|
-
path: "../
|
|
249
|
+
path: "../generated/registry/fira-code-latin-wght-normal.woff2",
|
|
239
250
|
weight: "300 700",
|
|
240
251
|
style: "normal",
|
|
241
252
|
},
|
|
@@ -247,7 +258,7 @@ const firaCode = localFont({
|
|
|
247
258
|
const robotoMono = localFont({
|
|
248
259
|
src: [
|
|
249
260
|
{
|
|
250
|
-
path: "../
|
|
261
|
+
path: "../generated/registry/roboto-mono-latin-wght-normal.woff2",
|
|
251
262
|
weight: "100 700",
|
|
252
263
|
style: "normal",
|
|
253
264
|
},
|
|
@@ -259,7 +270,7 @@ const robotoMono = localFont({
|
|
|
259
270
|
const sourceSerif4 = localFont({
|
|
260
271
|
src: [
|
|
261
272
|
{
|
|
262
|
-
path: "../
|
|
273
|
+
path: "../generated/registry/source-serif-4-latin-wght-normal.woff2",
|
|
263
274
|
weight: "200 900",
|
|
264
275
|
style: "normal",
|
|
265
276
|
},
|
|
@@ -272,7 +283,7 @@ const sourceSerif4 = localFont({
|
|
|
272
283
|
const sourceCodePro = localFont({
|
|
273
284
|
src: [
|
|
274
285
|
{
|
|
275
|
-
path: "../
|
|
286
|
+
path: "../generated/registry/source-code-pro-latin-wght-normal.woff2",
|
|
276
287
|
weight: "200 900",
|
|
277
288
|
style: "normal",
|
|
278
289
|
},
|