diff --git a/src/app/assets/fonts/inter-latin-opsz-italic.woff2 b/src/app/assets/fonts/inter-latin-opsz-italic.woff2 new file mode 100644 index 0000000..39eb636 Binary files /dev/null and b/src/app/assets/fonts/inter-latin-opsz-italic.woff2 differ diff --git a/src/app/assets/fonts/inter-latin-opsz-normal.woff2 b/src/app/assets/fonts/inter-latin-opsz-normal.woff2 new file mode 100644 index 0000000..b0d0e2e Binary files /dev/null and b/src/app/assets/fonts/inter-latin-opsz-normal.woff2 differ diff --git a/src/app/assets/fonts/space-grotesk-latin-wght-normal.woff2 b/src/app/assets/fonts/space-grotesk-latin-wght-normal.woff2 new file mode 100644 index 0000000..0f3474e Binary files /dev/null and b/src/app/assets/fonts/space-grotesk-latin-wght-normal.woff2 differ diff --git a/src/app/assets/fonts/space-mono-latin-400-italic.woff2 b/src/app/assets/fonts/space-mono-latin-400-italic.woff2 new file mode 100644 index 0000000..d9b2583 Binary files /dev/null and b/src/app/assets/fonts/space-mono-latin-400-italic.woff2 differ diff --git a/src/app/assets/fonts/space-mono-latin-400-normal.woff2 b/src/app/assets/fonts/space-mono-latin-400-normal.woff2 new file mode 100644 index 0000000..2752f60 Binary files /dev/null and b/src/app/assets/fonts/space-mono-latin-400-normal.woff2 differ diff --git a/src/app/assets/fonts/space-mono-latin-700-italic.woff2 b/src/app/assets/fonts/space-mono-latin-700-italic.woff2 new file mode 100644 index 0000000..263487c Binary files /dev/null and b/src/app/assets/fonts/space-mono-latin-700-italic.woff2 differ diff --git a/src/app/assets/fonts/space-mono-latin-700-normal.woff2 b/src/app/assets/fonts/space-mono-latin-700-normal.woff2 new file mode 100644 index 0000000..6563bad Binary files /dev/null and b/src/app/assets/fonts/space-mono-latin-700-normal.woff2 differ diff --git a/src/app/assets/fonts/syne-latin-800-normal.woff2 b/src/app/assets/fonts/syne-latin-800-normal.woff2 new file mode 100644 index 0000000..bbea29f Binary files /dev/null and b/src/app/assets/fonts/syne-latin-800-normal.woff2 differ diff --git a/src/app/styles/app.css b/src/app/styles/app.css index 909b793..89b27ff 100644 --- a/src/app/styles/app.css +++ b/src/app/styles/app.css @@ -1,5 +1,6 @@ @import "tailwindcss"; @import "tw-animate-css"; +@import "./fonts.css"; @variant dark (&:where(.dark, .dark *)); diff --git a/src/app/styles/fonts.css b/src/app/styles/fonts.css new file mode 100644 index 0000000..2d953fd --- /dev/null +++ b/src/app/styles/fonts.css @@ -0,0 +1,78 @@ +/* + Self-hosted interface fonts (latin subset only). + Vendored from @fontsource — see docs/interface-font-selfhost-benchmark.md. + Variable faces (Inter, Space Grotesk) keep their wght axis; Inter also keeps opsz. + url()s are resolved + content-hashed by Vite at build → immutable long-cache. +*/ + +/* Inter — variable wght + opsz, the body/secondary UI font (--font-secondary) */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-display: swap; + font-weight: 100 900; + src: url('../assets/fonts/inter-latin-opsz-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-display: swap; + font-weight: 100 900; + src: url('../assets/fonts/inter-latin-opsz-italic.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* Space Grotesk — variable wght, the primary/display UI font (--font-primary) */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-display: swap; + font-weight: 300 700; + src: url('../assets/fonts/space-grotesk-latin-wght-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* Space Mono — static 400/700 × roman/italic (--font-mono) */ +@font-face { + font-family: 'Space Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('../assets/fonts/space-mono-latin-400-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Space Mono'; + font-style: italic; + font-display: swap; + font-weight: 400; + src: url('../assets/fonts/space-mono-latin-400-italic.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Space Mono'; + font-style: normal; + font-display: swap; + font-weight: 700; + src: url('../assets/fonts/space-mono-latin-700-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Space Mono'; + font-style: italic; + font-display: swap; + font-weight: 700; + src: url('../assets/fonts/space-mono-latin-700-italic.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +/* Syne — static 800, the logo font (--font-logo) */ +@font-face { + font-family: 'Syne'; + font-style: normal; + font-display: swap; + font-weight: 800; + src: url('../assets/fonts/syne-latin-800-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +}