V1 Web PWA · Surface walkthrough

Nisaba · the lexicon

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/lexicon · auth signed-in · source apps/oshun/web/src/app/nisaba/lexicon/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#

Word study for one headword (fixture: ἡγεμονικόν). Surfaces morphology (declension), etymology, glosses across the corpus, attestations, and semantic field.

Entry points#

  • Nisaba sub-navLSubNav entry "Lexicon" on nisaba.md
  • Daily passage — "↗ lexicon" affordance on nisaba-daily.md
  • Concept graph nodenisaba-graph.md concept nodes open lexicon entries (verify exact wiring)
  • Direct URL / bookmark — yes

Layout regions#

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

Inside NisabaLexicon (nisaba.tsx, line 1080):

  • Web shell topLCustomerNav active="library"
  • Header strip — eyebrow row "Nisaba · the lexicon" / "Word study · Greek · headword" / "← σχολή · ἡγεμονικόν · θεωρία →"
  • Hero word block — large serif headword (size 84), transliteration ("hēgemonikón"), italic gloss ("n. · the ruling part, the governing faculty")
  • Three-column body (repeat(3, 1fr)):
    • I · Morphology — the word, declined.case / singular / plural table driven by data.declension
    • II · … — etymology / glosses across the corpus (verify in source)
    • III · … — attestations, semantic field (verify in source)
  • Footer / cross-references — verify in source

States#

  • LoadedgetNisabaLexicon() resolves before render
  • Headword switching — eyebrow row hints at prev/next: "← σχολή · ἡγεμονικόν · θεωρία →"; verify whether arrows are interactive
  • Declension table populateddata.declension.map(row => Fragment(row[0])) renders one row per case
  • Empty column — verify behavior when a section (etymology / glosses / attestations) is empty in the data
  • Reduced motion — composes static Lilith primitives

Interactions#

Header strip#

  • ← σχολή (previous headword) — verify whether interactive in V1
  • θεωρία → (next headword) — verify

Hero word block#

  • Headword glyph — non-interactive serif display
  • Transliteration — non-interactive accent italic

Morphology table#

  • Case label (case) — non-interactive
  • Singular / plural form — verify whether each form is clickable to see attestations
  • Row hover / focus — verify any hover highlighting

Other sections#

  • Gloss row — verify whether glosses link to passages
  • Attestation row — verify whether each attestation opens its passage in the reading desk
  • Semantic-field card — verify whether related words open their own lexicon entries

Data & contracts#

  • Reads: getNisabaLexicon() from @/lib/lilith-data/nisaba-depth — returns NisabaLexiconData (verify shape: declension rows, etymology, glosses, attestations, semantic-field)
  • Writes: None.
  • Realtime: None.
  • Caching: server fetch
  • Auth/role check: shell middleware

Cross-references#

Open questions / known gaps#

  • Confirm whether prev/next headword arrows in the eyebrow row are interactive in V1
  • Document the cross-link contract — glosses, attestations, and semantic field destinations
  • Verify reduced-motion handling for any hero animations
  • Document the BFF endpoint that hydrates NisabaLexiconData once it replaces the local fixture