Context. surface customer · domain nisaba · route /nisaba/manuscript · auth signed-in · source apps/oshun/web/src/app/nisaba/manuscript/page.tsx
Last walked. 2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data (2xx), console/page-errors, expected content, screenshot verified; live screen-reader, touch, offline, and telemetry-delivery checks pending a manual AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; content re-verified 2026-06-03 against current source
Purpose#
Manuscript view for one folio (fixture: Vatic. gr. 1950, f. 24v, IV.viii–xii, imaged Aug 2019). Surfaces a vellum scan with codex metadata, palaeographic notes, and provenance.
Entry points#
- Nisaba sub-nav — verify the manuscript tab wiring on
nisaba.md - Scholar mode — see
nisaba-scholar.md— links to specific manuscripts cited in the apparatus - Direct URL / bookmark — yes
Layout regions#
page.tsx is a thin server component: await getNisabaManuscript() →
<NisabaManuscript data={data} />.
Inside NisabaManuscript (nisaba.tsx, line 728):
- Web shell top —
LCustomerNav active="library" - Breadcrumb strip — "Library › Nisaba › Manuscripts › Vatic. gr. 1950" / "folio 24v · IV.viii–xii · imaged Aug 2019"
- Two-column body (
gridTemplateColumns: '1.4fr 1fr'):- Left — The page —
LEyebrow"The page",LDisplay"Vatic. gr. 1950, f. 24v" (with thevsuperscript styled in accent italic); decorative vellum panel (radial gradient +Array.from({length: 18})ruling lines andArray.from({length: 24})foxing marks, positioned with deterministic(i * 41) % 100/(i * 67) % 100) - Right column — codex metadata, palaeographic notes, provenance (verify
exact layout in
nisaba.tsxpast line 800)
- Left — The page —
States#
- Loaded —
getNisabaManuscript()resolves before render - Vellum panel rendering — deterministic ruling lines + foxing marks drawn purely with CSS / positioning math; no images required
- Metadata populated — codex / palaeographic / provenance fields read
from
data - Reduced motion — composes static markup
- Standalone PWA / Offline — verify whether the vellum panel renders without network (it should, since it's CSS-only)
Interactions#
Breadcrumb strip#
- Library — navigate to
/library - Nisaba — navigate to
/nisaba - Manuscripts — verify whether there's a manuscript index route
- Vatic. gr. 1950 — non-interactive current manuscript label
Vellum panel#
- Pan / zoom — verify whether the page panel supports pan/zoom or is static in V1
- Ruling lines / foxing marks — non-interactive CSS decorations
Right column#
- Metadata fields — verify which fields are link-out (e.g., cataloguing record at the holding library)
- Palaeographic notes — verify cross-links to glossary entries
- Provenance — verify whether each provenance entry links to its source
Data & contracts#
- Reads:
getNisabaManuscript()from@/lib/lilith-data/nisaba-depth— returnsNisabaManuscriptData(verify shape: codex metadata, palaeographic notes, provenance entries) - Writes: None.
- Realtime: None.
- Caching: server fetch
- Auth/role check: shell middleware
Cross-references#
- Sibling Nisaba routes:
- Component sources:
apps/oshun/web/src/components/lilith/nisaba.tsx(NisabaManuscriptline 728)
- Feature spec:
V1/features.md#nisaba
Open questions / known gaps#
- Confirm whether pan / zoom on the vellum panel is in scope for V1
- Document the manuscript breadcrumb chain — does a
Manuscriptsindex exist? - Document the BFF endpoint that hydrates manuscript metadata once it replaces the local fixture
- Confirm whether a real folio scan should replace the CSS-generated vellum specimen