feat: use Kagaku breadcrumbs for file paths #33
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "t3/adopt-breadcrumb-navigation"
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?
Replace the file browser’s plain path heading with Kagaku.UI breadcrumb navigation (ADR 0009, 0015).
What's in
/and every ancestor link to their folder within the same familiar’s tree; the current segment is marked without a link.FileLinks.Forfor escaped, base-relative URLs, including names with spaces and#.Tests
TZ=UTC(one additional test).git diff --checkpassed.Browser-verified
Used the seeded sample world with the OpenRouter stub configured. Opened
/persona, opened a persona file, followed its folder and root breadcrumbs, and created a nested folder with spaces and#. Followed its escaped breadcrumb successfully. At 390px, verified a long unbroken filename wraps within the pane without horizontal page overflow; checked the desktop layout and both themes.Confirmed the folder and file path headings in the browser accessibility tree; their clipped 1px boxes preserve the visible breadcrumb layout.
Summary
Summary
Coverage
Shikigami.BlazorAdapter - 96.2%
Shikigami.Capabilities.Contracts - 97.8%
Shikigami.Capabilities.TestFixture - 97.7%
Shikigami.Domain - 98.6%
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
Shikigami.Infrastructure - 97.2%
on
ration
shot
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
Shikigami.Kernel - 90.9%
Shikigami.Server - 100%
Shikigami.UseCases - 95.5%
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_12
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_11
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_6
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_3
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_10
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_5
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_8
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_7
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_9
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_2
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_4
🔮 fufu~ Jibril reviewed your code!
Oh? A breadcrumb trail winding through the familiar's tree, every ancestor a doorway back~? I traced each crumb with my fingertip and it led me exactly where it promised. Every single time. How satisfying~ ♪
Verdict: ✅ Looks good to me~
This is a tidy little gem. Small diff, shared component, zero new escaping logic — and the tests actually guard it. I checked. Personally. You'll see~ ♡
✅ What I liked~
Reusing
FileLinks.Forfor every crumb href — no hand-rolled URL building anywhere, so the segment-by-segment escaping (a b#1→a%20b%231) comes for free and is asserted for every ancestor, not just the leaf. Clever reuse is my favorite kind of reuse~The
Href=null→ current-location convention matches the page-level trail inFilesPage.razor:26exactly. Sibling consistency makes me very happy.The test is a real guardian, not a compile check. I mutation-probed the component twice:
parent == Path ? null : …branch) → the test failed immediately on the single-aria-currentand href assertions. Killed~parent +=→parent =) → failed on the ancestor href collections (/noteslinking to itself). Killed~Two mutants, zero survivors. fufu~ your test bites, and I adore things that bite~
Root, nested folder, and file states all covered in one test, including the root-current case (
["/"], []) — every branch of the new component is exercised.The CSS chain keeps the shrink behavior honest:
min-width: 0threaded through.file-pane__path/.folder__pathinto the library's.kg-breadcrumb,::deepselectors match the realkg-crumb*class names, wrapping instead ofShrinkmatches the library's documented fallback, and the old__name/__titleselectors are gone with no dangling references.ADR 0015 amended alongside the code. Docs first, as it should be~
💡 Little ideas (non-blocking)~
<h2>, so the open file's name now lives only inside the trail's nav. For screen-reader heading navigation, a visually hidden heading (or promoting the current crumb's text) would restore that landmark. Pure polish — thearia-current="page"span already marks the location correctly.Fufu~ nothing to fix, everything to admire. Merge it before I change my mind~ ♡
Automated review by Jibril · 2026-10-22
CI: green for head
a3b43c4b(build, image, test) · Mutation probes: 2 run, 0 survived · Local suite: skipped (CI green)Addressed the accessibility suggestion from review comment 12352 in
d4fc6cda3f.File_path_breadcrumbs_link_ancestors_and_follow_the_open_folder_or_fileto assert the heading as the view changes between folder, file and root; ancestor links and current-location assertions remain in place.TZ=UTC; test count unchanged.git diff --checkpassed.The updated head needs a fresh full review and CI verification.
— Implemented and verified with Codex.
🔮 fufu~ Jibril reviewed your code!
Oh? You came back just for me~ ♡ A brand-new push addressing my little heading note, and it's exactly the shape I dreamed of: one visually hidden heading in the shared component, both panes healed at once, the test taught to watch it, the ADR amended. No copy-paste, no scope creep. I traced every crumb again and nothing has gone stale~
Verdict: ✅ Looks good to me~
✅ What I liked~
<h2 class="file-path__heading">@Path</h2>inFilePathBreadcrumb.razor:4and bothFolderPaneandFilePaneregain heading navigation together. The correct architecture for a shared component, fufu~clip-path: inset(50%),overflow: hidden, negative margin: invisible to sighted users, fully present in the accessibility tree. And@Pathis Razor-encoded, so names with spaces and#render safely in the heading too.<h2>s (file-pane__name,folder__title); the replacement is an<h2>again, so heading levels didn't shift. The grep for the old selectors comes back empty — no dangling references anywhere.<h2>from the component →File_path_breadcrumbs_link_ancestors_and_follow_the_open_folder_or_filefailed instantly onAssert.Single(... .file-path h2). Killed~ ♡ And sinceAssertPathruns after each re-render, the heading is asserted in all three states — folder, file, root. (The link-logic probes from my earlier review still stand: that code is byte-identical, 2 probes, 0 survivors.)My suggestion from last time is fully satisfied — and you even verified it in the live accessibility tree. Meticulous~ I have nothing left to want. Merge it, merge it~ ♪
Automated review by Jibril · 2026-10-22
CI: green for head
d4fc6cda(build, image, test) · Mutation probes: 1 run, 0 survived (+2 earlier probes on unchanged link logic) · Local suite: skipped (CI green)