> **WARNING:** This document describes only the change applied in this PR. > It may already be outdated once the next PR is merged. > Historic PR-documentation is not maintained along with new PRs — treat it as a snapshot, not as current documentation. ## Related Links - [PR#35 — the design](2026-09-08-PR#35-ui-kin-design.md) and [PR#37 — the Repositories page](2026-09-08-PR#37-ui-repositories-overview.md), which this PR corrects after their first day in use. ## The Problem Four small things showed on the first day of v1.3.0: - The row of view tabs (`Latest`, `Branches`, `History`) showed a vertical scrollbar on the desktop — not scrollable, just sitting at the edge: the active tab's underline overhangs the row by one pixel, and the row was `overflow-x: auto`, which turns any overflow into scrollbars. - On the Repositories page only the repository's name was a link; the rest of the entry, which holds no other control, did nothing when clicked. - The footer had one link, `Impressum (Legal Disclosure)`, and none for the privacy policy; the author's sites carry `Imprint` and `Privacy` on the right. - On the System page the `watch` amber and the `critical` clay were hard to tell apart. ## Non-Goals - No other visual change; the palette otherwise stays as RFC 0001 specifies it. - Failed builds keep their clay; only the System page's *critical* level gets the redder tone, because there it stands next to *watch*. ## The Scenarios ### Feature: small corrections to the new UI #### Scenario#39.01: the footer carries Imprint and Privacy So that every page links the legal pages the way the author's sites do. - **Given** `server.impressumUrl` and `server.privacyUrl` are configured (instance-level, `~/.werkator.yml` on a multi-repository instance) - **When** any page renders - **Then** the footer's right side links `Imprint` and `Privacy`, each opening in a new tab - **and** an empty URL hides its link; with both empty the right side is empty. ##### Verified by - [UiControllerTest — latest view renders rows with badge, Gitea links, artifact link, actions, and token](../../src/test/kotlin/de/hoennig/werkator/server/UiControllerTest.kt) (asserts both links) #### Scenario#39.02: the whole overview entry opens the repository So that a reader can click anywhere in the entry, not only on the name. - **Given** the Repositories page - **When** the reader clicks anywhere in an entry that is not a link, without selecting text - **Then** the browser opens that repository's Latest view - **and** the name stays a real link for the keyboard and for opening in a new tab - **and** an entry re-rendered by `werkator.js` behaves the same. ##### Verified by - [UiControllerTest — the Repositories page lists every served repository as the overview sorts them](../../src/test/kotlin/de/hoennig/werkator/server/UiControllerTest.kt) (asserts the entry's `data-url`) - The click itself is script behaviour, checked in the browser. #### Scenario#39.03: no scrollbar on the tabs, and two tellable levels - **Given** a desktop viewport - **When** a repository view renders - **Then** the tab row shows no scrollbar; on a phone it still scrolls sideways when the tabs do not fit. - **Given** the System page with a gauge at `watch` and one at `critical` - **Then** `watch` is a yellow amber and `critical` a red clearly redder than the clay of a failed build, in both color schemes. ##### Verified by - Stylesheet only; checked in the browser, light and dark. ## The Solution - `werkator.css`: the tab row loses `overflow-x: auto` on the desktop and keeps it on the phone with `overflow-y: hidden` and a 1 px bottom padding for the underline's overhang; `.repo` gets a pointer cursor and a hover ground; new tokens `--amber` (yellower), `--crit`/`--crit-soft` (red) used by the System page's critical level, the overloaded verdict and the `upgrade` advice. - `ServerConfig.privacyUrl`, the `init` template and `docs/configuration.md` gain the key; `UiController` puts it on the model; the footer fragment renders `Imprint` and `Privacy`. - `repos.html` writes the entry's `data-url`; `werkator.js` sets it on re-rendered entries and opens it on a click that hits no link and selects no text. ## Additional Changes - Version 1.3.1 and its release-notes entry, since this is what gets deployed. - On mih09 the instance file gets `server.impressumUrl` and `server.privacyUrl` pointing at the author's pages.