v0.4.6: iVentoy-style PXE menu, top-right user menu, Settings touchups

PXE boot menu polish (iVentoy-inspired):
- render_menu now opens with a best-effort `console --picture
  <base>/branding/pxe-logo || console` line so iPXE builds with PNG
  support paint the operator's uploaded raster logo as the background.
- ASCII OpenPXE wordmark banner sits at the top of the menu in
  `item --gap` lines — always visible on every iPXE build, including
  the snponly/undionly variants without graphics console.
- New footer line above `choose`: "OpenPXE v0.4.6 - <arch label>",
  where <arch label> is mapped from iPXE's ${buildarch}/${platform}
  to "x86 BIOS", "x86_64 UEFI", or "arm64 UEFI". No URL, per brief.
- New GET /branding/pxe-logo route serves the operator's PNG / JPEG /
  WebP / GIF as-is for iPXE to consume. SVG uploads 404 here (iPXE
  can't rasterize SVG) — the always-visible ASCII wordmark stands in.
  Route stays public after admin setup so iPXE clients (no cookies)
  can fetch it.

UI:
- Removed the bottom-left "signed in as / Sign out" row.
- Added a person-icon button next to the theme toggle in the topbar.
  Click opens a small popover with: Name (display only), Edit account
  (jumps to Settings), Sign out. Esc + click-outside close it.
- Settings → Account card form chrome made consistent. The previous
  `label.field` selector only styled type=text/number, leaving
  password inputs with default browser chrome. Switched to a
  negation-list selector that covers every typed input we use, plus
  -webkit-appearance:none + a 1px focus ring. Light + dark mode both
  show the same border/padding/focus state across all four account
  fields.
- Settings → SSO card now renders display name, IdP logo URL (new),
  and metadata source on one 3-column row. The metadata <select>
  inherits the same chrome as the text inputs so it baseline-aligns
  with them. SsoConfig grew an idp_logo_url field, persisted to
  sso.json, length-capped and validated to http(s) only.

Quality:
- 138 tests passing (was 132 in v0.4.5). +1 IdP-logo-URL validation,
  +1 PXE menu polish regression guard, +4 /branding/pxe-logo
  integration tests covering missing-config / SVG-fallback / raster-
  serve / post-auth public-allowlist cases.
- cargo clippy --workspace --all-targets clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
Miles Ward
2026-05-26 00:02:20 -04:00
co-authored by Claude Opus 4.7
parent 4a354a8664
commit f8bfab3823
10 changed files with 479 additions and 54 deletions
Generated
+8 -8
View File
@@ -1015,7 +1015,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "openpxe"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"axum",
@@ -1037,7 +1037,7 @@ dependencies = [
[[package]]
name = "openpxe-core"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"bcrypt",
@@ -1056,7 +1056,7 @@ dependencies = [
[[package]]
name = "openpxe-dhcp-proxy"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"bytes",
@@ -1070,7 +1070,7 @@ dependencies = [
[[package]]
name = "openpxe-http-api"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"axum",
@@ -1100,7 +1100,7 @@ dependencies = [
[[package]]
name = "openpxe-ipxe-assets"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"openpxe-core",
"rust-embed",
@@ -1110,7 +1110,7 @@ dependencies = [
[[package]]
name = "openpxe-iso-store"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"bcrypt",
@@ -1133,7 +1133,7 @@ dependencies = [
[[package]]
name = "openpxe-tftp"
version = "0.4.5"
version = "0.4.6"
dependencies = [
"anyhow",
"bytes",
@@ -1147,7 +1147,7 @@ dependencies = [
[[package]]
name = "openpxe-webui"
version = "0.4.5"
version = "0.4.6"
[[package]]
name = "parking_lot"