Repository navigation
fix: batch of small UI bugs (#21 #22 #24 #26 #28 #29) - #94
Merged
Merged
Conversation
Release builds are stamped with the git tag (v3.6.0), so the template's hardcoded "v" produced "vv3.6.0". versionLabel() (core/version-label.ts) now adds the prefix only to a bare version number: tags and git-describe output keep their own "v", a dev build shows "dev" rather than "vdev", and a lone commit hash from `git describe --always` stays as it is. The About tab uses the same label, so both places read alike. Closes #21
Bedrock is a stub that only returns "not yet supported", yet it sat in the Active Provider dropdown with its own key field. It is gone from both, and README, CLAUDE.md and the website no longer list it. The Go stub and the settings value stay so #23 can bring it back. A settings file that already names bedrock is left as it is: switching it would send the user's text to a service they never chose. Settings and Pyramidize both show "Choose a provider" with a note that AWS Bedrock is not available yet. Pyramidize also stays disabled, skips the key banner and model probe for it, and so never reaches the raw "unsupported provider" error. Picking any provider clears the note. Closes #22
Only the dark theme is styled. Choosing Light dropped PrimeNG into its unstyled light mode, and System did nothing. The theme control is gone (a dropdown with one entry is not a choice), and applyTheme() keeps .app-dark whatever theme_preference says, so a value saved by an older version cannot unstyle the app either. The field stays in the settings model and is saved unchanged, for the light theme in #25. The dark-mode E2E spec gains a test that serves a stored "light" through the Wails runtime endpoint and asserts the page stays dark with no theme control. Closes #24
The Sensitive Logging row puts a long hint next to its switch, and the flex row squeezed the switch (30px at 1280px wide, 10px at 600px), so the knob slid past the track's edge. The switch no longer shrinks; a Playwright test at a 600px viewport asserts every toggle row's switch keeps its 40px width. Closes #26
PrimeNG declares component tokens on :root as aliases of the theme tokens (the select panel's background is var(overlay background)), and an alias resolves on the element that declares it. With .app-dark on <body>, <html> never saw the dark theme, so every aliased token came out light: the disabled Pyramidize global-instruction input (slate-200), every p-select dropdown panel (white), tab bars, and the dim slate key labels on the AI Providers tab. The class now sits on <html> (index.html, applyTheme). The existing overrides in styles.scss are kept so no colour that was right changes; the card background moves to :root.app-dark so PrimeNG's own :root card token cannot raise the settings card off the page. Disabled pInputText, pTextarea and p-select keep a dark zinc-900 surface with muted text, rather than Aura's zinc-700 block. Two dark-mode E2E tests pin the disabled-input and dropdown-panel colours. Closes #28
Apply wore the same accent as the Pyramidize button even while it was disabled, so a button that could do nothing competed with the page's main action. It is now secondary while the global instruction is empty or whitespace, and turns primary as soon as the user types one. Closes #29
With a saved AWS Bedrock provider, the Pyramidize button was already guarded, but the Editor canvas is editable before any Pyramidize: typing a global instruction enabled Apply, and Apply, Ctrl+Enter or the selection bubble ended in a raw "unsupported provider: bedrock" error. Apply now stays secondary and disabled, the bubble's Apply is disabled, and both methods return early. The note on the page now points to Settings, since a choice made on the page lasts for the session only. Also: the settings spec's no-AWS-key test asserts the provider keys that must be there, so an unrendered tab cannot pass it, and the lookup uses Object.hasOwn so an inherited property name cannot match. Refs #22
0xMMA
force-pushed
the
fix/ui-quick-bugs
branch
from
September 24, 2026 23:05
0f50d22 to
9759984
Compare
Owner
Author
|
Ready once visually approved: CI green, independent Opus review with review-pr fork supplement, all findings addressed (9759984). Needs Michael's visual OK on the #28 colour shifts listed in the body, the check-mark colour on the Fix page's auto-copy checkbox especially. |
This was referenced Oct 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six small UI bugs from the April triage: one commit each, plus a follow-up commit for #22 from review.
#21 — version shows
vv3.6.0Release builds are stamped with the git tag (
v3.6.0), and the sidebar template added a secondv.versionLabel()(core/version-label.ts) now adds the prefix only to a bare version number:v3.6.0v3.6.03.6.0v3.6.0v3.7.0-alpha.2-5-gabc1234(CI'sgit describe)0a1b2c3(the commit hashgit describe --alwaysfalls back to)devdev(wasvdev)The About tab uses the same label, so both places read the same. DOM tests cover the sidebar and the About tab. On the old code the sidebar tests showed
vv3.6.0,vv3.7.0-…andvdev.#22 — Bedrock is offered but only errors
bedrocksettings value and theAWS_SECRET_ACCESS_KEYenv mapping stay, so Implement AWS Bedrock provider with full credential config #23 can bring it back.website/index.html(meta description, hero sentence, provider chip), because the public site made the same false claim. Note:pages.ymldeploys the site on merge, so merging this PR updates keylint.io.Saved provider
bedrock, what the user gets: the value is left as it is. Switching it to a working provider automatically would send the user's text to a service they never picked (and usually one without a key, which just fails differently). Instead, the Active Provider field shows the placeholder "Choose a provider" with a warning under it: "AWS Bedrock is not available yet, so KeyLint has no provider to use. Choose another one and save." Picking any provider clears the warning, and Save stores the choice. Saving without picking keepsbedrock. The Pyramidize page (it has its own provider dropdown) behaves the same way:unsupported provider: "bedrock"error. This was added in the follow-up commitfix(pyramidize): keep an unavailable provider out of canvas refinement;The hotkey path keeps its existing Go error ("AWS Bedrock is not yet supported. Please select a different provider"). Tests cover both screens (
settings.component.spec.ts, newunavailable-provider.spec.ts). The shared list lives incore/constants.ts(UNAVAILABLE_PROVIDERS).Known leftover: a Bedrock secret someone saved earlier stays in the OS keyring and can no longer be seen or deleted in the app. Nothing reads it, because the backend errors out before resolving the key. It's worth a delete-only row or a note in #23. I did not delete it automatically.
#24 — Light and System themes are unstyled
Only Dark is styled, and a dropdown with one entry is not a choice, so the Theme control is gone.
applyTheme()now keeps.app-darkwhatevertheme_preferencesays, so alightorsystemsaved by an older version can't strip the styling either. The field stays in the settings model and is saved unchanged (tested), ready for #25.dark-mode.spec.tsgains a test that serves a stored"light"through the Wails runtime endpoint (page.route('**/wails/runtime'), answering onlySettings.Get) and checks that the page stays dark with no Theme label. On the old code this test fails: the stored light removed.app-dark. Docs (.claude/rules/architecture.md,.claude/docs/architecture.md) are updated.#26 — Sensitive Logging toggle squeezed, knob clips
The long hint beside the switch made the flex row shrink it. Measured before: Start on Boot 40×24, Sensitive Logging 30×24. After the fix both are 40×24. The fix is
flex-shrink: 0onp-toggle-switchinside.toggle-row, so it also protects the toggle rows PR #31 adds. A new Playwright spec,e2e/settings-toggles.spec.ts, asserts at a 600px viewport that every toggle-row switch is 40px wide. Without the fix it measured 10px there.#28 — light input background in dark mode, fixed at the root
Measured: the global-instruction input is disabled until the canvas has text, and when disabled it rendered
rgb(226,232,240)(slate-200). The root cause is app-wide:.app-darksat on<body>, but PrimeNG declares each component's tokens on:rootas aliases of the theme tokens (--p-select-overlay-background: var(--p-overlay-select-background)), and an alias resolves on the element that declares it.<html>never saw the dark theme, so every aliased token came out light. That covered disabled fields, every p-select dropdown panel (white), tab-bar tokens, and the dim slate key labels on the AI Providers tab. The side finding about dropdown panels shares this cause and is fixed by the same change.The fix moves
.app-darkto<html>(index.html,applyTheme()). The existing overrides instyles.scssare kept, so surfaces that were already dark stay exactly as they were.Colours that change — needs your visual OK. Everything below moves from Aura's light token to its correct dark token. That also makes the accent consistent: buttons already used orange-400. Measured in Chromium,
main→ this PR:#18181b. This is the most visible change.#f97316→ orange-400#fb923c; inactive labels slate-500 → zinc-400; the tab bar's bottom line slate-200 → zinc-700.rgb(51,65,85), practically unreadable on near-black (a bug that was already there) → white. So "About: no visible change" in the first version of this description was wrong.color-scheme: dark).Unchanged, measured: primary buttons (Save is
rgb(251,146,60)withrgb(24,24,27)text either way), page, card and input surfaces, and the welcome wizard apart from its dropdown. The card background moved to:root.app-dark: at equal specificity PrimeNG's own:rootcard token, injected later, would win and lift the settings card off the page (seen in a screenshot, then fixed). DisabledpInputText/pTextarea/p-selectget zinc-900 with muted text instead of Aura's zinc-700 block. Two new dark-mode E2E tests pin the disabled input (rgb(24,24,27)) and an open dropdown panel (rgb(24,24,27)). The disabled-input test also asserts that.app-darkis on<html>and that PrimeNG's--p-inputtext-disabled-backgroundtoken resolves to its dark value#3f3f46. I checked that it fails once the class is put back on<body>. The roadmap note on #37 that parked "Aura dark tokens not propagated" under #35 is updated. It wasn't a PrimeNG version gap.Not fixed, separate cause: the "No AI API key configured" banner on Pyramidize is still light amber. Its colours are hardcoded in
text-enhancement.component.ts(.api-key-banner,--p-amber-100background), not theme tokens.#29 — Apply competes with Pyramidize
Apply is now
secondarywhile the instruction is empty or only whitespace, and turnsprimaryas soon as the user types one. Three DOM tests cover this (secondary when empty, primary once typed, back to secondary on whitespace). Two of them failed before the fix.Screenshots (Chromium,
ng serve, before → after; kept outside the repo)light: before, the whole page was light (white card, slate sidebar). After, it is identical to dark.bedrock: before, "AWS Bedrock" was selected like a working provider. After, "Choose a provider" with the amber warning under it.bedrock: "Choose a provider", the amber note under it, no key banner, and a dimmed Pyramidize button.<body>vs<html>: identical.Verification
cd frontend && npm test: 15 files, 224 tests passed, 0 failures. Each changed spec was also run alone: shell 16/16, settings 67/67, text-enhancement 39/39, unavailable-provider 5/5. The six issue commits each passed the full unit suite before the follow-up.npm run build: builds. The one warning, text-enhancement component styles over their 4 kB budget, was already there; this PR does not touch those styles.npx playwright test, whole suite: 62 passed, 3 skipped (silent-fix.spec.ts, skipped by design). One earlier run had a single 30s timeout inpyramidize-layout› tab switching, the first test right afterng serverecompiled. That spec then passed 3/3 on its own, and the latest full run was clean. It ran against this branch's ownng serveon port 4310 through an out-of-repo config override, because another worktree's dev server held :4200 and the repo config would have silently reused it locally.git statuswas clean afterwards.go test ./internal/...passed andgo build -o bin/KeyLint .built. No Go files changed, so there is no wire or bindings regeneration.PR #31 (frozen) merge check
git merge-tree --write-tree --name-only origin/feature/shortcut-double-press HEAD: clean, no conflicting files.internal/features/settings/model.gono longer conflicts either, because #31 is now based on 991e0d1. My edits stay out of the lines #31 changes: I appended new specs instead of editing the ones it rewrites, and left the shell'sngOnInit/subscription code alone.Two things to watch when #31 merges:
serveSettings()indark-mode.spec.tsreturns a hand-written settings object. Add the Shortcut flow broken on Windows — no single/double distinction, focus, and routing issues #30 fields (shortcut_mode,shortcut_fix,shortcut_pyramidize,shortcut_double_tap_delay), or the stored-light test renders an independent-mode page with empty recorders. It stays green but tests a less realistic page.ShellComponent.silentFixonly logs errors. After it merges, a user with a saved Bedrock provider who presses the hotkey sees nothing, where today the Fix page shows the Go message. Settings and Pyramidize still explain it.Nits left alone because #31 edits those lines:
settingsChanged$→applyTheme()subscription is now a no-op until Implement light theme with custom styling #25;model.go:65still lists light and system.Review
A second, independent Opus review found no blockers. Its points are addressed: the refine paths are guarded, the colour list is complete, the e2e test now fails on
<body>, the key-field test has a positive assertion, the Pyramidize note points to Settings, and the nits are fixed. The first Opus review ran on the branch. I checked its findings myself and addressed them here: Pyramidize now handles a saved Bedrock provider,versionLabelhandles a commit hash, the About tab uses the same label, #26 got a regression test, and the #28 comment is corrected. Its claim that primary buttons change colour was measured and is wrong.Closes #21, closes #22, closes #24, closes #26, closes #28, closes #29