V1 Web PWA · Surface walkthrough

Nisaba · scholar mode

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

walked
9sections3 minread

On this page

Context. surface customer · domain nisaba · route /nisaba/scholar · auth signed-in · source apps/oshun/web/src/app/nisaba/scholar/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#

The text in full apparatus — variants, witnesses, marginalia, and cross-references. Fixture is Marcus Aurelius, Τὰ εἰς ἑαυτόν, IV.viii–xii, with 4 witnesses · 6 editions · 11 translations.

Entry points#

  • Nisaba sub-navLSubNav entry "Scholar mode" on nisaba.md
  • Compare view — link from nisaba-compare.md "Apparatus · on"
  • Direct URL / bookmark — yes

Layout regions#

page.tsx is a thin server component: await getNisabaScholar()<NisabaScholar data={data} />.

Inside NisabaScholar (nisaba.tsx, line 177):

  • Web shell topLCustomerNav active="library"
  • Header strip — eyebrow row "Nisaba · the desk · scholar mode" / "Marcus Aurelius, Τὰ εἰς ἑαυτόν · IV.viii–xii" / "4 witnesses · 6 editions · 11 translations"; LDisplay (size 64) headline "The text, in full apparatus."
  • Toolbar (right of headline) — three actions:
    • Reader mode (ghost) — switch back to the reading-desk view
    • Edition: Farquharson 1944 ▾ (ghost) — edition picker
    • Cite (primary) — opens citation generator
  • Three-column body (gridTemplateColumns: '220px 1fr 320px'):
    • Left — Marginalia · your handdata.marginalia.map(m => (...)) rows with L · <line> accent label and italic body; "Highlights" chip cloud below (power, quietness, impermanence, present moment, self, reason)
    • Centre — Text + apparatus — full apparatus rendering (verify exact layout in nisaba.tsx past line 280)
    • Right column — witnesses / editions / translations rail (verify in source)

Automation anchors#

  • Root/header: data-nisaba-scholar-page with marginalia/witness/ cross-reference/concept counts; data-nisaba-scholar-masthead-*, data-nisaba-scholar-heading, and data-nisaba-scholar-toolbar
  • Toolbar: wrappers for reader-mode, edition-picker, and cite (data-nisaba-scholar-toolbar-action)
  • Marginalia and highlights: data-nisaba-scholar-marginalia with per-row line and note cells; data-nisaba-scholar-highlights with per-chip label
  • Text + apparatus: data-nisaba-scholar-reading-column, per data-nisaba-scholar-line-block, data-nisaba-scholar-crux, and data-nisaba-scholar-apparatus with per-entry line/lemma/variant cells
  • Witnesses/crossrefs/concepts: data-nisaba-scholar-witness={siglum}, data-nisaba-scholar-crossrefs with group/item cells, and data-nisaba-scholar-concepts with per-concept index

States#

  • LoadedgetNisabaScholar() resolves before render
  • Edition active — fixture: Farquharson 1944; verify whether the dropdown is interactive in V1
  • Reader mode toggleReader mode button verifies whether it navigates back to /nisaba
  • Cite dialog — verify the Cite action target
  • Marginalia present / emptydata.marginalia may be empty; verify in-rail empty state
  • Apparatus expanded — verify apparatus expansion controls

Interactions#

Header strip#

  • LDisplay — non-interactive

Toolbar#

  • Reader mode (LBtn kind="ghost")
    • Function: render-only V1 affordance; the journey verifies desk return via browser history
  • Edition picker (LBtn kind="ghost")
    • Function: render-only V1 affordance; exact options/dropdown remain unwired
  • Cite (LBtn kind="primary")
    • Function: render-only V1 affordance; citation generator remains unwired

Marginalia rail#

  • Marginalia row — non-interactive specimen entry; verify whether the user can add new marginalia in V1
  • Highlights chip cloud — visible chip cloud; chips are not wired to filter text/apparatus in this route

Text + apparatus column#

  • Line / apparatus content — line blocks and apparatus entries render with stable line/lemma anchors
  • Apparatus entry navigation — opens the witness in the manuscript view (/nisaba/manuscript) or compare view
  • Cross-reference link — opens the linked passage

Right column#

  • Witness / cross-reference / concept rows — visible rows are asserted cell-by-cell
  • Witness / edition / translation row navigation — opens the corresponding source

Data & contracts#

  • Reads: getNisabaScholar() from @/lib/lilith-data/nisaba-depth — returns NisabaScholarData (marginalia: { ln, n }[], plus witnesses, editions, translations, apparatus — verify exact shape)
  • Writes: verify whether marginalia editing is wired in V1
  • Realtime: None.
  • Caching: server fetch
  • Auth/role check: shell middleware

Cross-references#

Open questions / known gaps#

  • Confirm whether the Cite primary action exports BibTeX, formatted citation, or both
  • Document the edition picker's options and the BFF backing them
  • Confirm whether marginalia editing is in scope for V1 (the rail says "your hand" but the rendering is specimen-only)
  • Verify the "Reader mode" button destination — current route exposes a render-only button; the journey uses browser-back from /nisaba/scholar to return to the desk