Indítópult launcher page + universal app placeholder icon (v0.163.0)
New /launcher page: a grid of large tappable tiles, one per openable deployed app (subdomain presence is the single openability criterion, shared with the Megnyitás button via the extracted Server.subdomainMap helper). Colored tiles (deterministic slug color or .felhom.yml brand_color), white glyph/monogram fallback, target=_blank links for operational apps, greyed unclickable tiles for stopped ones. First sidebar item; / stays the Vezérlőpult. Universal app placeholder: new AppPlaceholderSVG served at /static/app-placeholder.svg, now the default FallbackIcon on app_list_row so a logo-less app shows a placeholder instead of visibility:hidden. Brand mark is never an app placeholder. New Metadata.BrandColor; new funcmap tileColor/initial. 10 new test functions + 4 red-proofs. No agent coupling; MinAgent unchanged.
This commit is contained in:
@@ -1,5 +1,42 @@
|
||||
## Changelog
|
||||
|
||||
### v0.163.0 — Indítópult (app launcher page) + universal app placeholder icon (2026-07-24)
|
||||
|
||||
No agent coupling; MinAgent unchanged. Adds a customer-facing **Indítópult** launcher grid and a
|
||||
generic fallback icon for logo-less apps on every list surface.
|
||||
|
||||
**Indítópult (`/launcher`, new FIRST sidebar item, above Vezérlőpult):**
|
||||
- A grid of large tappable tiles, one per openable deployed app. The rule is intentionally the same
|
||||
one the „Megnyitás" button already uses: a tile exists **⟺** the stack has a subdomain (env
|
||||
`SUBDOMAIN` > `.felhom.yml` subdomain > `protectedStackSubdomains`). The controller's own stack is
|
||||
excluded by name. `/` still lands on the Vezérlőpult — the launcher is an ADDITIONAL page.
|
||||
- Tiles are colored rounded squares: a deterministic per-app color (FNV-1a of the slug → HSL hue,
|
||||
fixed S/L tuned for the dark theme), overridable with an optional `.felhom.yml` `brand_color`
|
||||
(`#rgb`/`#rrggbb`; an invalid value silently falls back to the slug color). The existing white
|
||||
monochrome logo renders on top; a logo-less app reveals the **monogram** initial underneath
|
||||
(multibyte-safe — „Óra" → „Ó").
|
||||
- Operational apps are a real `<a target="_blank" rel="noopener">` to the public URL (with
|
||||
`open_path`); stopped/exited/degraded apps render a **greyed, unclickable** tile with the honest
|
||||
Hungarian state badge — never a dead link. Empty state: „Még nincs telepített alkalmazás." + a link
|
||||
to `/stacks`.
|
||||
- New template funcs `tileColor` (returns a `template.CSS` — validated/computed in Go, because the
|
||||
html/template CSS filter mangles a legitimate `hsl()` from a func pipeline) and `initial`.
|
||||
|
||||
**Universal app placeholder icon:**
|
||||
- New embedded `AppPlaceholderSVG` (2×2 rounded-square app-grid glyph), served at
|
||||
`/static/app-placeholder.svg`. The canonical `app_list_row` now DEFAULTS its fallback to it, so a
|
||||
catalog app with a missing logo shows a generic placeholder on every list surface instead of the
|
||||
old `visibility:hidden` dead-end. Infra rows still override with `/static/infra-logo.svg`.
|
||||
- Design ruling: the felhom brand mark is NEVER an app placeholder (brand = platform identity only).
|
||||
|
||||
**Refactor (in-scope, single reason):** the subdomain-map assembly that lived inline twice
|
||||
(dashboard + Alkalmazások) is extracted to `Server.subdomainMap`; both call sites plus the launcher
|
||||
now share it (byte-for-byte priority unchanged).
|
||||
|
||||
**Metadata:** `stacks.Metadata` gains `BrandColor` (`brand_color`, omitempty). No catalog app sets it
|
||||
yet (curation is a parked follow-up).
|
||||
|
||||
|
||||
### v0.162.0 — R-71(a): the apply-bridge waits for the dust to settle (settle-gate) (2026-07-24)
|
||||
|
||||
No agent coupling; MinAgent unchanged. Origin:
|
||||
|
||||
Reference in New Issue
Block a user