V1 Web PWA · Surface walkthrough

Nisaba · the manuscript

A per-surface walkthrough of the V1 Web PWA customer surface: layout, states, interactions, data, and cross-references.

walked
8sections2 minread

On this page

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 topLCustomerNav 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 pageLEyebrow "The page", LDisplay "Vatic. gr. 1950, f. 24v" (with the v superscript styled in accent italic); decorative vellum panel (radial gradient + Array.from({length: 18}) ruling lines and Array.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.tsx past line 800)

States#

  • LoadedgetNisabaManuscript() 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#

  • 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 — returns NisabaManuscriptData (verify shape: codex metadata, palaeographic notes, provenance entries)
  • Writes: None.
  • Realtime: None.
  • Caching: server fetch
  • Auth/role check: shell middleware

Cross-references#

Open questions / known gaps#

  • Confirm whether pan / zoom on the vellum panel is in scope for V1
  • Document the manuscript breadcrumb chain — does a Manuscripts index 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