Skip to content
Draft
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
89 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
710743e
Merge remote-tracking branch 'origin/main' into nav-v2
theletterf Apr 22, 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
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
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
ce968d5
style(site): apply Prettier to Nav V2 assets
itsalexcm May 4, 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