Skip to content
Draft
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
159 commits
Select commit Hold shift + click to select a range
d75da63
Prototype nav-v2: label sections, accordion sidebar, feature flag
theletterf Mar 20, 2026
0f58ae0
Fix accordion: unique IDs per label section
theletterf Mar 20, 2026
407c477
Rewrite navigation-v2.yml with proposed IA (6 top-level labels, neste…
theletterf Mar 20, 2026
76657fb
Labels always expanded with no toggle; only TOC folders toggle
theletterf Mar 20, 2026
3213a5c
Update nav-v2-status.md: verified behaviours, open items, build commands
theletterf Mar 20, 2026
33502f5
Style level-2 labels as small-caps dividers to distinguish from level-1
theletterf Mar 20, 2026
cd3075b
Level-1 labels: small-caps uppercase + ruled separator between groups
theletterf Mar 20, 2026
e0cc136
Improve level-2 label legibility: text-xs at 65% opacity
theletterf Mar 20, 2026
a870f12
Update nav-v2-status.md: document label typography hierarchy
theletterf Mar 20, 2026
41c1ca2
Add PR link and commit workflow to nav-v2-status.md
theletterf Mar 20, 2026
858593e
Add group: placeholder folder type; build Ingest or migrate section
theletterf Mar 20, 2026
027fcd7
Fix YAML quoting for group title containing colon
theletterf Mar 20, 2026
4490cf9
Build full nav skeleton from JSON IA design
theletterf Mar 20, 2026
c808a6e
Fix CI failures: AOT-compatible deserializer and unused import
theletterf Mar 20, 2026
1e81481
Address code review: LINQ refactor and flatten nested if
theletterf Mar 20, 2026
99670dd
Fix Prettier formatting in pages-nav-v2.ts
theletterf Mar 20, 2026
5c7380b
Wire up page: cross-link resolution in V2 nav
theletterf Mar 20, 2026
b7172c6
Fix IDE0370: remove unnecessary null-forgiving operators in SiteNavig…
theletterf Mar 20, 2026
18540af
Expand nav to current page on direct URL load
theletterf Mar 20, 2026
c9160ce
Revert URI-derived path prefix experiment; document limitation in PR
theletterf Mar 20, 2026
e7c8292
Wire Reference section in navigation-v2.yml with real toc and page en…
theletterf Mar 20, 2026
3fa5e19
Wire Troubleshooting section with page: cross-links
theletterf Mar 20, 2026
69d6c32
feat(nav-v2): page-folder group node; migrate section and Reference/T…
theletterf Mar 23, 2026
9942d3a
fix(nav-v2): check group: before page: in YAML parser to support page…
theletterf Mar 23, 2026
0b4bb8d
docs: update nav-v2-status.md to reflect current prototype state
theletterf Mar 24, 2026
15b3bef
feat(nav-v2): generate stub pages for placeholder nav items
theletterf Mar 24, 2026
eea7a08
docs(nav-v2): update status — placeholder items now generate stub pages
theletterf Mar 24, 2026
db10774
fix(nav-v2): use absolute URL path prefix for placeholder page static…
theletterf Mar 24, 2026
6b953fd
feat(nav-v2): wire Explore/Visualize, Share/Alert/Automate, and AI/ML…
florent-leborgne Mar 24, 2026
8c2d0d8
feat(nav-v2): wire Solutions and project types section with full dept…
florent-leborgne Mar 24, 2026
8c1645c
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf Mar 24, 2026
0278198
Merge branch 'nav-v2' of github.com:elastic/docs-builder into nav-v2
theletterf Mar 24, 2026
6d747b1
feat(nav-v2): restructure AI and machine learning section (#2965)
florent-leborgne Mar 25, 2026
b00e1db
refactor(nav-v2): promote Ingest tools to L1 under Ingest and manage …
theletterf Mar 25, 2026
216ec9c
Merge branch 'main' into nav-v2
florent-leborgne Mar 27, 2026
c34c969
feat(nav-v2): promote Workflows to its own top-level label (#2976)
florent-leborgne Mar 27, 2026
afd4977
feat(nav-v2): rename section to "Track and respond"
florent-leborgne Mar 27, 2026
defdce1
feat(nav-v2): sidebar tree, styles, and folder UX
itsalexcm Mar 30, 2026
3aa6eee
feat(nav-search): polish in-sidebar jump-to-page component
itsalexcm Mar 30, 2026
e60bd4b
style(toc): align in-page and API TOC link padding with sidebar
itsalexcm Mar 30, 2026
c08b6e3
Merge branch 'main' into nav-v2
itsalexcm Mar 30, 2026
1f3f702
style: fix Prettier formatting in pages-nav-v2.ts and styles.css
theletterf Mar 30, 2026
313138a
Wire Elasticsearch fundamentals and Ingest data storage nav sections …
theletterf Mar 31, 2026
6a667dc
Wire Ingest logs, APM agents, and clean up nav labels (#3004)
theletterf Mar 31, 2026
369e518
Merge branch 'main' into nav-v2
theletterf Mar 31, 2026
beefc87
feat(nav-v2): rename Agentless group, add integrations reference page
theletterf Mar 31, 2026
c4cbed6
fix(nav-v2): generate stub pages for placeholders nested inside real …
theletterf Mar 31, 2026
92d4829
feat(nav-v2): single-line nav labels with ellipsis and truncated-only…
itsalexcm Mar 30, 2026
6cad4aa
feat(nav-v2): ancestor folder highlight and expand/collapse behaviour
itsalexcm Mar 31, 2026
f1c3e2a
style(nav-v2): section labels, tree spacing, and active row chrome
itsalexcm Mar 31, 2026
e4171a2
feat(nav-v2): move perform-index-operations per docs-content#5279
theletterf Apr 1, 2026
65579de
Merge branch 'main' into nav-v2
theletterf Apr 1, 2026
29ba44f
style: fix Prettier formatting in pages-nav-v2.ts and styles.css
theletterf Apr 1, 2026
d828f09
fix(nav-v2): ancestor folder ink and deepest current link
itsalexcm Apr 1, 2026
d4bdd09
style: fix Prettier formatting in pages-nav-v2.ts and styles.css
theletterf Apr 2, 2026
a6399e3
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf Apr 2, 2026
b8e3e80
fix: resolve fs → readFs after merge with main
theletterf Apr 2, 2026
0f21dd1
Update Azure EDOT CF version (#3022)
theletterf Apr 2, 2026
bebeab4
Enable AOT/trim analyzers on library projects and skip AOT publish on…
reakaleek Apr 2, 2026
11895b4
HTML: Omit version meta tags for versionless pages (#3020)
reakaleek Apr 2, 2026
a88ea32
Layout: Adapt to static elastic-nav by making secondary nav sticky (#…
reakaleek Apr 2, 2026
cf5e8e8
[DOCS] Add profile example for --all bundle, fix path for changelog s…
lcawl Apr 2, 2026
a798bb0
Deploy: separate read/write scoped filesystems in IncrementalDeploySe…
Mpdreamz Apr 2, 2026
c69e47f
Add skip-labels to evaluate-pr's output (#3013)
cotti Apr 2, 2026
e49938a
fix(markdown): use placeholder rule when detection rule TOML cannot b…
itsalexcm Apr 7, 2026
822bba0
fix(site): use #pages-nav for cross-group HTMX OOB and omit preload w…
itsalexcm Apr 7, 2026
287adac
feat(site): enable navigation V2 shell for isolated documentation serve
itsalexcm Apr 7, 2026
5debd27
fix(docs-builder): serve dev Site _static for assembler serve; bust s…
itsalexcm Apr 7, 2026
a521e8b
feat(site): refine navigation V2 sidebar spacing, typography, and hov…
itsalexcm Apr 7, 2026
94ec3bf
Merge branch 'main' into nav-v2
itsalexcm Apr 7, 2026
4130966
Wire Install, deploy, and administer nav section (#3049)
theletterf Apr 8, 2026
1dfdeb1
Propose IA changes to nav-v2 (#3024)
alexandra5000 Apr 15, 2026
b767e2b
Merge branch 'main' into nav-v2
theletterf Apr 15, 2026
46d2f6e
fix(nav-v2): use resolvable EDOT SDK navigation links
theletterf Apr 15, 2026
2eaa6f4
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf Apr 16, 2026
21e88aa
feat(nav-v2): add section: item type for independent nav islands
theletterf Apr 16, 2026
071f456
feat(nav-v2): migrate top-level labels to section: items
theletterf Apr 16, 2026
3a46434
feat(nav-v2): wrap all content in Docs section; add Release notes, Tr…
theletterf Apr 16, 2026
ef333f8
fix(nav-v2): compact left-aligned top bar, section root highlight, au…
theletterf Apr 16, 2026
23f27b3
feat(nav-v2): add Extension points and Account isolated sections; rem…
theletterf Apr 16, 2026
7fed2c5
fix: correct import ordering in PlaceholderPageWriter
theletterf Apr 16, 2026
cdabed1
feat(nav-v2): support absolute URLs for section tabs; add API reference
theletterf Apr 16, 2026
0557264
feat(nav-v2): add island: item type for intra-section nav islands
theletterf Apr 16, 2026
1e4da5a
feat(nav-v2): convert Account and preferences to island under Docs
theletterf Apr 22, 2026
710743e
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf Apr 22, 2026
ca03a50
Merge branch 'nav-v2' into nav-v2-sections
theletterf Apr 22, 2026
a0b98a3
fix(nav-v2): register island root URL in island lookup
theletterf Apr 22, 2026
b813024
fix(nav-v2): use toc root identity for island lookup instead of URL m…
theletterf Apr 22, 2026
e02fc81
fix(nav-v2): scope top-level padding to label sections only
theletterf Apr 22, 2026
6803630
style: fix Prettier formatting in styles.css
theletterf Apr 22, 2026
fdb278a
fix(nav-v2): back arrow swaps full page including sidebar
theletterf Apr 22, 2026
2d20e27
fix(nav-v2): open external section links in new tab with ↗ indicator
theletterf Apr 23, 2026
c4c5bab
feat(nav-v2): rename Docs to Guides, API reference to APIs
theletterf Apr 23, 2026
13a6695
feat(nav-v2): reorder tabs by task flow
theletterf Apr 23, 2026
4e3bde9
fix(nav-v2): shorten long nav label to 'Query languages and APIs'
theletterf Apr 23, 2026
3df00ef
Merge branch 'main' into nav-v2
shainaraskas Apr 29, 2026
194a57b
Install deploy and administer refinement (#3203)
shainaraskas Apr 29, 2026
41f26a5
Merge branch 'main' into nav-v2
theletterf Apr 30, 2026
4f247a8
Merge branch 'main' into nav-v2
florent-leborgne May 1, 2026
f569f7e
Merge nav-v2 into nav-v2-sections, reconciling navigation structure
theletterf May 4, 2026
79299cb
fix(nav): resolve V2 page: entries into NavigationDocumentationFileLo…
theletterf May 4, 2026
676566c
fix: remove hub-pages-specific config accidentally committed to nav-v2
theletterf May 4, 2026
4cc9e37
Merge remote-tracking branch 'origin/nav-v2' into nav-v2-sections
theletterf May 4, 2026
6a60978
fix(site): classify Nav V2 label lists as subsection vs folder groups
itsalexcm May 4, 2026
c08b2b2
feat(site): Nav V2 search and client navigation behavior
itsalexcm May 4, 2026
c4705ec
fix(site): Nav V2 sidebar and layout styles
itsalexcm May 4, 2026
2158dec
fix(layout): in-page TOC and API TOC layout
itsalexcm May 4, 2026
0784279
chore(svg): add transition_bottom_in and transition_bottom_out icons
itsalexcm May 4, 2026
8c7d3fa
fix(nav): fix CS8120 unreachable case and IDE0058 unused TryAdd returns
theletterf May 4, 2026
52840c4
Merge nav-v2 into nav-v2-sections
theletterf May 4, 2026
ce968d5
style(site): apply Prettier to Nav V2 assets
itsalexcm May 4, 2026
6dde442
style: fix Prettier formatting in pages-nav-v2.ts and styles.css
theletterf May 4, 2026
ef8b5a6
Update top navigation order
theletterf May 7, 2026
3b6428b
Wire most of nav v1 content into nav v2 (#3274)
theletterf May 8, 2026
d842694
fix(nav-v2): refine folder click activation and parent state
itsalexcm May 8, 2026
f035fad
style(nav-v2): tune sidebar spacing and active/toc colors
itsalexcm May 8, 2026
5defb05
style(toc): use body font and regular utility link weight
itsalexcm May 8, 2026
149012a
Merge remote-tracking branch 'origin/main' into nav-v2
itsalexcm May 8, 2026
3a208ff
Merge remote-tracking branch 'origin/nav-v2' into nav-v2-sections
itsalexcm May 8, 2026
5cbebb3
fix(nav-v2): gate first-row top padding override to search state
itsalexcm May 8, 2026
d23fa4c
Tune Nav V2 sidebar label spacing and typography
itsalexcm May 11, 2026
180d2f6
Fix Nav V2 first-row top padding when search is absent
itsalexcm May 11, 2026
b573d6f
Fix isolated preview header stacking under Nav V2 chrome
itsalexcm May 12, 2026
3cec0fc
fix(nav-v2): restore section/island structure lost in merge 3a208ffb4
theletterf May 12, 2026
500e5e6
Fix isolated preview header visibility with fixed chrome + flow spacer
itsalexcm May 12, 2026
13ed1dd
fix(nav-v2): resolve islands via parent chain for nested-toc islands
theletterf May 12, 2026
dba1717
feat(nav-v2): wire Account and preferences as island under Deployment…
theletterf May 12, 2026
a346496
Guard deployment header links when githubRepository is unset
itsalexcm May 12, 2026
cbeb5e8
fix(nav-v2): swap full chrome when entering an island from parent sid…
theletterf May 12, 2026
a4885aa
fix(nav-v2): guard deployment header links
theletterf May 18, 2026
9fd823f
fix(nav-v2): format deployment header guard
theletterf May 18, 2026
baeff02
Merge branch 'nav-v2' into nav-v2-sections
theletterf May 18, 2026
10fdd8e
Merge branch 'main' into nav-v2
theletterf May 18, 2026
3e34bef
fix(nav-v2): satisfy collection initialization analyzers
theletterf May 18, 2026
e181a2e
Merge nav-v2 into nav-v2-sections
theletterf May 18, 2026
3b915f6
chore(nav-v2): spruce up navigation labels
theletterf May 18, 2026
c1f2aeb
chore(nav-v2): spruce up navigation labels
theletterf May 18, 2026
48193bd
Merge nav-v2 into nav-v2-sections
theletterf May 18, 2026
fda067f
fix(nav-v2): stabilize content container layout
theletterf May 18, 2026
37178e0
fix(nav-v2): stabilize content container layout
theletterf May 18, 2026
2ff9852
chore(nav-v2): expand Reference section to explicit children
theletterf May 18, 2026
a2c1013
chore(nav-v2): expand Reference section to explicit children
theletterf May 18, 2026
3a14490
fix(nav-v2): fix island back arrow and collapse children in parent nav
theletterf May 18, 2026
a84001d
fix(nav-v2): merge main layout changes with jumpiness fix
theletterf May 18, 2026
52a2874
fix(nav-v2): merge main layout changes with jumpiness fix
theletterf May 18, 2026
ec62146
fix(nav-v2): resolve nav-v2-sections merge conflict in navigation-v2.yml
theletterf May 18, 2026
dfa1629
Merge branch 'main' into nav-v2
theletterf May 18, 2026
38d9c83
fix(nav-v2): resolve section roots and island back links
theletterf May 18, 2026
5e93607
Remove duplicate query languages nav group
theletterf May 18, 2026
2889d66
Limit root nav auto-expansion
theletterf May 18, 2026
3e8c488
Keep nav-v2 focused on the active section (#3354)
theletterf May 19, 2026
493cc37
Merge main into nav-v2
theletterf May 19, 2026
608a295
Fix inline code callouts with links
theletterf May 19, 2026
f32801f
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf May 20, 2026
e54dac5
Support default-expanded Nav V2 groups
theletterf May 20, 2026
3db1c93
Fix mobile docs layout overflow
theletterf May 20, 2026
2d60256
Focus selected duplicate Nav V2 entries
theletterf May 20, 2026
b76ae01
Format Nav V2 duplicate focus script
theletterf May 20, 2026
2c46a3c
Honor same-page duplicate folder selection
theletterf May 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/assembler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ environments:
path_prefix: docs
feature_flags:
SEARCH_OR_ASK_AI: true
NAV_V2: true
preview:
uri: https://docs-v3-preview.elastic.dev
path_prefix: ${ASSEMBLER_PREVIEW_PATH_PREFIX}
Expand All @@ -46,6 +47,7 @@ environments:
enabled: false
feature_flags:
SEARCH_OR_ASK_AI: true
NAV_V2: true

shared_configuration:
stack: &stack
Expand Down
96 changes: 96 additions & 0 deletions config/navigation-v2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
nav:
# ─────────────────────────────────────────────────────────────
# Elasticsearch fundamentals
# Content: get-started + conceptual/architecture pages that
# currently live in the ES reference but belong here editorially.
# ─────────────────────────────────────────────────────────────
- label: Elasticsearch fundamentals
children:
- toc: get-started
- title: What is Elasticsearch?
- title: Core concepts (indices, shards, mappings)
- title: Architecture and scalability

# ─────────────────────────────────────────────────────────────
# Install, deploy, and administer
# Content: deploy-manage (Elastic Cloud, ECE, ECK, self-managed,
# security, monitoring, upgrade, tools) + cloud-account.
# ─────────────────────────────────────────────────────────────
- label: Install, deploy, and administer
children:
- toc: deploy-manage
- toc: cloud-account

# ─────────────────────────────────────────────────────────────
# The Elasticsearch Platform
# Container label with three nested sub-sections.
# All real content currently lives in two monolithic toc roots
# (manage-data, explore-analyze); placeholders mark sections
# that will need dedicated toc roots when the split happens.
# ─────────────────────────────────────────────────────────────
- label: The Elasticsearch Platform
children:

# ── Ingest and manage data ───────────────────────────────
# Desired level-1 sections (future toc splits of manage-data):
# • Ingest or migrate your data (manage-data/ingest + migrate)
# • Store and manage data (manage-data/data-store)
# • Manage data lifecycle (manage-data/lifecycle)
# • Time-series data (manage-data/use-case-timeseries)
# For now, the entire manage-data toc root maps here.
- label: Ingest and manage data
children:
- toc: manage-data

# ── Search, visualize, and analyze ───────────────────────
# Desired level-1 sections (subset of explore-analyze):
# • Query and filter (query-filter, discover)
# • Dashboards and visualizations (dashboards, visualize)
# • Alerting and cases (alerting, cases)
# • Transforms and cross-cluster (transforms, cross-cluster-search)
# • Reports and workflows (report-and-share, workflows)
# explore-analyze also contains AI/ML — those belong below.
- label: Search, visualize, and analyze
children:
- toc: explore-analyze

# ── AI and machine learning ───────────────────────────────
# Desired level-1 sections (future toc splits of explore-analyze):
# • AI features and Agent Builder (explore-analyze/ai-features)
# • Elastic Inference Service (explore-analyze/elastic-inference)
# • Machine learning: anomaly detection, NLP, DFA
# (explore-analyze/machine-learning)
# Shown as placeholders until content gets its own toc root.
- label: AI and machine learning
children:
- title: AI features and Agent Builder
- title: Elastic Inference Service
- title: Machine learning

# ─────────────────────────────────────────────────────────────
# Solutions and project types
# Content: solutions (search, observability, security,
# elasticsearch-solution-project).
# ─────────────────────────────────────────────────────────────
- label: Solutions and project types
children:
- toc: solutions

# ─────────────────────────────────────────────────────────────
# Reference
# Content: Elasticsearch REST API + config reference,
# Kibana reference, and docs-content reference sub-tocs
# (clients, ingestion tools, fleet, APM, ML reference, glossary).
# ─────────────────────────────────────────────────────────────
- label: Reference
expanded: true
children:
- toc: elasticsearch://reference/elasticsearch
- toc: kibana://reference

# ─────────────────────────────────────────────────────────────
# Troubleshooting
# ─────────────────────────────────────────────────────────────
- label: Troubleshooting
children:
- toc: troubleshoot
240 changes: 240 additions & 0 deletions nav-v2-status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
# nav-v2 prototype — status & plan

Branch: `nav-v2`
Date: 2026-03-20

---

## Goal

Prototype a new information architecture sidebar without touching production nav.
Gated behind the `nav-v2` feature flag (enabled automatically in `dev` and `preview` environments).

The V2 nav:
- Shows label sections (non-clickable headings) instead of bare TOC roots
- Renders the **full tree on every page** (not per-section like V1)
- Has accordion collapse (open one top-level section → others collapse)
- No auto-expand to current page (progressive disclosure)
- Disabled placeholder links styled with `cursor-not-allowed`

Content is built at **the same URL paths as V1** — the V2 flag changes only the sidebar layout.

---

## Current state: working ✓

`./build.sh build` passes (lint + compile + all unit tests).
Accordion expand/collapse verified in-browser with Playwright.

### Bugs fixed

| # | Bug | Fix |
|---|-----|-----|
| 1 | Feature flag never fired — `assembler.yml` sets `NAV_V2` (underscore) but `FeatureFlags(dict)` stores keys as-is; `IsEnabled("nav-v2")` never matched | Use `featureFlags.Set(key, value)` in `AssemblerBuildService` to normalise keys before lookup |
| 2 | Content built at `/docs/l2/get-started/` instead of `/docs/get-started/` — `SiteNavigationV2` was synthesising a new nav file with `l{depth+1}/` prefixes | Pass the original `SiteNavigationFile` to the base constructor; V2 only changes sidebar rendering |
| 3 | All label checkboxes shared the same ID (`v2-label-1ACA80E8`) — `ShortId.Create("label")` is a deterministic SHA256 hash; every `<label for="...">` targeted the same first checkbox, so only "Get Started" could ever open | `LabelNavigationNode`: `ShortId.Create("label", label)` — include the label text in the hash |

---

## Files changed

### New files
| File | Purpose |
|------|---------|
| `config/navigation-v2.yml` | Skeleton: 8 label sections matching current top-level nav |
| `src/Elastic.Documentation.Configuration/Toc/NavigationV2File.cs` | YAML model (`LabelNavV2Item`, `TocNavV2Item`, `PageNavV2Item`) + `NavV2FileYamlConverter` |
| `src/Elastic.Documentation.Navigation/V2/LabelNavigationNode.cs` | Non-clickable section heading; implements `INodeNavigationItem` |
| `src/Elastic.Documentation.Navigation/V2/PlaceholderNavigationLeaf.cs` | Disabled placeholder link; implements `ILeafNavigationItem` |
| `src/Elastic.Documentation.Navigation/V2/SiteNavigationV2.cs` | Extends `SiteNavigation`; passes original nav file to base; builds V2 label tree from `navigation-v2.yml` |
| `src/Elastic.Documentation.Site/Navigation/_TocTreeNavV2.cshtml` | V2 Razor partial: labels as `<span>`, placeholders as `aria-disabled`, folders/leaves same as V1 |
| `src/Elastic.Documentation.Site/Assets/pages-nav-v2.ts` | Accordion collapse + current-page marking (no auto-expand) |

### Modified files
| File | Change |
|------|--------|
| `config/assembler.yml` | `NAV_V2: true` under `dev:` and `preview:` feature_flags |
| `src/.../Builder/FeatureFlags.cs` | Added `NavV2Enabled` property |
| `src/.../ConfigurationFileProvider.cs` | `NavV2Deserializer` (reflection-based); optional `NavigationV2File` property; `TryCreateTemporaryConfigurationFile` helper |
| `src/.../NavigationViewModel.cs` | Added `IsNavV2` bool (default `false`) |
| `src/.../Navigation/_TocTree.cshtml` | Branches on `IsNavV2`; wraps V2 tree in `<nav data-nav-v2>` |
| `src/.../AssemblerBuildService.cs` | Normalises feature flag keys; loads `navigation-v2.yml` + instantiates `SiteNavigationV2` when flag on; skips path-prefix duplicate validation for V2 |
| `src/.../GlobalNavigationHtmlWriter.cs` | Detects `SiteNavigationV2`; always returns full V2 nav HTML (cached once as `"nav-v2"`); `SiteNavigationV2Wrapper` exposes `V2NavigationItems` as the tree root |
| `src/.../main.ts` | On `htmx:load`, calls `initNavV2(nav)` when `[data-nav-v2]` is present; otherwise falls back to `initNav()` |

---

## How the V2 nav renders on every page

```
HtmlWriter.RenderLayout (called per page)
→ NavigationHtmlWriter.RenderNavigation(root, navigationItem)
→ GlobalNavigationHtmlWriter detects `globalNavigation is SiteNavigationV2`
→ RenderV2Navigation: renders full V2 tree once, cached as "nav-v2"
→ returns same HTML for every page
```

`_TocTree.cshtml` checks `Model.IsNavV2`:
- **true** → `<nav data-nav-v2><ul id="nav-tree"> ... _TocTreeNavV2 ... </ul></nav>`
- **false** → existing V1 `<ul id="nav-tree"> ... _TocTreeNav ... </ul>`

`main.ts` on `htmx:load`:
- `[data-nav-v2]` present → `initNavV2(nav)` (accordion + current-page marker, no auto-expand)
- absent → `initNav()` (V1 behaviour unchanged)

---

## Verified behaviours ✓

- Label sections visible as non-clickable headings, always expanded, no toggle
- Nested labels (e.g. "Ingest and manage data" inside "The Elasticsearch Platform") also always expanded, no toggle
- `title:` placeholder items render as disabled grey links
- TOC folder nodes within labels still have their own expand/collapse toggle
- Accordion: opening one TOC folder collapses its siblings at the same level

### Label typography (visual hierarchy)

| Level | Style | Example |
|-------|-------|---------|
| Level-1 (top-level) | `text-xs font-semibold uppercase tracking-widest text-ink` + `border-t border-grey-20` separator above | `ELASTICSEARCH FUNDAMENTALS` |
| Level-2 (nested) | `text-xs font-semibold uppercase tracking-widest text-ink/65` | `INGEST AND MANAGE DATA` |
| TOC folder/link | sentence-case, normal weight, clickable | `Deploy and manage` |

Both label levels use the same small-caps treatment; level-1 is distinguished by full ink colour and a thin horizontal rule above each group. Level-2 is 65% opacity to read as subordinate without being illegible.

---

## Proposed new information architecture

The team provided a JSON-defined IA to translate into `navigation-v2.yml`. Below is the structure and how it maps to existing V1 content paths.

### Top-level labels

| Label | Status | V1 content source |
|-------|--------|-------------------|
| Elasticsearch fundamentals | Partial — needs decomposition | `get-started` + ES core concepts (possibly from `elasticsearch://reference`) |
| Install, deploy, and administer | Mostly maps cleanly | `deploy-manage` (deploy, security, users-roles, monitor, upgrade, etc.) |
| The Elasticsearch Platform | Container label — has nested labels (see below) | — |
| Solutions and project types | Maps cleanly | `solutions` (search, observability, security, elasticsearch-solution-project) |
| Reference and resources | Maps cleanly | `elasticsearch://reference/elasticsearch` + `kibana://reference` |
| Troubleshooting | Maps cleanly | `troubleshoot` |

**ISLAND items (omit from nav):**
- Extension points
- Account & preferences

### Nested labels inside "The Elasticsearch Platform"

These are sub-labels grouping level-1 sections, not clickable headings:

```
The Elasticsearch Platform
├── [nested label] Ingest and manage data
│ ├── Ingest or migrate: bring your data into Elasticsearch → manage-data/ingest + manage-data/migrate
│ ├── Store and manage data → manage-data/data-store
│ ├── Manage data lifecycle → manage-data/lifecycle
│ └── (time series use case) → manage-data/use-case-timeseries
├── [nested label] Search, visualize, and do stuff
│ ├── Query and filter → explore-analyze/query-filter
│ ├── Discover → explore-analyze/discover
│ ├── Dashboards → explore-analyze/dashboards
│ ├── Visualize → explore-analyze/visualize
│ ├── Alerting → explore-analyze/alerting
│ ├── Cases → explore-analyze/cases
│ ├── Transforms → explore-analyze/transforms
│ ├── Cross-cluster search → explore-analyze/cross-cluster-search
│ └── Report and share → explore-analyze/report-and-share
└── [nested label] AI and machine learning
├── AI features (Agent Builder, AI Assistant) → explore-analyze/ai-features
├── Elastic Inference → explore-analyze/elastic-inference
├── Machine learning (anomaly detection, NLP, DFA) → explore-analyze/machine-learning
└── Scripting → explore-analyze/scripting
```

### Content mapping details

**`manage-data` sub-trees** (single TOC root, decomposed into level-1 sections):
- `manage-data/ingest` — ingest pipelines, agentless, tools, sample data, transform/enrich
- `manage-data/migrate` — migration guides
- `manage-data/data-store` — aliases, data streams, index basics, mapping, templates, text analysis
- `manage-data/lifecycle` — ILM, data tiers, rollup, curator
- `manage-data/use-case-use-elasticsearch-to-manage-time-series-data` — time series use case

**`explore-analyze` sub-trees** (single TOC root, split across two nested labels):
- AI & ML group: `ai-features`, `elastic-inference`, `machine-learning`, `scripting`
- Search/Visualize group: `query-filter`, `discover`, `dashboards`, `visualize`, `alerting`, `cases`, `transforms`, `cross-cluster-search`, `report-and-share`, `find-and-organize`, `workflows`
- Note: `geospatial-analysis` and `numeral-formatting` need placement decision

**`deploy-manage` sub-trees** (single TOC root, stays under "Install, deploy, and administer"):
- `deploy` (Elastic Cloud, ECE, ECK, self-managed)
- `security`, `users-roles`, `manage-spaces`
- `monitor`, `autoscaling`, `production-guidance`
- `upgrade`, `uninstall`
- `distributed-architecture`, `remote-clusters`, `tools`

**`solutions` sub-trees** (stays together under "Solutions and project types"):
- `search` (full-text, AI/semantic, hybrid, RAG, ranking)
- `observability`
- `security`
- `elasticsearch-solution-project`

### Key challenges for the YAML translation

1. **`manage-data` is one TOC root** — can't reference `manage-data/ingest` as a `toc:` directly; only `manage-data` is a valid TOC root. The new IA wants to surface sub-sections as top-level nav items. Approaches:
- Use `manage-data` as a single `toc:` under the label, accepting the flattened tree — simple but doesn't match the IA
- Create new separate TOC roots for each sub-tree — requires changes to `docs-content` repo
- Use `title:` placeholders for sections not yet wired up

2. **`explore-analyze` is one TOC root** — same issue; splitting into "AI/ML" vs "Search/Visualize" groups requires either new TOC roots or navigating the tree via sub-path `toc:` references (if the assembler supports it)

3. **`get-started` scope** — "Elasticsearch fundamentals" is broader than the current `get-started` TOC; it likely needs content from `elasticsearch://reference` (concepts, architecture, etc.)

### Pragmatic V2 YAML approach

Given the above constraints, the most viable near-term approach:

- Keep **single `toc:` references** pointing at existing roots
- Use **nested labels** to visually group them as intended by the IA
- Add **`title:` placeholders** for sections that don't yet have a dedicated TOC root
- This lets the prototype render the intended IA structure immediately, with real links where content exists

---

## Open items / next steps

1. ~~**Rewrite `navigation-v2.yml`**~~ ✓ Done — 6 top-level labels, nested labels inside "The Elasticsearch Platform", `title:` placeholders for the AI/ML sub-sections that don't yet have their own toc roots.

2. ~~**Nested label support**~~ ✓ Done — labels nest at arbitrary depth; YAML parser, builder, and Razor partial all recurse. `LabelNavigationNode.ExpandedByDefault` is now unused (labels are unconditionally expanded); can be removed in a cleanup pass.

3. **Current-page highlighting** — `pages-nav-v2.ts` marks the active link; verify it highlights the right item without auto-expanding parents.

4. **Placeholder / page crosslinks** — `page:` items in `navigation-v2.yml` currently render as disabled placeholders (prototype shortcut). Wire up real cross-link resolution if needed.

5. **`l{depth+1}/` parallel paths** — dropped for now (content stays at V1 paths). Could be re-added later if the team wants to preview a new IA at separate URLs while keeping V1 live.

---

## PR and commit workflow

**PR:** https://github.com/elastic/docs-builder/pull/2927 (draft)

After every commit:
1. `git push` — keep remote branch in sync
2. Update the PR description if the commit meaningfully changes scope

## How to test locally

```bash
# from docs-builder root
dotnet run --no-restore --project src/tooling/docs-builder -- assembler build
dotnet run --project src/tooling/docs-builder -- assembler serve
```

Open `http://localhost:4000/docs/get-started/` — sidebar should show label sections
always expanded, with nested labels visible immediately.

To disable V2 nav temporarily without changing code:
```bash
FEATURE_NAV_V2=false dotnet run --no-restore --project src/tooling/docs-builder -- assembler build
```
Loading
Loading