Files
musicdownload/landing/css/style.css
T
luzadevandClaude Opus 4.7 bcd4f22b1e 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>
2026-06-09 01:29:48 +02:00

806 lines
19 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
MusicTools — Landing page
Palette coerente con l'app: tema scuro Spotify-like.
============================================================ */
:root {
--bg: #0a0a0a;
--bg-2: #060606;
--bg-card: #161616;
--bg-card-2: #1e1e1e;
--border: #262626;
--divider: #1f1f1f;
--text: #ffffff;
--text-muted: #a3a3a3;
--text-dim: #707070;
--accent: #1db954;
--accent-dark: #137a37;
--accent-glow: rgba(29, 185, 84, 0.35);
--pink: #f472b6;
--blue: #60a5fa;
--amber: #fbbf24;
--red: #f87171;
--purple: #a78bfa;
}
* { box-sizing: border-box; }
*::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
font-size: 16px;
line-height: 1.55;
color: var(--text);
background: var(--bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
img, svg { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
.container {
max-width: 1180px;
margin: 0 auto;
padding: 0 24px;
}
/* ============================================================
NAV
============================================================ */
.nav {
position: sticky;
top: 0;
z-index: 100;
background: rgba(10, 10, 10, 0.82);
backdrop-filter: saturate(180%) blur(14px);
-webkit-backdrop-filter: saturate(180%) blur(14px);
border-bottom: 1px solid var(--border);
}
.nav-row {
display: flex;
align-items: center;
justify-content: space-between;
height: 64px;
gap: 24px;
}
.brand {
display: flex;
align-items: center;
gap: 10px;
font-weight: 800;
font-size: 17px;
}
.brand-logo {
width: 32px;
height: 32px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 9px;
background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);
color: #fff;
font-size: 16px;
}
.nav-links {
display: flex;
gap: 26px;
font-size: 14.5px;
color: var(--text-muted);
}
.nav-links a:hover { color: var(--text); }
/* ============================================================
BUTTONS
============================================================ */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: inherit;
font-weight: 700;
border: none;
border-radius: 999px;
cursor: pointer;
padding: 12px 22px;
font-size: 14px;
transition: transform 0.15s ease, box-shadow 0.2s ease, background 0.2s ease;
white-space: nowrap;
}
.btn:active { transform: scale(0.98); }
.btn-primary {
background: var(--accent);
color: #0a0a0a;
box-shadow: 0 8px 24px var(--accent-glow);
}
.btn-primary:hover { background: #25d365; }
.btn-ghost {
background: transparent;
color: var(--text);
border: 1px solid var(--border);
}
.btn-ghost:hover { background: var(--bg-card); border-color: #3a3a3a; }
.btn-sm { padding: 8px 16px; font-size: 13px; }
.btn-lg { padding: 16px 32px; font-size: 16px; }
.btn-block { width: 100%; }
/* ============================================================
HERO
============================================================ */
.hero {
position: relative;
padding: 80px 0 100px;
overflow: hidden;
background:
radial-gradient(ellipse 60% 50% at 0% 0%, rgba(29, 185, 84, 0.18), transparent 60%),
radial-gradient(ellipse 60% 50% at 100% 100%, rgba(96, 165, 250, 0.12), transparent 60%),
linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 100%);
}
.hero-grid {
display: grid;
grid-template-columns: 1.05fr 1fr;
gap: 60px;
align-items: center;
}
.eyebrow {
display: inline-block;
font-size: 11.5px;
font-weight: 800;
letter-spacing: 1.5px;
text-transform: uppercase;
color: var(--accent);
padding: 5px 11px;
border: 1px solid rgba(29, 185, 84, 0.35);
border-radius: 999px;
background: rgba(29, 185, 84, 0.08);
}
.eyebrow.center {
display: block;
width: max-content;
margin: 0 auto;
}
.hero h1 {
margin: 18px 0 18px;
font-size: clamp(36px, 5.2vw, 58px);
font-weight: 900;
line-height: 1.04;
letter-spacing: -0.02em;
}
.accent { color: var(--accent); }
.lead {
font-size: 17px;
color: var(--text-muted);
line-height: 1.6;
max-width: 520px;
margin: 0 0 28px;
}
.hero-cta {
display: flex;
gap: 12px;
margin-bottom: 24px;
flex-wrap: wrap;
}
.hero-bullets {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
gap: 8px 24px;
font-size: 13.5px;
color: var(--text-muted);
}
.hero-bullets li { display: flex; align-items: center; gap: 6px; }
/* ============================================================
HERO MOCKUP
============================================================ */
.hero-art {
position: relative;
perspective: 1200px;
}
.mockup {
width: 100%;
max-width: 560px;
margin-left: auto;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 14px;
overflow: hidden;
box-shadow: 0 40px 100px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.02);
transform: rotate3d(0, 1, 0, -6deg) translateY(0);
transition: transform 0.4s ease;
}
.mockup:hover { transform: rotate3d(0, 1, 0, -3deg); }
.mockup-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 11px 14px;
background: #111111;
border-bottom: 1px solid var(--border);
position: relative;
}
.dot { width: 11px; height: 11px; border-radius: 50%; }
.dot.red { background: #ff5f57; }
.dot.yellow { background: #febc2e; }
.dot.green { background: #28c840; }
.mockup-title {
position: absolute;
left: 50%;
transform: translateX(-50%);
font-size: 12px;
color: var(--text-dim);
}
.mockup-body {
display: grid;
grid-template-columns: 168px 1fr;
min-height: 380px;
}
.mockup-side {
background: #111;
border-right: 1px solid var(--border);
padding: 16px 12px;
}
.ms-brand {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
font-weight: 700;
margin-bottom: 18px;
padding: 0 6px;
}
.ms-brand span {
width: 22px; height: 22px; border-radius: 7px;
display: inline-flex; align-items: center; justify-content: center;
background: linear-gradient(135deg, var(--accent), var(--accent-dark));
color: #fff; font-size: 12px;
}
.ms-nav { display: flex; flex-direction: column; gap: 2px; }
.ms-item {
display: flex; align-items: center; gap: 10px;
padding: 7px 9px; border-radius: 8px;
font-size: 12.5px; color: var(--text-muted);
}
.ms-item.active { background: rgba(29, 185, 84, 0.14); color: #fff; }
.ms-item span { width: 18px; text-align: center; font-size: 13px; }
.mockup-main { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
.mockup-hero {
position: relative;
padding: 18px 20px;
border-radius: 12px;
background: linear-gradient(135deg, #1db954 0%, #0e7a35 100%);
color: #fff;
overflow: hidden;
}
.mh-eyebrow { font-size: 9.5px; letter-spacing: 1.5px; font-weight: 800; opacity: 0.85; }
.mh-title { font-size: 17px; font-weight: 800; margin-top: 4px; }
.mh-sub { font-size: 11px; opacity: 0.85; margin-top: 3px; }
.mh-deco { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); font-size: 36px; opacity: 0.3; }
.mockup-card {
background: var(--bg-card-2);
border: 1px solid var(--border);
border-radius: 11px;
padding: 12px 14px;
}
.mc-label { font-size: 9.5px; letter-spacing: 0.8px; color: var(--text-dim); text-transform: uppercase; font-weight: 700; }
.mc-input {
margin-top: 6px;
padding: 8px 10px;
background: #0d0d0d;
border: 1px solid var(--border);
border-radius: 999px;
font-size: 11.5px;
color: var(--text-muted);
font-family: ui-monospace, SFMono-Regular, monospace;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mockup-actions { display: flex; flex-direction: column; gap: 10px; }
.mc-btn.primary {
background: var(--accent);
color: #0a0a0a;
font-size: 12px;
font-weight: 700;
padding: 9px 0;
border-radius: 999px;
text-align: center;
}
.mc-progress {
height: 6px;
border-radius: 999px;
background: #0d0d0d;
overflow: hidden;
}
.mc-progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent), #25d365);
border-radius: inherit;
animation: progress-pulse 2.5s ease-in-out infinite alternate;
}
@keyframes progress-pulse {
0% { width: 40%; }
100% { width: 78%; }
}
/* ============================================================
SECTIONS
============================================================ */
.section {
padding: 100px 0;
position: relative;
}
.section-title {
font-size: clamp(28px, 3.8vw, 42px);
font-weight: 900;
letter-spacing: -0.02em;
text-align: center;
margin: 14px 0 12px;
}
.section-lead {
text-align: center;
color: var(--text-muted);
font-size: 16px;
max-width: 620px;
margin: 0 auto 48px;
}
/* ============================================================
FEATURES
============================================================ */
.features { background: var(--bg-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.feat-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 16px;
}
.feat {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 16px;
padding: 24px 22px;
transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.25s ease;
}
.feat:hover {
transform: translateY(-4px);
border-color: #383838;
box-shadow: 0 18px 40px rgba(0, 0, 0, 0.4);
}
.feat-icon {
width: 44px;
height: 44px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
margin-bottom: 14px;
}
.feat.green .feat-icon { background: rgba(29, 185, 84, 0.16); color: var(--accent); }
.feat.pink .feat-icon { background: rgba(244, 114, 182, 0.16); color: var(--pink); }
.feat.blue .feat-icon { background: rgba(96, 165, 250, 0.16); color: var(--blue); }
.feat.amber .feat-icon { background: rgba(251, 191, 36, 0.16); color: var(--amber); }
.feat.red .feat-icon { background: rgba(248, 113, 113, 0.16); color: var(--red); }
.feat.purple .feat-icon { background: rgba(167, 139, 250, 0.16); color: var(--purple); }
.feat h3 {
font-size: 17px;
font-weight: 800;
margin: 0 0 6px;
}
.feat p {
font-size: 14px;
color: var(--text-muted);
margin: 0;
line-height: 1.55;
}
/* ============================================================
HOW IT WORKS
============================================================ */
.how-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
margin-top: 12px;
}
.how-step {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 16px;
padding: 28px;
text-align: center;
}
.how-num {
width: 44px;
height: 44px;
border-radius: 14px;
background: linear-gradient(135deg, var(--accent), var(--accent-dark));
color: #fff;
font-weight: 900;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 16px;
box-shadow: 0 10px 24px var(--accent-glow);
}
.how-step h3 {
font-size: 17px;
margin: 0 0 6px;
font-weight: 800;
}
.how-step p {
color: var(--text-muted);
font-size: 14px;
margin: 0;
}
/* ============================================================
PRICING
============================================================ */
.pricing { background: var(--bg-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.price-card {
max-width: 480px;
margin: 0 auto;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 22px;
padding: 36px 32px 32px;
position: relative;
text-align: center;
box-shadow: 0 30px 80px rgba(29, 185, 84, 0.12);
}
.price-badge {
position: absolute;
top: -14px;
left: 50%;
transform: translateX(-50%);
background: var(--accent);
color: #0a0a0a;
font-size: 11px;
letter-spacing: 1px;
font-weight: 800;
padding: 6px 12px;
border-radius: 999px;
text-transform: uppercase;
}
.price-name {
font-size: 13px;
letter-spacing: 1.5px;
text-transform: uppercase;
color: var(--text-muted);
font-weight: 700;
}
.price-row {
display: flex;
align-items: baseline;
justify-content: center;
gap: 6px;
margin: 14px 0 24px;
}
.price-amount {
font-size: 64px;
font-weight: 900;
line-height: 1;
letter-spacing: -0.03em;
}
.price-currency { font-size: 26px; font-weight: 700; color: var(--text-muted); }
.price-once { font-size: 14px; color: var(--text-muted); margin-left: 8px; }
.price-features {
list-style: none;
padding: 0;
margin: 0 0 28px;
text-align: left;
}
.price-features li {
padding: 9px 0;
border-bottom: 1px dashed var(--divider);
font-size: 14.5px;
color: var(--text-muted);
}
.price-features li:last-child { border-bottom: none; }
.price-features strong { color: var(--text); font-weight: 700; }
.price-note {
font-size: 12px;
color: var(--text-dim);
margin: 14px 0 0;
}
/* ============================================================
FAQ
============================================================ */
.faq-list {
max-width: 760px;
margin: 0 auto;
}
.faq-item {
border: 1px solid var(--border);
background: var(--bg-card);
border-radius: 14px;
margin-bottom: 10px;
overflow: hidden;
}
.faq-item summary {
list-style: none;
cursor: pointer;
padding: 18px 22px;
font-weight: 700;
font-size: 15.5px;
position: relative;
padding-right: 50px;
transition: background 0.18s ease;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
content: "+";
position: absolute;
right: 22px;
top: 50%;
transform: translateY(-50%);
font-size: 22px;
color: var(--accent);
font-weight: 400;
transition: transform 0.25s ease;
}
.faq-item[open] summary::after { content: "−"; }
.faq-item summary:hover { background: var(--bg-card-2); }
.faq-item p {
margin: 0;
padding: 0 22px 18px;
color: var(--text-muted);
font-size: 14.5px;
line-height: 1.6;
}
.faq-item code {
background: var(--bg-card-2);
padding: 2px 7px;
border-radius: 5px;
font-size: 13px;
font-family: ui-monospace, SFMono-Regular, monospace;
color: var(--accent);
}
/* ============================================================
FINAL CTA
============================================================ */
.cta-final { padding: 60px 0 90px; }
.cta-box {
text-align: center;
background:
radial-gradient(ellipse at center, rgba(29, 185, 84, 0.2), transparent 70%),
linear-gradient(135deg, var(--bg-card) 0%, var(--bg-card-2) 100%);
border: 1px solid var(--border);
border-radius: 22px;
padding: 56px 28px;
max-width: 880px;
margin: 0 auto;
}
.cta-box h2 { font-size: clamp(24px, 3.2vw, 34px); font-weight: 900; margin: 0 0 8px; letter-spacing: -0.02em; }
.cta-box p { color: var(--text-muted); margin: 0 0 22px; font-size: 16px; }
/* ============================================================
FOOTER
============================================================ */
.footer {
background: var(--bg-2);
border-top: 1px solid var(--border);
padding: 36px 0 30px;
font-size: 13.5px;
color: var(--text-muted);
}
.footer-row {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 18px;
margin-bottom: 14px;
}
.footer-brand {
display: flex;
align-items: center;
gap: 10px;
font-weight: 700;
color: var(--text);
}
.footer-by { color: var(--text-dim); font-weight: 400; }
.footer-links { display: flex; gap: 22px; }
.footer-links a:hover { color: var(--text); }
.footer-copy {
font-size: 12px;
color: var(--text-dim);
border-top: 1px solid var(--divider);
padding-top: 16px;
}
/* ============================================================
RESPONSIVE
============================================================ */
@media (max-width: 920px) {
.hero { padding: 60px 0 70px; }
.hero-grid { grid-template-columns: 1fr; gap: 40px; }
.hero-art { display: none; } /* su mobile nascondiamo il mockup */
.nav-links { display: none; }
.section { padding: 70px 0; }
.how-grid { grid-template-columns: 1fr; }
.footer-row { flex-direction: column; align-items: flex-start; }
}
@media (max-width: 480px) {
.container { padding: 0 18px; }
.hero-cta .btn { width: 100%; }
.price-amount { font-size: 52px; }
}
/* ============================================================
ANIMAZIONI SCROLL
============================================================ */
.nav.scrolled { box-shadow: 0 1px 0 var(--border), 0 8px 24px rgba(0,0,0,0.4); }
.feat, .how-step, .price-card, .faq-item {
opacity: 0;
transform: translateY(16px);
transition: opacity 0.5s ease, transform 0.5s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.feat.in-view, .how-step.in-view, .price-card.in-view, .faq-item.in-view {
opacity: 1;
transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
.feat, .how-step, .price-card, .faq-item {
opacity: 1; transform: none; transition: none;
}
.mockup { transform: none !important; }
.mc-progress-fill { animation: none !important; width: 64% !important; }
html { scroll-behavior: auto; }
}
/* ============================================================
USE POLICY BOX
============================================================ */
.use-policy {
max-width: 720px;
margin: 50px auto 0;
padding: 26px 28px;
background: var(--bg-card);
border: 1px solid var(--border);
border-left: 4px solid var(--accent);
border-radius: 14px;
}
.use-policy h3 {
margin: 0 0 10px;
font-size: 16px;
font-weight: 800;
color: var(--text);
}
.use-policy p {
margin: 0 0 12px;
font-size: 13.5px;
color: var(--text-muted);
line-height: 1.6;
}
.use-points {
list-style: none;
padding: 0;
margin: 0 0 16px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px 18px;
}
.use-points li {
font-size: 13px;
color: var(--text-muted);
}
.use-fineprint {
margin: 8px 0 0 !important;
font-size: 12.5px !important;
color: var(--text-dim) !important;
}
.use-fineprint a { color: var(--accent); }
@media (max-width: 640px) {
.use-points { grid-template-columns: 1fr; }
}
.price-consent {
font-size: 11.5px !important;
color: var(--text-dim) !important;
margin: 12px 0 0 !important;
line-height: 1.5 !important;
}
.price-consent a { color: var(--text-muted); text-decoration: underline; }
.price-consent a:hover { color: var(--accent); }
/* ============================================================
"Hai gia acquistato? Scarica" — link discreti
============================================================ */
.hero-customer {
margin: 18px 0 0;
font-size: 13.5px;
color: var(--text-dim);
}
.hero-customer a {
color: var(--accent);
font-weight: 700;
text-decoration: none;
}
.hero-customer a:hover { text-decoration: underline; }
.price-already {
margin: 10px 0 0 !important;
font-size: 13px !important;
color: var(--text-muted) !important;
}
.price-already a {
color: var(--accent);
font-weight: 700;
text-decoration: none;
}
.price-already a:hover { text-decoration: underline; }