8b461d99

By: Lucien Huber <im@lcnbr.ch>

restructure Linnest Typst API reference

User request:

PLEASE IMPLEMENT THIS PLAN:
# Cohesive API Reference Redesign

## Summary

Apply the approved compact, Typst-inspired design across the documentation while preserving each language’s useful native conventions. Shared improvements apply site-wide; structural redesign focuses on Python, native Rustdoc, and Linnest’s Typst API.

Start with `jj git fetch`, preserve the existing Python documentation work, create descendant changes for the redesign, and push the existing documentation bookmark only after validation.

## Implementation Changes

### Shared documentation UI

- Introduce a compact reference layout with an approximately 800px reading column, slim contextual navigation, and an optional right-hand table of contents only on sufficiently complex pages.
- Replace nested cards, strong purple borders, and heavy code shadows with whitespace and light dividers. Reserve plum for links, focus, selection, and active navigation.
- Standardize signature and example blocks:
  - language-appropriate syntax highlighting;
  - icon-only copy control visually inside the upper-right corner;
  - accessible label, keyboard focus, copied state, and graceful no-JavaScript fallback;
  - local scrolling for genuinely wide code.
- Fix site-wide mobile overflow for long links, inline code, tables, code blocks, and display MathML.
- Self-host STIX Two Math, including its license, and apply it explicitly to MathML.
- Demote oversized inventory statistics so useful reference content appears above the fold.
- Apply the shared spacing, typography, and code controls to authored and CLI pages without restructuring their content.

### Python reference

- Render the short symbol name as the H1 and show the fully qualified module path as secondary context.
- Keep `>>>` prompts in source docstrings for doctest/LSP compatibility, but strip prompts only from the parsed HTML example output.
- Keep runnable `main()` definitions at module level; the rendering pass must not introduce a nested wrapper.
- Organize pages consistently as signature, description, parameters, returns/raises, examples, and members/properties.
- Replace dense member cards with flat rows and dividers; keep defaults, types, overloads, and qualifiers visible.
- Rework the existing highlighting/copy implementation into the shared internal-icon treatment without adding a third-party JavaScript dependency.

### Rust reference

- Preserve native Rustdoc, including its search, sidebar, source links, trait/implementation hierarchy, and theme behavior.
- Pass a dedicated stylesheet through stable `rustdoc --extend-css`.
- Style primarily through Rustdoc variables and broad stable selectors so the customization remains resilient to Rust upgrades.
- Add a thin αLoop return/context bar through `--html-before-content`; do not replace or duplicate Rustdoc navigation.
- Match the shared typography, spacing, border, focus, and color system while retaining Rust-specific information density.

### Linnest Typst reference

- Keep `/guides/linnest/` as a concise narrative guide and preserve the complete standalone PDF manual.
- Refactor the canonical Typst documentation into reusable guide and API fragments so HTML reference pages and the PDF share one source.
- Add:
  - `/reference/typst/`
  - `/reference/typst/graph/`
  - `/reference/typst/layout/`
  - `/reference/typst/drawing/`
  - `/reference/typst/physics/`
  - `/reference/typst/subgraph/`
- Describe `layout` and `drawing` accurately as function groups rather than exported modules.
- List `curve` as a Kurvst re-export and link to its canonical Kurvst documentation instead of duplicating it.
- Use qualified, stable symbol anchors and search titles; exclude repetitive generic headings such as “Parameters” from search results while retaining their prose.

### Publishing and change organization

- Publish the generated root `search-index.json` from `scripts/update-docs-pages.sh` and fail publication checks when it is missing.
- Organize the work as three reviewable descendant jj changes: integrity fixes, shared/Python/Rustdoc UI, and Linnest Typst restructuring.
- Push the documentation bookmark after all three changes pass validation; do not rewrite or discard the existing working change.

## Interfaces and Compatibility

- No Rust, Python, or Typst runtime API behavior changes.
- New public documentation URLs are limited to the Typst reference routes above.
- The generated HTML gains a shared internal contract for language metadata, reference-page layout, code wrappers, and copy controls.
- The deployment artifact contract now explicitly includes the root search index.
- Existing URLs, dark mode, mobile navigation, Rustdoc functionality, and the standalone Linnest PDF remain supported.

## Test and Acceptance Plan

- Run, in repository-prescribed order:
  - `cargo check`
  - builder and documentation example tests;
  - documentation integrity checks;
  - the complete Nix documentation build for Python, Rust, and Typst.
- Add regressions covering:
  - root search-index publication and usable global search;
  - prompt-free rendered Python examples with source doctests unchanged;
  - short Python H1s and qualified paths;
  - internal accessible copy buttons and copied-state behavior;
  - required Typst routes, qualified anchors, and non-duplicated Kurvst content;
  - preserved Linnest PDF generation.
- Visually inspect representative Python module/symbol, Rustdoc crate/item, every Linnest Typst group, guide, CLI, search, and known overflow pages in light and dark themes at desktop and 390px mobile widths.
- Acceptance requires no page-level horizontal overflow, visible language-appropriate highlighting, working keyboard-accessible copy controls, readable MathML glyphs, functional Rustdoc navigation/search, and a materially shorter Linnest guide page.

Follow-up requests:

- “the box around the checkmark seems large and not centered”
- “and does the rustdoc styling match the rest?”
GitHub
Time to Start Worker time Duration Time to finish Idle
Config 1s 11s 11s 13s 1s
Eval 10s 1m12s 1m12s 1m23s 0s
Build 1m08s 7h37m45s - - 1m10s
Test 40m53s 15m07s - - 39s
Deploy - - - - 132h53m26s
Suite 1s 7h54m17s - - 132h55m17s

Timeline

Config Eval Build Test Failed Retried Compressed gap
0s1m2m3m4m5m6m7m8m9m10m11m12m13m14m15m16m17m18m19m20m21m22m23m24m25m26m27m28m29m30m31m32m33m34m35m36m37m38m39m40m41m42m43m44m45m46m47m48m49m50m51m52m53m54m56m57m