// desidium-model.jsx — full talent profile page, exported to window
const { useEffect: useEffectMD } = React;
// Privacy-enhanced YouTube embed (16:9). Empty `id` renders a labelled placeholder frame.
function YouTubePlayer({ id, title, placeholder }) {
if (!id) return
{placeholder}
;
const src = "https://www.youtube-nocookie.com/embed/" + encodeURIComponent(id) + "?rel=0&modestbranding=1";
return (
);
}
const SOCIAL_ICONS = {
youtube: ,
instagram: ,
tiktok: ,
};
const SOCIAL_LABELS = { youtube: "YouTube", instagram: "Instagram", tiktok: "TikTok" };
// Row of external profile links; keys with an empty URL are skipped.
function SocialLinks({ social, name, lang, motion }) {
const keys = ["youtube", "instagram", "tiktok"].filter((k) => social && social[k]);
if (!keys.length) return null;
return (
{L(I18N.model.follow, lang)}
);
}
function ModelDetail({ model, lang, motion, onBack, onNav, goContact }) {
const m = I18N.model;
useEffectMD(() => { window.scrollTo(0, 0); }, [model.id]);
const divName = model.div === "twin" ? L(m.twinName, lang) : L(m.soulName, lang);
const idx = MODELS.findIndex((x) => x.id === model.id);
const next = MODELS[(idx + 1) % MODELS.length];
const ph = (model.photos || []);
const themeBase = (window.desidiumWp && window.desidiumWp.themeUri) || "";
return (
{/* HERO */}
{model.hero ? (
) : (
)}
{divName}
·
{L(model.cat, lang)}
{model.name}
{L(model.tagline, lang)}
{model.langs.join(" · ")}
{L(model.avail, lang)}
{/* ABOUT / DESCRIPTION + PRESENTATION VIDEO + SOCIAL */}
{L(m.about, lang)}
{L(model.desc, lang)}
{L(m.s_niche, lang)}
{L(model.niche, lang)}
{L(m.video, lang)}
{/* GALLERY */}
{/* SPECS */}
{L(m.specs, lang)}
{[[m.s_division, divName],[m.s_niche, L(model.niche,lang)],[m.s_langs, model.langs.join(" · ")],[m.s_avail, L(model.avail,lang)]].map(([k,v],i)=>(
- {L(k,lang)}
- {v}
))}
{/* CTA */}
{L(m.cta_label, lang)}
{L(m.cta_pre, lang)} {model.name}.
{L(m.cta_sub, lang)}
);
}
Object.assign(window, { ModelDetail, YouTubePlayer, SocialLinks });