From d9a4d6b4ca23d076d936644aea4442af91a142ad Mon Sep 17 00:00:00 2001 From: Chris Doehring Date: Tue, 22 Sep 2026 19:35:49 -0700 Subject: [PATCH 01/19] Add design spec for Gundi Keycloak login theme (KC 11 and 26) Co-Authored-By: Claude Fable 5.1 --- ...09-22-keycloak-gundi-login-theme-design.md | 331 ++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md diff --git a/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md new file mode 100644 index 00000000..cb2a869b --- /dev/null +++ b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md @@ -0,0 +1,331 @@ +# Keycloak Gundi Login Theme — Design + +**Date:** 2026-09-22 +**Author:** Chris Doehring (with Claude) +**Status:** Design — pending review + +## Background + +Gundi authenticates portal users through Keycloak. Production runs Keycloak +11.0.2 (WildFly) in the `cdip-auth` namespace of the `cdip-prod01` cluster, applied +from a raw Deployment manifest rather than through ArgoCD. It hosts two realms that +the portal uses: `cdip-dev` (dev and stage portals) and `cdip-prod` (prod portal). +Both realms use the stock Keycloak login theme, so users redirected from the Gundi +portal land on a page that carries Keycloak branding, not Gundi's. + +A separate design (`docs/superpowers/specs/2026-07-14-keycloak-upgrade-design.md`, +currently on the `keycloak-26-upgrade-doc` branch) plans an upgrade to Keycloak +26.x. That design lists theme work as a non-goal and records the current theme as +stock. This design changes that: the theme ships for 11 now and the 26 variant +becomes an input to the upgrade. + +The local portal stack (`docker-compose.yml`) runs Keycloak 23.0. It is not a +target of this work. + +### Brand reference + +The React Gundi portal (`padas/gundi-portal`) is the visual reference, not the +legacy Django templates in this repo. Its `tailwind.config.js` and `index.css` +define the palette and font used below. The logo is the green-and-navy sail mark +(`gundi-portal/src/images/gundi-logo.png`, identical to +`cdip_admin/website/static/logo.png`) with the "GUNDI" wordmark. + +## Goals + +- A `gundi` login theme that restyles the stock Keycloak layout to match the + React portal: logo, colors, font, controls. +- The same theme source builds for Keycloak 11.0.2 and Keycloak 26.x. +- Zero FreeMarker template overrides, so every login-flow page inherits the + styling and Keycloak upgrades within a major version do not break it. +- Shipped to production Keycloak 11 with a realm-by-realm rollout and an + immediate, restart-free rollback. +- A 26 image containing the theme, handed to the upgrade rehearsal. + +## Non-goals + +- Custom page layouts (split screen, custom header, footer links). Each would + require a FreeMarker override maintained twice. +- Keycloakify or any React/Node build. Not supported on 11; overkill for a + username-and-password realm. +- Account console theme, email theme, admin console theme. +- Theming the Keycloak 23 instance in the portal's local compose stack. +- Changing realm content (display name, `displayNameHtml`). +- Moving the prod Keycloak 11 manifest into GitOps or into this repo. The + upgrade design owns manifest and secret changes. + +## Design + +### Theme layout + +One theme folder in this repo, next to the existing realm export: + +``` +keycloak/ + cdip-dev-realm.json existing + themes/gundi/login/ + theme.kc11.properties parent=keycloak (PatternFly 3) + theme.kc26.properties parent=keycloak.v2 (PatternFly 5) + messages/messages_en.properties loginAccountTitle override + resources/ + css/tokens.css colors, font, radii as CSS custom properties + css/gundi.css shared rules against stable #kc-* IDs + css/kc11.css PatternFly 3 class overrides + css/kc26.css PatternFly 5 class overrides + fonts/inter-*.woff2 Inter 400 and 600, bundled + img/gundi-logo.svg sail mark + wordmark, or a small PNG + Dockerfile.kc11 + Dockerfile.kc26 + compose.theme-dev.yml local KC 11 + KC 26 with theme bind-mounted + dev/realm-with-theme.json dev realm export + loginTheme + test user + tests/smoke.sh asserts theme assets load + RUNBOOK.md prod rollout and rollback commands +``` + +Keycloak requires the properties file to be named `theme.properties`. The two +version files carry a suffix in source and the Dockerfile renames the matching one +during the image build. Local compose does the same via a bind mount of the whole +folder plus a second mount of the right properties file over `theme.properties`. + +Each properties file lists only the stylesheets it needs, in cascade order: +`tokens.css`, `gundi.css`, then its version file. The 26 file also sets +`darkMode=false` so Keycloak 26 does not switch palettes with the OS scheme; the +portal is light only. + +### Why IDs, not framework classes + +Verified against the Keycloak source at tags `11.0.2` and `26.7.4`: the login +markup keeps these IDs across both versions. + +| Element | ID | +|---|---| +| Header block and realm name wrapper | `kc-header`, `kc-header-wrapper` | +| Page title | `kc-page-title` | +| Form container and login form | `kc-form`, `kc-form-wrapper`, `kc-form-login` | +| Info block under the form | `kc-info`, `kc-info-wrapper` | +| Username and password inputs | `username`, `password` | +| Reset-flow link | `reset-login` | + +IDs that exist only on 11 (`kc-form-options`, `kc-form-buttons`, `kc-login`, +`kc-content`) or only on 26 (`keycloak-bg`, `kc-registration-container`) go in the +version file. Framework classes (`btn btn-primary` on 11, `pf-v5-c-button pf-m-primary` +on 26) also go in the version file. `gundi.css` must contain no PatternFly class +selectors. + +### Visual design + +**Tokens** (`tokens.css`), from the React portal palette: + +| Token | Value | Source name | +|---|---|---| +| `--gundi-primary` | `#006842` | route-green | +| `--gundi-primary-hover` | `#00520c` | dark-green | +| `--gundi-text` | `#222222` | off-black | +| `--gundi-text-secondary` | `#63666A` | secondary-text | +| `--gundi-field-outline` | `#b1b3b3` | field-outline | +| `--gundi-divider` | `#dddddd` | divider-lines | +| `--gundi-error` | `#D0031B` | remove-red | +| `--gundi-error-bg` | `#FDF2F4` | remove-red-bg | +| `--gundi-page-bg` | `#f7f9f7` | white-green | +| `--gundi-card-bg` | `#ffffff` | white | +| `--gundi-font` | `Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif` | index.css | +| `--gundi-radius-card` | `8px` | | +| `--gundi-radius-control` | `4px` | | + +Inter is bundled as woff2 at weights 400 and 600 and declared with `@font-face` +in `tokens.css`. The login page must not depend on a third-party CDN. + +**Layout.** Stock structure, restyled: + +- Page background flat `--gundi-page-bg`. On 11 this replaces the `keycloak-bg.png` + photo set on `.login-pf body`; on 26 it hides the `#keycloak-bg` panel. +- `#kc-header-wrapper` shows the Gundi logo as a CSS background image with its + text hidden (`font-size: 0` or `color: transparent`, plus fixed height). This + keeps the realm's `displayNameHtml` untouched and works identically on both + versions. Logo renders at roughly 48px tall, centered. +- The card (`.card-pf` on 11, `.pf-v5-c-login__main` on 26) is white, hairline + `--gundi-divider` border, `--gundi-radius-card`, soft shadow, max width 400px, + centered. On viewports under 480px it is full width with a 16px gutter. +- `#kc-page-title` in `--gundi-text`, 600 weight. + +**Controls.** + +- Inputs: 1px `--gundi-field-outline`, `--gundi-radius-control`, 40px tall. On + focus the border becomes `--gundi-primary` with a 3px translucent green ring. +- Primary button: full width, `--gundi-primary` background, white text, 600 + weight, `--gundi-radius-control`, hover `--gundi-primary-hover`, visible focus + ring. Secondary and link-style buttons use `--gundi-primary` text. +- Links (`forgot password`, `back to login`) in `--gundi-primary`, underline on + hover. +- Checkbox (`rememberMe`) and the 26 password-visibility toggle: `accent-color` + and icon color `--gundi-primary`. +- Alerts: inline band, 4px left border in the status color, error uses + `--gundi-error` on `--gundi-error-bg`. Success and info reuse the primary green + and a neutral gray respectively. + +**Copy.** `messages/messages_en.properties` overrides one key: +`loginAccountTitle=Sign in to Gundi`. All other strings stay stock. + +**Accessibility.** Body text and primary green on white both exceed WCAG AA +contrast. Every interactive control keeps a visible focus indicator. No +`outline: none` without a replacement ring. + +### Pages covered + +All pages the login theme renders inherit the shared stylesheet. The following +are the pages users of these realms can reach and are the verification set: + +| Page | 11 | 26 | How to reach locally | +|---|---|---|---| +| Login | yes | yes | account console redirect | +| Forgot password (`login-reset-password`) | yes | yes | link on login page | +| Info (after reset request) | yes | yes | submit forgot-password | +| Update password (`login-update-password`) | yes | yes | test user required action | +| Configure OTP / OTP login | yes | yes | test user required action | +| Error | yes | yes | auth URL with bad `redirect_uri` | +| Logout confirmation | no | yes | logout URL without `id_token_hint` | + +Registration and social login are disabled in the `cdip-dev` realm export and are +not verified. Confirm the same for `cdip-prod` in the admin console before the +prod flip; if either is enabled there, add the register and social-provider pages +to the manual walk. + +### Images + +`Dockerfile.kc11`: + +``` +FROM :11.0.2 +COPY keycloak/themes/gundi /opt/jboss/keycloak/themes/gundi +RUN mv /opt/jboss/keycloak/themes/gundi/login/theme.kc11.properties \ + /opt/jboss/keycloak/themes/gundi/login/theme.properties \ + && rm /opt/jboss/keycloak/themes/gundi/login/theme.kc26.properties +``` + +`Dockerfile.kc26` is the same shape against `quay.io/keycloak/keycloak:26.x`, +copying to `/opt/keycloak/themes/gundi`. It does not run `kc.sh build`; the +upgrade design owns the optimized-build decision and can layer on top of this +image or copy the theme folder into its own. + +The 11 base image must be confirmed at implementation time from the running prod +Deployment (`kubectl get deploy keycloak -n cdip-auth -o jsonpath='{.spec.template.spec.containers[0].image}'`). +The manifest copy in `padas/keycloak.yaml` says `jboss/keycloak:11.0.2`; the +upgrade design says `quay.io/keycloak/keycloak:11.0.2`. Use whatever prod runs. + +### CI + +New workflow `.github/workflows/keycloak-theme.yml`, triggered on push and pull +request when paths under `keycloak/**` or the workflow itself change. It: + +1. Builds both images with the shared `PADAS/gundi-workflows` `build_docker.yml` + workflow the portal already uses. +2. Starts each image with the dev realm import (`keycloak/dev/realm-with-theme.json`) + and runs `keycloak/tests/smoke.sh` against it. +3. On success on `main`, pushes to + `europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak` with tags + `11.0.2-gundi-` and `26.-gundi-`. + +Nothing deploys automatically. Prod Keycloak 11 is not ArgoCD-managed and the 26 +image is consumed by the upgrade work. + +### Smoke test + +`keycloak/tests/smoke.sh `: + +1. `GET {base}/auth/realms/{realm}/protocol/openid-connect/auth?client_id=account-console&response_type=code&redirect_uri=...&scope=openid` + with a valid redirect URI for the built-in `account-console` client, and assert + HTTP 200. +2. Assert the body contains `/resources/` URLs for `login/gundi/css/tokens.css`, + `login/gundi/css/gundi.css`, and the version stylesheet. +3. Fetch every ``, `url(...)` font, and the logo image + referenced from the theme and assert HTTP 200 for each. +4. Assert the body contains `Sign in to Gundi`. + +A wrong `parent=`, a mistyped `styles=` path, or a missing font all fail this test. +A silently unstyled page is the most common theme failure and the one this guards. + +### Local iteration + +`keycloak/compose.theme-dev.yml` runs two services: + +- `kc11`: the 11 base image on port 8081, theme folder bind-mounted to + `/opt/jboss/keycloak/themes/gundi`, `theme.kc11.properties` bind-mounted over + `login/theme.properties`, realm import via `KEYCLOAK_IMPORT`, and + `JAVA_OPTS_APPEND=-Dkeycloak.theme.staticMaxAge=-1 -Dkeycloak.theme.cacheThemes=false -Dkeycloak.theme.cacheTemplates=false`. +- `kc26`: the 26 base image on port 8082, `start-dev --import-realm` (dev mode + already disables theme caching), the same two bind mounts to `/opt/keycloak/themes/gundi`, + and `KC_HTTP_RELATIVE_PATH=/auth` so URLs match prod. + +Both use the embedded H2 database; no Postgres needed. `keycloak/dev/realm-with-theme.json` +is a copy of `cdip-dev-realm.json` with `"loginTheme": "gundi"` and a test user +`theme-tester` carrying the `UPDATE_PASSWORD` and `CONFIGURE_TOTP` required +actions. Editing any CSS file and reloading the browser shows the change on both. + +### Prod rollout (Keycloak 11) + +Recorded in `keycloak/RUNBOOK.md`. Order matters: + +1. **Image swap.** `kubectl --context cdip-prod -n cdip-auth set image deploy/keycloak keycloak=/gundi/keycloak:11.0.2-gundi-`. + Single replica, so this is a restart of the same length as the existing + nightly restart. Schedule it in the 02:00 UTC window or an agreed off-hours + slot. Confirm the pod is Ready and `curl` the stock login page still renders. +2. **Stage via `cdip-dev`.** Admin console → realm `cdip-dev` → Realm Settings → + Themes → Login Theme = `gundi` → Save. Log out of the dev portal and log back + in. Walk the verification table above by hand. +3. **Flip `cdip-prod`.** Same setting on the `cdip-prod` realm. Log in through the + prod portal. + +Steps 2 and 3 cause no restart. Theme selection is a per-realm lookup. + +### Rollback + +- **Visual problem:** set the realm's Login Theme back to `keycloak` (the stock + value). Immediate, no restart. +- **Image problem:** `kubectl --context cdip-prod -n cdip-auth rollout undo deploy/keycloak`. + Restores the stock image. Any realm still pointing at `gundi` would then fail to + render the login page, so revert the realm setting first if both are needed. + +### Hand-off to the Keycloak 26 upgrade + +The login theme setting is stored in the realm table. When the upgrade copies the +auth database, both realms will already point at `gundi`. The 26 image used at +cutover **must** include the theme or the login page returns an error. Concretely, +the upgrade work must: + +- Base its image on `Dockerfile.kc26` or copy `keycloak/themes/gundi` into its own + image with the 26 properties file renamed. +- Add the verification table above to its rehearsal checklist. +- Update the upgrade design doc: remove "theme work (confirmed stock)" from + non-goals and add the gundi 26 image as an input. That doc is on the + `keycloak-26-upgrade-doc` branch and is edited there, not in this change. + +## Testing summary + +| Layer | What | Where it runs | +|---|---|---| +| Smoke | Theme assets referenced and served, title override present | CI on both images; locally against compose | +| Manual visual | Verification table, both versions, desktop and 375px wide viewport | Locally before merge; on `cdip-dev` realm before flipping `cdip-prod` | +| Cascade guard | `gundi.css` contains no `pf-`, `btn`, `card-pf`, or `login-pf` selectors | Grep step in CI | + +## Risks + +- **Base image mismatch.** Building from the wrong 11 image (`jboss/` vs `quay.io/`) + could change the WildFly configuration prod relies on. Mitigation: read the + image from the live Deployment before building. +- **Realm points at a missing theme.** Happens only if the realm is flipped before + the image swap, or the 26 upgrade ships without the theme. Mitigation: runbook + ordering and the hand-off requirement above. +- **PatternFly 5 specificity.** Keycloak 26 styles use CSS custom properties and + fairly specific selectors. Some overrides may need to target the PatternFly + variables (`--pf-v5-c-button--m-primary--BackgroundColor`) rather than classes. + That stays in `kc26.css` and does not affect the shared file. +- **Font licensing and size.** Inter is OFL licensed; two woff2 weights are about + 200 KB total, cached after first load. Acceptable for a login page. + +## Follow-ups (not in this change) + +- Update the upgrade design doc as described in the hand-off section, once it is + on `main` or on its own branch. +- Move the portal's local compose from Keycloak 23 to 26 and mount the theme, so + the regular local stack shows the branded login. +- Commit the prod Keycloak 11 Deployment manifest to this repo with secrets moved + to a Kubernetes Secret. The upgrade design already plans the secret move. From ffaaf563c118b78889814db9e109d6b9f4bdefe8 Mon Sep 17 00:00:00 2001 From: Chris Doehring Date: Tue, 22 Sep 2026 19:38:48 -0700 Subject: [PATCH 02/19] Pin Keycloak 11 theme base image to quay.io/keycloak/keycloak:11.0.2 Co-Authored-By: Claude Fable 5.1 --- ...26-09-22-keycloak-gundi-login-theme-design.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md index cb2a869b..8c8ef7f2 100644 --- a/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md +++ b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md @@ -194,7 +194,7 @@ to the manual walk. `Dockerfile.kc11`: ``` -FROM :11.0.2 +FROM quay.io/keycloak/keycloak:11.0.2 COPY keycloak/themes/gundi /opt/jboss/keycloak/themes/gundi RUN mv /opt/jboss/keycloak/themes/gundi/login/theme.kc11.properties \ /opt/jboss/keycloak/themes/gundi/login/theme.properties \ @@ -206,10 +206,10 @@ copying to `/opt/keycloak/themes/gundi`. It does not run `kc.sh build`; the upgrade design owns the optimized-build decision and can layer on top of this image or copy the theme folder into its own. -The 11 base image must be confirmed at implementation time from the running prod -Deployment (`kubectl get deploy keycloak -n cdip-auth -o jsonpath='{.spec.template.spec.containers[0].image}'`). -The manifest copy in `padas/keycloak.yaml` says `jboss/keycloak:11.0.2`; the -upgrade design says `quay.io/keycloak/keycloak:11.0.2`. Use whatever prod runs. +The 11 base image is `quay.io/keycloak/keycloak:11.0.2`, confirmed from the +running prod Deployment on 2026-09-22. The stale manifest copy in +`padas/keycloak.yaml` says `jboss/keycloak:11.0.2` and should not be used as a +reference. Both images share the same `/opt/jboss/keycloak` layout. ### CI @@ -308,9 +308,9 @@ the upgrade work must: ## Risks -- **Base image mismatch.** Building from the wrong 11 image (`jboss/` vs `quay.io/`) - could change the WildFly configuration prod relies on. Mitigation: read the - image from the live Deployment before building. +- **Base image drift.** If prod's image ever changes, a theme image built from the + old base would change the WildFly configuration prod relies on. Mitigation: the + runbook re-reads the image from the live Deployment before each build. - **Realm points at a missing theme.** Happens only if the realm is flipped before the image swap, or the 26 upgrade ships without the theme. Mitigation: runbook ordering and the hand-off requirement above. From 8e5ecca40b95658e2f0d8030b603742ef110b73e Mon Sep 17 00:00:00 2001 From: Chris Doehring Date: Tue, 22 Sep 2026 19:45:11 -0700 Subject: [PATCH 03/19] Spec: title override is 26-only; add screenshot and css-guard test scripts Co-Authored-By: Claude Fable 5.1 --- ...09-22-keycloak-gundi-login-theme-design.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md index 8c8ef7f2..11289f80 100644 --- a/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md +++ b/docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md @@ -78,6 +78,9 @@ keycloak/ compose.theme-dev.yml local KC 11 + KC 26 with theme bind-mounted dev/realm-with-theme.json dev realm export + loginTheme + test user tests/smoke.sh asserts theme assets load + tests/check-css.sh cascade guard: no framework classes in gundi.css + tests/wait-ready.sh polls a realm URL until Keycloak answers + tests/screenshot.sh headless Chrome screenshot of login and error pages RUNBOOK.md prod rollout and rollback commands ``` @@ -163,7 +166,10 @@ in `tokens.css`. The login page must not depend on a third-party CDN. and a neutral gray respectively. **Copy.** `messages/messages_en.properties` overrides one key: -`loginAccountTitle=Sign in to Gundi`. All other strings stay stock. +`loginAccountTitle=Sign in to Gundi`. Keycloak 26 titles the login page with that +key. Keycloak 11 has no such key; its login page reuses `doLogIn`, the button +label, for the title, so overriding it would also rename the button. On 11 the +title therefore stays the stock "Log In". All other strings stay stock on both. **Accessibility.** Body text and primary green on white both exceed WCAG AA contrast. Every interactive control keeps a visible focus indicator. No @@ -238,7 +244,8 @@ image is consumed by the upgrade work. `login/gundi/css/gundi.css`, and the version stylesheet. 3. Fetch every ``, `url(...)` font, and the logo image referenced from the theme and assert HTTP 200 for each. -4. Assert the body contains `Sign in to Gundi`. +4. On 26, assert the body contains `Sign in to Gundi`. On 11, assert the page + title element `id="kc-page-title"` is present. A wrong `parent=`, a mistyped `styles=` path, or a missing font all fail this test. A silently unstyled page is the most common theme failure and the one this guards. @@ -256,10 +263,16 @@ A silently unstyled page is the most common theme failure and the one this guard and `KC_HTTP_RELATIVE_PATH=/auth` so URLs match prod. Both use the embedded H2 database; no Postgres needed. `keycloak/dev/realm-with-theme.json` -is a copy of `cdip-dev-realm.json` with `"loginTheme": "gundi"` and a test user +is a copy of `cdip-dev-realm.json` with `"loginTheme": "gundi"`, `"sslRequired": "none"` +so a containerized browser can reach it over plain HTTP, and a test user `theme-tester` carrying the `UPDATE_PASSWORD` and `CONFIGURE_TOTP` required actions. Editing any CSS file and reloading the browser shows the change on both. +`keycloak/tests/screenshot.sh` renders the login page and the error page of a +running instance to PNG with a headless Chrome container, so an implementer +without a browser can check the result. Pages behind a form submission (update +password, OTP, info) are walked by hand per the verification table. + ### Prod rollout (Keycloak 11) Recorded in `keycloak/RUNBOOK.md`. Order matters: From b14e1042dfad036d45c336531a87c9453adcd14f Mon Sep 17 00:00:00 2001 From: Chris Doehring Date: Tue, 22 Sep 2026 19:53:40 -0700 Subject: [PATCH 04/19] Add implementation plan for Gundi Keycloak login theme Co-Authored-By: Claude Fable 5.1 --- .../2026-09-22-keycloak-gundi-login-theme.md | 1556 +++++++++++++++++ 1 file changed, 1556 insertions(+) create mode 100644 docs/superpowers/plans/2026-09-22-keycloak-gundi-login-theme.md diff --git a/docs/superpowers/plans/2026-09-22-keycloak-gundi-login-theme.md b/docs/superpowers/plans/2026-09-22-keycloak-gundi-login-theme.md new file mode 100644 index 00000000..b2332fbc --- /dev/null +++ b/docs/superpowers/plans/2026-09-22-keycloak-gundi-login-theme.md @@ -0,0 +1,1556 @@ +# Keycloak Gundi Login Theme Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Ship a `gundi` Keycloak login theme that restyles the stock layout to match the React Gundi portal, builds for Keycloak 11.0.2 and 26.7 from one source folder, and is delivered as custom images with a tested rollout path. + +**Architecture:** One theme folder `keycloak/themes/gundi/login/` holds shared assets and a shared stylesheet written only against stable `#kc-*` IDs, plus one small version stylesheet and one properties file per Keycloak major. Two Dockerfiles copy the folder into the official images and pick the matching properties file. A compose file runs both versions locally with the theme bind-mounted; shell scripts smoke-test asset loading and screenshot pages with headless Chrome; a GitHub Actions workflow builds, tests, and pushes both images. + +**Tech Stack:** Keycloak FreeMarker theme system (properties + CSS only, no `.ftl` overrides), CSS custom properties, PatternFly 3 (KC 11) and PatternFly 5 (KC 26) class overrides, Docker, Docker Compose, bash, GitHub Actions, the shared `PADAS/gundi-workflows` build workflow. + +**Spec:** `docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md` + +## Global Constraints + +- Keycloak 11 base image is exactly `quay.io/keycloak/keycloak:11.0.2`. Keycloak 26 base image is `quay.io/keycloak/keycloak:26.7`. +- Theme folder name is `gundi`. Realm setting `loginTheme` will be set to `gundi`. +- No FreeMarker (`.ftl`) files anywhere under `keycloak/themes/`. +- `resources/css/gundi.css` contains no PatternFly, Bootstrap, or Keycloak framework class selectors. Only `#kc-*` IDs, element selectors, attribute selectors, and pseudo-elements. `keycloak/tests/check-css.sh` enforces this. +- Both properties files list the parent theme's own stylesheet first in `styles=`, because a child `styles=` replaces the parent's list rather than merging. +- The Keycloak 26 properties file sets `darkMode=false`. +- Fonts are bundled (Inter 4.1, weights 400 and 600, woff2). No external font or CDN request from the login page. +- Design tokens are the exact values in the spec's token table (`#006842`, `#00520c`, `#222222`, `#63666A`, `#b1b3b3`, `#dddddd`, `#D0031B`, `#FDF2F4`, `#f7f9f7`, `#ffffff`, radii 8px and 4px). +- Message overrides: `loginAccountTitle=Sign in to Gundi` (title on 26; 11 has no such key and keeps "Log In") and `loginTitle=Sign in to Gundi` (the `` tag on both). +- All shell scripts must run under macOS bash 3.2 and Ubuntu bash 5: no `mapfile`, no `declare -A`. +- Images are pushed to `europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak` with tags `11.0.2-gundi-<short sha>` and `26.7-gundi-<short sha>`, only from `main`, only after the smoke test passes. +- Nothing deploys automatically. Prod rollout is manual per `keycloak/RUNBOOK.md`. +- Run every command from the repository root unless a step says otherwise. + +## Review Focus + +1. **Realm `displayNameHtml` containing markup.** The prod realm may carry the Keycloak default `<div class="kc-logo-text"><span>Keycloak</span></div>`. Hiding the header text with `font-size: 0` does not hide a child `div` that draws its own background image, so a Keycloak logo could appear beside the Gundi mark. Expected: only the Gundi mark and wordmark render. Test in Task 4 (rule `#kc-header-wrapper > * { display: none; }`) using the realm fixture from Task 1, which sets that exact `displayNameHtml`. +2. **375px wide viewport.** Expected: card fills the width with a 16px gutter, no horizontal scroll, button and inputs full width. Test: the mobile screenshots in Tasks 5 and 6. +3. **Browser tab title on a realm whose display name is not "Gundi".** The `<title>` uses `loginTitle` with the realm display name, so the tab would read "Sign in to CDIP Dev" or the prod realm's name. Expected: tab reads "Sign in to Gundi". Test: smoke test asserts `<title>Sign in to Gundi` on both versions (Task 1 script, passing from Task 2). +4. **Error page reached with an unknown `client_id`.** No client context exists, and Keycloak renders `error.ftl` with a different message. Expected: still themed. Test: the second error screenshot in Tasks 5 and 6 uses `client_id=does-not-exist`. +5. **Font files failing to load.** If a woff2 is missing or mis-pathed, the page silently falls back to the system font and nobody notices. Expected: the smoke test fails. Test: Task 1 smoke script fetches every `url(...)` referenced from the theme stylesheets; Task 3 makes it pass. + +--- + +### Task 1: Local harness — realm fixture, compose file, smoke, wait, screenshot scripts + +**Files:** +- Create: `keycloak/dev/realm-with-theme.json` +- Create: `keycloak/compose.theme-dev.yml` +- Create: `keycloak/tests/wait-ready.sh` +- Create: `keycloak/tests/smoke.sh` +- Create: `keycloak/tests/screenshot.sh` +- Modify: `.gitignore` (append `keycloak/tests/shots/`) + +**Interfaces:** +- Consumes: `keycloak/cdip-dev-realm.json` (existing realm export; realm name `cdip-dev`, confidential client `cdip-kong-gateway` with redirect `http://localhost:8000/*`). +- Produces: `keycloak/tests/wait-ready.sh [timeout-seconds]`; `keycloak/tests/smoke.sh ` (exit 0 = pass); `keycloak/tests/screenshot.sh ` writing `keycloak/tests/shots/-{login,login-mobile,error,error-noclient}.png`; compose services `kc11` on `http://localhost:8081/auth` and `kc26` on `http://localhost:8082/auth`, admin login `admin`/`admin`. + +- [ ] **Step 1: Generate the realm fixture** + +```bash +mkdir -p keycloak/dev keycloak/tests +python3 - <<'EOF' +import json +src = json.load(open("keycloak/cdip-dev-realm.json")) +src["loginTheme"] = "gundi" +src["sslRequired"] = "none" # containerised Chrome reaches KC over plain http via host.docker.internal +# Simulates the Keycloak default markup a prod realm may carry; the theme must hide it (Review Focus 1). +src["displayNameHtml"] = '
Keycloak
' +src.setdefault("users", []).append({ + "username": "theme-tester", + "enabled": True, + "email": "theme-tester@example.com", + "firstName": "Theme", + "lastName": "Tester", + "credentials": [{"type": "password", "value": "theme-tester", "temporary": False}], + "requiredActions": ["UPDATE_PASSWORD", "CONFIGURE_TOTP"], +}) +json.dump(src, open("keycloak/dev/realm-with-theme.json", "w"), indent=2) +print("wrote keycloak/dev/realm-with-theme.json") +EOF +``` + +- [ ] **Step 2: Write `keycloak/tests/wait-ready.sh`** + +```bash +#!/usr/bin/env bash +# Usage: keycloak/tests/wait-ready.sh [timeout-seconds] +# Polls until returns HTTP 200. Keycloak 11 under amd64 emulation can take 3 minutes. +set -euo pipefail +url=${1:?usage: wait-ready.sh [timeout-seconds]} +timeout=${2:-300} +start=$(date +%s) +until curl -sf -o /dev/null "$url"; do + if (( $(date +%s) - start > timeout )); then + echo "timed out after ${timeout}s waiting for $url" >&2 + exit 1 + fi + sleep 3 +done +echo "ready: $url" +``` + +- [ ] **Step 3: Write `keycloak/tests/smoke.sh`** + +```bash +#!/usr/bin/env bash +# Usage: keycloak/tests/smoke.sh +# Asserts the login page uses the gundi theme and every theme asset it references is served. +# Catches the silent failures: wrong parent=, mistyped styles= path, missing font or logo. +set -euo pipefail +base=${1:?usage: smoke.sh } +realm=${2:?realm} +version=${3:?kc11|kc26} + +fail() { echo "FAIL: $*" >&2; exit 1; } + +login_url="$base/auth/realms/$realm/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" +html=$(curl -sf "$login_url") || fail "login page did not return 200: $login_url" + +# 1. The page must link our three stylesheets (theme.properties styles= is correct). +for css in tokens gundi "$version"; do + grep -q "login/gundi/css/$css.css" <<<"$html" || fail "login page does not reference css/$css.css" +done + +# 2. Every /resources/ asset the page links must be served. +assets=$(grep -oE '(href|src)="[^"]*/resources/[^"]+"' <<<"$html" | sed -E 's/^(href|src)="//; s/"$//' | sort -u) +[[ -n $assets ]] || fail "no /resources/ links found in login page" +while read -r a; do + [[ -z $a ]] && continue + url=$a; [[ $a == /* ]] && url="$base$a" + curl -sf -o /dev/null "$url" || fail "asset not served: $url" +done <<<"$assets" + +# 3. Every url(...) inside our stylesheets (fonts, logo) must be served. +while read -r a; do + [[ -z $a ]] && continue + [[ $a == *login/gundi/css/*.css ]] || continue + css_url=$a; [[ $a == /* ]] && css_url="$base$a" + css_dir=${css_url%/*} + refs=$(curl -sf "$css_url" | grep -oE 'url\(["'"'"']?[^)"'"'"']+' | sed -E 's/^url\(["'"'"']?//' | sort -u || true) + while read -r ref; do + [[ -z $ref || $ref == data:* || $ref == http* ]] && continue + curl -sf -o /dev/null "$css_dir/$ref" || fail "css reference not served: $css_dir/$ref (from $css_url)" + done <<<"$refs" +done <<<"$assets" + +# 4. Copy overrides. +grep -qE '[[:space:]]*Sign in to Gundi[[:space:]]*' <<<"$html" || fail " override missing" +if [[ $version == kc26 ]]; then + grep -q 'Sign in to Gundi' <<<"$html" || fail "loginAccountTitle override missing on kc26" +fi +grep -q 'id="kc-page-title"' <<<"$html" || fail "kc-page-title element missing" + +echo "PASS: $version gundi theme serves all assets from $base" +``` + +- [ ] **Step 4: Write `keycloak/tests/screenshot.sh`** + +```bash +#!/usr/bin/env bash +# Usage: keycloak/tests/screenshot.sh <kc11|kc26> <host-port> +# Renders login and error pages of a running local Keycloak to PNG with headless Chrome in Docker. +# Output: keycloak/tests/shots/<version>-{login,login-mobile,error,error-noclient}.png +set -euo pipefail +version=${1:?usage: screenshot.sh <kc11|kc26> <host-port>} +port=${2:?host port, e.g. 8081} +here=$(cd "$(dirname "$0")" && pwd) +out="$here/shots" +mkdir -p "$out" + +auth="http://host.docker.internal:$port/auth/realms/cdip-dev/protocol/openid-connect/auth" +ok_redirect="redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" +bad_redirect="redirect_uri=http%3A%2F%2Fevil.example%2F" + +shot() { # <name> <WxH> <url> + docker run --rm --add-host=host.docker.internal:host-gateway -v "$out:/out" zenika/alpine-chrome:latest \ + --no-sandbox --headless --disable-gpu --hide-scrollbars --virtual-time-budget=3000 \ + --window-size="$2" --screenshot="/out/$version-$1.png" "$3" >/dev/null 2>&1 + echo "wrote $out/$version-$1.png" +} + +shot login 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" +shot login-mobile 375,812 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" +shot error 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$bad_redirect" +shot error-noclient 1280,900 "$auth?client_id=does-not-exist&response_type=code&scope=openid&$ok_redirect" +``` + +- [ ] **Step 5: Write `keycloak/compose.theme-dev.yml`** + +```yaml +# Keycloak 11 and 26 side by side with the gundi login theme bind-mounted for live editing. +# From the repo root: docker compose -f keycloak/compose.theme-dev.yml up +# KC 11 -> http://localhost:8081/auth KC 26 -> http://localhost:8082/auth +# admin console: admin / admin realm: cdip-dev (users: dev, theme-tester / theme-tester) +# Edit any file under themes/gundi and reload the browser; both versions run with theme caching off. +services: + kc11: + image: quay.io/keycloak/keycloak:11.0.2 + platform: linux/amd64 # no arm64 build exists; runs emulated on Apple Silicon + ports: + - "8081:8080" + environment: + KEYCLOAK_USER: admin + KEYCLOAK_PASSWORD: admin + DB_VENDOR: h2 + KEYCLOAK_IMPORT: /tmp/realm.json + command: + - -b + - 0.0.0.0 + - -Dkeycloak.theme.staticMaxAge=-1 + - -Dkeycloak.theme.cacheThemes=false + - -Dkeycloak.theme.cacheTemplates=false + volumes: + - ./dev/realm-with-theme.json:/tmp/realm.json:ro + - ./themes/gundi:/opt/jboss/keycloak/themes/gundi:ro + - ./themes/gundi/login/theme.kc11.properties:/opt/jboss/keycloak/themes/gundi/login/theme.properties:ro + + kc26: + image: quay.io/keycloak/keycloak:26.7 + ports: + - "8082:8080" + environment: + KC_BOOTSTRAP_ADMIN_USERNAME: admin + KC_BOOTSTRAP_ADMIN_PASSWORD: admin + KC_HTTP_RELATIVE_PATH: /auth # match prod URL shape + command: ["start-dev", "--import-realm"] # start-dev disables theme caching + volumes: + - ./dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro + - ./themes/gundi:/opt/keycloak/themes/gundi:ro + - ./themes/gundi/login/theme.kc26.properties:/opt/keycloak/themes/gundi/login/theme.properties:ro +``` + +- [ ] **Step 6: Make scripts executable and ignore screenshots** + +```bash +chmod +x keycloak/tests/wait-ready.sh keycloak/tests/smoke.sh keycloak/tests/screenshot.sh +printf '\n# Keycloak theme screenshots (generated by keycloak/tests/screenshot.sh)\nkeycloak/tests/shots/\n' >> .gitignore +``` + +- [ ] **Step 7: Create stub properties files so compose can bind them** + +Compose fails if a bind-mount source file does not exist. Write the two properties files with only a `parent=` line so Keycloak can render the parent theme's pages; Task 2 fills them in. (An empty file would leave the theme without a parent and Keycloak would return a 500 instead of an unstyled page.) + +```bash +mkdir -p keycloak/themes/gundi/login +printf 'parent=keycloak\n' > keycloak/themes/gundi/login/theme.kc11.properties +printf 'parent=keycloak.v2\n' > keycloak/themes/gundi/login/theme.kc26.properties +``` + +- [ ] **Step 8: Start both instances and wait** + +```bash +docker compose -f keycloak/compose.theme-dev.yml up -d +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev 300 +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev 300 +``` + +Expected: both print `ready: ...`. If kc11 times out, run `docker compose -f keycloak/compose.theme-dev.yml logs kc11` and check for the realm import line `Realm 'cdip-dev' imported`. + +- [ ] **Step 9: Run the smoke test and confirm it fails for the right reason** + +```bash +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11; echo "exit=$?" +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26; echo "exit=$?" +``` + +Expected: both print `FAIL: login page does not reference css/tokens.css` and `exit=1`. The stub theme has a parent but no `styles=`, so the page renders with the parent's markup and none of our stylesheets. Any other failure (page not 200) means the harness itself is broken; fix that before continuing. + +- [ ] **Step 10: Run the screenshot script once to pull the Chrome image and confirm output** + +```bash +keycloak/tests/screenshot.sh kc26 8082 +ls -la keycloak/tests/shots/ +``` + +Expected: four PNGs named `kc26-*.png`. View `keycloak/tests/shots/kc26-login.png` with the Read tool: it should show the stock Keycloak 26 login page (proves the pipeline; styling comes later). + +- [ ] **Step 11: Commit** + +```bash +git add keycloak/dev/realm-with-theme.json keycloak/compose.theme-dev.yml keycloak/tests/wait-ready.sh keycloak/tests/smoke.sh keycloak/tests/screenshot.sh keycloak/themes/gundi/login/theme.kc11.properties keycloak/themes/gundi/login/theme.kc26.properties .gitignore +git commit -m "Add local Keycloak 11/26 theme harness with smoke and screenshot scripts" +``` + +--- + +### Task 2: Theme skeleton — properties files, empty stylesheets, message overrides + +**Files:** +- Modify: `keycloak/themes/gundi/login/theme.kc11.properties` +- Modify: `keycloak/themes/gundi/login/theme.kc26.properties` +- Create: `keycloak/themes/gundi/login/messages/messages_en.properties` +- Create: `keycloak/themes/gundi/login/resources/css/tokens.css` (comment only for now) +- Create: `keycloak/themes/gundi/login/resources/css/gundi.css` (comment only) +- Create: `keycloak/themes/gundi/login/resources/css/kc11.css` (comment only) +- Create: `keycloak/themes/gundi/login/resources/css/kc26.css` (comment only) + +**Interfaces:** +- Consumes: Task 1 harness. +- Produces: the stylesheet load order every later task relies on: parent stylesheet, then `tokens.css`, `gundi.css`, `kc11.css` or `kc26.css`. + +- [ ] **Step 1: Write the Keycloak 11 properties file** + +`keycloak/themes/gundi/login/theme.kc11.properties`: + +```properties +# Gundi login theme for Keycloak 11.0.2 (WildFly; parent "keycloak" is PatternFly 3). +# Installed as theme.properties by Dockerfile.kc11 and by compose.theme-dev.yml. +parent=keycloak +import=common/keycloak + +# A child `styles=` REPLACES the parent's list, so the parent's login.css is listed first. +# Resources resolve through the parent chain, so css/login.css comes from the keycloak theme. +styles=css/login.css css/tokens.css css/gundi.css css/kc11.css +``` + +- [ ] **Step 2: Write the Keycloak 26 properties file** + +`keycloak/themes/gundi/login/theme.kc26.properties`: + +```properties +# Gundi login theme for Keycloak 26.x (Quarkus; parent "keycloak.v2" is PatternFly 5). +# Installed as theme.properties by Dockerfile.kc26 and by compose.theme-dev.yml. +parent=keycloak.v2 +import=common/keycloak + +# A child `styles=` REPLACES the parent's list, so the parent's styles.css is listed first. +styles=css/styles.css css/tokens.css css/gundi.css css/kc26.css + +# The portal is light-only; do not follow the OS colour scheme. +darkMode=false +``` + +- [ ] **Step 3: Write the message overrides** + +`keycloak/themes/gundi/login/messages/messages_en.properties`: + +```properties +# Only the two title strings change. Everything else inherits from the parent theme. +# loginAccountTitle is the login page h1 on Keycloak 26. Keycloak 11 has no such key and +# titles the page with doLogIn (also the button label), so 11 keeps the stock "Log In". +loginAccountTitle=Sign in to Gundi +# <title> tag on both versions. Ignores the realm display name placeholder {0} on purpose. +loginTitle=Sign in to Gundi +``` + +- [ ] **Step 4: Create the four stylesheets with header comments only** + +```bash +mkdir -p keycloak/themes/gundi/login/resources/css keycloak/themes/gundi/login/messages +cat > keycloak/themes/gundi/login/resources/css/tokens.css <<'EOF' +/* Gundi design tokens shared by both Keycloak versions. Filled in Task 3. */ +EOF +cat > keycloak/themes/gundi/login/resources/css/gundi.css <<'EOF' +/* Shared Gundi rules. Only stable #kc-* ids, element, attribute and pseudo selectors. + Framework classes (PatternFly 3 / 5) belong in kc11.css / kc26.css. + Enforced by keycloak/tests/check-css.sh. Filled in Task 4. */ +EOF +cat > keycloak/themes/gundi/login/resources/css/kc11.css <<'EOF' +/* Keycloak 11 (PatternFly 3) class overrides for the Gundi theme. Filled in Task 5. */ +EOF +cat > keycloak/themes/gundi/login/resources/css/kc26.css <<'EOF' +/* Keycloak 26 (PatternFly 5) class overrides for the Gundi theme. Filled in Task 6. */ +EOF +``` + +- [ ] **Step 5: Restart the instances so they pick up the new mounts and the messages file** + +Theme caching is off, but the `messages/` directory did not exist when the containers started, and Keycloak 11 reads the theme directory listing at startup. + +```bash +docker compose -f keycloak/compose.theme-dev.yml restart +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev 300 +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev 300 +``` + +- [ ] **Step 6: Run the smoke test on both** + +```bash +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +``` + +Expected: both print `PASS: ... gundi theme serves all assets ...`. If `kc11` fails on `<title>`, check that Keycloak 11's base messages define `loginTitle` with a `{0}` placeholder (it does at tag 11.0.2) and that the messages file has no BOM. + +- [ ] **Step 7: Screenshot both and confirm the pages still render as stock (nothing broken)** + +```bash +keycloak/tests/screenshot.sh kc11 8081 +keycloak/tests/screenshot.sh kc26 8082 +``` + +View `keycloak/tests/shots/kc11-login.png` and `kc26-login.png`. Expected: stock Keycloak pages, the 26 one titled "Sign in to Gundi". On 11 the header shows the Keycloak logo from the fixture's `displayNameHtml`; that is Review Focus 1 and is fixed in Task 4. + +- [ ] **Step 8: Commit** + +```bash +git add keycloak/themes/gundi +git commit -m "Add gundi Keycloak theme skeleton for KC 11 and 26 with title overrides" +``` + +--- + +### Task 3: Assets and tokens — Inter fonts, logo mark, tokens.css + +**Files:** +- Create: `keycloak/themes/gundi/login/resources/fonts/Inter-Regular.woff2` +- Create: `keycloak/themes/gundi/login/resources/fonts/Inter-SemiBold.woff2` +- Create: `keycloak/themes/gundi/login/resources/fonts/LICENSE.txt` +- Create: `keycloak/themes/gundi/login/resources/img/gundi-mark.png` +- Modify: `keycloak/themes/gundi/login/resources/css/tokens.css` + +**Interfaces:** +- Consumes: `cdip_admin/website/static/logo.png` (3089×2572 RGBA sail mark). +- Produces: CSS custom properties every later stylesheet uses: `--gundi-primary`, `--gundi-primary-hover`, `--gundi-text`, `--gundi-text-secondary`, `--gundi-field-outline`, `--gundi-divider`, `--gundi-error`, `--gundi-error-bg`, `--gundi-page-bg`, `--gundi-card-bg`, `--gundi-font`, `--gundi-radius-card`, `--gundi-radius-control`, `--gundi-focus-ring`, `--gundi-shadow-card`; font family `Inter` at 400 and 600; image at `../img/gundi-mark.png` relative to the css folder. + +- [ ] **Step 1: Download Inter 4.1 and extract the two weights plus licence** + +```bash +curl -sL -o /tmp/inter-4.1.zip https://github.com/rsms/inter/releases/download/v4.1/Inter-4.1.zip +mkdir -p keycloak/themes/gundi/login/resources/fonts +unzip -o -j /tmp/inter-4.1.zip web/Inter-Regular.woff2 web/Inter-SemiBold.woff2 LICENSE.txt -d keycloak/themes/gundi/login/resources/fonts/ +ls -la keycloak/themes/gundi/login/resources/fonts/ +``` + +Expected: `Inter-Regular.woff2` (~111 KB), `Inter-SemiBold.woff2` (~115 KB), `LICENSE.txt` (SIL Open Font License). + +- [ ] **Step 2: Export the logo mark at 2× display size** + +Displayed at 48px tall (about 58px wide); export 128px wide for retina. + +```bash +mkdir -p keycloak/themes/gundi/login/resources/img +sips -Z 128 cdip_admin/website/static/logo.png --out keycloak/themes/gundi/login/resources/img/gundi-mark.png +file keycloak/themes/gundi/login/resources/img/gundi-mark.png +``` + +Expected: `PNG image data, 128 x 107, 8-bit/color RGBA`. View it with the Read tool to confirm the green-and-navy sail mark is intact on a transparent background. + +- [ ] **Step 3: Write tokens.css** + +`keycloak/themes/gundi/login/resources/css/tokens.css`: + +```css +/* Gundi design tokens shared by both Keycloak versions. + Colour values come from gundi-portal/tailwind.config.js (names in comments). */ + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("../fonts/Inter-Regular.woff2") format("woff2"); +} +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("../fonts/Inter-SemiBold.woff2") format("woff2"); +} + +:root { + --gundi-primary: #006842; /* route-green */ + --gundi-primary-hover: #00520c; /* dark-green */ + --gundi-text: #222222; /* off-black */ + --gundi-text-secondary: #63666A; /* secondary-text */ + --gundi-field-outline: #b1b3b3; /* field-outline */ + --gundi-divider: #dddddd; /* divider-lines */ + --gundi-error: #D0031B; /* remove-red */ + --gundi-error-bg: #FDF2F4; /* remove-red-bg */ + --gundi-success-bg: #E8F2E9; /* light-green */ + --gundi-warning: #9d6900; /* warning-dark-yellow */ + --gundi-warning-bg: #fdfaf4; /* warning-yellow */ + --gundi-info-bg: #f2f6fc; /* light-blue-50 */ + --gundi-page-bg: #f7f9f7; /* white-green */ + --gundi-card-bg: #ffffff; + + --gundi-font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif; + + --gundi-radius-card: 8px; + --gundi-radius-control: 4px; + --gundi-focus-ring: rgba(0, 104, 66, 0.3); + --gundi-shadow-card: 0 4px 16px rgba(0, 0, 0, 0.06); +} +``` + +- [ ] **Step 4: Run the smoke test; it now also verifies the font and image URLs** + +```bash +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +``` + +Expected: `PASS` on both. A `css reference not served` failure means a path in `url(...)` is wrong relative to `resources/css/`. + +Note the image is not referenced from any stylesheet yet, so only the fonts are exercised here. Task 4 adds the logo reference. + +- [ ] **Step 5: Commit** + +```bash +git add keycloak/themes/gundi/login/resources +git commit -m "Add Inter fonts, Gundi logo mark and design tokens to the theme" +``` + +--- + +### Task 4: Shared stylesheet and cascade guard + +**Files:** +- Modify: `keycloak/themes/gundi/login/resources/css/gundi.css` +- Create: `keycloak/tests/check-css.sh` + +**Interfaces:** +- Consumes: tokens from Task 3. Stable IDs verified in the spec: `kc-header`, `kc-header-wrapper`, `kc-page-title`, `kc-form`, `kc-form-wrapper`, `kc-form-login`, `kc-info`, `kc-info-wrapper`, `kc-login`, `username`, `password`, `reset-login`. +- Produces: `keycloak/tests/check-css.sh` (exit 0 = clean). Header, title, primary button, and link styling that Tasks 5 and 6 must not duplicate. + +- [ ] **Step 1: Write the cascade guard** + +`keycloak/tests/check-css.sh`: + +```bash +#!/usr/bin/env bash +# Cascade guard: gundi.css is shared by Keycloak 11 (PatternFly 3) and 26 (PatternFly 5), +# so it may only use #kc-* ids, element, attribute and pseudo selectors. +# Any framework class selector must live in kc11.css or kc26.css instead. +set -euo pipefail +here=$(cd "$(dirname "$0")" && pwd) +file="$here/../themes/gundi/login/resources/css/gundi.css" +pattern='\.(pf-|btn|card-pf|login-pf|form-|alert|checkbox|control-label)' +if grep -nE "$pattern" "$file"; then + echo "FAIL: framework class selectors found in $file (move them to kc11.css / kc26.css)" >&2 + exit 1 +fi +echo "PASS: gundi.css has no framework class selectors" +``` + +```bash +chmod +x keycloak/tests/check-css.sh +``` + +- [ ] **Step 2: Prove the guard detects a violation** + +```bash +printf '.btn-primary { color: red; }\n' >> keycloak/themes/gundi/login/resources/css/gundi.css +keycloak/tests/check-css.sh; echo "exit=$?" +``` + +Expected: prints the offending line and `FAIL: ...`, `exit=1`. Then remove the line: + +```bash +sed -i '' '/^\.btn-primary { color: red; }$/d' keycloak/themes/gundi/login/resources/css/gundi.css +keycloak/tests/check-css.sh +``` + +Expected: `PASS`. (On Linux use `sed -i` without the empty string.) + +- [ ] **Step 3: Write gundi.css** + +`keycloak/themes/gundi/login/resources/css/gundi.css`: + +```css +/* Shared Gundi rules. Only stable #kc-* ids, element, attribute and pseudo selectors. + Framework classes (PatternFly 3 / 5) belong in kc11.css / kc26.css. + Enforced by keycloak/tests/check-css.sh. Loads after tokens.css. */ + +html, +body { + font-family: var(--gundi-font); + color: var(--gundi-text); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* ---- Header: replace the realm display name with the Gundi mark + wordmark ---- + The wrapper prints realm.displayNameHtml. We collapse its text to nothing and draw + the brand with pseudo-elements, so no realm content needs to change. */ +#kc-header { + color: var(--gundi-text); + padding: 0; +} +#kc-header-wrapper { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + margin: 0 auto 28px; + padding: 0; + font-size: 0; /* hides the text node */ + line-height: 0; + letter-spacing: 0; /* reset parent theme's letter-spacing so ::after is not affected */ + text-transform: none; + color: transparent; +} +/* A realm may carry markup in displayNameHtml (e.g. Keycloak's default logo div). Hide it. */ +#kc-header-wrapper > * { + display: none; +} +#kc-header-wrapper::before { + content: ""; + display: block; + width: 58px; + height: 48px; + background: url("../img/gundi-mark.png") no-repeat center / contain; +} +#kc-header-wrapper::after { + content: "GUNDI"; + display: block; + font-family: var(--gundi-font); + font-size: 26px; + font-weight: 600; + line-height: 1; + letter-spacing: 0.08em; + color: var(--gundi-text); +} + +/* ---- Page title ---- */ +#kc-page-title { + font-family: var(--gundi-font); + font-size: 22px; + font-weight: 600; + line-height: 1.3; + color: var(--gundi-text); + text-align: center; + margin: 0 0 20px; +} + +/* ---- Primary submit button (same id on 11 and 26) ---- */ +#kc-login { + display: block; + width: 100%; + min-height: 44px; + padding: 0 16px; + border: 0; + border-radius: var(--gundi-radius-control); + background: var(--gundi-primary); + color: #ffffff; + font-family: var(--gundi-font); + font-size: 15px; + font-weight: 600; + line-height: 44px; + cursor: pointer; + transition: background-color 120ms ease; +} +#kc-login:hover { + background: var(--gundi-primary-hover); + color: #ffffff; +} +#kc-login:focus-visible { + outline: 3px solid var(--gundi-focus-ring); + outline-offset: 2px; +} + +/* ---- Links inside the form and the info block ---- */ +#kc-form a, +#kc-form-login a, +#kc-info a { + color: var(--gundi-primary); + font-weight: 500; + text-decoration: none; +} +#kc-form a:hover, +#kc-form-login a:hover, +#kc-info a:hover { + color: var(--gundi-primary-hover); + text-decoration: underline; +} +#kc-info { + color: var(--gundi-text-secondary); + font-size: 14px; +} + +/* ---- Username / password inputs by id (other pages' inputs are styled per version) ---- */ +#username, +#password { + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} +``` + +- [ ] **Step 4: Run the guard and the smoke test** + +```bash +keycloak/tests/check-css.sh +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +``` + +Expected: all three `PASS`. The smoke test now also fetches `../img/gundi-mark.png`. + +- [ ] **Step 5: Screenshot both versions and check the header** + +```bash +keycloak/tests/screenshot.sh kc11 8081 +keycloak/tests/screenshot.sh kc26 8082 +``` + +View `kc11-login.png` and `kc26-login.png`. Expected on both: the sail mark with "GUNDI" beside it above the card, and **no** Keycloak logo (the fixture's `displayNameHtml` div is hidden; Review Focus 1). The green button reads "Log In" on 11 and "Sign In" on 26. Card, background, and inputs are still stock; that is Tasks 5 and 6. + +- [ ] **Step 6: Commit** + +```bash +git add keycloak/themes/gundi/login/resources/css/gundi.css keycloak/tests/check-css.sh +git commit -m "Add shared Gundi login stylesheet and cascade guard" +``` + +--- + +### Task 5: Keycloak 11 overrides (PatternFly 3) + +**Files:** +- Modify: `keycloak/themes/gundi/login/resources/css/kc11.css` + +**Interfaces:** +- Consumes: tokens (Task 3), shared rules (Task 4). PatternFly 3 classes from the KC 11 `keycloak` theme: `.login-pf`, `.login-pf-page`, `.card-pf`, `.login-pf-header`, `.form-control`, `.control-label`, `.btn-primary`, `.btn-default`, `.checkbox`, `.alert-error|-success|-warning|-info`, `.login-pf-settings`, `.login-pf-signup`, `#kc-form-options`, `#kc-form-buttons`. +- Produces: nothing consumed by later tasks. + +- [ ] **Step 1: Write kc11.css** + +`keycloak/themes/gundi/login/resources/css/kc11.css`: + +```css +/* Keycloak 11 (PatternFly 3) class overrides for the Gundi theme. Loads after gundi.css. */ + +/* Flat page background instead of the keycloak-bg.png photo */ +.login-pf body { + background: var(--gundi-page-bg); +} +.login-pf-page { + padding-top: 48px; + padding-bottom: 48px; +} +/* Ids that exist only on 11 */ +#kc-content-wrapper { + margin-top: 0; +} + +/* Card */ +.login-pf-page .card-pf { + max-width: 400px; + margin: 0 auto; + padding: 32px 32px 24px; + background: var(--gundi-card-bg); + border: 1px solid var(--gundi-divider); + border-radius: var(--gundi-radius-card); + box-shadow: var(--gundi-shadow-card); +} +.login-pf-page .login-pf-header { + margin-bottom: 0; +} + +/* Inputs */ +.card-pf .form-control { + height: 40px; + padding: 0 12px; + border: 1px solid var(--gundi-field-outline); + border-radius: var(--gundi-radius-control); + box-shadow: none; + background: #ffffff; + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} +.card-pf .form-control:focus { + border-color: var(--gundi-primary); + box-shadow: 0 0 0 3px var(--gundi-focus-ring); + outline: 0; +} +.card-pf .control-label { + font-family: var(--gundi-font); + font-size: 14px; + font-weight: 500; + color: var(--gundi-text); + margin-bottom: 6px; +} +.card-pf .form-group { + margin-bottom: 16px; +} + +/* Buttons (the primary submit is styled by #kc-login in gundi.css; these cover other pages) */ +.login-pf-page .btn { + font-family: var(--gundi-font); + font-weight: 600; + border-radius: var(--gundi-radius-control); +} +.login-pf-page .btn-primary, +.login-pf-page .btn-primary:focus { + background: var(--gundi-primary); + border-color: var(--gundi-primary); + color: #ffffff; +} +.login-pf-page .btn-primary:hover, +.login-pf-page .btn-primary:active { + background: var(--gundi-primary-hover); + border-color: var(--gundi-primary-hover); +} +.login-pf-page .btn-default { + background: #ffffff; + border-color: var(--gundi-field-outline); + color: var(--gundi-primary); +} +.login-pf-page .btn-default:hover { + border-color: var(--gundi-primary); + color: var(--gundi-primary-hover); +} +#kc-form-buttons { + margin-top: 8px; +} + +/* Remember me + forgot password row */ +#kc-form-options .checkbox input[type="checkbox"] { + accent-color: var(--gundi-primary); +} +#kc-form-options .checkbox label { + color: var(--gundi-text-secondary); + font-size: 14px; +} +.login-pf-page .login-pf-settings a, +.login-pf-page .login-pf-signup a { + color: var(--gundi-primary); +} + +/* Alerts as inline bands with a status-coloured left border */ +.login-pf-page .alert { + border: 0; + border-left: 4px solid var(--gundi-text-secondary); + border-radius: var(--gundi-radius-control); + padding: 12px 14px; + color: var(--gundi-text); + background: var(--gundi-info-bg); +} +.login-pf-page .alert-error { + background: var(--gundi-error-bg); + border-left-color: var(--gundi-error); +} +.login-pf-page .alert-error .pficon { + color: var(--gundi-error); +} +.login-pf-page .alert-success { + background: var(--gundi-success-bg); + border-left-color: var(--gundi-primary); +} +.login-pf-page .alert-success .pficon { + color: var(--gundi-primary); +} +.login-pf-page .alert-warning { + background: var(--gundi-warning-bg); + border-left-color: var(--gundi-warning); +} +.login-pf-page .alert-warning .pficon { + color: var(--gundi-warning); +} +.login-pf-page .alert-info { + background: var(--gundi-info-bg); + border-left-color: var(--gundi-text-secondary); +} + +/* Phones */ +@media (max-width: 480px) { + .login-pf-page { + padding-top: 24px; + } + .login-pf-page .card-pf { + margin: 0 16px; + padding: 24px 20px; + } +} +``` + +- [ ] **Step 2: Smoke test and screenshots** + +```bash +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/screenshot.sh kc11 8081 +``` + +View all four `kc11-*.png` files. Check against the spec: + +- `kc11-login.png`: flat `#f7f9f7` page, white card with hairline border and rounded corners, Gundi header, inputs with light-gray outline, full-width green button, "Forgot Password?" link in green, remember-me checkbox present. +- `kc11-login-mobile.png`: card spans the width with a 16px gutter, no horizontal scrollbar. +- `kc11-error.png`: themed page with the error band (red left border on pale red). +- `kc11-error-noclient.png`: same treatment for the "Client not found" error (Review Focus 4). + +Adjust padding or spacing values in `kc11.css` and re-run the screenshot until each matches. Do not add rules to `gundi.css` for 11-specific fixes. + +- [ ] **Step 3: Commit** + +```bash +git add keycloak/themes/gundi/login/resources/css/kc11.css +git commit -m "Style Keycloak 11 login pages with PatternFly 3 overrides" +``` + +--- + +### Task 6: Keycloak 26 overrides (PatternFly 5) + +**Files:** +- Modify: `keycloak/themes/gundi/login/resources/css/kc26.css` + +**Interfaces:** +- Consumes: tokens (Task 3), shared rules (Task 4). PatternFly 5 classes from the KC 26 `keycloak.v2` theme: `.pf-v5-c-login__main`, `.pf-v5-c-login__main-header`, `.pf-v5-c-login__main-body`, `.pf-v5-c-form-control` (a `span` wrapping the `input`), `.pf-v5-c-form__label`, `.pf-v5-c-button.pf-m-primary|.pf-m-secondary|.pf-m-link|.pf-m-control`, `.pf-v5-c-check__input`, `.pf-v5-c-alert.pf-m-inline.pf-m-danger|success|warning|info`, `#keycloak-bg` (the `body`), CSS variable `--keycloak-card-top-color`. +- Produces: nothing consumed by later tasks. + +- [ ] **Step 1: Write kc26.css** + +`keycloak/themes/gundi/login/resources/css/kc26.css`: + +```css +/* Keycloak 26 (PatternFly 5) class overrides for the Gundi theme. Loads after gundi.css. + Strategy: retheme PatternFly through its global tokens first, then patch the few + components that still show blue or Red Hat defaults. */ + +:root { + --pf-v5-global--FontFamily--text: var(--gundi-font); + --pf-v5-global--FontFamily--heading: var(--gundi-font); + --pf-v5-global--FontFamily--sans-serif: var(--gundi-font); + --pf-v5-global--primary-color--100: var(--gundi-primary); + --pf-v5-global--primary-color--200: var(--gundi-primary-hover); + --pf-v5-global--active-color--100: var(--gundi-primary); + --pf-v5-global--link--Color: var(--gundi-primary); + --pf-v5-global--link--Color--hover: var(--gundi-primary-hover); + --pf-v5-global--BorderRadius--sm: var(--gundi-radius-control); + --pf-v5-global--BorderColor--100: var(--gundi-field-outline); + --pf-v5-global--BorderColor--300: var(--gundi-field-outline); + --pf-v5-global--danger-color--100: var(--gundi-error); + --pf-v5-global--Color--100: var(--gundi-text); + --pf-v5-global--Color--200: var(--gundi-text-secondary); + --pf-v5-global--BackgroundColor--100: var(--gundi-card-bg); + --keycloak-card-top-color: var(--gundi-primary); +} + +/* Flat page background instead of the darkened Keycloak backdrop */ +.login-pf body, +body#keycloak-bg { + background: var(--gundi-page-bg); +} + +/* Card */ +.pf-v5-c-login__main { + max-width: 400px; + margin-left: auto; + margin-right: auto; + background: var(--gundi-card-bg); + border: 1px solid var(--gundi-divider); + border-top-width: 1px; /* remove the thick coloured top band */ + border-radius: var(--gundi-radius-card); + box-shadow: var(--gundi-shadow-card); +} +.pf-v5-c-login__main-header { + padding-top: 32px; +} +.pf-v5-c-login__main-body { + padding-bottom: 24px; +} +.pf-v5-c-login__header { + padding-bottom: 0; +} + +/* Inputs: PF5 draws the border on the wrapping span via ::after */ +.pf-v5-c-form-control { + --pf-v5-c-form-control--BorderRadius: var(--gundi-radius-control); + --pf-v5-c-form-control--BorderWidth: 1px; + --pf-v5-c-form-control--after--BorderBottomColor: var(--gundi-field-outline); + --pf-v5-c-form-control--hover--after--BorderBottomColor: var(--gundi-primary); + --pf-v5-c-form-control--focus--after--BorderBottomColor: var(--gundi-primary); + --pf-v5-c-form-control--focus--after--BorderBottomWidth: 1px; + border: 1px solid var(--gundi-field-outline); + border-radius: var(--gundi-radius-control); + min-height: 40px; +} +.pf-v5-c-form-control:focus-within { + border-color: var(--gundi-primary); + box-shadow: 0 0 0 3px var(--gundi-focus-ring); +} +.pf-v5-c-form-control input { + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} +.pf-v5-c-form__label-text { + font-weight: 500; + color: var(--gundi-text); +} + +/* Buttons (the primary submit is styled by #kc-login in gundi.css; these cover other pages) */ +.pf-v5-c-button { + font-family: var(--gundi-font); + font-weight: 600; + border-radius: var(--gundi-radius-control); +} +.pf-v5-c-button.pf-m-primary { + --pf-v5-c-button--m-primary--BackgroundColor: var(--gundi-primary); + --pf-v5-c-button--m-primary--hover--BackgroundColor: var(--gundi-primary-hover); + --pf-v5-c-button--m-primary--focus--BackgroundColor: var(--gundi-primary-hover); + --pf-v5-c-button--m-primary--active--BackgroundColor: var(--gundi-primary-hover); +} +.pf-v5-c-button.pf-m-secondary { + --pf-v5-c-button--m-secondary--Color: var(--gundi-primary); + --pf-v5-c-button--m-secondary--BorderColor: var(--gundi-field-outline); + --pf-v5-c-button--m-secondary--hover--Color: var(--gundi-primary-hover); + --pf-v5-c-button--m-secondary--hover--BorderColor: var(--gundi-primary); +} +.pf-v5-c-button.pf-m-link { + --pf-v5-c-button--m-link--Color: var(--gundi-primary); + --pf-v5-c-button--m-link--hover--Color: var(--gundi-primary-hover); +} +/* Password visibility toggle */ +.pf-v5-c-button.pf-m-control { + color: var(--gundi-primary); + border: 0; +} + +/* Remember me */ +.pf-v5-c-check__input { + accent-color: var(--gundi-primary); +} +.pf-v5-c-check__label { + color: var(--gundi-text-secondary); + font-size: 14px; +} + +/* Alerts as inline bands with a status-coloured left border */ +.pf-v5-c-alert.pf-m-inline { + --pf-v5-c-alert--BorderTopWidth: 0; + border-left: 4px solid var(--gundi-text-secondary); + border-radius: var(--gundi-radius-control); + box-shadow: none; + background: var(--gundi-info-bg); + color: var(--gundi-text); +} +.pf-v5-c-alert.pf-m-inline.pf-m-danger { + background: var(--gundi-error-bg); + border-left-color: var(--gundi-error); + --pf-v5-c-alert__icon--Color: var(--gundi-error); +} +.pf-v5-c-alert.pf-m-inline.pf-m-success { + background: var(--gundi-success-bg); + border-left-color: var(--gundi-primary); + --pf-v5-c-alert__icon--Color: var(--gundi-primary); +} +.pf-v5-c-alert.pf-m-inline.pf-m-warning { + background: var(--gundi-warning-bg); + border-left-color: var(--gundi-warning); + --pf-v5-c-alert__icon--Color: var(--gundi-warning); +} +.pf-v5-c-alert.pf-m-inline.pf-m-info { + background: var(--gundi-info-bg); + border-left-color: var(--gundi-text-secondary); + --pf-v5-c-alert__icon--Color: var(--gundi-text-secondary); +} + +/* Phones */ +@media (max-width: 480px) { + .pf-v5-c-login__main { + margin-left: 16px; + margin-right: 16px; + } +} +``` + +- [ ] **Step 2: Smoke test and screenshots** + +```bash +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +keycloak/tests/screenshot.sh kc26 8082 +``` + +View all four `kc26-*.png` files. Check against the spec: + +- `kc26-login.png`: flat page, white rounded card without the blue top band, Gundi header, "Sign in to Gundi" title, outlined inputs, password eye icon in green, full-width green "Sign In" button, green "Forgot Password?" link. +- `kc26-login-mobile.png`: card spans the width with a 16px gutter. +- `kc26-error.png` and `kc26-error-noclient.png`: themed with a red-left-border error band, no blue anywhere. + +If a control still shows PatternFly blue, find its variable name in the served `vendor/patternfly-v5/patternfly.min.css` (search for the component class) and override that variable on the component selector inside `kc26.css`. Do not touch `gundi.css`. + +- [ ] **Step 3: Confirm dark mode is off** + +```bash +docker run --rm --add-host=host.docker.internal:host-gateway -v "$PWD/keycloak/tests/shots:/out" zenika/alpine-chrome:latest \ + --no-sandbox --headless --disable-gpu --hide-scrollbars --virtual-time-budget=3000 \ + --force-dark-mode --enable-features=WebContentsForceDark --window-size=1280,900 \ + --screenshot=/out/kc26-login-forced-dark.png \ + "http://host.docker.internal:8082/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" +``` + +View `kc26-login-forced-dark.png`. Expected: identical light design. With `darkMode=true` the 26 template emits a script that adds the `pf-v5-theme-dark` class from `prefers-color-scheme`; with `darkMode=false` that script is absent, so the string must not appear in the HTML at all: + +```bash +curl -s "http://localhost:8082/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" | grep -c 'pf-v5-theme-dark' || true +``` + +Expected: `0`. + +- [ ] **Step 4: Commit** + +```bash +git add keycloak/themes/gundi/login/resources/css/kc26.css +git commit -m "Style Keycloak 26 login pages with PatternFly 5 overrides" +``` + +--- + +### Task 7: Dockerfiles and local image verification + +**Files:** +- Create: `keycloak/Dockerfile.kc11` +- Create: `keycloak/Dockerfile.kc26` + +**Interfaces:** +- Consumes: the theme folder from Tasks 2–6; Task 1 fixture and scripts. +- Produces: images buildable from the repo root with `docker build -f keycloak/Dockerfile.kc11 -t gundi-keycloak:kc11 .` and `docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 .`, each containing `/…/themes/gundi/login/theme.properties` for its version and no `theme.kc*.properties` files. Task 8 builds these in CI. + +- [ ] **Step 1: Write Dockerfile.kc11** + +`keycloak/Dockerfile.kc11`: + +```dockerfile +# Production Keycloak 11 image with the Gundi login theme baked in. +# Build from the repo root: docker build -f keycloak/Dockerfile.kc11 -t gundi-keycloak:kc11 . +# The base image runs as uid 1000, so files are chowned to it. Only the KC 11 properties +# file is copied, renamed to theme.properties. No RUN step, no shell, nothing else changes. +FROM quay.io/keycloak/keycloak:11.0.2 + +COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/jboss/keycloak/themes/gundi/login/resources +COPY --chown=1000:0 keycloak/themes/gundi/login/messages /opt/jboss/keycloak/themes/gundi/login/messages +COPY --chown=1000:0 keycloak/themes/gundi/login/theme.kc11.properties /opt/jboss/keycloak/themes/gundi/login/theme.properties +``` + +- [ ] **Step 2: Write Dockerfile.kc26** + +`keycloak/Dockerfile.kc26`: + +```dockerfile +# Keycloak 26 image with the Gundi login theme baked in. Input to the KC 26 upgrade rehearsal. +# Build from the repo root: docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 . +# Deliberately does not run `kc.sh build`; the upgrade design owns the optimized-build decision +# and can layer on top of this image or copy the theme folder into its own. +FROM quay.io/keycloak/keycloak:26.7 + +COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/keycloak/themes/gundi/login/resources +COPY --chown=1000:0 keycloak/themes/gundi/login/messages /opt/keycloak/themes/gundi/login/messages +COPY --chown=1000:0 keycloak/themes/gundi/login/theme.kc26.properties /opt/keycloak/themes/gundi/login/theme.properties +``` + +- [ ] **Step 3: Build both images** + +```bash +docker build --platform linux/amd64 -f keycloak/Dockerfile.kc11 -t gundi-keycloak:kc11 . +docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 . +``` + +Expected: both succeed. Confirm the file layout inside each image: + +```bash +docker run --rm --platform linux/amd64 --entrypoint ls gundi-keycloak:kc11 -la /opt/jboss/keycloak/themes/gundi/login/ +docker run --rm --entrypoint ls gundi-keycloak:kc26 /opt/keycloak/themes/gundi/login/ +``` + +Expected: `messages`, `resources`, `theme.properties` and nothing else; owner `1000` on kc11. + +- [ ] **Step 4: Stop the compose harness and run the built images without bind mounts** + +```bash +docker compose -f keycloak/compose.theme-dev.yml down +docker run -d --name kc11-img --platform linux/amd64 -p 8081:8080 \ + -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 \ + -e KEYCLOAK_IMPORT=/tmp/realm.json \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/tmp/realm.json:ro" \ + gundi-keycloak:kc11 -b 0.0.0.0 +docker run -d --name kc26-img -p 8082:8080 \ + -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ + -e KC_HTTP_RELATIVE_PATH=/auth \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro" \ + gundi-keycloak:kc26 start-dev --import-realm +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev 300 +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev 300 +``` + +- [ ] **Step 5: Smoke test the images** + +```bash +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +``` + +Expected: `PASS` on both. This proves the theme works from the image alone, with Keycloak 11's theme caching on (the image runs without the `-Dkeycloak.theme.*` flags). + +- [ ] **Step 6: Clean up the image containers and bring the dev harness back** + +```bash +docker rm -f kc11-img kc26-img +docker compose -f keycloak/compose.theme-dev.yml up -d +``` + +- [ ] **Step 7: Commit** + +```bash +git add keycloak/Dockerfile.kc11 keycloak/Dockerfile.kc26 +git commit -m "Add Dockerfiles baking the Gundi theme into Keycloak 11 and 26 images" +``` + +--- + +### Task 8: CI workflow — build, smoke test, push on main + +**Files:** +- Create: `.github/workflows/keycloak-theme.yml` + +**Interfaces:** +- Consumes: Dockerfiles (Task 7), `keycloak/tests/*.sh` (Tasks 1 and 4), `keycloak/dev/realm-with-theme.json` (Task 1), the shared reusable workflow `PADAS/gundi-workflows/.github/workflows/build_docker.yml@v11` (inputs: `workload_identity_provider`, `repository`, `tag`, `dockerfile`; it always pushes, so it runs only after the test job), repository variable `WORKLOAD_IDENTITY_PROVIDER` (already used by `main.yml`). +- Produces: images at `europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak:11.0.2-gundi-<sha>` and `:26.7-gundi-<sha>` on every push to `main` touching `keycloak/**`. + +- [ ] **Step 1: Write the workflow** + +`.github/workflows/keycloak-theme.yml`: + +```yaml +name: Keycloak Gundi theme images + +on: + push: + branches: [main] + paths: + - 'keycloak/**' + - '.github/workflows/keycloak-theme.yml' + pull_request: + paths: + - 'keycloak/**' + - '.github/workflows/keycloak-theme.yml' + +jobs: + test: + # Builds each image locally (no push), boots it with the dev realm, and runs the smoke test. + # The shared build_docker workflow always pushes, so it must not run before this passes. + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - version: kc11 + port: 8081 + - version: kc26 + port: 8082 + steps: + - uses: actions/checkout@v4 + + - name: Cascade guard (shared stylesheet has no framework classes) + run: keycloak/tests/check-css.sh + + - name: Build image + run: docker build -f keycloak/Dockerfile.${{ matrix.version }} -t gundi-keycloak:${{ matrix.version }} . + + - name: Start Keycloak 11 + if: matrix.version == 'kc11' + run: | + docker run -d --name kc -p 8081:8080 \ + -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 \ + -e KEYCLOAK_IMPORT=/tmp/realm.json \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/tmp/realm.json:ro" \ + gundi-keycloak:kc11 -b 0.0.0.0 + + - name: Start Keycloak 26 + if: matrix.version == 'kc26' + run: | + docker run -d --name kc -p 8082:8080 \ + -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ + -e KC_HTTP_RELATIVE_PATH=/auth \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro" \ + gundi-keycloak:kc26 start-dev --import-realm + + - name: Wait for Keycloak + run: keycloak/tests/wait-ready.sh http://localhost:${{ matrix.port }}/auth/realms/cdip-dev 300 + + - name: Smoke test + run: keycloak/tests/smoke.sh http://localhost:${{ matrix.port }} cdip-dev ${{ matrix.version }} + + - name: Keycloak logs + if: failure() + run: docker logs kc + + vars: + runs-on: ubuntu-latest + outputs: + sha: ${{ steps.vars.outputs.sha }} + steps: + - uses: actions/checkout@v4 + - id: vars + run: echo "sha=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + + push: + # Only from main, only after both smoke tests pass. Nothing deploys; see keycloak/RUNBOOK.md. + if: github.ref == 'refs/heads/main' + needs: [test, vars] + strategy: + matrix: + include: + - version: kc11 + keycloak: "11.0.2" + - version: kc26 + keycloak: "26.7" + uses: PADAS/gundi-workflows/.github/workflows/build_docker.yml@v11 + with: + workload_identity_provider: ${{ vars.WORKLOAD_IDENTITY_PROVIDER }} + repository: europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak + tag: ${{ matrix.keycloak }}-gundi-${{ needs.vars.outputs.sha }} + dockerfile: keycloak/Dockerfile.${{ matrix.version }} +``` + +- [ ] **Step 2: Lint the workflow** + +```bash +docker run --rm -v "$PWD:/repo" -w /repo rhysd/actionlint:latest -color .github/workflows/keycloak-theme.yml +``` + +Expected: no output (clean). Fix any reported YAML or expression errors. + +- [ ] **Step 3: Dry-run the test job steps locally for kc26 (fast path)** + +The `test` job is plain shell; run its steps by hand to be sure they compose: + +```bash +docker compose -f keycloak/compose.theme-dev.yml down +keycloak/tests/check-css.sh +docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 . +docker run -d --name kc -p 8082:8080 \ + -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ + -e KC_HTTP_RELATIVE_PATH=/auth \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro" \ + gundi-keycloak:kc26 start-dev --import-realm +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev 300 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +docker rm -f kc +docker compose -f keycloak/compose.theme-dev.yml up -d +``` + +Expected: `PASS`. + +- [ ] **Step 4: Commit** + +```bash +git add .github/workflows/keycloak-theme.yml +git commit -m "Add CI workflow that builds, smoke-tests and pushes Keycloak theme images" +``` + +- [ ] **Step 5: Push the branch and open a draft PR to exercise the `test` job on GitHub** + +```bash +git push -u origin HEAD +gh pr create --draft --title "Gundi Keycloak login theme (KC 11 + 26)" --body "$(cat <<'EOF' +Implements docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md. + +- `keycloak/themes/gundi`: CSS-only login theme, one source for Keycloak 11.0.2 and 26.7 +- `keycloak/Dockerfile.kc11` / `.kc26`: official image + theme folder +- `keycloak/compose.theme-dev.yml` + `keycloak/tests/*`: local harness, smoke test, screenshots +- `.github/workflows/keycloak-theme.yml`: build, smoke-test, push on main +- `keycloak/RUNBOOK.md`: manual prod rollout and rollback + +Nothing deploys automatically. + +🤖 Generated with [Claude Code](https://claude.com/claude-code) +EOF +)" +gh run watch --exit-status +``` + +Expected: the `test` matrix passes for both versions on the PR. The `push` job is skipped on pull requests. If `kc11` times out in CI, raise the `wait-ready.sh` timeout argument in the workflow to `420`. + +--- + +### Task 9: Runbook + +**Files:** +- Create: `keycloak/RUNBOOK.md` + +**Interfaces:** +- Consumes: image tags produced by Task 8; realm names `cdip-dev` and `cdip-prod`; prod Deployment `keycloak`, container `keycloak`, namespace `cdip-auth`, kubectl context `cdip-prod`. +- Produces: the operator document referenced by the spec and the PR. + +- [ ] **Step 1: Write the runbook** + +`keycloak/RUNBOOK.md`: + +````markdown +# Gundi Keycloak login theme — operations + +Theme source: `keycloak/themes/gundi`. Design: `docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md`. +Images are built and pushed by `.github/workflows/keycloak-theme.yml` on every push to `main` that touches `keycloak/**`. +Nothing deploys automatically. + +## Local development + +```bash +docker compose -f keycloak/compose.theme-dev.yml up -d # KC 11 on :8081, KC 26 on :8082, admin/admin +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +keycloak/tests/screenshot.sh kc11 8081 # PNGs in keycloak/tests/shots/ +keycloak/tests/check-css.sh # shared stylesheet has no framework classes +``` + +Login page URL (either port): +`/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F` + +Test users in the imported realm: `dev` (plain login) and `theme-tester` / `theme-tester`, which is forced through +the update-password and configure-OTP pages on first login. `keycloak/dev/realm-with-theme.json` is a copy of +`keycloak/cdip-dev-realm.json` with `loginTheme`, `sslRequired: none`, a `displayNameHtml` fixture and that user; regenerate +it from the Task 1 script in the implementation plan if the base realm export changes. + +## Prod rollout — Keycloak 11 (`cdip-prod01`, namespace `cdip-auth`) + +Prod Keycloak is a single replica applied from a raw manifest, not ArgoCD. Order matters: image first, then realms. + +### 1. Confirm the base image and pick the tag + +```bash +kubectl --context cdip-prod -n cdip-auth get deploy keycloak \ + -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' +``` + +Must print `quay.io/keycloak/keycloak:11.0.2`. If it prints anything else, stop: `keycloak/Dockerfile.kc11` must be +rebased on the running image before continuing. + +Pick the tag from the latest successful `Keycloak Gundi theme images` run on `main`: +`europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak:11.0.2-gundi-<short sha>`. + +### 2. Swap the image (restart; do this in the 02:00 UTC window or an agreed off-hours slot) + +```bash +TAG=11.0.2-gundi-<short sha> +kubectl --context cdip-prod -n cdip-auth set image deploy/keycloak \ + keycloak=europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak:$TAG +kubectl --context cdip-prod -n cdip-auth rollout status deploy/keycloak --timeout=5m +``` + +If the pod reports `ImagePullBackOff`, the node service account lacks read access to the `gundi` Artifact Registry +repository; the portal in the same cluster pulls from `gundi/admin-portal`, so compare that Deployment's +`imagePullSecrets`. Roll back (below) rather than leaving the Deployment in that state. + +Verify the stock page still renders (realms are not flipped yet): + +```bash +curl -sf -o /dev/null -w '%{http_code}\n' \ + 'https://cdip-auth.pamdas.org/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-admin-portal&response_type=code&scope=openid&redirect_uri=https%3A%2F%2Fexample.invalid%2F' +``` + +Expected `200` (Keycloak renders an error page for the bad redirect, which is fine here). + +### 3. Stage on the `cdip-dev` realm + +Admin console `https://cdip-auth.pamdas.org/auth/admin/` → realm **cdip-dev** → **Realm Settings** → **Themes** tab → +**Login Theme** = `gundi` → **Save**. No restart. + +Before flipping, check the same tab and **Login** tab for `cdip-prod` later: if **User registration** or any +identity provider is enabled there, add the register and social-provider pages to the manual walk below. + +Log out of the dev portal and log back in. Walk every row: + +| Page | How to reach | +|---|---| +| Login | dev portal → Login | +| Forgot password | "Forgot Password?" link | +| Info | submit the forgot-password form | +| Update password | log in as a user with the `Update Password` required action set in the admin console | +| Configure OTP / OTP login | same, with `Configure OTP` | +| Error | change `redirect_uri` in the auth URL to a value the client does not allow | + +Check on a phone or a 375px-wide browser window that the card fills the width with a gutter and nothing scrolls sideways. + +### 4. Flip `cdip-prod` + +Same setting on realm **cdip-prod**. Log in through the prod portal and repeat the login row at minimum. + +## Rollback + +- **Visual problem:** realm → Realm Settings → Themes → Login Theme = `keycloak` → Save. Immediate, no restart. +- **Image problem:** revert every realm that points at `gundi` first (a realm pointing at a theme the image lacks + logs an error and falls back to the built-in theme, but do not rely on it), then + +```bash +kubectl --context cdip-prod -n cdip-auth rollout undo deploy/keycloak +kubectl --context cdip-prod -n cdip-auth rollout status deploy/keycloak --timeout=5m +``` + +## Keycloak 26 upgrade hand-off + +The realm `loginTheme` value lives in the database, so after the upgrade copies the auth DB both realms already point at +`gundi`. The 26 image used at cutover **must** contain the theme: base it on `keycloak/Dockerfile.kc26` or copy +`keycloak/themes/gundi/login/{resources,messages}` plus `theme.kc26.properties` (renamed to `theme.properties`) into +`/opt/keycloak/themes/gundi/login/`. Add the verification table above to the rehearsal checklist. The upgrade design doc +(`2026-07-14-keycloak-upgrade-design.md`, branch `keycloak-26-upgrade-doc`) still lists the theme as stock and needs +updating when that doc lands. +```` + +- [ ] **Step 2: Check every command in the runbook is copy-pasteable** + +```bash +grep -nE '<[a-z ]+>' keycloak/RUNBOOK.md +``` + +Expected: only the two intentional `<short sha>` placeholders (in the tag lines). Anything else is a placeholder to fill. + +- [ ] **Step 3: Commit and push** + +```bash +git add keycloak/RUNBOOK.md +git commit -m "Add Keycloak theme runbook: local dev, prod rollout, rollback, 26 hand-off" +git push +``` + +--- + +### Task 10: Manual verification walk (human, both local versions) + +This task needs a person with a browser. It completes the spec's "Manual visual" test row before the PR leaves draft. + +**Files:** none. + +- [ ] **Step 1: Bring up the harness** + +```bash +docker compose -f keycloak/compose.theme-dev.yml up -d +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev 300 +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev 300 +``` + +- [ ] **Step 2: Walk the table on Keycloak 11 (`http://localhost:8081`)** + +Open the login URL from the runbook on port 8081. + +| Page | How to reach | Pass criteria | +|---|---|---| +| Login | the URL | Gundi header, no Keycloak logo, white rounded card, green button "Log In" | +| Forgot password | "Forgot Password?" | same card, green "Submit", green back link | +| Info | submit forgot-password with `dev` | success band with green left border | +| Update password | log in as `theme-tester` / `theme-tester` | two outlined inputs, green submit | +| Configure OTP | continue after update password | QR code visible, outlined OTP input, green submit | +| Error | change `redirect_uri` to `http://evil.example/` | red-left-border error band | + +- [ ] **Step 3: Walk the table on Keycloak 26 (`http://localhost:8082`)** + +Same rows plus: + +| Page | How to reach | Pass criteria | +|---|---|---| +| Logout confirmation | `http://localhost:8082/auth/realms/cdip-dev/protocol/openid-connect/logout` (no `id_token_hint`) | themed card with green "Logout" button | +| Password visibility toggle | login page eye icon | icon green, toggles the field | + +Title reads "Sign in to Gundi" on 26 and "Log In" on 11 (expected, see spec). Tab title reads "Sign in to Gundi" on both. + +- [ ] **Step 4: Phone width** + +Resize the window to 375px wide on both versions' login pages. Pass: card fills the width with a visible gutter, no horizontal scroll. + +- [ ] **Step 5: Record the outcome and mark the PR ready** + +Add a comment on the PR listing any row that failed and the fix commit, then: + +```bash +gh pr ready +``` From bc3e80b98ce6689efe8c7385404fa29b6f15e22d Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:10:51 -0700 Subject: [PATCH 05/19] Add local Keycloak 11/26 theme harness with smoke and screenshot scripts Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .gitignore | 3 + keycloak/compose.theme-dev.yml | 40 +++++ keycloak/dev/realm-with-theme.json | 148 ++++++++++++++++++ keycloak/tests/screenshot.sh | 26 +++ keycloak/tests/smoke.sh | 49 ++++++ keycloak/tests/wait-ready.sh | 15 ++ .../themes/gundi/login/theme.kc11.properties | 1 + .../themes/gundi/login/theme.kc26.properties | 1 + 8 files changed, 283 insertions(+) create mode 100644 keycloak/compose.theme-dev.yml create mode 100644 keycloak/dev/realm-with-theme.json create mode 100755 keycloak/tests/screenshot.sh create mode 100755 keycloak/tests/smoke.sh create mode 100755 keycloak/tests/wait-ready.sh create mode 100644 keycloak/themes/gundi/login/theme.kc11.properties create mode 100644 keycloak/themes/gundi/login/theme.kc26.properties diff --git a/.gitignore b/.gitignore index 2ac76301..ddffb510 100644 --- a/.gitignore +++ b/.gitignore @@ -293,3 +293,6 @@ override.tf.json # Local task notes — may hold payloads pasted from production TASK.md + +# Keycloak theme screenshots (generated by keycloak/tests/screenshot.sh) +keycloak/tests/shots/ diff --git a/keycloak/compose.theme-dev.yml b/keycloak/compose.theme-dev.yml new file mode 100644 index 00000000..0849adcf --- /dev/null +++ b/keycloak/compose.theme-dev.yml @@ -0,0 +1,40 @@ +# Keycloak 11 and 26 side by side with the gundi login theme bind-mounted for live editing. +# From the repo root: docker compose -f keycloak/compose.theme-dev.yml up +# KC 11 -> http://localhost:8081/auth KC 26 -> http://localhost:8082/auth +# admin console: admin / admin realm: cdip-dev (users: dev, theme-tester / theme-tester) +# Edit any file under themes/gundi and reload the browser; both versions run with theme caching off. +services: + kc11: + image: quay.io/keycloak/keycloak:11.0.2 + platform: linux/amd64 # no arm64 build exists; runs emulated on Apple Silicon + ports: + - "8081:8080" + environment: + KEYCLOAK_USER: admin + KEYCLOAK_PASSWORD: admin + DB_VENDOR: h2 + KEYCLOAK_IMPORT: /tmp/realm.json + command: + - -b + - 0.0.0.0 + - -Dkeycloak.theme.staticMaxAge=-1 + - -Dkeycloak.theme.cacheThemes=false + - -Dkeycloak.theme.cacheTemplates=false + volumes: + - ./dev/realm-with-theme.json:/tmp/realm.json:ro + - ./themes/gundi:/opt/jboss/keycloak/themes/gundi # not :ro, so the file mount below can create its mountpoint + - ./themes/gundi/login/theme.kc11.properties:/opt/jboss/keycloak/themes/gundi/login/theme.properties:ro + + kc26: + image: quay.io/keycloak/keycloak:26.7 + ports: + - "8082:8080" + environment: + KC_BOOTSTRAP_ADMIN_USERNAME: admin + KC_BOOTSTRAP_ADMIN_PASSWORD: admin + KC_HTTP_RELATIVE_PATH: /auth # match prod URL shape + command: ["start-dev", "--import-realm"] # start-dev disables theme caching + volumes: + - ./dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro + - ./themes/gundi:/opt/keycloak/themes/gundi # not :ro, so the file mount below can create its mountpoint + - ./themes/gundi/login/theme.kc26.properties:/opt/keycloak/themes/gundi/login/theme.properties:ro diff --git a/keycloak/dev/realm-with-theme.json b/keycloak/dev/realm-with-theme.json new file mode 100644 index 00000000..a89957aa --- /dev/null +++ b/keycloak/dev/realm-with-theme.json @@ -0,0 +1,148 @@ +{ + "realm": "cdip-dev", + "enabled": true, + "displayName": "CDIP Dev", + "registrationAllowed": false, + "resetPasswordAllowed": true, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "sslRequired": "none", + "accessTokenLifespan": 1800, + "ssoSessionIdleTimeout": 43200, + "ssoSessionMaxLifespan": 86400, + "clients": [ + { + "clientId": "cdip-kong-gateway", + "name": "CDIP Kong Gateway", + "description": "OIDC client used by the kong-oidc plugin to authenticate browser sessions and validate API bearer tokens.", + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "dev-kong-oidc-secret", + "redirectUris": [ + "https://web.127.0.0.1.nip.io/*", + "http://localhost:8000/*" + ], + "webOrigins": [ + "https://web.127.0.0.1.nip.io" + ], + "publicClient": false, + "standardFlowEnabled": true, + "directAccessGrantsEnabled": true, + "serviceAccountsEnabled": false, + "protocol": "openid-connect", + "attributes": { + "post.logout.redirect.uris": "https://web.127.0.0.1.nip.io/*" + }, + "protocolMappers": [ + { + "name": "username", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-property-mapper", + "consentRequired": false, + "config": { + "userinfo.token.claim": "true", + "user.attribute": "username", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "username", + "jsonType.label": "String" + } + }, + { + "name": "client_id", + "protocol": "openid-connect", + "protocolMapper": "oidc-usersessionmodel-note-mapper", + "consentRequired": false, + "config": { + "user.session.note": "clientId", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "client_id", + "jsonType.label": "String" + } + } + ] + }, + { + "clientId": "cdip-admin-portal", + "name": "CDIP Admin Portal (legacy direct-Django client)", + "description": "Kept for the legacy social-auth path referenced in settings; the active flow goes through cdip-kong-gateway.", + "enabled": true, + "clientAuthenticatorType": "client-secret", + "secret": "local-dev-secret", + "redirectUris": [ + "https://web.127.0.0.1.nip.io/*" + ], + "webOrigins": [ + "https://web.127.0.0.1.nip.io" + ], + "publicClient": false, + "standardFlowEnabled": true, + "directAccessGrantsEnabled": true, + "protocol": "openid-connect" + }, + { + "clientId": "cdip-oauth2", + "name": "CDIP React Portal", + "description": "Public SPA client used by the React portal (REACT_APP_OIDC_CLIENT_ID).", + "enabled": true, + "publicClient": true, + "standardFlowEnabled": true, + "directAccessGrantsEnabled": false, + "redirectUris": [ + "https://portal.127.0.0.1.nip.io/*", + "http://localhost:3000/*" + ], + "webOrigins": [ + "https://portal.127.0.0.1.nip.io", + "http://localhost:3000" + ], + "protocol": "openid-connect", + "attributes": { + "pkce.code.challenge.method": "S256", + "post.logout.redirect.uris": "https://portal.127.0.0.1.nip.io/*##http://localhost:3000/*" + } + } + ], + "users": [ + { + "username": "dev", + "email": "dev@local.dev", + "emailVerified": true, + "enabled": true, + "firstName": "Dev", + "lastName": "User", + "credentials": [ + { + "type": "password", + "value": "dev", + "temporary": false + } + ], + "realmRoles": [ + "default-roles-cdip-dev" + ] + }, + { + "username": "theme-tester", + "enabled": true, + "email": "theme-tester@example.com", + "firstName": "Theme", + "lastName": "Tester", + "credentials": [ + { + "type": "password", + "value": "theme-tester", + "temporary": false + } + ], + "requiredActions": [ + "UPDATE_PASSWORD", + "CONFIGURE_TOTP" + ] + } + ], + "loginTheme": "gundi", + "displayNameHtml": "<div class=\"kc-logo-text\"><span>Keycloak</span></div>" +} \ No newline at end of file diff --git a/keycloak/tests/screenshot.sh b/keycloak/tests/screenshot.sh new file mode 100755 index 00000000..91f6d40e --- /dev/null +++ b/keycloak/tests/screenshot.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Usage: keycloak/tests/screenshot.sh <kc11|kc26> <host-port> +# Renders login and error pages of a running local Keycloak to PNG with headless Chrome in Docker. +# Output: keycloak/tests/shots/<version>-{login,login-mobile,error,error-noclient}.png +set -euo pipefail +version=${1:?usage: screenshot.sh <kc11|kc26> <host-port>} +port=${2:?host port, e.g. 8081} +here=$(cd "$(dirname "$0")" && pwd) +out="$here/shots" +mkdir -p "$out" + +auth="http://host.docker.internal:$port/auth/realms/cdip-dev/protocol/openid-connect/auth" +ok_redirect="redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" +bad_redirect="redirect_uri=http%3A%2F%2Fevil.example%2F" + +shot() { # <name> <WxH> <url> + docker run --rm --add-host=host.docker.internal:host-gateway -v "$out:/out" zenika/alpine-chrome:latest \ + --no-sandbox --headless --disable-gpu --hide-scrollbars --virtual-time-budget=3000 \ + --window-size="$2" --screenshot="/out/$version-$1.png" "$3" >/dev/null 2>&1 + echo "wrote $out/$version-$1.png" +} + +shot login 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" +shot login-mobile 375,812 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" +shot error 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$bad_redirect" +shot error-noclient 1280,900 "$auth?client_id=does-not-exist&response_type=code&scope=openid&$ok_redirect" diff --git a/keycloak/tests/smoke.sh b/keycloak/tests/smoke.sh new file mode 100755 index 00000000..52df5baa --- /dev/null +++ b/keycloak/tests/smoke.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Usage: keycloak/tests/smoke.sh <base-url> <realm> <kc11|kc26> +# Asserts the login page uses the gundi theme and every theme asset it references is served. +# Catches the silent failures: wrong parent=, mistyped styles= path, missing font or logo. +set -euo pipefail +base=${1:?usage: smoke.sh <base-url> <realm> <kc11|kc26>} +realm=${2:?realm} +version=${3:?kc11|kc26} + +fail() { echo "FAIL: $*" >&2; exit 1; } + +login_url="$base/auth/realms/$realm/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" +html=$(curl -sf "$login_url") || fail "login page did not return 200: $login_url" + +# 1. The page must link our three stylesheets (theme.properties styles= is correct). +for css in tokens gundi "$version"; do + grep -q "login/gundi/css/$css.css" <<<"$html" || fail "login page does not reference css/$css.css" +done + +# 2. Every /resources/ asset the page links must be served. +assets=$(grep -oE '(href|src)="[^"]*/resources/[^"]+"' <<<"$html" | sed -E 's/^(href|src)="//; s/"$//' | sort -u) +[[ -n $assets ]] || fail "no /resources/ links found in login page" +while read -r a; do + [[ -z $a ]] && continue + url=$a; [[ $a == /* ]] && url="$base$a" + curl -sf -o /dev/null "$url" || fail "asset not served: $url" +done <<<"$assets" + +# 3. Every url(...) inside our stylesheets (fonts, logo) must be served. +while read -r a; do + [[ -z $a ]] && continue + [[ $a == *login/gundi/css/*.css ]] || continue + css_url=$a; [[ $a == /* ]] && css_url="$base$a" + css_dir=${css_url%/*} + refs=$(curl -sf "$css_url" | grep -oE 'url\(["'"'"']?[^)"'"'"']+' | sed -E 's/^url\(["'"'"']?//' | sort -u || true) + while read -r ref; do + [[ -z $ref || $ref == data:* || $ref == http* ]] && continue + curl -sf -o /dev/null "$css_dir/$ref" || fail "css reference not served: $css_dir/$ref (from $css_url)" + done <<<"$refs" +done <<<"$assets" + +# 4. Copy overrides. +grep -qE '<title>[[:space:]]*Sign in to Gundi[[:space:]]*' <<<"$html" || fail " override missing" +if [[ $version == kc26 ]]; then + grep -q 'Sign in to Gundi' <<<"$html" || fail "loginAccountTitle override missing on kc26" +fi +grep -q 'id="kc-page-title"' <<<"$html" || fail "kc-page-title element missing" + +echo "PASS: $version gundi theme serves all assets from $base" diff --git a/keycloak/tests/wait-ready.sh b/keycloak/tests/wait-ready.sh new file mode 100755 index 00000000..338709cd --- /dev/null +++ b/keycloak/tests/wait-ready.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Usage: keycloak/tests/wait-ready.sh <url> [timeout-seconds] +# Polls until <url> returns HTTP 200. Keycloak 11 under amd64 emulation can take 3 minutes. +set -euo pipefail +url=${1:?usage: wait-ready.sh <url> [timeout-seconds]} +timeout=${2:-300} +start=$(date +%s) +until curl -sf -o /dev/null "$url"; do + if (( $(date +%s) - start > timeout )); then + echo "timed out after ${timeout}s waiting for $url" >&2 + exit 1 + fi + sleep 3 +done +echo "ready: $url" diff --git a/keycloak/themes/gundi/login/theme.kc11.properties b/keycloak/themes/gundi/login/theme.kc11.properties new file mode 100644 index 00000000..ee3f1d1e --- /dev/null +++ b/keycloak/themes/gundi/login/theme.kc11.properties @@ -0,0 +1 @@ +parent=keycloak diff --git a/keycloak/themes/gundi/login/theme.kc26.properties b/keycloak/themes/gundi/login/theme.kc26.properties new file mode 100644 index 00000000..2d72a639 --- /dev/null +++ b/keycloak/themes/gundi/login/theme.kc26.properties @@ -0,0 +1 @@ +parent=keycloak.v2 From f003955ee95537b90a7d3dfca93041579e795b48 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:13:00 -0700 Subject: [PATCH 06/19] Add gundi Keycloak theme skeleton for KC 11 and 26 with title overrides Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/tests/smoke.sh | 9 +++++++-- .../themes/gundi/login/messages/messages_en.properties | 6 ++++++ keycloak/themes/gundi/login/resources/css/gundi.css | 3 +++ keycloak/themes/gundi/login/resources/css/kc11.css | 1 + keycloak/themes/gundi/login/resources/css/kc26.css | 1 + keycloak/themes/gundi/login/resources/css/tokens.css | 1 + keycloak/themes/gundi/login/theme.kc11.properties | 7 +++++++ keycloak/themes/gundi/login/theme.kc26.properties | 9 +++++++++ keycloak/themes/gundi/login/theme.properties | 0 9 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 keycloak/themes/gundi/login/messages/messages_en.properties create mode 100644 keycloak/themes/gundi/login/resources/css/gundi.css create mode 100644 keycloak/themes/gundi/login/resources/css/kc11.css create mode 100644 keycloak/themes/gundi/login/resources/css/kc26.css create mode 100644 keycloak/themes/gundi/login/resources/css/tokens.css create mode 100644 keycloak/themes/gundi/login/theme.properties diff --git a/keycloak/tests/smoke.sh b/keycloak/tests/smoke.sh index 52df5baa..51c73da3 100755 --- a/keycloak/tests/smoke.sh +++ b/keycloak/tests/smoke.sh @@ -26,10 +26,15 @@ while read -r a; do curl -sf -o /dev/null "$url" || fail "asset not served: $url" done <<<"$assets" -# 3. Every url(...) inside our stylesheets (fonts, logo) must be served. +# 3. Every url(...) inside OUR stylesheets (fonts, logo) must be served. +# Only tokens/gundi/kc11/kc26: the parent theme's own stylesheet is also served under +# our theme path and stock Keycloak 11's login.css carries a dead image reference. while read -r a; do [[ -z $a ]] && continue - [[ $a == *login/gundi/css/*.css ]] || continue + case $a in + *login/gundi/css/tokens.css|*login/gundi/css/gundi.css|*login/gundi/css/kc11.css|*login/gundi/css/kc26.css) ;; + *) continue ;; + esac css_url=$a; [[ $a == /* ]] && css_url="$base$a" css_dir=${css_url%/*} refs=$(curl -sf "$css_url" | grep -oE 'url\(["'"'"']?[^)"'"'"']+' | sed -E 's/^url\(["'"'"']?//' | sort -u || true) diff --git a/keycloak/themes/gundi/login/messages/messages_en.properties b/keycloak/themes/gundi/login/messages/messages_en.properties new file mode 100644 index 00000000..4e17ac0a --- /dev/null +++ b/keycloak/themes/gundi/login/messages/messages_en.properties @@ -0,0 +1,6 @@ +# Only the two title strings change. Everything else inherits from the parent theme. +# loginAccountTitle is the login page h1 on Keycloak 26. Keycloak 11 has no such key and +# titles the page with doLogIn (also the button label), so 11 keeps the stock "Log In". +loginAccountTitle=Sign in to Gundi +# <title> tag on both versions. Ignores the realm display name placeholder {0} on purpose. +loginTitle=Sign in to Gundi diff --git a/keycloak/themes/gundi/login/resources/css/gundi.css b/keycloak/themes/gundi/login/resources/css/gundi.css new file mode 100644 index 00000000..51c8a0bf --- /dev/null +++ b/keycloak/themes/gundi/login/resources/css/gundi.css @@ -0,0 +1,3 @@ +/* Shared Gundi rules. Only stable #kc-* ids, element, attribute and pseudo selectors. + Framework classes (PatternFly 3 / 5) belong in kc11.css / kc26.css. + Enforced by keycloak/tests/check-css.sh. Filled in Task 4. */ diff --git a/keycloak/themes/gundi/login/resources/css/kc11.css b/keycloak/themes/gundi/login/resources/css/kc11.css new file mode 100644 index 00000000..088292a4 --- /dev/null +++ b/keycloak/themes/gundi/login/resources/css/kc11.css @@ -0,0 +1 @@ +/* Keycloak 11 (PatternFly 3) class overrides for the Gundi theme. Filled in Task 5. */ diff --git a/keycloak/themes/gundi/login/resources/css/kc26.css b/keycloak/themes/gundi/login/resources/css/kc26.css new file mode 100644 index 00000000..f07b1cdf --- /dev/null +++ b/keycloak/themes/gundi/login/resources/css/kc26.css @@ -0,0 +1 @@ +/* Keycloak 26 (PatternFly 5) class overrides for the Gundi theme. Filled in Task 6. */ diff --git a/keycloak/themes/gundi/login/resources/css/tokens.css b/keycloak/themes/gundi/login/resources/css/tokens.css new file mode 100644 index 00000000..f75c4c4f --- /dev/null +++ b/keycloak/themes/gundi/login/resources/css/tokens.css @@ -0,0 +1 @@ +/* Gundi design tokens shared by both Keycloak versions. Filled in Task 3. */ diff --git a/keycloak/themes/gundi/login/theme.kc11.properties b/keycloak/themes/gundi/login/theme.kc11.properties index ee3f1d1e..24a85b06 100644 --- a/keycloak/themes/gundi/login/theme.kc11.properties +++ b/keycloak/themes/gundi/login/theme.kc11.properties @@ -1 +1,8 @@ +# Gundi login theme for Keycloak 11.0.2 (WildFly; parent "keycloak" is PatternFly 3). +# Installed as theme.properties by Dockerfile.kc11 and by compose.theme-dev.yml. parent=keycloak +import=common/keycloak + +# A child `styles=` REPLACES the parent's list, so the parent's login.css is listed first. +# Resources resolve through the parent chain, so css/login.css comes from the keycloak theme. +styles=css/login.css css/tokens.css css/gundi.css css/kc11.css diff --git a/keycloak/themes/gundi/login/theme.kc26.properties b/keycloak/themes/gundi/login/theme.kc26.properties index 2d72a639..db22480c 100644 --- a/keycloak/themes/gundi/login/theme.kc26.properties +++ b/keycloak/themes/gundi/login/theme.kc26.properties @@ -1 +1,10 @@ +# Gundi login theme for Keycloak 26.x (Quarkus; parent "keycloak.v2" is PatternFly 5). +# Installed as theme.properties by Dockerfile.kc26 and by compose.theme-dev.yml. parent=keycloak.v2 +import=common/keycloak + +# A child `styles=` REPLACES the parent's list, so the parent's styles.css is listed first. +styles=css/styles.css css/tokens.css css/gundi.css css/kc26.css + +# The portal is light-only; do not follow the OS colour scheme. +darkMode=false diff --git a/keycloak/themes/gundi/login/theme.properties b/keycloak/themes/gundi/login/theme.properties new file mode 100644 index 00000000..e69de29b From bea6b2c84bd48814dfdc53966125cf4422b864dc Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:13:52 -0700 Subject: [PATCH 07/19] Add Inter fonts, Gundi logo mark and design tokens to the theme Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .../gundi/login/resources/css/tokens.css | 42 +++++++- .../login/resources/fonts/Inter-Regular.woff2 | Bin 0 -> 111268 bytes .../resources/fonts/Inter-SemiBold.woff2 | Bin 0 -> 114812 bytes .../gundi/login/resources/fonts/LICENSE.txt | 92 ++++++++++++++++++ .../gundi/login/resources/img/gundi-mark.png | Bin 0 -> 6378 bytes 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 keycloak/themes/gundi/login/resources/fonts/Inter-Regular.woff2 create mode 100644 keycloak/themes/gundi/login/resources/fonts/Inter-SemiBold.woff2 create mode 100644 keycloak/themes/gundi/login/resources/fonts/LICENSE.txt create mode 100644 keycloak/themes/gundi/login/resources/img/gundi-mark.png diff --git a/keycloak/themes/gundi/login/resources/css/tokens.css b/keycloak/themes/gundi/login/resources/css/tokens.css index f75c4c4f..c0debdd3 100644 --- a/keycloak/themes/gundi/login/resources/css/tokens.css +++ b/keycloak/themes/gundi/login/resources/css/tokens.css @@ -1 +1,41 @@ -/* Gundi design tokens shared by both Keycloak versions. Filled in Task 3. */ +/* Gundi design tokens shared by both Keycloak versions. + Colour values come from gundi-portal/tailwind.config.js (names in comments). */ + +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("../fonts/Inter-Regular.woff2") format("woff2"); +} +@font-face { + font-family: "Inter"; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("../fonts/Inter-SemiBold.woff2") format("woff2"); +} + +:root { + --gundi-primary: #006842; /* route-green */ + --gundi-primary-hover: #00520c; /* dark-green */ + --gundi-text: #222222; /* off-black */ + --gundi-text-secondary: #63666A; /* secondary-text */ + --gundi-field-outline: #b1b3b3; /* field-outline */ + --gundi-divider: #dddddd; /* divider-lines */ + --gundi-error: #D0031B; /* remove-red */ + --gundi-error-bg: #FDF2F4; /* remove-red-bg */ + --gundi-success-bg: #E8F2E9; /* light-green */ + --gundi-warning: #9d6900; /* warning-dark-yellow */ + --gundi-warning-bg: #fdfaf4; /* warning-yellow */ + --gundi-info-bg: #f2f6fc; /* light-blue-50 */ + --gundi-page-bg: #f7f9f7; /* white-green */ + --gundi-card-bg: #ffffff; + + --gundi-font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif; + + --gundi-radius-card: 8px; + --gundi-radius-control: 4px; + --gundi-focus-ring: rgba(0, 104, 66, 0.3); + --gundi-shadow-card: 0 4px 16px rgba(0, 0, 0, 0.06); +} diff --git a/keycloak/themes/gundi/login/resources/fonts/Inter-Regular.woff2 b/keycloak/themes/gundi/login/resources/fonts/Inter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2bcd222ecfae996d035ff72bf70672305cc29261 GIT binary patch literal 111268 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 Hxtt0`Exu#nj7!Q*r)zd}&^680p8T2D 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 YlP_pm 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 C!H4<) literal 0 HcmV?d00001 diff --git a/keycloak/themes/gundi/login/resources/fonts/Inter-SemiBold.woff2 b/keycloak/themes/gundi/login/resources/fonts/Inter-SemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fbae113d2855e22c06376495bd2dfe5f02411272 GIT binary patch literal 114812 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 a!Kymz`|Y2zy;Kxy`;^}w^N6qj0RIQ3n!o!1 literal 0 HcmV?d00001 diff --git a/keycloak/themes/gundi/login/resources/fonts/LICENSE.txt b/keycloak/themes/gundi/login/resources/fonts/LICENSE.txt new file mode 100644 index 00000000..9b2ca37b --- /dev/null +++ b/keycloak/themes/gundi/login/resources/fonts/LICENSE.txt @@ -0,0 +1,92 @@ +Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/keycloak/themes/gundi/login/resources/img/gundi-mark.png b/keycloak/themes/gundi/login/resources/img/gundi-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..d58ab01c4205930ddf478368074506f3e29e9f28 GIT binary patch literal 6378 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 X<?DVRdw~4!&p=a6=k7;U>wy0UT;`xi literal 0 HcmV?d00001 From f54cfabb25d46be45ce5cc4be3fedf7bc3255558 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:15:10 -0700 Subject: [PATCH 08/19] Add shared Gundi login stylesheet and cascade guard Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/tests/check-css.sh | 13 ++ .../gundi/login/resources/css/gundi.css | 116 +++++++++++++++++- 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100755 keycloak/tests/check-css.sh diff --git a/keycloak/tests/check-css.sh b/keycloak/tests/check-css.sh new file mode 100755 index 00000000..4fcacc34 --- /dev/null +++ b/keycloak/tests/check-css.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Cascade guard: gundi.css is shared by Keycloak 11 (PatternFly 3) and 26 (PatternFly 5), +# so it may only use #kc-* ids, element, attribute and pseudo selectors. +# Any framework class selector must live in kc11.css or kc26.css instead. +set -euo pipefail +here=$(cd "$(dirname "$0")" && pwd) +file="$here/../themes/gundi/login/resources/css/gundi.css" +pattern='\.(pf-|btn|card-pf|login-pf|form-|alert|checkbox|control-label)' +if grep -nE "$pattern" "$file"; then + echo "FAIL: framework class selectors found in $file (move them to kc11.css / kc26.css)" >&2 + exit 1 +fi +echo "PASS: gundi.css has no framework class selectors" diff --git a/keycloak/themes/gundi/login/resources/css/gundi.css b/keycloak/themes/gundi/login/resources/css/gundi.css index 51c8a0bf..968e3b69 100644 --- a/keycloak/themes/gundi/login/resources/css/gundi.css +++ b/keycloak/themes/gundi/login/resources/css/gundi.css @@ -1,3 +1,117 @@ /* Shared Gundi rules. Only stable #kc-* ids, element, attribute and pseudo selectors. Framework classes (PatternFly 3 / 5) belong in kc11.css / kc26.css. - Enforced by keycloak/tests/check-css.sh. Filled in Task 4. */ + Enforced by keycloak/tests/check-css.sh. Loads after tokens.css. */ + +html, +body { + font-family: var(--gundi-font); + color: var(--gundi-text); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* ---- Header: replace the realm display name with the Gundi mark + wordmark ---- + The wrapper prints realm.displayNameHtml. We collapse its text to nothing and draw + the brand with pseudo-elements, so no realm content needs to change. */ +#kc-header { + color: var(--gundi-text); + padding: 0; +} +#kc-header-wrapper { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + margin: 0 auto 28px; + padding: 0; + font-size: 0; /* hides the text node */ + line-height: 0; + letter-spacing: 0; /* reset parent theme's letter-spacing so ::after is not affected */ + text-transform: none; + color: transparent; +} +/* A realm may carry markup in displayNameHtml (e.g. Keycloak's default logo div). Hide it. */ +#kc-header-wrapper > * { + display: none; +} +#kc-header-wrapper::before { + content: ""; + display: block; + width: 58px; + height: 48px; + background: url("../img/gundi-mark.png") no-repeat center / contain; +} +#kc-header-wrapper::after { + content: "GUNDI"; + display: block; + font-family: var(--gundi-font); + font-size: 26px; + font-weight: 600; + line-height: 1; + letter-spacing: 0.08em; + color: var(--gundi-text); +} + +/* ---- Page title ---- */ +#kc-page-title { + font-family: var(--gundi-font); + font-size: 22px; + font-weight: 600; + line-height: 1.3; + color: var(--gundi-text); + text-align: center; + margin: 0 0 20px; +} + +/* ---- Primary submit button (same id on 11 and 26) ---- */ +#kc-login { + display: block; + width: 100%; + min-height: 44px; + padding: 0 16px; + border: 0; + border-radius: var(--gundi-radius-control); + background: var(--gundi-primary); + color: #ffffff; + font-family: var(--gundi-font); + font-size: 15px; + font-weight: 600; + line-height: 44px; + cursor: pointer; + transition: background-color 120ms ease; +} +#kc-login:hover { + background: var(--gundi-primary-hover); + color: #ffffff; +} +#kc-login:focus-visible { + outline: 3px solid var(--gundi-focus-ring); + outline-offset: 2px; +} + +/* ---- Links inside the form and the info block ---- */ +#kc-form a, +#kc-form-login a, +#kc-info a { + color: var(--gundi-primary); + font-weight: 500; + text-decoration: none; +} +#kc-form a:hover, +#kc-form-login a:hover, +#kc-info a:hover { + color: var(--gundi-primary-hover); + text-decoration: underline; +} +#kc-info { + color: var(--gundi-text-secondary); + font-size: 14px; +} + +/* ---- Username / password inputs by id (other pages' inputs are styled per version) ---- */ +#username, +#password { + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} From 4754cd48cdae452713f25582bd92aa687e35d1f8 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:16:10 -0700 Subject: [PATCH 09/19] Style Keycloak 11 login pages with PatternFly 3 overrides Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .../themes/gundi/login/resources/css/kc11.css | 146 +++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/keycloak/themes/gundi/login/resources/css/kc11.css b/keycloak/themes/gundi/login/resources/css/kc11.css index 088292a4..90c41ab8 100644 --- a/keycloak/themes/gundi/login/resources/css/kc11.css +++ b/keycloak/themes/gundi/login/resources/css/kc11.css @@ -1 +1,145 @@ -/* Keycloak 11 (PatternFly 3) class overrides for the Gundi theme. Filled in Task 5. */ +/* Keycloak 11 (PatternFly 3) class overrides for the Gundi theme. Loads after gundi.css. */ + +/* Flat page background instead of the keycloak-bg.png photo */ +.login-pf body { + background: var(--gundi-page-bg); +} +.login-pf-page { + padding-top: 48px; + padding-bottom: 48px; +} +/* Ids that exist only on 11 */ +#kc-content-wrapper { + margin-top: 0; +} + +/* Card */ +.login-pf-page .card-pf { + max-width: 400px; + margin: 0 auto; + padding: 32px 32px 24px; + background: var(--gundi-card-bg); + border: 1px solid var(--gundi-divider); + border-radius: var(--gundi-radius-card); + box-shadow: var(--gundi-shadow-card); +} +.login-pf-page .login-pf-header { + margin-bottom: 0; +} + +/* Inputs */ +.card-pf .form-control { + height: 40px; + padding: 0 12px; + border: 1px solid var(--gundi-field-outline); + border-radius: var(--gundi-radius-control); + box-shadow: none; + background: #ffffff; + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} +.card-pf .form-control:focus { + border-color: var(--gundi-primary); + box-shadow: 0 0 0 3px var(--gundi-focus-ring); + outline: 0; +} +.card-pf .control-label { + font-family: var(--gundi-font); + font-size: 14px; + font-weight: 500; + color: var(--gundi-text); + margin-bottom: 6px; +} +.card-pf .form-group { + margin-bottom: 16px; +} + +/* Buttons (the primary submit is styled by #kc-login in gundi.css; these cover other pages) */ +.login-pf-page .btn { + font-family: var(--gundi-font); + font-weight: 600; + border-radius: var(--gundi-radius-control); +} +.login-pf-page .btn-primary, +.login-pf-page .btn-primary:focus { + background: var(--gundi-primary); + border-color: var(--gundi-primary); + color: #ffffff; +} +.login-pf-page .btn-primary:hover, +.login-pf-page .btn-primary:active { + background: var(--gundi-primary-hover); + border-color: var(--gundi-primary-hover); +} +.login-pf-page .btn-default { + background: #ffffff; + border-color: var(--gundi-field-outline); + color: var(--gundi-primary); +} +.login-pf-page .btn-default:hover { + border-color: var(--gundi-primary); + color: var(--gundi-primary-hover); +} +#kc-form-buttons { + margin-top: 8px; +} + +/* Remember me + forgot password row */ +#kc-form-options .checkbox input[type="checkbox"] { + accent-color: var(--gundi-primary); +} +#kc-form-options .checkbox label { + color: var(--gundi-text-secondary); + font-size: 14px; +} +.login-pf-page .login-pf-settings a, +.login-pf-page .login-pf-signup a { + color: var(--gundi-primary); +} + +/* Alerts as inline bands with a status-coloured left border */ +.login-pf-page .alert { + border: 0; + border-left: 4px solid var(--gundi-text-secondary); + border-radius: var(--gundi-radius-control); + padding: 12px 14px; + color: var(--gundi-text); + background: var(--gundi-info-bg); +} +.login-pf-page .alert-error { + background: var(--gundi-error-bg); + border-left-color: var(--gundi-error); +} +.login-pf-page .alert-error .pficon { + color: var(--gundi-error); +} +.login-pf-page .alert-success { + background: var(--gundi-success-bg); + border-left-color: var(--gundi-primary); +} +.login-pf-page .alert-success .pficon { + color: var(--gundi-primary); +} +.login-pf-page .alert-warning { + background: var(--gundi-warning-bg); + border-left-color: var(--gundi-warning); +} +.login-pf-page .alert-warning .pficon { + color: var(--gundi-warning); +} +.login-pf-page .alert-info { + background: var(--gundi-info-bg); + border-left-color: var(--gundi-text-secondary); +} + +/* Phones */ +@media (max-width: 480px) { + .login-pf-page { + padding-top: 24px; + } + .login-pf-page .card-pf { + margin: 0 16px; + padding: 24px 20px; + } +} From 4473b43848be8437b76868fd4988732c0c5baaf1 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:18:03 -0700 Subject: [PATCH 10/19] Style Keycloak 26 login pages with PatternFly 5 overrides Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .../themes/gundi/login/resources/css/kc26.css | 153 +++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/keycloak/themes/gundi/login/resources/css/kc26.css b/keycloak/themes/gundi/login/resources/css/kc26.css index f07b1cdf..7a83c5ab 100644 --- a/keycloak/themes/gundi/login/resources/css/kc26.css +++ b/keycloak/themes/gundi/login/resources/css/kc26.css @@ -1 +1,152 @@ -/* Keycloak 26 (PatternFly 5) class overrides for the Gundi theme. Filled in Task 6. */ +/* Keycloak 26 (PatternFly 5) class overrides for the Gundi theme. Loads after gundi.css. + Strategy: retheme PatternFly through its global tokens first, then patch the few + components that still show blue or Red Hat defaults. */ + +:root { + --pf-v5-global--FontFamily--text: var(--gundi-font); + --pf-v5-global--FontFamily--heading: var(--gundi-font); + --pf-v5-global--FontFamily--sans-serif: var(--gundi-font); + --pf-v5-global--primary-color--100: var(--gundi-primary); + --pf-v5-global--primary-color--200: var(--gundi-primary-hover); + --pf-v5-global--active-color--100: var(--gundi-primary); + --pf-v5-global--link--Color: var(--gundi-primary); + --pf-v5-global--link--Color--hover: var(--gundi-primary-hover); + --pf-v5-global--BorderRadius--sm: var(--gundi-radius-control); + --pf-v5-global--BorderColor--100: var(--gundi-field-outline); + --pf-v5-global--BorderColor--300: var(--gundi-field-outline); + --pf-v5-global--danger-color--100: var(--gundi-error); + --pf-v5-global--Color--100: var(--gundi-text); + --pf-v5-global--Color--200: var(--gundi-text-secondary); + --pf-v5-global--BackgroundColor--100: var(--gundi-card-bg); + --keycloak-card-top-color: var(--gundi-primary); +} + +/* Flat page background instead of the darkened Keycloak backdrop */ +.login-pf body, +body#keycloak-bg { + background: var(--gundi-page-bg); +} + +/* Card */ +.pf-v5-c-login__main { + width: 100%; /* error/info pages would otherwise shrink to content */ + max-width: 400px; + margin-left: auto; + margin-right: auto; + background: var(--gundi-card-bg); + border: 1px solid var(--gundi-divider); + border-radius: var(--gundi-radius-card); + box-shadow: var(--gundi-shadow-card); + overflow: hidden; +} +.pf-v5-c-login__main-header { + border-top: 0; /* remove the thick coloured top band the parent draws */ + padding-top: 32px; +} +.pf-v5-c-login__main-body { + padding-bottom: 24px; +} +.pf-v5-c-login__header { + padding-bottom: 0; +} + +/* Inputs: PF5 draws the border on the wrapping span via ::after */ +.pf-v5-c-form-control { + --pf-v5-c-form-control--BorderRadius: var(--gundi-radius-control); + --pf-v5-c-form-control--BorderWidth: 1px; + --pf-v5-c-form-control--after--BorderBottomColor: var(--gundi-field-outline); + --pf-v5-c-form-control--hover--after--BorderBottomColor: var(--gundi-primary); + --pf-v5-c-form-control--focus--after--BorderBottomColor: var(--gundi-primary); + --pf-v5-c-form-control--focus--after--BorderBottomWidth: 1px; + border: 1px solid var(--gundi-field-outline); + border-radius: var(--gundi-radius-control); + min-height: 40px; +} +.pf-v5-c-form-control:focus-within { + border-color: var(--gundi-primary); + box-shadow: 0 0 0 3px var(--gundi-focus-ring); +} +.pf-v5-c-form-control input { + font-family: var(--gundi-font); + font-size: 15px; + color: var(--gundi-text); +} +.pf-v5-c-form__label-text { + font-weight: 500; + color: var(--gundi-text); +} + +/* Buttons (the primary submit is styled by #kc-login in gundi.css; these cover other pages) */ +.pf-v5-c-button { + font-family: var(--gundi-font); + font-weight: 600; + border-radius: var(--gundi-radius-control); +} +.pf-v5-c-button.pf-m-primary { + --pf-v5-c-button--m-primary--BackgroundColor: var(--gundi-primary); + --pf-v5-c-button--m-primary--hover--BackgroundColor: var(--gundi-primary-hover); + --pf-v5-c-button--m-primary--focus--BackgroundColor: var(--gundi-primary-hover); + --pf-v5-c-button--m-primary--active--BackgroundColor: var(--gundi-primary-hover); +} +.pf-v5-c-button.pf-m-secondary { + --pf-v5-c-button--m-secondary--Color: var(--gundi-primary); + --pf-v5-c-button--m-secondary--BorderColor: var(--gundi-field-outline); + --pf-v5-c-button--m-secondary--hover--Color: var(--gundi-primary-hover); + --pf-v5-c-button--m-secondary--hover--BorderColor: var(--gundi-primary); +} +.pf-v5-c-button.pf-m-link { + --pf-v5-c-button--m-link--Color: var(--gundi-primary); + --pf-v5-c-button--m-link--hover--Color: var(--gundi-primary-hover); +} +/* Password visibility toggle */ +.pf-v5-c-button.pf-m-control { + color: var(--gundi-primary); + border: 0; +} + +/* Remember me */ +.pf-v5-c-check__input { + accent-color: var(--gundi-primary); +} +.pf-v5-c-check__label { + color: var(--gundi-text-secondary); + font-size: 14px; +} + +/* Alerts as inline bands with a status-coloured left border */ +.pf-v5-c-alert.pf-m-inline { + --pf-v5-c-alert--BorderTopWidth: 0; + border-left: 4px solid var(--gundi-text-secondary); + border-radius: var(--gundi-radius-control); + box-shadow: none; + background: var(--gundi-info-bg); + color: var(--gundi-text); +} +.pf-v5-c-alert.pf-m-inline.pf-m-danger { + background: var(--gundi-error-bg); + border-left-color: var(--gundi-error); + --pf-v5-c-alert__icon--Color: var(--gundi-error); +} +.pf-v5-c-alert.pf-m-inline.pf-m-success { + background: var(--gundi-success-bg); + border-left-color: var(--gundi-primary); + --pf-v5-c-alert__icon--Color: var(--gundi-primary); +} +.pf-v5-c-alert.pf-m-inline.pf-m-warning { + background: var(--gundi-warning-bg); + border-left-color: var(--gundi-warning); + --pf-v5-c-alert__icon--Color: var(--gundi-warning); +} +.pf-v5-c-alert.pf-m-inline.pf-m-info { + background: var(--gundi-info-bg); + border-left-color: var(--gundi-text-secondary); + --pf-v5-c-alert__icon--Color: var(--gundi-text-secondary); +} + +/* Phones */ +@media (max-width: 480px) { + .pf-v5-c-login__main { + margin-left: 16px; + margin-right: 16px; + } +} From 489d56b3532c628e0775acd69472bae5970086fc Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:19:39 -0700 Subject: [PATCH 11/19] Add Dockerfiles baking the Gundi theme into Keycloak 11 and 26 images Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/Dockerfile.kc11 | 9 +++++++++ keycloak/Dockerfile.kc26 | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 keycloak/Dockerfile.kc11 create mode 100644 keycloak/Dockerfile.kc26 diff --git a/keycloak/Dockerfile.kc11 b/keycloak/Dockerfile.kc11 new file mode 100644 index 00000000..7cdb6d49 --- /dev/null +++ b/keycloak/Dockerfile.kc11 @@ -0,0 +1,9 @@ +# Production Keycloak 11 image with the Gundi login theme baked in. +# Build from the repo root: docker build -f keycloak/Dockerfile.kc11 -t gundi-keycloak:kc11 . +# The base image runs as uid 1000, so files are chowned to it. Only the KC 11 properties +# file is copied, renamed to theme.properties. No RUN step, no shell, nothing else changes. +FROM quay.io/keycloak/keycloak:11.0.2 + +COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/jboss/keycloak/themes/gundi/login/resources +COPY --chown=1000:0 keycloak/themes/gundi/login/messages /opt/jboss/keycloak/themes/gundi/login/messages +COPY --chown=1000:0 keycloak/themes/gundi/login/theme.kc11.properties /opt/jboss/keycloak/themes/gundi/login/theme.properties diff --git a/keycloak/Dockerfile.kc26 b/keycloak/Dockerfile.kc26 new file mode 100644 index 00000000..2c45de24 --- /dev/null +++ b/keycloak/Dockerfile.kc26 @@ -0,0 +1,9 @@ +# Keycloak 26 image with the Gundi login theme baked in. Input to the KC 26 upgrade rehearsal. +# Build from the repo root: docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 . +# Deliberately does not run `kc.sh build`; the upgrade design owns the optimized-build decision +# and can layer on top of this image or copy the theme folder into its own. +FROM quay.io/keycloak/keycloak:26.7 + +COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/keycloak/themes/gundi/login/resources +COPY --chown=1000:0 keycloak/themes/gundi/login/messages /opt/keycloak/themes/gundi/login/messages +COPY --chown=1000:0 keycloak/themes/gundi/login/theme.kc26.properties /opt/keycloak/themes/gundi/login/theme.properties From e7e40c196cad23b1dd93ced55ee13c81efb165ce Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:20:49 -0700 Subject: [PATCH 12/19] Add CI workflow that builds, smoke-tests and pushes Keycloak theme images Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .github/workflows/keycloak-theme.yml | 89 ++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 .github/workflows/keycloak-theme.yml diff --git a/.github/workflows/keycloak-theme.yml b/.github/workflows/keycloak-theme.yml new file mode 100644 index 00000000..e176a431 --- /dev/null +++ b/.github/workflows/keycloak-theme.yml @@ -0,0 +1,89 @@ +name: Keycloak Gundi theme images + +on: + push: + branches: [main] + paths: + - 'keycloak/**' + - '.github/workflows/keycloak-theme.yml' + pull_request: + paths: + - 'keycloak/**' + - '.github/workflows/keycloak-theme.yml' + +jobs: + test: + # Builds each image locally (no push), boots it with the dev realm, and runs the smoke test. + # The shared build_docker workflow always pushes, so it must not run before this passes. + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - version: kc11 + port: 8081 + - version: kc26 + port: 8082 + steps: + - uses: actions/checkout@v4 + + - name: Cascade guard (shared stylesheet has no framework classes) + run: keycloak/tests/check-css.sh + + - name: Build image + run: docker build -f keycloak/Dockerfile.${{ matrix.version }} -t gundi-keycloak:${{ matrix.version }} . + + - name: Start Keycloak 11 + if: matrix.version == 'kc11' + run: | + docker run -d --name kc -p 8081:8080 \ + -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 \ + -e KEYCLOAK_IMPORT=/tmp/realm.json \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/tmp/realm.json:ro" \ + gundi-keycloak:kc11 -b 0.0.0.0 + + - name: Start Keycloak 26 + if: matrix.version == 'kc26' + run: | + docker run -d --name kc -p 8082:8080 \ + -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ + -e KC_HTTP_RELATIVE_PATH=/auth \ + -v "$PWD/keycloak/dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro" \ + gundi-keycloak:kc26 start-dev --import-realm + + - name: Wait for Keycloak + run: keycloak/tests/wait-ready.sh http://localhost:${{ matrix.port }}/auth/realms/cdip-dev 300 + + - name: Smoke test + run: keycloak/tests/smoke.sh http://localhost:${{ matrix.port }} cdip-dev ${{ matrix.version }} + + - name: Keycloak logs + if: failure() + run: docker logs kc + + vars: + runs-on: ubuntu-latest + outputs: + sha: ${{ steps.vars.outputs.sha }} + steps: + - uses: actions/checkout@v4 + - id: vars + run: echo "sha=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + + push: + # Only from main, only after both smoke tests pass. Nothing deploys; see keycloak/RUNBOOK.md. + if: github.ref == 'refs/heads/main' + needs: [test, vars] + strategy: + matrix: + include: + - version: kc11 + keycloak: "11.0.2" + - version: kc26 + keycloak: "26.7" + uses: PADAS/gundi-workflows/.github/workflows/build_docker.yml@v11 + with: + workload_identity_provider: ${{ vars.WORKLOAD_IDENTITY_PROVIDER }} + repository: europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak + tag: ${{ matrix.keycloak }}-gundi-${{ needs.vars.outputs.sha }} + dockerfile: keycloak/Dockerfile.${{ matrix.version }} From d9149286123b4f174b038688fc62411635eb74c1 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:21:34 -0700 Subject: [PATCH 13/19] Add Keycloak theme runbook: local dev, prod rollout, rollback, 26 hand-off Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/RUNBOOK.md | 108 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 keycloak/RUNBOOK.md diff --git a/keycloak/RUNBOOK.md b/keycloak/RUNBOOK.md new file mode 100644 index 00000000..63491f6b --- /dev/null +++ b/keycloak/RUNBOOK.md @@ -0,0 +1,108 @@ +# Gundi Keycloak login theme — operations + +Theme source: `keycloak/themes/gundi`. Design: `docs/superpowers/specs/2026-09-22-keycloak-gundi-login-theme-design.md`. +Images are built and pushed by `.github/workflows/keycloak-theme.yml` on every push to `main` that touches `keycloak/**`. +Nothing deploys automatically. + +## Local development + +```bash +docker compose -f keycloak/compose.theme-dev.yml up -d # KC 11 on :8081, KC 26 on :8082, admin/admin +keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev +keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 +keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 +keycloak/tests/screenshot.sh kc11 8081 # PNGs in keycloak/tests/shots/ +keycloak/tests/check-css.sh # shared stylesheet has no framework classes +``` + +Login page URL (either port): +`/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F` + +Test users in the imported realm: `dev` (plain login) and `theme-tester` / `theme-tester`, which is forced through +the update-password and configure-OTP pages on first login. `keycloak/dev/realm-with-theme.json` is a copy of +`keycloak/cdip-dev-realm.json` with `loginTheme`, `sslRequired: none`, a `displayNameHtml` fixture and that user; regenerate +it from the Task 1 script in the implementation plan if the base realm export changes. + +## Prod rollout — Keycloak 11 (`cdip-prod01`, namespace `cdip-auth`) + +Prod Keycloak is a single replica applied from a raw manifest, not ArgoCD. Order matters: image first, then realms. + +### 1. Confirm the base image and pick the tag + +```bash +kubectl --context cdip-prod -n cdip-auth get deploy keycloak \ + -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' +``` + +Must print `quay.io/keycloak/keycloak:11.0.2`. If it prints anything else, stop: `keycloak/Dockerfile.kc11` must be +rebased on the running image before continuing. + +Pick the tag from the latest successful `Keycloak Gundi theme images` run on `main`: +`europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak:11.0.2-gundi-<short sha>`. + +### 2. Swap the image (restart; do this in the 02:00 UTC window or an agreed off-hours slot) + +```bash +TAG=11.0.2-gundi-<short sha> +kubectl --context cdip-prod -n cdip-auth set image deploy/keycloak \ + keycloak=europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak:$TAG +kubectl --context cdip-prod -n cdip-auth rollout status deploy/keycloak --timeout=5m +``` + +If the pod reports `ImagePullBackOff`, the node service account lacks read access to the `gundi` Artifact Registry +repository; the portal in the same cluster pulls from `gundi/admin-portal`, so compare that Deployment's +`imagePullSecrets`. Roll back (below) rather than leaving the Deployment in that state. + +Verify the stock page still renders (realms are not flipped yet): + +```bash +curl -sf -o /dev/null -w '%{http_code}\n' \ + 'https://cdip-auth.pamdas.org/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-admin-portal&response_type=code&scope=openid&redirect_uri=https%3A%2F%2Fexample.invalid%2F' +``` + +Expected `200` (Keycloak renders an error page for the bad redirect, which is fine here). + +### 3. Stage on the `cdip-dev` realm + +Admin console `https://cdip-auth.pamdas.org/auth/admin/` → realm **cdip-dev** → **Realm Settings** → **Themes** tab → +**Login Theme** = `gundi` → **Save**. No restart. + +Before flipping, check the same tab and **Login** tab for `cdip-prod` later: if **User registration** or any +identity provider is enabled there, add the register and social-provider pages to the manual walk below. + +Log out of the dev portal and log back in. Walk every row: + +| Page | How to reach | +|---|---| +| Login | dev portal → Login | +| Forgot password | "Forgot Password?" link | +| Info | submit the forgot-password form | +| Update password | log in as a user with the `Update Password` required action set in the admin console | +| Configure OTP / OTP login | same, with `Configure OTP` | +| Error | change `redirect_uri` in the auth URL to a value the client does not allow | + +Check on a phone or a 375px-wide browser window that the card fills the width with a gutter and nothing scrolls sideways. + +### 4. Flip `cdip-prod` + +Same setting on realm **cdip-prod**. Log in through the prod portal and repeat the login row at minimum. + +## Rollback + +- **Visual problem:** realm → Realm Settings → Themes → Login Theme = `keycloak` → Save. Immediate, no restart. +- **Image problem:** revert every realm that points at `gundi` first (a realm pointing at a theme the image lacks + logs an error and falls back to the built-in theme, but do not rely on it), then + +```bash +kubectl --context cdip-prod -n cdip-auth rollout undo deploy/keycloak +kubectl --context cdip-prod -n cdip-auth rollout status deploy/keycloak --timeout=5m +``` + +## Keycloak 26 upgrade hand-off + +The realm `loginTheme` value lives in the database, so after the upgrade copies the auth DB both realms already point at +`gundi`. The 26 image used at cutover **must** contain the theme: base it on `keycloak/Dockerfile.kc26` or copy +`keycloak/themes/gundi/login/{resources,messages}` plus `theme.kc26.properties` (renamed to `theme.properties`) into +`/opt/keycloak/themes/gundi/login/`. Add the verification table above to the rehearsal checklist. The upgrade design doc +(`2026-07-14-keycloak-upgrade-design.md`, branch `keycloak-26-upgrade-doc`) still lists the theme as stock and needs +updating when that doc lands. From e5cd287317bb578cf5101b0dc25f1e92c277bd27 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Tue, 22 Sep 2026 20:37:46 -0700 Subject: [PATCH 14/19] Address review: fix KC 26 phone-width overflow, runbook health-check status, smoke h1 assertion - kc26.css: the parent theme fixes the login grid track at 34rem with no media query, so the card overflowed any viewport under ~576px. Track is now minmax(0, 34rem) and the phone gutter comes from container padding. - RUNBOOK.md: Keycloak answers a bad redirect_uri with HTTP 400 on both 11 and 26; the post-swap check now expects 400 instead of a -f'd 200. - smoke.sh: assert the kc26 h1 itself reads 'Sign in to Gundi' (tolerating the dev-mode template comment) instead of a page-wide grep the <title> already satisfied. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/RUNBOOK.md | 8 +++++--- keycloak/tests/smoke.sh | 5 ++++- .../themes/gundi/login/resources/css/kc26.css | 18 +++++++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/keycloak/RUNBOOK.md b/keycloak/RUNBOOK.md index 63491f6b..c2cdf1a9 100644 --- a/keycloak/RUNBOOK.md +++ b/keycloak/RUNBOOK.md @@ -53,14 +53,16 @@ If the pod reports `ImagePullBackOff`, the node service account lacks read acces repository; the portal in the same cluster pulls from `gundi/admin-portal`, so compare that Deployment's `imagePullSecrets`. Roll back (below) rather than leaving the Deployment in that state. -Verify the stock page still renders (realms are not flipped yet): +Verify the pod is serving pages (realms are not flipped yet): ```bash -curl -sf -o /dev/null -w '%{http_code}\n' \ +curl -s -o /dev/null -w '%{http_code}\n' \ 'https://cdip-auth.pamdas.org/auth/realms/cdip-dev/protocol/openid-connect/auth?client_id=cdip-admin-portal&response_type=code&scope=openid&redirect_uri=https%3A%2F%2Fexample.invalid%2F' ``` -Expected `200` (Keycloak renders an error page for the bad redirect, which is fine here). +Expected `400`. Keycloak answers a bad `redirect_uri` with its "We are sorry" error page and HTTP 400 on both +11 and 26; the rendered error page is what proves the pod is up. A `5xx`, a connection error, or an empty +response means the swap broke something: roll back. ### 3. Stage on the `cdip-dev` realm diff --git a/keycloak/tests/smoke.sh b/keycloak/tests/smoke.sh index 51c73da3..f7193565 100755 --- a/keycloak/tests/smoke.sh +++ b/keycloak/tests/smoke.sh @@ -47,7 +47,10 @@ done <<<"$assets" # 4. Copy overrides. grep -qE '<title>[[:space:]]*Sign in to Gundi[[:space:]]*' <<<"$html" || fail " override missing" if [[ $version == kc26 ]]; then - grep -q 'Sign in to Gundi' <<<"$html" || fail "loginAccountTitle override missing on kc26" + # The h1 text follows a newline (and, in dev mode, a <!-- template: … --> comment) after the + # opening tag, so collapse newlines and allow whitespace/comments before matching. + tr -d '\n' <<<"$html" | grep -qE 'id="kc-page-title"[^>]*>([[:space:]]|<!--[^>]*-->)*Sign in to Gundi' \ + || fail "loginAccountTitle override missing on kc26 (h1 #kc-page-title does not read 'Sign in to Gundi')" fi grep -q 'id="kc-page-title"' <<<"$html" || fail "kc-page-title element missing" diff --git a/keycloak/themes/gundi/login/resources/css/kc26.css b/keycloak/themes/gundi/login/resources/css/kc26.css index 7a83c5ab..e1dc93e9 100644 --- a/keycloak/themes/gundi/login/resources/css/kc26.css +++ b/keycloak/themes/gundi/login/resources/css/kc26.css @@ -27,6 +27,14 @@ body#keycloak-bg { background: var(--gundi-page-bg); } +/* The parent theme fixes the grid track at 34rem (544px) with no media query, which + overflows any viewport narrower than that. Let the track shrink with the viewport. */ +.pf-v5-c-login__container { + width: 100%; + max-width: 100%; + grid-template-columns: minmax(0, 34rem); +} + /* Card */ .pf-v5-c-login__main { width: 100%; /* error/info pages would otherwise shrink to content */ @@ -143,10 +151,14 @@ body#keycloak-bg { --pf-v5-c-alert__icon--Color: var(--gundi-text-secondary); } -/* Phones */ +/* Phones: 16px gutter comes from the container so the card never exceeds the viewport */ @media (max-width: 480px) { + .pf-v5-c-login__container { + padding-left: 16px; + padding-right: 16px; + } .pf-v5-c-login__main { - margin-left: 16px; - margin-right: 16px; + margin-left: 0; + margin-right: 0; } } From b12b7f8525eb9be9abef7483bf1ee98242f032d8 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Wed, 23 Sep 2026 07:47:56 -0700 Subject: [PATCH 15/19] Fix alert icon overlapping the message text on Keycloak 11 PatternFly 3 positions the alert icon absolutely and reserves room for it with a 47px left padding. The theme's uniform 14px padding removed that space, so the message rendered under the icon. The icon is now a flex item sized to the text's line height, so padding stays uniform and wrapped lines align under the first line. The screenshot script gains a login-error shot: it submits bad credentials with curl and renders the returned page, since that alert only exists on the POST response and was never captured before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- keycloak/tests/screenshot.sh | 22 ++++++++++++++++++- .../themes/gundi/login/resources/css/kc11.css | 15 ++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/keycloak/tests/screenshot.sh b/keycloak/tests/screenshot.sh index 91f6d40e..066915b3 100755 --- a/keycloak/tests/screenshot.sh +++ b/keycloak/tests/screenshot.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Usage: keycloak/tests/screenshot.sh <kc11|kc26> <host-port> # Renders login and error pages of a running local Keycloak to PNG with headless Chrome in Docker. -# Output: keycloak/tests/shots/<version>-{login,login-mobile,error,error-noclient}.png +# Output: keycloak/tests/shots/<version>-{login,login-mobile,login-error,error,error-noclient}.png set -euo pipefail version=${1:?usage: screenshot.sh <kc11|kc26> <host-port>} port=${2:?host port, e.g. 8081} @@ -10,6 +10,7 @@ out="$here/shots" mkdir -p "$out" auth="http://host.docker.internal:$port/auth/realms/cdip-dev/protocol/openid-connect/auth" +local_auth="http://localhost:$port/auth/realms/cdip-dev/protocol/openid-connect/auth" ok_redirect="redirect_uri=http%3A%2F%2Flocalhost%3A8000%2F" bad_redirect="redirect_uri=http%3A%2F%2Fevil.example%2F" @@ -20,7 +21,26 @@ shot() { # <name> <WxH> <url> echo "wrote $out/$version-$1.png" } +# The invalid-credentials alert only exists on the POST response, so the form is submitted with +# curl and the returned HTML is rendered from disk. <base> points resources at the live server; +# --disable-web-security lets the file:// page load the theme's fonts cross-origin. +shot_login_error() { + local jar html action + jar=$(mktemp) && html="$out/$version-login-error.html" + action=$(curl -s -c "$jar" "$local_auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" \ + | grep -o 'action="[^"]*"' | head -1 | sed 's/^action="//;s/"$//;s/&/\&/g') + curl -s -b "$jar" -c "$jar" -X POST --data-urlencode "username=theme-tester" --data-urlencode "password=wrong" "$action" \ + | sed "s#<head>#<head><base href=\"http://host.docker.internal:$port/\">#" > "$html" + rm -f "$jar" + docker run --rm --add-host=host.docker.internal:host-gateway -v "$out:/out" zenika/alpine-chrome:latest \ + --no-sandbox --headless --disable-gpu --hide-scrollbars --disable-web-security --virtual-time-budget=3000 \ + --window-size=1280,900 --screenshot="/out/$version-login-error.png" "file:///out/$version-login-error.html" >/dev/null 2>&1 + rm -f "$html" + echo "wrote $out/$version-login-error.png" +} + shot login 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" shot login-mobile 375,812 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" +shot_login_error shot error 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$bad_redirect" shot error-noclient 1280,900 "$auth?client_id=does-not-exist&response_type=code&scope=openid&$ok_redirect" diff --git a/keycloak/themes/gundi/login/resources/css/kc11.css b/keycloak/themes/gundi/login/resources/css/kc11.css index 90c41ab8..4825394a 100644 --- a/keycloak/themes/gundi/login/resources/css/kc11.css +++ b/keycloak/themes/gundi/login/resources/css/kc11.css @@ -98,15 +98,28 @@ color: var(--gundi-primary); } -/* Alerts as inline bands with a status-coloured left border */ +/* Alerts as inline bands with a status-coloured left border. + PatternFly 3 absolutely positions the icon and reserves room for it with a 47px left + padding; the icon is laid out as a flex item instead so the padding stays uniform. */ .login-pf-page .alert { + display: flex; + align-items: flex-start; + gap: 10px; border: 0; border-left: 4px solid var(--gundi-text-secondary); border-radius: var(--gundi-radius-control); padding: 12px 14px; + font-size: 14px; + line-height: 20px; color: var(--gundi-text); background: var(--gundi-info-bg); } +.login-pf-page .alert > .pficon { + position: static; + flex: 0 0 auto; + font-size: 18px; + line-height: 20px; +} .login-pf-page .alert-error { background: var(--gundi-error-bg); border-left-color: var(--gundi-error); From 544d9f79bf02eec946f7fd2804c27f7ad5b0fb69 Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Wed, 23 Sep 2026 07:48:12 -0700 Subject: [PATCH 16/19] Add the Gundi mark as the login theme favicon Both Keycloak versions link img/favicon.ico through the theme's resource path, so a file at that location shadows the stock Keycloak icon with no template change. The ICO packs the portal's Gundi mark at 64, 48, 32 and 16px. The portal's own favicon.ico is the leftover React scaffold logo, which browsers never show, so the icon is built from the mark PNG instead. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .../gundi/login/resources/img/favicon.ico | Bin 0 -> 32038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keycloak/themes/gundi/login/resources/img/favicon.ico diff --git a/keycloak/themes/gundi/login/resources/img/favicon.ico b/keycloak/themes/gundi/login/resources/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0abcee6bd109b9c2b9be0feb859e394c0f54616b GIT binary patch literal 32038 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 ACIA2c literal 0 HcmV?d00001 From 6cde07d5c12dbaffa9de4336cee1fcf0946b464e Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Wed, 23 Sep 2026 07:48:14 -0700 Subject: [PATCH 17/19] Move the logo into the card with a Welcome title and subtitle Follows the EarthRanger login layout: the Gundi mark centred at the top of the card, "Welcome" as the h1 and "Sign in to Gundi" beneath it. The realm display-name header above the card is hidden and the wordmark dropped, as the subtitle already names the product. Each version draws the mark on its own card-header container in kc11.css and kc26.css. Keycloak 26 gets the title from loginAccountTitle; Keycloak 11 titles the page with the button's doLogIn key, so kc11.css hides the h1 text and draws "Welcome" in its place. Title swap and subtitle are scoped by the login form's presence, so other pages keep their own titles under the mark. On 26 the header grid's column gap beside the empty locale-menu column is zeroed so the title centres. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .../login/messages/messages_en.properties | 6 +- .../gundi/login/resources/css/gundi.css | 55 +++++-------------- .../themes/gundi/login/resources/css/kc11.css | 23 +++++++- .../themes/gundi/login/resources/css/kc26.css | 13 ++++- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/keycloak/themes/gundi/login/messages/messages_en.properties b/keycloak/themes/gundi/login/messages/messages_en.properties index 4e17ac0a..a9da48de 100644 --- a/keycloak/themes/gundi/login/messages/messages_en.properties +++ b/keycloak/themes/gundi/login/messages/messages_en.properties @@ -1,6 +1,6 @@ # Only the two title strings change. Everything else inherits from the parent theme. -# loginAccountTitle is the login page h1 on Keycloak 26. Keycloak 11 has no such key and -# titles the page with doLogIn (also the button label), so 11 keeps the stock "Log In". -loginAccountTitle=Sign in to Gundi +# loginAccountTitle is the login page h1 on Keycloak 26. Keycloak 11 has no such key and titles +# the page with doLogIn (also the button label), so kc11.css draws "Welcome" over it instead. +loginAccountTitle=Welcome # <title> tag on both versions. Ignores the realm display name placeholder {0} on purpose. loginTitle=Sign in to Gundi diff --git a/keycloak/themes/gundi/login/resources/css/gundi.css b/keycloak/themes/gundi/login/resources/css/gundi.css index 968e3b69..d562df58 100644 --- a/keycloak/themes/gundi/login/resources/css/gundi.css +++ b/keycloak/themes/gundi/login/resources/css/gundi.css @@ -10,57 +10,32 @@ body { -moz-osx-font-smoothing: grayscale; } -/* ---- Header: replace the realm display name with the Gundi mark + wordmark ---- - The wrapper prints realm.displayNameHtml. We collapse its text to nothing and draw - the brand with pseudo-elements, so no realm content needs to change. */ +/* ---- Header: the realm display name renders above the card on both versions. + It is hidden; the Gundi mark is drawn inside the card by kc11.css / kc26.css. ---- */ #kc-header { - color: var(--gundi-text); - padding: 0; -} -#kc-header-wrapper { - display: flex; - align-items: center; - justify-content: center; - gap: 12px; - margin: 0 auto 28px; - padding: 0; - font-size: 0; /* hides the text node */ - line-height: 0; - letter-spacing: 0; /* reset parent theme's letter-spacing so ::after is not affected */ - text-transform: none; - color: transparent; -} -/* A realm may carry markup in displayNameHtml (e.g. Keycloak's default logo div). Hide it. */ -#kc-header-wrapper > * { display: none; } -#kc-header-wrapper::before { - content: ""; - display: block; - width: 58px; - height: 48px; - background: url("../img/gundi-mark.png") no-repeat center / contain; -} -#kc-header-wrapper::after { - content: "GUNDI"; - display: block; - font-family: var(--gundi-font); - font-size: 26px; - font-weight: 600; - line-height: 1; - letter-spacing: 0.08em; - color: var(--gundi-text); -} /* ---- Page title ---- */ #kc-page-title { font-family: var(--gundi-font); - font-size: 22px; + font-size: 26px; font-weight: 600; line-height: 1.3; color: var(--gundi-text); text-align: center; - margin: 0 0 20px; + margin: 0 0 24px; +} +/* Login page only: "Sign in to Gundi" subtitle under the h1. The login form's id exists on + both versions and only on the login page, so its presence identifies the page. */ +body:has(#kc-form-login) #kc-page-title::after { + content: "Sign in to Gundi"; + display: block; + margin-top: 8px; + font-size: 15px; + font-weight: 400; + line-height: 1.4; + color: var(--gundi-text-secondary); } /* ---- Primary submit button (same id on 11 and 26) ---- */ diff --git a/keycloak/themes/gundi/login/resources/css/kc11.css b/keycloak/themes/gundi/login/resources/css/kc11.css index 4825394a..4e792cee 100644 --- a/keycloak/themes/gundi/login/resources/css/kc11.css +++ b/keycloak/themes/gundi/login/resources/css/kc11.css @@ -13,7 +13,7 @@ margin-top: 0; } -/* Card */ +/* Card, with the Gundi mark drawn above the title */ .login-pf-page .card-pf { max-width: 400px; margin: 0 auto; @@ -23,9 +23,30 @@ border-radius: var(--gundi-radius-card); box-shadow: var(--gundi-shadow-card); } +.login-pf-page .card-pf::before { + content: ""; + display: block; + width: 58px; + height: 48px; + margin: 0 auto 20px; + background: url("../img/gundi-mark.png") no-repeat center / contain; +} .login-pf-page .login-pf-header { margin-bottom: 0; } +/* Login page title. Keycloak 11 titles the login page with doLogIn, the same key as the submit + button, so the h1 text is hidden and "Welcome" drawn in its place. Keycloak 26 has its own key + (loginAccountTitle in messages_en.properties). */ +body:has(#kc-form-login) .login-pf-page #kc-page-title { + font-size: 0; + line-height: 0; +} +body:has(#kc-form-login) .login-pf-page #kc-page-title::before { + content: "Welcome"; + display: block; + font-size: 26px; + line-height: 1.3; +} /* Inputs */ .card-pf .form-control { diff --git a/keycloak/themes/gundi/login/resources/css/kc26.css b/keycloak/themes/gundi/login/resources/css/kc26.css index e1dc93e9..beedfe5f 100644 --- a/keycloak/themes/gundi/login/resources/css/kc26.css +++ b/keycloak/themes/gundi/login/resources/css/kc26.css @@ -48,15 +48,22 @@ body#keycloak-bg { overflow: hidden; } .pf-v5-c-login__main-header { + --pf-v5-c-login__main-header--ColumnGap: 0; /* the empty locale-menu column otherwise nudges the title left */ border-top: 0; /* remove the thick coloured top band the parent draws */ padding-top: 32px; } +.pf-v5-c-login__main-header::before { + content: ""; + display: block; + grid-column: 1 / -1; /* the header is a title + locale-menu grid; span it */ + width: 58px; + height: 48px; + margin: 0 auto 20px; + background: url("../img/gundi-mark.png") no-repeat center / contain; +} .pf-v5-c-login__main-body { padding-bottom: 24px; } -.pf-v5-c-login__header { - padding-bottom: 0; -} /* Inputs: PF5 draws the border on the wrapping span via ::after */ .pf-v5-c-form-control { From 43bd4be076e4c678ad5d3d1371193e3ba1de760b Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Wed, 23 Sep 2026 12:00:46 -0700 Subject: [PATCH 18/19] Address review: smoke assertion, script hardening, :has() fallback, a11y, realm generator, tag linkage - smoke.sh asserts the 26 login h1 reads "Welcome" (the CI failure) and guards the asset grep so an empty page reports its diagnostic instead of aborting. - screenshot.sh fails loudly on fetch or parse errors, cleans its cookie jar and temp page on every exit path, and injects <base> into a <head> with attributes. - The subtitle selector wraps the 26 page-id branch and the 11 :has() branch in :is(), so browsers without :has() still apply it on 26. On 11 the hidden h1 text uses visibility: hidden so the accessible name is "Welcome Sign in to Gundi" rather than including "Log In". The shared copy is cross-referenced between gundi.css and messages_en.properties. - theme.properties is now the real Keycloak 11 file, so copying the theme folder whole yields a working theme; theme.kc26.properties stays the variant. - keycloak/dev/generate-realm.py derives the dev realm fixture from the base export; CI fails when the fixture is stale, and the RUNBOOK points at it. - The workflow derives each image tag's version from the Dockerfile FROM tag, takes the short sha from GITHUB_SHA, and runs the vars job only on main. - RUNBOOK local-dev block waits for both ports before smoking them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --- .github/workflows/keycloak-theme.yml | 26 ++++++--- keycloak/Dockerfile.kc11 | 7 ++- keycloak/Dockerfile.kc26 | 1 + keycloak/RUNBOOK.md | 5 +- keycloak/compose.theme-dev.yml | 7 +-- keycloak/dev/generate-realm.py | 56 +++++++++++++++++++ keycloak/dev/realm-with-theme.json | 2 +- keycloak/tests/screenshot.sh | 19 ++++--- keycloak/tests/smoke.sh | 6 +- .../login/messages/messages_en.properties | 1 + .../gundi/login/resources/css/gundi.css | 8 ++- .../themes/gundi/login/resources/css/kc11.css | 12 +++- .../themes/gundi/login/theme.kc11.properties | 8 --- .../themes/gundi/login/theme.kc26.properties | 2 +- keycloak/themes/gundi/login/theme.properties | 9 +++ 15 files changed, 128 insertions(+), 41 deletions(-) create mode 100755 keycloak/dev/generate-realm.py delete mode 100644 keycloak/themes/gundi/login/theme.kc11.properties diff --git a/.github/workflows/keycloak-theme.yml b/.github/workflows/keycloak-theme.yml index e176a431..44e2c0ff 100644 --- a/.github/workflows/keycloak-theme.yml +++ b/.github/workflows/keycloak-theme.yml @@ -30,6 +30,9 @@ jobs: - name: Cascade guard (shared stylesheet has no framework classes) run: keycloak/tests/check-css.sh + - name: Realm fixture matches the base realm export + run: keycloak/dev/generate-realm.py --check + - name: Build image run: docker build -f keycloak/Dockerfile.${{ matrix.version }} -t gundi-keycloak:${{ matrix.version }} . @@ -62,13 +65,26 @@ jobs: run: docker logs kc vars: + # Only feeds the main-gated push job. The image tag's version prefix comes from each + # Dockerfile's FROM tag, so bumping a base image cannot leave the tag behind. + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest outputs: sha: ${{ steps.vars.outputs.sha }} + kc11: ${{ steps.vars.outputs.kc11 }} + kc26: ${{ steps.vars.outputs.kc26 }} steps: - uses: actions/checkout@v4 + with: + sparse-checkout: keycloak - id: vars - run: echo "sha=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" + run: | + echo "sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT" + for v in kc11 kc26; do + tag=$(sed -nE 's#^FROM quay.io/keycloak/keycloak:([^[:space:]]+).*#\1#p' "keycloak/Dockerfile.$v") + [[ -n $tag ]] || { echo "no keycloak FROM tag in keycloak/Dockerfile.$v" >&2; exit 1; } + echo "$v=$tag" >> "$GITHUB_OUTPUT" + done push: # Only from main, only after both smoke tests pass. Nothing deploys; see keycloak/RUNBOOK.md. @@ -76,14 +92,10 @@ jobs: needs: [test, vars] strategy: matrix: - include: - - version: kc11 - keycloak: "11.0.2" - - version: kc26 - keycloak: "26.7" + version: [kc11, kc26] uses: PADAS/gundi-workflows/.github/workflows/build_docker.yml@v11 with: workload_identity_provider: ${{ vars.WORKLOAD_IDENTITY_PROVIDER }} repository: europe-west3-docker.pkg.dev/serca-artifact-registry/gundi/keycloak - tag: ${{ matrix.keycloak }}-gundi-${{ needs.vars.outputs.sha }} + tag: ${{ needs.vars.outputs[matrix.version] }}-gundi-${{ needs.vars.outputs.sha }} dockerfile: keycloak/Dockerfile.${{ matrix.version }} diff --git a/keycloak/Dockerfile.kc11 b/keycloak/Dockerfile.kc11 index 7cdb6d49..2a35223b 100644 --- a/keycloak/Dockerfile.kc11 +++ b/keycloak/Dockerfile.kc11 @@ -1,9 +1,10 @@ # Production Keycloak 11 image with the Gundi login theme baked in. # Build from the repo root: docker build -f keycloak/Dockerfile.kc11 -t gundi-keycloak:kc11 . -# The base image runs as uid 1000, so files are chowned to it. Only the KC 11 properties -# file is copied, renamed to theme.properties. No RUN step, no shell, nothing else changes. +# The base image runs as uid 1000, so files are chowned to it. theme.properties is the KC 11 +# variant, so it is copied as is. No RUN step, no shell, nothing else changes. +# The FROM tag is parsed by .github/workflows/keycloak-theme.yml to version the pushed image. FROM quay.io/keycloak/keycloak:11.0.2 COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/jboss/keycloak/themes/gundi/login/resources COPY --chown=1000:0 keycloak/themes/gundi/login/messages /opt/jboss/keycloak/themes/gundi/login/messages -COPY --chown=1000:0 keycloak/themes/gundi/login/theme.kc11.properties /opt/jboss/keycloak/themes/gundi/login/theme.properties +COPY --chown=1000:0 keycloak/themes/gundi/login/theme.properties /opt/jboss/keycloak/themes/gundi/login/theme.properties diff --git a/keycloak/Dockerfile.kc26 b/keycloak/Dockerfile.kc26 index 2c45de24..02309e13 100644 --- a/keycloak/Dockerfile.kc26 +++ b/keycloak/Dockerfile.kc26 @@ -2,6 +2,7 @@ # Build from the repo root: docker build -f keycloak/Dockerfile.kc26 -t gundi-keycloak:kc26 . # Deliberately does not run `kc.sh build`; the upgrade design owns the optimized-build decision # and can layer on top of this image or copy the theme folder into its own. +# The FROM tag is parsed by .github/workflows/keycloak-theme.yml to version the pushed image. FROM quay.io/keycloak/keycloak:26.7 COPY --chown=1000:0 keycloak/themes/gundi/login/resources /opt/keycloak/themes/gundi/login/resources diff --git a/keycloak/RUNBOOK.md b/keycloak/RUNBOOK.md index c2cdf1a9..b6f90cd0 100644 --- a/keycloak/RUNBOOK.md +++ b/keycloak/RUNBOOK.md @@ -9,6 +9,7 @@ Nothing deploys automatically. ```bash docker compose -f keycloak/compose.theme-dev.yml up -d # KC 11 on :8081, KC 26 on :8082, admin/admin keycloak/tests/wait-ready.sh http://localhost:8081/auth/realms/cdip-dev +keycloak/tests/wait-ready.sh http://localhost:8082/auth/realms/cdip-dev keycloak/tests/smoke.sh http://localhost:8081 cdip-dev kc11 keycloak/tests/smoke.sh http://localhost:8082 cdip-dev kc26 keycloak/tests/screenshot.sh kc11 8081 # PNGs in keycloak/tests/shots/ @@ -20,8 +21,8 @@ Login page URL (either port): Test users in the imported realm: `dev` (plain login) and `theme-tester` / `theme-tester`, which is forced through the update-password and configure-OTP pages on first login. `keycloak/dev/realm-with-theme.json` is a copy of -`keycloak/cdip-dev-realm.json` with `loginTheme`, `sslRequired: none`, a `displayNameHtml` fixture and that user; regenerate -it from the Task 1 script in the implementation plan if the base realm export changes. +`keycloak/cdip-dev-realm.json` with `loginTheme`, `sslRequired: none`, a `displayNameHtml` fixture and that user. It is +generated by `keycloak/dev/generate-realm.py`; rerun it when the base realm export changes. CI fails if it is stale. ## Prod rollout — Keycloak 11 (`cdip-prod01`, namespace `cdip-auth`) diff --git a/keycloak/compose.theme-dev.yml b/keycloak/compose.theme-dev.yml index 0849adcf..65b6d154 100644 --- a/keycloak/compose.theme-dev.yml +++ b/keycloak/compose.theme-dev.yml @@ -22,8 +22,7 @@ services: - -Dkeycloak.theme.cacheTemplates=false volumes: - ./dev/realm-with-theme.json:/tmp/realm.json:ro - - ./themes/gundi:/opt/jboss/keycloak/themes/gundi # not :ro, so the file mount below can create its mountpoint - - ./themes/gundi/login/theme.kc11.properties:/opt/jboss/keycloak/themes/gundi/login/theme.properties:ro + - ./themes/gundi:/opt/jboss/keycloak/themes/gundi:ro # theme.properties is the KC 11 variant kc26: image: quay.io/keycloak/keycloak:26.7 @@ -36,5 +35,5 @@ services: command: ["start-dev", "--import-realm"] # start-dev disables theme caching volumes: - ./dev/realm-with-theme.json:/opt/keycloak/data/import/realm.json:ro - - ./themes/gundi:/opt/keycloak/themes/gundi # not :ro, so the file mount below can create its mountpoint - - ./themes/gundi/login/theme.kc26.properties:/opt/keycloak/themes/gundi/login/theme.properties:ro + - ./themes/gundi:/opt/keycloak/themes/gundi:ro + - ./themes/gundi/login/theme.kc26.properties:/opt/keycloak/themes/gundi/login/theme.properties:ro # KC 26 variant over the default diff --git a/keycloak/dev/generate-realm.py b/keycloak/dev/generate-realm.py new file mode 100755 index 00000000..4ab3b694 --- /dev/null +++ b/keycloak/dev/generate-realm.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Derive keycloak/dev/realm-with-theme.json from keycloak/cdip-dev-realm.json. + +The fixture is the dev realm export plus what the theme harness needs: the gundi login theme, +plain http (containerised Chrome reaches Keycloak over http via host.docker.internal), a +displayNameHtml carrying Keycloak's default logo markup (a prod realm may carry it; the theme must +hide it), and a user forced through the update-password and configure-OTP pages. + + keycloak/dev/generate-realm.py # rewrite the fixture + keycloak/dev/generate-realm.py --check # exit 1 if the fixture is stale (CI) +""" +import json +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +SOURCE = ROOT / "keycloak" / "cdip-dev-realm.json" +TARGET = ROOT / "keycloak" / "dev" / "realm-with-theme.json" + +THEME_TESTER = { + "username": "theme-tester", + "enabled": True, + "email": "theme-tester@example.com", + "firstName": "Theme", + "lastName": "Tester", + "credentials": [{"type": "password", "value": "theme-tester", "temporary": False}], + "requiredActions": ["UPDATE_PASSWORD", "CONFIGURE_TOTP"], +} + + +def build() -> str: + realm = json.loads(SOURCE.read_text()) + realm["loginTheme"] = "gundi" + realm["sslRequired"] = "none" + realm["displayNameHtml"] = '<div class="kc-logo-text"><span>Keycloak</span></div>' + users = [u for u in realm.get("users", []) if u.get("username") != THEME_TESTER["username"]] + realm["users"] = users + [THEME_TESTER] + return json.dumps(realm, indent=2) + "\n" + + +def main(argv: list[str]) -> int: + content = build() + if "--check" in argv: + current = TARGET.read_text() if TARGET.exists() else "" + if current != content: + print(f"{TARGET.relative_to(ROOT)} is stale; run {Path(__file__).relative_to(ROOT)}", file=sys.stderr) + return 1 + print(f"OK: {TARGET.relative_to(ROOT)} matches {SOURCE.relative_to(ROOT)}") + return 0 + TARGET.write_text(content) + print(f"wrote {TARGET.relative_to(ROOT)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/keycloak/dev/realm-with-theme.json b/keycloak/dev/realm-with-theme.json index a89957aa..2454a36f 100644 --- a/keycloak/dev/realm-with-theme.json +++ b/keycloak/dev/realm-with-theme.json @@ -145,4 +145,4 @@ ], "loginTheme": "gundi", "displayNameHtml": "<div class=\"kc-logo-text\"><span>Keycloak</span></div>" -} \ No newline at end of file +} diff --git a/keycloak/tests/screenshot.sh b/keycloak/tests/screenshot.sh index 066915b3..a4e22733 100755 --- a/keycloak/tests/screenshot.sh +++ b/keycloak/tests/screenshot.sh @@ -24,18 +24,23 @@ shot() { # <name> <WxH> <url> # The invalid-credentials alert only exists on the POST response, so the form is submitted with # curl and the returned HTML is rendered from disk. <base> points resources at the live server; # --disable-web-security lets the file:// page load the theme's fonts cross-origin. +fail() { echo "FAIL: $*" >&2; exit 1; } + shot_login_error() { - local jar html action + local jar html page action jar=$(mktemp) && html="$out/$version-login-error.html" - action=$(curl -s -c "$jar" "$local_auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" \ - | grep -o 'action="[^"]*"' | head -1 | sed 's/^action="//;s/"$//;s/&/\&/g') - curl -s -b "$jar" -c "$jar" -X POST --data-urlencode "username=theme-tester" --data-urlencode "password=wrong" "$action" \ - | sed "s#<head>#<head><base href=\"http://host.docker.internal:$port/\">#" > "$html" - rm -f "$jar" + trap 'rm -f "$jar" "$html"' RETURN EXIT + page=$(curl -sf -c "$jar" "$local_auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect") \ + || fail "login page did not return 200 on port $port" + action=$(grep -o 'action="[^"]*"' <<<"$page" | head -1 | sed 's/^action="//;s/"$//;s/&/\&/g') \ + || fail "no form action found in the login page" + curl -sf -b "$jar" -c "$jar" -X POST --data-urlencode "username=theme-tester" --data-urlencode "password=wrong" "$action" \ + | sed -E "s#<head([^>]*)>#<head\\1><base href=\"http://host.docker.internal:$port/\">#" > "$html" \ + || fail "login POST failed" + grep -q '<base href=' "$html" || fail "no <head> found to inject <base> into" docker run --rm --add-host=host.docker.internal:host-gateway -v "$out:/out" zenika/alpine-chrome:latest \ --no-sandbox --headless --disable-gpu --hide-scrollbars --disable-web-security --virtual-time-budget=3000 \ --window-size=1280,900 --screenshot="/out/$version-login-error.png" "file:///out/$version-login-error.html" >/dev/null 2>&1 - rm -f "$html" echo "wrote $out/$version-login-error.png" } diff --git a/keycloak/tests/smoke.sh b/keycloak/tests/smoke.sh index f7193565..fc8cb2e8 100755 --- a/keycloak/tests/smoke.sh +++ b/keycloak/tests/smoke.sh @@ -18,7 +18,7 @@ for css in tokens gundi "$version"; do done # 2. Every /resources/ asset the page links must be served. -assets=$(grep -oE '(href|src)="[^"]*/resources/[^"]+"' <<<"$html" | sed -E 's/^(href|src)="//; s/"$//' | sort -u) +assets=$(grep -oE '(href|src)="[^"]*/resources/[^"]+"' <<<"$html" | sed -E 's/^(href|src)="//; s/"$//' | sort -u || true) [[ -n $assets ]] || fail "no /resources/ links found in login page" while read -r a; do [[ -z $a ]] && continue @@ -49,8 +49,8 @@ grep -qE '<title>[[:space:]]*Sign in to Gundi[[:space:]]*' <<<"$html" || if [[ $version == kc26 ]]; then # The h1 text follows a newline (and, in dev mode, a comment) after the # opening tag, so collapse newlines and allow whitespace/comments before matching. - tr -d '\n' <<<"$html" | grep -qE 'id="kc-page-title"[^>]*>([[:space:]]|)*Sign in to Gundi' \ - || fail "loginAccountTitle override missing on kc26 (h1 #kc-page-title does not read 'Sign in to Gundi')" + tr -d '\n' <<<"$html" | grep -qE 'id="kc-page-title"[^>]*>([[:space:]]|)*Welcome' \ + || fail "loginAccountTitle override missing on kc26 (h1 #kc-page-title does not read 'Welcome')" fi grep -q 'id="kc-page-title"' <<<"$html" || fail "kc-page-title element missing" diff --git a/keycloak/themes/gundi/login/messages/messages_en.properties b/keycloak/themes/gundi/login/messages/messages_en.properties index a9da48de..da1dc441 100644 --- a/keycloak/themes/gundi/login/messages/messages_en.properties +++ b/keycloak/themes/gundi/login/messages/messages_en.properties @@ -3,4 +3,5 @@ # the page with doLogIn (also the button label), so kc11.css draws "Welcome" over it instead. loginAccountTitle=Welcome # tag on both versions. Ignores the realm display name placeholder {0} on purpose. +# The same copy is the login-page subtitle in resources/css/gundi.css; change both together. loginTitle=Sign in to Gundi diff --git a/keycloak/themes/gundi/login/resources/css/gundi.css b/keycloak/themes/gundi/login/resources/css/gundi.css index d562df58..d7ea42dc 100644 --- a/keycloak/themes/gundi/login/resources/css/gundi.css +++ b/keycloak/themes/gundi/login/resources/css/gundi.css @@ -26,9 +26,11 @@ body { text-align: center; margin: 0 0 24px; } -/* Login page only: "Sign in to Gundi" subtitle under the h1. The login form's id exists on - both versions and only on the login page, so its presence identifies the page. */ -body:has(#kc-form-login) #kc-page-title::after { +/* Login page only: "Sign in to Gundi" subtitle under the h1. Keycloak 26 tags the body with a + page id. Keycloak 11 has no page marker, so the login form's presence identifies the page via + :has(); :is() is forgiving, so a browser without :has() still applies the 26 branch. + The copy must match loginTitle in messages/messages_en.properties. */ +:is(body[data-page-id="login-login"], body:has(#kc-form-login)) #kc-page-title::after { content: "Sign in to Gundi"; display: block; margin-top: 8px; diff --git a/keycloak/themes/gundi/login/resources/css/kc11.css b/keycloak/themes/gundi/login/resources/css/kc11.css index 4e792cee..d2647c6e 100644 --- a/keycloak/themes/gundi/login/resources/css/kc11.css +++ b/keycloak/themes/gundi/login/resources/css/kc11.css @@ -35,11 +35,19 @@ margin-bottom: 0; } /* Login page title. Keycloak 11 titles the login page with doLogIn, the same key as the submit - button, so the h1 text is hidden and "Welcome" drawn in its place. Keycloak 26 has its own key - (loginAccountTitle in messages_en.properties). */ + button, so the h1 text is hidden and "Welcome" drawn in its place. visibility: hidden keeps + "Log In" out of the accessible name; the pseudo-elements opt back in, so assistive tech reads + "Welcome Sign in to Gundi". Keycloak 26 has its own key (loginAccountTitle in + messages_en.properties). Without :has() support the h1 falls back to the stock "Log In"; 11 is + the outgoing version, so no further fallback is provided. */ body:has(#kc-form-login) .login-pf-page #kc-page-title { font-size: 0; line-height: 0; + visibility: hidden; +} +body:has(#kc-form-login) .login-pf-page #kc-page-title::before, +body:has(#kc-form-login) .login-pf-page #kc-page-title::after { + visibility: visible; } body:has(#kc-form-login) .login-pf-page #kc-page-title::before { content: "Welcome"; diff --git a/keycloak/themes/gundi/login/theme.kc11.properties b/keycloak/themes/gundi/login/theme.kc11.properties deleted file mode 100644 index 24a85b06..00000000 --- a/keycloak/themes/gundi/login/theme.kc11.properties +++ /dev/null @@ -1,8 +0,0 @@ -# Gundi login theme for Keycloak 11.0.2 (WildFly; parent "keycloak" is PatternFly 3). -# Installed as theme.properties by Dockerfile.kc11 and by compose.theme-dev.yml. -parent=keycloak -import=common/keycloak - -# A child `styles=` REPLACES the parent's list, so the parent's login.css is listed first. -# Resources resolve through the parent chain, so css/login.css comes from the keycloak theme. -styles=css/login.css css/tokens.css css/gundi.css css/kc11.css diff --git a/keycloak/themes/gundi/login/theme.kc26.properties b/keycloak/themes/gundi/login/theme.kc26.properties index db22480c..c15246cf 100644 --- a/keycloak/themes/gundi/login/theme.kc26.properties +++ b/keycloak/themes/gundi/login/theme.kc26.properties @@ -1,5 +1,5 @@ # Gundi login theme for Keycloak 26.x (Quarkus; parent "keycloak.v2" is PatternFly 5). -# Installed as theme.properties by Dockerfile.kc26 and by compose.theme-dev.yml. +# Installed over the default (KC 11) theme.properties by Dockerfile.kc26 and compose.theme-dev.yml. parent=keycloak.v2 import=common/keycloak diff --git a/keycloak/themes/gundi/login/theme.properties b/keycloak/themes/gundi/login/theme.properties index e69de29b..1772d097 100644 --- a/keycloak/themes/gundi/login/theme.properties +++ b/keycloak/themes/gundi/login/theme.properties @@ -0,0 +1,9 @@ +# Gundi login theme for Keycloak 11.0.2 (WildFly; parent "keycloak" is PatternFly 3). +# This is the default theme.properties, so copying the theme folder whole yields a working KC 11 +# theme. Keycloak 26 builds swap in theme.kc26.properties (Dockerfile.kc26, compose.theme-dev.yml). +parent=keycloak +import=common/keycloak + +# A child `styles=` REPLACES the parent's list, so the parent's login.css is listed first. +# Resources resolve through the parent chain, so css/login.css comes from the keycloak theme. +styles=css/login.css css/tokens.css css/gundi.css css/kc11.css From cdaf76e37ef0a280c70c36001cfc61b91757f5af Mon Sep 17 00:00:00 2001 From: Chris Doehring <chrisdo@allenai.org> Date: Wed, 23 Sep 2026 14:06:39 -0700 Subject: [PATCH 19/19] Fix screenshot cleanup trap scope --- keycloak/tests/screenshot.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keycloak/tests/screenshot.sh b/keycloak/tests/screenshot.sh index a4e22733..f40159e3 100755 --- a/keycloak/tests/screenshot.sh +++ b/keycloak/tests/screenshot.sh @@ -26,10 +26,10 @@ shot() { # <name> <WxH> <url> # --disable-web-security lets the file:// page load the theme's fonts cross-origin. fail() { echo "FAIL: $*" >&2; exit 1; } -shot_login_error() { +shot_login_error() ( local jar html page action jar=$(mktemp) && html="$out/$version-login-error.html" - trap 'rm -f "$jar" "$html"' RETURN EXIT + trap 'rm -f "$jar" "$html"' EXIT page=$(curl -sf -c "$jar" "$local_auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect") \ || fail "login page did not return 200 on port $port" action=$(grep -o 'action="[^"]*"' <<<"$page" | head -1 | sed 's/^action="//;s/"$//;s/&/\&/g') \ @@ -42,7 +42,7 @@ shot_login_error() { --no-sandbox --headless --disable-gpu --hide-scrollbars --disable-web-security --virtual-time-budget=3000 \ --window-size=1280,900 --screenshot="/out/$version-login-error.png" "file:///out/$version-login-error.html" >/dev/null 2>&1 echo "wrote $out/$version-login-error.png" -} +) shot login 1280,900 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect" shot login-mobile 375,812 "$auth?client_id=cdip-kong-gateway&response_type=code&scope=openid&$ok_redirect"