feat(webui): embed latin fonts and serve via /fonts route
This commit is contained in:
parent
83d1d792bb
commit
3118083707
1
build.rs
1
build.rs
@ -69,6 +69,7 @@ fn build_webui(out_dir: &Path) {
|
|||||||
"webui/package-lock.json",
|
"webui/package-lock.json",
|
||||||
"webui/svelte.config.js",
|
"webui/svelte.config.js",
|
||||||
"webui/vite.config.js",
|
"webui/vite.config.js",
|
||||||
|
"webui/public",
|
||||||
] {
|
] {
|
||||||
println!("cargo:rerun-if-changed={path}");
|
println!("cargo:rerun-if-changed={path}");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -78,6 +78,41 @@ pub async fn webui_styles() -> Response {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EMBEDDED_FONTS: &[(&str, &[u8])] = &[
|
||||||
|
(
|
||||||
|
"space-grotesk-500.woff2",
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/webui/fonts/space-grotesk-500.woff2")),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"space-grotesk-700.woff2",
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/webui/fonts/space-grotesk-700.woff2")),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"jetbrains-mono-400.woff2",
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/webui/fonts/jetbrains-mono-400.woff2")),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"jetbrains-mono-700.woff2",
|
||||||
|
include_bytes!(concat!(env!("OUT_DIR"), "/webui/fonts/jetbrains-mono-700.woff2")),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
pub async fn webui_font(Path(name): Path<String>) -> Response {
|
||||||
|
let bytes = EMBEDDED_FONTS
|
||||||
|
.iter()
|
||||||
|
.find(|(font_name, _)| *font_name == name)
|
||||||
|
.map(|(_, bytes)| *bytes);
|
||||||
|
let Some(bytes) = bytes else {
|
||||||
|
return StatusCode::NOT_FOUND.into_response();
|
||||||
|
};
|
||||||
|
Response::builder()
|
||||||
|
.header(header::CONTENT_TYPE, "font/woff2")
|
||||||
|
.header(header::CACHE_CONTROL, "public, max-age=31536000, immutable")
|
||||||
|
.header("X-Content-Type-Options", "nosniff")
|
||||||
|
.body(Body::from(bytes))
|
||||||
|
.expect("valid font response")
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ApiError {
|
pub struct ApiError {
|
||||||
status: StatusCode,
|
status: StatusCode,
|
||||||
|
|||||||
@ -593,6 +593,7 @@ fn build_router(state: Arc<GatewayState>) -> Router {
|
|||||||
.route("/", routing::get(http::webui_index))
|
.route("/", routing::get(http::webui_index))
|
||||||
.route("/app.js", routing::get(http::webui_script))
|
.route("/app.js", routing::get(http::webui_script))
|
||||||
.route("/styles.css", routing::get(http::webui_styles))
|
.route("/styles.css", routing::get(http::webui_styles))
|
||||||
|
.route("/fonts/{name}", routing::get(http::webui_font))
|
||||||
.route("/health", routing::get(http::health))
|
.route("/health", routing::get(http::health))
|
||||||
.route("/api/auth/status", routing::get(auth::status))
|
.route("/api/auth/status", routing::get(auth::status))
|
||||||
.route("/api/auth/pair", routing::post(auth::pair))
|
.route("/api/auth/pair", routing::post(auth::pair))
|
||||||
|
|||||||
22
webui/package-lock.json
generated
22
webui/package-lock.json
generated
@ -14,6 +14,8 @@
|
|||||||
"svelte": "^5.0.0"
|
"svelte": "^5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@fontsource/jetbrains-mono": "^5.3.0",
|
||||||
|
"@fontsource/space-grotesk": "^5.3.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "^6.0.0",
|
"@sveltejs/vite-plugin-svelte": "^6.0.0",
|
||||||
"@types/node": "^24.0.0",
|
"@types/node": "^24.0.0",
|
||||||
"svelte-check": "^4.0.0",
|
"svelte-check": "^4.0.0",
|
||||||
@ -490,6 +492,26 @@
|
|||||||
"resolved": "https://mirrors.cloud.tencent.com/npm/@floating-ui/utils/-/utils-0.2.12.tgz",
|
"resolved": "https://mirrors.cloud.tencent.com/npm/@floating-ui/utils/-/utils-0.2.12.tgz",
|
||||||
"integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="
|
"integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@fontsource/jetbrains-mono": {
|
||||||
|
"version": "5.3.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@fontsource/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz",
|
||||||
|
"integrity": "sha512-fqDfB5I9f1p1TV486aUgB9t8zP84P0O1FtQR5Ol9vjwPy+S+EIGlVYm1cvj2W5shcZMTg2nZFdVMoH5wFu8a1A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@fontsource/space-grotesk": {
|
||||||
|
"version": "5.3.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@fontsource/space-grotesk/-/space-grotesk-5.3.0.tgz",
|
||||||
|
"integrity": "sha512-ksnGizDPXIDuvqcTYTSrmZ+evx9sDlS8rp7+42BQ7wU+spt3twEoXfbJz672C+5CLg6VeUQwRy5RXshWb67LcQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "OFL-1.1",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@internationalized/date": {
|
"node_modules/@internationalized/date": {
|
||||||
"version": "3.12.2",
|
"version": "3.12.2",
|
||||||
"resolved": "https://mirrors.cloud.tencent.com/npm/@internationalized/date/-/date-3.12.2.tgz",
|
"resolved": "https://mirrors.cloud.tencent.com/npm/@internationalized/date/-/date-3.12.2.tgz",
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
"svelte": "^5.0.0"
|
"svelte": "^5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@fontsource/jetbrains-mono": "^5.3.0",
|
||||||
|
"@fontsource/space-grotesk": "^5.3.0",
|
||||||
"@sveltejs/vite-plugin-svelte": "^6.0.0",
|
"@sveltejs/vite-plugin-svelte": "^6.0.0",
|
||||||
"@types/node": "^24.0.0",
|
"@types/node": "^24.0.0",
|
||||||
"svelte-check": "^4.0.0",
|
"svelte-check": "^4.0.0",
|
||||||
|
|||||||
BIN
webui/public/fonts/jetbrains-mono-400.woff2
Normal file
BIN
webui/public/fonts/jetbrains-mono-400.woff2
Normal file
Binary file not shown.
BIN
webui/public/fonts/jetbrains-mono-700.woff2
Normal file
BIN
webui/public/fonts/jetbrains-mono-700.woff2
Normal file
Binary file not shown.
BIN
webui/public/fonts/space-grotesk-500.woff2
Normal file
BIN
webui/public/fonts/space-grotesk-500.woff2
Normal file
Binary file not shown.
BIN
webui/public/fonts/space-grotesk-700.woff2
Normal file
BIN
webui/public/fonts/space-grotesk-700.woff2
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user