diff --git a/CHANGELOG.md b/CHANGELOG.md index c48ac36..1064fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- API keys page: `.btn-warning`/`.btn-success` now use dark labels and domain badges a darker primary background to meet WCAG 4.5:1 contrast +- API keys page: domain disclosure button now exposes `aria-expanded` and a descriptive `aria-label` for screen readers + ## [0.4.19] - 2026-07-13 ### Fixed diff --git a/internal/web/static/css/style.css b/internal/web/static/css/style.css index 866c369..b94500c 100644 --- a/internal/web/static/css/style.css +++ b/internal/web/static/css/style.css @@ -732,6 +732,18 @@ code { gap: 0.5rem; } +/* A td must stay a table cell — display:flex breaks it out of the table layout */ +td.actions { + display: table-cell; + white-space: nowrap; + vertical-align: middle; +} + +td.actions .btn, +td.actions form { + margin-right: 0.25rem; +} + .actions-bar { display: flex; gap: 1rem; @@ -758,7 +770,25 @@ code { .btn-warning { background: var(--warning); border-color: var(--warning); - color: white; + color: #111827; +} + +.btn-warning:hover { + background: #d97706; + border-color: #d97706; + color: #111827; +} + +.btn-success { + background: var(--success); + border-color: var(--success); + color: #111827; +} + +.btn-success:hover { + background: #059669; + border-color: #059669; + color: #111827; } /* Current version row highlight */ diff --git a/internal/web/views/apikeys_list.html b/internal/web/views/apikeys_list.html index 5841ec0..60ea5c1 100644 --- a/internal/web/views/apikeys_list.html +++ b/internal/web/views/apikeys_list.html @@ -44,10 +44,14 @@

API Keys

{{.Name}} {{.KeyPrefix}}... - + {{if .AllowedDomains}} + {{$total := len .AllowedDomains}} - {{range .AllowedDomains}}{{.}} {{end}} + {{range $i, $d := .AllowedDomains}}{{$d}} {{end}} + {{if gt $total 3}} + + {{end}} {{else}} All @@ -220,6 +224,16 @@

Edit API Key

document.getElementById('edit-modal').style.display = 'flex'; } + +function toggleDomains(btn, extraCount) { + const badges = btn.closest('.domain-badges'); + const collapsed = badges.querySelector('.domain-extra').classList.contains('domain-hidden'); + badges.querySelectorAll('.domain-extra').forEach(el => el.classList.toggle('domain-hidden', !collapsed)); + btn.textContent = collapsed ? 'less' : '+' + extraCount; + btn.setAttribute('aria-expanded', collapsed ? 'true' : 'false'); + const noun = extraCount === 1 ? 'domain' : 'domains'; + btn.setAttribute('aria-label', collapsed ? 'Hide ' + extraCount + ' extra ' + noun : 'Show ' + extraCount + ' more ' + noun); +}