Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f511d3c
docs: replace MkDocs with Zensical
claude Jul 7, 2026
4793412
docs: fix serve-docs.sh usage text
claude Jul 7, 2026
9e87ecb
docs: single-source the Zensical build recipe in scripts/docs/build.sh
maxisbey Jul 9, 2026
bb164d1
docs: fail the docs build when the nav references a missing page
maxisbey Jul 9, 2026
4b13682
docs: correct stale comments and the nav type alias
maxisbey Jul 9, 2026
13b42dc
docs: relock for zensical 0.0.48
maxisbey Jul 9, 2026
3786d39
docs: fix the PERF401 lint error in gen_ref_pages.py
maxisbey Jul 9, 2026
6ef1f84
docs: pin the API index rendering for cross-package re-exports
maxisbey Jul 9, 2026
eb1ffae
docs: restore watch and drop the stale banner env
maxisbey Jul 9, 2026
a05482d
docs: catch the failure modes zensical builds green
maxisbey Jul 9, 2026
5464185
docs: fix summary truncation and harden the API generator
maxisbey Jul 9, 2026
878e21e
docs: trim dead config knobs and clarify the griffelib dependency
maxisbey Jul 9, 2026
d629160
docs: preload cross-package alias targets in the compact index stub
maxisbey Jul 9, 2026
e927853
docs: port the sidebar styling to Zensical's nav and restore the slat…
maxisbey Jul 9, 2026
153d384
docs: give generated API stubs explicit page titles
maxisbey Jul 9, 2026
7d3d1dd
docs: fix the sidebar rule cascade and print scheme scoping
maxisbey Jul 9, 2026
de9d8fa
docs: align top-level nav pages and the API Reference label flush left
maxisbey Jul 9, 2026
c8449b7
docs: rebuild the sidebar styling as one coordinate system
maxisbey Jul 9, 2026
0d3ef49
docs: put the pill inset on the elements that paint it
maxisbey Jul 9, 2026
b0dc3d9
docs: composite inline code over admonition tints
maxisbey Jul 9, 2026
0fc3242
docs: replace the llms_txt link regexes with a total classifier
maxisbey Jul 10, 2026
a483385
docs: validate crossrefs and inventories from the built site
maxisbey Jul 10, 2026
72f1d97
docs: compact-index every package that re-exports from outside its su…
maxisbey Jul 10, 2026
029a47c
docs: restore the markdown extensions pymdownx.extra bundled
maxisbey Jul 10, 2026
d479b22
docs: fail the build on pages missing from the nav
maxisbey Jul 10, 2026
f7db9d9
docs: pin the Zensical toolchain exactly
maxisbey Jul 10, 2026
57f9e0a
docs: bump zensical to 0.0.50 to fix search
maxisbey Jul 10, 2026
d90f709
docs: compact every module that re-exports from outside its subtree
maxisbey Jul 10, 2026
8acb8dd
docs: tighten the prose extractor and link classifier edge cases
maxisbey Jul 10, 2026
f978b68
docs: close nav containment, HTML-comment, and whitespace link gaps
maxisbey Jul 10, 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
4 changes: 1 addition & 3 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ on:
- src/mcp/**
- src/mcp-types/**
- scripts/build-docs.sh
- scripts/docs/**
- pyproject.toml
- uv.lock
- .github/workflows/deploy-docs.yml
Expand Down Expand Up @@ -49,9 +50,6 @@ jobs:

- name: Build combined docs (v1.x at /, main at /v2/)
run: bash scripts/build-docs.sh site
env:
# Silence mkdocs-material's MkDocs 2.0 warning banner in CI logs.
NO_MKDOCS_2_WARNING: "1"

- name: Configure Pages
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
Expand Down
23 changes: 11 additions & 12 deletions .github/workflows/shared.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,16 @@ jobs:
- name: Check README snippets are up to date
run: uv run --frozen scripts/update_readme_snippets.py --check

# `mkdocs.yml` sets `strict: true` and `pymdownx.snippets: check_paths: true`,
# but until this job existed the docs were only ever built post-merge by
# `deploy-docs.yml`, so a broken link, a missing nav target, or a deleted
# `docs_src/` include went green on the PR and broke the next deploy of main.
# This is the check path; `deploy-docs.yml` stays the deploy path.
# `scripts/docs/build.sh` is the whole gauntlet: build_config.py fails on
# nav entries without a page and pages without a nav entry, `zensical build
# --strict` fails on broken .md links, `pymdownx.snippets: check_paths:
# true` fails on a deleted `docs_src/` include, and the post-build steps
# fail on unresolved cross-references, inventory download failures, and
# broken non-markdown link targets.
# Until this job existed the docs were only ever built post-merge by
# `deploy-docs.yml`, so those failures went green on the PR and broke the next
# deploy of main. This is the check path; `deploy-docs.yml` stays the deploy
# path.
docs:
runs-on: ubuntu-latest
steps:
Expand All @@ -168,11 +173,5 @@ jobs:
enable-cache: true
version: 0.9.5

- name: Install dependencies
run: uv sync --frozen --all-extras --python 3.10

- name: Build the docs in strict mode
run: uv run --frozen --no-sync mkdocs build --strict
env:
# Silence mkdocs-material's MkDocs 2.0 warning banner in CI logs.
NO_MKDOCS_2_WARNING: "1"
run: bash scripts/docs/build.sh
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,13 @@ venv.bak/
# Rope project settings
.ropeproject

# mkdocs documentation
# documentation
/site
/.worktrees/
# Generated at build time by scripts/docs/ (the API reference tree and the
# concrete Zensical config spliced from mkdocs.yml).
/docs/api/
/mkdocs.gen.yml

# mypy
.mypy_cache/
Expand Down
107 changes: 70 additions & 37 deletions docs/extra.css
Original file line number Diff line number Diff line change
@@ -1,12 +1,42 @@
/* Sidebar hierarchy + density for MkDocs Material 9.7.x.
All rules scoped to the desktop sidebar breakpoint (>= 76.25em), matching
Material's own scoping for navigation.sections, so the mobile drill-down
drawer keeps stock styling. Colors use Material tokens, so the light and
slate schemes both work without extra palette handling. */
/* Sidebar hierarchy + density for Zensical's UI (Material-compatible md-*
DOM, but different stock spacing: nav links are 8px-radius pills with
7px 16px padding). All rules scoped to the desktop sidebar breakpoint
(>= 76.25em) so the mobile drill-down drawer keeps stock styling. Colors
use the md-* tokens, so the light and slate schemes both work without
extra palette handling. */

