From 9e706eb57067daf9af651c1c1c3d4c804461b303 Mon Sep 17 00:00:00 2001 From: hu13-test Date: Wed, 28 Oct 2026 10:52:36 +0000 Subject: [PATCH] use gf1 gl0w logo in header/footer lockup (#118) --- .../issue.md | 21 +++++++++++++++ src/build.rs | 2 ++ src/layout.rs | 8 +++--- src/logo.rs | 11 +++++--- static/gl0w.svg | 4 +++ static/style.css | 6 ++--- tests/brand.rs | 26 +++++++++++++++++-- 7 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 .forge/issues/d105f27f-f406-4fc7-a286-c331e45e2f5c/issue.md create mode 100644 static/gl0w.svg diff --git a/.forge/issues/d105f27f-f406-4fc7-a286-c331e45e2f5c/issue.md b/.forge/issues/d105f27f-f406-4fc7-a286-c331e45e2f5c/issue.md new file mode 100644 index 0000000..ddfcd2c --- /dev/null +++ b/.forge/issues/d105f27f-f406-4fc7-a286-c331e45e2f5c/issue.md @@ -0,0 +1,21 @@ +--- +id: d105f27f-f406-4fc7-a286-c331e45e2f5c +title: Use the gf1 gl0w logo in the header/footer lockup +state: open +labels: +- area:render +assignees: [] +milestone: null +created: 2026-10-28T10:49:07.368617004Z +updated: null +--- +## Problem + +The #70 lockup still renders the gl0w brand as a monospace text placeholder (`gl0w` in a bordered box). The real gl0w mark is now available at `~/src/code/gf1/website/assets/logo.svg` (inverted-triangle G, `currentColor`). + +## Fix + +- Vendor the exact SVG as `static/gl0w.svg` and emit it in `dist/gl0w.svg`. +- Inline the mark in the header lockup and footer brand so `currentColor` follows the dark/light theme and hover states. +- Keep the hu13 diamond-hub logo and the `hu13 — a gl0w project` tagline. +- Add a regression test for the gf1 viewBox/path geometry, the absence of the text placeholder, and the emitted asset. diff --git a/src/build.rs b/src/build.rs index a572829..ad80815 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1379,6 +1379,8 @@ pub const HEADERS_FILE: &str = "\ fn write_favicon_and_manifest(out: &Path) -> Result<(), String> { let logo = include_str!("../static/logo.svg"); std::fs::write(out.join("logo.svg"), logo).map_err(|e| format!("hu13: write logo.svg: {e}"))?; + let gl0w = include_str!("../static/gl0w.svg"); + std::fs::write(out.join("gl0w.svg"), gl0w).map_err(|e| format!("hu13: write gl0w.svg: {e}"))?; let icon = include_str!("../static/favicon.svg"); std::fs::write(out.join("favicon.svg"), icon) .map_err(|e| format!("hu13: write favicon.svg: {e}"))?; diff --git a/src/layout.rs b/src/layout.rs index b2e29e5..339ec5e 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -329,7 +329,8 @@ pub fn provenance_footer(branch: Option<&str>, short_sha: Option<&str>) -> Strin } } format!( - "" + "", + gl0w = crate::logo::GL0W_SVG ) } @@ -425,11 +426,12 @@ fn page_site_inner( \n\ \n{head}\n\ \n\ -
gl0w/\"hu13•
\n\ +
{gl0w}/\"hu13•
\n\
\n{body}\n
\n\ {footer}\n\ \n\ -\n" +\n", + gl0w = crate::logo::GL0W_SVG ) } diff --git a/src/logo.rs b/src/logo.rs index f71358c..9e34f14 100644 --- a/src/logo.rs +++ b/src/logo.rs @@ -8,9 +8,10 @@ //! the text banner lives in `static/ascii.txt` (owner block-art, 12 lines, //! stripped from `static/logo-ansi.txt`). //! -//! [`ASCII_ART`], [`LOGO_ANSI_RAW`], [`LOGO_SVG`], [`FAVICON_SVG`] and -//! [`WORDMARK_SVG`] re-expose those static files for later issues (navbar -//! #16, favicon #17, wiki README #19, agents page) with no build step. +//! [`ASCII_ART`], [`LOGO_ANSI_RAW`], [`LOGO_SVG`], [`GL0W_SVG`], +//! [`FAVICON_SVG`] and [`WORDMARK_SVG`] re-expose those static files for +//! later issues (navbar #16, favicon #17, wiki README #19, agents page) +//! with no build step. //! //! [`ascii_pre`] renders the banner as an escaped `
` block (see
 //! [`crate::layout::esc`]): the art itself is block glyphs plus spaces so
@@ -43,6 +44,10 @@ pub const LOGO_ANSI_RAW: &str = include_str!("../static/logo-ansi.txt");
 /// Header lockup, byte-for-byte `static/logo.svg` (mark + hu13 as ).
 pub const LOGO_SVG: &str = include_str!("../static/logo.svg");
 
+/// gl0w mark, byte-for-byte `static/gl0w.svg` (from the gf1 brand source).
+/// Inlined into the header/footer so `currentColor` follows the site theme.
+pub const GL0W_SVG: &str = include_str!("../static/gl0w.svg");
+
 #[allow(dead_code)]
 /// Simplified 16px favicon variant, byte-for-byte `static/favicon.svg`
 /// (mark only, no letters — documented choice for small-size legibility).
diff --git a/static/gl0w.svg b/static/gl0w.svg
new file mode 100644
index 0000000..97b648c
--- /dev/null
+++ b/static/gl0w.svg
@@ -0,0 +1,4 @@
+
+  
+  
+
diff --git a/static/style.css b/static/style.css
index 471097d..33982a6 100644
--- a/static/style.css
+++ b/static/style.css
@@ -188,9 +188,9 @@ footer.site-footer .footer-provenance{margin:0;font-size:var(--fs-sm);text-align
 .site-header .wrap.header-bar{display:flex;flex-wrap:nowrap;align-items:center;gap:.5rem .75rem}
 .brand-lockup{display:inline-flex;align-items:center;gap:.5rem;flex:none;color:var(--fg);text-decoration:none;min-height:40px}
 .brand-lockup:visited{color:var(--fg)}
-.gl0w-mark{font:600 .8rem/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.18em;
-  text-transform:lowercase;color:var(--cyan);border:1px solid var(--border);padding:.35rem .45rem}
-.brand-lockup:hover .gl0w-mark{color:var(--blue);border-color:var(--blue)}
+.gl0w-mark{display:inline-flex;align-items:center;color:var(--cyan);line-height:0;flex:none}
+.gl0w-mark svg{display:block;height:1.3rem;width:auto}
+.brand-lockup:hover .gl0w-mark,.footer-brand .gl0w-mark:hover{color:var(--blue)}
 .lockup-slash{color:var(--border);font-weight:400}
 .site-logo{display:block;width:auto;height:1.75rem;flex:none}
 .hu13-word{font-weight:700;color:var(--blue)}
diff --git a/tests/brand.rs b/tests/brand.rs
index d81c023..77ceea2 100644
--- a/tests/brand.rs
+++ b/tests/brand.rs
@@ -58,8 +58,20 @@ fn header_and_footer_carry_gl0w_branding() {
     for page in ["index.html", "agents.html", "issues/index.html"] {
         let html = std::fs::read_to_string(out.join(page)).expect(page);
         assert!(
-            html.contains("gl0w"),
+            "{page}: text placeholder replaced by logo"
+        );
+        assert!(
+            html.contains(""),
+            "{page}: footer logo links gl0w.world"
         );
         assert!(
             html.contains("hu13 — a gl0w project"),
@@ -105,9 +117,19 @@ fn social_card_and_meta_present() {
 
 #[test]
 fn logo_has_no_baked_background() {
+    let out = build();
     let logo =
         std::fs::read_to_string(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("static/logo.svg"))
             .unwrap();
+    let gl0w =
+        std::fs::read_to_string(PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("static/gl0w.svg"))
+            .unwrap();
+    assert!(
+        gl0w.contains("viewBox=\"0 0 357 306\"") && gl0w.contains("fill=\"currentColor\""),
+        "vendored gf1 gl0w mark"
+    );
+    let built = std::fs::read_to_string(out.join("gl0w.svg")).unwrap();
+    assert_eq!(built, gl0w, "build emits the same gl0w logo");
     assert!(!logo.contains("fill=\"#1a1b26\""), "no dark slab");
     assert!(
         logo.contains("@media (prefers-color-scheme:light)"),
-- 
2.56.0