@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.
Files changed (28) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/NOTICE-FONTS.md +16 -10
  3. package/dist/next.js +19 -19
  4. package/dist/next.js.map +1 -1
  5. package/generated/dm-sans.woff2 +0 -0
  6. package/generated/registry/dm-sans-latin-wght-normal.woff2 +0 -0
  7. package/generated/registry/figtree-latin-wght-normal.woff2 +0 -0
  8. package/generated/registry/fira-code-latin-wght-normal.woff2 +0 -0
  9. package/generated/registry/fraunces-latin-wght-normal.woff2 +0 -0
  10. package/generated/registry/inter-latin-wght-normal.woff2 +0 -0
  11. package/generated/registry/inter-tight-latin-wght-normal.woff2 +0 -0
  12. package/generated/registry/jetbrains-mono-latin-wght-normal.woff2 +0 -0
  13. package/generated/registry/lexend-latin-wght-normal.woff2 +0 -0
  14. package/generated/registry/manrope-latin-wght-normal.woff2 +0 -0
  15. package/generated/registry/montserrat-latin-wght-normal.woff2 +0 -0
  16. package/generated/registry/outfit-latin-wght-normal.woff2 +0 -0
  17. package/generated/registry/playfair-display-latin-wght-normal.woff2 +0 -0
  18. package/generated/registry/plus-jakarta-sans-latin-wght-normal.woff2 +0 -0
  19. package/generated/registry/roboto-mono-latin-wght-normal.woff2 +0 -0
  20. package/generated/registry/sora-latin-wght-normal.woff2 +0 -0
  21. package/generated/registry/source-code-pro-latin-wght-normal.woff2 +0 -0
  22. package/generated/registry/source-serif-4-latin-wght-normal.woff2 +0 -0
  23. package/generated/registry/space-grotesk-latin-wght-normal.woff2 +0 -0
  24. package/generated/registry/work-sans-latin-wght-normal.woff2 +0 -0
  25. package/package.json +8 -5
  26. package/src/next-cjk.test.ts +9 -0
  27. package/src/next.test.ts +20 -8
  28. 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 `@fontsource-variable/*` npm packages
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; the
29
- font binaries are not copied into this package — they are installed as
30
- dependencies and emitted into the app's build by `next/font/local`.
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`) is committed so
35
- `next/font/local` can load it offline; it is **not** in the npm `files` list.
36
- MiSans subsets are never committed at all: the licence forbids distributing
37
- the font on its own, so they are uploaded to the deployment's asset CDN and
38
- `<CjkFontFace />` points at them. Do not add `generated/*.woff2` or other font
39
- binaries to a publishable `files` glob.
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: "../node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/inter-tight/files/inter-tight-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/space-grotesk/files/space-grotesk-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/playfair-display/files/playfair-display-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/fraunces/files/fraunces-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/manrope/files/manrope-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/sora/files/sora-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/work-sans/files/work-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/dm-sans/files/dm-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/plus-jakarta-sans/files/plus-jakarta-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/outfit/files/outfit-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/figtree/files/figtree-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/montserrat/files/montserrat-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/fira-code/files/fira-code-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/roboto-mono/files/roboto-mono-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/source-serif-4/files/source-serif-4-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/source-code-pro/files/source-code-pro-latin-wght-normal.woff2",
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":"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","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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebutra/fonts",
3
- "version": "4.0.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
  }
@@ -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 an installed @fontsource-variable package (Latin, upright, wght)", () => {
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 loads from, pinned", () => {
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
- dependencies: Record<string, string>;
55
+ devDependencies: Record<string, string>;
52
56
  };
53
57
  for (const { path } of faces) {
54
- const name = /@fontsource-variable\/[a-z0-9-]+/.exec(path)?.[0] ?? "";
55
- expect(pkg.dependencies[name], name).toMatch(/^\d+\.\d+\.\d+$/);
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 an `@fontsource-variable/*`
5
- * package that arrives with `pnpm install` — the build and the dev server make
6
- * NO request to fonts.googleapis.com / fonts.gstatic.com. That is the point:
7
- * with `next/font/google`, a machine that cannot reach Google (mainland China,
8
- * a corporate proxy, a plane) failed `next build` outright and answered 500 from
9
- * the Turbopack dev server ("Can't resolve '@vercel/turbopack-next/internal/font/google/font'"),
10
- * so a scaffold's preview site was dead on arrival. npm packages are mirrored
11
- * everywhere (npmmirror in China); Google Fonts is not.
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. The path
35
- * is relative to this file and goes through the package's own node_modules
36
- * (pnpm links every dependency there), so it resolves the same from `src/` and
37
- * `dist/`. `scripts/lint-no-google-fonts.mjs` keeps `next/font/google` out of
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: "../node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/inter-tight/files/inter-tight-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/space-grotesk/files/space-grotesk-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/playfair-display/files/playfair-display-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/fraunces/files/fraunces-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/manrope/files/manrope-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/sora/files/sora-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/work-sans/files/work-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/dm-sans/files/dm-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/plus-jakarta-sans/files/plus-jakarta-sans-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/outfit/files/outfit-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/figtree/files/figtree-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/montserrat/files/montserrat-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/fira-code/files/fira-code-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/roboto-mono/files/roboto-mono-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/source-serif-4/files/source-serif-4-latin-wght-normal.woff2",
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: "../node_modules/@fontsource-variable/source-code-pro/files/source-code-pro-latin-wght-normal.woff2",
286
+ path: "../generated/registry/source-code-pro-latin-wght-normal.woff2",
276
287
  weight: "200 900",
277
288
  style: "normal",
278
289
  },