45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
//! Offline-only web UI. Everything the browser needs (HTML, CSS, JS, SVG
|
|
//! logo) is embedded in the compiled binary via `include_str!` /
|
|
//! `include_bytes!`. No CDN, no external fonts, no remote images —
|
|
//! OpenPXE renders identically on an air-gapped network.
|
|
//!
|
|
//! Layout follows the Netbox Labs pattern: dark left sidebar with primary
|
|
//! nav, top bar with secondary tabs, card-dense content panels.
|
|
#![forbid(unsafe_code)]
|
|
|
|
/// Render the top-level page. `base_url` is interpolated into the footer
|
|
/// so operators can see at a glance what URL clients are PXE-booting from.
|
|
#[must_use]
|
|
pub fn index_html(base_url: &str) -> String {
|
|
INDEX_HTML.replace("{{BASE_URL}}", base_url)
|
|
}
|
|
|
|
#[must_use]
|
|
pub fn app_js() -> &'static str {
|
|
APP_JS
|
|
}
|
|
|
|
#[must_use]
|
|
pub fn app_css() -> &'static str {
|
|
APP_CSS
|
|
}
|
|
|
|
#[must_use]
|
|
pub fn logo_svg() -> &'static str {
|
|
LOGO_SVG
|
|
}
|
|
|
|
/// Larger, faster-cycling rainbow disc — used for the page-load
|
|
/// transition and the imaging-progress widget on Dashboard / Queue.
|
|
/// Pure SVG + SMIL, no JS, no GIF.
|
|
#[must_use]
|
|
pub fn loader_svg() -> &'static str {
|
|
LOADER_SVG
|
|
}
|
|
|
|
const INDEX_HTML: &str = include_str!("index.html");
|
|
const APP_CSS: &str = include_str!("app.css");
|
|
const APP_JS: &str = include_str!("app.js");
|
|
const LOGO_SVG: &str = include_str!("logo.svg");
|
|
const LOADER_SVG: &str = include_str!("loader.svg");
|