From 584b8d282532f62ad954d29c290ed1e70fff7b0b Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 14:56:42 -0400 Subject: [PATCH 01/23] feat(liturgy): per-morpheme arrow filter + Metta Sutta verse 1 prosodic split MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User feedback (Metta Sutta verse 1): when hovering a Pāli word the arrows fanned out to every aligned English token regardless of which morpheme the cursor was on. The per-morpheme tooltip felt decoupled from the arrow you were trying to read. Two changes: 1. Renderer (TripleScriptWitness): when the hovered element carries data-morpheme-idx (the inner HoverSpan of a morpheme-split word), narrow the arrow filter to lines whose Line.morphemeIdx matches. The alignment-line computer already anchors arrow endpoints to morpheme positions when authored; this just exposes that scoping to the hover handler. 2. Metta Sutta verse 1: split the existing single bundled segment (Karaṇīyamatthakusalena ... anatimānī) into four prosodic phrases (v1a-v1d) matching the natural rhythm. Each phrase carries its own three-witness set (Amaravati / Sujato / Thanissaro) with word-by-word alignTo and full word data — pronunciation, etymology, gloss, morphemes (root verbs √kṛ, √śam, √vac, √man, √i, √as surfaced), and DPD citations. Compound karaṇīyam-attha- kusalena is hyphen-tokenised so each component hovers separately. --- .../liturgy/shapes/TripleScriptWitness.tsx | 29 ++- data/liturgy/metta-sutta.ts | 232 +++++++++++++++++- 2 files changed, 246 insertions(+), 15 deletions(-) diff --git a/components/liturgy/shapes/TripleScriptWitness.tsx b/components/liturgy/shapes/TripleScriptWitness.tsx index 52fb311..faf2374 100644 --- a/components/liturgy/shapes/TripleScriptWitness.tsx +++ b/components/liturgy/shapes/TripleScriptWitness.tsx @@ -1170,13 +1170,30 @@ const SegmentRow: React.FC<{ const cRect = containerRef.current.getBoundingClientRect(); const r = hovered.element.getBoundingClientRect(); - // Step 3 — idx match - const idxMatched = fresh.filter((l) => - hovered.kind === 'pali' ? l.paliIdx === hovered.idx : l.engIdx === hovered.idx, - ); - - // Step 4 — concept overlap + // Step 3 — idx match. When the user is hovering a specific morpheme + // within a Pāli word (the inner HoverSpan emits `data-morpheme-idx`), + // narrow to lines that anchor at that morpheme. Without this, every + // arrow for the whole word stays visible regardless of which morpheme + // the cursor is on — and the per-morpheme tooltips feel decoupled + // from the arrow shown. See screenshot feedback (verse 1 karaṇīyam). const hoveredEl = hovered.element as HTMLElement; + const hoveredMorphemeStr = hoveredEl.dataset.morphemeIdx; + const hoveredMorphemeIdx = + hovered.kind === 'pali' && hoveredMorphemeStr !== undefined + ? parseInt(hoveredMorphemeStr, 10) + : null; + const idxMatched = fresh.filter((l) => { + if (hovered.kind === 'pali') { + if (l.paliIdx !== hovered.idx) return false; + if (hoveredMorphemeIdx !== null && l.morphemeIdx !== undefined) { + return l.morphemeIdx === hoveredMorphemeIdx; + } + return true; + } + return l.engIdx === hovered.idx; + }); + + // Step 4 — concept overlap (hoveredEl already declared above) const hoveredConceptStr = hoveredEl.dataset.conceptIds; const hoveredConcepts = hoveredConceptStr ? new Set(hoveredConceptStr.split(/\s+/).filter(Boolean)) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 28651bc..5ad0f30 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -57,42 +57,256 @@ export const mettaSutta: LiturgyDoc = { shape: 'triple-script-witness', large: true, segments: [ + // ── v1a: karaṇīyam-attha-kusalena ── { - id: 'verse-1', - pali: 'Karaṇīyamatthakusalena, yaṁ taṁ santaṁ padaṁ abhisamecca; sakko ujū ca suhujū ca, suvaco c\'assa mudu anatimānī.', + id: 'v1a-karaniya', + pali: 'karaṇīyam-attha-kusalena', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'karaṇīyam-attha-kusalena' }, + ], + witnesses: [ { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Karaṇīyamatthakusalena, yaṁ taṁ santaṁ padaṁ abhisamecca; sakko ujū ca suhujū ca, suvaco c\'assa mudu anatimānī.', + by: 'Amaravati', + text: 'This is what should be done by one who is skilled in goodness,', + alignTo: [0, 0, 0, 0, 0, 0, -1, 2, -1, -1, 2, 1, 1], + url: AMARAVATI_URL, + }, + { + by: 'Sujato (SuttaCentral)', + text: 'This is what should be done by one skilled in the good', + alignTo: [0, 0, 0, 0, 0, 0, -1, 2, 2, -1, -1, 1], + url: 'https://suttacentral.net/snp1.8/en/sujato', + license: 'CC0', + }, + { + by: 'Thanissaro (Access to Insight)', + text: 'This is to be done by one skilled in aims', + alignTo: [0, 0, 0, 0, 0, -1, 2, 2, -1, 1], + url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', + license: 'CC BY-NC', + }, + ], + words: [ + { + form: 'karaṇīyam', + pronunciation: 'kah-rah-NEE-yahm', + etymology: 'gerundive of *√kṛ* "to do" — "that which should be done"', + gloss: 'should be done — the opening word frames the whole sutta as instruction', + morphemes: [ + { text: 'karaṇī', type: 'root', root: '√kṛ', gloss: 'to do, make', pronunciation: 'kah-rah-NEE' }, + { text: 'yam', type: 'suffix', gloss: 'gerundive ending — "to-be-Xed"', pronunciation: 'yahm' }, + ], + citations: [dpdCitation('karaṇīya')], + }, + { + form: 'attha', + pronunciation: 'AHT-tah', + etymology: 'Pāli *attha* "aim, meaning, the good" (Skt *artha*)', + gloss: 'the good, the aim — the goal of practice; what is worth doing', + accent: 'amber', + citations: [dpdCitation('attha')], }, + { + form: 'kusalena', + pronunciation: 'koo-sah-LAY-nah', + etymology: '*kusala* "skilful, wholesome" + *-ena* instrumental ending', + gloss: 'by one skilled (instrumental) — *kusala* is the same term used for "wholesome" mental states across the Pāli canon', + morphemes: [ + { text: 'kusala', type: 'stem', gloss: 'skilful, wholesome', pronunciation: 'koo-SAH-lah' }, + { text: 'ena', type: 'suffix', gloss: 'instrumental case ending — "by [one who is]"', pronunciation: 'AY-nah' }, + ], + citations: [dpdCitation('kusala')], + }, + ], + }, + // ── v1b: yaṁ taṁ santaṁ padaṁ abhisamecca ── + { + id: 'v1b-santam-padam', + pali: 'yaṁ taṁ santaṁ padaṁ abhisamecca', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'yaṁ taṁ santaṁ padaṁ abhisamecca' }, ], witnesses: [ { by: 'Amaravati', - text: 'This is what should be done by one who is skilled in goodness, and who knows the path of peace: let them be able and upright, straightforward and gentle in speech, humble and not conceited.', + text: 'and who knows the path of peace:', + alignTo: [-1, -1, 4, -1, 3, -1, 2], url: AMARAVATI_URL, }, { by: 'Sujato (SuttaCentral)', - text: 'This is what should be done by one skilled in the good who has comprehended the state of peace. They\'d be capable, sincere, and upright, easy to speak to, gentle, and not proud,', + text: 'who has comprehended the state of peace.', + alignTo: [-1, 4, 4, -1, 3, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0', }, { by: 'Thanissaro (Access to Insight)', - text: 'This is to be done by one skilled in aims who wants to break through to the state of peace: Be capable, upright, and straightforward, easy to instruct, gentle, and not conceited,', + text: 'who wants to break through to the state of peace:', + alignTo: [-1, -1, -1, 4, 4, -1, -1, 3, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC', }, ], words: [ + { form: 'yaṁ', pronunciation: 'yahm', etymology: 'relative pronoun "which/that" (neuter accusative)', gloss: 'which, that' }, + { form: 'taṁ', pronunciation: 'tahm', etymology: 'demonstrative pronoun (neuter accusative)', gloss: 'that' }, { form: 'santaṁ', - gloss: 'Peaceful, calmed. From *√śam* "to calm, quiet". The "path of peace" the worker of goodness is heading toward.', + pronunciation: 'SAHN-tahm', + etymology: 'past participle of *√śam* "to calm, quiet" (accusative, agreeing with *padaṁ*)', + gloss: 'peaceful, calmed — the quality of the state', accent: 'sky', + morphemes: [ + { text: 'sant', type: 'root', root: '√śam', gloss: 'calmed, at peace (past participle)', pronunciation: 'sahnt' }, + { text: 'aṁ', type: 'suffix', gloss: 'accusative singular neuter', pronunciation: 'ahm' }, + ], citations: [dpdCitation('santa')], }, + { + form: 'padaṁ', + pronunciation: 'PAH-dahm', + etymology: 'Pāli *pada* "foot, step, foothold, state, position" — same root as Skt *pad*', + gloss: 'state, foothold, ground — the "peaceful state" (nibbāna in commentarial reading)', + citations: [dpdCitation('pada')], + }, + { + form: 'abhisamecca', + pronunciation: 'ah-bhee-sah-MAYCH-cha', + etymology: '*abhi-* "toward" + *sam-* "fully" + *√i* "to go" — gerund "having comprehended"', + gloss: 'having comprehended, having broken through to (gerund)', + morphemes: [ + { text: 'abhi', type: 'prefix', gloss: 'toward, fully', pronunciation: 'ah-bhee' }, + { text: 'sam', type: 'prefix', gloss: 'together, completely', pronunciation: 'sahm' }, + { text: 'ecca', type: 'suffix', root: '√i', gloss: '*√i* "to go" + gerund ending — "having gone-toward"', pronunciation: 'AYCH-cha' }, + ], + }, + ], + }, + // ── v1c: sakko ujū ca suhujū ca ── + { + id: 'v1c-sakko-uju', + pali: 'sakko ujū ca suhujū ca', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'sakko ujū ca suhujū ca' }, + ], + witnesses: [ + { + by: 'Amaravati', + text: 'let them be able and upright,', + alignTo: [-1, -1, -1, 0, -1, 1], + url: AMARAVATI_URL, + }, + { + by: 'Sujato (SuttaCentral)', + text: 'They\'d be capable, sincere, and upright,', + alignTo: [-1, -1, 0, 3, -1, 1], + url: 'https://suttacentral.net/snp1.8/en/sujato', + license: 'CC0', + }, + { + by: 'Thanissaro (Access to Insight)', + text: 'Be capable, upright, and straightforward,', + alignTo: [-1, 0, 1, -1, 3], + url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', + license: 'CC BY-NC', + }, + ], + words: [ + { + form: 'sakko', + pronunciation: 'SAHK-koh', + etymology: 'Pāli *sakka* "able, capable" + *-o* nominative (Skt *śakta*, from *√śak* "to be able")', + gloss: 'able, capable — first of the chanter\'s inner qualities', + citations: [dpdCitation('sakka')], + }, + { + form: 'ujū', + pronunciation: 'OO-joo', + etymology: 'Pāli *uju* "straight, upright" (Skt *ṛju*)', + gloss: 'upright, straight — physical and moral uprightness', + citations: [dpdCitation('uju')], + }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + { + form: 'suhujū', + pronunciation: 'SOO-hoo-joo', + etymology: '*su-* "well, very" + *uju* "straight"', + gloss: 'very upright, perfectly sincere — an intensified form of *ujū*', + morphemes: [ + { text: 'su', type: 'prefix', gloss: 'well, very, properly', pronunciation: 'soo' }, + { text: 'hujū', type: 'stem', gloss: '*uju* (straight) with sandhi gloss', pronunciation: 'HOO-joo' }, + ], + }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + ], + }, + // ── v1d: suvaco c'assa mudu anatimānī ── + { + id: 'v1d-suvaco-mudu', + pali: 'suvaco c\'assa mudu anatimānī', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'suvaco c\'assa mudu anatimānī' }, + ], + witnesses: [ + { + by: 'Amaravati', + text: 'straightforward and gentle in speech, humble and not conceited.', + alignTo: [-1, -1, 2, -1, 0, 3, -1, 3, 3], + url: AMARAVATI_URL, + }, + { + by: 'Sujato (SuttaCentral)', + text: 'easy to speak to, gentle, and not proud,', + alignTo: [0, 0, 0, 0, 2, -1, 3, 3], + url: 'https://suttacentral.net/snp1.8/en/sujato', + license: 'CC0', + }, + { + by: 'Thanissaro (Access to Insight)', + text: 'easy to instruct, gentle, and not conceited,', + alignTo: [0, 0, 0, 2, -1, 3, 3], + url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', + license: 'CC BY-NC', + }, + ], + words: [ + { + form: 'suvaco', + pronunciation: 'SOO-vah-choh', + etymology: '*su-* "well" + *vaca* "speech" (root *√vac*) — "easily-spoken-to"', + gloss: 'easy to speak to, amenable to correction', + morphemes: [ + { text: 'su', type: 'prefix', gloss: 'well, easily', pronunciation: 'soo' }, + { text: 'vaco', type: 'stem', root: '√vac', gloss: '*vaca* "speech" + nominative — "spoken-to"', pronunciation: 'VAH-choh' }, + ], + citations: [dpdCitation('suvaca')], + }, + { + form: "c'assa", + pronunciation: 'CHAHS-sah', + etymology: '*ca* "and" + *assa* "(may) be" — sandhi contraction (3sg optative of *√as*)', + gloss: 'and may [one] be — the optative carries through the next several verses', + }, + { + form: 'mudu', + pronunciation: 'MOO-doo', + etymology: 'Pāli *mudu* "soft, gentle" (Skt *mṛdu*)', + gloss: 'gentle, soft, mild', + citations: [dpdCitation('mudu')], + }, + { + form: 'anatimānī', + pronunciation: 'ah-nah-tee-MAH-nee', + etymology: '*an-* "not" + *ati-* "over, excessive" + *māna* "pride" + *-ī* possessive — "not having excessive pride"', + gloss: 'not arrogant, not conceited — the opposite of *atimāna* (excessive self-regard)', + morphemes: [ + { text: 'an', type: 'prefix', gloss: 'not (assimilated *a-* before vowel)', pronunciation: 'ahn' }, + { text: 'ati', type: 'prefix', gloss: 'over, beyond, excessive', pronunciation: 'AH-tee' }, + { text: 'mānī', type: 'stem', root: '√man', gloss: 'one having pride (*māna* + possessive *-ī*)', pronunciation: 'MAH-nee' }, + ], + citations: [dpdCitation('māna')], + }, ], }, { From 7040a442f9034d053125ddbcc6e4297a7f6c81e8 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 15:06:30 -0400 Subject: [PATCH 02/23] fix(liturgy): metta v1 morpheme reconstruction + c'assa apostrophe tokenization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two Playwright-verified bugs in verse 1: 1. kusalena's morphemes (kusala + ena = 9 chars) didn't reconstruct the 8-char surface, so the splitter returned null and the word fell back to whole-word hover. Switch to kusal + ena (the sandhi-shortened stem) so the split round-trips and each piece becomes hoverable. 2. The default Latin tokenizer splits on the apostrophe in c'assa, yielding 'c' and 'assa' as two pali tokens. My alignTo treated c'assa as one token at idx 1, so 'mudu' and 'anatimānī' references pointed at the wrong pali surface. Add a tokens hint on the v1d pi-Latn script variant to keep c'assa as one hover unit, matching the alignTo indexing. --- data/liturgy/metta-sutta.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 5ad0f30..391953e 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -109,10 +109,10 @@ export const mettaSutta: LiturgyDoc = { { form: 'kusalena', pronunciation: 'koo-sah-LAY-nah', - etymology: '*kusala* "skilful, wholesome" + *-ena* instrumental ending', + etymology: '*kusala* "skilful, wholesome" + *-ena* instrumental ending (stem-final *-a* + *-ena* coalesces to *-ena*)', gloss: 'by one skilled (instrumental) — *kusala* is the same term used for "wholesome" mental states across the Pāli canon', morphemes: [ - { text: 'kusala', type: 'stem', gloss: 'skilful, wholesome', pronunciation: 'koo-SAH-lah' }, + { text: 'kusal', type: 'stem', gloss: 'skilful, wholesome (stem *kusala*; final *-a* drops at sandhi)', pronunciation: 'koo-SAHL' }, { text: 'ena', type: 'suffix', gloss: 'instrumental case ending — "by [one who is]"', pronunciation: 'AY-nah' }, ], citations: [dpdCitation('kusala')], @@ -246,7 +246,9 @@ export const mettaSutta: LiturgyDoc = { id: 'v1d-suvaco-mudu', pali: 'suvaco c\'assa mudu anatimānī', scripts: [ - { lang: 'pi-Latn', label: 'Pāli', text: 'suvaco c\'assa mudu anatimānī' }, + // tokens hint keeps the sandhi compound c'assa as one hover unit; + // without it the default Latin tokenizer splits on the apostrophe. + { lang: 'pi-Latn', label: 'Pāli', text: 'suvaco c\'assa mudu anatimānī', tokens: ['suvaco', "c'assa", 'mudu', 'anatimānī'] }, ], witnesses: [ { From 2afa70629b645b5f7c53219ff685f8f89abb5ba1 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 15:16:46 -0400 Subject: [PATCH 03/23] feat(liturgy): glue-word opacity + plain-register rewrite (Metta v1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two pieces, both addressing user feedback to learn from mn10 + the CURATION_PROTOCOL.md Plain-Register Check: 1. Renderer: EnglishLine now accepts alignTo and dims any English token whose alignTo entry is -1 to opacity 0.55. These are 'glue words' — English scaffolding that has no Pāli counterpart (mn10 calls them 'ghost words' and renders them at 0.3; we settle higher because liturgy glue is more often unavoidable syntax than fully supplied content). The eye now lands on content words that actually map back. 2. Metta verse 1: rewrite morpheme + word glosses in plain prose register. CURATION_PROTOCOL.md §3.4 calls out 'gerundive ending', 'instrumental case ending', 'past participle', 'accusative singular neuter' as diagnostic failure-tone words. Replaced with the mn10 model — concrete teaching using everyday analogies (e.g. -yam tail = 'like English -able in doable, but with a must flavour'; -aṁ tail = 'pronounced like um in hum'; -ena tail = 'English wedges in by to do the same job; Pāli changes the word's tail'). Also: attha gloss expanded to the full sense range the user supplied (benefit, welfare, good, purpose, aim, meaning) and the v1a Amaravati alignTo fixed so 'in' → -1 (glue) instead of 1 (attha) — removes the duplicate arrow you flagged from attha to 'in' AND 'goodness'. --- .../liturgy/shapes/TripleScriptWitness.tsx | 18 +++++- data/liturgy/metta-sutta.ts | 64 +++++++++---------- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/components/liturgy/shapes/TripleScriptWitness.tsx b/components/liturgy/shapes/TripleScriptWitness.tsx index faf2374..268878b 100644 --- a/components/liturgy/shapes/TripleScriptWitness.tsx +++ b/components/liturgy/shapes/TripleScriptWitness.tsx @@ -704,7 +704,16 @@ const EnglishLine: React.FC<{ * attestations. */ witnessBy?: string; -}> = ({ text, accentByEnIdx, witnessBy }) => { + /** + * Witness's per-English-word mapping to Pāli surface position. When + * an entry is -1, the English word is "glue" — connective tissue + * English needs that has no Pāli counterpart ("This is what should be + * done" → "is", "what", "be" carry no Pāli, only "done" maps). The + * mn10 reader dims those words so the eye lands on content words. + * Without alignTo, all words render at full opacity. + */ + alignTo?: number[]; +}> = ({ text, accentByEnIdx, witnessBy, alignTo }) => { const { settings } = useLiturgySettings(); const tokens = tokenizeEnglish(text); let engIdx = -1; @@ -717,6 +726,11 @@ const EnglishLine: React.FC<{ const accentClass = settings.showAccents && accent ? ACCENT_CLASS[accent] : ''; const concepts = conceptsForToken('en', 'Latn', t, witnessBy); const conceptAttr = concepts.length > 0 ? concepts.join(' ') : undefined; + // Glue word: English-only scaffolding with no Pāli source. mn10 + // renders these at 0.55 opacity (Legend.tsx uses 0.3 for "ghost + // words"; we settle higher because liturgy glue is more often + // unavoidable English syntax than fully supplied content). + const isGlue = alignTo !== undefined && alignTo[engIdx] === -1; return ( {t} @@ -1287,6 +1302,7 @@ const SegmentRow: React.FC<{ text={currentWitness.text} accentByEnIdx={accentByEnIdx} witnessBy={currentWitness.by} + alignTo={currentWitness.alignTo} /> diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 391953e..06aa622 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -68,7 +68,7 @@ export const mettaSutta: LiturgyDoc = { { by: 'Amaravati', text: 'This is what should be done by one who is skilled in goodness,', - alignTo: [0, 0, 0, 0, 0, 0, -1, 2, -1, -1, 2, 1, 1], + alignTo: [0, 0, 0, 0, 0, 0, -1, 2, -1, -1, 2, -1, 1], url: AMARAVATI_URL, }, { @@ -90,30 +90,30 @@ export const mettaSutta: LiturgyDoc = { { form: 'karaṇīyam', pronunciation: 'kah-rah-NEE-yahm', - etymology: 'gerundive of *√kṛ* "to do" — "that which should be done"', - gloss: 'should be done — the opening word frames the whole sutta as instruction', + etymology: 'from the verb meaning "to do, make" — turned into "what ought to be done"', + gloss: 'should be done — the opening word frames the whole sutta as instruction: "Here is what you do."', morphemes: [ - { text: 'karaṇī', type: 'root', root: '√kṛ', gloss: 'to do, make', pronunciation: 'kah-rah-NEE' }, - { text: 'yam', type: 'suffix', gloss: 'gerundive ending — "to-be-Xed"', pronunciation: 'yahm' }, + { text: 'karaṇī', type: 'root', root: '√kṛ', gloss: 'from the verb "to do, make" — same root that gives English speakers *karma* (literally "the doing")', pronunciation: 'kah-rah-NEE' }, + { text: 'yam', type: 'suffix', gloss: 'the "-yam" tail turns the verb "do" into "should be done". Similar to English adding "-able" to make "doable", but with a *must* flavour rather than a *can*.', pronunciation: 'yahm' }, ], citations: [dpdCitation('karaṇīya')], }, { form: 'attha', pronunciation: 'AHT-tah', - etymology: 'Pāli *attha* "aim, meaning, the good" (Skt *artha*)', - gloss: 'the good, the aim — the goal of practice; what is worth doing', + etymology: 'one of the most range-y Pāli nouns — covers everything from "the good" to "what something means"', + gloss: 'benefit, welfare, good, purpose, aim, meaning — a single word holding all these senses at once. Here: "the good", the worthwhile aim that the skilled person is pursuing.', accent: 'amber', citations: [dpdCitation('attha')], }, { form: 'kusalena', pronunciation: 'koo-sah-LAY-nah', - etymology: '*kusala* "skilful, wholesome" + *-ena* instrumental ending (stem-final *-a* + *-ena* coalesces to *-ena*)', - gloss: 'by one skilled (instrumental) — *kusala* is the same term used for "wholesome" mental states across the Pāli canon', + etymology: '*kusala* "skilful, wholesome" — the stem\'s final "a" merges with the "-ena" ending', + gloss: 'by one who is skilled. *Kusala* is the same word Buddhist texts use for "wholesome" states of mind — skilfulness is moral as well as practical.', morphemes: [ - { text: 'kusal', type: 'stem', gloss: 'skilful, wholesome (stem *kusala*; final *-a* drops at sandhi)', pronunciation: 'koo-SAHL' }, - { text: 'ena', type: 'suffix', gloss: 'instrumental case ending — "by [one who is]"', pronunciation: 'AY-nah' }, + { text: 'kusal', type: 'stem', gloss: 'skilful, wholesome — the same word Pāli texts use to mark a "good" mind-state (the opposite of *akusala*, "unwholesome").', pronunciation: 'koo-SAHL' }, + { text: 'ena', type: 'suffix', gloss: 'the "-ena" tail marks the *doer* of the action — "by this person". English wedges in the word "by" to do the same job; Pāli changes the tail of the word itself.', pronunciation: 'AY-nah' }, ], citations: [dpdCitation('kusala')], }, @@ -149,36 +149,36 @@ export const mettaSutta: LiturgyDoc = { }, ], words: [ - { form: 'yaṁ', pronunciation: 'yahm', etymology: 'relative pronoun "which/that" (neuter accusative)', gloss: 'which, that' }, - { form: 'taṁ', pronunciation: 'tahm', etymology: 'demonstrative pronoun (neuter accusative)', gloss: 'that' }, + { form: 'yaṁ', pronunciation: 'yahm', gloss: 'which, that — a pointer word; in this verse it points to *padaṁ* ("the state") coming up' }, + { form: 'taṁ', pronunciation: 'tahm', gloss: 'that one — pairs with *yaṁ* the way English pairs "which" with "that"' }, { form: 'santaṁ', pronunciation: 'SAHN-tahm', - etymology: 'past participle of *√śam* "to calm, quiet" (accusative, agreeing with *padaṁ*)', - gloss: 'peaceful, calmed — the quality of the state', + etymology: 'from a verb root meaning "to calm, quiet down"', + gloss: 'peaceful, calmed — describes the *padaṁ* ("state") that comes next. The same root *√śam* gives the word *śamatha* (tranquility meditation).', accent: 'sky', morphemes: [ - { text: 'sant', type: 'root', root: '√śam', gloss: 'calmed, at peace (past participle)', pronunciation: 'sahnt' }, - { text: 'aṁ', type: 'suffix', gloss: 'accusative singular neuter', pronunciation: 'ahm' }, + { text: 'sant', type: 'root', root: '√śam', gloss: 'from the verb "to calm, quiet". *Sant* is the form for something that has been calmed — like English "settled" or "stilled".', pronunciation: 'sahnt' }, + { text: 'aṁ', type: 'suffix', gloss: 'the "-aṁ" tail flags this word as the *thing being acted on* — here, the "peaceful state" that\'s being comprehended. Pronounced as a soft nasal close, like "um" in English "hum".', pronunciation: 'ahm' }, ], citations: [dpdCitation('santa')], }, { form: 'padaṁ', pronunciation: 'PAH-dahm', - etymology: 'Pāli *pada* "foot, step, foothold, state, position" — same root as Skt *pad*', - gloss: 'state, foothold, ground — the "peaceful state" (nibbāna in commentarial reading)', + etymology: 'literally "foot, step", broadened to "foothold, place, state, condition" — like English "footing" or "standing"', + gloss: 'state, ground, footing — what the commentaries take as *nibbāna*, the peaceful destination. Same root gives English speakers the *-pad* in compound words like *quadruped*.', citations: [dpdCitation('pada')], }, { form: 'abhisamecca', pronunciation: 'ah-bhee-sah-MAYCH-cha', - etymology: '*abhi-* "toward" + *sam-* "fully" + *√i* "to go" — gerund "having comprehended"', - gloss: 'having comprehended, having broken through to (gerund)', + etymology: 'three pieces: *abhi-* (toward) + *sam-* (together, fully) + *√i* (to go) — "having gone all the way to it"', + gloss: 'having come to fully understand it — literally "having gone right up to" the peaceful state. The word frames understanding as a journey completed, not a thought entertained.', morphemes: [ - { text: 'abhi', type: 'prefix', gloss: 'toward, fully', pronunciation: 'ah-bhee' }, - { text: 'sam', type: 'prefix', gloss: 'together, completely', pronunciation: 'sahm' }, - { text: 'ecca', type: 'suffix', root: '√i', gloss: '*√i* "to go" + gerund ending — "having gone-toward"', pronunciation: 'AYCH-cha' }, + { text: 'abhi', type: 'prefix', gloss: 'a prefix meaning "toward, up to" — adds a reaching-for flavour to whatever follows', pronunciation: 'ah-bhee' }, + { text: 'sam', type: 'prefix', gloss: 'a prefix meaning "together, fully". Combined with *abhi-* it intensifies into "going all the way".', pronunciation: 'sahm' }, + { text: 'ecca', type: 'suffix', root: '√i', gloss: 'from the verb "to go". The tail of the word means "having Xed" — so *abhi-sam-ecca* = "having gone fully up to [it]", i.e. having grasped it completely.', pronunciation: 'AYCH-cha' }, ], }, ], @@ -216,26 +216,26 @@ export const mettaSutta: LiturgyDoc = { { form: 'sakko', pronunciation: 'SAHK-koh', - etymology: 'Pāli *sakka* "able, capable" + *-o* nominative (Skt *śakta*, from *√śak* "to be able")', - gloss: 'able, capable — first of the chanter\'s inner qualities', + etymology: 'from the verb *√śak* "to be able" — the first of the worker-of-goodness\'s inner qualities', + gloss: 'able, capable — having the strength to follow through', citations: [dpdCitation('sakka')], }, { form: 'ujū', pronunciation: 'OO-joo', - etymology: 'Pāli *uju* "straight, upright" (Skt *ṛju*)', - gloss: 'upright, straight — physical and moral uprightness', + etymology: 'plain meaning "straight" — both bodily (straight posture) and morally (straight conduct)', + gloss: 'upright, straight — neither bent in posture nor crooked in dealings', citations: [dpdCitation('uju')], }, { form: 'ca', pronunciation: 'chah', gloss: 'and' }, { form: 'suhujū', pronunciation: 'SOO-hoo-joo', - etymology: '*su-* "well, very" + *uju* "straight"', - gloss: 'very upright, perfectly sincere — an intensified form of *ujū*', + etymology: '*su-* (the prefix "well, properly") + *uju* (straight). The *s* + *u* combination triggers a soft *h-* in front of *uju* — sound-smoothing.', + gloss: 'really, properly straight — *ujū* doubled down. Fully sincere, with no hidden crookedness.', morphemes: [ - { text: 'su', type: 'prefix', gloss: 'well, very, properly', pronunciation: 'soo' }, - { text: 'hujū', type: 'stem', gloss: '*uju* (straight) with sandhi gloss', pronunciation: 'HOO-joo' }, + { text: 'su', type: 'prefix', gloss: 'a prefix meaning "well, easily, properly". Like English "well-" in "well-spoken".', pronunciation: 'soo' }, + { text: 'hujū', type: 'stem', gloss: '*uju* "straight" — with an *h-* added in front to smooth the join with *su-*. Same word as the previous *ujū*, just intensified by the prefix.', pronunciation: 'HOO-joo' }, ], }, { form: 'ca', pronunciation: 'chah', gloss: 'and' }, From 1cf4fdd4455989006fbe78dfd398f0d010200938 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 15:50:55 -0400 Subject: [PATCH 04/23] =?UTF-8?q?feat(liturgy):=20per-morpheme=20underline?= =?UTF-8?q?=20gaps=20=E2=80=94=20borrow=20mn10's=20px-[2px]=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adjacent morpheme HoverSpans inside a Pāli word rendered their dotted underlines butting against each other, so the eye saw one continuous underline beneath the whole word. mn10 puts a 2px horizontal padding on each segment so the underlines visibly break — kar · aṇī · yam reads as three connected pieces. Borrowed verbatim. --- components/liturgy/shapes/TripleScriptWitness.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/liturgy/shapes/TripleScriptWitness.tsx b/components/liturgy/shapes/TripleScriptWitness.tsx index 268878b..33e7500 100644 --- a/components/liturgy/shapes/TripleScriptWitness.tsx +++ b/components/liturgy/shapes/TripleScriptWitness.tsx @@ -468,7 +468,11 @@ const HoverSpan: React.FC<{ data-hover-span="true" data-morpheme-idx={morphemeIdx} data-concept-ids={conceptAttr} - className={`relative inline-block cursor-help border-b border-dotted border-emerald-700/40 hover:border-emerald-300 hover:text-emerald-100 transition-colors ${ + // Each morpheme gets its own underline + tiny horizontal padding so + // adjacent morphemes don't merge visually. mn10 pattern: the eye + // sees per-segment breaks (kar · aṇī · yam) rather than one long + // continuous underline under the whole word. + className={`relative inline-block cursor-help px-[2px] border-b border-dotted border-emerald-700/40 hover:border-emerald-300 hover:text-emerald-100 transition-colors ${ bold ? 'font-semibold' : '' }`} onMouseEnter={() => setOpen(true)} From 8b6fe17f45a989d6f37dc5f788c20c7964192451 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:31:32 -0400 Subject: [PATCH 05/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=202=20?= =?UTF-8?q?=E2=80=94=204=20prosodic=20segments,=20plain-register=20depth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same model as verse 1: split into v2a-d at the natural caesurae, alignTo per witness, full word data (pronunciation, etymology, gloss) with morphemes broken out for every compound. New roots surfaced: √tuṣ (content), √bhṛ (bear/support), √vṛt (proceed), √gṛdh (greedy). Glosses written in the mn10 plain-prose register — no 'instrumental case ending' or 'past participle'. Where a grammar concept needs explanation (the -esu plural locative ending in kulesu), the technical machinery gets glossed in the same breath: 'the -esu tail marks in/among with a plural — like English in those families.' --- data/liturgy/metta-sutta.ts | 155 +++++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 19 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 06aa622..eedbca2 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -311,40 +311,157 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v2a: santussako ca subharo ca ── { - id: 'verse-2', - pali: 'Santussako ca subharo ca, appakicco ca sallahukavutti; santindriyo ca nipako ca, appagabbho kulesu ananugiddho.', + id: 'v2a-santussako', + pali: 'santussako ca subharo ca', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'santussako ca subharo ca' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Contented and easily satisfied,', alignTo: [0, -1, 2, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'content and unburdensome,', alignTo: [0, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'content and easy to support,', alignTo: [0, -1, 2, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Santussako ca subharo ca, appakicco ca sallahukavutti; santindriyo ca nipako ca, appagabbho kulesu ananugiddho.', + form: 'santussako', + pronunciation: 'sahn-TOOS-sah-koh', + etymology: '*saṁ* (fully) + *tussako* (one who is pleased — from the verb *√tuṣ* "to be pleased, satisfied"). Same *√tuṣ* gives English *santosha* (contentment) in popular usage.', + gloss: 'easily contented — pleased with what one has; the temperament of one not chasing more', + accent: 'amber', + morphemes: [ + { text: 'san', type: 'prefix', gloss: 'the prefix *saṁ-* "fully, together" (the *ṁ* assimilates to *n* before *t*)', pronunciation: 'sahn' }, + { text: 'tussako', type: 'stem', root: '√tuṣ', gloss: 'one who is pleased — from the verb "to be satisfied". The full word means "fully content, easily pleased".', pronunciation: 'TOOS-sah-koh' }, + ], }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + { + form: 'subharo', + pronunciation: 'SOO-bah-roh', + etymology: '*su-* (easily) + *bhara* (carrying, supporting — from *√bhṛ* "to bear, carry")', + gloss: 'easy to support — needing little from those who give. Used of monastics who don\'t make a fuss about food, robes, lodging.', + morphemes: [ + { text: 'su', type: 'prefix', gloss: 'a prefix meaning "well, easily". Same prefix as in *suvaco* (verse 1).', pronunciation: 'soo' }, + { text: 'bharo', type: 'stem', root: '√bhṛ', gloss: 'from the verb "to bear, carry". *Subharo* = "easy to carry, easy to support" — undemanding.', pronunciation: 'BAH-roh' }, + ], + }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + ], + }, + // ── v2b: appakicco ca sallahukavutti ── + { + id: 'v2b-appakicco', + pali: 'appakicco ca sallahukavutti', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'appakicco ca sallahukavutti' }, ], witnesses: [ + { by: 'Amaravati', text: 'unburdened with duties and frugal in their ways.', alignTo: [-1, 0, -1, 0, 2, 2, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'living lightly with few duties,', alignTo: [2, 2, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'with few duties, living lightly,', alignTo: [-1, 0, 0, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'Contented and easily satisfied, unburdened with duties and frugal in their ways. Peaceful and calm and wise and skillful, not proud or demanding in nature.', - url: AMARAVATI_URL, + form: 'appakicco', + pronunciation: 'AHP-pah-keech-choh', + etymology: '*appa* (little, few) + *kicca* (duty, what should be done — from the same verb *√kṛ* as *karaṇīyam* in verse 1)', + gloss: 'having few duties — light schedule, few external obligations', + morphemes: [ + { text: 'appa', type: 'prefix', gloss: 'a stem meaning "little, few". Used as a first member of compounds to negate or minimise.', pronunciation: 'AHP-pah' }, + { text: 'kicco', type: 'stem', root: '√kṛ', gloss: 'duty, what should be done — same verb-root as *karaṇīyam* in verse 1. *Appa-kicco* = "few-duties".', pronunciation: 'KEECH-choh' }, + ], }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, { - by: 'Sujato (SuttaCentral)', - text: 'content and unburdensome, living lightly with few duties, sensible and prudent, not arrogant or fawning over families.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'sallahukavutti', + pronunciation: 'sahl-LAH-hoo-kah-VOOT-tee', + etymology: '*sallahuka* (very light — *sa(ṁ)* intensifier + *lahuka* "light") + *vutti* (mode of life, conduct — from *√vṛt* "to turn, go on")', + gloss: 'living lightly — way-of-life with little baggage, easy of habits', + morphemes: [ + { text: 'sallahuka', type: 'stem', gloss: 'very light, easy — *sa-* intensifies *lahuka* "light" (related to English "light" through Indo-European cousins)', pronunciation: 'sahl-LAH-hoo-kah' }, + { text: 'vutti', type: 'stem', root: '√vṛt', gloss: 'conduct, way of going on — from a verb meaning "to turn, proceed". Same root as English *vortex*.', pronunciation: 'VOOT-tee' }, + ], + }, + ], + }, + // ── v2c: santindriyo ca nipako ca ── + { + id: 'v2c-santindriyo', + pali: 'santindriyo ca nipako ca', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'santindriyo ca nipako ca' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Peaceful and calm and wise and skillful,', alignTo: [0, -1, 0, -1, 2, -1, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'sensible and prudent,', alignTo: [0, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'with peaceful faculties, masterful,', alignTo: [-1, 0, 0, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { + form: 'santindriyo', + pronunciation: 'sahn-TEEN-dree-yoh', + etymology: '*santa* (peaceful — same *santaṁ* as verse 1) + *indriya* (faculty — the senses, plus mind, treated as a sixth)', + gloss: 'with calmed senses — eyes, ears, mind etc. all at peace; not yanked around by sense-impressions', + accent: 'sky', + morphemes: [ + { text: 'sant', type: 'root', root: '√śam', gloss: 'calmed, at peace — the same root as *santaṁ* in verse 1', pronunciation: 'sahnt' }, + { text: 'indriyo', type: 'stem', gloss: 'the senses (sight, hearing, smell, taste, touch, plus mind treated as a sixth). Literally "belonging to Indra" — the powers of the lord of the senses.', pronunciation: 'EEN-dree-yoh' }, + ], }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, { - by: 'Thanissaro (Access to Insight)', - text: 'content and easy to support, with few duties, living lightly, with peaceful faculties, masterful, modest, and no greed for supporters.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'nipako', + pronunciation: 'NEE-pah-koh', + etymology: 'related to *√pac* "to mature, ripen" — a person whose understanding has fully ripened', + gloss: 'wise, prudent — the kind of wisdom that comes from maturity, not book-learning', }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + ], + }, + // ── v2d: appagabbho kulesu ananugiddho ── + { + id: 'v2d-appagabbho', + pali: 'appagabbho kulesu ananugiddho', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'appagabbho kulesu ananugiddho' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'not proud or demanding in nature.', alignTo: [0, 0, -1, 0, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'not arrogant or fawning over families.', alignTo: [0, 0, -1, 2, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'modest, and no greed for supporters.', alignTo: [0, -1, 2, 2, -1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { - form: 'Santussako', - gloss: 'Easily content, satisfied with little. *sam* "fully" + *√tuṣ* "be pleased". A core monastic virtue.', - accent: 'amber', + form: 'appagabbho', + pronunciation: 'AHP-pah-GAHB-bho', + etymology: '*appa* (little, not) + *gabbha* (impudent, rude — from a different sense of the word that also means "womb, interior")', + gloss: 'not impudent — not pushy with families, not putting on airs', + morphemes: [ + { text: 'appa', type: 'prefix', gloss: 'a stem meaning "little, not" — same prefix as in *appakicco*', pronunciation: 'AHP-pah' }, + { text: 'gabbho', type: 'stem', gloss: 'impudent, forward, intrusive. *Appa-gabbho* = "not-pushy".', pronunciation: 'GAHB-bho' }, + ], + }, + { + form: 'kulesu', + pronunciation: 'koo-LAY-soo', + etymology: '*kula* (family, clan, household) — the "-esu" tail means "in/among"', + gloss: 'in/among families — i.e., the lay families a monastic visits for alms', + morphemes: [ + { text: 'kul', type: 'stem', gloss: 'family, household. *Kula* covers the extended sense — clan, lineage, the people in a house.', pronunciation: 'kool' }, + { text: 'esu', type: 'suffix', gloss: 'the "-esu" tail marks "in/among" with a plural — like English saying "in those families".', pronunciation: 'AY-soo' }, + ], + }, + { + form: 'ananugiddho', + pronunciation: 'ah-nah-noo-GEED-dho', + etymology: '*an-* (not) + *anu-* (along, after) + *giddha* (greedy, attached — from *√gṛdh* "to be greedy")', + gloss: 'not running-after with greed — not chasing the families for what they can give', + morphemes: [ + { text: 'an', type: 'prefix', gloss: 'a prefix meaning "not"', pronunciation: 'ahn' }, + { text: 'anu', type: 'prefix', gloss: 'a prefix meaning "along, after" — adds a "chasing after" flavour', pronunciation: 'AH-noo' }, + { text: 'giddho', type: 'stem', root: '√gṛdh', gloss: 'greedy, attached — from a verb meaning "to be greedy". *An-anu-giddho* = "not chasing-after-greedily".', pronunciation: 'GEED-dho' }, + ], }, ], }, From 4ca44ccf6b1df364d5c9b43867c75b78bc518e40 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:34:25 -0400 Subject: [PATCH 06/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=203=20?= =?UTF-8?q?=E2=80=94=204=20prosodic=20segments,=20plain-register=20depth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v3a-d: 'Let them not do the slightest thing the wise would reprove ... may all beings be happy at heart.' New roots surfaced: √car (act, conduct), √jñā (know — viññū), √vad (speak — upavadeyyuṁ), √bhū (be — bhavantu/hontu), √as (be — sattā). The wishing voice *hontu* / *bhavantu* introduced — the heart of the metta sutta starts in this verse. --- data/liturgy/metta-sutta.ts | 162 ++++++++++++++++++++++++++++++++---- 1 file changed, 144 insertions(+), 18 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index eedbca2..862f7b4 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -465,47 +465,173 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v3a: na ca khuddhaṁ samācare kiñci ── { - id: 'verse-3', - pali: 'Na ca khuddhaṁ samācare kiñci, yena viññū pare upavadeyyuṁ; sukhino vā khemino hontu, sabbe sattā bhavantu sukhitattā.', + id: 'v3a-na-khuddham', + pali: 'na ca khuddhaṁ samācare kiñci', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'na ca khuddhaṁ samācare kiñci' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Let them not do the slightest thing', alignTo: [-1, -1, 0, 3, -1, 2, 4], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "They'd not do the slightest thing", alignTo: [-1, 0, 3, -1, 2, 4], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Do not do the slightest thing', alignTo: [3, 0, 3, -1, 2, 4], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'na', pronunciation: 'nah', gloss: '"not". Combines with the next verb to negate the whole sentence.' }, + { form: 'ca', pronunciation: 'chah', gloss: 'and. Here it links this verse to the qualities listed in verse 2.' }, { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Na ca khuddhaṁ samācare kiñci, yena viññū pare upavadeyyuṁ; sukhino vā khemino hontu, sabbe sattā bhavantu sukhitattā.', + form: 'khuddhaṁ', + pronunciation: 'KHOOD-dahm', + etymology: '*khudda* "small, petty, mean" + the *-ṁ* tail marking it as the object of the action', + gloss: 'anything petty or mean — not just small in size, but small-minded', + }, + { + form: 'samācare', + pronunciation: 'sah-MAH-chah-ray', + etymology: '*saṁ-* (together, fully) + *ā-* (toward) + *√car* (to walk, go, act). The whole verb means "to conduct oneself, behave".', + gloss: 'should do, should conduct oneself in. The ending makes it "let one do" — a gentle imperative.', + morphemes: [ + { text: 'sam', type: 'prefix', gloss: 'a prefix meaning "fully, together" (the *ṁ* assimilates to *m* before a vowel)', pronunciation: 'sahm' }, + { text: 'ā', type: 'prefix', gloss: 'a prefix meaning "toward, at"', pronunciation: 'ah' }, + { text: 'care', type: 'root', root: '√car', gloss: 'from the verb "to walk, conduct oneself, behave". Same root as *caryā* (practice, conduct).', pronunciation: 'CHAH-ray' }, + ], }, + { form: 'kiñci', pronunciation: 'KEEN-chee', gloss: '"anything (at all)". Pairs with the negation *na* — "not anything", i.e. "nothing".' }, + ], + }, + // ── v3b: yena viññū pare upavadeyyuṁ ── + { + id: 'v3b-yena-vinnu', + pali: 'yena viññū pare upavadeyyuṁ', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'yena viññū pare upavadeyyuṁ' }, ], witnesses: [ + { by: 'Amaravati', text: 'that the wise would later reprove.', alignTo: [0, -1, 1, -1, -1, 3], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'that others might blame them for.', alignTo: [0, 2, -1, 3, -1, -1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'that the wise would later censure.', alignTo: [0, -1, 1, -1, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'Let them not do the slightest thing that the wise would later reprove. Wishing: in gladness and in safety, may all beings be at ease.', - url: AMARAVATI_URL, + form: 'yena', + pronunciation: 'YAY-nah', + gloss: 'by which, on account of which. A pointer back to the petty thing in 3a — "[the thing] on account of which the wise would reprove".', }, { - by: 'Sujato (SuttaCentral)', - text: 'They\'d not do the slightest thing that others might blame them for. Their thought is: \'May all beings be happy and safe! May all beings be happy!\'', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'viññū', + pronunciation: 'VEEN-yoo', + etymology: '*vi-* (apart, fully) + *√jñā* (to know) — "one who fully discerns"', + gloss: 'the wise — specifically, those with discerning knowledge. Same *√jñā* as English *gnostic*, *recognise*.', + accent: 'sky', + morphemes: [ + { text: 'vi', type: 'prefix', gloss: 'a prefix meaning "apart, fully" — adds a discerning, analytical flavour', pronunciation: 'vee' }, + { text: 'ññū', type: 'root', root: '√jñā', gloss: 'from the verb "to know". *Viññū* = "one who discerns, the wise".', pronunciation: 'NYOO' }, + ], }, { - by: 'Thanissaro (Access to Insight)', - text: 'Do not do the slightest thing that the wise would later censure. Think: Happy, at rest, may all beings be happy at heart.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'pare', + pronunciation: 'PAH-ray', + gloss: 'others — the other people, the rest of the community. (Plural of *para* "other".)', + }, + { + form: 'upavadeyyuṁ', + pronunciation: 'oo-pah-vah-DAYY-oom', + etymology: '*upa-* (near, against) + *√vad* (to speak) — "to speak against, reprove". The "-eyyuṁ" tail makes it "they would speak against".', + gloss: 'would reprove, would blame — the conditional "would" plus a plural "they".', + morphemes: [ + { text: 'upa', type: 'prefix', gloss: 'a prefix meaning "near, against" — adds a "speaking-against" flavour to the verb that follows', pronunciation: 'OO-pah' }, + { text: 'vad', type: 'root', root: '√vad', gloss: 'from the verb "to speak". Same root as English *vow* via Indo-European cousins.', pronunciation: 'vahd' }, + { text: 'eyyuṁ', type: 'suffix', gloss: 'the "-eyyuṁ" tail says "they would (do this)". A conditional plural — *vad-eyyuṁ* = "they would speak".', pronunciation: 'AYY-oom' }, + ], }, ], + }, + // ── v3c: sukhino vā khemino hontu ── + { + id: 'v3c-sukhino-khemino', + pali: 'sukhino vā khemino hontu', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'sukhino vā khemino hontu' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Wishing: in gladness and in safety,', alignTo: [3, -1, 0, 1, -1, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "'May all beings be happy and safe!", alignTo: [3, -1, -1, 3, 0, 1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Happy, at rest,', alignTo: [0, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { + form: 'sukhino', + pronunciation: 'SOO-khee-noh', + etymology: '*sukha* (happiness, ease) + *-in* (possessive) — "having happiness"', + gloss: 'happy ones, those-with-ease. *Sukha* is the everyday opposite of *dukkha* (suffering) — it just means "the good kind of feeling".', + accent: 'amber', + }, + { form: 'vā', pronunciation: 'vah', gloss: 'or — though here it almost reads "and" in the listing.' }, + { + form: 'khemino', + pronunciation: 'KHAY-mee-noh', + etymology: '*khema* (safety, security) + *-in* (possessive) — "having safety"', + gloss: 'safe ones, those-out-of-danger. *Khema* is the word for the safety of a city behind walls, or a mind out of reach of harm.', + accent: 'sky', + }, + { + form: 'hontu', + pronunciation: 'HOHN-too', + etymology: 'from *√hū / √bhū* "to be". The "-ntu" tail makes it "may they be" — a wish or invocation.', + gloss: 'may [they] be. The wishing voice — the heart of the metta sutta starts here.', + }, + ], + }, + // ── v3d: sabbe sattā bhavantu sukhitattā ── + { + id: 'v3d-sabbe-satta', + pali: 'sabbe sattā bhavantu sukhitattā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'sabbe sattā bhavantu sukhitattā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'may all beings be at ease.', alignTo: [-1, 0, 1, 2, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "May all beings be happy!'", alignTo: [-1, 0, 1, 2, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'may all beings be happy at heart.', alignTo: [-1, 0, 1, 2, 3, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ { form: 'sabbe', - gloss: 'All, every. The first appearance of the universalising move that runs through the sutta.', + pronunciation: 'SAHB-bay', + etymology: 'plural of *sabba* "all, every" (Skt *sarva*)', + gloss: 'all, every. The first appearance of the universalising move — the wish covers *everyone*, with no exception.', accent: 'rose', }, { form: 'sattā', - gloss: 'Beings, sentient creatures. *sabbe sattā* = "all beings", the recurring address of the metta wish.', + pronunciation: 'SAHT-tah', + etymology: 'plural of *satta* "being, sentient creature" — from *√as* "to be", literally "those who are"', + gloss: 'beings, sentient creatures. *Sabbe sattā* = "all beings" is the recurring address of the metta wish.', accent: 'rose', citations: [dpdCitation('satta')], }, + { + form: 'bhavantu', + pronunciation: 'bah-VAHN-too', + etymology: 'from *√bhū* "to be, become" — the "-ntu" tail makes it "may they be"', + gloss: 'may [they] be. Same wishing voice as *hontu* in 3c; the verb just changes register.', + morphemes: [ + { text: 'bhav', type: 'root', root: '√bhū', gloss: 'from the verb "to be, become". Same root that gives English *be* through Indo-European cousins.', pronunciation: 'bahv' }, + { text: 'antu', type: 'suffix', gloss: 'the "-antu" tail says "may they (be)". A wishing form — *bhav-antu* = "may they be".', pronunciation: 'AHN-too' }, + ], + }, + { + form: 'sukhitattā', + pronunciation: 'soo-khee-TAHT-tah', + etymology: '*sukhita* (made-happy) + *-attā* (state, condition — from *attan* "self")', + gloss: 'happy of heart, in a state of happiness. The "-attā" tail names it as an inner state, not just a passing feeling.', + accent: 'amber', + morphemes: [ + { text: 'sukhit', type: 'stem', gloss: '"made happy" — from *sukha* (happiness) with a participle ending', pronunciation: 'soo-KHEET' }, + { text: 'attā', type: 'suffix', gloss: 'the "-attā" tail names the inner state. *Sukhit-attā* = "happy-of-self", happy from the inside.', pronunciation: 'AHT-tah' }, + ], + }, ], }, { From ff91b2f8284c7367deae8a439c9c424083e037ad Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:36:11 -0400 Subject: [PATCH 07/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=204=20?= =?UTF-8?q?=E2=80=94=20every-kind-of-being=20inventory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v4a-d sweeps every creature: 'Whatever living beings there are — none excepted, weak or strong; long or large, medium, short, fine, thick.' New compound *pāṇabhūtatthī* broken out (breath + existing + being-one). *rassakāṇukathūlā* split into rassakā + ṇukā + thūlā so the three sizes are individually hoverable. --- data/liturgy/metta-sutta.ts | 114 ++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 17 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 862f7b4..fd178da 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -634,33 +634,113 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v4a: ye keci pāṇabhūtatthī ── { - id: 'verse-4', - pali: 'Ye keci pāṇabhūtatthī, tasā vā thāvarā vā anavasesā; dīghā vā ye mahantā vā, majjhimā rassakāṇukathūlā.', + id: 'v4a-ye-keci', + pali: 'ye keci pāṇabhūtatthī', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'ye keci pāṇabhūtatthī' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Whatever living beings there may be,', alignTo: [0, 2, 2, -1, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'Whatever creatures there are—', alignTo: [0, 2, -1, -1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Whatever beings there may be,', alignTo: [0, 2, -1, -1, -1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'ye', pronunciation: 'yay', gloss: 'which (plural) — pointer word, paired with *keci* below to sweep "whoever".' }, + { form: 'keci', pronunciation: 'KAY-chee', gloss: '"some, any (plural)". Together *ye keci* = "whoever there is", a sweeping inclusion.' }, { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Ye keci pāṇabhūtatthī, tasā vā thāvarā vā anavasesā; dīghā vā ye mahantā vā, majjhimā rassakāṇukathūlā.', + form: 'pāṇabhūtatthī', + pronunciation: 'PAH-nah-boo-TAHT-thee', + etymology: '*pāṇa* (living being, breath) + *bhūta* (existing) + *atthī* (one who is). A piled-up compound emphasising "every kind of being that breathes and exists".', + gloss: 'every kind of breathing, existing being — Pāli triples the synonym to leave no creature uncovered', + accent: 'rose', + morphemes: [ + { text: 'pāṇa', type: 'stem', gloss: 'living being, breath. From *√pan* "to breathe". Same root as English *pneumatic*.', pronunciation: 'PAH-nah' }, + { text: 'bhūt', type: 'root', root: '√bhū', gloss: '"having become, existing" — past form of the verb "to be". Same root as *bhavantu*.', pronunciation: 'BOOT' }, + { text: 'atthī', type: 'suffix', gloss: '"one who is" — adds "the being-one" sense. Final word means "every breathing-existing-being-er".', pronunciation: 'AHT-thee' }, + ], }, ], + }, + // ── v4b: tasā vā thāvarā vā anavasesā ── + { + id: 'v4b-tasa-thavara', + pali: 'tasā vā thāvarā vā anavasesā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'tasā vā thāvarā vā anavasesā' }, + ], witnesses: [ - { - by: 'Amaravati', - text: 'Whatever living beings there may be, whether they are weak or strong, omitting none, the great and the mighty, medium, short or small.', - url: AMARAVATI_URL, + { by: 'Amaravati', text: 'whether they are weak or strong, omitting none,', alignTo: [-1, -1, -1, 0, 1, 2, 4, 4], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'none excepted, weak or strong,', alignTo: [4, 4, 0, 1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'weak or strong, without exception,', alignTo: [0, 1, 2, -1, 4], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'tasā', pronunciation: 'TAH-sah', gloss: 'tremblers — beings that startle, the still-frightened (creatures still subject to fear). Sometimes rendered "weak".' }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + { form: 'thāvarā', pronunciation: 'TAH-vah-rah', gloss: 'standfast — beings firm, stable, no longer trembling. The pair *tasā / thāvarā* sweeps "the still-fearful and the unshaken".' }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + { + form: 'anavasesā', + pronunciation: 'ah-NAH-vah-SAY-sah', + etymology: '*an-* (not) + *avasesa* (remainder, what is left over)', + gloss: 'with-no-remainder — leaving none out. Like saying "every last one" in English.', + morphemes: [ + { text: 'an', type: 'prefix', gloss: 'a prefix meaning "not"', pronunciation: 'ahn' }, + { text: 'avasesā', type: 'stem', gloss: '"remainder, leftover" — *an-avasesā* = "without leftover, with nothing left out"', pronunciation: 'ah-vah-SAY-sah' }, + ], }, + ], + }, + // ── v4c: dīghā vā ye mahantā vā ── + { + id: 'v4c-digha-mahanta', + pali: 'dīghā vā ye mahantā vā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'dīghā vā ye mahantā vā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'the great and the mighty,', alignTo: [-1, 0, -1, -1, 3], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'long or large,', alignTo: [0, 1, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'long, large,', alignTo: [0, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'dīghā', pronunciation: 'DEE-gah', gloss: 'long ones. Pāli *dīgha* "long" gives the *Dīgha Nikāya* (the Long Discourses) its name.' }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + { form: 'ye', pronunciation: 'yay', gloss: 'which (plural) — opens a new "those who are…" clause' }, { - by: 'Sujato (SuttaCentral)', - text: 'Whatever creatures there are— none excepted, weak or strong, long or large, medium-sized, short, slender or thick,', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'mahantā', + pronunciation: 'mah-HAHN-tah', + etymology: '*mahā* "great" (Skt and Pāli) + *-nt* participle ending — "the great-being ones"', + gloss: 'great ones, large. Same *mahā-* as in *mahāmantraḥ* in the Heart Sutra.', }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + ], + }, + // ── v4d: majjhimā rassakāṇukathūlā ── + { + id: 'v4d-majjhima', + pali: 'majjhimā rassakāṇukathūlā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'majjhimā rassakāṇukathūlā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'medium, short or small.', alignTo: [0, 1, -1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'medium-sized, short, slender or thick,', alignTo: [0, 1, 1, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'middling, short, subtle, blatant,', alignTo: [0, 1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'majjhimā', pronunciation: 'MAHJ-jhee-mah', gloss: 'middling ones. *Majjhima* is "middle" — gives the *Majjhima Nikāya* (the Middle-Length Discourses) its name. Same idea as "medium".' }, { - by: 'Thanissaro (Access to Insight)', - text: 'Whatever beings there may be, weak or strong, without exception, long, large, middling, short, subtle, blatant,', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'rassakāṇukathūlā', + pronunciation: 'RAHS-sah-KAH-noo-kah-THOO-lah', + etymology: 'a three-part compound: *rassakā* (short) + *aṇukā* (fine, subtle — same word as in *aṇuvīhī*, "atomic") + *thūlā* (gross, coarse). The whole compound sweeps short-fine-thick — every size.', + gloss: 'short ones, fine-subtle ones, thick-coarse ones — three sizes piled together to leave none uncovered', + morphemes: [ + { text: 'rassakā', type: 'stem', gloss: 'short, brief. Plural ending makes it "the short ones".', pronunciation: 'RAHS-sah-kah' }, + { text: 'ṇukā', type: 'stem', gloss: 'subtle, fine, minute. *Aṇu-* gives English speakers *atomic* through Indo-European cousins (Sanskrit *aṇu* = atom).', pronunciation: 'noo-kah' }, + { text: 'thūlā', type: 'stem', gloss: 'gross, thick, coarse — the opposite of *aṇukā*. Together *aṇu-thūla* covers the whole subtle-to-gross axis.', pronunciation: 'THOO-lah' }, + ], }, ], }, From aad2c229a7cf46f6d844917d9736d5aefd4832a3 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:37:59 -0400 Subject: [PATCH 08/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=205=20?= =?UTF-8?q?=E2=80=94=20seen/unseen,=20near/far,=20born/to-be-born=20+=20re?= =?UTF-8?q?frain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v5a-d: 'seen or unseen, near or far, born or seeking-to-come-into- being; may all beings be happy at heart'. New roots: √dṛś (see — diṭṭhā/addiṭṭhā), √vas (dwell — vasanti), √iṣ (seek — sambhavesī). v5d repeats the *sabbe sattā bhavantu sukhitattā* refrain (same shape as v3d) so readers learn the rhythm. --- data/liturgy/metta-sutta.ts | 127 ++++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 19 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index fd178da..788dcf4 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -744,41 +744,130 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v5a: diṭṭhā vā yeva addiṭṭhā ── { - id: 'verse-5', - pali: 'Diṭṭhā vā yeva addiṭṭhā, ye ca dūre vasanti avidūre; bhūtā vā sambhavesī vā, sabbe sattā bhavantu sukhitattā.', + id: 'v5a-dittha-adittha', + pali: 'diṭṭhā vā yeva addiṭṭhā', scripts: [ - { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Diṭṭhā vā yeva addiṭṭhā, ye ca dūre vasanti avidūre; bhūtā vā sambhavesī vā, sabbe sattā bhavantu sukhitattā.', - }, + { lang: 'pi-Latn', label: 'Pāli', text: 'diṭṭhā vā yeva addiṭṭhā' }, ], witnesses: [ + { by: 'Amaravati', text: 'The seen and the unseen,', alignTo: [-1, 0, 1, -1, 3], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'those who are seen or unseen,', alignTo: [-1, -1, -1, 0, 1, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'seen or unseen,', alignTo: [0, 1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'The seen and the unseen, those living near and far away, those born and to-be-born. May all beings be at ease!', - url: AMARAVATI_URL, + form: 'diṭṭhā', + pronunciation: 'DEET-tah', + etymology: 'past form of *√dṛś* "to see" — "the seen ones" (creatures we can directly perceive)', + gloss: 'the seen — visible beings we can point to. Same root that gives *dassana* (vision, view) later in the sutta.', + morphemes: [ + { text: 'diṭ', type: 'root', root: '√dṛś', gloss: 'from the verb "to see"', pronunciation: 'deet' }, + { text: 'ṭhā', type: 'suffix', gloss: 'the "-ṭhā" tail makes the verb into "the seen ones" (plural past form)', pronunciation: 'tah' }, + ], }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + { form: 'yeva', pronunciation: 'YAY-vah', gloss: '"just, indeed" — emphasis particle, like English "also" or "as well".' }, { - by: 'Sujato (SuttaCentral)', - text: 'those who are seen or unseen, those living far or near, those born or to be born— may all beings be happy!', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'addiṭṭhā', + pronunciation: 'AHD-deet-tah', + etymology: '*a-* (not) + *diṭṭhā* (seen) — "the unseen ones"', + gloss: 'the unseen — creatures hidden from us (insects in the earth, beings in other realms). The pair *diṭṭhā / addiṭṭhā* sweeps "everything we see and everything we don\'t".', + morphemes: [ + { text: 'ad', type: 'prefix', gloss: 'the prefix "not" (assimilated *a-* before *d*)', pronunciation: 'ahd' }, + { text: 'diṭṭhā', type: 'stem', root: '√dṛś', gloss: 'same "seen" stem as the previous word — paired here with the negation prefix', pronunciation: 'DEET-tah' }, + ], }, + ], + }, + // ── v5b: ye ca dūre vasanti avidūre ── + { + id: 'v5b-dure-avidure', + pali: 'ye ca dūre vasanti avidūre', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'ye ca dūre vasanti avidūre' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'those living near and far away,', alignTo: [0, 3, 4, 1, 2, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'those living far or near,', alignTo: [0, 3, 2, 1, 4], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'near or far,', alignTo: [4, 1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'ye', pronunciation: 'yay', gloss: 'which (plural) — opens "those who…"' }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, + { form: 'dūre', pronunciation: 'DOO-ray', gloss: 'far away (locative). Same word as Skt *dūra*, related to English *durable* through "lasting/distant" semantics.' }, { - by: 'Thanissaro (Access to Insight)', - text: 'seen or unseen, near or far, born or seeking birth: May all beings be happy at heart.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'vasanti', + pronunciation: 'vah-SAHN-tee', + etymology: 'from *√vas* "to dwell, live" — "they dwell"', + gloss: 'they dwell, they live. The "-anti" tail makes it "they (do)".', + morphemes: [ + { text: 'vas', type: 'root', root: '√vas', gloss: 'from the verb "to dwell, live in a place"', pronunciation: 'vahs' }, + { text: 'anti', type: 'suffix', gloss: 'the "-anti" tail says "they (do this)" — plural present', pronunciation: 'AHN-tee' }, + ], + }, + { + form: 'avidūre', + pronunciation: 'ah-vee-DOO-ray', + etymology: '*a-* (not) + *vi-* (apart, away) + *dūre* (far) — "not-far-away"', + gloss: 'nearby — literally "not-far-away". The double negation gives a softer "near" than a direct word.', }, ], + }, + // ── v5c: bhūtā vā sambhavesī vā ── + { + id: 'v5c-bhuta-sambhavesi', + pali: 'bhūtā vā sambhavesī vā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'bhūtā vā sambhavesī vā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'those born and to-be-born.', alignTo: [-1, 0, 1, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'those born or to be born—', alignTo: [-1, 0, 1, -1, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'born or seeking birth:', alignTo: [0, 1, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ + { + form: 'bhūtā', + pronunciation: 'BOO-tah', + etymology: 'past form of *√bhū* "to become" — "those who have become, the existing ones"', + gloss: 'those who have come into being. *Bhū* gives English speakers *be* through Indo-European cousins.', + accent: 'sky', + }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, { form: 'sambhavesī', - gloss: '"Those still seeking birth", those yet to be born. Paired with *bhūtā* "already become" — the wish covers both the born and the yet-to-be-born.', + pronunciation: 'sahm-BAH-vay-see', + etymology: '*saṁ-* (together, fully) + *bhava* (being, coming-to-be) + *-esī* (one-who-seeks, from *√iṣ* "to seek")', + gloss: 'those still seeking to come-into-being — beings yet to be born. Paired with *bhūtā* "already become" — the wish covers both the born and the yet-to-be-born.', accent: 'sky', + morphemes: [ + { text: 'sam', type: 'prefix', gloss: 'the prefix "fully, together" (the *ṁ* assimilates to *m*)', pronunciation: 'sahm' }, + { text: 'bhav', type: 'root', root: '√bhū', gloss: '"becoming, coming-to-be" — same root as *bhūtā*', pronunciation: 'bahv' }, + { text: 'esī', type: 'suffix', root: '√iṣ', gloss: 'from the verb "to seek". *Sam-bhav-esī* = "one who is seeking-to-come-into-being".', pronunciation: 'AY-see' }, + ], }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + ], + }, + // ── v5d: sabbe sattā bhavantu sukhitattā (refrain — same as v3d) ── + { + id: 'v5d-sabbe-satta', + pali: 'sabbe sattā bhavantu sukhitattā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'sabbe sattā bhavantu sukhitattā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'May all beings be at ease!', alignTo: [-1, 0, 1, 2, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'may all beings be happy!', alignTo: [-1, 0, 1, 2, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'May all beings be happy at heart.', alignTo: [-1, 0, 1, 2, 3, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'sabbe', pronunciation: 'SAHB-bay', gloss: 'all, every — same word as v3d, the refrain that recurs through the sutta.', accent: 'rose' }, + { form: 'sattā', pronunciation: 'SAHT-tah', gloss: 'beings — same word as v3d. *sabbe sattā* is the metta sutta\'s recurring address.', accent: 'rose', citations: [dpdCitation('satta')] }, + { form: 'bhavantu', pronunciation: 'bah-VAHN-too', gloss: 'may [they] be — the wishing voice from v3d, repeated here as the refrain closes the stanza.' }, + { form: 'sukhitattā', pronunciation: 'soo-khee-TAHT-tah', gloss: 'happy of heart, happy from the inside — same word as v3d.', accent: 'amber' }, ], }, { From fd5adf86b1376a7ec4e9bba0fad6a06e984b53ce Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:39:37 -0400 Subject: [PATCH 09/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=206=20?= =?UTF-8?q?=E2=80=94=20let=20no=20one=20deceive,=20despise,=20or=20wish=20?= =?UTF-8?q?suffering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v6a-d: the moral-conduct stanza. New roots: √kub (cheat — nikubbetha), √man (think — nātimaññetha, echoing anatimānī from v1), √ruṣ (anger — byārosanā), √han (strike — paṭighasaññā via paṭi-gha strike-back = aversion), √iṣ (wish — dukkhamiccheyya). The Pāli technical pair *byārosanā* (hot anger) and *paṭighasaññā* (cold aversion) glossed with their Buddhist-psychology context. --- data/liturgy/metta-sutta.ts | 133 +++++++++++++++++++++++++++++++----- 1 file changed, 117 insertions(+), 16 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 788dcf4..2475c2b 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -870,33 +870,134 @@ export const mettaSutta: LiturgyDoc = { { form: 'sukhitattā', pronunciation: 'soo-khee-TAHT-tah', gloss: 'happy of heart, happy from the inside — same word as v3d.', accent: 'amber' }, ], }, + // ── v6a: na paro paraṁ nikubbetha ── { - id: 'verse-6', - pali: 'Na paro paraṁ nikubbetha, nātimaññetha katthaci naṁ kanci; byārosanā paṭighasaññā, nāññamaññassa dukkhamiccheyya.', + id: 'v6a-na-paro-param', + pali: 'na paro paraṁ nikubbetha', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'na paro paraṁ nikubbetha' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Let none deceive another,', alignTo: [-1, 0, 3, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'Let none deceive another,', alignTo: [-1, 0, 3, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Let no one deceive another', alignTo: [-1, 0, 1, 3, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'na', pronunciation: 'nah', gloss: 'not. Negates the verb at the end of the line.' }, + { form: 'paro', pronunciation: 'PAH-roh', gloss: 'one person, "the other one" (subject form). *Para* = "other" — same root as English *par* / *peer*.' }, { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Na paro paraṁ nikubbetha, nātimaññetha katthaci naṁ kanci; byārosanā paṭighasaññā, nāññamaññassa dukkhamiccheyya.', + form: 'paraṁ', + pronunciation: 'PAH-rahm', + etymology: '*para* "other" + *-ṁ* (object-of-the-action ending)', + gloss: '"the other one" (object form). Pāli repeats *paro/paraṁ* — "one-person, the-other-person" — instead of saying "anyone…anyone".', }, + { + form: 'nikubbetha', + pronunciation: 'nee-KOOB-bay-tah', + etymology: '*ni-* (down, against) + *√kub* (a verb of crookedness, "to cheat") + the "-etha" tail (third-person "let him/her"). Together: "let one deceive".', + gloss: 'should deceive, should cheat. With *na* in front: "let no one deceive".', + morphemes: [ + { text: 'ni', type: 'prefix', gloss: 'a prefix meaning "down, against" — adds an against-someone flavour', pronunciation: 'nee' }, + { text: 'kubb', type: 'root', root: '√kub', gloss: 'from a verb meaning "to be crooked, to cheat"', pronunciation: 'KOOB' }, + { text: 'etha', type: 'suffix', gloss: 'the "-etha" tail says "let one (do this)" — a gentle command', pronunciation: 'AY-tah' }, + ], + }, + ], + }, + // ── v6b: nātimaññetha katthaci naṁ kanci ── + { + id: 'v6b-natimannetha', + pali: 'nātimaññetha katthaci naṁ kanci', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'nātimaññetha katthaci naṁ kanci' }, ], witnesses: [ + { by: 'Amaravati', text: 'or despise any being in any state.', alignTo: [-1, 0, 3, 3, -1, 1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'nor despise anyone anywhere,', alignTo: [-1, 0, 3, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'or despise anyone anywhere,', alignTo: [-1, 0, 3, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'Let none deceive another, or despise any being in any state. Let none through anger or ill-will wish harm upon another.', - url: AMARAVATI_URL, + form: 'nātimaññetha', + pronunciation: 'NAH-tee-MAHN-yay-tah', + etymology: '*na* (not) + *ati-* (over, excessive) + *maññetha* (one should think/regard — from *√man* "to think"). The whole verb: "should not think-down-upon", "should not despise".', + gloss: '"should not despise" — should not regard someone as less than oneself. The same *ati-māna* "excessive self-regard" we met in v1 as *anatimānī*, but now phrased as an action.', + morphemes: [ + { text: 'na', type: 'prefix', gloss: 'the negation "not" — runs together with the verb', pronunciation: 'nah' }, + { text: 'ati', type: 'prefix', gloss: 'over, excessive — same prefix as in *anatimānī* (v1)', pronunciation: 'AH-tee' }, + { text: 'maññetha', type: 'stem', root: '√man', gloss: 'from the verb "to think, regard". The "-etha" tail makes it "let one think/regard".', pronunciation: 'MAHN-yay-tah' }, + ], + }, + { form: 'katthaci', pronunciation: 'KAHT-tah-chee', gloss: '"anywhere" (the *-ci* suffix makes pronouns sweeping — like English "-ever" in "wherever").' }, + { form: 'naṁ', pronunciation: 'nahm', gloss: 'him (object form of "this one"). Refers back to the *paro* introduced in 6a.' }, + { form: 'kanci', pronunciation: 'KAHN-chee', gloss: '"anyone" — *ka* "who" + *-ci* sweeping. Together with *katthaci*: "anywhere, anyone".' }, + ], + }, + // ── v6c: byārosanā paṭighasaññā ── + { + id: 'v6c-byarosana-patighasanna', + pali: 'byārosanā paṭighasaññā', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'byārosanā paṭighasaññā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Let none through anger or ill-will', alignTo: [-1, -1, -1, 0, 1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'out of anger or hostility.', alignTo: [-1, -1, 0, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'or through anger or irritation', alignTo: [-1, -1, 0, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { + form: 'byārosanā', + pronunciation: 'byah-ROH-sah-nah', + etymology: '*vi-* (apart) + *ā-* (toward) + *√ruṣ* "to be angry" — "anger turned against someone"', + gloss: 'out of anger — the hot kind of anger that flares outward toward a specific target', }, { - by: 'Sujato (SuttaCentral)', - text: 'Let none deceive another, nor despise anyone anywhere, nor wish harm for one another out of anger or hostility.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'paṭighasaññā', + pronunciation: 'pah-TEE-gah-SAHN-yah', + etymology: '*paṭi-* (back, against) + *gha* (striking — from *√han* "to strike") + *saññā* (perception, sense)', + gloss: 'with a sense of resistance — the cold pushed-back-against feeling of ill-will, distinct from hot anger. *Paṭigha* is the technical term for aversion in Buddhist psychology.', + morphemes: [ + { text: 'paṭi', type: 'prefix', gloss: 'a prefix meaning "back, against" — adds a "pushing-back" flavour', pronunciation: 'pah-TEE' }, + { text: 'gha', type: 'stem', root: '√han', gloss: 'from the verb "to strike". *Paṭi-gha* = "strike-back" — the recoiling, push-back of aversion.', pronunciation: 'gah' }, + { text: 'saññā', type: 'stem', gloss: 'perception, sense, recognising. Adds an "experiencing-as" flavour — *paṭighasaññā* = "the experience of pushing-back".', pronunciation: 'SAHN-yah' }, + ], + }, + ], + }, + // ── v6d: nāññamaññassa dukkhamiccheyya ── + { + id: 'v6d-aniccheyya', + pali: 'nāññamaññassa dukkhamiccheyya', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'nāññamaññassa dukkhamiccheyya' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'wish harm upon another.', alignTo: [1, 1, -1, 0], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'nor wish harm for one another', alignTo: [-1, 1, 1, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'wish for another to suffer.', alignTo: [1, -1, 0, -1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { + form: 'nāññamaññassa', + pronunciation: 'NAHN-yah-MAHN-yahs-sah', + etymology: '*na* (not) + *aññamañña* "one-another" (the Pāli word for reciprocity) + *-assa* (object marker, "to/for")', + gloss: '"not for one-another" — the line\'s subject. *Aññamañña* literally pairs two "other"s: "this-other and that-other", i.e. reciprocally.', + morphemes: [ + { text: 'na', type: 'prefix', gloss: 'the negation "not"', pronunciation: 'nah' }, + { text: 'aññamañña', type: 'stem', gloss: 'the Pāli word for reciprocity — *añña* "other" doubled to mean "one-another, mutually"', pronunciation: 'AHN-yah-MAHN-yah' }, + { text: 'ssa', type: 'suffix', gloss: 'the "-(a)ssa" tail marks "to" or "for" — *aññamaññassa* = "for one another"', pronunciation: 'sah' }, + ], }, { - by: 'Thanissaro (Access to Insight)', - text: 'Let no one deceive another or despise anyone anywhere, or through anger or irritation wish for another to suffer.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'dukkhamiccheyya', + pronunciation: 'DOOK-kah-meech-CHAYY-yah', + etymology: '*dukkha* (suffering — the First Noble Truth term) + *iccheyya* (one should wish — from *√iṣ* "to wish, desire")', + gloss: 'should wish suffering — the verb the line negates with *na*. Together: "should not wish suffering for one-another".', + morphemes: [ + { text: 'dukkham', type: 'stem', gloss: 'suffering — the First Noble Truth term. The "-am" tail marks it as the object of the wishing.', pronunciation: 'DOOK-kahm' }, + { text: 'iccheyya', type: 'stem', root: '√iṣ', gloss: 'from the verb "to wish, desire". The "-eyya" tail says "should/would wish".', pronunciation: 'eech-CHAYY-yah' }, + ], }, ], }, From 99d6fa8abbde80c2cab8405e846b393fc8d6c97a Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:42:24 -0400 Subject: [PATCH 10/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=207=20?= =?UTF-8?q?=E2=80=94=20the=20mother-child=20verse=20+=20cultivation=20of?= =?UTF-8?q?=20boundless=20heart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v7a-d: the famous *yathā… evampi…* simile. 'As a mother with her own life protects her one-and-only child, even so let one cultivate a boundless heart toward all beings.' New roots: √rakṣ (protect — anurakkhe), √mā (measure — aparimāṇaṁ), √bhū causative (bhāveti, the technical term for meditative *cultivation*). The four-piece compound *eka-putta-(m)anu-rakkhe* broken out so each piece is hoverable. --- data/liturgy/metta-sutta.ts | 147 +++++++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 18 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 2475c2b..2b68544 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -1001,48 +1001,159 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v7a: mātā yathā niyaṁ puttaṁ ── { - id: 'verse-7', - pali: 'Mātā yathā niyaṁ puttaṁ, āyusā ekaputtamanurakkhe; evampi sabbabhūtesu, mānasaṁ bhāvaye aparimāṇaṁ.', + id: 'v7a-mata-yatha', + pali: 'mātā yathā niyaṁ puttaṁ', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'mātā yathā niyaṁ puttaṁ' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Even as a mother', alignTo: [-1, 1, -1, 0], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'As a mother', alignTo: [1, -1, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'As a mother', alignTo: [1, -1, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Mātā yathā niyaṁ puttaṁ, āyusā ekaputtamanurakkhe; evampi sabbabhūtesu, mānasaṁ bhāvaye aparimāṇaṁ.', + form: 'mātā', + pronunciation: 'MAH-tah', + etymology: 'Pāli *mātā* "mother". Same root that gives English *mother*, Latin *mater*, Greek *meter* through Indo-European cousins.', + gloss: 'a mother — the subject of the line. The simile that the next three lines unpack.', + }, + { + form: 'yathā', + pronunciation: 'yah-TAH', + gloss: '"as, like" — the simile word. *Yathā… evampi…* = "as… even so…" frames the whole verse.', + }, + { + form: 'niyaṁ', + pronunciation: 'NEE-yahm', + gloss: '"own, of-one\'s-own". Same root as Skt *nija* "innate". Emphasises that the child is the mother\'s own.', + }, + { + form: 'puttaṁ', + pronunciation: 'POOT-tahm', + etymology: 'Pāli *putta* "son, child" + the *-ṁ* tail (object of the action)', + gloss: 'a child, a son (object form). Same root as Skt *putra*.', }, ], + }, + // ── v7b: āyusā ekaputtamanurakkhe ── + { + id: 'v7b-ayusa-ekaputta', + pali: 'āyusā ekaputtamanurakkhe', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'āyusā ekaputtamanurakkhe' }, + ], witnesses: [ + { by: 'Amaravati', text: 'protects with her life her child, her only child,', alignTo: [1, -1, 0, 0, 1, 1, 1, 1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'would protect with her life her one and only child,', alignTo: [-1, 1, -1, 0, 0, 1, 1, -1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'would risk her life to protect her child, her only child,', alignTo: [-1, -1, 0, 0, -1, 1, 1, 1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'Even as a mother protects with her life her child, her only child, so should one protect the boundless heart that loves all beings.', - url: AMARAVATI_URL, + form: 'āyusā', + pronunciation: 'AH-yoo-sah', + etymology: '*āyu* "life, lifespan" + *-sā* (ending marking "by means of" — "with her life")', + gloss: '"with her life" — the cost the mother pays. *Āyu* is the same word in *Āyurveda* ("knowledge of life").', }, { - by: 'Sujato (SuttaCentral)', - text: 'As a mother would protect with her life her one and only child, so they\'d cultivate a heart of love without limit for all sentient beings.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'ekaputtamanurakkhe', + pronunciation: 'AY-kah-POOT-tah-mah-noo-RAHK-khay', + etymology: '*eka* (one) + *putta* (child) + *anurakkhe* (would protect — *anu-* "along, after" + *√rakṣ* "to protect")', + gloss: '"would protect her one-and-only child". A four-piece compound: *one* + *child* + *along-with* + *protect*. The whole verse pivots on this image — the limit-case of love.', + accent: 'amber', + morphemes: [ + { text: 'eka', type: 'prefix', gloss: '"one, only" — emphasises the only-child framing', pronunciation: 'AY-kah' }, + { text: 'putta', type: 'stem', gloss: '"child, son" — same word as *puttaṁ* in 7a', pronunciation: 'POOT-tah' }, + { text: 'manu', type: 'prefix', gloss: 'sandhi form of *anu-* ("along, after") — the *m* at the join is a sound-bridging consonant', pronunciation: 'mah-noo' }, + { text: 'rakkhe', type: 'root', root: '√rakṣ', gloss: 'from the verb "to protect, guard". The "-e" tail makes it "would protect" — the wishful voice.', pronunciation: 'RAHK-khay' }, + ], }, + ], + }, + // ── v7c: evampi sabbabhūtesu ── + { + id: 'v7c-evampi-sabbabhuta', + pali: 'evampi sabbabhūtesu', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'evampi sabbabhūtesu' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'so should one protect the boundless heart that loves all beings.', alignTo: [0, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "so they'd cultivate a heart of love without limit for all sentient beings.", alignTo: [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'even so should one cultivate the heart limitlessly with regard to all beings.', alignTo: [0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Thanissaro (Access to Insight)', - text: 'As a mother would risk her life to protect her child, her only child, even so should one cultivate the heart limitlessly with regard to all beings.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'evampi', + pronunciation: 'AY-vahm-pee', + etymology: '*evaṁ* "thus, in this way" + *pi* "too, also"', + gloss: '"even so", "in just this way too". The simile-pivot — *yathā* in 7a was "as"; *evampi* here completes "as… so too…".', + morphemes: [ + { text: 'evam', type: 'stem', gloss: '"thus, in this way" — Pāli\'s pointer-back word', pronunciation: 'AY-vahm' }, + { text: 'pi', type: 'suffix', gloss: '"too, also" — emphasises the parallel: "even so, just so"', pronunciation: 'pee' }, + ], + }, + { + form: 'sabbabhūtesu', + pronunciation: 'SAHB-bah-BOO-tay-soo', + etymology: '*sabba* (all) + *bhūta* (being, existing — same word as v5c) + *-esu* (plural "in/among")', + gloss: '"in/toward all beings" — the wide target of the cultivation. The "-esu" tail marks plural location: like English "among all beings".', + accent: 'rose', + morphemes: [ + { text: 'sabba', type: 'stem', gloss: '"all, every" — same root as *sabbe* in v3d', pronunciation: 'SAHB-bah' }, + { text: 'bhūt', type: 'root', root: '√bhū', gloss: '"being, having become" — same root as *bhūtā* in v5c', pronunciation: 'BOOT' }, + { text: 'esu', type: 'suffix', gloss: 'the "-esu" tail marks "among/in" with a plural — "among all beings"', pronunciation: 'AY-soo' }, + ], }, ], + }, + // ── v7d: mānasaṁ bhāvaye aparimāṇaṁ ── + { + id: 'v7d-manasam-bhavaye', + pali: 'mānasaṁ bhāvaye aparimāṇaṁ', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'mānasaṁ bhāvaye aparimāṇaṁ' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'so should one protect the boundless heart that loves all beings.', alignTo: [-1, -1, -1, -1, -1, 2, 0, -1, -1, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'cultivate a heart of love without limit', alignTo: [1, -1, 0, -1, -1, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'cultivate the heart limitlessly', alignTo: [1, -1, 0, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ { form: 'mānasaṁ', - gloss: '"The heart-mind". *manas* + accusative. The thing to be cultivated boundlessly.', + pronunciation: 'MAH-nah-sahm', + etymology: '*manas* (mind, heart-mind) + the *-aṁ* tail (object form). The thing-to-be-cultivated.', + gloss: 'the heart-mind — *manas* covers what English splits into "mind" + "heart". The thing the line says to cultivate.', accent: 'sky', citations: [dpdCitation('manas')], }, { form: 'bhāvaye', - gloss: '"Let one cultivate, let one bring into being". Optative of *√bhū* "to be", causative — to *cause to become*. The technical term for meditative cultivation.', + pronunciation: 'BAH-vah-yay', + etymology: 'wishing form of the verb *bhāveti* "to cultivate, bring into being". *Bhāveti* is the same root *√bhū* "to be", in its causative form: "to *cause to become*".', + gloss: '"let one cultivate, let one bring into being". The technical term for meditative cultivation — *bhāvanā* (development) shares this root. Whatever the action is here, it\'s a *bringing into being*, not just a feeling.', accent: 'amber', + morphemes: [ + { text: 'bhāv', type: 'root', root: '√bhū', gloss: 'from the verb "to be, become" — same root as *bhavantu* in v3d. Here in causative: "to make-become, to cultivate".', pronunciation: 'bahv' }, + { text: 'aye', type: 'suffix', gloss: 'the "-aye" tail says "would/should (do this)" — a wish or gentle instruction', pronunciation: 'AH-yay' }, + ], citations: [dpdCitation('bhāveti')], }, + { + form: 'aparimāṇaṁ', + pronunciation: 'ah-PAH-ree-MAH-nahm', + etymology: '*a-* (not) + *parimāṇa* (measure, limit — from *pari-* "around" + *√mā* "to measure")', + gloss: '"limitless, without measure" — describing the *mānasaṁ* (heart-mind) the line says to cultivate. Same root *√mā* gives English speakers *measure* through Indo-European cousins.', + accent: 'rose', + morphemes: [ + { text: 'a', type: 'prefix', gloss: '"not"', pronunciation: 'ah' }, + { text: 'pari', type: 'prefix', gloss: '"around, all-around" — adds an enclosing flavour to the next part', pronunciation: 'PAH-ree' }, + { text: 'māṇaṁ', type: 'stem', root: '√mā', gloss: 'from the verb "to measure". *Pari-māṇa* = "all-around-measure" = limit. *A-pari-māṇa* = "without limit, boundless".', pronunciation: 'MAH-nahm' }, + ], + }, ], }, { From 13ddd0b6a31126a9b93524bdd94c2533fba23da1 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:44:26 -0400 Subject: [PATCH 11/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=208=20?= =?UTF-8?q?=E2=80=94=20mett=C4=81=20throughout=20the=20world,=20in=20all?= =?UTF-8?q?=20directions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v8a-d: 'And loving-kindness for the whole world; cultivate the boundless heart above, below, and across; uncrowded, without grudge, without enemy.' The directional sweep *uddhaṁ adho ca tiriyañca* and the three negations *asambādhaṁ averaṁ asapattaṁ* each broken out. v8b repeats the *mānasaṁ bhāvaye aparimāṇaṁ* refrain from v7d. --- data/liturgy/metta-sutta.ts | 136 ++++++++++++++++++++++++++++++------ 1 file changed, 114 insertions(+), 22 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 2b68544..2bd5aae 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -1156,41 +1156,133 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v8a: mettañca sabbalokasmiṁ ── { - id: 'verse-8', - pali: 'Mettañca sabbalokasmiṁ, mānasaṁ bhāvaye aparimāṇaṁ; uddhaṁ adho ca tiriyañca, asambādhaṁ averaṁ asapattaṁ.', + id: 'v8a-metta-sabbaloka', + pali: 'mettañca sabbalokasmiṁ', scripts: [ - { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Mettañca sabbalokasmiṁ, mānasaṁ bhāvaye aparimāṇaṁ; uddhaṁ adho ca tiriyañca, asambādhaṁ averaṁ asapattaṁ.', - }, + { lang: 'pi-Latn', label: 'Pāli', text: 'mettañca sabbalokasmiṁ' }, ], witnesses: [ + { by: 'Amaravati', text: 'Radiating kindness over the entire world:', alignTo: [-1, 0, -1, -1, 1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'With love for the whole world,', alignTo: [-1, 0, -1, -1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'With good will for the entire cosmos,', alignTo: [-1, 0, 0, -1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'Radiating kindness over the entire world: spreading upwards to the skies, and downwards to the depths; outwards and unbounded, freed from hatred and ill-will.', - url: AMARAVATI_URL, + form: 'mettañca', + pronunciation: 'MAYT-tahn-chah', + etymology: '*mettā* (loving-kindness, friendliness) + *ca* "and" — the consonant clusters together for chant rhythm', + gloss: 'and loving-kindness. *Mettā* is the name-virtue of the sutta — not affection or warmth alone, but a steady goodwill toward every being without exception. Related to *mitta* "friend".', + accent: 'rose', + citations: [dpdCitation('mettā')], + morphemes: [ + { text: 'mettañ', type: 'stem', gloss: '*mettā* "loving-kindness" — the sutta\'s name-virtue. Sound-merged with the next word *ca*.', pronunciation: 'MAYT-tahn' }, + { text: 'ca', type: 'suffix', gloss: '"and" — same word as elsewhere; here joined to the previous word by chant rhythm', pronunciation: 'chah' }, + ], }, { - by: 'Sujato (SuttaCentral)', - text: 'With love for the whole world, they\'d cultivate a heart that\'s limitless, upwards, downwards and side-to-side, unbounded, free of enmity and hate.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'sabbalokasmiṁ', + pronunciation: 'SAHB-bah-LOH-kah-smeem', + etymology: '*sabba* (all) + *loka* (world) + *-smiṁ* (the "in/at" ending)', + gloss: '"in the whole world" — the wide target. *Loka* is "world" in the cosmological sense, covering all realms of existence.', + morphemes: [ + { text: 'sabba', type: 'stem', gloss: '"all, every" — same root as *sabbe* in v3d, v5d', pronunciation: 'SAHB-bah' }, + { text: 'loka', type: 'stem', gloss: '"world, realm" — covers all the realms of existence in Buddhist cosmology', pronunciation: 'LOH-kah' }, + { text: 'smiṁ', type: 'suffix', gloss: 'the "-smiṁ" tail says "in/at" — *sabba-loka-smiṁ* = "in the whole world"', pronunciation: 'smeem' }, + ], }, + ], + }, + // ── v8b: mānasaṁ bhāvaye aparimāṇaṁ (refrain — same as v7d) ── + { + id: 'v8b-manasam-bhavaye', + pali: 'mānasaṁ bhāvaye aparimāṇaṁ', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'mānasaṁ bhāvaye aparimāṇaṁ' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'spreading upwards to the skies,', alignTo: [-1, -1, -1, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "they'd cultivate a heart that's limitless,", alignTo: [-1, 1, -1, 0, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'cultivate a limitless heart:', alignTo: [1, -1, 2, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'mānasaṁ', pronunciation: 'MAH-nah-sahm', gloss: 'the heart-mind — same word as v7d. The refrain returns: cultivate this thing, boundlessly.', accent: 'sky', citations: [dpdCitation('manas')] }, + { form: 'bhāvaye', pronunciation: 'BAH-vah-yay', gloss: 'let one cultivate — same wishing form as v7d. The technical term for meditative cultivation.', accent: 'amber', citations: [dpdCitation('bhāveti')] }, + { form: 'aparimāṇaṁ', pronunciation: 'ah-PAH-ree-MAH-nahm', gloss: 'boundless, without measure — same word as v7d. The line completes the refrain.', accent: 'rose' }, + ], + }, + // ── v8c: uddhaṁ adho ca tiriyañca ── + { + id: 'v8c-uddham-adho', + pali: 'uddhaṁ adho ca tiriyañca', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'uddhaṁ adho ca tiriyañca' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'and downwards to the depths;', alignTo: [2, 1, -1, -1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'upwards, downwards and side-to-side,', alignTo: [0, 1, 2, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'above, below, & all around,', alignTo: [0, 1, 2, 3, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'uddhaṁ', pronunciation: 'OOD-dahm', gloss: 'upward — the direction-word for "above". The radiating-out begins.' }, + { form: 'adho', pronunciation: 'AH-doh', gloss: 'downward — paired with *uddhaṁ* "upward". Vertical sweep.' }, + { form: 'ca', pronunciation: 'chah', gloss: 'and' }, { - by: 'Thanissaro (Access to Insight)', - text: 'With good will for the entire cosmos, cultivate a limitless heart: above, below, & all around, unobstructed, without enmity or hate.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'tiriyañca', + pronunciation: 'TEE-ree-yahn-chah', + etymology: '*tiriyaṁ* "across, horizontally" + *ca* "and" — sound-merged together', + gloss: '"and across" — completing the three-axis sweep: up + down + sideways. *Tiriya* is "transverse, horizontal" — the metta covers all directions.', + morphemes: [ + { text: 'tiriyañ', type: 'stem', gloss: '"across, horizontally" — the third axis, completing up + down + side', pronunciation: 'TEE-ree-yahn' }, + { text: 'ca', type: 'suffix', gloss: '"and" — joined to the previous word', pronunciation: 'chah' }, + ], }, ], + }, + // ── v8d: asambādhaṁ averaṁ asapattaṁ ── + { + id: 'v8d-asambadham-averam', + pali: 'asambādhaṁ averaṁ asapattaṁ', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'asambādhaṁ averaṁ asapattaṁ' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'outwards and unbounded, freed from hatred and ill-will.', alignTo: [-1, -1, 0, -1, -1, 1, -1, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'unbounded, free of enmity and hate.', alignTo: [0, 1, 1, 2, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'unobstructed, without enmity or hate.', alignTo: [0, 1, 1, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ { - form: 'Mettañca', - gloss: '*mettā* + *ca* "and". *Mettā* is loving-kindness, friendliness; not affection or warmth alone but a goodwill toward all beings without exception. The name-virtue of the sutta.', - accent: 'rose', - citations: [dpdCitation('mettā')], + form: 'asambādhaṁ', + pronunciation: 'ah-sahm-BAH-dahm', + etymology: '*a-* (not) + *sambādha* (crowded, narrow, constricted)', + gloss: '"uncrowded, unconstricted" — the metta-heart has no walls penning it in. *Sambādha* is "narrow", *asambādha* is "wide open".', + morphemes: [ + { text: 'a', type: 'prefix', gloss: '"not"', pronunciation: 'ah' }, + { text: 'sambādhaṁ', type: 'stem', gloss: '"narrow, constricted, crowded". *A-sambādhaṁ* = "without constriction, wide-open".', pronunciation: 'sahm-BAH-dahm' }, + ], + }, + { + form: 'averaṁ', + pronunciation: 'ah-VAY-rahm', + etymology: '*a-* (not) + *vera* (hatred, enmity)', + gloss: '"without hate". *Vera* is the technical term for enmity that perpetuates itself across lifetimes — the kind of grudge that won\'t let go. *A-vera* is the heart with no grudge.', + accent: 'sky', + morphemes: [ + { text: 'a', type: 'prefix', gloss: '"not"', pronunciation: 'ah' }, + { text: 'veraṁ', type: 'stem', gloss: '"hatred, enmity, grudge" — the technical Buddhist term for hate that perpetuates itself. *A-vera* = "without grudge".', pronunciation: 'VAY-rahm' }, + ], + }, + { + form: 'asapattaṁ', + pronunciation: 'ah-sah-PAHT-tahm', + etymology: '*a-* (not) + *sapatta* (enemy, rival)', + gloss: '"without enemy" — without anyone the heart sets itself against. *Sapatta* is "rival, adversary" — *asapatta* is the heart with no adversary.', + morphemes: [ + { text: 'a', type: 'prefix', gloss: '"not"', pronunciation: 'ah' }, + { text: 'sapattaṁ', type: 'stem', gloss: '"rival, enemy". *A-sapatta* = "with no rival, with no one to oppose".', pronunciation: 'sah-PAHT-tahm' }, + ], }, ], }, From e5110aba79b6bbfb90faff40e37eb9f8cce319ff Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:46:35 -0400 Subject: [PATCH 12/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=209=20?= =?UTF-8?q?=E2=80=94=20four=20postures,=20mindfulness,=20the=20divine=20ab?= =?UTF-8?q?iding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v9a-d: 'Standing, walking, sitting, or lying down — as long as one is alert — let one resolve on this mindfulness; this is what they call the divine abiding, here.' New roots: √sthā (stand — tiṭṭhaṁ, also adhiṭṭheyya the 'standing-upon, resolving'), √sad (sit — nisinno), √śī (lie — sayāno), √smṛ (remember — satiṁ, mindfulness), √hṛ (carry, dwell — vihāraṁ). The four bodily postures of monastic life catalogued so the heart-cultivation has no resting place. --- data/liturgy/metta-sutta.ts | 139 +++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 17 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 2bd5aae..0be862c 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -1286,40 +1286,145 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v9a: tiṭṭhaṁ caraṁ nisinno vā ── { - id: 'verse-9', - pali: 'Tiṭṭhaṁ caraṁ nisinno vā, sayāno vā yāvat\'assa vigatamiddho; etaṁ satiṁ adhiṭṭheyya, brahmametaṁ vihāraṁ idhamāhu.', + id: 'v9a-tittham-caram', + pali: 'tiṭṭhaṁ caraṁ nisinno vā', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'tiṭṭhaṁ caraṁ nisinno vā' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'Whether standing or walking, seated', alignTo: [-1, 0, 3, 1, 2], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'Standing, walking, sitting,', alignTo: [0, 1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Whether standing, walking, sitting,', alignTo: [-1, 0, 1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Tiṭṭhaṁ caraṁ nisinno vā, sayāno vā yāvat\'assa vigatamiddho; etaṁ satiṁ adhiṭṭheyya, brahmametaṁ vihāraṁ idhamāhu.', + form: 'tiṭṭhaṁ', + pronunciation: 'TEET-tahm', + etymology: 'present-form of *√sthā* "to stand" — "standing, while-standing"', + gloss: 'standing — the first of the four postures. Same *√sthā* gives English speakers *stand* through Indo-European cousins.', + }, + { + form: 'caraṁ', + pronunciation: 'CHAH-rahm', + etymology: 'present-form of *√car* "to walk, go" — same root as *samācare* in v3a', + gloss: 'walking — the second posture.', }, + { + form: 'nisinno', + pronunciation: 'nee-SEEN-noh', + etymology: '*ni-* (down) + past form of *√sad* "to sit" — "sat down"', + gloss: 'seated — the third posture. The *ni-* prefix adds "down".', + morphemes: [ + { text: 'ni', type: 'prefix', gloss: '"down" — same prefix as in *nikubbetha* in v6a', pronunciation: 'nee' }, + { text: 'sinno', type: 'root', root: '√sad', gloss: 'from the verb "to sit". Same root that gives English *settle* and *sediment* through Indo-European cousins.', pronunciation: 'SEEN-noh' }, + ], + }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + ], + }, + // ── v9b: sayāno vā yāvat'assa vigatamiddho ── + { + id: 'v9b-sayano-vigatamiddho', + pali: "sayāno vā yāvat'assa vigatamiddho", + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: "sayāno vā yāvat'assa vigatamiddho", tokens: ['sayāno', 'vā', "yāvat'assa", 'vigatamiddho'] }, ], witnesses: [ + { by: 'Amaravati', text: 'or lying down, free from drowsiness,', alignTo: [1, 0, 0, -1, -1, 3], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: "or lying down— as long as they're not drowsy—", alignTo: [1, 0, 0, -1, 2, 2, -1, -1, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'or lying down, as long as one is alert,', alignTo: [1, 0, 0, 2, 2, 2, -1, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'sayāno', pronunciation: 'sah-YAH-noh', etymology: 'from *√śī* "to lie down"', gloss: 'lying down — the fourth posture. Together with the three above, the verse covers every bodily state.' }, + { form: 'vā', pronunciation: 'vah', gloss: 'or' }, + { form: "yāvat'assa", pronunciation: 'YAH-vaht-AHS-sah', gloss: '"as long as [one] is" — a clause-opener. *Yāvat* "as long as" + *assa* "would be".' }, { - by: 'Amaravati', - text: 'Whether standing or walking, seated or lying down, free from drowsiness, one should sustain this recollection. This is said to be the sublime abiding.', - url: AMARAVATI_URL, + form: 'vigatamiddho', + pronunciation: 'vee-GAH-tah-MEED-doh', + etymology: '*vi-* (away) + *gata* (gone) + *middha* (drowsiness, torpor)', + gloss: '"with drowsiness gone away" — alert, free of the sluggish-mind state. *Middha* is one of the five hindrances (drowsiness) in Buddhist psychology.', + morphemes: [ + { text: 'vigata', type: 'prefix', gloss: '"gone away, departed" — *vi-* "away" + *gata* "gone"', pronunciation: 'vee-GAH-tah' }, + { text: 'middho', type: 'stem', gloss: '"drowsiness, torpor" — one of the five hindrances. *Vi-gata-middho* = "the one whose drowsiness has departed".', pronunciation: 'MEED-doh' }, + ], }, + ], + }, + // ── v9c: etaṁ satiṁ adhiṭṭheyya ── + { + id: 'v9c-etam-satim', + pali: 'etaṁ satiṁ adhiṭṭheyya', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'etaṁ satiṁ adhiṭṭheyya' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'one should sustain this recollection.', alignTo: [-1, -1, 2, 0, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'they would commit to this kind of mindfulness;', alignTo: [-1, 2, 2, -1, 0, -1, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'one should be resolved on this mindfulness.', alignTo: [-1, 2, -1, 2, -1, 0, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'etaṁ', pronunciation: 'AY-tahm', gloss: 'this (object form) — refers back to the cultivated heart-mind from v8.' }, { - by: 'Sujato (SuttaCentral)', - text: 'Standing, walking, sitting, or lying down— as long as they\'re not drowsy— they would commit to this kind of mindfulness; this is what they call a divine meditation in this life.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'satiṁ', + pronunciation: 'SAH-teem', + etymology: '*sati* (mindfulness, remembering) + *-ṁ* (object form). From *√smṛ* "to remember".', + gloss: 'mindfulness, recollection (object). The central Buddhist faculty — keeping something in present awareness. Same root as Skt *smṛti*.', + accent: 'sky', }, { - by: 'Thanissaro (Access to Insight)', - text: 'Whether standing, walking, sitting, or lying down, as long as one is alert, one should be resolved on this mindfulness. This is called a sublime abiding here & now.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'adhiṭṭheyya', + pronunciation: 'ah-DEET-tay-yah', + etymology: '*adhi-* (over, upon) + *√sthā* (to stand) — "to stand upon, take a firm stand on, resolve". The "-eyya" tail says "should/would".', + gloss: '"should be resolved on, should stand-firmly-on". *Adhiṭṭhāna* (resolve, determination) is one of the ten *pāramī* (perfections).', + accent: 'amber', + morphemes: [ + { text: 'adhi', type: 'prefix', gloss: '"over, upon" — adds a "standing-upon" flavour to the verb', pronunciation: 'AH-dee' }, + { text: 'ṭṭheyya', type: 'root', root: '√sthā', gloss: 'from the verb "to stand". *Adhi-ṭṭha* = "stand-upon, resolve". Same root as *tiṭṭhaṁ* (standing) in 9a.', pronunciation: 'TAY-yah' }, + ], }, ], + }, + // ── v9d: brahmametaṁ vihāraṁ idhamāhu ── + { + id: 'v9d-brahma-vihara', + pali: 'brahmametaṁ vihāraṁ idhamāhu', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'brahmametaṁ vihāraṁ idhamāhu' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'This is said to be the sublime abiding.', alignTo: [0, -1, 2, -1, -1, -1, 0, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'this is what they call a divine meditation in this life.', alignTo: [0, -1, -1, 2, 2, -1, 0, 1, 2, -1, -1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'This is called a sublime abiding here & now.', alignTo: [0, -1, 2, -1, 0, 1, 2, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ { form: 'brahmametaṁ', - gloss: '*brahma* + *etaṁ* "this is divine". The *brahmavihāra* — divine abiding — is the meditator\'s dwelling-place. *Brahma* here doesn\'t name the deity but the highest, sublime register.', + pronunciation: 'BRAH-mah-MAY-tahm', + etymology: '*brahma* (divine, supreme) + *etaṁ* "this" — sound-merged together', + gloss: '"this divine [one]". The *brahmavihāra* — divine abiding — names the meditator\'s dwelling-place. *Brahma* here doesn\'t name the deity but the highest, sublime register.', accent: 'sky', + morphemes: [ + { text: 'brahma', type: 'stem', gloss: '"divine, supreme, highest" — same word in Skt and Pāli. *Brahmavihāra* is the technical term for the four sublime states (loving-kindness, compassion, joy, equanimity).', pronunciation: 'BRAH-mah' }, + { text: 'metaṁ', type: 'stem', gloss: '*etaṁ* "this" — joined to *brahma* by chant rhythm. The whole word means "this divine-state".', pronunciation: 'MAY-tahm' }, + ], + }, + { + form: 'vihāraṁ', + pronunciation: 'vee-HAH-rahm', + etymology: '*vi-* (apart) + *√hṛ* "to carry, dwell" — "dwelling, abiding"', + gloss: 'an abiding, a dwelling-place. *Vihāra* gives the word for a monastery (the place one dwells), and in compounds names the four sublime abidings (*brahmavihāra*).', + }, + { + form: 'idhamāhu', + pronunciation: 'EE-dah-MAH-hoo', + etymology: '*idha* "here" + *āhu* "they say, it is said"', + gloss: '"here they call [it]" — closes the verse with the traditional formula *iti āhu* "thus they say". The community\'s naming of the state.', + morphemes: [ + { text: 'idha', type: 'stem', gloss: '"here, in this place" — anchors the divine abiding in *this* life, not a future heaven', pronunciation: 'EE-dah' }, + { text: 'māhu', type: 'stem', gloss: '*āhu* "they say, it is said" — the traditional Pāli formula that closes a teaching with "thus they say"', pronunciation: 'MAH-hoo' }, + ], }, ], }, From 066eb7cf11f89b0dc17b3f079f9c43a9bd7d8e92 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 19 May 2026 16:49:22 -0400 Subject: [PATCH 13/23] =?UTF-8?q?feat(liturgy):=20metta=20verse=2010=20?= =?UTF-8?q?=E2=80=94=20closing=20verse,=20not=20falling=20into=20views,=20?= =?UTF-8?q?liberation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v10a-d: 'Not falling into views, virtuous and perfected in vision, having dispelled greed for sense-pleasures, one never again lies in a womb — so it is said.' Pairs *diṭṭhi* (held view, from √dṛś) with *dassana* (direct seeing, same root) — same word turned from object to instrument. Closing *iti* glossed as 'the Pāli closing quotation-marks'. The whole metta sutta now at heart-sutra depth. --- data/liturgy/metta-sutta.ts | 161 +++++++++++++++++++++++++++++++----- 1 file changed, 142 insertions(+), 19 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index 0be862c..b870455 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -1428,41 +1428,164 @@ export const mettaSutta: LiturgyDoc = { }, ], }, + // ── v10a: diṭṭhiñca anupaggamma ── { - id: 'verse-10', - pali: 'Diṭṭhiñca anupaggamma, sīlavā dassanena sampanno; kāmesu vineyya gedhaṁ, na hi jātuggabbhaseyya puna retīti.', + id: 'v10a-ditthi-anupaggamma', + pali: 'diṭṭhiñca anupaggamma', scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'diṭṭhiñca anupaggamma' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'By not holding to fixed views,', alignTo: [-1, 1, 1, -1, 1, 0], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'Avoiding wrong views,', alignTo: [1, 1, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Not taken with views,', alignTo: [1, 1, -1, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { + form: 'diṭṭhiñca', + pronunciation: 'DEET-tee-nyah-chah', + etymology: '*diṭṭhi* (view) + *ca* "and" — sound-merged together. From *√dṛś* "to see".', + gloss: 'and views. *Diṭṭhi* is "view" — most often *wrong* view in technical Pāli: a fixed position, a doctrine clung to. Letting go of clinging to views is the closing instruction.', + accent: 'amber', + citations: [dpdCitation('diṭṭhi')], + morphemes: [ + { text: 'diṭṭhiñ', type: 'stem', root: '√dṛś', gloss: '"view, position" — same root as *diṭṭhā* (seen) in v5a. Here it means a held position, a doctrine.', pronunciation: 'DEET-tee-nyah' }, + { text: 'ca', type: 'suffix', gloss: '"and" — joined to the previous word', pronunciation: 'chah' }, + ], + }, { - lang: 'pi-Latn', - label: 'Pāli', - text: 'Diṭṭhiñca anupaggamma, sīlavā dassanena sampanno; kāmesu vineyya gedhaṁ, na hi jātuggabbhaseyya puna retīti.', + form: 'anupaggamma', + pronunciation: 'ah-noo-PAH-gahm-mah', + etymology: '*an-* (not) + *upa-* (near, up to) + *√gam* (to go) — "not going near, not approaching"', + gloss: '"not falling into, not going near". The wise person doesn\'t collapse into the views they encounter. Same *√gam* as English *come* through Indo-European cousins.', + morphemes: [ + { text: 'an', type: 'prefix', gloss: '"not"', pronunciation: 'ahn' }, + { text: 'upa', type: 'prefix', gloss: '"up to, near" — adds an approaching-flavour to the verb', pronunciation: 'OO-pah' }, + { text: 'gamma', type: 'root', root: '√gam', gloss: 'from the verb "to go". *Upa-gamma* = "approach, fall into". *An-upa-gamma* = "not approaching, not falling into".', pronunciation: 'GAHM-mah' }, + ], }, ], + }, + // ── v10b: sīlavā dassanena sampanno ── + { + id: 'v10b-silava-dassanena', + pali: 'sīlavā dassanena sampanno', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'sīlavā dassanena sampanno' }, + ], witnesses: [ + { by: 'Amaravati', text: 'the pure-hearted one, having clarity of vision,', alignTo: [-1, 0, 0, -1, 2, -1, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'ethical, attaining vision,', alignTo: [0, 2, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'but virtuous & consummate in vision,', alignTo: [-1, 0, -1, 2, -1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ { - by: 'Amaravati', - text: 'By not holding to fixed views, the pure-hearted one, having clarity of vision, being freed from all sense desires, is not born again into this world.', - url: AMARAVATI_URL, + form: 'sīlavā', + pronunciation: 'SEE-lah-vah', + etymology: '*sīla* (virtue, ethical conduct) + *-vā* (possessive — "having")', + gloss: '"virtuous, ethical". *Sīla* is the technical term for the moral training of Buddhist practice — the precepts. *Sīla-vā* = "the one who has *sīla*".', + accent: 'sky', + morphemes: [ + { text: 'sīla', type: 'stem', gloss: '"virtue, ethical conduct" — the technical term for the moral training. The Five Precepts and Eight Precepts are forms of *sīla*.', pronunciation: 'SEE-lah' }, + { text: 'vā', type: 'suffix', gloss: 'the "-vā" tail means "having" — *sīla-vā* = "one who has virtue, the virtuous one"', pronunciation: 'vah' }, + ], }, { - by: 'Sujato (SuttaCentral)', - text: 'Avoiding wrong views, ethical, attaining vision, having removed desire for sensual pleasures, they would never come to lie in a womb again.', - url: 'https://suttacentral.net/snp1.8/en/sujato', - license: 'CC0', + form: 'dassanena', + pronunciation: 'DAHS-sah-NAY-nah', + etymology: '*dassana* (vision, sight, view) + *-ena* (the "by means of" ending)', + gloss: '"with vision, by means of seeing". *Dassana* is from the same *√dṛś* root as *diṭṭhi* in 10a — but where *diṭṭhi* is a *held* view, *dassana* is direct seeing.', + morphemes: [ + { text: 'dassan', type: 'root', root: '√dṛś', gloss: 'from "to see" — same root as *diṭṭhi*. *Dassana* = direct seeing, vision (as opposed to *diṭṭhi* = held position).', pronunciation: 'DAHS-sahn' }, + { text: 'ena', type: 'suffix', gloss: 'the "-ena" tail says "by means of" — same suffix as *kusalena* in v1', pronunciation: 'AY-nah' }, + ], }, { - by: 'Thanissaro (Access to Insight)', - text: 'Not taken with views, but virtuous & consummate in vision, having subdued desire for sensual pleasures, one never again will lie in the womb.', - url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', - license: 'CC BY-NC', + form: 'sampanno', + pronunciation: 'sahm-PAHN-noh', + etymology: '*saṁ-* (fully) + past form of *√pad* "to attain" — "fully attained, accomplished"', + gloss: '"perfected in, fully attained". *Sampanno* with the previous word: "perfected in vision".', }, ], + }, + // ── v10c: kāmesu vineyya gedhaṁ ── + { + id: 'v10c-kamesu-vineyya', + pali: 'kāmesu vineyya gedhaṁ', + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'kāmesu vineyya gedhaṁ' }, + ], + witnesses: [ + { by: 'Amaravati', text: 'being freed from all sense desires,', alignTo: [-1, 1, -1, -1, 0, 0], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'having removed desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'having subdued desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], words: [ { - form: 'Diṭṭhiñca', - gloss: '*diṭṭhi* + *ca*. *Diṭṭhi* is "view" — most often *wrong* view in technical Pāli: a fixed position, a doctrine clung to. Letting go of clinging to views is the closing instruction.', + form: 'kāmesu', + pronunciation: 'KAH-may-soo', + etymology: '*kāma* (sensual pleasure, desire) + *-esu* (plural "in/among" ending)', + gloss: '"in/toward sensual pleasures". *Kāma* covers all sense-pleasure attachment — same word in *Kāma Sūtra* (which is actually a manual on the *first* of three life-aims, *kāma*).', + morphemes: [ + { text: 'kām', type: 'stem', gloss: '"sense-pleasure, desire" — broader than just sex; covers all attachment to sense-objects', pronunciation: 'kahm' }, + { text: 'esu', type: 'suffix', gloss: 'the "-esu" tail says "in/toward" with a plural — same suffix as *kulesu* in v2d', pronunciation: 'AY-soo' }, + ], + }, + { + form: 'vineyya', + pronunciation: 'vee-NAYY-yah', + etymology: '*vi-* (apart, away) + *√nī* "to lead" — "to lead away, dispel"', + gloss: '"having led-away, having dispelled". The "-eyya" tail makes it the wishing voice — "would lead away".', + morphemes: [ + { text: 'vi', type: 'prefix', gloss: '"apart, away" — adds a "leading-away" flavour', pronunciation: 'vee' }, + { text: 'neyya', type: 'root', root: '√nī', gloss: 'from the verb "to lead". *Vi-nī* = "lead away, dispel".', pronunciation: 'NAYY-yah' }, + ], + }, + { + form: 'gedhaṁ', + pronunciation: 'GAY-dahm', + etymology: '*gedha* (greed, attachment — same root *√gṛdh* as *ananugiddho* in v2d) + the *-ṁ* tail (object form)', + gloss: '"greed, attachment" (the object dispelled). Same root as the *ananugiddho* "not chasing greedily" of v2d — the closing verse returns to the opening virtues.', accent: 'amber', - citations: [dpdCitation('diṭṭhi')], + }, + ], + }, + // ── v10d: na hi jātuggabbhaseyya puna retīti ── + { + id: 'v10d-na-jatu', + pali: "na hi jātu g(g)abbhaseyya puna retīti", + scripts: [ + { lang: 'pi-Latn', label: 'Pāli', text: 'na hi jātu gabbhaseyya puna retīti', tokens: ['na', 'hi', 'jātu', 'gabbhaseyya', 'puna', 'retīti'] }, + ], + witnesses: [ + { by: 'Amaravati', text: 'is not born again into this world.', alignTo: [-1, 0, -1, 4, -1, -1, -1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'they would never come to lie in a womb again.', alignTo: [-1, 0, 2, -1, -1, 3, -1, -1, 3, 4], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'one never again will lie in the womb.', alignTo: [-1, 0, 4, -1, 3, -1, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + ], + words: [ + { form: 'na', pronunciation: 'nah', gloss: 'not — together with *hi* below: "not at all, certainly not".' }, + { form: 'hi', pronunciation: 'hee', gloss: 'an emphatic particle: "indeed, certainly". *Na hi* = "certainly not".' }, + { form: 'jātu', pronunciation: 'JAH-too', gloss: '"ever, at any time". Pairs with the negation: "not ever, never again".' }, + { + form: 'gabbhaseyya', + pronunciation: 'GAHB-bah-SAY-yah', + etymology: '*gabbha* (womb) + *seyya* (lying-down — from *√śī* "to lie")', + gloss: '"lying in a womb" — the technical phrase for rebirth in mammalian form. Same *√śī* as *sayāno* "lying down" in v9b — but here the lying-down is the womb-state.', + morphemes: [ + { text: 'gabbha', type: 'stem', gloss: '"womb, inner chamber". Same word as *gabbho* in v2d but in a different sense (rude/intrusive there, womb here).', pronunciation: 'GAHB-bah' }, + { text: 'seyya', type: 'root', root: '√śī', gloss: 'from "to lie down" — same root as *sayāno* in v9b', pronunciation: 'SAY-yah' }, + ], + }, + { form: 'puna', pronunciation: 'POO-nah', gloss: '"again". *Punarbhava* (re-becoming) is the technical term for rebirth — here the line says *na puna* = "not again".' }, + { + form: 'retīti', + pronunciation: 'RAY-tee-tee', + etymology: '*eti* (one goes, comes — from *√i*) + *iti* (the quotation closure: "thus")', + gloss: '"comes [to it], thus [it is said]". The closing *iti* marks the end of the discourse — like English closing quotation marks. The whole verse-end *eti iti* = "[one] comes [there], thus [is said]".', + morphemes: [ + { text: 'retī', type: 'root', root: '√i', gloss: 'from the verb "to come, go" — sandhi-form of *eti*', pronunciation: 'RAY-tee' }, + { text: 'ti', type: 'suffix', gloss: 'the closing *iti* = "thus", marking the end of the recited text. Like English closing quote-marks.', pronunciation: 'tee' }, + ], }, ], }, From 2f9eb807d4abe15238b8fc2edf2ac79e8f873ea3 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 20 May 2026 08:12:16 -0400 Subject: [PATCH 14/23] =?UTF-8?q?feat(liturgy):=20morphemeAlignTo=20?= =?UTF-8?q?=E2=80=94=20authorable=20English-token=20=E2=86=92=20morpheme?= =?UTF-8?q?=20pairing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The alignment-arrow renderer assigned English tokens to morphemes purely by position (i-th English word mapped to a word → i-th morpheme of that word). When English reorders a word's morphemes the arrows cross: kusalena = kusal (skilled) + ena (by-an-agent), but Amaravati renders it 'one ... skilled' — so the heuristic sent kusal's arrow to 'one' and ena's to 'skilled', both wrong. Add an optional Witness.morphemeAlignTo array, parallel to alignTo. morphemeAlignTo[i] names the morpheme index that English token i should anchor to; null/absent falls back to the positional heuristic. computeAlignmentLines honours it when present. Authored for Metta verse 1a across all three witnesses: - karaṇīyam: 'done' → √kṛ root (morpheme 0); 'is/what/should/be' → -yam - kusalena: 'skilled' → kusal stem (0); 'one' → -ena ending (1) Playwright-verified: hovering kusal now arrows to 'skilled', ena to 'one'. Other verses still use the heuristic — extend morphemeAlignTo where a crossing is spotted. --- .../liturgy/shapes/TripleScriptWitness.tsx | 25 +++++++++++++------ data/liturgy/metta-sutta.ts | 5 ++++ types/liturgy.ts | 14 +++++++++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/components/liturgy/shapes/TripleScriptWitness.tsx b/components/liturgy/shapes/TripleScriptWitness.tsx index 33e7500..bf05489 100644 --- a/components/liturgy/shapes/TripleScriptWitness.tsx +++ b/components/liturgy/shapes/TripleScriptWitness.tsx @@ -849,7 +849,8 @@ type Line = { function computeAlignmentLines( container: HTMLDivElement, - alignTo: number[] | undefined + alignTo: number[] | undefined, + morphemeAlignTo?: (number | null)[] ): Line[] { if (!alignTo) return []; const cRect = container.getBoundingClientRect(); @@ -881,8 +882,12 @@ function computeAlignmentLines( if (!enEl) continue; // Three positioning strategies, in order of preference: - // 1. Authored morpheme spans exist → anchor on morpheme #i - // (clamped to last morpheme if more English than morphemes). + // 1. Authored morpheme spans exist → anchor on a morpheme. + // Which morpheme: if the witness authored `morphemeAlignTo` + // for this English token, use that index (lets a curator fix + // crossed arrows when English reorders the morphemes). Else + // fall back to the positional heuristic (i-th English → i-th + // morpheme, clamped to the last). // 2. No morpheme spans but the group has >1 English mapping to // this word → distribute proportionally along the word's // width so the arrows fan into separate landing zones @@ -893,11 +898,15 @@ function computeAlignmentLines( let y1: number; let subIdx: number | undefined = undefined; if (morphemeEls.length > 0) { - const clamped = Math.min(i, morphemeEls.length - 1); - const mr = morphemeEls[clamped].getBoundingClientRect(); + const authored = morphemeAlignTo?.[engIdx]; + const target = + typeof authored === 'number' + ? Math.min(Math.max(authored, 0), morphemeEls.length - 1) + : Math.min(i, morphemeEls.length - 1); + const mr = morphemeEls[target].getBoundingClientRect(); x1 = mr.left + mr.width / 2 - cRect.left; y1 = mr.bottom - cRect.top; - subIdx = clamped; + subIdx = target; } else if (engIndices.length > 1) { const xOffset = ((i + 0.5) / engIndices.length) * wordRect.width; x1 = wordRect.left + xOffset - cRect.left; @@ -1071,7 +1080,7 @@ const SegmentRow: React.FC<{ setLines([]); return; } - setLines(computeAlignmentLines(containerRef.current, currentWitness?.alignTo)); + setLines(computeAlignmentLines(containerRef.current, currentWitness?.alignTo, currentWitness?.morphemeAlignTo)); }; compute(); const raf = requestAnimationFrame(compute); @@ -1185,7 +1194,7 @@ const SegmentRow: React.FC<{ // which would paint the line's source endpoint at the viewport corner. // (See task #73, user-reported mobile Devanāgarī bug.) if (!containerRef.current.contains(hovered.element)) return []; - const fresh = computeAlignmentLines(containerRef.current, currentWitness?.alignTo); + const fresh = computeAlignmentLines(containerRef.current, currentWitness?.alignTo, currentWitness?.morphemeAlignTo); const cRect = containerRef.current.getBoundingClientRect(); const r = hovered.element.getBoundingClientRect(); diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index b870455..bb1e809 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -69,12 +69,16 @@ export const mettaSutta: LiturgyDoc = { by: 'Amaravati', text: 'This is what should be done by one who is skilled in goodness,', alignTo: [0, 0, 0, 0, 0, 0, -1, 2, -1, -1, 2, -1, 1], + // karaṇīyam: "done" → √kṛ root (morpheme 0); the rest → -yam. + // kusalena: "skilled" → kusal stem (0); "one" → -ena ending (1). + morphemeAlignTo: [1, 1, 1, 1, 1, 0, null, 1, null, null, 0, null, null], url: AMARAVATI_URL, }, { by: 'Sujato (SuttaCentral)', text: 'This is what should be done by one skilled in the good', alignTo: [0, 0, 0, 0, 0, 0, -1, 2, 2, -1, -1, 1], + morphemeAlignTo: [1, 1, 1, 1, 1, 0, null, 1, 0, null, null, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0', }, @@ -82,6 +86,7 @@ export const mettaSutta: LiturgyDoc = { by: 'Thanissaro (Access to Insight)', text: 'This is to be done by one skilled in aims', alignTo: [0, 0, 0, 0, 0, -1, 2, 2, -1, 1], + morphemeAlignTo: [1, 1, 1, 1, 0, null, 1, 0, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC', }, diff --git a/types/liturgy.ts b/types/liturgy.ts index 7d6e3ae..d1c97d0 100644 --- a/types/liturgy.ts +++ b/types/liturgy.ts @@ -40,6 +40,20 @@ export type Witness = { * e.g., "Fully Self-Enlightened One" all aligns to *sammā-sambuddhassa*). */ alignTo?: number[]; + /** + * Optional per-token morpheme target. Parallel-indexed to `alignTo`. + * `morphemeAlignTo[i]` is the morpheme index (within the Pāli word that + * `alignTo[i]` points to) that English word `i` should anchor its arrow + * to. `null`/absent → the renderer falls back to its positional heuristic + * (i-th English token mapped to a word → i-th morpheme). + * + * Why this exists: when English reorders the morphemes of a Pāli word, + * the positional heuristic crosses the arrows. Example: `kusalena` = + * `kusal` (skilled) + `ena` (by-an-agent); Amaravati renders it "one … + * skilled", reversing the order, so the heuristic sends `kusal`'s arrow + * to "one". Authoring `morphemeAlignTo` fixes the pairing explicitly. + */ + morphemeAlignTo?: (number | null)[]; }; /** From 8c537ef5f3e42dcbcef197cfd4b6b2193f493c6e Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 20 May 2026 09:01:36 -0400 Subject: [PATCH 15/23] feat(liturgy): morphemeAlignTo authored across all Metta Sutta verses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followed up the v1a fix with a full line-by-line pass: every witness where two-plus English tokens mapped to a morpheme-bearing Pāli word now carries an explicit morphemeAlignTo, so the arrows anchor on the semantically correct morpheme instead of the positional guess. 41 witnesses annotated. The genuine reversals fixed include: - gabbhaseyya: 'lie' → seyya (lying), 'womb' → gabbha - brahmametaṁ: 'sublime/divine' → brahma, 'this' → metaṁ - dukkhamiccheyya: 'harm/suffer' → dukkham, 'wish' → iccheyya - sambhavesī: 'seeking' → esī, 'birth' → bhav - sallahukavutti: 'living' → vutti, 'lightly' → sallahuka - idhamāhu: 'they call' → māhu, 'here' → idha - evampi: 'even' → pi, 'so' → evam - ekaputtamanurakkhe: 'protect' → rakkhe, 'child' → putta, 'only' → eka Plus many minor cases where a grammatical English word (of, for, in, with, and) was landing on a meaning-stem morpheme — now redirected to the ending morpheme or the stem as the sense requires. Validated: all 41 morphemeAlignTo arrays length-match their alignTo and every index is in range. Playwright-confirmed on v6d (dukkham now arrows to 'harm', not 'wish'). 1095 liturgy tests pass. --- data/liturgy/metta-sutta.ts | 71 ++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/data/liturgy/metta-sutta.ts b/data/liturgy/metta-sutta.ts index bb1e809..aa3bf51 100644 --- a/data/liturgy/metta-sutta.ts +++ b/data/liturgy/metta-sutta.ts @@ -142,6 +142,7 @@ export const mettaSutta: LiturgyDoc = { by: 'Sujato (SuttaCentral)', text: 'who has comprehended the state of peace.', alignTo: [-1, 4, 4, -1, 3, -1, 2], + morphemeAlignTo: [null, 2, 2, null, null, null, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0', }, @@ -149,6 +150,7 @@ export const mettaSutta: LiturgyDoc = { by: 'Thanissaro (Access to Insight)', text: 'who wants to break through to the state of peace:', alignTo: [-1, -1, -1, 4, 4, -1, -1, 3, -1, 2], + morphemeAlignTo: [null, null, null, 2, 1, null, null, null, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC', }, @@ -260,12 +262,14 @@ export const mettaSutta: LiturgyDoc = { by: 'Amaravati', text: 'straightforward and gentle in speech, humble and not conceited.', alignTo: [-1, -1, 2, -1, 0, 3, -1, 3, 3], + morphemeAlignTo: [null, null, null, null, null, 2, null, 0, 2], url: AMARAVATI_URL, }, { by: 'Sujato (SuttaCentral)', text: 'easy to speak to, gentle, and not proud,', alignTo: [0, 0, 0, 0, 2, -1, 3, 3], + morphemeAlignTo: [0, 0, 1, 1, null, null, 0, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0', }, @@ -273,6 +277,7 @@ export const mettaSutta: LiturgyDoc = { by: 'Thanissaro (Access to Insight)', text: 'easy to instruct, gentle, and not conceited,', alignTo: [0, 0, 0, 2, -1, 3, 3], + morphemeAlignTo: [0, 0, 1, null, null, 0, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC', }, @@ -326,7 +331,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'Contented and easily satisfied,', alignTo: [0, -1, 2, -1], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'content and unburdensome,', alignTo: [0, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'content and easy to support,', alignTo: [0, -1, 2, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'content and easy to support,', alignTo: [0, -1, 2, 2, 2], morphemeAlignTo: [null, null, 0, 0, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -362,9 +367,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'appakicco ca sallahukavutti' }, ], witnesses: [ - { by: 'Amaravati', text: 'unburdened with duties and frugal in their ways.', alignTo: [-1, 0, -1, 0, 2, 2, -1, -1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'living lightly with few duties,', alignTo: [2, 2, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'with few duties, living lightly,', alignTo: [-1, 0, 0, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'unburdened with duties and frugal in their ways.', alignTo: [-1, 0, -1, 0, 2, 2, -1, -1], morphemeAlignTo: [null, 0, null, 0, 0, 1, null, null], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'living lightly with few duties,', alignTo: [2, 2, -1, 0, 0], morphemeAlignTo: [1, 0, null, 0, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'with few duties, living lightly,', alignTo: [-1, 0, 0, 2, 2], morphemeAlignTo: [null, 0, 1, 1, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -398,7 +403,7 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'santindriyo ca nipako ca' }, ], witnesses: [ - { by: 'Amaravati', text: 'Peaceful and calm and wise and skillful,', alignTo: [0, -1, 0, -1, 2, -1, 2], url: AMARAVATI_URL }, + { by: 'Amaravati', text: 'Peaceful and calm and wise and skillful,', alignTo: [0, -1, 0, -1, 2, -1, 2], morphemeAlignTo: [0, null, 0, null, null, null, null], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'sensible and prudent,', alignTo: [0, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, { by: 'Thanissaro (Access to Insight)', text: 'with peaceful faculties, masterful,', alignTo: [-1, 0, 0, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], @@ -434,7 +439,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'not proud or demanding in nature.', alignTo: [0, 0, -1, 0, -1, -1], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'not arrogant or fawning over families.', alignTo: [0, 0, -1, 2, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'modest, and no greed for supporters.', alignTo: [0, -1, 2, 2, -1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'modest, and no greed for supporters.', alignTo: [0, -1, 2, 2, -1, 1], morphemeAlignTo: [null, null, 0, 2, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -480,7 +485,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'Let them not do the slightest thing', alignTo: [-1, -1, 0, 3, -1, 2, 4], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: "They'd not do the slightest thing", alignTo: [-1, 0, 3, -1, 2, 4], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'Do not do the slightest thing', alignTo: [3, 0, 3, -1, 2, 4], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'Do not do the slightest thing', alignTo: [3, 0, 3, -1, 2, 4], morphemeAlignTo: [2, null, 2, null, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { form: 'na', pronunciation: 'nah', gloss: '"not". Combines with the next verb to negate the whole sentence.' }, @@ -676,7 +681,7 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'tasā vā thāvarā vā anavasesā' }, ], witnesses: [ - { by: 'Amaravati', text: 'whether they are weak or strong, omitting none,', alignTo: [-1, -1, -1, 0, 1, 2, 4, 4], url: AMARAVATI_URL }, + { by: 'Amaravati', text: 'whether they are weak or strong, omitting none,', alignTo: [-1, -1, -1, 0, 1, 2, 4, 4], morphemeAlignTo: [null, null, null, null, null, null, 1, 0], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'none excepted, weak or strong,', alignTo: [4, 4, 0, 1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, { by: 'Thanissaro (Access to Insight)', text: 'weak or strong, without exception,', alignTo: [0, 1, 2, -1, 4], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], @@ -830,7 +835,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'those born and to-be-born.', alignTo: [-1, 0, 1, 2], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'those born or to be born—', alignTo: [-1, 0, 1, -1, -1, 2], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'born or seeking birth:', alignTo: [0, 1, 2, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'born or seeking birth:', alignTo: [0, 1, 2, 2], morphemeAlignTo: [null, null, 2, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -978,9 +983,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'nāññamaññassa dukkhamiccheyya' }, ], witnesses: [ - { by: 'Amaravati', text: 'wish harm upon another.', alignTo: [1, 1, -1, 0], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'nor wish harm for one another', alignTo: [-1, 1, 1, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'wish for another to suffer.', alignTo: [1, -1, 0, -1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'wish harm upon another.', alignTo: [1, 1, -1, 0], morphemeAlignTo: [1, 0, null, null], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'nor wish harm for one another', alignTo: [-1, 1, 1, -1, 0, 0], morphemeAlignTo: [null, 1, 0, null, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'wish for another to suffer.', alignTo: [1, -1, 0, -1, 1], morphemeAlignTo: [1, null, null, null, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1051,9 +1056,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'āyusā ekaputtamanurakkhe' }, ], witnesses: [ - { by: 'Amaravati', text: 'protects with her life her child, her only child,', alignTo: [1, -1, 0, 0, 1, 1, 1, 1, 1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'would protect with her life her one and only child,', alignTo: [-1, 1, -1, 0, 0, 1, 1, -1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'would risk her life to protect her child, her only child,', alignTo: [-1, -1, 0, 0, -1, 1, 1, 1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'protects with her life her child, her only child,', alignTo: [1, -1, 0, 0, 1, 1, 1, 1, 1], morphemeAlignTo: [3, null, null, null, 3, 1, 1, 0, 1], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'would protect with her life her one and only child,', alignTo: [-1, 1, -1, 0, 0, 1, 1, -1, 1, 1], morphemeAlignTo: [null, 3, null, null, null, 3, 0, null, 0, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'would risk her life to protect her child, her only child,', alignTo: [-1, -1, 0, 0, -1, 1, 1, 1, -1, 1, 1], morphemeAlignTo: [null, null, null, null, null, 3, 3, 1, null, 0, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1086,8 +1091,8 @@ export const mettaSutta: LiturgyDoc = { ], witnesses: [ { by: 'Amaravati', text: 'so should one protect the boundless heart that loves all beings.', alignTo: [0, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: "so they'd cultivate a heart of love without limit for all sentient beings.", alignTo: [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'even so should one cultivate the heart limitlessly with regard to all beings.', alignTo: [0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Sujato (SuttaCentral)', text: "so they'd cultivate a heart of love without limit for all sentient beings.", alignTo: [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1], morphemeAlignTo: [null, null, null, null, null, null, null, null, null, null, 0, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'even so should one cultivate the heart limitlessly with regard to all beings.', alignTo: [0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1], morphemeAlignTo: [1, 0, null, null, null, null, null, null, null, null, null, 0, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1171,7 +1176,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'Radiating kindness over the entire world:', alignTo: [-1, 0, -1, -1, 1, 1], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'With love for the whole world,', alignTo: [-1, 0, -1, -1, 1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'With good will for the entire cosmos,', alignTo: [-1, 0, 0, -1, -1, 1, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'With good will for the entire cosmos,', alignTo: [-1, 0, 0, -1, -1, 1, 1], morphemeAlignTo: [null, 0, 0, null, null, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1227,7 +1232,7 @@ export const mettaSutta: LiturgyDoc = { witnesses: [ { by: 'Amaravati', text: 'and downwards to the depths;', alignTo: [2, 1, -1, -1, 1], url: AMARAVATI_URL }, { by: 'Sujato (SuttaCentral)', text: 'upwards, downwards and side-to-side,', alignTo: [0, 1, 2, 3], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'above, below, & all around,', alignTo: [0, 1, 2, 3, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Thanissaro (Access to Insight)', text: 'above, below, & all around,', alignTo: [0, 1, 2, 3, 3], morphemeAlignTo: [null, null, null, 0, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { form: 'uddhaṁ', pronunciation: 'OOD-dahm', gloss: 'upward — the direction-word for "above". The radiating-out begins.' }, @@ -1254,7 +1259,7 @@ export const mettaSutta: LiturgyDoc = { ], witnesses: [ { by: 'Amaravati', text: 'outwards and unbounded, freed from hatred and ill-will.', alignTo: [-1, -1, 0, -1, -1, 1, -1, 2], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'unbounded, free of enmity and hate.', alignTo: [0, 1, 1, 2, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Sujato (SuttaCentral)', text: 'unbounded, free of enmity and hate.', alignTo: [0, 1, 1, 2, -1, 1], morphemeAlignTo: [null, 0, 0, null, null, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, { by: 'Thanissaro (Access to Insight)', text: 'unobstructed, without enmity or hate.', alignTo: [0, 1, 1, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ @@ -1366,8 +1371,8 @@ export const mettaSutta: LiturgyDoc = { ], witnesses: [ { by: 'Amaravati', text: 'one should sustain this recollection.', alignTo: [-1, -1, 2, 0, 1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'they would commit to this kind of mindfulness;', alignTo: [-1, 2, 2, -1, 0, -1, -1, 1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'one should be resolved on this mindfulness.', alignTo: [-1, 2, -1, 2, -1, 0, 1], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Sujato (SuttaCentral)', text: 'they would commit to this kind of mindfulness;', alignTo: [-1, 2, 2, -1, 0, -1, -1, 1], morphemeAlignTo: [null, 1, 1, null, null, null, null, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'one should be resolved on this mindfulness.', alignTo: [-1, 2, -1, 2, -1, 0, 1], morphemeAlignTo: [null, 1, null, 1, null, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { form: 'etaṁ', pronunciation: 'AY-tahm', gloss: 'this (object form) — refers back to the cultivated heart-mind from v8.' }, @@ -1399,9 +1404,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'brahmametaṁ vihāraṁ idhamāhu' }, ], witnesses: [ - { by: 'Amaravati', text: 'This is said to be the sublime abiding.', alignTo: [0, -1, 2, -1, -1, -1, 0, 1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'this is what they call a divine meditation in this life.', alignTo: [0, -1, -1, 2, 2, -1, 0, 1, 2, -1, -1], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'This is called a sublime abiding here & now.', alignTo: [0, -1, 2, -1, 0, 1, 2, -1, 2], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'This is said to be the sublime abiding.', alignTo: [0, -1, 2, -1, -1, -1, 0, 1], morphemeAlignTo: [1, null, null, null, null, null, 0, null], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'this is what they call a divine meditation in this life.', alignTo: [0, -1, -1, 2, 2, -1, 0, 1, 2, -1, -1], morphemeAlignTo: [1, null, null, 1, 1, null, 0, null, 0, null, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'This is called a sublime abiding here & now.', alignTo: [0, -1, 2, -1, 0, 1, 2, -1, 2], morphemeAlignTo: [1, null, 1, null, 0, null, 0, null, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1441,9 +1446,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'diṭṭhiñca anupaggamma' }, ], witnesses: [ - { by: 'Amaravati', text: 'By not holding to fixed views,', alignTo: [-1, 1, 1, -1, 1, 0], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'Avoiding wrong views,', alignTo: [1, 1, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'Not taken with views,', alignTo: [1, 1, -1, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'By not holding to fixed views,', alignTo: [-1, 1, 1, -1, 1, 0], morphemeAlignTo: [null, 0, 2, null, 2, null], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'Avoiding wrong views,', alignTo: [1, 1, 0], morphemeAlignTo: [0, 2, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'Not taken with views,', alignTo: [1, 1, -1, 0], morphemeAlignTo: [0, 2, null, null], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1521,9 +1526,9 @@ export const mettaSutta: LiturgyDoc = { { lang: 'pi-Latn', label: 'Pāli', text: 'kāmesu vineyya gedhaṁ' }, ], witnesses: [ - { by: 'Amaravati', text: 'being freed from all sense desires,', alignTo: [-1, 1, -1, -1, 0, 0], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'having removed desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'having subdued desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Amaravati', text: 'being freed from all sense desires,', alignTo: [-1, 1, -1, -1, 0, 0], morphemeAlignTo: [null, null, null, null, 0, 0], url: AMARAVATI_URL }, + { by: 'Sujato (SuttaCentral)', text: 'having removed desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], morphemeAlignTo: [null, null, null, null, 0, 0], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'having subdued desire for sensual pleasures,', alignTo: [-1, 1, 2, -1, 0, 0], morphemeAlignTo: [null, null, null, null, 0, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { @@ -1564,8 +1569,8 @@ export const mettaSutta: LiturgyDoc = { ], witnesses: [ { by: 'Amaravati', text: 'is not born again into this world.', alignTo: [-1, 0, -1, 4, -1, -1, -1], url: AMARAVATI_URL }, - { by: 'Sujato (SuttaCentral)', text: 'they would never come to lie in a womb again.', alignTo: [-1, 0, 2, -1, -1, 3, -1, -1, 3, 4], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, - { by: 'Thanissaro (Access to Insight)', text: 'one never again will lie in the womb.', alignTo: [-1, 0, 4, -1, 3, -1, -1, 3], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, + { by: 'Sujato (SuttaCentral)', text: 'they would never come to lie in a womb again.', alignTo: [-1, 0, 2, -1, -1, 3, -1, -1, 3, 4], morphemeAlignTo: [null, null, null, null, null, 1, null, null, 0, null], url: 'https://suttacentral.net/snp1.8/en/sujato', license: 'CC0' }, + { by: 'Thanissaro (Access to Insight)', text: 'one never again will lie in the womb.', alignTo: [-1, 0, 4, -1, 3, -1, -1, 3], morphemeAlignTo: [null, null, null, null, 1, null, null, 0], url: 'https://www.accesstoinsight.org/tipitaka/kn/snp/snp.1.08.than.html', license: 'CC BY-NC' }, ], words: [ { form: 'na', pronunciation: 'nah', gloss: 'not — together with *hi* below: "not at all, certainly not".' }, From 018740277f9f6878e6f7309ac7ddbcb7ef2e8845 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 20 May 2026 09:07:00 -0400 Subject: [PATCH 16/23] fix(liturgy): alignment edge passes behind the transliteration line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The relational-arrow SVG was painting on top of the transliteration line, so the romanization was crossed by a green curve and hard to read. Establish an explicit three-layer z-order on the segment: SVG alignment edges z-0 transliteration line z-[5] (+ bg-slate-950 to mask the edge) chant words z-10 The transliteration now sits above the edge (edge tucks behind it, re-emerging below) but still below the chant words — so word tooltips, which live in the word's z-10 stacking context, continue to paint above the transliteration. Same bg-mask trick the word spans already use to hide edge strokes behind themselves. --- components/liturgy/shapes/TripleScriptWitness.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/liturgy/shapes/TripleScriptWitness.tsx b/components/liturgy/shapes/TripleScriptWitness.tsx index bf05489..e07cfba 100644 --- a/components/liturgy/shapes/TripleScriptWitness.tsx +++ b/components/liturgy/shapes/TripleScriptWitness.tsx @@ -192,7 +192,7 @@ const TransliterationLine: React.FC<{ if (!respelling) return null; return (
@@ -204,7 +204,7 @@ const TransliterationLine: React.FC<{ if (!variant.transliteration) return null; return (
@@ -961,7 +961,7 @@ const AlignmentLines: React.FC<{ lines: Line[]; containerWidth: number }> = ({ const visible = lines; return (
+