v0.167.0: REPORT — outlined logo/favicon live-verified on 9201 (0 text, viewBox unchanged)

This commit is contained in:
2026-07-24 13:50:37 +02:00
parent e9a365e59c
commit 59d182a6b9
+67 -77
View File
@@ -1,93 +1,83 @@
# REPORT — v0.166.0: mobile nav drawer + sidebar cleanup + versioned logo/favicon URLs
# REPORT — v0.167.0: outlined logo + favicon (completes v0.166.0 Part 4)
**Date:** 2026-07-24 · **Deployed & verified live on guest 9201.**
**Date:** 2026-07-24 · **Deployed & verified live on guest 9201.** This is the follow-up that finishes
the mobile-nav task — Parts 13 shipped as **v0.166.0**; Part 4 (the outlined-logo swap) was gated then
and shipped now as **v0.167.0** once Viktor pushed the outlined asset.
## 1. Confirmed baselines used
| Repo | `main` @ hash (start) | Version | → |
|------|------------------------|---------|---|
| felhom-controller | `1fd070615db91658df85438f760cb5ed61832d7e` | v0.165.1 | v0.166.0 |
| felhom.eu (asset source, read-only) | live `main` = `be9edb443cab1d2581fa022537e7113f45c3fd92` | — | — (unchanged by this task) |
## 1. Baselines
| Repo | consumed @ hash | version |
|------|-----------------|---------|
| felhom-controller | `dbd1ff0` (post-v0.166.0) → committed `e9a365e` | v0.166.0 → **v0.167.0** |
| felhom.eu (asset source) | live `main` = **`be9edb443cab1d2581fa022537e7113f45c3fd92`** ("updated logo") | — |
felhom.eu asset commit **consumed: NONE** — the outlined asset was never pushed (see §2 below).
felhom.eu asset commit **consumed: `be9edb4`**`website/assets/logo.svg`, the text-outlined master.
## 2. §3a precondition gate — Part 4 GATED OUT
Fetched `felhom.eu:website/assets/logo.svg` from live Gitea `main` (`be9edb44`, confirmed via
`git ls-remote`): **2 `<text` + 7 `font-family`** occurrences. The text-outlined master is not yet
pushed → **Part 4 (logo-constant swap + favicon `<text>` cleanup) was NOT performed.** No CLI
text-to-path conversion was attempted (glyph fidelity is Viktor's Inkscape responsibility). Parts 13
shipped independently as specified. When Viktor pushes the outlined asset, Part 4 ships as a follow-up
(swap `FelhomLogoSVG`, clean `FelhomFaviconSVG`, add the `TestLogoSVG_NoLiveText` constant test).
## 2. What was wrong, and what shipped
Viktor ran Inkscape **Object→Path** and pushed. The pushed file rendered the wordmark as **17 real
`<path>` glyphs** (good) but still tripped the §3a gate because Inkscape left cruft:
- **2 empty `<text …/>` shells** (self-closed, zero glyph content) wrapping empty tspans, and
- **`style="…font-family:'Vremena Grotesk'/'M+ 2c'…"` copied onto the outlined `<path>`s** (inert on a
path, but carries the font name → 7 `font-family` total).
A search for `svg:text` missed all of it — the elements are `<text>` (default namespace, no `svg:`
prefix). The correct needles are `<text` and `font-family` (what the gate checks).
## 3. Files modified
- `controller/internal/web/templates/layout.html``no-js` html class + early swap script; sticky
`.mobile-topbar` (logo→`/`, `.nav-burger` w/ aria); `.nav-backdrop` (hidden); `id="sidebar"`;
drawer JS (burger/backdrop/Escape); removed `.customer-name` span; `?v=` on favicon + sidebar logo.
- `controller/internal/web/templates/style.css` — deleted the `.nav-links` strip from the 768px block;
added desktop-default hidden `.mobile-topbar`/`.nav-backdrop`/`.nav-burger`; mobile drawer + no-JS
fallback + `body.nav-open`; reduced-motion rule; removed dead `.customer-name` rule.
- `controller/internal/web/templates/login.html``?v={{.Version}}` on the login logo `<img>`.
- `controller/internal/web/templates/icons.html` — new `#i-menu` (lucide "menu", matching stroke).
- `controller/internal/web/auth.go``renderLogin` now passes `"Version"` (for the login logo `?v=`).
- `controller/internal/web/mobile_nav_test.go`**new**, 5 tests.
- `CHANGELOG.md`, `CONTEXT.md` — updated; `REPORT.md` — this file.
Per your decision ("strip the cruft, ship now"), CC did **node-level cleanup only — no text-to-path
conversion** (glyphs already outlined by Viktor):
- **`FelhomLogoSVG`** replaced with the outlined master; via an lxml DOM pass removed the 2 `<text>`
elements, stripped `font-*`/`-inkscape-font-specification`/`text-align`/`text-anchor` declarations from
every `style` (kept `fill`/`stroke`/`stroke-width`/gradients), and dropped the editor-only
`<sodipodi:namedview>`. **Glyph `d`-geometry and palette untouched.**
- **`FelhomFaviconSVG`** vestigial empty `<text>` nodes + their `font-family` removed (cloud icon only).
## 4. Commits pushed to `main`
- `bf44216` — v0.166.0 implementation (code + tests + CHANGELOG + CONTEXT).
- REPORT commit — this REPORT.md (follow-up commit, matching the established pattern).
Both constants now contain **zero `<text`, zero `font-family`, zero backticks** (safe in the Go raw
string). Served by the unchanged handlers (`serveLogoHandler`/`serveFaviconHandler` — note they serve a
hub-synced file first and fall back to the constant; on 9201 the constant is what's live).
## 5. Tests + RED proofs
**Test count:** web package `--- PASS` count 278 → **283** (5 new). Full repo: 25 packages pass, 0 fail.
## 3. viewBox — unchanged (Scenario E requirement)
| Constant | old viewBox | new viewBox | paths | palette |
|----------|-------------|-------------|-------|---------|
| FelhomLogoSVG | `0 0 645.30703 408.36403` | **`0 0 645.30703 408.36403`** (identical) | 17 | `#ffffff` glyphs, `#008ddf` `.eu`, `#051343` artwork, 14 gradients |
| FelhomFaviconSVG | `0 0 437.307 296.36403` | **`0 0 437.307 296.36403`** (identical) | 11 | cloud icon only |
Phase-1 RED runs (recorded against pre-change source):
| Test | RED (pre-change) | GREEN (post-change) |
|------|------------------|---------------------|
| `TestMobileCSS_StripRemovedDrawerPresent` (Group B) | FAIL — 768px block still had `overflow-x` + `.nav-links{}`; no `.js .sidebar`/`translateX`/`.no-js .sidebar`/`body.nav-open`/`.mobile-topbar` | PASS |
| `TestMobileNav_TopbarAndDrawerMarkup` (Group A) | FAIL — no `no-js`, no topbar/burger/backdrop, no `aria-controls`/`id=sidebar` | PASS |
| `TestSidebar_NoCustomerName` (Group D) | FAIL — `customer-name` still rendered | PASS |
| `TestLayout_VersionedAssetURLs` (Group E) | FAIL — logo/favicon URLs lacked `?v=` | PASS |
| `TestLogoSVG_NoLiveText` (Group E, Part-4 gated) | FAIL — `FelhomLogoSVG`/`FelhomFaviconSVG` contain `<text`+`font-family` | **not committed** — ships with Part 4 |
| `TestLogin_CustomerNameKept` (Group D) | PASS pre-change (login already keeps the name) — its red-proof is the sidebar-removal test | PASS |
## 4. Files modified · commits
- `controller/internal/web/templates.go` — both SVG constants (bodies + doc comments).
- `controller/internal/web/mobile_nav_test.go` — added `TestLogoSVG_NoLiveText` (the v0.166.0 gated
red-proof, now committed green).
- `CHANGELOG.md`, `CONTEXT.md`, `REPORT.md`.
- Commit `e9a365e` (implementation + docs) + this REPORT commit. Clean tree, HEAD == origin/main.
Companion red-proofs (documented mutations that flip a committed test to FAIL):
- Re-add `<span class="customer-name">``TestSidebar_NoCustomerName` FAILS.
- Drop `aria-controls` from the burger → `TestMobileNav_TopbarAndDrawerMarkup` FAILS.
- Restore the `.nav-links{display:flex;overflow-x}` strip → `TestMobileCSS_StripRemovedDrawerPresent` FAILS.
- Remove `?v=` from the logo/favicon refs → `TestLayout_VersionedAssetURLs` FAILS.
## 5. Tests + RED proof
- `TestLogoSVG_NoLiveText`: asserts both constants free of `<text`/`font-family`. **RED proof recorded**
(v0.166.0 Phase 1, 2026-07-24): ran against the pre-swap constants → FAILED (`FelhomLogoSVG` and
`FelhomFaviconSVG` both contained `<text` + `font-family`). Now PASS.
- Full repo green: `go build ./... && go vet ./... && go test ./...` — 25 pkgs pass, 0 fail. All 3
mechanical gates (template_id / emoji / mojibake) OK. Cleaned SVGs validated well-formed (lxml).
- The v0.166.0 suite (mobile drawer / CSS strip-removed / no-customer-name / versioned URLs / nav
accordion invariants) still passes unchanged.
`nav_accordion_test.go` invariants pass **unchanged** (not edited). Green gate
`go build ./... && go vet ./... && go test ./...` — all clean. Mechanical gates
(`template_id_gate`, `emoji_gate`, `mojibake_gate`, `native_confirm_gate`) all OK.
## 6. Deploy + live endpoint validation (guest 9201)
- Built `gitea.dooplex.hu/admin/felhom-controller:0.166.0` (145M) from the clean pushed tree
(`git status` empty, HEAD == origin/main), pushed, deployed via the bootstrap service.
- `docker ps`: `gitea.dooplex.hu/admin/felhom-controller:0.166.0 Up (healthy)`; logs show
`Event pushed: controller_started (info) — Controller elindult (0.166.0)`, settle-gate GO.
- Method: endpoint-level (`curl` in-guest to the container IP `172.17.0.2:8080` with
`Host: felhom.demo-felhom.eu`; login 302 with the stored password → authed session cookie).
## 6. Deploy + live validation (guest 9201)
Built `felhom-controller:0.167.0` (145M) from the clean pushed tree; deployed via the bootstrap
service → `Up (healthy)`. Endpoint-level checks (in-guest curl to `172.17.0.2:8080`):
| Surface | Assertion | Result |
|---------|-----------|--------|
| `/static/style.css?v=0.166.0` | `.mobile-topbar`, `.js .sidebar`, `translateX(-100%)`, `.no-js .sidebar`, `body.nav-open` present; the 3 residual `overflow-x` are non-nav (tables/code) | ✅ |
| `/login` (no auth) | `felhom-logo.svg?v=` + `login-subtitle` (CustomerName kept) | ✅ |
| `/` (authed) | topbar / `nav-burger` / `aria-controls="sidebar"` / `id="sidebar"` / `nav-backdrop hidden` / `no-js`+swap script / `logo.svg?v=` (×2) / `favicon.svg?v=` present; **`customer-name` absent (0)** | ✅ |
| `/storage` (authed) | both accordion sub-items render (`Meghajtók` + `Hálózati tárhely`), `nav-group-storage` present, `customer-name` absent | ✅ |
| `/static/felhom-logo.svg` | still contains 4 `<text` — confirms Part 4 gated (constants unchanged) | ✅ (expected) |
| `/static/felhom-logo.svg` | 0 `<text`, 0 `font-family`, 17 `<path>`, viewBox `0 0 645.30703 408.36403` | ✅ |
| `/static/favicon.svg` | 0 `<text`, 0 `font-family`, 11 `<path>`, viewBox `0 0 437.307 296.36403` | ✅ |
| `/login` | logo URL `felhom-logo.svg?v=0.167.0` — cache-bust now carries the new version, so CF re-fetches the outlined logo (defeats the 4h edge cache) | ✅ |
## 7. NOT yet live-validated — awaiting Viktor's visual acceptance
- **Android/mobile drawer interaction** (burger opens/closes, backdrop tap, Escape, body scroll-lock,
accordion inside the drawer, banners not obscured by the sticky top bar).
- **Desktop >768px pixel-parity** vs v0.165.1 (no burger, fixed 240px sidebar, hover/active states).
- **Conscious omission:** the drawer has no full focus-trap — `aria-expanded`/`aria-controls` only.
Page navigations reset drawer state, so a trap would add complexity for a state that never persists.
Confirms the embedded constant (not a stale hub-synced file) is what serves on 9201.
## 8. Logo viewBox
Part 4 gated out → `FelhomLogoSVG`/`FelhomFaviconSVG` **unchanged**; no viewBox delta to record. The
outlined swap must preserve the current logo `viewBox` (record old-vs-new when Part 4 ships).
## 7. Awaiting Viktor — visual acceptance
- **Android/desktop visual check of the outlined wordmark** in the sidebar, top-bar (mobile), login
page, and browser-tab favicon — the endpoint checks prove the bytes are font-free and geometrically
valid, but final "looks right" is your eyes. (Mobile browsing itself already confirmed good by you.)
## 9. Observations (out of scope — documented only, not acted on)
- The **website and hub still serve their own non-outlined logo copies** (`felhom.eu/website/assets/logo.svg`
consumers, the hub's `felhom-logo.svg`, `logo_favicon*.svg`) — once Viktor's outlined master lands,
propagating it there is a separate follow-up.
- `login.html`'s **stylesheet** link is still unversioned (`/static/style.css`, no `?v=`) — the task
scoped only the login *logo* `<img>`; the login page's CSS cache-bust is a minor follow-up.
## 8. Observations (out of scope — documented only)
- **Website + hub still serve their own non-outlined logo copies** (`felhom.eu` website `logo.svg`
consumers, the hub's `felhom-logo.svg`, `logo_favicon*.svg`). Propagating the outlined master there is
a separate follow-up in those repos.
- **`serveLogoHandler` prefers a hub-synced file** over the embedded constant — if a synced
`felhom-logo.svg` ever lands on a guest's disk it would override this constant; worth keeping in mind
when the outlined asset is propagated hub-side.
- `login.html`'s **stylesheet** link is still unversioned (`/static/style.css`, no `?v=`) — minor,
carried over from v0.166.0.