Gospel page audio: narration script, ElevenLabs generator, player on /salvation, admin Gospel Page setting; v2.40.0
Publish Container / build (push) Successful in 17m6s
Publish Container / build (push) Successful in 17m6s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
330c354d54
commit
ad1c3e35b1
8 files changed
+293
-3
No files matched your search
+30
-1
@@ -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">
|
||||
|
||||
Reference in new issue
Block a user