feat: make bio highlight tags dynamic and refine domain routing for www subdomains
- Add bioTag1, bioTag2, bioTag3 fields to AuthorProfile model and defaultData - Add interactive Schlagworte editing fields to AdminPanel - Update Renee, SciFi, Erotica, and Clara portfolio templates to render dynamic bio tags - Sanitize domain routing logic to automatically match www and naked domain variants
This commit is contained in:
parent
99ea450c57
commit
7d08057636
8 changed files with 227 additions and 73 deletions
|
|
@ -45,6 +45,9 @@ async function initDatabase(): Promise<AuthorData> {
|
||||||
const keysToEnsure: (keyof AuthorProfile)[] = [
|
const keysToEnsure: (keyof AuthorProfile)[] = [
|
||||||
"customSectionTitle", "customSectionContent",
|
"customSectionTitle", "customSectionContent",
|
||||||
"customDomain", "customPath",
|
"customDomain", "customPath",
|
||||||
|
"bioTag1Label", "bioTag1Value",
|
||||||
|
"bioTag2Label", "bioTag2Value",
|
||||||
|
"bioTag3Label", "bioTag3Value",
|
||||||
"badgeText", "aboutTitle", "projectsTitle", "projectsSubtitle",
|
"badgeText", "aboutTitle", "projectsTitle", "projectsSubtitle",
|
||||||
"booksTitle", "booksSubtitle", "footerText",
|
"booksTitle", "booksSubtitle", "footerText",
|
||||||
"accentColor", "secondaryColor", "backgroundColor", "cardBgColor",
|
"accentColor", "secondaryColor", "backgroundColor", "cardBgColor",
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { AuthorData, AuthorProfile, Book, Project } from "../types";
|
||||||
import {
|
import {
|
||||||
Lock, Save, Plus, Trash2, Edit2, Check, RefreshCw, Sparkles,
|
Lock, Save, Plus, Trash2, Edit2, Check, RefreshCw, Sparkles,
|
||||||
BookOpen, Compass, Clipboard, Eye, Music, LogOut, ArrowLeftRight,
|
BookOpen, Compass, Clipboard, Eye, Music, LogOut, ArrowLeftRight,
|
||||||
Palette, Type, Image as ImageIcon, Globe
|
Palette, Type, Image as ImageIcon, Globe, Tag
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import ImagePicker from "./ImagePicker";
|
import ImagePicker from "./ImagePicker";
|
||||||
|
|
||||||
|
|
@ -594,6 +594,100 @@ export default function AdminPanel({ onLogout }: AdminPanelProps) {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Dynamic Schlagworte / Highlights */}
|
||||||
|
<div className="md:col-span-2 border-t border-slate-800/80 pt-6 mt-2 space-y-4">
|
||||||
|
<div>
|
||||||
|
<h4 className="text-sm font-bold text-white flex items-center gap-2">
|
||||||
|
<Tag className="w-4 h-4 text-amber-400" />
|
||||||
|
<span>Schlagworte & Fokus (3 Infoboxen unter "Über mich")</span>
|
||||||
|
</h4>
|
||||||
|
<p className="text-xs text-slate-500">Diese drei Kacheln erscheinen unter der Biografie. Sie können die Kategoriename (z.B. GENRE, TONALITÄT, FOKUS) und den zugehörigen Inhalt frei anpassen.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||||
|
{/* Schlagwort 1 */}
|
||||||
|
<div className="p-3 bg-slate-950 border border-slate-800 rounded-xl space-y-2">
|
||||||
|
<div className="text-xs font-semibold text-amber-400 uppercase flex items-center gap-1">
|
||||||
|
<span>Schlagwort 1</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Kategorie-Titel</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag1Label || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag1Label", e.target.value)}
|
||||||
|
placeholder="z.B. GENRE"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Inhalt / Wert</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag1Value || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag1Value", e.target.value)}
|
||||||
|
placeholder="z.B. Emotionale Romance"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs font-medium"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Schlagwort 2 */}
|
||||||
|
<div className="p-3 bg-slate-950 border border-slate-800 rounded-xl space-y-2">
|
||||||
|
<div className="text-xs font-semibold text-amber-400 uppercase flex items-center gap-1">
|
||||||
|
<span>Schlagwort 2</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Kategorie-Titel</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag2Label || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag2Label", e.target.value)}
|
||||||
|
placeholder="z.B. TONALITÄT"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Inhalt / Wert</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag2Value || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag2Value", e.target.value)}
|
||||||
|
placeholder="z.B. Herzlich & Hoffnungsvoll"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs font-medium"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Schlagwort 3 */}
|
||||||
|
<div className="p-3 bg-slate-950 border border-slate-800 rounded-xl space-y-2">
|
||||||
|
<div className="text-xs font-semibold text-amber-400 uppercase flex items-center gap-1">
|
||||||
|
<span>Schlagwort 3</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Kategorie-Titel</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag3Label || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag3Label", e.target.value)}
|
||||||
|
placeholder="z.B. FOKUS"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="text-[10px] font-mono text-slate-400 uppercase">Inhalt / Wert</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={profile.bioTag3Value || ""}
|
||||||
|
onChange={(e) => updateProfileField("bioTag3Value", e.target.value)}
|
||||||
|
placeholder="z.B. Gefühl & Tiefe"
|
||||||
|
className="w-full px-2.5 py-1.5 bg-slate-900 border border-slate-800 rounded-lg text-white text-xs font-medium"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Custom Domain & Routing Section */}
|
{/* Custom Domain & Routing Section */}
|
||||||
<div className="md:col-span-2 border-t border-slate-800/80 pt-6 mt-2 space-y-4">
|
<div className="md:col-span-2 border-t border-slate-800/80 pt-6 mt-2 space-y-4">
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
|
|
@ -108,27 +108,33 @@ export default function ClaraPortfolio({ data }: ClaraPortfolioProps) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag1Label || data.bioTag1Value) && (
|
||||||
<Leaf className="w-5 h-5" style={{ color: accentColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Leaf className="w-5 h-5 shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-stone-500 uppercase tracking-wider text-[10px]">Genre</div>
|
<div>
|
||||||
<div className="text-stone-200 font-semibold">Lyrik & Essays</div>
|
<div className="text-stone-500 uppercase tracking-wider text-[10px]">{data.bioTag1Label || "Genre"}</div>
|
||||||
|
<div className="text-stone-200 font-semibold">{data.bioTag1Value || "Lyrik & Essays"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag2Label || data.bioTag2Value) && (
|
||||||
<Sparkles className="w-5 h-5" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Sparkles className="w-5 h-5 shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-stone-500 uppercase tracking-wider text-[10px]">Ästhetik</div>
|
<div>
|
||||||
<div className="text-stone-200 font-semibold">Natur & Poesie</div>
|
<div className="text-stone-500 uppercase tracking-wider text-[10px]">{data.bioTag2Label || "Ästhetik"}</div>
|
||||||
|
<div className="text-stone-200 font-semibold">{data.bioTag2Value || "Natur & Poesie"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3 col-span-2 md:col-span-1" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag3Label || data.bioTag3Value) && (
|
||||||
<Feather className="w-5 h-5" style={{ color: accentColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3 col-span-2 md:col-span-1" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Feather className="w-5 h-5 shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-stone-500 uppercase tracking-wider text-[10px]">Fokus</div>
|
<div>
|
||||||
<div className="text-stone-200 font-semibold">Naturkontemplation</div>
|
<div className="text-stone-500 uppercase tracking-wider text-[10px]">{data.bioTag3Label || "Fokus"}</div>
|
||||||
|
<div className="text-stone-200 font-semibold">{data.bioTag3Value || "Naturkontemplation"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -108,27 +108,33 @@ export default function EroticaPortfolio({ data }: EroticaPortfolioProps) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag1Label || data.bioTag1Value) && (
|
||||||
<Heart className="w-5 h-5 fill-current" style={{ color: accentColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Heart className="w-5 h-5 fill-current shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">Genre</div>
|
<div>
|
||||||
<div className="text-neutral-200 font-semibold">Sinnliche Romance</div>
|
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">{data.bioTag1Label || "Genre"}</div>
|
||||||
|
<div className="text-neutral-200 font-semibold">{data.bioTag1Value || "Sinnliche Romance"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag2Label || data.bioTag2Value) && (
|
||||||
<Sparkles className="w-5 h-5" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Sparkles className="w-5 h-5 shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">Tonalität</div>
|
<div>
|
||||||
<div className="text-neutral-200 font-semibold">Elegant & Knisternd</div>
|
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">{data.bioTag2Label || "Tonalität"}</div>
|
||||||
|
<div className="text-neutral-200 font-semibold">{data.bioTag2Value || "Elegant & Knisternd"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 bg-neutral-900/50 border border-neutral-900 rounded-xl flex items-center gap-3 col-span-2 md:col-span-1">
|
{(data.bioTag3Label || data.bioTag3Value) && (
|
||||||
<Key className="w-5 h-5 text-orange-300" />
|
<div className="p-3 border rounded-xl flex items-center gap-3 col-span-2 md:col-span-1" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Key className="w-5 h-5 shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">Identität</div>
|
<div>
|
||||||
<div className="text-neutral-200 font-semibold">Diskret / Pseudonym</div>
|
<div className="text-neutral-500 uppercase tracking-wider text-[10px]">{data.bioTag3Label || "Identität"}</div>
|
||||||
|
<div className="text-neutral-200 font-semibold">{data.bioTag3Value || "Diskret / Pseudonym"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -109,27 +109,33 @@ export default function ReneePortfolio({ data }: ReneePortfolioProps) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 text-xs">
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
{(data.bioTag1Label || data.bioTag1Value) && (
|
||||||
<Heart className="w-5 h-5 fill-current" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
||||||
<div>
|
<Heart className="w-5 h-5 fill-current shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-slate-400 uppercase tracking-wider text-[10px]">Genre</div>
|
<div>
|
||||||
<div className="text-slate-200 font-semibold">Emotionale Romance</div>
|
<div className="text-slate-400 uppercase tracking-wider text-[10px]">{data.bioTag1Label || "Genre"}</div>
|
||||||
|
<div className="text-slate-200 font-semibold">{data.bioTag1Value || "Emotionale Romance"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
{(data.bioTag2Label || data.bioTag2Value) && (
|
||||||
<Sun className="w-5 h-5" style={{ color: accentColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
||||||
<div>
|
<Sun className="w-5 h-5 shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-slate-400 uppercase tracking-wider text-[10px]">Tonalität</div>
|
<div>
|
||||||
<div className="text-slate-200 font-semibold">Herzlich & Hoffungsvoll</div>
|
<div className="text-slate-400 uppercase tracking-wider text-[10px]">{data.bioTag2Label || "Tonalität"}</div>
|
||||||
|
<div className="text-slate-200 font-semibold">{data.bioTag2Value || "Herzlich & Hoffnungsvoll"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-xl flex items-center gap-3 col-span-2 md:col-span-1 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
{(data.bioTag3Label || data.bioTag3Value) && (
|
||||||
<Sparkles className="w-5 h-5" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-xl flex items-center gap-3 col-span-2 md:col-span-1 shadow-sm" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}30` }}>
|
||||||
<div>
|
<Sparkles className="w-5 h-5 shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-slate-400 uppercase tracking-wider text-[10px]">Fokus</div>
|
<div>
|
||||||
<div className="text-slate-200 font-semibold">Gefühl & Tiefe</div>
|
<div className="text-slate-400 uppercase tracking-wider text-[10px]">{data.bioTag3Label || "Fokus"}</div>
|
||||||
|
<div className="text-slate-200 font-semibold">{data.bioTag3Value || "Gefühl & Tiefe"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -121,27 +121,33 @@ export default function SciFiPortfolio({ data }: SciFiPortfolioProps) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 font-mono text-xs">
|
<div className="grid grid-cols-2 md:grid-cols-3 gap-4 pt-4 font-mono text-xs">
|
||||||
<div className="p-3 border rounded-lg flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag1Label || data.bioTag1Value) && (
|
||||||
<BookOpen className="w-5 h-5" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-lg flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<BookOpen className="w-5 h-5 shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-slate-500 uppercase tracking-widest">Fokus</div>
|
<div>
|
||||||
<div className="text-white font-semibold">Sci-Fi & Fantasy</div>
|
<div className="text-slate-500 uppercase tracking-widest">{data.bioTag1Label || "Fokus"}</div>
|
||||||
|
<div className="text-white font-semibold">{data.bioTag1Value || "Sci-Fi & Fantasy"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-lg flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag2Label || data.bioTag2Value) && (
|
||||||
<Star className="w-5 h-5" style={{ color: accentColor }} />
|
<div className="p-3 border rounded-lg flex items-center gap-3" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Star className="w-5 h-5 shrink-0" style={{ color: accentColor }} />
|
||||||
<div className="text-slate-500 uppercase tracking-widest">Welten</div>
|
<div>
|
||||||
<div className="text-white font-semibold">Techno-Magie</div>
|
<div className="text-slate-500 uppercase tracking-widest">{data.bioTag2Label || "Welten"}</div>
|
||||||
|
<div className="text-white font-semibold">{data.bioTag2Value || "Techno-Magie"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
<div className="p-3 border rounded-lg flex items-center gap-3 col-span-2 md:col-span-1" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
{(data.bioTag3Label || data.bioTag3Value) && (
|
||||||
<Award className="w-5 h-5" style={{ color: secondaryColor }} />
|
<div className="p-3 border rounded-lg flex items-center gap-3 col-span-2 md:col-span-1" style={{ backgroundColor: cardBgColor, borderColor: `${accentColor}20` }}>
|
||||||
<div>
|
<Award className="w-5 h-5 shrink-0" style={{ color: secondaryColor }} />
|
||||||
<div className="text-slate-500 uppercase tracking-widest">Stil</div>
|
<div>
|
||||||
<div className="text-white font-semibold">Episch & Atmosphärisch</div>
|
<div className="text-slate-500 uppercase tracking-widest">{data.bioTag3Label || "Stil"}</div>
|
||||||
|
<div className="text-white font-semibold">{data.bioTag3Value || "Episch & Atmosphärisch"}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,12 @@ export const defaultAuthorData: AuthorData = {
|
||||||
customSectionContent: "Besuchen Sie mich auf der nächsten Buchmesse am Stand für spekulative Phantastik. Ich freue mich auf den intergalaktischen Austausch mit meinen Leserinnen und Lesern!",
|
customSectionContent: "Besuchen Sie mich auf der nächsten Buchmesse am Stand für spekulative Phantastik. Ich freue mich auf den intergalaktischen Austausch mit meinen Leserinnen und Lesern!",
|
||||||
badgeText: "Cyber-Mystisches Archive",
|
badgeText: "Cyber-Mystisches Archive",
|
||||||
aboutTitle: "Über den Autor",
|
aboutTitle: "Über den Autor",
|
||||||
|
bioTag1Label: "Fokus",
|
||||||
|
bioTag1Value: "Sci-Fi & Fantasy",
|
||||||
|
bioTag2Label: "Status",
|
||||||
|
bioTag2Value: "Aktiv Forschend",
|
||||||
|
bioTag3Label: "Archiv",
|
||||||
|
bioTag3Value: "Verschlüsselt",
|
||||||
projectsTitle: "Aktuelle Projekte",
|
projectsTitle: "Aktuelle Projekte",
|
||||||
projectsSubtitle: "Ein exklusiver Blick auf das, was sich gerade auf meinem Schreib-Amboss befindet.",
|
projectsSubtitle: "Ein exklusiver Blick auf das, was sich gerade auf meinem Schreib-Amboss befindet.",
|
||||||
booksTitle: "Bücherregal",
|
booksTitle: "Bücherregal",
|
||||||
|
|
@ -115,6 +121,12 @@ export const defaultAuthorData: AuthorData = {
|
||||||
customSectionContent: "Tragen Sie sich in meinen privaten Briefverteiler ein, um exklusive Einladungen zu meinen intimen Salon-Lesungen in Berlin und Wien zu erhalten. Die Plätze sind streng limitiert.",
|
customSectionContent: "Tragen Sie sich in meinen privaten Briefverteiler ein, um exklusive Einladungen zu meinen intimen Salon-Lesungen in Berlin und Wien zu erhalten. Die Plätze sind streng limitiert.",
|
||||||
badgeText: "Stilvolle Sinnlichkeit & Romantik",
|
badgeText: "Stilvolle Sinnlichkeit & Romantik",
|
||||||
aboutTitle: "Das Geheimnis hinter der Feder",
|
aboutTitle: "Das Geheimnis hinter der Feder",
|
||||||
|
bioTag1Label: "Genre",
|
||||||
|
bioTag1Value: "Sinnliche Romance",
|
||||||
|
bioTag2Label: "Tonalität",
|
||||||
|
bioTag2Value: "Elegant & Knisternd",
|
||||||
|
bioTag3Label: "Identität",
|
||||||
|
bioTag3Value: "Diskret / Pseudonym",
|
||||||
projectsTitle: "In der Entstehung",
|
projectsTitle: "In der Entstehung",
|
||||||
projectsSubtitle: "Ein Blick in mein privates Arbeitszimmer. Hier reifen neue Kapitel voller Leidenschaft.",
|
projectsSubtitle: "Ein Blick in mein privates Arbeitszimmer. Hier reifen neue Kapitel voller Leidenschaft.",
|
||||||
booksTitle: "Das Samtregal",
|
booksTitle: "Das Samtregal",
|
||||||
|
|
@ -179,6 +191,12 @@ export const defaultAuthorData: AuthorData = {
|
||||||
customSectionContent: "Auf meinen geführten Waldspaziergängen und Schreib-Retreats lade ich Sie ein, die Stille des Waldes neu zu erfahren und Ihre Gedanken auf das Papier fließen zu lassen. Schreiben Sie mir gern für Termine und Buchungsanfragen.",
|
customSectionContent: "Auf meinen geführten Waldspaziergängen und Schreib-Retreats lade ich Sie ein, die Stille des Waldes neu zu erfahren und Ihre Gedanken auf das Papier fließen zu lassen. Schreiben Sie mir gern für Termine und Buchungsanfragen.",
|
||||||
badgeText: "Lyrik, Essays & Naturphilosophie",
|
badgeText: "Lyrik, Essays & Naturphilosophie",
|
||||||
aboutTitle: "Aus meiner Schreibstube",
|
aboutTitle: "Aus meiner Schreibstube",
|
||||||
|
bioTag1Label: "Genre",
|
||||||
|
bioTag1Value: "Lyrik & Essays",
|
||||||
|
bioTag2Label: "Ästhetik",
|
||||||
|
bioTag2Value: "Natur & Poesie",
|
||||||
|
bioTag3Label: "Fokus",
|
||||||
|
bioTag3Value: "Naturkontemplation",
|
||||||
projectsTitle: "Laufende Notizen & Skizzen",
|
projectsTitle: "Laufende Notizen & Skizzen",
|
||||||
projectsSubtitle: "Gedankenfragmente und Manuskripte, die leise im Winde reifen.",
|
projectsSubtitle: "Gedankenfragmente und Manuskripte, die leise im Winde reifen.",
|
||||||
booksTitle: "Veröffentlichte Bände",
|
booksTitle: "Veröffentlichte Bände",
|
||||||
|
|
@ -243,6 +261,12 @@ export const defaultAuthorData: AuthorData = {
|
||||||
customSectionContent: "Möchten Sie vorab Leseproben erhalten und mich auf meinem Schreibweg begleiten? Melden Sie sich für meine monatliche Herzenspost an!",
|
customSectionContent: "Möchten Sie vorab Leseproben erhalten und mich auf meinem Schreibweg begleiten? Melden Sie sich für meine monatliche Herzenspost an!",
|
||||||
badgeText: "Herzklopfen & Gefühlsstark",
|
badgeText: "Herzklopfen & Gefühlsstark",
|
||||||
aboutTitle: "Über Renee Heart",
|
aboutTitle: "Über Renee Heart",
|
||||||
|
bioTag1Label: "Genre",
|
||||||
|
bioTag1Value: "Emotionale Romance",
|
||||||
|
bioTag2Label: "Tonalität",
|
||||||
|
bioTag2Value: "Herzlich & Hoffnungsvoll",
|
||||||
|
bioTag3Label: "Fokus",
|
||||||
|
bioTag3Value: "Gefühl & Tiefe",
|
||||||
projectsTitle: "Aus der Schreibstube",
|
projectsTitle: "Aus der Schreibstube",
|
||||||
projectsSubtitle: "Ein Blick auf meine aktuellen Geschichten in Entstehung – voller Hoffnung und Herzklopfen.",
|
projectsSubtitle: "Ein Blick auf meine aktuellen Geschichten in Entstehung – voller Hoffnung und Herzklopfen.",
|
||||||
booksTitle: "Gefühlvolle Romane",
|
booksTitle: "Gefühlvolle Romane",
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,15 @@ export interface AuthorProfile {
|
||||||
// Custom static texts
|
// Custom static texts
|
||||||
badgeText?: string;
|
badgeText?: string;
|
||||||
aboutTitle?: string;
|
aboutTitle?: string;
|
||||||
|
|
||||||
|
// Dynamic Bio Highlights / Schlagworte (Über mich)
|
||||||
|
bioTag1Label?: string;
|
||||||
|
bioTag1Value?: string;
|
||||||
|
bioTag2Label?: string;
|
||||||
|
bioTag2Value?: string;
|
||||||
|
bioTag3Label?: string;
|
||||||
|
bioTag3Value?: string;
|
||||||
|
|
||||||
projectsTitle?: string;
|
projectsTitle?: string;
|
||||||
projectsSubtitle?: string;
|
projectsSubtitle?: string;
|
||||||
booksTitle?: string;
|
booksTitle?: string;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue