29 Commits

Author SHA1 Message Date
lyrathorpe 4690263ba8 Merge pull request 'feat: match original theme to authentic 1987 DLR livery' (#19) from feat/original-theme-dlr-livery into main
Build and publish container / build (push) Successful in 2m43s
Reviewed-on: #19
2026-06-12 13:08:59 +01:00
Emma Thorpe e31729e27a feat: match original theme to authentic 1987 DLR livery
Build and publish container / build (pull_request) Successful in 1m52s
Set the original colour scheme's typeface and palette to the 1987
Docklands Light Railway P86/P89 stock.

- Use the Rockwell slab serif (the original DLR branding typeface) for the
  original theme, with Rokkitt loaded as a free fallback for systems
  without Rockwell installed.
- Flip the palette to be blue-dominant: blue body/skirt as the field, red
  band/doors as the accent, white stripes, matching the rolling stock.
2026-06-12 13:05:37 +01:00
lyrathorpe c5433a23ee Merge pull request 'ci: filter main builds to code changes and cancel superseded runs' (#18) from ci/optimise-main-builds into main
Reviewed-on: #18
2026-06-12 12:42:29 +01:00
Emma Thorpe fb705c234f ci: filter main builds to code changes and cancel superseded runs
Build and publish container / build (pull_request) Successful in 1m35s
Apply path filters to the push (merge-to-main) trigger only, so merges that
do not change the image (CI/Renovate config, docs) skip the build and release.
Pull requests keep running unfiltered so the required check is always reported.

Add a concurrency group keyed by ref with cancel-in-progress, so a newer run
supersedes an older in-flight run: a fresh merge to main cancels the previous
build and only the most recent release is produced, avoiding tags that would
be immediately replaced.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 12:39:56 +01:00
lyrathorpe 562ce29ca1 Merge pull request 'fix(deps): update docker/setup-qemu-action action to v4' (#17) from renovate/docker-setup-qemu-action-4.x into main
Build and publish container / build (push) Failing after 5m57s
Reviewed-on: #17
2026-06-12 12:26:35 +01:00
lyrathorpe 1c57d70c00 Merge pull request 'fix(deps): update docker/setup-buildx-action action to v4' (#16) from renovate/docker-setup-buildx-action-4.x into main
Build and publish container / build (push) Failing after 6m6s
Reviewed-on: #16
2026-06-12 12:26:05 +01:00
lyrathorpe 7e23b09694 Merge pull request 'fix(deps): update docker/login-action action to v4' (#11) from renovate/docker-login-action-4.x into main
Build and publish container / build (push) Failing after 8m16s
Reviewed-on: #11
2026-06-12 12:21:38 +01:00
lyrathorpe 818331b066 Merge pull request 'fix(deps): update docker/build-push-action action to v7' (#10) from renovate/docker-build-push-action-7.x into main
Build and publish container / build (push) Failing after 34s
Reviewed-on: #10
2026-06-12 12:21:38 +01:00
lyrathorpe dfedc5c51b Merge pull request 'fix(deps): update actions/checkout action to v6' (#9) from renovate/actions-checkout-6.x into main
Build and publish container / build (push) Successful in 8m35s
Reviewed-on: #9
2026-06-12 12:18:49 +01:00
Renovate Bot 0c38161989 fix(deps): update docker/setup-qemu-action action to v4
Build and publish container / build (pull_request) Successful in 7m37s
2026-06-12 11:11:04 +00:00
Renovate Bot d97707387d fix(deps): update docker/setup-buildx-action action to v4
Build and publish container / build (pull_request) Successful in 7m33s
2026-06-12 11:11:00 +00:00
Renovate Bot b26d49d9d8 fix(deps): update docker/login-action action to v4
Build and publish container / build (pull_request) Successful in 7m27s
2026-06-12 11:10:57 +00:00
Renovate Bot 9e5958b458 fix(deps): update docker/build-push-action action to v7
Build and publish container / build (pull_request) Successful in 7m28s
2026-06-12 11:10:53 +00:00
Renovate Bot df0df3e9a0 fix(deps): update actions/checkout action to v6
Build and publish container / build (pull_request) Successful in 7m20s
2026-06-12 11:10:48 +00:00
lyrathorpe 8bb782287e Merge pull request 'fix(deps): pin dependencies' (#7) from renovate/pin-dependencies into main
Build and publish container / build (push) Successful in 9m52s
Reviewed-on: #7
2026-06-12 12:08:23 +01:00
Renovate Bot 56ec85c17e fix(deps): pin dependencies
Build and publish container / build (pull_request) Successful in 7m56s
2026-06-12 10:58:16 +00:00
lyrathorpe 9412c20248 Merge pull request 'Fix/renovate semantic fix' (#14) from fix/renovate-semantic-fix into main
Build and publish container / build (push) Has been cancelled
Reviewed-on: #14
2026-06-12 11:49:53 +01:00
lyrathorpe 65f97d2707 Merge pull request 'feat: present theme switch as a segmented control' (#15) from feat/segmented-theme-switch into main
Build and publish container / build (push) Successful in 6m7s
Reviewed-on: #15
2026-06-12 11:45:08 +01:00
Emma Thorpe 564070b270 ci: auto-merge patch and minor renovate updates
Build and publish container / build (pull_request) Successful in 4m55s
Add a packageRule that automerges patch and minor updates, with
platformAutomerge enabled so Gitea merges them once required checks pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:39:02 +01:00
Emma Thorpe ad90451846 feat: present theme switch as a segmented control
Build and publish container / build (pull_request) Successful in 4m49s
Join the two theme options into a single rounded container with the active
segment filled and a divider between them, replacing the two separate pills.
Markup and aria-pressed behaviour are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:34:32 +01:00
Emma Thorpe 22c2ef1b26 fix: force fix(deps) commit type so renovate PRs trigger releases
Build and publish container / build (pull_request) Successful in 6m16s
config:recommended pulls in :semanticPrefixFixDepsChoreOthers, whose catch-all
packageRule forces non-npm updates (Docker base image, Gitea Actions) to the
chore type, overriding the top-level semanticCommitType. chore produces no
release, so Renovate updates were never auto-tagged.

Append a packageRule matching all packages that sets semanticCommitType to fix,
so every merged Renovate PR registers as a patch and is released and tagged.
Also migrate the deprecated fileMatch keys to managerFilePatterns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:31:07 +01:00
Emma Thorpe 301120c174 fix: recolour original theme to a red field with white text
Switch the original theme to a red background with white message text, with
navy buttons, evoking the red B07/B99 stock. Red/white/blue are all retained.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:24:30 +01:00
renovate-bot 1a0ffead5a Merge pull request 'chore(deps): update docker base image to v1.31' (#8) from renovate/docker-base-image into main
Build and publish container / build (push) Successful in 6m21s
2026-06-12 01:14:42 +01:00
Renovate Bot 719956341c chore(deps): update docker base image to v1.31
Build and publish container / build (pull_request) Successful in 4m38s
2026-06-12 00:02:27 +00:00
lyrathorpe 2a1e6dc8a4 Merge pull request 'feat(messages): add initial messages' (#6) from feat/reasons-why into main
Build and publish container / build (push) Successful in 5m59s
Reviewed-on: #6
2026-06-11 21:08:15 +01:00
lyrathorpe 6b19a55655 feat(messages): add initial messages
Build and publish container / build (pull_request) Successful in 4m22s
more added later on
2026-06-11 21:03:31 +01:00
lyrathorpe a2b9d445e4 Merge pull request 'Fix/theme colours' (#5) from fix/theme-colours into main
Build and publish container / build (push) Successful in 6m18s
Reviewed-on: #5
2026-06-11 17:49:40 +01:00
Emma Thorpe a14306cce4 fix: recolour original theme to a cream field with blue text
Build and publish container / build (pull_request) Successful in 4m51s
Use a cream/white background with navy message text and red buttons, so the
original red/white/blue livery presents blue text rather than white text on a
blue field.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:41:55 +01:00
Emma Thorpe 43f42a8274 fix: use solid theme backgrounds instead of a gradient
Replace the body background gradient with the solid theme colour and remove
the now-unused --bg-accent variables from both colour schemes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:36:47 +01:00
6 changed files with 78 additions and 31 deletions
+25 -5
View File
@@ -1,10 +1,30 @@
name: Build and publish container name: Build and publish container
on: on:
# On merge to main, only build/release when image-affecting files change;
# CI-config, Renovate-config and docs changes do not produce a new image.
push: push:
branches: [main] branches: [main]
paths:
- 'Dockerfile'
- 'default.conf'
- 'index.html'
- 'styles.css'
- 'script.js'
- 'messages.js'
- '.dockerignore'
# Pull requests always run (the build is a required check); no path filter.
pull_request: pull_request:
branches: [main] branches: [main]
workflow_dispatch:
# A newer run cancels an older in-flight run in the same group (keyed by ref),
# so a fresh merge to main supersedes the previous build and only the latest
# release is produced, avoiding tags that would be immediately replaced. Each
# pull request likewise supersedes only its own earlier runs.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
defaults: defaults:
run: run:
@@ -18,7 +38,7 @@ jobs:
packages: write packages: write
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with: with:
# Full history and tags are required to derive the next version # Full history and tags are required to derive the next version
# from the conventional-commit messages since the last release. # from the conventional-commit messages since the last release.
@@ -94,21 +114,21 @@ jobs:
echo "Computed bump=${bump}, release=${release}, base=${base}" echo "Computed bump=${bump}, release=${release}, base=${base}"
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4
- name: Set up Buildx - name: Set up Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
- name: Log in to the Gitea container registry - name: Log in to the Gitea container registry
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: docker/login-action@v3 uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
with: with:
registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }} username: ${{ github.repository_owner }}
password: ${{ secrets.PACKAGES_TOKEN }} password: ${{ secrets.PACKAGES_TOKEN }}
- name: Build and push - name: Build and push
uses: docker/build-push-action@v6 uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
+1 -1
View File
@@ -1,7 +1,7 @@
# Lightweight, non-root nginx serving the static site. # Lightweight, non-root nginx serving the static site.
# Runs as user "nginx" and listens on 8080, ready to sit behind an # Runs as user "nginx" and listens on 8080, ready to sit behind an
# external reverse proxy that terminates TLS and forwards requests. # external reverse proxy that terminates TLS and forwards requests.
FROM nginxinc/nginx-unprivileged:1.27-alpine-slim FROM nginxinc/nginx-unprivileged:1.31-alpine-slim@sha256:6616de6eaa82bc2ee3541fa287a8fca7dc7271e6374e9402014dbd13f4a980ae
COPY default.conf /etc/nginx/conf.d/default.conf COPY default.conf /etc/nginx/conf.d/default.conf
COPY --chown=nginx:nginx index.html styles.css script.js messages.js /usr/share/nginx/html/ COPY --chown=nginx:nginx index.html styles.css script.js messages.js /usr/share/nginx/html/
+3
View File
@@ -4,6 +4,9 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Why is the DLR shut today?</title> <title>Why is the DLR shut today?</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Rokkitt:wght@400;700;800&display=swap">
<link rel="stylesheet" href="styles.css"> <link rel="stylesheet" href="styles.css">
</head> </head>
<body data-theme="modern"> <body data-theme="modern">
+9 -4
View File
@@ -11,8 +11,13 @@
*/ */
const MESSAGES = [ const MESSAGES = [
"PLACEHOLDER: write your first reason here", "Maggie came back, she was unimpressed",
"PLACEHOLDER: write another reason here", "They mixed up the B23s and the 2024 tube stock",
// Add as many entries as you like, one per line: "The computer went on strike",
// "Your reason here", "Leaves on the track",
"Escalators broke at Cutty Sark",
"EHRC decided it was woke",
"JK Rowling",
"Kaiju",
"28 Days Later happened",
]; ];
+14 -3
View File
@@ -10,20 +10,31 @@
"semanticCommitType": "fix", "semanticCommitType": "fix",
"semanticCommitScope": "deps", "semanticCommitScope": "deps",
"github-actions": { "github-actions": {
"fileMatch": ["^\\.gitea/workflows/[^/]+\\.ya?ml$"] "managerFilePatterns": ["/^\\.gitea/workflows/[^/]+\\.ya?ml$/"]
}, },
"packageRules": [ "packageRules": [
{ {
"description": "Group nginx base image updates", "description": "Group nginx base image updates",
"matchManagers": ["dockerfile"], "matchManagers": ["dockerfile"],
"groupName": "docker base image" "groupName": "docker base image"
},
{
"description": "Commit every update as fix(deps) so each merged Renovate PR triggers a patch release. config:recommended pulls in :semanticPrefixFixDepsChoreOthers, which forces non-npm updates (Docker, Actions) to chore and would otherwise produce no release.",
"matchPackageNames": ["*"],
"semanticCommitType": "fix"
},
{
"description": "Auto-merge patch and minor updates once checks pass.",
"matchUpdateTypes": ["patch", "minor"],
"automerge": true
} }
], ],
"platformAutomerge": true,
"customManagers": [ "customManagers": [
{ {
"customType": "regex", "customType": "regex",
"description": "Update HTML dependencies annotated with a renovate comment, e.g. <!-- renovate: datasource=npm depName=bootstrap --> before the versioned URL", "description": "Update HTML dependencies annotated with a renovate comment, e.g. <!-- renovate: datasource=npm depName=bootstrap --> before the versioned URL",
"fileMatch": ["\\.html$"], "managerFilePatterns": ["/\\.html$/"],
"matchStrings": [ "matchStrings": [
"datasource=(?<datasource>\\S+) depName=(?<depName>\\S+)( versioning=(?<versioning>\\S+))?[\\s\\S]*?(?<currentValue>v?\\d+\\.\\d+\\.\\d+[\\w.-]*)" "datasource=(?<datasource>\\S+) depName=(?<depName>\\S+)( versioning=(?<versioning>\\S+))?[\\s\\S]*?(?<currentValue>v?\\d+\\.\\d+\\.\\d+[\\w.-]*)"
] ]
@@ -31,7 +42,7 @@
{ {
"customType": "regex", "customType": "regex",
"description": "Auto-detect versioned jsDelivr / unpkg npm assets in HTML", "description": "Auto-detect versioned jsDelivr / unpkg npm assets in HTML",
"fileMatch": ["\\.html$"], "managerFilePatterns": ["/\\.html$/"],
"matchStrings": [ "matchStrings": [
"https://cdn\\.jsdelivr\\.net/npm/(?<depName>@?[^@/]+(?:/[^@/]+)?)@(?<currentValue>\\d[^/\"']+)", "https://cdn\\.jsdelivr\\.net/npm/(?<depName>@?[^@/]+(?:/[^@/]+)?)@(?<currentValue>\\d[^/\"']+)",
"https://unpkg\\.com/(?<depName>@?[^@/]+(?:/[^@/]+)?)@(?<currentValue>\\d[^/\"']+)" "https://unpkg\\.com/(?<depName>@?[^@/]+(?:/[^@/]+)?)@(?<currentValue>\\d[^/\"']+)"
+26 -18
View File
@@ -10,7 +10,6 @@
/* Modern DLR — turquoise/teal */ /* Modern DLR — turquoise/teal */
[data-theme="modern"] { [data-theme="modern"] {
--bg: #00afaa; --bg: #00afaa;
--bg-accent: #007e7a;
--surface: #ffffff; --surface: #ffffff;
--text: #ffffff; --text: #ffffff;
--message: #ffffff; --message: #ffffff;
@@ -20,17 +19,20 @@
--button-active-text: #ffffff; --button-active-text: #ffffff;
} }
/* Original DLR — 1987 red and blue */ /* Original DLR — 1987 P86/P89 livery: blue body and skirt, red band and
doors, white stripes. Blue is the dominant field, red the accent.
1987 branding used the Rockwell slab serif; Rokkitt is a free fallback for
systems without Rockwell installed. */
[data-theme="original"] { [data-theme="original"] {
--bg: #002b5c; --font-stack: Rockwell, "Rockwell Nova", Rokkitt, Georgia, serif;
--bg-accent: #c8102e; --bg: #1f3a93;
--surface: #f5f0e1; --surface: #c8102e;
--text: #f5f0e1; --text: #ffffff;
--message: #f5f0e1; --message: #ffffff;
--button-bg: #c8102e; --button-bg: #c8102e;
--button-text: #f5f0e1; --button-text: #ffffff;
--button-active-bg: #f5f0e1; --button-active-bg: #ffffff;
--button-active-text: #002b5c; --button-active-text: #1f3a93;
} }
* { * {
@@ -44,7 +46,7 @@ body {
flex-direction: column; flex-direction: column;
font-family: var(--font-stack); font-family: var(--font-stack);
color: var(--text); color: var(--text);
background: linear-gradient(135deg, var(--bg) 0%, var(--bg-accent) 100%); background: var(--bg);
transition: background 0.4s ease, color 0.4s ease; transition: background 0.4s ease, color 0.4s ease;
} }
@@ -65,10 +67,13 @@ body {
padding: 1.5rem; padding: 1.5rem;
} }
/* Segmented control: both options joined in one rounded container,
with the active segment filled. */
.theme-toggle { .theme-toggle {
display: flex; display: inline-flex;
gap: 0.5rem; border: 2px solid var(--button-bg);
border: none; border-radius: 999px;
overflow: hidden;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
@@ -77,19 +82,22 @@ body {
font-family: inherit; font-family: inherit;
font-size: 0.9rem; font-size: 0.9rem;
font-weight: 600; font-weight: 600;
padding: 0.5rem 1rem; padding: 0.5rem 1.1rem;
border: 2px solid var(--button-bg); border: none;
border-radius: 999px;
background: transparent; background: transparent;
color: var(--text); color: var(--text);
cursor: pointer; cursor: pointer;
transition: background 0.2s ease, color 0.2s ease; transition: background 0.2s ease, color 0.2s ease;
} }
/* Divider between the two segments. */
.theme-button + .theme-button {
border-left: 2px solid var(--button-bg);
}
.theme-button[aria-pressed="true"] { .theme-button[aria-pressed="true"] {
background: var(--button-active-bg); background: var(--button-active-bg);
color: var(--button-active-text); color: var(--button-active-text);
border-color: var(--button-active-bg);
} }
.stage { .stage {