{chapterTabs.map((ch, idx) => (
))}
{/* Add-chapter form */}
{showAddChapterForm && (
Add another chapter
Scripture & Chunks
{activeChapter.book} {activeChapter.chapter} ({project.translation})
{statusMessage || 'Click/shift-click, or type a verse range, to create a chunk.'}
Chapter verses
Click a verse, then shift-click an end verse.
setVerseSearch(e.target.value)}
placeholder="Search verses in this chapter…"
className="mb-3 block w-full rounded-xl border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 shadow-sm focus:border-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-200"
/>
{activeChapter.verses
.filter((verse) => verse.text.toLowerCase().includes(verseSearch.trim().toLowerCase()))
.map((verse) => {
const inRange =
rangeStart !== null &&
verse.number >= Math.min(rangeStart, rangeEnd) &&
verse.number <= Math.max(rangeStart, rangeEnd);
const inOwnChapterChunk = activeChapter.chunks.some(
(chunk) => verse.number >= chunk.startVerse && verse.number <= chunk.endVerse,
);
const prevChapter = project?.chapters?.[activeChapterIndex - 1] ?? null;
const inPrevChapterSpillover = prevChapter
? prevChapter.chunks.some((chunk) =>
Number.isInteger(chunk.spilloverEndVerse)
&& prevChapter.bookAbbrev === activeChapter.bookAbbrev
&& verse.number <= chunk.spilloverEndVerse
)
: false;
const inChunk = inOwnChapterChunk || inPrevChapterSpillover;
return (
);
})}
Chunks
{activeChapter.chunks.length} createdType chunk range
Click-based chapter span
Click a start verse in this chapter, then choose where to end in the next chapter.
Start
{rangeStart ?? 'Not selected'}
{activeChapter.chunks.length === 0 ? (
))
)}
No chunks yet. Select verse ranges to add sections.
) : (
activeChapter.chunks.map((chunk, index) => (