16 Commits

Author SHA1 Message Date
Renovate Bot 2eb00aced5 fix(deps): update actions/checkout action to v6
Build and publish container / build (pull_request) Successful in 7m47s
2026-06-12 10:58:19 +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
lyrathorpe 8376860fb4 Merge pull request 'fix: build multi-arch images for amd64 and arm64' (#4) from fix/multi-arch-build into main
Build and publish container / build (push) Successful in 6m51s
Reviewed-on: #4
2026-06-11 17:26:57 +01:00
Emma Thorpe d1803f06dd fix: build multi-arch images for amd64 and arm64
Build and publish container / build (pull_request) Successful in 5m2s
Add QEMU setup and build for linux/amd64 and linux/arm64 (armv8), publishing
a single multi-arch manifest. The nginx-unprivileged base image provides both
architectures.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:20:20 +01:00
6 changed files with 50 additions and 24 deletions
+5 -1
View File
@@ -18,7 +18,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.
@@ -93,6 +93,9 @@ jobs:
echo "release=${release}" >> "$GITHUB_OUTPUT" echo "release=${release}" >> "$GITHUB_OUTPUT"
echo "Computed bump=${bump}, release=${release}, base=${base}" echo "Computed bump=${bump}, release=${release}, base=${base}"
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Buildx - name: Set up Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@@ -108,6 +111,7 @@ jobs:
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.version.outputs.tags }} tags: ${{ steps.version.outputs.tags }}
labels: | labels: |
+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 -1
View File
@@ -46,7 +46,9 @@ docker run --rm -p 8080:8080 dlr
`.gitea/workflows/build-and-publish.yml` builds the container with Gitea Actions `.gitea/workflows/build-and-publish.yml` builds the container with Gitea Actions
on every push to `main` and on pull requests. Pull requests build the image but on every push to `main` and on pull requests. Pull requests build the image but
do not push. The registry host is derived from the Gitea server URL. do not push. The registry host is derived from the Gitea server URL. Images are
built for `linux/amd64` and `linux/arm64` (armv8) and published as a single
multi-arch manifest; the arm64 build runs under QEMU emulation.
Authentication requires a Personal Access Token with package read/write scope, Authentication requires a Personal Access Token with package read/write scope,
because the automatically provided `GITEA_TOKEN` does not carry container because the automatically provided `GITEA_TOKEN` does not carry container
+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[^/\"']+)"
+18 -14
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,14 +19,13 @@
--button-active-text: #ffffff; --button-active-text: #ffffff;
} }
/* Original DLR — 1987 red and blue */ /* Original DLR — 1987 red, white and blue */
[data-theme="original"] { [data-theme="original"] {
--bg: #002b5c; --bg: #c8102e;
--bg-accent: #c8102e; --surface: #002b5c;
--surface: #f5f0e1;
--text: #f5f0e1; --text: #f5f0e1;
--message: #f5f0e1; --message: #f5f0e1;
--button-bg: #c8102e; --button-bg: #002b5c;
--button-text: #f5f0e1; --button-text: #f5f0e1;
--button-active-bg: #f5f0e1; --button-active-bg: #f5f0e1;
--button-active-text: #002b5c; --button-active-text: #002b5c;
@@ -44,7 +42,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 +63,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 +78,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 {