Add admin control for hero podcast art image; v1.1.28
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "siteforge",
|
"name": "siteforge",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.1.27",
|
"version": "1.1.28",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -850,6 +850,7 @@ const BRAND_KIT_VERIFICATION = [
|
|||||||
] as const
|
] as const
|
||||||
|
|
||||||
const FIELDS: Array<{ key: StringField; label: string; multiline?: boolean; section: MainContentSection }> = [
|
const FIELDS: Array<{ key: StringField; label: string; multiline?: boolean; section: MainContentSection }> = [
|
||||||
|
{ key: 'podcastArtUrl', label: 'Hero — Podcast Art Image URL', section: 'hero' },
|
||||||
{ key: 'eyebrow', label: 'Hero Eyebrow Text', section: 'hero' },
|
{ key: 'eyebrow', label: 'Hero Eyebrow Text', section: 'hero' },
|
||||||
{ key: 'heroTagline', label: 'Hero Tagline', section: 'hero' },
|
{ key: 'heroTagline', label: 'Hero Tagline', section: 'hero' },
|
||||||
{ key: 'heroBtnSpotify', label: 'Hero — Spotify Button Label', section: 'hero' },
|
{ key: 'heroBtnSpotify', label: 'Hero — Spotify Button Label', section: 'hero' },
|
||||||
@@ -3187,6 +3188,8 @@ export default function AdminPage({ content, onSave, onLogout }: Props) {
|
|||||||
{multiline
|
{multiline
|
||||||
? <textarea id={`field-${key}`} value={form[key] as string} onChange={e => handleChange(key, e.target.value)} rows={4} />
|
? <textarea id={`field-${key}`} value={form[key] as string} onChange={e => handleChange(key, e.target.value)} rows={4} />
|
||||||
: <input id={`field-${key}`} type="text" value={form[key] as string} onChange={e => handleChange(key, e.target.value)} />}
|
: <input id={`field-${key}`} type="text" value={form[key] as string} onChange={e => handleChange(key, e.target.value)} />}
|
||||||
|
{(key.includes('ArtUrl') || key.includes('ImageUrl')) && renderImageAssetSelector(form[key] as string, value => handleChange(key, value), `field-${key}-asset`)}
|
||||||
|
{(key.includes('ArtUrl') || key.includes('ImageUrl')) && renderImagePreview(form[key] as string, `${label} preview`)}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1119,7 +1119,7 @@ function LandingPage({ content }: { content: SiteContent }) {
|
|||||||
<div className="hero-art">
|
<div className="hero-art">
|
||||||
<div className="art-glow" aria-hidden="true" />
|
<div className="art-glow" aria-hidden="true" />
|
||||||
<img
|
<img
|
||||||
src="/images/podcast-art.jpeg"
|
src={content.podcastArtUrl || '/images/podcast-art.jpeg'}
|
||||||
alt="Verse by Verse with Nate podcast artwork"
|
alt="Verse by Verse with Nate podcast artwork"
|
||||||
className="podcast-art"
|
className="podcast-art"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ export interface LegalSettings {
|
|||||||
|
|
||||||
export interface SiteContent {
|
export interface SiteContent {
|
||||||
// ── Hero ──
|
// ── Hero ──
|
||||||
|
podcastArtUrl: string
|
||||||
eyebrow: string
|
eyebrow: string
|
||||||
heroTagline: string
|
heroTagline: string
|
||||||
heroBtnSpotify: string
|
heroBtnSpotify: string
|
||||||
@@ -275,6 +276,7 @@ export interface SiteContent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const DEFAULTS: SiteContent = {
|
export const DEFAULTS: SiteContent = {
|
||||||
|
podcastArtUrl: '/images/podcast-art.jpeg',
|
||||||
eyebrow: 'A Journey Through Scripture',
|
eyebrow: 'A Journey Through Scripture',
|
||||||
heroTagline: "Exploring God's Word one verse at a time",
|
heroTagline: "Exploring God's Word one verse at a time",
|
||||||
heroBtnSpotify: 'Listen on Spotify',
|
heroBtnSpotify: 'Listen on Spotify',
|
||||||
|
|||||||
Reference in New Issue
Block a user