@media screen and (min-width: 76.25em) {
/* Section labels: smaller, uppercase, letter-spaced, muted. Covers both the
clickable index-page headers and the bare API Reference label. */
/* The sidebar is one coordinate system derived from the pill inset:
every row — page links, group rows, section labels — is a direct
.md-nav__link child of its item with the same 10px horizontal padding,
so all text shares one column, and hover/active pills always paint
10px of breathing room inside the scroll container (never clipped).
The padding lives on the elements Zensical paints hover/active pills
on (.md-nav__link[href] anchors and [for] labels — leaf links, bare
section labels, and the inner anchor of an .md-nav__container
wrapper); wrappers stay geometry-neutral, as stock. The 10px inset
also stays >= the 0.4rem pill radius, so the corner curve never
crowds the text. Vertical rhythm has a single knob: the nav list's
flex gap (stock 0.2rem reads airy; 2px matches the density the site
shipped with on Material, ~30px row pitch). */
.md-sidebar--primary .md-nav__list {
gap: 2px;
}
.md-sidebar--primary .md-nav__item > .md-nav__link:not(.md-nav__container),
.md-sidebar--primary .md-nav__container > .md-nav__link {
padding: 3px 10px;
margin: 0;
}
.md-sidebar--primary .md-nav__item > .md-nav__container {
padding: 0;
margin: 0;
}

/* Section labels: typography only — geometry comes from the row rule
above, so no specificity coordination is needed. */
.md-sidebar--primary .md-nav__item--section {
margin: 0.8em 0;
}
.md-sidebar--primary .md-nav__item--section > .md-nav__link {
font-size: 0.62rem;
font-weight: 700;
Expand All @@ -15,39 +45,19 @@
color: var(--md-default-fg-color--light);
}

/* Indent section children and hang a guide line. Material outdents section
children with [dir=ltr] ... margin-left: -0.6rem, which is why they sit
flush under the header; restoring the margin re-exposes the stock 0.6rem
list padding. The logical property ties Material's physical one at
(0,3,0) specificity and wins on source order (extra_css loads last),
while staying direction-agnostic. */
/* Guide lines: 12px from the item box = 2px right of the label text
(which sits at box + 10px pill inset); children indent past them. */
.md-sidebar--primary .md-nav__item--section > .md-nav {
margin-inline-start: 0.1rem;
margin-inline-start: 12px;
border-inline-start: 0.05rem solid var(--md-default-fg-color--lightest);
}

/* Same guide line for collapsible groups inside the API Reference subtree
(section items also carry --nested, so exclude them). */
.md-sidebar--primary .md-nav__item--nested:not(.md-nav__item--section) > .md-nav {
margin-inline-start: 12px;
border-inline-start: 0.05rem solid var(--md-default-fg-color--lightest);
}

/* Tighten vertical rhythm (stock: 0.625em link margins, 1.25em sections).
The child combinator keeps this off anchors inside md-nav__container,
which carry their own margin-top: 0 stock rule. */
.md-sidebar--primary .md-nav__item > .md-nav__link {
margin-top: 0.45em;
}
.md-sidebar--primary .md-nav__item--section {
margin: 1em 0;
}
.md-sidebar--primary .md-nav__item--section > .md-nav__link {
margin-top: 0;
}

/* The current page stands out from its siblings. 700 because Material only
loads Inter at 300/400/700; a 600 would silently substitute the 700 face
anyway, but render lighter on the system-font fallback stack. */
/* The current page stands out from its siblings (on top of the stock
pill highlight). 700 because only Inter 300/400/700 are loaded. */
.md-sidebar--primary .md-nav__link--active {
font-weight: 700;
}
Expand All @@ -60,10 +70,33 @@
}
}

