detached 47ad4a2

fix(theme): preserve ghost text contrast

commit
47ad4a2fd8d58ed9419e77af2b2347f848a75de6
author
brice · · 2026-08-29 13:06 UTC
parent
179fb63
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +4 -1
M internal/ui/theme/css.go +1 -1
@@ -504,7 +504,7 @@ entry.omnibox-entry.omnibox-entry-bang-active:focus-visible > text {
504504 /* Ghost text autocomplete overlay - positioned to align with entry text */
505505 .omnibox-ghost {
506506 font-size: 1em;
507- color: alpha(var(--control-text), 0.65);
507+ color: var(--control-text);
508508 margin-top: -0.0625em; /* Nudge up 1px to align with entry text baseline */
509509 background-color: transparent;
510510 }
@@ -504,7 +504,7 @@ entry.omnibox-entry.omnibox-entry-bang-active:focus-visible > text {
504 /* Ghost text autocomplete overlay - positioned to align with entry text */504 /* Ghost text autocomplete overlay - positioned to align with entry text */
505 .omnibox-ghost {505 .omnibox-ghost {
506 font-size: 1em;506 font-size: 1em;
507- color: alpha(var(--control-text), 0.65);507+ color: var(--control-text);
508 margin-top: -0.0625em; /* Nudge up 1px to align with entry text baseline */508 margin-top: -0.0625em; /* Nudge up 1px to align with entry text baseline */
509 background-color: transparent;509 background-color: transparent;
510 }510 }
M internal/ui/theme/css_test.go +3 -0
@@ -122,6 +122,9 @@ func TestGenerateCSS_OmniboxSearchEntryUsesControlSurface(t *testing.T) {
122122 if !entryRe.MatchString(css) {
123123 t.Fatalf("expected omnibox entry and its text node to use the control surface fill and readable text")
124124 }
125+ ghostBlock := cssRuleBlock(t, css, ".omnibox-ghost")
126+ assert.Contains(t, ghostBlock, "color: var(--control-text);")
127+ assert.NotContains(t, ghostBlock, "alpha(var(--control-text)")
125128 focusedEntryRe := regexp.MustCompile(`(?s)entry\.omnibox-entry:focus[^\{]*,\s*entry\.omnibox-entry:focus-within[^\{]*,\s*entry\.omnibox-entry:focus-visible[^\{]*,\s*entry\.omnibox-entry:focus\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-within\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-visible\s*>\s*text\s*\{[^}]*background-color:\s*shade\(var\(--surface-variant\),\s*1\.08\);`)
126129 if !focusedEntryRe.MatchString(css) {
127130 t.Fatalf("expected focused omnibox entry text node to keep a distinct control-surface fill")
@@ -122,6 +122,9 @@ func TestGenerateCSS_OmniboxSearchEntryUsesControlSurface(t *testing.T) {
122 if !entryRe.MatchString(css) {122 if !entryRe.MatchString(css) {
123 t.Fatalf("expected omnibox entry and its text node to use the control surface fill and readable text")123 t.Fatalf("expected omnibox entry and its text node to use the control surface fill and readable text")
124 }124 }
125+ ghostBlock := cssRuleBlock(t, css, ".omnibox-ghost")
126+ assert.Contains(t, ghostBlock, "color: var(--control-text);")
127+ assert.NotContains(t, ghostBlock, "alpha(var(--control-text)")
125 focusedEntryRe := regexp.MustCompile(`(?s)entry\.omnibox-entry:focus[^\{]*,\s*entry\.omnibox-entry:focus-within[^\{]*,\s*entry\.omnibox-entry:focus-visible[^\{]*,\s*entry\.omnibox-entry:focus\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-within\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-visible\s*>\s*text\s*\{[^}]*background-color:\s*shade\(var\(--surface-variant\),\s*1\.08\);`)128 focusedEntryRe := regexp.MustCompile(`(?s)entry\.omnibox-entry:focus[^\{]*,\s*entry\.omnibox-entry:focus-within[^\{]*,\s*entry\.omnibox-entry:focus-visible[^\{]*,\s*entry\.omnibox-entry:focus\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-within\s*>\s*text[^\{]*,\s*entry\.omnibox-entry:focus-visible\s*>\s*text\s*\{[^}]*background-color:\s*shade\(var\(--surface-variant\),\s*1\.08\);`)
126 if !focusedEntryRe.MatchString(css) {129 if !focusedEntryRe.MatchString(css) {
127 t.Fatalf("expected focused omnibox entry text node to keep a distinct control-surface fill")130 t.Fatalf("expected focused omnibox entry text node to keep a distinct control-surface fill")

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close