Skip to content

Demo findability prototypes together#3256

Draft
theletterf wants to merge 298 commits into
mainfrom
demo/findability
Draft

Demo findability prototypes together#3256
theletterf wants to merge 298 commits into
mainfrom
demo/findability

Conversation

@theletterf

@theletterf theletterf commented May 6, 2026

Copy link
Copy Markdown
Member

Why

This PR provides a single demo branch that reconciles the findability work across the navigation, hub-page, and landing-page prototypes. Keeping them together makes it possible to review and test the end-to-end experience before deciding how to split or sequence production rollout.

URL: https://docs-v3-preview.elastic.dev/elastic/docs-builder/docs/3256

What

Branch contributions

  • nav-v2 contributes the new IA prototype, label-section navigation model, accordion sidebar behaviour, placeholder page generation, Nav V2 frontend shell, independent sidebar islands, dynamic top-bar sections, API/reference section handling, and related HTMX navigation behaviour. PR: Prototype nav-v2: new IA with label sections, accordion sidebar #2927. The nav-v2-sections work (PR Nav sections: independent sidebar islands and dynamic top bar #3133) has been merged into nav-v2 and is included there.
  • hub-pages builds on nav-v2 with product hub page support, hub-specific directives and styling, product hub routing, product metadata presentation, and Elasticsearch/Kibana hub examples. PR: Findability - prototype - Hub pages #3223.
  • landing-page/prototype adds the search-first documentation landing page prototype, with version disambiguation, popular destinations, getting-started routes, solution browsing, and a product index. PR: [Findability] Landing page prototype #3250.
  • demo/findability reconciles those branches into one branch for demo purposes. It does not add a separate product feature beyond combining the stack.

Estimated hub-page build time

Local forced isolated HTML builds with --skip-api --exporters html showed nav-v2-sections processing 230 files in 1.745s, and this demo branch processing 239 files in 1.804s. That is about +59ms for the hub-page layer and related added docs files in this repo.

Based on that run, budget the marginal cost of each additional hub page in the low tens of milliseconds during isolated HTML generation, roughly <=30ms per page on this machine. Production assembler builds will be dominated by repository checkout, static assets, API/reference work, cross-link fetching, and upload/indexing overhead, so a small number of hub pages should not materially change total build time.

Production rollout considerations

  • Merge order matters: land nav-v2 (which now includes nav-v2-sections), then hub-pages, then the landing-page work, or keep the production branch explicitly stacked until all prerequisites are merged.
  • Keep the Nav V2 and hub-page behaviour gated by configuration or feature flags until the demo has passed design, content, accessibility, and navigation regression testing.
  • Before production, scope the landing-page CSS so resets and generic selectors do not affect the shared header, footer, or embedded React search components.
  • Verify all hub-page URLs, generated placeholder pages, product metadata links, and HTMX swaps in assembler previews, not only isolated docs builds.
  • Revisit build monitoring after adding real product hubs at scale. The current estimate is for the small demo set, and larger hub rollouts should be checked against CI timing and assembler preview timing.

Made with Cursor

itsalexcm and others added 30 commits March 31, 2026 16:40
- Walk ancestor li.group-navigation nodes and add nav-v2-active-ancestor when
  the folder row is not .current (same color as current; chevron uses currentColor).
- Folder row: same URL toggles expand/collapse only; navigating to another URL
  keeps the folder open (checkbox checked) so parent clicks do not collapse the subtree.
- Outside-click collapse leaves folders open when the click target lies on an
  ancestor folder row in the same branch (folderStaysOpenForNavClick).
- Remove any leftover nav-v2-active-label-ancestor class on refresh.
- Set top-level tree li padding-bottom to 32px; margins for label--top and
  label--nested; first nested header under an icon title uses margin-top 12px.
