- assets/: script generate_logo.py + generate_ls_images.py per produrre
loghi (mark/horizontal light+dark/stacked light+dark) e immagini
prodotto Lemon Squeezy (thumbnail 1024x1024, cover 1920x1080,
OG 1200x630). Riproducibili: rilanciare gli script per rigenerare.
- landing/download.html: pagina con form email+chiave o autofill da
query string ?key=&email= (link 1-click dall'email). Bottoni
Mac/Windows + istruzioni installazione per OS.
- landing/index.html: link Download in nav, hero ("Hai gia
acquistato?"), pricing card ("Hai gia una licenza?"), footer.
- landing/js/main.js: rimosso warning placeholder LS (URL ora reale).
- server/src/downloads.js: endpoint GET /api/download/:platform
che verifica (key, email) contro DB e redirect a URL firmato del
binario. Errori chiari (400/401/403/503) leggibili dall'utente.
- server/src/email.js: template Resend con 2 bottoni 1-click
(link con key+email gia compilati).
- server/src/server.js: route aggiunta.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
39 lines
1.3 KiB
JavaScript
39 lines
1.3 KiB
JavaScript
/* ======================================================
|
|
MusicTools landing — JS minimale
|
|
====================================================== */
|
|
|
|
// Anno corrente in footer
|
|
(function setYear() {
|
|
const el = document.getElementById("year");
|
|
if (el) el.textContent = String(new Date().getFullYear());
|
|
})();
|
|
|
|
// Lemon Squeezy overlay: lemon.js intercetta automaticamente i link con
|
|
// data-lemonsqueezy-url e apre l'overlay di checkout. Niente codice nostro
|
|
// necessario qui — basta che lemon.js sia caricato (vedi <script> in index.html).
|
|
|
|
// Header che diventa piu' opaco mentre scorri (effetto subtle)
|
|
const nav = document.querySelector(".nav");
|
|
function onScroll() {
|
|
if (!nav) return;
|
|
if (window.scrollY > 24) nav.classList.add("scrolled");
|
|
else nav.classList.remove("scrolled");
|
|
}
|
|
window.addEventListener("scroll", onScroll, { passive: true });
|
|
onScroll();
|
|
|
|
// Reveal on scroll: aggiunge la classe .in-view alle sezioni
|
|
// quando entrano in viewport. Niente librerie esterne.
|
|
const io = new IntersectionObserver((entries) => {
|
|
entries.forEach((entry) => {
|
|
if (entry.isIntersecting) {
|
|
entry.target.classList.add("in-view");
|
|
io.unobserve(entry.target);
|
|
}
|
|
});
|
|
}, { threshold: 0.12 });
|
|
|
|
document.querySelectorAll(".feat, .how-step, .price-card, .faq-item").forEach((el) => {
|
|
io.observe(el);
|
|
});
|