2 Commits

Author SHA1 Message Date
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 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
2 changed files with 22 additions and 21 deletions
+3 -8
View File
@@ -10,25 +10,20 @@
"semanticCommitType": "fix", "semanticCommitType": "fix",
"semanticCommitScope": "deps", "semanticCommitScope": "deps",
"github-actions": { "github-actions": {
"managerFilePatterns": ["/^\\.gitea/workflows/[^/]+\\.ya?ml$/"] "fileMatch": ["^\\.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"
} }
], ],
"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",
"managerFilePatterns": ["/\\.html$/"], "fileMatch": ["\\.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.-]*)"
] ]
@@ -36,7 +31,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",
"managerFilePatterns": ["/\\.html$/"], "fileMatch": ["\\.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[^/\"']+)"
+19 -13
View File
@@ -21,14 +21,14 @@
/* Original DLR — 1987 red, white and blue */ /* Original DLR — 1987 red, white and blue */
[data-theme="original"] { [data-theme="original"] {
--bg: #c8102e; --bg: #f5f0e1;
--surface: #002b5c; --surface: #002b5c;
--text: #f5f0e1; --text: #002b5c;
--message: #f5f0e1; --message: #002b5c;
--button-bg: #002b5c; --button-bg: #c8102e;
--button-text: #f5f0e1; --button-text: #f5f0e1;
--button-active-bg: #f5f0e1; --button-active-bg: #002b5c;
--button-active-text: #002b5c; --button-active-text: #f5f0e1;
} }
* { * {
@@ -63,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;
} }
@@ -75,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 {