feat: generalize island: true beyond listings - #3851
Merged
Conversation
theletterf
approved these changes
Aug 13, 2026
Extends the island navigation concept from listing-only to any TOC element. Islands render as a ≫ stub in the parent sidebar; clicking swaps the sidebar for a dedicated island nav with a root-first back-link stack. ## New placement options for island: true - Root of docset.yml or any nested toc.yml - Inline beside - toc: <path> in parent docset.yml/toc.yml (OR-ed with the toc.yml's own flag) - Any - toc: entry in config/navigation.yml (assembler-side override; can only enable, never disable) In isolated builds the docset root with island: true is silently inert (no parent → RendersAsIsland() returns false). After SiteNavigation re-parents it the same flag becomes active. ## Design Three old members (IslandListingRoot, IsIslandListing, IslandVisual) on INavigationItem are collapsed into a single bool IsIsland, set via a new IAssignableIslandNavigation interface. The island root of a page is now found by walking the Parent chain (FindIslandRoot()), which makes nesting work for free. RendersAsIsland() = item.IsIsland && item.Parent is not null FindIslandRoot() = nearest ancestor where RendersAsIsland() is true ## Island sidebar The island view model now reuses the same NavigationRenderNode tree the main sidebar uses, plus a root-first back-link stack built by NavigationRenderModel.CreateIsland(). The old hand-rolled IslandNavGroup/IslandNavPage types and duplicated writer code are gone. The NavigationRenderCache key is widened from IRootNavigationItem to INavigationItem so islands share the same cache without the old per- writer ConcurrentDictionary that collided across repos. ## Tests added - IslandNavigationTests (7 tests): isolation-level coverage of all goal cases - IslandSiteNavigationTests (3 tests): assembler-level OR semantics, docset root island after re-parenting, navigation.yml override - NavigationRenderModelTests: IslandNode_ProjectsAsIslandKind, CreateIsland_BuildsBackLinkStack, CreateIsland_ContentHash tests - Configuration Tests: island: true parsing at all four config levels, private-repo stripping survival Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ion.yml
- SiteNavigation implicitly marks every top-level toc entry as an island
so the two parallel 'owns the sidebar' mechanisms (top-level sections +
explicit islands) are now one: FindIslandRoot resolves both.
- Delete _IslandNav.cshtml and IslandNavViewModel; merge their behavior
into NavigationRenderModel + _TocTree.cshtml:
- NavigationRenderModel.Create gains BackLinks computed from the
render root's ancestor walk (nav root suppressed when dropdown is on)
- CreateRootIndex now shows the island's own title row for nested islands
in assembler builds
- Current top-level item resolved by ancestor walk so nested islands
correctly highlight the right dropdown entry
- Both writers simplified to a single GetOrRenderAsync(renderRoot) path;
RenderIslandAsync removed.
- config/navigation.yml: add island: true to 69 reference section entries
(elasticsearch, kibana, cloud, security, observability, ingestion tools,
APM agents x8, elasticsearch-clients x11, ecs-logging x9, EDOT SDKs x8,
beats, logstash, logstash plugins, fleet, machine-learning, search-ui, ecs)
Top-level entries (reference, troubleshoot, …) stay without the marker —
SiteNavigation makes them islands structurally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace heavy border-2 box back-links with compact text links in a subtle grouped section separated from the dropdown by a border-b line - Add <hr class="border-grey-20"> after the island root-index row so the island home heading is visually distinct from the tree content below it Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…chronous Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mpdreamz
force-pushed
the
feature/toc-islands
branch
from
August 13, 2026 13:31
3bc6aa8 to
f50cb1e
Compare
…tsFileSystem FileSystemFactory.ScopeSourceDirectory was removed; callers now construct CheckoutsFileSystem directly, matching the pattern in SiteNavigationTests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 tasks
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.
Summary
Extends
island: truefrom listing-only to any TOC element. Islands render as a≫stub in the parent sidebar; clicking swaps the sidebar for a dedicated island nav with a root-first back-link stack.Stacked on: #3781
cursorful-video-1786623994046.mp4
New placement options for
island: truedocset.ymlor any nestedtoc.yml- toc: <path>in parentdocset.yml/toc.yml(OR-ed with the toc.yml's own flag — can enable, never disable)- toc:entry inconfig/navigation.yml(assembler-side override; same OR semantics)island: trueis silently inert (no parent →RendersAsIsland()returns false)listing: … island: truekeeps working through the same mechanismDesign
Three old members (
IslandListingRoot,IsIslandListing,IslandVisual) onINavigationItemare collapsed into a singlebool IsIsland, set via a newIAssignableIslandNavigationinterface. The island root of a page is found by walking theParentchain:RendersAsIsland()→item.IsIsland && item.Parent is not nullFindIslandRoot()→ nearest ancestor whereRendersAsIsland()is trueThe island view model now reuses the same
NavigationRenderNodetree the main sidebar uses, plus a back-link stack fromNavigationRenderModel.CreateIsland(). The old hand-rolledIslandNavGroup/IslandNavPagetypes and duplicated writer code are gone.NavigationRenderCachekey widened fromIRootNavigationItemtoINavigationItem— the old per-writerConcurrentDictionarythat collided across repos is deleted.Tests added
IslandNavigationTests(7 tests): isolation-level coverage of all goal casesIslandSiteNavigationTests(3 tests): assembler-level OR semantics, docset root island after re-parenting,navigation.ymloverrideNavigationRenderModelTests:IslandNode_ProjectsAsIslandKind,CreateIsland_BuildsBackLinkStack,CreateIsland_ContentHashtestsisland: trueparsing at all four config levels, private-repo stripping survivalTest plan
./build.sh unit-testpasses (4000+ tests)dotnet format --verify-no-changescleanisland: trueto a nestedtoc.yml, confirm≫stub in parent and back-link stack in island sidebarisland: trueto docset root, confirm it renders as the main nav (root exemption)island: trueto anavigation.ymlentry, confirm island behavior with correctpath_prefix-based URLs🤖 Generated with Claude Code