runv-server

server tooling for runv.club
Log | Files | Refs | README

commit 6ae81da75a5ce258ce5feccdd329bcec646c1a33
parent d531403067d28a845f75bb2791262d73286771fa
Author: Pablo Murad <pablo@pablomurad.com>
Date:   Sat, 21 Mar 2026 18:49:20 -0300

small patch on mail and landingpage

Diffstat:
Msite/public/assets/app.js | 16++++++----------
Msite/public/assets/style.css | 31++++++++++++++++++++++++-------
Msite/public/index.html | 4+++-
3 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/site/public/assets/app.js b/site/public/assets/app.js @@ -1,7 +1,8 @@ /** * Landing runv.club — carrega members.json (só dados públicos) e coloca * pontos clicáveis (links) fora da coluna de texto; brilho ligado à data since. - * Posições fixas no viewport (não recalculam ao scroll); zona central alinhada à .wrap. + * Pontos com position:fixed no viewport (filhos de body); zona central sintética como .wrap. + * Não recalculam ao scroll — só em resize. * Array vazio: sem estrelas até build_directory.py gerar o JSON a partir de users.json. */ @@ -130,10 +131,8 @@ function isStarfieldMobileViewport() { return window.matchMedia("(max-width: 768px)").matches; } -function renderStarLinks(container, members) { - if (!container) return; - - container.replaceChildren(); +function renderStarLinks(members) { + document.querySelectorAll("a.star-member").forEach((el) => el.remove()); if (isStarfieldMobileViewport()) { return; @@ -162,13 +161,11 @@ function renderStarLinks(container, members) { const scale = 0.78 + bright * 0.42; a.style.setProperty("--star-scale", String(scale)); - container.appendChild(a); + document.body.appendChild(a); } } async function main() { - const starRoot = document.getElementById("starfield"); - let members = []; try { @@ -182,10 +179,9 @@ async function main() { let starRaf = 0; const scheduleStars = () => { - if (!starRoot) return; cancelAnimationFrame(starRaf); starRaf = requestAnimationFrame(() => { - renderStarLinks(starRoot, members); + renderStarLinks(members); }); }; diff --git a/site/public/assets/style.css b/site/public/assets/style.css @@ -17,7 +17,6 @@ html { scroll-behavior: smooth; - overflow-x: hidden; max-width: 100%; } @@ -25,7 +24,6 @@ body { margin: 0; min-height: 100vh; max-width: 100%; - overflow-x: hidden; font-family: "Atkinson Hyperlegible", Georgia, serif; font-size: 1.05rem; line-height: 1.6; @@ -37,6 +35,20 @@ body { background-size: 24px 24px; } +/* Overflow horizontal só no fluxo da página — evita interferir com camadas fixed no body. */ +.page-root { + position: relative; + z-index: 1; + overflow-x: clip; + max-width: 100%; +} + +@supports not (overflow: clip) { + .page-root { + overflow-x: hidden; + } +} + .visually-hidden { position: absolute; width: 1px; @@ -52,9 +64,12 @@ body { .starfield-root { position: fixed; inset: 0; + width: 100vw; + height: 100vh; + height: 100dvh; z-index: 0; pointer-events: none; - overflow: hidden; + overflow: visible; } /* Membros como pontos: só em ecrãs largos (em mobile o texto ocupa o viewport). */ @@ -66,16 +81,18 @@ body { .star-member { --star-scale: 1; - position: absolute; + position: fixed; + z-index: 0; width: 10px; height: 10px; - margin: 0; + margin: -5px 0 0 -5px; padding: 0; border: none; border-radius: 50%; pointer-events: auto; cursor: pointer; - transform: translate(-50%, -50%) scale(var(--star-scale)); + transform: scale(var(--star-scale)); + transform-origin: center; text-indent: -9999px; overflow: hidden; white-space: nowrap; @@ -88,7 +105,7 @@ body { .star-member:focus-visible { opacity: 1; outline: none; - transform: translate(-50%, -50%) scale(calc(var(--star-scale) * 1.1)); + transform: scale(calc(var(--star-scale) * 1.1)); } .star-member:focus-visible { diff --git a/site/public/index.html b/site/public/index.html @@ -26,8 +26,9 @@ <link rel="stylesheet" href="assets/style.css"> </head> <body> - <div id="starfield" class="starfield-root"></div> + <div id="starfield" class="starfield-root" aria-hidden="true"></div> + <div class="page-root"> <div class="wrap"> <header class="hero"> <div class="ascii-block"> @@ -173,6 +174,7 @@ <p>Administração: <a href="mailto:admin@runv.club">admin@runv.club</a><span class="footer-sep" aria-hidden="true"> · </span><a href="/faq/" class="footer-link-discrete">FAQ</a></p> </footer> </div> + </div> <script src="assets/app.js" defer></script> </body>