feat(tema): D kısayolu, logodan yayılan tema geçişi, /surum-notlari beta sayfası (→ 1.1.0)

- lib/tema-gecisi.ts: View Transitions + CSS maskesi (kolay-tercih-mark.svg),
  merkez header'daki işaret; reduced-motion ve desteksiz tarayıcıda düz geçiş
- tema-kisayolu.tsx: D tuşu açık ↔ koyu (yazı alanı/değiştirici tuşta pasif)
- tema-secici.tsx: seçim de maskeyle oynar, altında Kbd ile D ipucu
- /surum-notlari: beta açıklaması, geri bildirim (destek@kolaytercih.com),
  sürüm günlüğü; Beta rozeti ve footer buraya bağlanır, sitemap'e eklendi
- DESIGN.md §2.3 notu

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-07 23:25:38 +03:00
parent b2bab50337
commit 5f7ea8bbcd
13 changed files with 395 additions and 42 deletions

View File

@@ -476,3 +476,72 @@
.toaster [data-sonner-toast][data-styled="true"] [data-button]:hover {
background: var(--color-slate-700);
}
/* Tema geçişi (DESIGN.md §2.3, lib/tema-gecisi.ts): tema değişirken yeni
görüntü, header'daki KolayTercih işaretinin biçiminde logodan büyüyerek
açılır. Eski görüntü yerinde durur; yeni görüntünün maskesi iki katman:
(1) işaretin SVG'si, merkezi --kt-tema-x/y'de, kenarı 0 → --kt-tema-son;
(2) aynı merkezden biraz geç kalkan bir daire — işaretin kareleri arasındaki
boşlukları kapatır ki geçiş sonunda eski temadan iz kalmasın. Hareket
azaltılmışsa JS geçişi hiç başlatmaz, tema düz değişir. */
@property --kt-tema-kenar {
syntax: "<length>";
inherits: true;
initial-value: 0px;
}
@property --kt-tema-yaricap {
syntax: "<length>";
inherits: true;
initial-value: 0px;
}
.kt-tema-gecis {
view-transition-name: root;
}
.kt-tema-gecis::view-transition-old(root),
.kt-tema-gecis::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
.kt-tema-gecis::view-transition-old(root) {
z-index: 1;
}
.kt-tema-gecis::view-transition-new(root) {
z-index: 2;
mask-image:
url("/kolay-tercih-mark.svg"),
radial-gradient(
circle at var(--kt-tema-x) var(--kt-tema-y),
#000 calc(var(--kt-tema-yaricap) - 1px),
transparent var(--kt-tema-yaricap)
);
mask-repeat: no-repeat;
mask-size:
var(--kt-tema-kenar) var(--kt-tema-kenar),
100% 100%;
mask-position:
calc(var(--kt-tema-x) - var(--kt-tema-kenar) / 2)
calc(var(--kt-tema-y) - var(--kt-tema-kenar) / 2),
0 0;
animation:
kt-tema-isaret 0.9s cubic-bezier(0.65, 0, 0.35, 1) both,
kt-tema-daire 0.9s cubic-bezier(0.65, 0, 0.35, 1) both;
}
@keyframes kt-tema-isaret {
from {
--kt-tema-kenar: 0px;
}
to {
--kt-tema-kenar: var(--kt-tema-son);
}
}
/* Daire işaretin ardından gelir: ilk %35'te sıfırda bekler. */
@keyframes kt-tema-daire {
0%,
35% {
--kt-tema-yaricap: 0px;
}
100% {
--kt-tema-yaricap: var(--kt-tema-son);
}
}