Asset brand + pagina download + 1-click download endpoint

- 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>
This commit is contained in:
luzadevandClaude Opus 4.7 committed 2026-06-09 01:29:48 +02:00
1 parent 8272985459
commit bcd4f22b1e
17 files changed
+812 -28

No files matched your search

+3 -19
View File
@@ -8,25 +8,9 @@
if (el) el.textContent = String(new Date().getFullYear());
})();
// Lemon Squeezy overlay
// Lo script di Lemon (lemon.js) intercetta automaticamente i link con
// data-lemonsqueezy-url e apre l'overlay. Qui ci limitiamo a impedire
// che il click navighi via se l'URL non e' ancora stato configurato.
document.querySelectorAll("[data-lemonsqueezy-url]").forEach((el) => {
el.addEventListener("click", (e) => {
const url = el.getAttribute("data-lemonsqueezy-url");
if (!url || url === "REPLACE_WITH_LS_PRODUCT_URL") {
e.preventDefault();
alert(
"Il prodotto Lemon Squeezy non e' ancora configurato.\n" +
"Crea il prodotto su Lemon Squeezy e incolla l'URL dentro " +
"landing/index.html in data-lemonsqueezy-url."
);
}
// Se la pagina e' aperta via file:// lemon.js non riesce a inizializzare:
// in quel caso lasciamo che il link navighi via.
});
});
// 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");