// Greek/Hebrew word study for the chunk: compact cards (one open for editing at a // time), Strong's lookup, and suggestions from the passage. import { useState } from 'react'; import DOMPurify from 'dompurify'; import { externalLookupLinks, speakOriginalWord } from '../../utils/wordStudy.js'; const inputCls = 'mt-1 block w-full rounded-lg border border-[var(--r-line)] bg-[var(--r-bg)] px-2.5 py-1.5 text-sm text-[var(--r-text)] focus:outline-none focus:ring-2 focus:ring-[var(--r-line)]'; const btn = 'rounded-lg border border-[var(--r-line)] px-2.5 py-1.5 text-xs hover:bg-black/5 disabled:opacity-50'; function WordCard({ word, open, onToggle, chunkId, wordStudy }) { const { updateChunkWord, lookupWord, removeGreekWord } = wordStudy; const set = (patch) => updateChunkWord(chunkId, word.id, patch); const field = (label, key, placeholder) => ( ); const notFound = (word.shortDefinition === 'No definition found.' || word.shortDefinition === 'Lookup failed.') && !word.lexeme && !word.definitionHtml && word.query.trim(); return (
{open && (
{word.lexeme && }
{field(word.strongNumber?.startsWith('H') ? 'Hebrew word' : 'Greek word', 'lexeme')} {field('Transliteration', 'transliteration')} {field('Part of speech', 'partOfSpeech', 'e.g. Noun')} {field('English word', 'englishGloss', 'e.g. grace')}
{field('Short definition', 'shortDefinition')} {word.definitionHtml && (
Extended definition
)} {notFound ? (

Not found in BDBT — look it up manually:

{externalLookupLinks(word.query).map(({ label, url }) => ( {label} ↗ ))}
) : null}
)}
); } export default function WordStudyTab({ wordStudy, chunk, openWordId, setOpenWordId }) { const { suggestingGreekForChunkId, suggestingHebrewForChunkId, suggestGreekWordsForChunk, suggestHebrewWordsForChunk, addGreekWord } = wordStudy; return (
{chunk.greekWords.length === 0 && (

No words yet. Open a verse’s original words in the text and click one, or add a word to look it up.

)} {chunk.greekWords.map((w) => ( setOpenWordId(openWordId === w.id ? null : w.id)} /> ))}
); }