Navigation
Overview
Navigation in ciderpress is split across three surfaces: the topbar for top-level wayfinding, the sidebar for in-section navigation, and landing pages auto-generated for group pages with children. Topbar config lives under topbar.*, sidebar config lives under sidebar.*, and per-page sidebar behavior lives under Page.nav.*. Edit/report links and social links are top-level fields, matching the conventions of VitePress and Nextra.
Topbar
The topbar is configured under the topbar object.
Auto navigation
Set topbar.nav: 'auto' (the default) to derive topbar entries from your pages tree:
The auto-nav rule
Auto-nav emits one top-level entry per root
pagesentry that has apath. Children are not flattened into dropdowns. Roots withnav.hidden: trueare skipped. Workspaces declared via top-levelapps/packages/workspacesare not included — they show on the home grid only. For dropdowns or workspace items in the topbar, use the explicitNavItem[]form.
Explicit navigation
Pass an array of NavItem objects for full control:
Dropdown menus
Nav items with items instead of link render as dropdown menus:
Active state
In auto mode, nav items highlight based on the current URL matching the page's path. For explicit nav, use activeMatch:
The activeMatch value is a regex pattern tested against the current URL path.
CTA, socials, and announcement
The topbar carries three optional companions:
AnnouncementConfig is { id?, lead?, message, cta?, persistent? }. Setting id makes a dismissal persist in localStorage; persistent: true hides the dismiss button entirely.
Sidebar
Sidebar chrome and per-page sidebar behavior are separated. The sidebar.* config controls persistent elements that flank the nav tree; Page.nav.* controls how an individual page behaves inside that tree.
Persistent links
sidebar.top and sidebar.bottom are ButtonConfig[] — the same shape used by hero actions and the topbar CTA. Each entry carries text, href, and optional variant / shape / icon:
sidebar.top renders above the nav tree; sidebar.bottom renders below.
Promo block
sidebar.promo injects a promo card under the nav tree — useful for newsletter signups, community links, or product callouts. The shape is { title, body, cta: { text, href } }:
Per-page nav behavior
The Page.nav block controls sidebar behavior for a single page:
Landing Pages
Group pages with children but no single-file include automatically get a generated landing page displaying cards that link to child entries.
When landing pages generate
A landing page is created when a page has:
- A
pathfield (defines the landing page URL) - Child entries (via
pagesor a globinclude) - No
includepointing to a single file (that would make it a regular page)
Navigating to /guides shows a landing page with cards for each discovered guide.
Disabling landing pages
The landing field controls whether the auto-generated landing page is created. It defaults to true for groups with children. Set landing: false to disable:
Overview file promotion
When using discover.recursive: true, the discover.indexFile field controls which filename is promoted to the section header (default: "overview"). That file's content becomes the page's landing content instead of auto-generated cards.
Page cards
Pages without workspace metadata display simple cards showing:
- Entry name (from
title) - Description (from child page frontmatter
description) - Icon colors that rotate automatically across cards
Workspace cards
When workspace metadata (from apps / packages / workspaces) matches a page by path, the landing page uses workspace-style cards showing:
- Icon with color styling
- Scope label (e.g.
apps/) - Name and description
- Technology tag badges
- Optional deploy badge
See the Workspaces concept for workspace configuration.
Controlling card content
Card descriptions are resolved in this order (highest priority first):
card.descriptionon the pagedescriptionfrom the source file's frontmatter- The page's own
descriptionfield on the config entry
Edit and Report Links
Edit-on-GitHub and report-an-issue links are top-level fields, matching the editLink convention used by VitePress and Nextra:
Setting either to false disables that link site-wide:
Per-page overrides go through Page.defaults (e.g. defaults: { editLink: false } on a group hides the edit link for every child).
Social Links
Social links are declared once at the top level under socials. They are the single source of truth — topbar.socials and footer.socials either reuse this array or override with their own:
Each SocialLink is { icon, url, label? }. icon accepts a known social-icon ID ('github', 'discord', etc.) or { svg: string } for a custom inline SVG.
Design Decisions
- Auto nav as default — most sites want one topbar item per root page. Auto mode follows a single written rule (one entry per root page with a
path) instead of magic flattening or workspace cross-pollination. - Workspaces stay on the home grid — pulling workspaces into the topbar by default produced cluttered nav bars. Workspace topbar entries are now opt-in through the explicit
NavItem[]form. - Landing pages over empty groups — groups with children should never show a blank page. Auto-generated card grids give users an immediate overview of what's inside.
- Workspace-aware cards — when monorepo metadata exists, landing pages use richer cards with icons, tags, and badges rather than plain text links.
- Industry-aligned top-level fields —
editLink,reportLink, andsocialssit at the top level the way every modern docs framework does, instead of nesting undersite.*.
References
- Configuration reference — NavItem
- Configuration reference — CardConfig
- Configuration reference — SocialLink
- Workspaces — monorepo workspace metadata
- Content — page definitions and the
Pageshape