Gospel page audio: narration script, ElevenLabs generator, player on /salvation, admin Gospel Page setting; v2.40.0
Publish Container / build (push) Successful in 17m6s

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 5.5 committed 2026-10-14 08:06:32 -04:00
1 parent 330c354d54
commit ad1c3e35b1
8 files changed
+293 -3

No files matched your search

+30 -1
View File
@@ -736,7 +736,7 @@ type StringField = Exclude<keyof SiteContent, 'customLinks' | 'customBlocks' | '
type AdminView =
| 'dashboard'
| 'homepage:hero' | 'homepage:share' | 'homepage:prism' | 'homepage:where-to-next'
| 'start-here'
| 'start-here' | 'salvation'
| 'about:show-copy' | 'about:bio' | 'about:testimonials'
| 'contact:profile' | 'contact:copy'
| 'podcast:current-series' | 'podcast:highlights' | 'podcast:finished-books' | 'podcast:scripts' | 'podcast:workflow' | 'podcast:season-check' | 'podcast:rss'
@@ -772,6 +772,7 @@ const ADMIN_NAV: NavGroup[] = [
{ kind: 'leaf', view: 'homepage:where-to-next', label: 'Where to Next' },
]},
{ kind: 'leaf', view: 'start-here', label: 'Start Here' },
{ kind: 'leaf', view: 'salvation', label: 'Gospel Page' },
{ kind: 'parent', id: 'about', label: 'About', children: [
{ kind: 'leaf', view: 'about:show-copy', label: 'Show Copy' },
{ kind: 'leaf', view: 'about:bio', label: 'Nate Bio' },
@@ -7021,6 +7022,34 @@ const [dashboardNow, setDashboardNow] = useState(() => new Date())
</section>
)}
{/* GOSPEL PAGE (/salvation) */}
{adminView === 'salvation' && (
<section className="admin-panel-section" aria-label="Gospel page">
<div className="admin-panel-head">
<h2>Gospel Page</h2>
<p>Settings for <a href="/salvation" target="_blank" rel="noopener noreferrer">/salvation</a>, The Gospel in a Courtroom.</p>
</div>
<div className="admin-panel-subhead">
<h3>Audio narration</h3>
<p>An audio version of The Case, with a player at the top of the page. Leave this blank to hide the player.</p>
</div>
<div className="admin-field">
<label htmlFor="field-salvationAudioUrl">Audio file URL (MP3)</label>
<input id="field-salvationAudioUrl" type="text" placeholder="https://…/salvation-case.mp3" value={form.salvationAudioUrl ?? ''} onChange={e => handleChange('salvationAudioUrl', e.target.value)} />
</div>
{form.salvationAudioUrl?.trim() && (
<div className="admin-field">
<label>Preview</label>
<audio controls preload="none" src={form.salvationAudioUrl.trim()} style={{ width: '100%' }} />
</div>
)}
<p className="admin-stats-note">
To make the file: put your ElevenLabs key and voice in your local <code>.env</code>, then run{' '}
<code>node --env-file=.env scripts/generate-salvation-audio.mjs</code>. Upload the MP3 in Asset Manager and paste its URL here, then Save and Publish.
</p>
</section>
)}
{/* LEGAL */}
{adminView === 'legal' && (
<section className="admin-panel-section" aria-label="Legal Pages">