Files
rea/website/public/assets/contributors.js
T
Ysopwnable 569ef4159d feat(website): add contributors and complete the Greek edition (#3520)
Add an equal, searchable directory of 214 contributors and translate its shared
navigation and copy. Complete the Greek website edition (1728/1728 messages),
preserving source examples, protected commands and evidence.

Publish refreshed contributor snapshots atomically and cover partial writes,
denied replacement and staging cleanup with failure regressions.

Validation: complete website checks and 16 maintenance tests, strict Greek
coverage, desktop/mobile and no-JavaScript journeys, selected PR CI and Greptile
follow-up. Codex automated review was unavailable because its quota was exhausted.
No analysis-provider behavior or production website publication is included.

Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Assisted-by: Suika (gensokyo-skills:suika-scatter-gather-planning)
Assisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)
Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
2026-10-14 16:21:24 +00:00

32 lines
1.1 KiB
JavaScript

import { t } from "./i18n.js";
const search = document.querySelector("[data-contributors-search]");
const input = document.getElementById("contributor-search");
const status = document.querySelector("[data-contributors-status]");
const empty = document.querySelector("[data-contributors-empty]");
const people = Array.from(document.querySelectorAll("[data-contributor]"));
if (search && input && status && empty) {
function filterContributors() {
const query = input.value.trim().replace(/^@/, "").toLowerCase();
let count = 0;
for (const person of people) {
const matches = person
.getAttribute("data-contributor")
.toLowerCase()
.includes(query);
person.hidden = !matches;
if (matches) count += 1;
}
status.textContent = t("Contributors: {count}", {
count: new Intl.NumberFormat(document.documentElement.lang).format(count),
});
empty.hidden = count !== 0;
}
input.addEventListener("input", filterContributors);
input.addEventListener("search", filterContributors);
filterContributors();
search.hidden = false;
}