Files
Barış Keser fdde1274ad v1.5.0: merkez "Simdi Caliyor" hero — A+B karisimi (B yonu)
Kullanici "a-b karisimi" secti. A'nin daraltilabilir rayi (v1.4.0) + B'nin merkez
now-playing hero'su. Tasarim 8-ajanli judge-panel workflow'uyla secildi ("Center
Stage" — #view icine showView('now')), spec canliya birebir kuruldu.

- Yeni showView('now') -> renderNowHero(): buyuk kapak (kapak-accent blur backdrop) +
  baslik/eyebrow + genis scrubber + iri transport + tek satir canli soz; #view icinde
  in-flow (sabit overlay DEGIL), rail + alt player bar + sag panel ile birlikte yasar
- Tek motor saati: hero scrubber'i + alt bar ayni updateSeek/updatePlayBtn'den beslenir
  (seeking guard'li, view==='now' ile kapaliyken sifir maliyet). Ayri ID'ler, catisma yok
- Giris: alt bardaki #pHeroBtn (💿) / mini kapak / .p-meta tik / komut paleti; buyuk kapak
  + expand -> openFullscreen theater (mini->merkez->tam ekran zoom merdiveni)
- Mevcut makineyi yeniden kullanir (--np-cover backdrop, applyCoverAccent, .bar geometri,
  parseLRC memoize, viewIn); prefers-reduced-motion + feature-test'li view-transition kapak
  morph'u; TR/EN i18n. Tumuyle opt-in/geri-alinabilir
- Harness: 14 spec kontrolu + 0 JS hatasi (motor aynasi, drag guard, bos durum,
  vt-name cakismasi yok, i18n, geri-alinabilirlik)
2026-09-20 18:03:27 +03:00

679 lines
33 KiB
HTML
Raw Permalink 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.
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Just Music Premium — Windows için müzik çalar</title>
<meta name="description" content="Spotify tarzı arayüz, gerçek DSP ses motoru ve internetten klip akışı. Windows için ücretsiz ve açık kaynak müzik çalar. Sunucusuz, tamamen yerli.">
<link rel="icon" href="img/logo.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Sora:wght@500;600;700;800&family=Manrope:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script>document.documentElement.classList.add('js');</script>
<style>
/* ============ TOKENS ============ */
:root{
--bg:#0a0a0b;
--panel:#131315;
--panel-2:#191a1d;
--card:#1a1b1e;
--text:#ffffff;
--muted:#a7a7ad;
--faint:#6d6d74;
--accent:#1db954;
--accent-hi:#1ed760;
--line:rgba(255,255,255,.08);
--line-2:rgba(255,255,255,.055);
--radius:16px;
--radius-lg:22px;
--shadow:0 24px 60px -20px rgba(0,0,0,.7);
--glow:0 0 0 1px rgba(30,215,96,.35), 0 18px 50px -12px rgba(29,185,84,.45);
--maxw:1180px;
--font-d:"Sora",system-ui,sans-serif;
--font-b:"Manrope",system-ui,sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{
background:var(--bg);
color:var(--text);
font-family:var(--font-b);
font-size:17px;
line-height:1.65;
-webkit-font-smoothing:antialiased;
text-rendering:optimizeLegibility;
overflow-x:hidden;
position:relative;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
section{scroll-margin-top:92px}
/* atmosphere: fixed background field + grain */
.field{
position:fixed;inset:0;z-index:-2;pointer-events:none;
background:
radial-gradient(120% 90% at 50% -10%, rgba(29,185,84,.16), transparent 55%),
radial-gradient(80% 60% at 85% 8%, rgba(30,215,96,.10), transparent 60%),
radial-gradient(70% 60% at 12% 22%, rgba(29,185,84,.07), transparent 60%),
var(--bg);
}
.grain{
position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:.05;mix-blend-mode:overlay;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.wrap{max-width:var(--maxw);margin-inline:auto;padding-inline:22px}
/* ============ TYPE HELPERS ============ */
.kicker{
font-family:var(--font-b);
font-size:12px;font-weight:700;letter-spacing:.24em;text-transform:uppercase;
color:var(--accent-hi);
display:inline-flex;align-items:center;gap:10px;
}
.kicker::before{content:"";width:26px;height:1px;background:linear-gradient(90deg,transparent,var(--accent))}
h1,h2,h3{font-family:var(--font-d);font-weight:800;line-height:1.05;letter-spacing:-.02em}
.hl{color:var(--accent-hi)}
.muted{color:var(--muted)}
/* ============ BUTTONS ============ */
.btn{
display:inline-flex;align-items:center;justify-content:center;gap:9px;
font-family:var(--font-b);font-weight:700;font-size:15px;
padding:14px 22px;border-radius:13px;border:1px solid transparent;
cursor:pointer;transition:transform .25s cubic-bezier(.2,.7,.2,1),box-shadow .25s,background .25s,border-color .25s,color .25s;
white-space:nowrap;
}
.btn-primary{
background:linear-gradient(180deg,var(--accent-hi),var(--accent));
color:#04220f;
box-shadow:0 12px 34px -12px rgba(29,185,84,.75), inset 0 1px 0 rgba(255,255,255,.35);
}
.btn-primary:hover{transform:translateY(-2px);box-shadow:0 20px 44px -12px rgba(29,185,84,.9), inset 0 1px 0 rgba(255,255,255,.4)}
.btn-ghost{
background:rgba(255,255,255,.04);color:var(--text);border-color:var(--line);
}
.btn-ghost:hover{transform:translateY(-2px);border-color:rgba(30,215,96,.5);background:rgba(30,215,96,.08)}
.btn-sm{padding:10px 16px;font-size:13.5px;border-radius:11px}
/* ============ NAV ============ */
header.nav{
position:sticky;top:0;z-index:50;
backdrop-filter:blur(14px);
background:rgba(10,10,11,.72);
border-bottom:1px solid var(--line-2);
}
.nav-in{display:flex;align-items:center;justify-content:space-between;gap:18px;height:66px}
.brand{display:flex;align-items:center;gap:12px;min-width:0}
.brand img{width:38px;height:38px;border-radius:11px;box-shadow:0 6px 18px -6px rgba(29,185,84,.7)}
.brand .wm{display:flex;flex-direction:column;line-height:1.05}
.brand .wm b{font-family:var(--font-d);font-weight:700;font-size:16px;letter-spacing:-.01em}
.brand .wm span{font-size:10.5px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;color:var(--accent-hi)}
.nav-links{display:flex;align-items:center;gap:30px}
.nav-links a{font-size:14.5px;font-weight:600;color:var(--muted);transition:color .2s;position:relative;padding:6px 0}
.nav-links a:hover{color:var(--text)}
.nav-links a::after{content:"";position:absolute;left:0;bottom:0;height:1.5px;width:0;background:var(--accent);transition:width .25s}
.nav-links a:hover::after{width:100%}
.nav-cta{display:flex;align-items:center;gap:14px}
.nav-toggle{display:none}
/* ============ HERO ============ */
.hero{padding:70px 0 84px;position:relative}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:54px;align-items:center}
.badge-row{display:flex;flex-wrap:wrap;gap:9px;margin:22px 0 0}
.chip{
display:inline-flex;align-items:center;gap:7px;
font-size:12.5px;font-weight:600;color:var(--muted);
padding:6px 13px;border-radius:999px;border:1px solid var(--line);
background:rgba(255,255,255,.02);
}
.chip .dot{width:6px;height:6px;border-radius:50%;background:var(--accent-hi);box-shadow:0 0 8px var(--accent)}
h1.hero-title{
margin-top:20px;
font-size:clamp(2.5rem,6.2vw,4.4rem);
}
.hero-sub{margin-top:22px;font-size:clamp(1rem,1.4vw,1.18rem);color:var(--muted);max-width:33ch}
.hero-actions{display:flex;flex-wrap:wrap;gap:14px;margin-top:34px}
.hero-meta{margin-top:22px;font-size:13px;color:var(--faint);font-weight:600;letter-spacing:.02em}
/* logo halo shown in hero on mobile only */
.hero-logo-mobile{display:none}
/* ---- hero mock "now playing" card ---- */
.np{
position:relative;
background:linear-gradient(165deg,var(--panel-2),var(--panel));
border:1px solid var(--line);
border-radius:var(--radius-lg);
padding:22px;
box-shadow:var(--shadow);
}
.np::before{
content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1px;
background:linear-gradient(160deg,rgba(30,215,96,.5),transparent 40%);
-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;
}
.np-top{display:flex;align-items:center;gap:14px}
.np-art{
width:64px;height:64px;border-radius:15px;flex:none;
background:radial-gradient(120% 120% at 30% 20%,var(--accent-hi),#0e7a37);
display:grid;place-items:center;box-shadow:0 10px 26px -8px rgba(29,185,84,.8);
}
.np-art img{width:64px;height:64px;border-radius:15px}
.np-info{min-width:0}
.np-info b{font-family:var(--font-d);font-weight:700;font-size:16px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.np-tag{
display:inline-flex;align-items:center;gap:6px;margin-top:6px;
font-size:11px;font-weight:600;color:var(--accent-hi);
background:rgba(29,185,84,.12);border:1px solid rgba(29,185,84,.3);
padding:3px 9px;border-radius:999px;
}
.np-live{margin-left:auto;font-size:10.5px;font-weight:800;letter-spacing:.14em;color:var(--faint);text-transform:uppercase}
.np-label{font-size:10.5px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--faint);margin:20px 0 9px;display:flex;align-items:center;gap:8px}
.np-label i{font-style:normal;color:var(--accent)}
/* waveform (Şarkı DNA'sı) */
.wave{display:flex;align-items:center;gap:3px;height:52px}
.wave span{flex:1;min-width:2px;border-radius:3px;background:rgba(255,255,255,.14)}
.wave span.on{background:linear-gradient(180deg,var(--accent-hi),var(--accent))}
/* animated EQ (DSP) */
.eq{display:flex;align-items:flex-end;gap:5px;height:40px}
.eq span{width:7px;border-radius:4px 4px 2px 2px;background:linear-gradient(180deg,var(--accent-hi),var(--accent));transform-origin:bottom;animation:eq 1.05s ease-in-out infinite}
.eq span:nth-child(1){animation-delay:-.9s}
.eq span:nth-child(2){animation-delay:-.2s}
.eq span:nth-child(3){animation-delay:-.6s}
.eq span:nth-child(4){animation-delay:-.1s}
.eq span:nth-child(5){animation-delay:-.75s}
.eq span:nth-child(6){animation-delay:-.35s}
.eq span:nth-child(7){animation-delay:-.5s}
@keyframes eq{0%,100%{height:20%}50%{height:100%}}
.np-lyric{margin-top:8px;font-size:13.5px;line-height:1.5}
.np-lyric .now{color:var(--accent-hi);font-weight:700}
.np-lyric .next{color:var(--faint)}
.np-controls{display:flex;align-items:center;justify-content:center;gap:20px;margin-top:20px;padding-top:18px;border-top:1px solid var(--line-2)}
.np-controls svg{fill:var(--muted)}
.np-play{width:50px;height:50px;border-radius:50%;background:linear-gradient(180deg,var(--accent-hi),var(--accent));display:grid;place-items:center;box-shadow:0 10px 24px -8px rgba(29,185,84,.8)}
.np-play svg{fill:#04220f}
/* floating stat tags on the card */
.np-float{
position:absolute;background:var(--card);border:1px solid var(--line);
border-radius:12px;padding:9px 13px;box-shadow:var(--shadow);
font-size:12px;font-weight:700;display:flex;align-items:center;gap:8px;
}
.np-float .k{color:var(--accent-hi)}
.np-float.f1{top:-18px;right:22px;animation:bob 5s ease-in-out infinite}
.np-float.f2{bottom:64px;left:-26px;animation:bob 5.6s ease-in-out infinite .4s}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
/* ============ SECTION HEADS ============ */
.sec{padding:72px 0}
.sec-head{max-width:640px;margin-bottom:44px}
.sec-head h2{font-size:clamp(1.9rem,3.6vw,2.9rem);margin-top:16px}
.sec-head p{margin-top:14px;color:var(--muted)}
/* ============ FEATURES ============ */
.features{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.feat{
grid-column:span 2;
background:linear-gradient(180deg,var(--card),#141416);
border:1px solid var(--line);border-radius:var(--radius);
padding:24px;position:relative;overflow:hidden;
transition:transform .3s cubic-bezier(.2,.7,.2,1),border-color .3s,box-shadow .3s;
}
.feat.small{grid-column:span 1}
.feat:hover{transform:translateY(-4px);border-color:rgba(30,215,96,.4);box-shadow:0 24px 50px -24px rgba(29,185,84,.5)}
.feat .num{position:absolute;top:20px;right:22px;font-family:var(--font-d);font-weight:700;font-size:13px;color:var(--faint);letter-spacing:.05em}
.feat .ico{
width:48px;height:48px;border-radius:13px;display:grid;place-items:center;font-size:23px;
background:radial-gradient(120% 120% at 30% 20%,rgba(30,215,96,.22),rgba(29,185,84,.06));
border:1px solid rgba(30,215,96,.25);margin-bottom:16px;
}
.feat h3{font-size:1.18rem;font-weight:700;letter-spacing:-.01em}
.feat p{margin-top:9px;font-size:14.5px;color:var(--muted);line-height:1.6}
.feat .tags{margin-top:14px;display:flex;flex-wrap:wrap;gap:7px}
.feat .tags span{font-size:11px;font-weight:600;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:3px 10px}
.feat-eq{display:flex;align-items:flex-end;gap:6px;height:46px;margin-top:18px}
.feat-eq span{width:8px;border-radius:4px;background:linear-gradient(180deg,var(--accent-hi),var(--accent));transform-origin:bottom;animation:eq 1.1s ease-in-out infinite;opacity:.85}
.feat-eq span:nth-child(2n){animation-duration:1.35s}
.feat-eq span:nth-child(1){animation-delay:-.2s}
.feat-eq span:nth-child(2){animation-delay:-.7s}
.feat-eq span:nth-child(3){animation-delay:-.4s}
.feat-eq span:nth-child(4){animation-delay:-.9s}
.feat-eq span:nth-child(5){animation-delay:-.15s}
.feat-eq span:nth-child(6){animation-delay:-.6s}
.feat-eq span:nth-child(7){animation-delay:-.35s}
.feat-eq span:nth-child(8){animation-delay:-.8s}
.feat-eq span:nth-child(9){animation-delay:-.5s}
.feat-eq span:nth-child(10){animation-delay:-.25s}
/* ============ SHOWCASE ============ */
.shots{display:flex;flex-direction:column;gap:70px}
.shot{display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center}
.shot.rev .shot-txt{order:2}
.shot-frame{
border-radius:var(--radius-lg);overflow:hidden;position:relative;
border:1px solid var(--line);
box-shadow:var(--shadow), 0 0 60px -30px rgba(29,185,84,.5);
background:var(--panel);
}
.shot-frame::after{content:"";position:absolute;inset:0;border-radius:inherit;box-shadow:inset 0 1px 0 rgba(255,255,255,.06);pointer-events:none}
.shot-frame .bar{display:flex;align-items:center;gap:7px;padding:11px 15px;background:#0d0d0f;border-bottom:1px solid var(--line-2)}
.shot-frame .bar i{width:11px;height:11px;border-radius:50%;background:#2a2a2e;display:block}
.shot-frame .bar i:first-child{background:#3a3a3f}
.shot-frame img{width:100%;display:block}
.shot-txt .cap-idx{font-family:var(--font-d);font-weight:700;color:var(--accent-hi);font-size:14px;letter-spacing:.05em}
.shot-txt h3{font-size:clamp(1.5rem,2.6vw,2.1rem);margin:12px 0 14px}
.shot-txt p{color:var(--muted);font-size:15.5px}
.shot-txt .cap-note{margin-top:18px;display:inline-flex;align-items:center;gap:10px;font-size:13px;color:var(--muted);border-left:2px solid var(--accent);padding-left:12px}
/* ============ TECH ============ */
.tech{
background:linear-gradient(180deg,var(--panel),var(--panel-2));
border:1px solid var(--line);border-radius:var(--radius-lg);
padding:40px;
}
.pills{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px}
.pill{
display:inline-flex;align-items:center;gap:9px;
font-size:14px;font-weight:700;color:var(--text);
background:rgba(255,255,255,.03);border:1px solid var(--line);
padding:11px 17px;border-radius:12px;transition:border-color .25s,transform .25s,background .25s;
}
.pill:hover{border-color:rgba(30,215,96,.5);transform:translateY(-2px);background:rgba(30,215,96,.07)}
.pill .d{width:8px;height:8px;border-radius:2px;background:var(--accent);flex:none}
.tech-note{margin-top:26px;color:var(--faint);font-size:13.5px;max-width:60ch}
/* ============ FINAL CTA ============ */
.cta-band{
position:relative;overflow:hidden;
border-radius:var(--radius-lg);
background:
radial-gradient(90% 140% at 50% 0%,rgba(29,185,84,.28),transparent 60%),
linear-gradient(180deg,#14311f,#0d1a12);
border:1px solid rgba(30,215,96,.3);
padding:64px 30px;text-align:center;
box-shadow:0 40px 90px -40px rgba(29,185,84,.6);
}
.cta-band .eq{justify-content:center;margin:0 auto 26px;height:34px}
.cta-band h2{font-size:clamp(1.9rem,4vw,3rem)}
.cta-band p{color:rgba(255,255,255,.7);margin-top:14px}
.cta-band .hero-actions{justify-content:center}
.cta-foot{margin-top:20px;font-size:13px;font-weight:700;letter-spacing:.03em;color:var(--accent-hi)}
/* ============ FOOTER ============ */
footer{border-top:1px solid var(--line-2);padding:44px 0 56px;margin-top:70px}
.foot-in{display:flex;flex-wrap:wrap;justify-content:space-between;gap:24px;align-items:center}
.foot-brand{display:flex;align-items:center;gap:12px}
.foot-brand img{width:34px;height:34px;border-radius:10px}
.foot-brand b{font-family:var(--font-d);font-weight:700}
.foot-links{display:flex;gap:24px;flex-wrap:wrap}
.foot-links a{font-size:14px;color:var(--muted);font-weight:600;transition:color .2s}
.foot-links a:hover{color:var(--accent-hi)}
.foot-note{width:100%;margin-top:28px;padding-top:24px;border-top:1px solid var(--line-2);color:var(--faint);font-size:13px;display:flex;flex-wrap:wrap;justify-content:space-between;gap:12px}
.foot-note .yerli{display:inline-flex;align-items:center;gap:8px}
.foot-note .yerli b{color:var(--muted);font-weight:600}
/* ============ REVEAL ============ */
.js .reveal{opacity:0;transform:translateY(26px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1)}
.js .reveal.in{opacity:1;transform:none}
.js .reveal.d1{transition-delay:.08s}
.js .reveal.d2{transition-delay:.16s}
.js .reveal.d3{transition-delay:.24s}
.js .reveal.d4{transition-delay:.32s}
/* ============ RESPONSIVE ============ */
@media (max-width:1000px){
.features{grid-template-columns:repeat(2,1fr)}
.feat,.feat.small{grid-column:span 1}
.hero-grid{grid-template-columns:1fr;gap:40px}
.hero-visual{max-width:480px;margin-inline:auto;width:100%}
.hero-sub{max-width:none}
}
@media (max-width:820px){
.nav-links{display:none}
.shot,.shot.rev .shot-txt{grid-template-columns:1fr;order:0}
.shot-frame{order:-1}
}
@media (max-width:560px){
body{font-size:16px}
.hero{padding:46px 0 60px}
.features{grid-template-columns:1fr}
.np-float.f2{left:auto;right:22px;bottom:76px}
.tech{padding:26px}
.cta-band{padding:48px 20px}
.nav-cta .btn-ghost{display:none}
}
@media (prefers-reduced-motion:reduce){
*{animation:none!important}
html{scroll-behavior:auto}
.js .reveal{opacity:1;transform:none;transition:none}
}
</style>
<div class="field"></div>
<div class="grain"></div>
<!-- ============ NAV ============ -->
<header class="nav">
<div class="wrap nav-in">
<a class="brand" href="#top" aria-label="Just Music Premium">
<img src="img/logo.png" alt="Just Music Premium logosu">
<span class="wm"><b>Just Music</b><span>Premium</span></span>
</a>
<nav class="nav-links">
<a href="#ozellikler">Özellikler</a>
<a href="#ekran-goruntuleri">Ekran Görüntüleri</a>
<a href="#teknoloji">Teknoloji</a>
<a href="https://github.com/barkeser2002/just-music-premium">GitHub</a>
</nav>
<div class="nav-cta">
<a class="btn btn-ghost btn-sm" href="https://github.com/barkeser2002/just-music-premium">GitHub</a>
<a class="btn btn-primary btn-sm" href="https://github.com/barkeser2002/just-music-premium/releases/latest/download/JustMusic-Setup.msi">⬇ .msi İndir</a>
</div>
</div>
</header>
<main id="top">
<!-- ============ HERO ============ -->
<section class="hero">
<div class="wrap hero-grid">
<div class="hero-txt">
<span class="kicker reveal">Windows için · Açık kaynak · Sunucusuz</span>
<h1 class="hero-title reveal d1">Spotify hissi,<br><span class="hl">gerçek ses motoru.</span></h1>
<p class="hero-sub reveal d2">Spotify tarzı arayüz, gerçek DSP ses motoru ve internetten klip akışı — hepsi tek bir yerli uygulamada. Sunucu yok, port yok, abonelik yok.</p>
<div class="badge-row reveal d2">
<span class="chip"><span class="dot"></span>10 bant özel EQ</span>
<span class="chip"><span class="dot"></span>Senkron sözler</span>
<span class="chip"><span class="dot"></span>Klip akışı</span>
</div>
<div class="hero-actions reveal d3">
<a class="btn btn-primary" href="https://github.com/barkeser2002/just-music-premium/releases/latest/download/JustMusic-Setup.msi">⬇ Windows için indir (.msi)</a>
<a class="btn btn-ghost" href="https://github.com/barkeser2002/just-music-premium">GitHub'da Gör</a>
</div>
<p class="hero-meta reveal d3">Windows 10/11 için · %100 ücretsiz · açık kaynak</p>
</div>
<!-- live "now playing" mock -->
<div class="hero-visual reveal d2">
<div class="np">
<div class="np-float f1"><span class="k">🎛</span> DSP · 8D aktif</div>
<div class="np-float f2"><span class="k">🎤</span> Sözler senkron</div>
<div class="np-top">
<div class="np-art"><img src="img/logo.png" alt=""></div>
<div class="np-info">
<b>Coldplay — Yellow</b>
<span class="np-tag">● internetten akış · indirme yok</span>
</div>
<span class="np-live">Şimdi çalıyor</span>
</div>
<div class="np-label"><i>◆</i> Şarkı DNA'sı</div>
<div class="wave" aria-hidden="true">
<span class="on" style="height:34%"></span><span class="on" style="height:58%"></span>
<span class="on" style="height:42%"></span><span class="on" style="height:76%"></span>
<span class="on" style="height:50%"></span><span class="on" style="height:88%"></span>
<span class="on" style="height:64%"></span><span class="on" style="height:46%"></span>
<span class="on" style="height:72%"></span><span class="on" style="height:38%"></span>
<span class="on" style="height:60%"></span><span class="on" style="height:90%"></span>
<span style="height:54%"></span><span style="height:36%"></span>
<span style="height:66%"></span><span style="height:48%"></span>
<span style="height:80%"></span><span style="height:40%"></span>
<span style="height:58%"></span><span style="height:70%"></span>
<span style="height:44%"></span><span style="height:62%"></span>
<span style="height:34%"></span><span style="height:78%"></span>
<span style="height:52%"></span><span style="height:42%"></span>
<span style="height:68%"></span><span style="height:50%"></span>
<span style="height:82%"></span><span style="height:38%"></span>
<span style="height:60%"></span><span style="height:46%"></span>
</div>
<div class="np-label"><i>◆</i> DSP motoru</div>
<div style="display:flex;align-items:center;justify-content:space-between;gap:18px">
<div class="eq" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span><span></span><span></span>
</div>
<div class="np-lyric">
<div class="now">Yeah, they were all yellow</div>
<div class="next">I came along…</div>
</div>
</div>
<div class="np-controls">
<svg width="20" height="20" viewBox="0 0 24 24"><path d="M6 6h2v12H6zM20 6 9 12l11 6z"/></svg>
<span class="np-play"><svg width="20" height="20" viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg></span>
<svg width="20" height="20" viewBox="0 0 24 24"><path d="M16 6h2v12h-2zM4 6l11 6L4 18z"/></svg>
</div>
</div>
</div>
</div>
</section>
<!-- ============ FEATURES ============ -->
<section id="ozellikler" class="sec">
<div class="wrap">
<div class="sec-head reveal">
<span class="kicker">Özellikler</span>
<h2>Bir müzik çaların yapabileceği her şey — <span class="hl">ve fazlası.</span></h2>
<p>Ses tarayıcıda değil, tamamen yerli bir DSP motorunda işlenir. Her şey uygulamanın içinde çalışır.</p>
</div>
<div class="features">
<!-- highlight card -->
<article class="feat reveal">
<span class="num">01</span>
<div class="ico">🎛</div>
<h3>Gerçek DSP ses motoru</h3>
<p>30 hazır EQ preset, 10 bant özel EQ ve efektler — Bass, Echo, Reverb, 8D — hepsi çalarken anında uygulanır.</p>
<div class="tags"><span>numpy</span><span>scipy</span><span>sounddevice</span></div>
<div class="feat-eq" aria-hidden="true">
<span></span><span></span><span></span><span></span><span></span>
<span></span><span></span><span></span><span></span><span></span>
</div>
</article>
<article class="feat small reveal d1">
<span class="num">02</span>
<div class="ico">🎬</div>
<h3>Klip modu</h3>
<p>Çalan parçanın klibini internetten oynatır — akış, indirme yok. Ekranı kaplamaz, ana alana gömülür.</p>
</article>
<article class="feat small reveal d2">
<span class="num">03</span>
<div class="ico">🪟</div>
<h3>Kalıcı mini oynatıcı</h3>
<p>Sekme değiştirince klip köşeye iner ve çalmaya devam eder; akış bir an bile kesilmez.</p>
</article>
<article class="feat small reveal">
<span class="num">04</span>
<div class="ico">🎤</div>
<h3>Senkron şarkı sözleri</h3>
<p>Zaman kodlu (LRC) sözler çalarken satır satır vurgulanır, klibin üstünde de akar.</p>
</article>
<article class="feat small reveal d1">
<span class="num">05</span>
<div class="ico">🎙</div>
<h3>Stüdyo karaoke — htdemucs</h3>
<p>Demucs ile vokal ve enstrümanlar <em>gerçekten</em> ayrılır (yalnızca CPU): enstrümantal karaoke ya da akapella. Ayrılan stem'ler önbelleğe alınır, sonrası anında.</p>
</article>
<article class="feat small reveal d2">
<span class="num">06</span>
<div class="ico">⬇</div>
<h3>Gömülü yt-dlp + ffmpeg</h3>
<p>Ayrı kurulum gerekmez; ara, kapaklarıyla gör — <strong>satıra tıkla anında insin</strong>, ya da seçip toplu indir. <strong>Playlist URL'si yapıştır → önizle, seç, X/Y sayaçlı toplu indir.</strong></p>
</article>
<article class="feat small reveal">
<span class="num">07</span>
<div class="ico">🔌</div>
<h3>Sunucu/port YOK</h3>
<p>Her şey in-process çalışır. QtWebEngine yalnızca görsel içindir; ses tamamen yerlidir.</p>
</article>
<article class="feat small reveal d1">
<span class="num">08</span>
<div class="ico">🔄</div>
<h3>Otomatik güncelleme</h3>
<p>Yeni sürüm çıkınca arka planda indirir, kapanışta kurup uygulamayı yeniden başlatır.</p>
</article>
<article class="feat small reveal d2">
<span class="num">09</span>
<div class="ico">🫧</div>
<h3>Modern kabuk + merkez hero</h3>
<p>Daraltılabilir ikon kenar çubuğu, buzlu cam, kapak renginden tema, <strong>merkez "Şimdi Çalıyor" hero</strong> (Apple Music tarzı büyük kapak + canlı söz), kelime kelime söz adası ve tam ekran theater.</p>
</article>
<article class="feat small reveal">
<span class="num">10</span>
<div class="ico">🎚</div>
<h3>Crossfade + gapless</h3>
<p>Parçalar arası eş-güçlü eritme (0–12 sn) ya da sınırda boşluksuz geçiş. Sıradaki parça önden çözülür; albüm ve DJ setlerinde tek saniye boşluk kalmaz.</p>
</article>
<article class="feat small reveal d1">
<span class="num">11</span>
<div class="ico">🎮</div>
<h3>Discord Rich Presence</h3>
<p>Çalan parça ve oynat/duraklat durumu Discord profilinde görünür (opsiyonel — kendi Discord Application ID'nle).</p>
</article>
</div>
</div>
</section>
<!-- ============ SHOWCASE ============ -->
<section id="ekran-goruntuleri" class="sec">
<div class="wrap">
<div class="sec-head reveal">
<span class="kicker">Ekran Görüntüleri</span>
<h2>Çalışırken gör.</h2>
<p>Tanıdık, sade bir arayüz — arkasında ise ciddi bir ses ve klip altyapısı.</p>
</div>
<div class="shots">
<div class="shot reveal">
<div class="shot-txt">
<span class="cap-idx">01 — Klip modu</span>
<h3>Sözler, klibin üstünde senkron akar.</h3>
<p>Çalan parçanın resmî klibi ana alana gömülür; zaman kodlu sözler satır satır vurgulanarak videonun üzerinde ilerler. Sağda Şarkı DNA'sı, BPM ve spektrogram.</p>
<span class="cap-note">Klip modu — sözler klibin üstünde senkron akar.</span>
</div>
<figure class="shot-frame">
<div class="bar" aria-hidden="true"><i></i><i></i><i></i></div>
<img src="img/clip-mode.png" alt="Just Music Premium klip modu — Coldplay Yellow klibi oynarken sözler videonun üstünde senkron akıyor, sağ panelde Şarkı DNA'sı ve spektrogram">
</figure>
</div>
<div class="shot rev reveal">
<div class="shot-txt">
<span class="cap-idx">02 — Mini oynatıcı</span>
<h3>Gezinsen de klip çalmaya devam eder.</h3>
<p>Ana sayfaya ya da başka bir listeye geçtiğinde klip küçülüp köşeye yerleşir. Çalma listelerin, kütüphanen ve akıllı listelerin bir tık uzağında; müzik hiç durmaz.</p>
<span class="cap-note">Kalıcı mini oynatıcı — gezinsen de klip çalmaya devam eder.</span>
</div>
<figure class="shot-frame">
<div class="bar" aria-hidden="true"><i></i><i></i><i></i></div>
<img src="img/mini-player.png" alt="Just Music Premium ana sayfası — çalma listesi kartları görünürken kalıcı mini video oynatıcı köşede çalmaya devam ediyor">
</figure>
</div>
</div>
</div>
</section>
<!-- ============ TECH ============ -->
<section id="teknoloji" class="sec">
<div class="wrap">
<div class="sec-head reveal">
<span class="kicker">Teknoloji</span>
<h2>Neyle inşa edildi.</h2>
<p>Denenmiş, açık kaynak araçlardan oluşan sağlam bir yığın — tek bir .msi paketinde.</p>
</div>
<div class="tech reveal d1">
<div class="pills">
<span class="pill"><span class="d"></span>PyQt6</span>
<span class="pill"><span class="d"></span>QtWebEngine</span>
<span class="pill"><span class="d"></span>NumPy</span>
<span class="pill"><span class="d"></span>SciPy</span>
<span class="pill"><span class="d"></span>sounddevice</span>
<span class="pill"><span class="d"></span>Demucs (htdemucs)</span>
<span class="pill"><span class="d"></span>PyTorch (CPU)</span>
<span class="pill"><span class="d"></span>yt-dlp</span>
<span class="pill"><span class="d"></span>FFmpeg</span>
<span class="pill"><span class="d"></span>Deno</span>
<span class="pill"><span class="d"></span>Font Awesome</span>
<span class="pill"><span class="d"></span>PyInstaller</span>
</div>
<p class="tech-note">Arayüz PyQt6 + QtWebEngine ile çizilir, ses işleme NumPy/SciPy ve sounddevice üzerinde yerli olarak yürütülür. Klip ve indirme akışı gömülü yt-dlp + FFmpeg ile sağlanır — dışarıda bir sunucu ya da açık port olmadan.</p>
</div>
</div>
</section>
<!-- ============ FINAL CTA ============ -->
<section class="sec">
<div class="wrap">
<div class="cta-band reveal">
<div class="eq" aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div>
<h2>Hemen dinlemeye başla.</h2>
<p>İndir, çalıştır, çal. Kurulum bir dakika, deneyim kalıcı.</p>
<div class="hero-actions">
<a class="btn btn-primary" href="https://github.com/barkeser2002/just-music-premium/releases/latest/download/JustMusic-Setup.msi">⬇ Windows için indir (.msi)</a>
<a class="btn btn-ghost" href="https://github.com/barkeser2002/just-music-premium">GitHub'da Gör</a>
</div>
<p class="cta-foot">Windows 10/11 · ücretsiz · açık kaynak</p>
</div>
</div>
</section>
</main>
<!-- ============ FOOTER ============ -->
<footer>
<div class="wrap">
<div class="foot-in">
<div class="foot-brand">
<img src="img/logo.png" alt="Just Music Premium logosu">
<div>
<b>Just Music Premium</b><br>
<span class="muted" style="font-size:13px">barkeser2002 tarafından yapıldı</span>
</div>
</div>
<div class="foot-links">
<a href="#ozellikler">Özellikler</a>
<a href="#ekran-goruntuleri">Ekran Görüntüleri</a>
<a href="#teknoloji">Teknoloji</a>
<a href="https://github.com/barkeser2002/just-music-premium">GitHub</a>
<a href="https://github.com/barkeser2002/just-music-premium/releases/latest/download/JustMusic-Setup.msi">.msi İndir</a>
</div>
</div>
<div class="foot-note">
<span class="yerli">🔊 <b>Ses tarayıcıda değil, yerli DSP motorunda çalınır.</b></span>
<span>© 2026 Just Music Premium · Windows 10/11 · Açık kaynak</span>
</div>
</div>
</footer>
<script>
// Scroll reveal — page is fully visible if this never runs (see .js gating in CSS)
(function(){
var els = document.querySelectorAll('.reveal');
if(!('IntersectionObserver' in window)){
els.forEach(function(el){el.classList.add('in')});
return;
}
var io = new IntersectionObserver(function(entries){
entries.forEach(function(e){
if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); }
});
},{threshold:.14, rootMargin:'0px 0px -8% 0px'});
els.forEach(function(el){io.observe(el)});
})();
</script>