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-nav —
LSubNaventry "Lexicon" onnisaba.md - Daily passage — "↗ lexicon" affordance on
nisaba-daily.md - Concept graph node —
nisaba-graph.mdconcept 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 top —
LCustomerNav 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 / pluraltable driven bydata.declension - II · … — etymology / glosses across the corpus (verify in source)
- III · … — attestations, semantic field (verify in source)
- I · Morphology — the word, declined. —
- Footer / cross-references — verify in source
States#
- Loaded —
getNisabaLexicon()resolves before render - Headword switching — eyebrow row hints at prev/next: "← σχολή · ἡγεμονικόν · θεωρία →"; verify whether arrows are interactive
- Declension table populated —
data.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— returnsNisabaLexiconData(verify shape: declension rows, etymology, glosses, attestations, semantic-field) - 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(NisabaLexiconline 1080)
- Feature spec:
V1/features.md#nisaba
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
NisabaLexiconDataonce it replaces the local fixture