/* Headings: Material's 300-weight light-gray defaults read washed out; use
the full foreground color and a solid weight instead. 700, not 600: the
Google Fonts request only carries Inter 300/400/700 (see the nav__link
note above). */
/* Dark scheme: Zensical's slate canvas is near-black (hsla(225,15%,5%)),
harsher than the Material slate this site shipped with; restore that
blue-grey. Code blocks and other surfaces keep Zensical's own tokens. */
@media screen {
[data-md-color-scheme="slate"] {
--md-default-bg-color: #1e2129;
}
}

/* Inline code inside admonitions: the chip token is an absolute dark
surface designed for the page canvas, so on a tinted admonition panel it
sits as an opaque slab (Zensical's own docs share this bug). Re-tint it
tone-on-tone instead — translucent foreground, composited over whatever
the panel color is — the same pattern Starlight and Docusaurus ship for
code inside callouts. Prose chips keep the block-matching dark surface;
block code inside admonitions keeps its own surface too. The first
declaration is the fallback where color-mix is unsupported. */
.md-typeset .admonition :not(pre) > code,
.md-typeset details :not(pre) > code {
background-color: var(--md-default-fg-color--lightest);
background-color: color-mix(in srgb, currentcolor 11%, transparent);
color: inherit;
}

/* Headings: the 300-weight light-gray defaults read washed out; use the
full foreground color and a solid weight instead. 700, not 600: only
Inter 300/400/700 are loaded (see the nav__link note above). */
.md-typeset h1,
.md-typeset h2 {
font-weight: 700;
Expand Down
40 changes: 0 additions & 40 deletions docs/hooks/gen_ref_pages.py

This file was deleted.

Loading
Loading