- Remove hardcoded Platform subsection li classes; rely on generic markup and CSS.
- Adjust border and nested label colors to match design.
- Nav link default/hover colors (#1d2a3e, #f1f6ff); wrap label text instead of
  single-line ellipsis; clip nav for Tippy; styles for nav-v2-active-ancestor rows.
- Drop nav-v2-truncate Tippy theme rules (tooltips disabled while text wraps).
Align with elastic/docs-content#5279: move perform-index-operations
from under Index basics to a sibling group under The Elasticsearch
data store, and add new index-operations-reference.md as its child.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CSS: force default text colour on nav-v2-active-ancestor rows (keep font-weight); hover/grey-40 variants; scope global #pages-nav .current away from V2 sidebar links.

- JS: when several a.sidebar-link.current share the URL, use the deepest in the tree so subtree/ancestor classes attach to the correct rows.

Made-with: Cursor
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The merge from main changed the FileSystem parameter from `fs` to
`readFs`/`writeFs` (ScopedFileSystem). The nav-v2 line reading
navigation-v2.yml was not auto-resolved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… PRs (#2971)

Add IsAotCompatible to 12 library projects referenced by docs-builder so
Roslyn's trim/AOT analyzers (IL2026/IL3050) run during regular builds.
This catches AOT issues at compile time, removing the need for the
expensive native ILC publish step on pull requests.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* HTML: Omit version meta tags for versionless pages

Versionless pages (serverless, cloud, etc.) were rendering the sentinel
value 99999.0+ in product_version and DC.identifier meta tags. Now these
tags are omitted entirely when the page's versioning system is versionless.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* HTML: Restore required modifier on CurrentVersion property

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…3025)

* Layout: Adapt to static elastic-nav by making secondary nav sticky

The global elastic-nav.js (v2026-03) changed the header from fixed to
static positioning. This makes the secondary docs nav sticky at the top
and simplifies --offset-top to match its height.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Only make secondary nav sticky on md+ viewports

On mobile the sticky secondary nav takes too much vertical space.
Keep it static on small screens (--offset-top: 0) and only sticky
on md+ where it provides persistent navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: Upgrade lodash to 4.18.x to fix high severity vulnerabilities

Fixes code injection via _.template (GHSA-r5fr-rjxr-66jc) and
prototype pollution via _.unset/_.omit (GHSA-f23m-r3pf-42rh).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Add bottom border to secondary nav

The visual separator was coming from #main-container's border-top,
which scrolls away. Adding border-b to the nav itself keeps the
line visible while sticky.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Remove border-top from main-container

The secondary nav now has border-b, so the main-container border-t
was causing a double border.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rvice (#3023)

IncrementalDeployService accepted a single ScopedFileSystem used for both
reading and writing. The deploy commands passed RealRead which lacks
AllowedSpecialFolder.Temp, causing ScopedFileSystemException when
AwsS3SyncApplyStrategy stages files in /tmp/ for S3 upload.

Rather than just swapping RealRead for RealWrite, properly separate the
concerns: the service now accepts distinct read and write filesystems,
using each for the appropriate operations (plan file reads vs temp dir
writes). This also fixes the Plan command which was writing its output
file through a read-scoped filesystem.

Made-with: Cursor
* Add skip-labels to evaluate-pr's output

* Add tests

* Resolve conflicts

* Fix docs-builder redirect tests (#3008)

* Fix redirect tests

* Remove changelog redirects implemented elsewhere

* Search: Use default semantic_text inference, remove Jina mappings (#3014)

Elasticsearch Serverless now defaults semantic_text to Jina, making
the explicit Jina sub-fields redundant and the ELSER inference ID
unnecessary. This removes both inference ID constants, all .jina
field mappings, and lets semantic_text fields use the platform default.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: Update config/versions.yml eck 3.3.2 (#3019)

Made with ❤️️ by updatecli

Co-authored-by: elastic-observability-automation[bot] <180520183+elastic-observability-automation[bot]@users.noreply.github.com>

* Deploy: Use write-scoped filesystem for apply command (#3021)

The deploy apply command used RealRead which lacks AllowedSpecialFolder.Temp,
causing ScopedFileSystemException when AwsS3SyncApplyStrategy stages files
in /tmp/ for S3 upload. Switch to RealWrite which permits temp directory access.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update Azure EDOT CF version (#3022)

+CC @zmoog

* Enable AOT/trim analyzers on library projects and skip AOT publish on PRs (#2971)

Add IsAotCompatible to 12 library projects referenced by docs-builder so
Roslyn's trim/AOT analyzers (IL2026/IL3050) run during regular builds.
This catches AOT issues at compile time, removing the need for the
expensive native ILC publish step on pull requests.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* HTML: Omit version meta tags for versionless pages (#3020)

* HTML: Omit version meta tags for versionless pages

Versionless pages (serverless, cloud, etc.) were rendering the sentinel
value 99999.0+ in product_version and DC.identifier meta tags. Now these
tags are omitted entirely when the page's versioning system is versionless.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* HTML: Restore required modifier on CurrentVersion property

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Adapt to static elastic-nav by making secondary nav sticky (#3025)

* Layout: Adapt to static elastic-nav by making secondary nav sticky

The global elastic-nav.js (v2026-03) changed the header from fixed to
static positioning. This makes the secondary docs nav sticky at the top
and simplifies --offset-top to match its height.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Only make secondary nav sticky on md+ viewports

On mobile the sticky secondary nav takes too much vertical space.
Keep it static on small screens (--offset-top: 0) and only sticky
on md+ where it provides persistent navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: Upgrade lodash to 4.18.x to fix high severity vulnerabilities

Fixes code injection via _.template (GHSA-r5fr-rjxr-66jc) and
prototype pollution via _.unset/_.omit (GHSA-f23m-r3pf-42rh).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Add bottom border to secondary nav

The visual separator was coming from #main-container's border-top,
which scrolls away. Adding border-b to the nav itself keeps the
line visible while sticky.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Layout: Remove border-top from main-container

The secondary nav now has border-b, so the main-container border-t
was causing a double border.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* lint

---------

Co-authored-by: Lisa Cawley <lcawley@elastic.co>
Co-authored-by: Jan Calanog <jan.calanog@elastic.co>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: elastic-observability-automation[bot] <180520183+elastic-observability-automation[bot]@users.noreply.github.com>
Co-authored-by: Fabrizio Ferri-Benedetti <fabri.ferribenedetti@elastic.co>
* feat(nav-v2): wire entire Install, deploy, and administer section

Replace ~97 placeholder title: entries with real page: cross-links
across the full "Install, deploy, and administer" label section:

- Distributed architecture: 6 pages + group index
- Plan your install: 5 pages (versioning, deployment comparison,
  reference architectures, production guidance)
- Install and deploy: 4 pages + group indices (Cloud, ECE, ECK,
  self-managed, command line tools via elasticsearch://)
- Administer your deployment: ~80 pages covering autoscaling, backup
  tools, security (24 pages), auth/users/roles, API keys, remote
  clusters, monitoring, cloud organization, licenses, maintenance,
  upgrades, and uninstall
- Deployment tools: ECCTL via toc: ecctl://reference

3 placeholder titles dropped (Skills pages and Overview roundup) as
no matching pages exist in docs-content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(nav-v2): restore dropped placeholder titles

Re-add 3 placeholder titles that were incorrectly removed:
- Skills for installation and deployment
- Skills for cluster and deployment administration
- Overview (roundup) under Deployment and administration tools

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Propose: extract EDOT SDKs as a top-level ingest tool group

Move the individual EDOT SDK tocs (Android, .NET, iOS, Java, Node.js,
PHP, Python, Browser) out from under the EDOT group and into a
dedicated "EDOT SDKs" sibling group at the same level as Fleet,
APM, Beats, etc. The group links to the existing edot-sdks index page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix EDOT SDK duplication: support child overrides on toc: entries

Add TocOverrideNode wrapper in SiteNavigationV2 so that when a toc:
entry in navigation-v2.yml declares explicit children, those are used
instead of the full V1 node tree — without mutating the shared node.

Update navigation-v2.yml to limit opentelemetry://reference children
to motlp, edot-cloud-forwarder, and edot-collector, keeping individual
EDOT SDKs only in the new sibling EDOT SDKs group.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Revert opentelemetry://reference children override

The edot-sdks deduplication is now handled upstream in elastic/opentelemetry
by removing edot-sdks/index.md from the reference toc. No children override
needed here — toc: opentelemetry://reference renders cleanly without the SDKs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Wire EDOT SDKs as a proper toc node in navigation.yml

Group the individual SDK tocs under opentelemetry://reference/edot-sdks
in navigation.yml with path_prefix reference/opentelemetry/edot-sdks,
so nav-v2 can reference it as a toc: entry with a correct URL.

Update navigation-v2.yml to use toc: opentelemetry://reference/edot-sdks
instead of group: + page:, which was producing a 404 due to naive URI
path resolution ignoring the path_prefix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: trigger assembler preview

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Sync nav-v2 with the latest main changes and resolve the package lock merge conflict by regenerating it from the merged package manifest.

Co-authored-by: OpenAI Assistant <assistant@openai.com>
Made-with: Cursor
Keep the new EDOT SDK group in nav-v2 while linking it to the current EDOT SDK index page and restoring only the V1 crosslinks that the assembler can resolve today.

Co-authored-by: OpenAI Assistant <assistant@openai.com>
Made-with: Cursor
# Conflicts:
#	src/Elastic.Documentation.Site/package-lock.json
Introduces the `section:` YAML item type in navigation-v2.yml. Each
section owns an independent sidebar tree and optionally appears as a
tab in the secondary nav bar. Sections marked `isolated: true` render
with a back arrow instead of a top bar tab.

Key changes:
- SectionNavV2Item record + YAML parsing in NavV2FileYamlConverter
- SectionNavigationNode nav type + NavigationSection data carrier
- SiteNavigationV2 builds sections, URL-to-section lookup
- GlobalNavigationHtmlWriter renders per-section sidebar (cached)
- NavigationRenderResult carries section metadata
- _SecondaryNav.cshtml is now data-driven (falls back to static V1)
- _TocTree.cshtml shows back arrow for isolated sections
- PlaceholderPageWriter groups by section for per-section nav

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Converts the 4 top-level label: entries in navigation-v2.yml to the
new section: format with explicit url: fields. Each section becomes an
independent nav island with its own sidebar and top bar tab.

Sections:
- Elasticsearch fundamentals → /get-started/
- Install, deploy, and administer → /deploy-manage/deploy/
- The Elasticsearch Platform → /manage-data/ingest/
- Solutions and project types → /solutions/

Nested label: items within sections are unchanged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…oubleshoot, Reference

Restructures navigation-v2.yml so all existing labels are children of
a single "Docs" section (full V2 tree in one sidebar). Adds Release
notes, Troubleshoot, and Reference as separate section tabs.

Secondary nav bar is now left-aligned, compact, and fully data-driven
from section metadata.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
florent-leborgne and others added 11 commits June 23, 2026 12:06
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	config/navigation-v2.yml
#	src/Elastic.Documentation.Site/Assets/styles.css
#	src/Elastic.Markdown/Myst/Directives/DirectiveBlockParser.cs
#	src/Elastic.Markdown/Myst/Directives/DirectiveHtmlRenderer.cs
Removes isolated: true so Extension points appears as a regular top-nav
section rather than a hidden island, and renames it to "Extend" for brevity.
Addresses findability feedback from the prototype review.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- assembler.yml: keep NAV_V2 + new WEBSITE_SEARCH flag from main
- NavigationItemExtensions.cs: take main's null-safe Index guard
- assembler.css: keep nav overflow fix + new website-search animation
- main.ts: adopt runInitSteps pattern, wire navV2 conditional as initNavAuto
- styles.css: keep all nav-v2 styles + add main's @layer component utilities
- DeploymentInfo.tsx: keep nav-v2 missing-attr guards on gitBranch/gitCommit
- _TocTree.cshtml / _TocTreeNav.cshtml: keep htmx nav attributes from nav-v2

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Variable was dropped during conflict resolution; referenced by
GetNavHxAttributes on the leaf anchor at line 104.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Replaces the flat mixed list with eight labeled sections — Elasticsearch,
Kibana, Security, Observability, Machine Learning, Ingest, Clients & SDKs,
Cloud & deployment, and Standards — so the sidebar has a visible heading
hierarchy. Scattered Elasticsearch sub-trees (aggregations, query-languages,
etc.) are consolidated under Elasticsearch; APM agents and OTel remain nested
under Observability; Logstash islands move into Ingest.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
…leSource

Both members were added as required in main but the ForUnparsableSource
factory on nav-v2 predates them. Null is the correct fallback for
unparsable rule files.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
… empty

select-dom v10 $$() throws ElementNotFoundError when no elements match.
Switching to $$optional since having zero .current elements is valid
(e.g. first markCurrentPage call before any link is marked).

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Make section tabs easier to see and give island sidebars enough context to explain where users are and how to return.

Co-authored-by: GPT-5.5 <noreply@openai.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…b pages

Point the Platform column entries to the docs-content hub pages
(/products/elasticsearch/v9 and /products/kibana/v9) instead of the
generic solution/explore pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
florent-leborgne and others added 5 commits June 23, 2026 19:10
- Hero directive now renders only icon, title, description, and releases;
  drop the search box, version dropdown, and quick-link options end to end
- Make the hub "on this page" component sticky on desktop
- Restore the Products dropdown rendering and scroll-container fix lost in
  the nav-v2 merge, and remove the deployment-runbook and "soon" stubs

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	src/Elastic.Documentation.Navigation/NavigationItemExtensions.cs
#	tests/authoring/Applicability/ApplicableToComponent.fs
#	tests/authoring/Blocks/Admonitions.fs
#	tests/authoring/Inline/AppliesToRole.fs
- Add md:order-2 to hub <main> so content fills the wide column instead
  of collapsing into the sidebar column (matches the default layout).
- Hide the top-bar section dropdown when closed and anchor it under its
  summary; let the nav scroll container's overflow go visible while open
  so the menu isn't clipped behind the left nav.
- Add a "Find all docs about {product}" eyebrow on hub heroes to signal
  the page is a documentation index.

Co-authored-by: Cursor <cursoragent@cursor.com>
Turn the hub indicator into both a label and an escape hatch: keep
"Find all docs about {product}" and add a pill link to the docs home
so readers who land on a product hub can jump to the full docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Refresh the findability demo branch with the latest hub pages prototype changes from PR #3223 while preserving the demo branch's consolidated nav-v2 state.

Co-authored-by: GPT-5.5 <gpt-5.5@openai.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

redesign enable redesign feature flag

Projects

None yet

Development

Successfully merging this pull request may close these issues.