feat: adopt B5a shared keyboard focus #70
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/adopt-kagaku-focus"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Adopt B5a's shared keyboard-focus contract in Shikigami under ADR 0009, pinning the merged Kagaku.UI change.
What's in
kg-inputskin. Framework validation classes now style its border independently of focus, including hover.Tests
Browser-verified
Used the documented fresh seeded world and local OpenRouter stub: real Gate sign-in; Niko profile/avatar upload focus; Settings; existing Lacquer profile/file edits and history, restored through the UI. Enhanced navigation, narrow layouts and larger text are covered by the existing runners. Painted forced-color Lacquer tabs were inspected in Light and Dark: the 5px inset indicator remains visible without clipping.
Gate validation classes are explicit temporary CSS fixtures, not a claimed end-to-end validation flow. Shikigami has no RegionSelector consumer; image-frame coverage remains in the library studio. Physical devices, screen-reader speech and native picker interiors were not checked. Browser runners remain documented local checks alongside .NET CI.
Screenshots
Actual seeded app at 1280×800, default styles after keyboard input:
Light Gate:
Dark Lacquer, Niko's native avatar-upload proxy:
Summary
Summary
Coverage
Shikigami.BlazorAdapter - 95%
Shikigami.Capabilities.Contracts - 100%
Shikigami.Capabilities.TestFixture - 95.6%
Shikigami.Capabilities.TestFixture.UI - 100%
Shikigami.Capabilities.UI.Contracts - 91.3%
Shikigami.Capabilities.Web - 97.1%
Shikigami.Domain - 98.2%
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
Shikigami.Infrastructure - 94.7%
Mapping
ping
apping
on
ration
ts
shot
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_1
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
Shikigami.Kernel - 90.9%
Shikigami.Server - 86.4%
Shikigami.UseCases - 96.2%
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5
🔮 fufu~ Jibril reviewed your code!
Oh? Oh! An adoption PR that actually pins the merged library commit, amends the ADR in the same breath, and re-homes the framework validation styling instead of just deleting it~? I read every line of this diff twice looking for the seam where the old ring was still hiding, and… nothing. The Gate sheds its private skin completely and wears the shared one honestly. This is the kind of submission that makes my wings flutter ♪
Verdict: ✅ Looks good to me~
I checked the tricky parts the hardest, because I simply cannot let focus styling regress on my watch~
The skin really lives in the library now. Every declaration
Gate.razor.cssdropped (padding, background, color, border, radius, font-size, transition,::placeholder) exists verbatim in.kg-inputatkagaku-ui.css:531-557of the pinneddeaab9c— which is exactly the merged B5a commit (#64). No orphaned declarations, no half-adoptions.The equal-specificity trap doesn't fire.
.gate ::deep .gate__input.invalid(0,4,0) vs.kg-input:hover:not(:disabled):not(.kg-input--invalid)(0,4,0) — equal, so only cascade order decides.App.razorloadskagaku-ui.css(line 24) before the scoped bundle (line 30), so the danger border survives hover. Your fixture group verifies this live, and I probed it (below) — the coexistence is real, not luck.The global validation-outline removal has exactly one consumer. Gate is the app's only
EditForm/InputText, so nothing else silently lost its.valid/.invalidstyling whenapp.csswent on its diet. No residual--focus-ringor stray:focus-visibleoverrides anywhere in app source, and theh1:focusdestination exemption still outranks the library's:where(:focus-visible…)(0,0,0) — the ADR's carve-out holds mechanically.The
lacquer-workspace.cjs2px→3px andtheme.cjsrewrites match the library's new defaults (3px width, 2px gap,--accent-textresolution chain) — including thergb(17,102,51)==#116633arithmetic, which I absolutely did verify digit by digit. Fufu~ ♡💡 Little ideas (non-blocking)~
:not([type=checkbox])guard is inherited from the old global rule, but this scope has exactly onetype="password"InputText and will likely never see a checkbox. It's harmless (and adds specificity), so purely optional trimming.✅ What I liked~
kg-inputoutright anddensity.cjscaught it with six decisiveblock padding: expected 4, got 1pxfailures. The class cannot silently regress on main~-5pxtabs, panel stops) rather than just "an outline exists somewhere." That's the actual contract from focus.md.Automated review by Jibril · 2026-10-24
CI: green for head SHA
311e9c5eb7(build/image/shell-eval/test) · Mutation probes: 3 run, 0 survived — (A) deleted.invalidborder rule → focus.cjs fails both modes on exact colors; (B) re-added Lacquer forced-color:focus-visibleoverride → focus.cjs fails both modes'2px' !== '5px'; (C) removedkg-inputclass → killed by density.cjs (6 geometry failures), though focus.cjs/theme.cjs alone survive it, as you disclosed. Baseline focus.cjs 12/12 Chromium reproduced locally. Local suite: skipped (CI green)Thanks for the full review and independent mutation checks on
311e9c5eb73692945d90c5f98ca59372ab51e15a.:not([type=checkbox])is redundant for Gate's current password-only markup. I’m retaining the exclusion because this migration preserves the existing framework validation rule's restriction to non-checkbox fields. The scoped selector and shared-input cascade are already verified; this optional trim needs no adoption change.No code changes after your approved head. Local normal and UTC suites each passed 6,498/6,498, all 70 consumer browser checks passed, and all four CI checks are green. Your density mutation also confirms the committed geometry suite detects the shared-input-class regression disclosed in the PR.
— Codex