/* Direction A — React app (rich Avesis version) */
const { useState, useEffect } = React;
const C = window.SITE_CONTENT;
const ACCENT_OPTIONS = ["#7a1f2b", "#1f3a5f", "#2f5d3a", "#1a1a1a", "#b8732a"];
const SECTION_ORDERS = {
"research-led": ["about", "metrics", "research", "publications", "books", "projects", "advising", "teaching", "awards", "education", "international", "roles", "news", "office", "contact"],
"about-led": ["about", "education", "metrics", "research", "publications", "books", "teaching", "projects", "advising", "awards", "international", "roles", "news", "office", "contact"],
"teaching-led": ["about", "metrics", "teaching", "advising", "books", "research", "publications", "projects", "awards", "education", "international", "roles", "news", "office", "contact"]
};
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#7a1f2b",
"dark": false,
"density": "regular",
"hero": "portrait",
"order": "research-led"
} /*EDITMODE-END*/;
// ── Helpers ────────────────────────────────────────────────
function SectionHead({ num, title }) {
return (
{num}
{title}
);
}
function renderAuthors(authorsStr) {
if (!authorsStr) return null;
const parts = authorsStr.split(/(Kınıklı G\.\s*İ\.|KINIKLI G\.\s*İ\.|Guvendik G\.)/g);
return parts.map((part, idx) => {
if (/^(Kınıklı G\.\s*İ\.|KINIKLI G\.\s*İ\.|Guvendik G\.)$/.test(part)) {
return {part} ;
}
return {part} ;
});
}
// ── Section components ────────────────────────────────────
function About({ lang, num }) {
return (
{C.about[lang].map((p, i) =>
{p}
)}
);
}
function Metrics({ lang, num }) {
return (
{C.metrics_note[lang] && {C.metrics_note[lang]}
}
{C.ui[lang].sdg}
{C.sdgs.map((n) => (
{C.ui[lang].sdg_short} {n}
{C.sdg_labels[lang][n]}
))}
);
}
function Research({ lang, num }) {
return (
{C.research_interests[lang].map((interest, i) => (
{String(i + 1).padStart(2, "0")}
{interest}
))}
);
}
function Publications({ lang, num }) {
const [filter, setFilter] = useState("all");
const [expanded, setExpanded] = useState(false);
const allPubs = C.publications_sample || [];
const filtered = allPubs.filter((p) => {
if (filter === "recent") return parseInt(p.year, 10) >= 2025;
if (filter === "scie") return (p.index || "").includes("SCI-E") || (p.index || "").includes("SSCI");
if (filter === "rct") return p.tag === "RCT" || p.tag === "Pilot RCT";
if (filter === "scale") return p.tag === "Scale validation" || p.tag === "Reliability";
return true;
});
const INITIAL_COUNT = 12;
const visiblePubs = (filter === "all" && !expanded) ? filtered.slice(0, INITIAL_COUNT) : filtered;
const filters = [
{ key: "all", label: lang === "tr" ? `Tümü (${allPubs.length})` : `All (${allPubs.length})` },
{ key: "recent", label: "2025–2026" },
{ key: "scie", label: "SCI-E · SSCI" },
{ key: "rct", label: lang === "tr" ? "RKT / Klinik" : "RCT" },
{ key: "scale", label: lang === "tr" ? "Ölçek & Güvenirlik" : "Scale & Validity" },
];
return (
{filters.map((f) => (
{ setFilter(f.key); setExpanded(false); }}
>
{f.label}
))}
{visiblePubs.map((p, i) => (
{p.year}
{p.title}
{renderAuthors(p.authors)}
{p.index}
{p.tag}
))}
{filter === "all" && filtered.length > INITIAL_COUNT && (
setExpanded(!expanded)}
>
{expanded
? (lang === "tr" ? "Listeyi daralt ↑" : "Show fewer articles ↑")
: (lang === "tr" ? `Tüm seçilmiş makaleleri göster (${filtered.length}) ↓` : `Show all selected articles (${filtered.length}) ↓`)}
)}
{C.publications_note[lang]}
);
}
function Books({ lang, num }) {
const [expanded, setExpanded] = useState(false);
const allChapters = C.book_chapters || [];
const INITIAL_CHAPTERS = 10;
const visibleChapters = expanded ? allChapters : allChapters.slice(0, INITIAL_CHAPTERS);
return (
{C.ui[lang].authored_books}
{C.ui[lang].book_chapters} ({allChapters.length})
{visibleChapters.map((c, i) => (
{c.year}
{lang === "tr" ? c.title_tr : c.title_en}
— {c.in}
))}
{allChapters.length > INITIAL_CHAPTERS && (
setExpanded(!expanded)}
>
{expanded
? (lang === "tr" ? "Bölüm listesini daralt ↑" : "Show fewer chapters ↑")
: (lang === "tr" ? `Tüm kitap bölümlerini göster (${allChapters.length}) ↓` : `Show all book chapters (${allChapters.length}) ↓`)}
)}
);
}
function Projects({ lang, num }) {
return (
{C.projects[lang].map((p, i) => (
{p.years}
{p.role}
{p.title}
{p.scope}
))}
);
}
function Awards({ lang, num }) {
return (
{C.awards[lang].map((a, i) => (
{a.year}
{a.name}
{a.where}
))}
);
}
function Teaching({ lang, num }) {
const levels = [
{ key: "doctoral", list: C.teaching[lang].doctoral },
{ key: "masters", list: C.teaching[lang].masters },
{ key: "bachelors", list: C.teaching[lang].bachelors }
];
return (
{levels.map((g) => (
{C.teaching.labels[lang][g.key]}
{g.list.length} {lang === "tr" ? "ders" : "courses"}
{g.list.map((name, i) => {name} )}
))}
);
}
function Advising({ lang, num }) {
return (
);
}
function Education({ lang, num }) {
return (
{lang === "tr" ? "Eğitim" : "Degrees"}
{lang === "tr" ? "Akademik kariyer" : "Academic career"}
{C.ui[lang].since_2005_inpatient}
);
}
function International({ lang, num }) {
return (
{C.international[lang].map((v, i) => (
{v.year}
{v.role}
{v.where}
))}
);
}
function Roles({ lang, num }) {
return (
{C.admin_roles[lang].map((r, i) => (
{r.years}
{r.role}
{r.where}
))}
{C.ui[lang].memberships}
{C.memberships[lang].map((m, i) => (
{m.year}
{m.name}{m.role}
))}
{C.ui[lang].editorial}
{C.editorial[lang].map((e, i) => (
{e.years}
{e.role}{e.venue}
))}
{C.ui[lang].languages}
{C.languages.map((l, i) => (
·
{l.name} {l.level}
))}
{C.ui[lang].certifications}
{C.certifications[lang].slice(0, 6).map((c, i) => (
{c.year}
{c.name}{c.where}
))}
{C.ui[lang].invited_talks}
{C.invited_talks[lang].map((t, i) => (
{t.year}
{t.title}{t.where}
))}
);
}
function News({ lang, num }) {
return (
{C.news[lang].map((n, i) => (
{n.date}
{n.body}
))}
);
}
function Office({ lang, num }) {
return (
{C.office_hours[lang].map((h, i) => (
))}
{lang === "tr" ? C.office_hours.note_tr : C.office_hours.note_en}
);
}
function Contact({ lang, num }) {
const address = lang === "tr" ? C.contact.address_tr : C.contact.address_en;
return (
);
}
const SECTIONS = {
about: About, metrics: Metrics, research: Research, publications: Publications,
books: Books, projects: Projects, awards: Awards,
teaching: Teaching, advising: Advising, education: Education, international: International,
roles: Roles, news: News, office: Office, contact: Contact
};
// ── Hero ───────────────────────────────────────────────────
function Hero({ lang, heroLayout }) {
const parts = C.name.split(" ");
const given = parts.slice(0, parts.length - 1).join(" ");
const family = parts[parts.length - 1];
const quickLinks = [
{ label: "ORCID", href: "https://orcid.org/0000-0003-1013-6393" },
{ label: "AVESİS", href: "https://avesis.hacettepe.edu.tr/guvendik" },
{ label: "Scopus", href: "https://www.scopus.com/authid/detail.uri?authorId=36660970600" },
{ label: "Web of Science", href: "https://publons.com/researcher/M-1828-2017" },
{ label: "ResearchGate", href: "https://www.researchgate.net/profile/Gizem-Kinikli-2" },
{ label: C.contact.email, href: `mailto:${C.contact.email}` },
];
return (
{C.tagline[lang]}
{given} {family}
{lang === "tr" ? C.honorific_tr : C.honorific_en}
{C.affiliation[lang].map((l, i) =>
{l}
)}
);
}
// ── Top bar ────────────────────────────────────────────────
function TopBar({ lang, setLang, dark, onToggleDark }) {
return (
{lang === "tr"
? "Hacettepe Üniversitesi · Fizik Tedavi ve Rehabilitasyon Fakültesi"
: "Hacettepe University · Faculty of Physical Therapy and Rehabilitation"}
{dark ? (lang === "tr" ? "☀ Açık" : "☀ Light") : (lang === "tr" ? "☾ Koyu" : "☾ Dark")}
setLang("tr")}>TR
setLang("en")}>EN
);
}
// ── Sidebar nav ────────────────────────────────────────────
function SideNav({ lang, order, active }) {
const labelFor = (key) => ({
about: C.ui[lang].nav_about,
metrics: C.ui[lang].nav_metrics,
research: C.ui[lang].nav_research,
publications: C.ui[lang].nav_publications,
books: C.ui[lang].nav_books,
projects: C.ui[lang].nav_projects,
awards: C.ui[lang].nav_awards,
teaching: C.ui[lang].nav_teaching,
advising: C.ui[lang].nav_advising,
education: C.ui[lang].nav_education,
international: C.ui[lang].nav_international,
roles: C.ui[lang].nav_roles,
news: C.ui[lang].nav_news,
office: C.ui[lang].nav_office,
contact: C.ui[lang].nav_contact
})[key];
return (
{order.map((k) => (
{labelFor(k)}
))}
);
}
// ── App ────────────────────────────────────────────────────
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [lang, setLang] = useState("tr");
const [active, setActive] = useState(null);
useEffect(() => {
document.documentElement.style.setProperty("--accent", t.accent);
document.documentElement.setAttribute("data-theme", t.dark ? "dark" : "light");
document.documentElement.setAttribute("data-density", t.density);
document.documentElement.lang = lang;
}, [t.accent, t.dark, t.density, lang]);
// Highlight the active section in the sidebar as the user scrolls
useEffect(() => {
const sections = Array.from(document.querySelectorAll("main.shell .section"));
if (!sections.length) return;
const io = new IntersectionObserver(
(entries) => {
const visible = entries
.filter((e) => e.isIntersecting)
.sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);
if (visible[0]) setActive(visible[0].target.id);
},
{ rootMargin: "-20% 0px -65% 0px", threshold: 0 }
);
sections.forEach((s) => io.observe(s));
return () => io.disconnect();
}, [t.order, lang]);
const order = SECTION_ORDERS[t.order] || SECTION_ORDERS["research-led"];
const showTweaks = typeof window !== "undefined" && window.location.search.includes("tweaks=1");
return (
<>
setTweak("dark", !t.dark)}
/>
{order.map((key, i) => {
const Cmp = SECTIONS[key];
const num = `0${i + 1}`.slice(-2);
return ;
})}
© {new Date().getFullYear()} {C.honorific_tr} {C.name}
{C.ui[lang].footer}
{showTweaks && (
setTweak("accent", v)} />
setTweak("dark", v)} />
setTweak("density", v)} />
setTweak("hero", v)} />
setTweak("order", v)} />
)}
>
);
}
ReactDOM.createRoot(document.getElementById("root")).render( );