/* global React, window */
// ============================================================
// PAGE CONTENT COMPONENTS (composed by book.jsx into spreads)
// ============================================================
function Motes({ n = 14 }) {
const motes = React.useMemo(() => Array.from({ length: n }, () => ({
left: Math.random() * 100, bottom: Math.random() * 40,
dur: 8 + Math.random() * 10, delay: -Math.random() * 12, s: 2 + Math.random() * 3,
})), [n]);
return (
{motes.map((m, i) => (
))}
);
}
// ---------- Skills wheel ----------
function SkillsWheel({ t }) {
const skills = t.skills;
const N = skills.length;
const R = 41;
return (
{t.skillsTitle} · {t.skillsSub}
{skills.map((s, i) => {
const a = (i / N) * Math.PI * 2 - Math.PI / 2;
const x = 50 + R * Math.cos(a), y = 50 + R * Math.sin(a);
return (
{s}
);
})}
{t.skillsHub[0]}
{t.skillsHub[1]}
EST. 2024
);
}
// ---------- ANALOG pages ----------
function PgWelcome({ t, lang }) {
const { PixelTuxedoCat } = window;
return (
{t.fieldBook} · {t.place}
{t.name}
{t.role}
i
);
}
function PgRealms({ t, lang, go }) {
const { REALMS } = window;
return (
{t.chapterOf} — {t.realmsTitle}
{t.realmsTitle}
{t.realmsLede}
{REALMS.map((r, i) => (
))}
ii
);
}
function PgObjective({ t }) {
return (
{t.objectiveKicker}
{t.objectiveTitle}
{t.objective}
— {t.name}, {t.place}
iii
);
}
function ExperienceList({ t, items, heading, sub, folio }) {
return (
{t.expTitle}{sub ? " · " + sub : ""}
{heading}
{items.map((e, i) => (
{e.date}
{e.co} · {e.loc}
{e.role}
{e.pts.map((p, j) => - {p}
)}
))}
{folio}
);
}
function PgExperience1({ t, lang }) {
return ;
}
function PgExperience2({ t, lang }) {
return ;
}
function PgSkills({ t }) {
return (
vi
);
}
function PgEducation({ t }) {
return (
{t.eduTitle}
{t.eduTitle}
{t.edu.map((e, i) => (
{e.seal}
{e.t}
{e.o}
{e.d}
))}
vii
);
}
window.Pages = { Motes, SkillsWheel, PgWelcome, PgRealms, PgObjective, PgExperience1, PgExperience2, PgSkills, PgEducation };